Created
July 3, 2019 05:29
-
-
Save kdbaseball8/7e01680bce15a6f120382b7234ada0cf to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n", | |
"\n", | |
"<h1 align=center><font size = 5>Generating Maps with Python</font></h1>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## Introduction\n", | |
"\n", | |
"In this lab, we will learn how to create maps for different objectives. To do that, we will part ways with Matplotlib and work with another Python visualization library, namely **Folium**. What is nice about **Folium** is that it was developed for the sole purpose of visualizing geospatial data. While other libraries are available to visualize geospatial data, such as **plotly**, they might have a cap on how many API calls you can make within a defined time frame. **Folium**, on the other hand, is completely free." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"## Table of Contents\n", | |
"\n", | |
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n", | |
"\n", | |
"1. [Exploring Datasets with *p*andas](#0)<br>\n", | |
"2. [Downloading and Prepping Data](#2)<br>\n", | |
"3. [Introduction to Folium](#4) <br>\n", | |
"4. [Map with Markers](#6) <br>\n", | |
"5. [Choropleth Maps](#8) <br>\n", | |
"</div>\n", | |
"<hr>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"# Exploring Datasets with *pandas* and Matplotlib<a id=\"0\"></a>\n", | |
"\n", | |
"Toolkits: This lab heavily relies on [*pandas*](http://pandas.pydata.org/) and [**Numpy**](http://www.numpy.org/) for data wrangling, analysis, and visualization. The primary plotting library we will explore in this lab is [**Folium**](https://github.com/python-visualization/folium/).\n", | |
"\n", | |
"Datasets: \n", | |
"\n", | |
"1. San Francisco Police Department Incidents for the year 2016 - [Police Department Incidents](https://data.sfgov.org/Public-Safety/Police-Department-Incidents-Previous-Year-2016-/ritf-b9ki) from San Francisco public data portal. Incidents derived from San Francisco Police Department (SFPD) Crime Incident Reporting system. Updated daily, showing data for the entire year of 2016. Address and location has been anonymized by moving to mid-block or to an intersection. \n", | |
"\n", | |
"2. Immigration to Canada from 1980 to 2013 - [International migration flows to and from selected countries - The 2015 revision](http://www.un.org/en/development/desa/population/migration/data/empirical2/migrationflows.shtml) from United Nation's website. The dataset contains annual data on the flows of international migrants as recorded by the countries of destination. The data presents both inflows and outflows according to the place of birth, citizenship or place of previous / next residence both for foreigners and nationals. For this lesson, we will focus on the Canadian Immigration data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"# Downloading and Prepping Data <a id=\"2\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Import Primary Modules:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np # useful for many scientific computing in Python\n", | |
"import pandas as pd # primary data structure library" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"# Introduction to Folium <a id=\"4\"></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Folium is a powerful Python library that helps you create several types of Leaflet maps. The fact that the Folium results are interactive makes this library very useful for dashboard building.\n", | |
"\n", | |
"From the official Folium documentation page:\n", | |
"\n", | |
"> Folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js library. Manipulate your data in Python, then visualize it in on a Leaflet map via Folium.\n", | |
"\n", | |
"> Folium makes it easy to visualize data that's been manipulated in Python on an interactive Leaflet map. It enables both the binding of data to a map for choropleth visualizations as well as passing Vincent/Vega visualizations as markers on the map.\n", | |
"\n", | |
"> The library has a number of built-in tilesets from OpenStreetMap, Mapbox, and Stamen, and supports custom tilesets with Mapbox or Cloudmade API keys. Folium supports both GeoJSON and TopoJSON overlays, as well as the binding of data to those overlays to create choropleth maps with color-brewer color schemes." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"#### Let's install **Folium**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"**Folium** is not available by default. So, we first need to install it before we are able to import it." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Collecting package metadata: done\n", | |
"Solving environment: | \n", | |
"The environment is inconsistent, please check the package plan carefully\n", | |
"The following packages are causing the inconsistency:\n", | |
"\n", | |
" - conda-forge/linux-64::altair==2.4.1=py36_0\n", | |
" - conda-forge/noarch::branca==0.3.1=py_0\n", | |
" - conda-forge/linux-64::certifi==2019.3.9=py36_0\n", | |
" - conda-forge/linux-64::conda==4.6.14=py36_0\n", | |
" - conda-forge/noarch::folium==0.5.0=py_0\n", | |
" - conda-forge/linux-64::geopy==1.11.0=py36_0\n", | |
" - conda-forge/linux-64::giflib==5.1.7=h516909a_1\n", | |
" - defaults/linux-64::grpcio==1.16.1=py36hf8bcb03_1\n", | |
" - conda-forge/linux-64::ipython-sql==0.3.9=py36_1000\n", | |
" - conda-forge/noarch::ipywidgets==7.4.2=py_0\n", | |
" - conda-forge/linux-64::jpeg==9c=h14c3975_1001\n", | |
" - conda-forge/linux-64::leptonica==1.76.0=h7f84942_1005\n", | |
" - conda-forge/linux-64::libgcc==7.2.0=h69d50b8_2\n", | |
" - conda-forge/linux-64::libwebp==1.0.2=h99fbfcb_2\n", | |
" - conda-forge/linux-64::nodejs==9.11.0=0\n", | |
" - conda-forge/linux-64::openjpeg==2.3.1=h58a6597_0\n", | |
" - conda-forge/linux-64::openssl==1.1.1b=h14c3975_1\n", | |
" - conda-forge/noarch::prettytable==0.7.2=py_2\n", | |
" - conda-forge/linux-64::proj4==5.2.0=h14c3975_1001\n", | |
" - conda-forge/noarch::raven==6.9.0=py_1\n", | |
" - conda-forge/noarch::sqlparse==0.3.0=py_0\n", | |
" - conda-forge/linux-64::tesseract==4.0.0=h47f2187_1001\n", | |
" - conda-forge/noarch::vincent==0.4.4=py_1\n", | |
" - anaconda/linux-64::_ipyw_jlab_nb_ext_conf==0.1.0=py36_0\n", | |
" - anaconda/linux-64::absl-py==0.7.0=py36_0\n", | |
" - anaconda/linux-64::alabaster==0.7.12=py36_0\n", | |
" - anaconda/linux-64::anaconda-client==1.7.2=py36_0\n", | |
" - anaconda/linux-64::anaconda-navigator==1.9.7=py36_0\n", | |
" - anaconda/linux-64::anaconda-project==0.8.2=py36_0\n", | |
" - anaconda/linux-64::appdirs==1.4.3=py36h28b3542_0\n", | |
" - anaconda/linux-64::asn1crypto==0.24.0=py36_0\n", | |
" - anaconda/linux-64::astor==0.7.1=py36_0\n", | |
" - anaconda/linux-64::astroid==2.2.5=py36_0\n", | |
" - anaconda/linux-64::atomicwrites==1.3.0=py36_1\n", | |
" - anaconda/linux-64::attrs==19.1.0=py36_1\n", | |
" - anaconda/linux-64::automat==0.7.0=py36_0\n", | |
" - anaconda/linux-64::babel==2.6.0=py36_0\n", | |
" - anaconda/linux-64::backcall==0.1.0=py36_0\n", | |
" - anaconda/linux-64::backports==1.0=py36_1\n", | |
" - anaconda/linux-64::backports.os==0.1.1=py36_0\n", | |
" - anaconda/linux-64::backports.shutil_get_terminal_size==1.0.0=py36_2\n", | |
" - anaconda/linux-64::basemap==1.2.0=py36h705c2d8_0\n", | |
" - anaconda/linux-64::beautifulsoup4==4.7.1=py36_1\n", | |
" - anaconda/linux-64::bitarray==0.8.3=py36h14c3975_0\n", | |
" - anaconda/linux-64::bleach==1.5.0=py36_0\n", | |
" - anaconda/linux-64::boto==2.49.0=py36_0\n", | |
" - anaconda/linux-64::boto3==1.7.62=py36h28b3542_1\n", | |
" - anaconda/linux-64::botocore==1.10.62=py36h28b3542_0\n", | |
" - anaconda/linux-64::c-ares==1.15.0=h7b6447c_1\n", | |
" - anaconda/linux-64::cffi==1.12.2=py36h2e261b9_1\n", | |
" - anaconda/linux-64::chardet==3.0.4=py36_1\n", | |
" - anaconda/linux-64::click==7.0=py36_0\n", | |
" - anaconda/noarch::cloudpickle==0.8.1=py_0\n", | |
" - anaconda/linux-64::clyent==1.2.2=py36_1\n", | |
" - anaconda/linux-64::colorama==0.4.1=py36_0\n", | |
" - anaconda/linux-64::conda-build==3.17.8=py36_0\n", | |
" - anaconda/linux-64::constantly==15.1.0=py36h28b3542_0\n", | |
" - anaconda/linux-64::contextlib2==0.5.5=py36_0\n", | |
" - anaconda/linux-64::cryptography==2.6.1=py36h1ba5d50_0\n", | |
" - anaconda/linux-64::cudnn==7.1.2=cuda9.0_0\n", | |
" - anaconda/linux-64::cycler==0.10.0=py36_0\n", | |
" - anaconda/linux-64::cython==0.29.7=py36he6710b0_0\n", | |
" - anaconda/linux-64::cytoolz==0.9.0.1=py36h14c3975_1\n", | |
" - anaconda/noarch::dask-core==1.2.0=py_0\n", | |
" - anaconda/linux-64::decorator==4.4.0=py36_1\n", | |
" - anaconda/linux-64::defusedxml==0.5.0=py36_1\n", | |
" - anaconda/linux-64::distributed==1.27.0=py36_0\n", | |
" - anaconda/linux-64::docutils==0.14=py36_0\n", | |
" - anaconda/linux-64::entrypoints==0.3=py36_0\n", | |
" - anaconda/linux-64::et_xmlfile==1.0.1=py36_0\n", | |
" - anaconda/linux-64::fastcache==1.0.2=py36h14c3975_2\n", | |
" - anaconda/linux-64::ffmpeg==4.0=hcdf2ecd_0\n", | |
" - anaconda/linux-64::filelock==3.0.10=py36_0\n", | |
" - anaconda/linux-64::flask==1.0.2=py36_1\n", | |
" - anaconda/linux-64::flask-cors==3.0.7=py36_0\n", | |
" - anaconda/linux-64::freeglut==3.0.0=hf484d3e_5\n", | |
" - anaconda/linux-64::gast==0.2.2=py36_0\n", | |
" - defaults/linux-64::geos==3.6.2=heeff764_2\n", | |
" - anaconda/linux-64::gevent==1.4.0=py36h7b6447c_0\n", | |
" - anaconda/linux-64::gitdb2==2.0.5=py36_0\n", | |
" - anaconda/linux-64::gitpython==2.1.11=py36_0\n", | |
" - anaconda/linux-64::glob2==0.6=py36_1\n", | |
" - anaconda/linux-64::gmpy2==2.0.8=py36h10f8cd9_2\n", | |
" - anaconda/linux-64::graphviz==2.40.1=h21bd128_2\n", | |
" - anaconda/linux-64::greenlet==0.4.15=py36h7b6447c_0\n", | |
" - anaconda/linux-64::h5py==2.8.0=py36h989c5e5_3\n", | |
" - anaconda/linux-64::heapdict==1.0.0=py36_2\n", | |
" - anaconda/linux-64::html5lib==0.9999999=py36_0\n", | |
" - anaconda/linux-64::hyperlink==18.0.0=py36_0\n", | |
" - anaconda/linux-64::idna==2.8=py36_0\n", | |
" - anaconda/linux-64::imageio==2.4.1=py36_0\n", | |
" - anaconda/linux-64::imagesize==1.1.0=py36_0\n", | |
" - anaconda/linux-64::importlib_metadata==0.8=py36_0\n", | |
" - anaconda/linux-64::incremental==17.5.0=py36_0\n", | |
" - anaconda/linux-64::ipykernel==5.1.0=py36h39e3cac_0\n", | |
" - anaconda/linux-64::ipython==7.4.0=py36h39e3cac_0\n", | |
" - anaconda/linux-64::ipython_genutils==0.2.0=py36_0\n", | |
" - anaconda/linux-64::isort==4.3.17=py36_0\n", | |
" - anaconda/linux-64::itsdangerous==1.1.0=py36_0\n", | |
" - anaconda/linux-64::jasper==2.0.14=h07fcdf6_1\n", | |
" - anaconda/linux-64::jdcal==1.4=py36_0\n", | |
" - anaconda/linux-64::jedi==0.13.3=py36_0\n", | |
" - anaconda/linux-64::jeepney==0.4=py36_0\n", | |
" - anaconda/linux-64::jinja2==2.10.1=py36_0\n", | |
" - anaconda/noarch::jmespath==0.9.4=py_0\n", | |
" - anaconda/linux-64::jsonschema==3.0.1=py36_0\n", | |
" - anaconda/linux-64::jupyter==1.0.0=py36_7\n", | |
" - anaconda/linux-64::jupyter_client==5.2.4=py36_0\n", | |
" - anaconda/linux-64::jupyter_console==6.0.0=py36_0\n", | |
" - anaconda/linux-64::jupyter_core==4.4.0=py36_0\n", | |
" - anaconda/linux-64::jupyterlab==0.35.4=py36hf63ae98_0\n", | |
" - anaconda/linux-64::jupyterlab_launcher==0.13.1=py36_0\n", | |
" - anaconda/linux-64::jupyterlab_server==0.2.0=py36_0\n", | |
" - anaconda/linux-64::keras==2.1.5=py36_0\n", | |
" - anaconda/linux-64::keyring==18.0.0=py36_0\n", | |
" - anaconda/linux-64::kiwisolver==1.0.1=py36hf484d3e_0\n", | |
" - anaconda/linux-64::lazy-object-proxy==1.3.1=py36h14c3975_2\n", | |
" - anaconda/linux-64::libarchive==3.3.3=h5d8350f_5\n", | |
" - anaconda/linux-64::libglu==9.0.0=hf484d3e_1\n", | |
" - anaconda/linux-64::liblief==0.9.0=h7725739_2\n", | |
" - anaconda/linux-64::libopencv==3.4.2=hb342d67_1\n", | |
" - anaconda/linux-64::libopus==1.3=h7b6447c_0\n", | |
" - anaconda/linux-64::libprotobuf==3.6.1=hd408876_0\n", | |
" - anaconda/linux-64::libvpx==1.7.0=h439df22_0\n", | |
" - anaconda/linux-64::llvmlite==0.28.0=py36hd408876_0\n", | |
" - anaconda/linux-64::locket==0.2.0=py36_1\n", | |
" - anaconda/linux-64::lxml==4.3.0=py36hefd8a0e_0\n", | |
" - anaconda/linux-64::lz4-c==1.8.1.2=h14c3975_0\n", | |
" - anaconda/linux-64::markdown==3.0.1=py36_0\n", | |
" - anaconda/linux-64::markupsafe==1.1.1=py36h7b6447c_0\n", | |
" - anaconda/linux-64::matplotlib==3.0.3=py36h5429711_0\n", | |
" - anaconda/linux-64::mccabe==0.6.1=py36_1\n", | |
" - anaconda/linux-64::mistune==0.8.4=py36h7b6447c_0\n", | |
" - anaconda/linux-64::mkl_fft==1.0.6=py36h7dd41cf_0\n", | |
" - anaconda/linux-64::mkl_random==1.0.1=py36h4414c95_1\n", | |
" - anaconda/linux-64::more-itertools==6.0.0=py36_0\n", | |
" - anaconda/linux-64::mpmath==1.1.0=py36_0\n", | |
" - anaconda/linux-64::msgpack-python==0.6.1=py36hfd86e86_1\n", | |
" - anaconda/linux-64::multipledispatch==0.6.0=py36_0\n", | |
" - anaconda/linux-64::navigator-updater==0.2.1=py36_0\n", | |
" - anaconda/linux-64::nbconvert==5.4.1=py36_3\n", | |
" - anaconda/linux-64::nbformat==4.4.0=py36_0\n", | |
" - anaconda/linux-64::nccl==1.3.5=cuda9.0_0\n", | |
" - anaconda/noarch::networkx==2.3=py_0\n", | |
" - anaconda/linux-64::ninja==1.9.0=py36hfd86e86_0\n", | |
" - anaconda/linux-64::nltk==3.4=py36_1\n", | |
" - anaconda/linux-64::nose==1.3.7=py36_2\n", | |
" - anaconda/linux-64::notebook==5.7.8=py36_0\n", | |
" - anaconda/linux-64::numpy==1.15.4=py36h1d66e8a_0\n", | |
" - anaconda/linux-64::numpy-base==1.15.4=py36h81de0dd_0\n", | |
" - anaconda/linux-64::numpydoc==0.8.0=py36_0\n", | |
" - anaconda/linux-64::olefile==0.46=py36_0\n", | |
" - anaconda/linux-64::opencv==3.4.2=py36h6fd60c2_1\n", | |
" - anaconda/noarch::openpyxl==2.6.2=py_0\n", | |
" - anaconda/linux-64::packaging==19.0=py36_0\n", | |
" - anaconda/linux-64::pandas==0.24.2=py36he6710b0_0\n", | |
" - anaconda/linux-64::pandocfilters==1.4.2=py36_1\n", | |
" - anaconda/noarch::parso==0.4.0=py_0\n", | |
" - anaconda/linux-64::partd==0.3.10=py36_1\n", | |
" - anaconda/noarch::path.py==12.0.1=py_0\n", | |
" - anaconda/linux-64::pathlib2==2.3.3=py36_0\n", | |
" - anaconda/linux-64::patsy==0.5.1=py36_0\n", | |
" - anaconda/linux-64::pep8==1.7.1=py36_0\n", | |
" - anaconda/linux-64::pexpect==4.7.0=py36_0\n", | |
" - anaconda/linux-64::pickleshare==0.7.5=py36_0\n", | |
" - anaconda/linux-64::pillow==5.4.1=py36h34e0f95_0\n", | |
" - anaconda/linux-64::pip==19.0.3=py36_0\n", | |
" - anaconda/linux-64::pkginfo==1.5.0.1=py36_0\n", | |
" - anaconda/linux-64::pluggy==0.9.0=py36_0\n", | |
" - anaconda/linux-64::ply==3.11=py36_0\n", | |
" - anaconda/linux-64::prometheus_client==0.6.0=py36_0\n", | |
" - anaconda/linux-64::prompt_toolkit==2.0.9=py36_0\n", | |
" - anaconda/linux-64::protobuf==3.6.1=py36he6710b0_0\n", | |
" - anaconda/linux-64::psutil==5.6.1=py36h7b6447c_0\n", | |
" - anaconda/linux-64::ptyprocess==0.6.0=py36_0\n", | |
" - anaconda/linux-64::py==1.8.0=py36_0\n", | |
" - anaconda/linux-64::py-lief==0.9.0=py36h7725739_2\n", | |
" - anaconda/linux-64::py-opencv==3.4.2=py36hb342d67_1\n", | |
" - anaconda/noarch::pyasn1==0.4.5=py_0\n", | |
" - anaconda/linux-64::pyasn1-modules==0.2.4=py36_0\n", | |
" - anaconda/linux-64::pycodestyle==2.5.0=py36_0\n", | |
" - anaconda/linux-64::pycosat==0.6.3=py36h14c3975_0\n", | |
" - anaconda/linux-64::pycparser==2.19=py36_0\n", | |
" - anaconda/linux-64::pycrypto==2.6.1=py36h14c3975_9\n", | |
" - anaconda/linux-64::pycurl==7.43.0.2=py36h1ba5d50_0\n", | |
" - anaconda/linux-64::pydotplus==2.0.2=py36_1\n", | |
" - anaconda/linux-64::pyflakes==2.1.1=py36_0\n", | |
" - anaconda/linux-64::pygments==2.3.1=py36_0\n", | |
" - anaconda/linux-64::pyhamcrest==1.9.0=py36_2\n", | |
" - anaconda/linux-64::pylint==2.3.1=py36_0\n", | |
" - anaconda/linux-64::pyodbc==4.0.26=py36he6710b0_0\n", | |
" - anaconda/linux-64::pyopenssl==19.0.0=py36_0\n", | |
" - anaconda/noarch::pyparsing==2.4.0=py_0\n", | |
" - anaconda/linux-64::pyproj==1.9.6=py36h14380d9_0\n", | |
" - anaconda/linux-64::pyqt==5.9.2=py36h22d08a2_1\n", | |
" - anaconda/linux-64::pyrsistent==0.14.11=py36h7b6447c_0\n", | |
" - anaconda/linux-64::pyshp==2.0.1=py36_0\n", | |
" - anaconda/linux-64::pysocks==1.6.8=py36_0\n", | |
" - anaconda/linux-64::pytest==4.4.0=py36_1\n", | |
" - anaconda/linux-64::pytest-openfiles==0.3.2=py36_0\n", | |
" - anaconda/linux-64::pytest-remotedata==0.3.1=py36_0\n", | |
" - anaconda/linux-64::python==3.6.8=h0371630_0\n", | |
" - anaconda/linux-64::python-dateutil==2.8.0=py36_0\n", | |
" - anaconda/linux-64::python-libarchive-c==2.8=py36_6\n", | |
" - anaconda/linux-64::pytorch==0.4.1=py36ha74772b_0\n", | |
" - anaconda/noarch::pytz==2019.1=py_0\n", | |
" - anaconda/linux-64::pyyaml==5.1=py36h7b6447c_0\n", | |
" - anaconda/linux-64::pyzmq==17.1.2=py36h14c3975_0\n", | |
" - anaconda/linux-64::qtawesome==0.5.7=py36_1\n", | |
" - anaconda/linux-64::qtconsole==4.4.3=py36_0\n", | |
" - anaconda/linux-64::qtpy==1.7.0=py36_1\n", | |
" - anaconda/linux-64::requests==2.21.0=py36_0\n", | |
" - anaconda/linux-64::rope==0.12.0=py36_0\n", | |
" - anaconda/linux-64::ruamel_yaml==0.15.46=py36h14c3975_0\n", | |
" - anaconda/linux-64::s3transfer==0.1.13=py36_0\n", | |
" - anaconda/linux-64::scikit-learn==0.20.1=py36h4989274_0\n", | |
" - anaconda/linux-64::scipy==1.1.0=py36hfa4b5c9_1\n", | |
" - anaconda/linux-64::seaborn==0.9.0=py36_0\n", | |
" - anaconda/linux-64::secretstorage==3.1.1=py36_0\n", | |
" - anaconda/linux-64::send2trash==1.5.0=py36_0\n", | |
" - anaconda/linux-64::service_identity==18.1.0=py36h28b3542_0\n", | |
" - anaconda/linux-64::setuptools==41.0.0=py36_0\n", | |
" - anaconda/linux-64::simplegeneric==0.8.1=py36_2\n", | |
" - anaconda/linux-64::singledispatch==3.4.0.3=py36_0\n", | |
" - anaconda/linux-64::sip==4.19.13=py36he6710b0_0\n", | |
" - anaconda/linux-64::six==1.12.0=py36_0\n", | |
" - anaconda/linux-64::smmap2==2.0.5=py36_0\n", | |
" - anaconda/linux-64::snowballstemmer==1.2.1=py36_0\n", | |
" - anaconda/linux-64::sortedcollections==1.1.2=py36_0\n", | |
" - anaconda/linux-64::sortedcontainers==2.1.0=py36_0\n", | |
" - anaconda/linux-64::soupsieve==1.8=py36_0\n", | |
" - anaconda/noarch::sphinx==2.0.1=py_0\n", | |
" - anaconda/linux-64::sphinxcontrib==1.0=py36_1\n", | |
" - anaconda/noarch::sphinxcontrib-applehelp==1.0.1=py_0\n", | |
" - anaconda/noarch::sphinxcontrib-devhelp==1.0.1=py_0\n", | |
" - anaconda/noarch::sphinxcontrib-htmlhelp==1.0.2=py_0\n", | |
" - anaconda/noarch::sphinxcontrib-jsmath==1.0.1=py_0\n", | |
" - anaconda/noarch::sphinxcontrib-qthelp==1.0.2=py_0\n", | |
" - anaconda/noarch::sphinxcontrib-serializinghtml==1.1.1=py_0\n", | |
" - anaconda/linux-64::sphinxcontrib-websupport==1.1.0=py36_1\n", | |
" - anaconda/linux-64::spyder==3.3.4=py36_0\n", | |
" - anaconda/linux-64::spyder-kernels==0.4.4=py36_0\n", | |
" - anaconda/linux-64::sqlalchemy==1.3.3=py36h7b6447c_0\n", | |
" - anaconda/linux-64::statsmodels==0.9.0=py36h035aef0_0\n", | |
" - anaconda/linux-64::sympy==1.4=py36_0\n", | |
" - anaconda/linux-64::tblib==1.3.2=py36_0\n", | |
" - anaconda/linux-64::tensorboard==1.8.0=py36hf484d3e_0\n", | |
" - anaconda/linux-64::tensorflow==1.8.0=h57681fa_0\n", | |
" - anaconda/linux-64::tensorflow-base==1.8.0=py36h5f64886_0\n", | |
" - anaconda/linux-64::termcolor==1.1.0=py36_1\n", | |
" - anaconda/linux-64::terminado==0.8.2=py36_0\n", | |
" - anaconda/linux-64::testpath==0.4.2=py36_0\n", | |
" - anaconda/linux-64::toolz==0.9.0=py36_0\n", | |
" - anaconda/linux-64::torchvision==0.2.1=py36_0\n", | |
" - anaconda/linux-64::tornado==6.0.2=py36h7b6447c_0\n", | |
" - anaconda/linux-64::tqdm==4.31.1=py36_1\n", | |
" - anaconda/linux-64::traitlets==4.3.2=py36_0\n", | |
" - anaconda/linux-64::twisted==18.9.0=py36h7b6447c_0\n", | |
" - anaconda/linux-64::typed-ast==1.3.1=py36h7b6447c_0\n", | |
" - anaconda/linux-64::unicodecsv==0.14.1=py36_0\n", | |
" - anaconda/linux-64::urllib3==1.24.1=py36_0\n", | |
" - anaconda/linux-64::wcwidth==0.1.7=py36_0\n", | |
" - anaconda/linux-64::webencodings==0.5.1=py36_1\n", | |
" - anaconda/noarch::werkzeug==0.15.2=py_0\n", | |
" - anaconda/linux-64::wheel==0.33.1=py36_0\n", | |
" - anaconda/linux-64::widgetsnbextension==3.4.2=py36_0\n", | |
" - anaconda/linux-64::wrapt==1.11.1=py36h7b6447c_0\n", | |
" - anaconda/linux-64::wurlitzer==1.0.2=py36_0\n", | |
" - anaconda/linux-64::xlrd==1.2.0=py36_0\n", | |
" - anaconda/noarch::xlsxwriter==1.1.6=py_0\n", | |
" - anaconda/linux-64::xlwt==1.3.0=py36_0\n", | |
" - anaconda/linux-64::zict==0.1.4=py36_0\n", | |
" - anaconda/linux-64::zipp==0.3.3=py36_1\n", | |
" - anaconda/linux-64::zope==1.0=py36_1\n", | |
" - anaconda/linux-64::zope.interface==4.6.0=py36h7b6447c_0\n", | |
" - anaconda/linux-64::zstd==1.3.7=h0b5b093_0\n", | |
" - defaults/linux-64::curl==7.64.0=hbc83047_2\n", | |
" - defaults/linux-64::krb5==1.16.1=h173b8e3_7\n", | |
" - defaults/linux-64::libcurl==7.64.0=h20c2e04_2\n", | |
" - defaults/linux-64::libpng==1.6.36=hbc83047_0\n", | |
" - defaults/linux-64::libssh2==1.8.2=h1ba5d50_0\n", | |
" - defaults/linux-64::qt==5.9.7=h5867ecd_1\n", | |
" - defaults/linux-64::sqlite==3.26.0=h7b6447c_0\n", | |
" - defaults/linux-64::anaconda==5.3.1=py37_0\n", | |
" - defaults/linux-64::astropy==3.0.4=py37h14c3975_0\n", | |
" - defaults/linux-64::bkcharts==0.2=py37_0\n", | |
" - defaults/linux-64::blaze==0.11.3=py37_0\n", | |
" - defaults/linux-64::blosc==1.14.4=hdbcaa40_0\n", | |
" - defaults/linux-64::bokeh==0.13.0=py37_0\n", | |
" - defaults/linux-64::bottleneck==1.2.1=py37h035aef0_1\n", | |
" - defaults/linux-64::bzip2==1.0.6=h14c3975_5\n", | |
" - defaults/linux-64::cairo==1.14.12=h8948797_3\n", | |
" - defaults/linux-64::dask==0.19.1=py37_0\n", | |
" - defaults/linux-64::datashape==0.5.4=py37_1\n", | |
" - defaults/linux-64::dbus==1.13.2=h714fa37_1\n", | |
" - defaults/linux-64::expat==2.2.6=he6710b0_0\n", | |
" - defaults/linux-64::fontconfig==2.13.0=h9420a91_0\n", | |
" - defaults/linux-64::freetype==2.9.1=h8a8886c_1\n", | |
" - defaults/linux-64::fribidi==1.0.5=h7b6447c_0\n", | |
" - defaults/linux-64::get_terminal_size==1.0.0=haa9412d_0\n", | |
" - defaults/linux-64::glib==2.56.2=hd408876_0\n", | |
" - defaults/linux-64::gmp==6.1.2=h6c8ec71_1\n", | |
" - defaults/linux-64::graphite2==1.3.12=h23475e2_2\n", | |
" - defaults/linux-64::gst-plugins-base==1.14.0=hbbd80ab_1\n", | |
" - defaults/linux-64::gstreamer==1.14.0=hb453b48_1\n", | |
" - defaults/linux-64::harfbuzz==1.8.8=hffaf4a1_0\n", | |
" - defaults/linux-64::hdf5==1.10.2=hba1933b_1\n", | |
" - defaults/linux-64::icu==58.2=h9c2bf20_1\n", | |
" - defaults/linux-64::jbig==2.1=hdba287a_0\n", | |
" - defaults/linux-64::libedit==3.1.20170329=h6b74fdf_2\n", | |
" - defaults/linux-64::libffi==3.2.1=hd88cf55_4\n", | |
" - defaults/linux-64::libgcc-ng==8.2.0=hdf63c60_1\n", | |
" - defaults/linux-64::libsodium==1.0.16=h1bed415_0\n", | |
" - defaults/linux-64::libtiff==4.0.9=he85c1e1_2\n", | |
" - defaults/linux-64::libtool==2.4.6=h544aabb_3\n", | |
" - defaults/linux-64::libuuid==1.0.3=h1bed415_2\n", | |
" - defaults/linux-64::libxcb==1.13=h1bed415_1\n", | |
" - defaults/linux-64::libxml2==2.9.8=h26e45fe_1\n", | |
" - defaults/linux-64::libxslt==1.1.32=h1312cb7_0\n", | |
" - defaults/linux-64::lzo==2.10=h49e0be7_2\n", | |
" - defaults/linux-64::mkl-service==1.1.2=py37h90e4bf4_5\n", | |
" - defaults/linux-64::mpc==1.1.0=h10f8cd9_1\n", | |
" - defaults/linux-64::mpfr==4.0.1=hdf1c602_3\n", | |
" - defaults/linux-64::ncurses==6.1=hf484d3e_0\n", | |
" - defaults/linux-64::numba==0.39.0=py37h04863e7_0\n", | |
" - defaults/linux-64::numexpr==2.6.8=py37hd89afb7_0\n", | |
" - defaults/linux-64::odo==0.5.1=py37_0\n", | |
" - defaults/linux-64::pandoc==1.19.2.1=hea2e7c5_1\n", | |
" - defaults/linux-64::pango==1.42.4=h049681c_0\n", | |
" - defaults/linux-64::patchelf==0.9=hf484d3e_2\n", | |
" - defaults/linux-64::pcre==8.42=h439df22_0\n", | |
" - defaults/linux-64::pixman==0.34.0=hceecf20_3\n", | |
" - defaults/linux-64::pytables==3.4.4=py37ha205bf6_0\n", | |
" - defaults/linux-64::pytest-arraydiff==0.2=py37h39e3cac_0\n", | |
" - defaults/linux-64::pytest-astropy==0.4.0=py37_0\n", | |
" - defaults/linux-64::pytest-doctestplus==0.1.3=py37_0\n", | |
" - defaults/linux-64::pywavelets==1.0.0=py37hdd07704_0\n", | |
" - defaults/linux-64::readline==7.0=h7b6447c_5\n", | |
" - defaults/linux-64::scikit-image==0.14.0=py37hf484d3e_1\n", | |
" - defaults/linux-64::snappy==1.1.7=hbae5bb6_3\n", | |
" - defaults/linux-64::tk==8.6.8=hbc83047_0\n", | |
" - defaults/linux-64::unixodbc==2.3.7=h14c3975_0\n", | |
" - defaults/linux-64::xz==5.2.4=h14c3975_4\n", | |
" - defaults/linux-64::yaml==0.1.7=had09818_2\n", | |
" - defaults/linux-64::zeromq==4.2.5=hf484d3e_1\n", | |
" - defaults/linux-64::zlib==1.2.11=ha838bed_2\n", | |
"done\n", | |
"\n", | |
"\n", | |
"==> WARNING: A newer version of conda exists. <==\n", | |
" current version: 4.6.14\n", | |
" latest version: 4.7.5\n", | |
"\n", | |
"Please update conda by running\n", | |
"\n", | |
" $ conda update -n base conda\n", | |
"\n", | |
"\n", | |
"\n", | |
"## Package Plan ##\n", | |
"\n", | |
" environment location: /home/jupyterlab/conda\n", | |
"\n", | |
" added / updated specs:\n", | |
" - folium=0.5.0\n", | |
"\n", | |
"\n", | |
"The following packages will be downloaded:\n", | |
"\n", | |
" package | build\n", | |
" ---------------------------|-----------------\n", | |
" _libgcc_mutex-0.1 | main 3 KB\n", | |
" altair-3.1.0 | py36_0 724 KB conda-forge\n", | |
" asn1crypto-0.24.0 | py36_1003 154 KB conda-forge\n", | |
" attrs-19.1.0 | py_0 32 KB conda-forge\n", | |
" ca-certificates-2019.6.16 | hecc5488_0 145 KB conda-forge\n", | |
" certifi-2019.6.16 | py36_0 148 KB conda-forge\n", | |
" cffi-1.12.3 | py36h8022711_0 218 KB conda-forge\n", | |
" chardet-3.0.4 | py36_1003 190 KB conda-forge\n", | |
" cryptography-2.7 | py36h72c5cf5_0 607 KB conda-forge\n", | |
" entrypoints-0.3 | py36_1000 12 KB conda-forge\n", | |
" idna-2.8 | py36_1000 132 KB conda-forge\n", | |
" jinja2-2.10.1 | py_0 91 KB conda-forge\n", | |
" jsonschema-3.0.1 | py36_0 84 KB conda-forge\n", | |
" libffi-3.2.1 | he1b5a44_1006 46 KB conda-forge\n", | |
" libgcc-ng-9.1.0 | hdf63c60_0 8.1 MB\n", | |
" markupsafe-1.1.1 | py36h14c3975_0 26 KB conda-forge\n", | |
" mkl_fft-1.0.10 | py36_0 650 KB conda-forge\n", | |
" mkl_random-1.0.2 | py36_0 1.3 MB conda-forge\n", | |
" ncurses-6.1 | hf484d3e_1002 1.3 MB conda-forge\n", | |
" pandas-0.24.2 | py36hb3f55d8_0 11.1 MB conda-forge\n", | |
" pip-19.1.1 | py36_0 1.8 MB conda-forge\n", | |
" pycparser-2.19 | py36_1 173 KB conda-forge\n", | |
" pyopenssl-19.0.0 | py36_0 81 KB conda-forge\n", | |
" pyrsistent-0.15.2 | py36h516909a_0 89 KB conda-forge\n", | |
" pysocks-1.7.0 | py36_0 26 KB conda-forge\n", | |
" python-3.6.7 | h357f687_1005 34.6 MB conda-forge\n", | |
" python-dateutil-2.8.0 | py_0 219 KB conda-forge\n", | |
" pytz-2019.1 | py_0 227 KB conda-forge\n", | |
" readline-8.0 | hf8c457e_0 441 KB conda-forge\n", | |
" requests-2.22.0 | py36_0 84 KB conda-forge\n", | |
" setuptools-41.0.1 | py36_0 612 KB conda-forge\n", | |
" six-1.12.0 | py36_1000 22 KB conda-forge\n", | |
" sqlite-3.28.0 | hcee41ef_1 1.9 MB conda-forge\n", | |
" tk-8.6.9 | hed695b0_1002 3.2 MB conda-forge\n", | |
" toolz-0.9.0 | py_1 42 KB conda-forge\n", | |
" urllib3-1.24.3 | py36_0 151 KB conda-forge\n", | |
" wheel-0.33.4 | py36_0 34 KB conda-forge\n", | |
" xz-5.2.4 | h14c3975_1001 366 KB conda-forge\n", | |
" zlib-1.2.11 | h14c3975_1004 101 KB conda-forge\n", | |
" ------------------------------------------------------------\n", | |
" Total: 69.2 MB\n", | |
"\n", | |
"The following NEW packages will be INSTALLED:\n", | |
"\n", | |
" _libgcc_mutex pkgs/main/linux-64::_libgcc_mutex-0.1-main\n", | |
"\n", | |
"The following packages will be UPDATED:\n", | |
"\n", | |
" altair 2.4.1-py36_0 --> 3.1.0-py36_0\n", | |
" asn1crypto anaconda::asn1crypto-0.24.0-py36_0 --> conda-forge::asn1crypto-0.24.0-py36_1003\n", | |
" ca-certificates 2019.3.9-hecc5488_0 --> 2019.6.16-hecc5488_0\n", | |
" certifi 2019.3.9-py36_0 --> 2019.6.16-py36_0\n", | |
" cffi anaconda::cffi-1.12.2-py36h2e261b9_1 --> conda-forge::cffi-1.12.3-py36h8022711_0\n", | |
" chardet anaconda::chardet-3.0.4-py36_1 --> conda-forge::chardet-3.0.4-py36_1003\n", | |
" cryptography anaconda::cryptography-2.6.1-py36h1ba~ --> conda-forge::cryptography-2.7-py36h72c5cf5_0\n", | |
" entrypoints anaconda::entrypoints-0.3-py36_0 --> conda-forge::entrypoints-0.3-py36_1000\n", | |
" idna anaconda::idna-2.8-py36_0 --> conda-forge::idna-2.8-py36_1000\n", | |
" libffi pkgs/main::libffi-3.2.1-hd88cf55_4 --> conda-forge::libffi-3.2.1-he1b5a44_1006\n", | |
" libgcc-ng 8.2.0-hdf63c60_1 --> 9.1.0-hdf63c60_0\n", | |
" mkl_fft anaconda::mkl_fft-1.0.6-py36h7dd41cf_0 --> conda-forge::mkl_fft-1.0.10-py36_0\n", | |
" mkl_random anaconda::mkl_random-1.0.1-py36h4414c~ --> conda-forge::mkl_random-1.0.2-py36_0\n", | |
" ncurses pkgs/main::ncurses-6.1-hf484d3e_0 --> conda-forge::ncurses-6.1-hf484d3e_1002\n", | |
" pip anaconda::pip-19.0.3-py36_0 --> conda-forge::pip-19.1.1-py36_0\n", | |
" pycparser anaconda::pycparser-2.19-py36_0 --> conda-forge::pycparser-2.19-py36_1\n", | |
" pyrsistent anaconda::pyrsistent-0.14.11-py36h7b6~ --> conda-forge::pyrsistent-0.15.2-py36h516909a_0\n", | |
" pysocks anaconda::pysocks-1.6.8-py36_0 --> conda-forge::pysocks-1.7.0-py36_0\n", | |
" readline pkgs/main::readline-7.0-h7b6447c_5 --> conda-forge::readline-8.0-hf8c457e_0\n", | |
" requests anaconda::requests-2.21.0-py36_0 --> conda-forge::requests-2.22.0-py36_0\n", | |
" setuptools anaconda::setuptools-41.0.0-py36_0 --> conda-forge::setuptools-41.0.1-py36_0\n", | |
" six anaconda::six-1.12.0-py36_0 --> conda-forge::six-1.12.0-py36_1000\n", | |
" sqlite pkgs/main::sqlite-3.26.0-h7b6447c_0 --> conda-forge::sqlite-3.28.0-hcee41ef_1\n", | |
" tk pkgs/main::tk-8.6.8-hbc83047_0 --> conda-forge::tk-8.6.9-hed695b0_1002\n", | |
" toolz anaconda/linux-64::toolz-0.9.0-py36_0 --> conda-forge/noarch::toolz-0.9.0-py_1\n", | |
" urllib3 anaconda::urllib3-1.24.1-py36_0 --> conda-forge::urllib3-1.24.3-py36_0\n", | |
" wheel anaconda::wheel-0.33.1-py36_0 --> conda-forge::wheel-0.33.4-py36_0\n", | |
" xz pkgs/main::xz-5.2.4-h14c3975_4 --> conda-forge::xz-5.2.4-h14c3975_1001\n", | |
" zlib pkgs/main::zlib-1.2.11-ha838bed_2 --> conda-forge::zlib-1.2.11-h14c3975_1004\n", | |
"\n", | |
"The following packages will be SUPERSEDED by a higher-priority channel:\n", | |
"\n", | |
" attrs anaconda/linux-64::attrs-19.1.0-py36_1 --> conda-forge/noarch::attrs-19.1.0-py_0\n", | |
" jinja2 anaconda/linux-64::jinja2-2.10.1-py36~ --> conda-forge/noarch::jinja2-2.10.1-py_0\n", | |
" jsonschema anaconda --> conda-forge\n", | |
" markupsafe anaconda::markupsafe-1.1.1-py36h7b644~ --> conda-forge::markupsafe-1.1.1-py36h14c3975_0\n", | |
" pandas anaconda::pandas-0.24.2-py36he6710b0_0 --> conda-forge::pandas-0.24.2-py36hb3f55d8_0\n", | |
" pyopenssl anaconda --> conda-forge\n", | |
" python anaconda::python-3.6.8-h0371630_0 --> conda-forge::python-3.6.7-h357f687_1005\n", | |
" python-dateutil anaconda/linux-64::python-dateutil-2.~ --> conda-forge/noarch::python-dateutil-2.8.0-py_0\n", | |
" pytz anaconda --> conda-forge\n", | |
"\n", | |
"\n", | |
"\n", | |
"Downloading and Extracting Packages\n", | |
"mkl_fft-1.0.10 | 650 KB | ##################################### | 100% \n", | |
"cffi-1.12.3 | 218 KB | ##################################### | 100% \n", | |
"zlib-1.2.11 | 101 KB | ##################################### | 100% \n", | |
"_libgcc_mutex-0.1 | 3 KB | ##################################### | 100% \n", | |
"idna-2.8 | 132 KB | ##################################### | 100% \n", | |
"markupsafe-1.1.1 | 26 KB | ##################################### | 100% \n", | |
"toolz-0.9.0 | 42 KB | ##################################### | 100% \n", | |
"pyopenssl-19.0.0 | 81 KB | ##################################### | 100% \n", | |
"six-1.12.0 | 22 KB | ##################################### | 100% \n", | |
"requests-2.22.0 | 84 KB | ##################################### | 100% \n", | |
"python-dateutil-2.8. | 219 KB | ##################################### | 100% \n", | |
"certifi-2019.6.16 | 148 KB | ##################################### | 100% \n", | |
"pip-19.1.1 | 1.8 MB | ##################################### | 100% \n", | |
"wheel-0.33.4 | 34 KB | ##################################### | 100% \n", | |
"jsonschema-3.0.1 | 84 KB | ##################################### | 100% \n", | |
"python-3.6.7 | 34.6 MB | ##################################### | 100% \n", | |
"xz-5.2.4 | 366 KB | ##################################### | 100% \n", | |
"altair-3.1.0 | 724 KB | ##################################### | 100% \n", | |
"tk-8.6.9 | 3.2 MB | ##################################### | 100% \n", | |
"pyrsistent-0.15.2 | 89 KB | ##################################### | 100% \n", | |
"pysocks-1.7.0 | 26 KB | ##################################### | 100% \n", | |
"mkl_random-1.0.2 | 1.3 MB | ##################################### | 100% \n", | |
"pandas-0.24.2 | 11.1 MB | ##################################### | 100% \n", | |
"ncurses-6.1 | 1.3 MB | ##################################### | 100% \n", | |
"asn1crypto-0.24.0 | 154 KB | ##################################### | 100% \n", | |
"sqlite-3.28.0 | 1.9 MB | ##################################### | 100% \n", | |
"pycparser-2.19 | 173 KB | ##################################### | 100% \n", | |
"attrs-19.1.0 | 32 KB | ##################################### | 100% \n", | |
"pytz-2019.1 | 227 KB | ##################################### | 100% \n", | |
"libffi-3.2.1 | 46 KB | ##################################### | 100% \n", | |
"urllib3-1.24.3 | 151 KB | ##################################### | 100% \n", | |
"readline-8.0 | 441 KB | ##################################### | 100% \n", | |
"chardet-3.0.4 | 190 KB | ##################################### | 100% \n", | |
"jinja2-2.10.1 | 91 KB | ##################################### | 100% \n", | |
"cryptography-2.7 | 607 KB | ##################################### | 100% \n", | |
"libgcc-ng-9.1.0 | 8.1 MB | ##################################### | 100% \n", | |
"setuptools-41.0.1 | 612 KB | ##################################### | 100% \n", | |
"entrypoints-0.3 | 12 KB | ##################################### | 100% \n", | |
"ca-certificates-2019 | 145 KB | ##################################### | 100% \n", | |
"Preparing transaction: done\n", | |
"Verifying transaction: done\n", | |
"Executing transaction: done\n", | |
"Folium installed and imported!\n" | |
] | |
} | |
], | |
"source": [ | |
"!conda install -c conda-forge folium=0.5.0 --yes\n", | |
"import folium\n", | |
"\n", | |
"print('Folium installed and imported!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Generating the world map is straigtforward in **Folium**. You simply create a **Folium** *Map* object and then you display it. What is attactive about **Folium** maps is that they are interactive, so you can zoom into any region of interest despite the initial zoom level. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfODA1NDhlM2FjOWZhNDYyMzkyNzFlZTljM2UxZjhiODMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzgwNTQ4ZTNhYzlmYTQ2MjM5MjcxZWU5YzNlMWY4YjgzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF84MDU0OGUzYWM5ZmE0NjIzOTI3MWVlOWMzZTFmOGI4MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF84MDU0OGUzYWM5ZmE0NjIzOTI3MWVlOWMzZTFmOGI4MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzc3MmRjYzU5OWFjNjQ2ZGI5M2ZiYzkwNjRiNDBmMjVlID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzgwNTQ4ZTNhYzlmYTQ2MjM5MjcxZWU5YzNlMWY4YjgzKTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20931f470>" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# define the world map\n", | |
"world_map = folium.Map()\n", | |
"\n", | |
"# display world map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Go ahead. Try zooming in and out of the rendered map above." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"You can customize this default definition of the world map by specifying the centre of your map and the intial zoom level. \n", | |
"\n", | |
"All locations on a map are defined by their respective *Latitude* and *Longitude* values. So you can create a map and pass in a center of *Latitude* and *Longitude* values of **[0, 0]**. \n", | |
"\n", | |
"For a defined center, you can also define the intial zoom level into that location when the map is rendered. **The higher the zoom level the more the map is zoomed into the center**.\n", | |
"\n", | |
"Let's create a map centered around Canada and play with the zoom level to see how it affects the rendered map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMThlZmI3NGJiYmUxNDVkODlkYmY4ODIxNWY1MWZmZDEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzE4ZWZiNzRiYmJlMTQ1ZDg5ZGJmODgyMTVmNTFmZmQxIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xOGVmYjc0YmJiZTE0NWQ4OWRiZjg4MjE1ZjUxZmZkMSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xOGVmYjc0YmJiZTE0NWQ4OWRiZjg4MjE1ZjUxZmZkMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9kNThhYTJmNWJmMzM0YTE5OGViNmMzOGRlMTY3MzgxYiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOGVmYjc0YmJiZTE0NWQ4OWRiZjg4MjE1ZjUxZmZkMSk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20805b160>" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# define the world map centered around Canada with a low zoom level\n", | |
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4)\n", | |
"\n", | |
"# display world map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's create the map again with a higher zoom level" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMTU1ZGI2ZDM1NzliNGRmY2IyNjQ5YzU5MWUwMTEwZDYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzE1NWRiNmQzNTc5YjRkZmNiMjY0OWM1OTFlMDExMGQ2IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xNTVkYjZkMzU3OWI0ZGZjYjI2NDljNTkxZTAxMTBkNiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xNTVkYjZkMzU3OWI0ZGZjYjI2NDljNTkxZTAxMTBkNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl83OTU5NjNjMTIxNzk0MjYwODZkOGQwYTVhMDMxMDRjNiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xNTVkYjZkMzU3OWI0ZGZjYjI2NDljNTkxZTAxMTBkNik7CiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20805b828>" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# define the world map centered around Canada with a higher zoom level\n", | |
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=8)\n", | |
"\n", | |
"# display world map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"As you can see, the higher the zoom level the more the map is zoomed into the given center." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"**Question**: Create a map of Mexico with a zoom level of 4." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfODFmZmIwNWE5YzcwNDliYzgxNjgzZWM4NzQ1MWJlYWIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzgxZmZiMDVhOWM3MDQ5YmM4MTY4M2VjODc0NTFiZWFiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF84MWZmYjA1YTljNzA0OWJjODE2ODNlYzg3NDUxYmVhYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF84MWZmYjA1YTljNzA0OWJjODE2ODNlYzg3NDUxYmVhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfMTAyMTAwZTY2N2YwNGMxNDk3ZWRhMDdlNTU3ZTU4ZDIgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfODFmZmIwNWE5YzcwNDliYzgxNjgzZWM4NzQ1MWJlYWIpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc2080645f8>" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mexico_latitude = 23.6345 \n", | |
"mexico_longitude = -102.5528\n", | |
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=4)\n", | |
"mexico_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Double-click __here__ for the solution.\n", | |
"<!-- The correct answer is:\n", | |
"\\\\ # define Mexico's geolocation coordinates\n", | |
"mexico_latitude = 23.6345 \n", | |
"mexico_longitude = -102.5528\n", | |
"-->\n", | |
"\n", | |
"<!--\n", | |
"\\\\ # define the world map centered around Canada with a higher zoom level\n", | |
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=4)\n", | |
"-->\n", | |
"\n", | |
"<!--\n", | |
"\\\\ # display world map\n", | |
"mexico_map\n", | |
"-->" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Another cool feature of **Folium** is that you can generate different map styles." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### A. Stamen Toner Maps\n", | |
"\n", | |
"These are high-contrast B+W (black and white) maps. They are perfect for data mashups and exploring river meanders and coastal zones. " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's create a Stamen Toner map of canada with a zoom level of 4." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfYTY3MjdmNGVjYmY2NGFhOGEzYjg2ZGZmNzdiNjFjMzMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2E2NzI3ZjRlY2JmNjRhYThhM2I4NmRmZjc3YjYxYzMzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hNjcyN2Y0ZWNiZjY0YWE4YTNiODZkZmY3N2I2MWMzMyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hNjcyN2Y0ZWNiZjY0YWE4YTNiODZkZmY3N2I2MWMzMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9mMmRjY2FiMTQ2NGQ0NzFhYTkyYjcyOGMwMzhiZWMwYiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTY3MjdmNGVjYmY2NGFhOGEzYjg2ZGZmNzdiNjFjMzMpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc208072d30>" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create a Stamen Toner map of the world centered around Canada\n", | |
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Toner')\n", | |
"\n", | |
"# display map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Feel free to zoom in and out to see how this style compares to the default one." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### B. Stamen Terrain Maps\n", | |
"\n", | |
"These are maps that feature hill shading and natural vegetation colors. They showcase advanced labeling and linework generalization of dual-carriageway roads." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's create a Stamen Terrain map of Canada with zoom level 4." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMGZlNGNkNzYwODMwNDNmOGE4YzZiOTQ5MGVmYjdmZWMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzBmZTRjZDc2MDgzMDQzZjhhOGM2Yjk0OTBlZmI3ZmVjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8wZmU0Y2Q3NjA4MzA0M2Y4YThjNmI5NDkwZWZiN2ZlYyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8wZmU0Y2Q3NjA4MzA0M2Y4YThjNmI5NDkwZWZiN2ZlYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl80MWRiMzJkYTAzZWM0Mzk4OWUwMmY0YzkyZTFmNGM2NiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RlcnJhaW4ve3p9L3t4fS97eX0uanBnJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8wZmU0Y2Q3NjA4MzA0M2Y4YThjNmI5NDkwZWZiN2ZlYyk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc203fcfc50>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create a Stamen Toner map of the world centered around Canada\n", | |
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Terrain')\n", | |
"\n", | |
"# display map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Feel free to zoom in and out to see how this style compares to Stamen Toner and the default style." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### C. Mapbox Bright Maps\n", | |
"\n", | |
"These are maps that quite similar to the default style, except that the borders are not visible with a low zoom level. Furthermore, unlike the default style where country names are displayed in each country's native language, *Mapbox Bright* style displays all country names in English." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's create a world map with this style." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMjc3NmZjNGI3M2VjNDc2NjllZjViZGJiM2IwMTQ3OGIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzI3NzZmYzRiNzNlYzQ3NjY5ZWY1YmRiYjNiMDE0NzhiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yNzc2ZmM0YjczZWM0NzY2OWVmNWJkYmIzYjAxNDc4YiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yNzc2ZmM0YjczZWM0NzY2OWVmNWJkYmIzYjAxNDc4YicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzBmNjAyZjI5NTBiNjQ5NzM5ZWM4NzU2YzY1MWRkZjBhID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZXMubWFwYm94LmNvbS92My9tYXBib3gud29ybGQtYnJpZ2h0L3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc3NmZjNGI3M2VjNDc2NjllZjViZGJiM2IwMTQ3OGIpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc208070eb8>" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create a world map with a Mapbox Bright style.\n", | |
"world_map = folium.Map(tiles='Mapbox Bright')\n", | |
"\n", | |
"# display the map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Zoom in and notice how the borders start showing as you zoom in, and the displayed country names are in English." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"**Question**: Create a map of Mexico to visualize its hill shading and natural vegetation. Use a zoom level of 6." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNmZjNjhkZjJmNWIzNGY3Zjk2NzZhMWU2MjQ2MDg1NGEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzZmYzY4ZGYyZjViMzRmN2Y5Njc2YTFlNjI0NjA4NTRhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF82ZmM2OGRmMmY1YjM0ZjdmOTY3NmExZTYyNDYwODU0YSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF82ZmM2OGRmMmY1YjM0ZjdmOTY3NmExZTYyNDYwODU0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfM2M5ZTVjMjJjMTdmNDU3MWE0NDNmZjViZmM1YTM2MGQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3N0YW1lbi10aWxlcy17c30uYS5zc2wuZmFzdGx5Lm5ldC90ZXJyYWluL3t6fS97eH0ve3l9LmpwZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmZjNjhkZjJmNWIzNGY3Zjk2NzZhMWU2MjQ2MDg1NGEpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc203fc4f60>" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mexico_latitude = 23.6345 \n", | |
"mexico_longitude = -102.5528\n", | |
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=6, tiles='Stamen Terrain')\n", | |
"mexico_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Double-click __here__ for the solution.\n", | |
"<!-- The correct answer is:\n", | |
"\\\\ # define Mexico's geolocation coordinates\n", | |
"mexico_latitude = 23.6345 \n", | |
"mexico_longitude = -102.5528\n", | |
"-->\n", | |
"\n", | |
"<!--\n", | |
"\\\\ # define the world map centered around Canada with a higher zoom level\n", | |
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=6, tiles='Stamen Terrain')\n", | |
"-->\n", | |
"\n", | |
"<!--\n", | |
"\\\\ # display world map\n", | |
"mexico_map\n", | |
"-->" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"# Maps with Markers <a id=\"6\"></a>\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's download and import the data on police department incidents using *pandas* `read_csv()` method." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Download the dataset and read it into a *pandas* dataframe:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Dataset downloaded and read into a pandas dataframe!\n" | |
] | |
} | |
], | |
"source": [ | |
"import pandas as pd\n", | |
"df_incidents = pd.read_csv('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Police_Department_Incidents_-_Previous_Year__2016_.csv')\n", | |
"\n", | |
"print('Dataset downloaded and read into a pandas dataframe!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's take a look at the first five items in our dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>IncidntNum</th>\n", | |
" <th>Category</th>\n", | |
" <th>Descript</th>\n", | |
" <th>DayOfWeek</th>\n", | |
" <th>Date</th>\n", | |
" <th>Time</th>\n", | |
" <th>PdDistrict</th>\n", | |
" <th>Resolution</th>\n", | |
" <th>Address</th>\n", | |
" <th>X</th>\n", | |
" <th>Y</th>\n", | |
" <th>Location</th>\n", | |
" <th>PdId</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>120058272</td>\n", | |
" <td>WEAPON LAWS</td>\n", | |
" <td>POSS OF PROHIBITED WEAPON</td>\n", | |
" <td>Friday</td>\n", | |
" <td>01/29/2016 12:00:00 AM</td>\n", | |
" <td>11:00</td>\n", | |
" <td>SOUTHERN</td>\n", | |
" <td>ARREST, BOOKED</td>\n", | |
" <td>800 Block of BRYANT ST</td>\n", | |
" <td>-122.403405</td>\n", | |
" <td>37.775421</td>\n", | |
" <td>(37.775420706711, -122.403404791479)</td>\n", | |
" <td>12005827212120</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>120058272</td>\n", | |
" <td>WEAPON LAWS</td>\n", | |
" <td>FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE</td>\n", | |
" <td>Friday</td>\n", | |
" <td>01/29/2016 12:00:00 AM</td>\n", | |
" <td>11:00</td>\n", | |
" <td>SOUTHERN</td>\n", | |
" <td>ARREST, BOOKED</td>\n", | |
" <td>800 Block of BRYANT ST</td>\n", | |
" <td>-122.403405</td>\n", | |
" <td>37.775421</td>\n", | |
" <td>(37.775420706711, -122.403404791479)</td>\n", | |
" <td>12005827212168</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>141059263</td>\n", | |
" <td>WARRANTS</td>\n", | |
" <td>WARRANT ARREST</td>\n", | |
" <td>Monday</td>\n", | |
" <td>04/25/2016 12:00:00 AM</td>\n", | |
" <td>14:59</td>\n", | |
" <td>BAYVIEW</td>\n", | |
" <td>ARREST, BOOKED</td>\n", | |
" <td>KEITH ST / SHAFTER AV</td>\n", | |
" <td>-122.388856</td>\n", | |
" <td>37.729981</td>\n", | |
" <td>(37.7299809672996, -122.388856204292)</td>\n", | |
" <td>14105926363010</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>160013662</td>\n", | |
" <td>NON-CRIMINAL</td>\n", | |
" <td>LOST PROPERTY</td>\n", | |
" <td>Tuesday</td>\n", | |
" <td>01/05/2016 12:00:00 AM</td>\n", | |
" <td>23:50</td>\n", | |
" <td>TENDERLOIN</td>\n", | |
" <td>NONE</td>\n", | |
" <td>JONES ST / OFARRELL ST</td>\n", | |
" <td>-122.412971</td>\n", | |
" <td>37.785788</td>\n", | |
" <td>(37.7857883766888, -122.412970537591)</td>\n", | |
" <td>16001366271000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>160002740</td>\n", | |
" <td>NON-CRIMINAL</td>\n", | |
" <td>LOST PROPERTY</td>\n", | |
" <td>Friday</td>\n", | |
" <td>01/01/2016 12:00:00 AM</td>\n", | |
" <td>00:30</td>\n", | |
" <td>MISSION</td>\n", | |
" <td>NONE</td>\n", | |
" <td>16TH ST / MISSION ST</td>\n", | |
" <td>-122.419672</td>\n", | |
" <td>37.765050</td>\n", | |
" <td>(37.7650501214668, -122.419671780296)</td>\n", | |
" <td>16000274071000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" IncidntNum Category Descript \\\n", | |
"0 120058272 WEAPON LAWS POSS OF PROHIBITED WEAPON \n", | |
"1 120058272 WEAPON LAWS FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE \n", | |
"2 141059263 WARRANTS WARRANT ARREST \n", | |
"3 160013662 NON-CRIMINAL LOST PROPERTY \n", | |
"4 160002740 NON-CRIMINAL LOST PROPERTY \n", | |
"\n", | |
" DayOfWeek Date Time PdDistrict Resolution \\\n", | |
"0 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n", | |
"1 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n", | |
"2 Monday 04/25/2016 12:00:00 AM 14:59 BAYVIEW ARREST, BOOKED \n", | |
"3 Tuesday 01/05/2016 12:00:00 AM 23:50 TENDERLOIN NONE \n", | |
"4 Friday 01/01/2016 12:00:00 AM 00:30 MISSION NONE \n", | |
"\n", | |
" Address X Y \\\n", | |
"0 800 Block of BRYANT ST -122.403405 37.775421 \n", | |
"1 800 Block of BRYANT ST -122.403405 37.775421 \n", | |
"2 KEITH ST / SHAFTER AV -122.388856 37.729981 \n", | |
"3 JONES ST / OFARRELL ST -122.412971 37.785788 \n", | |
"4 16TH ST / MISSION ST -122.419672 37.765050 \n", | |
"\n", | |
" Location PdId \n", | |
"0 (37.775420706711, -122.403404791479) 12005827212120 \n", | |
"1 (37.775420706711, -122.403404791479) 12005827212168 \n", | |
"2 (37.7299809672996, -122.388856204292) 14105926363010 \n", | |
"3 (37.7857883766888, -122.412970537591) 16001366271000 \n", | |
"4 (37.7650501214668, -122.419671780296) 16000274071000 " | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_incidents.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"So each row consists of 13 features:\n", | |
"> 1. **IncidntNum**: Incident Number\n", | |
"> 2. **Category**: Category of crime or incident\n", | |
"> 3. **Descript**: Description of the crime or incident\n", | |
"> 4. **DayOfWeek**: The day of week on which the incident occurred\n", | |
"> 5. **Date**: The Date on which the incident occurred\n", | |
"> 6. **Time**: The time of day on which the incident occurred\n", | |
"> 7. **PdDistrict**: The police department district\n", | |
"> 8. **Resolution**: The resolution of the crime in terms whether the perpetrator was arrested or not\n", | |
"> 9. **Address**: The closest address to where the incident took place\n", | |
"> 10. **X**: The longitude value of the crime location \n", | |
"> 11. **Y**: The latitude value of the crime location\n", | |
"> 12. **Location**: A tuple of the latitude and the longitude values\n", | |
"> 13. **PdId**: The police department ID" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's find out how many entries there are in our dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(150500, 13)" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_incidents.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"So the dataframe consists of 150,500 crimes, which took place in the year 2016. In order to reduce computational cost, let's just work with the first 100 incidents in this dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# get the first 100 crimes in the df_incidents dataframe\n", | |
"limit = 100\n", | |
"df_incidents = df_incidents.iloc[0:limit, :]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's confirm that our dataframe now consists only of 100 crimes." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(100, 13)" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_incidents.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now that we reduced the data a little bit, let's visualize where these crimes took place in the city of San Francisco. We will use the default style and we will initialize the zoom level to 12. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# San Francisco latitude and longitude values\n", | |
"latitude = 37.77\n", | |
"longitude = -122.42" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGRmMjExNzhkNjgyNGVhMWJjYTFhM2QzMjViNWZiNjAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20164dd30>" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create map and display it\n", | |
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n", | |
"\n", | |
"# display the map of San Francisco\n", | |
"sanfran_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now let's superimpose the locations of the crimes onto the map. The way to do that in **Folium** is to create a *feature group* with its own features and style and then add it to the sanfran_map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGRmMjExNzhkNjgyNGVhMWJjYTFhM2QzMjViNWZiNjAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjAwYzFmMzkwMGQ5NGVjMmEyNDYzMTY1ZmMwNDVmZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3MTBiN2FkM2EwYjRlNDRiMWI5NGMwYjNhYmE3OWM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTA0ZDU0YTI3NzA0Nzc4YmM2YThkNGQxYjM1ZTY4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmN2QzNTNmNDhiYzRmMDRiMmUwZGUwNWI1Nzg1MWE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjZkZGJhNGNlODc0MzdkYWFhNzU0MjA2MTlhMDgzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzE0Yjk0ZGU2YzY0YzhjYjc3ZWY0MjFmNzIxNGMyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY3Y2RkOTY3ZmQ4NDY5M2E3YmQ0ZTk2NzA3ZDIwYWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNlZmMxYTc1MzFhNGI2ZjgwZDdkNzliOWFiMjEzNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJmMTdhZjEyMjMwNGQzYjhiNWQ1NzhiNTYyYWI0YzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjFiN2FiZmUxOTk0NDUwYTljOTM5MjcxOTgyNTUxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Y2RkYjI4OWJjZmQ0MjE1ODkwYWJjMDYyYzljYjI0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDAzYWMwMzc5MWYzNDFkNTk1YTcwZjdjOGI3Mjg4YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWQzYjU3MTE5NGI0Y2Q2YjM0ZmYwYjMwNzQzZDIxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzM4NmRjNDE0MTBlNDE2Nzg1MDJiOGQ5M2IyMmQ5NTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTkyYmRjY2E1NjY2NDMwZWJiMmFmYWRmNzgwYmE5Y2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhOGEzZjE2N2JjMzQ3MjhiYjY1MzNhZTc0MmY2YTZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiYWVjN2Y5ZmY1MDQ2OTk4NDA0MTllNDg1YjFmZjFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDBmNWRlZDhkNzE5NDBhNDg5YjFlYzA1MmEzNjBjZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODRkMmM4NjI5YTg0MDM1OWI5OTk2MWIwOTViOWQwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjZTA3OTkzMDc3ODQ2ZTQ5MDc1ZmQyMGY4NDAxZmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzMWU3NWJkOGQ2NTQyYTU4Yjc4MDI4YTE1ZGVhYjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODI3NzFhOGJkYzFkNDIxNGE3YjRlYjcwMzM1NTg0NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2MjczZWE5ZDFiYzQxMzhhYTQwOGMyYjUwYjM5NmMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ODFhODBjZjQzYzU0ZTQ4ODEzYTFjN2Q1ZmJjZmI2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODk2Y2RlNzVkY2RmNDE0ZjkzMjBmZTUxYjBiNjQyMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTk4YWFiY2FkMzU0ZjliOGJmODNkMGUwNDRlNDQ3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkzMmUwM2U0MThmNGM0MzkyM2QyOWE4YzI3MGIzODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDVjM2FmZTJkOTY5NGNmNWIwNGQ1Njk5OTZlNzJiYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JjMDdiZWU5MGIxNDVlMDhhZDkwMzg4ZDU2NTU0YTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZDgyZDRhNDBlMDM0MmMxODI1YzVhNGZhODhkYTBiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODVkNjhkMWE5NTc0NGQyOTA5MzlkZmFhYmIzMzY1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkYmE0ZmYwMGYxMjQ4OWZhMjU1YzVkNGVhZGI4NmFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJiMjE3MTZiZjY3ZDRiNWRhZmY1MzI5ZWUxMzBkZGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2NjYyMTVmZDQwYjQ1NzU5NmI2M2M4OGVjYzg3ZTQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwNmI3ZTFlMDI0OTQyMjE5NWI1OTIwOThkMTg0MDNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjYxZWFhMWU1ZTc2NGJlY2JiMjc3ZGJjZWYwYTY4YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTY5YTMzYTM5ODI0ODIwOWVhZjVhZDc4N2JlYTNkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5MTZkMzMwZjI1NzQ4MDU5MWVhNTNiNTBmMzZmNWE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhOGZlYmE1YzA3ZjQxMGVhY2I0MTVkY2JlZjA4MzRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODljYTBiM2VlOWVlNGJkMmEwODg1NmE1MTZhZDU2M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNzcxYzk2MTVmNjc0NmQ1YTYzZDk5ZDBiN2ViZGJiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZmZiMjU5OGFhOWE0MThhYTQ5OTIyOTZmZGI2ZTU1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDYyMTJmMzA1ZWQ0MTExYjk2OGJiOWJjOTFhNWU5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MzhkMzc0MDkzZDE0Nzg2OGUxYTMyMzRiZDkzZTMzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDBmM2JlNzU4N2I1NGJlNWJlYjY4OWFlYTJiYmY1OGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wOWJjODcyMDQ2OTc0OTdmYmUyYmViZmJhZjVlNmU1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1NGYyMjUxZTE5YTQ0ODA5Yzc0MTA4YzE1MDFkNTA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2NDZkMWQ2NzM3MjRkNGU5NWUzYTFlYTBiMWQ4ZjQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4NDUxNDU3YzA2ZDQyYjliZDZmNWU4ODJkMWQ0NDJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwNzE5MmVmNzRlNzQ5YzBhZGFhZjI4NmU0YjkxZmUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiMWU0ZGY0ZjhlZTRhNmE4YmU2MDhmZTk1ZDk4NTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTFjMmYwM2U5ZTVjNDYxMWEzNjcwOGI0YTQ2YjA5MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTg2MzQzNDE0ZTY0ZGU5ODEyNmNjYTdlZWZlMTkxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODdmMjM5OGNkODA0YzM2YjE1Y2RjYmQzZWMwZDM2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDdjY2EyNDNkZjg0NWNmYjZiZGQzZDYxZjQ2OWZiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2NzU0MWYzMTcwNjQ3Njk5Y2E1MTM0ZTBjZWI1NDY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlYTZlMzQ5OGQxMjQxYTliNjU2OTdiMzlhMGJhYjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg3MWRlZDNkODljNDVlNmJlMWQxOTdhZjYzN2Y2YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWU3NTk2MDJkNjU5NGFjNzkxMTBjMzIzZjQ4NDY3MDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkNDA1YzFjMTZjNTQ2MGNhZGYzM2JhMDU4YjllZjRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDIwODBlZWI1YWU0YTUxODA3Yzg2ZWVjNDE1YTkwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzgwMWIxOGExNGFjNGVkMzlkNTAzMGYzMDdkYTBkODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjczYzkwZWEwNzhlNGJmYTlmNzdkNjU5ZDE2NDQwOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZlNDc4N2NlZmRmNDA3M2FiZjRlNjlkOWM3MDhlMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcxNzBiMDJhMWQxNDk5MThhZmExNjczMTRmODY4NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGY5YTg5NTgzZTYzNDRkZmJlZDJmM2NhY2FlN2ZjMTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYWJhMjMwMzM5NTc0N2IwYmQ5MGJiZGQ2ZDQ5ZTU4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTIyZmY4ODMwY2Y0NWM1OWMzYmVhZDBhMWE1NmY4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzYWQzNWQ4YjkzMjQ5ZTNhMWJkZmZkMWNjOWZjMmRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NjQwZTc5YjNlMTQ5ZDBhYTUyMjE3MDhmYjNiMzAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhYmE1ODc1YWZiYzQ5MjRiYzZjZDBjOWUzMDIzM2M0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTJmYjI5NTA1ZmM0MGMxOTBkYjNkNTk1OTdhNDUyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjExYWE3OTU4MjZkNDExNzgzZTgwOWYxOWMxNGE3MjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3M2IzNmY0YTkzMzQyZmNhZTM5MTVhNWU3N2VlM2MwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWU3NjI3ODVjYjQ2NDk4MGExYTkzNzQyNjRjNzM1MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWUzOTE0YmZmMzE1NDY4ZGJlZDQ5ZGZkYzc5NWY4MzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jY2VmYjNmZGQ2MWU0YjYzOGI2YjFmMzU2NDk3N2QzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDI0ZjNjNjBkNzI1NDI1ZDkzMzBhZmUwNTY1OGU4MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2YTA4NmFlY2I5ODQ5NGVhYjAzNTkzZjE1YjM4YzdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWRkNDE5MmJlMGU0NmFjOTYwMTFiNjFjZDEwY2IxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxMGI4ZDJlZGRiZTRkYzJhNDNhNmUwYWZlYTQwYjEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlMzk5YTczNjI0YTQyZTdiNGM2ODU1NWE5MTUxOGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1NzViYWE3NzViZDQxYjNhODAwZTllNTkyMDEzNzQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jM2U3MmZmNGMyNjc0OTcxYTc1MzA5ZDQxOGExMjdjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjZjNkNDI4Y2Y4MzQ2YmE4NTVlNGYyNjljNzExNTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNTU4ODVhODZiMTRlNDJiNGNmOTg1Mjg1YWE4ZGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyMDliNDk4YjBhOTQzNjdiNzBjMWVkMzQ5ZGQ3Y2Q5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODFjY2U0OWVhNGM0NWE5YjNkMjczMDU4ZWI3ODg4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGRhNzg2NjdmMzE0MTJhYTRhMzllNDBiODQ2OWE5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwMjk3NDM2YjY5ZjRhMzJhY2RhZjFjMDQwNTI0NzA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkxNjEwNjhkMzNiNDg3YWFiNzkwZjhjYjFmNDczYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMWJmMzBkOThmOGU0MjE5YTZkODJmMjIzN2RhOTEwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1N2VjZTAwOTEwMDQyMzU4NzAyNjg2NDQxYzU0YWUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY2M2E2MGEzZDNiNGFjNThiM2RiMjRlZWExZDM1NWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MWRhN2VhMWVmZTg0MjgxOWZmMDFmYTQ1NDYxMDFhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzQ5YTIzZDE2YjU0MzZlODEwMThiNmUyYWU5OTEyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2OGI4Y2RhNzA1YzQwOTNiYjkxNTJiYjNjNjdiMzk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjdjYjM3Nzk5ZTAwNDg2Mjg4ZjA3YjVjZDNlODdkZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU2YjgyZDRiZjYyNDg4Yzk1OGExYzE4Y2ViZjRiMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTU0YzQyODg5MzQyNDg4YmE5ZDVhMmY1YTYwOWEyNTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20164dd30>" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# instantiate a feature group for the incidents in the dataframe\n", | |
"incidents = folium.map.FeatureGroup()\n", | |
"\n", | |
"# loop through the 100 crimes and add each to the incidents feature group\n", | |
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n", | |
" incidents.add_child(\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5, # define how big you want the circle markers to be\n", | |
" color='yellow',\n", | |
" fill=True,\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" )\n", | |
" )\n", | |
"\n", | |
"# add incidents to map\n", | |
"sanfran_map.add_child(incidents)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"You can also add some pop-up text that would get displayed when you hover over a marker. Let's make each marker display the category of the crime when hovered over." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGRmMjExNzhkNjgyNGVhMWJjYTFhM2QzMjViNWZiNjAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjAwYzFmMzkwMGQ5NGVjMmEyNDYzMTY1ZmMwNDVmZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3MTBiN2FkM2EwYjRlNDRiMWI5NGMwYjNhYmE3OWM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTA0ZDU0YTI3NzA0Nzc4YmM2YThkNGQxYjM1ZTY4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmN2QzNTNmNDhiYzRmMDRiMmUwZGUwNWI1Nzg1MWE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjZkZGJhNGNlODc0MzdkYWFhNzU0MjA2MTlhMDgzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzE0Yjk0ZGU2YzY0YzhjYjc3ZWY0MjFmNzIxNGMyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY3Y2RkOTY3ZmQ4NDY5M2E3YmQ0ZTk2NzA3ZDIwYWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNlZmMxYTc1MzFhNGI2ZjgwZDdkNzliOWFiMjEzNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJmMTdhZjEyMjMwNGQzYjhiNWQ1NzhiNTYyYWI0YzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjFiN2FiZmUxOTk0NDUwYTljOTM5MjcxOTgyNTUxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Y2RkYjI4OWJjZmQ0MjE1ODkwYWJjMDYyYzljYjI0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDAzYWMwMzc5MWYzNDFkNTk1YTcwZjdjOGI3Mjg4YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWQzYjU3MTE5NGI0Y2Q2YjM0ZmYwYjMwNzQzZDIxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzM4NmRjNDE0MTBlNDE2Nzg1MDJiOGQ5M2IyMmQ5NTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTkyYmRjY2E1NjY2NDMwZWJiMmFmYWRmNzgwYmE5Y2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhOGEzZjE2N2JjMzQ3MjhiYjY1MzNhZTc0MmY2YTZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiYWVjN2Y5ZmY1MDQ2OTk4NDA0MTllNDg1YjFmZjFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDBmNWRlZDhkNzE5NDBhNDg5YjFlYzA1MmEzNjBjZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODRkMmM4NjI5YTg0MDM1OWI5OTk2MWIwOTViOWQwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjZTA3OTkzMDc3ODQ2ZTQ5MDc1ZmQyMGY4NDAxZmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzMWU3NWJkOGQ2NTQyYTU4Yjc4MDI4YTE1ZGVhYjU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODI3NzFhOGJkYzFkNDIxNGE3YjRlYjcwMzM1NTg0NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2MjczZWE5ZDFiYzQxMzhhYTQwOGMyYjUwYjM5NmMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ODFhODBjZjQzYzU0ZTQ4ODEzYTFjN2Q1ZmJjZmI2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODk2Y2RlNzVkY2RmNDE0ZjkzMjBmZTUxYjBiNjQyMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTk4YWFiY2FkMzU0ZjliOGJmODNkMGUwNDRlNDQ3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkzMmUwM2U0MThmNGM0MzkyM2QyOWE4YzI3MGIzODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDVjM2FmZTJkOTY5NGNmNWIwNGQ1Njk5OTZlNzJiYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JjMDdiZWU5MGIxNDVlMDhhZDkwMzg4ZDU2NTU0YTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZDgyZDRhNDBlMDM0MmMxODI1YzVhNGZhODhkYTBiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODVkNjhkMWE5NTc0NGQyOTA5MzlkZmFhYmIzMzY1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkYmE0ZmYwMGYxMjQ4OWZhMjU1YzVkNGVhZGI4NmFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJiMjE3MTZiZjY3ZDRiNWRhZmY1MzI5ZWUxMzBkZGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2NjYyMTVmZDQwYjQ1NzU5NmI2M2M4OGVjYzg3ZTQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwNmI3ZTFlMDI0OTQyMjE5NWI1OTIwOThkMTg0MDNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjYxZWFhMWU1ZTc2NGJlY2JiMjc3ZGJjZWYwYTY4YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTY5YTMzYTM5ODI0ODIwOWVhZjVhZDc4N2JlYTNkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5MTZkMzMwZjI1NzQ4MDU5MWVhNTNiNTBmMzZmNWE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhOGZlYmE1YzA3ZjQxMGVhY2I0MTVkY2JlZjA4MzRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODljYTBiM2VlOWVlNGJkMmEwODg1NmE1MTZhZDU2M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNzcxYzk2MTVmNjc0NmQ1YTYzZDk5ZDBiN2ViZGJiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZmZiMjU5OGFhOWE0MThhYTQ5OTIyOTZmZGI2ZTU1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDYyMTJmMzA1ZWQ0MTExYjk2OGJiOWJjOTFhNWU5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MzhkMzc0MDkzZDE0Nzg2OGUxYTMyMzRiZDkzZTMzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDBmM2JlNzU4N2I1NGJlNWJlYjY4OWFlYTJiYmY1OGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wOWJjODcyMDQ2OTc0OTdmYmUyYmViZmJhZjVlNmU1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1NGYyMjUxZTE5YTQ0ODA5Yzc0MTA4YzE1MDFkNTA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2NDZkMWQ2NzM3MjRkNGU5NWUzYTFlYTBiMWQ4ZjQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4NDUxNDU3YzA2ZDQyYjliZDZmNWU4ODJkMWQ0NDJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwNzE5MmVmNzRlNzQ5YzBhZGFhZjI4NmU0YjkxZmUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiMWU0ZGY0ZjhlZTRhNmE4YmU2MDhmZTk1ZDk4NTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTFjMmYwM2U5ZTVjNDYxMWEzNjcwOGI0YTQ2YjA5MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTg2MzQzNDE0ZTY0ZGU5ODEyNmNjYTdlZWZlMTkxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODdmMjM5OGNkODA0YzM2YjE1Y2RjYmQzZWMwZDM2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDdjY2EyNDNkZjg0NWNmYjZiZGQzZDYxZjQ2OWZiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2NzU0MWYzMTcwNjQ3Njk5Y2E1MTM0ZTBjZWI1NDY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlYTZlMzQ5OGQxMjQxYTliNjU2OTdiMzlhMGJhYjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg3MWRlZDNkODljNDVlNmJlMWQxOTdhZjYzN2Y2YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWU3NTk2MDJkNjU5NGFjNzkxMTBjMzIzZjQ4NDY3MDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkNDA1YzFjMTZjNTQ2MGNhZGYzM2JhMDU4YjllZjRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDIwODBlZWI1YWU0YTUxODA3Yzg2ZWVjNDE1YTkwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzgwMWIxOGExNGFjNGVkMzlkNTAzMGYzMDdkYTBkODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjczYzkwZWEwNzhlNGJmYTlmNzdkNjU5ZDE2NDQwOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZlNDc4N2NlZmRmNDA3M2FiZjRlNjlkOWM3MDhlMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcxNzBiMDJhMWQxNDk5MThhZmExNjczMTRmODY4NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGY5YTg5NTgzZTYzNDRkZmJlZDJmM2NhY2FlN2ZjMTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYWJhMjMwMzM5NTc0N2IwYmQ5MGJiZGQ2ZDQ5ZTU4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTIyZmY4ODMwY2Y0NWM1OWMzYmVhZDBhMWE1NmY4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzYWQzNWQ4YjkzMjQ5ZTNhMWJkZmZkMWNjOWZjMmRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NjQwZTc5YjNlMTQ5ZDBhYTUyMjE3MDhmYjNiMzAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhYmE1ODc1YWZiYzQ5MjRiYzZjZDBjOWUzMDIzM2M0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTJmYjI5NTA1ZmM0MGMxOTBkYjNkNTk1OTdhNDUyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjExYWE3OTU4MjZkNDExNzgzZTgwOWYxOWMxNGE3MjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3M2IzNmY0YTkzMzQyZmNhZTM5MTVhNWU3N2VlM2MwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWU3NjI3ODVjYjQ2NDk4MGExYTkzNzQyNjRjNzM1MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWUzOTE0YmZmMzE1NDY4ZGJlZDQ5ZGZkYzc5NWY4MzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jY2VmYjNmZGQ2MWU0YjYzOGI2YjFmMzU2NDk3N2QzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDI0ZjNjNjBkNzI1NDI1ZDkzMzBhZmUwNTY1OGU4MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2YTA4NmFlY2I5ODQ5NGVhYjAzNTkzZjE1YjM4YzdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWRkNDE5MmJlMGU0NmFjOTYwMTFiNjFjZDEwY2IxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxMGI4ZDJlZGRiZTRkYzJhNDNhNmUwYWZlYTQwYjEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlMzk5YTczNjI0YTQyZTdiNGM2ODU1NWE5MTUxOGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1NzViYWE3NzViZDQxYjNhODAwZTllNTkyMDEzNzQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jM2U3MmZmNGMyNjc0OTcxYTc1MzA5ZDQxOGExMjdjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjZjNkNDI4Y2Y4MzQ2YmE4NTVlNGYyNjljNzExNTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNTU4ODVhODZiMTRlNDJiNGNmOTg1Mjg1YWE4ZGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyMDliNDk4YjBhOTQzNjdiNzBjMWVkMzQ5ZGQ3Y2Q5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODFjY2U0OWVhNGM0NWE5YjNkMjczMDU4ZWI3ODg4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGRhNzg2NjdmMzE0MTJhYTRhMzllNDBiODQ2OWE5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwMjk3NDM2YjY5ZjRhMzJhY2RhZjFjMDQwNTI0NzA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkxNjEwNjhkMzNiNDg3YWFiNzkwZjhjYjFmNDczYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMWJmMzBkOThmOGU0MjE5YTZkODJmMjIzN2RhOTEwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1N2VjZTAwOTEwMDQyMzU4NzAyNjg2NDQxYzU0YWUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY2M2E2MGEzZDNiNGFjNThiM2RiMjRlZWExZDM1NWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MWRhN2VhMWVmZTg0MjgxOWZmMDFmYTQ1NDYxMDFhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzQ5YTIzZDE2YjU0MzZlODEwMThiNmUyYWU5OTEyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF81NWU0ZWRiNzFkYTg0OGQwYTliMWI0ZjczYmMxYTFjYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2OGI4Y2RhNzA1YzQwOTNiYjkxNTJiYjNjNjdiMzk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjdjYjM3Nzk5ZTAwNDg2Mjg4ZjA3YjVjZDNlODdkZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU2YjgyZDRiZjYyNDg4Yzk1OGExYzE4Y2ViZjRiMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzU1ZTRlZGI3MWRhODQ4ZDBhOWIxYjRmNzNiYzFhMWNjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTU0YzQyODg5MzQyNDg4YmE5ZDVhMmY1YTYwOWEyNTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNTVlNGVkYjcxZGE4NDhkMGE5YjFiNGY3M2JjMWExY2MpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YjJjNzdjMWM5ZDQ0NGJiOWQxNmI0ZWNmYWRkNDEwZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmJjZWM3N2FmNTIxNDFiNjg5ODExMjhmZDYzMmYyZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWY2MmYxZDRiZWRjNGY2NDhmNTRjNGI3YTdkYjBlMjUgPSAkKCc8ZGl2IGlkPSJodG1sX2VmNjJmMWQ0YmVkYzRmNjQ4ZjU0YzRiN2E3ZGIwZTI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XRUFQT04gTEFXUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmJjZWM3N2FmNTIxNDFiNjg5ODExMjhmZDYzMmYyZDguc2V0Q29udGVudChodG1sX2VmNjJmMWQ0YmVkYzRmNjQ4ZjU0YzRiN2E3ZGIwZTI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWIyYzc3YzFjOWQ0NDRiYjlkMTZiNGVjZmFkZDQxMGQuYmluZFBvcHVwKHBvcHVwXzZiY2VjNzdhZjUyMTQxYjY4OTgxMTI4ZmQ2MzJmMmQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgzYzg1ZmQ2MzM4ZjRjYzBhYzE0NWEzMjhkMTUxMGUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYmMxMGQ3OGZiNmI0Y2ViOWJiYjk5ZmU1MjE3NWQ5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGVmM2FjZjMzOWY0NDA1YTE4Y2ZhNTdmNWZkNWMzZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzhlZjNhY2YzMzlmNDQwNWExOGNmYTU3ZjVmZDVjM2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYmMxMGQ3OGZiNmI0Y2ViOWJiYjk5ZmU1MjE3NWQ5YS5zZXRDb250ZW50KGh0bWxfMzhlZjNhY2YzMzlmNDQwNWExOGNmYTU3ZjVmZDVjM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84M2M4NWZkNjMzOGY0Y2MwYWMxNDVhMzI4ZDE1MTBlMy5iaW5kUG9wdXAocG9wdXBfZmJjMTBkNzhmYjZiNGNlYjliYmI5OWZlNTIxNzVkOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYThjZWYxYjNjOTNjNGUyZDk1NzgxNjgwZmQ3MTRkNWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjk5ODA5NjcyOTk1OTYsLTEyMi4zODg4NTYyMDQyOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmYwNWVlNTU0ZmY0MjIxYjY5ZmYyZWQ5NjdkMGY3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzUyNGJmZmRlOGI0ZmM0ODYwM2UwZWJiZjY5MDkwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc1MjRiZmZkZThiNGZjNDg2MDNlMGViYmY2OTA5MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmYwNWVlNTU0ZmY0MjIxYjY5ZmYyZWQ5NjdkMGY3Yi5zZXRDb250ZW50KGh0bWxfNDc1MjRiZmZkZThiNGZjNDg2MDNlMGViYmY2OTA5MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hOGNlZjFiM2M5M2M0ZTJkOTU3ODE2ODBmZDcxNGQ1ZS5iaW5kUG9wdXAocG9wdXBfYTJmMDVlZTU1NGZmNDIyMWI2OWZmMmVkOTY3ZDBmN2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzFiZGY4Y2E5MGY1NDkyOGJkY2ViMzk3ZDU4YWFlMzIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU3ODgzNzY2ODg3OSwtMTIyLjQxMjk3MDUzNzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMzJmMzBkODdjMTQwZTZhMTllM2Y5MjU5YWI2ZWUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwYTQ0M2M0OGFiMTQ3NTdhNTg0ZjJkZTU0MGEzODJlID0gJCgnPGRpdiBpZD0iaHRtbF8xMGE0NDNjNDhhYjE0NzU3YTU4NGYyZGU1NDBhMzgyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTMyZjMwZDg3YzE0MGU2YTE5ZTNmOTI1OWFiNmVlMC5zZXRDb250ZW50KGh0bWxfMTBhNDQzYzQ4YWIxNDc1N2E1ODRmMmRlNTQwYTM4MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMWJkZjhjYTkwZjU0OTI4YmRjZWIzOTdkNThhYWUzMi5iaW5kUG9wdXAocG9wdXBfOTEzMmYzMGQ4N2MxNDBlNmExOWUzZjkyNTlhYjZlZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWI1NTFjYTY4ZTk5NGM0N2FmM2NlNGExNGMxOGNjOGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWU5ZTQ1OGQ3N2I2NGQ5NzhkZjdmNzZiMzFiZWI0YzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDg1ZTU0Y2I3ZDkxNGE4YjgwM2ZlZTZlOThjNDU2NWQgPSAkKCc8ZGl2IGlkPSJodG1sXzA4NWU1NGNiN2Q5MTRhOGI4MDNmZWU2ZTk4YzQ1NjVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlOWU0NThkNzdiNjRkOTc4ZGY3Zjc2YjMxYmViNGMyLnNldENvbnRlbnQoaHRtbF8wODVlNTRjYjdkOTE0YThiODAzZmVlNmU5OGM0NTY1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FiNTUxY2E2OGU5OTRjNDdhZjNjZTRhMTRjMThjYzhhLmJpbmRQb3B1cChwb3B1cF9lZTllNDU4ZDc3YjY0ZDk3OGRmN2Y3NmIzMWJlYjRjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83YzRiZGRiYmRlMWU0ZDZiOTI3NTIyNzYyYjI3MDI5OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWI4MDA0ZTgzMWY0NDhlNGJiNjJlYWYzMjJkNWIwNzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjljMzEwYzc3NjE3NDA4MzlhZTljYmNhNDhhNTAyY2UgPSAkKCc8ZGl2IGlkPSJodG1sXzY5YzMxMGM3NzYxNzQwODM5YWU5Y2JjYTQ4YTUwMmNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YjgwMDRlODMxZjQ0OGU0YmI2MmVhZjMyMmQ1YjA3OS5zZXRDb250ZW50KGh0bWxfNjljMzEwYzc3NjE3NDA4MzlhZTljYmNhNDhhNTAyY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83YzRiZGRiYmRlMWU0ZDZiOTI3NTIyNzYyYjI3MDI5OS5iaW5kUG9wdXAocG9wdXBfOWI4MDA0ZTgzMWY0NDhlNGJiNjJlYWYzMjJkNWIwNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWY2OWJlZGZjYTZiNGY4OWEzMzUwYTc4MDI0Mjk4MTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM4NmJkOWQyM2UzNDA1NWJhMDg0NzEzNWIwOWE4NGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjEzMDQxYTE5ZTllNDBhNTllZmUxOGZmODI4ZTc1NDIgPSAkKCc8ZGl2IGlkPSJodG1sXzIxMzA0MWExOWU5ZTQwYTU5ZWZlMThmZjgyOGU3NTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTM4NmJkOWQyM2UzNDA1NWJhMDg0NzEzNWIwOWE4NGIuc2V0Q29udGVudChodG1sXzIxMzA0MWExOWU5ZTQwYTU5ZWZlMThmZjgyOGU3NTQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWY2OWJlZGZjYTZiNGY4OWEzMzUwYTc4MDI0Mjk4MTkuYmluZFBvcHVwKHBvcHVwX2EzODZiZDlkMjNlMzQwNTViYTA4NDcxMzViMDlhODRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YxZWIyNGM3NzhhYzRkZTdiYTEzNjc0MmVlMDk4NWRlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFmZjVmZTc3M2E4NTQ1NGZhMGYxYzRmMmZmMDM1NGUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3YWE2MTJjNDc3ZjQ3ZjJhOWQyZmJiNWMyNjc2N2QzID0gJCgnPGRpdiBpZD0iaHRtbF9kN2FhNjEyYzQ3N2Y0N2YyYTlkMmZiYjVjMjY3NjdkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmY1ZmU3NzNhODU0NTRmYTBmMWM0ZjJmZjAzNTRlMC5zZXRDb250ZW50KGh0bWxfZDdhYTYxMmM0NzdmNDdmMmE5ZDJmYmI1YzI2NzY3ZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMWViMjRjNzc4YWM0ZGU3YmExMzY3NDJlZTA5ODVkZS5iaW5kUG9wdXAocG9wdXBfMWZmNWZlNzczYTg1NDU0ZmEwZjFjNGYyZmYwMzU0ZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2ZkMmM2NTYzMzQ5NDJmNmFlM2EwYThiNjkzYzQxM2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMTMwZTM2N2YyZDE0ODJiYTA1NzFjNmQ3MTI4YTE1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZmQyZjA5NTFmNWE0ZmE1OTBjMzE1ZGYwNDUwYmVjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGZkMmYwOTUxZjVhNGZhNTkwYzMxNWRmMDQ1MGJlY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTMwZTM2N2YyZDE0ODJiYTA1NzFjNmQ3MTI4YTE1OC5zZXRDb250ZW50KGh0bWxfMGZkMmYwOTUxZjVhNGZhNTkwYzMxNWRmMDQ1MGJlY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZmQyYzY1NjMzNDk0MmY2YWUzYTBhOGI2OTNjNDEzYS5iaW5kUG9wdXAocG9wdXBfMDEzMGUzNjdmMmQxNDgyYmEwNTcxYzZkNzEyOGExNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTQ4NzJiODQ2ZjE1NDFkYzk2ZTE2ZjVkMjBiMTViZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjA5NjY5NjE1NDk5LC0xMjIuMzg3MTgxNjM1OTk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTgwNzJmZTNhYzdmNDYyYTkwNjQ1ODI2ZGFlNTI3MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTAyZWQ1YWY1OTdiNDgyNjkyZmM3ZDVkZmZjYmRlNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzEwMmVkNWFmNTk3YjQ4MjY5MmZjN2Q1ZGZmY2JkZTRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTgwNzJmZTNhYzdmNDYyYTkwNjQ1ODI2ZGFlNTI3MDMuc2V0Q29udGVudChodG1sXzEwMmVkNWFmNTk3YjQ4MjY5MmZjN2Q1ZGZmY2JkZTRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTQ4NzJiODQ2ZjE1NDFkYzk2ZTE2ZjVkMjBiMTViZjYuYmluZFBvcHVwKHBvcHVwX2U4MDcyZmUzYWM3ZjQ2MmE5MDY0NTgyNmRhZTUyNzAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM2MTE2MmRjZTJmNDRlNThiMjZmZTM1MWNjY2E0MzljID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZmQwOTk2ZTgxMTI0MWM5OGViOGY2YTBiZDlmOGQzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjc2ODkwODlkOTg0N2FlYmQxNzdlZWI2Mjk2N2JkNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGI3Njg5MDg5ZDk4NDdhZWJkMTc3ZWViNjI5NjdiZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmZDA5OTZlODExMjQxYzk4ZWI4ZjZhMGJkOWY4ZDMwLnNldENvbnRlbnQoaHRtbF8wYjc2ODkwODlkOTg0N2FlYmQxNzdlZWI2Mjk2N2JkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM2MTE2MmRjZTJmNDRlNThiMjZmZTM1MWNjY2E0MzljLmJpbmRQb3B1cChwb3B1cF82ZmQwOTk2ZTgxMTI0MWM5OGViOGY2YTBiZDlmOGQzMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZjE5YzdlMjkxMTc0MzIwODg3ZGVjNzdmMTNhNTY3NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTczODk0Mjk2NTQ5NSwtMTIyLjQ3Nzk2MDMyNzI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxOTJiNTMyOGI0MzQ5YWI4ZmFiMDIxYjBmMTZhZTA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNGViYjZiMjhkMjQ4YTFhMjAyZTRiOTRkMWM4MzRhID0gJCgnPGRpdiBpZD0iaHRtbF9iZDRlYmI2YjI4ZDI0OGExYTIwMmU0Yjk0ZDFjODM0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTkyYjUzMjhiNDM0OWFiOGZhYjAyMWIwZjE2YWUwNC5zZXRDb250ZW50KGh0bWxfYmQ0ZWJiNmIyOGQyNDhhMWEyMDJlNGI5NGQxYzgzNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZjE5YzdlMjkxMTc0MzIwODg3ZGVjNzdmMTNhNTY3Ni5iaW5kUG9wdXAocG9wdXBfNDE5MmI1MzI4YjQzNDlhYjhmYWIwMjFiMGYxNmFlMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODM4MjFkZTE4MWE1NGFkZDhlOWRlNjk5YTFjMTIwYTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzU2OTcwMjc1NDgyMDYsLTEyMi4zNzY3NTc2NTU1MzAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExODQ4ZDdiZjhjMjQ3ZmU4NGViOTg1ODZjMDZjYzIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2OWU1MjhkMWEwYzQ3OWZiOTk0ODllOGZlZjZmOWJjID0gJCgnPGRpdiBpZD0iaHRtbF81NjllNTI4ZDFhMGM0NzlmYjk5NDg5ZThmZWY2ZjliYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExODQ4ZDdiZjhjMjQ3ZmU4NGViOTg1ODZjMDZjYzIzLnNldENvbnRlbnQoaHRtbF81NjllNTI4ZDFhMGM0NzlmYjk5NDg5ZThmZWY2ZjliYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgzODIxZGUxODFhNTRhZGQ4ZTlkZTY5OWExYzEyMGEyLmJpbmRQb3B1cChwb3B1cF8xMTg0OGQ3YmY4YzI0N2ZlODRlYjk4NTg2YzA2Y2MyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hODE3ZjBmZjM5OTE0NDZmOTlkMTQ3Y2IxMzJiOTIzOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNmY5ZTRlOTI4MWI0MDU2ODNjMDIxY2U0OTI4OGE2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNDhiYWE4YjMyMGE0YzAxOTlkNzYwY2Y4YWU2MGMwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTQ4YmFhOGIzMjBhNGMwMTk5ZDc2MGNmOGFlNjBjMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2ZjllNGU5MjgxYjQwNTY4M2MwMjFjZTQ5Mjg4YTYyLnNldENvbnRlbnQoaHRtbF9lNDhiYWE4YjMyMGE0YzAxOTlkNzYwY2Y4YWU2MGMwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E4MTdmMGZmMzk5MTQ0NmY5OWQxNDdjYjEzMmI5MjM4LmJpbmRQb3B1cChwb3B1cF9mNmY5ZTRlOTI4MWI0MDU2ODNjMDIxY2U0OTI4OGE2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNGU1YzdlOTkzMmQ0ZGUzYjEwNmIyNzI2NzQxMGE1YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MTY0Mjk4MjM4NCwtMTIyLjQwMDkwODY5ODg4OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmNmNGFiOGJkYmRhNDg0MWFkZThhNzlmOGU4OGE4N2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWU1MWQwM2IxNTE2NDY3OWE2YTA5NjgzNTRmMmQ4OTMgPSAkKCc8ZGl2IGlkPSJodG1sX2VlNTFkMDNiMTUxNjQ2NzlhNmEwOTY4MzU0ZjJkODkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmNmNGFiOGJkYmRhNDg0MWFkZThhNzlmOGU4OGE4N2Muc2V0Q29udGVudChodG1sX2VlNTFkMDNiMTUxNjQ2NzlhNmEwOTY4MzU0ZjJkODkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjRlNWM3ZTk5MzJkNGRlM2IxMDZiMjcyNjc0MTBhNWMuYmluZFBvcHVwKHBvcHVwXzZjZjRhYjhiZGJkYTQ4NDFhZGU4YTc5ZjhlODhhODdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkyMTVjMTkyYjQxMDQ1ZTFhNzM5NjRlNDRjNjhhMTI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3MzllYzdlYzkxODQ5Y2JiYzM1OTZhYWI0NjliMjk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlMGYwY2NkODQ1MjQwNDFhM2U1MDg1OWU3Yjk0ODIyID0gJCgnPGRpdiBpZD0iaHRtbF9hZTBmMGNjZDg0NTI0MDQxYTNlNTA4NTllN2I5NDgyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1RPTEVOIFBST1BFUlRZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzM5ZWM3ZWM5MTg0OWNiYmMzNTk2YWFiNDY5YjI5Ny5zZXRDb250ZW50KGh0bWxfYWUwZjBjY2Q4NDUyNDA0MWEzZTUwODU5ZTdiOTQ4MjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjE1YzE5MmI0MTA0NWUxYTczOTY0ZTQ0YzY4YTEyNS5iaW5kUG9wdXAocG9wdXBfODczOWVjN2VjOTE4NDljYmJjMzU5NmFhYjQ2OWIyOTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjA2NDkxMWU3YzExNGY5NmFhYWJmNjgzMDVlMWRhYmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YWJmNDVhNzgyOTg0MGVkOTczZDEyOWY5YjUzMzRlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMDFhMzRhOGMzN2U0NzQ3YWYxYmU1NmFlNDNiYTcyZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDAxYTM0YThjMzdlNDc0N2FmMWJlNTZhZTQzYmE3MmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhYmY0NWE3ODI5ODQwZWQ5NzNkMTI5ZjliNTMzNGUyLnNldENvbnRlbnQoaHRtbF8wMDFhMzRhOGMzN2U0NzQ3YWYxYmU1NmFlNDNiYTcyZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIwNjQ5MTFlN2MxMTRmOTZhYWFiZjY4MzA1ZTFkYWJlLmJpbmRQb3B1cChwb3B1cF81YWJmNDVhNzgyOTg0MGVkOTczZDEyOWY5YjUzMzRlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iYjMxZjAyMjRmMDk0YTNmOTQxOGFhOTVkNTkwYzNkYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODkwNjMwNTE4MjksLTEyMi40MjAzNTQ3ODA4NjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0NTFlNjc4MWY2NTRiYzM5N2ExMTAxNWUzMmJjOTgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhZDAzNjg1YTZmMDQ4Y2FhMmI2ZGQ2MmNlMDJjYmYyID0gJCgnPGRpdiBpZD0iaHRtbF85YWQwMzY4NWE2ZjA0OGNhYTJiNmRkNjJjZTAyY2JmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQ1MWU2NzgxZjY1NGJjMzk3YTExMDE1ZTMyYmM5ODAuc2V0Q29udGVudChodG1sXzlhZDAzNjg1YTZmMDQ4Y2FhMmI2ZGQ2MmNlMDJjYmYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmIzMWYwMjI0ZjA5NGEzZjk0MThhYTk1ZDU5MGMzZGMuYmluZFBvcHVwKHBvcHVwXzE0NTFlNjc4MWY2NTRiYzM5N2ExMTAxNWUzMmJjOTgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdjYmJmZGNiNzBjMzQ2NmJhMTlhMDAyNTEyNGI1ZGViID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE1NzY1NDI2OTk1LC0xMjIuNDM5OTA5NzY2NzcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNThhOWY4MzdiNTEwNDdlZWFiYjdhYTIzOWI1YWVlZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDhhZDY4Y2Q5ODE5NDZkOThjZjllNTA4ZGFkYzYyZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzQ4YWQ2OGNkOTgxOTQ2ZDk4Y2Y5ZTUwOGRhZGM2MmUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81OGE5ZjgzN2I1MTA0N2VlYWJiN2FhMjM5YjVhZWVkMi5zZXRDb250ZW50KGh0bWxfNDhhZDY4Y2Q5ODE5NDZkOThjZjllNTA4ZGFkYzYyZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83Y2JiZmRjYjcwYzM0NjZiYTE5YTAwMjUxMjRiNWRlYi5iaW5kUG9wdXAocG9wdXBfNThhOWY4MzdiNTEwNDdlZWFiYjdhYTIzOWI1YWVlZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzc1MzE3M2FiOWQxNGFlMmFmZGJkMzgxY2E5ZTIzN2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE3ZTZjYzgzNTcxNDhiNjgzN2E4ZWViZjExNWI5N2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzFhZTE1MDJmZGNlNGQ5MDljNmRjZmU4ODgyNTk0ODggPSAkKCc8ZGl2IGlkPSJodG1sX2MxYWUxNTAyZmRjZTRkOTA5YzZkY2ZlODg4MjU5NDg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTdlNmNjODM1NzE0OGI2ODM3YThlZWJmMTE1Yjk3Yy5zZXRDb250ZW50KGh0bWxfYzFhZTE1MDJmZGNlNGQ5MDljNmRjZmU4ODgyNTk0ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NzUzMTczYWI5ZDE0YWUyYWZkYmQzODFjYTllMjM3Yy5iaW5kUG9wdXAocG9wdXBfMWE3ZTZjYzgzNTcxNDhiNjgzN2E4ZWViZjExNWI5N2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjQ0ZjcwNzNhNTAzNDNmNjkxZjRjMmE5YzhkYTg5OWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM2MTg2Mjc2NDU2MDQsLTEyMi40MjIzMTU2NzA3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzVlZjY2OTgwODQ0ZWIzYmZmMDhkZWFiZDNiMTMzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Njc0NzAxMGU5YTQ0MTJjYWQ5Zjc0YTMxZDdmNDllYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY3NDcwMTBlOWE0NDEyY2FkOWY3NGEzMWQ3ZjQ5ZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSQVVEPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzVlZjY2OTgwODQ0ZWIzYmZmMDhkZWFiZDNiMTMzZi5zZXRDb250ZW50KGh0bWxfNzY3NDcwMTBlOWE0NDEyY2FkOWY3NGEzMWQ3ZjQ5ZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNDRmNzA3M2E1MDM0M2Y2OTFmNGMyYTljOGRhODk5Yi5iaW5kUG9wdXAocG9wdXBfZWM1ZWY2Njk4MDg0NGViM2JmZjA4ZGVhYmQzYjEzM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTcxYzQ2MDE3YjM0NDNjZGIwYzMwZjI4NjM1ZjlkOTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzNGNiYzQzYTYyYTQzMTViOWZmZjM5ZTY3NTQxY2U2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhNDQ0NWYwN2I0ZjRkMDlhMzEzMTIyNjRhMmQ1OTljID0gJCgnPGRpdiBpZD0iaHRtbF80YTQ0NDVmMDdiNGY0ZDA5YTMxMzEyMjY0YTJkNTk5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzNGNiYzQzYTYyYTQzMTViOWZmZjM5ZTY3NTQxY2U2LnNldENvbnRlbnQoaHRtbF80YTQ0NDVmMDdiNGY0ZDA5YTMxMzEyMjY0YTJkNTk5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk3MWM0NjAxN2IzNDQzY2RiMGMzMGYyODYzNWY5ZDkzLmJpbmRQb3B1cChwb3B1cF80MzRjYmM0M2E2MmE0MzE1YjlmZmYzOWU2NzU0MWNlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZjU3MzBhMGFhODM0MTlmOTdhNGU5ZTc4ZjE4YmJmOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzBjNTczZGU3ZGE1NGMxYWIyYjg0MTE3MGJhOTdkYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzlhYTY2YTk3OTg4NGViODgwZjM1ODE1NzEyNTliNWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M5YWE2NmE5Nzk4ODRlYjg4MGYzNTgxNTcxMjU5YjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MGM1NzNkZTdkYTU0YzFhYjJiODQxMTcwYmE5N2RiNC5zZXRDb250ZW50KGh0bWxfYzlhYTY2YTk3OTg4NGViODgwZjM1ODE1NzEyNTliNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZjU3MzBhMGFhODM0MTlmOTdhNGU5ZTc4ZjE4YmJmOC5iaW5kUG9wdXAocG9wdXBfNzBjNTczZGU3ZGE1NGMxYWIyYjg0MTE3MGJhOTdkYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjU5MjcxZGViZmE0NGM3ODljNmU0NjI0NmRiMTU1OGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4NmZhM2M0MjJlMzRjYmQ5MDk5NTgyZGVlZWI0MzljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxNjRhZDNmYWU1YjQxNzJhYTQwZjM3NTJkMmJlYWZmID0gJCgnPGRpdiBpZD0iaHRtbF8yMTY0YWQzZmFlNWI0MTcyYWE0MGYzNzUyZDJiZWFmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4NmZhM2M0MjJlMzRjYmQ5MDk5NTgyZGVlZWI0MzljLnNldENvbnRlbnQoaHRtbF8yMTY0YWQzZmFlNWI0MTcyYWE0MGYzNzUyZDJiZWFmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY1OTI3MWRlYmZhNDRjNzg5YzZlNDYyNDZkYjE1NThiLmJpbmRQb3B1cChwb3B1cF81ODZmYTNjNDIyZTM0Y2JkOTA5OTU4MmRlZWViNDM5Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MDIyNjdmYjAzMDU0NTI2ODc5YjlkNDBiZDk0MGJiYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MTQ5Mzk5Njk0MTYsLTEyMi41MDc3NTAxMzEwMDQwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiZGE4ZGYwYzdiOTRjOWViYjAxZWIxNDQzNGRiZWFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmOWNmZWZjMzUzZTQxY2JhOTExZGYzMzk0Mzc2NmZjID0gJCgnPGRpdiBpZD0iaHRtbF8xZjljZmVmYzM1M2U0MWNiYTkxMWRmMzM5NDM3NjZmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGJkYThkZjBjN2I5NGM5ZWJiMDFlYjE0NDM0ZGJlYWQuc2V0Q29udGVudChodG1sXzFmOWNmZWZjMzUzZTQxY2JhOTExZGYzMzk0Mzc2NmZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDAyMjY3ZmIwMzA1NDUyNjg3OWI5ZDQwYmQ5NDBiYmEuYmluZFBvcHVwKHBvcHVwX2RiZGE4ZGYwYzdiOTRjOWViYjAxZWIxNDQzNGRiZWFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QzZTM3ZmU3NzBhOTRhODY5OWEzM2U1OTFhOWY0MjNlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YzE3Y2NjYzgwNjM0ZDg0OGZjZTVmY2M2YTZhODcwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZmY2NmYyY2UzNjQ0ZDg1OGU1YWU1OGU3ZWZkYjNlYSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2ZmNjZmMmNlMzY0NGQ4NThlNWFlNThlN2VmZGIzZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzE3Y2NjYzgwNjM0ZDg0OGZjZTVmY2M2YTZhODcwNC5zZXRDb250ZW50KGh0bWxfY2ZmNjZmMmNlMzY0NGQ4NThlNWFlNThlN2VmZGIzZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kM2UzN2ZlNzcwYTk0YTg2OTlhMzNlNTkxYTlmNDIzZS5iaW5kUG9wdXAocG9wdXBfOWMxN2NjY2M4MDYzNGQ4NDhmY2U1ZmNjNmE2YTg3MDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjM0YzczMjU1ZjRlNDRmMGIzZjgxZDdiODUwOTFiOGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzI0MDI3ZmVjZTdjNDRjY2E1N2M0NTdhMGUxYzNmZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjczZmZlYzljNWUyNDNhMjk4NjNmOWJiYmYyYzhlNWIgPSAkKCc8ZGl2IGlkPSJodG1sXzI3M2ZmZWM5YzVlMjQzYTI5ODYzZjliYmJmMmM4ZTViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzI0MDI3ZmVjZTdjNDRjY2E1N2M0NTdhMGUxYzNmZDQuc2V0Q29udGVudChodG1sXzI3M2ZmZWM5YzVlMjQzYTI5ODYzZjliYmJmMmM4ZTViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjM0YzczMjU1ZjRlNDRmMGIzZjgxZDdiODUwOTFiOGUuYmluZFBvcHVwKHBvcHVwXzMyNDAyN2ZlY2U3YzQ0Y2NhNTdjNDU3YTBlMWMzZmQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgwY2NjNmI1YzBkNzQwZmI5MDVkMzhiZjEwZGFkYjEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NDM3ODMwOTExMiwtMTIyLjQxOTIwMzAwNDI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhYjY2ZDIzYTJiMTQxNmQ5ZjFjODU4MDNkMDc2NDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwMzhlY2ZhNjYzMjQ0ZTI5Njk2MzJlNmM3ZTUxM2M2ID0gJCgnPGRpdiBpZD0iaHRtbF8yMDM4ZWNmYTY2MzI0NGUyOTY5NjMyZTZjN2U1MTNjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlhYjY2ZDIzYTJiMTQxNmQ5ZjFjODU4MDNkMDc2NDNlLnNldENvbnRlbnQoaHRtbF8yMDM4ZWNmYTY2MzI0NGUyOTY5NjMyZTZjN2U1MTNjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgwY2NjNmI1YzBkNzQwZmI5MDVkMzhiZjEwZGFkYjEwLmJpbmRQb3B1cChwb3B1cF85YWI2NmQyM2EyYjE0MTZkOWYxYzg1ODAzZDA3NjQzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYmYxZGViNzllNTY0Nzk1OGNlZWU4ZGZjMjMyNzU1MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0NWM3YTlmZTI0MTQwNTNhYzU0ZDM0MTVhMTc3NDUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3M2NkNzI3MWJlYzQ1YzY4ZTMwZTM4NGVlZTEyMTRlID0gJCgnPGRpdiBpZD0iaHRtbF8wNzNjZDcyNzFiZWM0NWM2OGUzMGUzODRlZWUxMjE0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0NWM3YTlmZTI0MTQwNTNhYzU0ZDM0MTVhMTc3NDUzLnNldENvbnRlbnQoaHRtbF8wNzNjZDcyNzFiZWM0NWM2OGUzMGUzODRlZWUxMjE0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RiZjFkZWI3OWU1NjQ3OTU4Y2VlZThkZmMyMzI3NTUwLmJpbmRQb3B1cChwb3B1cF8wNDVjN2E5ZmUyNDE0MDUzYWM1NGQzNDE1YTE3NzQ1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNjE3NDBhZWMwYTQ0NWUwOTU0YmY0OGZlMjk0ZThlYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWI2MTg0ZDE2OTY0MzA5YmVhNTAzYmEyMGU1MjljMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MDE3ZmQ3NGIwYTE0MjBmOTI0YjY5YTA5MmExMjFkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfODAxN2ZkNzRiMGExNDIwZjkyNGI2OWEwOTJhMTIxZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTViNjE4NGQxNjk2NDMwOWJlYTUwM2JhMjBlNTI5YzEuc2V0Q29udGVudChodG1sXzgwMTdmZDc0YjBhMTQyMGY5MjRiNjlhMDkyYTEyMWQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjYxNzQwYWVjMGE0NDVlMDk1NGJmNDhmZTI5NGU4ZWEuYmluZFBvcHVwKHBvcHVwXzU1YjYxODRkMTY5NjQzMDliZWE1MDNiYTIwZTUyOWMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFkNjgxNTE3YWZkYjQxZjg5NTVmZGM2MWJlNjFmNDJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3OTIwOTM3NTUzMjk1LC0xMjIuNDEwODgyODI1NTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJlN2NhZmFkMjVkNGUxNGJlYmE4ZTY4YjQwZjM5NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjhiZTc5YTJiYjQ0NDg2OTk5ODZiNmJlMjc2MjhiZjQgPSAkKCc8ZGl2IGlkPSJodG1sX2I4YmU3OWEyYmI0NDQ4Njk5OTg2YjZiZTI3NjI4YmY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmU3Y2FmYWQyNWQ0ZTE0YmViYThlNjhiNDBmMzk0Ni5zZXRDb250ZW50KGh0bWxfYjhiZTc5YTJiYjQ0NDg2OTk5ODZiNmJlMjc2MjhiZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZDY4MTUxN2FmZGI0MWY4OTU1ZmRjNjFiZTYxZjQyYy5iaW5kUG9wdXAocG9wdXBfNjJlN2NhZmFkMjVkNGUxNGJlYmE4ZTY4YjQwZjM5NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzhkNTAwYmM2ZTFjNDI2YWE5YWJmNWUzODRlMmYzZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBhZjU5NjQ2NmE5NDQ1Y2JmOGYzMTRmZjNjNzhjNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2U4YzViOGIzNmMxNDcyMDk3NWY4ZTk4YzNjNzU2MzcgPSAkKCc8ZGl2IGlkPSJodG1sX2NlOGM1YjhiMzZjMTQ3MjA5NzVmOGU5OGMzYzc1NjM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMGFmNTk2NDY2YTk0NDVjYmY4ZjMxNGZmM2M3OGM2ZC5zZXRDb250ZW50KGh0bWxfY2U4YzViOGIzNmMxNDcyMDk3NWY4ZTk4YzNjNzU2MzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83OGQ1MDBiYzZlMWM0MjZhYTlhYmY1ZTM4NGUyZjNlZC5iaW5kUG9wdXAocG9wdXBfYTBhZjU5NjQ2NmE5NDQ1Y2JmOGYzMTRmZjNjNzhjNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjc4N2QwNWRmYmFiNDIyM2I0MTY0MjYyZWM1ZDY5NmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDM1NTUwNTQyMjY1LC0xMjIuNDIxMTI4MDI5NTA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTJmZmI2ZDVkZjg4NDc3YmExYWY2YWVlMzNlYjEwY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQzNDU3YjYxYTQ2NGQ4ZGIzMTRhYjc0MjU1OGI2NmQgPSAkKCc8ZGl2IGlkPSJodG1sX2FkMzQ1N2I2MWE0NjRkOGRiMzE0YWI3NDI1NThiNjZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMmZmYjZkNWRmODg0NzdiYTFhZjZhZWUzM2ViMTBjZC5zZXRDb250ZW50KGh0bWxfYWQzNDU3YjYxYTQ2NGQ4ZGIzMTRhYjc0MjU1OGI2NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNzg3ZDA1ZGZiYWI0MjIzYjQxNjQyNjJlYzVkNjk2Yi5iaW5kUG9wdXAocG9wdXBfMTJmZmI2ZDVkZjg4NDc3YmExYWY2YWVlMzNlYjEwY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTkwNGIwNTcxOWMwNDY3YTkyMDQ1NjE3NmNmNGJiMmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODY1NjQ3NjA3Njg1LC0xMjIuNDA3MjQ0MDg3MDMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODExODFkOWZjNjBiNDZkM2FjYjdiOGQwMWI2MTNkMDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRmN2FmNmFhODhmNGU2YTk4YmMzZmE2YjI0NGFiYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzI0ZjdhZjZhYTg4ZjRlNmE5OGJjM2ZhNmIyNDRhYmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MTE4MWQ5ZmM2MGI0NmQzYWNiN2I4ZDAxYjYxM2QwOS5zZXRDb250ZW50KGh0bWxfMjRmN2FmNmFhODhmNGU2YTk4YmMzZmE2YjI0NGFiYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hOTA0YjA1NzE5YzA0NjdhOTIwNDU2MTc2Y2Y0YmIyYi5iaW5kUG9wdXAocG9wdXBfODExODFkOWZjNjBiNDZkM2FjYjdiOGQwMWI2MTNkMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODhiMDRmODRhMjg4NDNjN2FmZDczNmQxN2M2YWQ5ZTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGZhYjUwN2M2NjQ0NGZiYWEyMzgzZGM1NGE3YjZhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NWUyNzgzNGI4MjY0M2MzODVkMTAyNjdiOGM5OGM4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjVlMjc4MzRiODI2NDNjMzg1ZDEwMjY3YjhjOThjODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81OGZhYjUwN2M2NjQ0NGZiYWEyMzgzZGM1NGE3YjZhOS5zZXRDb250ZW50KGh0bWxfNjVlMjc4MzRiODI2NDNjMzg1ZDEwMjY3YjhjOThjODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OGIwNGY4NGEyODg0M2M3YWZkNzM2ZDE3YzZhZDllMC5iaW5kUG9wdXAocG9wdXBfNThmYWI1MDdjNjY0NDRmYmFhMjM4M2RjNTRhN2I2YTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDA5YWEzZDNmNWQ0NGYzZjg5NDY5ODU4MDcwZWE5MDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDM2OWY5OWRlYWI0Zjc0ODU2OGQwYWUzYjdhZDg0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzZjN2IxMzdiYWE0OTE3YmY2NDc3MmZjODAzNzk1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNWM2YzdiMTM3YmFhNDkxN2JmNjQ3NzJmYzgwMzc5NTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDM2OWY5OWRlYWI0Zjc0ODU2OGQwYWUzYjdhZDg0Ny5zZXRDb250ZW50KGh0bWxfNWM2YzdiMTM3YmFhNDkxN2JmNjQ3NzJmYzgwMzc5NTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMDlhYTNkM2Y1ZDQ0ZjNmODk0Njk4NTgwNzBlYTkwNS5iaW5kUG9wdXAocG9wdXBfNDQzNjlmOTlkZWFiNGY3NDg1NjhkMGFlM2I3YWQ4NDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGI1N2E2Y2VkY2FhNDY4YThmYmE1NTlmOTEyNTk3ZGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDQxOTI3NTA4OTMyMDUsLTEyMi40NDQ2ODU0ODIyNzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGI4NmI2MzRkNmM0ZjcwYWFjYTA0YjAwOWY5OWE0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZWU3Mjc0OTYzMzY0ZjcyYjQ2YTE1YWNmZjA2ZTM4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2VlNzI3NDk2MzM2NGY3MmI0NmExNWFjZmYwNmUzODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRiODZiNjM0ZDZjNGY3MGFhY2EwNGIwMDlmOTlhNDcuc2V0Q29udGVudChodG1sXzdlZTcyNzQ5NjMzNjRmNzJiNDZhMTVhY2ZmMDZlMzgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGI1N2E2Y2VkY2FhNDY4YThmYmE1NTlmOTEyNTk3ZGQuYmluZFBvcHVwKHBvcHVwXzg0Yjg2YjYzNGQ2YzRmNzBhYWNhMDRiMDA5Zjk5YTQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJjOWU5MzliY2RhYzQ2NzNiNzQ1M2JhNDlkNGI1OTQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxMzE5MWJhYTBmZTRjN2Y4ZDQwY2E1NGM3NzQyZTQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyYWE5ZDkxYTVkYTRjOTBiZmE3ZjEzZDlkNWE5ZDMzID0gJCgnPGRpdiBpZD0iaHRtbF80MmFhOWQ5MWE1ZGE0YzkwYmZhN2YxM2Q5ZDVhOWQzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTMxOTFiYWEwZmU0YzdmOGQ0MGNhNTRjNzc0MmU0Ny5zZXRDb250ZW50KGh0bWxfNDJhYTlkOTFhNWRhNGM5MGJmYTdmMTNkOWQ1YTlkMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYzllOTM5YmNkYWM0NjczYjc0NTNiYTQ5ZDRiNTk0Mi5iaW5kUG9wdXAocG9wdXBfYjEzMTkxYmFhMGZlNGM3ZjhkNDBjYTU0Yzc3NDJlNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjc3ZjhlOTZhNWIxNDFjOGI1ZmNjOWFmZWU5MjlhNTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjg1MjgwNjI3NDY1LC0xMjIuNDc1NjQ3NDYwNzg1OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTgyNGI5ODdlMjg0MmIzOWQwNjM2MmNlYmVmOTgwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDU5OWMyNThmZjE0ODM1OTBiNzI1MzlmMmJiMTMxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWQ1OTljMjU4ZmYxNDgzNTkwYjcyNTM5ZjJiYjEzMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1ODI0Yjk4N2UyODQyYjM5ZDA2MzYyY2ViZWY5ODAwLnNldENvbnRlbnQoaHRtbF9hZDU5OWMyNThmZjE0ODM1OTBiNzI1MzlmMmJiMTMxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3N2Y4ZTk2YTViMTQxYzhiNWZjYzlhZmVlOTI5YTUwLmJpbmRQb3B1cChwb3B1cF85NTgyNGI5ODdlMjg0MmIzOWQwNjM2MmNlYmVmOTgwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iYTgyMzYxNTc1ZGE0MjkyOWQzZWVmYTEyOTQwODhlNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0Mjg1MTczNzQ0NDg5NCwtMTIyLjQyMDk2NzQ0MDU2NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3ZWM3YjU0NjVhYjRhYzJhZTNmM2Q3NDEyNzk0YzY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwNmVlMGYyYjllNDRiODY5MDliMzY1NDdhZjIzYTNjID0gJCgnPGRpdiBpZD0iaHRtbF8xMDZlZTBmMmI5ZTQ0Yjg2OTA5YjM2NTQ3YWYyM2EzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZWM3YjU0NjVhYjRhYzJhZTNmM2Q3NDEyNzk0YzY2LnNldENvbnRlbnQoaHRtbF8xMDZlZTBmMmI5ZTQ0Yjg2OTA5YjM2NTQ3YWYyM2EzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhODIzNjE1NzVkYTQyOTI5ZDNlZWZhMTI5NDA4OGU1LmJpbmRQb3B1cChwb3B1cF9jN2VjN2I1NDY1YWI0YWMyYWUzZjNkNzQxMjc5NGM2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84M2YwZWY5M2Q2ZDE0YmZmOTRmMmYyZTgxMjQwYTRmOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNmQ0YWQ0OGYyNjI0NjE1OTI1NjhiYjhjYTQ1ZDVhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MGI4MDg0Mzc0NTM0MzYzYjQ5ZGRiNmE0YWM3NjE4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTBiODA4NDM3NDUzNDM2M2I0OWRkYjZhNGFjNzYxODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTZkNGFkNDhmMjYyNDYxNTkyNTY4YmI4Y2E0NWQ1YTMuc2V0Q29udGVudChodG1sXzUwYjgwODQzNzQ1MzQzNjNiNDlkZGI2YTRhYzc2MTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODNmMGVmOTNkNmQxNGJmZjk0ZjJmMmU4MTI0MGE0ZjkuYmluZFBvcHVwKHBvcHVwX2U2ZDRhZDQ4ZjI2MjQ2MTU5MjU2OGJiOGNhNDVkNWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzUyY2IyYTkzYWRlMTRkNWU5YmZjZTNhMmFjMWNmMzJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5MTY3NDIxODk2MywtMTIyLjQwNjM0NjQyNTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkOWVkODM5YzllNDQ2ZTRiNGM3MzJlYTJkOWY2YTJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmYWU3OGM0YjM1YjRkOWE4MDE1MjRiNjk3MDBiZWZlID0gJCgnPGRpdiBpZD0iaHRtbF9lZmFlNzhjNGIzNWI0ZDlhODAxNTI0YjY5NzAwYmVmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQ5ZWQ4MzljOWU0NDZlNGI0YzczMmVhMmQ5ZjZhMmEuc2V0Q29udGVudChodG1sX2VmYWU3OGM0YjM1YjRkOWE4MDE1MjRiNjk3MDBiZWZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTJjYjJhOTNhZGUxNGQ1ZTliZmNlM2EyYWMxY2YzMmEuYmluZFBvcHVwKHBvcHVwX2ZkOWVkODM5YzllNDQ2ZTRiNGM3MzJlYTJkOWY2YTJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RhODY4ZDM0ODEyOTRlOTliOTM3NjJkMjdkNzY5NjJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1NzE4NDM5NTI4MiwtMTIyLjQwOTUyOTkxMzI3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1ZTVhODM3OWJhYTQ1YzliNjVkZmEwY2QxYjI5ZDcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1Zjg5ZDNiODMwZjQzMGI5M2Q2YWFmYzQ3YjQ3MTZlID0gJCgnPGRpdiBpZD0iaHRtbF9iNWY4OWQzYjgzMGY0MzBiOTNkNmFhZmM0N2I0NzE2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVlNWE4Mzc5YmFhNDVjOWI2NWRmYTBjZDFiMjlkNzEuc2V0Q29udGVudChodG1sX2I1Zjg5ZDNiODMwZjQzMGI5M2Q2YWFmYzQ3YjQ3MTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGE4NjhkMzQ4MTI5NGU5OWI5Mzc2MmQyN2Q3Njk2MmYuYmluZFBvcHVwKHBvcHVwX2M1ZTVhODM3OWJhYTQ1YzliNjVkZmEwY2QxYjI5ZDcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzExMTg3NWQ0MTE4ZDQzN2RhNTcxNzNkMWI2NGE2NjEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NmFjOWI2NDIxYmU0YTNhYmMyMjczZGE2Yjg0NGJiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZjJiYzhhNjgxYTI0ZThkODU5Njk3MmJmMjY5MTliNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGYyYmM4YTY4MWEyNGU4ZDg1OTY5NzJiZjI2OTE5YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjZhYzliNjQyMWJlNGEzYWJjMjI3M2RhNmI4NDRiYmEuc2V0Q29udGVudChodG1sXzBmMmJjOGE2ODFhMjRlOGQ4NTk2OTcyYmYyNjkxOWI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTExODc1ZDQxMThkNDM3ZGE1NzE3M2QxYjY0YTY2MTAuYmluZFBvcHVwKHBvcHVwXzY2YWM5YjY0MjFiZTRhM2FiYzIyNzNkYTZiODQ0YmJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIxNzZlMWI0Njc1ODQ1NGY4ZWFmNWZlNTE0ODk1YWY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGU4ZDAyZTc4NzMzNGZkZmI0MzNiMmI5MmQ2MzcwNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjczZTFmNjVhNzBiNDVhYjgyMDQwMmQ4ZDM3NGVhNGQgPSAkKCc8ZGl2IGlkPSJodG1sXzY3M2UxZjY1YTcwYjQ1YWI4MjA0MDJkOGQzNzRlYTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGU4ZDAyZTc4NzMzNGZkZmI0MzNiMmI5MmQ2MzcwNzQuc2V0Q29udGVudChodG1sXzY3M2UxZjY1YTcwYjQ1YWI4MjA0MDJkOGQzNzRlYTRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjE3NmUxYjQ2NzU4NDU0ZjhlYWY1ZmU1MTQ4OTVhZjYuYmluZFBvcHVwKHBvcHVwXzRlOGQwMmU3ODczMzRmZGZiNDMzYjJiOTJkNjM3MDc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RkMzY2ZTI2M2M4ZTQ5NDM4NjRhZDNjYjczYmY0ODc4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzUzNzIwYzE4NTNmNDExN2I4M2RiN2MxMzFiMTQxZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI3ZjQ0YmZhN2EyNDkzYTg0MGFkYmMyZmUxNmM2MTQgPSAkKCc8ZGl2IGlkPSJodG1sXzBiN2Y0NGJmYTdhMjQ5M2E4NDBhZGJjMmZlMTZjNjE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzUzNzIwYzE4NTNmNDExN2I4M2RiN2MxMzFiMTQxZDUuc2V0Q29udGVudChodG1sXzBiN2Y0NGJmYTdhMjQ5M2E4NDBhZGJjMmZlMTZjNjE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQzNjZlMjYzYzhlNDk0Mzg2NGFkM2NiNzNiZjQ4NzguYmluZFBvcHVwKHBvcHVwXzc1MzcyMGMxODUzZjQxMTdiODNkYjdjMTMxYjE0MWQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdlY2VkNTM0YTNiYzRiOGU4NjRmZjMwOGJmOWFjZmM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZTU5NjViNTQzNTQ3Nzg4NDc4NTYxNDMxOGFmNjdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1YTg3ODUyMGNkNzQ2MTg5ZmE2NTc3YTJlZWFmMzkwID0gJCgnPGRpdiBpZD0iaHRtbF82NWE4Nzg1MjBjZDc0NjE4OWZhNjU3N2EyZWVhZjM5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZTU5NjViNTQzNTQ3Nzg4NDc4NTYxNDMxOGFmNjdhLnNldENvbnRlbnQoaHRtbF82NWE4Nzg1MjBjZDc0NjE4OWZhNjU3N2EyZWVhZjM5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdlY2VkNTM0YTNiYzRiOGU4NjRmZjMwOGJmOWFjZmM2LmJpbmRQb3B1cChwb3B1cF9hZmU1OTY1YjU0MzU0Nzc4ODQ3ODU2MTQzMThhZjY3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84NGYyYzY3NWIzMTM0YjVlYWEwNGM4NmUyY2QwZThmOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDI0YWMzNjNkNTQ0ZjFjODcwODA4MDcyNTRiMDJiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MmM5ODQ5MmUwOTU0YzJjODE1MDU1ZTI4ZDRjNTg1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTJjOTg0OTJlMDk1NGMyYzgxNTA1NWUyOGQ0YzU4NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkMjRhYzM2M2Q1NDRmMWM4NzA4MDgwNzI1NGIwMmI1LnNldENvbnRlbnQoaHRtbF81MmM5ODQ5MmUwOTU0YzJjODE1MDU1ZTI4ZDRjNTg1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg0ZjJjNjc1YjMxMzRiNWVhYTA0Yzg2ZTJjZDBlOGY5LmJpbmRQb3B1cChwb3B1cF8zZDI0YWMzNjNkNTQ0ZjFjODcwODA4MDcyNTRiMDJiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYThjODU1NWVmOTQ0ZjdlYjZiNTM3OTM3ZmUyOWM2MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NjAxNjAxMTQxMDMsLTEyMi40MDM2NDQ2MjA0MzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDIzM2Q5YTE2MzE0NjcwOWZhYzFlMTljOGQ5OTI3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iODcyZDI5OTRmODU0MWVhYWRjZWY2YWZjY2I5ODMyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjg3MmQyOTk0Zjg1NDFlYWFkY2VmNmFmY2NiOTgzMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDIzM2Q5YTE2MzE0NjcwOWZhYzFlMTljOGQ5OTI3MS5zZXRDb250ZW50KGh0bWxfYjg3MmQyOTk0Zjg1NDFlYWFkY2VmNmFmY2NiOTgzMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYThjODU1NWVmOTQ0ZjdlYjZiNTM3OTM3ZmUyOWM2Mi5iaW5kUG9wdXAocG9wdXBfZjQyMzNkOWExNjMxNDY3MDlmYWMxZTE5YzhkOTkyNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzk0NDBmMGNmOGVkNGI3YzliZDQxNTgxNGUzZTAyYWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzcyYThjZjJhNzUxNDFlNDkxOGVhMTA1MmExNDIzYzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM2NDllMjMyZDgzNDJkODg1ZWNkMjAwMzY0MDgwM2YgPSAkKCc8ZGl2IGlkPSJodG1sXzUzNjQ5ZTIzMmQ4MzQyZDg4NWVjZDIwMDM2NDA4MDNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzcyYThjZjJhNzUxNDFlNDkxOGVhMTA1MmExNDIzYzAuc2V0Q29udGVudChodG1sXzUzNjQ5ZTIzMmQ4MzQyZDg4NWVjZDIwMDM2NDA4MDNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzk0NDBmMGNmOGVkNGI3YzliZDQxNTgxNGUzZTAyYWEuYmluZFBvcHVwKHBvcHVwX2M3MmE4Y2YyYTc1MTQxZTQ5MThlYTEwNTJhMTQyM2MwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBjNWUyMGJkMzk0NzRhNzBiZTJkZTZkZmQzMWI5ZTRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM5MDUwNDU1MmFkNDE4YWJhZDA3ZmRhNGM0MWUxNzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWQwNzY4OGU4NjNiNGNlNmJjNjk1ZjFmOTExZTAzMTYgPSAkKCc8ZGl2IGlkPSJodG1sXzVkMDc2ODhlODYzYjRjZTZiYzY5NWYxZjkxMWUwMzE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzkwNTA0NTUyYWQ0MThhYmFkMDdmZGE0YzQxZTE3Mi5zZXRDb250ZW50KGh0bWxfNWQwNzY4OGU4NjNiNGNlNmJjNjk1ZjFmOTExZTAzMTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYzVlMjBiZDM5NDc0YTcwYmUyZGU2ZGZkMzFiOWU0Yy5iaW5kUG9wdXAocG9wdXBfZTM5MDUwNDU1MmFkNDE4YWJhZDA3ZmRhNGM0MWUxNzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWQyMjg1ZTMwNDUxNDkyNjhiYWNmZmY5ZWU2MDFhOTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MGRlMjFiM2QzMzk0ZmMxYjdjN2EzODg3MGFlMjJhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzQ1ZGI4NThkNGI0ZjJkOTRhMDZmYzFkZTg5MzZhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTM0NWRiODU4ZDRiNGYyZDk0YTA2ZmMxZGU4OTM2YTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MGRlMjFiM2QzMzk0ZmMxYjdjN2EzODg3MGFlMjJhNC5zZXRDb250ZW50KGh0bWxfMTM0NWRiODU4ZDRiNGYyZDk0YTA2ZmMxZGU4OTM2YTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZDIyODVlMzA0NTE0OTI2OGJhY2ZmZjllZTYwMWE5Ny5iaW5kUG9wdXAocG9wdXBfNzBkZTIxYjNkMzM5NGZjMWI3YzdhMzg4NzBhZTIyYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjUxOWI1NTE2ZGNhNDVhYmE5NmY0MmU1MzE0YjJjNzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE5OGEwOGVhZWI5NDU2OGI3YTQ4NjhhMWMwYjA2MTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzI3YmVjYjU4YjcxNDk3MWI5NjMxZjFkNjAyMWI1MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzMyN2JlY2I1OGI3MTQ5NzFiOTYzMWYxZDYwMjFiNTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYTk4YTA4ZWFlYjk0NTY4YjdhNDg2OGExYzBiMDYxOC5zZXRDb250ZW50KGh0bWxfMzI3YmVjYjU4YjcxNDk3MWI5NjMxZjFkNjAyMWI1MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNTE5YjU1MTZkY2E0NWFiYTk2ZjQyZTUzMTRiMmM3OS5iaW5kUG9wdXAocG9wdXBfMGE5OGEwOGVhZWI5NDU2OGI3YTQ4NjhhMWMwYjA2MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWUyZTE1YTMwMmQyNGMzMmEwZTE1YmQwY2ZlYjhmMDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwMjM4NDc4OTc1LC0xMjIuNDAxMTYxNTU1NjAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdhYjlkOGRhNGVmNDVhYmI2MjQ5MWU1MjBkNThiNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE2YTI5NWJmNDc3NGQxNzlkMmUyYzkwY2U5MGIzYzMgPSAkKCc8ZGl2IGlkPSJodG1sX2UxNmEyOTViZjQ3NzRkMTc5ZDJlMmM5MGNlOTBiM2MzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDdhYjlkOGRhNGVmNDVhYmI2MjQ5MWU1MjBkNThiNmQuc2V0Q29udGVudChodG1sX2UxNmEyOTViZjQ3NzRkMTc5ZDJlMmM5MGNlOTBiM2MzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWUyZTE1YTMwMmQyNGMzMmEwZTE1YmQwY2ZlYjhmMDkuYmluZFBvcHVwKHBvcHVwXzQ3YWI5ZDhkYTRlZjQ1YWJiNjI0OTFlNTIwZDU4YjZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlhNzE5Mzc2MjM2ZDQwZmI4MzcxMWI4MDVkMTYzMWFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI3MDA1MzE5NjI5OTk1LC0xMjIuNDAzNDA4NjY5MTkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZkMzJlYjFmMDcwNGVkNzlhYjEwZWRhYjFkZjU0ZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjMzZTAwYWUyMmUyNDM1YmIzMWM1NTQyYmU2ZjU5MWQgPSAkKCc8ZGl2IGlkPSJodG1sXzIzM2UwMGFlMjJlMjQzNWJiMzFjNTU0MmJlNmY1OTFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZkMzJlYjFmMDcwNGVkNzlhYjEwZWRhYjFkZjU0Zjcuc2V0Q29udGVudChodG1sXzIzM2UwMGFlMjJlMjQzNWJiMzFjNTU0MmJlNmY1OTFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWE3MTkzNzYyMzZkNDBmYjgzNzExYjgwNWQxNjMxYWYuYmluZFBvcHVwKHBvcHVwX2RmZDMyZWIxZjA3MDRlZDc5YWIxMGVkYWIxZGY1NGY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA5YTVhYmIwNmI0NzQ2MWViZWU3NzNiMTQ2YjVmNzUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkODc4Zjg5ZTRlOTQxMTI4ZjRkOTYyMjYxODZkOTMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhMTViNDQ0OTdhYjQ3OTk5MDk3M2ZlYTAxMzAxNTYxID0gJCgnPGRpdiBpZD0iaHRtbF81YTE1YjQ0NDk3YWI0Nzk5OTA5NzNmZWEwMTMwMTU2MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDg3OGY4OWU0ZTk0MTEyOGY0ZDk2MjI2MTg2ZDkzMy5zZXRDb250ZW50KGh0bWxfNWExNWI0NDQ5N2FiNDc5OTkwOTczZmVhMDEzMDE1NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wOWE1YWJiMDZiNDc0NjFlYmVlNzczYjE0NmI1Zjc1MC5iaW5kUG9wdXAocG9wdXBfZmQ4NzhmODllNGU5NDExMjhmNGQ5NjIyNjE4NmQ5MzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjY5ODZhZmNmODNiNDgzNzhmMDdlN2NlYjcwNTc0YzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTMwMTg2NTM3NDQ2MDQsLTEyMi40MTg1ODcxNzIyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzFiNzFkOWQzYjE0MDNmYjc2NDdjMjkxMWY4YjYzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTYyNmU1ZGNhZmE0Y2U3OTk2ODEwM2VjZGQ5YTc1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE2MjZlNWRjYWZhNGNlNzk5NjgxMDNlY2RkOWE3NWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODMxYjcxZDlkM2IxNDAzZmI3NjQ3YzI5MTFmOGI2M2Euc2V0Q29udGVudChodG1sX2UxNjI2ZTVkY2FmYTRjZTc5OTY4MTAzZWNkZDlhNzViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjY5ODZhZmNmODNiNDgzNzhmMDdlN2NlYjcwNTc0YzAuYmluZFBvcHVwKHBvcHVwXzgzMWI3MWQ5ZDNiMTQwM2ZiNzY0N2MyOTExZjhiNjNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzAxNGFjMDY4ZDUxODQwMDE5MzYyZmU4MDJiYWIyOGQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0MDQxODM4NTA0MSwtMTIyLjQxNDM3MDYyNzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjYTRkYzE5NGNkYzRmOTFiYjcwYjU1YWY3ZjYyZDRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhYWQwZjA3MjY0OTRiZWI5NTNkODBlODJjYmZjMDRkID0gJCgnPGRpdiBpZD0iaHRtbF8xYWFkMGYwNzI2NDk0YmViOTUzZDgwZTgyY2JmYzA0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RlJBVUQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYTRkYzE5NGNkYzRmOTFiYjcwYjU1YWY3ZjYyZDRmLnNldENvbnRlbnQoaHRtbF8xYWFkMGYwNzI2NDk0YmViOTUzZDgwZTgyY2JmYzA0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAxNGFjMDY4ZDUxODQwMDE5MzYyZmU4MDJiYWIyOGQ5LmJpbmRQb3B1cChwb3B1cF9mY2E0ZGMxOTRjZGM0ZjkxYmI3MGI1NWFmN2Y2MmQ0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZTUwNzViNzMzNjg0ZTQwODgyZDczOGVmNDc1NzE1YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQzMjUzMDg1MzRjNDY1YzhhNTVhZWM5Nzg0ZTAyNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmI2NjYwZGVkZGJkNGNmOTg5YzFjODcxNzI2YTAyZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzJiNjY2MGRlZGRiZDRjZjk4OWMxYzg3MTcyNmEwMmZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDMyNTMwODUzNGM0NjVjOGE1NWFlYzk3ODRlMDI0OC5zZXRDb250ZW50KGh0bWxfMmI2NjYwZGVkZGJkNGNmOTg5YzFjODcxNzI2YTAyZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZTUwNzViNzMzNjg0ZTQwODgyZDczOGVmNDc1NzE1Yi5iaW5kUG9wdXAocG9wdXBfNTQzMjUzMDg1MzRjNDY1YzhhNTVhZWM5Nzg0ZTAyNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjBhZDU5MzRlM2U3NGRhZjgyOWY3YzgyMmEwN2Y2OGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMwOTk4MjQ0NTkyMSwtMTIyLjQxOTE4MzA5NjM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMzRhODUxNmZkZTQwOGZiNDQwZDc1YTY0MmQzM2VjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4Zjg4YmVmZDQwNDQ3ZmY4OWZlZjllMWUyZDBjMTE0ID0gJCgnPGRpdiBpZD0iaHRtbF9hOGY4OGJlZmQ0MDQ0N2ZmODlmZWY5ZTFlMmQwYzExNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMzRhODUxNmZkZTQwOGZiNDQwZDc1YTY0MmQzM2VjLnNldENvbnRlbnQoaHRtbF9hOGY4OGJlZmQ0MDQ0N2ZmODlmZWY5ZTFlMmQwYzExNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYwYWQ1OTM0ZTNlNzRkYWY4MjlmN2M4MjJhMDdmNjhhLmJpbmRQb3B1cChwb3B1cF82YjM0YTg1MTZmZGU0MDhmYjQ0MGQ3NWE2NDJkMzNlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMGUwZjkzNzM4MDg0NzA4ODUyYTEwM2I0NGZlODdkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBiM2Q5MGNkZDhlNGQzOWE4ODE3NjJmNzU5ZTljMmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJhMTIwMWY1ZmQxNGM0OGI0MzRiNzEyMjVmOWVjNjkgPSAkKCc8ZGl2IGlkPSJodG1sXzliYTEyMDFmNWZkMTRjNDhiNDM0YjcxMjI1ZjllYzY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTBiM2Q5MGNkZDhlNGQzOWE4ODE3NjJmNzU5ZTljMmUuc2V0Q29udGVudChodG1sXzliYTEyMDFmNWZkMTRjNDhiNDM0YjcxMjI1ZjllYzY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjBlMGY5MzczODA4NDcwODg1MmExMDNiNDRmZTg3ZGYuYmluZFBvcHVwKHBvcHVwX2EwYjNkOTBjZGQ4ZTRkMzlhODgxNzYyZjc1OWU5YzJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYxNTBiZDcwYWE1OTQ5NzhiMmFlNWYyOGJiZmI4YTJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1OTljNzMwZTdjODQ3OTBiZjU0MGMzZWIzNjYwMTY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmNWQwZTM4MTdhNTQ1NDRiZDBmZWI0MmY0MWZmNTU2ID0gJCgnPGRpdiBpZD0iaHRtbF80ZjVkMGUzODE3YTU0NTQ0YmQwZmViNDJmNDFmZjU1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU5OWM3MzBlN2M4NDc5MGJmNTQwYzNlYjM2NjAxNjUuc2V0Q29udGVudChodG1sXzRmNWQwZTM4MTdhNTQ1NDRiZDBmZWI0MmY0MWZmNTU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjE1MGJkNzBhYTU5NDk3OGIyYWU1ZjI4YmJmYjhhMmIuYmluZFBvcHVwKHBvcHVwXzE1OTljNzMwZTdjODQ3OTBiZjU0MGMzZWIzNjYwMTY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RjODU3NTY5NGIzMzRjOGJiMzRiYzk5ZjVjZTYyYjIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjODhhZDEzNzc1NjRjMTM4Y2Q5ZGU1NzU4MmE4OTZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMzdlMWVhYWUxNjQ5MmNhMzk4OTk0NzNkNjViODRiID0gJCgnPGRpdiBpZD0iaHRtbF80YjM3ZTFlYWFlMTY0OTJjYTM5ODk5NDczZDY1Yjg0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjODhhZDEzNzc1NjRjMTM4Y2Q5ZGU1NzU4MmE4OTZiLnNldENvbnRlbnQoaHRtbF80YjM3ZTFlYWFlMTY0OTJjYTM5ODk5NDczZDY1Yjg0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjODU3NTY5NGIzMzRjOGJiMzRiYzk5ZjVjZTYyYjIwLmJpbmRQb3B1cChwb3B1cF9lYzg4YWQxMzc3NTY0YzEzOGNkOWRlNTc1ODJhODk2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YjE1NzQ5MmQxOTI0OWFlODY5ZGE2YTM5NmJjOGRiMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZjU5ZDZlMjBjOWQ0MmIyOWVkNjIxNDJhOTVlY2UxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iODY0OWIyNjlkNTc0YWMzOTliZmE2MDgyNTA0MTA0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjg2NDliMjY5ZDU3NGFjMzk5YmZhNjA4MjUwNDEwNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjU5ZDZlMjBjOWQ0MmIyOWVkNjIxNDJhOTVlY2UxZC5zZXRDb250ZW50KGh0bWxfYjg2NDliMjY5ZDU3NGFjMzk5YmZhNjA4MjUwNDEwNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YjE1NzQ5MmQxOTI0OWFlODY5ZGE2YTM5NmJjOGRiMS5iaW5kUG9wdXAocG9wdXBfZmY1OWQ2ZTIwYzlkNDJiMjllZDYyMTQyYTk1ZWNlMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTEwNWE4NzM1ZjZhNGYzNmFkZWU5YjdjZjM1YmZmZWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE4MjUyMWUyMGEzNDY4ZGIyYTI5MjU2ODI4NDQ3NmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUzODQ4NjNhYmE1NGRmM2IxY2QwMzYxNTQ1ZTdiZjYgPSAkKCc8ZGl2IGlkPSJodG1sX2M1Mzg0ODYzYWJhNTRkZjNiMWNkMDM2MTU0NWU3YmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE4MjUyMWUyMGEzNDY4ZGIyYTI5MjU2ODI4NDQ3NmIuc2V0Q29udGVudChodG1sX2M1Mzg0ODYzYWJhNTRkZjNiMWNkMDM2MTU0NWU3YmY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTEwNWE4NzM1ZjZhNGYzNmFkZWU5YjdjZjM1YmZmZWYuYmluZFBvcHVwKHBvcHVwX2VhODI1MjFlMjBhMzQ2OGRiMmEyOTI1NjgyODQ0NzZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IyZjYyYzhlM2NhMDQ2NDRiNmRhZWZkODQxNzMzMzU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwMDM3OTk5NTEyNzk1LC0xMjIuNDA0NTk0MTQwNjM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBiNTNjOGM3MTJlNDY2OTgxNDYwZTY5Mzg4YWVhMTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2ZjN2UwM2JkMjU1NGIxMWI1ZGU2OTFkODVlMWY2YzIgPSAkKCc8ZGl2IGlkPSJodG1sX2NmYzdlMDNiZDI1NTRiMTFiNWRlNjkxZDg1ZTFmNmMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYjUzYzhjNzEyZTQ2Njk4MTQ2MGU2OTM4OGFlYTEzLnNldENvbnRlbnQoaHRtbF9jZmM3ZTAzYmQyNTU0YjExYjVkZTY5MWQ4NWUxZjZjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IyZjYyYzhlM2NhMDQ2NDRiNmRhZWZkODQxNzMzMzU4LmJpbmRQb3B1cChwb3B1cF9hMGI1M2M4YzcxMmU0NjY5ODE0NjBlNjkzODhhZWExMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNjE1NDgxYTdlMDE0MWM5OThiNmNiM2I3MDVjZjI5NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzBkM2QzYmZhOTM0NGU2YWVlZDU3MWJhMzY5YzE3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMGY0YjcwOTMxNWM0OWU1OWM3NGM2NGIxODYzZjJhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzBmNGI3MDkzMTVjNDllNTljNzRjNjRiMTg2M2YyYTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjcwZDNkM2JmYTkzNDRlNmFlZWQ1NzFiYTM2OWMxNzguc2V0Q29udGVudChodG1sXzMwZjRiNzA5MzE1YzQ5ZTU5Yzc0YzY0YjE4NjNmMmEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjYxNTQ4MWE3ZTAxNDFjOTk4YjZjYjNiNzA1Y2YyOTYuYmluZFBvcHVwKHBvcHVwXzY3MGQzZDNiZmE5MzQ0ZTZhZWVkNTcxYmEzNjljMTc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJkMGUyNzVjYzkwYTRkMTRhNGY0ZDc5NzY3MTU1YmYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGMyMTE2ZTlkNGQxNGFmNGI5ZDA4ODcxMjZjNmQzZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTBiZjg2ZjdkZjhmNGU1ZmE1MjlmZWQxMmM1MTg5ZjggPSAkKCc8ZGl2IGlkPSJodG1sXzUwYmY4NmY3ZGY4ZjRlNWZhNTI5ZmVkMTJjNTE4OWY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMyMTE2ZTlkNGQxNGFmNGI5ZDA4ODcxMjZjNmQzZjYuc2V0Q29udGVudChodG1sXzUwYmY4NmY3ZGY4ZjRlNWZhNTI5ZmVkMTJjNTE4OWY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmQwZTI3NWNjOTBhNGQxNGE0ZjRkNzk3NjcxNTViZjAuYmluZFBvcHVwKHBvcHVwX2RjMjExNmU5ZDRkMTRhZjRiOWQwODg3MTI2YzZkM2Y2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UwNzI2YTliNTE0OTRiOGE5YzkyYTRjODQ2NmU5ZjFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhYTQ2ZTA5ODYyMTRhMGNhOTkwYWRmNTUzYWU1MzBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4ZDI5Mjg0NDllMDQ0ZTFiYjFkYTEzYjAwM2M0YjQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9jOGQyOTI4NDQ5ZTA0NGUxYmIxZGExM2IwMDNjNGI0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UFJPU1RJVFVUSU9OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYWE0NmUwOTg2MjE0YTBjYTk5MGFkZjU1M2FlNTMwYy5zZXRDb250ZW50KGh0bWxfYzhkMjkyODQ0OWUwNDRlMWJiMWRhMTNiMDAzYzRiNDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMDcyNmE5YjUxNDk0YjhhOWM5MmE0Yzg0NjZlOWYxYy5iaW5kUG9wdXAocG9wdXBfYmFhNDZlMDk4NjIxNGEwY2E5OTBhZGY1NTNhZTUzMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDk0ODc4Yzg4OThmNDU2ZGJkZTdiZmFhMTk3NjlmYTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzg1MjMzNzc2MDMyLC0xMjIuNDAzNDY0MDgwMDMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE0OTU4ZmE2ZDg0NGI1Zjk3ZjA3M2E4Mjg1OGU1ODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTU4OWYxOWIzZWZjNDUwZWFjMmI2Y2UyOWY4MGM1ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzE1ODlmMTliM2VmYzQ1MGVhYzJiNmNlMjlmODBjNWU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE0OTU4ZmE2ZDg0NGI1Zjk3ZjA3M2E4Mjg1OGU1ODcuc2V0Q29udGVudChodG1sXzE1ODlmMTliM2VmYzQ1MGVhYzJiNmNlMjlmODBjNWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDk0ODc4Yzg4OThmNDU2ZGJkZTdiZmFhMTk3NjlmYTEuYmluZFBvcHVwKHBvcHVwXzFhNDk1OGZhNmQ4NDRiNWY5N2YwNzNhODI4NThlNTg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE5MWRiNzMyOGJlMjQ0ZDQ5NzQ1Yjk3ODliNmIwYmQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODY4YWU2ZTIyZTc0OWQ2ODcyN2MyZjVjMmRmOGRhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmNjOGViYmViM2E0N2IyOWZjZmIxMTI5OTE1ZGQ2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJjYzhlYmJlYjNhNDdiMjlmY2ZiMTEyOTkxNWRkNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDg2OGFlNmUyMmU3NDlkNjg3MjdjMmY1YzJkZjhkYTEuc2V0Q29udGVudChodG1sXzIyY2M4ZWJiZWIzYTQ3YjI5ZmNmYjExMjk5MTVkZDZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTkxZGI3MzI4YmUyNDRkNDk3NDViOTc4OWI2YjBiZDAuYmluZFBvcHVwKHBvcHVwXzQ4NjhhZTZlMjJlNzQ5ZDY4NzI3YzJmNWMyZGY4ZGExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY5ZWIzOWUyNmIzMjQ0NDg4OGMzMTZjZmFkNTJmM2Y4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODc3NTZlY2VmMjI0YzZjYWY5YTk2Njg1OWZkNTFiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lN2Q0MDVhZmU4ZWQ0ZDFhYTI2YTJjOTJkMjMzZjc4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTdkNDA1YWZlOGVkNGQxYWEyNmEyYzkyZDIzM2Y3OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4Nzc1NmVjZWYyMjRjNmNhZjlhOTY2ODU5ZmQ1MWIwLnNldENvbnRlbnQoaHRtbF9lN2Q0MDVhZmU4ZWQ0ZDFhYTI2YTJjOTJkMjMzZjc4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY5ZWIzOWUyNmIzMjQ0NDg4OGMzMTZjZmFkNTJmM2Y4LmJpbmRQb3B1cChwb3B1cF9mODc3NTZlY2VmMjI0YzZjYWY5YTk2Njg1OWZkNTFiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iYTQ5ZmE4NjYyODI0NjUwOWQxODZlMzlmNjU2NjcxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQ3ZWY5ZTRjZGFmNGVhYjg2YjQ3NmMyMWIzMDQzY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNkYmNhNTAwZTNjNDYyNzk0MTM1Nzg2MzVlNzkyMmMgPSAkKCc8ZGl2IGlkPSJodG1sXzUzZGJjYTUwMGUzYzQ2Mjc5NDEzNTc4NjM1ZTc5MjJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWQ3ZWY5ZTRjZGFmNGVhYjg2YjQ3NmMyMWIzMDQzY2Muc2V0Q29udGVudChodG1sXzUzZGJjYTUwMGUzYzQ2Mjc5NDEzNTc4NjM1ZTc5MjJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmE0OWZhODY2MjgyNDY1MDlkMTg2ZTM5ZjY1NjY3MTUuYmluZFBvcHVwKHBvcHVwXzlkN2VmOWU0Y2RhZjRlYWI4NmI0NzZjMjFiMzA0M2NjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzllYWJjMzhjZWU1MTQ4YTU5NTJmYzk5ZjAwMjRjOWQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTc4ZGJmN2FkYmIwNGNjNTk5ZTRlNGUxN2RlMzRjMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMzMWUxZGNiMDgzNDcyMTlkZTg4MTYyMGU1ZTdlMWEgPSAkKCc8ZGl2IGlkPSJodG1sX2VjMzFlMWRjYjA4MzQ3MjE5ZGU4ODE2MjBlNWU3ZTFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNzhkYmY3YWRiYjA0Y2M1OTllNGU0ZTE3ZGUzNGMyZi5zZXRDb250ZW50KGh0bWxfZWMzMWUxZGNiMDgzNDcyMTlkZTg4MTYyMGU1ZTdlMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZWFiYzM4Y2VlNTE0OGE1OTUyZmM5OWYwMDI0YzlkMi5iaW5kUG9wdXAocG9wdXBfZTc4ZGJmN2FkYmIwNGNjNTk5ZTRlNGUxN2RlMzRjMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmI5YmQwN2Y3MDZhNDZhZGE1NjgxYzJkMTkzMmI0NGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2I2ZDkwOTU0OTQxNDAwMzkwYzRjOGU1YmQyM2ViMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNlMDVlN2I2ZjU3NDk2ZWI0ODEwOWJmNDFjNGRkYjggPSAkKCc8ZGl2IGlkPSJodG1sXzEzZTA1ZTdiNmY1NzQ5NmViNDgxMDliZjQxYzRkZGI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I2ZDkwOTU0OTQxNDAwMzkwYzRjOGU1YmQyM2ViMzMuc2V0Q29udGVudChodG1sXzEzZTA1ZTdiNmY1NzQ5NmViNDgxMDliZjQxYzRkZGI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmI5YmQwN2Y3MDZhNDZhZGE1NjgxYzJkMTkzMmI0NGEuYmluZFBvcHVwKHBvcHVwXzNiNmQ5MDk1NDk0MTQwMDM5MGM0YzhlNWJkMjNlYjMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q4YTFjNWMxOGMzYjQ1OGVhNDAwYjg3NjZhNDIwMGI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MDA2NTMyNDM5MjA1LC0xMjIuMzk5ODAyMTQ1Nzk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGQ1YjI0YjEyYWY1NDU1ZTk1ZWQ3ZjY3OGRmOTBkY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjY3MDY3NGVjMmU5NDIwYWEyMzZhNTFhODAxZDY3MTggPSAkKCc8ZGl2IGlkPSJodG1sXzY2NzA2NzRlYzJlOTQyMGFhMjM2YTUxYTgwMWQ2NzE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZDViMjRiMTJhZjU0NTVlOTVlZDdmNjc4ZGY5MGRjZS5zZXRDb250ZW50KGh0bWxfNjY3MDY3NGVjMmU5NDIwYWEyMzZhNTFhODAxZDY3MTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kOGExYzVjMThjM2I0NThlYTQwMGI4NzY2YTQyMDBiNi5iaW5kUG9wdXAocG9wdXBfZGQ1YjI0YjEyYWY1NDU1ZTk1ZWQ3ZjY3OGRmOTBkY2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTY1OGM2MjlmYzQ2NGI5NmExYjNhNzI4NWE5ZWRkMjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiYzE3ODE5YzFiNjRlZmM5Njg4MzVhNGUxYjQ0YzA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzYTBhZjk0NzE0MzRmNTA5NjBhZTE5NTFmODc5ZTk4ID0gJCgnPGRpdiBpZD0iaHRtbF84M2EwYWY5NDcxNDM0ZjUwOTYwYWUxOTUxZjg3OWU5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YmMxNzgxOWMxYjY0ZWZjOTY4ODM1YTRlMWI0NGMwNy5zZXRDb250ZW50KGh0bWxfODNhMGFmOTQ3MTQzNGY1MDk2MGFlMTk1MWY4NzllOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NjU4YzYyOWZjNDY0Yjk2YTFiM2E3Mjg1YTllZGQyMS5iaW5kUG9wdXAocG9wdXBfN2JjMTc4MTljMWI2NGVmYzk2ODgzNWE0ZTFiNDRjMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWIyNzg5MWQ0ZDVkNGNkNjk4ZGQwYTAzYjBmNjQ1NjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwZGU5N2RiMGU1YjQ4MTNiNmI4NDkyNTE2Y2MyMWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2YjdlMTY3MDNkMjQxOGVhZTQ4OTM5ODc4ZDMyOWRlID0gJCgnPGRpdiBpZD0iaHRtbF9iNmI3ZTE2NzAzZDI0MThlYWU0ODkzOTg3OGQzMjlkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwZGU5N2RiMGU1YjQ4MTNiNmI4NDkyNTE2Y2MyMWZiLnNldENvbnRlbnQoaHRtbF9iNmI3ZTE2NzAzZDI0MThlYWU0ODkzOTg3OGQzMjlkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ViMjc4OTFkNGQ1ZDRjZDY5OGRkMGEwM2IwZjY0NTY1LmJpbmRQb3B1cChwb3B1cF9hMGRlOTdkYjBlNWI0ODEzYjZiODQ5MjUxNmNjMjFmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MzVjZTNhOWUxZWY0ZWY5YWZlMTMyZjg2NmRmNjIxYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGI2NGZiZWFmZjk3NDA2ZWE0OTFiZGViMDNkOTljMTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc0MDkzMGQ5N2MxNDg5MWIxNDRkNTEwOTc1ODY0ZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzI3NDA5MzBkOTdjMTQ4OTFiMTQ0ZDUxMDk3NTg2NGVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGI2NGZiZWFmZjk3NDA2ZWE0OTFiZGViMDNkOTljMTcuc2V0Q29udGVudChodG1sXzI3NDA5MzBkOTdjMTQ4OTFiMTQ0ZDUxMDk3NTg2NGVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTM1Y2UzYTllMWVmNGVmOWFmZTEzMmY4NjZkZjYyMWMuYmluZFBvcHVwKHBvcHVwXzBiNjRmYmVhZmY5NzQwNmVhNDkxYmRlYjAzZDk5YzE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFjN2NjM2M3YWViNjRmZDdhYjI3MDQ1MTUxZDZhOGZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGRlM2ZiY2Q0YzhjNGI4ZWFmYWExNTRlYTMxNmM2M2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNkNjdiZWUzOTRjNDQ0ZWE4MTg2YTYxMGQ2MGYyNTQgPSAkKCc8ZGl2IGlkPSJodG1sX2QzZDY3YmVlMzk0YzQ0NGVhODE4NmE2MTBkNjBmMjU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZGUzZmJjZDRjOGM0YjhlYWZhYTE1NGVhMzE2YzYzYi5zZXRDb250ZW50KGh0bWxfZDNkNjdiZWUzOTRjNDQ0ZWE4MTg2YTYxMGQ2MGYyNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYzdjYzNjN2FlYjY0ZmQ3YWIyNzA0NTE1MWQ2YThmYi5iaW5kUG9wdXAocG9wdXBfNGRlM2ZiY2Q0YzhjNGI4ZWFmYWExNTRlYTMxNmM2M2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2JlYmViMzM4NmIzNDhhYWEzZjllYjA0Yjg5NjBhNTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTU5OTc3MzM5ODU2LC0xMjIuNDA5NDM1NjE3MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE3YmU0MzIzZDI4NDg1ZGFlYzQzYTAyZTM5MjRiNjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjU1M2FhZWZhN2M1NGMwNmFiOGYyZTVjMDc5YTYxNDggPSAkKCc8ZGl2IGlkPSJodG1sXzY1NTNhYWVmYTdjNTRjMDZhYjhmMmU1YzA3OWE2MTQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjE3YmU0MzIzZDI4NDg1ZGFlYzQzYTAyZTM5MjRiNjMuc2V0Q29udGVudChodG1sXzY1NTNhYWVmYTdjNTRjMDZhYjhmMmU1YzA3OWE2MTQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2JlYmViMzM4NmIzNDhhYWEzZjllYjA0Yjg5NjBhNTEuYmluZFBvcHVwKHBvcHVwX2YxN2JlNDMyM2QyODQ4NWRhZWM0M2EwMmUzOTI0YjYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RiZWNiMDhmMjMyNzQzMTg5MzI2ZjYyZjNjMjMzMzBhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYzNiYWExMGNkMjRhN2I4NmFmYTg3OTFlNzgwNDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzYjg0MzEwZjQzMTRhNzdiZTMxOTQ5OWM2MzNmZjcyID0gJCgnPGRpdiBpZD0iaHRtbF9hM2I4NDMxMGY0MzE0YTc3YmUzMTk0OTljNjMzZmY3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWMzYmFhMTBjZDI0YTdiODZhZmE4NzkxZTc4MDQ1Mi5zZXRDb250ZW50KGh0bWxfYTNiODQzMTBmNDMxNGE3N2JlMzE5NDk5YzYzM2ZmNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYmVjYjA4ZjIzMjc0MzE4OTMyNmY2MmYzYzIzMzMwYS5iaW5kUG9wdXAocG9wdXBfNTFjM2JhYTEwY2QyNGE3Yjg2YWZhODc5MWU3ODA0NTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTg5ZmM3MDMwNjMwNDE1ZDkzY2I0ZGZkMWVjM2FlM2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4NDg2ZWFjMDJlYjQ3MDhhMWIwMTIwNWFmNDg5MGRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyNjQwYjFjNzJiZTQ1OTA4YWYzNjg2NGJkNTQ5NTY3ID0gJCgnPGRpdiBpZD0iaHRtbF9mMjY0MGIxYzcyYmU0NTkwOGFmMzY4NjRiZDU0OTU2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODQ4NmVhYzAyZWI0NzA4YTFiMDEyMDVhZjQ4OTBkZi5zZXRDb250ZW50KGh0bWxfZjI2NDBiMWM3MmJlNDU5MDhhZjM2ODY0YmQ1NDk1NjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xODlmYzcwMzA2MzA0MTVkOTNjYjRkZmQxZWMzYWUzYS5iaW5kUG9wdXAocG9wdXBfOTg0ODZlYWMwMmViNDcwOGExYjAxMjA1YWY0ODkwZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzI3MTYxODUxODAxNGI3NGExMzFhNDliODgyYTQ1MmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTI3Njc4ODQ4MjEsLTEyMi40MzE5MjgwMTEwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDNmNGNkZmQ3NzM0ZmUyYTgzZTk2NTU5MzMzY2EyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OGNjYmY0N2I2NTI0ZDU5YTcyY2FmNGJkODI2ZmVhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDhjY2JmNDdiNjUyNGQ1OWE3MmNhZjRiZDgyNmZlYTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDNmNGNkZmQ3NzM0ZmUyYTgzZTk2NTU5MzMzY2EyNC5zZXRDb250ZW50KGh0bWxfNDhjY2JmNDdiNjUyNGQ1OWE3MmNhZjRiZDgyNmZlYTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MjcxNjE4NTE4MDE0Yjc0YTEzMWE0OWI4ODJhNDUyZC5iaW5kUG9wdXAocG9wdXBfNmQzZjRjZGZkNzczNGZlMmE4M2U5NjU1OTMzM2NhMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTE5ZmI0NTViNzBiNGZjY2I4NGQyODQ4MTlkNWI0NTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODk1NzEwMjU1ODYzLC0xMjIuNDAyMTYzNzEzNjE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGI0Njc2ZTk1ZjRiNDhlNWI5NTBlYThhY2E1MTMyNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWE4ZWExMmJhMmYwNGM5ZGFhZGZlZDhhOTcyYTgwMWUgPSAkKCc8ZGl2IGlkPSJodG1sXzVhOGVhMTJiYTJmMDRjOWRhYWRmZWQ4YTk3MmE4MDFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVOS0VOTkVTUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGI0Njc2ZTk1ZjRiNDhlNWI5NTBlYThhY2E1MTMyNWIuc2V0Q29udGVudChodG1sXzVhOGVhMTJiYTJmMDRjOWRhYWRmZWQ4YTk3MmE4MDFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTE5ZmI0NTViNzBiNGZjY2I4NGQyODQ4MTlkNWI0NTAuYmluZFBvcHVwKHBvcHVwXzBiNDY3NmU5NWY0YjQ4ZTViOTUwZWE4YWNhNTEzMjViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzljZWZkZTBjNzdhNTQ2MTU4YzEwMzVlNzE3MjAxYjhiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzZjU1ZjU5OWYxZTQxOWFiNWZiNGE1ZmJiNWM0ZDM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkOTk5YTIzY2IwYjQ3MTFhYTljOGQ1YzVkNGFjMTY1ID0gJCgnPGRpdiBpZD0iaHRtbF9lZDk5OWEyM2NiMGI0NzExYWE5YzhkNWM1ZDRhYzE2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzZjU1ZjU5OWYxZTQxOWFiNWZiNGE1ZmJiNWM0ZDM5LnNldENvbnRlbnQoaHRtbF9lZDk5OWEyM2NiMGI0NzExYWE5YzhkNWM1ZDRhYzE2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzljZWZkZTBjNzdhNTQ2MTU4YzEwMzVlNzE3MjAxYjhiLmJpbmRQb3B1cChwb3B1cF85M2Y1NWY1OTlmMWU0MTlhYjVmYjRhNWZiYjVjNGQzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zODc5ZDZkOWUyMzM0OTlhOGQ0ZWVhMzRkNmIwN2Y3MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNjU1NjUzNDc5NCwtMTIyLjQxMzc5MDk3Mjc4MDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzQ2OWRhOGY2NDVhNGQzNjg5YjU5YmE1ODM1YTcxYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhlZTdlMTVjZjgwNGFhN2FjZGRlYzdkYjAwMWE3ZGUgPSAkKCc8ZGl2IGlkPSJodG1sXzc4ZWU3ZTE1Y2Y4MDRhYTdhY2RkZWM3ZGIwMDFhN2RlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0NjlkYThmNjQ1YTRkMzY4OWI1OWJhNTgzNWE3MWMyLnNldENvbnRlbnQoaHRtbF83OGVlN2UxNWNmODA0YWE3YWNkZGVjN2RiMDAxYTdkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM4NzlkNmQ5ZTIzMzQ5OWE4ZDRlZWEzNGQ2YjA3ZjcxLmJpbmRQb3B1cChwb3B1cF8zNDY5ZGE4ZjY0NWE0ZDM2ODliNTliYTU4MzVhNzFjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMzczNDRiMmRmM2U0NTcwOTA1MGI3MmEwYTAyMTg4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTQ1YzZkNDVlYjI0ZjBmOTU2MzI1MWE3NmVjNGNjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDM2OTg1MDljNGQ0NWFiYmE4ZDFiNTNjN2VhMWJkNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQzNjk4NTA5YzRkNDVhYmJhOGQxYjUzYzdlYTFiZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTQ1YzZkNDVlYjI0ZjBmOTU2MzI1MWE3NmVjNGNjZC5zZXRDb250ZW50KGh0bWxfNjQzNjk4NTA5YzRkNDVhYmJhOGQxYjUzYzdlYTFiZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMzczNDRiMmRmM2U0NTcwOTA1MGI3MmEwYTAyMTg4NS5iaW5kUG9wdXAocG9wdXBfOTU0NWM2ZDQ1ZWIyNGYwZjk1NjMyNTFhNzZlYzRjY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTM2MWRiNjY1NTk0NGM4N2I1ZmU2MGMzZTFmYjZiYjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZmU0NTc0MTZhMzA0NTIyOGE0YjM0NzU4YzY4YmQ3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YTJjM2E2ZDlkY2Q0NWIwYmZjNDE1Mzc5NGNkYzBmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGEyYzNhNmQ5ZGNkNDViMGJmYzQxNTM3OTRjZGMwZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2ZlNDU3NDE2YTMwNDUyMjhhNGIzNDc1OGM2OGJkN2Quc2V0Q29udGVudChodG1sXzRhMmMzYTZkOWRjZDQ1YjBiZmM0MTUzNzk0Y2RjMGZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTM2MWRiNjY1NTk0NGM4N2I1ZmU2MGMzZTFmYjZiYjIuYmluZFBvcHVwKHBvcHVwX2NmZTQ1NzQxNmEzMDQ1MjI4YTRiMzQ3NThjNjhiZDdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBhODY0M2EzYmM1ZjQwZjc4ZTgyODJlZjJmMjViMDQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODFjOGQxMGM3MWNlNGE2MTljMDJkODcwN2ZlM2Q0ODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg0ZTUyZDFmNmUwNDc5Y2I1ZTA2NTczOTg1NTRhNWEgPSAkKCc8ZGl2IGlkPSJodG1sXzk4NGU1MmQxZjZlMDQ3OWNiNWUwNjU3Mzk4NTU0YTVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxYzhkMTBjNzFjZTRhNjE5YzAyZDg3MDdmZTNkNDgyLnNldENvbnRlbnQoaHRtbF85ODRlNTJkMWY2ZTA0NzljYjVlMDY1NzM5ODU1NGE1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBhODY0M2EzYmM1ZjQwZjc4ZTgyODJlZjJmMjViMDQwLmJpbmRQb3B1cChwb3B1cF84MWM4ZDEwYzcxY2U0YTYxOWMwMmQ4NzA3ZmUzZDQ4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kYTA4MThmMmEwN2M0MzhhODhmZmNmZGU3MTNjMjkwMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTk5ODgzMjM3OTc5NiwtMTIyLjQxMTc0NzM3MTkyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1YTg3YWFlZDc5ODQzNzQ5ZWFkMjgwMWNmZTVlMjE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1N2JiYzc3OGM0NzRjN2JiYjU4MDhmNzdjZWE2OWJhID0gJCgnPGRpdiBpZD0iaHRtbF81NTdiYmM3NzhjNDc0YzdiYmI1ODA4Zjc3Y2VhNjliYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1YTg3YWFlZDc5ODQzNzQ5ZWFkMjgwMWNmZTVlMjE0LnNldENvbnRlbnQoaHRtbF81NTdiYmM3NzhjNDc0YzdiYmI1ODA4Zjc3Y2VhNjliYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RhMDgxOGYyYTA3YzQzOGE4OGZmY2ZkZTcxM2MyOTAwLmJpbmRQb3B1cChwb3B1cF9hNWE4N2FhZWQ3OTg0Mzc0OWVhZDI4MDFjZmU1ZTIxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MGFlYTdiNzg3N2E0ZTdiYjA5ZmU0ZDI0NDg4Mjk1NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljNTA4NDFkNWVjMzQzM2JiNzgxOTVkYjlhMjBiZGVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkMzdmM2QyZjMwYTQzNmQ4MzgwYzY3ZDUzZDllMDE2ID0gJCgnPGRpdiBpZD0iaHRtbF85ZDM3ZjNkMmYzMGE0MzZkODM4MGM2N2Q1M2Q5ZTAxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljNTA4NDFkNWVjMzQzM2JiNzgxOTVkYjlhMjBiZGVkLnNldENvbnRlbnQoaHRtbF85ZDM3ZjNkMmYzMGE0MzZkODM4MGM2N2Q1M2Q5ZTAxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwYWVhN2I3ODc3YTRlN2JiMDlmZTRkMjQ0ODgyOTU3LmJpbmRQb3B1cChwb3B1cF85YzUwODQxZDVlYzM0MzNiYjc4MTk1ZGI5YTIwYmRlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMDFhYmQ4ZDVlMmU0ZmZkOGEyYzA1MThhYWUwZGU0MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTAyMjY2MjI3ODYsLTEyMi40MTE5ODc2NDM1OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmOWQzMTViYjdmMjRkMDdiMGM1ZWIzZGJkOTBiZTQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1YWU3NjRjMTRlMDQxMmNiYWQxZWQ5M2IzMmY1ZDg2ID0gJCgnPGRpdiBpZD0iaHRtbF9kNWFlNzY0YzE0ZTA0MTJjYmFkMWVkOTNiMzJmNWQ4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZjlkMzE1YmI3ZjI0ZDA3YjBjNWViM2RiZDkwYmU0My5zZXRDb250ZW50KGh0bWxfZDVhZTc2NGMxNGUwNDEyY2JhZDFlZDkzYjMyZjVkODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMDFhYmQ4ZDVlMmU0ZmZkOGEyYzA1MThhYWUwZGU0MS5iaW5kUG9wdXAocG9wdXBfM2Y5ZDMxNWJiN2YyNGQwN2IwYzVlYjNkYmQ5MGJlNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZWRhMWRjZjM3NTJmNDY5MDlhOGUzZThmYjY3YjBmOGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWU1YjFjMjM5ZmQ0NjAyYTJhMzFmY2U3MTJiZGJkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTAyMDNjMTBmNWU0Nzk0ODJmM2Y3ZjlhODNjZjNjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTUwMjAzYzEwZjVlNDc5NDgyZjNmN2Y5YTgzY2YzYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MWU1YjFjMjM5ZmQ0NjAyYTJhMzFmY2U3MTJiZGJkMy5zZXRDb250ZW50KGh0bWxfZTUwMjAzYzEwZjVlNDc5NDgyZjNmN2Y5YTgzY2YzYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZGExZGNmMzc1MmY0NjkwOWE4ZTNlOGZiNjdiMGY4Yy5iaW5kUG9wdXAocG9wdXBfNzFlNWIxYzIzOWZkNDYwMmEyYTMxZmNlNzEyYmRiZDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDNkYzgyZjUzZjQxNGNjMGJiNzMwZGQ3YmFiOWUyNDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMzBkZTYyZjk2NzgzNDM0YThkMDI2MWZlMDEyMWIyNTUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2FiYjJmYThiMzUzNGNlMGJiYTY1YmQ1MzNhMTJjNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVmY2E1MGU2MGM1NGQ3YzgzZDc3NWRiNzc2NDA3MzAgPSAkKCc8ZGl2IGlkPSJodG1sXzM1ZmNhNTBlNjBjNTRkN2M4M2Q3NzVkYjc3NjQwNzMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWJiMmZhOGIzNTM0Y2UwYmJhNjViZDUzM2ExMmM0YS5zZXRDb250ZW50KGh0bWxfMzVmY2E1MGU2MGM1NGQ3YzgzZDc3NWRiNzc2NDA3MzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wM2RjODJmNTNmNDE0Y2MwYmI3MzBkZDdiYWI5ZTI0MC5iaW5kUG9wdXAocG9wdXBfM2FiYjJmYThiMzUzNGNlMGJiYTY1YmQ1MzNhMTJjNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGFlZWZhMWYyOGVmNGE0ZGJiOTA0MjkyYTQ4ZWEwMjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkwODQxNzI5MDI4LC0xMjIuNDg2OTI1OTYwMTE0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMjFjODMyYWY3ZDU0NTE1ODUwNWQ4YzQ2MzBjZTY2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjIyNTVjMDViYTI0YjMwYWJlM2I2NTYxMmY5ZTQxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfODIyMjU1YzA1YmEyNGIzMGFiZTNiNjU2MTJmOWU0MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjFjODMyYWY3ZDU0NTE1ODUwNWQ4YzQ2MzBjZTY2NC5zZXRDb250ZW50KGh0bWxfODIyMjU1YzA1YmEyNGIzMGFiZTNiNjU2MTJmOWU0MTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YWVlZmExZjI4ZWY0YTRkYmI5MDQyOTJhNDhlYTAyNC5iaW5kUG9wdXAocG9wdXBfZjIxYzgzMmFmN2Q1NDUxNTg1MDVkOGM0NjMwY2U2NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTdlOTYwY2E0N2QzNDgzNzgyZjNkNDI1MDVkYWJhMWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njg1MzYwMTIzNTgzLC0xMjIuNDE1NjE2MzM4MzE5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWI3YTQ5MjA4MzQ0ZmM4OWZlM2UzZGVkZjY3ODBlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMmEyYTUzM2VjY2E0MjdjYjMxNWU5ZTA2NTc4MzVlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDJhMmE1MzNlY2NhNDI3Y2IzMTVlOWUwNjU3ODM1ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTFiN2E0OTIwODM0NGZjODlmZTNlM2RlZGY2NzgwZWQuc2V0Q29udGVudChodG1sX2QyYTJhNTMzZWNjYTQyN2NiMzE1ZTllMDY1NzgzNWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTdlOTYwY2E0N2QzNDgzNzgyZjNkNDI1MDVkYWJhMWQuYmluZFBvcHVwKHBvcHVwX2ExYjdhNDkyMDgzNDRmYzg5ZmUzZTNkZWRmNjc4MGVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M5NWI5ZWEzNjQ4YTQwMTM5Mzc0MjgxOWI4YzgyMGZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5ZTZmMTY0MGI0ZDRhNTM4NzRkNDc4OWVhNGQzMGY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3NzE0MGFhYmM4ODQ1YzQ4ZTNiMjhjZmRjNjI4YmJlID0gJCgnPGRpdiBpZD0iaHRtbF80NzcxNDBhYWJjODg0NWM0OGUzYjI4Y2ZkYzYyOGJiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5ZTZmMTY0MGI0ZDRhNTM4NzRkNDc4OWVhNGQzMGY5LnNldENvbnRlbnQoaHRtbF80NzcxNDBhYWJjODg0NWM0OGUzYjI4Y2ZkYzYyOGJiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M5NWI5ZWEzNjQ4YTQwMTM5Mzc0MjgxOWI4YzgyMGZkLmJpbmRQb3B1cChwb3B1cF9lOWU2ZjE2NDBiNGQ0YTUzODc0ZDQ3ODllYTRkMzBmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMzliOGY0ZWIzNTg0MmZkYTkxYzM4MzM1NzIwYWIwMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTU1MjU2YWNjNzI0NzFiODhiZGJjODE2NWZjNDYzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDAxOGU2MjIyMTA0ZDhkYWNiMTFhMzg1MDZiMTQ3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQwMThlNjIyMjEwNGQ4ZGFjYjExYTM4NTA2YjE0N2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NTUyNTZhY2M3MjQ3MWI4OGJkYmM4MTY1ZmM0NjMyLnNldENvbnRlbnQoaHRtbF9mNDAxOGU2MjIyMTA0ZDhkYWNiMTFhMzg1MDZiMTQ3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EzOWI4ZjRlYjM1ODQyZmRhOTFjMzgzMzU3MjBhYjAxLmJpbmRQb3B1cChwb3B1cF8xNTU1MjU2YWNjNzI0NzFiODhiZGJjODE2NWZjNDYzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mN2JiNzExMTg5NTQ0Nzg2ODNlZjJkYWJlZDYwNDE5NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTI2ODE0NjkwODM5NiwtMTIyLjQ3MjcxNTc1OTYzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzMwZGU2MmY5Njc4MzQzNGE4ZDAyNjFmZTAxMjFiMjU1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmMmRkMDkzYTQ2NDQxODc4ZWE5ZjNhYTQ0MzUwYTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZDgxYjYyMjExYjRhMTI4ZDBmMjYwZGVmYjVlY2JkID0gJCgnPGRpdiBpZD0iaHRtbF9lN2Q4MWI2MjIxMWI0YTEyOGQwZjI2MGRlZmI1ZWNiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWYyZGQwOTNhNDY0NDE4NzhlYTlmM2FhNDQzNTBhNTIuc2V0Q29udGVudChodG1sX2U3ZDgxYjYyMjExYjRhMTI4ZDBmMjYwZGVmYjVlY2JkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjdiYjcxMTE4OTU0NDc4NjgzZWYyZGFiZWQ2MDQxOTQuYmluZFBvcHVwKHBvcHVwXzlmMmRkMDkzYTQ2NDQxODc4ZWE5ZjNhYTQ0MzUwYTUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMGRlNjJmOTY3ODM0MzRhOGQwMjYxZmUwMTIxYjI1NSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjUwNGYxZmQ1OWFhNDI4YjkxNmFmODc0OTczNTRhNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyNDhlOTdkYzgxZTQ4YWM4ZGVhYzE4NzgyNGQ5YWIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNDkzMjQwYzNlYjU0ZDE5YmI1ZmYxZGNjODlkOWZkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiNDhhZDZiZWMxNTQ1NjhiODFjYjRkNzE2NmYzYWYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTUyYjljMDViOTg0NzhiYmY3M2VhNjE1MGIwODEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTEzMTMzYzZhNzg0NTlhYTE4MTVjNDFkOGZlNGYzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2Q5OTk3ZjMzNzE2NDM4NGI0ZWZjYWMzOTA3NDMxMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTg5Y2E4OGVmNTY2NDY1Nzg3NjNlYTNiNDJmNWIxNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjExZGUzMmRkNzU0NGFlNzgwMmJmODAxZDlhNTQzNzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjYyNDA2MjQxOTY0M2I1ODhhOTdjOGUwMzJiNDI1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzY4ODM5M2RhMDc0Y2UwYjAyZjcxNjg3ZjIyNzU0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY3MGQxNzlmYTkxNDA1NmE0ODBkMjQzZWFjZWFkNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGE0M2ExZjQ3NWI0ZTUyYWI5ZGVkYmVhYTIxYWUzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjkxYzIzYWFlMGFhNDhjNmFmNTQxYmMzY2E2MWM3YjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjc5NThiMWIzMjA2NDg3OGE4ZDYwMGZkYTI3YzAwNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1MTA3MjljZGQwNjRmZDZhY2E2M2IxNjQwODBjM2VmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmMjA3MzliMmU2YTRhZjBiNTFiZjg2ODg5ZGQ3YWMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE2OGZlYjFhOThlNGMzNThkNjQ0NTI4NjJhMWEyZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lN2ExODA1ZmMxMjE0YTJmOTRkY2RmNDRhZDEwNjI1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxZjJiOTMxNGVjNDRmNjM4YTE4YTI3OTRmNTIwMWU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxZDVhODg4YTliMjQ5Njc4Njg4MjY2NWEwZTc3ODNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWRmOGMwZjNkODAwNGU2YTkwNDg5ZjM0ZTA3OGJhNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzZWNjMmQ0Y2Y2YTQ0YjY5MzQyYTNmOTRhYTBmZDc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYThkMWE2OTM4Zjk0ZmNhODBkMmU4Y2VmZWFkNmY3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmI3ODg2MWQyNGVmNGYxMGFhOTNlNTA5ZGE1ODQ5ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNjUwNmRkOTJhNjE0NDFkOTY2NTY4YjQ1NmIwMzZjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjllYmI2YzM4YmVjNDI0NDhlNmUyOTFiMGQ2N2U2MzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGJkMTBiZjZhNTFkNDc3ZTk4OWI0NmNiMTk1ZThmNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzUwOTMyNjJlZTZmNGU0ZjgyNWUwY2ZjZmQ0NWY1N2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDRkYWFhZTQyNDk0NWE0YTVlNWQ2YzEzYjViZGY1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMmY4OWNmODNmZmM0ZDRjOTgyNzQzODQ5MjhlYTRhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhZjM2NGUyOTFkZTRjYjU4YTNhMGNmNzY2NmEyZmFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhYmY5N2ExYjNkMTRiMTBhMGJhODhmM2ZlNDM1NzU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3NTRkYmJmNDNjYjRiYjJhNGRiZTFhNDk0NWQ5Yjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYTgyNWQ1YWY5MTRlZjRiOWQwN2U0YmFlNTEwNDU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2NiNDQ5NjVlZTA1NGE5M2JiNmUzOGRhNjU4NTA1YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YjUyOTU2NWQ2NWI0ZDYzOGI4MGJjYzRkZWRiOTg0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5Zjg3OWQxZWYzZjQ3ZmU5MjE2ODAwYTJkMTIxZDZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4ZGE2MzBkM2YzMzRkYjJiMWYyMjBjMDZjNGJjYjlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjdlMTg5MjgzNjRjNGMyMThjMjI5ZmYzMDk2NTdiNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODFkN2EzZjMxN2Y0NjBlOTcwN2JlNzQ4NWI4YjNjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWI0M2U1N2QxNzQ0NThiYjU5ZTMwODc1MGIxMWFjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MzRhN2U5ZGQ4YTI0YWI2YmNjZjNkMjc1ZTFjYmNmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTViN2RiZGIxYjA0YzVlYmYwYjUwYjIwMzU0YmY4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWUzZDQwMTFkYmM0NDA5OThkNzg2NTY5ZTg5NTQwMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjE0OWRmNTc3OTQ0NTNmOGI4NGI0ODUxOGNkNjlkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiYzg4MmZiYTgwZjRmM2E4YWI2NjE0YjkzMDdmMDEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzYTBhNzNkYTBmYTQ5OWZiYjQ2NjJlNjI2NDE4YWFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlYWRiMzAwOTBjYjRkNTQ4NTYwZTg2ZmI5YjNmZGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0NTRjNjQwYzM0YTQxNjQ5YzA1NzQ5N2ZkNDYzN2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyYjQ1NDM5MzlkMDQ0ZmFiOGNlZjgxMTdhMWEyMjNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmEzM2U3OWM1ZDViNGU4ZDhlMzQ2YTc1MTYzNTNiMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZDg3YjEwZGY0YmI0OTc3OGRhNjcyZDM3Njc3NjBkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDAzYjkwZjhjMmE0MWQ4OGM2ZmQ3YWYxYzc5OGZhOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NmU4Y2RkOWI0OTg0NDE1OWMwZDRjMjQ2ZTZjNGU3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkNmQ5NjNmMjU4OTQyOGE4YjIwOWNhNTE5YmQ4ZDRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmYTY3YWFkZTZmNDQ4OWE4MGE2YTc0ZmM4MmM4ZjQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTY4YWNlMTQ2ZDBkNGQ1OGE3MTQ3OGMzMzhjYWYwYWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODAwNzQ0ZjE5ODRkNGNhMjgxNGU3NDQyOGVhNjY2N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZjg4MzhiMTE5NTRiNmNhZmVkMTJlZTNjNThlYjAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODMxYmE4MzAyN2Q0MWVjOTYyM2ExMGM1ZGI2OTQ0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjM5MGI2NjZmM2I0NGU5NWJhYjFiMTk2Y2UyOThlMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjA2NDcyZTEzYjc3NDkyODhmNDRmMDVkNzcyOWYxZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTc1NzY1YzViZTIyNGJmZGFmMzgzNmFiZDFlYTc4ZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjY5ZDEyM2Y1M2E2NDhkNDlkNTNiZmZlMmJhNTU3MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYwNTI3Nzg0YjIyNDdjYzhkMDA3YzA2NGNjMDNlNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZjA0MTI0YzI1YTA0ZTUyYWM5Y2VmZmI5ZTA0YTRlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzE2ZjE5YTE3ZDk0NTU1Yjc3YTA1ZjI1MTdmZmVhMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZjODhkMWRiYTNhNjQ1NjJiMzI0ODM2MDUzMWIxZmYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3YzQzMTkxOTMzNzQ4NDY5ZGIyYjZiMTQ3NjAxMmI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkZTkwMGRlNWU1ZDQ5MGFhZTI4YWY2NTJlYmQ3OWEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTgxNzM1NTMwZmY0ZmE4ODUxODU0ZDk1M2IzYmRlNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdkNzM5YjIxMjlhNDFhYWFmOGIxMzliNTExMjYzYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NDAxZDU5Nzk3NTQ1YjBiY2ZmMTU1MzU1ZjMyNjIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWFlN2E2ZjIxY2RmNGUxZjlkMzE5Yzg4NmE4ZWFjYjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2M0OWVjYTcwMTBjNGM1ZmJkYTU2MGEzNmJjZjliOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZjJmOTI5MmY0YTU0ZDZiYmJlNGQ5ODQxYWQzZmVjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjM2ODlkNTk4NjhiNGEyY2E1N2ZkMmMxZmFjNTg5ZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmMjk3NDgzYzA3NDQ1ZjJiNWQ0MWFiMzBhZTJmYmQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzc0MDJhNTk1OTI0MDEyOTNiZjAxMmI5ODY2ODQyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5YmQzZjUzZmEwYTQ2MDRiZDMzOTEwMWM2Zjk3MTg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxZWRkMzhiYjU0OTQ5ZjJiMjM5YWUxNGZkNWYwYzE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1ZmY0NDIwMWZlYzQ0ZDc5N2I2ZmE2YjdlNDlhMjFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTM1ZmFmMDI2Yjc0MWU1YWI1NTZiYTc4YzM5ZjdkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzZjUyMDljNTQzYTRmYzE5ZjFhNDRhMTA3ODMyNWQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0N2Q1MzYxZjUyZTQ0NWFiMjMzNGJkM2U4OWU3M2IxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyZDIwN2VmNzlkMTRlYzA4ZjVmZDNlZjBiNWNjNGRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZTc5YzQ4MzU3NDQ0MWFiYjQwYTA0ZmYzYzBiZmVkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYjExMWI3OGY0ZjU0ZDBkOTk4MzQ5ZjZlM2IyYWUwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3OGUyMWI3MjZhZTQzMmZiYzk1ZjZiYzBiMWMzZTNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDk0OTdjNTdmZmY2NGVhOWI5NDc1NTc3NGQ4ZmU2OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wOGE0ZGM3ODBhMDc0NDdhOTY5NmUzZGI2ZWNhZGYwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiYTYxMDhhODhiNTRhZjU4NDA4OThmYTgxZDc0Zjk3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjAzNmVjMGUxNjk4NGMwNThlYjhkYTY3ZmMzNzM5NDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTEzYWQ5Nzk4ZGQ0Mzg1YWVhYThlZTY4NzAyN2U3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODUwMmY3ZTM4YzM0M2YxYWQ5MGM1ODE5ZmM1YzFjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF82YjlmODJiOWFkYTg0ZmI5YjhjZjEzOTlkZTdkMTA3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyZmY1M2IxMDI2MDRhNTU4MTBjMmVjODkwYzg2MTBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTkyZjdkMTQ0YmVjNDM3YWJmMzRhNGNmMDJiMGIxYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTcwYjdhMTFjMTU5NGUzMmFmNjBjYmU0MWI3MGUwOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzZiOWY4MmI5YWRhODRmYjliOGNmMTM5OWRlN2QxMDdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjRhNzlmMjM0Njg0NDc3NThlOGQ1MGYxODUyZTM2YjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfNmI5ZjgyYjlhZGE4NGZiOWI4Y2YxMzk5ZGU3ZDEwN2MpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc20164dd30>" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# instantiate a feature group for the incidents in the dataframe\n", | |
"incidents = folium.map.FeatureGroup()\n", | |
"\n", | |
"# loop through the 100 crimes and add each to the incidents feature group\n", | |
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n", | |
" incidents.add_child(\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5, # define how big you want the circle markers to be\n", | |
" color='yellow',\n", | |
" fill=True,\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" )\n", | |
" )\n", | |
"\n", | |
"# add pop-up text to each marker on the map\n", | |
"latitudes = list(df_incidents.Y)\n", | |
"longitudes = list(df_incidents.X)\n", | |
"labels = list(df_incidents.Category)\n", | |
"\n", | |
"for lat, lng, label in zip(latitudes, longitudes, labels):\n", | |
" folium.Marker([lat, lng], popup=label).add_to(sanfran_map) \n", | |
" \n", | |
"# add incidents to map\n", | |
"sanfran_map.add_child(incidents)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Isn't this really cool? Now you are able to know what crime category occurred at each marker.\n", | |
"\n", | |
"If you find the map to be so congested will all these markers, there are two remedies to this problem. The simpler solution is to remove these location markers and just add the text to the circle markers themselves as follows:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3YyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3YycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOWJiYTRiNWMyYzllNDlkMTlmMWE2OTlhZDNkMjVjOGYgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyOGMwZDY3YjkzNTQxZDZiYTllODgwNjYyMGQ5NmI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOGFhOWMyNjk5ODQ0Mjg2YTM0MzQwMjMzYzU2YmZkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjc1MGVmMTMzYmI0YzVjYWZlZTU1ZDhhZGE4MTExMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTI3NTBlZjEzM2JiNGM1Y2FmZWU1NWQ4YWRhODExMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOGFhOWMyNjk5ODQ0Mjg2YTM0MzQwMjMzYzU2YmZkMi5zZXRDb250ZW50KGh0bWxfZTI3NTBlZjEzM2JiNGM1Y2FmZWU1NWQ4YWRhODExMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI4YzBkNjdiOTM1NDFkNmJhOWU4ODA2NjIwZDk2YjkuYmluZFBvcHVwKHBvcHVwXzI4YWE5YzI2OTk4NDQyODZhMzQzNDAyMzNjNTZiZmQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkM2EwYmNlNDliYTRiMTU5N2E4MWI0NjZhMjRkMjQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzgyNTA5ODIzMjY0YWUzYmRmZGYyYzQ5YzY2M2JmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMWIzMTY4N2E1ZTI0ZTNkOTU3ZDY4NjNhZGQ4Yzk4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjFiMzE2ODdhNWUyNGUzZDk1N2Q2ODYzYWRkOGM5ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzgyNTA5ODIzMjY0YWUzYmRmZGYyYzQ5YzY2M2JmMi5zZXRDb250ZW50KGh0bWxfZjFiMzE2ODdhNWUyNGUzZDk1N2Q2ODYzYWRkOGM5ODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2QzYTBiY2U0OWJhNGIxNTk3YTgxYjQ2NmEyNGQyNDkuYmluZFBvcHVwKHBvcHVwX2JjODI1MDk4MjMyNjRhZTNiZGZkZjJjNDljNjYzYmYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0OThmM2FmODUyNzQ5ZTg5OTBkZTZlYzg1NzJlZGU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5OTgwOTY3Mjk5NTk2LC0xMjIuMzg4ODU2MjA0MjkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWYxNWNhMzNlOTdlNDZhMjlmYzc0M2VhMWFhMTk3NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBmZTkzN2M1MDFiNDY4OGI5NGRjZWU1NjBlOTI2MmMgPSAkKCc8ZGl2IGlkPSJodG1sX2MwZmU5MzdjNTAxYjQ2ODhiOTRkY2VlNTYwZTkyNjJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWYxNWNhMzNlOTdlNDZhMjlmYzc0M2VhMWFhMTk3NWUuc2V0Q29udGVudChodG1sX2MwZmU5MzdjNTAxYjQ2ODhiOTRkY2VlNTYwZTkyNjJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0OThmM2FmODUyNzQ5ZTg5OTBkZTZlYzg1NzJlZGU3LmJpbmRQb3B1cChwb3B1cF8xZjE1Y2EzM2U5N2U0NmEyOWZjNzQzZWExYWExOTc1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMGU5NmY3NjQ5NTI0NmVhODkwNDc3OTliMjZhNzVmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTc4ODM3NjY4ODc5LC0xMjIuNDEyOTcwNTM3NTkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTE3YmI5MzUyY2RkNGE4Y2I5YjUxNmQwOTcxYzkyZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTQ3M2VmOTRmNDZiNDAxYzhkOGNkNGM0ZmMxNjE0MjYgPSAkKCc8ZGl2IGlkPSJodG1sX2U0NzNlZjk0ZjQ2YjQwMWM4ZDhjZDRjNGZjMTYxNDI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxN2JiOTM1MmNkZDRhOGNiOWI1MTZkMDk3MWM5MmVhLnNldENvbnRlbnQoaHRtbF9lNDczZWY5NGY0NmI0MDFjOGQ4Y2Q0YzRmYzE2MTQyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMGU5NmY3NjQ5NTI0NmVhODkwNDc3OTliMjZhNzVmMi5iaW5kUG9wdXAocG9wdXBfZTE3YmI5MzUyY2RkNGE4Y2I5YjUxNmQwOTcxYzkyZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTUwNGM0YzM0ZTg5NDA2MjhkYjEwZmU4MmZlMTRmMTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2YzZjcwOTQ2NDQ5NDMzZThmNDBiZDUxMGQyNGUxOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDJhNzgyYzBiY2E0NDIyYmE5ZDkxMDMwOTQ3MDUwOWIgPSAkKCc8ZGl2IGlkPSJodG1sX2QyYTc4MmMwYmNhNDQyMmJhOWQ5MTAzMDk0NzA1MDliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmM2Y3MDk0NjQ0OTQzM2U4ZjQwYmQ1MTBkMjRlMTliLnNldENvbnRlbnQoaHRtbF9kMmE3ODJjMGJjYTQ0MjJiYTlkOTEwMzA5NDcwNTA5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTA0YzRjMzRlODk0MDYyOGRiMTBmZTgyZmUxNGYxNy5iaW5kUG9wdXAocG9wdXBfM2YzZjcwOTQ2NDQ5NDMzZThmNDBiZDUxMGQyNGUxOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThhZmE3MmY4NTUzNGQyNjlhMzI4Yzk1NGNkMTkwNGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMTg1NTU4MjksLTEyMi40MjYwNzcxNzczNzQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxMjEyNDlmMjNiMzQxYWNiMWJlNWM4ZmFkY2YzOWU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliZmI1ODFhMzY1MzRkZDhhMGYzMDY2ZmM3YjM4NjVhID0gJCgnPGRpdiBpZD0iaHRtbF85YmZiNTgxYTM2NTM0ZGQ4YTBmMzA2NmZjN2IzODY1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODEyMTI0OWYyM2IzNDFhY2IxYmU1YzhmYWRjZjM5ZTkuc2V0Q29udGVudChodG1sXzliZmI1ODFhMzY1MzRkZDhhMGYzMDY2ZmM3YjM4NjVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4YWZhNzJmODU1MzRkMjY5YTMyOGM5NTRjZDE5MDRmLmJpbmRQb3B1cChwb3B1cF84MTIxMjQ5ZjIzYjM0MWFjYjFiZTVjOGZhZGNmMzllOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZWE5OTU5NjYzOTI0NDNlOTAyMGZjY2NlOTA2ZWY1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDg3ODkzNjAyMTQsLTEyMi40MDU3MjE0NTQ1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMWYzZDU3ZmUwMmY0NmI2OTZkZmE0NGIyNGIyMDk4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZWQzNGQ2MDE5ZjI0YWI4OGYxZjk3YjkyZmU1OTIxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWVkMzRkNjAxOWYyNGFiODhmMWY5N2I5MmZlNTkyMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMWYzZDU3ZmUwMmY0NmI2OTZkZmE0NGIyNGIyMDk4YS5zZXRDb250ZW50KGh0bWxfOWVkMzRkNjAxOWYyNGFiODhmMWY5N2I5MmZlNTkyMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2VhOTk1OTY2MzkyNDQzZTkwMjBmY2NjZTkwNmVmNWUuYmluZFBvcHVwKHBvcHVwX2IxZjNkNTdmZTAyZjQ2YjY5NmRmYTQ0YjI0YjIwOThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2ZjQyZjgwZTQ0ZjQwMzNhMzg1ODliZDA2Yzg0NWY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhNDNlOTMwMGNmYjQxMzVhNmZlMTFmMWQzOTNkYjE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjYmI3ZDA5YjllMTQ3ZWZhYzY1MjRiN2FlMjU0ZTcwID0gJCgnPGRpdiBpZD0iaHRtbF9jY2JiN2QwOWI5ZTE0N2VmYWM2NTI0YjdhZTI1NGU3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTQzZTkzMDBjZmI0MTM1YTZmZTExZjFkMzkzZGIxNi5zZXRDb250ZW50KGh0bWxfY2NiYjdkMDliOWUxNDdlZmFjNjUyNGI3YWUyNTRlNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTZmNDJmODBlNDRmNDAzM2EzODU4OWJkMDZjODQ1ZjYuYmluZFBvcHVwKHBvcHVwX2ZhNDNlOTMwMGNmYjQxMzVhNmZlMTFmMWQzOTNkYjE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjNzZmMTE0MGFhZDQ3OWNhZjUzZGYxMjFhN2IyYTIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1Nzg3NjIxODI5Mjk1LC0xMjIuMzkzMzU3MjQxNDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjAwNDU5YTc3NGQwNDA0YzllNmFlY2U3NzFlMDg5NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTYxYmQyZWY0NWMyNGNjYTllZjQ5Y2I4MzBhZDJkZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzE2MWJkMmVmNDVjMjRjY2E5ZWY0OWNiODMwYWQyZGQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjAwNDU5YTc3NGQwNDA0YzllNmFlY2U3NzFlMDg5NGEuc2V0Q29udGVudChodG1sXzE2MWJkMmVmNDVjMjRjY2E5ZWY0OWNiODMwYWQyZGQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjNzZmMTE0MGFhZDQ3OWNhZjUzZGYxMjFhN2IyYTIyLmJpbmRQb3B1cChwb3B1cF8yMDA0NTlhNzc0ZDA0MDRjOWU2YWVjZTc3MWUwODk0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kN2E1OTQ0NzZiY2I0MDMzODlmYWFkZWExYjllZjQ3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODFiMzFkYzc0ODI0YjkzYWUwMWQ0MjRkY2VmNzY5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMWFkZGQyNTQ4YTM0MGM1ODdmNmE5MTBmNDIyY2VkMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDFhZGRkMjU0OGEzNDBjNTg3ZjZhOTEwZjQyMmNlZDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODFiMzFkYzc0ODI0YjkzYWUwMWQ0MjRkY2VmNzY5Ny5zZXRDb250ZW50KGh0bWxfZDFhZGRkMjU0OGEzNDBjNTg3ZjZhOTEwZjQyMmNlZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDdhNTk0NDc2YmNiNDAzMzg5ZmFhZGVhMWI5ZWY0N2QuYmluZFBvcHVwKHBvcHVwXzU4MWIzMWRjNzQ4MjRiOTNhZTAxZDQyNGRjZWY3Njk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2MTJlZjQzNmI1NTQ0NzdhMzc2Y2Y5Mjg1ZmQ4MGY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80N2RjYzY0M2VhNWM0Njk2YWNlNWMzZmViNTBmNzBiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjYwZWJkMjZjMWQ0MGI3YWU2OGRhZWUzZDE1MmM1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY2MGViZDI2YzFkNDBiN2FlNjhkYWVlM2QxNTJjNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3ZGNjNjQzZWE1YzQ2OTZhY2U1YzNmZWI1MGY3MGI0LnNldENvbnRlbnQoaHRtbF9jNjYwZWJkMjZjMWQ0MGI3YWU2OGRhZWUzZDE1MmM1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjEyZWY0MzZiNTU0NDc3YTM3NmNmOTI4NWZkODBmNC5iaW5kUG9wdXAocG9wdXBfNDdkY2M2NDNlYTVjNDY5NmFjZTVjM2ZlYjUwZjcwYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWZlYWFmYmIyODE3NDk0Y2I2ZmNiZDVjYjBlYjJkMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NTkwYTk0NzhhNTQ0ODRhOGRjMWQxNjJhYTIxNmU2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTI4ZGQ4OWM5MTI0Mjk4OTViNGM3NWQyOGNlMGZlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTUyOGRkODljOTEyNDI5ODk1YjRjNzVkMjhjZTBmZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODU5MGE5NDc4YTU0NDg0YThkYzFkMTYyYWEyMTZlNjcuc2V0Q29udGVudChodG1sX2U1MjhkZDg5YzkxMjQyOTg5NWI0Yzc1ZDI4Y2UwZmU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmZWFhZmJiMjgxNzQ5NGNiNmZjYmQ1Y2IwZWIyZDEwLmJpbmRQb3B1cChwb3B1cF84NTkwYTk0NzhhNTQ0ODRhOGRjMWQxNjJhYTIxNmU2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYjQ3OWU4N2IyMDY0MzY3OGY4ZjUxNThiODQ1MzFiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWJjZTYyYzZkZDZiNGE0ODgyZmI1MzM4MGUyMTNmODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmJlNWE2NzVkNDMyNDQxNzk5NjdmOGQ5ZjMwNGNmNDYgPSAkKCc8ZGl2IGlkPSJodG1sX2JiZTVhNjc1ZDQzMjQ0MTc5OTY3ZjhkOWYzMDRjZjQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWJjZTYyYzZkZDZiNGE0ODgyZmI1MzM4MGUyMTNmODYuc2V0Q29udGVudChodG1sX2JiZTVhNjc1ZDQzMjQ0MTc5OTY3ZjhkOWYzMDRjZjQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiNDc5ZTg3YjIwNjQzNjc4ZjhmNTE1OGI4NDUzMWIzLmJpbmRQb3B1cChwb3B1cF9lYmNlNjJjNmRkNmI0YTQ4ODJmYjUzMzgwZTIxM2Y4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNDBjYzlhZDM2YjM0ZWE1OTgyMzhiODk2ZTg4MDU2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzI1MTBmZjJhZTY0NmMwYjJlYzFkOWVmMTk2NDVlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YWJmNWNmYjc0MGQ0NDg1YTJmNDViMzM3NjI5ZjgxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWFiZjVjZmI3NDBkNDQ4NWEyZjQ1YjMzNzYyOWY4MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzMjUxMGZmMmFlNjQ2YzBiMmVjMWQ5ZWYxOTY0NWVlLnNldENvbnRlbnQoaHRtbF81YWJmNWNmYjc0MGQ0NDg1YTJmNDViMzM3NjI5ZjgxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNDBjYzlhZDM2YjM0ZWE1OTgyMzhiODk2ZTg4MDU2YS5iaW5kUG9wdXAocG9wdXBfMTMyNTEwZmYyYWU2NDZjMGIyZWMxZDllZjE5NjQ1ZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWEyNWNhYWNlYmEyNDVlMGFmNGYwMWRjMzQ1NWJkYmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmYjA2OTEyZTkwZDRjZTc4YTJkYmMxZGIxOGJjOTk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwZjI1YTc0NzYyNzQ4M2M5MDY0MDY2ZDVjMzIzY2MxID0gJCgnPGRpdiBpZD0iaHRtbF8wMGYyNWE3NDc2Mjc0ODNjOTA2NDA2NmQ1YzMyM2NjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmYjA2OTEyZTkwZDRjZTc4YTJkYmMxZGIxOGJjOTk2LnNldENvbnRlbnQoaHRtbF8wMGYyNWE3NDc2Mjc0ODNjOTA2NDA2NmQ1YzMyM2NjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTI1Y2FhY2ViYTI0NWUwYWY0ZjAxZGMzNDU1YmRiYS5iaW5kUG9wdXAocG9wdXBfNmZiMDY5MTJlOTBkNGNlNzhhMmRiYzFkYjE4YmM5OTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmVjY2FhYmIzMzgzNDgxYjgyNzgwZjQ1MmVmZWEwZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM3MDY5MzAxNTQ1LC0xMjIuNDA4NTk1MTEwODY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTZiNTZlYmJiYjBhNDBmNDk3ZjRhM2E3YmZiMjRkMzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzA3ZmU5MGFjMWFiNGI3NjgyZGUwYjY3YWEzYzg3MmEgPSAkKCc8ZGl2IGlkPSJodG1sXzMwN2ZlOTBhYzFhYjRiNzY4MmRlMGI2N2FhM2M4NzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVE9MRU4gUFJPUEVSVFk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2YjU2ZWJiYmIwYTQwZjQ5N2Y0YTNhN2JmYjI0ZDM5LnNldENvbnRlbnQoaHRtbF8zMDdmZTkwYWMxYWI0Yjc2ODJkZTBiNjdhYTNjODcyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZWNjYWFiYjMzODM0ODFiODI3ODBmNDUyZWZlYTBkYy5iaW5kUG9wdXAocG9wdXBfOTZiNTZlYmJiYjBhNDBmNDk3ZjRhM2E3YmZiMjRkMzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjEwYTNlNWNjODk5NDYwMjhjZmE4MmVkZTBjZjBiZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOWI5MzkyNzM5ZDc0NDI2OTlmZGQ4MThiODE1NjIxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjdlNDllZGZkYjQ0NTFkYjMxNTM3NzA5ZWU1Mzk0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfODI3ZTQ5ZWRmZGI0NDUxZGIzMTUzNzcwOWVlNTM5NGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5YjkzOTI3MzlkNzQ0MjY5OWZkZDgxOGI4MTU2MjFhLnNldENvbnRlbnQoaHRtbF84MjdlNDllZGZkYjQ0NTFkYjMxNTM3NzA5ZWU1Mzk0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTBhM2U1Y2M4OTk0NjAyOGNmYTgyZWRlMGNmMGJlNi5iaW5kUG9wdXAocG9wdXBfYjliOTM5MjczOWQ3NDQyNjk5ZmRkODE4YjgxNTYyMWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzQ0MDc5MDZkOWM1NGQ0NDk1Y2I0ZDBhMDgyODRmZmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZmYzNWI5MGMxMjI0NzNkYWVmMmE0ZTM5OTVmZDRkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWVmMGQzMWJmNGU0NGQwOWYyZDRkMjlkNmRhNWY2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FlZjBkMzFiZjRlNDRkMDlmMmQ0ZDI5ZDZkYTVmNmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmZjM1YjkwYzEyMjQ3M2RhZWYyYTRlMzk5NWZkNGRmLnNldENvbnRlbnQoaHRtbF9jYWVmMGQzMWJmNGU0NGQwOWYyZDRkMjlkNmRhNWY2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNDQwNzkwNmQ5YzU0ZDQ0OTVjYjRkMGEwODI4NGZmZC5iaW5kUG9wdXAocG9wdXBfZGZmMzViOTBjMTIyNDczZGFlZjJhNGUzOTk1ZmQ0ZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmJlNzNkOTdiY2Q3NDA5MDhhMDkzZTc5MDZhZTAxNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTU3NjU0MjY5OTUsLTEyMi40Mzk5MDk3NjY3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTI2MTc0ZjE2MDM0NWQ3YjAwMzU2OGIzZDUyYmRkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOWIzMWQwNmUzMTU0OTc4ODAxMDAwNDY5NWFkMzc5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTliMzFkMDZlMzE1NDk3ODgwMTAwMDQ2OTVhZDM3OWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MjYxNzRmMTYwMzQ1ZDdiMDAzNTY4YjNkNTJiZGRjLnNldENvbnRlbnQoaHRtbF9hOWIzMWQwNmUzMTU0OTc4ODAxMDAwNDY5NWFkMzc5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YmU3M2Q5N2JjZDc0MDkwOGEwOTNlNzkwNmFlMDE2My5iaW5kUG9wdXAocG9wdXBfYjUyNjE3NGYxNjAzNDVkN2IwMDM1NjhiM2Q1MmJkZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQzNzFkMTA1NzE4NDdjOWFjNzdlOGMzMGZjOTkwM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjkxOGU4NjY0NjZlNDk2NmI0ZDNjNWY1ODg0YjNkYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg0NTM2YzQ3YTQ0NDEyMDgwZGMyOWE2ODRmMzM4NjQgPSAkKCc8ZGl2IGlkPSJodG1sX2E4NDUzNmM0N2E0NDQxMjA4MGRjMjlhNjg0ZjMzODY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTE4ZTg2NjQ2NmU0OTY2YjRkM2M1ZjU4ODRiM2RiZS5zZXRDb250ZW50KGh0bWxfYTg0NTM2YzQ3YTQ0NDEyMDgwZGMyOWE2ODRmMzM4NjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQzNzFkMTA1NzE4NDdjOWFjNzdlOGMzMGZjOTkwM2QuYmluZFBvcHVwKHBvcHVwXzY5MThlODY2NDY2ZTQ5NjZiNGQzYzVmNTg4NGIzZGJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjZGZkMmRlZWI1ZTQ1ZDY5ZTQ3YTQyYzFjZDYwODI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJiYmE4ODE3ZjFlNGUxMWJiN2QzZmE3MWE3MTEwYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjFjMjQyYTE5OTU2NGNlZGI4MWMxNTdlMzZmNTgwOTEgPSAkKCc8ZGl2IGlkPSJodG1sXzIxYzI0MmExOTk1NjRjZWRiODFjMTU3ZTM2ZjU4MDkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDJiYmE4ODE3ZjFlNGUxMWJiN2QzZmE3MWE3MTEwYTEuc2V0Q29udGVudChodG1sXzIxYzI0MmExOTk1NjRjZWRiODFjMTU3ZTM2ZjU4MDkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjZGZkMmRlZWI1ZTQ1ZDY5ZTQ3YTQyYzFjZDYwODI5LmJpbmRQb3B1cChwb3B1cF9kMmJiYTg4MTdmMWU0ZTExYmI3ZDNmYTcxYTcxMTBhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNWI0ZmNhMTBkMWQ0MzdjOTU1ZDkwNmNkYjA0ZmU0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5Mjg0MTI4NDA0NDcwNSwtMTIyLjQyNDUxOTgzNTAwOTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDliYjNiOGU1Y2EyNDg2NTk4ZDRhYTMyOWE5ZWEyNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU1NjkyMTNhMDc0NDI2MWEzMTBmZjY4MWVlZDk5OWMgPSAkKCc8ZGl2IGlkPSJodG1sXzk1NTY5MjEzYTA3NDQyNjFhMzEwZmY2ODFlZWQ5OTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDliYjNiOGU1Y2EyNDg2NTk4ZDRhYTMyOWE5ZWEyNjEuc2V0Q29udGVudChodG1sXzk1NTY5MjEzYTA3NDQyNjFhMzEwZmY2ODFlZWQ5OTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E1YjRmY2ExMGQxZDQzN2M5NTVkOTA2Y2RiMDRmZTRjLmJpbmRQb3B1cChwb3B1cF8wOWJiM2I4ZTVjYTI0ODY1OThkNGFhMzI5YTllYTI2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjhiMzBiZDliODU0MzRmYjZkMzMwNWQ3ZDQ0NjJiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdkOGRjZDI0ZjA0NGJjZGFjYzFkODE1ZWEwYzNhOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYwNTEyYTY4ZjEwNGIyNGJiZDYyNmZmMzFiY2NhODkgPSAkKCc8ZGl2IGlkPSJodG1sXzc2MDUxMmE2OGYxMDRiMjRiYmQ2MjZmZjMxYmNjYTg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jN2Q4ZGNkMjRmMDQ0YmNkYWNjMWQ4MTVlYTBjM2E5Yy5zZXRDb250ZW50KGh0bWxfNzYwNTEyYTY4ZjEwNGIyNGJiZDYyNmZmMzFiY2NhODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWY4YjMwYmQ5Yjg1NDM0ZmI2ZDMzMDVkN2Q0NDYyYjYuYmluZFBvcHVwKHBvcHVwX2M3ZDhkY2QyNGYwNDRiY2RhY2MxZDgxNWVhMGMzYTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzYjM4NTRhOWZjYjRiZTc5OWU3YjFlM2IxZGRhZjU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmI1YjYzOGY0Zjc0OWMyYTUyZDg5NTA4NTU3NjE3MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODViZGViNTUyYjE0OWM5ODJmYTg1YTg5OTk0N2I1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg1YmRlYjU1MmIxNDljOTgyZmE4NWE4OTk5NDdiNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmI1YjYzOGY0Zjc0OWMyYTUyZDg5NTA4NTU3NjE3Mi5zZXRDb250ZW50KGh0bWxfZTg1YmRlYjU1MmIxNDljOTgyZmE4NWE4OTk5NDdiNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDNiMzg1NGE5ZmNiNGJlNzk5ZTdiMWUzYjFkZGFmNTguYmluZFBvcHVwKHBvcHVwX2E2YjViNjM4ZjRmNzQ5YzJhNTJkODk1MDg1NTc2MTcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwNjRmOTMyZDhiODQ3ZjNiOWZkOTBmYTZiN2ZmN2QwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzcxNDkzOTk2OTQxNiwtMTIyLjUwNzc1MDEzMTAwNDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGQ2MTQ3ODc4MDliNDc3Y2IzMzE5ODFlOTE3ODZiZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDMwMjU1ZGFjYjk3NDM2Y2IzMjg5NTFlYzQ1NDNlYzEgPSAkKCc8ZGl2IGlkPSJodG1sXzAzMDI1NWRhY2I5NzQzNmNiMzI4OTUxZWM0NTQzZWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDYxNDc4NzgwOWI0NzdjYjMzMTk4MWU5MTc4NmJmZS5zZXRDb250ZW50KGh0bWxfMDMwMjU1ZGFjYjk3NDM2Y2IzMjg5NTFlYzQ1NDNlYzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjA2NGY5MzJkOGI4NDdmM2I5ZmQ5MGZhNmI3ZmY3ZDAuYmluZFBvcHVwKHBvcHVwXzhkNjE0Nzg3ODA5YjQ3N2NiMzMxOTgxZTkxNzg2YmZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5NGQ1NmNhZDQ0ZTQzZmFhNjgzZmUxMDAyNDZjZDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzI2MzY0MGVlOTk0Njg4YmMwNThhMGRlZDIyYzA4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmEzZWNjNDA5Njc0Yzc2OGRmZDA3NjM3MzcwM2U3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzJhM2VjYzQwOTY3NGM3NjhkZmQwNzYzNzM3MDNlNzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzI2MzY0MGVlOTk0Njg4YmMwNThhMGRlZDIyYzA4YS5zZXRDb250ZW50KGh0bWxfMzJhM2VjYzQwOTY3NGM3NjhkZmQwNzYzNzM3MDNlNzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDk0ZDU2Y2FkNDRlNDNmYWE2ODNmZTEwMDI0NmNkNTguYmluZFBvcHVwKHBvcHVwXzczMjYzNjQwZWU5OTQ2ODhiYzA1OGEwZGVkMjJjMDhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzNzJjOTc0NWVmMjQ2MWRiN2EyOTFlMzlmMTgyODI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NTc1MjMxNzYxNSwtMTIyLjQyNzU2MjU5Njk4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxNzNmNzViMzNiMDRmYmViYWE5ODg1OGI4ZjMyNjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlMWJlM2U1MWE2ZTQ2NDhhNGYzMGExZTdlZDY0NzdhID0gJCgnPGRpdiBpZD0iaHRtbF9jZTFiZTNlNTFhNmU0NjQ4YTRmMzBhMWU3ZWQ2NDc3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxNzNmNzViMzNiMDRmYmViYWE5ODg1OGI4ZjMyNjE3LnNldENvbnRlbnQoaHRtbF9jZTFiZTNlNTFhNmU0NjQ4YTRmMzBhMWU3ZWQ2NDc3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzcyYzk3NDVlZjI0NjFkYjdhMjkxZTM5ZjE4MjgyNC5iaW5kUG9wdXAocG9wdXBfOTE3M2Y3NWIzM2IwNGZiZWJhYTk4ODU4YjhmMzI2MTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjFkZjk3ZTk0YTE0NDU1MWI1ZTk1NzNjNGYwNTBkZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTJjNDRkYTNjZWE3NDAzMWEzN2JmNzU1MWIyN2ZiYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTg1ZWQyYWJmMzVhNDMwZDlkNzkyYjRmOGExMGIwZjcgPSAkKCc8ZGl2IGlkPSJodG1sXzE4NWVkMmFiZjM1YTQzMGQ5ZDc5MmI0ZjhhMTBiMGY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTJjNDRkYTNjZWE3NDAzMWEzN2JmNzU1MWIyN2ZiYzMuc2V0Q29udGVudChodG1sXzE4NWVkMmFiZjM1YTQzMGQ5ZDc5MmI0ZjhhMTBiMGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxZGY5N2U5NGExNDQ1NTFiNWU5NTczYzRmMDUwZGY0LmJpbmRQb3B1cChwb3B1cF85MmM0NGRhM2NlYTc0MDMxYTM3YmY3NTUxYjI3ZmJjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTQ4ZGM0ZjQ1OTE0MDUxODMwZWMzZWUzZGVmYjA4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZmY0ODUyZWE1NDQ3ZmVhYzAwZjU3ZGY3MDI1OGQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwNGI4NGEwZTBmMjQ4N2I4N2U3NDY3OGUwMmEwYWMwID0gJCgnPGRpdiBpZD0iaHRtbF9jMDRiODRhMGUwZjI0ODdiODdlNzQ2NzhlMDJhMGFjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZmY0ODUyZWE1NDQ3ZmVhYzAwZjU3ZGY3MDI1OGQxLnNldENvbnRlbnQoaHRtbF9jMDRiODRhMGUwZjI0ODdiODdlNzQ2NzhlMDJhMGFjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTQ4ZGM0ZjQ1OTE0MDUxODMwZWMzZWUzZGVmYjA4ZC5iaW5kUG9wdXAocG9wdXBfZWRmZjQ4NTJlYTU0NDdmZWFjMDBmNTdkZjcwMjU4ZDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThmMGE0ZTU5ZjZmNDY2Zjg0MzE5YmJiZjFlMTE5MmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MDkyMDEwNDYyMzc5LC0xMjIuNDM0NjA5MjgwMzUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2UwMDY1NWYyNjg0NDQ1M2E5ZGI2YjgzM2E1NjMwYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2NjNzRlYWJkNjZiNDAyMjgwZTBlYjg0YjY2NjQwZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzdjYzc0ZWFiZDY2YjQwMjI4MGUwZWI4NGI2NjY0MGQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlMDA2NTVmMjY4NDQ0NTNhOWRiNmI4MzNhNTYzMGJhLnNldENvbnRlbnQoaHRtbF83Y2M3NGVhYmQ2NmI0MDIyODBlMGViODRiNjY2NDBkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OGYwYTRlNTlmNmY0NjZmODQzMTliYmJmMWUxMTkyZC5iaW5kUG9wdXAocG9wdXBfM2UwMDY1NWYyNjg0NDQ1M2E5ZGI2YjgzM2E1NjMwYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjk0MTIzNjFhYjllNGVhM2JkZjcyZGFjODM2Njc2ZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5MjA5Mzc1NTMyOTUsLTEyMi40MTA4ODI4MjU1NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yODI2YjkyOTMyMDM0OTE2OTRjMTk3MDYzYjVlOGQ0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzVmY2Q3NmEyOGY0NzBmOWI3OWU3NWY5YzRiMDY5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGM1ZmNkNzZhMjhmNDcwZjliNzllNzVmOWM0YjA2OTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZFSElDTEUgVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4MjZiOTI5MzIwMzQ5MTY5NGMxOTcwNjNiNWU4ZDQ4LnNldENvbnRlbnQoaHRtbF9kYzVmY2Q3NmEyOGY0NzBmOWI3OWU3NWY5YzRiMDY5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOTQxMjM2MWFiOWU0ZWEzYmRmNzJkYWM4MzY2NzZlMC5iaW5kUG9wdXAocG9wdXBfMjgyNmI5MjkzMjAzNDkxNjk0YzE5NzA2M2I1ZThkNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjRkMjVlMmYwZDJiNDYzMWJmY2FlOWM0MGQ5ZTljYmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjUxOTJkMWIzYjc1NDVkYjlmMjJkYTBlMjY0OTYxMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBiYmQ4OGU2Y2E3NDg4NWFlMTU1NGE5OGU0NzRhMTkgPSAkKCc8ZGl2IGlkPSJodG1sX2EwYmJkODhlNmNhNzQ4ODVhZTE1NTRhOThlNDc0YTE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNTE5MmQxYjNiNzU0NWRiOWYyMmRhMGUyNjQ5NjExOC5zZXRDb250ZW50KGh0bWxfYTBiYmQ4OGU2Y2E3NDg4NWFlMTU1NGE5OGU0NzRhMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjRkMjVlMmYwZDJiNDYzMWJmY2FlOWM0MGQ5ZTljYmEuYmluZFBvcHVwKHBvcHVwX2Y1MTkyZDFiM2I3NTQ1ZGI5ZjIyZGEwZTI2NDk2MTE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3Zjc0OGVkYTgwZDQ4Y2VhNDQzMzNiZDA4MDc2OTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzNjk4YTVjODU2YzQxMGZiMTQ1ODIzOWVmYWUyMGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyMjBiYjdlNzVlNzQzNTJhYmY2NGM5ODRkMGIyNzNhID0gJCgnPGRpdiBpZD0iaHRtbF80MjIwYmI3ZTc1ZTc0MzUyYWJmNjRjOTg0ZDBiMjczYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM2OThhNWM4NTZjNDEwZmIxNDU4MjM5ZWZhZTIwZjAuc2V0Q29udGVudChodG1sXzQyMjBiYjdlNzVlNzQzNTJhYmY2NGM5ODRkMGIyNzNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3Zjc0OGVkYTgwZDQ4Y2VhNDQzMzNiZDA4MDc2OTBkLmJpbmRQb3B1cChwb3B1cF9lMzY5OGE1Yzg1NmM0MTBmYjE0NTgyMzllZmFlMjBmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wN2U5ZWNhYmY1NmQ0YzVlODQyNTFiZjA5NThlZWY4YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjU2NDc2MDc2ODUsLTEyMi40MDcyNDQwODcwMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYmRjY2ZhYTQxYjQ0MDI2YjkxNTY5Y2FkNDhlY2JkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmYxMzM3NGIwN2Y0M2JkYTAyYjRmM2IwODRhODJhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmZmMTMzNzRiMDdmNDNiZGEwMmI0ZjNiMDg0YTgyYTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiZGNjZmFhNDFiNDQwMjZiOTE1NjljYWQ0OGVjYmRkLnNldENvbnRlbnQoaHRtbF82ZmYxMzM3NGIwN2Y0M2JkYTAyYjRmM2IwODRhODJhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wN2U5ZWNhYmY1NmQ0YzVlODQyNTFiZjA5NThlZWY4Yi5iaW5kUG9wdXAocG9wdXBfMmJkY2NmYWE0MWI0NDAyNmI5MTU2OWNhZDQ4ZWNiZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYxYjk1ZjhiMTQ3NDFlYTk2NGM5NzgzMmI1NDQ4MzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDA0MDMyYWY1MzU0NTM4YmY1OGExZWNmMTUxODYxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNzUwZWZlN2U2MjE0NWIyYTkzZjJjNWQyYjBlZmE1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDc1MGVmZTdlNjIxNDViMmE5M2YyYzVkMmIwZWZhNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDA0MDMyYWY1MzU0NTM4YmY1OGExZWNmMTUxODYxNS5zZXRDb250ZW50KGh0bWxfMDc1MGVmZTdlNjIxNDViMmE5M2YyYzVkMmIwZWZhNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWYxYjk1ZjhiMTQ3NDFlYTk2NGM5NzgzMmI1NDQ4MzMuYmluZFBvcHVwKHBvcHVwX2QwMDQwMzJhZjUzNTQ1MzhiZjU4YTFlY2YxNTE4NjE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5MzY5OWE5YjVjNTQ3NjZhMzc3ODFhMTZkODc3M2EzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzlmMjg0NGQyZjllNGYxZjhkNmM4YzA4NmMwZDg5NTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg2NDgzYTdkZGIwNDgwZDkyOGQ0OTU2Y2IzODZjZTUgPSAkKCc8ZGl2IGlkPSJodG1sX2E4NjQ4M2E3ZGRiMDQ4MGQ5MjhkNDk1NmNiMzg2Y2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzlmMjg0NGQyZjllNGYxZjhkNmM4YzA4NmMwZDg5NTkuc2V0Q29udGVudChodG1sX2E4NjQ4M2E3ZGRiMDQ4MGQ5MjhkNDk1NmNiMzg2Y2U1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5MzY5OWE5YjVjNTQ3NjZhMzc3ODFhMTZkODc3M2EzLmJpbmRQb3B1cChwb3B1cF83OWYyODQ0ZDJmOWU0ZjFmOGQ2YzhjMDg2YzBkODk1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMmExYzUxZmM4ZDU0YTMxYjUzYmQwMGM4Mzk4ZGYwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzMDMzYzc2NDI4MDRhNzA5NTQ5ZDNmYTkwNzIxZTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwZDcwMjY0ZjUzZjQyMzRiMWQ5NDg0YzFhM2VjODIwID0gJCgnPGRpdiBpZD0iaHRtbF9jMGQ3MDI2NGY1M2Y0MjM0YjFkOTQ4NGMxYTNlYzgyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzAzM2M3NjQyODA0YTcwOTU0OWQzZmE5MDcyMWU4Mi5zZXRDb250ZW50KGh0bWxfYzBkNzAyNjRmNTNmNDIzNGIxZDk0ODRjMWEzZWM4MjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTJhMWM1MWZjOGQ1NGEzMWI1M2JkMDBjODM5OGRmMDcuYmluZFBvcHVwKHBvcHVwXzAzMDMzYzc2NDI4MDRhNzA5NTQ5ZDNmYTkwNzIxZTgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZWZhNDk2ZGFhNjQxY2Y5NDZlNTc4M2MyNDU4YjdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4ODA0MjIyYmRkNjQ2NGY5YTJhYWFiYWQ1ZjcyZjAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5ODQ4ZmMzNjhjZTQ1NWFhNGIyZmQ2NzRkOGFkNGJjID0gJCgnPGRpdiBpZD0iaHRtbF8xOTg0OGZjMzY4Y2U0NTVhYTRiMmZkNjc0ZDhhZDRiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODgwNDIyMmJkZDY0NjRmOWEyYWFhYmFkNWY3MmYwMC5zZXRDb250ZW50KGh0bWxfMTk4NDhmYzM2OGNlNDU1YWE0YjJmZDY3NGQ4YWQ0YmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRlZmE0OTZkYWE2NDFjZjk0NmU1NzgzYzI0NThiN2QuYmluZFBvcHVwKHBvcHVwXzM4ODA0MjIyYmRkNjQ2NGY5YTJhYWFiYWQ1ZjcyZjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyZjQ3MTkxMTE0MjRlY2Q4ZTEwZjRmZTI0MDZiZDQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGQ3YzhmNjNiMGIzNDE3ZThlNDlhMDIwOTk5OTk2ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNmZTkzZmQyYTRhNGY0ZGFkNDA3MmM1NTIzOTUxNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzJjZmU5M2ZkMmE0YTRmNGRhZDQwNzJjNTUyMzk1MTZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDdjOGY2M2IwYjM0MTdlOGU0OWEwMjA5OTk5OTZmYy5zZXRDb250ZW50KGh0bWxfMmNmZTkzZmQyYTRhNGY0ZGFkNDA3MmM1NTIzOTUxNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjJmNDcxOTExMTQyNGVjZDhlMTBmNGZlMjQwNmJkNDIuYmluZFBvcHVwKHBvcHVwXzhkN2M4ZjYzYjBiMzQxN2U4ZTQ5YTAyMDk5OTk5NmZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4MmI4MDhjZjA3ODQ4MDI4N2E5MTBiZDE0NDIwMzcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyODUxNzM3NDQ0ODk0LC0xMjIuNDIwOTY3NDQwNTY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDdmODIxNWY1OTZkNDhmYjg2ODhhMWI1YzViNWRhNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODE3ZGQyNGY0N2JjNDY4Mzg4MjI4NjY2M2I5ODk4YjUgPSAkKCc8ZGl2IGlkPSJodG1sXzgxN2RkMjRmNDdiYzQ2ODM4ODIyODY2NjNiOTg5OGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDdmODIxNWY1OTZkNDhmYjg2ODhhMWI1YzViNWRhNmQuc2V0Q29udGVudChodG1sXzgxN2RkMjRmNDdiYzQ2ODM4ODIyODY2NjNiOTg5OGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4MmI4MDhjZjA3ODQ4MDI4N2E5MTBiZDE0NDIwMzcyLmJpbmRQb3B1cChwb3B1cF8wN2Y4MjE1ZjU5NmQ0OGZiODY4OGExYjVjNWI1ZGE2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTk5YWU2ZmYxZTA0YWNmYWUwZTNjZTNlOWM4ZDZiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjY4OTE1MWE5MjI0ZWUwOWJjODRhNzMwNjdkZWUzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTQwYTJhYzUwYjc0ZTg3OWUyMTY1Njk1MzczYzE4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmE0MGEyYWM1MGI3NGU4NzllMjE2NTY5NTM3M2MxODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI2ODkxNTFhOTIyNGVlMDliYzg0YTczMDY3ZGVlM2Yuc2V0Q29udGVudChodG1sXzJhNDBhMmFjNTBiNzRlODc5ZTIxNjU2OTUzNzNjMTgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5OTlhZTZmZjFlMDRhY2ZhZTBlM2NlM2U5YzhkNmIxLmJpbmRQb3B1cChwb3B1cF9iMjY4OTE1MWE5MjI0ZWUwOWJjODRhNzMwNjdkZWUzZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MjNiZTE5YTI3YWY0M2FjYjM0NzdhYTE0NWVlMDk1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MGZkZTY0ZGRlZDY0NmEwYTFjNzJlOWFkYmQ1ZGUxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZGZlNGMxNGMzOWU0N2ZkODlkMjE5ZTVlNDRmMWUzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWRmZTRjMTRjMzllNDdmZDg5ZDIxOWU1ZTQ0ZjFlMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwZmRlNjRkZGVkNjQ2YTBhMWM3MmU5YWRiZDVkZTFkLnNldENvbnRlbnQoaHRtbF85ZGZlNGMxNGMzOWU0N2ZkODlkMjE5ZTVlNDRmMWUzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjNiZTE5YTI3YWY0M2FjYjM0NzdhYTE0NWVlMDk1Ny5iaW5kUG9wdXAocG9wdXBfNTBmZGU2NGRkZWQ2NDZhMGExYzcyZTlhZGJkNWRlMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzgzNTAzNDRlNmJjNDE0MmFjZDcyMDlhNGU5ZTNkYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU3MTg0Mzk1MjgyLC0xMjIuNDA5NTI5OTEzMjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjBiNmJkMGI3NDgyNDU2ZGFlN2IwM2MyNWY4YzE0NjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTllYjYxNTk0MDE0NDFiOWIzZTMxOTUxZjA3Y2FlYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzU5ZWI2MTU5NDAxNDQxYjliM2UzMTk1MWYwN2NhZWE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MGI2YmQwYjc0ODI0NTZkYWU3YjAzYzI1ZjhjMTQ2My5zZXRDb250ZW50KGh0bWxfNTllYjYxNTk0MDE0NDFiOWIzZTMxOTUxZjA3Y2FlYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzgzNTAzNDRlNmJjNDE0MmFjZDcyMDlhNGU5ZTNkYTIuYmluZFBvcHVwKHBvcHVwXzYwYjZiZDBiNzQ4MjQ1NmRhZTdiMDNjMjVmOGMxNDYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2ZGViMDU3YWM0ZjQwMmM5MDQ2NDAwYWJkZGQxM2NjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmUwNmExZGFhNTA0ZGMzOTg5Zjg4MDRkZDI3ZDU4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjIxZjU2YWI4NjQ0ZDI5YWFiZWI0ZTEwM2Q5ODIxNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWYyMWY1NmFiODY0NGQyOWFhYmViNGUxMDNkOTgyMTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJlMDZhMWRhYTUwNGRjMzk4OWY4ODA0ZGQyN2Q1OGUuc2V0Q29udGVudChodG1sXzVmMjFmNTZhYjg2NDRkMjlhYWJlYjRlMTAzZDk4MjE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2ZGViMDU3YWM0ZjQwMmM5MDQ2NDAwYWJkZGQxM2NjLmJpbmRQb3B1cChwb3B1cF8xYmUwNmExZGFhNTA0ZGMzOTg5Zjg4MDRkZDI3ZDU4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MGU3ZDg2MGJmOGQ0ZGI0OTZlODk0OWJkYTRmNTAzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1Y2Q0ZTAxNjUyMzQ0MTY4N2FkYTkxMDM0ODA5NWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0YjdiNDI5MmQzZTQxZjBiY2FjNmNlYTQzYWYzOTI2ID0gJCgnPGRpdiBpZD0iaHRtbF81NGI3YjQyOTJkM2U0MWYwYmNhYzZjZWE0M2FmMzkyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1Y2Q0ZTAxNjUyMzQ0MTY4N2FkYTkxMDM0ODA5NWZhLnNldENvbnRlbnQoaHRtbF81NGI3YjQyOTJkM2U0MWYwYmNhYzZjZWE0M2FmMzkyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MGU3ZDg2MGJmOGQ0ZGI0OTZlODk0OWJkYTRmNTAzMy5iaW5kUG9wdXAocG9wdXBfNzVjZDRlMDE2NTIzNDQxNjg3YWRhOTEwMzQ4MDk1ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjczMThlNWZmZTVkNDFjMzg4NDZhMzNjN2UwZGIxM2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMzJmY2Q2ZjEwZjk0ZDg2ODYxYTEwNDA3NTY5YmQxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NDNiODJhMTY2OWE0Y2YzYWFiYmIwODBiMDYzNTFjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDQzYjgyYTE2NjlhNGNmM2FhYmJiMDgwYjA2MzUxYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMzJmY2Q2ZjEwZjk0ZDg2ODYxYTEwNDA3NTY5YmQxOC5zZXRDb250ZW50KGh0bWxfNDQzYjgyYTE2NjlhNGNmM2FhYmJiMDgwYjA2MzUxYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjczMThlNWZmZTVkNDFjMzg4NDZhMzNjN2UwZGIxM2MuYmluZFBvcHVwKHBvcHVwXzIzMmZjZDZmMTBmOTRkODY4NjFhMTA0MDc1NjliZDE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3MTQ1NmE4NzY4ZTRmN2JhNDhkOGM2NTJkNTA3YzJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5NDI3NjQ3ZDA1MTQxZTI4MjBlN2M3ZDdkNTY5MGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjODYxNTg1ODUzMjRlMmViOTdlMTMyYjI5ZTRmOThhID0gJCgnPGRpdiBpZD0iaHRtbF8xYzg2MTU4NTg1MzI0ZTJlYjk3ZTEzMmIyOWU0Zjk4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5NDI3NjQ3ZDA1MTQxZTI4MjBlN2M3ZDdkNTY5MGNkLnNldENvbnRlbnQoaHRtbF8xYzg2MTU4NTg1MzI0ZTJlYjk3ZTEzMmIyOWU0Zjk4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzE0NTZhODc2OGU0ZjdiYTQ4ZDhjNjUyZDUwN2MyYi5iaW5kUG9wdXAocG9wdXBfMDk0Mjc2NDdkMDUxNDFlMjgyMGU3YzdkN2Q1NjkwY2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzZiZDc2NTg4ZTRmNGY5MDgyYjllNDc1YjY5MWRiYjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTMxMDgzNDMzMjY0LC0xMjIuNDQ0MzE0MDI1MTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM0YjY5NDU3YTRjNDkzMDk5OTVkN2JkZWYwOWFiMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWMwM2RjODA4NDQ0NDVjMzljMTM2ZTgwZGQ2MzY5Y2UgPSAkKCc8ZGl2IGlkPSJodG1sX2FjMDNkYzgwODQ0NDQ1YzM5YzEzNmU4MGRkNjM2OWNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzRiNjk0NTdhNGM0OTMwOTk5NWQ3YmRlZjA5YWIxZC5zZXRDb250ZW50KGh0bWxfYWMwM2RjODA4NDQ0NDVjMzljMTM2ZTgwZGQ2MzY5Y2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzZiZDc2NTg4ZTRmNGY5MDgyYjllNDc1YjY5MWRiYjUuYmluZFBvcHVwKHBvcHVwXzZjNGI2OTQ1N2E0YzQ5MzA5OTk1ZDdiZGVmMDlhYjFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyYzZhNTQzN2E1YzRkZTI5MTYwNGU3YjdlZjU4MmIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ZmNlYjM4ZTY0OTQ5MGZhMGNmNmY3Njg1ZWYyZWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmYWI5MjZjYjQ1YjQzNTM5YzFiZWJjZTM2ZWI2ZjgyID0gJCgnPGRpdiBpZD0iaHRtbF81ZmFiOTI2Y2I0NWI0MzUzOWMxYmViY2UzNmViNmY4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4ZmNlYjM4ZTY0OTQ5MGZhMGNmNmY3Njg1ZWYyZWMyLnNldENvbnRlbnQoaHRtbF81ZmFiOTI2Y2I0NWI0MzUzOWMxYmViY2UzNmViNmY4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MmM2YTU0MzdhNWM0ZGUyOTE2MDRlN2I3ZWY1ODJiMy5iaW5kUG9wdXAocG9wdXBfZThmY2ViMzhlNjQ5NDkwZmEwY2Y2Zjc2ODVlZjJlYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNlY2Y3OThhNTEwNDhlZWE4NGQxMWViMTllZDA4ZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2I2MjRkYWFiZTRhNGRiZTkwNGVjY2I2MjI1YzMzOTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWFjMTFhOGY5M2U5NGMxNjg3N2JjYTNhYTA5OTAyZjMgPSAkKCc8ZGl2IGlkPSJodG1sXzFhYzExYThmOTNlOTRjMTY4NzdiY2EzYWEwOTkwMmYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2I2MjRkYWFiZTRhNGRiZTkwNGVjY2I2MjI1YzMzOTUuc2V0Q29udGVudChodG1sXzFhYzExYThmOTNlOTRjMTY4NzdiY2EzYWEwOTkwMmYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljZWNmNzk4YTUxMDQ4ZWVhODRkMTFlYjE5ZWQwOGYxLmJpbmRQb3B1cChwb3B1cF83YjYyNGRhYWJlNGE0ZGJlOTA0ZWNjYjYyMjVjMzM5NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDk0OGY1MzU3YTY0ZDBkOGY3NWQ3MGI4ZjVjYjhjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhOTk1ZTUxNWFiNzRkZmM4NDhmMDQyNzU5YThlY2ZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlYmFjZWVjZjdjMTQ1MzlhNDIyOGNhMTgwMDRjNTQzID0gJCgnPGRpdiBpZD0iaHRtbF9hZWJhY2VlY2Y3YzE0NTM5YTQyMjhjYTE4MDA0YzU0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGE5OTVlNTE1YWI3NGRmYzg0OGYwNDI3NTlhOGVjZmIuc2V0Q29udGVudChodG1sX2FlYmFjZWVjZjdjMTQ1MzlhNDIyOGNhMTgwMDRjNTQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwOTQ4ZjUzNTdhNjRkMGQ4Zjc1ZDcwYjhmNWNiOGMwLmJpbmRQb3B1cChwb3B1cF8wYTk5NWU1MTVhYjc0ZGZjODQ4ZjA0Mjc1OWE4ZWNmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YjkyZjVlZTM1ZGY0ZTQ1YjBhYWFkYjZmOWJlNDg1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyN2VkZDFhNjc4NDQwZmRiODA2ZDcxZjhjYmY0ZTI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhYmExMjliNjViODQ4MjQ4YzkxYWUwYzA4NTVjZmUwID0gJCgnPGRpdiBpZD0iaHRtbF84YWJhMTI5YjY1Yjg0ODI0OGM5MWFlMGMwODU1Y2ZlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyN2VkZDFhNjc4NDQwZmRiODA2ZDcxZjhjYmY0ZTI2LnNldENvbnRlbnQoaHRtbF84YWJhMTI5YjY1Yjg0ODI0OGM5MWFlMGMwODU1Y2ZlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjkyZjVlZTM1ZGY0ZTQ1YjBhYWFkYjZmOWJlNDg1ZS5iaW5kUG9wdXAocG9wdXBfMjI3ZWRkMWE2Nzg0NDBmZGI4MDZkNzFmOGNiZjRlMjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWQyYzgwMzg4YzY3NDNkYWE2OWQ2Y2YyZDRhNGY5MTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzBiOWQ0YmQ3MjY0NDkwMDk0OGI0YWM2NzBiZTBiZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDUwMDYwZjk0OTJkNDBjNWEzZmYwNWMxZDNkNWRkZjcgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1MDA2MGY5NDkyZDQwYzVhM2ZmMDVjMWQzZDVkZGY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMGI5ZDRiZDcyNjQ0OTAwOTQ4YjRhYzY3MGJlMGJmOS5zZXRDb250ZW50KGh0bWxfZDUwMDYwZjk0OTJkNDBjNWEzZmYwNWMxZDNkNWRkZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWQyYzgwMzg4YzY3NDNkYWE2OWQ2Y2YyZDRhNGY5MTcuYmluZFBvcHVwKHBvcHVwXzMwYjlkNGJkNzI2NDQ5MDA5NDhiNGFjNjcwYmUwYmY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNjAzZDdmMzQ4NjQ1Mzg5ZGI2MTU1NDYyYmNkOGVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgyMDIzODQ3ODk3NSwtMTIyLjQwMTE2MTU1NTYwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzODU2OTdkZmZkMTRlZTU5N2ExMzA0NjgzZmEzNmMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1YTg0NzYzZDJjODQ2OTE4MGUxMzkxMjRjZGM2ZTJjID0gJCgnPGRpdiBpZD0iaHRtbF81NWE4NDc2M2QyYzg0NjkxODBlMTM5MTI0Y2RjNmUyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzODU2OTdkZmZkMTRlZTU5N2ExMzA0NjgzZmEzNmMwLnNldENvbnRlbnQoaHRtbF81NWE4NDc2M2QyYzg0NjkxODBlMTM5MTI0Y2RjNmUyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjYwM2Q3ZjM0ODY0NTM4OWRiNjE1NTQ2MmJjZDhlYS5iaW5kUG9wdXAocG9wdXBfZjM4NTY5N2RmZmQxNGVlNTk3YTEzMDQ2ODNmYTM2YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdjMGViNDM4NzVhNDYxZmEzZjRmZGRmZDJhOTVhOWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjcwMDUzMTk2Mjk5OTUsLTEyMi40MDM0MDg2NjkxOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDQwNGE4ZWFiYmY0MmVjYmFjMjkyNGVlMDc2ZWVlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MjFiNGJiNmRlNzQ0MWRiOTA4YTRjZTVlOWQwMGQ1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzIxYjRiYjZkZTc0NDFkYjkwOGE0Y2U1ZTlkMDBkNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDQwNGE4ZWFiYmY0MmVjYmFjMjkyNGVlMDc2ZWVlNS5zZXRDb250ZW50KGh0bWxfNzIxYjRiYjZkZTc0NDFkYjkwOGE0Y2U1ZTlkMDBkNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDdjMGViNDM4NzVhNDYxZmEzZjRmZGRmZDJhOTVhOWEuYmluZFBvcHVwKHBvcHVwXzQwNDA0YThlYWJiZjQyZWNiYWMyOTI0ZWUwNzZlZWU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4ZjViZjk1ZGI4ZTRhZjJhNTEyMzI5ODIwODMwMmQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NTFlYWIxMzI1OTQ2YzA4NDQwNjE4ZmU4ZTFjNjY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhNTQ4MTJmZmI2ZTRmZTk4OWQ0YTE4MWUyMGNkNzJmID0gJCgnPGRpdiBpZD0iaHRtbF9lYTU0ODEyZmZiNmU0ZmU5ODlkNGExODFlMjBjZDcyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjUxZWFiMTMyNTk0NmMwODQ0MDYxOGZlOGUxYzY2Ny5zZXRDb250ZW50KGh0bWxfZWE1NDgxMmZmYjZlNGZlOTg5ZDRhMTgxZTIwY2Q3MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjhmNWJmOTVkYjhlNGFmMmE1MTIzMjk4MjA4MzAyZDcuYmluZFBvcHVwKHBvcHVwXzE2NTFlYWIxMzI1OTQ2YzA4NDQwNjE4ZmU4ZTFjNjY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNjQ0ZGViN2M1MzRlZTE4YjZkODQ2MGQ2YzdlMWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTAxZTBkZTdlNzcyNDA3ZDlhNGM4MjAyMmRkM2RhMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVjMWFhZDQ5MTJhNGI1NDlhNzU4NDI2M2RmMjcyZDYgPSAkKCc8ZGl2IGlkPSJodG1sX2RlYzFhYWQ0OTEyYTRiNTQ5YTc1ODQyNjNkZjI3MmQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwMWUwZGU3ZTc3MjQwN2Q5YTRjODIwMjJkZDNkYTEwLnNldENvbnRlbnQoaHRtbF9kZWMxYWFkNDkxMmE0YjU0OWE3NTg0MjYzZGYyNzJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTY0NGRlYjdjNTM0ZWUxOGI2ZDg0NjBkNmM3ZTFkZC5iaW5kUG9wdXAocG9wdXBfYTAxZTBkZTdlNzcyNDA3ZDlhNGM4MjAyMmRkM2RhMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ZkMDM3NmUzZjg0NGQzYzgzMTNhY2Q3ZTY5Y2I3M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRkMTU5ODlkYjVjNGY4Yjg3MDZkMDc4ODFlYjVjZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWMxODFmMjEzZDA1NGVmMTk2NTYyOGM0NGViZGM1MzYgPSAkKCc8ZGl2IGlkPSJodG1sX2FjMTgxZjIxM2QwNTRlZjE5NjU2MjhjNDRlYmRjNTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmRkMTU5ODlkYjVjNGY4Yjg3MDZkMDc4ODFlYjVjZGEuc2V0Q29udGVudChodG1sX2FjMTgxZjIxM2QwNTRlZjE5NjU2MjhjNDRlYmRjNTM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmZDAzNzZlM2Y4NDRkM2M4MzEzYWNkN2U2OWNiNzNjLmJpbmRQb3B1cChwb3B1cF8yZGQxNTk4OWRiNWM0ZjhiODcwNmQwNzg4MWViNWNkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTMyODk3OTE4MTg0ZWRlODc1Yjk4ZWU3ZDQ3MmFmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjlkZTg4NjdiNDhiNDBmZjg2OGRmNDlkNGY2ZTAxNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWE3OTQwMTVjZmNkNGRiNGJmOTdkYzc5Nzk4MGJjZTEgPSAkKCc8ZGl2IGlkPSJodG1sXzVhNzk0MDE1Y2ZjZDRkYjRiZjk3ZGM3OTc5ODBiY2UxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWRlODg2N2I0OGI0MGZmODY4ZGY0OWQ0ZjZlMDE1ZC5zZXRDb250ZW50KGh0bWxfNWE3OTQwMTVjZmNkNGRiNGJmOTdkYzc5Nzk4MGJjZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGEzMjg5NzkxODE4NGVkZTg3NWI5OGVlN2Q0NzJhZjguYmluZFBvcHVwKHBvcHVwXzY5ZGU4ODY3YjQ4YjQwZmY4NjhkZjQ5ZDRmNmUwMTVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhMDhjNTFkNTM0ODQ5OWM5OTU4MzJlNTg1ZGM3ZDMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Nzk4NjJlZTQwZTc0NTBlOTQyYjU4NmYyYjU3ZjI0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZTM3MWE0M2M5OTU0ZTMzOTFiZmJiZGJjZmJiYWM0MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGUzNzFhNDNjOTk1NGUzMzkxYmZiYmRiY2ZiYmFjNDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Nzk4NjJlZTQwZTc0NTBlOTQyYjU4NmYyYjU3ZjI0ZC5zZXRDb250ZW50KGh0bWxfMGUzNzFhNDNjOTk1NGUzMzkxYmZiYmRiY2ZiYmFjNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmEwOGM1MWQ1MzQ4NDk5Yzk5NTgzMmU1ODVkYzdkMzAuYmluZFBvcHVwKHBvcHVwXzc3OTg2MmVlNDBlNzQ1MGU5NDJiNTg2ZjJiNTdmMjRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzZmRiNGNhZWM2MjQyMWQ4MDYyNjMwNjA0NDQ2MTIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQwNzM2MDU0ODM1NzksLTEyMi4zODg3NTMwNDY5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYjg0NTVhZjQwYWQ0ZDBhOTljMjY2OTRjNjI4MjM1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODUwYWRkYWY3ZDg0MjU4YjAyYTkxZDQ4YjljMGVhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg1MGFkZGFmN2Q4NDI1OGIwMmE5MWQ0OGI5YzBlYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjg0NTVhZjQwYWQ0ZDBhOTljMjY2OTRjNjI4MjM1Mi5zZXRDb250ZW50KGh0bWxfZTg1MGFkZGFmN2Q4NDI1OGIwMmE5MWQ0OGI5YzBlYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNmZGI0Y2FlYzYyNDIxZDgwNjI2MzA2MDQ0NDYxMjEuYmluZFBvcHVwKHBvcHVwXzNiODQ1NWFmNDBhZDRkMGE5OWMyNjY5NGM2MjgyMzUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5ZTQzYjY5NzRjYzRlNjNiMzQ0OTdjNGE0MzBlMDJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxNTYwZDYyY2E5MzRjNjk4YzlhNzJiOTMzYzFlMGNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzMzY3NzMzMzdkZDRiZTRiOGM0MTkyNTFhNTgzODZmID0gJCgnPGRpdiBpZD0iaHRtbF82MzM2NzczMzM3ZGQ0YmU0YjhjNDE5MjUxYTU4Mzg2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDE1NjBkNjJjYTkzNGM2OThjOWE3MmI5MzNjMWUwY2Euc2V0Q29udGVudChodG1sXzYzMzY3NzMzMzdkZDRiZTRiOGM0MTkyNTFhNTgzODZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5ZTQzYjY5NzRjYzRlNjNiMzQ0OTdjNGE0MzBlMDJmLmJpbmRQb3B1cChwb3B1cF9kMTU2MGQ2MmNhOTM0YzY5OGM5YTcyYjkzM2MxZTBjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWE2NTQxODI2ZDU0NDU3YjJhZGY2YzMwMTkxN2Q2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzU5NGFhZmE0Mjg0NWJmODE5YzQxZTg5YzkyZmIyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNzI5NTBiY2E3ZTk0YTVmOGQ4OTQ4ZDg1ZTk2MTk3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjcyOTUwYmNhN2U5NGE1ZjhkODk0OGQ4NWU5NjE5N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzU5NGFhZmE0Mjg0NWJmODE5YzQxZTg5YzkyZmIyNy5zZXRDb250ZW50KGh0bWxfMjcyOTUwYmNhN2U5NGE1ZjhkODk0OGQ4NWU5NjE5N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWFhNjU0MTgyNmQ1NDQ1N2IyYWRmNmMzMDE5MTdkNmUuYmluZFBvcHVwKHBvcHVwXzZjNTk0YWFmYTQyODQ1YmY4MTljNDFlODljOTJmYjI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiYjRiNzU0YmQyMjQyMzRiODZhNzg5ODhjMDIzNzU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxMWY2ZTg1OWVhMDQ0YTU5ZTFlOGQyYTQ3OGI0MjVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4ZDMzNjNhNzc5NjQ3YzliMjk1NjIwNDQ0MjE1YzE0ID0gJCgnPGRpdiBpZD0iaHRtbF85OGQzMzYzYTc3OTY0N2M5YjI5NTYyMDQ0NDIxNWMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxMWY2ZTg1OWVhMDQ0YTU5ZTFlOGQyYTQ3OGI0MjVmLnNldENvbnRlbnQoaHRtbF85OGQzMzYzYTc3OTY0N2M5YjI5NTYyMDQ0NDIxNWMxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYmI0Yjc1NGJkMjI0MjM0Yjg2YTc4OTg4YzAyMzc1OC5iaW5kUG9wdXAocG9wdXBfZTExZjZlODU5ZWEwNDRhNTllMWU4ZDJhNDc4YjQyNWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDA3NWQzYjEwOTBkNGYzYmJjZDdmN2U2OTYyMjA2NTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQ1MWE1OGQ4ZTM4NGQ5M2FhYjJkMTY3NzM2MjIwNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVhMDgzZDQ0MDY2NDNkYmFkY2NhMTNmMTk5ZjUwNjEgPSAkKCc8ZGl2IGlkPSJodG1sX2I1YTA4M2Q0NDA2NjQzZGJhZGNjYTEzZjE5OWY1MDYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQ1MWE1OGQ4ZTM4NGQ5M2FhYjJkMTY3NzM2MjIwNDguc2V0Q29udGVudChodG1sX2I1YTA4M2Q0NDA2NjQzZGJhZGNjYTEzZjE5OWY1MDYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNzVkM2IxMDkwZDRmM2JiY2Q3ZjdlNjk2MjIwNjUzLmJpbmRQb3B1cChwb3B1cF84NDUxYTU4ZDhlMzg0ZDkzYWFiMmQxNjc3MzYyMjA0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OWU1MTdmNDhiMDY0NTFhOWRmM2M1MzFlMWZmMTE5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDAzNzk5OTUxMjc5NSwtMTIyLjQwNDU5NDE0MDYzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjNTI2N2ZmNzAwYjQ5MzhhMGViYmM4MzhlY2U4ZWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyN2U2Y2QzZGE2MDRhYmJhYjc3NDBjMGRlYzdhNzg4ID0gJCgnPGRpdiBpZD0iaHRtbF9jMjdlNmNkM2RhNjA0YWJiYWI3NzQwYzBkZWM3YTc4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYzUyNjdmZjcwMGI0OTM4YTBlYmJjODM4ZWNlOGVjZi5zZXRDb250ZW50KGh0bWxfYzI3ZTZjZDNkYTYwNGFiYmFiNzc0MGMwZGVjN2E3ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODllNTE3ZjQ4YjA2NDUxYTlkZjNjNTMxZTFmZjExOTIuYmluZFBvcHVwKHBvcHVwX2FjNTI2N2ZmNzAwYjQ5MzhhMGViYmM4MzhlY2U4ZWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhMWJjZTQ2YjYyZDRlZWFiMTBiYjVhNjg0OGY0ZTRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MzMzODI2NzQzNiwtMTIyLjM5NzM3Mzc0MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0YTdjNmYwZGYwNTQ4MjFhMDVkZDRhOGU5MzdhM2Q5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxYTdlYTg3ZTliNTQxODk4ZDk3YTljNzcxYWNlMzE0ID0gJCgnPGRpdiBpZD0iaHRtbF9lMWE3ZWE4N2U5YjU0MTg5OGQ5N2E5Yzc3MWFjZTMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNGE3YzZmMGRmMDU0ODIxYTA1ZGQ0YThlOTM3YTNkOS5zZXRDb250ZW50KGh0bWxfZTFhN2VhODdlOWI1NDE4OThkOTdhOWM3NzFhY2UzMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ExYmNlNDZiNjJkNGVlYWIxMGJiNWE2ODQ4ZjRlNGEuYmluZFBvcHVwKHBvcHVwX2Q0YTdjNmYwZGYwNTQ4MjFhMDVkZDRhOGU5MzdhM2Q5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3OTMyZGZmYzNiYjQwNGJiMjIyZThkZDZhZTY2OGMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDEyY2Q2YjMzODZlNDNmYTg5Y2E3NGMxZGU3MWFjZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjI2NmEyNmY0YmRiNDRiMzkyMGY1ZmE1MDJhYWI2MDAgPSAkKCc8ZGl2IGlkPSJodG1sX2IyNjZhMjZmNGJkYjQ0YjM5MjBmNWZhNTAyYWFiNjAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDEyY2Q2YjMzODZlNDNmYTg5Y2E3NGMxZGU3MWFjZjAuc2V0Q29udGVudChodG1sX2IyNjZhMjZmNGJkYjQ0YjM5MjBmNWZhNTAyYWFiNjAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3OTMyZGZmYzNiYjQwNGJiMjIyZThkZDZhZTY2OGMzLmJpbmRQb3B1cChwb3B1cF9kMTJjZDZiMzM4NmU0M2ZhODljYTc0YzFkZTcxYWNmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDJlOTg1ODM1NmI0ZmVmYmUzNmYyZTQ0NDA5MTRiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWY1MDM2NWRmYjY0MThlYTZkOTIyYTNjNGRmZTUwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNjZhYzQ5NWFlYmE0OWZiOTY4YzM4YmU0YjQzNWVjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTY2YWM0OTVhZWJhNDlmYjk2OGMzOGJlNGI0MzVlYzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBST1NUSVRVVElPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2FmNTAzNjVkZmI2NDE4ZWE2ZDkyMmEzYzRkZmU1MDEuc2V0Q29udGVudChodG1sX2U2NmFjNDk1YWViYTQ5ZmI5NjhjMzhiZTRiNDM1ZWM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0MmU5ODU4MzU2YjRmZWZiZTM2ZjJlNDQ0MDkxNGI0LmJpbmRQb3B1cChwb3B1cF9jYWY1MDM2NWRmYjY0MThlYTZkOTIyYTNjNGRmZTUwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTE4NjE2MzQ0MDI0ODNjOTEyYjAzOWJiZDE5MTRhNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOGUyNTViNDg5YTY0NDNlOTMzYjViMGJhYzZmOWU5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjk3NGZkZTllODg0ZTA2YjI4YTc3OGRmNTY0YTk4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2I5NzRmZGU5ZTg4NGUwNmIyOGE3NzhkZjU2NGE5ODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOGUyNTViNDg5YTY0NDNlOTMzYjViMGJhYzZmOWU5Yy5zZXRDb250ZW50KGh0bWxfM2I5NzRmZGU5ZTg4NGUwNmIyOGE3NzhkZjU2NGE5ODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDUxODYxNjM0NDAyNDgzYzkxMmIwMzliYmQxOTE0YTcuYmluZFBvcHVwKHBvcHVwX2I4ZTI1NWI0ODlhNjQ0M2U5MzNiNWIwYmFjNmY5ZTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyNzNkZWUwM2E0YjQ5ZmJhYTk2YmZhNmEyYzNhNjdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMjFlNTViNmFjZGY0MWUxYjEzNzQzZWY5MjUyZDA5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YTJmNzA5ZjA2ZTA0N2M4YjhiMDMyNzIyZDg3ZTA1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGEyZjcwOWYwNmUwNDdjOGI4YjAzMjcyMmQ4N2UwNWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzIxZTU1YjZhY2RmNDFlMWIxMzc0M2VmOTI1MmQwOWIuc2V0Q29udGVudChodG1sXzhhMmY3MDlmMDZlMDQ3YzhiOGIwMzI3MjJkODdlMDVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyNzNkZWUwM2E0YjQ5ZmJhYTk2YmZhNmEyYzNhNjdlLmJpbmRQb3B1cChwb3B1cF9jMjFlNTViNmFjZGY0MWUxYjEzNzQzZWY5MjUyZDA5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NjM0OWI5NzIwYjU0MDYwYWZjYzY3MDZhYTFhNDE2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjJkYmRlZmM0ZTFmNDMzNzk1ZWY2NjRjMTIwZTBkNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNmY2I1ZWUzMGI0NDZjMGEwMzk5ODViY2Q4YmVjNTcgPSAkKCc8ZGl2IGlkPSJodG1sX2QzZmNiNWVlMzBiNDQ2YzBhMDM5OTg1YmNkOGJlYzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMmRiZGVmYzRlMWY0MzM3OTVlZjY2NGMxMjBlMGQ1OS5zZXRDb250ZW50KGh0bWxfZDNmY2I1ZWUzMGI0NDZjMGEwMzk5ODViY2Q4YmVjNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTYzNDliOTcyMGI1NDA2MGFmY2M2NzA2YWExYTQxNmYuYmluZFBvcHVwKHBvcHVwX2YyZGJkZWZjNGUxZjQzMzc5NWVmNjY0YzEyMGUwZDU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2ZjU2MzcwMjc1NjQzNTZhMmQ1M2JjZjMxYzFjZTAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNGQ4ZjQ4MDVmMWY0OWJjYmY4ZjA5ZTIwNDg5YzQxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjkxNTM4MzE1MzE0YWQ3YmE1ODdhNjE1OTgxMTYzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzY5MTUzODMxNTMxNGFkN2JhNTg3YTYxNTk4MTE2MzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNGQ4ZjQ4MDVmMWY0OWJjYmY4ZjA5ZTIwNDg5YzQxMi5zZXRDb250ZW50KGh0bWxfMzY5MTUzODMxNTMxNGFkN2JhNTg3YTYxNTk4MTE2MzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzZmNTYzNzAyNzU2NDM1NmEyZDUzYmNmMzFjMWNlMDEuYmluZFBvcHVwKHBvcHVwXzA0ZDhmNDgwNWYxZjQ5YmNiZjhmMDllMjA0ODljNDEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1ZmJkOWRkMzFmMDQyMjhhYmQ3N2ZiODMwZGYzOTc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzg2ZWRiNzhjY2U3NDRiMTk1ZjVlYjBjMjFhMjdiNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM4ZTlkZGUwMTgwNGI0ZTgxOTcyZDMxNWE4YjcxZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzVjOGU5ZGRlMDE4MDRiNGU4MTk3MmQzMTVhOGI3MWQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODZlZGI3OGNjZTc0NGIxOTVmNWViMGMyMWEyN2I0Yy5zZXRDb250ZW50KGh0bWxfNWM4ZTlkZGUwMTgwNGI0ZTgxOTcyZDMxNWE4YjcxZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDVmYmQ5ZGQzMWYwNDIyOGFiZDc3ZmI4MzBkZjM5NzUuYmluZFBvcHVwKHBvcHVwXzM4NmVkYjc4Y2NlNzQ0YjE5NWY1ZWIwYzIxYTI3YjRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlNmExYjY4MTQzNzQyOTdiMmZkMDNhNzFhMDE0NjE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5MjExNDY0NzM1OSwtMTIyLjQwMDgzNDI4MzAzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0NmNkNjM1NGVjODQxOTRiZGIzMzIxOGMwYjFkZmFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5OTljYjMxMGViMDRlNDQ5YWE1MTEwZDAwMTZkNDRkID0gJCgnPGRpdiBpZD0iaHRtbF9hOTk5Y2IzMTBlYjA0ZTQ0OWFhNTExMGQwMDE2ZDQ0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0NmNkNjM1NGVjODQxOTRiZGIzMzIxOGMwYjFkZmFkLnNldENvbnRlbnQoaHRtbF9hOTk5Y2IzMTBlYjA0ZTQ0OWFhNTExMGQwMDE2ZDQ0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZTZhMWI2ODE0Mzc0Mjk3YjJmZDAzYTcxYTAxNDYxOC5iaW5kUG9wdXAocG9wdXBfODQ2Y2Q2MzU0ZWM4NDE5NGJkYjMzMjE4YzBiMWRmYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzM3ZGI1MzM3MThlNGM5YzhmOWRkMTVhZGVhN2ZmMGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzIzZmM0YmM2ZDU0ODYwYmMxZWRlNjJiN2UzYTlhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MDNiOGU0NjA2ZGQ0MWJjYTMxYWRkZDBkYzFmMTZlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzAzYjhlNDYwNmRkNDFiY2EzMWFkZGQwZGMxZjE2ZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjMjNmYzRiYzZkNTQ4NjBiYzFlZGU2MmI3ZTNhOWE2LnNldENvbnRlbnQoaHRtbF83MDNiOGU0NjA2ZGQ0MWJjYTMxYWRkZDBkYzFmMTZlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMzdkYjUzMzcxOGU0YzljOGY5ZGQxNWFkZWE3ZmYwYy5iaW5kUG9wdXAocG9wdXBfZmMyM2ZjNGJjNmQ1NDg2MGJjMWVkZTYyYjdlM2E5YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTkwOWQ1MmM0MTllNGI4NWE4YWU2ZGE2Yjg3YTc2YzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2MzZlZWY3OTRmMTQyY2ZhMWVlM2IzNWI1ZGM0YzA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5YjNlMGEzYjdmMDQxMDFiODMwY2M5N2VlMzhiNWRkID0gJCgnPGRpdiBpZD0iaHRtbF9jOWIzZTBhM2I3ZjA0MTAxYjgzMGNjOTdlZTM4YjVkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjM2ZWVmNzk0ZjE0MmNmYTFlZTNiMzViNWRjNGMwNy5zZXRDb250ZW50KGh0bWxfYzliM2UwYTNiN2YwNDEwMWI4MzBjYzk3ZWUzOGI1ZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTkwOWQ1MmM0MTllNGI4NWE4YWU2ZGE2Yjg3YTc2YzUuYmluZFBvcHVwKHBvcHVwXzk2MzZlZWY3OTRmMTQyY2ZhMWVlM2IzNWI1ZGM0YzA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFiYzg0ZjMwM2FlNzRkZDlhMjIyMzFhYjM0MTU1YTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTkwYjZmMWMyM2I0YzQ3YjUyNmVmZWRjYzAyZDg0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjlkMTY4MGRmZTM0M2I1OWRiYzQxMWQzZjYzYzViMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY5ZDE2ODBkZmUzNDNiNTlkYmM0MTFkM2Y2M2M1YjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVU1BJQ0lPVVMgT0NDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTkwYjZmMWMyM2I0YzQ3YjUyNmVmZWRjYzAyZDg0NS5zZXRDb250ZW50KGh0bWxfYzY5ZDE2ODBkZmUzNDNiNTlkYmM0MTFkM2Y2M2M1YjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWJjODRmMzAzYWU3NGRkOWEyMjIzMWFiMzQxNTVhMjMuYmluZFBvcHVwKHBvcHVwX2U1OTBiNmYxYzIzYjRjNDdiNTI2ZWZlZGNjMDJkODQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwNDY0MjhlY2IyZDQwZTBiMDQ2Njc3YzExZTI3MDI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hN2ZhNzNjZGE4M2E0MzZhOGUxYmJiZmJmYTMwOWE5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNWIwNTNlM2QwYjc0YzQ3YTc0ZTkxMGE3NjdhZDgxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDViMDUzZTNkMGI3NGM0N2E3NGU5MTBhNzY3YWQ4MWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hN2ZhNzNjZGE4M2E0MzZhOGUxYmJiZmJmYTMwOWE5NS5zZXRDb250ZW50KGh0bWxfZDViMDUzZTNkMGI3NGM0N2E3NGU5MTBhNzY3YWQ4MWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzA0NjQyOGVjYjJkNDBlMGIwNDY2NzdjMTFlMjcwMjQuYmluZFBvcHVwKHBvcHVwX2E3ZmE3M2NkYTgzYTQzNmE4ZTFiYmJmYmZhMzA5YTk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljZDIxMTk5YjIyNzQwMGE4Y2E5YzcyYmVmMmE5NjIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI1NzllMzgwYmYyNGU2NjliMGNmNzBlMGJiNGNjMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJkOGMwYTExZGY5NDI1MDgyZDQwN2Y3OWE4MjY0NzIgPSAkKCc8ZGl2IGlkPSJodG1sX2YyZDhjMGExMWRmOTQyNTA4MmQ0MDdmNzlhODI2NDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjU3OWUzODBiZjI0ZTY2OWIwY2Y3MGUwYmI0Y2MzOC5zZXRDb250ZW50KGh0bWxfZjJkOGMwYTExZGY5NDI1MDgyZDQwN2Y3OWE4MjY0NzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWNkMjExOTliMjI3NDAwYThjYTljNzJiZWYyYTk2MjEuYmluZFBvcHVwKHBvcHVwX2IyNTc5ZTM4MGJmMjRlNjY5YjBjZjcwZTBiYjRjYzM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwMzA0MzM0ZmY3ODQ3NTBiYzBlZWRhN2UwOGRmNjFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1Y2FmN2FhZjkzYjRhZTJiMTExNTVkYzZkYmFiMWE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMTU4NTc0NDVmNzQzNmM5NThhYmQxMTRhNjJiZWJmID0gJCgnPGRpdiBpZD0iaHRtbF80YjE1ODU3NDQ1Zjc0MzZjOTU4YWJkMTE0YTYyYmViZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1Y2FmN2FhZjkzYjRhZTJiMTExNTVkYzZkYmFiMWE3LnNldENvbnRlbnQoaHRtbF80YjE1ODU3NDQ1Zjc0MzZjOTU4YWJkMTE0YTYyYmViZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDMwNDMzNGZmNzg0NzUwYmMwZWVkYTdlMDhkZjYxYy5iaW5kUG9wdXAocG9wdXBfMjVjYWY3YWFmOTNiNGFlMmIxMTE1NWRjNmRiYWIxYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2I2NzFmNTliNjkxNDExMTk2OTcxODNiNDViYTBiNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODcwNzk4MTQ0NDQzLC0xMjIuNDI1ODgzMzU4MTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjMxNWUxMzA3OWUyNDU1YTlkMjZhNDZhZmU5NTZkNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTBhNjQwZWJiYzI5NGFjYWI4NDgwODBmMGJlNDg5YTAgPSAkKCc8ZGl2IGlkPSJodG1sXzEwYTY0MGViYmMyOTRhY2FiODQ4MDgwZjBiZTQ4OWEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzMTVlMTMwNzllMjQ1NWE5ZDI2YTQ2YWZlOTU2ZDQ4LnNldENvbnRlbnQoaHRtbF8xMGE2NDBlYmJjMjk0YWNhYjg0ODA4MGYwYmU0ODlhMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjY3MWY1OWI2OTE0MTExOTY5NzE4M2I0NWJhMGI2Mi5iaW5kUG9wdXAocG9wdXBfMjMxNWUxMzA3OWUyNDU1YTlkMjZhNDZhZmU5NTZkNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTk1NWVlNTZlNjVhNDVlMGFmNjZiOTU0ZGM3ZGM2ODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyNTRhNGMyZDI4NjRhNjg5MTFjMjExZTg3YTI4ZWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlYmZjYTVjNGJjNjQyYzM5MGQyNmY1NWNkNzUzNjRmID0gJCgnPGRpdiBpZD0iaHRtbF9lZWJmY2E1YzRiYzY0MmMzOTBkMjZmNTVjZDc1MzY0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MjU0YTRjMmQyODY0YTY4OTExYzIxMWU4N2EyOGVjZi5zZXRDb250ZW50KGh0bWxfZWViZmNhNWM0YmM2NDJjMzkwZDI2ZjU1Y2Q3NTM2NGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTk1NWVlNTZlNjVhNDVlMGFmNjZiOTU0ZGM3ZGM2ODAuYmluZFBvcHVwKHBvcHVwXzkyNTRhNGMyZDI4NjRhNjg5MTFjMjExZTg3YTI4ZWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjZmFlMWUyMGUwYzQzOTViMmRjMTRmM2Q4YTZkOTc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEyNzY3ODg0ODIxLC0xMjIuNDMxOTI4MDExMDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODAzZGQ5MDg3NWI5NGUxOGJjYzA2NjU4NDllNDMwZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGEyN2Y1ZTU4YTI4NGM0YTkzZjA5ZTY2MjQ5ODA1ODggPSAkKCc8ZGl2IGlkPSJodG1sXzBhMjdmNWU1OGEyODRjNGE5M2YwOWU2NjI0OTgwNTg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODAzZGQ5MDg3NWI5NGUxOGJjYzA2NjU4NDllNDMwZGIuc2V0Q29udGVudChodG1sXzBhMjdmNWU1OGEyODRjNGE5M2YwOWU2NjI0OTgwNTg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjZmFlMWUyMGUwYzQzOTViMmRjMTRmM2Q4YTZkOTc4LmJpbmRQb3B1cChwb3B1cF84MDNkZDkwODc1Yjk0ZTE4YmNjMDY2NTg0OWU0MzBkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTcwYjg4YzhkY2Y0YTJkYjk2NjkyMWYzNzY4ZTViZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4OTU3MTAyNTU4NjMsLTEyMi40MDIxNjM3MTM2MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZmExMzAzNzFhODk0ZWJhOWZmNDEzNTdjYTNjNzMxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWIzNjM2YWNlNzY0N2E1OTJiOWRjNWJjZDE3NGE1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDViMzYzNmFjZTc2NDdhNTkyYjlkYzViY2QxNzRhNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVU5LRU5ORVNTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZmExMzAzNzFhODk0ZWJhOWZmNDEzNTdjYTNjNzMxYS5zZXRDb250ZW50KGh0bWxfMDViMzYzNmFjZTc2NDdhNTkyYjlkYzViY2QxNzRhNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjE3MGI4OGM4ZGNmNGEyZGI5NjY5MjFmMzc2OGU1YmYuYmluZFBvcHVwKHBvcHVwXzlmYTEzMDM3MWE4OTRlYmE5ZmY0MTM1N2NhM2M3MzFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzYzdhY2UyOGE2ZDQwNzFhMTQ5MDhmNDUyYzU4MDI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ2YmVjOWYwMjEzODQ3NzViMGNmMDdmYWNhZWFiYzkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3ZTVhNjM3ZWFkZjRmOGE5MjdkNjg5YmExMTgzYjBkID0gJCgnPGRpdiBpZD0iaHRtbF84N2U1YTYzN2VhZGY0ZjhhOTI3ZDY4OWJhMTE4M2IwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2YmVjOWYwMjEzODQ3NzViMGNmMDdmYWNhZWFiYzkzLnNldENvbnRlbnQoaHRtbF84N2U1YTYzN2VhZGY0ZjhhOTI3ZDY4OWJhMTE4M2IwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2M3YWNlMjhhNmQ0MDcxYTE0OTA4ZjQ1MmM1ODAyNS5iaW5kUG9wdXAocG9wdXBfNDZiZWM5ZjAyMTM4NDc3NWIwY2YwN2ZhY2FlYWJjOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmFhNTI2ODU5NDdhNGE3ZGJjNTcyNjQxZDAyZDg0ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM4MzY1NTY1MzQ3OTQsLTEyMi40MTM3OTA5NzI3ODA5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3NzkyMTlhYWE5NzRjMTI4NjU5MjBmOTNmYzgwMDkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiNzBmYjY5YmY5NjRjOGI5N2MzMjdhN2ExYWI0ZWNlID0gJCgnPGRpdiBpZD0iaHRtbF82YjcwZmI2OWJmOTY0YzhiOTdjMzI3YTdhMWFiNGVjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Nzc5MjE5YWFhOTc0YzEyODY1OTIwZjkzZmM4MDA5MC5zZXRDb250ZW50KGh0bWxfNmI3MGZiNjliZjk2NGM4Yjk3YzMyN2E3YTFhYjRlY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmFhNTI2ODU5NDdhNGE3ZGJjNTcyNjQxZDAyZDg0ZjUuYmluZFBvcHVwKHBvcHVwXzc3NzkyMTlhYWE5NzRjMTI4NjU5MjBmOTNmYzgwMDkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2MTdjMGQzNTJkZjQ1ODBiMGQ3NTNhZTI1MDEzNWJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2ZDQ2NTIyNjM3ZjQ0MWM4YWM3NjQzODc3OTc5MGI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3MmRjZWYzZjYzZTQ5NTM4MjU0OGU1MWU0MTBlNzkxID0gJCgnPGRpdiBpZD0iaHRtbF9kNzJkY2VmM2Y2M2U0OTUzODI1NDhlNTFlNDEwZTc5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2ZDQ2NTIyNjM3ZjQ0MWM4YWM3NjQzODc3OTc5MGI3LnNldENvbnRlbnQoaHRtbF9kNzJkY2VmM2Y2M2U0OTUzODI1NDhlNTFlNDEwZTc5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNjE3YzBkMzUyZGY0NTgwYjBkNzUzYWUyNTAxMzViZS5iaW5kUG9wdXAocG9wdXBfYTZkNDY1MjI2MzdmNDQxYzhhYzc2NDM4Nzc5NzkwYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQ3MTBlZDc5ZDUwNGRmZGJmZmRjMWUwZjA5ZWVhNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzZkZTgzYzkyZmY0ZGI2OTJlODEyYmZhODQ0ZDg5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTZmNjkxMWNlOTQ0ZjZlOTM5MDk4NDBmZjdjMWE1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfODE2ZjY5MTFjZTk0NGY2ZTkzOTA5ODQwZmY3YzFhNWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M2ZGU4M2M5MmZmNGRiNjkyZTgxMmJmYTg0NGQ4OTAuc2V0Q29udGVudChodG1sXzgxNmY2OTExY2U5NDRmNmU5MzkwOTg0MGZmN2MxYTVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM0NzEwZWQ3OWQ1MDRkZmRiZmZkYzFlMGYwOWVlYTU2LmJpbmRQb3B1cChwb3B1cF9jYzZkZTgzYzkyZmY0ZGI2OTJlODEyYmZhODQ0ZDg5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTU0NjhjZDI5N2U0NmNlOTE5OGQwMzViNTRiM2IwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2MTUxNThhZDlmMTQ4YzFhOGYzZGY0ZjZiNzA4NjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjZjdhMjBlMTJiYTRmZTk5YTQwNDAyMWFkYTY1ZThlID0gJCgnPGRpdiBpZD0iaHRtbF8yY2Y3YTIwZTEyYmE0ZmU5OWE0MDQwMjFhZGE2NWU4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NjE1MTU4YWQ5ZjE0OGMxYThmM2RmNGY2YjcwODY5YS5zZXRDb250ZW50KGh0bWxfMmNmN2EyMGUxMmJhNGZlOTlhNDA0MDIxYWRhNjVlOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDU1NDY4Y2QyOTdlNDZjZTkxOThkMDM1YjU0YjNiMDcuYmluZFBvcHVwKHBvcHVwXzU2MTUxNThhZDlmMTQ4YzFhOGYzZGY0ZjZiNzA4NjlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3MDRjYjQxYzdhMDRmN2M4MzY4M2RiNDhlMmUwMTg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1OTk4ODMyMzc5Nzk2LC0xMjIuNDExNzQ3MzcxOTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmI5NGYyZmYwYzRkNDViM2JkNjAyNmQ0MDg5Nzc4YjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJjOTQ2YzMzYTg4NDg2NGE5NWJjMTJjMWZkMjMzZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzliYzk0NmMzM2E4ODQ4NjRhOTViYzEyYzFmZDIzM2Y5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVVNQSUNJT1VTIE9DQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmI5NGYyZmYwYzRkNDViM2JkNjAyNmQ0MDg5Nzc4YjQuc2V0Q29udGVudChodG1sXzliYzk0NmMzM2E4ODQ4NjRhOTViYzEyYzFmZDIzM2Y5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3MDRjYjQxYzdhMDRmN2M4MzY4M2RiNDhlMmUwMTg2LmJpbmRQb3B1cChwb3B1cF9iYjk0ZjJmZjBjNGQ0NWIzYmQ2MDI2ZDQwODk3NzhiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTEwOGQ2ODlkMzI0YjllOWI2N2ZiNGJiY2M0N2IxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0YzQ0NzhjYzlhZDRjMmFhZjEyMDE2ZDhkMGVjYmZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiODMyYTg3ZDliMjQ4YmZiODdlZDAwYjVlOTRmMDFlID0gJCgnPGRpdiBpZD0iaHRtbF8wYjgzMmE4N2Q5YjI0OGJmYjg3ZWQwMGI1ZTk0ZjAxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0YzQ0NzhjYzlhZDRjMmFhZjEyMDE2ZDhkMGVjYmZlLnNldENvbnRlbnQoaHRtbF8wYjgzMmE4N2Q5YjI0OGJmYjg3ZWQwMGI1ZTk0ZjAxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTEwOGQ2ODlkMzI0YjllOWI2N2ZiNGJiY2M0N2IxOS5iaW5kUG9wdXAocG9wdXBfODRjNDQ3OGNjOWFkNGMyYWFmMTIwMTZkOGQwZWNiZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTVjZWI3YTEyNzYxNGNkMjhhNjhkNTM4NjIxNzhkNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODUwMjI2NjIyNzg2LC0xMjIuNDExOTg3NjQzNTk1MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83OTY1MmRlMDViNzg0OTEzYjI5OGY3MGJjY2VkYmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZWMxZWEwZGQxMjQ0YWJhOGZhMDdlYmU1YzJlMzJjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjM1NTdhMGMzYzM0NDJiYjg3MDA0ZjIzMzQ3ZWNlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzIzNTU3YTBjM2MzNDQyYmI4NzAwNGYyMzM0N2VjZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVjMWVhMGRkMTI0NGFiYThmYTA3ZWJlNWMyZTMyYzQuc2V0Q29udGVudChodG1sXzMyMzU1N2EwYzNjMzQ0MmJiODcwMDRmMjMzNDdlY2ViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1Y2ViN2ExMjc2MTRjZDI4YTY4ZDUzODYyMTc4ZDRjLmJpbmRQb3B1cChwb3B1cF80ZWMxZWEwZGQxMjQ0YWJhOGZhMDdlYmU1YzJlMzJjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTY4MWE0NmU4OGQ0Yjg3ODBhM2Q0MmE4ZTQxYjZhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDYyMDY0OTEwNjQ5NSwtMTIyLjUwMDM4MDQyNzkxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU5ZjAzOWM5OTU5NzRkYTI5ZDg1NjMzNTNkOGQ5ZTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0NGQ0NmI0YmY1ZjQ5ODY5ZTg0ZTg1ODg1ZmUyZjdiID0gJCgnPGRpdiBpZD0iaHRtbF82NDRkNDZiNGJmNWY0OTg2OWU4NGU4NTg4NWZlMmY3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5ZjAzOWM5OTU5NzRkYTI5ZDg1NjMzNTNkOGQ5ZTc5LnNldENvbnRlbnQoaHRtbF82NDRkNDZiNGJmNWY0OTg2OWU4NGU4NTg4NWZlMmY3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMTY4MWE0NmU4OGQ0Yjg3ODBhM2Q0MmE4ZTQxYjZhNC5iaW5kUG9wdXAocG9wdXBfNTlmMDM5Yzk5NTk3NGRhMjlkODU2MzM1M2Q4ZDllNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWM0OTQyN2YyMDEzNDE5ZWI4YWUzZDI2MGJiYmIwZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTZjZmFjNzFmY2VhNDdhZWI1NjFjYzNmYzEzMmQ2ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTY1MzcwNTYxMTUzNDFhYWFhZDA5ZmUxYTBlZGMyNGMgPSAkKCc8ZGl2IGlkPSJodG1sX2U2NTM3MDU2MTE1MzQxYWFhYWQwOWZlMWEwZWRjMjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NmNmYWM3MWZjZWE0N2FlYjU2MWNjM2ZjMTMyZDZmZS5zZXRDb250ZW50KGh0bWxfZTY1MzcwNTYxMTUzNDFhYWFhZDA5ZmUxYTBlZGMyNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWM0OTQyN2YyMDEzNDE5ZWI4YWUzZDI2MGJiYmIwZDIuYmluZFBvcHVwKHBvcHVwXzk2Y2ZhYzcxZmNlYTQ3YWViNTYxY2MzZmMxMzJkNmZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4YjcyNDBlYzM1ZTQwNjU5MmUyYjYyOTNkMzE1OTI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQ5MDg0MTcyOTAyOCwtMTIyLjQ4NjkyNTk2MDExNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2E1MzA2ZjJkODM5NDBmOWEyNjc3NjJjZGU3ODM3NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQyZWFiYzY0NjQxNGIxZmIzZWRlNmMyMDY2MTU4MGYgPSAkKCc8ZGl2IGlkPSJodG1sX2M0MmVhYmM2NDY0MTRiMWZiM2VkZTZjMjA2NjE1ODBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E1MzA2ZjJkODM5NDBmOWEyNjc3NjJjZGU3ODM3NzIuc2V0Q29udGVudChodG1sX2M0MmVhYmM2NDY0MTRiMWZiM2VkZTZjMjA2NjE1ODBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4YjcyNDBlYzM1ZTQwNjU5MmUyYjYyOTNkMzE1OTI5LmJpbmRQb3B1cChwb3B1cF83YTUzMDZmMmQ4Mzk0MGY5YTI2Nzc2MmNkZTc4Mzc3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMTI2NWQ3YTFiYmQ0OTEyODZiZWYxNDhjMjIyNWUyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2ODUzNjAxMjM1ODMsLTEyMi40MTU2MTYzMzgzMTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkOWU5YzIyM2Y4ZDRmMzM4MDM5ODcwOWRkODlmNDZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkNDIzZTAzMjU3ZDQ1MDc5ZmE2MzkzMzU2ZjU1ZGQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8wZDQyM2UwMzI1N2Q0NTA3OWZhNjM5MzM1NmY1NWRkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDllOWMyMjNmOGQ0ZjMzODAzOTg3MDlkZDg5ZjQ2Zi5zZXRDb250ZW50KGh0bWxfMGQ0MjNlMDMyNTdkNDUwNzlmYTYzOTMzNTZmNTVkZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDEyNjVkN2ExYmJkNDkxMjg2YmVmMTQ4YzIyMjVlMmEuYmluZFBvcHVwKHBvcHVwXzJkOWU5YzIyM2Y4ZDRmMzM4MDM5ODcwOWRkODlmNDZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxMGE1ZGQyNjUwODQ3YWFiNWUwMDgyNjVkMzA0NWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzc5NjUyZGUwNWI3ODQ5MTNiMjk4ZjcwYmNjZWRiYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxNWRjYjIyM2IyMTQyOTU5NTBiNDU1OWEwMjFlYTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwOTQ4ZjcwYTA0YTRjYzlhOTJlZTYzM2RlYmZlNTFhID0gJCgnPGRpdiBpZD0iaHRtbF8xMDk0OGY3MGEwNGE0Y2M5YTkyZWU2MzNkZWJmZTUxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxNWRjYjIyM2IyMTQyOTU5NTBiNDU1OWEwMjFlYTkxLnNldENvbnRlbnQoaHRtbF8xMDk0OGY3MGEwNGE0Y2M5YTkyZWU2MzNkZWJmZTUxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTBhNWRkMjY1MDg0N2FhYjVlMDA4MjY1ZDMwNDVmZS5iaW5kUG9wdXAocG9wdXBfNjE1ZGNiMjIzYjIxNDI5NTk1MGI0NTU5YTAyMWVhOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzI2ODkyNzM2ZjAzNDc4YWJiODljYWZhYWM2MWE5ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGUzZGRmMDc5ODMyNGIwMDlkMDQ5MDkwYzdhMTg2NzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYyZWRhODhkYzA2NDQwNWI5Mjk5YzI2YThkZDQ0ODkgPSAkKCc8ZGl2IGlkPSJodG1sXzM2MmVkYTg4ZGMwNjQ0MDViOTI5OWMyNmE4ZGQ0NDg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTNkZGYwNzk4MzI0YjAwOWQwNDkwOTBjN2ExODY3NC5zZXRDb250ZW50KGh0bWxfMzYyZWRhODhkYzA2NDQwNWI5Mjk5YzI2YThkZDQ0ODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzI2ODkyNzM2ZjAzNDc4YWJiODljYWZhYWM2MWE5ZTUuYmluZFBvcHVwKHBvcHVwXzhlM2RkZjA3OTgzMjRiMDA5ZDA0OTA5MGM3YTE4Njc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhZTUxZmI5NzkxOTQwN2E5ZGRlZmY3NDFhMTE3NTk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM1MjY4MTQ2OTA4Mzk2LC0xMjIuNDcyNzE1NzU5NjMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNzk2NTJkZTA1Yjc4NDkxM2IyOThmNzBiY2NlZGJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Y1Mzk2ZjYzMjM5NDVmN2FlYmY4YmRkNGMwNjdmMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGM2ZmE2N2JhYjliNGU4YWFhOGM2M2MyMmI0MWI3MzMgPSAkKCc8ZGl2IGlkPSJodG1sXzBjNmZhNjdiYWI5YjRlOGFhYThjNjNjMjJiNDFiNzMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZjUzOTZmNjMyMzk0NWY3YWViZjhiZGQ0YzA2N2YzMy5zZXRDb250ZW50KGh0bWxfMGM2ZmE2N2JhYjliNGU4YWFhOGM2M2MyMmI0MWI3MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2FlNTFmYjk3OTE5NDA3YTlkZGVmZjc0MWExMTc1OTYuYmluZFBvcHVwKHBvcHVwXzdmNTM5NmY2MzIzOTQ1ZjdhZWJmOGJkZDRjMDY3ZjMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc2039ebe48>" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create map and display it\n", | |
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n", | |
"\n", | |
"# loop through the 100 crimes and add each to the map\n", | |
"for lat, lng, label in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n", | |
" folium.features.CircleMarker(\n", | |
" [lat, lng],\n", | |
" radius=5, # define how big you want the circle markers to be\n", | |
" color='yellow',\n", | |
" fill=True,\n", | |
" popup=label,\n", | |
" fill_color='blue',\n", | |
" fill_opacity=0.6\n", | |
" ).add_to(sanfran_map)\n", | |
"\n", | |
"# show map\n", | |
"sanfran_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"The other proper remedy is to group the markers into different clusters. Each cluster is then represented by the number of crimes in each neighborhood. These clusters can be thought of as pockets of San Francisco which you can then analyze separately.\n", | |
"\n", | |
"To implement this, we start off by instantiating a *MarkerCluster* object and adding all the data points in the dataframe to this object." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOGNmYzk0MWFlMTNjNDNiYWIzYmM2ZDJiNDdlZmQ3ODQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMS4wL01hcmtlckNsdXN0ZXIuRGVmYXVsdC5jc3MiLz4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF84Y2ZjOTQxYWUxM2M0M2JhYjNiYzZkMmI0N2VmZDc4NCIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfOGNmYzk0MWFlMTNjNDNiYWIzYmM2ZDJiNDdlZmQ3ODQgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfOGNmYzk0MWFlMTNjNDNiYWIzYmM2ZDJiNDdlZmQ3ODQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzM3Ljc3LC0xMjIuNDJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzgwMDkyZjVlMWUzMTQxOWU5NGUxMjU3N2YxZmNhMjc4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzhjZmM5NDFhZTEzYzQzYmFiM2JjNmQyYjQ3ZWZkNzg0KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkgPSBMLm1hcmtlckNsdXN0ZXJHcm91cCh7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1hcF84Y2ZjOTQxYWUxM2M0M2JhYjNiYzZkMmI0N2VmZDc4NC5hZGRMYXllcihtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQzNjEwMTdmZTA5YzQyNzZiNGM2NzMzMTYzNzlmZDFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyNDc2ZmFhZDU3NDQzMGU4MzY5ZGVmMGJkMzUyYzg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwN2ZkYmI3ZGY2ZDQ1NmY4MmU4MTBlMTgyM2Y4NmIyID0gJCgnPGRpdiBpZD0iaHRtbF8yMDdmZGJiN2RmNmQ0NTZmODJlODEwZTE4MjNmODZiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0VBUE9OIExBV1M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyNDc2ZmFhZDU3NDQzMGU4MzY5ZGVmMGJkMzUyYzg3LnNldENvbnRlbnQoaHRtbF8yMDdmZGJiN2RmNmQ0NTZmODJlODEwZTE4MjNmODZiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzNjEwMTdmZTA5YzQyNzZiNGM2NzMzMTYzNzlmZDFhLmJpbmRQb3B1cChwb3B1cF83MjQ3NmZhYWQ1NzQ0MzBlODM2OWRlZjBiZDM1MmM4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjhiMGVlYmJlNjc0MGQ2YWFmMWY5NThkMWQ5Mzc2NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wM2NlODhhYjVkNjM0NmZkYTQyNThmOTRiZTRhMGRhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNTRiOWE5OGIyOGM0YzBjODMzODM1NDNjNzk4M2Q1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjU0YjlhOThiMjhjNGMwYzgzMzgzNTQzYzc5ODNkNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wM2NlODhhYjVkNjM0NmZkYTQyNThmOTRiZTRhMGRhYy5zZXRDb250ZW50KGh0bWxfYjU0YjlhOThiMjhjNGMwYzgzMzgzNTQzYzc5ODNkNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMjhiMGVlYmJlNjc0MGQ2YWFmMWY5NThkMWQ5Mzc2Ni5iaW5kUG9wdXAocG9wdXBfMDNjZTg4YWI1ZDYzNDZmZGE0MjU4Zjk0YmU0YTBkYWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjk3M2E2MGMzNjMyNDJlMmIwOGM2NGQyYmRlMTkzZjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjk5ODA5NjcyOTk1OTYsLTEyMi4zODg4NTYyMDQyOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2NDQ2OGQzMjRmYjQ3YjRiMDI2NGMxZWMxZGRmZGYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmOTg1ZDdiZGRmOTQ0MDhhNjJkYmZlYmZkYTZiZWUxID0gJCgnPGRpdiBpZD0iaHRtbF9hZjk4NWQ3YmRkZjk0NDA4YTYyZGJmZWJmZGE2YmVlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2NDQ2OGQzMjRmYjQ3YjRiMDI2NGMxZWMxZGRmZGYzLnNldENvbnRlbnQoaHRtbF9hZjk4NWQ3YmRkZjk0NDA4YTYyZGJmZWJmZGE2YmVlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI5NzNhNjBjMzYzMjQyZTJiMDhjNjRkMmJkZTE5M2Y0LmJpbmRQb3B1cChwb3B1cF81NjQ0NjhkMzI0ZmI0N2I0YjAyNjRjMWVjMWRkZmRmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NTU5Y2IyYmFiNDk0ODhkYThiYTBiNTRlYzE3ZjYxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTc4ODM3NjY4ODc5LC0xMjIuNDEyOTcwNTM3NTkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOTc2OWM5NzZiZDM0NmZhYjg1NzQ2MzdlZjMyMTI0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDUyNDM1OTUwMTQ0YTU5YjE2ZTdkNTAwYmRjZGEzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfODQ1MjQzNTk1MDE0NGE1OWIxNmU3ZDUwMGJkY2RhMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjk3NjljOTc2YmQzNDZmYWI4NTc0NjM3ZWYzMjEyNGUuc2V0Q29udGVudChodG1sXzg0NTI0MzU5NTAxNDRhNTliMTZlN2Q1MDBiZGNkYTMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDU1OWNiMmJhYjQ5NDg4ZGE4YmEwYjU0ZWMxN2Y2MTUuYmluZFBvcHVwKHBvcHVwXzI5NzY5Yzk3NmJkMzQ2ZmFiODU3NDYzN2VmMzIxMjRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MwZGFhYmE5ZjA5ODQyODk4YzE5ZmMwMGYyMzExMzYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1MDUwMTIxNDY2OCwtMTIyLjQxOTY3MTc4MDI5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGFkOGNhYmI5YTM4NDAxZjk5YTQ0YTY5ZjAyYmRiNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzg2MzUwNzMwZWViNGI0NDlmNjVjNjc1ZDE5MjZkMzIgPSAkKCc8ZGl2IGlkPSJodG1sX2M4NjM1MDczMGVlYjRiNDQ5ZjY1YzY3NWQxOTI2ZDMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhhZDhjYWJiOWEzODQwMWY5OWE0NGE2OWYwMmJkYjRhLnNldENvbnRlbnQoaHRtbF9jODYzNTA3MzBlZWI0YjQ0OWY2NWM2NzVkMTkyNmQzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwZGFhYmE5ZjA5ODQyODk4YzE5ZmMwMGYyMzExMzYyLmJpbmRQb3B1cChwb3B1cF84YWQ4Y2FiYjlhMzg0MDFmOTlhNDRhNjlmMDJiZGI0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZGViNzk2NzcyOWU0MTI4OThkNjc1ZTNjOTQ1YzhlMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODc2NmYyYmI2MWY0NTZlOWU1NjQ3ZWUwMDY0MWNlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTYwYWEzMDA2NGM0NDU4YmIxNWMzMjA5Zjg1MWEyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2E2MGFhMzAwNjRjNDQ1OGJiMTVjMzIwOWY4NTFhMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4NzY2ZjJiYjYxZjQ1NmU5ZTU2NDdlZTAwNjQxY2U2LnNldENvbnRlbnQoaHRtbF9jYTYwYWEzMDA2NGM0NDU4YmIxNWMzMjA5Zjg1MWEyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRkZWI3OTY3NzI5ZTQxMjg5OGQ2NzVlM2M5NDVjOGUwLmJpbmRQb3B1cChwb3B1cF85ODc2NmYyYmI2MWY0NTZlOWU1NjQ3ZWUwMDY0MWNlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZTkwM2RiNjA0MGQ0NjE3YTgzOTIwOWUzODJkZTUzYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDg3ODkzNjAyMTQsLTEyMi40MDU3MjE0NTQ1NjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4OGYwMDM3ZDhhNjQ5ODdiZTA0YjJlMTg4ZWI5MWY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5N2I1NTQ1ZDc0ZTRlMTFiYmYzZDhkYWNlMDgzYmM4ID0gJCgnPGRpdiBpZD0iaHRtbF80OTdiNTU0NWQ3NGU0ZTExYmJmM2Q4ZGFjZTA4M2JjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4OGYwMDM3ZDhhNjQ5ODdiZTA0YjJlMTg4ZWI5MWY3LnNldENvbnRlbnQoaHRtbF80OTdiNTU0NWQ3NGU0ZTExYmJmM2Q4ZGFjZTA4M2JjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RlOTAzZGI2MDQwZDQ2MTdhODM5MjA5ZTM4MmRlNTNjLmJpbmRQb3B1cChwb3B1cF8yODhmMDAzN2Q4YTY0OTg3YmUwNGIyZTE4OGViOTFmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NzQxYTA5NmM2ZmM0ZWMzODI2NjMwZGFlZGI5Yzg0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4Mzk4MDU1OTI2MzQsLTEyMi40MTE3NzgyOTU5OTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZjA0NThjYWU5YjRjOTU5NGIyNDViNmRkY2M5OWExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiZTcyMjdjNjIxNjQ4ZDhhZjU3YmQ5Y2ZmOWM4NWNkID0gJCgnPGRpdiBpZD0iaHRtbF83YmU3MjI3YzYyMTY0OGQ4YWY1N2JkOWNmZjljODVjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmYwNDU4Y2FlOWI0Yzk1OTRiMjQ1YjZkZGNjOTlhMS5zZXRDb250ZW50KGh0bWxfN2JlNzIyN2M2MjE2NDhkOGFmNTdiZDljZmY5Yzg1Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NzQxYTA5NmM2ZmM0ZWMzODI2NjMwZGFlZGI5Yzg0NC5iaW5kUG9wdXAocG9wdXBfYWZmMDQ1OGNhZTliNGM5NTk0YjI0NWI2ZGRjYzk5YTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGM5MTVkMTkwZWY3NDIzNmIwNjBmNjJhMDJjYjY5YTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlNDkzYzhhMTBjODQ0ZDVhOTYxZTIzZDc0Y2U4Y2M4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2NDg5ZWEyNGE2NjRkYTA4MjJkMzQ1M2FjMzIzZDRjID0gJCgnPGRpdiBpZD0iaHRtbF9mNjQ4OWVhMjRhNjY0ZGEwODIyZDM0NTNhYzMyM2Q0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlNDkzYzhhMTBjODQ0ZDVhOTYxZTIzZDc0Y2U4Y2M4LnNldENvbnRlbnQoaHRtbF9mNjQ4OWVhMjRhNjY0ZGEwODIyZDM0NTNhYzMyM2Q0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBjOTE1ZDE5MGVmNzQyMzZiMDYwZjYyYTAyY2I2OWExLmJpbmRQb3B1cChwb3B1cF9jZTQ5M2M4YTEwYzg0NGQ1YTk2MWUyM2Q3NGNlOGNjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NGFlYmQ1ZDEyODQ0NGJmODI2MjQ1MmMzOTNhMWQ5YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyOTE4ZDM0MmI1MTRkOGJhYWE5Y2ZhYjcxNzViOWJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4Y2YzNTFkYTdlNTQ3ZmI5YjhhYzk3YzU3OGEzN2ZkID0gJCgnPGRpdiBpZD0iaHRtbF81OGNmMzUxZGE3ZTU0N2ZiOWI4YWM5N2M1NzhhMzdmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyOTE4ZDM0MmI1MTRkOGJhYWE5Y2ZhYjcxNzViOWJjLnNldENvbnRlbnQoaHRtbF81OGNmMzUxZGE3ZTU0N2ZiOWI4YWM5N2M1NzhhMzdmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ0YWViZDVkMTI4NDQ0YmY4MjYyNDUyYzM5M2ExZDljLmJpbmRQb3B1cChwb3B1cF84MjkxOGQzNDJiNTE0ZDhiYWFhOWNmYWI3MTc1YjliYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NWU4ZmI1YTk1YjE0MGYzOGFmNDljOGJhZmRiOThkNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTNmNzYxNDE5NTc0MjZkODBlYTA2OGYzYTJlOGQ4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzcyMDNlODFiYmY0MjBjOTgyZGMxMTdjYzY1MDg3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfODM3MjAzZTgxYmJmNDIwYzk4MmRjMTE3Y2M2NTA4NzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1M2Y3NjE0MTk1NzQyNmQ4MGVhMDY4ZjNhMmU4ZDhhLnNldENvbnRlbnQoaHRtbF84MzcyMDNlODFiYmY0MjBjOTgyZGMxMTdjYzY1MDg3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ1ZThmYjVhOTViMTQwZjM4YWY0OWM4YmFmZGI5OGQ2LmJpbmRQb3B1cChwb3B1cF9kNTNmNzYxNDE5NTc0MjZkODBlYTA2OGYzYTJlOGQ4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84MTBkYTAzYzdiNDI0ODRjOWQyM2Y4NGU5YTFlMTEyMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTczODk0Mjk2NTQ5NSwtMTIyLjQ3Nzk2MDMyNzI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTFlYmE4YzQ4MDY3NDVhN2EwMjJlN2RjNjBlMWU2MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjNiNGU5M2E0ZDMxNDhmYjgzNjAzODk2OWQwOWQwZjIgPSAkKCc8ZGl2IGlkPSJodG1sX2YzYjRlOTNhNGQzMTQ4ZmI4MzYwMzg5NjlkMDlkMGYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExZWJhOGM0ODA2NzQ1YTdhMDIyZTdkYzYwZTFlNjA3LnNldENvbnRlbnQoaHRtbF9mM2I0ZTkzYTRkMzE0OGZiODM2MDM4OTY5ZDA5ZDBmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgxMGRhMDNjN2I0MjQ4NGM5ZDIzZjg0ZTlhMWUxMTIyLmJpbmRQb3B1cChwb3B1cF8xMWViYThjNDgwNjc0NWE3YTAyMmU3ZGM2MGUxZTYwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZWJiNWJkZDZmZGQ0ZjYwYjgzZDg2MjE5MzBlNTdhYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzgyYzA1MzdjNDc0NWU1OGI3NGVhOTYzZmMwNmVkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzAyYWEwZWZiZWU0OTA1YTljZDc0YjIxNTc2ODhhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTMwMmFhMGVmYmVlNDkwNWE5Y2Q3NGIyMTU3Njg4YTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzgyYzA1MzdjNDc0NWU1OGI3NGVhOTYzZmMwNmVkMS5zZXRDb250ZW50KGh0bWxfMTMwMmFhMGVmYmVlNDkwNWE5Y2Q3NGIyMTU3Njg4YTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81ZWJiNWJkZDZmZGQ0ZjYwYjgzZDg2MjE5MzBlNTdhYS5iaW5kUG9wdXAocG9wdXBfMzM4MmMwNTM3YzQ3NDVlNThiNzRlYTk2M2ZjMDZlZDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDExOTQ1N2M5ODVkNDFiZDg3ZWY5ZTM3MzQ2YTJlMGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMGE2MmRlZDAzZWM0NjlmYjVjZTNlMWJkMGVhNGYyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTYyOTNiOTg0ZWU0NWI2YTE5MmUyZWRmNGIwYjNjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzE2MjkzYjk4NGVlNDViNmExOTJlMmVkZjRiMGIzYzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwYTYyZGVkMDNlYzQ2OWZiNWNlM2UxYmQwZWE0ZjIyLnNldENvbnRlbnQoaHRtbF83MTYyOTNiOTg0ZWU0NWI2YTE5MmUyZWRmNGIwYjNjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQxMTk0NTdjOTg1ZDQxYmQ4N2VmOWUzNzM0NmEyZTBkLmJpbmRQb3B1cChwb3B1cF9kMGE2MmRlZDAzZWM0NjlmYjVjZTNlMWJkMGVhNGYyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMjI0YzM1OWExODI0OTE4YTI5MGIwMDJhYjY3NTk5MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MTY0Mjk4MjM4NCwtMTIyLjQwMDkwODY5ODg4OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yN2IwMjI1MzEwNjQ0NjgxODE1ZjM5MGI0ZWU2OWUyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMWIxNzBlNWI1MWI0ZmExOGI4YTJhNzVlM2NjMTllNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDFiMTcwZTViNTFiNGZhMThiOGEyYTc1ZTNjYzE5ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yN2IwMjI1MzEwNjQ0NjgxODE1ZjM5MGI0ZWU2OWUyNS5zZXRDb250ZW50KGh0bWxfZDFiMTcwZTViNTFiNGZhMThiOGEyYTc1ZTNjYzE5ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMjI0YzM1OWExODI0OTE4YTI5MGIwMDJhYjY3NTk5My5iaW5kUG9wdXAocG9wdXBfMjdiMDIyNTMxMDY0NDY4MTgxNWYzOTBiNGVlNjllMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTg4NjE5YTA2MDQ3NDA5YjhhYTc4NDlmMjVhNGViYzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM3MDY5MzAxNTQ1LC0xMjIuNDA4NTk1MTEwODY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZGI1NjQyMTk1Nzg0NGNlYjUxMTAwN2YxMmViOTc5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTlkODU3MjZkNTE0OGZjYjUwODQzODc1MWEwMjMwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2U5ZDg1NzI2ZDUxNDhmY2I1MDg0Mzg3NTFhMDIzMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNUT0xFTiBQUk9QRVJUWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRiNTY0MjE5NTc4NDRjZWI1MTEwMDdmMTJlYjk3OTEuc2V0Q29udGVudChodG1sXzNlOWQ4NTcyNmQ1MTQ4ZmNiNTA4NDM4NzUxYTAyMzBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTg4NjE5YTA2MDQ3NDA5YjhhYTc4NDlmMjVhNGViYzUuYmluZFBvcHVwKHBvcHVwXzZkYjU2NDIxOTU3ODQ0Y2ViNTExMDA3ZjEyZWI5NzkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U2MjY1YTM4OGQ2NDRiYWE5ZjI3NDkxNzVjOGRiMTIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMGFmZTdjMGUxNzI0OWQ4YmVhZWQzMmExNDNiODM5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjVkYTNiMzAzNzE0OGQyOWYzMTgyZmIxYmE0YWQ5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTY1ZGEzYjMwMzcxNDhkMjlmMzE4MmZiMWJhNGFkOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwYWZlN2MwZTE3MjQ5ZDhiZWFlZDMyYTE0M2I4MzkxLnNldENvbnRlbnQoaHRtbF85NjVkYTNiMzAzNzE0OGQyOWYzMTgyZmIxYmE0YWQ5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U2MjY1YTM4OGQ2NDRiYWE5ZjI3NDkxNzVjOGRiMTIyLmJpbmRQb3B1cChwb3B1cF9jMGFmZTdjMGUxNzI0OWQ4YmVhZWQzMmExNDNiODM5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZWJjZjI0MzAzMjI0NzgyOTc4NmZjYzM1MTc5MWU1NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODkwNjMwNTE4MjksLTEyMi40MjAzNTQ3ODA4NjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2MxMmExZDVhOWEyNDFhMmFiOWVlYjg5N2JhNDExOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMzMjIzNjE2MmJiNDFlMDk5NjZjMDM0M2E0MjRlZDQgPSAkKCc8ZGl2IGlkPSJodG1sX2RjMzIyMzYxNjJiYjQxZTA5OTY2YzAzNDNhNDI0ZWQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzEyYTFkNWE5YTI0MWEyYWI5ZWViODk3YmE0MTE4ZC5zZXRDb250ZW50KGh0bWxfZGMzMjIzNjE2MmJiNDFlMDk5NjZjMDM0M2E0MjRlZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZWJjZjI0MzAzMjI0NzgyOTc4NmZjYzM1MTc5MWU1NC5iaW5kUG9wdXAocG9wdXBfN2MxMmExZDVhOWEyNDFhMmFiOWVlYjg5N2JhNDExOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmFjNWMxM2QxZTI3NGFiMDgzMDk0ZTNjNjNmMTJhZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTU3NjU0MjY5OTUsLTEyMi40Mzk5MDk3NjY3NzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjZWI0NWZiYjNmZDRlOTg4Njc0MDk4YjE5NjFjNTU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlYjI0OWRlMzMwYzRmOWQ4ODQ5MWZmZmFiZTY1YmE0ID0gJCgnPGRpdiBpZD0iaHRtbF9mZWIyNDlkZTMzMGM0ZjlkODg0OTFmZmZhYmU2NWJhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWNlYjQ1ZmJiM2ZkNGU5ODg2NzQwOThiMTk2MWM1NTYuc2V0Q29udGVudChodG1sX2ZlYjI0OWRlMzMwYzRmOWQ4ODQ5MWZmZmFiZTY1YmE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmFjNWMxM2QxZTI3NGFiMDgzMDk0ZTNjNjNmMTJhZjUuYmluZFBvcHVwKHBvcHVwXzVjZWI0NWZiYjNmZDRlOTg4Njc0MDk4YjE5NjFjNTU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRlMDkxN2Q5ZDZiNjQ5YWVhMDNkZTc5MzE1ZmI5YTE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2JjYWEwMDc1OGJkNDhkYmIzNTAxMDE2NGFmNTk5ZTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVjYzY3MzFjNmRiNDNjYTg4MDU4MjliMmY1YWZiN2IgPSAkKCc8ZGl2IGlkPSJodG1sX2I1Y2M2NzMxYzZkYjQzY2E4ODA1ODI5YjJmNWFmYjdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YmNhYTAwNzU4YmQ0OGRiYjM1MDEwMTY0YWY1OTllMi5zZXRDb250ZW50KGh0bWxfYjVjYzY3MzFjNmRiNDNjYTg4MDU4MjliMmY1YWZiN2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ZTA5MTdkOWQ2YjY0OWFlYTAzZGU3OTMxNWZiOWExOS5iaW5kUG9wdXAocG9wdXBfN2JjYWEwMDc1OGJkNDhkYmIzNTAxMDE2NGFmNTk5ZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzMyZWJlZTkyMDYxNDJjNDk4YmM1Y2M4NzA1NjY2OTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM2MTg2Mjc2NDU2MDQsLTEyMi40MjIzMTU2NzA3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhYWI5ZmQ3ZjdjZTQwYzE5Njc4NjI5ZGYyNDQ2NjY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwNmMzNjM2MDkyNzQzNzdiYjRmOTY2ODhiMTgyOWY0ID0gJCgnPGRpdiBpZD0iaHRtbF85MDZjMzYzNjA5Mjc0Mzc3YmI0Zjk2Njg4YjE4MjlmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RlJBVUQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhYWI5ZmQ3ZjdjZTQwYzE5Njc4NjI5ZGYyNDQ2NjY4LnNldENvbnRlbnQoaHRtbF85MDZjMzYzNjA5Mjc0Mzc3YmI0Zjk2Njg4YjE4MjlmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMzMmViZWU5MjA2MTQyYzQ5OGJjNWNjODcwNTY2Njk4LmJpbmRQb3B1cChwb3B1cF9lYWFiOWZkN2Y3Y2U0MGMxOTY3ODYyOWRmMjQ0NjY2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOWRlOGI2ZWFhOGI0Zjg1YjcxZDEwNDEyN2UyZjk1ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5Mjg0MTI4NDA0NDcwNSwtMTIyLjQyNDUxOTgzNTAwOTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZWEyY2JmNDRhZWI0M2I2YmE1NzZmZDYyZWRmYmYyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82M2JmMjY0MjA1NjQ0MWNmOTQ2OGE0MTUxNTI4MDQ3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjNiZjI2NDIwNTY0NDFjZjk0NjhhNDE1MTUyODA0N2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZWEyY2JmNDRhZWI0M2I2YmE1NzZmZDYyZWRmYmYyMy5zZXRDb250ZW50KGh0bWxfNjNiZjI2NDIwNTY0NDFjZjk0NjhhNDE1MTUyODA0N2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jOWRlOGI2ZWFhOGI0Zjg1YjcxZDEwNDEyN2UyZjk1Zi5iaW5kUG9wdXAocG9wdXBfNWVhMmNiZjQ0YWViNDNiNmJhNTc2ZmQ2MmVkZmJmMjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmUxOWNjMWY3ZmUzNDc3N2E2MTFhODBhNTk0NGRhMmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTZlNTI0NmVjZGJiNGJhYzg4YmNmNDgwMzE5ZTc0NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzg3YzZlMmZhN2IwNDI0ODhiZGFmM2U3YmEwNDQyOWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M4N2M2ZTJmYTdiMDQyNDg4YmRhZjNlN2JhMDQ0MjlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NmU1MjQ2ZWNkYmI0YmFjODhiY2Y0ODAzMTllNzQ2Mi5zZXRDb250ZW50KGh0bWxfYzg3YzZlMmZhN2IwNDI0ODhiZGFmM2U3YmEwNDQyOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZTE5Y2MxZjdmZTM0Nzc3YTYxMWE4MGE1OTQ0ZGEyZS5iaW5kUG9wdXAocG9wdXBfOTZlNTI0NmVjZGJiNGJhYzg4YmNmNDgwMzE5ZTc0NjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDRhOTBiYWRhNGUxNGMzNDgxZWNiZDc1N2ZhNWZiMDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTZmNWY5ODVlYWY3NDIzZGE3NWY3NDEyMWVhMDljOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmFmZWMzMWViNTkwNGY3ZWI3NmQzMzBhNDIyNzk1ODEgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhZmVjMzFlYjU5MDRmN2ViNzZkMzMwYTQyMjc5NTgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZmNWY5ODVlYWY3NDIzZGE3NWY3NDEyMWVhMDljOGMuc2V0Q29udGVudChodG1sX2ZhZmVjMzFlYjU5MDRmN2ViNzZkMzMwYTQyMjc5NTgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDRhOTBiYWRhNGUxNGMzNDgxZWNiZDc1N2ZhNWZiMDIuYmluZFBvcHVwKHBvcHVwX2E2ZjVmOTg1ZWFmNzQyM2RhNzVmNzQxMjFlYTA5YzhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzUyNWYzNGE1NzYwYzQzY2JiYWVmNTA3NzVmODY4MDg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzcxNDkzOTk2OTQxNiwtMTIyLjUwNzc1MDEzMTAwNDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTQ3MGZiMmFhOWM0NTFjOTNkMTdiNmQwZWFmY2VjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MGNiMTA5ZGNiMjM0NjUzYmI0NDRmZjQ3Mzg5MmFmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDBjYjEwOWRjYjIzNDY1M2JiNDQ0ZmY0NzM4OTJhZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhNDcwZmIyYWE5YzQ1MWM5M2QxN2I2ZDBlYWZjZWM5LnNldENvbnRlbnQoaHRtbF80MGNiMTA5ZGNiMjM0NjUzYmI0NDRmZjQ3Mzg5MmFmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUyNWYzNGE1NzYwYzQzY2JiYWVmNTA3NzVmODY4MDg3LmJpbmRQb3B1cChwb3B1cF9mYTQ3MGZiMmFhOWM0NTFjOTNkMTdiNmQwZWFmY2VjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hY2VlMzlkYTYxMDM0MmZmODI3ZGUzMTY1NTQxNzZlOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2U0Y2RlMTA3YmY0YTAwYjMwNjk5MzJkMTA5NmRhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjMyYWYxOTM4Zjk0N2EzYjA4NWU4ZGUyNDY4NDAwMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWYzMmFmMTkzOGY5NDdhM2IwODVlOGRlMjQ2ODQwMDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zM2U0Y2RlMTA3YmY0YTAwYjMwNjk5MzJkMTA5NmRhZS5zZXRDb250ZW50KGh0bWxfNWYzMmFmMTkzOGY5NDdhM2IwODVlOGRlMjQ2ODQwMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hY2VlMzlkYTYxMDM0MmZmODI3ZGUzMTY1NTQxNzZlOS5iaW5kUG9wdXAocG9wdXBfMzNlNGNkZTEwN2JmNGEwMGIzMDY5OTMyZDEwOTZkYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTMyYTJiNWQxNmFiNDhkOGExYzc2ZGE0ZjU5NDNmNWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGE3M2JkOTc0ZGU0ZmZkOTRkYWE4MjM4NWNlZDIxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzM2ZDYzZjBjNTI0MTdjOThmYjc5N2Q2NDZkMTJiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDMzNmQ2M2YwYzUyNDE3Yzk4ZmI3OTdkNjQ2ZDEyYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZGE3M2JkOTc0ZGU0ZmZkOTRkYWE4MjM4NWNlZDIxMy5zZXRDb250ZW50KGh0bWxfZDMzNmQ2M2YwYzUyNDE3Yzk4ZmI3OTdkNjQ2ZDEyYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMzJhMmI1ZDE2YWI0OGQ4YTFjNzZkYTRmNTk0M2Y1Yy5iaW5kUG9wdXAocG9wdXBfYWRhNzNiZDk3NGRlNGZmZDk0ZGFhODIzODVjZWQyMTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTg5MTUzMTk1MDNiNGUwY2E1ZThlYWNjYmI1ZWRiNjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NTRmMDQ1MjRiOTE0YWI1OTRmODQ3ZWQ4MmViYTViOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNzVhMGNiOWZkNTI0Y2M1ODVkMTZlMGE4YjlkNDA3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTc1YTBjYjlmZDUyNGNjNTg1ZDE2ZTBhOGI5ZDQwNzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NTRmMDQ1MjRiOTE0YWI1OTRmODQ3ZWQ4MmViYTViOS5zZXRDb250ZW50KGh0bWxfMTc1YTBjYjlmZDUyNGNjNTg1ZDE2ZTBhOGI5ZDQwNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ODkxNTMxOTUwM2I0ZTBjYTVlOGVhY2NiYjVlZGI2Ni5iaW5kUG9wdXAocG9wdXBfODU0ZjA0NTI0YjkxNGFiNTk0Zjg0N2VkODJlYmE1YjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmVmMGIzYzdmMWQyNGE2NGE1ODVkOGZiNTJkOTU5ZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5YzhkZWY1MTg0OTQ1NzQ5MTkyOWUxMDUzYmQ1YjVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5ZDBiYTg3OGM5YTQ3MzlhYmU5YjQ1YTlmMmE4ZTA3ID0gJCgnPGRpdiBpZD0iaHRtbF9iOWQwYmE4NzhjOWE0NzM5YWJlOWI0NWE5ZjJhOGUwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5YzhkZWY1MTg0OTQ1NzQ5MTkyOWUxMDUzYmQ1YjVmLnNldENvbnRlbnQoaHRtbF9iOWQwYmE4NzhjOWE0NzM5YWJlOWI0NWE5ZjJhOGUwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZlZjBiM2M3ZjFkMjRhNjRhNTg1ZDhmYjUyZDk1OWY2LmJpbmRQb3B1cChwb3B1cF9hOWM4ZGVmNTE4NDk0NTc0OTE5MjllMTA1M2JkNWI1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZjNhNjYzMGUyMjE0MzU1OGZkNjIzMDZjOGIyMDUyOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0ODQ1NDE2NTEyNDQ0MWI5MTkzMmZlNGZiYjZmNTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5MTViYzU2NDg2NjRhYTU4MmFhZjdlYWUzNGExNjdhID0gJCgnPGRpdiBpZD0iaHRtbF83OTE1YmM1NjQ4NjY0YWE1ODJhYWY3ZWFlMzRhMTY3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDg0NTQxNjUxMjQ0NDFiOTE5MzJmZTRmYmI2ZjU3OS5zZXRDb250ZW50KGh0bWxfNzkxNWJjNTY0ODY2NGFhNTgyYWFmN2VhZTM0YTE2N2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZjNhNjYzMGUyMjE0MzU1OGZkNjIzMDZjOGIyMDUyOS5iaW5kUG9wdXAocG9wdXBfZTQ4NDU0MTY1MTI0NDQxYjkxOTMyZmU0ZmJiNmY1NzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzAzYzcyMWUyZGM2NDI3MzhiNzFmNzMwNjM1OTEyNjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5MjA5Mzc1NTMyOTUsLTEyMi40MTA4ODI4MjU1NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OTBlNjY3NmRlYTRjMTg4ZjU5YjA2MWViMmEyYTc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjMjViNTJhYmE2MTRlNWI5MTY5M2IwMDdmNTkzOGQyID0gJCgnPGRpdiBpZD0iaHRtbF9jYzI1YjUyYWJhNjE0ZTViOTE2OTNiMDA3ZjU5MzhkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkVISUNMRSBUSEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzg5MGU2Njc2ZGVhNGMxODhmNTliMDYxZWIyYTJhNzYuc2V0Q29udGVudChodG1sX2NjMjViNTJhYmE2MTRlNWI5MTY5M2IwMDdmNTkzOGQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzAzYzcyMWUyZGM2NDI3MzhiNzFmNzMwNjM1OTEyNjEuYmluZFBvcHVwKHBvcHVwXzM4OTBlNjY3NmRlYTRjMTg4ZjU5YjA2MWViMmEyYTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ1YTA2OWE1MTRkMDRkN2ViYmFhOTgwMjg3NzQyZDFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDY3MjkwMDZhODgzNGI5OWE4ZjE0YWIxMzVkYmM5YjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhkYmViZjdmOWRkNGQ5Y2FmYWRlNTk4NjZkMDg3ODIgPSAkKCc8ZGl2IGlkPSJodG1sXzc4ZGJlYmY3ZjlkZDRkOWNhZmFkZTU5ODY2ZDA4NzgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NjcyOTAwNmE4ODM0Yjk5YThmMTRhYjEzNWRiYzliNC5zZXRDb250ZW50KGh0bWxfNzhkYmViZjdmOWRkNGQ5Y2FmYWRlNTk4NjZkMDg3ODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NWEwNjlhNTE0ZDA0ZDdlYmJhYTk4MDI4Nzc0MmQxYS5iaW5kUG9wdXAocG9wdXBfNDY3MjkwMDZhODgzNGI5OWE4ZjE0YWIxMzVkYmM5YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTA4OWQ5NzhjNzU4NGZjOWFjM2I5MDZiNDk4MDU2ZDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDM1NTUwNTQyMjY1LC0xMjIuNDIxMTI4MDI5NTA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTE4ZmU5YTYwNTk0MDA0YTFjNmZlYmJlNTZlNTE0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNGQxMGE1YTdiZmE0MDQwYWNiZjE3NGRkZWY1ZGZkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDRkMTBhNWE3YmZhNDA0MGFjYmYxNzRkZGVmNWRmZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlMThmZTlhNjA1OTQwMDRhMWM2ZmViYmU1NmU1MTQ2LnNldENvbnRlbnQoaHRtbF8wNGQxMGE1YTdiZmE0MDQwYWNiZjE3NGRkZWY1ZGZkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwODlkOTc4Yzc1ODRmYzlhYzNiOTA2YjQ5ODA1NmQ3LmJpbmRQb3B1cChwb3B1cF9hZTE4ZmU5YTYwNTk0MDA0YTFjNmZlYmJlNTZlNTE0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjViMzFhZjViZTE0ZGYzYjE1ZjA5M2FkZWJjMGJjNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjU2NDc2MDc2ODUsLTEyMi40MDcyNDQwODcwMzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjNThjNTQ3OWQ3YzRiMGI4NzRmZjlhN2YwYTdmN2YzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkZTkxN2U0M2IwMTRiZThiZmQ3MjE2ZTRlZDg4MjM4ID0gJCgnPGRpdiBpZD0iaHRtbF9iZGU5MTdlNDNiMDE0YmU4YmZkNzIxNmU0ZWQ4ODIzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M1OGM1NDc5ZDdjNGIwYjg3NGZmOWE3ZjBhN2Y3ZjMuc2V0Q29udGVudChodG1sX2JkZTkxN2U0M2IwMTRiZThiZmQ3MjE2ZTRlZDg4MjM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzI1YjMxYWY1YmUxNGRmM2IxNWYwOTNhZGViYzBiYzQuYmluZFBvcHVwKHBvcHVwXzdjNThjNTQ3OWQ3YzRiMGI4NzRmZjlhN2YwYTdmN2YzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ2NGViYzBhMWI2MzQ3YTFiYjIwYmMwZmJmZDNhYzg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjgwODVjOTc5Zjc0NTk4YmFkNzQ0ZjQ1YzU5MTQ1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDY0N2ZlNjVmYWQ0NmNlOWIyNDNkMjM4YjBjMmE0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQ2NDdmZTY1ZmFkNDZjZTliMjQzZDIzOGIwYzJhNDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjgwODVjOTc5Zjc0NTk4YmFkNzQ0ZjQ1YzU5MTQ1MS5zZXRDb250ZW50KGh0bWxfZmQ2NDdmZTY1ZmFkNDZjZTliMjQzZDIzOGIwYzJhNDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NjRlYmMwYTFiNjM0N2ExYmIyMGJjMGZiZmQzYWM4Ny5iaW5kUG9wdXAocG9wdXBfYjY4MDg1Yzk3OWY3NDU5OGJhZDc0NGY0NWM1OTE0NTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2M3N2UzYzU1MDY0NDRkNDk4MDQ4MGJhNTk4ZmUyNDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjYWUyZTg3ZjFjZTQ2MDk5MzMxZTNjMDEzNThiZTMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxMWNiNjVjZGVjODRmOWM4MDYxMzVjYmM1OTk3N2VkID0gJCgnPGRpdiBpZD0iaHRtbF8zMTFjYjY1Y2RlYzg0ZjljODA2MTM1Y2JjNTk5NzdlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjYWUyZTg3ZjFjZTQ2MDk5MzMxZTNjMDEzNThiZTMzLnNldENvbnRlbnQoaHRtbF8zMTFjYjY1Y2RlYzg0ZjljODA2MTM1Y2JjNTk5NzdlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNjNzdlM2M1NTA2NDQ0ZDQ5ODA0ODBiYTU5OGZlMjQwLmJpbmRQb3B1cChwb3B1cF84Y2FlMmU4N2YxY2U0NjA5OTMzMWUzYzAxMzU4YmUzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZjg0Y2I0MTkwOGM0NmIyYmZiZDQwN2MxNTUxYjgyYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2E3YWYyOTA4NDczNDBlZGI1ZmIzN2M3MmJjMDdhNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODQzMzliMTBlYTBlNDkzNDhjYmQ5ZjFiYjZmZGE4NTMgPSAkKCc8ZGl2IGlkPSJodG1sXzg0MzM5YjEwZWEwZTQ5MzQ4Y2JkOWYxYmI2ZmRhODUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhN2FmMjkwODQ3MzQwZWRiNWZiMzdjNzJiYzA3YTRjLnNldENvbnRlbnQoaHRtbF84NDMzOWIxMGVhMGU0OTM0OGNiZDlmMWJiNmZkYTg1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JmODRjYjQxOTA4YzQ2YjJiZmJkNDA3YzE1NTFiODJjLmJpbmRQb3B1cChwb3B1cF83YTdhZjI5MDg0NzM0MGVkYjVmYjM3YzcyYmMwN2E0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZGI5NjU5ZDM2YWE0NGMzYmE4ZGRjOTlkNTIxYTI4MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQ2OTI4MjAwNDEsLTEyMi40MTU3NTcwMzkxOTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiNzc0NzIxZGUxNDQwZWQ5YmMwZTBhMjljY2EzZjRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4ZmZhOWY0ODFkYzQ2ZGU4MGYxZjgxOGVlZmY2MDNkID0gJCgnPGRpdiBpZD0iaHRtbF8zOGZmYTlmNDgxZGM0NmRlODBmMWY4MThlZWZmNjAzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYjc3NDcyMWRlMTQ0MGVkOWJjMGUwYTI5Y2NhM2Y0ZC5zZXRDb250ZW50KGh0bWxfMzhmZmE5ZjQ4MWRjNDZkZTgwZjFmODE4ZWVmZjYwM2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZGI5NjU5ZDM2YWE0NGMzYmE4ZGRjOTlkNTIxYTI4My5iaW5kUG9wdXAocG9wdXBfMGI3NzQ3MjFkZTE0NDBlZDliYzBlMGEyOWNjYTNmNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTNjNzQwYWQ5YTlhNDc4MjhjOWY4OGNlMmMwMGVkNjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjg1MjgwNjI3NDY1LC0xMjIuNDc1NjQ3NDYwNzg1OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2OWFkNWRkYWUxZDQ1YTM5ZmU4MDFlOTVmYjQ4NTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExMDE2NDEzOGUxNjQ3OWQ4ZTE4MzRlMjQ3YzYzYjBiID0gJCgnPGRpdiBpZD0iaHRtbF8xMTAxNjQxMzhlMTY0NzlkOGUxODM0ZTI0N2M2M2IwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Uk9CQkVSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY5YWQ1ZGRhZTFkNDVhMzlmZTgwMWU5NWZiNDg1Nzkuc2V0Q29udGVudChodG1sXzExMDE2NDEzOGUxNjQ3OWQ4ZTE4MzRlMjQ3YzYzYjBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTNjNzQwYWQ5YTlhNDc4MjhjOWY4OGNlMmMwMGVkNjkuYmluZFBvcHVwKHBvcHVwXzk2OWFkNWRkYWUxZDQ1YTM5ZmU4MDFlOTVmYjQ4NTc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M0MzQxMTc4MWI3YTQ5NzhiODA2YmQwYzY4NTRhN2UzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyODUxNzM3NDQ0ODk0LC0xMjIuNDIwOTY3NDQwNTY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NzdiOWM5OGU0MTE0ZjM1YTZiNzIxZjkwNmZkZjJlOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzI4MGYwN2UxYWI0Y2MxYjU0NzQ1ZmZlYmI3MmRlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDMyODBmMDdlMWFiNGNjMWI1NDc0NWZmZWJiNzJkZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NzdiOWM5OGU0MTE0ZjM1YTZiNzIxZjkwNmZkZjJlOS5zZXRDb250ZW50KGh0bWxfMDMyODBmMDdlMWFiNGNjMWI1NDc0NWZmZWJiNzJkZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNDM0MTE3ODFiN2E0OTc4YjgwNmJkMGM2ODU0YTdlMy5iaW5kUG9wdXAocG9wdXBfOTc3YjljOThlNDExNGYzNWE2YjcyMWY5MDZmZGYyZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDQ5OTVjMzEzNTU3NDhkYjhmYjViODY0MGMwNjZjY2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIxMTk4NDg4OTMxLC0xMjIuNDE1NjY5NjYxNDQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNGFkNTFlZDZmMmY0ODUxYjdmZjRkNWIzMDk0NjYzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTU2NmQ1YzQxMjA0ZmE2YjlmNjJiMDcwZWY5YWY2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzU1NjZkNWM0MTIwNGZhNmI5ZjYyYjA3MGVmOWFmNmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzRhZDUxZWQ2ZjJmNDg1MWI3ZmY0ZDViMzA5NDY2Mzcuc2V0Q29udGVudChodG1sX2M1NTY2ZDVjNDEyMDRmYTZiOWY2MmIwNzBlZjlhZjZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDQ5OTVjMzEzNTU3NDhkYjhmYjViODY0MGMwNjZjY2UuYmluZFBvcHVwKHBvcHVwXzM0YWQ1MWVkNmYyZjQ4NTFiN2ZmNGQ1YjMwOTQ2NjM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY1NGUzYmE3YjYzZDQ3ZDE4NTZmMzczNzNmMDdhNDVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5MTY3NDIxODk2MywtMTIyLjQwNjM0NjQyNTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJiNjkxY2QwZDEzNDg5YThmNTZhZDA3NDVlN2I3MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjAzODhmNjhmOWE1NDUwYTk1NmNlMWUzMTZjNzhiYTUgPSAkKCc8ZGl2IGlkPSJodG1sX2IwMzg4ZjY4ZjlhNTQ1MGE5NTZjZTFlMzE2Yzc4YmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmI2OTFjZDBkMTM0ODlhOGY1NmFkMDc0NWU3YjcyNS5zZXRDb250ZW50KGh0bWxfYjAzODhmNjhmOWE1NDUwYTk1NmNlMWUzMTZjNzhiYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NTRlM2JhN2I2M2Q0N2QxODU2ZjM3MzczZjA3YTQ1Zi5iaW5kUG9wdXAocG9wdXBfYTJiNjkxY2QwZDEzNDg5YThmNTZhZDA3NDVlN2I3MjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzA4MjJmMjgyZmYxNDY3OGJmM2JiOTE2MmZiZjFmNzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU3MTg0Mzk1MjgyLC0xMjIuNDA5NTI5OTEzMjc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOGVmMTQxZjVkZTA0ZDI3OGU1YTljY2UyZDAwNjQ2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jODJiNjE5NmRmMWU0ZTcyYmNhYmNhNjk0NzhhY2I5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzgyYjYxOTZkZjFlNGU3MmJjYWJjYTY5NDc4YWNiOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4ZWYxNDFmNWRlMDRkMjc4ZTVhOWNjZTJkMDA2NDZhLnNldENvbnRlbnQoaHRtbF9jODJiNjE5NmRmMWU0ZTcyYmNhYmNhNjk0NzhhY2I5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwODIyZjI4MmZmMTQ2NzhiZjNiYjkxNjJmYmYxZjc1LmJpbmRQb3B1cChwb3B1cF8yOGVmMTQxZjVkZTA0ZDI3OGU1YTljY2UyZDAwNjQ2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNjMxZWQwZDAyYWE0OGI1OTY3MGFkOTExZGE4ZDhiOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTBlOGE5NWI4NTY0NmZhYWM2ZTQxYTMyNGQ0Mzg1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MTNmYWRmYjVhNTA0YjVhOTg5MDYzNTNkODJjMDk2NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTEzZmFkZmI1YTUwNGI1YTk4OTA2MzUzZDgyYzA5NjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmUwZThhOTViODU2NDZmYWFjNmU0MWEzMjRkNDM4NTYuc2V0Q29udGVudChodG1sXzUxM2ZhZGZiNWE1MDRiNWE5ODkwNjM1M2Q4MmMwOTY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjYzMWVkMGQwMmFhNDhiNTk2NzBhZDkxMWRhOGQ4YjkuYmluZFBvcHVwKHBvcHVwX2ZlMGU4YTk1Yjg1NjQ2ZmFhYzZlNDFhMzI0ZDQzODU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc3ZTk3OGRiOWRmNTRiY2FhZGYwMWZlMDZjMWEwOWU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOTNlYTJlZWJjOWI0OWJhYjE0YWExOWM2OGM4YjgwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZjA0ODY2MjQyN2U0MzBjOWNhZGNkNDMyYzdjNDRmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmYwNDg2NjI0MjdlNDMwYzljYWRjZDQzMmM3YzQ0ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOTNlYTJlZWJjOWI0OWJhYjE0YWExOWM2OGM4YjgwZC5zZXRDb250ZW50KGh0bWxfNmYwNDg2NjI0MjdlNDMwYzljYWRjZDQzMmM3YzQ0ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83N2U5NzhkYjlkZjU0YmNhYWRmMDFmZTA2YzFhMDllNi5iaW5kUG9wdXAocG9wdXBfYTkzZWEyZWViYzliNDliYWIxNGFhMTljNjhjOGI4MGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWI3ODQzMzliZGI2NDkwOTk0ODQwMDYyOTUyZDJmNWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwZWYxNmRmNTMxNTQzMzY4MTQwZDQzMmYyZDJjMTEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkNmQ3ZmIyMjdlMDRjYmRhMTIzMDM3YWNlOGE0MzdjID0gJCgnPGRpdiBpZD0iaHRtbF8wZDZkN2ZiMjI3ZTA0Y2JkYTEyMzAzN2FjZThhNDM3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwZWYxNmRmNTMxNTQzMzY4MTQwZDQzMmYyZDJjMTEzLnNldENvbnRlbnQoaHRtbF8wZDZkN2ZiMjI3ZTA0Y2JkYTEyMzAzN2FjZThhNDM3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFiNzg0MzM5YmRiNjQ5MDk5NDg0MDA2Mjk1MmQyZjViLmJpbmRQb3B1cChwb3B1cF8zMGVmMTZkZjUzMTU0MzM2ODE0MGQ0MzJmMmQyYzExMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNDM3NmViMjYxODE0ZjdjYWY0OTk2YWEzZjE5ZDc0ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0NjliOTUzMTAyODQ3MDU5YzdmZjMzMjE5ZGQyZDhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyMjRiODhjMzMyYzQ4YzU4MzJlYzIyN2NhM2U3OTFiID0gJCgnPGRpdiBpZD0iaHRtbF8xMjI0Yjg4YzMzMmM0OGM1ODMyZWMyMjdjYTNlNzkxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0NjliOTUzMTAyODQ3MDU5YzdmZjMzMjE5ZGQyZDhhLnNldENvbnRlbnQoaHRtbF8xMjI0Yjg4YzMzMmM0OGM1ODMyZWMyMjdjYTNlNzkxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE0Mzc2ZWIyNjE4MTRmN2NhZjQ5OTZhYTNmMTlkNzRkLmJpbmRQb3B1cChwb3B1cF9kNDY5Yjk1MzEwMjg0NzA1OWM3ZmYzMzIxOWRkMmQ4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZDU0MWIwNWZlZjA0ODdkOTY4MGYxMDQ0YjhmMjRjMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwZDgwZjBmZWE5YzRkMzg4Njk1Y2NjMmZhNDIxYjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkZDQ4YTE2Y2VlYTQ3YzNiMWFhMjAyODQ5NGEzNTM0ID0gJCgnPGRpdiBpZD0iaHRtbF9mZGQ0OGExNmNlZWE0N2MzYjFhYTIwMjg0OTRhMzUzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVRy9OQVJDT1RJQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzBkODBmMGZlYTljNGQzODg2OTVjY2MyZmE0MjFiNzQuc2V0Q29udGVudChodG1sX2ZkZDQ4YTE2Y2VlYTQ3YzNiMWFhMjAyODQ5NGEzNTM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWQ1NDFiMDVmZWYwNDg3ZDk2ODBmMTA0NGI4ZjI0YzAuYmluZFBvcHVwKHBvcHVwXzMwZDgwZjBmZWE5YzRkMzg4Njk1Y2NjMmZhNDIxYjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZiNWVhZjYwMWJiZDQ5NmE5YzIzNjc5MDZlZWQxMjJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODIwM2RjNDQzNjEwNGNhZTkyZmJjMmRjYjA0YTNlZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE4ZmY0MDZiMDZjNGMxOWE3Y2U3OGE5NjM2YTU0NDIgPSAkKCc8ZGl2IGlkPSJodG1sX2UxOGZmNDA2YjA2YzRjMTlhN2NlNzhhOTYzNmE1NDQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODIwM2RjNDQzNjEwNGNhZTkyZmJjMmRjYjA0YTNlZjguc2V0Q29udGVudChodG1sX2UxOGZmNDA2YjA2YzRjMTlhN2NlNzhhOTYzNmE1NDQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmI1ZWFmNjAxYmJkNDk2YTljMjM2NzkwNmVlZDEyMmYuYmluZFBvcHVwKHBvcHVwXzgyMDNkYzQ0MzYxMDRjYWU5MmZiYzJkY2IwNGEzZWY4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRmYWEyMzVhOTE4YTQ3NmI4M2QwY2Q0NWIwN2FlY2E3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTQ0ODkwZGI5ZTJiNDU1ZGFhNzZjYWNlYTM1OGVmMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTI0NmVhOTQyZGZmNGM4Yzk0MTNiZDYxMjMwOGU4MGQgPSAkKCc8ZGl2IGlkPSJodG1sXzkyNDZlYTk0MmRmZjRjOGM5NDEzYmQ2MTIzMDhlODBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQ0ODkwZGI5ZTJiNDU1ZGFhNzZjYWNlYTM1OGVmMjYuc2V0Q29udGVudChodG1sXzkyNDZlYTk0MmRmZjRjOGM5NDEzYmQ2MTIzMDhlODBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGZhYTIzNWE5MThhNDc2YjgzZDBjZDQ1YjA3YWVjYTcuYmluZFBvcHVwKHBvcHVwXzE0NDg5MGRiOWUyYjQ1NWRhYTc2Y2FjZWEzNThlZjI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhjMDJlYmJmN2RiMjQ3ZDQ4NWU3MmI0NDlmYjcyYWRkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOTA4NjUxMzk4OWE0ODBkOGEyMTExMTY2ZTFmMjQ3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDE0NjcyOWY1OWE0MGUxYWQyZGU3NDFmYTcwZGU4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTAxNDY3MjlmNTlhNDBlMWFkMmRlNzQxZmE3MGRlODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5MDg2NTEzOTg5YTQ4MGQ4YTIxMTExNjZlMWYyNDdhLnNldENvbnRlbnQoaHRtbF85MDE0NjcyOWY1OWE0MGUxYWQyZGU3NDFmYTcwZGU4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhjMDJlYmJmN2RiMjQ3ZDQ4NWU3MmI0NDlmYjcyYWRkLmJpbmRQb3B1cChwb3B1cF9kOTA4NjUxMzk4OWE0ODBkOGEyMTExMTY2ZTFmMjQ3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YzlmMmIzZWY5NGM0YzVjYTQ3MmJiMTk3YmIwMjFiNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJjNGY3ODZmNmEzNDBjZjk5MTEwNGZmZWY4NzU3NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWFkNzE3NTBkOTQyNGFiY2FlNDY3NzBkMzg0MmNlNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzFhZDcxNzUwZDk0MjRhYmNhZTQ2NzcwZDM4NDJjZTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJjNGY3ODZmNmEzNDBjZjk5MTEwNGZmZWY4NzU3NzIuc2V0Q29udGVudChodG1sXzFhZDcxNzUwZDk0MjRhYmNhZTQ2NzcwZDM4NDJjZTQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWM5ZjJiM2VmOTRjNGM1Y2E0NzJiYjE5N2JiMDIxYjcuYmluZFBvcHVwKHBvcHVwXzRiYzRmNzg2ZjZhMzQwY2Y5OTExMDRmZmVmODc1NzcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U4ZDNmNDllNWNhNzQ0OWViYTE4ZWVlMzYwZTg2MGI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3NTExODg5NTY5NSwtMTIyLjQxODA0NTQ1Mjc2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Y3OWMzYTZjMGQ0NDA1YTg4NjA4NzM4OWJkYmRhZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDJkNjc0MTRmMWJhNDg5NGI4OTE1MzE0ZGY1NzAzYjQgPSAkKCc8ZGl2IGlkPSJodG1sXzQyZDY3NDE0ZjFiYTQ4OTRiODkxNTMxNGRmNTcwM2I0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Zjc5YzNhNmMwZDQ0MDVhODg2MDg3Mzg5YmRiZGFkNi5zZXRDb250ZW50KGh0bWxfNDJkNjc0MTRmMWJhNDg5NGI4OTE1MzE0ZGY1NzAzYjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lOGQzZjQ5ZTVjYTc0NDllYmExOGVlZTM2MGU4NjBiOC5iaW5kUG9wdXAocG9wdXBfN2Y3OWMzYTZjMGQ0NDA1YTg4NjA4NzM4OWJkYmRhZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjI1ODJmMzAxZmJiNDkwNGFmYzAwZDYzNTQ3NDRlNDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwMjM4NDc4OTc1LC0xMjIuNDAxMTYxNTU1NjAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzliNTM2YzA0YWQ0MzdiYjdhNGYyZDMzMTYyMDk3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NThhZTA3MTVmYzU0NTVlODExZGEyOGVjMzVmNDBjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTU4YWUwNzE1ZmM1NDU1ZTgxMWRhMjhlYzM1ZjQwYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzliNTM2YzA0YWQ0MzdiYjdhNGYyZDMzMTYyMDk3ZS5zZXRDb250ZW50KGh0bWxfOTU4YWUwNzE1ZmM1NDU1ZTgxMWRhMjhlYzM1ZjQwYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMjU4MmYzMDFmYmI0OTA0YWZjMDBkNjM1NDc0NGU0MC5iaW5kUG9wdXAocG9wdXBfMjc5YjUzNmMwNGFkNDM3YmI3YTRmMmQzMzE2MjA5N2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzEyNTlkMGFhNzE1NDZlZGI0MjY0MmY2MThjYzdjNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjcwMDUzMTk2Mjk5OTUsLTEyMi40MDM0MDg2NjkxOTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzOTcxZDhiZmIxMTQyOTM4NDM1ZTljZGQwNmI0MTk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxYjI0NDNhMGQ0MDRlNDhhZDRiNmMyOWM2NTY2ZGYwID0gJCgnPGRpdiBpZD0iaHRtbF8zMWIyNDQzYTBkNDA0ZTQ4YWQ0YjZjMjljNjU2NmRmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzOTcxZDhiZmIxMTQyOTM4NDM1ZTljZGQwNmI0MTk1LnNldENvbnRlbnQoaHRtbF8zMWIyNDQzYTBkNDA0ZTQ4YWQ0YjZjMjljNjU2NmRmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcxMjU5ZDBhYTcxNTQ2ZWRiNDI2NDJmNjE4Y2M3YzQ2LmJpbmRQb3B1cChwb3B1cF9jMzk3MWQ4YmZiMTE0MjkzODQzNWU5Y2RkMDZiNDE5NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZjU0YTMxZDZlNDU0MzBiYTBhMjFlMmJhNDhlY2VkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNDQzNzQxNDEsLTEyMi40MTI5MzA1MjIwNTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhNjMzNTc1NzJjMjQzOGVhODc2M2ZhZmJiNjYzMTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlZDkyOTdjNjMxMzRmNjc5MzU0ODQ1MzdmOGViYjIyID0gJCgnPGRpdiBpZD0iaHRtbF9kZWQ5Mjk3YzYzMTM0ZjY3OTM1NDg0NTM3ZjhlYmIyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTYzMzU3NTcyYzI0MzhlYTg3NjNmYWZiYjY2MzE5Yi5zZXRDb250ZW50KGh0bWxfZGVkOTI5N2M2MzEzNGY2NzkzNTQ4NDUzN2Y4ZWJiMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZjU0YTMxZDZlNDU0MzBiYTBhMjFlMmJhNDhlY2VkMS5iaW5kUG9wdXAocG9wdXBfZmE2MzM1NzU3MmMyNDM4ZWE4NzYzZmFmYmI2NjMxOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGFiZmQwZDczMDI0NDIxMmI5ODRhNjU4ZjFlMThlMTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTMwMTg2NTM3NDQ2MDQsLTEyMi40MTg1ODcxNzIyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkMWI2NTU2YTRkZTQ5ZDM4YjQ2NDQxNjcxOTg2NTBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzMmY5ODQyZDkyYjRlNzliMmRiYWM3YTY0M2MzZTYyID0gJCgnPGRpdiBpZD0iaHRtbF82MzJmOTg0MmQ5MmI0ZTc5YjJkYmFjN2E2NDNjM2U2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDFiNjU1NmE0ZGU0OWQzOGI0NjQ0MTY3MTk4NjUwZi5zZXRDb250ZW50KGh0bWxfNjMyZjk4NDJkOTJiNGU3OWIyZGJhYzdhNjQzYzNlNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYWJmZDBkNzMwMjQ0MjEyYjk4NGE2NThmMWUxOGUxOS5iaW5kUG9wdXAocG9wdXBfYWQxYjY1NTZhNGRlNDlkMzhiNDY0NDE2NzE5ODY1MGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjExZTYxNDgwOWY2NDg5ODgzNzY4YzkzMzc3ZDk3NmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84M2Y4OTZjMDM4Y2U0OTRjYTc2NTExMWE1YjQ2M2I3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZjMzYmQ1ZjNkMDc0ODBiYTAzMTc5M2QyMDlmNDg3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWYzM2JkNWYzZDA3NDgwYmEwMzE3OTNkMjA5ZjQ4NzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSQVVEPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2Y4OTZjMDM4Y2U0OTRjYTc2NTExMWE1YjQ2M2I3YS5zZXRDb250ZW50KGh0bWxfMWYzM2JkNWYzZDA3NDgwYmEwMzE3OTNkMjA5ZjQ4NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMTFlNjE0ODA5ZjY0ODk4ODM3NjhjOTMzNzdkOTc2ZS5iaW5kUG9wdXAocG9wdXBfODNmODk2YzAzOGNlNDk0Y2E3NjUxMTFhNWI0NjNiN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2U2ZjJlNmM5NzJlNDFiMTk2YzYyOTM2ZTIyNGY0ZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAyNjJjMjhkOWYwNGU3NWI5M2NiM2MzNzIwZjU3YjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNmM2EyNGU2M2ZlNDVmZmFhNGFhZmZlMzU4OTIzODkgPSAkKCc8ZGl2IGlkPSJodG1sX2VjZjNhMjRlNjNmZTQ1ZmZhYTRhYWZmZTM1ODkyMzg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDI2MmMyOGQ5ZjA0ZTc1YjkzY2IzYzM3MjBmNTdiMy5zZXRDb250ZW50KGh0bWxfZWNmM2EyNGU2M2ZlNDVmZmFhNGFhZmZlMzU4OTIzODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zZTZmMmU2Yzk3MmU0MWIxOTZjNjI5MzZlMjI0ZjRlMS5iaW5kUG9wdXAocG9wdXBfMDAyNjJjMjhkOWYwNGU3NWI5M2NiM2MzNzIwZjU3YjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjZkNWU0YjM2Y2FlNDE2ZWJjM2FkNzUyYmQxZGEwNmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMwOTk4MjQ0NTkyMSwtMTIyLjQxOTE4MzA5NjM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTljZTEwZDMyN2I5NDA0Y2ExNTdkNWFlNWY3MmI1ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2U2M2FmZmU4NDRmNGM0ZWEyMTM2NmQ4NzJlZWRiMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2NlNjNhZmZlODQ0ZjRjNGVhMjEzNjZkODcyZWVkYjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTljZTEwZDMyN2I5NDA0Y2ExNTdkNWFlNWY3MmI1ZmYuc2V0Q29udGVudChodG1sX2NlNjNhZmZlODQ0ZjRjNGVhMjEzNjZkODcyZWVkYjM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjZkNWU0YjM2Y2FlNDE2ZWJjM2FkNzUyYmQxZGEwNmYuYmluZFBvcHVwKHBvcHVwXzk5Y2UxMGQzMjdiOTQwNGNhMTU3ZDVhZTVmNzJiNWZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg3ODgyNWRhZjM5MjQ0MDJiMGQ0MThlYzMyY2QyYzkxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQwNzM2MDU0ODM1NzksLTEyMi4zODg3NTMwNDY5OTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNDIzODIyMjA2NjQyMzQ5MjE3MmJkMmM0ODJmMzllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwZDhhMzgyNDA2NTQyYzA5NzFiN2Y1ZWIxZGMzMGJjID0gJCgnPGRpdiBpZD0iaHRtbF85MGQ4YTM4MjQwNjU0MmMwOTcxYjdmNWViMWRjMzBiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxNDIzODIyMjA2NjQyMzQ5MjE3MmJkMmM0ODJmMzllLnNldENvbnRlbnQoaHRtbF85MGQ4YTM4MjQwNjU0MmMwOTcxYjdmNWViMWRjMzBiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg3ODgyNWRhZjM5MjQ0MDJiMGQ0MThlYzMyY2QyYzkxLmJpbmRQb3B1cChwb3B1cF9lMTQyMzgyMjIwNjY0MjM0OTIxNzJiZDJjNDgyZjM5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZWQzYjJlZjc4ZmI0ZDI0OTI2NGIzNDkxMTAzNzEzNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDk5MTI5NDQzNjYsLTEyMi40Mzc3OTk3MDM0NjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1ODRmMGU2M2I2MjRkNThiMzgwYmNiNzZlY2NmMmY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkNDk3MmU4ZTJhMDQzYzBhMDlmYjlkOTRmZDFmOWM5ID0gJCgnPGRpdiBpZD0iaHRtbF8wZDQ5NzJlOGUyYTA0M2MwYTA5ZmI5ZDk0ZmQxZjljOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDU4NGYwZTYzYjYyNGQ1OGIzODBiY2I3NmVjY2YyZjcuc2V0Q29udGVudChodG1sXzBkNDk3MmU4ZTJhMDQzYzBhMDlmYjlkOTRmZDFmOWM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2VkM2IyZWY3OGZiNGQyNDkyNjRiMzQ5MTEwMzcxMzUuYmluZFBvcHVwKHBvcHVwXzA1ODRmMGU2M2I2MjRkNThiMzgwYmNiNzZlY2NmMmY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZhZGY2ZDUwMmM5ZjQ5Y2U5NGMxZGFlNjBiODExZmJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTFmNzkwOTBhMmFhNGMwZGFiOGZjMjNkNDk3YmFiZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWU0NTk5NGIxMzkwNGNiZTkxODgzMmFjMDM2M2VkZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzVlNDU5OTRiMTM5MDRjYmU5MTg4MzJhYzAzNjNlZGRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTFmNzkwOTBhMmFhNGMwZGFiOGZjMjNkNDk3YmFiZGIuc2V0Q29udGVudChodG1sXzVlNDU5OTRiMTM5MDRjYmU5MTg4MzJhYzAzNjNlZGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmFkZjZkNTAyYzlmNDljZTk0YzFkYWU2MGI4MTFmYmIuYmluZFBvcHVwKHBvcHVwXzExZjc5MDkwYTJhYTRjMGRhYjhmYzIzZDQ5N2JhYmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU0NmZlOTJlYjNjODRjYjZiNzgyYzM0ZTQxNTUxMTA5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjAzYmRiNjJkNzVlNDZhOTk5NDk4N2UwN2FkNmNkZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTQyZDg0ZGU3YjgxNDAxYWE3N2E2YTU0MTAyZTRlNGUgPSAkKCc8ZGl2IGlkPSJodG1sX2U0MmQ4NGRlN2I4MTQwMWFhNzdhNmE1NDEwMmU0ZTRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjAzYmRiNjJkNzVlNDZhOTk5NDk4N2UwN2FkNmNkZDIuc2V0Q29udGVudChodG1sX2U0MmQ4NGRlN2I4MTQwMWFhNzdhNmE1NDEwMmU0ZTRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTQ2ZmU5MmViM2M4NGNiNmI3ODJjMzRlNDE1NTExMDkuYmluZFBvcHVwKHBvcHVwXzYwM2JkYjYyZDc1ZTQ2YTk5OTQ5ODdlMDdhZDZjZGQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYzZmYxZmY5N2JkYzQ0NDU5NDY3NTA2NGU3ODQ0OGJjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgyMjQ1ODIyMzkxNywtMTIyLjQ0NjYxMjk3ODgzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU5ZmEwMDliMmQ5NDU5Zjk1MDdhYzA1OTE4ZDJjNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGZlMTAzMDgyMzE3NGI1ODg2NzljOTkxMzJiMmEyNTkgPSAkKCc8ZGl2IGlkPSJodG1sX2RmZTEwMzA4MjMxNzRiNTg4Njc5Yzk5MTMyYjJhMjU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU5ZmEwMDliMmQ5NDU5Zjk1MDdhYzA1OTE4ZDJjNWIuc2V0Q29udGVudChodG1sX2RmZTEwMzA4MjMxNzRiNTg4Njc5Yzk5MTMyYjJhMjU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjNmZjFmZjk3YmRjNDQ0NTk0Njc1MDY0ZTc4NDQ4YmMuYmluZFBvcHVwKHBvcHVwXzE1OWZhMDA5YjJkOTQ1OWY5NTA3YWMwNTkxOGQyYzViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNjOWZiOGRjNWY2YjRlZmY5ZGNiNzQwNjQxNmI5MjQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwMDM3OTk5NTEyNzk1LC0xMjIuNDA0NTk0MTQwNjM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YWUxNGZkZGE4ZDU0NDI4YjJmNWM4MzI4OGFiMGMwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDg3YzZhNTdiMTA0MDU1OGZkYjVlNjZkNWRhZDU3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDA4N2M2YTU3YjEwNDA1NThmZGI1ZTY2ZDVkYWQ1N2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFlMTRmZGRhOGQ1NDQyOGIyZjVjODMyODhhYjBjMDYuc2V0Q29udGVudChodG1sX2QwODdjNmE1N2IxMDQwNTU4ZmRiNWU2NmQ1ZGFkNTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2M5ZmI4ZGM1ZjZiNGVmZjlkY2I3NDA2NDE2YjkyNDcuYmluZFBvcHVwKHBvcHVwXzVhZTE0ZmRkYThkNTQ0MjhiMmY1YzgzMjg4YWIwYzA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ4ZThiOTZlMjRjOTQxZGJiZGNjNjExZjA3NGI4ZTcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MzMzODI2NzQzNiwtMTIyLjM5NzM3Mzc0MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzgzZjM4MjBlNzg0NGNhYzhhM2E3MjQxYTk5YjMzMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjJkNjEzMzFkMWI2NGE3MmEyMjlhOTFiYzc4MWMzNTAgPSAkKCc8ZGl2IGlkPSJodG1sXzIyZDYxMzMxZDFiNjRhNzJhMjI5YTkxYmM3ODFjMzUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4M2YzODIwZTc4NDRjYWM4YTNhNzI0MWE5OWIzMzM2LnNldENvbnRlbnQoaHRtbF8yMmQ2MTMzMWQxYjY0YTcyYTIyOWE5MWJjNzgxYzM1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ4ZThiOTZlMjRjOTQxZGJiZGNjNjExZjA3NGI4ZTcwLmJpbmRQb3B1cChwb3B1cF83ODNmMzgyMGU3ODQ0Y2FjOGEzYTcyNDFhOTliMzMzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kZjBjMTQyMzMwNjc0NTZiYTNkNzg3NGJiNjZlMmE0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTJiZTYzMWU3YmEzNDYzZGIxMWRmODNlNTc4YTg5MzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFkNWFiMTM4ODExNDQ1MThkNmJmZWNjMTg5NGNjN2IgPSAkKCc8ZGl2IGlkPSJodG1sXzVhZDVhYjEzODgxMTQ0NTE4ZDZiZmVjYzE4OTRjYzdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTJiZTYzMWU3YmEzNDYzZGIxMWRmODNlNTc4YTg5MzQuc2V0Q29udGVudChodG1sXzVhZDVhYjEzODgxMTQ0NTE4ZDZiZmVjYzE4OTRjYzdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGYwYzE0MjMzMDY3NDU2YmEzZDc4NzRiYjY2ZTJhNDguYmluZFBvcHVwKHBvcHVwX2UyYmU2MzFlN2JhMzQ2M2RiMTFkZjgzZTU3OGE4OTM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZhODE1NzI5MmVlNDQ0NzdiNDgwZmI3YTFhZTI5ZWMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ3ODhkNDRkYjhkNDVkODk3MzEzMmM0NjE0ZmUyZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWY1NzQzMDllNzhlNGVmZmIzYjc0Mzc1YWFmYzI4NmMgPSAkKCc8ZGl2IGlkPSJodG1sXzlmNTc0MzA5ZTc4ZTRlZmZiM2I3NDM3NWFhZmMyODZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QUk9TVElUVVRJT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkNzg4ZDQ0ZGI4ZDQ1ZDg5NzMxMzJjNDYxNGZlMmYxLnNldENvbnRlbnQoaHRtbF85ZjU3NDMwOWU3OGU0ZWZmYjNiNzQzNzVhYWZjMjg2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZhODE1NzI5MmVlNDQ0NzdiNDgwZmI3YTFhZTI5ZWMyLmJpbmRQb3B1cChwb3B1cF81ZDc4OGQ0NGRiOGQ0NWQ4OTczMTMyYzQ2MTRmZTJmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNmJhNjg2OTdkNjQ0MjkyYTk3ZTMyNmVmM2YzMzE1OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5YjZiNGU2YjE0YTQxZGI4NTBkMDZmNTAwNmViNjcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjZmNmZDg2MWZlNjQxOWZiMzEyNDZlYjQ1ZTViZGI5ID0gJCgnPGRpdiBpZD0iaHRtbF9mY2ZjZmQ4NjFmZTY0MTlmYjMxMjQ2ZWI0NWU1YmRiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM5YjZiNGU2YjE0YTQxZGI4NTBkMDZmNTAwNmViNjcwLnNldENvbnRlbnQoaHRtbF9mY2ZjZmQ4NjFmZTY0MTlmYjMxMjQ2ZWI0NWU1YmRiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y2YmE2ODY5N2Q2NDQyOTJhOTdlMzI2ZWYzZjMzMTU4LmJpbmRQb3B1cChwb3B1cF8zOWI2YjRlNmIxNGE0MWRiODUwZDA2ZjUwMDZlYjY3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MGViZDkwNjBmNGU0ZTQxOTMzNzc0MTliNzIzYTVjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MzI5MTgwNjkwMjk5NiwtMTIyLjQzNjYxNDE4MTMzMTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTExMTViNWQ3Yjg0MWM0YTMwNTQzYjcwNzY3MjdiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTEyMDNmMjRjZjI0NDZmODdmY2YxM2M0ZTU5NTA5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjkxMjAzZjI0Y2YyNDQ2Zjg3ZmNmMTNjNGU1OTUwOTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjExMTE1YjVkN2I4NDFjNGEzMDU0M2I3MDc2NzI3Yjkuc2V0Q29udGVudChodG1sXzI5MTIwM2YyNGNmMjQ0NmY4N2ZjZjEzYzRlNTk1MDk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjBlYmQ5MDYwZjRlNGU0MTkzMzc3NDE5YjcyM2E1YzguYmluZFBvcHVwKHBvcHVwXzYxMTExNWI1ZDdiODQxYzRhMzA1NDNiNzA3NjcyN2I5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI4ZDM4MWYwMzkzNTQxMjQ5ZTdhMjE1Y2Q1ZmIxMGNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzYzhhNGVhZjE3ZTQ1YWQ5ZGFiNTUzZmVlMTY4ZjFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NWY1ZGM2M2Q4YzRjYzlhZTRjMWE1YzE1NGQ0Y2FhID0gJCgnPGRpdiBpZD0iaHRtbF8zNzVmNWRjNjNkOGM0Y2M5YWU0YzFhNWMxNTRkNGNhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVRy9OQVJDT1RJQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzNjOGE0ZWFmMTdlNDVhZDlkYWI1NTNmZWUxNjhmMWIuc2V0Q29udGVudChodG1sXzM3NWY1ZGM2M2Q4YzRjYzlhZTRjMWE1YzE1NGQ0Y2FhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjhkMzgxZjAzOTM1NDEyNDllN2EyMTVjZDVmYjEwY2MuYmluZFBvcHVwKHBvcHVwX2MzYzhhNGVhZjE3ZTQ1YWQ5ZGFiNTUzZmVlMTY4ZjFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc3MjdiYjc1ZDE0YzQ1Yjk5MjI0ZGE4ZDU3YzBmNWQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyNGVjNTc5MzhlODQ0NzJiODU0YTA2Mzg0ZWQ5MDExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxMzIzYzFmZGFhMjQ3NzliZTdhZDUxNGIzMGJkNzI5ID0gJCgnPGRpdiBpZD0iaHRtbF9jMTMyM2MxZmRhYTI0Nzc5YmU3YWQ1MTRiMzBiZDcyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNGVjNTc5MzhlODQ0NzJiODU0YTA2Mzg0ZWQ5MDExLnNldENvbnRlbnQoaHRtbF9jMTMyM2MxZmRhYTI0Nzc5YmU3YWQ1MTRiMzBiZDcyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc3MjdiYjc1ZDE0YzQ1Yjk5MjI0ZGE4ZDU3YzBmNWQyLmJpbmRQb3B1cChwb3B1cF80MjRlYzU3OTM4ZTg0NDcyYjg1NGEwNjM4NGVkOTAxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YjhjMWY1MWMyNzI0NTNjOTgwMWI3NWY3ODg2MGUzYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyODQxODA3MDY2MDIwNCwtMTIyLjQ1MDAwMDc5MDQ0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGRhNGFiZGZkMWEwNGQyN2ExYTE1MWQ3NzNjMmYzN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGUxYWI5YjJmZTgxNGE3MGJiNDRlMjNhNDU4NjkxYTAgPSAkKCc8ZGl2IGlkPSJodG1sXzRlMWFiOWIyZmU4MTRhNzBiYjQ0ZTIzYTQ1ODY5MWEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZGE0YWJkZmQxYTA0ZDI3YTFhMTUxZDc3M2MyZjM3Yy5zZXRDb250ZW50KGh0bWxfNGUxYWI5YjJmZTgxNGE3MGJiNDRlMjNhNDU4NjkxYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YjhjMWY1MWMyNzI0NTNjOTgwMWI3NWY3ODg2MGUzYS5iaW5kUG9wdXAocG9wdXBfMGRhNGFiZGZkMWEwNGQyN2ExYTE1MWQ3NzNjMmYzN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDJlZmVjYmYzNzJjNGFhM2FiMjY0N2NmMGM1ZDE0NDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTQ1NTEzMGNkMWE0MjQ0YjI4ZGJkYTdlNTZlZTY1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NjdkZDAyMGIwNmU0YzQ3OTdiM2E5NTViYWZjOWMwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY3ZGQwMjBiMDZlNGM0Nzk3YjNhOTU1YmFmYzljMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTQ1NTEzMGNkMWE0MjQ0YjI4ZGJkYTdlNTZlZTY1MC5zZXRDb250ZW50KGh0bWxfNzY3ZGQwMjBiMDZlNGM0Nzk3YjNhOTU1YmFmYzljMGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMmVmZWNiZjM3MmM0YWEzYWIyNjQ3Y2YwYzVkMTQ0OS5iaW5kUG9wdXAocG9wdXBfYWE0NTUxMzBjZDFhNDI0NGIyOGRiZGE3ZTU2ZWU2NTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODVhNWUzNWIzMTc0NGZlYzk0NTJlMWVkYzk4YTAwMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxN2ZlZDVhYjM2MzQ2ZDc4NjhmN2I0NjhjMDVhN2YxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxMmRjODNiYTcxMTQyY2FiZjI1N2IxOWUzNzgzMWFhID0gJCgnPGRpdiBpZD0iaHRtbF8yMTJkYzgzYmE3MTE0MmNhYmYyNTdiMTllMzc4MzFhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDE3ZmVkNWFiMzYzNDZkNzg2OGY3YjQ2OGMwNWE3ZjEuc2V0Q29udGVudChodG1sXzIxMmRjODNiYTcxMTQyY2FiZjI1N2IxOWUzNzgzMWFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODVhNWUzNWIzMTc0NGZlYzk0NTJlMWVkYzk4YTAwMTQuYmluZFBvcHVwKHBvcHVwX2QxN2ZlZDVhYjM2MzQ2ZDc4NjhmN2I0NjhjMDVhN2YxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MzMGY3Njc0NjQwZTQ4MTE4NTU2NDZhZWU3YWNmODUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyZmU3MjA2YzUxYTQ4ZGE4NWU5MzZjMjBiY2NjNWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MTM2ODZlMDYxMDRmNmZhMjM3YzE1MzgyY2I0NWUxID0gJCgnPGRpdiBpZD0iaHRtbF82OTEzNjg2ZTA2MTA0ZjZmYTIzN2MxNTM4MmNiNDVlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmZlNzIwNmM1MWE0OGRhODVlOTM2YzIwYmNjYzVjMi5zZXRDb250ZW50KGh0bWxfNjkxMzY4NmUwNjEwNGY2ZmEyMzdjMTUzODJjYjQ1ZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMzBmNzY3NDY0MGU0ODExODU1NjQ2YWVlN2FjZjg1MS5iaW5kUG9wdXAocG9wdXBfZDJmZTcyMDZjNTFhNDhkYTg1ZTkzNmMyMGJjY2M1YzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWE4MTNjMDE1NTNjNGExNzg4ZWE5ZDI2Yjc3ZjUwM2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWFjNTQ4OGY1MDY3NGVjMmI1MTlhY2MxOWJkMGNjNzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTUxZTNiYWJhZTM4NDJkNWExMzYxZTYwZDBiZWEzMjUgPSAkKCc8ZGl2IGlkPSJodG1sXzk1MWUzYmFiYWUzODQyZDVhMTM2MWU2MGQwYmVhMzI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVVNQSUNJT1VTIE9DQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWFjNTQ4OGY1MDY3NGVjMmI1MTlhY2MxOWJkMGNjNzAuc2V0Q29udGVudChodG1sXzk1MWUzYmFiYWUzODQyZDVhMTM2MWU2MGQwYmVhMzI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWE4MTNjMDE1NTNjNGExNzg4ZWE5ZDI2Yjc3ZjUwM2IuYmluZFBvcHVwKHBvcHVwX2VhYzU0ODhmNTA2NzRlYzJiNTE5YWNjMTliZDBjYzcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM4Zjk5NjE4ZGQ5NDQ3M2U5MDY4Y2NlNWZiOWMyZjdkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0ZTc4OWMzNTE1NzQ4ODg5YjNhNGZiOTcyMWY4YWVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1MmJlOTUwODRiOTQ2ZjNiNDA4MDE1MzgyY2Q1YTdjID0gJCgnPGRpdiBpZD0iaHRtbF82NTJiZTk1MDg0Yjk0NmYzYjQwODAxNTM4MmNkNWE3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0ZTc4OWMzNTE1NzQ4ODg5YjNhNGZiOTcyMWY4YWVkLnNldENvbnRlbnQoaHRtbF82NTJiZTk1MDg0Yjk0NmYzYjQwODAxNTM4MmNkNWE3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM4Zjk5NjE4ZGQ5NDQ3M2U5MDY4Y2NlNWZiOWMyZjdkLmJpbmRQb3B1cChwb3B1cF8yNGU3ODljMzUxNTc0ODg4OWIzYTRmYjk3MjFmOGFlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZDRhMGY1MWU0Njc0OGQwOWRkNDM1NDM1ZTg0MjljMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNlZTUzYWJhYThlNGM2MmIzMTY2YThkMTAwZjMyNmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2RlM2FlZGQxMjY3NGVmNjg1NGU0MzgzMzQyNGU2MmQgPSAkKCc8ZGl2IGlkPSJodG1sX2NkZTNhZWRkMTI2NzRlZjY4NTRlNDM4MzM0MjRlNjJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2VlNTNhYmFhOGU0YzYyYjMxNjZhOGQxMDBmMzI2Zi5zZXRDb250ZW50KGh0bWxfY2RlM2FlZGQxMjY3NGVmNjg1NGU0MzgzMzQyNGU2MmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZDRhMGY1MWU0Njc0OGQwOWRkNDM1NDM1ZTg0MjljMC5iaW5kUG9wdXAocG9wdXBfODNlZTUzYWJhYThlNGM2MmIzMTY2YThkMTAwZjMyNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjI0YWUzMzU0OWI0NGNhMGFiZWNiMzA3ODM0MTIzODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTU5OTc3MzM5ODU2LC0xMjIuNDA5NDM1NjE3MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZmM3NGU5YmUxN2M0Mjg4ODZiNWMwYzkwNTVhZDE3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Mzc0YzBjN2ZlMjE0NTA3ODRiZjBlZjQ0MDhmOTA2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDM3NGMwYzdmZTIxNDUwNzg0YmYwZWY0NDA4ZjkwNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZmM3NGU5YmUxN2M0Mjg4ODZiNWMwYzkwNTVhZDE3NC5zZXRDb250ZW50KGh0bWxfNDM3NGMwYzdmZTIxNDUwNzg0YmYwZWY0NDA4ZjkwNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMjRhZTMzNTQ5YjQ0Y2EwYWJlY2IzMDc4MzQxMjM4OS5iaW5kUG9wdXAocG9wdXBfN2ZjNzRlOWJlMTdjNDI4ODg2YjVjMGM5MDU1YWQxNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGZjY2ZhMjMxOTZhNGFlMmFiZDM5OGNhZGZlMTU0ZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODcwNzk4MTQ0NDQzLC0xMjIuNDI1ODgzMzU4MTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTYwZDNjZDE2MjY0OWUzODM2OWFlNmI1ZGU0MTZmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTdhOTMxN2I3MWU0NTQ5OWJlOGQ4ZGNmODkyMjZmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjE3YTkzMTdiNzFlNDU0OTliZThkOGRjZjg5MjI2ZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTU2MGQzY2QxNjI2NDllMzgzNjlhZTZiNWRlNDE2ZmQuc2V0Q29udGVudChodG1sX2IxN2E5MzE3YjcxZTQ1NDk5YmU4ZDhkY2Y4OTIyNmY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGZjY2ZhMjMxOTZhNGFlMmFiZDM5OGNhZGZlMTU0ZmYuYmluZFBvcHVwKHBvcHVwX2E1NjBkM2NkMTYyNjQ5ZTM4MzY5YWU2YjVkZTQxNmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgyNTZjYjU2Y2Q4NDRmMDhiNTg1YWMxNjM1M2ZkYzlmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyZGQzYjVhOTBlNTQ1ZmNhOTcyYTRhODJiNWIxYzI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzZjBkYjMwZjk1ODRjM2E5MTk0ZDlhYWVkZmYxNTEzID0gJCgnPGRpdiBpZD0iaHRtbF8yM2YwZGIzMGY5NTg0YzNhOTE5NGQ5YWFlZGZmMTUxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMmRkM2I1YTkwZTU0NWZjYTk3MmE0YTgyYjViMWMyNC5zZXRDb250ZW50KGh0bWxfMjNmMGRiMzBmOTU4NGMzYTkxOTRkOWFhZWRmZjE1MTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MjU2Y2I1NmNkODQ0ZjA4YjU4NWFjMTYzNTNmZGM5Zi5iaW5kUG9wdXAocG9wdXBfMzJkZDNiNWE5MGU1NDVmY2E5NzJhNGE4MmI1YjFjMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGY5NjhmNTE5ZTgwNDVmNGEyMzE1MmY3OGMzMjU2MTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTI3Njc4ODQ4MjEsLTEyMi40MzE5MjgwMTEwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiMjA5ZDQyYWFiYjQzYjJhNjg5MTEzMGM2NDRkYWM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxM2U3OWQwM2Y0YjRlNDM5ZGFhYTBlNjZmMjQzOGRhID0gJCgnPGRpdiBpZD0iaHRtbF8yMTNlNzlkMDNmNGI0ZTQzOWRhYWEwZTY2ZjI0MzhkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiMjA5ZDQyYWFiYjQzYjJhNjg5MTEzMGM2NDRkYWM1LnNldENvbnRlbnQoaHRtbF8yMTNlNzlkMDNmNGI0ZTQzOWRhYWEwZTY2ZjI0MzhkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhmOTY4ZjUxOWU4MDQ1ZjRhMjMxNTJmNzhjMzI1NjEyLmJpbmRQb3B1cChwb3B1cF8xYjIwOWQ0MmFhYmI0M2IyYTY4OTExMzBjNjQ0ZGFjNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMGEzMDAxNzA0NjU0OTU0OWNmZDZmNGQ2MDA2OTNhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4OTU3MTAyNTU4NjMsLTEyMi40MDIxNjM3MTM2MThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1OGMyY2I0YWRiMzRlZGM4Y2MzMTRkOTA1NDNjZDRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0ZWU3YjY1ZmNkZTRiN2U5NWNiNmFhYjc3N2U3YjAxID0gJCgnPGRpdiBpZD0iaHRtbF81NGVlN2I2NWZjZGU0YjdlOTVjYjZhYWI3NzdlN2IwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVTktFTk5FU1M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1OGMyY2I0YWRiMzRlZGM4Y2MzMTRkOTA1NDNjZDRhLnNldENvbnRlbnQoaHRtbF81NGVlN2I2NWZjZGU0YjdlOTVjYjZhYWI3NzdlN2IwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UwYTMwMDE3MDQ2NTQ5NTQ5Y2ZkNmY0ZDYwMDY5M2FmLmJpbmRQb3B1cChwb3B1cF81NThjMmNiNGFkYjM0ZWRjOGNjMzE0ZDkwNTQzY2Q0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84Njg3MWUzNTljNmU0M2RhODc0ZjU2YTM5Njc2ZjhlOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyMzg3ODVhZjEwZDQzMTA4YWJkNWQ5ZDUyODE2YThhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzMTM2MDdjZjUyMzQxZWZiNDY1OTY0MWVjN2E0OGI0ID0gJCgnPGRpdiBpZD0iaHRtbF9kMzEzNjA3Y2Y1MjM0MWVmYjQ2NTk2NDFlYzdhNDhiNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyMzg3ODVhZjEwZDQzMTA4YWJkNWQ5ZDUyODE2YThhLnNldENvbnRlbnQoaHRtbF9kMzEzNjA3Y2Y1MjM0MWVmYjQ2NTk2NDFlYzdhNDhiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg2ODcxZTM1OWM2ZTQzZGE4NzRmNTZhMzk2NzZmOGU5LmJpbmRQb3B1cChwb3B1cF83MjM4Nzg1YWYxMGQ0MzEwOGFiZDVkOWQ1MjgxNmE4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZDA4NmM2OWU2Yjg0MzY1YTM3MDBlYjMyN2ZmODM1MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNjU1NjUzNDc5NCwtMTIyLjQxMzc5MDk3Mjc4MDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZGIwNmNmYzI1YTA0NjIxYjNkYTc0MThhYmZmZGFmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTM3NzhkYjk5ZDg0MGMwYWMxNTJiZmZlZjhkN2Q3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjEzNzc4ZGI5OWQ4NDBjMGFjMTUyYmZmZWY4ZDdkNzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGRiMDZjZmMyNWEwNDYyMWIzZGE3NDE4YWJmZmRhZjQuc2V0Q29udGVudChodG1sX2IxMzc3OGRiOTlkODQwYzBhYzE1MmJmZmVmOGQ3ZDc5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWQwODZjNjllNmI4NDM2NWEzNzAwZWIzMjdmZjgzNTEuYmluZFBvcHVwKHBvcHVwXzRkYjA2Y2ZjMjVhMDQ2MjFiM2RhNzQxOGFiZmZkYWY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I3ZTAzNDI5Y2E0MzQ3OTRiNzQ2ZTQ4OTUyMDRhMDgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2JjMmZmNzc0ZGZjNDAyNzk5MWVjOTI1ODI4NGYxYjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg0YTU3ZTA3Y2Q3NGQwMTg0YWNhNzQxYzkzMmU1OGUgPSAkKCc8ZGl2IGlkPSJodG1sX2I4NGE1N2UwN2NkNzRkMDE4NGFjYTc0MWM5MzJlNThlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2JjMmZmNzc0ZGZjNDAyNzk5MWVjOTI1ODI4NGYxYjYuc2V0Q29udGVudChodG1sX2I4NGE1N2UwN2NkNzRkMDE4NGFjYTc0MWM5MzJlNThlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjdlMDM0MjljYTQzNDc5NGI3NDZlNDg5NTIwNGEwODEuYmluZFBvcHVwKHBvcHVwXzdiYzJmZjc3NGRmYzQwMjc5OTFlYzkyNTgyODRmMWI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzcyZjIxZmRmN2RkZDQ5M2RhYWU3MzYzYzE5ZWQ3YzRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOGQxNDI4NGEzN2U0OGY0YmIyNTk3NDNiZDk5NjZiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODI1OThiMzZkM2Y0ZTU2ODkyNzVmMTljMTVmZTIxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDgyNTk4YjM2ZDNmNGU1Njg5Mjc1ZjE5YzE1ZmUyMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDhkMTQyODRhMzdlNDhmNGJiMjU5NzQzYmQ5OTY2YjMuc2V0Q29udGVudChodG1sX2Q4MjU5OGIzNmQzZjRlNTY4OTI3NWYxOWMxNWZlMjEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzJmMjFmZGY3ZGRkNDkzZGFhZTczNjNjMTllZDdjNGEuYmluZFBvcHVwKHBvcHVwX2Q4ZDE0Mjg0YTM3ZTQ4ZjRiYjI1OTc0M2JkOTk2NmIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzNiYzlkYzQwNTE1YzQ5OTE5MjBkODBhNTM1MTFiZjU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZjNkNGFiMWYyM2Q0OGZjOWEyNmY1OTQzNTk2NmQ3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDVlYWRmZTZiNmQ0N2E2YTYxMzZkMWY2MTMxZDYxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2Q1ZWFkZmU2YjZkNDdhNmE2MTM2ZDFmNjEzMWQ2MTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWYzZDRhYjFmMjNkNDhmYzlhMjZmNTk0MzU5NjZkNzAuc2V0Q29udGVudChodG1sX2NkNWVhZGZlNmI2ZDQ3YTZhNjEzNmQxZjYxMzFkNjE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2JjOWRjNDA1MTVjNDk5MTkyMGQ4MGE1MzUxMWJmNTkuYmluZFBvcHVwKHBvcHVwXzFmM2Q0YWIxZjIzZDQ4ZmM5YTI2ZjU5NDM1OTY2ZDcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkyOTBhNTRjZmZhMjQ0MmU4MjI1MTJlMmVlZmZlNThmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1OTk4ODMyMzc5Nzk2LC0xMjIuNDExNzQ3MzcxOTI0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMmYyZDE4ZGNjYmE0MjE2OTQ4MTM2OTkxNTIxZmJkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ODAzMTAxNjJhOGM0ZGUzOGNjMmRlYjIzNGIzNmVmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjgwMzEwMTYyYThjNGRlMzhjYzJkZWIyMzRiMzZlZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVU1BJQ0lPVVMgT0NDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmYyZDE4ZGNjYmE0MjE2OTQ4MTM2OTkxNTIxZmJkNi5zZXRDb250ZW50KGh0bWxfNjgwMzEwMTYyYThjNGRlMzhjYzJkZWIyMzRiMzZlZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjkwYTU0Y2ZmYTI0NDJlODIyNTEyZTJlZWZmZTU4Zi5iaW5kUG9wdXAocG9wdXBfYTJmMmQxOGRjY2JhNDIxNjk0ODEzNjk5MTUyMWZiZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjVhNjk4N2ViZTAzNDgxZjliZGM0OTE1MjVjNTQzM2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjMzNzU4MDU4MDU5LC0xMjIuNDIwNDM0NzI0NTUyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxNjM2MjM0MjAyYzQyOWVhOGRmM2JiODlkMjE2MjI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiNmNmMjRlNDE1MTQzNGVhNjU5MGVlM2NkM2NiZjNmID0gJCgnPGRpdiBpZD0iaHRtbF9iYjZjZjI0ZTQxNTE0MzRlYTY1OTBlZTNjZDNjYmYzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxNjM2MjM0MjAyYzQyOWVhOGRmM2JiODlkMjE2MjI1LnNldENvbnRlbnQoaHRtbF9iYjZjZjI0ZTQxNTE0MzRlYTY1OTBlZTNjZDNjYmYzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI1YTY5ODdlYmUwMzQ4MWY5YmRjNDkxNTI1YzU0MzNjLmJpbmRQb3B1cChwb3B1cF81MTYzNjIzNDIwMmM0MjllYThkZjNiYjg5ZDIxNjIyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMTVlNjgyMzkyMWI0YWMzYjBlMTMzZTkxM2RlZjg3MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTAyMjY2MjI3ODYsLTEyMi40MTE5ODc2NDM1OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFkZjQ4ZWM5YWYxNGJkNzg4MTIxOGY4MWM0ZTdjOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmRiOGJmODhlMjBlNDc2YWJkZjI2NjZjNzFjM2ZlMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzJkYjhiZjg4ZTIwZTQ3NmFiZGYyNjY2YzcxYzNmZTJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhZGY0OGVjOWFmMTRiZDc4ODEyMThmODFjNGU3YzlhLnNldENvbnRlbnQoaHRtbF8yZGI4YmY4OGUyMGU0NzZhYmRmMjY2NmM3MWMzZmUyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzIxNWU2ODIzOTIxYjRhYzNiMGUxMzNlOTEzZGVmODcxLmJpbmRQb3B1cChwb3B1cF9mYWRmNDhlYzlhZjE0YmQ3ODgxMjE4ZjgxYzRlN2M5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lOGJjNDFlYzcwZTY0OWVkYjQwMzE3MTAyM2FlOWM4MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDYyMDY0OTEwNjQ5NSwtMTIyLjUwMDM4MDQyNzkxNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2VmYzQwNzUwZGEzNDMxMDlhZTEzYTQxMWY3NWMxOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDI2ZThlMzgwY2NiNGRmY2EyM2JhNTA3ZDBhYjc4MWMgPSAkKCc8ZGl2IGlkPSJodG1sXzQyNmU4ZTM4MGNjYjRkZmNhMjNiYTUwN2QwYWI3ODFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2VmYzQwNzUwZGEzNDMxMDlhZTEzYTQxMWY3NWMxOGYuc2V0Q29udGVudChodG1sXzQyNmU4ZTM4MGNjYjRkZmNhMjNiYTUwN2QwYWI3ODFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZThiYzQxZWM3MGU2NDllZGI0MDMxNzEwMjNhZTljODAuYmluZFBvcHVwKHBvcHVwX2NlZmM0MDc1MGRhMzQzMTA5YWUxM2E0MTFmNzVjMThmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhkZDdhYmEyOWNlMzQwNjdhYzA2MjgzMWQyNmEwOGM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1MTkxODI2NzIxNywtMTIyLjQ2NjU1ODc4MDY4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjVjMjc2NTJhYmMxNDg5MzhmNDUxYjRiNzRhNjg1ZTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzUxNjRjMTZhMjQ1NGI1YjhiZGU4ZDQ3MjY5YjQ0YzYgPSAkKCc8ZGl2IGlkPSJodG1sXzc1MTY0YzE2YTI0NTRiNWI4YmRlOGQ0NzI2OWI0NGM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNWMyNzY1MmFiYzE0ODkzOGY0NTFiNGI3NGE2ODVlMi5zZXRDb250ZW50KGh0bWxfNzUxNjRjMTZhMjQ1NGI1YjhiZGU4ZDQ3MjY5YjQ0YzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZGQ3YWJhMjljZTM0MDY3YWMwNjI4MzFkMjZhMDhjNy5iaW5kUG9wdXAocG9wdXBfYjVjMjc2NTJhYmMxNDg5MzhmNDUxYjRiNzRhNjg1ZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGI2YThlMTRjZWVlNGEzZGEwZTNjNDAwYTUwMjBmZDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkwODQxNzI5MDI4LC0xMjIuNDg2OTI1OTYwMTE0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzMzQxMTZlMjhiYjQ4OWY4NGM3MDI3NDBkZjFhOWVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkYjZkMjY2N2MzYTRkOGI5Zjg4OGJjMzUzM2IxNzJmID0gJCgnPGRpdiBpZD0iaHRtbF9kZGI2ZDI2NjdjM2E0ZDhiOWY4ODhiYzM1MzNiMTcyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzMzQxMTZlMjhiYjQ4OWY4NGM3MDI3NDBkZjFhOWVjLnNldENvbnRlbnQoaHRtbF9kZGI2ZDI2NjdjM2E0ZDhiOWY4ODhiYzM1MzNiMTcyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRiNmE4ZTE0Y2VlZTRhM2RhMGUzYzQwMGE1MDIwZmQwLmJpbmRQb3B1cChwb3B1cF8yMzM0MTE2ZTI4YmI0ODlmODRjNzAyNzQwZGYxYTllYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMDA3ZDAxODE0MDA0ZDYxYmRjNDc3YmM4MjI0Y2IxNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2ODUzNjAxMjM1ODMsLTEyMi40MTU2MTYzMzgzMTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzE1NmUyNDI2ZDA5NGE4YjhmZjYwOWExYmIyMDU0NzkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE1OTEwNDFiMjkzNDU3MTliZGMyOTg4NThjMDE3ODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2FkY2Q0YmJhYjFmNDMwYWI3ZGE2OTUxNjdlMjAwOTYgPSAkKCc8ZGl2IGlkPSJodG1sX2NhZGNkNGJiYWIxZjQzMGFiN2RhNjk1MTY3ZTIwMDk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxNTkxMDQxYjI5MzQ1NzE5YmRjMjk4ODU4YzAxNzgxLnNldENvbnRlbnQoaHRtbF9jYWRjZDRiYmFiMWY0MzBhYjdkYTY5NTE2N2UyMDA5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IwMDdkMDE4MTQwMDRkNjFiZGM0NzdiYzgyMjRjYjE0LmJpbmRQb3B1cChwb3B1cF9mMTU5MTA0MWIyOTM0NTcxOWJkYzI5ODg1OGMwMTc4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZmYxOTdhNzQwZGE0YWE3OTVkZTVjMmZlNjE3Y2JkMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3YWZhODkxNzViNjQ1MWFiN2U2NjNhYWQ0N2FlN2Y4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1YjliZjBhMDkyODQwNDI5ODBhYmRjZmYzMmUwZDI5ID0gJCgnPGRpdiBpZD0iaHRtbF9iNWI5YmYwYTA5Mjg0MDQyOTgwYWJkY2ZmMzJlMGQyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3YWZhODkxNzViNjQ1MWFiN2U2NjNhYWQ0N2FlN2Y4LnNldENvbnRlbnQoaHRtbF9iNWI5YmYwYTA5Mjg0MDQyOTgwYWJkY2ZmMzJlMGQyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JmZjE5N2E3NDBkYTRhYTc5NWRlNWMyZmU2MTdjYmQyLmJpbmRQb3B1cChwb3B1cF8zN2FmYTg5MTc1YjY0NTFhYjdlNjYzYWFkNDdhZTdmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83MzhiMDk5YTQ0ODQ0ODAwOTllNzI5MTJiNDRhN2E4MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzcxNTZlMjQyNmQwOTRhOGI4ZmY2MDlhMWJiMjA1NDc5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVkZTdjZjNhZGIxZDQ3Y2U4ZDRlNTZiZDA5N2EyZTkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5OWM2NmZiNmVlMjQ5M2E5ZGViYzcxMzE4ZGRhMWU1ID0gJCgnPGRpdiBpZD0iaHRtbF80OTljNjZmYjZlZTI0OTNhOWRlYmM3MTMxOGRkYTFlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWRlN2NmM2FkYjFkNDdjZThkNGU1NmJkMDk3YTJlOTIuc2V0Q29udGVudChodG1sXzQ5OWM2NmZiNmVlMjQ5M2E5ZGViYzcxMzE4ZGRhMWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzM4YjA5OWE0NDg0NDgwMDk5ZTcyOTEyYjQ0YTdhODAuYmluZFBvcHVwKHBvcHVwXzVkZTdjZjNhZGIxZDQ3Y2U4ZDRlNTZiZDA5N2EyZTkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I3NWVmMWFjNTZjMDRiYWE4YjU2NGFiMTg2ZjBlZjBlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM1MjY4MTQ2OTA4Mzk2LC0xMjIuNDcyNzE1NzU5NjMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83MTU2ZTI0MjZkMDk0YThiOGZmNjA5YTFiYjIwNTQ3OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTQ5OTM4ZTI2NTc0MDY5ODY3YjAyYjFlNjI3ODczNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjQ3YzU5ZWFiZWY0NjlmOTEwNDdjNDBjMWM5YjRjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTI0N2M1OWVhYmVmNDY5ZjkxMDQ3YzQwYzFjOWI0YzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlNDk5MzhlMjY1NzQwNjk4NjdiMDJiMWU2Mjc4NzM1LnNldENvbnRlbnQoaHRtbF81MjQ3YzU5ZWFiZWY0NjlmOTEwNDdjNDBjMWM5YjRjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I3NWVmMWFjNTZjMDRiYWE4YjU2NGFiMTg2ZjBlZjBlLmJpbmRQb3B1cChwb3B1cF9mZTQ5OTM4ZTI2NTc0MDY5ODY3YjAyYjFlNjI3ODczNSk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<folium.folium.Map at 0x7fc201d28b00>" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from folium import plugins\n", | |
"\n", | |
"# let's start again with a clean copy of the map of San Francisco\n", | |
"sanfran_map = folium.Map(location = [latitude, longitude], zoom_start = 12)\n", | |
"\n", | |
"# instantiate a mark cluster object for the incidents in the dataframe\n", | |
"incidents = plugins.MarkerCluster().add_to(sanfran_map)\n", | |
"\n", | |
"# loop through the dataframe and add each data point to the mark cluster\n", | |
"for lat, lng, label, in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n", | |
" folium.Marker(\n", | |
" location=[lat, lng],\n", | |
" icon=None,\n", | |
" popup=label,\n", | |
" ).add_to(incidents)\n", | |
"\n", | |
"# display map\n", | |
"sanfran_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Notice how when you zoom out all the way, all markers are grouped into one cluster, *the global cluster*, of 100 markers or crimes, which is the total number of crimes in our dataframe. Once you start zooming in, the *global cluster* will start breaking up into smaller clusters. Zooming in all the way will result in individual markers." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"# Choropleth Maps <a id=\"8\"></a>\n", | |
"\n", | |
"A `Choropleth` map is a thematic map in which areas are shaded or patterned in proportion to the measurement of the statistical variable being displayed on the map, such as population density or per-capita income. The choropleth map provides an easy way to visualize how a measurement varies across a geographic area or it shows the level of variability within a region. Below is a `Choropleth` map of the US depicting the population by square mile per state.\n", | |
"\n", | |
"<img src = \"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Images/2000_census_population_density_map_by_state.png\" width = 600> " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now, let's create our own `Choropleth` map of the world depicting immigration from various countries to Canada.\n", | |
"\n", | |
"Let's first download and import our primary Canadian immigration dataset using *pandas* `read_excel()` method. Normally, before we can do that, we would need to download a module which *pandas* requires to read in excel files. This module is **xlrd**. For your convenience, we have pre-installed this module, so you would not have to worry about that. Otherwise, you would need to run the following line of code to install the **xlrd** module:\n", | |
"```\n", | |
"!conda install -c anaconda xlrd --yes\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Download the dataset and read it into a *pandas* dataframe:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Data downloaded and read into a dataframe!\n" | |
] | |
} | |
], | |
"source": [ | |
"df_can = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',\n", | |
" sheet_name='Canada by Citizenship',\n", | |
" skiprows=range(20),\n", | |
" skipfooter=2)\n", | |
"\n", | |
"print('Data downloaded and read into a dataframe!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's take a look at the first five items in our dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Type</th>\n", | |
" <th>Coverage</th>\n", | |
" <th>OdName</th>\n", | |
" <th>AREA</th>\n", | |
" <th>AreaName</th>\n", | |
" <th>REG</th>\n", | |
" <th>RegName</th>\n", | |
" <th>DEV</th>\n", | |
" <th>DevName</th>\n", | |
" <th>1980</th>\n", | |
" <th>...</th>\n", | |
" <th>2004</th>\n", | |
" <th>2005</th>\n", | |
" <th>2006</th>\n", | |
" <th>2007</th>\n", | |
" <th>2008</th>\n", | |
" <th>2009</th>\n", | |
" <th>2010</th>\n", | |
" <th>2011</th>\n", | |
" <th>2012</th>\n", | |
" <th>2013</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Immigrants</td>\n", | |
" <td>Foreigners</td>\n", | |
" <td>Afghanistan</td>\n", | |
" <td>935</td>\n", | |
" <td>Asia</td>\n", | |
" <td>5501</td>\n", | |
" <td>Southern Asia</td>\n", | |
" <td>902</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>16</td>\n", | |
" <td>...</td>\n", | |
" <td>2978</td>\n", | |
" <td>3436</td>\n", | |
" <td>3009</td>\n", | |
" <td>2652</td>\n", | |
" <td>2111</td>\n", | |
" <td>1746</td>\n", | |
" <td>1758</td>\n", | |
" <td>2203</td>\n", | |
" <td>2635</td>\n", | |
" <td>2004</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Immigrants</td>\n", | |
" <td>Foreigners</td>\n", | |
" <td>Albania</td>\n", | |
" <td>908</td>\n", | |
" <td>Europe</td>\n", | |
" <td>925</td>\n", | |
" <td>Southern Europe</td>\n", | |
" <td>901</td>\n", | |
" <td>Developed regions</td>\n", | |
" <td>1</td>\n", | |
" <td>...</td>\n", | |
" <td>1450</td>\n", | |
" <td>1223</td>\n", | |
" <td>856</td>\n", | |
" <td>702</td>\n", | |
" <td>560</td>\n", | |
" <td>716</td>\n", | |
" <td>561</td>\n", | |
" <td>539</td>\n", | |
" <td>620</td>\n", | |
" <td>603</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Immigrants</td>\n", | |
" <td>Foreigners</td>\n", | |
" <td>Algeria</td>\n", | |
" <td>903</td>\n", | |
" <td>Africa</td>\n", | |
" <td>912</td>\n", | |
" <td>Northern Africa</td>\n", | |
" <td>902</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>80</td>\n", | |
" <td>...</td>\n", | |
" <td>3616</td>\n", | |
" <td>3626</td>\n", | |
" <td>4807</td>\n", | |
" <td>3623</td>\n", | |
" <td>4005</td>\n", | |
" <td>5393</td>\n", | |
" <td>4752</td>\n", | |
" <td>4325</td>\n", | |
" <td>3774</td>\n", | |
" <td>4331</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Immigrants</td>\n", | |
" <td>Foreigners</td>\n", | |
" <td>American Samoa</td>\n", | |
" <td>909</td>\n", | |
" <td>Oceania</td>\n", | |
" <td>957</td>\n", | |
" <td>Polynesia</td>\n", | |
" <td>902</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Immigrants</td>\n", | |
" <td>Foreigners</td>\n", | |
" <td>Andorra</td>\n", | |
" <td>908</td>\n", | |
" <td>Europe</td>\n", | |
" <td>925</td>\n", | |
" <td>Southern Europe</td>\n", | |
" <td>901</td>\n", | |
" <td>Developed regions</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 43 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Type Coverage OdName AREA AreaName REG \\\n", | |
"0 Immigrants Foreigners Afghanistan 935 Asia 5501 \n", | |
"1 Immigrants Foreigners Albania 908 Europe 925 \n", | |
"2 Immigrants Foreigners Algeria 903 Africa 912 \n", | |
"3 Immigrants Foreigners American Samoa 909 Oceania 957 \n", | |
"4 Immigrants Foreigners Andorra 908 Europe 925 \n", | |
"\n", | |
" RegName DEV DevName 1980 ... 2004 2005 2006 \\\n", | |
"0 Southern Asia 902 Developing regions 16 ... 2978 3436 3009 \n", | |
"1 Southern Europe 901 Developed regions 1 ... 1450 1223 856 \n", | |
"2 Northern Africa 902 Developing regions 80 ... 3616 3626 4807 \n", | |
"3 Polynesia 902 Developing regions 0 ... 0 0 1 \n", | |
"4 Southern Europe 901 Developed regions 0 ... 0 0 1 \n", | |
"\n", | |
" 2007 2008 2009 2010 2011 2012 2013 \n", | |
"0 2652 2111 1746 1758 2203 2635 2004 \n", | |
"1 702 560 716 561 539 620 603 \n", | |
"2 3623 4005 5393 4752 4325 3774 4331 \n", | |
"3 0 0 0 0 0 0 0 \n", | |
"4 1 0 0 0 0 1 1 \n", | |
"\n", | |
"[5 rows x 43 columns]" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_can.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's find out how many entries there are in our dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(195, 43)\n" | |
] | |
} | |
], | |
"source": [ | |
"# print the dimensions of the dataframe\n", | |
"print(df_can.shape)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Clean up data. We will make some modifications to the original dataset to make it easier to create our visualizations. Refer to *Introduction to Matplotlib and Line Plots* and *Area Plots, Histograms, and Bar Plots* notebooks for a detailed description of this preprocessing." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"data dimensions: (195, 39)\n" | |
] | |
} | |
], | |
"source": [ | |
"# clean up the dataset to remove unnecessary columns (eg. REG) \n", | |
"df_can.drop(['AREA','REG','DEV','Type','Coverage'], axis=1, inplace=True)\n", | |
"\n", | |
"# let's rename the columns so that they make sense\n", | |
"df_can.rename(columns={'OdName':'Country', 'AreaName':'Continent','RegName':'Region'}, inplace=True)\n", | |
"\n", | |
"# for sake of consistency, let's also make all column labels of type string\n", | |
"df_can.columns = list(map(str, df_can.columns))\n", | |
"\n", | |
"# add total column\n", | |
"df_can['Total'] = df_can.sum(axis=1)\n", | |
"\n", | |
"# years that we will be using in this lesson - useful for plotting later on\n", | |
"years = list(map(str, range(1980, 2014)))\n", | |
"print ('data dimensions:', df_can.shape)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Let's take a look at the first five items of our cleaned dataframe." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Country</th>\n", | |
" <th>Continent</th>\n", | |
" <th>Region</th>\n", | |
" <th>DevName</th>\n", | |
" <th>1980</th>\n", | |
" <th>1981</th>\n", | |
" <th>1982</th>\n", | |
" <th>1983</th>\n", | |
" <th>1984</th>\n", | |
" <th>1985</th>\n", | |
" <th>...</th>\n", | |
" <th>2005</th>\n", | |
" <th>2006</th>\n", | |
" <th>2007</th>\n", | |
" <th>2008</th>\n", | |
" <th>2009</th>\n", | |
" <th>2010</th>\n", | |
" <th>2011</th>\n", | |
" <th>2012</th>\n", | |
" <th>2013</th>\n", | |
" <th>Total</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Afghanistan</td>\n", | |
" <td>Asia</td>\n", | |
" <td>Southern Asia</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>16</td>\n", | |
" <td>39</td>\n", | |
" <td>39</td>\n", | |
" <td>47</td>\n", | |
" <td>71</td>\n", | |
" <td>340</td>\n", | |
" <td>...</td>\n", | |
" <td>3436</td>\n", | |
" <td>3009</td>\n", | |
" <td>2652</td>\n", | |
" <td>2111</td>\n", | |
" <td>1746</td>\n", | |
" <td>1758</td>\n", | |
" <td>2203</td>\n", | |
" <td>2635</td>\n", | |
" <td>2004</td>\n", | |
" <td>58639</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Albania</td>\n", | |
" <td>Europe</td>\n", | |
" <td>Southern Europe</td>\n", | |
" <td>Developed regions</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>1223</td>\n", | |
" <td>856</td>\n", | |
" <td>702</td>\n", | |
" <td>560</td>\n", | |
" <td>716</td>\n", | |
" <td>561</td>\n", | |
" <td>539</td>\n", | |
" <td>620</td>\n", | |
" <td>603</td>\n", | |
" <td>15699</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Algeria</td>\n", | |
" <td>Africa</td>\n", | |
" <td>Northern Africa</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>80</td>\n", | |
" <td>67</td>\n", | |
" <td>71</td>\n", | |
" <td>69</td>\n", | |
" <td>63</td>\n", | |
" <td>44</td>\n", | |
" <td>...</td>\n", | |
" <td>3626</td>\n", | |
" <td>4807</td>\n", | |
" <td>3623</td>\n", | |
" <td>4005</td>\n", | |
" <td>5393</td>\n", | |
" <td>4752</td>\n", | |
" <td>4325</td>\n", | |
" <td>3774</td>\n", | |
" <td>4331</td>\n", | |
" <td>69439</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>American Samoa</td>\n", | |
" <td>Oceania</td>\n", | |
" <td>Polynesia</td>\n", | |
" <td>Developing regions</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>6</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Andorra</td>\n", | |
" <td>Europe</td>\n", | |
" <td>Southern Europe</td>\n", | |
" <td>Developed regions</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>...</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>0</td>\n", | |
" <td>1</td>\n", | |
" <td>1</td>\n", | |
" <td>15</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 39 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Country Continent Region DevName 1980 1981 \\\n", | |
"0 Afghanistan Asia Southern Asia Developing regions 16 39 \n", | |
"1 Albania Europe Southern Europe Developed regions 1 0 \n", | |
"2 Algeria Africa Northern Africa Developing regions 80 67 \n", | |
"3 American Samoa Oceania Polynesia Developing regions 0 1 \n", | |
"4 Andorra Europe Southern Europe Developed regions 0 0 \n", | |
"\n", | |
" 1982 1983 1984 1985 ... 2005 2006 2007 2008 2009 2010 2011 \\\n", | |
"0 39 47 71 340 ... 3436 3009 2652 2111 1746 1758 2203 \n", | |
"1 0 0 0 0 ... 1223 856 702 560 716 561 539 \n", | |
"2 71 69 63 44 ... 3626 4807 3623 4005 5393 4752 4325 \n", | |
"3 0 0 0 0 ... 0 1 0 0 0 0 0 \n", | |
"4 0 0 0 0 ... 0 1 1 0 0 0 0 \n", | |
"\n", | |
" 2012 2013 Total \n", | |
"0 2635 2004 58639 \n", | |
"1 620 603 15699 \n", | |
"2 3774 4331 69439 \n", | |
"3 0 0 6 \n", | |
"4 1 1 15 \n", | |
"\n", | |
"[5 rows x 39 columns]" | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_can.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"In order to create a `Choropleth` map, we need a GeoJSON file that defines the areas/boundaries of the state, county, or country that we are interested in. In our case, since we are endeavoring to create a world map, we want a GeoJSON that defines the boundaries of all world countries. For your convenience, we will be providing you with this file, so let's go ahead and download it. Let's name it **world_countries.json**." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# download countries geojson file\n", | |
"!wget --quiet https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/world_countries.json -O world_countries.json\n", | |
" \n", | |
"print('GeoJSON file downloaded!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Now that we have the GeoJSON file, let's create a world map, centered around **[0, 0]** *latitude* and *longitude* values, with an intial zoom level of 2, and using *Mapbox Bright* style." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"world_geo = r'world_countries.json' # geojson file\n", | |
"\n", | |
"# create a plain world map\n", | |
"world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"And now to create a `Choropleth` map, we will use the *choropleth* method with the following main parameters:\n", | |
"\n", | |
"1. geo_data, which is the GeoJSON file.\n", | |
"2. data, which is the dataframe containing the data.\n", | |
"3. columns, which represents the columns in the dataframe that will be used to create the `Choropleth` map.\n", | |
"4. key_on, which is the key or variable in the GeoJSON file that contains the name of the variable of interest. To determine that, you will need to open the GeoJSON file using any text editor and note the name of the key or variable that contains the name of the countries, since the countries are our variable of interest. In this case, **name** is the key in the GeoJSON file that contains the name of the countries. Note that this key is case_sensitive, so you need to pass exactly as it exists in the GeoJSON file." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"button": false, | |
"collapsed": true, | |
"deletable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# generate choropleth map using the total immigration of each country to Canada from 1980 to 2013\n", | |
"world_map.choropleth(\n", | |
" geo_data=world_geo,\n", | |
" data=df_can,\n", | |
" columns=['Country', 'Total'],\n", | |
" key_on='feature.properties.name',\n", | |
" fill_color='YlOrRd', \n", | |
" fill_opacity=0.7, \n", | |
" line_opacity=0.2,\n", | |
" legend_name='Immigration to Canada'\n", | |
")\n", | |
"\n", | |
"# display map\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"As per our `Choropleth` map legend, the darker the color of a country and the closer the color to red, the higher the number of immigrants from that country. Accordingly, the highest immigration over the course of 33 years (from 1980 to 2013) was from China, India, and the Philippines, followed by Poland, Pakistan, and interestingly, the US." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Notice how the legend is displaying a negative boundary or threshold. Let's fix that by defining our own thresholds and starting with 0 instead of -6,918!" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"button": false, | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
}, | |
"scrolled": false | |
}, | |
"outputs": [], | |
"source": [ | |
"world_geo = r'world_countries.json'\n", | |
"\n", | |
"# create a numpy array of length 6 and has linear spacing from the minium total immigration to the maximum total immigration\n", | |
"threshold_scale = np.linspace(df_can['Total'].min(),\n", | |
" df_can['Total'].max(),\n", | |
" 6, dtype=int)\n", | |
"threshold_scale = threshold_scale.tolist() # change the numpy array to a list\n", | |
"threshold_scale[-1] = threshold_scale[-1] + 1 # make sure that the last value of the list is greater than the maximum immigration\n", | |
"\n", | |
"# let Folium determine the scale.\n", | |
"world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')\n", | |
"world_map.choropleth(\n", | |
" geo_data=world_geo,\n", | |
" data=df_can,\n", | |
" columns=['Country', 'Total'],\n", | |
" key_on='feature.properties.name',\n", | |
" threshold_scale=threshold_scale,\n", | |
" fill_color='YlOrRd', \n", | |
" fill_opacity=0.7, \n", | |
" line_opacity=0.2,\n", | |
" legend_name='Immigration to Canada',\n", | |
" reset=True\n", | |
")\n", | |
"world_map" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"Much better now! Feel free to play around with the data and perhaps create `Choropleth` maps for individuals years, or perhaps decades, and see how they compare with the entire period from 1980 to 2013." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"### Thank you for completing this lab!\n", | |
"\n", | |
"This notebook was created by [Alex Aklson](https://www.linkedin.com/in/aklson/). I hope you found this lab interesting and educational. Feel free to contact me if you have any questions!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"This notebook is part of a course on **Coursera** called *Data Visualization with Python*. If you accessed this notebook outside the course, you can take this course online by clicking [here](http://cocl.us/DV0101EN_Coursera_Week3_LAB2)." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"button": false, | |
"deletable": true, | |
"editable": true, | |
"new_sheet": false, | |
"run_control": { | |
"read_only": false | |
} | |
}, | |
"source": [ | |
"<hr>\n", | |
"\n", | |
"Copyright © 2019 [Cognitive Class](https://cognitiveclass.ai/?utm_source=bducopyrightlink&utm_medium=dswb&utm_campaign=bdu). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/)." | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.8" | |
}, | |
"widgets": { | |
"state": {}, | |
"version": "1.1.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment