Created
June 18, 2019 17:50
-
-
Save WalczRobert/05ea78c39ff48dd6719f5984fe8cbf5b 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": {}, | |
| "source": [ | |
| "# Battle of the Neighborhoods - Coursera Capstone Project\n", | |
| "___" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Introduction \n", | |
| "#### This project will analyze neighborhoods between Toronto, Canada and New York City, New York. A software company is going to open its headquarters in Toronto or New York City. The company wants its employees may have the optimum living standards and quality of life. This job will explore the dissimilarities between two neighborhoods in the two cities, and determine which neighborhood is best fit for the companies employees.\n", | |
| "RW" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1. Segmenting and Clustering Neighborhoods in Toronto\n", | |
| "\n", | |
| "### Use data from Toronto Neighborhood Wikipedia page to segment, cluster and explore neighborhoods in Toronto" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "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", | |
| " - 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::bokeh==0.13.0=py37_0\n", | |
| " - defaults/linux-64::bottleneck==1.2.1=py37h035aef0_1\n", | |
| " - defaults/linux-64::dask==0.19.1=py37_0\n", | |
| " - defaults/linux-64::datashape==0.5.4=py37_1\n", | |
| " - defaults/linux-64::mkl-service==1.1.2=py37h90e4bf4_5\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::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::scikit-image==0.14.0=py37hf484d3e_1\n", | |
| "done\n", | |
| "\n", | |
| "## Package Plan ##\n", | |
| "\n", | |
| " environment location: /home/jupyterlab/conda\n", | |
| "\n", | |
| " added / updated specs:\n", | |
| " - geopy\n", | |
| "\n", | |
| "\n", | |
| "The following packages will be downloaded:\n", | |
| "\n", | |
| " package | build\n", | |
| " ---------------------------|-----------------\n", | |
| " ca-certificates-2019.6.16 | hecc5488_0 145 KB conda-forge\n", | |
| " geographiclib-1.49 | py_0 32 KB conda-forge\n", | |
| " geopy-1.20.0 | py_0 57 KB conda-forge\n", | |
| " ------------------------------------------------------------\n", | |
| " Total: 235 KB\n", | |
| "\n", | |
| "The following NEW packages will be INSTALLED:\n", | |
| "\n", | |
| " geographiclib conda-forge/noarch::geographiclib-1.49-py_0\n", | |
| "\n", | |
| "The following packages will be UPDATED:\n", | |
| "\n", | |
| " ca-certificates 2019.3.9-hecc5488_0 --> 2019.6.16-hecc5488_0\n", | |
| " geopy conda-forge/linux-64::geopy-1.11.0-py~ --> conda-forge/noarch::geopy-1.20.0-py_0\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "Downloading and Extracting Packages\n", | |
| "geographiclib-1.49 | 32 KB | ##################################### | 100% \n", | |
| "geopy-1.20.0 | 57 KB | ##################################### | 100% \n", | |
| "ca-certificates-2019 | 145 KB | ##################################### | 100% \n", | |
| "Preparing transaction: done\n", | |
| "Verifying transaction: done\n", | |
| "Executing transaction: done\n", | |
| "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", | |
| " - 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::bokeh==0.13.0=py37_0\n", | |
| " - defaults/linux-64::bottleneck==1.2.1=py37h035aef0_1\n", | |
| " - defaults/linux-64::dask==0.19.1=py37_0\n", | |
| " - defaults/linux-64::datashape==0.5.4=py37_1\n", | |
| " - defaults/linux-64::mkl-service==1.1.2=py37h90e4bf4_5\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::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::scikit-image==0.14.0=py37hf484d3e_1\n", | |
| "done\n", | |
| "\n", | |
| "# All requested packages already installed.\n", | |
| "\n", | |
| "Libraries are imported.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import numpy as np # library to handle data in a vectorized manner\n", | |
| "import pandas as pd # library for data analsysis\n", | |
| "pd.set_option('display.max_columns', None)\n", | |
| "pd.set_option('display.max_rows', None)\n", | |
| "import json # library to handle JSON files\n", | |
| "\n", | |
| "!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n", | |
| "from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n", | |
| "\n", | |
| "import requests # library to handle requests\n", | |
| "from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n", | |
| "# import k-means from clustering stage\n", | |
| "from sklearn.cluster import KMeans\n", | |
| "# Matplotlib and associated plotting modules\n", | |
| "import matplotlib.cm as cm\n", | |
| "import matplotlib.colors as colors\n", | |
| "\n", | |
| "!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n", | |
| "import folium # map rendering library\n", | |
| "\n", | |
| "print('Libraries are imported.')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Download and Explore Toronto Dataset" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The dateset being used is found at https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M.\n", | |
| "\n", | |
| "The dataset is a list of Toronto's zipcodes which includes the boroughs and neighborhood names. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "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>Postcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1A</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M2A</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postcode Borough Neighbourhood\n", | |
| "0 M1A Not assigned Not assigned\n", | |
| "1 M2A Not assigned Not assigned\n", | |
| "2 M3A North York Parkwoods\n", | |
| "3 M4A North York Victoria Village\n", | |
| "4 M5A Downtown Toronto Harbourfront" | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "#Obtain Postal Code, Borough, and Neighborhood information from Wikipedia\n", | |
| "table = pd.read_html('https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M', header = 0)\n", | |
| "\n", | |
| "#Obtain the first table\n", | |
| "df_toronto = table[0]\n", | |
| "df_toronto.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Transform the data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(103, 3)\n" | |
| ] | |
| }, | |
| { | |
| "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>PostalCode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Woburn</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Borough Neighborhood\n", | |
| "0 M1B Scarborough Rouge,Malvern\n", | |
| "1 M1C Scarborough Highland Creek,Rouge Hill,Port Union\n", | |
| "2 M1E Scarborough Guildwood,Morningside,West Hill\n", | |
| "3 M1G Scarborough Woburn\n", | |
| "4 M1H Scarborough Cedarbrae" | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_toronto.rename(columns = {\"Postcode\": \"PostalCode\", \"Neighbourhood\": \"Neighborhood\"}, inplace = True)\n", | |
| "\n", | |
| "#Only process the cells that have an assigned borough. Ignore cells with a borough that is Not assigned.\n", | |
| "df_toronto.drop(df_toronto[df_toronto.Borough == 'Not assigned'].index, inplace=True)\n", | |
| "#df.head()\n", | |
| "\n", | |
| "#Combine the neighborhoods that exists in one postal code\n", | |
| "df_toronto = df_toronto.groupby(['PostalCode', 'Borough'])['Neighborhood'].apply(lambda x: ','.join(x)).reset_index()\n", | |
| "#df.head()\n", | |
| "\n", | |
| "#Change unassigned Neighborhood to its Borough's name\n", | |
| "df_toronto.loc[85,'Neighborhood'] = 'Queen\\'s Park'\n", | |
| "\n", | |
| "print (df_toronto.shape)\n", | |
| "\n", | |
| "df_toronto.head()\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Join neighborhood table with latitude and longitude information" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "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>Postal Code</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postal Code Latitude Longitude\n", | |
| "0 M1B 43.806686 -79.194353\n", | |
| "1 M1C 43.784535 -79.160497\n", | |
| "2 M1E 43.763573 -79.188711\n", | |
| "3 M1G 43.770992 -79.216917\n", | |
| "4 M1H 43.773136 -79.239476" | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "#Create a dataframe of the latitude and longitudes of the Toronto Neighborhoods\n", | |
| "latlong = pd.read_csv(\"http://cocl.us/Geospatial_data\")\n", | |
| "latlong.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "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>PostalCode</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Latitude Longitude\n", | |
| "0 M1B 43.806686 -79.194353\n", | |
| "1 M1C 43.784535 -79.160497\n", | |
| "2 M1E 43.763573 -79.188711\n", | |
| "3 M1G 43.770992 -79.216917\n", | |
| "4 M1H 43.773136 -79.239476" | |
| ] | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "latlong.rename(columns = {\"Postal Code\": \"PostalCode\"}, inplace = True)\n", | |
| "latlong.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(103, 3)" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "latlong.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "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>PostalCode</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>98</th>\n", | |
| " <td>M9N</td>\n", | |
| " <td>43.706876</td>\n", | |
| " <td>-79.518188</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>99</th>\n", | |
| " <td>M9P</td>\n", | |
| " <td>43.696319</td>\n", | |
| " <td>-79.532242</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>100</th>\n", | |
| " <td>M9R</td>\n", | |
| " <td>43.688905</td>\n", | |
| " <td>-79.554724</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>101</th>\n", | |
| " <td>M9V</td>\n", | |
| " <td>43.739416</td>\n", | |
| " <td>-79.588437</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>102</th>\n", | |
| " <td>M9W</td>\n", | |
| " <td>43.706748</td>\n", | |
| " <td>-79.594054</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Latitude Longitude\n", | |
| "98 M9N 43.706876 -79.518188\n", | |
| "99 M9P 43.696319 -79.532242\n", | |
| "100 M9R 43.688905 -79.554724\n", | |
| "101 M9V 43.739416 -79.588437\n", | |
| "102 M9W 43.706748 -79.594054" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "latlong.tail()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Join latitude and longitude dataframe with neighborhood dataframe" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "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>PostalCode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Borough Neighborhood Latitude \\\n", | |
| "0 M1B Scarborough Rouge,Malvern 43.806686 \n", | |
| "1 M1C Scarborough Highland Creek,Rouge Hill,Port Union 43.784535 \n", | |
| "2 M1E Scarborough Guildwood,Morningside,West Hill 43.763573 \n", | |
| "3 M1G Scarborough Woburn 43.770992 \n", | |
| "4 M1H Scarborough Cedarbrae 43.773136 \n", | |
| "\n", | |
| " Longitude \n", | |
| "0 -79.194353 \n", | |
| "1 -79.160497 \n", | |
| "2 -79.188711 \n", | |
| "3 -79.216917 \n", | |
| "4 -79.239476 " | |
| ] | |
| }, | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "#Join the Lat and Long dataframe to Neighborhoods dataframe\n", | |
| "df_toronto.set_index(\"PostalCode\")\n", | |
| "latlong.set_index(\"PostalCode\")\n", | |
| "neighbor=pd.merge(df_toronto, latlong)\n", | |
| "neighbor.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Toronto has 11 boroughs and 103 neighborhoods.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('Toronto has {} boroughs and {} neighborhoods.'.format(\n", | |
| " len(neighbor['Borough'].unique()),\n", | |
| " neighbor.shape[0]\n", | |
| " )\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Use geopy library to get the latitude and longitude values of Toronto, Canada." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/home/jupyterlab/conda/lib/python3.6/site-packages/ipykernel_launcher.py:3: DeprecationWarning: Using Nominatim with the default \"geopy/1.20.0\" `user_agent` is strongly discouraged, as it violates Nominatim's ToS https://operations.osmfoundation.org/policies/nominatim/ and may possibly cause 403 and 429 HTTP errors. Please specify a custom `user_agent` with `Nominatim(user_agent=\"my-application\")` or by overriding the default `user_agent`: `geopy.geocoders.options.default_user_agent = \"my-application\"`. In geopy 2.0 this will become an exception.\n", | |
| " This is separate from the ipykernel package so we can avoid doing imports until\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of Toronto, Canada are 43.653963, -79.387207.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'Toronto, CA'\n", | |
| "\n", | |
| "geolocator = Nominatim()\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of Toronto, Canada are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Create a map of Toronto with neighborhoods superimposed on top." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "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+ICNtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDggewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2U4MDc2MGY5NTY4MzRlMTE4NzViNDg1NWExNmI5Y2RmID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzRiZGIzMTZlMzg0MTdhYWM5NTM2NDcwOTA2MmI5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkzYTA4MTliZjcyNGNjYWFkYjllMGE5NzdiMDQzOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA1ZDg4YzJkZjIzNGQ3MzlkNWFkOGE0MGE3MzI1YWYgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNWQ4OGMyZGYyMzRkNzM5ZDVhZDhhNDBhNzMyNWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSxNYWx2ZXJuLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkzYTA4MTliZjcyNGNjYWFkYjllMGE5NzdiMDQzOGMuc2V0Q29udGVudChodG1sXzcwNWQ4OGMyZGYyMzRkNzM5ZDVhZDhhNDBhNzMyNWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjNGJkYjMxNmUzODQxN2FhYzk1MzY0NzA5MDYyYjk4LmJpbmRQb3B1cChwb3B1cF9lOTNhMDgxOWJmNzI0Y2NhYWRiOWUwYTk3N2IwNDM4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzQ3ZDY5ZjE3YWU0ODZmODc5NWVkYzA0MmE4MjRlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDUzNTEsLTc5LjE2MDQ5NzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmMDVlYTc1NGUwZjRkMGU5MTNmMzcxMDU0OGYwM2Q5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmZGE2OTQxYmZlODRlM2ZhMTcwNjgyOTg4MDk3ODM4ID0gJCgnPGRpdiBpZD0iaHRtbF83ZmRhNjk0MWJmZTg0ZTNmYTE3MDY4Mjk4ODA5NzgzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmQgQ3JlZWssUm91Z2UgSGlsbCxQb3J0IFVuaW9uLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWYwNWVhNzU0ZTBmNGQwZTkxM2YzNzEwNTQ4ZjAzZDkuc2V0Q29udGVudChodG1sXzdmZGE2OTQxYmZlODRlM2ZhMTcwNjgyOTg4MDk3ODM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjNDdkNjlmMTdhZTQ4NmY4Nzk1ZWRjMDQyYTgyNGUwLmJpbmRQb3B1cChwb3B1cF81ZjA1ZWE3NTRlMGY0ZDBlOTEzZjM3MTA1NDhmMDNkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTBjN2QxN2E3Nzc0ZTUzOWVlYWJlMWQ4ZTk2ZTZlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MzU3MjYsLTc5LjE4ODcxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzAzMDI5NDIzNGY5NDcwZThhYzI2MmQyYTFhNmFmNzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGIzNjA4Y2NmYzA3NDI2Mzg3MzFiZWI5M2FlMDE3ODEgPSAkKCc8ZGl2IGlkPSJodG1sXzhiMzYwOGNjZmMwNzQyNjM4NzMxYmViOTNhZTAxNzgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HdWlsZHdvb2QsTW9ybmluZ3NpZGUsV2VzdCBIaWxsLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzAzMDI5NDIzNGY5NDcwZThhYzI2MmQyYTFhNmFmNzguc2V0Q29udGVudChodG1sXzhiMzYwOGNjZmMwNzQyNjM4NzMxYmViOTNhZTAxNzgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlMGM3ZDE3YTc3NzRlNTM5ZWVhYmUxZDhlOTZlNmVhLmJpbmRQb3B1cChwb3B1cF9jMDMwMjk0MjM0Zjk0NzBlOGFjMjYyZDJhMWE2YWY3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZjFmNmNlNTQzYjA0YzI1YTA4MmNiYjA4OTMzMjEyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3MWY3Yjk2OTY1YjQ5ZTZiMDhlMzY5ZGM2ZGE2MzcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkYTY1ZmVmMzk5MTRiYzJhNjczOWY2ODNhMjQzNDc2ID0gJCgnPGRpdiBpZD0iaHRtbF9hZGE2NWZlZjM5OTE0YmMyYTY3MzlmNjgzYTI0MzQ3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDcxZjdiOTY5NjViNDllNmIwOGUzNjlkYzZkYTYzNzAuc2V0Q29udGVudChodG1sX2FkYTY1ZmVmMzk5MTRiYzJhNjczOWY2ODNhMjQzNDc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmMWY2Y2U1NDNiMDRjMjVhMDgyY2JiMDg5MzMyMTI4LmJpbmRQb3B1cChwb3B1cF8wNzFmN2I5Njk2NWI0OWU2YjA4ZTM2OWRjNmRhNjM3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2Q0MjRhNDNmYzk0NWJmODMwYmE4N2M2NDAzOGM5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MzEzNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE5MDI1ZTNkOThkNDc1OWIxMzczNWUzZjAzYzMyMDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjVlMzFlYjgyOGU1NGI5MTliNTRlOGJmOWVkZTJlNzkgPSAkKCc8ZGl2IGlkPSJodG1sXzI1ZTMxZWI4MjhlNTRiOTE5YjU0ZThiZjllZGUyZTc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZWRhcmJyYWUsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTkwMjVlM2Q5OGQ0NzU5YjEzNzM1ZTNmMDNjMzIwOC5zZXRDb250ZW50KGh0bWxfMjVlMzFlYjgyOGU1NGI5MTliNTRlOGJmOWVkZTJlNzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNkNDI0YTQzZmM5NDViZjgzMGJhODdjNjQwMzhjOWYuYmluZFBvcHVwKHBvcHVwXzFhOTAyNWUzZDk4ZDQ3NTliMTM3MzVlM2YwM2MzMjA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhZTdkOTcwNzQ3MTQzZThhZjIxYTlmYjZiMTFiYmNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmZlNjA0MTE5MWZmNGI0MjkzYmZhODc0YjA0NzM5YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI2OGM0ZDYzYTE4NDUxYTg2ZjdkY2Y3Mjg5OTViMDYgPSAkKCc8ZGl2IGlkPSJodG1sXzRiNjhjNGQ2M2ExODQ1MWE4NmY3ZGNmNzI4OTk1YjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmZlNjA0MTE5MWZmNGI0MjkzYmZhODc0YjA0NzM5Yjcuc2V0Q29udGVudChodG1sXzRiNjhjNGQ2M2ExODQ1MWE4NmY3ZGNmNzI4OTk1YjA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhZTdkOTcwNzQ3MTQzZThhZjIxYTlmYjZiMTFiYmNiLmJpbmRQb3B1cChwb3B1cF9mZmU2MDQxMTkxZmY0YjQyOTNiZmE4NzRiMDQ3MzliNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZjAzNWY0ODIzZWM0ZDdhOTY0NjE0ODRlYjhlZmQ4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhOWVhOTNkODIyZDRlZjdiYzM0ZDkyY2VjZGY3MmJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4OGQzY2Q0ZjIzNzQ5OTA4ZjJlZjAyOGY5ZTYxNjlmID0gJCgnPGRpdiBpZD0iaHRtbF8zODhkM2NkNGYyMzc0OTkwOGYyZWYwMjhmOWU2MTY5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBCaXJjaG1vdW50IFBhcmssSW9udmlldyxLZW5uZWR5IFBhcmssIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTllYTkzZDgyMmQ0ZWY3YmMzNGQ5MmNlY2RmNzJiZS5zZXRDb250ZW50KGh0bWxfMzg4ZDNjZDRmMjM3NDk5MDhmMmVmMDI4ZjllNjE2OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmYwMzVmNDgyM2VjNGQ3YTk2NDYxNDg0ZWI4ZWZkOGMuYmluZFBvcHVwKHBvcHVwX2FhOWVhOTNkODIyZDRlZjdiYzM0ZDkyY2VjZGY3MmJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1MjUwOTI1ODIzMDRjOGY5YTI1YmM1YzdhNmM5ZTdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjMmEwOWJmYzE3ZTQyNTM5ZDdhNThiOTkwNjA5NzZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjNjA5ZWFhM2RjNzRiMzg4NDRlYTA2ZGJlNjljNThkID0gJCgnPGRpdiBpZD0iaHRtbF80YzYwOWVhYTNkYzc0YjM4ODQ0ZWEwNmRiZTY5YzU4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEsR29sZGVuIE1pbGUsT2FrcmlkZ2UsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzJhMDliZmMxN2U0MjUzOWQ3YTU4Yjk5MDYwOTc2ZS5zZXRDb250ZW50KGh0bWxfNGM2MDllYWEzZGM3NGIzODg0NGVhMDZkYmU2OWM1OGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDUyNTA5MjU4MjMwNGM4ZjlhMjViYzVjN2E2YzllN2MuYmluZFBvcHVwKHBvcHVwX2VjMmEwOWJmYzE3ZTQyNTM5ZDdhNThiOTkwNjA5NzZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliZDIzMGU0OTdkYTQ1Mjk4ZjQ2Mzk5Mzc3NDU2ZWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE2MzE2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NmZjYTNhNjFlMmQ0ZjBkOTkyMWQ1NTk2OTJjOThjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTQzNWVhMzM4YTU0ZTdkOGRkOWI1ZDc1NDk4ZDdhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjE0MzVlYTMzOGE1NGU3ZDhkZDliNWQ3NTQ5OGQ3YTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsaWZmY3Jlc3QsQ2xpZmZzaWRlLFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2ZmNhM2E2MWUyZDRmMGQ5OTIxZDU1OTY5MmM5OGMwLnNldENvbnRlbnQoaHRtbF9iMTQzNWVhMzM4YTU0ZTdkOGRkOWI1ZDc1NDk4ZDdhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YmQyMzBlNDk3ZGE0NTI5OGY0NjM5OTM3NzQ1NmVkYy5iaW5kUG9wdXAocG9wdXBfNTZmY2EzYTYxZTJkNGYwZDk5MjFkNTU5NjkyYzk4YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA2NDU0OGNmYTQyNGMxZDlmMzdiODhkM2U5NTFhNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDVhMjU1MDFiY2FmNGQ3Nzg3NWQzZDEwYTVhMzRlZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU4MTI4MDFlZWYxNDFmNmEzMzc2OTljYzYwYWYxYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzk1ODEyODAxZWVmMTQxZjZhMzM3Njk5Y2M2MGFmMWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaXJjaCBDbGlmZixDbGlmZnNpZGUgV2VzdCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1YTI1NTAxYmNhZjRkNzc4NzVkM2QxMGE1YTM0ZWU2LnNldENvbnRlbnQoaHRtbF85NTgxMjgwMWVlZjE0MWY2YTMzNzY5OWNjNjBhZjFhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDY0NTQ4Y2ZhNDI0YzFkOWYzN2I4OGQzZTk1MWE1Mi5iaW5kUG9wdXAocG9wdXBfMDVhMjU1MDFiY2FmNGQ3Nzg3NWQzZDEwYTVhMzRlZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmQ3ZjlkMjE2NTY1NGI2OTliZGZiNzU2ZGNkNzJiOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0MDk2LC03OS4yNzMzMDQwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOTdjYjg4MjdlMjQ0NjMwOGRhZDJmOGZlMWM1YzhiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNmFjMWY1OWU3NjA0MzU5YTQ3NjNmNGE5Y2M1OWNjZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTZhYzFmNTllNzYwNDM1OWE0NzYzZjRhOWNjNTljY2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvcnNldCBQYXJrLFNjYXJib3JvdWdoIFRvd24gQ2VudHJlLFdleGZvcmQgSGVpZ2h0cywgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5N2NiODgyN2UyNDQ2MzA4ZGFkMmY4ZmUxYzVjOGIwLnNldENvbnRlbnQoaHRtbF9lNmFjMWY1OWU3NjA0MzU5YTQ3NjNmNGE5Y2M1OWNjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZDdmOWQyMTY1NjU0YjY5OWJkZmI3NTZkY2Q3MmI5Zi5iaW5kUG9wdXAocG9wdXBfYTk3Y2I4ODI3ZTI0NDYzMDhkYWQyZjhmZTFjNWM4YjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjVkNmNhZDc3YjUwNGJmNjkwN2I5NTUyZDQ2ZDM5MjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTAwNzE1MDAwMDAwMDQsLTc5LjI5NTg0OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzFkNGQwNDlmNjdlNDEwY2E5MTBiZGZkZDRlNzY1ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDA0ZGZkOWY1ZmQ2NGI5M2IxYTU1ZTEwZTM1NjVhOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzQwNGRmZDlmNWZkNjRiOTNiMWE1NWUxMGUzNTY1YThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSxXZXhmb3JkLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzFkNGQwNDlmNjdlNDEwY2E5MTBiZGZkZDRlNzY1ZDcuc2V0Q29udGVudChodG1sXzQwNGRmZDlmNWZkNjRiOTNiMWE1NWUxMGUzNTY1YThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1ZDZjYWQ3N2I1MDRiZjY5MDdiOTU1MmQ0NmQzOTIxLmJpbmRQb3B1cChwb3B1cF83MWQ0ZDA0OWY2N2U0MTBjYTkxMGJkZmRkNGU3NjVkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTE4MTBmMjVkMmM0N2ViOTk4OWUxMzgwYjg5YzI5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4MjMyYTQwNzk1ZjQ5ZjdiZTJkZmUzNWIzYjZhODE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4NTY3YTc2ODFjNTQ2NGI5YWRmZTE3MjczODc2NGNmID0gJCgnPGRpdiBpZD0iaHRtbF9hODU2N2E3NjgxYzU0NjRiOWFkZmUxNzI3Mzg3NjRjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTgyMzJhNDA3OTVmNDlmN2JlMmRmZTM1YjNiNmE4MTYuc2V0Q29udGVudChodG1sX2E4NTY3YTc2ODFjNTQ2NGI5YWRmZTE3MjczODc2NGNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1MTgxMGYyNWQyYzQ3ZWI5OTg5ZTEzODBiODljMjljLmJpbmRQb3B1cChwb3B1cF9lODIzMmE0MDc5NWY0OWY3YmUyZGZlMzViM2I2YTgxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDlkMDU1ZjA3MTg0ZmU4ODFlNDMyNDRjMzlhNGRhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTQ3Mjc0NWQzY2M4NGVjOGI4ZjljNmVkYWRlNTg1NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA0NWQwYjJjNWMxNGJiOGEyZTc4ZjU3NWIyZjNiNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNDVkMGIyYzVjMTRiYjhhMmU3OGY1NzViMmYzYjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycyxTdWxsaXZhbixUYW0gTyYjMzk7U2hhbnRlciwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE0NzI3NDVkM2NjODRlYzhiOGY5YzZlZGFkZTU4NTZkLnNldENvbnRlbnQoaHRtbF83MDQ1ZDBiMmM1YzE0YmI4YTJlNzhmNTc1YjJmM2I0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDlkMDU1ZjA3MTg0ZmU4ODFlNDMyNDRjMzlhNGRhOC5iaW5kUG9wdXAocG9wdXBfMTQ3Mjc0NWQzY2M4NGVjOGI4ZjljNmVkYWRlNTg1NmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTljMTBjZjY1ZDYxNGVkMjkwNzIzNWY1YTNkYjdlOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlODYxM2UwNzY4YTQ4YzA4OTdlMGJlZGE1MGM1Y2EyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiOWYxNWEzZDRiODRkZWFhNjJjZTllMjY0MTYxYWIxID0gJCgnPGRpdiBpZD0iaHRtbF9hYjlmMTVhM2Q0Yjg0ZGVhYTYyY2U5ZTI2NDE2MWFiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLEwmIzM5O0Ftb3JlYXV4IEVhc3QsTWlsbGlrZW4sU3RlZWxlcyBFYXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2U4NjEzZTA3NjhhNDhjMDg5N2UwYmVkYTUwYzVjYTIuc2V0Q29udGVudChodG1sX2FiOWYxNWEzZDRiODRkZWFhNjJjZTllMjY0MTYxYWIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5YzEwY2Y2NWQ2MTRlZDI5MDcyMzVmNWEzZGI3ZTlmLmJpbmRQb3B1cChwb3B1cF83ZTg2MTNlMDc2OGE0OGMwODk3ZTBiZWRhNTBjNWNhMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZTIyNGYxN2ZjZTU0ZTczOWQ3OWI0ZWNmNDI1YWFiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMWRkN2FhNjllZmM0ZmVhODEyYjRkMjMxYzc4YTQ0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjg5ZDI5MjUwZmU0ZDlmYmQyYTdjNjJiOTQ5OGZiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWY4OWQyOTI1MGZlNGQ5ZmJkMmE3YzYyYjk0OThmYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkwmIzM5O0Ftb3JlYXV4IFdlc3QsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMWRkN2FhNjllZmM0ZmVhODEyYjRkMjMxYzc4YTQ0MC5zZXRDb250ZW50KGh0bWxfZWY4OWQyOTI1MGZlNGQ5ZmJkMmE3YzYyYjk0OThmYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2UyMjRmMTdmY2U1NGU3MzlkNzliNGVjZjQyNWFhYjMuYmluZFBvcHVwKHBvcHVwXzIxZGQ3YWE2OWVmYzRmZWE4MTJiNGQyMzFjNzhhNDQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxY2ZiYjg3MmQxNjQ4MTc4ZWEyNWNkYTRlMWNiYzljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODM2MTI0NzAwMDAwMDA2LC03OS4yMDU2MzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzBlZWQ3N2ZiYjI0ZDJlYTI4ZjUwOTZiZTg5MjJjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzZlNWYzMGE4ODM0Y2ZhYTk4MTVlNmUwNjg3NWVlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDM2ZTVmMzBhODgzNGNmYWE5ODE1ZTZlMDY4NzVlZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVwcGVyIFJvdWdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDMwZWVkNzdmYmIyNGQyZWEyOGY1MDk2YmU4OTIyY2Iuc2V0Q29udGVudChodG1sXzQzNmU1ZjMwYTg4MzRjZmFhOTgxNWU2ZTA2ODc1ZWViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxY2ZiYjg3MmQxNjQ4MTc4ZWEyNWNkYTRlMWNiYzljLmJpbmRQb3B1cChwb3B1cF8wMzBlZWQ3N2ZiYjI0ZDJlYTI4ZjUwOTZiZTg5MjJjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDA4ZDdkYjk5Yzk0ZjRkOWVmYmQ4OWM4MTE0YzA4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMzc2MjIsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTNkNTA5Yjk3MGU4NGM1NmE1MTkyZDc3MWZjYTNiZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTgwOTVjNWMyY2E3NDZmZmJiNjM5NTY0MTlmNWM0OTIgPSAkKCc8ZGl2IGlkPSJodG1sXzE4MDk1YzVjMmNhNzQ2ZmZiYjYzOTU2NDE5ZjVjNDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTNkNTA5Yjk3MGU4NGM1NmE1MTkyZDc3MWZjYTNiZDkuc2V0Q29udGVudChodG1sXzE4MDk1YzVjMmNhNzQ2ZmZiYjYzOTU2NDE5ZjVjNDkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwMDhkN2RiOTljOTRmNGQ5ZWZiZDg5YzgxMTRjMDgwLmJpbmRQb3B1cChwb3B1cF8xM2Q1MDliOTcwZTg0YzU2YTUxOTJkNzcxZmNhM2JkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NjRjZDE5ZDJlMTk0NTUyOWU1ZGNhNzE1ZDc4OTEyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3ODUxNzUsLTc5LjM0NjU1NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzI2MDFkZDI0ODE4NDMwMzg3YzM2MWU4MzAwMjQxZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDRlZDEzNTcyNzBiNDM4OTgxYmE1MjQ5NzIyNjY5NzMgPSAkKCc8ZGl2IGlkPSJodG1sXzA0ZWQxMzU3MjcwYjQzODk4MWJhNTI0OTcyMjY2OTczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYWlydmlldyxIZW5yeSBGYXJtLE9yaW9sZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzI2MDFkZDI0ODE4NDMwMzg3YzM2MWU4MzAwMjQxZDkuc2V0Q29udGVudChodG1sXzA0ZWQxMzU3MjcwYjQzODk4MWJhNTI0OTcyMjY2OTczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk2NGNkMTlkMmUxOTQ1NTI5ZTVkY2E3MTVkNzg5MTJiLmJpbmRQb3B1cChwb3B1cF8zMjYwMWRkMjQ4MTg0MzAzODdjMzYxZTgzMDAyNDFkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzgwZGMzOTk1ZTU0YzE1OTBjZDUyZWM1NjUxOTY3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDI4MDI4ZmVjMDg0YjM2YjY5NWY1NDQyMDcyMWQ3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZjAyMzAzMzBkMDg0NmJjOTYwYzg3OWY1ODg2MDg4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2YwMjMwMzMwZDA4NDZiYzk2MGM4NzlmNTg4NjA4ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQyODAyOGZlYzA4NGIzNmI2OTVmNTQ0MjA3MjFkNzUuc2V0Q29udGVudChodG1sX2NmMDIzMDMzMGQwODQ2YmM5NjBjODc5ZjU4ODYwODg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzODBkYzM5OTVlNTRjMTU5MGNkNTJlYzU2NTE5Njc4LmJpbmRQb3B1cChwb3B1cF80NDI4MDI4ZmVjMDg0YjM2YjY5NWY1NDQyMDcyMWQ3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYjhmZjNlZTRhYzI0Y2EwOWQyYzM5OTVkM2JkYTA1MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQ5MDIsLTc5LjM3NDcxNDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OWU2NzM4ZWUwMjRhMzE5MWJlODU2OWU0YzdkYjMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjZGRjOGQwNGQ5NDQwMzA4MmY5OTYyZGIzNGViYzE0ID0gJCgnPGRpdiBpZD0iaHRtbF83Y2RkYzhkMDRkOTQ0MDMwODJmOTk2MmRiMzRlYmMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2lsdmVyIEhpbGxzLFlvcmsgTWlsbHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4OWU2NzM4ZWUwMjRhMzE5MWJlODU2OWU0YzdkYjMwLnNldENvbnRlbnQoaHRtbF83Y2RkYzhkMDRkOTQ0MDMwODJmOTk2MmRiMzRlYmMxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYjhmZjNlZTRhYzI0Y2EwOWQyYzM5OTVkM2JkYTA1Mi5iaW5kUG9wdXAocG9wdXBfMzg5ZTY3MzhlZTAyNGEzMTkxYmU4NTY5ZTRjN2RiMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTAzMzU0N2VjNGM4NGJmZGFkOTgwNjlkY2Q2ZWMyMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODkwNTMsLTc5LjQwODQ5Mjc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiMTdjMjEzN2UxYzRiNjg5ZTNjYzFhZWJhZmJmOWI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5NWI5MTEzNzkzMTRjYjJiMTI4MzdkNGJiZTk2NGQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9kOTViOTExMzc5MzE0Y2IyYjEyODM3ZDRiYmU5NjRkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3dG9uYnJvb2ssV2lsbG93ZGFsZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2IxN2MyMTM3ZTFjNGI2ODllM2NjMWFlYmFmYmY5Yjguc2V0Q29udGVudChodG1sX2Q5NWI5MTEzNzkzMTRjYjJiMTI4MzdkNGJiZTk2NGQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwMzM1NDdlYzRjODRiZmRhZDk4MDY5ZGNkNmVjMjJjLmJpbmRQb3B1cChwb3B1cF8zYjE3YzIxMzdlMWM0YjY4OWUzY2MxYWViYWZiZjliOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzU5Nzk2NDYyODk0ZjJlOGYzYWJkYjBjMGY3YzA4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDExOTksLTc5LjQwODQ5Mjc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0OWZmNjIxZWI5NzRmZTRhMmEyODRmMGVjNjgwMjllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0MWQ2MTdjZWNkNDQ5OWI5NjYwNTc4MDc1YjE3MjczID0gJCgnPGRpdiBpZD0iaHRtbF8xNDFkNjE3Y2VjZDQ0OTliOTY2MDU3ODA3NWIxNzI3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbG93ZGFsZSBTb3V0aCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQ5ZmY2MjFlYjk3NGZlNGEyYTI4NGYwZWM2ODAyOWUuc2V0Q29udGVudChodG1sXzE0MWQ2MTdjZWNkNDQ5OWI5NjYwNTc4MDc1YjE3MjczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzNTk3OTY0NjI4OTRmMmU4ZjNhYmRiMGMwZjdjMDhmLmJpbmRQb3B1cChwb3B1cF8wNDlmZjYyMWViOTc0ZmU0YTJhMjg0ZjBlYzY4MDI5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NzI1ZDE0NzM2NTI0ZDk0YjUzMzhmZWFhNWRkMGZkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1Mjc1ODI5OTk5OTk5NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZmExNGQyZTUwOWU0NmIzYTE5YWYxN2M0NDJiYTc5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjQ2NmM1ZjBjZjU0M2Y0YWI2YzQxYjljNmE4OWY0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTY0NjZjNWYwY2Y1NDNmNGFiNmM0MWI5YzZhODlmNGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmsgTWlsbHMgV2VzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWZhMTRkMmU1MDllNDZiM2ExOWFmMTdjNDQyYmE3OWIuc2V0Q29udGVudChodG1sX2E2NDY2YzVmMGNmNTQzZjRhYjZjNDFiOWM2YTg5ZjRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3MjVkMTQ3MzY1MjRkOTRiNTMzOGZlYWE1ZGQwZmQxLmJpbmRQb3B1cChwb3B1cF9hZmExNGQyZTUwOWU0NmIzYTE5YWYxN2M0NDJiYTc5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80N2VmODQxZGQ3NzU0MGZiYjg0YjBjYTY2OTE5ZDcwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MjczNjQsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjgzZDAwNmRiNTM0NDM1MmFhYzBlNGIyY2I4NTIzNmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDBiYWQyYThjMGE3NGY5ZGFhYzc1MmE2NmM2YjE5NTcgPSAkKCc8ZGl2IGlkPSJodG1sXzAwYmFkMmE4YzBhNzRmOWRhYWM3NTJhNjZjNmIxOTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFdlc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4M2QwMDZkYjUzNDQzNTJhYWMwZTRiMmNiODUyMzZmLnNldENvbnRlbnQoaHRtbF8wMGJhZDJhOGMwYTc0ZjlkYWFjNzUyYTY2YzZiMTk1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80N2VmODQxZGQ3NzU0MGZiYjg0YjBjYTY2OTE5ZDcwMC5iaW5kUG9wdXAocG9wdXBfMjgzZDAwNmRiNTM0NDM1MmFhYzBlNGIyY2I4NTIzNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmI3ZWU3NDAwNzcxNDU3MDhhODEzYjVhZWVlNWNhYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTMyNTg2LC03OS4zMjk2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZDQ2MWI4MzJkYzQxMDI5NWY1MzE2MWFkYmJlNzU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwM2EwMzQ0ZjY5YzRiZWM4MmQxNzBjZjY2ODYxM2UyID0gJCgnPGRpdiBpZD0iaHRtbF9jMDNhMDM0NGY2OWM0YmVjODJkMTcwY2Y2Njg2MTNlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya3dvb2RzLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGQ0NjFiODMyZGM0MTAyOTVmNTMxNjFhZGJiZTc1Ny5zZXRDb250ZW50KGh0bWxfYzAzYTAzNDRmNjljNGJlYzgyZDE3MGNmNjY4NjEzZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmI3ZWU3NDAwNzcxNDU3MDhhODEzYjVhZWVlNWNhYzYuYmluZFBvcHVwKHBvcHVwX2VkZDQ2MWI4MzJkYzQxMDI5NWY1MzE2MWFkYmJlNzU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2Yjk3M2FmZmI0ZDQ5NTU4ZjU1MjQyYmEwYTQxZDFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ1OTA1Nzk5OTk5OTk2LC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTZlNDQxYjE2MWNjNDVhMmJlOWJmNTBjZTkxNjhhNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ4MGY3MmZiNmU3NGNlMGJhMDVkZjczNDg3ZThkZWEgPSAkKCc8ZGl2IGlkPSJodG1sXzM0ODBmNzJmYjZlNzRjZTBiYTA1ZGY3MzQ4N2U4ZGVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb24gTWlsbHMgTm9ydGgsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2ZTQ0MWIxNjFjYzQ1YTJiZTliZjUwY2U5MTY4YTZkLnNldENvbnRlbnQoaHRtbF8zNDgwZjcyZmI2ZTc0Y2UwYmEwNWRmNzM0ODdlOGRlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmI5NzNhZmZiNGQ0OTU1OGY1NTI0MmJhMGE0MWQxYy5iaW5kUG9wdXAocG9wdXBfOTZlNDQxYjE2MWNjNDVhMmJlOWJmNTBjZTkxNjhhNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYwNjFjNTU2YjViNGFiMGIwNzY1MTQwYWFhZDliZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4OTk3MDAwMDAwMSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjOWQ4YzRhZjBmNTQ3YmE4NWMzNDZkYzZiN2IyZjdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2ZjRhNDhmM2JkYTQ0NGZhNGNhMGI2M2MzZGM3MGU1ID0gJCgnPGRpdiBpZD0iaHRtbF82NmY0YTQ4ZjNiZGE0NDRmYTRjYTBiNjNjM2RjNzBlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxlbWluZ2RvbiBQYXJrLERvbiBNaWxscyBTb3V0aCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM5ZDhjNGFmMGY1NDdiYTg1YzM0NmRjNmI3YjJmN2Uuc2V0Q29udGVudChodG1sXzY2ZjRhNDhmM2JkYTQ0NGZhNGNhMGI2M2MzZGM3MGU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmMDYxYzU1NmI1YjRhYjBiMDc2NTE0MGFhYWQ5YmRkLmJpbmRQb3B1cChwb3B1cF9mYzlkOGM0YWYwZjU0N2JhODVjMzQ2ZGM2YjdiMmY3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTJjOGQyMjdkYzc0MWZhYjZkOGMxMWQ4ZTk3MDIwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NDMyODMsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQ4NzVjMTVhNjUxNDc5MmIwMDdiMzgzYTVmZjM0ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTYzODgyMzA3Mzk0NDQ2YmJlZjVjZDU4ZTk4NzBmNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzk2Mzg4MjMwNzM5NDQ0NmJiZWY1Y2Q1OGU5ODcwZjQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vcixEb3duc3ZpZXcgTm9ydGgsV2lsc29uIEhlaWdodHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkODc1YzE1YTY1MTQ3OTJiMDA3YjM4M2E1ZmYzNGY5LnNldENvbnRlbnQoaHRtbF85NjM4ODIzMDczOTQ0NDZiYmVmNWNkNThlOTg3MGY0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTJjOGQyMjdkYzc0MWZhYjZkOGMxMWQ4ZTk3MDIwYi5iaW5kUG9wdXAocG9wdXBfNGQ4NzVjMTVhNjUxNDc5MmIwMDdiMzgzYTVmZjM0ZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjM1NmFhZTE5OGVkNDdhMzg4YjE0ZjJiNjQxZjBjMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTVjOGMwYjYzYWM0YzBjYmQ3OTEwMmUyMzY0YTI5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZWVmN2JkYjBjYzM0NTdkYTJkODgzNTRlOGYwYWE5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGVlZjdiZGIwY2MzNDU3ZGEyZDg4MzU0ZThmMGFhOWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod29vZCBQYXJrLFlvcmsgVW5pdmVyc2l0eSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzU1YzhjMGI2M2FjNGMwY2JkNzkxMDJlMjM2NGEyOTQuc2V0Q29udGVudChodG1sX2RlZWY3YmRiMGNjMzQ1N2RhMmQ4ODM1NGU4ZjBhYTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzNTZhYWUxOThlZDQ3YTM4OGIxNGYyYjY0MWYwYzE1LmJpbmRQb3B1cChwb3B1cF83NTVjOGMwYjYzYWM0YzBjYmQ3OTEwMmUyMzY0YTI5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmVkZjMwMjBiYmY0NjAwODg5N2Q3MmM5YTM5MjU2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczNzQ3MzIwMDAwMDAwNCwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBmNmZkY2FlODdmNDBmYzgzOTczOTk2NTJkZDAzZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODUzOTlmNTQ4ZmI4NGZlNmJkMDEwN2VlMTlhYzFmNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzg1Mzk5ZjU0OGZiODRmZTZiZDAxMDdlZTE5YWMxZjcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DRkIgVG9yb250byxEb3duc3ZpZXcgRWFzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBmNmZkY2FlODdmNDBmYzgzOTczOTk2NTJkZDAzZGMuc2V0Q29udGVudChodG1sXzg1Mzk5ZjU0OGZiODRmZTZiZDAxMDdlZTE5YWMxZjcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZWRmMzAyMGJiZjQ2MDA4ODk3ZDcyYzlhMzkyNTZlLmJpbmRQb3B1cChwb3B1cF84MGY2ZmRjYWU4N2Y0MGZjODM5NzM5OTY1MmRkMDNkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YWM4NTFlM2E0ODg0NWYyYmIxZWFhMWM0MjU1MzM2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTAxNDYsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE4MDkxNjY3NGRjNDA4ZWIwZGM5OGRhOTNhMzM2YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2NjN2UyZTIyZWMxNDVkNjk0MzlhZjg5MDlkYjYzMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzNjYzdlMmUyMmVjMTQ1ZDY5NDM5YWY4OTA5ZGI2MzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgV2VzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDE4MDkxNjY3NGRjNDA4ZWIwZGM5OGRhOTNhMzM2YTQuc2V0Q29udGVudChodG1sXzNjYzdlMmUyMmVjMTQ1ZDY5NDM5YWY4OTA5ZGI2MzE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhYzg1MWUzYTQ4ODQ1ZjJiYjFlYWExYzQyNTUzMzYyLmJpbmRQb3B1cChwb3B1cF8wMTgwOTE2Njc0ZGM0MDhlYjBkYzk4ZGE5M2EzMzZhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzljNjNmMTYyOGY0MzY5YmJhM2MxYTBlZDg1MjI0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyODQ5NjQsLTc5LjQ5NTY5NzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNTQzNjE0YjRmMTQyMWE4N2M2OWQ2NDIxNDc1NmQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxNjMwYmZiOWQ2YzRjNWM5NzE2NDJlOTJlMGY1OGUyID0gJCgnPGRpdiBpZD0iaHRtbF82MTYzMGJmYjlkNmM0YzVjOTcxNjQyZTkyZTBmNThlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IENlbnRyYWwsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhNTQzNjE0YjRmMTQyMWE4N2M2OWQ2NDIxNDc1NmQ5LnNldENvbnRlbnQoaHRtbF82MTYzMGJmYjlkNmM0YzVjOTcxNjQyZTkyZTBmNThlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YzljNjNmMTYyOGY0MzY5YmJhM2MxYTBlZDg1MjI0Yy5iaW5kUG9wdXAocG9wdXBfNWE1NDM2MTRiNGYxNDIxYTg3YzY5ZDY0MjE0NzU2ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmVlMGI0MTE0ZDE5NDJkMTg5MThlODkzOTIyNjc5ZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjE2MzEzLC03OS41MjA5OTk0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTQ3OTNmZDA4YWU0OThjOWFkNmM0MmNmMzgxNzQ0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNzVmYTU2NTY5ODk0MWQ2YjkzYTQxMTc3MDFlODE3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDc1ZmE1NjU2OTg5NDFkNmI5M2E0MTE3NzAxZTgxNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBOb3J0aHdlc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllNDc5M2ZkMDhhZTQ5OGM5YWQ2YzQyY2YzODE3NDRjLnNldENvbnRlbnQoaHRtbF8wNzVmYTU2NTY5ODk0MWQ2YjkzYTQxMTc3MDFlODE3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZWUwYjQxMTRkMTk0MmQxODkxOGU4OTM5MjI2NzlkOS5iaW5kUG9wdXAocG9wdXBfOWU0NzkzZmQwOGFlNDk4YzlhZDZjNDJjZjM4MTc0NGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdiOWNlZDM4YzJmNGZiMDk5YWQxZTkxNDVmZTFkNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4ODIyOTk5OTk5OTUsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkNmE0NDIwNWVhOTQ3MGY5ZWJkMjdkMmNmYWJhMjllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmNzE2ZmUyZDQ3OTQ3Zjg5NTRhNTUzOTMzOGJmYTk3ID0gJCgnPGRpdiBpZD0iaHRtbF81ZjcxNmZlMmQ0Nzk0N2Y4OTU0YTU1MzkzMzhiZmE5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmljdG9yaWEgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGQ2YTQ0MjA1ZWE5NDcwZjllYmQyN2QyY2ZhYmEyOWUuc2V0Q29udGVudChodG1sXzVmNzE2ZmUyZDQ3OTQ3Zjg5NTRhNTUzOTMzOGJmYTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3YjljZWQzOGMyZjRmYjA5OWFkMWU5MTQ1ZmUxZDYyLmJpbmRQb3B1cChwb3B1cF84ZDZhNDQyMDVlYTk0NzBmOWViZDI3ZDJjZmFiYTI5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmM5MzM3Y2UxYzU0NDc1YjE5YWUyNjVhZWJjZjRlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjM5NzIsLTc5LjMwOTkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTRhMTQ1NTYxMDU0NDNkYTUyMDJkMmNiOGU4NTI1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZWMyYWIxOWI5NDA0MGYzOTA3ZmI0YWI5M2UxMzBlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWVjMmFiMTliOTQwNDBmMzkwN2ZiNGFiOTNlMTMwZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEdhcmRlbnMsUGFya3ZpZXcgSGlsbCwgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTRhMTQ1NTYxMDU0NDNkYTUyMDJkMmNiOGU4NTI1Yi5zZXRDb250ZW50KGh0bWxfOWVjMmFiMTliOTQwNDBmMzkwN2ZiNGFiOTNlMTMwZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZjOTMzN2NlMWM1NDQ3NWIxOWFlMjY1YWViY2Y0ZTIuYmluZFBvcHVwKHBvcHVwX2YxNGExNDU1NjEwNTQ0M2RhNTIwMmQyY2I4ZTg1MjViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlYjExZTY3YzAxNDRmYjRiMTk2OTRhNDg2N2ZiNjA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk1MzQzOTAwMDAwMDA1LC03OS4zMTgzODg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhZmE3NGU3MjhjODRjN2ZiMDQ1OGZlNjAxZGNmMTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4Y2VjODg5YTVmODQ1NWI5ZjdhM2MxNWI0NzM2ZDQwID0gJCgnPGRpdiBpZD0iaHRtbF82OGNlYzg4OWE1Zjg0NTViOWY3YTNjMTViNDczNmQ0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGJpbmUgSGVpZ2h0cywgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YWZhNzRlNzI4Yzg0YzdmYjA0NThmZTYwMWRjZjEwMS5zZXRDb250ZW50KGh0bWxfNjhjZWM4ODlhNWY4NDU1YjlmN2EzYzE1YjQ3MzZkNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWViMTFlNjdjMDE0NGZiNGIxOTY5NGE0ODY3ZmI2MDQuYmluZFBvcHVwKHBvcHVwXzVhZmE3NGU3MjhjODRjN2ZiMDQ1OGZlNjAxZGNmMTAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhZGU1NjMxNzAyNzRjNGZiNDU0ZTNjN2FhY2Q2MDUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc2MzU3Mzk5OTk5OTksLTc5LjI5MzAzMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzI1ZmNkYmU5YmVmNDZhY2E0MWVhNmY2YTA0MTMxOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQyZGZmYjRlOGVkNDk2NzlkYzFiMWVkNDQ3MmJhOGQgPSAkKCc8ZGl2IGlkPSJodG1sXzM0MmRmZmI0ZThlZDQ5Njc5ZGMxYjFlZDQ0NzJiYThkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmVhY2hlcywgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MjVmY2RiZTliZWY0NmFjYTQxZWE2ZjZhMDQxMzE4YS5zZXRDb250ZW50KGh0bWxfMzQyZGZmYjRlOGVkNDk2NzlkYzFiMWVkNDQ3MmJhOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2FkZTU2MzE3MDI3NGM0ZmI0NTRlM2M3YWFjZDYwNTMuYmluZFBvcHVwKHBvcHVwXzcyNWZjZGJlOWJlZjQ2YWNhNDFlYTZmNmEwNDEzMThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2YjAxZDlhOGI3YjQzYTRhMjg4OTIxNDRhNmIyZmNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5MDYwNCwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjU2YjMyMjViZTI0ZjRlYTg5MzY2NmZiNjc5ZmI2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzU4ZWM1OGQwMzc0YjIyODQzYmRhY2RhNDJjN2I0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjc1OGVjNThkMDM3NGIyMjg0M2JkYWNkYTQyYzdiNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlYXNpZGUsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjI1NmIzMjI1YmUyNGY0ZWE4OTM2NjZmYjY3OWZiNjkuc2V0Q29udGVudChodG1sX2Y3NThlYzU4ZDAzNzRiMjI4NDNiZGFjZGE0MmM3YjQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2YjAxZDlhOGI3YjQzYTRhMjg4OTIxNDRhNmIyZmNiLmJpbmRQb3B1cChwb3B1cF82MjU2YjMyMjViZTI0ZjRlYTg5MzY2NmZiNjc5ZmI2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjIzYWU0OGE0Nzg0ZTM0YmU0ZTdkMWQ0MmQyNDFlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNTM2ODksLTc5LjM0OTM3MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzYTU2MGE1YzE5NDRjN2JiNTg4ZTIyNWFlZWMwODQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0YzZhYzMzNDUzZDRmODNhYzg4OTM2OTc5NTJhMDY3ID0gJCgnPGRpdiBpZD0iaHRtbF8xNGM2YWMzMzQ1M2Q0ZjgzYWM4ODkzNjk3OTUyYTA2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhvcm5jbGlmZmUgUGFyaywgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xM2E1NjBhNWMxOTQ0YzdiYjU4OGUyMjVhZWVjMDg0Ni5zZXRDb250ZW50KGh0bWxfMTRjNmFjMzM0NTNkNGY4M2FjODg5MzY5Nzk1MmEwNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmIyM2FlNDhhNDc4NGUzNGJlNGU3ZDFkNDJkMjQxZTQuYmluZFBvcHVwKHBvcHVwXzEzYTU2MGE1YzE5NDRjN2JiNTg4ZTIyNWFlZWMwODQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmNDdjMjhmMjhjYjQ3MWY4MWFkYzU5NTU1YjZkMjJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg1MzQ3LC03OS4zMzgxMDY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4NTUxMjk1ZDNhYzRkNzRiM2FjZTg3MGI2MWYxYjVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiYWNkMzk1MmMxODRkZDM5M2Q3MjE0N2ZkMjE5MmNmID0gJCgnPGRpdiBpZD0iaHRtbF9hYmFjZDM5NTJjMTg0ZGQzOTNkNzIxNDdmZDIxOTJjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4NTUxMjk1ZDNhYzRkNzRiM2FjZTg3MGI2MWYxYjVkLnNldENvbnRlbnQoaHRtbF9hYmFjZDM5NTJjMTg0ZGQzOTNkNzIxNDdmZDIxOTJjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjQ3YzI4ZjI4Y2I0NzFmODFhZGM1OTU1NWI2ZDIyYS5iaW5kUG9wdXAocG9wdXBfZDg1NTEyOTVkM2FjNGQ3NGIzYWNlODcwYjYxZjFiNWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzYyMDFmNDRmNmEyNDg4ZWJmN2VmNGNkNzJkZGMyNzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NTcxLC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQxMDZkNjEyMjZmNGRjODliODQ4ZmNmZjhiNWFiYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGRlNDdjMjA2MjU4NGNhNGI5NzNkYmJiMDRlZTEwYWIgPSAkKCc8ZGl2IGlkPSJodG1sXzBkZTQ3YzIwNjI1ODRjYTRiOTczZGJiYjA0ZWUxMGFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgRGFuZm9ydGggV2VzdCxSaXZlcmRhbGUsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQxMDZkNjEyMjZmNGRjODliODQ4ZmNmZjhiNWFiYjUuc2V0Q29udGVudChodG1sXzBkZTQ3YzIwNjI1ODRjYTRiOTczZGJiYjA0ZWUxMGFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc2MjAxZjQ0ZjZhMjQ4OGViZjdlZjRjZDcyZGRjMjcwLmJpbmRQb3B1cChwb3B1cF9mZDEwNmQ2MTIyNmY0ZGM4OWI4NDhmY2ZmOGI1YWJiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjk5Mjc4ZWU4Yjk0YjE2OTMyOWE0ZTlhMmNkYTBhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2ODk5ODUsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFmZjAzODVjM2RiODRiNTBhZWQ2ODJjZDYwMjYzYzg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3ZWNkN2I0NGE0ZTRmZTFhZTQxOWM3MTc0NzdmNTQyID0gJCgnPGRpdiBpZD0iaHRtbF8wN2VjZDdiNDRhNGU0ZmUxYWU0MTljNzE3NDc3ZjU0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgV2VzdCxJbmRpYSBCYXphYXIsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWZmMDM4NWMzZGI4NGI1MGFlZDY4MmNkNjAyNjNjODUuc2V0Q29udGVudChodG1sXzA3ZWNkN2I0NGE0ZTRmZTFhZTQxOWM3MTc0NzdmNTQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNiOTkyNzhlZThiOTRiMTY5MzI5YTRlOWEyY2RhMGFkLmJpbmRQb3B1cChwb3B1cF8xZmYwMzg1YzNkYjg0YjUwYWVkNjgyY2Q2MDI2M2M4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hY2U0OGQ2Mzk3NzU0MjMyOWIwNGI5MDllNzU4NjQ4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1OTUyNTUsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZDk4MGNiMjFhNTA0ZTgwYWZjMDBjZWEwMjA5ZDYwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZjA2YTcwMWI4YTA0ZDYxYmY0OTgwNGRhODlhZjM3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWYwNmE3MDFiOGEwNGQ2MWJmNDk4MDRkYTg5YWYzN2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0dWRpbyBEaXN0cmljdCwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDk4MGNiMjFhNTA0ZTgwYWZjMDBjZWEwMjA5ZDYwYy5zZXRDb250ZW50KGh0bWxfYWYwNmE3MDFiOGEwNGQ2MWJmNDk4MDRkYTg5YWYzN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWNlNDhkNjM5Nzc1NDIzMjliMDRiOTA5ZTc1ODY0ODQuYmluZFBvcHVwKHBvcHVwXzdkOTgwY2IyMWE1MDRlODBhZmMwMGNlYTAyMDlkNjBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2MjBiNTU3YmY3OTQwZTY4NWI1MDlmMjIzOTRlNzIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MDIwNSwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZjNkNzM3NDAwMTg0ZGFhYmJhNmE3MTFlODQzZjBhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2EwNTI1YzQ3Njk0MDQxYTRmN2Y5OTBkMjUyNTQwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmNhMDUyNWM0NzY5NDA0MWE0ZjdmOTkwZDI1MjU0MDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIFBhcmssIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGYzZDczNzQwMDE4NGRhYWJiYTZhNzExZTg0M2YwYWUuc2V0Q29udGVudChodG1sXzZjYTA1MjVjNDc2OTQwNDFhNGY3Zjk5MGQyNTI1NDAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2MjBiNTU3YmY3OTQwZTY4NWI1MDlmMjIzOTRlNzIyLmJpbmRQb3B1cChwb3B1cF9kZjNkNzM3NDAwMTg0ZGFhYmJhNmE3MTFlODQzZjBhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYWU3MzU4YmMyMTc0MWY3OWFhOTk1NGNlMmY4ZDdmNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMjc1MTEsLTc5LjM5MDE5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzg5OTRjYzJjODhmNGQxN2I2ZDJhMTVkMjAzOGQ3ZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJhOThiM2JlYjYyNGVmYmEyY2VmN2Y3NWI1NWYyZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzliYTk4YjNiZWI2MjRlZmJhMmNlZjdmNzViNTVmMmQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIE5vcnRoLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4OTk0Y2MyYzg4ZjRkMTdiNmQyYTE1ZDIwMzhkN2QwLnNldENvbnRlbnQoaHRtbF85YmE5OGIzYmViNjI0ZWZiYTJjZWY3Zjc1YjU1ZjJkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYWU3MzU4YmMyMTc0MWY3OWFhOTk1NGNlMmY4ZDdmNC5iaW5kUG9wdXAocG9wdXBfMzg5OTRjYzJjODhmNGQxN2I2ZDJhMTVkMjAzOGQ3ZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTdjNjQ0Yjc4MTY4NGZjNGI5MmE3ZDViNDJlZmQ0ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTUzODM0LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDZkMGVkZTNmNWM0ZWMxOTQyZjYzZGM5MGY1NGIyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDY5M2FkYmJmNjE0YjVlODc4NGM4NzBmZTkzYzcyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzQ2OTNhZGJiZjYxNGI1ZTg3ODRjODcwZmU5M2M3MjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFRvcm9udG8gV2VzdCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDZkMGVkZTNmNWM0ZWMxOTQyZjYzZGM5MGY1NGIyNC5zZXRDb250ZW50KGh0bWxfNzQ2OTNhZGJiZjYxNGI1ZTg3ODRjODcwZmU5M2M3MjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTdjNjQ0Yjc4MTY4NGZjNGI5MmE3ZDViNDJlZmQ0ZjMuYmluZFBvcHVwKHBvcHVwXzkwNmQwZWRlM2Y1YzRlYzE5NDJmNjNkYzkwZjU0YjI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4ZjJlYTE4YzY3ZTRjYzI5ZDk4ZjNkN2VkMmI1MmQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0MzI0NCwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjFkYTk4YzMzY2M0NGJhYWE0N2IwMTdjM2NhYjdhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTYwZTJjYjhhNWI0NDkxYjQwMTY0YjM3ODBhYTIxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTk2MGUyY2I4YTViNDQ5MWI0MDE2NGIzNzgwYWEyMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhdmlzdmlsbGUsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODYxZGE5OGMzM2NjNDRiYWFhNDdiMDE3YzNjYWI3YWYuc2V0Q29udGVudChodG1sXzE5NjBlMmNiOGE1YjQ0OTFiNDAxNjRiMzc4MGFhMjFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4ZjJlYTE4YzY3ZTRjYzI5ZDk4ZjNkN2VkMmI1MmQ5LmJpbmRQb3B1cChwb3B1cF84NjFkYTk4YzMzY2M0NGJhYWE0N2IwMTdjM2NhYjdhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOGQ4ZTZlYjIwNzg0M2QxYjhmMzZkNjY4ZGZkZWE0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliODdkMTk2Y2IzNTQ2MDViOGMyYzUyNDM3NGY5MTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiNTA5MDg3ZDJhZTRjYjViNzUxMTliZDEyMzFhNWUyID0gJCgnPGRpdiBpZD0iaHRtbF8zYjUwOTA4N2QyYWU0Y2I1Yjc1MTE5YmQxMjMxYTVlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9vcmUgUGFyayxTdW1tZXJoaWxsIEVhc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWI4N2QxOTZjYjM1NDYwNWI4YzJjNTI0Mzc0ZjkxM2Muc2V0Q29udGVudChodG1sXzNiNTA5MDg3ZDJhZTRjYjViNzUxMTliZDEyMzFhNWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4ZDhlNmViMjA3ODQzZDFiOGYzNmQ2NjhkZmRlYTQyLmJpbmRQb3B1cChwb3B1cF85Yjg3ZDE5NmNiMzU0NjA1YjhjMmM1MjQzNzRmOTEzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZTE2ZWQ3ODA0M2Y0ZmUzOTQyYTc4OTY2NGY0ZGQ1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NjQxMjI5OTk5OTk5LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5NjJjODI5NzgyZTQxMTZhYzRiODY1ZmQ5NTc1ODBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkYTkwY2Y4NDVhZjQzZWViZDViYmYzMTRmNzc5OGM5ID0gJCgnPGRpdiBpZD0iaHRtbF9mZGE5MGNmODQ1YWY0M2VlYmQ1YmJmMzE0Zjc3OThjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVlciBQYXJrLEZvcmVzdCBIaWxsIFNFLFJhdGhuZWxseSxTb3V0aCBIaWxsLFN1bW1lcmhpbGwgV2VzdCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTYyYzgyOTc4MmU0MTE2YWM0Yjg2NWZkOTU3NTgwZC5zZXRDb250ZW50KGh0bWxfZmRhOTBjZjg0NWFmNDNlZWJkNWJiZjMxNGY3Nzk4YzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2UxNmVkNzgwNDNmNGZlMzk0MmE3ODk2NjRmNGRkNTguYmluZFBvcHVwKHBvcHVwXzE5NjJjODI5NzgyZTQxMTZhYzRiODY1ZmQ5NTc1ODBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxMjkwZGI4OTdmYzQ4ZDg4YTRkMmI3MDFhOTI2ODQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTYyNiwtNzkuMzc3NTI5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjU2YTkyNjFhMWFhNDRiZGFjMGYyMzA3MDlhNTZkMmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmE1OTliZjRlNDY3NDhmNzllMTJiYmI1N2UzMjEzNmUgPSAkKCc8ZGl2IGlkPSJodG1sXzJhNTk5YmY0ZTQ2NzQ4Zjc5ZTEyYmJiNTdlMzIxMzZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlZGFsZSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjU2YTkyNjFhMWFhNDRiZGFjMGYyMzA3MDlhNTZkMmMuc2V0Q29udGVudChodG1sXzJhNTk5YmY0ZTQ2NzQ4Zjc5ZTEyYmJiNTdlMzIxMzZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxMjkwZGI4OTdmYzQ4ZDg4YTRkMmI3MDFhOTI2ODQ4LmJpbmRQb3B1cChwb3B1cF9mNTZhOTI2MWExYWE0NGJkYWMwZjIzMDcwOWE1NmQyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGZlY2QxN2NhNjg0MDRhYmNkZjE0NGM5MDgxZjI5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Nzk2NywtNzkuMzY3Njc1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWM2YTEzODNmODQ0NzIwYWExMTJjYzA1ODBjMGIzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMWUxNzMyNzZlOTg0ZWUzYWRlOTFiNzE0ZWY3YTkyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDFlMTczMjc2ZTk4NGVlM2FkZTkxYjcxNGVmN2E5MjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhYmJhZ2V0b3duLFN0LiBKYW1lcyBUb3duLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MWM2YTEzODNmODQ0NzIwYWExMTJjYzA1ODBjMGIzYi5zZXRDb250ZW50KGh0bWxfZDFlMTczMjc2ZTk4NGVlM2FkZTkxYjcxNGVmN2E5MjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjBmZWNkMTdjYTY4NDA0YWJjZGYxNDRjOTA4MWYyOTQuYmluZFBvcHVwKHBvcHVwXzcxYzZhMTM4M2Y4NDQ3MjBhYTExMmNjMDU4MGMwYjNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjODg0OTBiZDhjZDQ3NDM5Nzg0MjA2NDJlMjQ5OWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY1ODU5OSwtNzkuMzgzMTU5OTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTEwNmI1ZjcxZWY3NDQ0MWE2ZGQzOTA4Y2RkMTc0Y2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ3NWUxZWI0NjAyNGY3MmJjNDYyM2M2OWY4ODQyMGMgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0NzVlMWViNDYwMjRmNzJiYzQ2MjNjNjlmODg0MjBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaHVyY2ggYW5kIFdlbGxlc2xleSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTEwNmI1ZjcxZWY3NDQ0MWE2ZGQzOTA4Y2RkMTc0Y2Uuc2V0Q29udGVudChodG1sX2Y0NzVlMWViNDYwMjRmNzJiYzQ2MjNjNjlmODg0MjBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJjODg0OTBiZDhjZDQ3NDM5Nzg0MjA2NDJlMjQ5OWRjLmJpbmRQb3B1cChwb3B1cF8xMTA2YjVmNzFlZjc0NDQxYTZkZDM5MDhjZGQxNzRjZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZGU0MTc2YWVmYmQ0MWJkODk4YTg2YzY3MmNlNmY1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NDI1OTksLTc5LjM2MDYzNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDkwNzY4M2ZiMDBiNDE4YzhhNmI4YjdhOWYxY2IxNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWZhNGRjNzU1MWU5NGFmNGEzYjY1YjllYmNhNjViYWEgPSAkKCc8ZGl2IGlkPSJodG1sXzlmYTRkYzc1NTFlOTRhZjRhM2I2NWI5ZWJjYTY1YmFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQsUmVnZW50IFBhcmssIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5MDc2ODNmYjAwYjQxOGM4YTZiOGI3YTlmMWNiMTRiLnNldENvbnRlbnQoaHRtbF85ZmE0ZGM3NTUxZTk0YWY0YTNiNjViOWViY2E2NWJhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZGU0MTc2YWVmYmQ0MWJkODk4YTg2YzY3MmNlNmY1YS5iaW5kUG9wdXAocG9wdXBfNDkwNzY4M2ZiMDBiNDE4YzhhNmI4YjdhOWYxY2IxNGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjYyYjYzOTM5YjVjNGE3MmIzY2ViYzdjYzgyZjI3ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTcxNjE4LC03OS4zNzg5MzcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzg0ZGM5MDVhNWU0M2M5ODJmMjFiZjA5ZDAxMDllNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NjllYjc4MjM0Y2U0NGNmYTk5Yjk5MDcxN2I5NWU4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTY5ZWI3ODIzNGNlNDRjZmE5OWI5OTA3MTdiOTVlODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJ5ZXJzb24sR2FyZGVuIERpc3RyaWN0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzg0ZGM5MDVhNWU0M2M5ODJmMjFiZjA5ZDAxMDllNi5zZXRDb250ZW50KGh0bWxfNTY5ZWI3ODIzNGNlNDRjZmE5OWI5OTA3MTdiOTVlODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjYyYjYzOTM5YjVjNGE3MmIzY2ViYzdjYzgyZjI3ZjkuYmluZFBvcHVwKHBvcHVwXzJjODRkYzkwNWE1ZTQzYzk4MmYyMWJmMDlkMDEwOWU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiYmUxNWEyZjFmMTQ1NmQ4OGFkYTE1NjEwZjZkY2I2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNDkzOSwtNzkuMzc1NDE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MWVkZGUxNTljY2Y0ZWFiYWQzYzdjMTUwZDI1ZGI4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MWIxZmYwODdhZWI0ZjlkYjhkNzcwNWU2MzVmNzQ5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTFiMWZmMDg3YWViNGY5ZGI4ZDc3MDVlNjM1Zjc0OTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBKYW1lcyBUb3duLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MWVkZGUxNTljY2Y0ZWFiYWQzYzdjMTUwZDI1ZGI4Mi5zZXRDb250ZW50KGh0bWxfNTFiMWZmMDg3YWViNGY5ZGI4ZDc3MDVlNjM1Zjc0OTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWJiZTE1YTJmMWYxNDU2ZDg4YWRhMTU2MTBmNmRjYjYuYmluZFBvcHVwKHBvcHVwXzkxZWRkZTE1OWNjZjRlYWJhZDNjN2MxNTBkMjVkYjgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5NTNiYmM0ZWZjZTQwYmNhZTRjZDZiNmFlMmIxMWNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ0NzcwNzk5OTk5OTk2LC03OS4zNzMzMDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0ZGM5ZWU0NmQwZDQwMzI5YTYwMzBlYjI1MTYyZWYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I3Mjg4MjIyZWJmYTQ5MzRiMTE4ZTlkMmZjNzBlOGI1ID0gJCgnPGRpdiBpZD0iaHRtbF9iNzI4ODIyMmViZmE0OTM0YjExOGU5ZDJmYzcwZThiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVyY3p5IFBhcmssIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0ZGM5ZWU0NmQwZDQwMzI5YTYwMzBlYjI1MTYyZWYwLnNldENvbnRlbnQoaHRtbF9iNzI4ODIyMmViZmE0OTM0YjExOGU5ZDJmYzcwZThiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OTUzYmJjNGVmY2U0MGJjYWU0Y2Q2YjZhZTJiMTFjYy5iaW5kUG9wdXAocG9wdXBfNzRkYzllZTQ2ZDBkNDAzMjlhNjAzMGViMjUxNjJlZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDgzZjcwNjc4NzU2NDI1ZmFmZDRkMTA4NTVlNzc2MjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTc5NTI0LC03OS4zODczODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjZWNlZWQ1NmRiZDRlYjRhZDgwOGE5NWU5NWFlMDc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5OWYzOGRlMGMzNDQ0OTE5Zjc1MDcyMGE3MWNhNzk3ID0gJCgnPGRpdiBpZD0iaHRtbF84OTlmMzhkZTBjMzQ0NDkxOWY3NTA3MjBhNzFjYTc5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBCYXkgU3RyZWV0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Y2VjZWVkNTZkYmQ0ZWI0YWQ4MDhhOTVlOTVhZTA3Ni5zZXRDb250ZW50KGh0bWxfODk5ZjM4ZGUwYzM0NDQ5MTlmNzUwNzIwYTcxY2E3OTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDgzZjcwNjc4NzU2NDI1ZmFmZDRkMTA4NTVlNzc2MjkuYmluZFBvcHVwKHBvcHVwXzdjZWNlZWQ1NmRiZDRlYjRhZDgwOGE5NWU5NWFlMDc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxMTkxNTAwNjIxZjQ3M2Y4MGU0ZDYxZTVhNzIzMjMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGUxZTI1MDllMGI3NGEzNGFjOWMzNzkzNzU4MzUzY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRjMjI3NGY5ZTQ0NDI2MzljZGUxOTdmYTg4MTg2MGQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkYzIyNzRmOWU0NDQyNjM5Y2RlMTk3ZmE4ODE4NjBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGVsYWlkZSxLaW5nLFJpY2htb25kLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZTFlMjUwOWUwYjc0YTM0YWM5YzM3OTM3NTgzNTNjYy5zZXRDb250ZW50KGh0bWxfZmRjMjI3NGY5ZTQ0NDI2MzljZGUxOTdmYTg4MTg2MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDExOTE1MDA2MjFmNDczZjgwZTRkNjFlNWE3MjMyMzEuYmluZFBvcHVwKHBvcHVwXzRlMWUyNTA5ZTBiNzRhMzRhYzljMzc5Mzc1ODM1M2NjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0Y2ZmMDMwZTZhYTQ4YWI5MjY1ZTEwNjkyMGEyODg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQwODE1NywtNzkuMzgxNzUyMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDllODE0YTkxNWNlNGUyODg4MWMzMWE5YWM2OGJmYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQ4NzdjYjZjZTE0NDMzODhhNmQzNjA4Njk1MGY1NjcgPSAkKCc8ZGl2IGlkPSJodG1sXzA0ODc3Y2I2Y2UxNDQzMzg4YTZkMzYwODY5NTBmNTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQgRWFzdCxUb3JvbnRvIElzbGFuZHMsVW5pb24gU3RhdGlvbiwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDllODE0YTkxNWNlNGUyODg4MWMzMWE5YWM2OGJmYjEuc2V0Q29udGVudChodG1sXzA0ODc3Y2I2Y2UxNDQzMzg4YTZkMzYwODY5NTBmNTY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0Y2ZmMDMwZTZhYTQ4YWI5MjY1ZTEwNjkyMGEyODg0LmJpbmRQb3B1cChwb3B1cF9kOWU4MTRhOTE1Y2U0ZTI4ODgxYzMxYTlhYzY4YmZiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZjE2NzVjMTdiYWE0ZGNjOWYzZDJjMGY5MmE0ODM2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzE3NjgsLTc5LjM4MTU3NjQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjZGJkNjk3M2IyZTRiYTliOGU1OGI1NDU0ZGViOWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMTFlNmE1ZTJlZTRkNmM5MGQ1MTRjZmQwNmFjMmViID0gJCgnPGRpdiBpZD0iaHRtbF8wMDExZTZhNWUyZWU0ZDZjOTBkNTE0Y2ZkMDZhYzJlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzaWduIEV4Y2hhbmdlLFRvcm9udG8gRG9taW5pb24gQ2VudHJlLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iY2RiZDY5NzNiMmU0YmE5YjhlNThiNTQ1NGRlYjljMi5zZXRDb250ZW50KGh0bWxfMDAxMWU2YTVlMmVlNGQ2YzkwZDUxNGNmZDA2YWMyZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmYxNjc1YzE3YmFhNGRjYzlmM2QyYzBmOTJhNDgzNmUuYmluZFBvcHVwKHBvcHVwX2JjZGJkNjk3M2IyZTRiYTliOGU1OGI1NDU0ZGViOWMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwNGIwNzZmMmQ0OTRlYWE4ZjhkMWQ2ZjcyMTEzZWFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4MTk4NSwtNzkuMzc5ODE2OTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBhNmZmMzBiODVmNDI1Y2JiZWZlNjBlYWNjMWZiZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzUxY2IwYjQxYTQyNDAyZmIwYjA3YmNlMzZmYWMxZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzM1MWNiMGI0MWE0MjQwMmZiMGIwN2JjZTM2ZmFjMWY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tZXJjZSBDb3VydCxWaWN0b3JpYSBIb3RlbCwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTBhNmZmMzBiODVmNDI1Y2JiZWZlNjBlYWNjMWZiZDQuc2V0Q29udGVudChodG1sXzM1MWNiMGI0MWE0MjQwMmZiMGIwN2JjZTM2ZmFjMWY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwNGIwNzZmMmQ0OTRlYWE4ZjhkMWQ2ZjcyMTEzZWFmLmJpbmRQb3B1cChwb3B1cF9hMGE2ZmYzMGI4NWY0MjVjYmJlZmU2MGVhY2MxZmJkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzliYjU4ODkxMmI0M2MxOGQ5MmVkNDMwZTkyMGJmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczMzI4MjUsLTc5LjQxOTc0OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTk1Mjg3ODU1OTFlNDQ5MThhM2QxYWM0NzMwNjE4YzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM3MmQ2YmMxMTYyNDJmNWJiN2FlZDVlMGFjODc5MmMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzNzJkNmJjMTE2MjQyZjViYjdhZWQ1ZTBhYzg3OTJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssTGF3cmVuY2UgTWFub3IgRWFzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTk1Mjg3ODU1OTFlNDQ5MThhM2QxYWM0NzMwNjE4YzEuc2V0Q29udGVudChodG1sX2IzNzJkNmJjMTE2MjQyZjViYjdhZWQ1ZTBhYzg3OTJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3OWJiNTg4OTEyYjQzYzE4ZDkyZWQ0MzBlOTIwYmZhLmJpbmRQb3B1cChwb3B1cF9lOTUyODc4NTU5MWU0NDkxOGEzZDFhYzQ3MzA2MThjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDY4YTE2ODBjYTk0N2NiOTU5Yzc2OTMyYTU5ZmUzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMTY5NDgsLTc5LjQxNjkzNTU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhMTFlY2UyNWEyMDRhNmI5NmRjZDZmYmQxZTU3N2FjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkOTU4NWNhZWY3MDQxNmE4ZmYxMzk1MTljYzA1NzY4ID0gJCgnPGRpdiBpZD0iaHRtbF85ZDk1ODVjYWVmNzA0MTZhOGZmMTM5NTE5Y2MwNTc2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWxhd24sIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2ExMWVjZTI1YTIwNGE2Yjk2ZGNkNmZiZDFlNTc3YWMuc2V0Q29udGVudChodG1sXzlkOTU4NWNhZWY3MDQxNmE4ZmYxMzk1MTljYzA1NzY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwNjhhMTY4MGNhOTQ3Y2I5NTljNzY5MzJhNTlmZTM1LmJpbmRQb3B1cChwb3B1cF8zYTExZWNlMjVhMjA0YTZiOTZkY2Q2ZmJkMWU1NzdhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTc0ODVmN2VmNDY0MDQ5YmY3ZmJkMzllYjFkZjFmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5Njk0NzYsLTc5LjQxMTMwNzIwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkZDUxNzU0NDAzOTRkNzZhOGYzNGJlZjBhZmI5ZGMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyMzNmY2UxYzk5ODQ1NzE5ZjBmNzU2NGRkYjdkNGY4ID0gJCgnPGRpdiBpZD0iaHRtbF9iMjMzZmNlMWM5OTg0NTcxOWYwZjc1NjRkZGI3ZDRmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGwgTm9ydGgsRm9yZXN0IEhpbGwgV2VzdCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZGQ1MTc1NDQwMzk0ZDc2YThmMzRiZWYwYWZiOWRjMy5zZXRDb250ZW50KGh0bWxfYjIzM2ZjZTFjOTk4NDU3MTlmMGY3NTY0ZGRiN2Q0ZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE3NDg1ZjdlZjQ2NDA0OWJmN2ZiZDM5ZWIxZGYxZmEuYmluZFBvcHVwKHBvcHVwXzlkZDUxNzU0NDAzOTRkNzZhOGYzNGJlZjBhZmI5ZGMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhZmZlYzhkMjBhNzRhOWY5Mjg2YzBlZTI2YjZiNTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjcyNzA5NywtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTY0NjhmMWM0NTg5NDkzNjgyOTZiNzkzYjY4YjM3MTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGEwNDQzMDYyNzJkNGU3NzhkNjE4Y2E0YWUwZDA2ZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzhhMDQ0MzA2MjcyZDRlNzc4ZDYxOGNhNGFlMGQwNmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQW5uZXgsTm9ydGggTWlkdG93bixZb3JrdmlsbGUsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY0NjhmMWM0NTg5NDkzNjgyOTZiNzkzYjY4YjM3MTguc2V0Q29udGVudChodG1sXzhhMDQ0MzA2MjcyZDRlNzc4ZDYxOGNhNGFlMGQwNmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZmZlYzhkMjBhNzRhOWY5Mjg2YzBlZTI2YjZiNTgwLmJpbmRQb3B1cChwb3B1cF85NjQ2OGYxYzQ1ODk0OTM2ODI5NmI3OTNiNjhiMzcxOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Y2MzNzlhMjY3M2U0NmQ3ODlhOWE5N2FlODMyZWRmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjY5NTYsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI5ZjU0ZDI0NWY5NDg5ZWI2ZWUyZTk5Njg3MzdiNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzU1NzdkZWYzZjJkNDM1NGFjOGE5NmIwMTM1NjA5NWMgPSAkKCc8ZGl2IGlkPSJodG1sXzM1NTc3ZGVmM2YyZDQzNTRhYzhhOTZiMDEzNTYwOTVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3JkLFVuaXZlcnNpdHkgb2YgVG9yb250bywgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI5ZjU0ZDI0NWY5NDg5ZWI2ZWUyZTk5Njg3MzdiNGQuc2V0Q29udGVudChodG1sXzM1NTc3ZGVmM2YyZDQzNTRhYzhhOTZiMDEzNTYwOTVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjYzM3OWEyNjczZTQ2ZDc4OWE5YTk3YWU4MzJlZGY1LmJpbmRQb3B1cChwb3B1cF80MjlmNTRkMjQ1Zjk0ODllYjZlZTJlOTk2ODczN2I0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YmQ4MDJlZDYzZmM0Mjc2YjY0MDA4NjEzYWFjYWE4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzIwNTcsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWVmNWUzMDI3MjE5NGNmODg4MmE1NWI5ZjhhOWMzYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2FhZGYwYzcwY2MyNDkxMjg4ZmVmNDMyMmZlYTRmYzEgPSAkKCc8ZGl2IGlkPSJodG1sX2NhYWRmMGM3MGNjMjQ5MTI4OGZlZjQzMjJmZWE0ZmMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd24sR3JhbmdlIFBhcmssS2Vuc2luZ3RvbiBNYXJrZXQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlZjVlMzAyNzIxOTRjZjg4ODJhNTViOWY4YTljM2FhLnNldENvbnRlbnQoaHRtbF9jYWFkZjBjNzBjYzI0OTEyODhmZWY0MzIyZmVhNGZjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YmQ4MDJlZDYzZmM0Mjc2YjY0MDA4NjEzYWFjYWE4YS5iaW5kUG9wdXAocG9wdXBfMWVmNWUzMDI3MjE5NGNmODg4MmE1NWI5ZjhhOWMzYWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjRlZDI2OTc2MmJjNDM2YWI1MmVkYWQ5YjY4NDhlMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Mjg5NDY3LC03OS4zOTQ0MTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyN2Y4YzRmMDRjYjQ0N2ViZDVjYTBjZmM3NDgxNWY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlMGQ4ZThmMGUyNjQwYjI5MThmZGU5YTI2ZDAwOWUxID0gJCgnPGRpdiBpZD0iaHRtbF9lZTBkOGU4ZjBlMjY0MGIyOTE4ZmRlOWEyNmQwMDllMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q04gVG93ZXIsQmF0aHVyc3QgUXVheSxJc2xhbmQgYWlycG9ydCxIYXJib3VyZnJvbnQgV2VzdCxLaW5nIGFuZCBTcGFkaW5hLFJhaWx3YXkgTGFuZHMsU291dGggTmlhZ2FyYSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjI3ZjhjNGYwNGNiNDQ3ZWJkNWNhMGNmYzc0ODE1ZjYuc2V0Q29udGVudChodG1sX2VlMGQ4ZThmMGUyNjQwYjI5MThmZGU5YTI2ZDAwOWUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0ZWQyNjk3NjJiYzQzNmFiNTJlZGFkOWI2ODQ4ZTI0LmJpbmRQb3B1cChwb3B1cF82MjdmOGM0ZjA0Y2I0NDdlYmQ1Y2EwY2ZjNzQ4MTVmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTkyNDQ3ZGE1Mjg0NTIzYWQxMDdjMjcyZDIzNWZlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NjQzNTIsLTc5LjM3NDg0NTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwOGZjODAwOTRlODRjNTA4YjAyODM1MzdkZTU2YjUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0MmNjZGMxMjJjNDQ1YTFiNjNkMTNhMDg3OTc4NWE3ID0gJCgnPGRpdiBpZD0iaHRtbF9lNDJjY2RjMTIyYzQ0NWExYjYzZDEzYTA4Nzk3ODVhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RuIEEgUE8gQm94ZXMgMjUgVGhlIEVzcGxhbmFkZSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODA4ZmM4MDA5NGU4NGM1MDhiMDI4MzUzN2RlNTZiNTMuc2V0Q29udGVudChodG1sX2U0MmNjZGMxMjJjNDQ1YTFiNjNkMTNhMDg3OTc4NWE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxOTI0NDdkYTUyODQ1MjNhZDEwN2MyNzJkMjM1ZmVjLmJpbmRQb3B1cChwb3B1cF84MDhmYzgwMDk0ZTg0YzUwOGIwMjgzNTM3ZGU1NmI1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Yjk4ZGJhYTg1ODM0YmFiYjUwOTI5MzA5OGRlOTk3NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODQyOTIsLTc5LjM4MjI4MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTgyYmMyMGY3Mzc0NGU0NjkwNGQwYmM1NzYxOTVlN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU0NTI4ODhlN2VhNDI4YjhiYTFiMzAwNzZmNDYwZTIgPSAkKCc8ZGl2IGlkPSJodG1sXzhlNDUyODg4ZTdlYTQyOGI4YmExYjMwMDc2ZjQ2MGUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaXJzdCBDYW5hZGlhbiBQbGFjZSxVbmRlcmdyb3VuZCBjaXR5LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hODJiYzIwZjczNzQ0ZTQ2OTA0ZDBiYzU3NjE5NWU3Zi5zZXRDb250ZW50KGh0bWxfOGU0NTI4ODhlN2VhNDI4YjhiYTFiMzAwNzZmNDYwZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWI5OGRiYWE4NTgzNGJhYmI1MDkyOTMwOThkZTk5NzYuYmluZFBvcHVwKHBvcHVwX2E4MmJjMjBmNzM3NDRlNDY5MDRkMGJjNTc2MTk1ZTdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmN2I5YzBjNTg3ZjQ3YThiN2Q0Nzc4NDkzOGVlNDg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE4NTE3OTk5OTk5OTk2LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYjE5MTA4NTFkOTM0MDkxOGY4MjQ5YmMyZWQ2Nzc4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZmE3YzNlMmNhNmQ0YjQwOGY5ODQxYTZjMzIzOWVmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWZhN2MzZTJjYTZkNGI0MDhmOTg0MWE2YzMyMzllZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIEhlaWdodHMsTGF3cmVuY2UgTWFub3IsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiMTkxMDg1MWQ5MzQwOTE4ZjgyNDliYzJlZDY3Nzg5LnNldENvbnRlbnQoaHRtbF81ZmE3YzNlMmNhNmQ0YjQwOGY5ODQxYTZjMzIzOWVmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjdiOWMwYzU4N2Y0N2E4YjdkNDc3ODQ5MzhlZTQ4Ni5iaW5kUG9wdXAocG9wdXBfY2IxOTEwODUxZDkzNDA5MThmODI0OWJjMmVkNjc3ODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNkOTliZDgzZWUwNDc1M2EzMTM1NTU2YWE5Yzc4MmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDk1NzcsLTc5LjQ0NTA3MjU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlMTg3NWRiMGE4MTQ4MDE5ZTc1ODFjODlkNDI3MzM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4ODIwNTFhMzE1YzQ3OGQ5NjBhYWI1MDAxM2M2MTE1ID0gJCgnPGRpdiBpZD0iaHRtbF80ODgyMDUxYTMxNWM0NzhkOTYwYWFiNTAwMTNjNjExNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2xlbmNhaXJuLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTE4NzVkYjBhODE0ODAxOWU3NTgxYzg5ZDQyNzMzNS5zZXRDb250ZW50KGh0bWxfNDg4MjA1MWEzMTVjNDc4ZDk2MGFhYjUwMDEzYzYxMTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmNkOTliZDgzZWUwNDc1M2EzMTM1NTU2YWE5Yzc4MmYuYmluZFBvcHVwKHBvcHVwXzFlMTg3NWRiMGE4MTQ4MDE5ZTc1ODFjODlkNDI3MzM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwZmMzNTJmM2RiOTQ0ZjNiMDY5MGY1OTY1OWM1ZmE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmU5YjMxOWVjMmI3NGYyYzlmNWJmZGFkMDZkOTI0NWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWIzNzMzMzJmZTBmNDlmMGE3ZjBhODQ2YWZiYjA1MGYgPSAkKCc8ZGl2IGlkPSJodG1sXzliMzczMzMyZmUwZjQ5ZjBhN2YwYTg0NmFmYmIwNTBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1ld29vZC1DZWRhcnZhbGUsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlOWIzMTllYzJiNzRmMmM5ZjViZmRhZDA2ZDkyNDVhLnNldENvbnRlbnQoaHRtbF85YjM3MzMzMmZlMGY0OWYwYTdmMGE4NDZhZmJiMDUwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMGZjMzUyZjNkYjk0NGYzYjA2OTBmNTk2NTljNWZhNS5iaW5kUG9wdXAocG9wdXBfYmU5YjMxOWVjMmI3NGYyYzlmNWJmZGFkMDZkOTI0NWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzkyY2FhODgyOTc1NGVkNWJlMWEzZWQxNWYwYWI0M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODkwMjU2LC03OS40NTM1MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2U4ZWE2ZmMxZDg3NDViODhmZWFhOTU3MWJhYjk3NGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmUzMDlmZjE0NTEzNGRkODllNWE1MGI4MjY4YTFiM2YgPSAkKCc8ZGl2IGlkPSJodG1sX2JlMzA5ZmYxNDUxMzRkZDg5ZTVhNTBiODI2OGExYjNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWxlZG9uaWEtRmFpcmJhbmtzLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZThlYTZmYzFkODc0NWI4OGZlYWE5NTcxYmFiOTc0ZC5zZXRDb250ZW50KGh0bWxfYmUzMDlmZjE0NTEzNGRkODllNWE1MGI4MjY4YTFiM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzkyY2FhODgyOTc1NGVkNWJlMWEzZWQxNWYwYWI0M2YuYmluZFBvcHVwKHBvcHVwXzdlOGVhNmZjMWQ4NzQ1Yjg4ZmVhYTk1NzFiYWI5NzRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhZGI5YzA1Nzk1ZDQwNzFhYWIxNjBiOTk4NjM0ZjIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5NTQyLC03OS40MjI1NjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNTAxZDg4MmM2MTQzMTVhZjM0OWRmMjY5YmJiNjJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3YmU2ZGEwNmI2MjQyOTg5MzQxMmE1ODA0NmQwZWNmID0gJCgnPGRpdiBpZD0iaHRtbF9hN2JlNmRhMDZiNjI0Mjk4OTM0MTJhNTgwNDZkMGVjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hyaXN0aWUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNTAxZDg4MmM2MTQzMTVhZjM0OWRmMjY5YmJiNjJkLnNldENvbnRlbnQoaHRtbF9hN2JlNmRhMDZiNjI0Mjk4OTM0MTJhNTgwNDZkMGVjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYWRiOWMwNTc5NWQ0MDcxYWFiMTYwYjk5ODYzNGYyMC5iaW5kUG9wdXAocG9wdXBfMzE1MDFkODgyYzYxNDMxNWFmMzQ5ZGYyNjliYmI2MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRhYjA5ZmEyZjYyNDMyOTk2MTU0YzJjMjY2MzdkMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OTYzN2ZhYTYwY2E0MmU2OTdhNzVjZTZjYjhlZWMzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOWE2MDFkNDYyYTg0YmZiYTQwNjY0ZjI1YWQ5MGRkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDlhNjAxZDQ2MmE4NGJmYmE0MDY2NGYyNWFkOTBkZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdmVyY291cnQgVmlsbGFnZSxEdWZmZXJpbiwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTYzN2ZhYTYwY2E0MmU2OTdhNzVjZTZjYjhlZWMzOS5zZXRDb250ZW50KGh0bWxfZDlhNjAxZDQ2MmE4NGJmYmE0MDY2NGYyNWFkOTBkZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRhYjA5ZmEyZjYyNDMyOTk2MTU0YzJjMjY2MzdkMTIuYmluZFBvcHVwKHBvcHVwXzk5NjM3ZmFhNjBjYTQyZTY5N2E3NWNlNmNiOGVlYzM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlZmU4YjdmOWVlNzRkZmZiMjNjZmRkMDJmNjJlMjk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3OTI2NzAwMDAwMDA2LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2N2NlY2ViNjc3ZjQ2MTQ4ZjM3NDI0YTVhZmM0ZWI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0NmQ0YTQ2OWFhNjRiYjE4YzI5OTFkNjc3NzFjZjFmID0gJCgnPGRpdiBpZD0iaHRtbF8zNDZkNGE0NjlhYTY0YmIxOGMyOTkxZDY3NzcxY2YxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIFBvcnR1Z2FsLFRyaW5pdHksIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY3Y2VjZWI2NzdmNDYxNDhmMzc0MjRhNWFmYzRlYjkuc2V0Q29udGVudChodG1sXzM0NmQ0YTQ2OWFhNjRiYjE4YzI5OTFkNjc3NzFjZjFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdlZmU4YjdmOWVlNzRkZmZiMjNjZmRkMDJmNjJlMjk2LmJpbmRQb3B1cChwb3B1cF9iNjdjZWNlYjY3N2Y0NjE0OGYzNzQyNGE1YWZjNGViOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDI5Y2RhYmY0NGI0NmI0YjZiNmYyZGFiYTA3MmY4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5NjYzNTA2MjExODRkYTA5MGIxNGNkZGQ2NWZiNTg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwMmU0ZjAwNDJkYjQxNjRiM2E1MTI5M2Y2Y2M4N2ZkID0gJCgnPGRpdiBpZD0iaHRtbF84MDJlNGYwMDQyZGI0MTY0YjNhNTEyOTNmNmNjODdmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvY2t0b24sRXhoaWJpdGlvbiBQbGFjZSxQYXJrZGFsZSBWaWxsYWdlLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5NjYzNTA2MjExODRkYTA5MGIxNGNkZGQ2NWZiNTg4LnNldENvbnRlbnQoaHRtbF84MDJlNGYwMDQyZGI0MTY0YjNhNTEyOTNmNmNjODdmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDI5Y2RhYmY0NGI0NmI0YjZiNmYyZGFiYTA3MmY4NS5iaW5kUG9wdXAocG9wdXBfNjk2NjM1MDYyMTE4NGRhMDkwYjE0Y2RkZDY1ZmI1ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDRhMjFlMDc5YjljNDAzYTk5ODg3YmE2ZjI3NDgyZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTM3NTYyMDAwMDAwMDYsLTc5LjQ5MDA3MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGVmMmUzZjA0MDRiNGQ5MTk0YTExZmM0NDQwMTkzMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODcyNGI0OTQwMWNjNDkxZGI3MDk2YjAzYzY1ZDAwZjcgPSAkKCc8ZGl2IGlkPSJodG1sXzg3MjRiNDk0MDFjYzQ5MWRiNzA5NmIwM2M2NWQwMGY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcsTm9ydGggUGFyayxVcHdvb2QgUGFyaywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGVmMmUzZjA0MDRiNGQ5MTk0YTExZmM0NDQwMTkzMzUuc2V0Q29udGVudChodG1sXzg3MjRiNDk0MDFjYzQ5MWRiNzA5NmIwM2M2NWQwMGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0YTIxZTA3OWI5YzQwM2E5OTg4N2JhNmYyNzQ4MmZhLmJpbmRQb3B1cChwb3B1cF84ZWYyZTNmMDQwNGI0ZDkxOTRhMTFmYzQ0NDAxOTMzNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OTk1NzNhZTAwYjc0NDE4OTVjYTgyZmViMDEwOTcwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5MTExNTgsLTc5LjQ3NjAxMzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhOGEwNzA2NmJlNTRjMGRhMDZlOTI4M2RhZWI0ODA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2NGY3NWZjM2Q0NDQxMWQ4NzdkMzBhZjcyMmVmZTQzID0gJCgnPGRpdiBpZD0iaHRtbF9iNjRmNzVmYzNkNDQ0MTFkODc3ZDMwYWY3MjJlZmU0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVsIFJheSxLZWVsZXNkYWxlLE1vdW50IERlbm5pcyxTaWx2ZXJ0aG9ybiwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E4YTA3MDY2YmU1NGMwZGEwNmU5MjgzZGFlYjQ4MDYuc2V0Q29udGVudChodG1sX2I2NGY3NWZjM2Q0NDQxMWQ4NzdkMzBhZjcyMmVmZTQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5OTU3M2FlMDBiNzQ0MTg5NWNhODJmZWIwMTA5NzA5LmJpbmRQb3B1cChwb3B1cF8zYThhMDcwNjZiZTU0YzBkYTA2ZTkyODNkYWViNDgwNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODI5NzRiNDk3MDU0ZjZkOTY1MDc3NTM4ZDA3YzgzNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MzE4NTI5OTk5OTk5LC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZTViNzdiYmJkOTQ0ZTU4YTkwNzU0NzY1ZjE1YmZkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZWZkZDU4NDJiMTc0YTE4YmJmNDdkODVkNzllYzVmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNGVmZGQ1ODQyYjE3NGExOGJiZjQ3ZDg1ZDc5ZWM1ZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBKdW5jdGlvbiBOb3J0aCxSdW5ueW1lZGUsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlNWI3N2JiYmQ5NDRlNThhOTA3NTQ3NjVmMTViZmRkLnNldENvbnRlbnQoaHRtbF80ZWZkZDU4NDJiMTc0YTE4YmJmNDdkODVkNzllYzVmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODI5NzRiNDk3MDU0ZjZkOTY1MDc3NTM4ZDA3YzgzNi5iaW5kUG9wdXAocG9wdXBfMGU1Yjc3YmJiZDk0NGU1OGE5MDc1NDc2NWYxNWJmZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWM4NGQ0MWI1MzY1NGYwMDg5OGUyOWM3ZTRhOGI2MDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjE2MDgzLC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OGU2N2VkOTlkYzM0OTU3OWZhZjg3Yzc4ZTE5YmY0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjkwYjZlNmYxZjc0MDg0YWU5YzZkMDFjZTE3M2ViNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTI5MGI2ZTZmMWY3NDA4NGFlOWM2ZDAxY2UxNzNlYjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyayxUaGUgSnVuY3Rpb24gU291dGgsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOThlNjdlZDk5ZGMzNDk1NzlmYWY4N2M3OGUxOWJmNGYuc2V0Q29udGVudChodG1sX2EyOTBiNmU2ZjFmNzQwODRhZTljNmQwMWNlMTczZWI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljODRkNDFiNTM2NTRmMDA4OThlMjljN2U0YThiNjA0LmJpbmRQb3B1cChwb3B1cF85OGU2N2VkOTlkYzM0OTU3OWZhZjg3Yzc4ZTE5YmY0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZDFlZTk0MmIzMTE0MDE0OTc5NTQ5YzQ4MWU4MDdhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODAyM2QyYTI2YmU0YzE5ODdhYzczYjFjN2I0OThmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzIxMWMyYThmYzQ0MzQ0YjU3ZmY5ODVkNjM1YWEyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWMyMTFjMmE4ZmM0NDM0NGI1N2ZmOTg1ZDYzNWFhMjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmtkYWxlLFJvbmNlc3ZhbGxlcywgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODAyM2QyYTI2YmU0YzE5ODdhYzczYjFjN2I0OThmNi5zZXRDb250ZW50KGh0bWxfZWMyMTFjMmE4ZmM0NDM0NGI1N2ZmOTg1ZDYzNWFhMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQxZWU5NDJiMzExNDAxNDk3OTU0OWM0ODFlODA3YTYuYmluZFBvcHVwKHBvcHVwX2I4MDIzZDJhMjZiZTRjMTk4N2FjNzNiMWM3YjQ5OGY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmNjQ2ODRjZWYwZTQxMzg5YzYwMmU5ZmVhOWQ5YjJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNTcwNiwtNzkuNDg0NDQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMzc0NzM2YmNkZDY0NzJiYTJjZGJlOTQ0MWI4YjVhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzk2NmRhOWE5NTM0NWZjYjE1OTk5NWI5ZGRmNTEwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjM5NjZkYTlhOTUzNDVmY2IxNTk5OTViOWRkZjUxMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJ1bm55bWVkZSxTd2Fuc2VhLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzNzQ3MzZiY2RkNjQ3MmJhMmNkYmU5NDQxYjhiNWE5LnNldENvbnRlbnQoaHRtbF9iMzk2NmRhOWE5NTM0NWZjYjE1OTk5NWI5ZGRmNTEwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjY0Njg0Y2VmMGU0MTM4OWM2MDJlOWZlYTlkOWIyYy5iaW5kUG9wdXAocG9wdXBfMjM3NDczNmJjZGQ2NDcyYmEyY2RiZTk0NDFiOGI1YTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzAwM2RiMTVkMzZmNGJiZjgwMDZlMDA0OWNjM2U3NzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjIzMDE1LC03OS4zODk0OTM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwY2FlNjQ2ZTJmMTRhNTY5MGE5MjliYzdmMGUxYjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EyZmM5ZmI3NTFjNDRmMmM5NDQzNDkyMWJjYTM0NTZlID0gJCgnPGRpdiBpZD0iaHRtbF9hMmZjOWZiNzUxYzQ0ZjJjOTQ0MzQ5MjFiY2EzNDU2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW4mIzM5O3MgUGFyaywgUXVlZW4mIzM5O3MgUGFyazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzBjYWU2NDZlMmYxNGE1NjkwYTkyOWJjN2YwZTFiODMuc2V0Q29udGVudChodG1sX2EyZmM5ZmI3NTFjNDRmMmM5NDQzNDkyMWJjYTM0NTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwMDNkYjE1ZDM2ZjRiYmY4MDA2ZTAwNDljYzNlNzc2LmJpbmRQb3B1cChwb3B1cF83MGNhZTY0NmUyZjE0YTU2OTBhOTI5YmM3ZjBlMWI4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNGMzZmI1MGFkOWU0ZWU5YjllOWVlYTY5N2Y1OTFmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjk2NTYsLTc5LjYxNTgxODk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5Mzc1ZThjYTI5MTQxODNhYzE0YzE1YTQzOWJkOGY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0YjZhYjQwNWRkYTRkMThiMWI0ZGY4MzIyYzllYzI5ID0gJCgnPGRpdiBpZD0iaHRtbF83NGI2YWI0MDVkZGE0ZDE4YjFiNGRmODMyMmM5ZWMyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuYWRhIFBvc3QgR2F0ZXdheSBQcm9jZXNzaW5nIENlbnRyZSwgTWlzc2lzc2F1Z2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5Mzc1ZThjYTI5MTQxODNhYzE0YzE1YTQzOWJkOGY1LnNldENvbnRlbnQoaHRtbF83NGI2YWI0MDVkZGE0ZDE4YjFiNGRmODMyMmM5ZWMyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNGMzZmI1MGFkOWU0ZWU5YjllOWVlYTY5N2Y1OTFmMC5iaW5kUG9wdXAocG9wdXBfYzkzNzVlOGNhMjkxNDE4M2FjMTRjMTVhNDM5YmQ4ZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzAyNDMyODAwODk5NDExZWEwNjA0NmM5MWQ4ODI2OWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDViMTY4Y2RkZmU2NDJjYWIzOWMyOTQ5YjlmMTc1MTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGYyMDJiODIyZjJjNGYwODhhODg1MTVjNjdiN2QyNDQgPSAkKCc8ZGl2IGlkPSJodG1sXzRmMjAyYjgyMmYyYzRmMDg4YTg4NTE1YzY3YjdkMjQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1YjE2OGNkZGZlNjQyY2FiMzljMjk0OWI5ZjE3NTExLnNldENvbnRlbnQoaHRtbF80ZjIwMmI4MjJmMmM0ZjA4OGE4ODUxNWM2N2I3ZDI0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MDI0MzI4MDA4OTk0MTFlYTA2MDQ2YzkxZDg4MjY5Yi5iaW5kUG9wdXAocG9wdXBfZDViMTY4Y2RkZmU2NDJjYWIzOWMyOTQ5YjlmMTc1MTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmYyNmU5ZWQzZTU1NGVkYzkxNzQ2NjNjYjg2YWI1ZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MDU2NDY2LC03OS41MDEzMjA3MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YmRiNjZlMTdjNmY0OTJhOWIwMDI1ZTliMDk4ZDc3MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kN2RkZDUxZjlkNmU0MWQwOTczNDc0MmUxZjhkNjljZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDdkZGQ1MWY5ZDZlNDFkMDk3MzQ3NDJlMWY4ZDY5Y2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBCYXkgU2hvcmVzLE1pbWljbyBTb3V0aCxOZXcgVG9yb250bywgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YmRiNjZlMTdjNmY0OTJhOWIwMDI1ZTliMDk4ZDc3Mi5zZXRDb250ZW50KGh0bWxfZDdkZGQ1MWY5ZDZlNDFkMDk3MzQ3NDJlMWY4ZDY5Y2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmYyNmU5ZWQzZTU1NGVkYzkxNzQ2NjNjYjg2YWI1ZDcuYmluZFBvcHVwKHBvcHVwXzViZGI2NmUxN2M2ZjQ5MmE5YjAwMjVlOWIwOThkNzcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4NzdkY2Q4MjJmYzRhN2E5NmM1MDdhYzU0N2M0MTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjOWE5ZDI5YzdjODQ4Yjg4MmJmYjAxNGFhMWRlOTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxOTFhOWQ2Y2UyMzQ1ZTJhYTkzNjliNDYzNmRiNDJjID0gJCgnPGRpdiBpZD0iaHRtbF8yMTkxYTlkNmNlMjM0NWUyYWE5MzY5YjQ2MzZkYjQyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kLExvbmcgQnJhbmNoLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjOWE5ZDI5YzdjODQ4Yjg4MmJmYjAxNGFhMWRlOTkxLnNldENvbnRlbnQoaHRtbF8yMTkxYTlkNmNlMjM0NWUyYWE5MzY5YjQ2MzZkYjQyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODc3ZGNkODIyZmM0YTdhOTZjNTA3YWM1NDdjNDExNS5iaW5kUG9wdXAocG9wdXBfOGM5YTlkMjljN2M4NDhiODgyYmZiMDE0YWExZGU5OTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzU5ODAxOWQyNWE5NGE4NzllYmM3YTY3NmMzMDViMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMDUsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE1NGM4M2NlMDNjNDRmZjhhMTkwYTc3OWEzYWUyYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJlZDNjOTQxNDU5NGM0MGE5YjdhMGVmZTJjZDY3ZTQgPSAkKCc8ZGl2IGlkPSJodG1sXzJiZWQzYzk0MTQ1OTRjNDBhOWI3YTBlZmUyY2Q2N2U0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgS2luZ3N3YXksTW9udGdvbWVyeSBSb2FkLE9sZCBNaWxsIE5vcnRoLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExNTRjODNjZTAzYzQ0ZmY4YTE5MGE3NzlhM2FlMmI0LnNldENvbnRlbnQoaHRtbF8yYmVkM2M5NDE0NTk0YzQwYTliN2EwZWZlMmNkNjdlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NTk4MDE5ZDI1YTk0YTg3OWViYzdhNjc2YzMwNWIyOS5iaW5kUG9wdXAocG9wdXBfYTE1NGM4M2NlMDNjNDRmZjhhMTkwYTc3OWEzYWUyYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWZkNjE1OGRiMGJmNGY1OWIxMDNmNGM5NzJjNzkyNWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzYyNTc5LC03OS40OTg1MDkwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTIxZmVmMmJiYjk0OGNmOWY2NTE2ZGMyODYzYTgzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDI2ZWIzZGE0ZDE0ZDM4YjJhOWUyOGY4OWVmZTliZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQyNmViM2RhNGQxNGQzOGIyYTllMjhmODllZmU5YmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBCYXksS2luZyYjMzk7cyBNaWxsIFBhcmssS2luZ3N3YXkgUGFyayBTb3V0aCBFYXN0LE1pbWljbyBORSxPbGQgTWlsbCBTb3V0aCxUaGUgUXVlZW5zd2F5IEVhc3QsUm95YWwgWW9yayBTb3V0aCBFYXN0LFN1bm55bGVhLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1MjFmZWYyYmJiOTQ4Y2Y5ZjY1MTZkYzI4NjNhODM1LnNldENvbnRlbnQoaHRtbF9mZDI2ZWIzZGE0ZDE0ZDM4YjJhOWUyOGY4OWVmZTliZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZmQ2MTU4ZGIwYmY0ZjU5YjEwM2Y0Yzk3MmM3OTI1YS5iaW5kUG9wdXAocG9wdXBfOTUyMWZlZjJiYmI5NDhjZjlmNjUxNmRjMjg2M2E4MzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JhY2Q4ZDhmYTdhNGFlYjk0YWE5NGYxNmQ0NjMyYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Mjg4NDA4LC03OS41MjA5OTk0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNGFkMmExODY0OWM0NjA0YWVmMmQ1MmRkZGU0OThkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNjFmMzkzMWY0YjY0MmZjOGY4MDNlNDdhOWU1MmQ0NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjYxZjM5MzFmNGI2NDJmYzhmODAzZTQ3YTllNTJkNDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzd2F5IFBhcmsgU291dGggV2VzdCxNaW1pY28gTlcsVGhlIFF1ZWVuc3dheSBXZXN0LFJveWFsIFlvcmsgU291dGggV2VzdCxTb3V0aCBvZiBCbG9vciwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNGFkMmExODY0OWM0NjA0YWVmMmQ1MmRkZGU0OThkNS5zZXRDb250ZW50KGh0bWxfZjYxZjM5MzFmNGI2NDJmYzhmODAzZTQ3YTllNTJkNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2JhY2Q4ZDhmYTdhNGFlYjk0YWE5NGYxNmQ0NjMyYzUuYmluZFBvcHVwKHBvcHVwX2U0YWQyYTE4NjQ5YzQ2MDRhZWYyZDUyZGRkZTQ5OGQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczZTNhZGQyZGM4ZTQ0YjZhN2YxNzBiZGJjMjI4ZjNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3ODU1NiwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDRmNWMzNmRiMmE0NGIzYjkzYzU0NzZkYWEyNjVlOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA0OTAwY2Y0ZDc3NDMwY2I1NGRmOTQ2ODMzZGRlODEgPSAkKCc8ZGl2IGlkPSJodG1sX2YwNDkwMGNmNGQ3NzQzMGNiNTRkZjk0NjgzM2RkZTgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jc2xpbmd0b24gQXZlbnVlLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0ZjVjMzZkYjJhNDRiM2I5M2M1NDc2ZGFhMjY1ZThiLnNldENvbnRlbnQoaHRtbF9mMDQ5MDBjZjRkNzc0MzBjYjU0ZGY5NDY4MzNkZGU4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83M2UzYWRkMmRjOGU0NGI2YTdmMTcwYmRiYzIyOGYzZS5iaW5kUG9wdXAocG9wdXBfMDRmNWMzNmRiMmE0NGIzYjkzYzU0NzZkYWEyNjVlOGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQ4YzZmZTM0YjkzNGY3MjhjNzQyNjRjZDM3Y2Y4MDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA5NDMyLC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjQ1NTcyZjdkNDM0NTkwOWZhMDAxZDQwNjY0ZTVhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MmViOGIwODVjOGM0ZGFlOWFhODZiM2VhMzc3ZjJhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTJlYjhiMDg1YzhjNGRhZTlhYTg2YjNlYTM3N2YyYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsb3ZlcmRhbGUsSXNsaW5ndG9uLE1hcnRpbiBHcm92ZSxQcmluY2VzcyBHYXJkZW5zLFdlc3QgRGVhbmUgUGFyaywgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjQ1NTcyZjdkNDM0NTkwOWZhMDAxZDQwNjY0ZTVhYi5zZXRDb250ZW50KGh0bWxfOTJlYjhiMDg1YzhjNGRhZTlhYTg2YjNlYTM3N2YyYTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjQ4YzZmZTM0YjkzNGY3MjhjNzQyNjRjZDM3Y2Y4MDEuYmluZFBvcHVwKHBvcHVwX2ViNDU1NzJmN2Q0MzQ1OTA5ZmEwMDFkNDA2NjRlNWFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmOTAzMTZlYWZjZDQ3ZGRiNGIxMzkyOTYxNjYzMGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQzNTE1MiwtNzkuNTc3MjAwNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJhZTFmZWNhYTgwNGYxYThiMjY3YzdjYWJlM2MzMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjViNDhlMTRjODEzNGVlZDg2NzM5ZjBlNjNkMmFlZDYgPSAkKCc8ZGl2IGlkPSJodG1sXzI1YjQ4ZTE0YzgxMzRlZWQ4NjczOWYwZTYzZDJhZWQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vcmRhbGUgR2FyZGVucyxFcmluZ2F0ZSxNYXJrbGFuZCBXb29kLE9sZCBCdXJuaGFtdGhvcnBlLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyYWUxZmVjYWE4MDRmMWE4YjI2N2M3Y2FiZTNjMzM1LnNldENvbnRlbnQoaHRtbF8yNWI0OGUxNGM4MTM0ZWVkODY3MzlmMGU2M2QyYWVkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZjkwMzE2ZWFmY2Q0N2RkYjRiMTM5Mjk2MTY2MzBiNS5iaW5kUG9wdXAocG9wdXBfYTJhZTFmZWNhYTgwNGYxYThiMjY3YzdjYWJlM2MzMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdjZTFhZTk3NGZjNDEzNGE4NGVjMWJmNDM5YmYyNzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTYzMDMzLC03OS41NjU5NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWQxYjg0MzkxYWI0ZmEzOWVjNWI3Y2VlODEwMWFiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OGQ4YmM5YjRiMGU0ZjNlODc3ODhhOTNhNWJiN2FlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzhkOGJjOWI0YjBlNGYzZTg3Nzg4YTkzYTViYjdhZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBTdW1taXQsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlZDFiODQzOTFhYjRmYTM5ZWM1YjdjZWU4MTAxYWIyLnNldENvbnRlbnQoaHRtbF83OGQ4YmM5YjRiMGU0ZjNlODc3ODhhOTNhNWJiN2FlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80N2NlMWFlOTc0ZmM0MTM0YTg0ZWMxYmY0MzliZjI3OS5iaW5kUG9wdXAocG9wdXBfZWVkMWI4NDM5MWFiNGZhMzllYzViN2NlZTgxMDFhYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ZmMzNlY2Q2ZmQzNGQwNDlhNDljNTE2ODg2NjU1NDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjQ3NjU5LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OWM0NTVlOWVkYjY0ZGZiODAyOGUyNTQ4YjQzYjk2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzQwOTVjZjJjOWU0MWZhODcxMDFjMGExYzZjNDYwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjM0MDk1Y2YyYzllNDFmYTg3MTAxYzBhMWM2YzQ2MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVtZXJ5LEh1bWJlcmxlYSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTljNDU1ZTllZGI2NGRmYjgwMjhlMjU0OGI0M2I5Njcuc2V0Q29udGVudChodG1sX2IzNDA5NWNmMmM5ZTQxZmE4NzEwMWMwYTFjNmM0NjBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmZjMzZWNkNmZkMzRkMDQ5YTQ5YzUxNjg4NjY1NTQ1LmJpbmRQb3B1cChwb3B1cF85OWM0NTVlOWVkYjY0ZGZiODAyOGUyNTQ4YjQzYjk2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYTI5YzAwYjc3NmM0NmZmOTY4N2NmNGVjNmRkOWU2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjg3NiwtNzkuNTE4MTg4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGFmOWFmNjJmY2NlNDI3Y2EzMGJkZDg2Yjc4MzU1MjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWIyNzlkOWVkNmI4NGViMWFkZThkZGZkNDg0NmQ0YWEgPSAkKCc8ZGl2IGlkPSJodG1sXzViMjc5ZDllZDZiODRlYjFhZGU4ZGRmZDQ4NDZkNGFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0b24sIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhZjlhZjYyZmNjZTQyN2NhMzBiZGQ4NmI3ODM1NTI3LnNldENvbnRlbnQoaHRtbF81YjI3OWQ5ZWQ2Yjg0ZWIxYWRlOGRkZmQ0ODQ2ZDRhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYTI5YzAwYjc3NmM0NmZmOTY4N2NmNGVjNmRkOWU2Mi5iaW5kUG9wdXAocG9wdXBfZGFmOWFmNjJmY2NlNDI3Y2EzMGJkZDg2Yjc4MzU1MjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjQ1ZmNlOGE1N2NlNDhhYTk0NWZmN2NjM2RkNmJkNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzliNWRlNTEyNWVkZDRhZjRiNDVkYzViNTM5MDhjNzQ4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMThiMTlmMzNkYzRlZDNhYTkxYWQxNmY4MWM1ZjE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmNzg4YmJjZTIxMjQ2OGQ4MjdkYjA1Y2NmYTQyZDU2ID0gJCgnPGRpdiBpZD0iaHRtbF9lZjc4OGJiY2UyMTI0NjhkODI3ZGIwNWNjZmE0MmQ1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdG1vdW50LCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmMThiMTlmMzNkYzRlZDNhYTkxYWQxNmY4MWM1ZjE4LnNldENvbnRlbnQoaHRtbF9lZjc4OGJiY2UyMTI0NjhkODI3ZGIwNWNjZmE0MmQ1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNDVmY2U4YTU3Y2U0OGFhOTQ1ZmY3Y2MzZGQ2YmQ3Ny5iaW5kUG9wdXAocG9wdXBfOGYxOGIxOWYzM2RjNGVkM2FhOTFhZDE2ZjgxYzVmMTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FiOTBhNmJmMzUzNGQ5NDg5ZWNmNjQxNTcwNWM2ZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODg5MDU0LC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTJhZGExM2NlMDI0NGZiYTkzMDU0YmI5YmM4OGVjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hY2Q3YTY1MGE1MTc0YzkyOGIzZDU0YjUyN2I5MTUzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWNkN2E2NTBhNTE3NGM5MjhiM2Q1NGI1MjdiOTE1MzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzdmlldyBWaWxsYWdlLE1hcnRpbiBHcm92ZSBHYXJkZW5zLFJpY2h2aWV3IEdhcmRlbnMsU3QuIFBoaWxsaXBzLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxMmFkYTEzY2UwMjQ0ZmJhOTMwNTRiYjliYzg4ZWM0LnNldENvbnRlbnQoaHRtbF9hY2Q3YTY1MGE1MTc0YzkyOGIzZDU0YjUyN2I5MTUzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYWI5MGE2YmYzNTM0ZDk0ODllY2Y2NDE1NzA1YzZkMy5iaW5kUG9wdXAocG9wdXBfNzEyYWRhMTNjZTAyNDRmYmE5MzA1NGJiOWJjODhlYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzIyM2I4MmRkMWY0NGNhMDk4NDMwNGViM2Q5ZDMxYmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mzk0MTYzOTk5OTk5OTYsLTc5LjU4ODQzNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOWI1ZGU1MTI1ZWRkNGFmNGI0NWRjNWI1MzkwOGM3NDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGUzM2U1YTI2MDhmNGM5MGI0MWJjYjk3N2MwMjhhNWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDg3OTBhZjlkMWRhNGM1M2IwNmU0YjVhMDMwMDJjYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzA4NzkwYWY5ZDFkYTRjNTNiMDZlNGI1YTAzMDAyY2IxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGJpb24gR2FyZGVucyxCZWF1bW9uZCBIZWlnaHRzLEh1bWJlcmdhdGUsSmFtZXN0b3duLE1vdW50IE9saXZlLFNpbHZlcnN0b25lLFNvdXRoIFN0ZWVsZXMsVGhpc3RsZXRvd24sIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGUzM2U1YTI2MDhmNGM5MGI0MWJjYjk3N2MwMjhhNWMuc2V0Q29udGVudChodG1sXzA4NzkwYWY5ZDFkYTRjNTNiMDZlNGI1YTAzMDAyY2IxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyMjNiODJkZDFmNDRjYTA5ODQzMDRlYjNkOWQzMWJkLmJpbmRQb3B1cChwb3B1cF8wZTMzZTVhMjYwOGY0YzkwYjQxYmNiOTc3YzAyOGE1Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MGFjODJhMmQ2ZjI0Mjk4YmQwNDIxNGViM2M1MzcwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjc0ODI5OTk5OTk5NCwtNzkuNTk0MDU0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85YjVkZTUxMjVlZGQ0YWY0YjQ1ZGM1YjUzOTA4Yzc0OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OTllMjcxMjEyNmE0NGUzYmE5ZDZjYjdlNDk0YWY5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNDk1NGZhZmM1OGM0MmZkOWUwYTBiZmI5M2NiODhmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzQ5NTRmYWZjNThjNDJmZDllMGEwYmZiOTNjYjg4ZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod2VzdCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OTllMjcxMjEyNmE0NGUzYmE5ZDZjYjdlNDk0YWY5ZC5zZXRDb250ZW50KGh0bWxfMzQ5NTRmYWZjNThjNDJmZDllMGEwYmZiOTNjYjg4ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDBhYzgyYTJkNmYyNDI5OGJkMDQyMTRlYjNjNTM3MGUuYmluZFBvcHVwKHBvcHVwXzQ5OWUyNzEyMTI2YTQ0ZTNiYTlkNmNiN2U0OTRhZjlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb8bce04240>" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map of Toronto using latitude and longitude values\n", | |
| "map_toronto = folium.Map(location=[latitude, longitude], zoom_start=10)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, borough, neighborhood in zip(neighbor['Latitude'], neighbor['Longitude'], neighbor['Borough'], neighbor['Neighborhood']):\n", | |
| " label = '{}, {}'.format(neighborhood, borough)\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_toronto) \n", | |
| " \n", | |
| "map_toronto" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough.\n", | |
| "\n", | |
| "However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Toronto. So let's slice the original dataframe and create a new dataframe of the **Scarborough** Neighborhood data." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "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>PostalCode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Borough Neighborhood Latitude \\\n", | |
| "0 M1B Scarborough Rouge,Malvern 43.806686 \n", | |
| "1 M1C Scarborough Highland Creek,Rouge Hill,Port Union 43.784535 \n", | |
| "2 M1E Scarborough Guildwood,Morningside,West Hill 43.763573 \n", | |
| "3 M1G Scarborough Woburn 43.770992 \n", | |
| "4 M1H Scarborough Cedarbrae 43.773136 \n", | |
| "\n", | |
| " Longitude \n", | |
| "0 -79.194353 \n", | |
| "1 -79.160497 \n", | |
| "2 -79.188711 \n", | |
| "3 -79.216917 \n", | |
| "4 -79.239476 " | |
| ] | |
| }, | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_data = neighbor[neighbor['Borough'] == 'Scarborough'].reset_index(drop=True)\n", | |
| "scarborough_data.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(17, 5)" | |
| ] | |
| }, | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_data.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Lets get the geographical coordinates of Scarborough" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/home/jupyterlab/conda/lib/python3.6/site-packages/ipykernel_launcher.py:3: DeprecationWarning: Using Nominatim with the default \"geopy/1.20.0\" `user_agent` is strongly discouraged, as it violates Nominatim's ToS https://operations.osmfoundation.org/policies/nominatim/ and may possibly cause 403 and 429 HTTP errors. Please specify a custom `user_agent` with `Nominatim(user_agent=\"my-application\")` or by overriding the default `user_agent`: `geopy.geocoders.options.default_user_agent = \"my-application\"`. In geopy 2.0 this will become an exception.\n", | |
| " This is separate from the ipykernel package so we can avoid doing imports until\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of Scarborough, CA are 43.773077, -79.257774.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'Scarborough, Toronto'\n", | |
| "\n", | |
| "geolocator = Nominatim()\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of Scarborough, CA are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "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+ICNtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNzczMDc3LC03OS4yNTc3NzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzNhZGNiYTljMTA0ZDQzMTFhNmEyOTQ0ZDI5ZmRlNmI0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2M4M2ZlYjFiNjY0YTIzOGQzNjAyYmJmOTM1N2IxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U0NjMzZGYxNjQ2NDUwY2EyZjM4NmJhODBlMWY5YTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg3YmY0ZjMzMzE4NGE4ZjkwZGU4NjcyMDRjYzBmMzcgPSAkKCc8ZGl2IGlkPSJodG1sXzk4N2JmNGYzMzMxODRhOGY5MGRlODY3MjA0Y2MwZjM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSxNYWx2ZXJuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZTQ2MzNkZjE2NDY0NTBjYTJmMzg2YmE4MGUxZjlhNy5zZXRDb250ZW50KGh0bWxfOTg3YmY0ZjMzMzE4NGE4ZjkwZGU4NjcyMDRjYzBmMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjdjODNmZWIxYjY2NGEyMzhkMzYwMmJiZjkzNTdiMTEuYmluZFBvcHVwKHBvcHVwXzNlNDYzM2RmMTY0NjQ1MGNhMmYzODZiYTgwZTFmOWE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3ZDJiMDNiMzA4ZjRkMDhhOGY3OWM4ZGJmM2JhZDNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg0NTM1MSwtNzkuMTYwNDk3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmEwZGUzMzc2MGY5NGM0MGJhZjRiOGNlMWM2MDRjODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTM3Zjc0MjU5OTAxNDA4Y2FhYjZhMGM4ZGY0MGZlODggPSAkKCc8ZGl2IGlkPSJodG1sX2UzN2Y3NDI1OTkwMTQwOGNhYWI2YTBjOGRmNDBmZTg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdobGFuZCBDcmVlayxSb3VnZSBIaWxsLFBvcnQgVW5pb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMGRlMzM3NjBmOTRjNDBiYWY0YjhjZTFjNjA0YzgzLnNldENvbnRlbnQoaHRtbF9lMzdmNzQyNTk5MDE0MDhjYWFiNmEwYzhkZjQwZmU4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hN2QyYjAzYjMwOGY0ZDA4YThmNzljOGRiZjNiYWQzZS5iaW5kUG9wdXAocG9wdXBfMmEwZGUzMzc2MGY5NGM0MGJhZjRiOGNlMWM2MDRjODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2QwMWZhM2FiNWQ5NDUyMzgyYTk5NTYzN2I4MGQ3OWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjM1NzI2LC03OS4xODg3MTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmODVhZjBkNjIxNTRhZDNiZmEzMmY1MzEyNGI4MmQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0NmEzNGFmOTljNjQ4NzVhNDU1YWUwOWEzN2Q5YjE1ID0gJCgnPGRpdiBpZD0iaHRtbF9kNDZhMzRhZjk5YzY0ODc1YTQ1NWFlMDlhMzdkOWIxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3VpbGR3b29kLE1vcm5pbmdzaWRlLFdlc3QgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2Y4NWFmMGQ2MjE1NGFkM2JmYTMyZjUzMTI0YjgyZDkuc2V0Q29udGVudChodG1sX2Q0NmEzNGFmOTljNjQ4NzVhNDU1YWUwOWEzN2Q5YjE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkMDFmYTNhYjVkOTQ1MjM4MmE5OTU2MzdiODBkNzllLmJpbmRQb3B1cChwb3B1cF83Zjg1YWYwZDYyMTU0YWQzYmZhMzJmNTMxMjRiODJkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMzZhMjY1MjJkMDY0YzVhYjQxNWZiZWVjMWIxNmM2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmYmIwMDNmZGExZjQ5MWRiMzQzOWFlNTE5N2FiMjc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2MGEwYThhZjJmNjQ0NDFiM2JlNTYzOTQzNTcwNzBhID0gJCgnPGRpdiBpZD0iaHRtbF9lNjBhMGE4YWYyZjY0NDQxYjNiZTU2Mzk0MzU3MDcwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmJiMDAzZmRhMWY0OTFkYjM0MzlhZTUxOTdhYjI3Ny5zZXRDb250ZW50KGh0bWxfZTYwYTBhOGFmMmY2NDQ0MWIzYmU1NjM5NDM1NzA3MGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzM2YTI2NTIyZDA2NGM1YWI0MTVmYmVlYzFiMTZjNjUuYmluZFBvcHVwKHBvcHVwX2FmYmIwMDNmZGExZjQ5MWRiMzQzOWFlNTE5N2FiMjc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3MjExODRkZmQ2MDQzNmJiNzQ4NmZhNjkyM2M4OTRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzczMTM2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTAzZDY2YmNhYmM0YzVhOGQyNGExNzVlMTEzNGNhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDQwOTJjMTllMDA0MTcyOTBkMjY5NjczZjYxMWUzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDA0MDkyYzE5ZTAwNDE3MjkwZDI2OTY3M2Y2MTFlMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyYnJhZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjEwM2Q2NmJjYWJjNGM1YThkMjRhMTc1ZTExMzRjYTYuc2V0Q29udGVudChodG1sX2QwNDA5MmMxOWUwMDQxNzI5MGQyNjk2NzNmNjExZTMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y3MjExODRkZmQ2MDQzNmJiNzQ4NmZhNjkyM2M4OTRjLmJpbmRQb3B1cChwb3B1cF9mMTAzZDY2YmNhYmM0YzVhOGQyNGExNzVlMTEzNGNhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODFlOTA5ZmExZmI0ZDlmYTNhZDJkYzU1NTNkMWQwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0NDczNDIsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3MzgzNmMzZGExYzQ2OTJiNmY5MmM3MWYzOTllYWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyMThmODdlMjI3YTQ2ZDdhZDMwMTNlZjRlYjhlZjAyID0gJCgnPGRpdiBpZD0iaHRtbF9iMjE4Zjg3ZTIyN2E0NmQ3YWQzMDEzZWY0ZWI4ZWYwMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2ggVmlsbGFnZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTczODM2YzNkYTFjNDY5MmI2ZjkyYzcxZjM5OWVhYzguc2V0Q29udGVudChodG1sX2IyMThmODdlMjI3YTQ2ZDdhZDMwMTNlZjRlYjhlZjAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4MWU5MDlmYTFmYjRkOWZhM2FkMmRjNTU1M2QxZDA1LmJpbmRQb3B1cChwb3B1cF8xNzM4MzZjM2RhMWM0NjkyYjZmOTJjNzFmMzk5ZWFjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDBkZjliYzI1Y2U0Nzk5OGU5ZTBhMThmOWE2ZjI4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzNjVlYWY4MmI4ODRkMmFiYmExZDIzMjZkYzAwNGI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkYzE4MGZmOGQzNDQ5ZDU5ZjYyNjMxZGRlMTg1MGFjID0gJCgnPGRpdiBpZD0iaHRtbF8yZGMxODBmZjhkMzQ0OWQ1OWY2MjYzMWRkZTE4NTBhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBCaXJjaG1vdW50IFBhcmssSW9udmlldyxLZW5uZWR5IFBhcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzNjVlYWY4MmI4ODRkMmFiYmExZDIzMjZkYzAwNGI5LnNldENvbnRlbnQoaHRtbF8yZGMxODBmZjhkMzQ0OWQ1OWY2MjYzMWRkZTE4NTBhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MDBkZjliYzI1Y2U0Nzk5OGU5ZTBhMThmOWE2ZjI4MC5iaW5kUG9wdXAocG9wdXBfZjM2NWVhZjgyYjg4NGQyYWJiYTFkMjMyNmRjMDA0YjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk1YjE5NTg5ZTU4NDVjNDlhNjFlODc0NjQyM2JmM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTExMTE3MDAwMDAwMDQsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWRlZTJlOTJhYjYwNDkwMTg5MDA0Y2Q0NjViMzBkZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGQ0MTgxYzU2Y2JiNDk2N2I4YTlhNTk1NGY5YzE5YWQgPSAkKCc8ZGl2IGlkPSJodG1sXzhkNDE4MWM1NmNiYjQ5NjdiOGE5YTU5NTRmOWMxOWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFpcmxlYSxHb2xkZW4gTWlsZSxPYWtyaWRnZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWRlZTJlOTJhYjYwNDkwMTg5MDA0Y2Q0NjViMzBkZjMuc2V0Q29udGVudChodG1sXzhkNDE4MWM1NmNiYjQ5NjdiOGE5YTU5NTRmOWMxOWFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5NWIxOTU4OWU1ODQ1YzQ5YTYxZTg3NDY0MjNiZjNlLmJpbmRQb3B1cChwb3B1cF9hZGVlMmU5MmFiNjA0OTAxODkwMDRjZDQ2NWIzMGRmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWUzNDBlN2U0M2I0Yzg2YmZhNWQ5MjU0NzNmNTAxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNjMxNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcyZjg3MzFiYjNiNDhkNWFlYjAxMjFiZDkzNzNiYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNhMzU1NGE2NTE3NGM0NGE4NWQzNTJjNTJiNzhhNTYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjYTM1NTRhNjUxNzRjNDRhODVkMzUyYzUyYjc4YTU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGlmZmNyZXN0LENsaWZmc2lkZSxTY2FyYm9yb3VnaCBWaWxsYWdlIFdlc3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3MmY4NzMxYmIzYjQ4ZDVhZWIwMTIxYmQ5MzczYmEzLnNldENvbnRlbnQoaHRtbF9mY2EzNTU0YTY1MTc0YzQ0YTg1ZDM1MmM1MmI3OGE1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWUzNDBlN2U0M2I0Yzg2YmZhNWQ5MjU0NzNmNTAxYS5iaW5kUG9wdXAocG9wdXBfZDcyZjg3MzFiYjNiNDhkNWFlYjAxMjFiZDkzNzNiYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ5NzVjOTgwOWU2NGQ1YmEyM2EyZjMyYTVkOTFlZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWNhYmVmYjMyMDNkNGE1MzlhNzkwMGUyMTlmNDU4M2YpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFlZjMyZDdlYTI4NDA2ZjlkYTIxMTU3YWE4OWNkNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdhMzkxZDJmY2RiNDRhZDhiYmY3OGQ5NzczMjE4ZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzY3YTM5MWQyZmNkYjQ0YWQ4YmJmNzhkOTc3MzIxOGZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaXJjaCBDbGlmZixDbGlmZnNpZGUgV2VzdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFlZjMyZDdlYTI4NDA2ZjlkYTIxMTU3YWE4OWNkNTQuc2V0Q29udGVudChodG1sXzY3YTM5MWQyZmNkYjQ0YWQ4YmJmNzhkOTc3MzIxOGZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkOTc1Yzk4MDllNjRkNWJhMjNhMmYzMmE1ZDkxZWQwLmJpbmRQb3B1cChwb3B1cF9mYWVmMzJkN2VhMjg0MDZmOWRhMjExNTdhYTg5Y2Q1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZjFmMTJlOTA5MWI0NzRiYjlhODA0ZTkxM2RhMDdmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQwOTYsLTc5LjI3MzMwNDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0YjNjNDlmNDFkNDQzZjg4N2U4ZTE3MmU1OTk2MTU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiMTFmNTdlMGQ1NDQwMDVhM2FiNTQ1M2VkM2FhYTk0ID0gJCgnPGRpdiBpZD0iaHRtbF9hYjExZjU3ZTBkNTQ0MDA1YTNhYjU0NTNlZDNhYWE5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9yc2V0IFBhcmssU2NhcmJvcm91Z2ggVG93biBDZW50cmUsV2V4Zm9yZCBIZWlnaHRzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNGIzYzQ5ZjQxZDQ0M2Y4ODdlOGUxNzJlNTk5NjE1Ny5zZXRDb250ZW50KGh0bWxfYWIxMWY1N2UwZDU0NDAwNWEzYWI1NDUzZWQzYWFhOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWYxZjEyZTkwOTFiNDc0YmI5YTgwNGU5MTNkYTA3ZjAuYmluZFBvcHVwKHBvcHVwXzE0YjNjNDlmNDFkNDQzZjg4N2U4ZTE3MmU1OTk2MTU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhMDdmYmY1ZWRlNDQxNWU4YWRlZDgwZTM5MGNiMDRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUwMDcxNTAwMDAwMDA0LC03OS4yOTU4NDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkMzNiOWY3MTJjNzQ4NmE5NWQ4MWI0MmZmNTg4ZTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZjJmZmVmNmQ0OTRmMzFhZmFhOTQxNzkwZTJhMDUzID0gJCgnPGRpdiBpZD0iaHRtbF9lN2YyZmZlZjZkNDk0ZjMxYWZhYTk0MTc5MGUyYTA1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyeXZhbGUsV2V4Zm9yZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQzM2I5ZjcxMmM3NDg2YTk1ZDgxYjQyZmY1ODhlM2Muc2V0Q29udGVudChodG1sX2U3ZjJmZmVmNmQ0OTRmMzFhZmFhOTQxNzkwZTJhMDUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhMDdmYmY1ZWRlNDQxNWU4YWRlZDgwZTM5MGNiMDRhLmJpbmRQb3B1cChwb3B1cF9lZDMzYjlmNzEyYzc0ODZhOTVkODFiNDJmZjU4OGUzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGQyNTAxMDFiMDQ0MWIwOWNiMzYxMDQ5MTVjOTI3NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1NjY5NjBjN2I2NjQzODRhY2Q1M2NjMjQ2NGFhZDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2NmI5NTRlYTU3NTQwMDliZGFmOWQ2Yjc1NmQ1ZTA1ID0gJCgnPGRpdiBpZD0iaHRtbF82NjZiOTU0ZWE1NzU0MDA5YmRhZjlkNmI3NTZkNWUwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NTY2OTYwYzdiNjY0Mzg0YWNkNTNjYzI0NjRhYWQzZS5zZXRDb250ZW50KGh0bWxfNjY2Yjk1NGVhNTc1NDAwOWJkYWY5ZDZiNzU2ZDVlMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODBkMjUwMTAxYjA0NDFiMDljYjM2MTA0OTE1YzkyNzYuYmluZFBvcHVwKHBvcHVwXzg1NjY5NjBjN2I2NjQzODRhY2Q1M2NjMjQ2NGFhZDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiNWFhZDA0MmVlODQzOGJhMGJmNzA2ZDAzNWMzMzE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgxNjM3NSwtNzkuMzA0MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yM2ViZWZjZjYyNzI0YWM2YWFiMDNkM2UyM2I3NWQ1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNGY5MjMwZTE3Mzg0MjFhOWQxNmZkOWNhMzUwZDkzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjRmOTIzMGUxNzM4NDIxYTlkMTZmZDljYTM1MGQ5M2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsYXJrcyBDb3JuZXJzLFN1bGxpdmFuLFRhbSBPJiMzOTtTaGFudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yM2ViZWZjZjYyNzI0YWM2YWFiMDNkM2UyM2I3NWQ1Ni5zZXRDb250ZW50KGh0bWxfYjRmOTIzMGUxNzM4NDIxYTlkMTZmZDljYTM1MGQ5M2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI1YWFkMDQyZWU4NDM4YmEwYmY3MDZkMDM1YzMzMTUuYmluZFBvcHVwKHBvcHVwXzIzZWJlZmNmNjI3MjRhYzZhYWIwM2QzZTIzYjc1ZDU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyMWNjZjg5NDU3YjRhOWNhNmI0NTNkMGYzM2RhYzc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODE1MjUyMiwtNzkuMjg0NTc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODUwZTc4MjhjNDY0MzNjYWVlNjM4OGMyY2U4Mjg1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGMwYTdlOWJjM2Y0MjcxOWZkYmI4MzkwYTAxNjU2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTRjMGE3ZTliYzNmNDI3MTlmZGJiODM5MGEwMTY1NjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFnaW5jb3VydCBOb3J0aCxMJiMzOTtBbW9yZWF1eCBFYXN0LE1pbGxpa2VuLFN0ZWVsZXMgRWFzdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjg1MGU3ODI4YzQ2NDMzY2FlZTYzODhjMmNlODI4NWEuc2V0Q29udGVudChodG1sX2E0YzBhN2U5YmMzZjQyNzE5ZmRiYjgzOTBhMDE2NTYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyMWNjZjg5NDU3YjRhOWNhNmI0NTNkMGYzM2RhYzc2LmJpbmRQb3B1cChwb3B1cF9iODUwZTc4MjhjNDY0MzNjYWVlNjM4OGMyY2U4Mjg1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYTJhMWQyN2NlYmQ0YjYxYTdlYzJiNTlmOGQxNTA0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hY2FiZWZiMzIwM2Q0YTUzOWE3OTAwZTIxOWY0NTgzZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjI2YjA1NGQyZjA0ZWEyYTJiYzg3NzRlNTYyNDZmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDg2OWRhNTI2ZWM0Y2UxYTAwOTFhOGUwYWY5Yzg0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmQ4NjlkYTUyNmVjNGNlMWEwMDkxYThlMGFmOWM4NDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkwmIzM5O0Ftb3JlYXV4IFdlc3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2MjZiMDU0ZDJmMDRlYTJhMmJjODc3NGU1NjI0NmZmLnNldENvbnRlbnQoaHRtbF9iZDg2OWRhNTI2ZWM0Y2UxYTAwOTFhOGUwYWY5Yzg0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTJhMWQyN2NlYmQ0YjYxYTdlYzJiNTlmOGQxNTA0Zi5iaW5kUG9wdXAocG9wdXBfODYyNmIwNTRkMmYwNGVhMmEyYmM4Nzc0ZTU2MjQ2ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzhkZmZmODllMWNjNDc3MWE3Njc1MTdhZWI4OTljNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MzYxMjQ3MDAwMDAwMDYsLTc5LjIwNTYzNjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FjYWJlZmIzMjAzZDRhNTM5YTc5MDBlMjE5ZjQ1ODNmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmMzEwYWU3MjIxNTRkZTVhNjY0Mjk2YTg1NGVmNWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MWQ1OTJmZjRjZDQ3NDhhOWYyYjk0MWM4ODI0ODI5ID0gJCgnPGRpdiBpZD0iaHRtbF8zNDFkNTkyZmY0Y2Q0NzQ4YTlmMmI5NDFjODgyNDgyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgUm91Z2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmMzEwYWU3MjIxNTRkZTVhNjY0Mjk2YTg1NGVmNWZhLnNldENvbnRlbnQoaHRtbF8zNDFkNTkyZmY0Y2Q0NzQ4YTlmMmI5NDFjODgyNDgyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOGRmZmY4OWUxY2M0NzcxYTc2NzUxN2FlYjg5OWM2ZS5iaW5kUG9wdXAocG9wdXBfMmYzMTBhZTcyMjE1NGRlNWE2NjQyOTZhODU0ZWY1ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7fb8bcb91400>" | |
| ] | |
| }, | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map of Scarborough using latitude and longitude values\n", | |
| "map_scarborough = folium.Map(location=[latitude, longitude], zoom_start=11)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, label in zip(scarborough_data['Latitude'], scarborough_data['Longitude'], scarborough_data['Neighborhood']):\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_scarborough) \n", | |
| " \n", | |
| "map_scarborough" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Explore Scarborough neighborhood in Toronto with Foursquare API\n", | |
| "\n", | |
| "### Define Foursquare credentials and version" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Your credentails:\n", | |
| "CLIENT_ID: LA3EWGWUIM34V40S4ZIMDMTMKBZXIFZ4S4GSZI54KNJLZWPT\n", | |
| "CLIENT_SECRET:INR4MWFKULEBYX3V0R0KNHIJNUM3DGYRNAYXE1SSLAWXNVC3\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "CLIENT_ID = 'LA3EWGWUIM34V40S4ZIMDMTMKBZXIFZ4S4GSZI54KNJLZWPT' # your Foursquare ID\n", | |
| "CLIENT_SECRET = 'INR4MWFKULEBYX3V0R0KNHIJNUM3DGYRNAYXE1SSLAWXNVC3' # your Foursquare Secret\n", | |
| "VERSION = '20180605' # Foursquare API version\n", | |
| "\n", | |
| "print('Your credentails:')\n", | |
| "print('CLIENT_ID: ' + CLIENT_ID)\n", | |
| "print('CLIENT_SECRET:' + CLIENT_SECRET)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Function to explore neighborhoods" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def getNearbyVenues(names, latitudes, longitudes, radius=500):\n", | |
| " \n", | |
| " venues_list=[]\n", | |
| " for name, lat, lng in zip(names, latitudes, longitudes):\n", | |
| " #print(name)\n", | |
| " \n", | |
| " # create the API request URL\n", | |
| " url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
| " CLIENT_ID, \n", | |
| " CLIENT_SECRET, \n", | |
| " VERSION, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " radius, \n", | |
| " 100)\n", | |
| " \n", | |
| " # make the GET request\n", | |
| " results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n", | |
| " \n", | |
| " # return only relevant information for each nearby venue\n", | |
| " venues_list.append([(\n", | |
| " name, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " v['venue']['name'], \n", | |
| " v['venue']['location']['lat'], \n", | |
| " v['venue']['location']['lng'], \n", | |
| " v['venue']['categories'][0]['name']) for v in results])\n", | |
| "\n", | |
| " nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n", | |
| " nearby_venues.columns = ['Neighborhood', \n", | |
| " 'Neighborhood Latitude', \n", | |
| " 'Neighborhood Longitude', \n", | |
| " 'Venue', \n", | |
| " 'Venue Latitude', \n", | |
| " 'Venue Longitude', \n", | |
| " 'Venue Category']\n", | |
| " \n", | |
| " print('Found {} venues in {} neighborhoods.'.format(nearby_venues.shape[0], len(venues_list)))\n", | |
| " \n", | |
| " return(nearby_venues)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Found 89 venues in 17 neighborhoods.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_venues = getNearbyVenues(names=scarborough_data['Neighborhood'],\n", | |
| " latitudes=scarborough_data['Latitude'],\n", | |
| " longitudes=scarborough_data['Longitude']\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(89, 7)\n" | |
| ] | |
| }, | |
| { | |
| "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>Neighborhood</th>\n", | |
| " <th>Neighborhood Latitude</th>\n", | |
| " <th>Neighborhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " <td>Wendy's</td>\n", | |
| " <td>43.807448</td>\n", | |
| " <td>-79.199056</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " <td>Interprovincial Group</td>\n", | |
| " <td>43.805630</td>\n", | |
| " <td>-79.200378</td>\n", | |
| " <td>Print Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " <td>Chris Effects Painting</td>\n", | |
| " <td>43.784343</td>\n", | |
| " <td>-79.163742</td>\n", | |
| " <td>Construction & Landscaping</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " <td>Royal Canadian Legion</td>\n", | |
| " <td>43.782533</td>\n", | |
| " <td>-79.163085</td>\n", | |
| " <td>Bar</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " <td>Swiss Chalet Rotisserie & Grill</td>\n", | |
| " <td>43.767697</td>\n", | |
| " <td>-79.189914</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood Neighborhood Latitude \\\n", | |
| "0 Rouge,Malvern 43.806686 \n", | |
| "1 Rouge,Malvern 43.806686 \n", | |
| "2 Highland Creek,Rouge Hill,Port Union 43.784535 \n", | |
| "3 Highland Creek,Rouge Hill,Port Union 43.784535 \n", | |
| "4 Guildwood,Morningside,West Hill 43.763573 \n", | |
| "\n", | |
| " Neighborhood Longitude Venue Venue Latitude \\\n", | |
| "0 -79.194353 Wendy's 43.807448 \n", | |
| "1 -79.194353 Interprovincial Group 43.805630 \n", | |
| "2 -79.160497 Chris Effects Painting 43.784343 \n", | |
| "3 -79.160497 Royal Canadian Legion 43.782533 \n", | |
| "4 -79.188711 Swiss Chalet Rotisserie & Grill 43.767697 \n", | |
| "\n", | |
| " Venue Longitude Venue Category \n", | |
| "0 -79.199056 Fast Food Restaurant \n", | |
| "1 -79.200378 Print Shop \n", | |
| "2 -79.163742 Construction & Landscaping \n", | |
| "3 -79.163085 Bar \n", | |
| "4 -79.189914 Pizza Place " | |
| ] | |
| }, | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "print(scarborough_venues.shape)\n", | |
| "scarborough_venues.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "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>Neighborhood Latitude</th>\n", | |
| " <th>Neighborhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>Agincourt</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Agincourt North,L'Amoreaux East,Milliken,Steeles East</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Birch Cliff,Cliffside West</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cedarbrae</th>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Clairlea,Golden Mile,Oakridge</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Clarks Corners,Sullivan,Tam O'Shanter</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cliffcrest,Cliffside,Scarborough Village West</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Dorset Park,Scarborough Town Centre,Wexford Heights</th>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>East Birchmount Park,Ionview,Kennedy Park</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Guildwood,Morningside,West Hill</th>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Highland Creek,Rouge Hill,Port Union</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>L'Amoreaux West</th>\n", | |
| " <td>12</td>\n", | |
| " <td>12</td>\n", | |
| " <td>12</td>\n", | |
| " <td>12</td>\n", | |
| " <td>12</td>\n", | |
| " <td>12</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Maryvale,Wexford</th>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Rouge,Malvern</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Scarborough Village</th>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Woburn</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood Latitude \\\n", | |
| "Neighborhood \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North,L'Amoreaux East,Milliken,Steele... 3 \n", | |
| "Birch Cliff,Cliffside West 4 \n", | |
| "Cedarbrae 8 \n", | |
| "Clairlea,Golden Mile,Oakridge 10 \n", | |
| "Clarks Corners,Sullivan,Tam O'Shanter 10 \n", | |
| "Cliffcrest,Cliffside,Scarborough Village West 3 \n", | |
| "Dorset Park,Scarborough Town Centre,Wexford Hei... 6 \n", | |
| "East Birchmount Park,Ionview,Kennedy Park 4 \n", | |
| "Guildwood,Morningside,West Hill 9 \n", | |
| "Highland Creek,Rouge Hill,Port Union 2 \n", | |
| "L'Amoreaux West 12 \n", | |
| "Maryvale,Wexford 7 \n", | |
| "Rouge,Malvern 2 \n", | |
| "Scarborough Village 1 \n", | |
| "Woburn 4 \n", | |
| "\n", | |
| " Neighborhood Longitude \\\n", | |
| "Neighborhood \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North,L'Amoreaux East,Milliken,Steele... 3 \n", | |
| "Birch Cliff,Cliffside West 4 \n", | |
| "Cedarbrae 8 \n", | |
| "Clairlea,Golden Mile,Oakridge 10 \n", | |
| "Clarks Corners,Sullivan,Tam O'Shanter 10 \n", | |
| "Cliffcrest,Cliffside,Scarborough Village West 3 \n", | |
| "Dorset Park,Scarborough Town Centre,Wexford Hei... 6 \n", | |
| "East Birchmount Park,Ionview,Kennedy Park 4 \n", | |
| "Guildwood,Morningside,West Hill 9 \n", | |
| "Highland Creek,Rouge Hill,Port Union 2 \n", | |
| "L'Amoreaux West 12 \n", | |
| "Maryvale,Wexford 7 \n", | |
| "Rouge,Malvern 2 \n", | |
| "Scarborough Village 1 \n", | |
| "Woburn 4 \n", | |
| "\n", | |
| " Venue Venue Latitude \\\n", | |
| "Neighborhood \n", | |
| "Agincourt 4 4 \n", | |
| "Agincourt North,L'Amoreaux East,Milliken,Steele... 3 3 \n", | |
| "Birch Cliff,Cliffside West 4 4 \n", | |
| "Cedarbrae 8 8 \n", | |
| "Clairlea,Golden Mile,Oakridge 10 10 \n", | |
| "Clarks Corners,Sullivan,Tam O'Shanter 10 10 \n", | |
| "Cliffcrest,Cliffside,Scarborough Village West 3 3 \n", | |
| "Dorset Park,Scarborough Town Centre,Wexford Hei... 6 6 \n", | |
| "East Birchmount Park,Ionview,Kennedy Park 4 4 \n", | |
| "Guildwood,Morningside,West Hill 9 9 \n", | |
| "Highland Creek,Rouge Hill,Port Union 2 2 \n", | |
| "L'Amoreaux West 12 12 \n", | |
| "Maryvale,Wexford 7 7 \n", | |
| "Rouge,Malvern 2 2 \n", | |
| "Scarborough Village 1 1 \n", | |
| "Woburn 4 4 \n", | |
| "\n", | |
| " Venue Longitude \\\n", | |
| "Neighborhood \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North,L'Amoreaux East,Milliken,Steele... 3 \n", | |
| "Birch Cliff,Cliffside West 4 \n", | |
| "Cedarbrae 8 \n", | |
| "Clairlea,Golden Mile,Oakridge 10 \n", | |
| "Clarks Corners,Sullivan,Tam O'Shanter 10 \n", | |
| "Cliffcrest,Cliffside,Scarborough Village West 3 \n", | |
| "Dorset Park,Scarborough Town Centre,Wexford Hei... 6 \n", | |
| "East Birchmount Park,Ionview,Kennedy Park 4 \n", | |
| "Guildwood,Morningside,West Hill 9 \n", | |
| "Highland Creek,Rouge Hill,Port Union 2 \n", | |
| "L'Amoreaux West 12 \n", | |
| "Maryvale,Wexford 7 \n", | |
| "Rouge,Malvern 2 \n", | |
| "Scarborough Village 1 \n", | |
| "Woburn 4 \n", | |
| "\n", | |
| " Venue Category \n", | |
| "Neighborhood \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North,L'Amoreaux East,Milliken,Steele... 3 \n", | |
| "Birch Cliff,Cliffside West 4 \n", | |
| "Cedarbrae 8 \n", | |
| "Clairlea,Golden Mile,Oakridge 10 \n", | |
| "Clarks Corners,Sullivan,Tam O'Shanter 10 \n", | |
| "Cliffcrest,Cliffside,Scarborough Village West 3 \n", | |
| "Dorset Park,Scarborough Town Centre,Wexford Hei... 6 \n", | |
| "East Birchmount Park,Ionview,Kennedy Park 4 \n", | |
| "Guildwood,Morningside,West Hill 9 \n", | |
| "Highland Creek,Rouge Hill,Port Union 2 \n", | |
| "L'Amoreaux West 12 \n", | |
| "Maryvale,Wexford 7 \n", | |
| "Rouge,Malvern 2 \n", | |
| "Scarborough Village 1 \n", | |
| "Woburn 4 " | |
| ] | |
| }, | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "#Venues per Neighborhood\n", | |
| "scarborough_venues.groupby('Neighborhood').count()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "There are 81 distinct venues in 53 categories.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('There are {} distinct venues in {} categories.'.format(\n", | |
| " len(scarborough_venues['Venue'].unique()),len(scarborough_venues['Venue Category'].unique())))\n", | |
| "\n", | |
| "#print('There are {} uniques categories.'.format(len(scarborough_venues['Venue Category'].unique())))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Analyze each Neighborhood" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "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>Neighborhood</th>\n", | |
| " <th>American Restaurant</th>\n", | |
| " <th>Asian Restaurant</th>\n", | |
| " <th>Athletics & Sports</th>\n", | |
| " <th>Auto Garage</th>\n", | |
| " <th>Bakery</th>\n", | |
| " <th>Bank</th>\n", | |
| " <th>Bar</th>\n", | |
| " <th>Breakfast Spot</th>\n", | |
| " <th>Bus Line</th>\n", | |
| " <th>Bus Station</th>\n", | |
| " <th>Café</th>\n", | |
| " <th>Caribbean Restaurant</th>\n", | |
| " <th>Chinese Restaurant</th>\n", | |
| " <th>Coffee Shop</th>\n", | |
| " <th>College Stadium</th>\n", | |
| " <th>Construction & Landscaping</th>\n", | |
| " <th>Convenience Store</th>\n", | |
| " <th>Department Store</th>\n", | |
| " <th>Discount Store</th>\n", | |
| " <th>Electronics Store</th>\n", | |
| " <th>Fast Food Restaurant</th>\n", | |
| " <th>Fried Chicken Joint</th>\n", | |
| " <th>General Entertainment</th>\n", | |
| " <th>Grocery Store</th>\n", | |
| " <th>Hakka Restaurant</th>\n", | |
| " <th>Indian Restaurant</th>\n", | |
| " <th>Intersection</th>\n", | |
| " <th>Italian Restaurant</th>\n", | |
| " <th>Korean Restaurant</th>\n", | |
| " <th>Latin American Restaurant</th>\n", | |
| " <th>Lounge</th>\n", | |
| " <th>Medical Center</th>\n", | |
| " <th>Metro Station</th>\n", | |
| " <th>Mexican Restaurant</th>\n", | |
| " <th>Middle Eastern Restaurant</th>\n", | |
| " <th>Motel</th>\n", | |
| " <th>Noodle House</th>\n", | |
| " <th>Park</th>\n", | |
| " <th>Pet Store</th>\n", | |
| " <th>Pharmacy</th>\n", | |
| " <th>Pizza Place</th>\n", | |
| " <th>Playground</th>\n", | |
| " <th>Print Shop</th>\n", | |
| " <th>Rental Car Location</th>\n", | |
| " <th>Sandwich Place</th>\n", | |
| " <th>Shopping Mall</th>\n", | |
| " <th>Skating Rink</th>\n", | |
| " <th>Soccer Field</th>\n", | |
| " <th>Spa</th>\n", | |
| " <th>Tech Startup</th>\n", | |
| " <th>Thai Restaurant</th>\n", | |
| " <th>Thrift / Vintage Store</th>\n", | |
| " <th>Vietnamese Restaurant</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Rouge,Malvern</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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</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", | |
| " <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>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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Rouge,Malvern</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>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>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>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>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>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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</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>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>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>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>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>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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</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>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>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>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>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>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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Guildwood,Morningside,West Hill</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>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>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>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>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>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</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", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood American Restaurant \\\n", | |
| "0 Rouge,Malvern 0 \n", | |
| "1 Rouge,Malvern 0 \n", | |
| "2 Highland Creek,Rouge Hill,Port Union 0 \n", | |
| "3 Highland Creek,Rouge Hill,Port Union 0 \n", | |
| "4 Guildwood,Morningside,West Hill 0 \n", | |
| "\n", | |
| " Asian Restaurant Athletics & Sports Auto Garage Bakery Bank Bar \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 1 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Breakfast Spot Bus Line Bus Station Café Caribbean Restaurant \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Chinese Restaurant Coffee Shop College Stadium \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Construction & Landscaping Convenience Store Department Store \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 1 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Discount Store Electronics Store Fast Food Restaurant \\\n", | |
| "0 0 0 1 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Fried Chicken Joint General Entertainment Grocery Store \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Hakka Restaurant Indian Restaurant Intersection Italian Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Korean Restaurant Latin American Restaurant Lounge Medical Center \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Metro Station Mexican Restaurant Middle Eastern Restaurant Motel \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Noodle House Park Pet Store Pharmacy Pizza Place Playground \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 1 0 \n", | |
| "\n", | |
| " Print Shop Rental Car Location Sandwich Place Shopping Mall \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 1 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Skating Rink Soccer Field Spa Tech Startup Thai Restaurant \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Thrift / Vintage Store Vietnamese Restaurant \n", | |
| "0 0 0 \n", | |
| "1 0 0 \n", | |
| "2 0 0 \n", | |
| "3 0 0 \n", | |
| "4 0 0 " | |
| ] | |
| }, | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# one hot encoding\n", | |
| "scarborough_onehot = pd.get_dummies(scarborough_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n", | |
| "\n", | |
| "# add neighborhood column back to dataframe\n", | |
| "scarborough_onehot['Neighborhood'] = scarborough_venues['Neighborhood'] \n", | |
| "\n", | |
| "# move neighborhood column to the first column\n", | |
| "fixed_columns = [scarborough_onehot.columns[-1]] + list(scarborough_onehot.columns[:-1])\n", | |
| "scarborough_onehot = scarborough_onehot[fixed_columns]\n", | |
| "\n", | |
| "scarborough_onehot.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "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>Neighborhood</th>\n", | |
| " <th>American Restaurant</th>\n", | |
| " <th>Asian Restaurant</th>\n", | |
| " <th>Athletics & Sports</th>\n", | |
| " <th>Auto Garage</th>\n", | |
| " <th>Bakery</th>\n", | |
| " <th>Bank</th>\n", | |
| " <th>Bar</th>\n", | |
| " <th>Breakfast Spot</th>\n", | |
| " <th>Bus Line</th>\n", | |
| " <th>Bus Station</th>\n", | |
| " <th>Café</th>\n", | |
| " <th>Caribbean Restaurant</th>\n", | |
| " <th>Chinese Restaurant</th>\n", | |
| " <th>Coffee Shop</th>\n", | |
| " <th>College Stadium</th>\n", | |
| " <th>Construction & Landscaping</th>\n", | |
| " <th>Convenience Store</th>\n", | |
| " <th>Department Store</th>\n", | |
| " <th>Discount Store</th>\n", | |
| " <th>Electronics Store</th>\n", | |
| " <th>Fast Food Restaurant</th>\n", | |
| " <th>Fried Chicken Joint</th>\n", | |
| " <th>General Entertainment</th>\n", | |
| " <th>Grocery Store</th>\n", | |
| " <th>Hakka Restaurant</th>\n", | |
| " <th>Indian Restaurant</th>\n", | |
| " <th>Intersection</th>\n", | |
| " <th>Italian Restaurant</th>\n", | |
| " <th>Korean Restaurant</th>\n", | |
| " <th>Latin American Restaurant</th>\n", | |
| " <th>Lounge</th>\n", | |
| " <th>Medical Center</th>\n", | |
| " <th>Metro Station</th>\n", | |
| " <th>Mexican Restaurant</th>\n", | |
| " <th>Middle Eastern Restaurant</th>\n", | |
| " <th>Motel</th>\n", | |
| " <th>Noodle House</th>\n", | |
| " <th>Park</th>\n", | |
| " <th>Pet Store</th>\n", | |
| " <th>Pharmacy</th>\n", | |
| " <th>Pizza Place</th>\n", | |
| " <th>Playground</th>\n", | |
| " <th>Print Shop</th>\n", | |
| " <th>Rental Car Location</th>\n", | |
| " <th>Sandwich Place</th>\n", | |
| " <th>Shopping Mall</th>\n", | |
| " <th>Skating Rink</th>\n", | |
| " <th>Soccer Field</th>\n", | |
| " <th>Spa</th>\n", | |
| " <th>Tech Startup</th>\n", | |
| " <th>Thai Restaurant</th>\n", | |
| " <th>Thrift / Vintage Store</th>\n", | |
| " <th>Vietnamese Restaurant</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Agincourt</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.250000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.250000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.250</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.250000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Agincourt North,L'Amoreaux East,Milliken,Steel...</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Birch Cliff,Cliffside West</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.125</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Clairlea,Golden Mile,Oakridge</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.200000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.2</td>\n", | |
| " <td>0.1</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.1</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.1</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>Clarks Corners,Sullivan,Tam O'Shanter</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.100</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.1</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.1</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.200000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Cliffcrest,Cliffside,Scarborough Village West</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.666667</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>Dorset Park,Scarborough Town Centre,Wexford He...</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>East Birchmount Park,Ionview,Kennedy Park</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.250000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.250000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.5</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.5</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>L'Amoreaux West</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.083333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>Maryvale,Wexford</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.142857</td>\n", | |
| " <td>0.142857</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.142857</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.285714</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.142857</td>\n", | |
| " <td>0.142857</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.500000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.5</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>Scarborough Village</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>1.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.500000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.25</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.00</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood American Restaurant \\\n", | |
| "0 Agincourt 0.000000 \n", | |
| "1 Agincourt North,L'Amoreaux East,Milliken,Steel... 0.000000 \n", | |
| "2 Birch Cliff,Cliffside West 0.000000 \n", | |
| "3 Cedarbrae 0.000000 \n", | |
| "4 Clairlea,Golden Mile,Oakridge 0.000000 \n", | |
| "5 Clarks Corners,Sullivan,Tam O'Shanter 0.000000 \n", | |
| "6 Cliffcrest,Cliffside,Scarborough Village West 0.333333 \n", | |
| "7 Dorset Park,Scarborough Town Centre,Wexford He... 0.000000 \n", | |
| "8 East Birchmount Park,Ionview,Kennedy Park 0.000000 \n", | |
| "9 Guildwood,Morningside,West Hill 0.000000 \n", | |
| "10 Highland Creek,Rouge Hill,Port Union 0.000000 \n", | |
| "11 L'Amoreaux West 0.083333 \n", | |
| "12 Maryvale,Wexford 0.000000 \n", | |
| "13 Rouge,Malvern 0.000000 \n", | |
| "14 Scarborough Village 0.000000 \n", | |
| "15 Woburn 0.000000 \n", | |
| "\n", | |
| " Asian Restaurant Athletics & Sports Auto Garage Bakery Bank Bar \\\n", | |
| "0 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "1 0.333333 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "2 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "3 0.000000 0.125 0.000000 0.125000 0.125 0.0 \n", | |
| "4 0.000000 0.000 0.000000 0.200000 0.000 0.0 \n", | |
| "5 0.000000 0.000 0.000000 0.000000 0.100 0.0 \n", | |
| "6 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "7 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "8 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "9 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "10 0.000000 0.000 0.000000 0.000000 0.000 0.5 \n", | |
| "11 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "12 0.000000 0.000 0.142857 0.142857 0.000 0.0 \n", | |
| "13 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "14 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "15 0.000000 0.000 0.000000 0.000000 0.000 0.0 \n", | |
| "\n", | |
| " Breakfast Spot Bus Line Bus Station Café Caribbean Restaurant \\\n", | |
| "0 0.250000 0.0 0.0 0.00 0.000 \n", | |
| "1 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "2 0.000000 0.0 0.0 0.25 0.000 \n", | |
| "3 0.000000 0.0 0.0 0.00 0.125 \n", | |
| "4 0.000000 0.2 0.1 0.00 0.000 \n", | |
| "5 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "6 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "7 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "8 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "9 0.111111 0.0 0.0 0.00 0.000 \n", | |
| "10 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "11 0.083333 0.0 0.0 0.00 0.000 \n", | |
| "12 0.142857 0.0 0.0 0.00 0.000 \n", | |
| "13 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "14 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "15 0.000000 0.0 0.0 0.00 0.000 \n", | |
| "\n", | |
| " Chinese Restaurant Coffee Shop College Stadium \\\n", | |
| "0 0.250000 0.000000 0.00 \n", | |
| "1 0.000000 0.000000 0.00 \n", | |
| "2 0.000000 0.000000 0.25 \n", | |
| "3 0.000000 0.000000 0.00 \n", | |
| "4 0.000000 0.000000 0.00 \n", | |
| "5 0.100000 0.000000 0.00 \n", | |
| "6 0.000000 0.000000 0.00 \n", | |
| "7 0.166667 0.000000 0.00 \n", | |
| "8 0.000000 0.250000 0.00 \n", | |
| "9 0.000000 0.000000 0.00 \n", | |
| "10 0.000000 0.000000 0.00 \n", | |
| "11 0.166667 0.083333 0.00 \n", | |
| "12 0.000000 0.000000 0.00 \n", | |
| "13 0.000000 0.000000 0.00 \n", | |
| "14 0.000000 0.000000 0.00 \n", | |
| "15 0.000000 0.500000 0.00 \n", | |
| "\n", | |
| " Construction & Landscaping Convenience Store Department Store \\\n", | |
| "0 0.0 0.00 0.00 \n", | |
| "1 0.0 0.00 0.00 \n", | |
| "2 0.0 0.00 0.00 \n", | |
| "3 0.0 0.00 0.00 \n", | |
| "4 0.0 0.00 0.00 \n", | |
| "5 0.0 0.00 0.00 \n", | |
| "6 0.0 0.00 0.00 \n", | |
| "7 0.0 0.00 0.00 \n", | |
| "8 0.0 0.00 0.25 \n", | |
| "9 0.0 0.00 0.00 \n", | |
| "10 0.5 0.00 0.00 \n", | |
| "11 0.0 0.00 0.00 \n", | |
| "12 0.0 0.00 0.00 \n", | |
| "13 0.0 0.00 0.00 \n", | |
| "14 0.0 0.00 0.00 \n", | |
| "15 0.0 0.25 0.00 \n", | |
| "\n", | |
| " Discount Store Electronics Store Fast Food Restaurant \\\n", | |
| "0 0.00 0.000000 0.000000 \n", | |
| "1 0.00 0.000000 0.000000 \n", | |
| "2 0.00 0.000000 0.000000 \n", | |
| "3 0.00 0.000000 0.000000 \n", | |
| "4 0.00 0.000000 0.100000 \n", | |
| "5 0.00 0.000000 0.100000 \n", | |
| "6 0.00 0.000000 0.000000 \n", | |
| "7 0.00 0.000000 0.000000 \n", | |
| "8 0.25 0.000000 0.000000 \n", | |
| "9 0.00 0.111111 0.000000 \n", | |
| "10 0.00 0.000000 0.000000 \n", | |
| "11 0.00 0.000000 0.166667 \n", | |
| "12 0.00 0.000000 0.000000 \n", | |
| "13 0.00 0.000000 0.500000 \n", | |
| "14 0.00 0.000000 0.000000 \n", | |
| "15 0.00 0.000000 0.000000 \n", | |
| "\n", | |
| " Fried Chicken Joint General Entertainment Grocery Store \\\n", | |
| "0 0.000 0.00 0.000000 \n", | |
| "1 0.000 0.00 0.000000 \n", | |
| "2 0.000 0.25 0.000000 \n", | |
| "3 0.125 0.00 0.000000 \n", | |
| "4 0.000 0.00 0.000000 \n", | |
| "5 0.100 0.00 0.000000 \n", | |
| "6 0.000 0.00 0.000000 \n", | |
| "7 0.000 0.00 0.000000 \n", | |
| "8 0.000 0.00 0.000000 \n", | |
| "9 0.000 0.00 0.000000 \n", | |
| "10 0.000 0.00 0.000000 \n", | |
| "11 0.000 0.00 0.083333 \n", | |
| "12 0.000 0.00 0.000000 \n", | |
| "13 0.000 0.00 0.000000 \n", | |
| "14 0.000 0.00 0.000000 \n", | |
| "15 0.000 0.00 0.000000 \n", | |
| "\n", | |
| " Hakka Restaurant Indian Restaurant Intersection Italian Restaurant \\\n", | |
| "0 0.000 0.000000 0.000000 0.0 \n", | |
| "1 0.000 0.000000 0.000000 0.0 \n", | |
| "2 0.000 0.000000 0.000000 0.0 \n", | |
| "3 0.125 0.000000 0.000000 0.0 \n", | |
| "4 0.000 0.000000 0.100000 0.0 \n", | |
| "5 0.000 0.000000 0.000000 0.1 \n", | |
| "6 0.000 0.000000 0.000000 0.0 \n", | |
| "7 0.000 0.333333 0.000000 0.0 \n", | |
| "8 0.000 0.000000 0.000000 0.0 \n", | |
| "9 0.000 0.000000 0.111111 0.0 \n", | |
| "10 0.000 0.000000 0.000000 0.0 \n", | |
| "11 0.000 0.000000 0.000000 0.0 \n", | |
| "12 0.000 0.000000 0.000000 0.0 \n", | |
| "13 0.000 0.000000 0.000000 0.0 \n", | |
| "14 0.000 0.000000 0.000000 0.0 \n", | |
| "15 0.000 0.000000 0.000000 0.0 \n", | |
| "\n", | |
| " Korean Restaurant Latin American Restaurant Lounge Medical Center \\\n", | |
| "0 0.00 0.000000 0.250 0.000000 \n", | |
| "1 0.00 0.000000 0.000 0.000000 \n", | |
| "2 0.00 0.000000 0.000 0.000000 \n", | |
| "3 0.00 0.000000 0.125 0.000000 \n", | |
| "4 0.00 0.000000 0.000 0.000000 \n", | |
| "5 0.00 0.000000 0.000 0.000000 \n", | |
| "6 0.00 0.000000 0.000 0.000000 \n", | |
| "7 0.00 0.166667 0.000 0.000000 \n", | |
| "8 0.00 0.000000 0.000 0.000000 \n", | |
| "9 0.00 0.000000 0.000 0.111111 \n", | |
| "10 0.00 0.000000 0.000 0.000000 \n", | |
| "11 0.00 0.000000 0.000 0.000000 \n", | |
| "12 0.00 0.000000 0.000 0.000000 \n", | |
| "13 0.00 0.000000 0.000 0.000000 \n", | |
| "14 0.00 0.000000 0.000 0.000000 \n", | |
| "15 0.25 0.000000 0.000 0.000000 \n", | |
| "\n", | |
| " Metro Station Mexican Restaurant Middle Eastern Restaurant Motel \\\n", | |
| "0 0.0 0.000000 0.000000 0.000000 \n", | |
| "1 0.0 0.000000 0.000000 0.000000 \n", | |
| "2 0.0 0.000000 0.000000 0.000000 \n", | |
| "3 0.0 0.000000 0.000000 0.000000 \n", | |
| "4 0.1 0.000000 0.000000 0.000000 \n", | |
| "5 0.0 0.000000 0.000000 0.000000 \n", | |
| "6 0.0 0.000000 0.000000 0.666667 \n", | |
| "7 0.0 0.000000 0.000000 0.000000 \n", | |
| "8 0.0 0.000000 0.000000 0.000000 \n", | |
| "9 0.0 0.111111 0.000000 0.000000 \n", | |
| "10 0.0 0.000000 0.000000 0.000000 \n", | |
| "11 0.0 0.000000 0.000000 0.000000 \n", | |
| "12 0.0 0.000000 0.285714 0.000000 \n", | |
| "13 0.0 0.000000 0.000000 0.000000 \n", | |
| "14 0.0 0.000000 0.000000 0.000000 \n", | |
| "15 0.0 0.000000 0.000000 0.000000 \n", | |
| "\n", | |
| " Noodle House Park Pet Store Pharmacy Pizza Place Playground \\\n", | |
| "0 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "1 0.0 0.333333 0.000000 0.000000 0.000000 0.333333 \n", | |
| "2 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "3 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "4 0.0 0.100000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "5 0.1 0.000000 0.000000 0.100000 0.200000 0.000000 \n", | |
| "6 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "7 0.0 0.000000 0.166667 0.000000 0.000000 0.000000 \n", | |
| "8 0.0 0.000000 0.000000 0.000000 0.000000 0.250000 \n", | |
| "9 0.0 0.000000 0.000000 0.000000 0.111111 0.000000 \n", | |
| "10 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "11 0.0 0.000000 0.000000 0.083333 0.083333 0.000000 \n", | |
| "12 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "13 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "14 0.0 0.000000 0.000000 0.000000 0.000000 1.000000 \n", | |
| "15 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", | |
| "\n", | |
| " Print Shop Rental Car Location Sandwich Place Shopping Mall \\\n", | |
| "0 0.0 0.000000 0.250000 0.000000 \n", | |
| "1 0.0 0.000000 0.000000 0.000000 \n", | |
| "2 0.0 0.000000 0.000000 0.000000 \n", | |
| "3 0.0 0.000000 0.000000 0.000000 \n", | |
| "4 0.0 0.000000 0.000000 0.000000 \n", | |
| "5 0.0 0.000000 0.000000 0.000000 \n", | |
| "6 0.0 0.000000 0.000000 0.000000 \n", | |
| "7 0.0 0.000000 0.000000 0.000000 \n", | |
| "8 0.0 0.000000 0.000000 0.000000 \n", | |
| "9 0.0 0.111111 0.000000 0.000000 \n", | |
| "10 0.0 0.000000 0.000000 0.000000 \n", | |
| "11 0.0 0.000000 0.083333 0.000000 \n", | |
| "12 0.0 0.000000 0.142857 0.142857 \n", | |
| "13 0.5 0.000000 0.000000 0.000000 \n", | |
| "14 0.0 0.000000 0.000000 0.000000 \n", | |
| "15 0.0 0.000000 0.000000 0.000000 \n", | |
| "\n", | |
| " Skating Rink Soccer Field Spa Tech Startup Thai Restaurant \\\n", | |
| "0 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "1 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "2 0.25 0.0 0.000000 0.000000 0.000 \n", | |
| "3 0.00 0.0 0.000000 0.000000 0.125 \n", | |
| "4 0.00 0.1 0.000000 0.000000 0.000 \n", | |
| "5 0.00 0.0 0.000000 0.000000 0.100 \n", | |
| "6 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "7 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "8 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "9 0.00 0.0 0.111111 0.111111 0.000 \n", | |
| "10 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "11 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "12 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "13 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "14 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "15 0.00 0.0 0.000000 0.000000 0.000 \n", | |
| "\n", | |
| " Thrift / Vintage Store Vietnamese Restaurant \n", | |
| "0 0.000000 0.000000 \n", | |
| "1 0.000000 0.000000 \n", | |
| "2 0.000000 0.000000 \n", | |
| "3 0.000000 0.000000 \n", | |
| "4 0.000000 0.000000 \n", | |
| "5 0.000000 0.000000 \n", | |
| "6 0.000000 0.000000 \n", | |
| "7 0.000000 0.166667 \n", | |
| "8 0.000000 0.000000 \n", | |
| "9 0.000000 0.000000 \n", | |
| "10 0.000000 0.000000 \n", | |
| "11 0.083333 0.000000 \n", | |
| "12 0.000000 0.000000 \n", | |
| "13 0.000000 0.000000 \n", | |
| "14 0.000000 0.000000 \n", | |
| "15 0.000000 0.000000 " | |
| ] | |
| }, | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_grouped = scarborough_onehot.groupby('Neighborhood').mean().reset_index()\n", | |
| "scarborough_grouped" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Each neighborhood with the top 5 venues" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "----Agincourt----\n", | |
| " venue freq\n", | |
| "0 Lounge 0.25\n", | |
| "1 Breakfast Spot 0.25\n", | |
| "2 Sandwich Place 0.25\n", | |
| "3 Chinese Restaurant 0.25\n", | |
| "4 American Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Agincourt North,L'Amoreaux East,Milliken,Steeles East----\n", | |
| " venue freq\n", | |
| "0 Asian Restaurant 0.33\n", | |
| "1 Park 0.33\n", | |
| "2 Playground 0.33\n", | |
| "3 Pharmacy 0.00\n", | |
| "4 Korean Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Birch Cliff,Cliffside West----\n", | |
| " venue freq\n", | |
| "0 College Stadium 0.25\n", | |
| "1 General Entertainment 0.25\n", | |
| "2 Skating Rink 0.25\n", | |
| "3 Café 0.25\n", | |
| "4 Pizza Place 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Cedarbrae----\n", | |
| " venue freq\n", | |
| "0 Caribbean Restaurant 0.12\n", | |
| "1 Athletics & Sports 0.12\n", | |
| "2 Bakery 0.12\n", | |
| "3 Bank 0.12\n", | |
| "4 Thai Restaurant 0.12\n", | |
| "\n", | |
| "\n", | |
| "----Clairlea,Golden Mile,Oakridge----\n", | |
| " venue freq\n", | |
| "0 Bakery 0.2\n", | |
| "1 Bus Line 0.2\n", | |
| "2 Intersection 0.1\n", | |
| "3 Metro Station 0.1\n", | |
| "4 Soccer Field 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Clarks Corners,Sullivan,Tam O'Shanter----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.2\n", | |
| "1 Pharmacy 0.1\n", | |
| "2 Fried Chicken Joint 0.1\n", | |
| "3 Italian Restaurant 0.1\n", | |
| "4 Thai Restaurant 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Cliffcrest,Cliffside,Scarborough Village West----\n", | |
| " venue freq\n", | |
| "0 Motel 0.67\n", | |
| "1 American Restaurant 0.33\n", | |
| "2 Italian Restaurant 0.00\n", | |
| "3 Latin American Restaurant 0.00\n", | |
| "4 Lounge 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Dorset Park,Scarborough Town Centre,Wexford Heights----\n", | |
| " venue freq\n", | |
| "0 Indian Restaurant 0.33\n", | |
| "1 Vietnamese Restaurant 0.17\n", | |
| "2 Chinese Restaurant 0.17\n", | |
| "3 Pet Store 0.17\n", | |
| "4 Latin American Restaurant 0.17\n", | |
| "\n", | |
| "\n", | |
| "----East Birchmount Park,Ionview,Kennedy Park----\n", | |
| " venue freq\n", | |
| "0 Discount Store 0.25\n", | |
| "1 Department Store 0.25\n", | |
| "2 Playground 0.25\n", | |
| "3 Coffee Shop 0.25\n", | |
| "4 American Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Guildwood,Morningside,West Hill----\n", | |
| " venue freq\n", | |
| "0 Intersection 0.11\n", | |
| "1 Medical Center 0.11\n", | |
| "2 Tech Startup 0.11\n", | |
| "3 Spa 0.11\n", | |
| "4 Breakfast Spot 0.11\n", | |
| "\n", | |
| "\n", | |
| "----Highland Creek,Rouge Hill,Port Union----\n", | |
| " venue freq\n", | |
| "0 Bar 0.5\n", | |
| "1 Construction & Landscaping 0.5\n", | |
| "2 American Restaurant 0.0\n", | |
| "3 Pizza Place 0.0\n", | |
| "4 Lounge 0.0\n", | |
| "\n", | |
| "\n", | |
| "----L'Amoreaux West----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 0.17\n", | |
| "1 Chinese Restaurant 0.17\n", | |
| "2 American Restaurant 0.08\n", | |
| "3 Grocery Store 0.08\n", | |
| "4 Pizza Place 0.08\n", | |
| "\n", | |
| "\n", | |
| "----Maryvale,Wexford----\n", | |
| " venue freq\n", | |
| "0 Middle Eastern Restaurant 0.29\n", | |
| "1 Auto Garage 0.14\n", | |
| "2 Bakery 0.14\n", | |
| "3 Breakfast Spot 0.14\n", | |
| "4 Shopping Mall 0.14\n", | |
| "\n", | |
| "\n", | |
| "----Rouge,Malvern----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 0.5\n", | |
| "1 Print Shop 0.5\n", | |
| "2 American Restaurant 0.0\n", | |
| "3 Pharmacy 0.0\n", | |
| "4 Latin American Restaurant 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Scarborough Village----\n", | |
| " venue freq\n", | |
| "0 Playground 1.0\n", | |
| "1 American Restaurant 0.0\n", | |
| "2 Pharmacy 0.0\n", | |
| "3 Latin American Restaurant 0.0\n", | |
| "4 Lounge 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Woburn----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.50\n", | |
| "1 Convenience Store 0.25\n", | |
| "2 Korean Restaurant 0.25\n", | |
| "3 Pizza Place 0.00\n", | |
| "4 Lounge 0.00\n", | |
| "\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "num_top_venues = 5\n", | |
| "\n", | |
| "for hood in scarborough_grouped['Neighborhood']:\n", | |
| " print(\"----\"+hood+\"----\")\n", | |
| " temp = scarborough_grouped[scarborough_grouped['Neighborhood'] == hood].T.reset_index()\n", | |
| " temp.columns = ['venue','freq']\n", | |
| " temp = temp.iloc[1:]\n", | |
| " temp['freq'] = temp['freq'].astype(float)\n", | |
| " temp = temp.round({'freq': 2})\n", | |
| " print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues))\n", | |
| " print('\\n')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Let's put that into a *pandas* dataframe\n", | |
| "\n", | |
| "Let's write a function to sort the venues in descending order" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 25, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def return_most_common_venues(row, num_top_venues):\n", | |
| " row_categories = row.iloc[1:]\n", | |
| " row_categories_sorted = row_categories.sort_values(ascending=False)\n", | |
| " \n", | |
| " return row_categories_sorted.index.values[0:num_top_venues]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Create a new dataframe and display the top ten venues for each neighborhood" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 26, | |
| "metadata": {}, | |
| "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>Neighborhood</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Agincourt</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Agincourt North,L'Amoreaux East,Milliken,Steel...</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Birch Cliff,Cliffside West</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Hakka Restaurant</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Clairlea,Golden Mile,Oakridge</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bus Line</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Soccer Field</td>\n", | |
| " <td>Bus Station</td>\n", | |
| " <td>Metro Station</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>Clarks Corners,Sullivan,Tam O'Shanter</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Noodle House</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Cliffcrest,Cliffside,Scarborough Village West</td>\n", | |
| " <td>Motel</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>Dorset Park,Scarborough Town Centre,Wexford He...</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Latin American Restaurant</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Pet Store</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>East Birchmount Park,Ionview,Kennedy Park</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Tech Startup</td>\n", | |
| " <td>Spa</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Medical Center</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Rental Car Location</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Construction & Landscaping</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>L'Amoreaux West</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Thrift / Vintage Store</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>Maryvale,Wexford</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Auto Garage</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Shopping Mall</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Print Shop</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>Scarborough Village</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Korean Restaurant</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood \\\n", | |
| "0 Agincourt \n", | |
| "1 Agincourt North,L'Amoreaux East,Milliken,Steel... \n", | |
| "2 Birch Cliff,Cliffside West \n", | |
| "3 Cedarbrae \n", | |
| "4 Clairlea,Golden Mile,Oakridge \n", | |
| "5 Clarks Corners,Sullivan,Tam O'Shanter \n", | |
| "6 Cliffcrest,Cliffside,Scarborough Village West \n", | |
| "7 Dorset Park,Scarborough Town Centre,Wexford He... \n", | |
| "8 East Birchmount Park,Ionview,Kennedy Park \n", | |
| "9 Guildwood,Morningside,West Hill \n", | |
| "10 Highland Creek,Rouge Hill,Port Union \n", | |
| "11 L'Amoreaux West \n", | |
| "12 Maryvale,Wexford \n", | |
| "13 Rouge,Malvern \n", | |
| "14 Scarborough Village \n", | |
| "15 Woburn \n", | |
| "\n", | |
| " 1st Most Common Venue 2nd Most Common Venue \\\n", | |
| "0 Lounge Sandwich Place \n", | |
| "1 Park Asian Restaurant \n", | |
| "2 General Entertainment Skating Rink \n", | |
| "3 Caribbean Restaurant Thai Restaurant \n", | |
| "4 Bakery Bus Line \n", | |
| "5 Pizza Place Noodle House \n", | |
| "6 Motel American Restaurant \n", | |
| "7 Indian Restaurant Chinese Restaurant \n", | |
| "8 Discount Store Department Store \n", | |
| "9 Intersection Breakfast Spot \n", | |
| "10 Bar Construction & Landscaping \n", | |
| "11 Chinese Restaurant Fast Food Restaurant \n", | |
| "12 Middle Eastern Restaurant Auto Garage \n", | |
| "13 Fast Food Restaurant Print Shop \n", | |
| "14 Playground Vietnamese Restaurant \n", | |
| "15 Coffee Shop Korean Restaurant \n", | |
| "\n", | |
| " 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n", | |
| "0 Breakfast Spot Chinese Restaurant Vietnamese Restaurant \n", | |
| "1 Playground Vietnamese Restaurant General Entertainment \n", | |
| "2 Café College Stadium Vietnamese Restaurant \n", | |
| "3 Athletics & Sports Fried Chicken Joint Bakery \n", | |
| "4 Intersection Fast Food Restaurant Soccer Field \n", | |
| "5 Thai Restaurant Fried Chicken Joint Fast Food Restaurant \n", | |
| "6 Coffee Shop Grocery Store General Entertainment \n", | |
| "7 Latin American Restaurant Vietnamese Restaurant Pet Store \n", | |
| "8 Playground Coffee Shop Vietnamese Restaurant \n", | |
| "9 Mexican Restaurant Tech Startup Spa \n", | |
| "10 Vietnamese Restaurant Coffee Shop Grocery Store \n", | |
| "11 Coffee Shop Grocery Store Pharmacy \n", | |
| "12 Bakery Shopping Mall Sandwich Place \n", | |
| "13 Vietnamese Restaurant Chinese Restaurant Grocery Store \n", | |
| "14 Chinese Restaurant Grocery Store General Entertainment \n", | |
| "15 Convenience Store Vietnamese Restaurant Grocery Store \n", | |
| "\n", | |
| " 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n", | |
| "0 Coffee Shop General Entertainment Fried Chicken Joint \n", | |
| "1 Fried Chicken Joint Fast Food Restaurant Electronics Store \n", | |
| "2 Coffee Shop Grocery Store Fried Chicken Joint \n", | |
| "3 Bank Lounge Hakka Restaurant \n", | |
| "4 Bus Station Metro Station Park \n", | |
| "5 Italian Restaurant Bank Chinese Restaurant \n", | |
| "6 Fried Chicken Joint Fast Food Restaurant Electronics Store \n", | |
| "7 Bakery Grocery Store General Entertainment \n", | |
| "8 Chinese Restaurant Grocery Store General Entertainment \n", | |
| "9 Electronics Store Medical Center Pizza Place \n", | |
| "10 General Entertainment Fried Chicken Joint Fast Food Restaurant \n", | |
| "11 Pizza Place Breakfast Spot American Restaurant \n", | |
| "12 Breakfast Spot Vietnamese Restaurant College Stadium \n", | |
| "13 General Entertainment Fried Chicken Joint Electronics Store \n", | |
| "14 Fried Chicken Joint Fast Food Restaurant Electronics Store \n", | |
| "15 General Entertainment Fried Chicken Joint Fast Food Restaurant \n", | |
| "\n", | |
| " 9th Most Common Venue 10th Most Common Venue \n", | |
| "0 Fast Food Restaurant Electronics Store \n", | |
| "1 Discount Store Department Store \n", | |
| "2 Fast Food Restaurant Electronics Store \n", | |
| "3 College Stadium General Entertainment \n", | |
| "4 College Stadium General Entertainment \n", | |
| "5 Pharmacy Coffee Shop \n", | |
| "6 Discount Store Department Store \n", | |
| "7 Fried Chicken Joint Asian Restaurant \n", | |
| "8 Fried Chicken Joint Fast Food Restaurant \n", | |
| "9 Rental Car Location College Stadium \n", | |
| "10 Electronics Store Discount Store \n", | |
| "11 Thrift / Vintage Store Sandwich Place \n", | |
| "12 General Entertainment Fried Chicken Joint \n", | |
| "13 Discount Store Department Store \n", | |
| "14 Discount Store Department Store \n", | |
| "15 Electronics Store Discount Store " | |
| ] | |
| }, | |
| "execution_count": 26, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "num_top_venues = 10\n", | |
| "\n", | |
| "indicators = ['st', 'nd', 'rd']\n", | |
| "\n", | |
| "# create columns according to number of top venues\n", | |
| "columns = ['Neighborhood']\n", | |
| "for ind in np.arange(num_top_venues):\n", | |
| " try:\n", | |
| " columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))\n", | |
| " except:\n", | |
| " columns.append('{}th Most Common Venue'.format(ind+1))\n", | |
| "\n", | |
| "# create a new dataframe\n", | |
| "neighborhoods_venues_sorted = pd.DataFrame(columns=columns)\n", | |
| "neighborhoods_venues_sorted['Neighborhood'] = scarborough_grouped['Neighborhood']\n", | |
| "\n", | |
| "for ind in np.arange(scarborough_grouped.shape[0]):\n", | |
| " neighborhoods_venues_sorted.iloc[ind, 1:] = return_most_common_venues(scarborough_grouped.iloc[ind, :], num_top_venues)\n", | |
| "\n", | |
| "neighborhoods_venues_sorted" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "Neighborhood L'Amoreaux West\n", | |
| "1st Most Common Venue Chinese Restaurant\n", | |
| "2nd Most Common Venue Fast Food Restaurant\n", | |
| "3rd Most Common Venue Coffee Shop\n", | |
| "4th Most Common Venue Grocery Store\n", | |
| "5th Most Common Venue Pharmacy\n", | |
| "6th Most Common Venue Pizza Place\n", | |
| "7th Most Common Venue Breakfast Spot\n", | |
| "8th Most Common Venue American Restaurant\n", | |
| "9th Most Common Venue Thrift / Vintage Store\n", | |
| "10th Most Common Venue Sandwich Place\n", | |
| "Name: 11, dtype: object" | |
| ] | |
| }, | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods_venues_sorted.iloc[11,]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 4. Cluster the Scarborough Neighborhood using k-means\n", | |
| "\n", | |
| "Run K-means to cluster neighborhood into three clusters" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 28, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 0, 1], dtype=int32)" | |
| ] | |
| }, | |
| "execution_count": 28, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# set number of clusters\n", | |
| "kclusters = 3\n", | |
| "\n", | |
| "scarborough_grouped_clustering = scarborough_grouped.drop('Neighborhood', 1)\n", | |
| "\n", | |
| "# run k-means clustering\n", | |
| "kmeans = KMeans(n_clusters=kclusters, random_state=2).fit(scarborough_grouped_clustering)\n", | |
| "\n", | |
| "# check cluster labels generated for each row in the dataframe\n", | |
| "#kmeans.labels_[0:10] \n", | |
| "kmeans.labels_" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Lets create a new dataframe that includes the cluster as well as the top ten venues for each neighborhood" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 29, | |
| "metadata": {}, | |
| "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>PostalCode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " <th>Cluster Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge,Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Print Shop</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek,Rouge Hill,Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Construction & Landscaping</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Guildwood,Morningside,West Hill</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Tech Startup</td>\n", | |
| " <td>Spa</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Medical Center</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Rental Car Location</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Korean Restaurant</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Hakka Restaurant</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " PostalCode Borough Neighborhood Latitude \\\n", | |
| "0 M1B Scarborough Rouge,Malvern 43.806686 \n", | |
| "1 M1C Scarborough Highland Creek,Rouge Hill,Port Union 43.784535 \n", | |
| "2 M1E Scarborough Guildwood,Morningside,West Hill 43.763573 \n", | |
| "3 M1G Scarborough Woburn 43.770992 \n", | |
| "4 M1H Scarborough Cedarbrae 43.773136 \n", | |
| "\n", | |
| " Longitude Cluster Labels 1st Most Common Venue \\\n", | |
| "0 -79.194353 1 Fast Food Restaurant \n", | |
| "1 -79.160497 1 Bar \n", | |
| "2 -79.188711 1 Intersection \n", | |
| "3 -79.216917 1 Coffee Shop \n", | |
| "4 -79.239476 1 Caribbean Restaurant \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "0 Print Shop Vietnamese Restaurant Chinese Restaurant \n", | |
| "1 Construction & Landscaping Vietnamese Restaurant Coffee Shop \n", | |
| "2 Breakfast Spot Mexican Restaurant Tech Startup \n", | |
| "3 Korean Restaurant Convenience Store Vietnamese Restaurant \n", | |
| "4 Thai Restaurant Athletics & Sports Fried Chicken Joint \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "0 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "1 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "2 Spa Electronics Store Medical Center \n", | |
| "3 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "4 Bakery Bank Lounge \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "0 Electronics Store Discount Store Department Store \n", | |
| "1 Fast Food Restaurant Electronics Store Discount Store \n", | |
| "2 Pizza Place Rental Car Location College Stadium \n", | |
| "3 Fast Food Restaurant Electronics Store Discount Store \n", | |
| "4 Hakka Restaurant College Stadium General Entertainment " | |
| ] | |
| }, | |
| "execution_count": 29, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "#Note that the neighborhood Upper Rouge does not have any venues, so I will drop from dataset\n", | |
| "scarborough_data.drop(scarborough_data[scarborough_data.Neighborhood == 'Upper Rouge'].index, inplace = True)\n", | |
| "#df_toronto.drop(df_toronto[df_toronto.Borough == 'Not assigned'].index, inplace=True)\n", | |
| "\n", | |
| "scarborough_merged = scarborough_data\n", | |
| "\n", | |
| "# add clustering labels\n", | |
| "scarborough_merged['Cluster Labels'] = kmeans.labels_\n", | |
| "\n", | |
| "# merge toronto_grouped with toronto_data to add latitude/longitude for each neighborhood\n", | |
| "scarborough_merged = scarborough_merged.join(neighborhoods_venues_sorted.set_index('Neighborhood'), on='Neighborhood')\n", | |
| "\n", | |
| "scarborough_merged.head() # check the last columns!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "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+ICNtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTggewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85ODFmYjkwMzE3YmI0OGFhYjQ3MmZmNjY1ZTE3MWQ5OCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85ODFmYjkwMzE3YmI0OGFhYjQ3MmZmNjY1ZTE3MWQ5OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNzczMDc3LC03OS4yNTc3NzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzhmNTg4OWY5OTlkODQwNzBiMzc2OWQ1OThlMWMzMTcyID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZWQzYjFmMzhjOTU0ZTQ3ODY3YTdmNTBmZmMyNGVlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjkyZDZhOGI1MzMyNDBlNzgxYjY0YjdjNDExZDJhOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjBkMWVmZDU5NDMwNGI0NjlmOTBjYjhlNzY0NGUzZTkgPSAkKCc8ZGl2IGlkPSJodG1sXzIwZDFlZmQ1OTQzMDRiNDY5ZjkwY2I4ZTc2NDRlM2U5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSxNYWx2ZXJuIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjkyZDZhOGI1MzMyNDBlNzgxYjY0YjdjNDExZDJhOGEuc2V0Q29udGVudChodG1sXzIwZDFlZmQ1OTQzMDRiNDY5ZjkwY2I4ZTc2NDRlM2U5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlZDNiMWYzOGM5NTRlNDc4NjdhN2Y1MGZmYzI0ZWViLmJpbmRQb3B1cChwb3B1cF82OTJkNmE4YjUzMzI0MGU3ODFiNjRiN2M0MTFkMmE4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNDg0YWJmYTMyZmM0ODVkYjYxMTg1ZWFiYzYyZWU2NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDUzNTEsLTc5LjE2MDQ5NzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1YTBlYWY3Nzg0MTQ2Mjk5M2Q1ODk5ZGRhYzA1NmU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmYjk1Njk1YTA2ODRhNDFhYTIyN2M0ZjI2MGJjYjkxID0gJCgnPGRpdiBpZD0iaHRtbF85ZmI5NTY5NWEwNjg0YTQxYWEyMjdjNGYyNjBiY2I5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmQgQ3JlZWssUm91Z2UgSGlsbCxQb3J0IFVuaW9uIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODVhMGVhZjc3ODQxNDYyOTkzZDU4OTlkZGFjMDU2ZTUuc2V0Q29udGVudChodG1sXzlmYjk1Njk1YTA2ODRhNDFhYTIyN2M0ZjI2MGJjYjkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM0ODRhYmZhMzJmYzQ4NWRiNjExODVlYWJjNjJlZTY3LmJpbmRQb3B1cChwb3B1cF84NWEwZWFmNzc4NDE0NjI5OTNkNTg5OWRkYWMwNTZlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMzBkYWI5ZTQxYzA0NDA0YTJjZjY5NjcwMzcwY2EwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MzU3MjYsLTc5LjE4ODcxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzI0ODMxNzI2MDZhNGMzNDg4NWIzZDE4Y2Y0MTRjOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFmM2FmY2ZmZTcyNDM3ZGI5Y2I4OGUwYzIwMzkyOTYgPSAkKCc8ZGl2IGlkPSJodG1sXzVhZjNhZmNmZmU3MjQzN2RiOWNiODhlMGMyMDM5Mjk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HdWlsZHdvb2QsTW9ybmluZ3NpZGUsV2VzdCBIaWxsIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzI0ODMxNzI2MDZhNGMzNDg4NWIzZDE4Y2Y0MTRjOWMuc2V0Q29udGVudChodG1sXzVhZjNhZmNmZmU3MjQzN2RiOWNiODhlMGMyMDM5Mjk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzMGRhYjllNDFjMDQ0MDRhMmNmNjk2NzAzNzBjYTAxLmJpbmRQb3B1cChwb3B1cF8zMjQ4MzE3MjYwNmE0YzM0ODg1YjNkMThjZjQxNGM5Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjBjZWZlZGE1YWE0ZWQ4YTUzZjVlZTBjNTA0ZTM4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3ZjRmZTJjYmY3MzQyNDM4ODVjZWNiYzQzMTcyYjgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1Mzc3N2E0NDY2YTRhNWJhMDhmMTE1YWM5ZTZiYTNiID0gJCgnPGRpdiBpZD0iaHRtbF9lNTM3NzdhNDQ2NmE0YTViYTA4ZjExNWFjOWU2YmEzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdmNGZlMmNiZjczNDI0Mzg4NWNlY2JjNDMxNzJiODAuc2V0Q29udGVudChodG1sX2U1Mzc3N2E0NDY2YTRhNWJhMDhmMTE1YWM5ZTZiYTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RmMGNlZmVkYTVhYTRlZDhhNTNmNWVlMGM1MDRlMzhmLmJpbmRQb3B1cChwb3B1cF9jN2Y0ZmUyY2JmNzM0MjQzODg1Y2VjYmM0MzE3MmI4MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMjhmNjI5MDhkZDk0NjZhOWNkNjY2YzJmMmU0ODQ0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MzEzNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRiNjYzZDA0MmY3NDY2NDhkODdjZTBmZjRlMDQ2MTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTJhNTVmMGM5MzFjNDAxYjkzNDBkNTNmMjE5MDU4ZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzEyYTU1ZjBjOTMxYzQwMWI5MzQwZDUzZjIxOTA1OGYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZWRhcmJyYWUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZGI2NjNkMDQyZjc0NjY0OGQ4N2NlMGZmNGUwNDYxNy5zZXRDb250ZW50KGh0bWxfMTJhNTVmMGM5MzFjNDAxYjkzNDBkNTNmMjE5MDU4ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI4ZjYyOTA4ZGQ5NDY2YTljZDY2NmMyZjJlNDg0NGIuYmluZFBvcHVwKHBvcHVwXzZkYjY2M2QwNDJmNzQ2NjQ4ZDg3Y2UwZmY0ZTA0NjE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjNWU0MmUwMGQzMzQzODJiMDdiOTViNTg0MGVlMDFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWY2MzYzYjdhYTY2NGNhYzkyODIxNTIxOWJkNTU4NDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODk5ODFlYjJiM2QyNDVmOWE1MmUyNDQ0NWFjMWZjNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzg5OTgxZWIyYjNkMjQ1ZjlhNTJlMjQ0NDVhYzFmYzZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWY2MzYzYjdhYTY2NGNhYzkyODIxNTIxOWJkNTU4NDUuc2V0Q29udGVudChodG1sXzg5OTgxZWIyYjNkMjQ1ZjlhNTJlMjQ0NDVhYzFmYzZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjNWU0MmUwMGQzMzQzODJiMDdiOTViNTg0MGVlMDFiLmJpbmRQb3B1cChwb3B1cF8xZjYzNjNiN2FhNjY0Y2FjOTI4MjE1MjE5YmQ1NTg0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOGY1ZTJkNzdlMTU0YjNjYThlMzNiMDI3YTY3MTk1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0YjJmODVmMzIxNjQ0ZmFiYjUxZjAyZGQ0MTAzYTU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwYjQ0MmYxMzJiYTRiMDFiMWMwNzZmODNjNzY4YzU4ID0gJCgnPGRpdiBpZD0iaHRtbF9lMGI0NDJmMTMyYmE0YjAxYjFjMDc2ZjgzYzc2OGM1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBCaXJjaG1vdW50IFBhcmssSW9udmlldyxLZW5uZWR5IFBhcmsgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNGIyZjg1ZjMyMTY0NGZhYmI1MWYwMmRkNDEwM2E1OS5zZXRDb250ZW50KGh0bWxfZTBiNDQyZjEzMmJhNGIwMWIxYzA3NmY4M2M3NjhjNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMThmNWUyZDc3ZTE1NGIzY2E4ZTMzYjAyN2E2NzE5NTAuYmluZFBvcHVwKHBvcHVwXzI0YjJmODVmMzIxNjQ0ZmFiYjUxZjAyZGQ0MTAzYTU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliOWQzNmRlMjQ3NzQwODlhNzFiYWI3OTdhYzEzM2QxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNzM2NDEwMTliMTRlOWVhMGE5OWQzZGYzYzExNTI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3OTljMTBlYTY4MjQxZDk5MzdlNTcxZmU3MmQzNzE5ID0gJCgnPGRpdiBpZD0iaHRtbF84Nzk5YzEwZWE2ODI0MWQ5OTM3ZTU3MWZlNzJkMzcxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEsR29sZGVuIE1pbGUsT2FrcmlkZ2UgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTczNjQxMDE5YjE0ZTllYTBhOTlkM2RmM2MxMTUyOS5zZXRDb250ZW50KGh0bWxfODc5OWMxMGVhNjgyNDFkOTkzN2U1NzFmZTcyZDM3MTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWI5ZDM2ZGUyNDc3NDA4OWE3MWJhYjc5N2FjMTMzZDEuYmluZFBvcHVwKHBvcHVwX2NhNzM2NDEwMTliMTRlOWVhMGE5OWQzZGYzYzExNTI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzZTZmNmFjNjgyNDQxNzdiMmVmZTA2NjZhNGMzNjkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE2MzE2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODFmYjkwMzE3YmI0OGFhYjQ3MmZmNjY1ZTE3MWQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YTMwZjgwNmY2OGQ0MDRiYWRkNTQ4ZWEzZWIyYjU2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNzIzZmM4NjIxMGU0ODhkOWFjYzYzMzY3ZTk1NjU0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjcyM2ZjODYyMTBlNDg4ZDlhY2M2MzM2N2U5NTY1NDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsaWZmY3Jlc3QsQ2xpZmZzaWRlLFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhMzBmODA2ZjY4ZDQwNGJhZGQ1NDhlYTNlYjJiNTY1LnNldENvbnRlbnQoaHRtbF8yNzIzZmM4NjIxMGU0ODhkOWFjYzYzMzY3ZTk1NjU0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82M2U2ZjZhYzY4MjQ0MTc3YjJlZmUwNjY2YTRjMzY5My5iaW5kUG9wdXAocG9wdXBfNGEzMGY4MDZmNjhkNDA0YmFkZDU0OGVhM2ViMmI1NjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmEzZGM0OGRiY2FjNGFlOGE5YzZiNDgxZDk1MDZmNWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIyMjkyZDQyYWFmNGIyNjlmODJkOTExNThlNjY1MzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODk0MGNiMGY2ZDVhNGIwNGExZGNlOWE3NjRhNmI3MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzg5NDBjYjBmNmQ1YTRiMDRhMWRjZTlhNzY0YTZiNzExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaXJjaCBDbGlmZixDbGlmZnNpZGUgV2VzdCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiMjI5MmQ0MmFhZjRiMjY5ZjgyZDkxMTU4ZTY2NTM5LnNldENvbnRlbnQoaHRtbF84OTQwY2IwZjZkNWE0YjA0YTFkY2U5YTc2NGE2YjcxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTNkYzQ4ZGJjYWM0YWU4YTljNmI0ODFkOTUwNmY1YS5iaW5kUG9wdXAocG9wdXBfZGIyMjkyZDQyYWFmNGIyNjlmODJkOTExNThlNjY1MzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmZlNWEwYjY3NTg5NDFlMThmYzJmN2Q5NDQyNzFiN2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0MDk2LC03OS4yNzMzMDQwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODFmYjkwMzE3YmI0OGFhYjQ3MmZmNjY1ZTE3MWQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTUwMzlkNTQxMmY0MDJiYjczOGRjMDY0OTU4MzJhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmRlNjRmMjY5NjI0OTZhYmQ1NDY5NzJiZGI3NGJkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODJkZTY0ZjI2OTYyNDk2YWJkNTQ2OTcyYmRiNzRiZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvcnNldCBQYXJrLFNjYXJib3JvdWdoIFRvd24gQ2VudHJlLFdleGZvcmQgSGVpZ2h0cyBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5NTAzOWQ1NDEyZjQwMmJiNzM4ZGMwNjQ5NTgzMmFhLnNldENvbnRlbnQoaHRtbF84MmRlNjRmMjY5NjI0OTZhYmQ1NDY5NzJiZGI3NGJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZmU1YTBiNjc1ODk0MWUxOGZjMmY3ZDk0NDI3MWI3YS5iaW5kUG9wdXAocG9wdXBfNzk1MDM5ZDU0MTJmNDAyYmI3MzhkYzA2NDk1ODMyYWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzZhMGQzZGE1MzBhNDNlYjljN2FiMjQ0OGMzZTlkNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTAwNzE1MDAwMDAwMDQsLTc5LjI5NTg0OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RkNTA5ZmE4NDlkNGViZWE5OGRmNWQzZWE4MTlmZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjcyYWUyNTgyNjZmNGZjYmFkZGZmMGJjZTcxNjIwM2QgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3MmFlMjU4MjY2ZjRmY2JhZGRmZjBiY2U3MTYyMDNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSxXZXhmb3JkIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RkNTA5ZmE4NDlkNGViZWE5OGRmNWQzZWE4MTlmZGEuc2V0Q29udGVudChodG1sX2Y3MmFlMjU4MjY2ZjRmY2JhZGRmZjBiY2U3MTYyMDNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc2YTBkM2RhNTMwYTQzZWI5YzdhYjI0NDhjM2U5ZDYzLmJpbmRQb3B1cChwb3B1cF83ZGQ1MDlmYTg0OWQ0ZWJlYTk4ZGY1ZDNlYTgxOWZkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YzI3MjkzMGM0NmY0MjU3YWY0NWNkNTI3NzYyMzcxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxMjI5ZmJlODUyMzRjMjdiM2YzYjg2NjdmMzQzMjI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmMTkzMDUxMjU5ODQ2MTc5Nzk0ZGY4YTZhNzQzNzY3ID0gJCgnPGRpdiBpZD0iaHRtbF9jZjE5MzA1MTI1OTg0NjE3OTc5NGRmOGE2YTc0Mzc2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTEyMjlmYmU4NTIzNGMyN2IzZjNiODY2N2YzNDMyMjkuc2V0Q29udGVudChodG1sX2NmMTkzMDUxMjU5ODQ2MTc5Nzk0ZGY4YTZhNzQzNzY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljMjcyOTMwYzQ2ZjQyNTdhZjQ1Y2Q1Mjc3NjIzNzE3LmJpbmRQb3B1cChwb3B1cF81MTIyOWZiZTg1MjM0YzI3YjNmM2I4NjY3ZjM0MzIyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTJhNzEyNzQ4NzA0ZjRmODQ5NTVlYzkzNDc5NTU1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTgxZmI5MDMxN2JiNDhhYWI0NzJmZjY2NWUxNzFkOTgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTY4Y2Y0YTA2ZWEyNGJjN2FhOWVjNGIyOGNhM2M0NDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWMzYzA5M2JiYjQ2NDllZGI4Y2RlOTgzZTJlMTA1NzggPSAkKCc8ZGl2IGlkPSJodG1sXzljM2MwOTNiYmI0NjQ5ZWRiOGNkZTk4M2UyZTEwNTc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycyxTdWxsaXZhbixUYW0gTyYjMzk7U2hhbnRlciBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2OGNmNGEwNmVhMjRiYzdhYTllYzRiMjhjYTNjNDQxLnNldENvbnRlbnQoaHRtbF85YzNjMDkzYmJiNDY0OWVkYjhjZGU5ODNlMmUxMDU3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OTJhNzEyNzQ4NzA0ZjRmODQ5NTVlYzkzNDc5NTU1MC5iaW5kUG9wdXAocG9wdXBfMTY4Y2Y0YTA2ZWEyNGJjN2FhOWVjNGIyOGNhM2M0NDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmVlMjFkMzM1ODdjNDNlYmFmZTBmODQ2OWM1OTA0MjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4MWZiOTAzMTdiYjQ4YWFiNDcyZmY2NjVlMTcxZDk4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhODhiYmYwYWFkNDRiMDQ4YzE1MDBjZGU1MWVlNWU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzOTRjMWUwYTdkNjQ4MTU4ZTFlYWM5OTBjODBkMGJkID0gJCgnPGRpdiBpZD0iaHRtbF81Mzk0YzFlMGE3ZDY0ODE1OGUxZWFjOTkwYzgwZDBiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLEwmIzM5O0Ftb3JlYXV4IEVhc3QsTWlsbGlrZW4sU3RlZWxlcyBFYXN0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE4OGJiZjBhYWQ0NGIwNDhjMTUwMGNkZTUxZWU1ZTkuc2V0Q29udGVudChodG1sXzUzOTRjMWUwYTdkNjQ4MTU4ZTFlYWM5OTBjODBkMGJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlZTIxZDMzNTg3YzQzZWJhZmUwZjg0NjljNTkwNDI1LmJpbmRQb3B1cChwb3B1cF9kYTg4YmJmMGFhZDQ0YjA0OGMxNTAwY2RlNTFlZTVlOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNmU2MWU5NzIwNWQ0ZjAzYWE3N2RmMzk3ZjliY2I4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODFmYjkwMzE3YmI0OGFhYjQ3MmZmNjY1ZTE3MWQ5OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZWI2ZGYzZTJiMzg0ODUzOTdiY2E0MTI4NTY3OWU3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYWZkYjQyNTgyZjU0ZmU5OTcxOTg1ZTY3YTE1MTBmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWFmZGI0MjU4MmY1NGZlOTk3MTk4NWU2N2ExNTEwZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkwmIzM5O0Ftb3JlYXV4IFdlc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZWI2ZGYzZTJiMzg0ODUzOTdiY2E0MTI4NTY3OWU3NC5zZXRDb250ZW50KGh0bWxfMWFmZGI0MjU4MmY1NGZlOTk3MTk4NWU2N2ExNTEwZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZlNjFlOTcyMDVkNGYwM2FhNzdkZjM5N2Y5YmNiOGMuYmluZFBvcHVwKHBvcHVwX2NlYjZkZjNlMmIzODQ4NTM5N2JjYTQxMjg1Njc5ZTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb8bc2affd0>" | |
| ] | |
| }, | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map\n", | |
| "map_clusters = folium.Map(location=[latitude, longitude], zoom_start=11)\n", | |
| "\n", | |
| "# set color scheme for the clusters\n", | |
| "x = np.arange(kclusters)\n", | |
| "ys = [i+x+(i*x)**2 for i in range(kclusters)]\n", | |
| "colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n", | |
| "rainbow = [colors.rgb2hex(i) for i in colors_array]\n", | |
| "\n", | |
| "# add markers to the map\n", | |
| "markers_colors = []\n", | |
| "for lat, lon, poi, cluster in zip(scarborough_merged['Latitude'], scarborough_merged['Longitude'], scarborough_merged['Neighborhood'], scarborough_merged['Cluster Labels']):\n", | |
| " label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lon],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color=rainbow[cluster-1],\n", | |
| " fill=True,\n", | |
| " fill_color=rainbow[cluster-1],\n", | |
| " fill_opacity=0.7).add_to(map_clusters)\n", | |
| " \n", | |
| "map_clusters" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 5. Examine Scarborough Neighborhood Cluster" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Now, you can examine each cluster and determine the discriminating venue categories that distinguish each cluster. Based on the defining categories, you can then assign a name to each cluster." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Scarborough Clusters 0, 1, 2" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "scarborough_cluster_0 = scarborough_merged.loc[scarborough_merged['Cluster Labels'] == 0, scarborough_merged.columns[[1] + list(range(4, scarborough_merged.shape[1]))]]\n", | |
| "\n", | |
| "scarborough_cluster_1 = scarborough_merged.loc[scarborough_merged['Cluster Labels'] == 1, scarborough_merged.columns[[1] + list(range(4, scarborough_merged.shape[1]))]]\n", | |
| "\n", | |
| "scarborough_cluster_2 = scarborough_merged.loc[scarborough_merged['Cluster Labels'] == 2, scarborough_merged.columns[[1] + list(range(4, scarborough_merged.shape[1]))]]\n", | |
| "\n", | |
| "\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 32, | |
| "metadata": {}, | |
| "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>Borough</th>\n", | |
| " <th>Longitude</th>\n", | |
| " <th>Cluster Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.284577</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Longitude Cluster Labels 1st Most Common Venue \\\n", | |
| "14 Scarborough -79.284577 0 Park \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "14 Asian Restaurant Playground Vietnamese Restaurant \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "14 General Entertainment Fried Chicken Joint Fast Food Restaurant \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "14 Electronics Store Discount Store Department Store " | |
| ] | |
| }, | |
| "execution_count": 32, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_cluster_0" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 33, | |
| "metadata": {}, | |
| "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>Borough</th>\n", | |
| " <th>Longitude</th>\n", | |
| " <th>Cluster Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Print Shop</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Construction & Landscaping</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Tech Startup</td>\n", | |
| " <td>Spa</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Medical Center</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Rental Car Location</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Korean Restaurant</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Hakka Restaurant</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.284577</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bus Line</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Soccer Field</td>\n", | |
| " <td>Bus Station</td>\n", | |
| " <td>Metro Station</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Motel</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.264848</td>\n", | |
| " <td>1</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.273304</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Latin American Restaurant</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Pet Store</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.295849</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Auto Garage</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Shopping Mall</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>College Stadium</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.262029</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.304302</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Noodle House</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.318389</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Thrift / Vintage Store</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Longitude Cluster Labels 1st Most Common Venue \\\n", | |
| "0 Scarborough -79.194353 1 Fast Food Restaurant \n", | |
| "1 Scarborough -79.160497 1 Bar \n", | |
| "2 Scarborough -79.188711 1 Intersection \n", | |
| "3 Scarborough -79.216917 1 Coffee Shop \n", | |
| "4 Scarborough -79.239476 1 Caribbean Restaurant \n", | |
| "5 Scarborough -79.239476 1 Playground \n", | |
| "7 Scarborough -79.284577 1 Bakery \n", | |
| "8 Scarborough -79.239476 1 Motel \n", | |
| "9 Scarborough -79.264848 1 General Entertainment \n", | |
| "10 Scarborough -79.273304 1 Indian Restaurant \n", | |
| "11 Scarborough -79.295849 1 Middle Eastern Restaurant \n", | |
| "12 Scarborough -79.262029 1 Lounge \n", | |
| "13 Scarborough -79.304302 1 Pizza Place \n", | |
| "15 Scarborough -79.318389 1 Chinese Restaurant \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue \\\n", | |
| "0 Print Shop Vietnamese Restaurant \n", | |
| "1 Construction & Landscaping Vietnamese Restaurant \n", | |
| "2 Breakfast Spot Mexican Restaurant \n", | |
| "3 Korean Restaurant Convenience Store \n", | |
| "4 Thai Restaurant Athletics & Sports \n", | |
| "5 Vietnamese Restaurant Chinese Restaurant \n", | |
| "7 Bus Line Intersection \n", | |
| "8 American Restaurant Coffee Shop \n", | |
| "9 Skating Rink Café \n", | |
| "10 Chinese Restaurant Latin American Restaurant \n", | |
| "11 Auto Garage Bakery \n", | |
| "12 Sandwich Place Breakfast Spot \n", | |
| "13 Noodle House Thai Restaurant \n", | |
| "15 Fast Food Restaurant Coffee Shop \n", | |
| "\n", | |
| " 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue \\\n", | |
| "0 Chinese Restaurant Grocery Store General Entertainment \n", | |
| "1 Coffee Shop Grocery Store General Entertainment \n", | |
| "2 Tech Startup Spa Electronics Store \n", | |
| "3 Vietnamese Restaurant Grocery Store General Entertainment \n", | |
| "4 Fried Chicken Joint Bakery Bank \n", | |
| "5 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "7 Fast Food Restaurant Soccer Field Bus Station \n", | |
| "8 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "9 College Stadium Vietnamese Restaurant Coffee Shop \n", | |
| "10 Vietnamese Restaurant Pet Store Bakery \n", | |
| "11 Shopping Mall Sandwich Place Breakfast Spot \n", | |
| "12 Chinese Restaurant Vietnamese Restaurant Coffee Shop \n", | |
| "13 Fried Chicken Joint Fast Food Restaurant Italian Restaurant \n", | |
| "15 Grocery Store Pharmacy Pizza Place \n", | |
| "\n", | |
| " 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue \\\n", | |
| "0 Fried Chicken Joint Electronics Store Discount Store \n", | |
| "1 Fried Chicken Joint Fast Food Restaurant Electronics Store \n", | |
| "2 Medical Center Pizza Place Rental Car Location \n", | |
| "3 Fried Chicken Joint Fast Food Restaurant Electronics Store \n", | |
| "4 Lounge Hakka Restaurant College Stadium \n", | |
| "5 Fast Food Restaurant Electronics Store Discount Store \n", | |
| "7 Metro Station Park College Stadium \n", | |
| "8 Fast Food Restaurant Electronics Store Discount Store \n", | |
| "9 Grocery Store Fried Chicken Joint Fast Food Restaurant \n", | |
| "10 Grocery Store General Entertainment Fried Chicken Joint \n", | |
| "11 Vietnamese Restaurant College Stadium General Entertainment \n", | |
| "12 General Entertainment Fried Chicken Joint Fast Food Restaurant \n", | |
| "13 Bank Chinese Restaurant Pharmacy \n", | |
| "15 Breakfast Spot American Restaurant Thrift / Vintage Store \n", | |
| "\n", | |
| " 10th Most Common Venue \n", | |
| "0 Department Store \n", | |
| "1 Discount Store \n", | |
| "2 College Stadium \n", | |
| "3 Discount Store \n", | |
| "4 General Entertainment \n", | |
| "5 Department Store \n", | |
| "7 General Entertainment \n", | |
| "8 Department Store \n", | |
| "9 Electronics Store \n", | |
| "10 Asian Restaurant \n", | |
| "11 Fried Chicken Joint \n", | |
| "12 Electronics Store \n", | |
| "13 Coffee Shop \n", | |
| "15 Sandwich Place " | |
| ] | |
| }, | |
| "execution_count": 33, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_cluster_1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 34, | |
| "metadata": {}, | |
| "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>Borough</th>\n", | |
| " <th>Longitude</th>\n", | |
| " <th>Cluster Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>-79.262029</td>\n", | |
| " <td>2</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Department Store</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Longitude Cluster Labels 1st Most Common Venue \\\n", | |
| "6 Scarborough -79.262029 2 Discount Store \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "6 Department Store Playground Coffee Shop \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "6 Vietnamese Restaurant Chinese Restaurant Grocery Store \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "6 General Entertainment Fried Chicken Joint Fast Food Restaurant " | |
| ] | |
| }, | |
| "execution_count": 34, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "scarborough_cluster_2" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 6. Explore New York City Neighborhoods" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "New York City has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n", | |
| "\n", | |
| "Luckily, this dataset exists for free on the web. The link to the dataset: https://geo.nyu.edu/catalog/nyu_2451_34572" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 35, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Data downloaded!\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "!wget -q -O 'newyork_data.json' https://ibm.box.com/shared/static/fbpwbovar7lf8p5sgddm06cgipa2rxpe.json\n", | |
| "print('Data downloaded!')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Load and explore dataset" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 36, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with open('newyork_data.json') as json_data:\n", | |
| " newyork_data = json.load(json_data)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Notice how all the relevant data is in the *features* key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 37, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "neighborhoods_data = newyork_data['features']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 38, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.1',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84720052054902, 40.89470517661]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Wakefield',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Wakefield',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84720052054902,\n", | |
| " 40.89470517661,\n", | |
| " -73.84720052054902,\n", | |
| " 40.89470517661]}}" | |
| ] | |
| }, | |
| "execution_count": 38, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods_data[0]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Transform the data into a pandas dataframe" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 39, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# define the dataframe columns\n", | |
| "column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n", | |
| "\n", | |
| "# instantiate the dataframe\n", | |
| "neighborhoods = pd.DataFrame(columns=column_names)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 40, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "for data in neighborhoods_data:\n", | |
| " borough = neighborhood_name = data['properties']['borough'] \n", | |
| " neighborhood_name = data['properties']['name']\n", | |
| " \n", | |
| " neighborhood_latlon = data['geometry']['coordinates']\n", | |
| " neighborhood_lat = neighborhood_latlon[1]\n", | |
| " neighborhood_lon = neighborhood_latlon[0]\n", | |
| " \n", | |
| " neighborhoods = neighborhoods.append({'Borough': borough,\n", | |
| " 'Neighborhood': neighborhood_name,\n", | |
| " 'Latitude': neighborhood_lat,\n", | |
| " 'Longitude': neighborhood_lon}, ignore_index=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "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>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Wakefield</td>\n", | |
| " <td>40.894705</td>\n", | |
| " <td>-73.847201</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Co-op City</td>\n", | |
| " <td>40.874294</td>\n", | |
| " <td>-73.829939</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Eastchester</td>\n", | |
| " <td>40.887556</td>\n", | |
| " <td>-73.827806</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Fieldston</td>\n", | |
| " <td>40.895437</td>\n", | |
| " <td>-73.905643</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Riverdale</td>\n", | |
| " <td>40.890834</td>\n", | |
| " <td>-73.912585</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Neighborhood Latitude Longitude\n", | |
| "0 Bronx Wakefield 40.894705 -73.847201\n", | |
| "1 Bronx Co-op City 40.874294 -73.829939\n", | |
| "2 Bronx Eastchester 40.887556 -73.827806\n", | |
| "3 Bronx Fieldston 40.895437 -73.905643\n", | |
| "4 Bronx Riverdale 40.890834 -73.912585" | |
| ] | |
| }, | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(306, 4)" | |
| ] | |
| }, | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 43, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The dataframe has 5 boroughs and 306 neighborhoods.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n", | |
| " len(neighborhoods['Borough'].unique()),\n", | |
| " neighborhoods.shape[0]\n", | |
| " )\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Use Geolibrary to get the latitude and longitude of New York City" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 44, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of New York City are 40.7127281, -74.0060152.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'New York City, NY'\n", | |
| "\n", | |
| "geolocator = Nominatim(user_agent = 'my-application')\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 45, | |
| "metadata": {}, | |
| "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+ICNtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5MiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZTM1ZDJhOTI4MDI3NGIwY2FjZTU5ODFhN2UxYzI4M2EgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwN2JkODZjODYyMzQ3NTk5NTY5ZDQzZWJiZTg2ZGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzYmY3ODNkYzZkYzRjMjc4YWVlNjdhZWMyMzY2YTJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiYmU1YjVhNTE4MjQxZmVhM2NhNmIxMjM3NDQ3Yzg0ID0gJCgnPGRpdiBpZD0iaHRtbF84YmJlNWI1YTUxODI0MWZlYTNjYTZiMTIzNzQ0N2M4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjNiZjc4M2RjNmRjNGMyNzhhZWU2N2FlYzIzNjZhMmEuc2V0Q29udGVudChodG1sXzhiYmU1YjVhNTE4MjQxZmVhM2NhNmIxMjM3NDQ3Yzg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwN2JkODZjODYyMzQ3NTk5NTY5ZDQzZWJiZTg2ZGFkLmJpbmRQb3B1cChwb3B1cF8yM2JmNzgzZGM2ZGM0YzI3OGFlZTY3YWVjMjM2NmEyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNTA5NmQ3NWRkMzk0ZWE3OTQ0MjQ0Y2RlZGQ5NDhmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjc3MTU1NjI2Y2Y0YzQ2OGU3YjNiZDE1NzZiNGRjZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTM5MjJjM2FjYjE0NTMzYmE4Nzc3MDlmYzM4N2U1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmUzOTIyYzNhY2IxNDUzM2JhODc3NzA5ZmMzODdlNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjc3MTU1NjI2Y2Y0YzQ2OGU3YjNiZDE1NzZiNGRjZS5zZXRDb250ZW50KGh0bWxfYmUzOTIyYzNhY2IxNDUzM2JhODc3NzA5ZmMzODdlNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjUwOTZkNzVkZDM5NGVhNzk0NDI0NGNkZWRkOTQ4ZmUuYmluZFBvcHVwKHBvcHVwXzAyNzcxNTU2MjZjZjRjNDY4ZTdiM2JkMTU3NmI0ZGNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjOTc3ODc4MDA0MjQ2MTA4NmQzYzE0MzBlMjZiMDJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTcxN2JjNTJhODM0YjY3OTY3NWYyOTVmYzFiZmFhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzgwZWEwYjhkZjA0MGZjODJjYTRkNWYwY2I3NmRlMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjM4MGVhMGI4ZGYwNDBmYzgyY2E0ZDVmMGNiNzZkZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzk3MTdiYzUyYTgzNGI2Nzk2NzVmMjk1ZmMxYmZhYTguc2V0Q29udGVudChodG1sX2IzODBlYTBiOGRmMDQwZmM4MmNhNGQ1ZjBjYjc2ZGUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjOTc3ODc4MDA0MjQ2MTA4NmQzYzE0MzBlMjZiMDJjLmJpbmRQb3B1cChwb3B1cF83OTcxN2JjNTJhODM0YjY3OTY3NWYyOTVmYzFiZmFhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDI5ZGMyZTE0ZGE0ZTM3OTc0MGY2M2JiMGMyMDIxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYWU1ZjUzYTM0Zjg0YmNiODYxZWZmMWQzOTYzNDcyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OWRlODkyMDFkOTc0NWIwYmMxMTcyOThhYWJmNzZjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzlkZTg5MjAxZDk3NDViMGJjMTE3Mjk4YWFiZjc2YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhZTVmNTNhMzRmODRiY2I4NjFlZmYxZDM5NjM0NzJjLnNldENvbnRlbnQoaHRtbF83OWRlODkyMDFkOTc0NWIwYmMxMTcyOThhYWJmNzZjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDI5ZGMyZTE0ZGE0ZTM3OTc0MGY2M2JiMGMyMDIxNy5iaW5kUG9wdXAocG9wdXBfYWFlNWY1M2EzNGY4NGJjYjg2MWVmZjFkMzk2MzQ3MmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjgzOWNjNGM3ZTMzNDk2ZGE1ZjI1NmYyNmNhZThjZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTEwOTY1Y2EwZDE4NDdjNTk5MTM3MjMzMDBkMjc0NTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDcwNTdhZDZjNTRlNDBjZWIyZmY2Yjk4NGExMzk2N2UgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3MDU3YWQ2YzU0ZTQwY2ViMmZmNmI5ODRhMTM5NjdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTA5NjVjYTBkMTg0N2M1OTkxMzcyMzMwMGQyNzQ1My5zZXRDb250ZW50KGh0bWxfZDcwNTdhZDZjNTRlNDBjZWIyZmY2Yjk4NGExMzk2N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjgzOWNjNGM3ZTMzNDk2ZGE1ZjI1NmYyNmNhZThjZjQuYmluZFBvcHVwKHBvcHVwX2UxMDk2NWNhMGQxODQ3YzU5OTEzNzIzMzAwZDI3NDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhMTBlMjQyZTI0ODRjYTdhMzQ1NzRiMTVlMjYwNTliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmNjFkZWUwOGJhYTRlOWQ4YjRkMjc5ZmYzYzk3MzU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NzdjNDRmMmQ1NzQxMDU5MzAwOWZiODdlNTE0MWRmID0gJCgnPGRpdiBpZD0iaHRtbF8zNzc3YzQ0ZjJkNTc0MTA1OTMwMDlmYjg3ZTUxNDFkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjYxZGVlMDhiYWE0ZTlkOGI0ZDI3OWZmM2M5NzM1Ni5zZXRDb250ZW50KGh0bWxfMzc3N2M0NGYyZDU3NDEwNTkzMDA5ZmI4N2U1MTQxZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ExMGUyNDJlMjQ4NGNhN2EzNDU3NGIxNWUyNjA1OWIuYmluZFBvcHVwKHBvcHVwXzJmNjFkZWUwOGJhYTRlOWQ4YjRkMjc5ZmYzYzk3MzU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzODcyNGI2NmJmMjQyZWM5YWFjYzNkMjBmN2U3YWNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkYmY0MTI5OTE2MDQ2NzI4ZTY1M2VkOGQyNDQ1YThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxNTE5NzcwMWM3ZTRjNmNhMDRmZjQxNGZiMmRlOGRhID0gJCgnPGRpdiBpZD0iaHRtbF9jMTUxOTc3MDFjN2U0YzZjYTA0ZmY0MTRmYjJkZThkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2RiZjQxMjk5MTYwNDY3MjhlNjUzZWQ4ZDI0NDVhOGYuc2V0Q29udGVudChodG1sX2MxNTE5NzcwMWM3ZTRjNmNhMDRmZjQxNGZiMmRlOGRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzODcyNGI2NmJmMjQyZWM5YWFjYzNkMjBmN2U3YWNiLmJpbmRQb3B1cChwb3B1cF9jZGJmNDEyOTkxNjA0NjcyOGU2NTNlZDhkMjQ0NWE4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDQ3ZTI2MmU0MzY0MzhlYjI4ODhmMjdjZjhlNjgzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMmUxZDQ1NTFjNGM0OTJkODVjNzljNzkwOTNlOWFmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MzhiZmVkMDQ0MGU0YjYxYWYzYzk3YTA3MTkzNjc3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzM4YmZlZDA0NDBlNGI2MWFmM2M5N2EwNzE5MzY3NzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJlMWQ0NTUxYzRjNDkyZDg1Yzc5Yzc5MDkzZTlhZjguc2V0Q29udGVudChodG1sXzczOGJmZWQwNDQwZTRiNjFhZjNjOTdhMDcxOTM2NzcxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwNDdlMjYyZTQzNjQzOGViMjg4OGYyN2NmOGU2ODM4LmJpbmRQb3B1cChwb3B1cF8wMmUxZDQ1NTFjNGM0OTJkODVjNzljNzkwOTNlOWFmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTY5M2I4ZWJlNjM0ZjA3YWVkNjk1MGRlMDAwYjVlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlZjY0NjA5MTFhYzRiMzg4MDEyM2MyODFkYWM4YzY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhYmM1NDVhNTkyODQ2MjBhYTNkZjVkNjUzODFlYmEyID0gJCgnPGRpdiBpZD0iaHRtbF9jYWJjNTQ1YTU5Mjg0NjIwYWEzZGY1ZDY1MzgxZWJhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlZjY0NjA5MTFhYzRiMzg4MDEyM2MyODFkYWM4YzY4LnNldENvbnRlbnQoaHRtbF9jYWJjNTQ1YTU5Mjg0NjIwYWEzZGY1ZDY1MzgxZWJhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYTY5M2I4ZWJlNjM0ZjA3YWVkNjk1MGRlMDAwYjVlMC5iaW5kUG9wdXAocG9wdXBfOGVmNjQ2MDkxMWFjNGIzODgwMTIzYzI4MWRhYzhjNjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2Y5OTM4NTZiNWYxNDM3NTk1OWMwMTljNWZlNWM2YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFmNTIzZDJhYTY0NGM0NWI1YjZlZDIzZDI2M2RmYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWUxODdiYjE2YjlmNDhhZWJmNTgwYmZhY2UzMDFiMzEgPSAkKCc8ZGl2IGlkPSJodG1sX2VlMTg3YmIxNmI5ZjQ4YWViZjU4MGJmYWNlMzAxYjMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxZjUyM2QyYWE2NDRjNDViNWI2ZWQyM2QyNjNkZmFlLnNldENvbnRlbnQoaHRtbF9lZTE4N2JiMTZiOWY0OGFlYmY1ODBiZmFjZTMwMWIzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZjk5Mzg1NmI1ZjE0Mzc1OTU5YzAxOWM1ZmU1YzZhNi5iaW5kUG9wdXAocG9wdXBfYzFmNTIzZDJhYTY0NGM0NWI1YjZlZDIzZDI2M2RmYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGFjMjI0ZmI5YWZjNDdlN2E4M2M2N2JlNTY4ZjUzZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5MzgwNjEzYTYzOTRlODBiNjI2OWFhMWE3NThlNjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2ZGVhM2UwNGE1NjQzN2JiMWQ0MTNlNDZhMzMyYzFmID0gJCgnPGRpdiBpZD0iaHRtbF9iNmRlYTNlMDRhNTY0MzdiYjFkNDEzZTQ2YTMzMmMxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5MzgwNjEzYTYzOTRlODBiNjI2OWFhMWE3NThlNjkyLnNldENvbnRlbnQoaHRtbF9iNmRlYTNlMDRhNTY0MzdiYjFkNDEzZTQ2YTMzMmMxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYWMyMjRmYjlhZmM0N2U3YTgzYzY3YmU1NjhmNTNmMS5iaW5kUG9wdXAocG9wdXBfZTkzODA2MTNhNjM5NGU4MGI2MjY5YWExYTc1OGU2OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGE1OTE5Y2Y0ODgxNGQ5Y2IwMjNmODZjYmQ1NzJjNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQ5ODZjZjM4MzRlNDhlMjgyMTQ5OTIwNjYyOTQ5NDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRlZTVhYzBhYjA3NGUzOTk4NWYwNGRiNWU3NjU2NzYgPSAkKCc8ZGl2IGlkPSJodG1sXzc0ZWU1YWMwYWIwNzRlMzk5ODVmMDRkYjVlNzY1Njc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0OTg2Y2YzODM0ZTQ4ZTI4MjE0OTkyMDY2Mjk0OTQ0LnNldENvbnRlbnQoaHRtbF83NGVlNWFjMGFiMDc0ZTM5OTg1ZjA0ZGI1ZTc2NTY3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTU5MTljZjQ4ODE0ZDljYjAyM2Y4NmNiZDU3MmM3Ny5iaW5kUG9wdXAocG9wdXBfNTQ5ODZjZjM4MzRlNDhlMjgyMTQ5OTIwNjYyOTQ5NDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzZhYTY2Zjk4MTljNDYxMmFkMDJmZjZjMGVlODc0NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTc2MzgzYmExY2VkNGIwNmJjM2VmMDVjYTU1MDliZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWEzZTg3NTZjM2JmNDM0ZjkwYjk1MjIyYzg1MTc3ZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzVhM2U4NzU2YzNiZjQzNGY5MGI5NTIyMmM4NTE3N2QyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3NjM4M2JhMWNlZDRiMDZiYzNlZjA1Y2E1NTA5YmRlLnNldENvbnRlbnQoaHRtbF81YTNlODc1NmMzYmY0MzRmOTBiOTUyMjJjODUxNzdkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNmFhNjZmOTgxOWM0NjEyYWQwMmZmNmMwZWU4NzQ0MS5iaW5kUG9wdXAocG9wdXBfYTc2MzgzYmExY2VkNGIwNmJjM2VmMDVjYTU1MDliZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg0NzAyYmMzMTllNDI0MGJjNDgzYTI1MjIyODE5ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE2ZDNhNGIxZjlmNDllY2IzNDgwNjI3Mzk0NzU1YjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDllYjI0YTBhNjcxNGIzZGJjMGU0ZGE3NTg5NTliOWEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ5ZWIyNGEwYTY3MTRiM2RiYzBlNGRhNzU4OTU5YjlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTZkM2E0YjFmOWY0OWVjYjM0ODA2MjczOTQ3NTViNi5zZXRDb250ZW50KGh0bWxfNDllYjI0YTBhNjcxNGIzZGJjMGU0ZGE3NTg5NTliOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjg0NzAyYmMzMTllNDI0MGJjNDgzYTI1MjIyODE5ZTUuYmluZFBvcHVwKHBvcHVwX2ExNmQzYTRiMWY5ZjQ5ZWNiMzQ4MDYyNzM5NDc1NWI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1MmI3NWYwNzU5NDQwZDlhZTNmZWViNTJhYjg1NjYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQxODljMmNlNTRjNDE2Mzk5M2E1YmVhZTczYTY2ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGU5ZTM2Njg2MjE2NGFlYjhhY2IzMDBiZmE3NGZjODIgPSAkKCc8ZGl2IGlkPSJodG1sX2RlOWUzNjY4NjIxNjRhZWI4YWNiMzAwYmZhNzRmYzgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDE4OWMyY2U1NGM0MTYzOTkzYTViZWFlNzNhNjZmNi5zZXRDb250ZW50KGh0bWxfZGU5ZTM2Njg2MjE2NGFlYjhhY2IzMDBiZmE3NGZjODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTUyYjc1ZjA3NTk0NDBkOWFlM2ZlZWI1MmFiODU2NjEuYmluZFBvcHVwKHBvcHVwXzBkMTg5YzJjZTU0YzQxNjM5OTNhNWJlYWU3M2E2NmY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ODQ2ZTZlNDcyNTQ1N2RiZDAzOTU0ZjZjNzU1NWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmNmUwMDdiYWM3OTRmNjk5MzYxMmM2NjcyMzhkZmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzYmM4YzM4MzMzYTQ1MWRiYTE0ZjkzYjI0OWQ2MjQwID0gJCgnPGRpdiBpZD0iaHRtbF8xM2JjOGMzODMzM2E0NTFkYmExNGY5M2IyNDlkNjI0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjZlMDA3YmFjNzk0ZjY5OTM2MTJjNjY3MjM4ZGZmYy5zZXRDb250ZW50KGh0bWxfMTNiYzhjMzgzMzNhNDUxZGJhMTRmOTNiMjQ5ZDYyNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDc4NDZlNmU0NzI1NDU3ZGJkMDM5NTRmNmM3NTU1YmEuYmluZFBvcHVwKHBvcHVwXzVmNmUwMDdiYWM3OTRmNjk5MzYxMmM2NjcyMzhkZmZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhN2NhNWViMGQzNDRiOGY5ZTkxMWZjNTVmM2M2N2UwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4NzU5YTIwNmVlNTQzYWE4YzkxMGE5MDAyZjcwNDRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiYWZkNWFjNWI3NjQzZWRiMWY1M2U2NTZlM2E0MjVkID0gJCgnPGRpdiBpZD0iaHRtbF83YmFmZDVhYzViNzY0M2VkYjFmNTNlNjU2ZTNhNDI1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4NzU5YTIwNmVlNTQzYWE4YzkxMGE5MDAyZjcwNDRiLnNldENvbnRlbnQoaHRtbF83YmFmZDVhYzViNzY0M2VkYjFmNTNlNjU2ZTNhNDI1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTdjYTVlYjBkMzQ0YjhmOWU5MTFmYzU1ZjNjNjdlMC5iaW5kUG9wdXAocG9wdXBfZjg3NTlhMjA2ZWU1NDNhYThjOTEwYTkwMDJmNzA0NGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTE1YzNiZDUwYmYzNGEyMTllY2U5YTI4ZjRjMzczOWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM0MmEwZjhiNzQ0NDc1MTliYWJlNjk4Y2M3NDI0NzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTA1ZmI4YjNhZGU5NDZkYmE3YzhmZmRjN2YyOWZiM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2EwNWZiOGIzYWRlOTQ2ZGJhN2M4ZmZkYzdmMjlmYjNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzQyYTBmOGI3NDQ0NzUxOWJhYmU2OThjYzc0MjQ3NC5zZXRDb250ZW50KGh0bWxfYTA1ZmI4YjNhZGU5NDZkYmE3YzhmZmRjN2YyOWZiM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE1YzNiZDUwYmYzNGEyMTllY2U5YTI4ZjRjMzczOWEuYmluZFBvcHVwKHBvcHVwXzZjNDJhMGY4Yjc0NDQ3NTE5YmFiZTY5OGNjNzQyNDc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyZjYwOWQ4ZjZiNTRjYjQ5MDkzY2RmOTdlMzY3MmFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3ZDNhNTNmZmQzYjQxNWI5MmQyZjY4OTdjNDdjM2YxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiMTkxOTE2MzhmYzQ5NjFiYzMzODk1YjFiYzY0NTE3ID0gJCgnPGRpdiBpZD0iaHRtbF83YjE5MTkxNjM4ZmM0OTYxYmMzMzg5NWIxYmM2NDUxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3ZDNhNTNmZmQzYjQxNWI5MmQyZjY4OTdjNDdjM2YxLnNldENvbnRlbnQoaHRtbF83YjE5MTkxNjM4ZmM0OTYxYmMzMzg5NWIxYmM2NDUxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMmY2MDlkOGY2YjU0Y2I0OTA5M2NkZjk3ZTM2NzJhZC5iaW5kUG9wdXAocG9wdXBfZjdkM2E1M2ZmZDNiNDE1YjkyZDJmNjg5N2M0N2MzZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDczNjJmNjk5ZjVhNGVkYzgzNmI1ZjYyZGNkOWY0OWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ3Y2VlODU5YjQzNGZhZWE0NTQ4ZmMwNTFiODI1ODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhiODIzOWQ4NzZjNGJmYzk3NTA4YjM3YTI5ZmJjYWMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4YjgyMzlkODc2YzRiZmM5NzUwOGIzN2EyOWZiY2FjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDdjZWU4NTliNDM0ZmFlYTQ1NDhmYzA1MWI4MjU4NC5zZXRDb250ZW50KGh0bWxfZDhiODIzOWQ4NzZjNGJmYzk3NTA4YjM3YTI5ZmJjYWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDczNjJmNjk5ZjVhNGVkYzgzNmI1ZjYyZGNkOWY0OWMuYmluZFBvcHVwKHBvcHVwX2ZkN2NlZTg1OWI0MzRmYWVhNDU0OGZjMDUxYjgyNTg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0NTMzOWJkNjBlNjQ4OTBhOWY4MGUyYWI4Yzk1OTY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDFkMTY5NTUyZWM0MGJmYWFlOTUzOWQxMmFmYjgyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjdlNDMwMWRhMTY0Mjk5OTg5NWVmMTAzNzRjOTc5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWI3ZTQzMDFkYTE2NDI5OTk4OTVlZjEwMzc0Yzk3OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDFkMTY5NTUyZWM0MGJmYWFlOTUzOWQxMmFmYjgyOS5zZXRDb250ZW50KGh0bWxfMWI3ZTQzMDFkYTE2NDI5OTk4OTVlZjEwMzc0Yzk3OTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQ1MzM5YmQ2MGU2NDg5MGE5ZjgwZTJhYjhjOTU5NjcuYmluZFBvcHVwKHBvcHVwXzQ0MWQxNjk1NTJlYzQwYmZhYWU5NTM5ZDEyYWZiODI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5ZTVhZDI4ODljMTQyMGFiYTMxMzZkMzcxYjY5ZGQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc4ZTBjYmY4ZTliZDQ2MzY5ZWI3YjIzZWRjZWVhZTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1OTlhZDAwYzU2OTQzMThiNjFhZjU0YjRjOWE1MTk5ID0gJCgnPGRpdiBpZD0iaHRtbF9hNTk5YWQwMGM1Njk0MzE4YjYxYWY1NGI0YzlhNTE5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4ZTBjYmY4ZTliZDQ2MzY5ZWI3YjIzZWRjZWVhZTkxLnNldENvbnRlbnQoaHRtbF9hNTk5YWQwMGM1Njk0MzE4YjYxYWY1NGI0YzlhNTE5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOWU1YWQyODg5YzE0MjBhYmEzMTM2ZDM3MWI2OWRkMS5iaW5kUG9wdXAocG9wdXBfNzhlMGNiZjhlOWJkNDYzNjllYjdiMjNlZGNlZWFlOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODdmMGI3NDM2MmUxNGM0YzliZTRjMjQ1N2NiYzkyNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1NWMxMjUwZmFiZTRhNDU4OGJhNTFlNjFmNDBlNzAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFlM2IzNTQ2M2U3MDQ4NDU4Y2UxMGY1NTEwYmZiY2FkID0gJCgnPGRpdiBpZD0iaHRtbF8xZTNiMzU0NjNlNzA0ODQ1OGNlMTBmNTUxMGJmYmNhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTVjMTI1MGZhYmU0YTQ1ODhiYTUxZTYxZjQwZTcwMy5zZXRDb250ZW50KGh0bWxfMWUzYjM1NDYzZTcwNDg0NThjZTEwZjU1MTBiZmJjYWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODdmMGI3NDM2MmUxNGM0YzliZTRjMjQ1N2NiYzkyNmUuYmluZFBvcHVwKHBvcHVwX2Q1NWMxMjUwZmFiZTRhNDU4OGJhNTFlNjFmNDBlNzAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2MTgzODQ1YzYyOTQ5OGFhNjMxMWUxZGNjZTAzZTM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDFiODQ5N2I0Y2M0NDk0YWIzMWFhZmE4NTQ1YWVmM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODNhOGQ1ZGU5OGYxNGY3ZmIxNDNjNzcxMTczOGIyY2EgPSAkKCc8ZGl2IGlkPSJodG1sXzgzYThkNWRlOThmMTRmN2ZiMTQzYzc3MTE3MzhiMmNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxYjg0OTdiNGNjNDQ5NGFiMzFhYWZhODU0NWFlZjNhLnNldENvbnRlbnQoaHRtbF84M2E4ZDVkZTk4ZjE0ZjdmYjE0M2M3NzExNzM4YjJjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNjE4Mzg0NWM2Mjk0OThhYTYzMTFlMWRjY2UwM2UzNy5iaW5kUG9wdXAocG9wdXBfMDFiODQ5N2I0Y2M0NDk0YWIzMWFhZmE4NTQ1YWVmM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWEwZWM4NWQyY2NkNDgzZjgzMWFlMzA0NjY5MzY2MTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2EzMWU5MTc2OTc1NDc0MWI2YjgyMWExNWI4NmVkYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhjMzIyMGRjMDFiNDE4N2JhMjVhODZhMDA4YTNiNDcgPSAkKCc8ZGl2IGlkPSJodG1sX2M4YzMyMjBkYzAxYjQxODdiYTI1YTg2YTAwOGEzYjQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhMzFlOTE3Njk3NTQ3NDFiNmI4MjFhMTViODZlZGM0LnNldENvbnRlbnQoaHRtbF9jOGMzMjIwZGMwMWI0MTg3YmEyNWE4NmEwMDhhM2I0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTBlYzg1ZDJjY2Q0ODNmODMxYWUzMDQ2NjkzNjYxNy5iaW5kUG9wdXAocG9wdXBfN2EzMWU5MTc2OTc1NDc0MWI2YjgyMWExNWI4NmVkYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWFhZTU1ZjRhZDlkNGQzZGI0MjIzMjRmNWNiMDIzOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM4Y2ViM2JlMjA5NDQyYzhkNTM4YWRlNTQ0NDdiNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2VkMmU1Mjg0Yjc3NGUwMThlZWY1OTlhOWNmYTQ1MmIgPSAkKCc8ZGl2IGlkPSJodG1sX2NlZDJlNTI4NGI3NzRlMDE4ZWVmNTk5YTljZmE0NTJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM4Y2ViM2JlMjA5NDQyYzhkNTM4YWRlNTQ0NDdiNmEuc2V0Q29udGVudChodG1sX2NlZDJlNTI4NGI3NzRlMDE4ZWVmNTk5YTljZmE0NTJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhYWU1NWY0YWQ5ZDRkM2RiNDIyMzI0ZjVjYjAyMzlkLmJpbmRQb3B1cChwb3B1cF9mMzhjZWIzYmUyMDk0NDJjOGQ1MzhhZGU1NDQ0N2I2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOGIzOGFlMTk1YTU0NzljOWM4ZTA4MWIxYTczMTM5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjYxYzcyMmM1MTFkNDE2MTk5Njc4MzBmNmRhZjI0MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjNhMjQ1YjI0YTZjNDQ2ZGFhZDQzNzEyYTcwNjRkMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzYzYTI0NWIyNGE2YzQ0NmRhYWQ0MzcxMmE3MDY0ZDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjFjNzIyYzUxMWQ0MTYxOTk2NzgzMGY2ZGFmMjQxZi5zZXRDb250ZW50KGh0bWxfNjNhMjQ1YjI0YTZjNDQ2ZGFhZDQzNzEyYTcwNjRkMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYThiMzhhZTE5NWE1NDc5YzljOGUwODFiMWE3MzEzOTcuYmluZFBvcHVwKHBvcHVwX2I2MWM3MjJjNTExZDQxNjE5OTY3ODMwZjZkYWYyNDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhYTQ1YTE4YmE3MjQzODg5NTQxMjE1YWFmMGEyNzc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2OTVlM2IyNTk3OTQxYjY4ZjgzZDYxYTUzYzBkMDdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhNTJjMGRlODRhZjRlMjhiYzJjYmRmNDFhYjNkN2ZkID0gJCgnPGRpdiBpZD0iaHRtbF9lYTUyYzBkZTg0YWY0ZTI4YmMyY2JkZjQxYWIzZDdmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY5NWUzYjI1OTc5NDFiNjhmODNkNjFhNTNjMGQwN2Uuc2V0Q29udGVudChodG1sX2VhNTJjMGRlODRhZjRlMjhiYzJjYmRmNDFhYjNkN2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhYTQ1YTE4YmE3MjQzODg5NTQxMjE1YWFmMGEyNzc2LmJpbmRQb3B1cChwb3B1cF9hNjk1ZTNiMjU5Nzk0MWI2OGY4M2Q2MWE1M2MwZDA3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMjBiYWNlNjQwM2Y0M2RiOGYyYzlhYzljYzgyOGI4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjlkMzY1ZWIwYmI0MzkwODA1MGZiZDU5NjZjYzA2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjU2ODY2ZmNhODU0NDhlYTYyYWFjNWU5ZGRmMTdkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGI1Njg2NmZjYTg1NDQ4ZWE2MmFhYzVlOWRkZjE3ZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmI5ZDM2NWViMGJiNDM5MDgwNTBmYmQ1OTY2Y2MwNmEuc2V0Q29udGVudChodG1sX2RiNTY4NjZmY2E4NTQ0OGVhNjJhYWM1ZTlkZGYxN2RhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyMGJhY2U2NDAzZjQzZGI4ZjJjOWFjOWNjODI4YjgxLmJpbmRQb3B1cChwb3B1cF9iYjlkMzY1ZWIwYmI0MzkwODA1MGZiZDU5NjZjYzA2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MGQ5ZTk3Y2JhNTk0Y2M0YjkxOTdkMjI2MmJhMjlmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmJkZGM2MGUxYTk0NWIzODA1ZDU4NDYxNmY1NTdkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYWI2OTI5MGRhYjI0MWNmOGU1ZThkZmY3YTI4ZmQzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWFiNjkyOTBkYWIyNDFjZjhlNWU4ZGZmN2EyOGZkM2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyYmRkYzYwZTFhOTQ1YjM4MDVkNTg0NjE2ZjU1N2Q5LnNldENvbnRlbnQoaHRtbF9lYWI2OTI5MGRhYjI0MWNmOGU1ZThkZmY3YTI4ZmQzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MGQ5ZTk3Y2JhNTk0Y2M0YjkxOTdkMjI2MmJhMjlmNy5iaW5kUG9wdXAocG9wdXBfOTJiZGRjNjBlMWE5NDViMzgwNWQ1ODQ2MTZmNTU3ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDYwMjZhMjEzN2Q5NDQ3ODkzZTM3Y2RlYThlMDhhNzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmY2QwNWE5OWE4ZjRmOWZiZTc5OWVhMzhiOGRjZGEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQzODJmYjg4YmU0MjQ5OThiNTAwZTUzODIyMTkyY2NiID0gJCgnPGRpdiBpZD0iaHRtbF80MzgyZmI4OGJlNDI0OTk4YjUwMGU1MzgyMjE5MmNjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZmNkMDVhOTlhOGY0ZjlmYmU3OTllYTM4YjhkY2RhMi5zZXRDb250ZW50KGh0bWxfNDM4MmZiODhiZTQyNDk5OGI1MDBlNTM4MjIxOTJjY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDYwMjZhMjEzN2Q5NDQ3ODkzZTM3Y2RlYThlMDhhNzAuYmluZFBvcHVwKHBvcHVwX2NmY2QwNWE5OWE4ZjRmOWZiZTc5OWVhMzhiOGRjZGEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyNmQ3N2Y4N2NkZTQ2OTJiMmNhODRlZWQ2MDI5NDI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQzMTI2YzRiMDRmNDFiYmFmODNlOGZlZTAxZjAxODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGJlM2NkMmQ4MWZjNDUyNjhjY2VhMDJiOGUxNDE2YmQgPSAkKCc8ZGl2IGlkPSJodG1sX2RiZTNjZDJkODFmYzQ1MjY4Y2NlYTAyYjhlMTQxNmJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDMxMjZjNGIwNGY0MWJiYWY4M2U4ZmVlMDFmMDE4MS5zZXRDb250ZW50KGh0bWxfZGJlM2NkMmQ4MWZjNDUyNjhjY2VhMDJiOGUxNDE2YmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI2ZDc3Zjg3Y2RlNDY5MmIyY2E4NGVlZDYwMjk0MjUuYmluZFBvcHVwKHBvcHVwXzJkMzEyNmM0YjA0ZjQxYmJhZjgzZThmZWUwMWYwMTgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2ZTk3NzFmZDAyMzQzYjVhYWFlYjZjZjI2ZjFhN2IxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjZhMjk4ODIzYmIxNDA0NDhjMGViNzY4NTNmNGUwYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY0YTFiODUyZjhiNDIzODg5ZGRhNDIyY2M1N2Q5ZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzZmNGExYjg1MmY4YjQyMzg4OWRkYTQyMmNjNTdkOWZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2YTI5ODgyM2JiMTQwNDQ4YzBlYjc2ODUzZjRlMGIyLnNldENvbnRlbnQoaHRtbF82ZjRhMWI4NTJmOGI0MjM4ODlkZGE0MjJjYzU3ZDlmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNmU5NzcxZmQwMjM0M2I1YWFhZWI2Y2YyNmYxYTdiMS5iaW5kUG9wdXAocG9wdXBfMjZhMjk4ODIzYmIxNDA0NDhjMGViNzY4NTNmNGUwYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDgxY2UyM2UxYzc3NDA0MDkxNWE0NTBiNzFhMjhhNzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZjA5NmQxMmQ3NjQ1Yzg5NDI1MDFiOTVmYjhiMDRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0ZmE4MWZjYTk2OTQ4ZTFhZDM1MDcxM2I3YzIxMDU3ID0gJCgnPGRpdiBpZD0iaHRtbF83NGZhODFmY2E5Njk0OGUxYWQzNTA3MTNiN2MyMTA1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmYwOTZkMTJkNzY0NWM4OTQyNTAxYjk1ZmI4YjA0Yi5zZXRDb250ZW50KGh0bWxfNzRmYTgxZmNhOTY5NDhlMWFkMzUwNzEzYjdjMjEwNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDgxY2UyM2UxYzc3NDA0MDkxNWE0NTBiNzFhMjhhNzIuYmluZFBvcHVwKHBvcHVwX2FmZjA5NmQxMmQ3NjQ1Yzg5NDI1MDFiOTVmYjhiMDRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwNDU5MmExMDFlMjQ0MjA5OTZmY2EzNGI0ZGZjM2Y0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkYmY4OTRiMzhiZDRiZWQ4OGRmOGFkNTVlNjYyYzAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiNDUxYTA0MjJjMjRkZjg5OTViZTI5YWI5YTQ5NTk4ID0gJCgnPGRpdiBpZD0iaHRtbF8wYjQ1MWEwNDIyYzI0ZGY4OTk1YmUyOWFiOWE0OTU5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYmY4OTRiMzhiZDRiZWQ4OGRmOGFkNTVlNjYyYzAwLnNldENvbnRlbnQoaHRtbF8wYjQ1MWEwNDIyYzI0ZGY4OTk1YmUyOWFiOWE0OTU5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMDQ1OTJhMTAxZTI0NDIwOTk2ZmNhMzRiNGRmYzNmNC5iaW5kUG9wdXAocG9wdXBfN2RiZjg5NGIzOGJkNGJlZDg4ZGY4YWQ1NWU2NjJjMDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTQ4MTlkOTFiMGJhNDljN2JlYTRmYWU5MzNmOGQwYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2M5MjMwOGU4ZTE5NGVjZWFkYTc2YWE0YjZmMDIxNTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmJkNzA1NjUwNzRmNGJkMTgyNjU4NTI2NTU3YjE1ZGEgPSAkKCc8ZGl2IGlkPSJodG1sXzZiZDcwNTY1MDc0ZjRiZDE4MjY1ODUyNjU1N2IxNWRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjOTIzMDhlOGUxOTRlY2VhZGE3NmFhNGI2ZjAyMTUwLnNldENvbnRlbnQoaHRtbF82YmQ3MDU2NTA3NGY0YmQxODI2NTg1MjY1NTdiMTVkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDgxOWQ5MWIwYmE0OWM3YmVhNGZhZTkzM2Y4ZDBhOS5iaW5kUG9wdXAocG9wdXBfN2M5MjMwOGU4ZTE5NGVjZWFkYTc2YWE0YjZmMDIxNTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWFjNWU0N2Y2ZGE1NGUzMTljNmQ2MzliY2NkZWU1ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTAxOGY2MDI1ZjBlNDExZjgwNTliZDhkZTliNWEzN2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjE1NTZjOWEzNDNjNGE3N2EwMjg3N2JiMjMwMGZhNDUgPSAkKCc8ZGl2IGlkPSJodG1sX2YxNTU2YzlhMzQzYzRhNzdhMDI4NzdiYjIzMDBmYTQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDE4ZjYwMjVmMGU0MTFmODA1OWJkOGRlOWI1YTM3ZC5zZXRDb250ZW50KGh0bWxfZjE1NTZjOWEzNDNjNGE3N2EwMjg3N2JiMjMwMGZhNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWFjNWU0N2Y2ZGE1NGUzMTljNmQ2MzliY2NkZWU1ZjMuYmluZFBvcHVwKHBvcHVwX2UwMThmNjAyNWYwZTQxMWY4MDU5YmQ4ZGU5YjVhMzdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiNWM2ZWQwY2Y4YTRkMDA4NjMzNWY4NGY3ZjVlZTNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE2MWVlNjkwNGM4NGZlZmJlOTEyYWVjOWYyYzQ1MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTA2ZTk4NDM0ZTVkNDg4MGIxMmRmNWRiMGIzZjYzMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzUwNmU5ODQzNGU1ZDQ4ODBiMTJkZjVkYjBiM2Y2MzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDE2MWVlNjkwNGM4NGZlZmJlOTEyYWVjOWYyYzQ1MDguc2V0Q29udGVudChodG1sXzUwNmU5ODQzNGU1ZDQ4ODBiMTJkZjVkYjBiM2Y2MzJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiNWM2ZWQwY2Y4YTRkMDA4NjMzNWY4NGY3ZjVlZTNlLmJpbmRQb3B1cChwb3B1cF80MTYxZWU2OTA0Yzg0ZmVmYmU5MTJhZWM5ZjJjNDUwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYmE1YWFjZDA1ZWE0YjEyYmUwNjU4MDM3NzBhOTJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTViNzQwNTNkOWU0ZjQ4OGY1YWY4ZDhiZWI0NTUyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjdlMDE3NmM1ZTU0Mzc2YjVlYTU2ZTUzM2NhNjNmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTY3ZTAxNzZjNWU1NDM3NmI1ZWE1NmU1MzNjYTYzZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTViNzQwNTNkOWU0ZjQ4OGY1YWY4ZDhiZWI0NTUyZi5zZXRDb250ZW50KGh0bWxfOTY3ZTAxNzZjNWU1NDM3NmI1ZWE1NmU1MzNjYTYzZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2JhNWFhY2QwNWVhNGIxMmJlMDY1ODAzNzcwYTkyZGEuYmluZFBvcHVwKHBvcHVwXzJlNWI3NDA1M2Q5ZTRmNDg4ZjVhZjhkOGJlYjQ1NTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyODk3YWVjZjZkNzQ1MDM4NWEyNmI5YTEzM2YzYzkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OGZmY2I0N2E4OTk0ZjFlOGQ5ZTA0NDYyNWZhNGUyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYzY4YmU5ZjljNTM0NWIwOWI5YTI3YmY5Nzc2NDVhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmM2OGJlOWY5YzUzNDViMDliOWEyN2JmOTc3NjQ1YTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjhmZmNiNDdhODk5NGYxZThkOWUwNDQ2MjVmYTRlMjQuc2V0Q29udGVudChodG1sXzJjNjhiZTlmOWM1MzQ1YjA5YjlhMjdiZjk3NzY0NWEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyODk3YWVjZjZkNzQ1MDM4NWEyNmI5YTEzM2YzYzkyLmJpbmRQb3B1cChwb3B1cF82OGZmY2I0N2E4OTk0ZjFlOGQ5ZTA0NDYyNWZhNGUyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODgwZDEwNmQyYjQ0MDc1ODM5YmQzYmU0NTNiNmRmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTk2ODJmNmFjNThhNDc2Mjg3Y2Q0MmEyMmQxM2RmNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU5OWI3YTNkNTJkNGVkMzkwMTEzNWJiOGVjNDBiNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzhlOTliN2EzZDUyZDRlZDM5MDExMzViYjhlYzQwYjY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5NjgyZjZhYzU4YTQ3NjI4N2NkNDJhMjJkMTNkZjc0LnNldENvbnRlbnQoaHRtbF84ZTk5YjdhM2Q1MmQ0ZWQzOTAxMTM1YmI4ZWM0MGI2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODgwZDEwNmQyYjQ0MDc1ODM5YmQzYmU0NTNiNmRmNS5iaW5kUG9wdXAocG9wdXBfNTk2ODJmNmFjNThhNDc2Mjg3Y2Q0MmEyMmQxM2RmNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGQ3NTFiOGY0MmQ4NGY4MmJmYzQwYzBkM2Y5OWJhNzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzExMDVjYmU5MWJkNDg0YWEyYmRkNjhmOGRhMjBiM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmM3YmQ0ZWM3MWUxNDJlOTg4ZjA3ZTQyYTdlN2RiMGQgPSAkKCc8ZGl2IGlkPSJodG1sX2JjN2JkNGVjNzFlMTQyZTk4OGYwN2U0MmE3ZTdkYjBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTEwNWNiZTkxYmQ0ODRhYTJiZGQ2OGY4ZGEyMGIzZS5zZXRDb250ZW50KGh0bWxfYmM3YmQ0ZWM3MWUxNDJlOTg4ZjA3ZTQyYTdlN2RiMGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGQ3NTFiOGY0MmQ4NGY4MmJmYzQwYzBkM2Y5OWJhNzkuYmluZFBvcHVwKHBvcHVwXzcxMTA1Y2JlOTFiZDQ4NGFhMmJkZDY4ZjhkYTIwYjNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxNGFmNzE5MjUwMTQzMjViZDhmNjc5YmUzMThmMTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwZGFhYTU0MjAzZjQ5Yzc5OWQyZTlmZGZjZGIzMTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkOTQzOWI1ZjlhNDQ5ZDM5NTk1OWFjYWU0NzQyYTg3ID0gJCgnPGRpdiBpZD0iaHRtbF9hZDk0MzliNWY5YTQ0OWQzOTU5NTlhY2FlNDc0MmE4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMGRhYWE1NDIwM2Y0OWM3OTlkMmU5ZmRmY2RiMzEwMS5zZXRDb250ZW50KGh0bWxfYWQ5NDM5YjVmOWE0NDlkMzk1OTU5YWNhZTQ3NDJhODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzE0YWY3MTkyNTAxNDMyNWJkOGY2NzliZTMxOGYxOWMuYmluZFBvcHVwKHBvcHVwX2EwZGFhYTU0MjAzZjQ5Yzc5OWQyZTlmZGZjZGIzMTAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3OGYyY2RjNjE1NDRmMTFiMmIzY2UwZmMyNzQ3NmU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2NWQzZGMxZTliNzQ4YmI4MTVkNWNkNDlmYjFjMjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1ZDkxNTg0OGUxZDRlZjA5MDU5OWEyYWJlOWNmZTE1ID0gJCgnPGRpdiBpZD0iaHRtbF8zNWQ5MTU4NDhlMWQ0ZWYwOTA1OTlhMmFiZTljZmUxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzY1ZDNkYzFlOWI3NDhiYjgxNWQ1Y2Q0OWZiMWMyODMuc2V0Q29udGVudChodG1sXzM1ZDkxNTg0OGUxZDRlZjA5MDU5OWEyYWJlOWNmZTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3OGYyY2RjNjE1NDRmMTFiMmIzY2UwZmMyNzQ3NmU2LmJpbmRQb3B1cChwb3B1cF83NjVkM2RjMWU5Yjc0OGJiODE1ZDVjZDQ5ZmIxYzI4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZjg0NzlhNTVkYzY0MGZlYmM1ZGQwZDNmMzE3MzI3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGQ5ZTE4MjQ2ZDE0MmYwYjVhOWQxZGM5YTkzY2ZkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODAwZWUxZTFkNTA0MmFjOGYzNWY3ODIyNWJjMzhkNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDgwMGVlMWUxZDUwNDJhYzhmMzVmNzgyMjViYzM4ZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwZDllMTgyNDZkMTQyZjBiNWE5ZDFkYzlhOTNjZmQ4LnNldENvbnRlbnQoaHRtbF9kODAwZWUxZTFkNTA0MmFjOGYzNWY3ODIyNWJjMzhkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZjg0NzlhNTVkYzY0MGZlYmM1ZGQwZDNmMzE3MzI3MC5iaW5kUG9wdXAocG9wdXBfZTBkOWUxODI0NmQxNDJmMGI1YTlkMWRjOWE5M2NmZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTlmN2ViZWE4NDVjNGI5MDljYTUwOGVhM2UxYjc1M2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Q5YTIxOTgyY2RhNGYxMWFhOTI4MWU3YmJhMzcxYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYxNWJjMzM1MjliNDI0NDk1ZDgzNjdmYWMyYWZlMGUgPSAkKCc8ZGl2IGlkPSJodG1sXzc2MTViYzMzNTI5YjQyNDQ5NWQ4MzY3ZmFjMmFmZTBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkOWEyMTk4MmNkYTRmMTFhYTkyODFlN2JiYTM3MWFkLnNldENvbnRlbnQoaHRtbF83NjE1YmMzMzUyOWI0MjQ0OTVkODM2N2ZhYzJhZmUwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OWY3ZWJlYTg0NWM0YjkwOWNhNTA4ZWEzZTFiNzUzZC5iaW5kUG9wdXAocG9wdXBfN2Q5YTIxOTgyY2RhNGYxMWFhOTI4MWU3YmJhMzcxYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmIyNmFhNjM2NGE1NDFhNDhiOTdmODViNzAyODUyNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjNmViMjZmZjg4YjQwZTg4NjIxYTY0ZTJhNTRkMWM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlZGQyMWRmNTk4MjQ1NDY5NGM5ZTRlNTAxYTBjZGZjID0gJCgnPGRpdiBpZD0iaHRtbF80ZWRkMjFkZjU5ODI0NTQ2OTRjOWU0ZTUwMWEwY2RmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M2ZWIyNmZmODhiNDBlODg2MjFhNjRlMmE1NGQxYzcuc2V0Q29udGVudChodG1sXzRlZGQyMWRmNTk4MjQ1NDY5NGM5ZTRlNTAxYTBjZGZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiMjZhYTYzNjRhNTQxYTQ4Yjk3Zjg1YjcwMjg1MjVmLmJpbmRQb3B1cChwb3B1cF9jYzZlYjI2ZmY4OGI0MGU4ODYyMWE2NGUyYTU0ZDFjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMGYwZDAyMjVhZDk0NWM1OTFlYmNlMTVkN2VjNjAxYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZmFiNzA5NjkxZWE0OTkxYWQ0ZGY5N2E2OTBjMTQwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzMwY2U5YTkyODU0NjIyOWNiMzE0ZDJmZWFjMTQ5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDMzMGNlOWE5Mjg1NDYyMjljYjMxNGQyZmVhYzE0OTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGZhYjcwOTY5MWVhNDk5MWFkNGRmOTdhNjkwYzE0MDMuc2V0Q29udGVudChodG1sX2QzMzBjZTlhOTI4NTQ2MjI5Y2IzMTRkMmZlYWMxNDkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwZjBkMDIyNWFkOTQ1YzU5MWViY2UxNWQ3ZWM2MDFiLmJpbmRQb3B1cChwb3B1cF8wZmFiNzA5NjkxZWE0OTkxYWQ0ZGY5N2E2OTBjMTQwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODU1NmJiNDljNTU0NmIxOGMzNmE4YjE3ZDM2MWY0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZWQzMjA0YzcxNTQ0ZGZiODVjNGYyZGVkY2Q0MTk2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNmRlMGE5NzVkZjY0YmRmODZiZGY1ODRmNjk5ZmIyMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjZkZTBhOTc1ZGY2NGJkZjg2YmRmNTg0ZjY5OWZiMjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGVkMzIwNGM3MTU0NGRmYjg1YzRmMmRlZGNkNDE5Njguc2V0Q29udGVudChodG1sX2Y2ZGUwYTk3NWRmNjRiZGY4NmJkZjU4NGY2OTlmYjIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4NTU2YmI0OWM1NTQ2YjE4YzM2YThiMTdkMzYxZjRiLmJpbmRQb3B1cChwb3B1cF8wZWQzMjA0YzcxNTQ0ZGZiODVjNGYyZGVkY2Q0MTk2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNDE1YzMwNTljMjU0NDFiYTcyY2Y5OTFiMDc5NGZmMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5MDFjZjg0OWUxNzQwMWM4YTYwYTFlNmVmNjU2YTdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxYTZkZmFmYWZkZDRjMzU5ZTUzMzBiODhlM2JiM2VlID0gJCgnPGRpdiBpZD0iaHRtbF8wMWE2ZGZhZmFmZGQ0YzM1OWU1MzMwYjg4ZTNiYjNlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5MDFjZjg0OWUxNzQwMWM4YTYwYTFlNmVmNjU2YTdlLnNldENvbnRlbnQoaHRtbF8wMWE2ZGZhZmFmZGQ0YzM1OWU1MzMwYjg4ZTNiYjNlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNDE1YzMwNTljMjU0NDFiYTcyY2Y5OTFiMDc5NGZmMy5iaW5kUG9wdXAocG9wdXBfYTkwMWNmODQ5ZTE3NDAxYzhhNjBhMWU2ZWY2NTZhN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNjY2I4NTg1YjJkNDI1Yzg0YTYzNzgwMzM1ZWFkOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjhiMTNhNTg0ZmNkNGUzZTkxOGE0MDk4ODU4OWNhZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDFhYWIzNzIwYmE5NGI3NGI5MDI1Y2UyMzU1MzM3NDEgPSAkKCc8ZGl2IGlkPSJodG1sX2QxYWFiMzcyMGJhOTRiNzRiOTAyNWNlMjM1NTMzNzQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOGIxM2E1ODRmY2Q0ZTNlOTE4YTQwOTg4NTg5Y2FkMi5zZXRDb250ZW50KGh0bWxfZDFhYWIzNzIwYmE5NGI3NGI5MDI1Y2UyMzU1MzM3NDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmNjY2I4NTg1YjJkNDI1Yzg0YTYzNzgwMzM1ZWFkOTUuYmluZFBvcHVwKHBvcHVwX2Y4YjEzYTU4NGZjZDRlM2U5MThhNDA5ODg1ODljYWQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiZjIzMWJmMDg4NzQ2MDFiMmU4NThhYzYzMmM4YTQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyYzJjMzE0ODNjNDRiYzJiYWIzODY4OTA1NGQzMTc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczNDFhMTZmNzgxYjRiMmY5NDcyNWUyZjYyMjM4NzllID0gJCgnPGRpdiBpZD0iaHRtbF83MzQxYTE2Zjc4MWI0YjJmOTQ3MjVlMmY2MjIzODc5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMmMyYzMxNDgzYzQ0YmMyYmFiMzg2ODkwNTRkMzE3NS5zZXRDb250ZW50KGh0bWxfNzM0MWExNmY3ODFiNGIyZjk0NzI1ZTJmNjIyMzg3OWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2JmMjMxYmYwODg3NDYwMWIyZTg1OGFjNjMyYzhhNDguYmluZFBvcHVwKHBvcHVwX2YyYzJjMzE0ODNjNDRiYzJiYWIzODY4OTA1NGQzMTc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxYWJhYjM5ZDMzYTQ2YjA4NjJiYWYyMDk2OWU2ZGIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwNjZkZjlmODMyMTQwNTY4MmFlZjc5M2FlYTgwZTAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxYzcwYTgzMzQ1MTQzZmI5OTAxMDBmNjU1ZjU3MWVkID0gJCgnPGRpdiBpZD0iaHRtbF85MWM3MGE4MzM0NTE0M2ZiOTkwMTAwZjY1NWY1NzFlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MDY2ZGY5ZjgzMjE0MDU2ODJhZWY3OTNhZWE4MGUwMy5zZXRDb250ZW50KGh0bWxfOTFjNzBhODMzNDUxNDNmYjk5MDEwMGY2NTVmNTcxZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTFhYmFiMzlkMzNhNDZiMDg2MmJhZjIwOTY5ZTZkYjAuYmluZFBvcHVwKHBvcHVwXzUwNjZkZjlmODMyMTQwNTY4MmFlZjc5M2FlYTgwZTAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZjNjZTFjZjdmMDRhNWY5M2I0Njg2ZTZlN2VhYjJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzOGI4ZDkwNWM5YzQ1ZWRiOWIyYjllNmZkZDA2NzdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzMTY2MTI3MTg5OTQwZTk5NDVkNTczYTZiZWI0NDAxID0gJCgnPGRpdiBpZD0iaHRtbF82MzE2NjEyNzE4OTk0MGU5OTQ1ZDU3M2E2YmViNDQwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzhiOGQ5MDVjOWM0NWVkYjliMmI5ZTZmZGQwNjc3Yy5zZXRDb250ZW50KGh0bWxfNjMxNjYxMjcxODk5NDBlOTk0NWQ1NzNhNmJlYjQ0MDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2RmM2NlMWNmN2YwNGE1ZjkzYjQ2ODZlNmU3ZWFiMmUuYmluZFBvcHVwKHBvcHVwX2YzOGI4ZDkwNWM5YzQ1ZWRiOWIyYjllNmZkZDA2NzdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkYTQxN2MwMWUxNDQ1YzU5MGU5ZTY3NWRmZDFkYmYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4ZmYwNGI0YjkxOTRhY2NiYmQ3MDA4ZDQ1OWM2ZTllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMjc2MWIwNjgxNjQyMmI4ODUyOGM2ZmE2OWVmMjFjID0gJCgnPGRpdiBpZD0iaHRtbF9mYzI3NjFiMDY4MTY0MjJiODg1MjhjNmZhNjllZjIxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGZmMDRiNGI5MTk0YWNjYmJkNzAwOGQ0NTljNmU5ZS5zZXRDb250ZW50KGh0bWxfZmMyNzYxYjA2ODE2NDIyYjg4NTI4YzZmYTY5ZWYyMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmRhNDE3YzAxZTE0NDVjNTkwZTllNjc1ZGZkMWRiZjAuYmluZFBvcHVwKHBvcHVwXzE4ZmYwNGI0YjkxOTRhY2NiYmQ3MDA4ZDQ1OWM2ZTllKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3MDRiNjVmOGU0ZjRlYWI5OTRlMWQ0ZjljMzcxODU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0NWFkYmI0NzMwYjQ0MzlhYWViZjlkMmM1ZjQxNGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlMTEwODA1MGEyODQ0NWY4OWY1MjlhMzhiYTgzZDU4ID0gJCgnPGRpdiBpZD0iaHRtbF8wZTExMDgwNTBhMjg0NDVmODlmNTI5YTM4YmE4M2Q1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0NWFkYmI0NzMwYjQ0MzlhYWViZjlkMmM1ZjQxNGYyLnNldENvbnRlbnQoaHRtbF8wZTExMDgwNTBhMjg0NDVmODlmNTI5YTM4YmE4M2Q1OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzA0YjY1ZjhlNGY0ZWFiOTk0ZTFkNGY5YzM3MTg1Ni5iaW5kUG9wdXAocG9wdXBfMzQ1YWRiYjQ3MzBiNDQzOWFhZWJmOWQyYzVmNDE0ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U0MTllYmI3MDI4NGQyOGIzZWVhMjJkNzQ4YWE0MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDA0OWRiN2Y5NDQ3NDRkOWFmOWI3ZDg2ZGEwNDdhMGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY5NDI1YmYzYWIxNDdlY2JmNjUyMmViYzJlYWU0M2IgPSAkKCc8ZGl2IGlkPSJodG1sX2JmOTQyNWJmM2FiMTQ3ZWNiZjY1MjJlYmMyZWFlNDNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDA0OWRiN2Y5NDQ3NDRkOWFmOWI3ZDg2ZGEwNDdhMGEuc2V0Q29udGVudChodG1sX2JmOTQyNWJmM2FiMTQ3ZWNiZjY1MjJlYmMyZWFlNDNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlNDE5ZWJiNzAyODRkMjhiM2VlYTIyZDc0OGFhNDMxLmJpbmRQb3B1cChwb3B1cF9kMDQ5ZGI3Zjk0NDc0NGQ5YWY5YjdkODZkYTA0N2EwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YTc4YmIyZDYzNDc0NDUxOGNlZjkxZDgzYTNkZTkxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFmNDA2NjY5NmM1NGIyNDgxNTAyN2YxYzZhM2QxZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI1MWIyYWU2ZjA2NGVmNmJlM2IwOThjODQwN2E4ZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzcyNTFiMmFlNmYwNjRlZjZiZTNiMDk4Yzg0MDdhOGRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTFmNDA2NjY5NmM1NGIyNDgxNTAyN2YxYzZhM2QxZDQuc2V0Q29udGVudChodG1sXzcyNTFiMmFlNmYwNjRlZjZiZTNiMDk4Yzg0MDdhOGRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlhNzhiYjJkNjM0NzQ0NTE4Y2VmOTFkODNhM2RlOTFkLmJpbmRQb3B1cChwb3B1cF9hMWY0MDY2Njk2YzU0YjI0ODE1MDI3ZjFjNmEzZDFkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODNlNzQxOTkxZDk0Njk3YTA0ZDEyNDRlMjlhNzgwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYmUyYTlhNjEwNWQ0ZmI1OTQzOGI3ZDMwZmZjOGQ0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzQ0OWI5Y2NkOGQ0YTI2OGExZjZlYjQ3MTYyZTYzMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTM0NDliOWNjZDhkNGEyNjhhMWY2ZWI0NzE2MmU2MzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiZTJhOWE2MTA1ZDRmYjU5NDM4YjdkMzBmZmM4ZDQwLnNldENvbnRlbnQoaHRtbF9hMzQ0OWI5Y2NkOGQ0YTI2OGExZjZlYjQ3MTYyZTYzMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODNlNzQxOTkxZDk0Njk3YTA0ZDEyNDRlMjlhNzgwMS5iaW5kUG9wdXAocG9wdXBfYWJlMmE5YTYxMDVkNGZiNTk0MzhiN2QzMGZmYzhkNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmIxMWE4YjRjZjAyNGYyOTljODc1YTU3ZmJlNTJiYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjc4NTM0NmNmMThiNDU3ZTgxNGQ3YjVlNTQwZWUyZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTA5MjQyY2VkODAyNGExOGI1MmQzOWE5NWRkNGZmOGIgPSAkKCc8ZGl2IGlkPSJodG1sXzEwOTI0MmNlZDgwMjRhMThiNTJkMzlhOTVkZDRmZjhiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjc4NTM0NmNmMThiNDU3ZTgxNGQ3YjVlNTQwZWUyZTguc2V0Q29udGVudChodG1sXzEwOTI0MmNlZDgwMjRhMThiNTJkMzlhOTVkZDRmZjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiMTFhOGI0Y2YwMjRmMjk5Yzg3NWE1N2ZiZTUyYmM3LmJpbmRQb3B1cChwb3B1cF82Nzg1MzQ2Y2YxOGI0NTdlODE0ZDdiNWU1NDBlZTJlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzFhZTVlMzgyY2Y0YWIyODkzMTJkZmRhMTZlMTBiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MWI3YTY5NjExOGY0OGU3OGRhZjg5MDM0ZjQ2OTk4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZGIzNjZkZDFhZDU0NTVmYjdkYzljMDkwYjRiOTJjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmRiMzY2ZGQxYWQ1NDU1ZmI3ZGM5YzA5MGI0YjkyYzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjFiN2E2OTYxMThmNDhlNzhkYWY4OTAzNGY0Njk5OGEuc2V0Q29udGVudChodG1sXzZkYjM2NmRkMWFkNTQ1NWZiN2RjOWMwOTBiNGI5MmM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjMWFlNWUzODJjZjRhYjI4OTMxMmRmZGExNmUxMGIzLmJpbmRQb3B1cChwb3B1cF82MWI3YTY5NjExOGY0OGU3OGRhZjg5MDM0ZjQ2OTk4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZTgzOGYzZjdiNzQ0ZDJmYTBiMTk1ZDg5MzU3NDQ3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yN2EzOTQyNWZlZjc0OGNmYTc3ZGE3MGE0Y2JlYjY3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZWMxNzE3ZDNkZWU0OGNlYjhhY2IwYzZmYTVjYzdmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmVjMTcxN2QzZGVlNDhjZWI4YWNiMGM2ZmE1Y2M3ZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3YTM5NDI1ZmVmNzQ4Y2ZhNzdkYTcwYTRjYmViNjdlLnNldENvbnRlbnQoaHRtbF82ZWMxNzE3ZDNkZWU0OGNlYjhhY2IwYzZmYTVjYzdmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZTgzOGYzZjdiNzQ0ZDJmYTBiMTk1ZDg5MzU3NDQ3OS5iaW5kUG9wdXAocG9wdXBfMjdhMzk0MjVmZWY3NDhjZmE3N2RhNzBhNGNiZWI2N2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGEwY2E4MzE0Y2FmNGEzODlhYTlkNTkxYmE1ZmZkMGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWYyOTgyYTA4YmFkNDgzNzljMmQ4ZDdiOGJjNDMxN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzAxNzNjYzkxYmI3NGZkZDhhNGU3MDBkNmYyODcwYjkgPSAkKCc8ZGl2IGlkPSJodG1sXzcwMTczY2M5MWJiNzRmZGQ4YTRlNzAwZDZmMjg3MGI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmMjk4MmEwOGJhZDQ4Mzc5YzJkOGQ3YjhiYzQzMTdhLnNldENvbnRlbnQoaHRtbF83MDE3M2NjOTFiYjc0ZmRkOGE0ZTcwMGQ2ZjI4NzBiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTBjYTgzMTRjYWY0YTM4OWFhOWQ1OTFiYTVmZmQwZS5iaW5kUG9wdXAocG9wdXBfYWYyOTgyYTA4YmFkNDgzNzljMmQ4ZDdiOGJjNDMxN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZhODc4MzkwOGQwNDk0YThlYWRiZDE1ZTBjZDgxZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3MjBlMTU2OWM4NTQxNzhiNmY3YWY3OTI5YTFhMDY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmZWE4NWI0MzI3YjQwZjhhNDhiMmU2MTliNWQwYzk5ID0gJCgnPGRpdiBpZD0iaHRtbF8wZmVhODViNDMyN2I0MGY4YTQ4YjJlNjE5YjVkMGM5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTcyMGUxNTY5Yzg1NDE3OGI2ZjdhZjc5MjlhMWEwNjguc2V0Q29udGVudChodG1sXzBmZWE4NWI0MzI3YjQwZjhhNDhiMmU2MTliNWQwYzk5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2YTg3ODM5MDhkMDQ5NGE4ZWFkYmQxNWUwY2Q4MWY0LmJpbmRQb3B1cChwb3B1cF85NzIwZTE1NjljODU0MTc4YjZmN2FmNzkyOWExYTA2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDA1NGQ3YTQ5MzA0ODkxODMzZjNkY2IzZTkyN2VmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWRjZjIxYTU1ZTFiNGQwNWExY2Q0MzFhYjYxOGM2NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzNlMTYyNmFjYzRkNDY0NWJlNzRjMGM1YTk1M2U2ZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzczZTE2MjZhY2M0ZDQ2NDViZTc0YzBjNWE5NTNlNmZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRjZjIxYTU1ZTFiNGQwNWExY2Q0MzFhYjYxOGM2NTUuc2V0Q29udGVudChodG1sXzczZTE2MjZhY2M0ZDQ2NDViZTc0YzBjNWE5NTNlNmZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwMDU0ZDdhNDkzMDQ4OTE4MzNmM2RjYjNlOTI3ZWYxLmJpbmRQb3B1cChwb3B1cF9lZGNmMjFhNTVlMWI0ZDA1YTFjZDQzMWFiNjE4YzY1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzhmY2YxNjM3YTg0NzU4OWI0MTA1YTM4NTJhNzY4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFmZjlkNmY4ZDVmNDJiMzg2MzBjN2MxOWJkZDVmNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ZiNjY4N2YyZTY0NDQwZjg0YmIxN2NkZDU5ZDlhOWIgPSAkKCc8ZGl2IGlkPSJodG1sXzNmYjY2ODdmMmU2NDQ0MGY4NGJiMTdjZGQ1OWQ5YTliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhZmY5ZDZmOGQ1ZjQyYjM4NjMwYzdjMTliZGQ1ZjQ2LnNldENvbnRlbnQoaHRtbF8zZmI2Njg3ZjJlNjQ0NDBmODRiYjE3Y2RkNTlkOWE5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYzhmY2YxNjM3YTg0NzU4OWI0MTA1YTM4NTJhNzY4Yy5iaW5kUG9wdXAocG9wdXBfNmFmZjlkNmY4ZDVmNDJiMzg2MzBjN2MxOWJkZDVmNDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWFhOGRhY2FmZjJmNGU5MmJjNjA2NDc1MTcwNzM5YmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwOGJiMDdjZTZkYTRjZDk4M2EwYzZkNjIwMDkzY2MxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzNGQ4Y2JhOGZhNTQwMjQ4YzlkNmMyOGNjMjU4ZWE1ID0gJCgnPGRpdiBpZD0iaHRtbF9jMzRkOGNiYThmYTU0MDI0OGM5ZDZjMjhjYzI1OGVhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjA4YmIwN2NlNmRhNGNkOTgzYTBjNmQ2MjAwOTNjYzEuc2V0Q29udGVudChodG1sX2MzNGQ4Y2JhOGZhNTQwMjQ4YzlkNmMyOGNjMjU4ZWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhYThkYWNhZmYyZjRlOTJiYzYwNjQ3NTE3MDczOWJjLmJpbmRQb3B1cChwb3B1cF8yMDhiYjA3Y2U2ZGE0Y2Q5ODNhMGM2ZDYyMDA5M2NjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTViOWE4NzJmNmI0OWE4OWJlMzZmZWY4OTRkYzVhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTA3ODMwNWViNTE0OWZmYmI2NGYxNzkzMmEwMDI4YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmRkMDUzMmFmOTc0YzBiYTBmNGFlY2Q0NWE5YmJlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJkZDA1MzJhZjk3NGMwYmEwZjRhZWNkNDVhOWJiZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTUwNzgzMDVlYjUxNDlmZmJiNjRmMTc5MzJhMDAyOGIuc2V0Q29udGVudChodG1sXzIyZGQwNTMyYWY5NzRjMGJhMGY0YWVjZDQ1YTliYmVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxNWI5YTg3MmY2YjQ5YTg5YmUzNmZlZjg5NGRjNWFmLmJpbmRQb3B1cChwb3B1cF8xNTA3ODMwNWViNTE0OWZmYmI2NGYxNzkzMmEwMDI4Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZTFkNzAxZTgwYzQ0Y2I1OWVlMzk1YzQyNmJlNmY4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDk3Mjc5YmZhZjZlNDgzY2I2ZTM3ODliZDk5MTg0YzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzRlNDUyNDYzMzM1NGJlOGJhZjMyYzNjYmY2YTY1M2YgPSAkKCc8ZGl2IGlkPSJodG1sX2M0ZTQ1MjQ2MzMzNTRiZThiYWYzMmMzY2JmNmE2NTNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDk3Mjc5YmZhZjZlNDgzY2I2ZTM3ODliZDk5MTg0YzEuc2V0Q29udGVudChodG1sX2M0ZTQ1MjQ2MzMzNTRiZThiYWYzMmMzY2JmNmE2NTNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlMWQ3MDFlODBjNDRjYjU5ZWUzOTVjNDI2YmU2ZjhkLmJpbmRQb3B1cChwb3B1cF9kOTcyNzliZmFmNmU0ODNjYjZlMzc4OWJkOTkxODRjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YmM3MTEwOTQ1YzY0NWQxODQzMTFhMDE5OGEwNWI3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNDQ4ZWQzOGNlZjc0OTA3YWUzNjcxN2FjNDk3MjU2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTVkOTNkNWY4NGM0MGQxOTdjMGJhZDAyMWM3ZjhlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWE1ZDkzZDVmODRjNDBkMTk3YzBiYWQwMjFjN2Y4ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ0OGVkMzhjZWY3NDkwN2FlMzY3MTdhYzQ5NzI1NmQuc2V0Q29udGVudChodG1sX2FhNWQ5M2Q1Zjg0YzQwZDE5N2MwYmFkMDIxYzdmOGUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiYzcxMTA5NDVjNjQ1ZDE4NDMxMWEwMTk4YTA1YjdlLmJpbmRQb3B1cChwb3B1cF9iNDQ4ZWQzOGNlZjc0OTA3YWUzNjcxN2FjNDk3MjU2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYjE1N2RlZDllMzY0NDA4ODcxNzkwOWFkMzQ3NTZiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODI3M2IxNjk3MjA0OGE5YTI3ZmFhODA4NjliYmRmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjRkNjk5YjNmNmE0NTZlYjYwNGZhMWNlYTg5YjAwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzY0ZDY5OWIzZjZhNDU2ZWI2MDRmYTFjZWE4OWIwMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODI3M2IxNjk3MjA0OGE5YTI3ZmFhODA4NjliYmRmZC5zZXRDb250ZW50KGh0bWxfMzY0ZDY5OWIzZjZhNDU2ZWI2MDRmYTFjZWE4OWIwMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWIxNTdkZWQ5ZTM2NDQwODg3MTc5MDlhZDM0NzU2YjAuYmluZFBvcHVwKHBvcHVwXzk4MjczYjE2OTcyMDQ4YTlhMjdmYWE4MDg2OWJiZGZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyNDZjMDJjYmVjZjRmN2VhMTRlYmIwYTFiZjA2NWE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5ZGYwOTlkYTAyMzRlNmNiMzJjYjJhZWE5YjQwODUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4NjA5NmJlYTNhYzQ4MDc5NTYzOWZmNDhhOTliZjRhID0gJCgnPGRpdiBpZD0iaHRtbF9kODYwOTZiZWEzYWM0ODA3OTU2MzlmZjQ4YTk5YmY0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5ZGYwOTlkYTAyMzRlNmNiMzJjYjJhZWE5YjQwODUzLnNldENvbnRlbnQoaHRtbF9kODYwOTZiZWEzYWM0ODA3OTU2MzlmZjQ4YTk5YmY0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MjQ2YzAyY2JlY2Y0ZjdlYTE0ZWJiMGExYmYwNjVhNC5iaW5kUG9wdXAocG9wdXBfNzlkZjA5OWRhMDIzNGU2Y2IzMmNiMmFlYTliNDA4NTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTUwNDA0YTcyYTcxNDUzNWFhMzQ0OGNmNDg1YzlhYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1MzE5NGY0MzBlNDQxZjI5YWIwMTA0ZWJjMjNjZDllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjODU3ZTQwNGUwNTQzNDdiNzAxNjU0ODEyMTQ4MDk5ID0gJCgnPGRpdiBpZD0iaHRtbF9hYzg1N2U0MDRlMDU0MzQ3YjcwMTY1NDgxMjE0ODA5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1MzE5NGY0MzBlNDQxZjI5YWIwMTA0ZWJjMjNjZDllLnNldENvbnRlbnQoaHRtbF9hYzg1N2U0MDRlMDU0MzQ3YjcwMTY1NDgxMjE0ODA5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNTA0MDRhNzJhNzE0NTM1YWEzNDQ4Y2Y0ODVjOWFiOC5iaW5kUG9wdXAocG9wdXBfODUzMTk0ZjQzMGU0NDFmMjlhYjAxMDRlYmMyM2NkOWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQ0YzgwNDU1MTcyNDRlZDhhYThlYjI3ZWRjOTI3MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGEwOTc1YzEyMjdlNDNjN2FhNzFiZmZmOGFmNGQ3YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzY2NTg1ZWQ3ZDRhNGZhM2FkODAyMWMwMGRkNGJiYjQgPSAkKCc8ZGl2IGlkPSJodG1sXzc2NjU4NWVkN2Q0YTRmYTNhZDgwMjFjMDBkZDRiYmI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGEwOTc1YzEyMjdlNDNjN2FhNzFiZmZmOGFmNGQ3Yjcuc2V0Q29udGVudChodG1sXzc2NjU4NWVkN2Q0YTRmYTNhZDgwMjFjMDBkZDRiYmI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZkNGM4MDQ1NTE3MjQ0ZWQ4YWE4ZWIyN2VkYzkyNzMxLmJpbmRQb3B1cChwb3B1cF80YTA5NzVjMTIyN2U0M2M3YWE3MWJmZmY4YWY0ZDdiNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84N2ZkMGU2MGQxY2I0ZWNkYWJkMTJkMzhiNmI4YzMwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YjJmNjQxZWZkYzE0ZWUwYTgzNDg3Mzc0OThiYjhhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNmE4YTg1N2JiZDE0OWViYTUxZmIxNWE5N2Q0NzJhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTZhOGE4NTdiYmQxNDllYmE1MWZiMTVhOTdkNDcyYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGIyZjY0MWVmZGMxNGVlMGE4MzQ4NzM3NDk4YmI4YTYuc2V0Q29udGVudChodG1sX2E2YThhODU3YmJkMTQ5ZWJhNTFmYjE1YTk3ZDQ3MmFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3ZmQwZTYwZDFjYjRlY2RhYmQxMmQzOGI2YjhjMzA2LmJpbmRQb3B1cChwb3B1cF80YjJmNjQxZWZkYzE0ZWUwYTgzNDg3Mzc0OThiYjhhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YWM2OTE2ZmJmYzE0ODdlOTZjYmU2MGM2ZWNlY2VlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2YzZGFiMDZmNzE3NDgxOWJiODY2ZTdmMGFhZmI0NzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWM0YzQ1MDc4NTE2NDljNDg3NWNkZmQ2NzdmZTJiYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzFjNGM0NTA3ODUxNjQ5YzQ4NzVjZGZkNjc3ZmUyYmI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZjNkYWIwNmY3MTc0ODE5YmI4NjZlN2YwYWFmYjQ3MS5zZXRDb250ZW50KGh0bWxfMWM0YzQ1MDc4NTE2NDljNDg3NWNkZmQ2NzdmZTJiYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFjNjkxNmZiZmMxNDg3ZTk2Y2JlNjBjNmVjZWNlZWIuYmluZFBvcHVwKHBvcHVwXzNmM2RhYjA2ZjcxNzQ4MTliYjg2NmU3ZjBhYWZiNDcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkODI0MzUyNWU5NjRhYWU5ZTdmOGRkNGQ4NzNjMmUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOTZmNzFkMWI0ZDU0ZjJjOWY4YmUzNDhkYmQ1ODc2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmU3OGQ4M2Y4NGU0ZTlhYmVkZTU0YjQyYTUyYWE1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmZlNzhkODNmODRlNGU5YWJlZGU1NGI0MmE1MmFhNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk2ZjcxZDFiNGQ1NGYyYzlmOGJlMzQ4ZGJkNTg3NjQuc2V0Q29udGVudChodG1sXzZmZTc4ZDgzZjg0ZTRlOWFiZWRlNTRiNDJhNTJhYTU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlkODI0MzUyNWU5NjRhYWU5ZTdmOGRkNGQ4NzNjMmUxLmJpbmRQb3B1cChwb3B1cF9jOTZmNzFkMWI0ZDU0ZjJjOWY4YmUzNDhkYmQ1ODc2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YmU2ZTRmZmQ1NWE0YWM0OTk5YzFiMWJhZjM1NDZkOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDhlMGFjMTEyMDc0YjQ5OWYxYzMxZDQ2OTdkMmQyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YWY0M2M2YjQ2YTA0ZGZjYTZjYzM5YzE2MzY5ZmIzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWFmNDNjNmI0NmEwNGRmY2E2Y2MzOWMxNjM2OWZiM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwOGUwYWMxMTIwNzRiNDk5ZjFjMzFkNDY5N2QyZDJlLnNldENvbnRlbnQoaHRtbF85YWY0M2M2YjQ2YTA0ZGZjYTZjYzM5YzE2MzY5ZmIzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YmU2ZTRmZmQ1NWE0YWM0OTk5YzFiMWJhZjM1NDZkOS5iaW5kUG9wdXAocG9wdXBfNzA4ZTBhYzExMjA3NGI0OTlmMWMzMWQ0Njk3ZDJkMmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODA2YjQ5MWE5MmRkNDc4ZmExZmZmYTBkNzBhNzU5YTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDlmZjBmNzNhNTcxNGYxYmJmZmY1MGIwNmY0YWYzY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWEwN2RmNjc5NjlhNDU3ODg1ZjljOWMzNmIxYTA3NmQgPSAkKCc8ZGl2IGlkPSJodG1sX2VhMDdkZjY3OTY5YTQ1Nzg4NWY5YzljMzZiMWEwNzZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOWZmMGY3M2E1NzE0ZjFiYmZmZjUwYjA2ZjRhZjNjZC5zZXRDb250ZW50KGh0bWxfZWEwN2RmNjc5NjlhNDU3ODg1ZjljOWMzNmIxYTA3NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODA2YjQ5MWE5MmRkNDc4ZmExZmZmYTBkNzBhNzU5YTEuYmluZFBvcHVwKHBvcHVwXzA5ZmYwZjczYTU3MTRmMWJiZmZmNTBiMDZmNGFmM2NkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwYmRlMDJlZmI2NjQ2ZDhhOGE5YWRhNTU3MDkyNzBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjMGFjOTg1MDdlMTQyYTA5ODZlODYzNmI3ODAzYmE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0NzU4NDczNTBlOTQ4ZmNhZmUxN2NhODQ3YzA3NjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF84NDc1ODQ3MzUwZTk0OGZjYWZlMTdjYTg0N2MwNzY0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjMGFjOTg1MDdlMTQyYTA5ODZlODYzNmI3ODAzYmE0LnNldENvbnRlbnQoaHRtbF84NDc1ODQ3MzUwZTk0OGZjYWZlMTdjYTg0N2MwNzY0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MGJkZTAyZWZiNjY0NmQ4YThhOWFkYTU1NzA5MjcwZi5iaW5kUG9wdXAocG9wdXBfMmMwYWM5ODUwN2UxNDJhMDk4NmU4NjM2Yjc4MDNiYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U3NGVkYjRhZjY0NGJhMjk3OTk3MjgyZjljOGUxNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhYTRiZjYyMTQ3YzRhOThhODcyMTE2YmM5NmM3OGU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4MzIzNGZjOTRiMTQ1ODNhMTM0Njc4MGZiYzkyYWRkID0gJCgnPGRpdiBpZD0iaHRtbF84ODMyMzRmYzk0YjE0NTgzYTEzNDY3ODBmYmM5MmFkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFhNGJmNjIxNDdjNGE5OGE4NzIxMTZiYzk2Yzc4ZTYuc2V0Q29udGVudChodG1sXzg4MzIzNGZjOTRiMTQ1ODNhMTM0Njc4MGZiYzkyYWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlNzRlZGI0YWY2NDRiYTI5Nzk5NzI4MmY5YzhlMTYxLmJpbmRQb3B1cChwb3B1cF9mYWE0YmY2MjE0N2M0YTk4YTg3MjExNmJjOTZjNzhlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTI2YTQzZWM1YzM0NGZhYTkxZDIxMzZjZGI3MzNhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThiM2UxMTBiODhlNDY0ODgzOGU5ZDY2NGRlMGY0NzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzFhZTE2OTk4MDg0NDJhZjgzNjhmYWExN2U3YjgxZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzMxYWUxNjk5ODA4NDQyYWY4MzY4ZmFhMTdlN2I4MWRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOThiM2UxMTBiODhlNDY0ODgzOGU5ZDY2NGRlMGY0Nzcuc2V0Q29udGVudChodG1sXzMxYWUxNjk5ODA4NDQyYWY4MzY4ZmFhMTdlN2I4MWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5MjZhNDNlYzVjMzQ0ZmFhOTFkMjEzNmNkYjczM2FiLmJpbmRQb3B1cChwb3B1cF85OGIzZTExMGI4OGU0NjQ4ODM4ZTlkNjY0ZGUwZjQ3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTU3M2VjZjI0OTk0OTIwOWUyNmIzNmM5NjhjNGM4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTY1ZTg4OThhOTVhNDRmMGI1YWQ3YzZjZDQyMWE5OTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmRiODZhNDE1ZWRhNGJmZTllMWJhM2ViYmE1NTExN2UgPSAkKCc8ZGl2IGlkPSJodG1sXzZkYjg2YTQxNWVkYTRiZmU5ZTFiYTNlYmJhNTUxMTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NjVlODg5OGE5NWE0NGYwYjVhZDdjNmNkNDIxYTk5MC5zZXRDb250ZW50KGh0bWxfNmRiODZhNDE1ZWRhNGJmZTllMWJhM2ViYmE1NTExN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTE1NzNlY2YyNDk5NDkyMDllMjZiMzZjOTY4YzRjOGMuYmluZFBvcHVwKHBvcHVwXzU2NWU4ODk4YTk1YTQ0ZjBiNWFkN2M2Y2Q0MjFhOTkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmZDAyZWI3NWIxYzRhMmM5ZDA3ZmM5ODJjY2NkMTM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGI1ZGRlZmRmOGY0NWJkODlmNzRjNzBiMDkzOWE4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xY2Y2YmVjMWEzNDU0MGM5OWQyZmExYmUzYjE3NDYxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWNmNmJlYzFhMzQ1NDBjOTlkMmZhMWJlM2IxNzQ2MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThiNWRkZWZkZjhmNDViZDg5Zjc0YzcwYjA5MzlhODguc2V0Q29udGVudChodG1sXzFjZjZiZWMxYTM0NTQwYzk5ZDJmYTFiZTNiMTc0NjEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmZDAyZWI3NWIxYzRhMmM5ZDA3ZmM5ODJjY2NkMTM0LmJpbmRQb3B1cChwb3B1cF81OGI1ZGRlZmRmOGY0NWJkODlmNzRjNzBiMDkzOWE4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOTJlMGExNzM1NzA0NDc3YjAxZTIwMGI2OTA5OTk2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODJmN2RmZjNmZGJkNDVjMTgxMmFjMjU3YTE5MmEyYjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTkyNzlmYWRlZmRlNGNmMmFiOGU3ODBhYjcxZDk3NDEgPSAkKCc8ZGl2IGlkPSJodG1sXzk5Mjc5ZmFkZWZkZTRjZjJhYjhlNzgwYWI3MWQ5NzQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MmY3ZGZmM2ZkYmQ0NWMxODEyYWMyNTdhMTkyYTJiMy5zZXRDb250ZW50KGh0bWxfOTkyNzlmYWRlZmRlNGNmMmFiOGU3ODBhYjcxZDk3NDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTkyZTBhMTczNTcwNDQ3N2IwMWUyMDBiNjkwOTk5NjEuYmluZFBvcHVwKHBvcHVwXzgyZjdkZmYzZmRiZDQ1YzE4MTJhYzI1N2ExOTJhMmIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3NTYxMDU5MTFkYzQwOGZhMTk0OWZhY2E4ZmYxMDU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg3ZDQ3M2Q2ODY3NDU4NWFmZWI3MGM0YzVjZDc3NTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE2MzllNzgxMzE2NGI3MTk5MTQzNjYyMzVlNmEyY2UgPSAkKCc8ZGl2IGlkPSJodG1sX2MxNjM5ZTc4MTMxNjRiNzE5OTE0MzY2MjM1ZTZhMmNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4N2Q0NzNkNjg2NzQ1ODVhZmViNzBjNGM1Y2Q3NzU5LnNldENvbnRlbnQoaHRtbF9jMTYzOWU3ODEzMTY0YjcxOTkxNDM2NjIzNWU2YTJjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNzU2MTA1OTExZGM0MDhmYTE5NDlmYWNhOGZmMTA1NS5iaW5kUG9wdXAocG9wdXBfZDg3ZDQ3M2Q2ODY3NDU4NWFmZWI3MGM0YzVjZDc3NTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTk4NmYxMDFhYzZiNDEzOWJjYzBkMzA1MWNhNjlkZDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhkMDMxY2E3MWQzNDUxZWE4YzEzNzJmYjMyNzc5NjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBjZGJjNjgyN2ExNGJkYzg2ZmJiNTUzMzEwYjJiM2QgPSAkKCc8ZGl2IGlkPSJodG1sX2MwY2RiYzY4MjdhMTRiZGM4NmZiYjU1MzMxMGIyYjNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4ZDAzMWNhNzFkMzQ1MWVhOGMxMzcyZmIzMjc3OTY4LnNldENvbnRlbnQoaHRtbF9jMGNkYmM2ODI3YTE0YmRjODZmYmI1NTMzMTBiMmIzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOTg2ZjEwMWFjNmI0MTM5YmNjMGQzMDUxY2E2OWRkNS5iaW5kUG9wdXAocG9wdXBfODhkMDMxY2E3MWQzNDUxZWE4YzEzNzJmYjMyNzc5NjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGM4Y2IzMWI0ODE0NDAyNzkwNmQ3MGQxYzA0N2I4NzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1NWFkNjBkZGM3MzRlNDliOGQwZjRiYmIxOGEzYWM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwMWY0MDMzZGFiZTQ5NjVhNjI5NjA4NzdiOWZhZjYyID0gJCgnPGRpdiBpZD0iaHRtbF9jMDFmNDAzM2RhYmU0OTY1YTYyOTYwODc3YjlmYWY2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTVhZDYwZGRjNzM0ZTQ5YjhkMGY0YmJiMThhM2FjNC5zZXRDb250ZW50KGh0bWxfYzAxZjQwMzNkYWJlNDk2NWE2Mjk2MDg3N2I5ZmFmNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGM4Y2IzMWI0ODE0NDAyNzkwNmQ3MGQxYzA0N2I4NzkuYmluZFBvcHVwKHBvcHVwXzk1NWFkNjBkZGM3MzRlNDliOGQwZjRiYmIxOGEzYWM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmYjA2ZWQ0ODNjMjRlN2ZiZGM1NmViY2ZkNTg5OTc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTQ4OWYyN2ViNzc0NWNhYjc4MmI0NjY3NDdjYzRlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTMxZDJkMjU4NmQ0OTZkYWI4YTczZWU2MzU2ZDc4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmEzMWQyZDI1ODZkNDk2ZGFiOGE3M2VlNjM1NmQ3ODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTQ4OWYyN2ViNzc0NWNhYjc4MmI0NjY3NDdjYzRlZC5zZXRDb250ZW50KGh0bWxfYmEzMWQyZDI1ODZkNDk2ZGFiOGE3M2VlNjM1NmQ3ODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2ZiMDZlZDQ4M2MyNGU3ZmJkYzU2ZWJjZmQ1ODk5NzQuYmluZFBvcHVwKHBvcHVwXzk1NDg5ZjI3ZWI3NzQ1Y2FiNzgyYjQ2Njc0N2NjNGVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzZjMxN2JkYzJjNTRmNzVhOWNjYjkzODM0MDA3ZDA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjk0OGQ1N2E5Zjc0M2JhOGIyZjQ4N2U4ODg3YzViYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDFjYmJkMTJjOWM0ZjljOGI5ODA1MWVjYjg2YmRmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQxY2JiZDEyYzljNGY5YzhiOTgwNTFlY2I4NmJkZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjk0OGQ1N2E5Zjc0M2JhOGIyZjQ4N2U4ODg3YzViYy5zZXRDb250ZW50KGh0bWxfYjQxY2JiZDEyYzljNGY5YzhiOTgwNTFlY2I4NmJkZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNmMzE3YmRjMmM1NGY3NWE5Y2NiOTM4MzQwMDdkMDkuYmluZFBvcHVwKHBvcHVwX2JiOTQ4ZDU3YTlmNzQzYmE4YjJmNDg3ZTg4ODdjNWJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhYmMzMjgyOGRlMTQxMTNhNDM1ODAxMjA1ZTQ3NzhhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxZDQ0Mzc3YjM1YjRmNDM4ZTc4ZmVjMDhiNThkOTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhMTRjYTNkZjNlYjQ4OWY5MjZlNTdkYTM2Y2IwYTM4ID0gJCgnPGRpdiBpZD0iaHRtbF81YTE0Y2EzZGYzZWI0ODlmOTI2ZTU3ZGEzNmNiMGEzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDFkNDQzNzdiMzViNGY0MzhlNzhmZWMwOGI1OGQ5MTYuc2V0Q29udGVudChodG1sXzVhMTRjYTNkZjNlYjQ4OWY5MjZlNTdkYTM2Y2IwYTM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhYmMzMjgyOGRlMTQxMTNhNDM1ODAxMjA1ZTQ3NzhhLmJpbmRQb3B1cChwb3B1cF8wMWQ0NDM3N2IzNWI0ZjQzOGU3OGZlYzA4YjU4ZDkxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNDYxMGQ5YTNmYmE0ODJmYTNmM2VlMzgwMzI3ZmI4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMzcyOGY1MDI0NzY0M2I2YTQ1NTQxY2RkYmY3OTY4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjJkMGRmM2ZhMWY0ZDI0YTgzYzZlNzg5YzgzMTVlNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzIyZDBkZjNmYTFmNGQyNGE4M2M2ZTc4OWM4MzE1ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzNzI4ZjUwMjQ3NjQzYjZhNDU1NDFjZGRiZjc5NjgzLnNldENvbnRlbnQoaHRtbF8zMjJkMGRmM2ZhMWY0ZDI0YTgzYzZlNzg5YzgzMTVlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNDYxMGQ5YTNmYmE0ODJmYTNmM2VlMzgwMzI3ZmI4My5iaW5kUG9wdXAocG9wdXBfZjM3MjhmNTAyNDc2NDNiNmE0NTU0MWNkZGJmNzk2ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTJjZGQ0ZjA3NjQwNDZlYzg3ZGI3MzgxZjFmOWQ1YmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTQ3ZTZlYmM1YmQxNGFmMmFkYWQzNjZmMGUzZWViM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzU2ZDdiOTU2ZDJhNGQ3MThlZDhhZDYxZTNmYzYwNzMgPSAkKCc8ZGl2IGlkPSJodG1sXzM1NmQ3Yjk1NmQyYTRkNzE4ZWQ4YWQ2MWUzZmM2MDczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQ3ZTZlYmM1YmQxNGFmMmFkYWQzNjZmMGUzZWViM2Euc2V0Q29udGVudChodG1sXzM1NmQ3Yjk1NmQyYTRkNzE4ZWQ4YWQ2MWUzZmM2MDczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyY2RkNGYwNzY0MDQ2ZWM4N2RiNzM4MWYxZjlkNWJjLmJpbmRQb3B1cChwb3B1cF8xNDdlNmViYzViZDE0YWYyYWRhZDM2NmYwZTNlZWIzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTU3N2U2NGU3Yzg0ZTRiYWU4ZGRiZTAwN2MwMWEzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjBjYmI4NDlhZDM5NGRmYTllZDA3ODI2YTczMWUwNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2JiOTgwODYzM2Q4NDZjZjkwNWExMWI5ZDA2YzYxYmEgPSAkKCc8ZGl2IGlkPSJodG1sXzdiYjk4MDg2MzNkODQ2Y2Y5MDVhMTFiOWQwNmM2MWJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBjYmI4NDlhZDM5NGRmYTllZDA3ODI2YTczMWUwNDQuc2V0Q29udGVudChodG1sXzdiYjk4MDg2MzNkODQ2Y2Y5MDVhMTFiOWQwNmM2MWJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NTc3ZTY0ZTdjODRlNGJhZThkZGJlMDA3YzAxYTM3LmJpbmRQb3B1cChwb3B1cF82MGNiYjg0OWFkMzk0ZGZhOWVkMDc4MjZhNzMxZTA0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTAwZjg5MDBjZWI0MDdkYTg3MGJkMmVkNWJlYzU4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYjUyZmQyZTRiZDE0MzkyYjIyZGU5YjliM2FiYWEwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZGEyNzBkNTZmM2U0ZjQ2YjNhMGI1MDU0YWI3NTc1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGRhMjcwZDU2ZjNlNGY0NmIzYTBiNTA1NGFiNzU3NTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjUyZmQyZTRiZDE0MzkyYjIyZGU5YjliM2FiYWEwYS5zZXRDb250ZW50KGh0bWxfOGRhMjcwZDU2ZjNlNGY0NmIzYTBiNTA1NGFiNzU3NTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzkwMGY4OTAwY2ViNDA3ZGE4NzBiZDJlZDViZWM1ODIuYmluZFBvcHVwKHBvcHVwX2NiNTJmZDJlNGJkMTQzOTJiMjJkZTliOWIzYWJhYTBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0OTBlNzAxNTYyMjQyZGFiZWJiM2Q4ZmE5MzY1NDEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4ZmY3MDdhYWQ1ZjQwNzM5MDNjMTFhNmY5MTliYmVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwNjc4NWZjY2I3NDRkMzNhZmZjNmZmY2E4MzAwM2UyID0gJCgnPGRpdiBpZD0iaHRtbF9iMDY3ODVmY2NiNzQ0ZDMzYWZmYzZmZmNhODMwMDNlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOGZmNzA3YWFkNWY0MDczOTAzYzExYTZmOTE5YmJlZS5zZXRDb250ZW50KGh0bWxfYjA2Nzg1ZmNjYjc0NGQzM2FmZmM2ZmZjYTgzMDAzZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjQ5MGU3MDE1NjIyNDJkYWJlYmIzZDhmYTkzNjU0MTIuYmluZFBvcHVwKHBvcHVwX2M4ZmY3MDdhYWQ1ZjQwNzM5MDNjMTFhNmY5MTliYmVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljZDM5YTExMjI4YjRhZjBiMWI0OWI3NTE5YTk5Mzk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTQzMjc4NDhlYTU0NDI2YjkxMTVjMTJlOWQ2Mzk1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YzBhZTUxODkyYjc0YzJjYjUwNWY2ZDJhMGNjZWRjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2MwYWU1MTg5MmI3NGMyY2I1MDVmNmQyYTBjY2VkY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTQzMjc4NDhlYTU0NDI2YjkxMTVjMTJlOWQ2Mzk1NS5zZXRDb250ZW50KGh0bWxfN2MwYWU1MTg5MmI3NGMyY2I1MDVmNmQyYTBjY2VkY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWNkMzlhMTEyMjhiNGFmMGIxYjQ5Yjc1MTlhOTkzOTQuYmluZFBvcHVwKHBvcHVwXzE1NDMyNzg0OGVhNTQ0MjZiOTExNWMxMmU5ZDYzOTU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzMWQ2MzQxMDExNDQzMGY4OTBjODdiM2I2Y2MyMDkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzNTc4Y2UzN2ExMzQ3YzdhYTUzMTFjN2IzMjVmZTk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0N2NhMWY3OGZjNDQyNzQ5ZjJjMDVkNzkxMWVkZDdkID0gJCgnPGRpdiBpZD0iaHRtbF8zNDdjYTFmNzhmYzQ0Mjc0OWYyYzA1ZDc5MTFlZGQ3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzNTc4Y2UzN2ExMzQ3YzdhYTUzMTFjN2IzMjVmZTk2LnNldENvbnRlbnQoaHRtbF8zNDdjYTFmNzhmYzQ0Mjc0OWYyYzA1ZDc5MTFlZGQ3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzFkNjM0MTAxMTQ0MzBmODkwYzg3YjNiNmNjMjA5My5iaW5kUG9wdXAocG9wdXBfMTM1NzhjZTM3YTEzNDdjN2FhNTMxMWM3YjMyNWZlOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmZmMGM0ZGZlMWQ2NGFiNjgyNDRkYTI5MTc4MTY0NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVhYWViNzUyYzhmNDE5ZDg2ZjIxYjcxMDNiNjQwMDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ4ODM5YTNjOGQxNDRiNDhiZDI1NjZiYTMzY2IzODAgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ODgzOWEzYzhkMTQ0YjQ4YmQyNTY2YmEzM2NiMzgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzVhYWViNzUyYzhmNDE5ZDg2ZjIxYjcxMDNiNjQwMDcuc2V0Q29udGVudChodG1sXzU0ODgzOWEzYzhkMTQ0YjQ4YmQyNTY2YmEzM2NiMzgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmZjBjNGRmZTFkNjRhYjY4MjQ0ZGEyOTE3ODE2NDQyLmJpbmRQb3B1cChwb3B1cF83NWFhZWI3NTJjOGY0MTlkODZmMjFiNzEwM2I2NDAwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNmE1ODUwNzY1ODU0YjQyOTYxYzdlYWUxMzU0NzA2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OWViNDJkOTk1OWQ0Njk0YjU5NTQyZTI3OTFhN2M3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZWIxZjlhNWQwZjc0MzU1YmQ4YjI3OWRlZmM0YTMzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGViMWY5YTVkMGY3NDM1NWJkOGIyNzlkZWZjNGEzMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWViNDJkOTk1OWQ0Njk0YjU5NTQyZTI3OTFhN2M3NS5zZXRDb250ZW50KGh0bWxfNGViMWY5YTVkMGY3NDM1NWJkOGIyNzlkZWZjNGEzMzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDZhNTg1MDc2NTg1NGI0Mjk2MWM3ZWFlMTM1NDcwNjEuYmluZFBvcHVwKHBvcHVwXzQ5ZWI0MmQ5OTU5ZDQ2OTRiNTk1NDJlMjc5MWE3Yzc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmNjhiYTBhNzMzMzQzMzVhNjAwODRlOGQ2MzJjOTExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2N2U2MmFmNzZmNjRiOTdhNjdlZDU2ODIxY2JlMDA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4NTI1OTI5NGIyZjRlMTg4Nzg1Y2JkOTBmZmE2MGY0ID0gJCgnPGRpdiBpZD0iaHRtbF9kODUyNTkyOTRiMmY0ZTE4ODc4NWNiZDkwZmZhNjBmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2N2U2MmFmNzZmNjRiOTdhNjdlZDU2ODIxY2JlMDA2LnNldENvbnRlbnQoaHRtbF9kODUyNTkyOTRiMmY0ZTE4ODc4NWNiZDkwZmZhNjBmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZjY4YmEwYTczMzM0MzM1YTYwMDg0ZThkNjMyYzkxMS5iaW5kUG9wdXAocG9wdXBfYTY3ZTYyYWY3NmY2NGI5N2E2N2VkNTY4MjFjYmUwMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY4MTUxNjRjMjllNGEyODk5OGEzYThiNjU1ZDc0YWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDE4Nzc0MTZiZTViNGEzZTg4Y2VmYTk0ZTBmOWY1ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDIzMTVhNzM3ODVmNGUxY2EwNzcyODZlNDgzOTE4MTkgPSAkKCc8ZGl2IGlkPSJodG1sXzAyMzE1YTczNzg1ZjRlMWNhMDc3Mjg2ZTQ4MzkxODE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDE4Nzc0MTZiZTViNGEzZTg4Y2VmYTk0ZTBmOWY1ZDIuc2V0Q29udGVudChodG1sXzAyMzE1YTczNzg1ZjRlMWNhMDc3Mjg2ZTQ4MzkxODE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2ODE1MTY0YzI5ZTRhMjg5OThhM2E4YjY1NWQ3NGFhLmJpbmRQb3B1cChwb3B1cF9kMTg3NzQxNmJlNWI0YTNlODhjZWZhOTRlMGY5ZjVkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOGVkZTNmMmUyYjg0N2QwODgyYzhjMTMxMTY1OWJmNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNGJmZmNkNWE1NjY0NmE5ODg0NTk2M2EyNjliMjNjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODZiNmRiOWVmYzE0NTUyOGU2NTQ0YWRmYmNlYzE4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDg2YjZkYjllZmMxNDU1MjhlNjU0NGFkZmJjZWMxODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNGJmZmNkNWE1NjY0NmE5ODg0NTk2M2EyNjliMjNjNC5zZXRDb250ZW50KGh0bWxfZDg2YjZkYjllZmMxNDU1MjhlNjU0NGFkZmJjZWMxODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzhlZGUzZjJlMmI4NDdkMDg4MmM4YzEzMTE2NTliZjQuYmluZFBvcHVwKHBvcHVwXzE0YmZmY2Q1YTU2NjQ2YTk4ODQ1OTYzYTI2OWIyM2M0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlZjZiM2Q5ODc4YzRkYzNiZWUzMzg1YjFhZGRjZTAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDMzYjQyYzk5MmI0YjEyYjg5OGE5N2YyM2MxYTY0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzZjOTI4MThjY2U0NmFjODRkZjFkNGRmNzY4N2QyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWM2YzkyODE4Y2NlNDZhYzg0ZGYxZDRkZjc2ODdkMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjAzM2I0MmM5OTJiNGIxMmI4OThhOTdmMjNjMWE2NGIuc2V0Q29udGVudChodG1sXzVjNmM5MjgxOGNjZTQ2YWM4NGRmMWQ0ZGY3Njg3ZDJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlZjZiM2Q5ODc4YzRkYzNiZWUzMzg1YjFhZGRjZTAxLmJpbmRQb3B1cChwb3B1cF9iMDMzYjQyYzk5MmI0YjEyYjg5OGE5N2YyM2MxYTY0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZDEyY2VkZDk2Mjk0ZTBlOGRkZTFkZTljZTkyMTNiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWNiNjc1ZDE1NmJkNDdjZWI3Y2ZjZTEwZTU4MmQxZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdjN2QxZGMxN2I1NGQ0YWE1OTgwZWY5Y2FjNGZjYjkgPSAkKCc8ZGl2IGlkPSJodG1sXzE3YzdkMWRjMTdiNTRkNGFhNTk4MGVmOWNhYzRmY2I5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2I2NzVkMTU2YmQ0N2NlYjdjZmNlMTBlNTgyZDFlYy5zZXRDb250ZW50KGh0bWxfMTdjN2QxZGMxN2I1NGQ0YWE1OTgwZWY5Y2FjNGZjYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQxMmNlZGQ5NjI5NGUwZThkZGUxZGU5Y2U5MjEzYmYuYmluZFBvcHVwKHBvcHVwXzVjYjY3NWQxNTZiZDQ3Y2ViN2NmY2UxMGU1ODJkMWVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZTdlOTRjMTEyMzQ4NTA5M2YwMDdkMWZmZjUyNDQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0NDg1YjU1NDBiNzRhNjY4Njc0ZGY4NzNjZjUzZWNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1YzZhOWFmZmFjNDQ5MjNhZDJhMDU2ZjJiMWUzZjJhID0gJCgnPGRpdiBpZD0iaHRtbF9lNWM2YTlhZmZhYzQ0OTIzYWQyYTA1NmYyYjFlM2YyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzQ0ODViNTU0MGI3NGE2Njg2NzRkZjg3M2NmNTNlY2Quc2V0Q29udGVudChodG1sX2U1YzZhOWFmZmFjNDQ5MjNhZDJhMDU2ZjJiMWUzZjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkZTdlOTRjMTEyMzQ4NTA5M2YwMDdkMWZmZjUyNDQ1LmJpbmRQb3B1cChwb3B1cF83NDQ4NWI1NTQwYjc0YTY2ODY3NGRmODczY2Y1M2VjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDAzZjZiOTllNWQ0OGEwYmE2YjkyMzZhYTE1MThjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MThlZWJkZjBiZTY0OTA1YTc2MDA0N2Q4NGIyM2M3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTU2N2UyYWQ0YjM0MzFiYTI4ZTRmM2IyZDk5ZTYwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzU1NjdlMmFkNGIzNDMxYmEyOGU0ZjNiMmQ5OWU2MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxOGVlYmRmMGJlNjQ5MDVhNzYwMDQ3ZDg0YjIzYzdmLnNldENvbnRlbnQoaHRtbF8zNTU2N2UyYWQ0YjM0MzFiYTI4ZTRmM2IyZDk5ZTYwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDAzZjZiOTllNWQ0OGEwYmE2YjkyMzZhYTE1MThjZS5iaW5kUG9wdXAocG9wdXBfNzE4ZWViZGYwYmU2NDkwNWE3NjAwNDdkODRiMjNjN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2RlMWFiMzk2NDQwNGM1YmEwMmIyMDg3M2JmNjExMTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlOTE1NmUxNTk1MjQ3ODNiMWMxNjY1Y2Q4ZGNhZWI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmMGYwNDYyYTBlMzRlNGZiNjEwN2EzZjRmNzhjODgyID0gJCgnPGRpdiBpZD0iaHRtbF9hZjBmMDQ2MmEwZTM0ZTRmYjYxMDdhM2Y0Zjc4Yzg4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlOTE1NmUxNTk1MjQ3ODNiMWMxNjY1Y2Q4ZGNhZWI5LnNldENvbnRlbnQoaHRtbF9hZjBmMDQ2MmEwZTM0ZTRmYjYxMDdhM2Y0Zjc4Yzg4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZGUxYWIzOTY0NDA0YzViYTAyYjIwODczYmY2MTExNy5iaW5kUG9wdXAocG9wdXBfNGU5MTU2ZTE1OTUyNDc4M2IxYzE2NjVjZDhkY2FlYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDc0ZTg5YzJhOWE5NGY1NDlmMDQ4ODU0NzBlMmVkYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhYTYyMmRjYWJhYjQzODhiMDNmODc0ODE1N2I4NTAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1NTE0NzE2ZDRkMzQxMTY5Y2U5N2YwMTQ5ZWRjMDY4ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTUxNDcxNmQ0ZDM0MTE2OWNlOTdmMDE0OWVkYzA2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhYTYyMmRjYWJhYjQzODhiMDNmODc0ODE1N2I4NTAzLnNldENvbnRlbnQoaHRtbF9iNTUxNDcxNmQ0ZDM0MTE2OWNlOTdmMDE0OWVkYzA2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzRlODljMmE5YTk0ZjU0OWYwNDg4NTQ3MGUyZWRhNi5iaW5kUG9wdXAocG9wdXBfNGFhNjIyZGNhYmFiNDM4OGIwM2Y4NzQ4MTU3Yjg1MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JmODIwYTZhZTVjNDMyZmFlNDJmMjViNjFlNzI3ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDM2ZmJjNjA2ZTE0NmI2OGRlMmZiZmQwNGQ2MDM2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjliOWVmNmZmOTQ0YjBhOTE0MThiYTliMThlOTNlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGI5YjllZjZmZjk0NGIwYTkxNDE4YmE5YjE4ZTkzZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQzNmZiYzYwNmUxNDZiNjhkZTJmYmZkMDRkNjAzNjguc2V0Q29udGVudChodG1sXzBiOWI5ZWY2ZmY5NDRiMGE5MTQxOGJhOWIxOGU5M2VmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZjgyMGE2YWU1YzQzMmZhZTQyZjI1YjYxZTcyN2ZiLmJpbmRQb3B1cChwb3B1cF80NDM2ZmJjNjA2ZTE0NmI2OGRlMmZiZmQwNGQ2MDM2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMmIzYjUxNGEzOTk0MWM1ODczYTk5OTc3OWNjMzZiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzQ5M2FjMDU5Zjc0ZDVkOTczNWMwOWYwMTZiZWExMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjhhNmY5MzA4Y2M0ZTg1OTExZDViYTNmZjI5YzIwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfODY4YTZmOTMwOGNjNGU4NTkxMWQ1YmEzZmYyOWMyMDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTM0OTNhYzA1OWY3NGQ1ZDk3MzVjMDlmMDE2YmVhMTEuc2V0Q29udGVudChodG1sXzg2OGE2ZjkzMDhjYzRlODU5MTFkNWJhM2ZmMjljMjA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyYjNiNTE0YTM5OTQxYzU4NzNhOTk5Nzc5Y2MzNmJiLmJpbmRQb3B1cChwb3B1cF9hMzQ5M2FjMDU5Zjc0ZDVkOTczNWMwOWYwMTZiZWExMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OGFlMjlhYmRmNzU0NTQ3YmNiOWVlMzMzNmQ4ZjkzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDU5MzM5ZWMyZjMzNDlhNzhjYThmOTZmNGFhMDRkMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmFlZjM5Yjg4ZmQ3NGJmODllMTRjMTAwNGY3ZGUyOTggPSAkKCc8ZGl2IGlkPSJodG1sXzJhZWYzOWI4OGZkNzRiZjg5ZTE0YzEwMDRmN2RlMjk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDU5MzM5ZWMyZjMzNDlhNzhjYThmOTZmNGFhMDRkMWIuc2V0Q29udGVudChodG1sXzJhZWYzOWI4OGZkNzRiZjg5ZTE0YzEwMDRmN2RlMjk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4YWUyOWFiZGY3NTQ1NDdiY2I5ZWUzMzM2ZDhmOTMzLmJpbmRQb3B1cChwb3B1cF8wNTkzMzllYzJmMzM0OWE3OGNhOGY5NmY0YWEwNGQxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYWM5YWVlZjZjMjY0ZjQwOGMzZWM4NTk3ZjM1YjEwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZDRhN2I3YzkyYWQ0N2EzODIzMWE0YWJjNjM1MjZjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDFlZjdjNzUyZmU0ZWJjOWI4OWYwNjlkODU3MTUxYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQxZWY3Yzc1MmZlNGViYzliODlmMDY5ZDg1NzE1MWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkNGE3YjdjOTJhZDQ3YTM4MjMxYTRhYmM2MzUyNmNiLnNldENvbnRlbnQoaHRtbF8yNDFlZjdjNzUyZmU0ZWJjOWI4OWYwNjlkODU3MTUxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYWM5YWVlZjZjMjY0ZjQwOGMzZWM4NTk3ZjM1YjEwNS5iaW5kUG9wdXAocG9wdXBfZGQ0YTdiN2M5MmFkNDdhMzgyMzFhNGFiYzYzNTI2Y2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQxMzAyZDIwYjQ5NDYwMzhhOWMxNWM1MTg0NmZlZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWZhOWYyNmJhNmJlNDNkMmFhYmEwYTYwOGQzMDdmZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2RiMmNiMzliYWFlNGRkYTg3M2NlMzhhNDIzYTEwMWUgPSAkKCc8ZGl2IGlkPSJodG1sXzNkYjJjYjM5YmFhZTRkZGE4NzNjZTM4YTQyM2ExMDFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmYTlmMjZiYTZiZTQzZDJhYWJhMGE2MDhkMzA3ZmU2LnNldENvbnRlbnQoaHRtbF8zZGIyY2IzOWJhYWU0ZGRhODczY2UzOGE0MjNhMTAxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDEzMDJkMjBiNDk0NjAzOGE5YzE1YzUxODQ2ZmVkYi5iaW5kUG9wdXAocG9wdXBfYWZhOWYyNmJhNmJlNDNkMmFhYmEwYTYwOGQzMDdmZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTg1ZWYxMGNiZDdkNDMxYjlhMjVjNjllYjdiYzU1NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTk2ZmEyYzk4MzU5NDc3NmIyYTk5OTA2YjYyYTM5YTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM1ZjFjYzVkMmJlNDgxZjlhYjA2N2ZiMjlmMmExMTQgPSAkKCc8ZGl2IGlkPSJodG1sXzUzNWYxY2M1ZDJiZTQ4MWY5YWIwNjdmYjI5ZjJhMTE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5NmZhMmM5ODM1OTQ3NzZiMmE5OTkwNmI2MmEzOWE1LnNldENvbnRlbnQoaHRtbF81MzVmMWNjNWQyYmU0ODFmOWFiMDY3ZmIyOWYyYTExNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODVlZjEwY2JkN2Q0MzFiOWEyNWM2OWViN2JjNTU0NC5iaW5kUG9wdXAocG9wdXBfYTk2ZmEyYzk4MzU5NDc3NmIyYTk5OTA2YjYyYTM5YTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjk0ZjJhMDRhNGRhNDRjM2FmNjBkODFlZjNiMzE1ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3ZTVjZDkyNjIzZjRjY2FiZDNjODk2NTZjMWRmYTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyNzQwZDNiZjU4OTRkMTJhODRhYmJhNGM3ZmI5Mzk3ID0gJCgnPGRpdiBpZD0iaHRtbF82Mjc0MGQzYmY1ODk0ZDEyYTg0YWJiYTRjN2ZiOTM5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTdlNWNkOTI2MjNmNGNjYWJkM2M4OTY1NmMxZGZhMzguc2V0Q29udGVudChodG1sXzYyNzQwZDNiZjU4OTRkMTJhODRhYmJhNGM3ZmI5Mzk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5NGYyYTA0YTRkYTQ0YzNhZjYwZDgxZWYzYjMxNTg4LmJpbmRQb3B1cChwb3B1cF9lN2U1Y2Q5MjYyM2Y0Y2NhYmQzYzg5NjU2YzFkZmEzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMjAwZTczNmVhOTI0YTg0OTZiZGEzZDFiZmUzMjBlNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzAzOWYwOWY4Y2E4NDQzMTkxYTQwMGRmOGQwNTY0MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNiYTkyMDNmNmFmNGU3NWJjM2IzNGNhZjVlNzcyYzYgPSAkKCc8ZGl2IGlkPSJodG1sXzJjYmE5MjAzZjZhZjRlNzViYzNiMzRjYWY1ZTc3MmM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwMzlmMDlmOGNhODQ0MzE5MWE0MDBkZjhkMDU2NDA4LnNldENvbnRlbnQoaHRtbF8yY2JhOTIwM2Y2YWY0ZTc1YmMzYjM0Y2FmNWU3NzJjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjAwZTczNmVhOTI0YTg0OTZiZGEzZDFiZmUzMjBlNy5iaW5kUG9wdXAocG9wdXBfYzAzOWYwOWY4Y2E4NDQzMTkxYTQwMGRmOGQwNTY0MDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjc2YTM3NzAwYTUzNDdmOWI3M2FkYzQ1Y2I5ZDAzYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzM1N2UwOWFjODBlNDg5ZGIxMjM5OWYxZmJjYmI3NWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTgwOWY1MjZiOTdjNGMyZDg2YjRkNWYwYzQ1ZTlhNzcgPSAkKCc8ZGl2IGlkPSJodG1sX2E4MDlmNTI2Yjk3YzRjMmQ4NmI0ZDVmMGM0NWU5YTc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzU3ZTA5YWM4MGU0ODlkYjEyMzk5ZjFmYmNiYjc1Yy5zZXRDb250ZW50KGh0bWxfYTgwOWY1MjZiOTdjNGMyZDg2YjRkNWYwYzQ1ZTlhNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjc2YTM3NzAwYTUzNDdmOWI3M2FkYzQ1Y2I5ZDAzYzguYmluZFBvcHVwKHBvcHVwXzMzNTdlMDlhYzgwZTQ4OWRiMTIzOTlmMWZiY2JiNzVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5N2MyYjY3NTA3NjQ1NjJhOGJkYTAxNzhmYWI1MDdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTViYzdkMDg0Y2U0ODkyYmI1MmQ3MjQ5YTBhYmQyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjgxZGE5ODgwOWM0MTNlYmNjZTk2MDhhMDA1MmJjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTI4MWRhOTg4MDljNDEzZWJjY2U5NjA4YTAwNTJiYzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTViYzdkMDg0Y2U0ODkyYmI1MmQ3MjQ5YTBhYmQyMC5zZXRDb250ZW50KGh0bWxfNTI4MWRhOTg4MDljNDEzZWJjY2U5NjA4YTAwNTJiYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk3YzJiNjc1MDc2NDU2MmE4YmRhMDE3OGZhYjUwN2YuYmluZFBvcHVwKHBvcHVwX2YxNWJjN2QwODRjZTQ4OTJiYjUyZDcyNDlhMGFiZDIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxMmI2ZjU3ZTgyMDRjYWJiZTM1MTIxMjQxZmU3ZTJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5NGE3NzMxY2I5NjQ3N2Y4MmRjNWM5N2FjMjhlYjM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhOTA5ZDE3YjVhODQ0MTE5ZDE5ODVlMTRjNzQzODU2ID0gJCgnPGRpdiBpZD0iaHRtbF8zYTkwOWQxN2I1YTg0NDExOWQxOTg1ZTE0Yzc0Mzg1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5NGE3NzMxY2I5NjQ3N2Y4MmRjNWM5N2FjMjhlYjM5LnNldENvbnRlbnQoaHRtbF8zYTkwOWQxN2I1YTg0NDExOWQxOTg1ZTE0Yzc0Mzg1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMTJiNmY1N2U4MjA0Y2FiYmUzNTEyMTI0MWZlN2UyZC5iaW5kUG9wdXAocG9wdXBfOTk0YTc3MzFjYjk2NDc3ZjgyZGM1Yzk3YWMyOGViMzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjEzZTg2YmRlYTZhNDE5YjkxZmIyN2QzODQzZTE0MzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzNDhkNDcxOWEzODQ5MGE4MmVkZjcxMDM4MTlhZDUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1MTAzOTExYWZkZTQxYjA5ZWVmNDFjMjkzYzQyYTI1ID0gJCgnPGRpdiBpZD0iaHRtbF84NTEwMzkxMWFmZGU0MWIwOWVlZjQxYzI5M2M0MmEyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzQ4ZDQ3MTlhMzg0OTBhODJlZGY3MTAzODE5YWQ1MS5zZXRDb250ZW50KGh0bWxfODUxMDM5MTFhZmRlNDFiMDllZWY0MWMyOTNjNDJhMjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjEzZTg2YmRlYTZhNDE5YjkxZmIyN2QzODQzZTE0MzIuYmluZFBvcHVwKHBvcHVwX2EzNDhkNDcxOWEzODQ5MGE4MmVkZjcxMDM4MTlhZDUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzYzJmMDhjMzY1MjRjNWZhZjY4YmZhODdlOTUwNjZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiZDM3MTQxMzQzYjQzZTZiNzgyZGNiOGRmYjBkMTZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmYTcwNjA3ZDE1NjQzOTFhNWU1YWY3MWZiYzA2ZmZlID0gJCgnPGRpdiBpZD0iaHRtbF8zZmE3MDYwN2QxNTY0MzkxYTVlNWFmNzFmYmMwNmZmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiZDM3MTQxMzQzYjQzZTZiNzgyZGNiOGRmYjBkMTZmLnNldENvbnRlbnQoaHRtbF8zZmE3MDYwN2QxNTY0MzkxYTVlNWFmNzFmYmMwNmZmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80M2MyZjA4YzM2NTI0YzVmYWY2OGJmYTg3ZTk1MDY2ZC5iaW5kUG9wdXAocG9wdXBfYmJkMzcxNDEzNDNiNDNlNmI3ODJkY2I4ZGZiMGQxNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjNiMGQ1ZGFiNGMxNDE1MmFmYzljOGQ4ODIxZTU2YmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGUzMDYzNmUwZjFkNGMyMjk0OTI0YjE4OTdmNmYyNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlkMzYxNjc3YTQ2NDU5MWEwYTY5YmY2NzJkMTRkYjcgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZDM2MTY3N2E0NjQ1OTFhMGE2OWJmNjcyZDE0ZGI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlMzA2MzZlMGYxZDRjMjI5NDkyNGIxODk3ZjZmMjRhLnNldENvbnRlbnQoaHRtbF84OWQzNjE2NzdhNDY0NTkxYTBhNjliZjY3MmQxNGRiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iM2IwZDVkYWI0YzE0MTUyYWZjOWM4ZDg4MjFlNTZiZS5iaW5kUG9wdXAocG9wdXBfMGUzMDYzNmUwZjFkNGMyMjk0OTI0YjE4OTdmNmYyNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDM4NDdlYjNlMjg2NDVjMTkxNTViNDg1NjVlMmVjMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2M0MTNlYjA5ZTAxNDYxMjkyMDI0MTczYTgzMWM2MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTRjNzAyN2YzOGZkNDY3NjljYzNjYjZmMDc0MWRlYzkgPSAkKCc8ZGl2IGlkPSJodG1sXzk0YzcwMjdmMzhmZDQ2NzY5Y2MzY2I2ZjA3NDFkZWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M0MTNlYjA5ZTAxNDYxMjkyMDI0MTczYTgzMWM2MmUuc2V0Q29udGVudChodG1sXzk0YzcwMjdmMzhmZDQ2NzY5Y2MzY2I2ZjA3NDFkZWM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzODQ3ZWIzZTI4NjQ1YzE5MTU1YjQ4NTY1ZTJlYzI5LmJpbmRQb3B1cChwb3B1cF9jYzQxM2ViMDllMDE0NjEyOTIwMjQxNzNhODMxYzYyZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOGI4ZmE5YzQ3YzE0YTk3OGEyZTZjNjliMDVlMGFjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGRkOGMzMWY3OTNlNDUyZmIwMjI0MjQxYzBhYThiMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ2MWUzMzcyNWJmNGMzMGFkMjY2OWViNTI2NDkwYzggPSAkKCc8ZGl2IGlkPSJodG1sXzFkNjFlMzM3MjViZjRjMzBhZDI2NjllYjUyNjQ5MGM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkZDhjMzFmNzkzZTQ1MmZiMDIyNDI0MWMwYWE4YjFkLnNldENvbnRlbnQoaHRtbF8xZDYxZTMzNzI1YmY0YzMwYWQyNjY5ZWI1MjY0OTBjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOGI4ZmE5YzQ3YzE0YTk3OGEyZTZjNjliMDVlMGFjYS5iaW5kUG9wdXAocG9wdXBfMGRkOGMzMWY3OTNlNDUyZmIwMjI0MjQxYzBhYThiMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWIxNmVhZmIwMjcwNGQwNDllNTNlZWMxMWY4OTdkOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2MjI2NTVkZmFiZTQ3M2E5YjI0NTY4YzVmZTA5NjQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiZTJlZjFlZmE5MjQ1YjM5NGViMmJkY2JkZTdjYzM1ID0gJCgnPGRpdiBpZD0iaHRtbF82YmUyZWYxZWZhOTI0NWIzOTRlYjJiZGNiZGU3Y2MzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjIyNjU1ZGZhYmU0NzNhOWIyNDU2OGM1ZmUwOTY0OS5zZXRDb250ZW50KGh0bWxfNmJlMmVmMWVmYTkyNDViMzk0ZWIyYmRjYmRlN2NjMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWIxNmVhZmIwMjcwNGQwNDllNTNlZWMxMWY4OTdkOTguYmluZFBvcHVwKHBvcHVwXzk2MjI2NTVkZmFiZTQ3M2E5YjI0NTY4YzVmZTA5NjQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlYmYzY2QxNzljMjQyY2FhM2EzODFhMTVkMWZjMTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzI0YjlhMmFlNDA0MGI2ODc0MWYzMGM3Y2UwMzA5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGI3NDA4MTQ0MGE0MDk2YWUyYTcxN2NiMzVkN2YyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTRiNzQwODE0NDBhNDA5NmFlMmE3MTdjYjM1ZDdmMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzMjRiOWEyYWU0MDQwYjY4NzQxZjMwYzdjZTAzMDkyLnNldENvbnRlbnQoaHRtbF9hNGI3NDA4MTQ0MGE0MDk2YWUyYTcxN2NiMzVkN2YyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZWJmM2NkMTc5YzI0MmNhYTNhMzgxYTE1ZDFmYzEzOS5iaW5kUG9wdXAocG9wdXBfZTMyNGI5YTJhZTQwNDBiNjg3NDFmMzBjN2NlMDMwOTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNkMjQ2MmU2ZWQwNGY3MDk2NzVlOGUwZmJkZWMyOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGVjZTI2N2JkNGQxNDkyZTg5NzQxNmYyYjM4ZmU0NjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmIzM2M5MmM0OTBlNDRlOTlkZDA1YzJlZTIwZDI3NGEgPSAkKCc8ZGl2IGlkPSJodG1sX2JiMzNjOTJjNDkwZTQ0ZTk5ZGQwNWMyZWUyMGQyNzRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZWNlMjY3YmQ0ZDE0OTJlODk3NDE2ZjJiMzhmZTQ2OS5zZXRDb250ZW50KGh0bWxfYmIzM2M5MmM0OTBlNDRlOTlkZDA1YzJlZTIwZDI3NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNkMjQ2MmU2ZWQwNGY3MDk2NzVlOGUwZmJkZWMyOWYuYmluZFBvcHVwKHBvcHVwXzBlY2UyNjdiZDRkMTQ5MmU4OTc0MTZmMmIzOGZlNDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmYjg2OTRmZjVkMDQyMjM5OWQzZDI2NTg3M2MyMGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWE0ZTZhYzllMjNmNDdmYmI0OTgxYjljMGM2Nzc1ZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjQ1OGJkYTU5N2E1NDdiN2I5NWFiNmQ4YmU1Njg2ZDggPSAkKCc8ZGl2IGlkPSJodG1sX2I0NThiZGE1OTdhNTQ3YjdiOTVhYjZkOGJlNTY4NmQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE0ZTZhYzllMjNmNDdmYmI0OTgxYjljMGM2Nzc1ZDEuc2V0Q29udGVudChodG1sX2I0NThiZGE1OTdhNTQ3YjdiOTVhYjZkOGJlNTY4NmQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmYjg2OTRmZjVkMDQyMjM5OWQzZDI2NTg3M2MyMGUwLmJpbmRQb3B1cChwb3B1cF9hYTRlNmFjOWUyM2Y0N2ZiYjQ5ODFiOWMwYzY3NzVkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZjBhMGRkYzhmZGU0OTJjYTgyNjM0NjA1NTFiYzAyNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81M2I5ZTA0ZjJiMzc0ZTc2YmZmNzY1Y2FmOTBkYWJkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTIyMzg1YzkyZWI0YmExODViYjRmMzQyZjVjZGZmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTkyMjM4NWM5MmViNGJhMTg1YmI0ZjM0MmY1Y2RmZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTNiOWUwNGYyYjM3NGU3NmJmZjc2NWNhZjkwZGFiZGEuc2V0Q29udGVudChodG1sX2E5MjIzODVjOTJlYjRiYTE4NWJiNGYzNDJmNWNkZmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmMGEwZGRjOGZkZTQ5MmNhODI2MzQ2MDU1MWJjMDI3LmJpbmRQb3B1cChwb3B1cF81M2I5ZTA0ZjJiMzc0ZTc2YmZmNzY1Y2FmOTBkYWJkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzcwNWU4MDk5NzM0YWE0OGRhZTg1MTY2NDNkZDY5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOWI3NzlhNzIwYmE0NDFkOTg3NjdiNGYzYWM0ZWI5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmU2Yzk1ZmYwZGI0YWMwYWMwNTFjODA1MmNmZDEwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZlNmM5NWZmMGRiNGFjMGFjMDUxYzgwNTJjZmQxMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5Yjc3OWE3MjBiYTQ0MWQ5ODc2N2I0ZjNhYzRlYjlhLnNldENvbnRlbnQoaHRtbF8xNmU2Yzk1ZmYwZGI0YWMwYWMwNTFjODA1MmNmZDEwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzcwNWU4MDk5NzM0YWE0OGRhZTg1MTY2NDNkZDY5YS5iaW5kUG9wdXAocG9wdXBfMTliNzc5YTcyMGJhNDQxZDk4NzY3YjRmM2FjNGViOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2M4ODk1NGVjMDg3NGE5M2I3ODNmYmUzYWJmMTdjNDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRjNDFhYzlkZTliNDg0ZTkwMzYzMDdiNTdmNmFmOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkxYmNiNDMzNTdiNGFjZDk0NzIyNGMxZWVhNmZlMDkgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5MWJjYjQzMzU3YjRhY2Q5NDcyMjRjMWVlYTZmZTA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRjNDFhYzlkZTliNDg0ZTkwMzYzMDdiNTdmNmFmOTkuc2V0Q29udGVudChodG1sX2Y5MWJjYjQzMzU3YjRhY2Q5NDcyMjRjMWVlYTZmZTA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjODg5NTRlYzA4NzRhOTNiNzgzZmJlM2FiZjE3YzQyLmJpbmRQb3B1cChwb3B1cF82ZGM0MWFjOWRlOWI0ODRlOTAzNjMwN2I1N2Y2YWY5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTgyMzFjMzI5YWM0ZDU5OTk3OThhZWZjZTVlMjI4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RmYTUzMDhmZDFiNDI3MWJhYmRjNGQ2MjJjZTUwNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJhMzE0NDI1Nzk3NGY4Mjk5MzJiNWQ0NTBkZmMwMGEgPSAkKCc8ZGl2IGlkPSJodG1sX2FiYTMxNDQyNTc5NzRmODI5OTMyYjVkNDUwZGZjMDBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGZhNTMwOGZkMWI0MjcxYmFiZGM0ZDYyMmNlNTA3NC5zZXRDb250ZW50KGh0bWxfYWJhMzE0NDI1Nzk3NGY4Mjk5MzJiNWQ0NTBkZmMwMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDU4MjMxYzMyOWFjNGQ1OTk5Nzk4YWVmY2U1ZTIyOGUuYmluZFBvcHVwKHBvcHVwX2NkZmE1MzA4ZmQxYjQyNzFiYWJkYzRkNjIyY2U1MDc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1ZjYzZGViNzJjNjQ3MTk5NTEyOTI3N2MzZjhkYjVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGIzZGRkYzU0MTRhNDliZWI3MmU4ZDY1OGJlZDMzYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjZmNGJkNGUyNGZiNGNkYzlkNDc2NDVjYWU1ZmZiOGMgPSAkKCc8ZGl2IGlkPSJodG1sX2I2ZjRiZDRlMjRmYjRjZGM5ZDQ3NjQ1Y2FlNWZmYjhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGIzZGRkYzU0MTRhNDliZWI3MmU4ZDY1OGJlZDMzYjEuc2V0Q29udGVudChodG1sX2I2ZjRiZDRlMjRmYjRjZGM5ZDQ3NjQ1Y2FlNWZmYjhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ZjYzZGViNzJjNjQ3MTk5NTEyOTI3N2MzZjhkYjVmLmJpbmRQb3B1cChwb3B1cF8wYjNkZGRjNTQxNGE0OWJlYjcyZThkNjU4YmVkMzNiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYWMwNjc4OGFhNzM0MjY2YmU5OTZhN2ZmNjRkYzg1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MGJmY2ZkNzZlZTA0NzgzOGNhZDdhYTdjMmY3NmU4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzBkM2I2ZDcyNGY0Mzc0YmMyOGMyMTE3ZWNjZTc5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGMwZDNiNmQ3MjRmNDM3NGJjMjhjMjExN2VjY2U3OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MGJmY2ZkNzZlZTA0NzgzOGNhZDdhYTdjMmY3NmU4ZC5zZXRDb250ZW50KGh0bWxfNGMwZDNiNmQ3MjRmNDM3NGJjMjhjMjExN2VjY2U3OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWFjMDY3ODhhYTczNDI2NmJlOTk2YTdmZjY0ZGM4NTguYmluZFBvcHVwKHBvcHVwXzkwYmZjZmQ3NmVlMDQ3ODM4Y2FkN2FhN2MyZjc2ZThkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3Y2U1YzFlMjQ1NDRhMTFhYTI1OTIwODBlNzQxOTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmNDRhYzU0NTQzYzRhODI4MjY5NzhjZWQ1MDg0ODVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0MDVhZDc1YTZkMjQ2ZDFhNzhjMTg3ZjEyMDE5ZWZiID0gJCgnPGRpdiBpZD0iaHRtbF9jNDA1YWQ3NWE2ZDI0NmQxYTc4YzE4N2YxMjAxOWVmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmNDRhYzU0NTQzYzRhODI4MjY5NzhjZWQ1MDg0ODVkLnNldENvbnRlbnQoaHRtbF9jNDA1YWQ3NWE2ZDI0NmQxYTc4YzE4N2YxMjAxOWVmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2NlNWMxZTI0NTQ0YTExYWEyNTkyMDgwZTc0MTk5Yy5iaW5kUG9wdXAocG9wdXBfNGY0NGFjNTQ1NDNjNGE4MjgyNjk3OGNlZDUwODQ4NWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDNlMTk0ODA5OTgyNDY5NmEyNDYwYTg3MThhNWFhMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yN2RjNmRhN2JmNjc0YjA2OGE3NjY1MmM0NjBhYjM3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOGVmMTZmMmZiMTI0NmExOTBiOWQ2NzU2NmZkZTMxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMThlZjE2ZjJmYjEyNDZhMTkwYjlkNjc1NjZmZGUzMTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3ZGM2ZGE3YmY2NzRiMDY4YTc2NjUyYzQ2MGFiMzdjLnNldENvbnRlbnQoaHRtbF8xOGVmMTZmMmZiMTI0NmExOTBiOWQ2NzU2NmZkZTMxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kM2UxOTQ4MDk5ODI0Njk2YTI0NjBhODcxOGE1YWEwMC5iaW5kUG9wdXAocG9wdXBfMjdkYzZkYTdiZjY3NGIwNjhhNzY2NTJjNDYwYWIzN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzEwNmYyNWVkZTUxNDhhNmE4ZTA5OGJiNGYwMjg5ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTBkOTYwZTAyZGFiNGI4MThhOGE0ODRhMzBiMDNhNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWQ0MmEyZWFjOWI0NDMwNmE4ZDA1YzNlOWIyOTc4NzUgPSAkKCc8ZGl2IGlkPSJodG1sXzVkNDJhMmVhYzliNDQzMDZhOGQwNWMzZTliMjk3ODc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwZDk2MGUwMmRhYjRiODE4YThhNDg0YTMwYjAzYTYxLnNldENvbnRlbnQoaHRtbF81ZDQyYTJlYWM5YjQ0MzA2YThkMDVjM2U5YjI5Nzg3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMTA2ZjI1ZWRlNTE0OGE2YThlMDk4YmI0ZjAyODlmOS5iaW5kUG9wdXAocG9wdXBfNTBkOTYwZTAyZGFiNGI4MThhOGE0ODRhMzBiMDNhNjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI0ZDc4YTA1ZjY2NGExMWE0YmM5NjJhNWMwOGU3MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU0YjA3OTYzZmRhNDBlNWI0OGY5NjNhODY5NTRhY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTM1MDUzODNkYWNjNGQ3NDg0N2M5YzMzNzYzNDdjNWEgPSAkKCc8ZGl2IGlkPSJodG1sXzkzNTA1MzgzZGFjYzRkNzQ4NDdjOWMzMzc2MzQ3YzVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTRiMDc5NjNmZGE0MGU1YjQ4Zjk2M2E4Njk1NGFjYS5zZXRDb250ZW50KGh0bWxfOTM1MDUzODNkYWNjNGQ3NDg0N2M5YzMzNzYzNDdjNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWI0ZDc4YTA1ZjY2NGExMWE0YmM5NjJhNWMwOGU3MzAuYmluZFBvcHVwKHBvcHVwXzFlNGIwNzk2M2ZkYTQwZTViNDhmOTYzYTg2OTU0YWNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwYzY1ZWRmMzQ2NjRkMjY4Yjk1M2VmMjMzMGIxZmQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyZTU4ZjE3MTk2YzQyNDE5YzE4NTE1NGI4NjJhNzY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwMTQ1OTcyODY2NzRkZGZiOTU1MWU1ZWQwMGUwZTljID0gJCgnPGRpdiBpZD0iaHRtbF81MDE0NTk3Mjg2Njc0ZGRmYjk1NTFlNWVkMDBlMGU5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MmU1OGYxNzE5NmM0MjQxOWMxODUxNTRiODYyYTc2OS5zZXRDb250ZW50KGh0bWxfNTAxNDU5NzI4NjY3NGRkZmI5NTUxZTVlZDAwZTBlOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTBjNjVlZGYzNDY2NGQyNjhiOTUzZWYyMzMwYjFmZDUuYmluZFBvcHVwKHBvcHVwXzgyZTU4ZjE3MTk2YzQyNDE5YzE4NTE1NGI4NjJhNzY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyNDc4ZWI0MDFmOTQ4OTQ4NzQ1ZjA1YmJkZWQ0NjE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhYmJhODI2YzAwNDQ1ODM5ZjE0ZGExNTViYzBiMGU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhOTM1MTA2ZDQwMzRkMThhMGUwOGUzMmFiNjVhNjk4ID0gJCgnPGRpdiBpZD0iaHRtbF9hYTkzNTEwNmQ0MDM0ZDE4YTBlMDhlMzJhYjY1YTY5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhYmJhODI2YzAwNDQ1ODM5ZjE0ZGExNTViYzBiMGU0LnNldENvbnRlbnQoaHRtbF9hYTkzNTEwNmQ0MDM0ZDE4YTBlMDhlMzJhYjY1YTY5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjQ3OGViNDAxZjk0ODk0ODc0NWYwNWJiZGVkNDYxOC5iaW5kUG9wdXAocG9wdXBfMWFiYmE4MjZjMDA0NDU4MzlmMTRkYTE1NWJjMGIwZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGNhZmZlY2FkNjc0NGEyYmExMTI3ZjMyMGU0YWM3YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU3ZTI1NDAzY2U4NGEyYzg2ZGU2YzhmOWUwNGFlMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2IyMDJhNmU0NjBlNDdhMWJkMGM4Zjg3MmI2N2EzODQgPSAkKCc8ZGl2IGlkPSJodG1sXzdiMjAyYTZlNDYwZTQ3YTFiZDBjOGY4NzJiNjdhMzg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1N2UyNTQwM2NlODRhMmM4NmRlNmM4ZjllMDRhZTBkLnNldENvbnRlbnQoaHRtbF83YjIwMmE2ZTQ2MGU0N2ExYmQwYzhmODcyYjY3YTM4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kY2FmZmVjYWQ2NzQ0YTJiYTExMjdmMzIwZTRhYzdiMy5iaW5kUG9wdXAocG9wdXBfNTU3ZTI1NDAzY2U4NGEyYzg2ZGU2YzhmOWUwNGFlMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNmZDVhNTRkZTE2NGZkNzhjNWU3ODExNzY4OWU4OTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkN2JmNmQ2NjVkNTQxZTc5NjBiODM4YmJlZDk0YzlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkZDcwM2ZiNDg1NTQ2MTViMjhiZDk3MzgzMTVmM2M4ID0gJCgnPGRpdiBpZD0iaHRtbF8yZGQ3MDNmYjQ4NTU0NjE1YjI4YmQ5NzM4MzE1ZjNjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDdiZjZkNjY1ZDU0MWU3OTYwYjgzOGJiZWQ5NGM5Zi5zZXRDb250ZW50KGh0bWxfMmRkNzAzZmI0ODU1NDYxNWIyOGJkOTczODMxNWYzYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmNmZDVhNTRkZTE2NGZkNzhjNWU3ODExNzY4OWU4OTIuYmluZFBvcHVwKHBvcHVwXzlkN2JmNmQ2NjVkNTQxZTc5NjBiODM4YmJlZDk0YzlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxOWJjZjJjYzA2MjQ5NDliYzBlNTIyZjdmMDM4Yjg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkMmYxMWUwZjA1NzQ3MDI4YWQ0MWIzOGI1MTM2NGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5N2U2NWQ2NmVlNjQ1YjdhYWMwZjA5ODgxYWMzZWRlID0gJCgnPGRpdiBpZD0iaHRtbF80OTdlNjVkNjZlZTY0NWI3YWFjMGYwOTg4MWFjM2VkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkMmYxMWUwZjA1NzQ3MDI4YWQ0MWIzOGI1MTM2NGZiLnNldENvbnRlbnQoaHRtbF80OTdlNjVkNjZlZTY0NWI3YWFjMGYwOTg4MWFjM2VkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMTliY2YyY2MwNjI0OTQ5YmMwZTUyMmY3ZjAzOGI4OS5iaW5kUG9wdXAocG9wdXBfM2QyZjExZTBmMDU3NDcwMjhhZDQxYjM4YjUxMzY0ZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDFkZTc1YjliNjMwNGU1ZDkwNzU3OGQwODFmZDYzOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk3NjFhNzI5YjE3NGEzZWI2NjdjMmFiMzlhOTJkYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2VlZGFkODljZGMwNDhiMDk1YmM0N2UyMzlhZDBlM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2NlZWRhZDg5Y2RjMDQ4YjA5NWJjNDdlMjM5YWQwZTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTc2MWE3MjliMTc0YTNlYjY2N2MyYWIzOWE5MmRiYy5zZXRDb250ZW50KGh0bWxfY2VlZGFkODljZGMwNDhiMDk1YmM0N2UyMzlhZDBlM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDFkZTc1YjliNjMwNGU1ZDkwNzU3OGQwODFmZDYzOTIuYmluZFBvcHVwKHBvcHVwX2M5NzYxYTcyOWIxNzRhM2ViNjY3YzJhYjM5YTkyZGJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyNzgxZGEwZjVjZjRhYWI4YmFiNWZmOTg3MmRlMjM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDBhYTY2MjcwMmFmNGQ2MGI3MzI5YTA1YTliOGI1NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjY0MTNkN2MyOTBlNGMxNWFmMzE1ZTVmZDBiODJmZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzI2NDEzZDdjMjkwZTRjMTVhZjMxNWU1ZmQwYjgyZmQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDBhYTY2MjcwMmFmNGQ2MGI3MzI5YTA1YTliOGI1NmQuc2V0Q29udGVudChodG1sXzI2NDEzZDdjMjkwZTRjMTVhZjMxNWU1ZmQwYjgyZmQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyNzgxZGEwZjVjZjRhYWI4YmFiNWZmOTg3MmRlMjM3LmJpbmRQb3B1cChwb3B1cF80MGFhNjYyNzAyYWY0ZDYwYjczMjlhMDVhOWI4YjU2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMzY1YWViYjY5ZTM0ZjNhOWQ0YThmZDFiMGQ1ZDAxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyMmE2NTBmOTgwMzQwZDQ4NGQxNmRkMTA1MmY3NzJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiNmE4NjFiMDk5MzRjYmViYTZmMGYzYzdkOWI4MWQxID0gJCgnPGRpdiBpZD0iaHRtbF8yYjZhODYxYjA5OTM0Y2JlYmE2ZjBmM2M3ZDliODFkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyMmE2NTBmOTgwMzQwZDQ4NGQxNmRkMTA1MmY3NzJiLnNldENvbnRlbnQoaHRtbF8yYjZhODYxYjA5OTM0Y2JlYmE2ZjBmM2M3ZDliODFkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMzY1YWViYjY5ZTM0ZjNhOWQ0YThmZDFiMGQ1ZDAxNS5iaW5kUG9wdXAocG9wdXBfNDIyYTY1MGY5ODAzNDBkNDg0ZDE2ZGQxMDUyZjc3MmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWJmZmViNzk5MWMxNDRjZGI0MDNhODczMzdiMTE0MjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3YjE3YmI4ZWI3OTQyM2VhMWQyOTkyMWU4MzU1Mzg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3ZTliMDc1YWI1YjQ0ZGRhMGY5ZDdhYWU3NzlmOTIzID0gJCgnPGRpdiBpZD0iaHRtbF82N2U5YjA3NWFiNWI0NGRkYTBmOWQ3YWFlNzc5ZjkyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iN2IxN2JiOGViNzk0MjNlYTFkMjk5MjFlODM1NTM4NC5zZXRDb250ZW50KGh0bWxfNjdlOWIwNzVhYjViNDRkZGEwZjlkN2FhZTc3OWY5MjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWJmZmViNzk5MWMxNDRjZGI0MDNhODczMzdiMTE0MjAuYmluZFBvcHVwKHBvcHVwX2I3YjE3YmI4ZWI3OTQyM2VhMWQyOTkyMWU4MzU1Mzg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjYzViNzM3Y2NlMzRmYTliMjAyYWJjZmIzYzMwZDQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkOGE5ZjQ2YWZkODQyZmI4YWRjOTEzYzU4MzZhZjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmMDkxNmQ1MDNhZjQ2NGI5Y2NjZGNjMjg5MmYyMzljID0gJCgnPGRpdiBpZD0iaHRtbF80ZjA5MTZkNTAzYWY0NjRiOWNjY2RjYzI4OTJmMjM5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZDhhOWY0NmFmZDg0MmZiOGFkYzkxM2M1ODM2YWY5YS5zZXRDb250ZW50KGh0bWxfNGYwOTE2ZDUwM2FmNDY0YjljY2NkY2MyODkyZjIzOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWNjNWI3MzdjY2UzNGZhOWIyMDJhYmNmYjNjMzBkNDMuYmluZFBvcHVwKHBvcHVwX2RkOGE5ZjQ2YWZkODQyZmI4YWRjOTEzYzU4MzZhZjlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0MDhhOWI0YTdhNTQzMTZhODg1ZTJjNTZjODE4NTlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNWUxNDJjYTRjYjQ0NmUzYjQxZDVhZGIwOWY1OGQ1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTZhNjRmYmZkYzQ0ZjNiOTY4YTEwODQ2YWRjZjIyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE2YTY0ZmJmZGM0NGYzYjk2OGExMDg0NmFkY2YyMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjVlMTQyY2E0Y2I0NDZlM2I0MWQ1YWRiMDlmNThkNTkuc2V0Q29udGVudChodG1sX2UxNmE2NGZiZmRjNDRmM2I5NjhhMTA4NDZhZGNmMjIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0MDhhOWI0YTdhNTQzMTZhODg1ZTJjNTZjODE4NTlmLmJpbmRQb3B1cChwb3B1cF8yNWUxNDJjYTRjYjQ0NmUzYjQxZDVhZGIwOWY1OGQ1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTYzMTk3YjVjYWI0ZWM2YWIzNTNmMGJhZWVlZDY3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTg4NTQ5ZjFjZmE0YjVmYTVhOWI1ZjNkOTVjM2I2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYWM0YWFhMTUwMGQ0YzllODNlMTRiNWZiZDFmNTYyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmFjNGFhYTE1MDBkNGM5ZTgzZTE0YjVmYmQxZjU2MjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTU4ODU0OWYxY2ZhNGI1ZmE1YTliNWYzZDk1YzNiNmUuc2V0Q29udGVudChodG1sX2JhYzRhYWExNTAwZDRjOWU4M2UxNGI1ZmJkMWY1NjI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlNjMxOTdiNWNhYjRlYzZhYjM1M2YwYmFlZWVkNjcwLmJpbmRQb3B1cChwb3B1cF85NTg4NTQ5ZjFjZmE0YjVmYTVhOWI1ZjNkOTVjM2I2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzM4OTllOGM2NTY0NTFhOWNkNDNmNTU0MTRmODE2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhZWJmYTc2Nzk1MjRhZTE5MjQwNTgxODM3NGFjODNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwZmUyM2JlOTJjNTQzNzM5MTE3NjEwYTI4MTIyZmY3ID0gJCgnPGRpdiBpZD0iaHRtbF8wMGZlMjNiZTkyYzU0MzczOTExNzYxMGEyODEyMmZmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWViZmE3Njc5NTI0YWUxOTI0MDU4MTgzNzRhYzgzZC5zZXRDb250ZW50KGh0bWxfMDBmZTIzYmU5MmM1NDM3MzkxMTc2MTBhMjgxMjJmZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTMzODk5ZThjNjU2NDUxYTljZDQzZjU1NDE0ZjgxNjAuYmluZFBvcHVwKHBvcHVwX2RhZWJmYTc2Nzk1MjRhZTE5MjQwNTgxODM3NGFjODNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyYTc2OWE1ZGY5NDRkNDZhNWY3NGJhN2Q3MTFlODc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiYjg1NzVlOGNhNzQxMTFhMTEyMmNkMDNmODMwNDE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyNmM0NzYxZjI0NTQ0YmFiOWYxYmY5MDg4NjU3MDBlID0gJCgnPGRpdiBpZD0iaHRtbF9jMjZjNDc2MWYyNDU0NGJhYjlmMWJmOTA4ODY1NzAwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmI4NTc1ZThjYTc0MTExYTExMjJjZDAzZjgzMDQxOS5zZXRDb250ZW50KGh0bWxfYzI2YzQ3NjFmMjQ1NDRiYWI5ZjFiZjkwODg2NTcwMGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjJhNzY5YTVkZjk0NGQ0NmE1Zjc0YmE3ZDcxMWU4NzYuYmluZFBvcHVwKHBvcHVwXzFiYjg1NzVlOGNhNzQxMTFhMTEyMmNkMDNmODMwNDE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5YWI1Nzg0MjJlYzRmNWI4MzU4NjVkMzVkZTViMzg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNGQ3OGExYjgxZTM0ZjNjOTNkNzk0ZWYwYjk2OGU4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZDAyOTBkYTBiMzk0YzI2ODAyNzk5ZWZlYmI2NDk4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWQwMjkwZGEwYjM5NGMyNjgwMjc5OWVmZWJiNjQ5ODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0ZDc4YTFiODFlMzRmM2M5M2Q3OTRlZjBiOTY4ZTg5LnNldENvbnRlbnQoaHRtbF85ZDAyOTBkYTBiMzk0YzI2ODAyNzk5ZWZlYmI2NDk4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OWFiNTc4NDIyZWM0ZjViODM1ODY1ZDM1ZGU1YjM4OS5iaW5kUG9wdXAocG9wdXBfZTRkNzhhMWI4MWUzNGYzYzkzZDc5NGVmMGI5NjhlODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmRmOWU0NzkwN2ZmNDVlNWE2NzAwNjJhYTYwNTljZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODJhZWQzNzJiYzg0MDA1YTg5YzEwNDhlOGQxM2M2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOGVjOWEyMGMyNzE0ZmQ4ODM3YzliOTQyZmMzZWIyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjhlYzlhMjBjMjcxNGZkODgzN2M5Yjk0MmZjM2ViMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzgyYWVkMzcyYmM4NDAwNWE4OWMxMDQ4ZThkMTNjNjAuc2V0Q29udGVudChodG1sX2I4ZWM5YTIwYzI3MTRmZDg4MzdjOWI5NDJmYzNlYjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJkZjllNDc5MDdmZjQ1ZTVhNjcwMDYyYWE2MDU5Y2ViLmJpbmRQb3B1cChwb3B1cF8zODJhZWQzNzJiYzg0MDA1YTg5YzEwNDhlOGQxM2M2MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODMyNWEwNDQyNTY0ZjE2YWEwZDUzZTA2YjAwNWY2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDJjMWQ1YTRjMzE0MWNjYWZjNGMxNzU0YTVmNGE1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNmNhMjJmN2UzOTY0MjhhOTQ3ZTIzODRhNjQ3YjhjMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDZjYTIyZjdlMzk2NDI4YTk0N2UyMzg0YTY0N2I4YzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDJjMWQ1YTRjMzE0MWNjYWZjNGMxNzU0YTVmNGE1MC5zZXRDb250ZW50KGh0bWxfMDZjYTIyZjdlMzk2NDI4YTk0N2UyMzg0YTY0N2I4YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTgzMjVhMDQ0MjU2NGYxNmFhMGQ1M2UwNmIwMDVmNjIuYmluZFBvcHVwKHBvcHVwXzkwMmMxZDVhNGMzMTQxY2NhZmM0YzE3NTRhNWY0YTUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzNGYxMmY5OGU2YjQzNGVhNDhhYzUxNjZkN2EwYjgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzODI2NTFiN2Q4ODQxZmFhZDE4MDA1ZmE5OWJiM2M4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllYWZhMDJkZjk3MDRlNDA4NTNhMTFjNGI0Y2RjNjA4ID0gJCgnPGRpdiBpZD0iaHRtbF85ZWFmYTAyZGY5NzA0ZTQwODUzYTExYzRiNGNkYzYwOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzODI2NTFiN2Q4ODQxZmFhZDE4MDA1ZmE5OWJiM2M4LnNldENvbnRlbnQoaHRtbF85ZWFmYTAyZGY5NzA0ZTQwODUzYTExYzRiNGNkYzYwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzRmMTJmOThlNmI0MzRlYTQ4YWM1MTY2ZDdhMGI4My5iaW5kUG9wdXAocG9wdXBfMTM4MjY1MWI3ZDg4NDFmYWFkMTgwMDVmYTk5YmIzYzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTc0ZGRkYWI4NDcxNDdkNDljOWVkOWJkMDM3NTU1ZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlZjAzNzQ2NjEwNDRkYWVhYjk5ODZjNTY4MzAzYWI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4ZDBkYzk4NzE0ZjQ2ZTRiMTcwNzk3YWNmMTQ3OGY2ID0gJCgnPGRpdiBpZD0iaHRtbF81OGQwZGM5ODcxNGY0NmU0YjE3MDc5N2FjZjE0NzhmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGVmMDM3NDY2MTA0NGRhZWFiOTk4NmM1NjgzMDNhYjYuc2V0Q29udGVudChodG1sXzU4ZDBkYzk4NzE0ZjQ2ZTRiMTcwNzk3YWNmMTQ3OGY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3NGRkZGFiODQ3MTQ3ZDQ5YzllZDliZDAzNzU1NWUxLmJpbmRQb3B1cChwb3B1cF8wZWYwMzc0NjYxMDQ0ZGFlYWI5OTg2YzU2ODMwM2FiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNDdhMDFmMTVkNzY0MmJiODI5Njg3NzEyNDY1YWRlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0NjRmZDM4NjVhMjQ1MWQ4NmU5MjE2MDE3NWU3NThhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1NDE0NTA5OGVkNzQ4N2NhZjBhYjE2N2Y2MWU0MDllID0gJCgnPGRpdiBpZD0iaHRtbF8xNTQxNDUwOThlZDc0ODdjYWYwYWIxNjdmNjFlNDA5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDY0ZmQzODY1YTI0NTFkODZlOTIxNjAxNzVlNzU4YS5zZXRDb250ZW50KGh0bWxfMTU0MTQ1MDk4ZWQ3NDg3Y2FmMGFiMTY3ZjYxZTQwOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjQ3YTAxZjE1ZDc2NDJiYjgyOTY4NzcxMjQ2NWFkZTUuYmluZFBvcHVwKHBvcHVwX2Y0NjRmZDM4NjVhMjQ1MWQ4NmU5MjE2MDE3NWU3NThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4OTEzNDI3YzJmMjRmOTA4ZWQ4Y2Q2OWVmYWIzYzZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwNjRiNjAxNzBmYjQxYzc5OTI1NDVkYTIyYmM3YTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwZjFkNGM1NTgyMjRjNjM5NGM5ZjZjNmNhMzQyNGNjID0gJCgnPGRpdiBpZD0iaHRtbF81MGYxZDRjNTU4MjI0YzYzOTRjOWY2YzZjYTM0MjRjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNjRiNjAxNzBmYjQxYzc5OTI1NDVkYTIyYmM3YTM4LnNldENvbnRlbnQoaHRtbF81MGYxZDRjNTU4MjI0YzYzOTRjOWY2YzZjYTM0MjRjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODkxMzQyN2MyZjI0ZjkwOGVkOGNkNjllZmFiM2M2Yy5iaW5kUG9wdXAocG9wdXBfOTA2NGI2MDE3MGZiNDFjNzk5MjU0NWRhMjJiYzdhMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzM5OTI4ODI4ZTI3NGFkZTkyNmIwZTUyZjFiYTNhNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTRmOWIzMGQxYWI1NGViNDk2N2I1Y2E3N2ZlOTcyNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U5ZWY5OGQyZDc2NDYxNWIyODgwNmUzMTMzYWU1MzUgPSAkKCc8ZGl2IGlkPSJodG1sXzNlOWVmOThkMmQ3NjQ2MTViMjg4MDZlMzEzM2FlNTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNGY5YjMwZDFhYjU0ZWI0OTY3YjVjYTc3ZmU5NzI0Zi5zZXRDb250ZW50KGh0bWxfM2U5ZWY5OGQyZDc2NDYxNWIyODgwNmUzMTMzYWU1MzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzM5OTI4ODI4ZTI3NGFkZTkyNmIwZTUyZjFiYTNhNjguYmluZFBvcHVwKHBvcHVwXzE0ZjliMzBkMWFiNTRlYjQ5NjdiNWNhNzdmZTk3MjRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzN2M0Mzk0OWJjNTQ5Mjk4ZDIyYWI2YWIzNjBmZTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5YWVjOTc1YTJjZDQ3ODliZmI2OWY3MDg0OGE2MTI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhMGRkNmI0YjY1MTQyYTU5ZWE0MjkwMzYwZjJmOTI2ID0gJCgnPGRpdiBpZD0iaHRtbF9iYTBkZDZiNGI2NTE0MmE1OWVhNDI5MDM2MGYyZjkyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5YWVjOTc1YTJjZDQ3ODliZmI2OWY3MDg0OGE2MTI1LnNldENvbnRlbnQoaHRtbF9iYTBkZDZiNGI2NTE0MmE1OWVhNDI5MDM2MGYyZjkyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzdjNDM5NDliYzU0OTI5OGQyMmFiNmFiMzYwZmUxNS5iaW5kUG9wdXAocG9wdXBfZTlhZWM5NzVhMmNkNDc4OWJmYjY5ZjcwODQ4YTYxMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmU4YjY0NDcwMTVjNDM3NmJlZWFhOTUwNjc4YjhjZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlNWExM2RhMjAwNTRhZDNhNjgwZWVjMzk0YmVlMDUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1ODQ1NzUwZWQ0ZTQ4OWJiMWRmMmEzYTk4NzE3NDJlID0gJCgnPGRpdiBpZD0iaHRtbF8xNTg0NTc1MGVkNGU0ODliYjFkZjJhM2E5ODcxNzQyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU1YTEzZGEyMDA1NGFkM2E2ODBlZWMzOTRiZWUwNTMuc2V0Q29udGVudChodG1sXzE1ODQ1NzUwZWQ0ZTQ4OWJiMWRmMmEzYTk4NzE3NDJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlOGI2NDQ3MDE1YzQzNzZiZWVhYTk1MDY3OGI4Y2Q4LmJpbmRQb3B1cChwb3B1cF9hZTVhMTNkYTIwMDU0YWQzYTY4MGVlYzM5NGJlZTA1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjllYjdiMDk3Y2M0NGZlYTFjZWI1ZDU5OTRjZTA1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODUxOTMxYzQzOTI0YTgxYmQzOTk4ZTU0MWYzOTA2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDY1NGY2MDgyMDU0ZjFiODg2ZTI4ZjcyNjI1MjY3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTA2NTRmNjA4MjA1NGYxYjg4NmUyOGY3MjYyNTI2NzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ODUxOTMxYzQzOTI0YTgxYmQzOTk4ZTU0MWYzOTA2MS5zZXRDb250ZW50KGh0bWxfYTA2NTRmNjA4MjA1NGYxYjg4NmUyOGY3MjYyNTI2NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI5ZWI3YjA5N2NjNDRmZWExY2ViNWQ1OTk0Y2UwNWUuYmluZFBvcHVwKHBvcHVwXzc4NTE5MzFjNDM5MjRhODFiZDM5OThlNTQxZjM5MDYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzNGQwYmE0NTEzZTQzZTA5ZjQxOTBiOWU2NmNiOWUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3OWE2ZmMzYjU2YzQ0NzdiNDBiOGVjNGFlYmNlNDI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0MDAzYjExZDg1MTRjOThhNjc3ODcwYjk4MGY5YzFlID0gJCgnPGRpdiBpZD0iaHRtbF9iNDAwM2IxMWQ4NTE0Yzk4YTY3Nzg3MGI5ODBmOWMxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzlhNmZjM2I1NmM0NDc3YjQwYjhlYzRhZWJjZTQyNC5zZXRDb250ZW50KGh0bWxfYjQwMDNiMTFkODUxNGM5OGE2Nzc4NzBiOTgwZjljMWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzM0ZDBiYTQ1MTNlNDNlMDlmNDE5MGI5ZTY2Y2I5ZTEuYmluZFBvcHVwKHBvcHVwXzA3OWE2ZmMzYjU2YzQ0NzdiNDBiOGVjNGFlYmNlNDI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzMzVlMjEyYWFiZjQ4YjY4NzUzMGI2NDNkMmM2ZGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4ZDUxNTQ0OGFhYTQ4MjJiYzYyM2I2ZmU5ZGY4NGI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhNmVmOWQ3MTU3OTRhNmI4ZTZhYTM4ZGI3MmIzYWI1ID0gJCgnPGRpdiBpZD0iaHRtbF9mYTZlZjlkNzE1Nzk0YTZiOGU2YWEzOGRiNzJiM2FiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGQ1MTU0NDhhYWE0ODIyYmM2MjNiNmZlOWRmODRiNi5zZXRDb250ZW50KGh0bWxfZmE2ZWY5ZDcxNTc5NGE2YjhlNmFhMzhkYjcyYjNhYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjMzNWUyMTJhYWJmNDhiNjg3NTMwYjY0M2QyYzZkYWQuYmluZFBvcHVwKHBvcHVwXzE4ZDUxNTQ0OGFhYTQ4MjJiYzYyM2I2ZmU5ZGY4NGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwNDM3YzIzMTVjNjQ4MTQ5NDcwNWE2MTQ1OTM5MDMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhOGNiMDhmODFmZDQ5NzA5YTgzZTY3MzBkMzAyYmRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiYmMzZDAyODc4NzQyMDViN2RkZTg2NDJlYzExODFmID0gJCgnPGRpdiBpZD0iaHRtbF9jYmJjM2QwMjg3ODc0MjA1YjdkZGU4NjQyZWMxMTgxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWE4Y2IwOGY4MWZkNDk3MDlhODNlNjczMGQzMDJiZGYuc2V0Q29udGVudChodG1sX2NiYmMzZDAyODc4NzQyMDViN2RkZTg2NDJlYzExODFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwNDM3YzIzMTVjNjQ4MTQ5NDcwNWE2MTQ1OTM5MDMzLmJpbmRQb3B1cChwb3B1cF81YThjYjA4ZjgxZmQ0OTcwOWE4M2U2NzMwZDMwMmJkZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTllN2QwZTZjYzM0NDBmYTA5MDZiOWZlYWI1ODk2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzEzN2ExYTljZDc1NGYwMWE2ZmRjYjdhNWQ4OWVmYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWJiMDgzNWU2ZmQ4NDQ1NWI3ZDhhMWZkN2Q5NTU4ZTQgPSAkKCc8ZGl2IGlkPSJodG1sX2ViYjA4MzVlNmZkODQ0NTViN2Q4YTFmZDdkOTU1OGU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxMzdhMWE5Y2Q3NTRmMDFhNmZkY2I3YTVkODllZmIwLnNldENvbnRlbnQoaHRtbF9lYmIwODM1ZTZmZDg0NDU1YjdkOGExZmQ3ZDk1NThlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTllN2QwZTZjYzM0NDBmYTA5MDZiOWZlYWI1ODk2NC5iaW5kUG9wdXAocG9wdXBfMzEzN2ExYTljZDc1NGYwMWE2ZmRjYjdhNWQ4OWVmYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDAxNGJkODA5ZjA1NDEzYTgzOTEwNjczMDE2M2ZlODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4YTM3YzE2OTJlMDRmODRiY2YxMDk2ODI1ZmVmZTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwYjI2MWVhOWVhYzQ5ODM4YjdkYmM0MjRmMDE3ZjI3ID0gJCgnPGRpdiBpZD0iaHRtbF81MGIyNjFlYTllYWM0OTgzOGI3ZGJjNDI0ZjAxN2YyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YTM3YzE2OTJlMDRmODRiY2YxMDk2ODI1ZmVmZTFiLnNldENvbnRlbnQoaHRtbF81MGIyNjFlYTllYWM0OTgzOGI3ZGJjNDI0ZjAxN2YyNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMDE0YmQ4MDlmMDU0MTNhODM5MTA2NzMwMTYzZmU4MS5iaW5kUG9wdXAocG9wdXBfMThhMzdjMTY5MmUwNGY4NGJjZjEwOTY4MjVmZWZlMWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJkMjdhZGJiYTExNDE0ZjkxNGI4NGFlOTlhMjJmNjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExZjYyNTJmMzAzODQ5ZjBhMTEyNGZmMjllZmJlZmYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzYTJjZGI4OTA4ODQxYzNhODQzYmI2MWNmZWM2Y2JhID0gJCgnPGRpdiBpZD0iaHRtbF9mM2EyY2RiODkwODg0MWMzYTg0M2JiNjFjZmVjNmNiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTFmNjI1MmYzMDM4NDlmMGExMTI0ZmYyOWVmYmVmZjMuc2V0Q29udGVudChodG1sX2YzYTJjZGI4OTA4ODQxYzNhODQzYmI2MWNmZWM2Y2JhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyZDI3YWRiYmExMTQxNGY5MTRiODRhZTk5YTIyZjY2LmJpbmRQb3B1cChwb3B1cF8xMWY2MjUyZjMwMzg0OWYwYTExMjRmZjI5ZWZiZWZmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDY3MjAzYTRhMDg0ZTlkYjFjMjc0OTRlMjViY2Y0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWU2NThhNTYxY2NiNGZiN2E5MTY2NzY1MTRkM2U0MWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U4NzU2ZjYxZGZkNDUwNGIzMDZlZWUyNTEyN2U4ZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzNlODc1NmY2MWRmZDQ1MDRiMzA2ZWVlMjUxMjdlOGZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWU2NThhNTYxY2NiNGZiN2E5MTY2NzY1MTRkM2U0MWEuc2V0Q29udGVudChodG1sXzNlODc1NmY2MWRmZDQ1MDRiMzA2ZWVlMjUxMjdlOGZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwNjcyMDNhNGEwODRlOWRiMWMyNzQ5NGUyNWJjZjQ4LmJpbmRQb3B1cChwb3B1cF85ZTY1OGE1NjFjY2I0ZmI3YTkxNjY3NjUxNGQzZTQxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOTg0MGQwMDNkNTM0ZmIwYTBlYTdkNTQwNzc3OGQxMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiZjQwMGE1M2FiYTRjN2Q4Y2FkY2E4MmMyOWQ4NjEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5YjA2YTkzZGVlNTQzZmJiMjFmN2RhNTNiYjQxYjY5ID0gJCgnPGRpdiBpZD0iaHRtbF9jOWIwNmE5M2RlZTU0M2ZiYjIxZjdkYTUzYmI0MWI2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmY0MDBhNTNhYmE0YzdkOGNhZGNhODJjMjlkODYxMC5zZXRDb250ZW50KGh0bWxfYzliMDZhOTNkZWU1NDNmYmIyMWY3ZGE1M2JiNDFiNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjk4NDBkMDAzZDUzNGZiMGEwZWE3ZDU0MDc3NzhkMTAuYmluZFBvcHVwKHBvcHVwXzFiZjQwMGE1M2FiYTRjN2Q4Y2FkY2E4MmMyOWQ4NjEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4MTYyMjNkNzAyMDRiM2JiNGM1NjZmZWViMTUwNjkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxMDhkMjUxZDRhZTQ4ODJiNTM0NWJmMDQ0OGU1OTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNjVkNDBkZTI5MzQ4YjI5NTE4ZDU2NTA1N2QyNmI5ID0gJCgnPGRpdiBpZD0iaHRtbF8wMzY1ZDQwZGUyOTM0OGIyOTUxOGQ1NjUwNTdkMjZiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxMDhkMjUxZDRhZTQ4ODJiNTM0NWJmMDQ0OGU1OTE2LnNldENvbnRlbnQoaHRtbF8wMzY1ZDQwZGUyOTM0OGIyOTUxOGQ1NjUwNTdkMjZiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODE2MjIzZDcwMjA0YjNiYjRjNTY2ZmVlYjE1MDY5MC5iaW5kUG9wdXAocG9wdXBfNzEwOGQyNTFkNGFlNDg4MmI1MzQ1YmYwNDQ4ZTU5MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGMzZmYzYWEwY2EzNDE5Yjk3NTY4YTAxMzYwOTM2NGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzMjAxMThhMjIwMDQzNWE4NzM4MmVmMDk3OTk1ZTVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljNDg1Y2I0YTRkMzRmZDE4ODNlMWYxZDkyMzhmZTM2ID0gJCgnPGRpdiBpZD0iaHRtbF85YzQ4NWNiNGE0ZDM0ZmQxODgzZTFmMWQ5MjM4ZmUzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTMyMDExOGEyMjAwNDM1YTg3MzgyZWYwOTc5OTVlNWUuc2V0Q29udGVudChodG1sXzljNDg1Y2I0YTRkMzRmZDE4ODNlMWYxZDkyMzhmZTM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjM2ZmM2FhMGNhMzQxOWI5NzU2OGEwMTM2MDkzNjRjLmJpbmRQb3B1cChwb3B1cF9lMzIwMTE4YTIyMDA0MzVhODczODJlZjA5Nzk5NWU1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYWIyYzE2ZjMzODE0N2RkYWFjMjljN2UzMWM1NjQ2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOGM1ZTIzNDEyOGY0NjhjODhjZmI5MjgzMWE1ZDE5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjcwNWE2NWM5ZTQ0MTJiODNkM2IxMjBhNDQ0NWJiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfODY3MDVhNjVjOWU0NDEyYjgzZDNiMTIwYTQ0NDViYjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZThjNWUyMzQxMjhmNDY4Yzg4Y2ZiOTI4MzFhNWQxOTcuc2V0Q29udGVudChodG1sXzg2NzA1YTY1YzllNDQxMmI4M2QzYjEyMGE0NDQ1YmI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhYjJjMTZmMzM4MTQ3ZGRhYWMyOWM3ZTMxYzU2NDY4LmJpbmRQb3B1cChwb3B1cF9lOGM1ZTIzNDEyOGY0NjhjODhjZmI5MjgzMWE1ZDE5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODQxYzNlOGYxOWI0YjdkOWY3Yzc3MDNlMWNhNDY2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTkyNDU5MDJiODU0MTFmYWNkYzJjMGIyMDdhNzM0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODlkYWZiZjhlZDc0YWY4YjQ1OTk4N2VkY2FiNWIyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg5ZGFmYmY4ZWQ3NGFmOGI0NTk5ODdlZGNhYjViMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1OTI0NTkwMmI4NTQxMWZhY2RjMmMwYjIwN2E3MzQwLnNldENvbnRlbnQoaHRtbF9lODlkYWZiZjhlZDc0YWY4YjQ1OTk4N2VkY2FiNWIyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lODQxYzNlOGYxOWI0YjdkOWY3Yzc3MDNlMWNhNDY2Zi5iaW5kUG9wdXAocG9wdXBfOTU5MjQ1OTAyYjg1NDExZmFjZGMyYzBiMjA3YTczNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk4MzcwMjRhYmYxNGM5ZDliNjEwYzU5NmZmYmNhMGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzYzM0NzM3MzM2MDRjNDM4NThmMTAwYWY0ZjIyYmU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljZTBmNmNlYjhkNTQyYzY4ZDM0NjExMDI4N2M3OTRiID0gJCgnPGRpdiBpZD0iaHRtbF85Y2UwZjZjZWI4ZDU0MmM2OGQzNDYxMTAyODdjNzk0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNjMzQ3MzczMzYwNGM0Mzg1OGYxMDBhZjRmMjJiZTguc2V0Q29udGVudChodG1sXzljZTBmNmNlYjhkNTQyYzY4ZDM0NjExMDI4N2M3OTRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5ODM3MDI0YWJmMTRjOWQ5YjYxMGM1OTZmZmJjYTBjLmJpbmRQb3B1cChwb3B1cF9lM2MzNDczNzMzNjA0YzQzODU4ZjEwMGFmNGYyMmJlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZDZkYWE3ZDgyZjA0OGI3YTBmY2VjNjhhYzViYmJhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYzg4NTcxN2I5ZTA0ZmIzOTQ0YjZmMjFkYzUxMWEzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZThlYWYzMWI1ZGQ0Y2MwOTA3MDI2NzM1ZGYzOTU5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGU4ZWFmMzFiNWRkNGNjMDkwNzAyNjczNWRmMzk1OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2M4ODU3MTdiOWUwNGZiMzk0NGI2ZjIxZGM1MTFhMzIuc2V0Q29udGVudChodG1sXzRlOGVhZjMxYjVkZDRjYzA5MDcwMjY3MzVkZjM5NTlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkNmRhYTdkODJmMDQ4YjdhMGZjZWM2OGFjNWJiYmE1LmJpbmRQb3B1cChwb3B1cF8zYzg4NTcxN2I5ZTA0ZmIzOTQ0YjZmMjFkYzUxMWEzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZDE4MWRkMzE3MGQ0NTRjOTM1MTU3OTBlNzk3YmFkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVhYzFkOGJmYThmNGNkNzgzNmQ0MWQ3YmU4MDVkNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODVhMjBhNWMxZDliNDJmODhjODNiMTZkNjM0NjVkYzMgPSAkKCc8ZGl2IGlkPSJodG1sXzg1YTIwYTVjMWQ5YjQyZjg4YzgzYjE2ZDYzNDY1ZGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NWFjMWQ4YmZhOGY0Y2Q3ODM2ZDQxZDdiZTgwNWQ1OC5zZXRDb250ZW50KGh0bWxfODVhMjBhNWMxZDliNDJmODhjODNiMTZkNjM0NjVkYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQxODFkZDMxNzBkNDU0YzkzNTE1NzkwZTc5N2JhZDMuYmluZFBvcHVwKHBvcHVwXzg1YWMxZDhiZmE4ZjRjZDc4MzZkNDFkN2JlODA1ZDU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkMTg3NGI3ZjM3YzRkOGI4NzAwNTQ0MmY2YmExNjc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZWUwNGJkZTJhMGE0ZGFlOWMzN2ZlZDRhMTlmMDIyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTM2Zjk4N2QxZTc0NWMzYjJiMmJlM2EyNTQzZDVmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzUzNmY5ODdkMWU3NDVjM2IyYjJiZTNhMjU0M2Q1ZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlZTA0YmRlMmEwYTRkYWU5YzM3ZmVkNGExOWYwMjJhLnNldENvbnRlbnQoaHRtbF9jNTM2Zjk4N2QxZTc0NWMzYjJiMmJlM2EyNTQzZDVmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDE4NzRiN2YzN2M0ZDhiODcwMDU0NDJmNmJhMTY3OS5iaW5kUG9wdXAocG9wdXBfZmVlMDRiZGUyYTBhNGRhZTljMzdmZWQ0YTE5ZjAyMmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRjMzY0MDliNTNjNDQ3M2E1N2NiZGM5YjkxZjA5NjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0M2ZlZjE2NTRiNjRhNGY5Y2MxMzUyYThiOGRiNWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE4OGI4MDcxNDcxYjRiMjBhZDk2MTliNjkxYWZiMDI3ID0gJCgnPGRpdiBpZD0iaHRtbF8xODhiODA3MTQ3MWI0YjIwYWQ5NjE5YjY5MWFmYjAyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTQzZmVmMTY1NGI2NGE0ZjljYzEzNTJhOGI4ZGI1ZmIuc2V0Q29udGVudChodG1sXzE4OGI4MDcxNDcxYjRiMjBhZDk2MTliNjkxYWZiMDI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0YzM2NDA5YjUzYzQ0NzNhNTdjYmRjOWI5MWYwOTY3LmJpbmRQb3B1cChwb3B1cF85NDNmZWYxNjU0YjY0YTRmOWNjMTM1MmE4YjhkYjVmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZmYyMzM4MjJhMDA0OGQ2OTcyN2I4NWY1NmZiMDA0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTkzZTQ0NzIwYzM3NDg3NTgxNThkYzUzZjVlZjgxMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWJjMjM2MmIxYzg1NDEwYjg4NGI1YzQyZjJjYTE5NTYgPSAkKCc8ZGl2IGlkPSJodG1sXzViYzIzNjJiMWM4NTQxMGI4ODRiNWM0MmYyY2ExOTU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTNlNDQ3MjBjMzc0ODc1ODE1OGRjNTNmNWVmODEyZC5zZXRDb250ZW50KGh0bWxfNWJjMjM2MmIxYzg1NDEwYjg4NGI1YzQyZjJjYTE5NTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGZmMjMzODIyYTAwNDhkNjk3MjdiODVmNTZmYjAwNDguYmluZFBvcHVwKHBvcHVwXzE5M2U0NDcyMGMzNzQ4NzU4MTU4ZGM1M2Y1ZWY4MTJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2ODUxMzViOWQ2NzRiYjc5NGVlYzZlMTRjZDk1N2Y4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTAyYWU0N2JkYjhjNDM4NGFjODdhYzE5NDc2ZmVlYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTIwM2ZmODg1MTkxNDIyYjk3YTM5YjNkYWY2YmRlMjYgPSAkKCc8ZGl2IGlkPSJodG1sX2EyMDNmZjg4NTE5MTQyMmI5N2EzOWIzZGFmNmJkZTI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwMmFlNDdiZGI4YzQzODRhYzg3YWMxOTQ3NmZlZWI4LnNldENvbnRlbnQoaHRtbF9hMjAzZmY4ODUxOTE0MjJiOTdhMzliM2RhZjZiZGUyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Njg1MTM1YjlkNjc0YmI3OTRlZWM2ZTE0Y2Q5NTdmOC5iaW5kUG9wdXAocG9wdXBfZTAyYWU0N2JkYjhjNDM4NGFjODdhYzE5NDc2ZmVlYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNlNzA0OWZmYjdjNGM2ZThmODBkMTU3OTA4MWRlNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NWMxZGZmMjE5YzE0M2IwYTg5NjZjMzFmZGNjN2U3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82M2FmZDZhM2Q0ZjI0ZjI0OTAwMTE4NDNlYzJhMzEwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjNhZmQ2YTNkNGYyNGYyNDkwMDExODQzZWMyYTMxMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NWMxZGZmMjE5YzE0M2IwYTg5NjZjMzFmZGNjN2U3NS5zZXRDb250ZW50KGh0bWxfNjNhZmQ2YTNkNGYyNGYyNDkwMDExODQzZWMyYTMxMGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWNlNzA0OWZmYjdjNGM2ZThmODBkMTU3OTA4MWRlNmIuYmluZFBvcHVwKHBvcHVwXzQ1YzFkZmYyMTljMTQzYjBhODk2NmMzMWZkY2M3ZTc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MTVlMDg4OWVjNTRiZTQ5NDc1YTQ3NDQ0YjhkNDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ2NWQ1OGM0NDY2NDAxN2JkZjNhMTk5YTM2ZGIzNTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDM0OWU1ZTM0YTU4NDU3Y2I5ZjM0ZDFlYjAzNmI1ZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2QzNDllNWUzNGE1ODQ1N2NiOWYzNGQxZWIwMzZiNWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTQ2NWQ1OGM0NDY2NDAxN2JkZjNhMTk5YTM2ZGIzNTcuc2V0Q29udGVudChodG1sX2QzNDllNWUzNGE1ODQ1N2NiOWYzNGQxZWIwMzZiNWY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4MTVlMDg4OWVjNTRiZTQ5NDc1YTQ3NDQ0YjhkNDBiLmJpbmRQb3B1cChwb3B1cF85NDY1ZDU4YzQ0NjY0MDE3YmRmM2ExOTlhMzZkYjM1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMmZmODkyYzM0ZTg0N2RmYTcyMWU5Y2I1MGY2OTVjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZhNmY4NzE5OTAyNGZlMmIyNDEzYTJmNjE5M2FiNjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWVmY2VjMDU0Y2M0NDFmZThiOGIxNWM0YTg5MzhiNmMgPSAkKCc8ZGl2IGlkPSJodG1sX2VlZmNlYzA1NGNjNDQxZmU4YjhiMTVjNGE4OTM4YjZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmZhNmY4NzE5OTAyNGZlMmIyNDEzYTJmNjE5M2FiNjQuc2V0Q29udGVudChodG1sX2VlZmNlYzA1NGNjNDQxZmU4YjhiMTVjNGE4OTM4YjZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyZmY4OTJjMzRlODQ3ZGZhNzIxZTljYjUwZjY5NWMyLmJpbmRQb3B1cChwb3B1cF9iZmE2Zjg3MTk5MDI0ZmUyYjI0MTNhMmY2MTkzYWI2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmZmN2ViMWUwMTg0NTY0OWZkZTY2ZTFmZDI1Yzk2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWNkMDdkZDBlMmJhNGMzYzhhZmVkZjU1M2NhZmM5ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmU5ZGQxNTgzODUxNDQ0NjlmNzJlM2NhMzBkZmQ3NTggPSAkKCc8ZGl2IGlkPSJodG1sXzZlOWRkMTU4Mzg1MTQ0NDY5ZjcyZTNjYTMwZGZkNzU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVjZDA3ZGQwZTJiYTRjM2M4YWZlZGY1NTNjYWZjOWZmLnNldENvbnRlbnQoaHRtbF82ZTlkZDE1ODM4NTE0NDQ2OWY3MmUzY2EzMGRmZDc1OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmZmN2ViMWUwMTg0NTY0OWZkZTY2ZTFmZDI1Yzk2Yy5iaW5kUG9wdXAocG9wdXBfNWNkMDdkZDBlMmJhNGMzYzhhZmVkZjU1M2NhZmM5ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjFlYmM0YzU0MjY3NGZjYmI1ZmQ1M2RkOTViOTljNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjQxYTNjZTBjOTg0NDQ4ZGI4YWI5NGRlN2NmYmEwMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg4N2FjMDc5YWFkNGY2OTliNzE5MmM1MDc5YzZlNmEgPSAkKCc8ZGl2IGlkPSJodG1sX2E4ODdhYzA3OWFhZDRmNjk5YjcxOTJjNTA3OWM2ZTZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0MWEzY2UwYzk4NDQ0OGRiOGFiOTRkZTdjZmJhMDFjLnNldENvbnRlbnQoaHRtbF9hODg3YWMwNzlhYWQ0ZjY5OWI3MTkyYzUwNzljNmU2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMWViYzRjNTQyNjc0ZmNiYjVmZDUzZGQ5NWI5OWM2OC5iaW5kUG9wdXAocG9wdXBfMjQxYTNjZTBjOTg0NDQ4ZGI4YWI5NGRlN2NmYmEwMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjA5OTQxNmZmM2MzNGFkMDgxOGRkNjE4YjEzMjFjMmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTAwYWI5ZDI3NWM3NGZhYTgwN2ZhYjFmYTI4YjAzYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzJhMGZkMDY2YjQ1NGI5ZWExYzg1YmIwNzAxYmUxYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzcyYTBmZDA2NmI0NTRiOWVhMWM4NWJiMDcwMWJlMWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTAwYWI5ZDI3NWM3NGZhYTgwN2ZhYjFmYTI4YjAzYzguc2V0Q29udGVudChodG1sXzcyYTBmZDA2NmI0NTRiOWVhMWM4NWJiMDcwMWJlMWFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwOTk0MTZmZjNjMzRhZDA4MThkZDYxOGIxMzIxYzJhLmJpbmRQb3B1cChwb3B1cF85MDBhYjlkMjc1Yzc0ZmFhODA3ZmFiMWZhMjhiMDNjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2EwYTYyOTMxNDU0M2FjODU3Mzc1YzU4Y2E1ZWRmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MDA0MGVhMmIwYzA0M2Y1ODZmNDhjMGFiYTY0ZDUzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYzhiOGM3MTZkNmQ0NjllOGM5ZGE2NjkxYmY0M2NiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2M4YjhjNzE2ZDZkNDY5ZThjOWRhNjY5MWJmNDNjYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwMDQwZWEyYjBjMDQzZjU4NmY0OGMwYWJhNjRkNTM4LnNldENvbnRlbnQoaHRtbF9jYzhiOGM3MTZkNmQ0NjllOGM5ZGE2NjkxYmY0M2NiMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Y2EwYTYyOTMxNDU0M2FjODU3Mzc1YzU4Y2E1ZWRmNy5iaW5kUG9wdXAocG9wdXBfODAwNDBlYTJiMGMwNDNmNTg2ZjQ4YzBhYmE2NGQ1MzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjU1YmI1ZGZhZjdlNGNhMTk4NzdjN2Y0OTU0MTRmYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODU3MGNkOTkxYjU0Y2E1YWQxYTk1YTc1ZjYyZjk3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjIyYzlhZTlkYzk0NjI1OWRmYzRkNzY3MzJhZjE1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTIyMmM5YWU5ZGM5NDYyNTlkZmM0ZDc2NzMyYWYxNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODU3MGNkOTkxYjU0Y2E1YWQxYTk1YTc1ZjYyZjk3Zi5zZXRDb250ZW50KGh0bWxfYTIyMmM5YWU5ZGM5NDYyNTlkZmM0ZDc2NzMyYWYxNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjU1YmI1ZGZhZjdlNGNhMTk4NzdjN2Y0OTU0MTRmYTAuYmluZFBvcHVwKHBvcHVwXzM4NTcwY2Q5OTFiNTRjYTVhZDFhOTVhNzVmNjJmOTdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjZDBiZjUyM2MxMTQ1NmNhMThlOWRhMjY1MWU4ZDdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyNGM5YmE0ODA5ZjRjMjI5YjRjZDg0MzgwNmE2NWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmYTc1NGJlM2RjMzQwMWJhYmNmNTUwZjc4ODMxYmM5ID0gJCgnPGRpdiBpZD0iaHRtbF82ZmE3NTRiZTNkYzM0MDFiYWJjZjU1MGY3ODgzMWJjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjRjOWJhNDgwOWY0YzIyOWI0Y2Q4NDM4MDZhNjVhNS5zZXRDb250ZW50KGh0bWxfNmZhNzU0YmUzZGMzNDAxYmFiY2Y1NTBmNzg4MzFiYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGNkMGJmNTIzYzExNDU2Y2ExOGU5ZGEyNjUxZThkN2YuYmluZFBvcHVwKHBvcHVwX2MyNGM5YmE0ODA5ZjRjMjI5YjRjZDg0MzgwNmE2NWE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZjhiYWJlMWIwMDQwYTBhZmIyOTVlNTQ3NDVmNDBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2OTM4Y2U1N2E3YjQwMmZhNGMzZDA1OGE2YjEyY2YwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiOGExZTBjNmZhNjRmNDdiNWRjMDRjMGYxMGI0ZmIzID0gJCgnPGRpdiBpZD0iaHRtbF8yYjhhMWUwYzZmYTY0ZjQ3YjVkYzA0YzBmMTBiNGZiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjkzOGNlNTdhN2I0MDJmYTRjM2QwNThhNmIxMmNmMC5zZXRDb250ZW50KGh0bWxfMmI4YTFlMGM2ZmE2NGY0N2I1ZGMwNGMwZjEwYjRmYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmVmOGJhYmUxYjAwNDBhMGFmYjI5NWU1NDc0NWY0MGEuYmluZFBvcHVwKHBvcHVwXzc2OTM4Y2U1N2E3YjQwMmZhNGMzZDA1OGE2YjEyY2YwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjMTE0MWJjMGU3MzQyODFhMWI0ZmYxNzFmOTk0ZGRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3NjQ4NTgxNmU0NjQ0NmJhNGVhZGU1NTBjN2NkY2NiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhZDU0MGUyNzRkZTRmNTE5MTYxMmFhOTAxYTJmMzBlID0gJCgnPGRpdiBpZD0iaHRtbF9mYWQ1NDBlMjc0ZGU0ZjUxOTE2MTJhYTkwMWEyZjMwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzY0ODU4MTZlNDY0NDZiYTRlYWRlNTUwYzdjZGNjYi5zZXRDb250ZW50KGh0bWxfZmFkNTQwZTI3NGRlNGY1MTkxNjEyYWE5MDFhMmYzMGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2MxMTQxYmMwZTczNDI4MWExYjRmZjE3MWY5OTRkZGEuYmluZFBvcHVwKHBvcHVwXzY3NjQ4NTgxNmU0NjQ0NmJhNGVhZGU1NTBjN2NkY2NiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA0ZjE2NTc4NzA2NTRiNzc5MDQ5OGIyZTllZTAxZTcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxZjIxNTZkYmJmMTQ3NjA5YTFiMThmNmI3MDAxYjlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwMzIxOWJiMjU1NzQ1ZjBiOTQxM2E5NjAxNTViMjJiID0gJCgnPGRpdiBpZD0iaHRtbF9kMDMyMTliYjI1NTc0NWYwYjk0MTNhOTYwMTU1YjIyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDFmMjE1NmRiYmYxNDc2MDlhMWIxOGY2YjcwMDFiOWYuc2V0Q29udGVudChodG1sX2QwMzIxOWJiMjU1NzQ1ZjBiOTQxM2E5NjAxNTViMjJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0ZjE2NTc4NzA2NTRiNzc5MDQ5OGIyZTllZTAxZTcxLmJpbmRQb3B1cChwb3B1cF9kMWYyMTU2ZGJiZjE0NzYwOWExYjE4ZjZiNzAwMWI5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Y2RhZDgxZjcwOWM0MmQ3YTAwOTFlYTFlYzcwZGZlZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlNjUxNmE5YjliODQ2MmZhYmVhNTQ3MzM0YjgyYjRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3NTJlMTBjNzIyMjQxZmViZGVmYTM3NzVhOTcwZjk5ID0gJCgnPGRpdiBpZD0iaHRtbF83NzUyZTEwYzcyMjI0MWZlYmRlZmEzNzc1YTk3MGY5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlNjUxNmE5YjliODQ2MmZhYmVhNTQ3MzM0YjgyYjRjLnNldENvbnRlbnQoaHRtbF83NzUyZTEwYzcyMjI0MWZlYmRlZmEzNzc1YTk3MGY5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Y2RhZDgxZjcwOWM0MmQ3YTAwOTFlYTFlYzcwZGZlZS5iaW5kUG9wdXAocG9wdXBfMGU2NTE2YTliOWI4NDYyZmFiZWE1NDczMzRiODJiNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTYxMjkyY2E1NWYyNDc0YzhiZTdmMDdiNDkwM2YyZDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5NTZkMGU0ZTljNzQ4NTU5MDQxYzBkZGYzMDU4YTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5YTFiMzY3MjViNTRmNTlhMTQwMDMwMjhjZThhN2E2ID0gJCgnPGRpdiBpZD0iaHRtbF85OWExYjM2NzI1YjU0ZjU5YTE0MDAzMDI4Y2U4YTdhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDk1NmQwZTRlOWM3NDg1NTkwNDFjMGRkZjMwNThhMDkuc2V0Q29udGVudChodG1sXzk5YTFiMzY3MjViNTRmNTlhMTQwMDMwMjhjZThhN2E2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2MTI5MmNhNTVmMjQ3NGM4YmU3ZjA3YjQ5MDNmMmQ2LmJpbmRQb3B1cChwb3B1cF9kOTU2ZDBlNGU5Yzc0ODU1OTA0MWMwZGRmMzA1OGEwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85N2JjNTgyNGM1NDc0YzRkYTcxMzJlZDUyNDA5N2YwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViODcxNTQ5MTBjMzRjZDM4OTdkMTIwMDcxYmFmNjAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5ZjY0OWUyNjAxZTRhMjQ4MTk0NzRmMGQwYWYzNTFhID0gJCgnPGRpdiBpZD0iaHRtbF80OWY2NDllMjYwMWU0YTI0ODE5NDc0ZjBkMGFmMzUxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWI4NzE1NDkxMGMzNGNkMzg5N2QxMjAwNzFiYWY2MDAuc2V0Q29udGVudChodG1sXzQ5ZjY0OWUyNjAxZTRhMjQ4MTk0NzRmMGQwYWYzNTFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3YmM1ODI0YzU0NzRjNGRhNzEzMmVkNTI0MDk3ZjBlLmJpbmRQb3B1cChwb3B1cF81Yjg3MTU0OTEwYzM0Y2QzODk3ZDEyMDA3MWJhZjYwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MzUyMDYyMzY1YjU0YmYxYjNiYTA3NjNkMWUxY2JhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZDdkM2M1YzllNGI0NGQ5YTZkYWFiMzEzOThmZWYyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YzE5OWM1NzE0Mzg0ODkzOGZlZjhmODY0Nzk2NzViZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGMxOTljNTcxNDM4NDg5MzhmZWY4Zjg2NDc5Njc1YmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQ3ZDNjNWM5ZTRiNDRkOWE2ZGFhYjMxMzk4ZmVmMmYuc2V0Q29udGVudChodG1sXzhjMTk5YzU3MTQzODQ4OTM4ZmVmOGY4NjQ3OTY3NWJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYzNTIwNjIzNjViNTRiZjFiM2JhMDc2M2QxZTFjYmFkLmJpbmRQb3B1cChwb3B1cF9hZDdkM2M1YzllNGI0NGQ5YTZkYWFiMzEzOThmZWYyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjRmODNhODc4MDk0ZWJhYjMzNjczNDA3OWU4MTc5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jN2MxZmUwNjk1YTQ0N2U5OGQ3Nzc4NjJkYzFhZWRiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTcwZjQ2MDRlZjY0ZDg4ODZmZDZlM2M2MTFjNmE1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWE3MGY0NjA0ZWY2NGQ4ODg2ZmQ2ZTNjNjExYzZhNWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdjMWZlMDY5NWE0NDdlOThkNzc3ODYyZGMxYWVkYjQuc2V0Q29udGVudChodG1sXzVhNzBmNDYwNGVmNjRkODg4NmZkNmUzYzYxMWM2YTVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2NGY4M2E4NzgwOTRlYmFiMzM2NzM0MDc5ZTgxNzk0LmJpbmRQb3B1cChwb3B1cF9jN2MxZmUwNjk1YTQ0N2U5OGQ3Nzc4NjJkYzFhZWRiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZDlkOGQ5NmFkYjI0MWI2OTQ4YTQ2YWU4NjU2NTgzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGU4ODI1ZmQ2MmU0YTdkYTY4M2YwMDlkZTdmYjRiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWMyNmVkMTlhMjE0ODg1YTc2NzI4MzQwM2NlZjQ5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FjMjZlZDE5YTIxNDg4NWE3NjcyODM0MDNjZWY0OWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMGU4ODI1ZmQ2MmU0YTdkYTY4M2YwMDlkZTdmYjRiZi5zZXRDb250ZW50KGh0bWxfM2FjMjZlZDE5YTIxNDg4NWE3NjcyODM0MDNjZWY0OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWQ5ZDhkOTZhZGIyNDFiNjk0OGE0NmFlODY1NjU4MzguYmluZFBvcHVwKHBvcHVwX2IwZTg4MjVmZDYyZTRhN2RhNjgzZjAwOWRlN2ZiNGJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZTZjNDFjYzdmMDRiNmM5YjZmMTdhY2E5ZjdhYjVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmE0MTBjZDRkOGFlNDM5MmFlNjc4ZTNhMGJlMzQyZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTI2MDZjY2EzZTk5NGE3NDg2YTMwNzVkNmQ3ZGRhNGEgPSAkKCc8ZGl2IGlkPSJodG1sX2EyNjA2Y2NhM2U5OTRhNzQ4NmEzMDc1ZDZkN2RkYTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTQxMGNkNGQ4YWU0MzkyYWU2NzhlM2EwYmUzNDJmOS5zZXRDb250ZW50KGh0bWxfYTI2MDZjY2EzZTk5NGE3NDg2YTMwNzVkNmQ3ZGRhNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRlNmM0MWNjN2YwNGI2YzliNmYxN2FjYTlmN2FiNWUuYmluZFBvcHVwKHBvcHVwX2JhNDEwY2Q0ZDhhZTQzOTJhZTY3OGUzYTBiZTM0MmY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM0ZWYzZDAzNDlhMzRkODA5YzgyM2UyMzRjYjBiMTAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZjUwOTMzMmFmY2I0Nzg5YTVlYmJkOWY2ZjZhYmNlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGNlYWExZjliYzI0Mjc5ODFiMmJjODM0Y2Y4Y2NhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTRjZWFhMWY5YmMyNDI3OTgxYjJiYzgzNGNmOGNjYTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjUwOTMzMmFmY2I0Nzg5YTVlYmJkOWY2ZjZhYmNlYi5zZXRDb250ZW50KGh0bWxfYTRjZWFhMWY5YmMyNDI3OTgxYjJiYzgzNGNmOGNjYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzRlZjNkMDM0OWEzNGQ4MDljODIzZTIzNGNiMGIxMDMuYmluZFBvcHVwKHBvcHVwX2ZmNTA5MzMyYWZjYjQ3ODlhNWViYmQ5ZjZmNmFiY2ViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkYjU1MTYzMzVjZDRjNmRhN2RkMjA4YzZmYzcxMDRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ3ODVlMmEyMjk4NGUwOWI2ZGVjZTdhZjk1ODVjODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGE5ZDBjNzRmMzJlNGM4ZTliNzBmYzNjNWJlYmJkYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzBhOWQwYzc0ZjMyZTRjOGU5YjcwZmMzYzViZWJiZGFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkNzg1ZTJhMjI5ODRlMDliNmRlY2U3YWY5NTg1YzgyLnNldENvbnRlbnQoaHRtbF8wYTlkMGM3NGYzMmU0YzhlOWI3MGZjM2M1YmViYmRhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZGI1NTE2MzM1Y2Q0YzZkYTdkZDIwOGM2ZmM3MTA0Yi5iaW5kUG9wdXAocG9wdXBfYWQ3ODVlMmEyMjk4NGUwOWI2ZGVjZTdhZjk1ODVjODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmUwMGY2NjU5NWRlNDc1MDkxNGVmNDM3MzIwYzc4MzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZGY1ZWUzMWZkZjg0MzA5OTk0Y2UyNDIyNDlhN2JkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iN2E2MzMxY2NiYTU0ODgzYTZiNzY4OGI0MWI5ZTgwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjdhNjMzMWNjYmE1NDg4M2E2Yjc2ODhiNDFiOWU4MDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZGY1ZWUzMWZkZjg0MzA5OTk0Y2UyNDIyNDlhN2JkYi5zZXRDb250ZW50KGh0bWxfYjdhNjMzMWNjYmE1NDg4M2E2Yjc2ODhiNDFiOWU4MDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmUwMGY2NjU5NWRlNDc1MDkxNGVmNDM3MzIwYzc4MzguYmluZFBvcHVwKHBvcHVwXzdkZjVlZTMxZmRmODQzMDk5OTRjZTI0MjI0OWE3YmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2ZThhNjMxODE3MzQ0ZmZhYzczOTY5MmM0MDAxYzM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkMDhhNDExNDk0OTRmN2I4YmFhYjU5NDI3ZjkyNTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhMDFiMTI1ODljNzRmNjc5NGZlZjBhMmY4ZDEwMDAxID0gJCgnPGRpdiBpZD0iaHRtbF9hYTAxYjEyNTg5Yzc0ZjY3OTRmZWYwYTJmOGQxMDAwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2QwOGE0MTE0OTQ5NGY3YjhiYWFiNTk0MjdmOTI1MTIuc2V0Q29udGVudChodG1sX2FhMDFiMTI1ODljNzRmNjc5NGZlZjBhMmY4ZDEwMDAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU2ZThhNjMxODE3MzQ0ZmZhYzczOTY5MmM0MDAxYzM4LmJpbmRQb3B1cChwb3B1cF9jZDA4YTQxMTQ5NDk0ZjdiOGJhYWI1OTQyN2Y5MjUxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTk3NzBmODc1Yzk0NGQ4OTA3NzQ1ZGEwMWYxNmE2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM5MWM3NWE0Y2ViNDNhMDljMGRjZjllMWUyYTk0ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkyODU2MzViMDA4NDYwMThiM2M5YTUwZjg3MmI5MmIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5Mjg1NjM1YjAwODQ2MDE4YjNjOWE1MGY4NzJiOTJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM5MWM3NWE0Y2ViNDNhMDljMGRjZjllMWUyYTk0ZjUuc2V0Q29udGVudChodG1sX2Y5Mjg1NjM1YjAwODQ2MDE4YjNjOWE1MGY4NzJiOTJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxOTc3MGY4NzVjOTQ0ZDg5MDc3NDVkYTAxZjE2YTZjLmJpbmRQb3B1cChwb3B1cF8wMzkxYzc1YTRjZWI0M2EwOWMwZGNmOWUxZTJhOTRmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YWZiNjk3MWMzNTI0OWU5ODJkZTI0ZDk0NTMzOTQwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTAzMzlkODgwNDY0ZDE2YWQ5NmIzNzEwOWMzOWJiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NDBjYzUwODhhYzk0YmEwOWQxMTExYzZhYWNkZmE3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTQwY2M1MDg4YWM5NGJhMDlkMTExMWM2YWFjZGZhN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxMDMzOWQ4ODA0NjRkMTZhZDk2YjM3MTA5YzM5YmI3LnNldENvbnRlbnQoaHRtbF81NDBjYzUwODhhYzk0YmEwOWQxMTExYzZhYWNkZmE3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YWZiNjk3MWMzNTI0OWU5ODJkZTI0ZDk0NTMzOTQwNS5iaW5kUG9wdXAocG9wdXBfNzEwMzM5ZDg4MDQ2NGQxNmFkOTZiMzcxMDljMzliYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdiYjIxYTQzMGNlNGVlOTk4ODNhMGY4ODg0YmRmNWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTlkODY5MGYzMzY5NGJlMTk1NzZlMjE1YTUwNzY3ZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDZiZDU5YjdkMDBmNDA3Y2ExZmQ2Y2Q0M2RmZjg5ZGEgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2YmQ1OWI3ZDAwZjQwN2NhMWZkNmNkNDNkZmY4OWRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTlkODY5MGYzMzY5NGJlMTk1NzZlMjE1YTUwNzY3ZDAuc2V0Q29udGVudChodG1sX2Q2YmQ1OWI3ZDAwZjQwN2NhMWZkNmNkNDNkZmY4OWRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3YmIyMWE0MzBjZTRlZTk5ODgzYTBmODg4NGJkZjVlLmJpbmRQb3B1cChwb3B1cF85OWQ4NjkwZjMzNjk0YmUxOTU3NmUyMTVhNTA3NjdkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MmIyZWY2M2IxMDI0ZDdmYWUwMjk5YmQ2ODI0YjhiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQ2ZmZiZTBlOGJkNDgyNjg0ZTAxYTRjNmZjZmJhMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTJmOGQ3NmQ5ODM0NDgyZmEzYzdmMTZlNjkzZWE1YTIgPSAkKCc8ZGl2IGlkPSJodG1sX2EyZjhkNzZkOTgzNDQ4MmZhM2M3ZjE2ZTY5M2VhNWEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkNmZmYmUwZThiZDQ4MjY4NGUwMWE0YzZmY2ZiYTFlLnNldENvbnRlbnQoaHRtbF9hMmY4ZDc2ZDk4MzQ0ODJmYTNjN2YxNmU2OTNlYTVhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MmIyZWY2M2IxMDI0ZDdmYWUwMjk5YmQ2ODI0YjhiMi5iaW5kUG9wdXAocG9wdXBfYmQ2ZmZiZTBlOGJkNDgyNjg0ZTAxYTRjNmZjZmJhMWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDAwMzI4ZDkxYzlmNDBmZDg3MzM0NmM5ZjM2M2RjOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQyYmY5MmMxMmYzNGM3OWI4NGZlYmZiY2EyNGZjMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWNmYzllMmVkZDVmNDc4MzgyM2I3MGY1MTBlOTllNmUgPSAkKCc8ZGl2IGlkPSJodG1sXzljZmM5ZTJlZGQ1ZjQ3ODM4MjNiNzBmNTEwZTk5ZTZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkMmJmOTJjMTJmMzRjNzliODRmZWJmYmNhMjRmYzM3LnNldENvbnRlbnQoaHRtbF85Y2ZjOWUyZWRkNWY0NzgzODIzYjcwZjUxMGU5OWU2ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDAzMjhkOTFjOWY0MGZkODczMzQ2YzlmMzYzZGM5Mi5iaW5kUG9wdXAocG9wdXBfYmQyYmY5MmMxMmYzNGM3OWI4NGZlYmZiY2EyNGZjMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM4MmNhYTVhOGZmNGU1MWIyMTgzNWY1OTcxODJiNzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZjRkMWI0OTBkYjg0NzI2OWM1MTJkZmE4OWI2OTg1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjJkZWNlZWVlZDg0MTk3OWU3ZjIxMzVmODIzNWJlZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWYyZGVjZWVlZWQ4NDE5NzllN2YyMTM1ZjgyMzViZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZjRkMWI0OTBkYjg0NzI2OWM1MTJkZmE4OWI2OTg1MS5zZXRDb250ZW50KGh0bWxfOWYyZGVjZWVlZWQ4NDE5NzllN2YyMTM1ZjgyMzViZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzM4MmNhYTVhOGZmNGU1MWIyMTgzNWY1OTcxODJiNzguYmluZFBvcHVwKHBvcHVwXzhmNGQxYjQ5MGRiODQ3MjY5YzUxMmRmYTg5YjY5ODUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliOGRlZGE3NmQ3NDRmZDhhNTNmNTI0MTFlZDgyMjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWNlNzcwMWZiOWRiNDQwZTlkMGZhZDYzNGUxNzNmMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWJhODkyYTgzNmNmNGRjY2IyZTllNTNmOTAxOTFlYmMgPSAkKCc8ZGl2IGlkPSJodG1sXzFiYTg5MmE4MzZjZjRkY2NiMmU5ZTUzZjkwMTkxZWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2U3NzAxZmI5ZGI0NDBlOWQwZmFkNjM0ZTE3M2YyNC5zZXRDb250ZW50KGh0bWxfMWJhODkyYTgzNmNmNGRjY2IyZTllNTNmOTAxOTFlYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWI4ZGVkYTc2ZDc0NGZkOGE1M2Y1MjQxMWVkODIyMWEuYmluZFBvcHVwKHBvcHVwXzFjZTc3MDFmYjlkYjQ0MGU5ZDBmYWQ2MzRlMTczZjI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczZThjOGEzN2MxNzRiOWI5NzJhYTI3YjE1ZDFiMDA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDJkYzc4NGY2M2M0NDFhYmUwNjk3MmI4NTA2NzE3NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODExZTMwYjQ3MTI0YzZjOGYxNTU4MWZlYTFjZWYwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTgxMWUzMGI0NzEyNGM2YzhmMTU1ODFmZWExY2VmMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDJkYzc4NGY2M2M0NDFhYmUwNjk3MmI4NTA2NzE3Ni5zZXRDb250ZW50KGh0bWxfYTgxMWUzMGI0NzEyNGM2YzhmMTU1ODFmZWExY2VmMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzNlOGM4YTM3YzE3NGI5Yjk3MmFhMjdiMTVkMWIwMDQuYmluZFBvcHVwKHBvcHVwXzMwMmRjNzg0ZjYzYzQ0MWFiZTA2OTcyYjg1MDY3MTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4MzU3OGQ0YzNhODQ2Nzk5NGY0MDUwYzYyOTU5MDk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4ZDAyZjQ4MzljMzQ0Mzc4ZWYzMTY4ZTI0NmZiZTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxNTdmMDJkNDg4ZjRiYjJiMjAyNjhmZjM2MzM5OWJjID0gJCgnPGRpdiBpZD0iaHRtbF8zMTU3ZjAyZDQ4OGY0YmIyYjIwMjY4ZmYzNjMzOTliYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4ZDAyZjQ4MzljMzQ0Mzc4ZWYzMTY4ZTI0NmZiZTUyLnNldENvbnRlbnQoaHRtbF8zMTU3ZjAyZDQ4OGY0YmIyYjIwMjY4ZmYzNjMzOTliYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lODM1NzhkNGMzYTg0Njc5OTRmNDA1MGM2Mjk1OTA5OC5iaW5kUG9wdXAocG9wdXBfZjhkMDJmNDgzOWMzNDQzNzhlZjMxNjhlMjQ2ZmJlNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ZiOTk3MWNjMDQ2NDk2ZDgzNmYwOTkyYTllYTFkZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDIzZThiOWM2ZGM0NDJlNDhjNGNmYTI3NGFiMmE2MjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjZkYTM3MWQ5MzMwNDg3NDljNWYwYzI5YTkyMGFiZGMgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2ZGEzNzFkOTMzMDQ4NzQ5YzVmMGMyOWE5MjBhYmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDIzZThiOWM2ZGM0NDJlNDhjNGNmYTI3NGFiMmE2Mjcuc2V0Q29udGVudChodG1sX2Y2ZGEzNzFkOTMzMDQ4NzQ5YzVmMGMyOWE5MjBhYmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmYjk5NzFjYzA0NjQ5NmQ4MzZmMDk5MmE5ZWExZGRiLmJpbmRQb3B1cChwb3B1cF80MjNlOGI5YzZkYzQ0MmU0OGM0Y2ZhMjc0YWIyYTYyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjI0YmQ3ZjNkOTQ0NTQyYjlkMWE4MzY5NjNlMDAwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlMWU2N2Q5ODcxNDZiOGIzNjcxY2Q5ZTJhZjk2YjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTY2MDg4MzgwZjQ0NGRkZmFkMTI0NmU2MzYyNTJlNGQgPSAkKCc8ZGl2IGlkPSJodG1sX2U2NjA4ODM4MGY0NDRkZGZhZDEyNDZlNjM2MjUyZTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hN2UxZTY3ZDk4NzE0NmI4YjM2NzFjZDllMmFmOTZiOS5zZXRDb250ZW50KGh0bWxfZTY2MDg4MzgwZjQ0NGRkZmFkMTI0NmU2MzYyNTJlNGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjYyNGJkN2YzZDk0NDU0MmI5ZDFhODM2OTYzZTAwMDEuYmluZFBvcHVwKHBvcHVwX2E3ZTFlNjdkOTg3MTQ2YjhiMzY3MWNkOWUyYWY5NmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhNjU5NTQ5YjkzMjQxMTk4ODNmYWRhZDEzZmQ3MGU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3NTIzZjA0NTVmNTQ0MmM4Yjg0ODAwZWJiMzk1NGEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2NzIwMTJkNDg3NDRiZTM4NDMxNTAwYjEwMzdiZjRmID0gJCgnPGRpdiBpZD0iaHRtbF84NjcyMDEyZDQ4NzQ0YmUzODQzMTUwMGIxMDM3YmY0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk3NTIzZjA0NTVmNTQ0MmM4Yjg0ODAwZWJiMzk1NGEyLnNldENvbnRlbnQoaHRtbF84NjcyMDEyZDQ4NzQ0YmUzODQzMTUwMGIxMDM3YmY0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYTY1OTU0OWI5MzI0MTE5ODgzZmFkYWQxM2ZkNzBlNS5iaW5kUG9wdXAocG9wdXBfOTc1MjNmMDQ1NWY1NDQyYzhiODQ4MDBlYmIzOTU0YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmYwZDJlYTgwN2IzNDUyMGIzMWE2Y2E2YzdlNDQ2MTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwM2U5YTZmNTgzNzRkZjBhOWQ5M2JhOTUxMTYzMWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhMWFiODEwOTYyMjRkOWY5ZjU0MjQxOGYyZmEyODQ5ID0gJCgnPGRpdiBpZD0iaHRtbF80YTFhYjgxMDk2MjI0ZDlmOWY1NDI0MThmMmZhMjg0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDAzZTlhNmY1ODM3NGRmMGE5ZDkzYmE5NTExNjMxYWUuc2V0Q29udGVudChodG1sXzRhMWFiODEwOTYyMjRkOWY5ZjU0MjQxOGYyZmEyODQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmMGQyZWE4MDdiMzQ1MjBiMzFhNmNhNmM3ZTQ0NjE4LmJpbmRQb3B1cChwb3B1cF8wMDNlOWE2ZjU4Mzc0ZGYwYTlkOTNiYTk1MTE2MzFhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTQxMGU4NmRhYzk0MTM1OTdlNzEzNGFlZWE0M2UxOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjUzNDYzMTZmZjk0MmQ0OWU2ZTU3MGRhYTk3NzM0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MjY2OTAyZWM4ZjA0YWNkODc4NjE5OThmYjgzNmJlNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDI2NjkwMmVjOGYwNGFjZDg3ODYxOTk4ZmI4MzZiZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjUzNDYzMTZmZjk0MmQ0OWU2ZTU3MGRhYTk3NzM0Ny5zZXRDb250ZW50KGh0bWxfNDI2NjkwMmVjOGYwNGFjZDg3ODYxOTk4ZmI4MzZiZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTE0MTBlODZkYWM5NDEzNTk3ZTcxMzRhZWVhNDNlMTguYmluZFBvcHVwKHBvcHVwXzBmNTM0NjMxNmZmOTQyZDQ5ZTZlNTcwZGFhOTc3MzQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3YWUyNDdhYTNhZTQ1ZjA4ZDE0NGI0OGYzZjA3NzM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWIwZmYwY2M1YTEzNDgxOWExYTg2MjZiYWU0Zjc4MDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdlOTM3ZDdjNTE4NGJjNjk3YTExZjI1ZjQyYmVjMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzY3ZTkzN2Q3YzUxODRiYzY5N2ExMWYyNWY0MmJlYzAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliMGZmMGNjNWExMzQ4MTlhMWE4NjI2YmFlNGY3ODA2LnNldENvbnRlbnQoaHRtbF82N2U5MzdkN2M1MTg0YmM2OTdhMTFmMjVmNDJiZWMwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mN2FlMjQ3YWEzYWU0NWYwOGQxNDRiNDhmM2YwNzczNC5iaW5kUG9wdXAocG9wdXBfOWIwZmYwY2M1YTEzNDgxOWExYTg2MjZiYWU0Zjc4MDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjg4N2RiMTkwYWY3NDdjNmE2YTk1MWM0OGUwOTU4NmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwMzEyZjEyNGI3YzQ3Zjk4NDlmN2Q3OTdhMThlZWQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwZWEzNTExZjA0YTQ1Zjk4NDU2MmVlNzU2ZGFiNjkxID0gJCgnPGRpdiBpZD0iaHRtbF9hMGVhMzUxMWYwNGE0NWY5ODQ1NjJlZTc1NmRhYjY5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDMxMmYxMjRiN2M0N2Y5ODQ5ZjdkNzk3YTE4ZWVkNi5zZXRDb250ZW50KGh0bWxfYTBlYTM1MTFmMDRhNDVmOTg0NTYyZWU3NTZkYWI2OTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg4N2RiMTkwYWY3NDdjNmE2YTk1MWM0OGUwOTU4NmMuYmluZFBvcHVwKHBvcHVwX2MwMzEyZjEyNGI3YzQ3Zjk4NDlmN2Q3OTdhMThlZWQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4ZDQyNTMzOWU1OTRhMGFhMjNmZWFmOGQzYzI2Y2UxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1YjlmMTBmMTRhNDQzMjRiMDkzYjkyNDlmN2RmNWIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzMjQxNmUzMTFhZjRiZjM5YTFiYjUwMDFiZWQwNTI0ID0gJCgnPGRpdiBpZD0iaHRtbF81MzI0MTZlMzExYWY0YmYzOWExYmI1MDAxYmVkMDUyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1YjlmMTBmMTRhNDQzMjRiMDkzYjkyNDlmN2RmNWIyLnNldENvbnRlbnQoaHRtbF81MzI0MTZlMzExYWY0YmYzOWExYmI1MDAxYmVkMDUyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOGQ0MjUzMzllNTk0YTBhYTIzZmVhZjhkM2MyNmNlMS5iaW5kUG9wdXAocG9wdXBfNzViOWYxMGYxNGE0NDMyNGIwOTNiOTI0OWY3ZGY1YjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZkZWM5YzAwMTkyNGRmMDkxNmVlMDJjMjM4ZDVmNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3MmJjNWM3YTViMDQyMjdiNjE3MjFiNGQwNTc3NDY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0YjNlMDM5NTZkODRmZTA4NThhZTIyZmE3NzQzMTRhID0gJCgnPGRpdiBpZD0iaHRtbF8zNGIzZTAzOTU2ZDg0ZmUwODU4YWUyMmZhNzc0MzE0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzJiYzVjN2E1YjA0MjI3YjYxNzIxYjRkMDU3NzQ2Ny5zZXRDb250ZW50KGh0bWxfMzRiM2UwMzk1NmQ4NGZlMDg1OGFlMjJmYTc3NDMxNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZkZWM5YzAwMTkyNGRmMDkxNmVlMDJjMjM4ZDVmNzcuYmluZFBvcHVwKHBvcHVwXzI3MmJjNWM3YTViMDQyMjdiNjE3MjFiNGQwNTc3NDY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExMTQ0ZmIyMjgyNzQ2MzQ4MjkwZTRiNWNmMmNiZDZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmYjc4ZmY1MDJjYjQ5NGZiN2NjOWQzMDBjZTdjM2Q3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhYzlkNDNkZGNiMzRiODA4OWEzZTk3N2NlYTM0M2JkID0gJCgnPGRpdiBpZD0iaHRtbF81YWM5ZDQzZGRjYjM0YjgwODlhM2U5NzdjZWEzNDNiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZmI3OGZmNTAyY2I0OTRmYjdjYzlkMzAwY2U3YzNkNy5zZXRDb250ZW50KGh0bWxfNWFjOWQ0M2RkY2IzNGI4MDg5YTNlOTc3Y2VhMzQzYmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTExNDRmYjIyODI3NDYzNDgyOTBlNGI1Y2YyY2JkNmIuYmluZFBvcHVwKHBvcHVwX2NmYjc4ZmY1MDJjYjQ5NGZiN2NjOWQzMDBjZTdjM2Q3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmYjQ4YWRjZGYzODRkZmY4MDA5ZjE5MWI4ODk4NTM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5MThmYjZkYzA0ZDQzMWY5ODJkYTg1NDI4NTgxZDlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1MjI2M2Y4MzY1ODQxNWQ5NzM4YWJjNjAxYTUyZThlID0gJCgnPGRpdiBpZD0iaHRtbF85NTIyNjNmODM2NTg0MTVkOTczOGFiYzYwMWE1MmU4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5MThmYjZkYzA0ZDQzMWY5ODJkYTg1NDI4NTgxZDlhLnNldENvbnRlbnQoaHRtbF85NTIyNjNmODM2NTg0MTVkOTczOGFiYzYwMWE1MmU4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZmI0OGFkY2RmMzg0ZGZmODAwOWYxOTFiODg5ODUzNC5iaW5kUG9wdXAocG9wdXBfMTkxOGZiNmRjMDRkNDMxZjk4MmRhODU0Mjg1ODFkOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjVlY2M1NWNhODYwNGEzZTg0ODNlNDM5Yjg5MmI0Y2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyZjI4MTJlZGViMzQyMzdhMTg2YTg4ZTJkODE2MGVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZTViMjAwNDIzMjQwYTA4NTkzZDg4OGU3NjU4YzI0ID0gJCgnPGRpdiBpZD0iaHRtbF82MWU1YjIwMDQyMzI0MGEwODU5M2Q4ODhlNzY1OGMyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmYyODEyZWRlYjM0MjM3YTE4NmE4OGUyZDgxNjBlYS5zZXRDb250ZW50KGh0bWxfNjFlNWIyMDA0MjMyNDBhMDg1OTNkODg4ZTc2NThjMjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVlY2M1NWNhODYwNGEzZTg0ODNlNDM5Yjg5MmI0Y2MuYmluZFBvcHVwKHBvcHVwXzQyZjI4MTJlZGViMzQyMzdhMTg2YTg4ZTJkODE2MGVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1ZjY1NmIzOTM1ODQ0NzdiMGEzZDVkMjlhZTI4Mzg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlNDI2YzQwZGFhZjQyYmM5YjVmZTk5YjM3NjkxMjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzZDRiMDM2MDc4NzRlYjE4OThmNWI5MWEzOGY1NTk0ID0gJCgnPGRpdiBpZD0iaHRtbF85M2Q0YjAzNjA3ODc0ZWIxODk4ZjViOTFhMzhmNTU5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTQyNmM0MGRhYWY0MmJjOWI1ZmU5OWIzNzY5MTIzNC5zZXRDb250ZW50KGh0bWxfOTNkNGIwMzYwNzg3NGViMTg5OGY1YjkxYTM4ZjU1OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODVmNjU2YjM5MzU4NDQ3N2IwYTNkNWQyOWFlMjgzODUuYmluZFBvcHVwKHBvcHVwX2VlNDI2YzQwZGFhZjQyYmM5YjVmZTk5YjM3NjkxMjM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5ZmQ3MTFlMjY4ZDQ4YzdiN2Q0NmJjMWQ3NjdkYzBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDhjMDA2OTcyOTI0NThjOTcyMGU4MzA1ZDg5ZDA3NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGQwMmE0MGY3MzU0YmJhYjJlZmZjMTNlYmNmMDdiZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhkMDJhNDBmNzM1NGJiYWIyZWZmYzEzZWJjZjA3YmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDhjMDA2OTcyOTI0NThjOTcyMGU4MzA1ZDg5ZDA3Ni5zZXRDb250ZW50KGh0bWxfMDhkMDJhNDBmNzM1NGJiYWIyZWZmYzEzZWJjZjA3YmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzlmZDcxMWUyNjhkNDhjN2I3ZDQ2YmMxZDc2N2RjMGUuYmluZFBvcHVwKHBvcHVwXzE0OGMwMDY5NzI5MjQ1OGM5NzIwZTgzMDVkODlkMDc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhZWZhYjJjNjY0ZDRhMDRiN2IxNWE3NDMwMTQxNzk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI4YjY3NDBjN2Y5NDVmNDhmNWQ4YTQ2OGE2OGYzNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmVmYWVkMWYyNjRiNDI2OThhMDcyNTJmMTU0NmZlY2IgPSAkKCc8ZGl2IGlkPSJodG1sXzJlZmFlZDFmMjY0YjQyNjk4YTA3MjUyZjE1NDZmZWNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI4YjY3NDBjN2Y5NDVmNDhmNWQ4YTQ2OGE2OGYzNGMuc2V0Q29udGVudChodG1sXzJlZmFlZDFmMjY0YjQyNjk4YTA3MjUyZjE1NDZmZWNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZWZhYjJjNjY0ZDRhMDRiN2IxNWE3NDMwMTQxNzk4LmJpbmRQb3B1cChwb3B1cF9iMjhiNjc0MGM3Zjk0NWY0OGY1ZDhhNDY4YTY4ZjM0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZTVlZjY2MWM5ZDY0ODIyOTdjYTljNzFiNGY3OTlmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDJiYTNjMWJjMmE0ODhhYmFkMTE3MDI3ZjZmZDllOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OTMxYTVhNjcyNGY0ODkzYTI1ZGE3ZTI0YzFkMTkzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfODkzMWE1YTY3MjRmNDg5M2EyNWRhN2UyNGMxZDE5MzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDJiYTNjMWJjMmE0ODhhYmFkMTE3MDI3ZjZmZDllOC5zZXRDb250ZW50KGh0bWxfODkzMWE1YTY3MjRmNDg5M2EyNWRhN2UyNGMxZDE5MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGU1ZWY2NjFjOWQ2NDgyMjk3Y2E5YzcxYjRmNzk5ZjAuYmluZFBvcHVwKHBvcHVwX2Y0MmJhM2MxYmMyYTQ4OGFiYWQxMTcwMjdmNmZkOWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjYmQ3OWViYjczODQ4MGI5MTI2N2MyODI1OTQ5ZTA1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2I0ZjkxZDFkZmY0YmQxYjdkYzdiY2UxYTI5YTc4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZGZiNGQxZDk2MDA0MmU2OThkMGE2OTFjYzU3YTY4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmRmYjRkMWQ5NjAwNDJlNjk4ZDBhNjkxY2M1N2E2OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdiNGY5MWQxZGZmNGJkMWI3ZGM3YmNlMWEyOWE3ODAuc2V0Q29udGVudChodG1sXzZkZmI0ZDFkOTYwMDQyZTY5OGQwYTY5MWNjNTdhNjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjYmQ3OWViYjczODQ4MGI5MTI2N2MyODI1OTQ5ZTA1LmJpbmRQb3B1cChwb3B1cF8xN2I0ZjkxZDFkZmY0YmQxYjdkYzdiY2UxYTI5YTc4MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzNhOTI2YTJjMTk0YmNjOWM5NjA5ZjUzNGZhNWY5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zY2RhMTYwNmQ2YWI0NmY0YWU1YTdlMWFlZGI2MmExMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OWI2OWYxMWNjMzE0NGFmYWFmM2RmZmYwNWQxNmRjMyA9ICQoJzxkaXYgaWQ9Imh0bWxfODliNjlmMTFjYzMxNDRhZmFhZjNkZmZmMDVkMTZkYzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjZGExNjA2ZDZhYjQ2ZjRhZTVhN2UxYWVkYjYyYTEwLnNldENvbnRlbnQoaHRtbF84OWI2OWYxMWNjMzE0NGFmYWFmM2RmZmYwNWQxNmRjMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzNhOTI2YTJjMTk0YmNjOWM5NjA5ZjUzNGZhNWY5My5iaW5kUG9wdXAocG9wdXBfM2NkYTE2MDZkNmFiNDZmNGFlNWE3ZTFhZWRiNjJhMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmJiYjViZWVhMmM3NDdmY2E0MTAzYzViNGMxOGFhODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg0NmUxYmIzNGE0NGJjNGEyOWY0ZTVlYmNlMjczNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNkNjkwY2JmYWI1NDdjOWJkNTMxZjdhYWFiNzNmNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzRjZDY5MGNiZmFiNTQ3YzliZDUzMWY3YWFhYjczZjVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODQ2ZTFiYjM0YTQ0YmM0YTI5ZjRlNWViY2UyNzM0Zi5zZXRDb250ZW50KGh0bWxfNGNkNjkwY2JmYWI1NDdjOWJkNTMxZjdhYWFiNzNmNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJiYjViZWVhMmM3NDdmY2E0MTAzYzViNGMxOGFhODEuYmluZFBvcHVwKHBvcHVwX2M4NDZlMWJiMzRhNDRiYzRhMjlmNGU1ZWJjZTI3MzRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhMmYzY2QwNzY4NDQ3NjNiYmMzNGIyY2FhMGE0ZjQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1YTBhM2NlMTE0MzRiODY5MGVkOWM2YTc1NGIyMjkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmNDY5YTRmNjI3NTQwZjhiNjMzMGIyZWFlNjhjMjhlID0gJCgnPGRpdiBpZD0iaHRtbF85ZjQ2OWE0ZjYyNzU0MGY4YjYzMzBiMmVhZTY4YzI4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1YTBhM2NlMTE0MzRiODY5MGVkOWM2YTc1NGIyMjkxLnNldENvbnRlbnQoaHRtbF85ZjQ2OWE0ZjYyNzU0MGY4YjYzMzBiMmVhZTY4YzI4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYTJmM2NkMDc2ODQ0NzYzYmJjMzRiMmNhYTBhNGY0NC5iaW5kUG9wdXAocG9wdXBfZDVhMGEzY2UxMTQzNGI4NjkwZWQ5YzZhNzU0YjIyOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjk4N2Q5YzgzZjAwNDYwMjhmMzU3MTYxMTJlMmI3YTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmI1OTYxMzkyOThjNDJmMjliMjMxZWUxNzdlZmRmOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmYzODZhMDZjYTM0NDllODk0ZGQ4YjNkOGQ0NTA4NTIgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmMzg2YTA2Y2EzNDQ5ZTg5NGRkOGIzZDhkNDUwODUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmI1OTYxMzkyOThjNDJmMjliMjMxZWUxNzdlZmRmOGIuc2V0Q29udGVudChodG1sX2ZmMzg2YTA2Y2EzNDQ5ZTg5NGRkOGIzZDhkNDUwODUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5ODdkOWM4M2YwMDQ2MDI4ZjM1NzE2MTEyZTJiN2EzLmJpbmRQb3B1cChwb3B1cF82YjU5NjEzOTI5OGM0MmYyOWIyMzFlZTE3N2VmZGY4Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYTJiYWQ3YmU3MmQ0NmI4OTYwMDY3YzgxYTNhYjNkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWMwMzM3YWI2YzQxNGYwMzgzMTJmMzQxNzgwYTdjNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjY3OWViZTAyM2Y1NDA4MDg4YWZjZjk2M2NlY2NkYzggPSAkKCc8ZGl2IGlkPSJodG1sX2I2NzllYmUwMjNmNTQwODA4OGFmY2Y5NjNjZWNjZGM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMwMzM3YWI2YzQxNGYwMzgzMTJmMzQxNzgwYTdjNjkuc2V0Q29udGVudChodG1sX2I2NzllYmUwMjNmNTQwODA4OGFmY2Y5NjNjZWNjZGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhMmJhZDdiZTcyZDQ2Yjg5NjAwNjdjODFhM2FiM2Q4LmJpbmRQb3B1cChwb3B1cF9lYzAzMzdhYjZjNDE0ZjAzODMxMmYzNDE3ODBhN2M2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzU4ZmZiMWRiOTE0MWE0ODM2MGM4ODljMTkzNWZkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTAxMjdkODVlYTk0NGU4YmIwOTM0YjIyOWQ0ZjMzNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjIwYTM5OWI0MjFlNGI1M2FmYmVkMDIxYzg5ZGJhM2IgPSAkKCc8ZGl2IGlkPSJodG1sXzYyMGEzOTliNDIxZTRiNTNhZmJlZDAyMWM4OWRiYTNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwMTI3ZDg1ZWE5NDRlOGJiMDkzNGIyMjlkNGYzMzUzLnNldENvbnRlbnQoaHRtbF82MjBhMzk5YjQyMWU0YjUzYWZiZWQwMjFjODlkYmEzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YzU4ZmZiMWRiOTE0MWE0ODM2MGM4ODljMTkzNWZkYS5iaW5kUG9wdXAocG9wdXBfMTAxMjdkODVlYTk0NGU4YmIwOTM0YjIyOWQ0ZjMzNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmZjYjFjOWU0ZWNmNDJhZmI1OTAzZTYwODNjZmUzM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcxNTE2MWVmNzJiNDViMGE1Njg5ZGQ0MTk5ODZkMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODc1ZWM1ODU2NzhjNDQ1ZTk1NTUwMmJlODFhYzZjZjMgPSAkKCc8ZGl2IGlkPSJodG1sXzg3NWVjNTg1Njc4YzQ0NWU5NTU1MDJiZTgxYWM2Y2YzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3MTUxNjFlZjcyYjQ1YjBhNTY4OWRkNDE5OTg2ZDI5LnNldENvbnRlbnQoaHRtbF84NzVlYzU4NTY3OGM0NDVlOTU1NTAyYmU4MWFjNmNmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmNiMWM5ZTRlY2Y0MmFmYjU5MDNlNjA4M2NmZTMzYi5iaW5kUG9wdXAocG9wdXBfZDcxNTE2MWVmNzJiNDViMGE1Njg5ZGQ0MTk5ODZkMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVmNDhmMmQxZGM0NDdkZDlmZTA4NzE4N2U4ZGVkOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGRmNjhkMWMyMTY4NDVkMTliYTYyZjRhODc4MGEzZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2QzNjQ4OWMyNjZkNDU3MDk4YjU4ZTY4MDQ3Y2E3YzIgPSAkKCc8ZGl2IGlkPSJodG1sXzNkMzY0ODljMjY2ZDQ1NzA5OGI1OGU2ODA0N2NhN2MyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZGY2OGQxYzIxNjg0NWQxOWJhNjJmNGE4NzgwYTNkYy5zZXRDb250ZW50KGh0bWxfM2QzNjQ4OWMyNjZkNDU3MDk4YjU4ZTY4MDQ3Y2E3YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVmNDhmMmQxZGM0NDdkZDlmZTA4NzE4N2U4ZGVkOTYuYmluZFBvcHVwKHBvcHVwXzRkZjY4ZDFjMjE2ODQ1ZDE5YmE2MmY0YTg3ODBhM2RjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5ZTA5ZWViZDZkZDRiZDZiY2MwMDg4NWUzN2IxZWRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxM2MyOGZmYThiYjRhN2NiNTVjOTdiZjliMDhlMzdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxODBmMDZjNGRlZjQ1MjdhZjEzYWNkMDY2NDc0OWFjID0gJCgnPGRpdiBpZD0iaHRtbF8zMTgwZjA2YzRkZWY0NTI3YWYxM2FjZDA2NjQ3NDlhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTNjMjhmZmE4YmI0YTdjYjU1Yzk3YmY5YjA4ZTM3YS5zZXRDb250ZW50KGh0bWxfMzE4MGYwNmM0ZGVmNDUyN2FmMTNhY2QwNjY0NzQ5YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODllMDllZWJkNmRkNGJkNmJjYzAwODg1ZTM3YjFlZGEuYmluZFBvcHVwKHBvcHVwXzMxM2MyOGZmYThiYjRhN2NiNTVjOTdiZjliMDhlMzdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwYTlhYzNkZmNkODRlNTI4YThmMzZkZDk2MzA2ODFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3M2I3MThkYWYyNTQ4ZWJhMjYxNGExZjIwZTM4YjIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzYWE0NTJhMDQ1NTQ1NDA4MWE0MTllNTM4ZjZiNmE0ID0gJCgnPGRpdiBpZD0iaHRtbF8yM2FhNDUyYTA0NTU0NTQwODFhNDE5ZTUzOGY2YjZhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjczYjcxOGRhZjI1NDhlYmEyNjE0YTFmMjBlMzhiMjAuc2V0Q29udGVudChodG1sXzIzYWE0NTJhMDQ1NTQ1NDA4MWE0MTllNTM4ZjZiNmE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwYTlhYzNkZmNkODRlNTI4YThmMzZkZDk2MzA2ODFiLmJpbmRQb3B1cChwb3B1cF8yNzNiNzE4ZGFmMjU0OGViYTI2MTRhMWYyMGUzOGIyMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iY2EzMDk4MTJjYWY0NTkyOWFiN2QyOTQxOTg2YzI0ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ4ODA1MzFhZGExNDhmMDk5Yjg1ZGYyNTQzM2NhNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDFmNTk3OWRkYjMzNGNlZWFhOTg0YWVhYWM5YTY4YjggPSAkKCc8ZGl2IGlkPSJodG1sXzAxZjU5NzlkZGIzMzRjZWVhYTk4NGFlYWFjOWE2OGI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDg4MDUzMWFkYTE0OGYwOTliODVkZjI1NDMzY2E3Ny5zZXRDb250ZW50KGh0bWxfMDFmNTk3OWRkYjMzNGNlZWFhOTg0YWVhYWM5YTY4YjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmNhMzA5ODEyY2FmNDU5MjlhYjdkMjk0MTk4NmMyNGUuYmluZFBvcHVwKHBvcHVwX2U0ODgwNTMxYWRhMTQ4ZjA5OWI4NWRmMjU0MzNjYTc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxNzUwNGNmZmI0MjRkMTM4NWRkOGQzOWFjOGVhM2IzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2NDZiNmYzNDQ0NzQ1ZWRhZjZlZmZjODhlYTZlMWY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjYzY5MGRhNWEzYzQzZDY5Mjk5NGZhYzI4NDliYjFkID0gJCgnPGRpdiBpZD0iaHRtbF8yY2M2OTBkYTVhM2M0M2Q2OTI5OTRmYWMyODQ5YmIxZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2NDZiNmYzNDQ0NzQ1ZWRhZjZlZmZjODhlYTZlMWY4LnNldENvbnRlbnQoaHRtbF8yY2M2OTBkYTVhM2M0M2Q2OTI5OTRmYWMyODQ5YmIxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MTc1MDRjZmZiNDI0ZDEzODVkZDhkMzlhYzhlYTNiMy5iaW5kUG9wdXAocG9wdXBfNTY0NmI2ZjM0NDQ3NDVlZGFmNmVmZmM4OGVhNmUxZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzljZTFhZGE1Y2MzNDIwOGIyMDgyNTIzZDYxOTk0MGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNGUyN2U3YjU0MzE0NDhmODhiNzkxNjVmMDZiNGNiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjQ2NDQxNTBmZmY0M2M1OWZhY2M2MmJmZTE4YmZkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfODY0NjQ0MTUwZmZmNDNjNTlmYWNjNjJiZmUxOGJmZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZTI3ZTdiNTQzMTQ0OGY4OGI3OTE2NWYwNmI0Y2JlLnNldENvbnRlbnQoaHRtbF84NjQ2NDQxNTBmZmY0M2M1OWZhY2M2MmJmZTE4YmZkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OWNlMWFkYTVjYzM0MjA4YjIwODI1MjNkNjE5OTQwZC5iaW5kUG9wdXAocG9wdXBfYjRlMjdlN2I1NDMxNDQ4Zjg4Yjc5MTY1ZjA2YjRjYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg3NjgxNGNjY2JjNGY5OTk4M2M2YThkYzBlNTlmOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjkxY2I3ZWQwMTYwNGYzZTk0ODJlODBjY2EwMzNhZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjAwMGI0YmUyZDkyNDA0OWE5OTc4MmNhMjU3OWIyZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzYwMDBiNGJlMmQ5MjQwNDlhOTk3ODJjYTI1NzliMmVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOTFjYjdlZDAxNjA0ZjNlOTQ4MmU4MGNjYTAzM2FkYi5zZXRDb250ZW50KGh0bWxfNjAwMGI0YmUyZDkyNDA0OWE5OTc4MmNhMjU3OWIyZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjg3NjgxNGNjY2JjNGY5OTk4M2M2YThkYzBlNTlmOGIuYmluZFBvcHVwKHBvcHVwX2Y5MWNiN2VkMDE2MDRmM2U5NDgyZTgwY2NhMDMzYWRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwZDM2NmRiN2JkYTQ1YjU5Y2IxMjI5ODBmNjQ2YTI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTFiNjdiMDg1MGM4NDgyYzhjZmJhZGVhYTI4NzA2YTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWM2YzBhOGI2NjEyNGIyOWFkYTk1ZWQ5NjlkODdjZjggPSAkKCc8ZGl2IGlkPSJodG1sX2FjNmMwYThiNjYxMjRiMjlhZGE5NWVkOTY5ZDg3Y2Y4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMWI2N2IwODUwYzg0ODJjOGNmYmFkZWFhMjg3MDZhNS5zZXRDb250ZW50KGh0bWxfYWM2YzBhOGI2NjEyNGIyOWFkYTk1ZWQ5NjlkODdjZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjBkMzY2ZGI3YmRhNDViNTljYjEyMjk4MGY2NDZhMjguYmluZFBvcHVwKHBvcHVwXzExYjY3YjA4NTBjODQ4MmM4Y2ZiYWRlYWEyODcwNmE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4ZGRhYmMzMGYzNzRjYzQ5ZDA5MTg5ZDBjZmY4MGE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWUyMGQ5ZGJlNjg3NGEyODlkNDhiZjM4YmIxZTY4MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjg3NjdhNWUzOTViNDE1NGI0MzYxNjE4ODNhMzc0ZjAgPSAkKCc8ZGl2IGlkPSJodG1sXzI4NzY3YTVlMzk1YjQxNTRiNDM2MTYxODgzYTM3NGYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlMjBkOWRiZTY4NzRhMjg5ZDQ4YmYzOGJiMWU2ODMyLnNldENvbnRlbnQoaHRtbF8yODc2N2E1ZTM5NWI0MTU0YjQzNjE2MTg4M2EzNzRmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOGRkYWJjMzBmMzc0Y2M0OWQwOTE4OWQwY2ZmODBhOC5iaW5kUG9wdXAocG9wdXBfMWUyMGQ5ZGJlNjg3NGEyODlkNDhiZjM4YmIxZTY4MzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzgwNTk0OWVkZjU5NGFiMThlOGQ4YmYyY2ViZjkwYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUwN2Q5YjdmNThhNGNmY2JmOGQ0YmZhNTI1MTE1YjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmFjZGIzMGUzNjc5NGExMjg1OWU0ZmRkZDEwYWZlOWYgPSAkKCc8ZGl2IGlkPSJodG1sXzJhY2RiMzBlMzY3OTRhMTI4NTllNGZkZGQxMGFmZTlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1MDdkOWI3ZjU4YTRjZmNiZjhkNGJmYTUyNTExNWI4LnNldENvbnRlbnQoaHRtbF8yYWNkYjMwZTM2Nzk0YTEyODU5ZTRmZGRkMTBhZmU5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jODA1OTQ5ZWRmNTk0YWIxOGU4ZDhiZjJjZWJmOTBhNi5iaW5kUG9wdXAocG9wdXBfYTUwN2Q5YjdmNThhNGNmY2JmOGQ0YmZhNTI1MTE1YjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGY2ZjExOWRiMTAzNGJkNGFlNjYzNTJjMmYzNzg4OWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGNlY2E0OGRlMjE2NGMyOThjNWQ1NGNmYzllMjdiOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDMwY2Q4MGRjODEyNDlkM2FjNDFlNGZhZWZmZTU5ODMgPSAkKCc8ZGl2IGlkPSJodG1sXzAzMGNkODBkYzgxMjQ5ZDNhYzQxZTRmYWVmZmU1OTgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGNlY2E0OGRlMjE2NGMyOThjNWQ1NGNmYzllMjdiOWUuc2V0Q29udGVudChodG1sXzAzMGNkODBkYzgxMjQ5ZDNhYzQxZTRmYWVmZmU1OTgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmNmYxMTlkYjEwMzRiZDRhZTY2MzUyYzJmMzc4ODlkLmJpbmRQb3B1cChwb3B1cF80Y2VjYTQ4ZGUyMTY0YzI5OGM1ZDU0Y2ZjOWUyN2I5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTZkMmEyOTBiOTI0YWEwYmJiYWJlN2UyNDc3NjIwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzYjk1MzcwZTUyNDQ4Nzc4MjExZWM4ZDI1OTFmYjE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4ZTI3YTVkODI4ZDRiNGNiZTQxZjE3ZDgwMDVjMGI2ID0gJCgnPGRpdiBpZD0iaHRtbF9iOGUyN2E1ZDgyOGQ0YjRjYmU0MWYxN2Q4MDA1YzBiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81M2I5NTM3MGU1MjQ0ODc3ODIxMWVjOGQyNTkxZmIxNS5zZXRDb250ZW50KGh0bWxfYjhlMjdhNWQ4MjhkNGI0Y2JlNDFmMTdkODAwNWMwYjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGE2ZDJhMjkwYjkyNGFhMGJiYmFiZTdlMjQ3NzYyMDYuYmluZFBvcHVwKHBvcHVwXzUzYjk1MzcwZTUyNDQ4Nzc4MjExZWM4ZDI1OTFmYjE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2ZDNlZjFkYTJjMDRlYWNhYjA1ZmRkMDg5N2EyM2UwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzc3NmIxOTZiZjYxNGRjNGE1N2U3YTY1MDU0ZTZjY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZmMmViZGFkZjU0NDdhZGFkOGYyNGYyY2IyYWI3NWUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2ZjJlYmRhZGY1NDQ3YWRhZDhmMjRmMmNiMmFiNzVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Nzc2YjE5NmJmNjE0ZGM0YTU3ZTdhNjUwNTRlNmNjZi5zZXRDb250ZW50KGh0bWxfNDZmMmViZGFkZjU0NDdhZGFkOGYyNGYyY2IyYWI3NWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTZkM2VmMWRhMmMwNGVhY2FiMDVmZGQwODk3YTIzZTAuYmluZFBvcHVwKHBvcHVwXzc3NzZiMTk2YmY2MTRkYzRhNTdlN2E2NTA1NGU2Y2NmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkMDhlYWQxNGI2NDRkMTM5NjM1ZjdjZTk0MDJhYTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkZDQ5MmFjMzVlMDQ3NjJiZTlmOWU4ZWM3YzMwNjhiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkY2Y3MDQ1Y2JkZTQ5ZGY5YjE2ZGE3NTcwZjc2YjQxID0gJCgnPGRpdiBpZD0iaHRtbF80ZGNmNzA0NWNiZGU0OWRmOWIxNmRhNzU3MGY3NmI0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkZDQ5MmFjMzVlMDQ3NjJiZTlmOWU4ZWM3YzMwNjhiLnNldENvbnRlbnQoaHRtbF80ZGNmNzA0NWNiZGU0OWRmOWIxNmRhNzU3MGY3NmI0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDA4ZWFkMTRiNjQ0ZDEzOTYzNWY3Y2U5NDAyYWE5Yy5iaW5kUG9wdXAocG9wdXBfNmRkNDkyYWMzNWUwNDc2MmJlOWY5ZThlYzdjMzA2OGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTkyMmUxNWZjNjU4NDA5N2E3ZDRlYWY2NzhmZGJlY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1MjBiMjJlOGZhMTQ3YTliNzEwNWMzNzlhN2I2MzI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwOTExOTBjNjQwZDQ5NzhhNjczN2Q5MzdlOWJiZTBlID0gJCgnPGRpdiBpZD0iaHRtbF9lMDkxMTkwYzY0MGQ0OTc4YTY3MzdkOTM3ZTliYmUwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTUyMGIyMmU4ZmExNDdhOWI3MTA1YzM3OWE3YjYzMjcuc2V0Q29udGVudChodG1sX2UwOTExOTBjNjQwZDQ5NzhhNjczN2Q5MzdlOWJiZTBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5MjJlMTVmYzY1ODQwOTdhN2Q0ZWFmNjc4ZmRiZWNhLmJpbmRQb3B1cChwb3B1cF85NTIwYjIyZThmYTE0N2E5YjcxMDVjMzc5YTdiNjMyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZGMzZjYzN2MwZTk0OTQ5OWI2YTQxMDA5NTQ2NDhmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmZTJiMzRmNGU4OTQ0ZjlhYjM2ZjFhN2U1ZmMyOTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IzOTM4MmIyMjMzYjQwODc5MzAyZTc2MGVjNTc4YTY4ID0gJCgnPGRpdiBpZD0iaHRtbF9iMzkzODJiMjIzM2I0MDg3OTMwMmU3NjBlYzU3OGE2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2ZlMmIzNGY0ZTg5NDRmOWFiMzZmMWE3ZTVmYzI5MDguc2V0Q29udGVudChodG1sX2IzOTM4MmIyMjMzYjQwODc5MzAyZTc2MGVjNTc4YTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRkYzNmNjM3YzBlOTQ5NDk5YjZhNDEwMDk1NDY0OGZiLmJpbmRQb3B1cChwb3B1cF8zZmUyYjM0ZjRlODk0NGY5YWIzNmYxYTdlNWZjMjkwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZGIyYWQ4ZjExNGE0MTJlYmUzOWJjODc4ZGE5Njc1NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJjODNiNGZlZmNhNDdjMTg4MTA1ZjNhZTYwMGJiZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTkzYzk4ODBhNTYzNDc5NGE0MzMzMGVhNDNhMzE4MjggPSAkKCc8ZGl2IGlkPSJodG1sXzU5M2M5ODgwYTU2MzQ3OTRhNDMzMzBlYTQzYTMxODI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyYzgzYjRmZWZjYTQ3YzE4ODEwNWYzYWU2MDBiYmRjLnNldENvbnRlbnQoaHRtbF81OTNjOTg4MGE1NjM0Nzk0YTQzMzMwZWE0M2EzMTgyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZGIyYWQ4ZjExNGE0MTJlYmUzOWJjODc4ZGE5Njc1NC5iaW5kUG9wdXAocG9wdXBfZDJjODNiNGZlZmNhNDdjMTg4MTA1ZjNhZTYwMGJiZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjVkZjUyNjA5NTBjNDQwZDlkZjVhODY4MDU0MjQzZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmJjNTMyZTcxMmUxNDEzOTgwMzdlZTVhYWNhOTRjZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQ5MGYxMDZiODNmNDY1Yzg3OWI4YWVmZGNhNWQ5MzQgPSAkKCc8ZGl2IGlkPSJodG1sXzE0OTBmMTA2YjgzZjQ2NWM4NzliOGFlZmRjYTVkOTM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYmM1MzJlNzEyZTE0MTM5ODAzN2VlNWFhY2E5NGNkZC5zZXRDb250ZW50KGh0bWxfMTQ5MGYxMDZiODNmNDY1Yzg3OWI4YWVmZGNhNWQ5MzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjVkZjUyNjA5NTBjNDQwZDlkZjVhODY4MDU0MjQzZDcuYmluZFBvcHVwKHBvcHVwX2ZiYzUzMmU3MTJlMTQxMzk4MDM3ZWU1YWFjYTk0Y2RkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlNThjMGFhOGIyNjQ0ODk5YmExZTlmODMwNjQwOTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwYzJjNzQ1ZWNiNDQ1NGNiYjQyZTA1NjRkZTcxYmExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3MzllOGM3MDAwODQyOTNiYzU2ZmQ2MWYzZWU1OWE3ID0gJCgnPGRpdiBpZD0iaHRtbF8xNzM5ZThjNzAwMDg0MjkzYmM1NmZkNjFmM2VlNTlhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGMyYzc0NWVjYjQ0NTRjYmI0MmUwNTY0ZGU3MWJhMS5zZXRDb250ZW50KGh0bWxfMTczOWU4YzcwMDA4NDI5M2JjNTZmZDYxZjNlZTU5YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmU1OGMwYWE4YjI2NDQ4OTliYTFlOWY4MzA2NDA5MWYuYmluZFBvcHVwKHBvcHVwXzUwYzJjNzQ1ZWNiNDQ1NGNiYjQyZTA1NjRkZTcxYmExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YzA0NDU2OGFlZTQ3MTc4ZDMzOTgyZWI0NjEwMjQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2YmZmNjA5ZGUyZDQwODI4NjA5YTQzYTE2Y2FkMzdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliYjI3ZGNjMjVhZDQ5ZGY4NTdmMmNkNzE1YzIzNDNmID0gJCgnPGRpdiBpZD0iaHRtbF85YmIyN2RjYzI1YWQ0OWRmODU3ZjJjZDcxNWMyMzQzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U2YmZmNjA5ZGUyZDQwODI4NjA5YTQzYTE2Y2FkMzdlLnNldENvbnRlbnQoaHRtbF85YmIyN2RjYzI1YWQ0OWRmODU3ZjJjZDcxNWMyMzQzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OWMwNDQ1NjhhZWU0NzE3OGQzMzk4MmViNDYxMDI0Ny5iaW5kUG9wdXAocG9wdXBfZTZiZmY2MDlkZTJkNDA4Mjg2MDlhNDNhMTZjYWQzN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ5M2JjNzQ1NDdmNDcwM2I5YmNlOGYyYmQzZjg2ZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1NTY1YjhmMzVhYjQ5YWZhNWQyYmM2OTU4NTFmZDJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxN2M4M2NlZTdhYTQ2MGY4ZjQ2ZDBiYzA4MzIyNzBkID0gJCgnPGRpdiBpZD0iaHRtbF9lMTdjODNjZWU3YWE0NjBmOGY0NmQwYmMwODMyMjcwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNTU2NWI4ZjM1YWI0OWFmYTVkMmJjNjk1ODUxZmQyYS5zZXRDb250ZW50KGh0bWxfZTE3YzgzY2VlN2FhNDYwZjhmNDZkMGJjMDgzMjI3MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ5M2JjNzQ1NDdmNDcwM2I5YmNlOGYyYmQzZjg2ZTQuYmluZFBvcHVwKHBvcHVwX2Y1NTY1YjhmMzVhYjQ5YWZhNWQyYmM2OTU4NTFmZDJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyNjRiMDJkNDJjMDRlZGY5ODRhMjI2OTE1MjMwODFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU5YTcwMWQ1NDQwNDk0MTliN2I0MWE2NjgxZmVhZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGQxYTA5MGFlNGYwNDRiYzg3YjZmYWQyZDAwZGY0MDYgPSAkKCc8ZGl2IGlkPSJodG1sX2RkMWEwOTBhZTRmMDQ0YmM4N2I2ZmFkMmQwMGRmNDA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1OWE3MDFkNTQ0MDQ5NDE5YjdiNDFhNjY4MWZlYWRmLnNldENvbnRlbnQoaHRtbF9kZDFhMDkwYWU0ZjA0NGJjODdiNmZhZDJkMDBkZjQwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMjY0YjAyZDQyYzA0ZWRmOTg0YTIyNjkxNTIzMDgxZS5iaW5kUG9wdXAocG9wdXBfNTU5YTcwMWQ1NDQwNDk0MTliN2I0MWE2NjgxZmVhZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDIwOGUyOWY5MzQ4NDFmOTk2MTQyZTM0ZTU4ZjIwNDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ4MDkwZjgxODc5NDlkZjljZWExYTQ0YmUzYzExZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY0YTQzZWRhOTk1NDE4N2I4NTRhMWZlMzdhYjZjNjggPSAkKCc8ZGl2IGlkPSJodG1sXzk2NGE0M2VkYTk5NTQxODdiODU0YTFmZTM3YWI2YzY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDgwOTBmODE4Nzk0OWRmOWNlYTFhNDRiZTNjMTFkMS5zZXRDb250ZW50KGh0bWxfOTY0YTQzZWRhOTk1NDE4N2I4NTRhMWZlMzdhYjZjNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDIwOGUyOWY5MzQ4NDFmOTk2MTQyZTM0ZTU4ZjIwNDAuYmluZFBvcHVwKHBvcHVwXzk0ODA5MGY4MTg3OTQ5ZGY5Y2VhMWE0NGJlM2MxMWQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhNWVjZjM3MzAxODQzMTliZGQ4MjE4NTIxMjVkMDcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2NDI2YWRjNmNjZDQyMzJhYzcxZDJiZjRlOGRmMWZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwNTY3MzdlZmJiMDQ0MThiZmU5YzcxMmUxYWU3YWIwID0gJCgnPGRpdiBpZD0iaHRtbF83MDU2NzM3ZWZiYjA0NDE4YmZlOWM3MTJlMWFlN2FiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2NDI2YWRjNmNjZDQyMzJhYzcxZDJiZjRlOGRmMWZjLnNldENvbnRlbnQoaHRtbF83MDU2NzM3ZWZiYjA0NDE4YmZlOWM3MTJlMWFlN2FiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTVlY2YzNzMwMTg0MzE5YmRkODIxODUyMTI1ZDA3Mi5iaW5kUG9wdXAocG9wdXBfYjY0MjZhZGM2Y2NkNDIzMmFjNzFkMmJmNGU4ZGYxZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTg1ZGE4NzBiZTYxNGVjOTgwZDFmMjViNmQ3ZjIzOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmEwMzcwMDFjZDNlNGY4OWI0Y2M0ZTY2MjMwZTllZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk2MmMyZTZlZjBkNDYyMWJkYTgwNjUwZjQyNjVhNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzM5NjJjMmU2ZWYwZDQ2MjFiZGE4MDY1MGY0MjY1YTY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhMDM3MDAxY2QzZTRmODliNGNjNGU2NjIzMGU5ZWZkLnNldENvbnRlbnQoaHRtbF8zOTYyYzJlNmVmMGQ0NjIxYmRhODA2NTBmNDI2NWE2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODVkYTg3MGJlNjE0ZWM5ODBkMWYyNWI2ZDdmMjM5NS5iaW5kUG9wdXAocG9wdXBfYmEwMzcwMDFjZDNlNGY4OWI0Y2M0ZTY2MjMwZTllZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNjMThkOWExNWQ3NGI2MGE3NGQ5ZjRhZjg5ZGEwOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQ1ZTk3MzQyNjE1NDRhNmJhNmFkZWI1OGQ3MjM1YTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRlMjlkNmQyMDMyNGY1YTkyN2NiYTkxZTNjMDUzNTkgPSAkKCc8ZGl2IGlkPSJodG1sXzlkZTI5ZDZkMjAzMjRmNWE5MjdjYmE5MWUzYzA1MzU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQ1ZTk3MzQyNjE1NDRhNmJhNmFkZWI1OGQ3MjM1YTAuc2V0Q29udGVudChodG1sXzlkZTI5ZDZkMjAzMjRmNWE5MjdjYmE5MWUzYzA1MzU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljYzE4ZDlhMTVkNzRiNjBhNzRkOWY0YWY4OWRhMDlmLmJpbmRQb3B1cChwb3B1cF9kNDVlOTczNDI2MTU0NGE2YmE2YWRlYjU4ZDcyMzVhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDZkNWVjYTIxMTU0YTg3YTU2ODk1YzgxODNjNTk3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hODBlZTRmMGYwNTA0ZmE1ODBmYzA3NWE2YTY4ZTU5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTFhNDQ2NTlkZDM0MzVlOWRhZWE1ZWU5ZDdkZDkzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzUxYTQ0NjU5ZGQzNDM1ZTlkYWVhNWVlOWQ3ZGQ5MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTgwZWU0ZjBmMDUwNGZhNTgwZmMwNzVhNmE2OGU1OTIuc2V0Q29udGVudChodG1sXzc1MWE0NDY1OWRkMzQzNWU5ZGFlYTVlZTlkN2RkOTMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwNmQ1ZWNhMjExNTRhODdhNTY4OTVjODE4M2M1OTczLmJpbmRQb3B1cChwb3B1cF9hODBlZTRmMGYwNTA0ZmE1ODBmYzA3NWE2YTY4ZTU5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZGU3ZGFlYmU2ZjY0ODY2YmUyMGY0MDA0ZTU5NWFkNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzllZmFkYzEwZjFkZTRlOWM5OTI4MDMwODJhNDRmOGUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3NzU5OTViYjM3NDRjYTRhZTI0ZTYyYjNkNGVlOTRlID0gJCgnPGRpdiBpZD0iaHRtbF9mNzc1OTk1YmIzNzQ0Y2E0YWUyNGU2MmIzZDRlZTk0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllZmFkYzEwZjFkZTRlOWM5OTI4MDMwODJhNDRmOGUyLnNldENvbnRlbnQoaHRtbF9mNzc1OTk1YmIzNzQ0Y2E0YWUyNGU2MmIzZDRlZTk0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZGU3ZGFlYmU2ZjY0ODY2YmUyMGY0MDA0ZTU5NWFkNS5iaW5kUG9wdXAocG9wdXBfOWVmYWRjMTBmMWRlNGU5Yzk5MjgwMzA4MmE0NGY4ZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRiZmZkZDNlZDhmNDMwMjg4OWQ0NDk5NjM3ZmIzZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjFlZmJkM2U3NjU4NDEwZTg1ZDhiNTAyMDY0ZmFhN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM0N2Y3YTRjNTc2NGYzMThjMWFjOWVjYmUyMTM2YTUgPSAkKCc8ZGl2IGlkPSJodG1sX2EzNDdmN2E0YzU3NjRmMzE4YzFhYzllY2JlMjEzNmE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxZWZiZDNlNzY1ODQxMGU4NWQ4YjUwMjA2NGZhYTdlLnNldENvbnRlbnQoaHRtbF9hMzQ3ZjdhNGM1NzY0ZjMxOGMxYWM5ZWNiZTIxMzZhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGJmZmRkM2VkOGY0MzAyODg5ZDQ0OTk2MzdmYjNkNy5iaW5kUG9wdXAocG9wdXBfYjFlZmJkM2U3NjU4NDEwZTg1ZDhiNTAyMDY0ZmFhN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U5NzMxM2ZkOGFhNGQ2NDlhMzIxNGEwNzQxZDczNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3ODhkMjIxNmY5YzQ3NWFhNTdjZGY2NGY1NGYxYjUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjZTNkNWIwMWZhNDQ0ZTJhZDNlNTk2YzgxYjM2ZjcyID0gJCgnPGRpdiBpZD0iaHRtbF80Y2UzZDViMDFmYTQ0NGUyYWQzZTU5NmM4MWIzNmY3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzg4ZDIyMTZmOWM0NzVhYTU3Y2RmNjRmNTRmMWI1MC5zZXRDb250ZW50KGh0bWxfNGNlM2Q1YjAxZmE0NDRlMmFkM2U1OTZjODFiMzZmNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2U5NzMxM2ZkOGFhNGQ2NDlhMzIxNGEwNzQxZDczNDMuYmluZFBvcHVwKHBvcHVwXzM3ODhkMjIxNmY5YzQ3NWFhNTdjZGY2NGY1NGYxYjUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjMGI0MmMzMGFiMjQ1YzY5OGFmYTEyOTcwNDNjNDU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0YzBjOTVjZTMwZjQ3ZjdhYjk0MzY5NzRjY2EwNmYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyYzhlNGFhOTY5NTQ0NDg5ZDFkNGI5MmE0MzZlNTczID0gJCgnPGRpdiBpZD0iaHRtbF80MmM4ZTRhYTk2OTU0NDQ4OWQxZDRiOTJhNDM2ZTU3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0YzBjOTVjZTMwZjQ3ZjdhYjk0MzY5NzRjY2EwNmYwLnNldENvbnRlbnQoaHRtbF80MmM4ZTRhYTk2OTU0NDQ4OWQxZDRiOTJhNDM2ZTU3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzBiNDJjMzBhYjI0NWM2OThhZmExMjk3MDQzYzQ1Ni5iaW5kUG9wdXAocG9wdXBfZTRjMGM5NWNlMzBmNDdmN2FiOTQzNjk3NGNjYTA2ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU0YmY1ZjZjMTc4NGYxNmI0MzdmOTViMWM0ZTY1NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdkNWEwZmNmZGViNGM2MjgxM2VjNjgzNjFkYWYwMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGZhNWRlOGE4MDBjNGJkYzhhYmY5YjAzMGU5NjllOTAgPSAkKCc8ZGl2IGlkPSJodG1sX2RmYTVkZThhODAwYzRiZGM4YWJmOWIwMzBlOTY5ZTkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdkNWEwZmNmZGViNGM2MjgxM2VjNjgzNjFkYWYwMWIuc2V0Q29udGVudChodG1sX2RmYTVkZThhODAwYzRiZGM4YWJmOWIwMzBlOTY5ZTkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllNGJmNWY2YzE3ODRmMTZiNDM3Zjk1YjFjNGU2NTQyLmJpbmRQb3B1cChwb3B1cF9iN2Q1YTBmY2ZkZWI0YzYyODEzZWM2ODM2MWRhZjAxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWJkNzZkYjA3MDg0MzM4YmQ3MmNmYjBhMGMzYmUxYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGNjNjZjNTU1ZDM0Zjc3OGZmYWRjNjRiOTI2MDg0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMmVkZjIxY2JiMmE0NmJhYTQ3ZDQxYTU4MWRjMDE4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzJlZGYyMWNiYjJhNDZiYWE0N2Q0MWE1ODFkYzAxOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGNjNjZjNTU1ZDM0Zjc3OGZmYWRjNjRiOTI2MDg0NC5zZXRDb250ZW50KGh0bWxfYzJlZGYyMWNiYjJhNDZiYWE0N2Q0MWE1ODFkYzAxOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjViZDc2ZGIwNzA4NDMzOGJkNzJjZmIwYTBjM2JlMWMuYmluZFBvcHVwKHBvcHVwXzE4Y2M2NmM1NTVkMzRmNzc4ZmZhZGM2NGI5MjYwODQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmYjRiYTA5ZjRlYzQyZWI5Njg2Y2MyMjBjMjY1ZTgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGZiZGI1ZTg0NDY0NDI2OGZkNzgyMTZhM2M5MmI4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjhiNmJhZjRhMTc0ZDMxYWY3NDUyMWE4MGZlOTFmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI4YjZiYWY0YTE3NGQzMWFmNzQ1MjFhODBmZTkxZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThmYmRiNWU4NDQ2NDQyNjhmZDc4MjE2YTNjOTJiODYuc2V0Q29udGVudChodG1sX2QyOGI2YmFmNGExNzRkMzFhZjc0NTIxYTgwZmU5MWY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmYjRiYTA5ZjRlYzQyZWI5Njg2Y2MyMjBjMjY1ZTgyLmJpbmRQb3B1cChwb3B1cF81OGZiZGI1ZTg0NDY0NDI2OGZkNzgyMTZhM2M5MmI4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDYzNTFkNGFiMDA0N2RiOWFhOTVmOGFkYjI5ZDVkNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWMzNjY1ZDFkMmQ0YTEzOWVjMzliNzYwZmU0ZjkzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OWI2OGNhYWVmYTI0NzRiYjdkMGM2OTg5N2RmOTUxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjliNjhjYWFlZmEyNDc0YmI3ZDBjNjk4OTdkZjk1MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTVjMzY2NWQxZDJkNGExMzllYzM5Yjc2MGZlNGY5MzAuc2V0Q29udGVudChodG1sXzY5YjY4Y2FhZWZhMjQ3NGJiN2QwYzY5ODk3ZGY5NTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNjM1MWQ0YWIwMDQ3ZGI5YWE5NWY4YWRiMjlkNWQ0LmJpbmRQb3B1cChwb3B1cF81NWMzNjY1ZDFkMmQ0YTEzOWVjMzliNzYwZmU0ZjkzMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTRlY2Y0NTYzYjI0ZTY5YTQzMTE3Zjg3YTgwZTljMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjk0NjFmMjg0ZDc4NGVhZWI5MDBhMjM1MDUwZWRjNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQwNWQ1MTk0MzBiNGE1NGE2ZWYxMTRkN2M4ZjViYTEgPSAkKCc8ZGl2IGlkPSJodG1sX2M0MDVkNTE5NDMwYjRhNTRhNmVmMTE0ZDdjOGY1YmExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y5NDYxZjI4NGQ3ODRlYWViOTAwYTIzNTA1MGVkYzU4LnNldENvbnRlbnQoaHRtbF9jNDA1ZDUxOTQzMGI0YTU0YTZlZjExNGQ3YzhmNWJhMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTRlY2Y0NTYzYjI0ZTY5YTQzMTE3Zjg3YTgwZTljMy5iaW5kUG9wdXAocG9wdXBfZjk0NjFmMjg0ZDc4NGVhZWI5MDBhMjM1MDUwZWRjNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGIzMDU2MTdjMWJkNDUxNjk2NTQ2MzEyNmNmMzEwMzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQ1NTdmZjY0Njk5NGQ1NGE4YjI2NmQyYzA1ODJjODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmYyOWFjNmM4NTNiNGE1ZTk5OWQxMjA0NDY5NmI0NTMgPSAkKCc8ZGl2IGlkPSJodG1sXzJmMjlhYzZjODUzYjRhNWU5OTlkMTIwNDQ2OTZiNDUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQ1NTdmZjY0Njk5NGQ1NGE4YjI2NmQyYzA1ODJjODQuc2V0Q29udGVudChodG1sXzJmMjlhYzZjODUzYjRhNWU5OTlkMTIwNDQ2OTZiNDUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiMzA1NjE3YzFiZDQ1MTY5NjU0NjMxMjZjZjMxMDM5LmJpbmRQb3B1cChwb3B1cF8wZDU1N2ZmNjQ2OTk0ZDU0YThiMjY2ZDJjMDU4MmM4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOGU4NTVhYTlhOTU0YWJiOTIzNmViNjc5NWRjNGU4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTczNGU4NTU1OWI0YzkzOGExZjMwMjlkYTI0YWE0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjU2YjQ1NWQwN2U0ZjdlYTliZmIzMzZhMTkxOTA5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGY1NmI0NTVkMDdlNGY3ZWE5YmZiMzM2YTE5MTkwOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhNzM0ZTg1NTU5YjRjOTM4YTFmMzAyOWRhMjRhYTQ5LnNldENvbnRlbnQoaHRtbF84ZjU2YjQ1NWQwN2U0ZjdlYTliZmIzMzZhMTkxOTA5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOGU4NTVhYTlhOTU0YWJiOTIzNmViNjc5NWRjNGU4Ny5iaW5kUG9wdXAocG9wdXBfNmE3MzRlODU1NTliNGM5MzhhMWYzMDI5ZGEyNGFhNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGRjYTI5YjEzY2ZjNDFlZTg0YWMzYjc2ZDljNDllNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjRlZjBkOWQ5MWRkNDM2M2IyZjNiMWFiOTc0YmYwNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWM5M2EyMDZkMWE3NDMzZDhkYjU5NTQ5YThhZGIzNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzljOTNhMjA2ZDFhNzQzM2Q4ZGI1OTU0OWE4YWRiMzZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNGVmMGQ5ZDkxZGQ0MzYzYjJmM2IxYWI5NzRiZjA1My5zZXRDb250ZW50KGh0bWxfOWM5M2EyMDZkMWE3NDMzZDhkYjU5NTQ5YThhZGIzNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGRjYTI5YjEzY2ZjNDFlZTg0YWMzYjc2ZDljNDllNzQuYmluZFBvcHVwKHBvcHVwX2I0ZWYwZDlkOTFkZDQzNjNiMmYzYjFhYjk3NGJmMDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlNTRkMWZlMjNkYTRlZjA4MzRjMTU4ZjZhZjRlOTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1ZjY2NjAwYzY4NjQ5NTg4YTAxMmExYTIwM2FhNWFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkY2RiM2FmNjMxNzRmZjI4MzI5MzNhNGYwMzk5NzM4ID0gJCgnPGRpdiBpZD0iaHRtbF84ZGNkYjNhZjYzMTc0ZmYyODMyOTMzYTRmMDM5OTczOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNWY2NjYwMGM2ODY0OTU4OGEwMTJhMWEyMDNhYTVhYy5zZXRDb250ZW50KGh0bWxfOGRjZGIzYWY2MzE3NGZmMjgzMjkzM2E0ZjAzOTk3MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2U1NGQxZmUyM2RhNGVmMDgzNGMxNThmNmFmNGU5MWUuYmluZFBvcHVwKHBvcHVwX2Q1ZjY2NjAwYzY4NjQ5NTg4YTAxMmExYTIwM2FhNWFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MmMxZGNmOTRjNTRjZTA5YTZjYWExYTUwNzBkNDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmOTRiYzU4MjE2ZDRhZGY4MzgxNzEwZWE2NDcyY2NmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiNmM0OGFmMWZlMjQ2ZTZhNTA2ZTViNGQwYTc0MDdhID0gJCgnPGRpdiBpZD0iaHRtbF8xYjZjNDhhZjFmZTI0NmU2YTUwNmU1YjRkMGE3NDA3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY5NGJjNTgyMTZkNGFkZjgzODE3MTBlYTY0NzJjY2Yuc2V0Q29udGVudChodG1sXzFiNmM0OGFmMWZlMjQ2ZTZhNTA2ZTViNGQwYTc0MDdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4MmMxZGNmOTRjNTRjZTA5YTZjYWExYTUwNzBkNDBiLmJpbmRQb3B1cChwb3B1cF8yZjk0YmM1ODIxNmQ0YWRmODM4MTcxMGVhNjQ3MmNjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYjI0OWY5NDg3YmU0ZjgxOWRhY2Y4YzQxNjAyZGMxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzBiMjNhZWUzMTA0NGE0YmFmMmIyZDk0ZmMxZTU3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDFlZTJkM2JhMTI0YTYzYWNiMTc0YTU0YjVmMDIzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfODQxZWUyZDNiYTEyNGE2M2FjYjE3NGE1NGI1ZjAyMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3MGIyM2FlZTMxMDQ0YTRiYWYyYjJkOTRmYzFlNTdiLnNldENvbnRlbnQoaHRtbF84NDFlZTJkM2JhMTI0YTYzYWNiMTc0YTU0YjVmMDIzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYjI0OWY5NDg3YmU0ZjgxOWRhY2Y4YzQxNjAyZGMxZi5iaW5kUG9wdXAocG9wdXBfMjcwYjIzYWVlMzEwNDRhNGJhZjJiMmQ5NGZjMWU1N2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjNjYjgyZWUzZDQyNDg4ODgyN2QyOGQ1NjZhMTZmYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjFhNmY3MzFlMTBmNDVmN2E0ZWU0MzE1NGQ4NzEyYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2UyZjk5NzMzODY5NDc2Yjk2OTcwZTUwZTI5YmQ1ZTUgPSAkKCc8ZGl2IGlkPSJodG1sX2NlMmY5OTczMzg2OTQ3NmI5Njk3MGU1MGUyOWJkNWU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjFhNmY3MzFlMTBmNDVmN2E0ZWU0MzE1NGQ4NzEyYTIuc2V0Q29udGVudChodG1sX2NlMmY5OTczMzg2OTQ3NmI5Njk3MGU1MGUyOWJkNWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzY2I4MmVlM2Q0MjQ4ODg4MjdkMjhkNTY2YTE2ZmM5LmJpbmRQb3B1cChwb3B1cF82MWE2ZjczMWUxMGY0NWY3YTRlZTQzMTU0ZDg3MTJhMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOGZlYTJlYTI3Mjk0OWVkYWE0OTgzNWNkNzgxNzhlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZTEwOThkMjI1Njc0NjljYWU1M2UxYmU1MDNkMTgyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOWQyYjgwYzFhOWY0Njg5OWYzMmM0YjdjZWRmYmRiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTlkMmI4MGMxYTlmNDY4OTlmMzJjNGI3Y2VkZmJkYjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGUxMDk4ZDIyNTY3NDY5Y2FlNTNlMWJlNTAzZDE4MmQuc2V0Q29udGVudChodG1sX2E5ZDJiODBjMWE5ZjQ2ODk5ZjMyYzRiN2NlZGZiZGI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4ZmVhMmVhMjcyOTQ5ZWRhYTQ5ODM1Y2Q3ODE3OGUyLmJpbmRQb3B1cChwb3B1cF9kZTEwOThkMjI1Njc0NjljYWU1M2UxYmU1MDNkMTgyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzY5ZTU4MDhjNjU0NTIzODkzYmVkZDViNTI2OGJjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkYjVmYTY2MTc0MTRmNTE4ZGRkNmNiYTc0MGExNzFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5MmI1N2VlOTA1NDQyNGY4NTU0NGU5YjA3NTNkM2MyID0gJCgnPGRpdiBpZD0iaHRtbF9lOTJiNTdlZTkwNTQ0MjRmODU1NDRlOWIwNzUzZDNjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZGI1ZmE2NjE3NDE0ZjUxOGRkZDZjYmE3NDBhMTcxYy5zZXRDb250ZW50KGh0bWxfZTkyYjU3ZWU5MDU0NDI0Zjg1NTQ0ZTliMDc1M2QzYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGM2OWU1ODA4YzY1NDUyMzg5M2JlZGQ1YjUyNjhiY2QuYmluZFBvcHVwKHBvcHVwXzlkYjVmYTY2MTc0MTRmNTE4ZGRkNmNiYTc0MGExNzFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllZjg0ZGU1OTAyYTRjODdhODYwYzg0Y2VhY2I2YjRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlY2I2NjY2YWFiYTRmMTdiNThmMzdiY2IyY2U0YTdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmMzFkMzQxMjI3MDQwMjFiZDY5MTIxZmI1NzM3Njc4ID0gJCgnPGRpdiBpZD0iaHRtbF9kZjMxZDM0MTIyNzA0MDIxYmQ2OTEyMWZiNTczNzY3OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVjYjY2NjZhYWJhNGYxN2I1OGYzN2JjYjJjZTRhN2Iuc2V0Q29udGVudChodG1sX2RmMzFkMzQxMjI3MDQwMjFiZDY5MTIxZmI1NzM3Njc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllZjg0ZGU1OTAyYTRjODdhODYwYzg0Y2VhY2I2YjRkLmJpbmRQb3B1cChwb3B1cF80ZWNiNjY2NmFhYmE0ZjE3YjU4ZjM3YmNiMmNlNGE3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNmFlYTFiOGNmYWQ0ZTNjODU2ZjQ0OTNkOWVmMzVkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWU2MTcxNTE1ZWM0ZTk2OTE1MDVlNWZmMWUyMThiNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzU4ZjBiMmE3NjI0MWIwOTY3ZjgwZThhMDYzNmZjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjc1OGYwYjJhNzYyNDFiMDk2N2Y4MGU4YTA2MzZmY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWU2MTcxNTE1ZWM0ZTk2OTE1MDVlNWZmMWUyMThiNi5zZXRDb250ZW50KGh0bWxfYjc1OGYwYjJhNzYyNDFiMDk2N2Y4MGU4YTA2MzZmY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzZhZWExYjhjZmFkNGUzYzg1NmY0NDkzZDllZjM1ZGMuYmluZFBvcHVwKHBvcHVwXzgxZTYxNzE1MTVlYzRlOTY5MTUwNWU1ZmYxZTIxOGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2ZGE5YWVlYjNiZjQ2NzZhNWIyMzI1NjY5NWM5ZDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTkwZDQ5YTZkNjE0YjMwYTkyY2ExYzVlN2EzNWJhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZDVhM2I5ZjBlYjI0YTEzOWYxZGIxZWRiZjkzM2E1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGQ1YTNiOWYwZWIyNGExMzlmMWRiMWVkYmY5MzNhNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTE5MGQ0OWE2ZDYxNGIzMGE5MmNhMWM1ZTdhMzViYWUuc2V0Q29udGVudChodG1sX2RkNWEzYjlmMGViMjRhMTM5ZjFkYjFlZGJmOTMzYTU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2ZGE5YWVlYjNiZjQ2NzZhNWIyMzI1NjY5NWM5ZDU4LmJpbmRQb3B1cChwb3B1cF9hMTkwZDQ5YTZkNjE0YjMwYTkyY2ExYzVlN2EzNWJhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTJkODU4NzdlZjg0MGQ4ODllMjMyM2VhNjZmMzJlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjk0MWNkNDBlZDA5NDIyMmFkYWY5ZTlhYzg5ZTdiNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYwNzI4NTk1ZmJiNGEyMThiMTA1YmUzODhmODBjYzggPSAkKCc8ZGl2IGlkPSJodG1sXzM2MDcyODU5NWZiYjRhMjE4YjEwNWJlMzg4ZjgwY2M4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjk0MWNkNDBlZDA5NDIyMmFkYWY5ZTlhYzg5ZTdiNGYuc2V0Q29udGVudChodG1sXzM2MDcyODU5NWZiYjRhMjE4YjEwNWJlMzg4ZjgwY2M4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhMmQ4NTg3N2VmODQwZDg4OWUyMzIzZWE2NmYzMmU5LmJpbmRQb3B1cChwb3B1cF8yOTQxY2Q0MGVkMDk0MjIyYWRhZjllOWFjODllN2I0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYTVhY2U3NmE0OGE0OTllOTFjZTU4MDBkZGVkMGIyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NTU0ZmMyODgwNDU0ZTFjYmIxZGFjNGRmZWFiYzc2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNjViMzUxYTIxODM0MmMzYTc2NmNmMDJhMDQ2ZDJlNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTY1YjM1MWEyMTgzNDJjM2E3NjZjZjAyYTA0NmQyZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjU1NGZjMjg4MDQ1NGUxY2JiMWRhYzRkZmVhYmM3NjIuc2V0Q29udGVudChodG1sX2U2NWIzNTFhMjE4MzQyYzNhNzY2Y2YwMmEwNDZkMmU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhNWFjZTc2YTQ4YTQ5OWU5MWNlNTgwMGRkZWQwYjJhLmJpbmRQb3B1cChwb3B1cF82NTU0ZmMyODgwNDU0ZTFjYmIxZGFjNGRmZWFiYzc2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMThmMGJhNzMwZWQ0MmEzOGEyY2EyY2IwMWRkZmI4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODdlNjVkYjhjYWFiNDMyNWI0ZDJkZjNhNDZkYzNhZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGVhMTEzNjg3NDM5NDMzMDg3MWJmNzM2NzQyODliOTQgPSAkKCc8ZGl2IGlkPSJodG1sXzRlYTExMzY4NzQzOTQzMzA4NzFiZjczNjc0Mjg5Yjk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2U2NWRiOGNhYWI0MzI1YjRkMmRmM2E0NmRjM2FlOS5zZXRDb250ZW50KGh0bWxfNGVhMTEzNjg3NDM5NDMzMDg3MWJmNzM2NzQyODliOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzE4ZjBiYTczMGVkNDJhMzhhMmNhMmNiMDFkZGZiODkuYmluZFBvcHVwKHBvcHVwXzg3ZTY1ZGI4Y2FhYjQzMjViNGQyZGYzYTQ2ZGMzYWU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3MDk2ZmI3YzYzMzQ4YWU5MjM3N2M3YmVmMmY0MDAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDAzZDkyNmJlMDU0NGMwOTJhNTg3MDZjZjhiZTVjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMmZlMzliODg1YTE0NDNlODJkZWNmN2E2MDRiYTBjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTJmZTM5Yjg4NWExNDQzZTgyZGVjZjdhNjA0YmEwYzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwMDNkOTI2YmUwNTQ0YzA5MmE1ODcwNmNmOGJlNWMyLnNldENvbnRlbnQoaHRtbF9hMmZlMzliODg1YTE0NDNlODJkZWNmN2E2MDRiYTBjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNzA5NmZiN2M2MzM0OGFlOTIzNzdjN2JlZjJmNDAwMC5iaW5kUG9wdXAocG9wdXBfZTAwM2Q5MjZiZTA1NDRjMDkyYTU4NzA2Y2Y4YmU1YzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmU5ZmE1Y2FhMmI5NDQyY2E1ZjlkYzE2NGU1YjVlMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU1MTMzNWE5Yzk4NGVhNWJlMjNkZDU5MDUyNWJmOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmQ5N2VjMGI5YzM2NGQzOGJkODc0NWViYjkwMzlmODIgPSAkKCc8ZGl2IGlkPSJodG1sXzZkOTdlYzBiOWMzNjRkMzhiZDg3NDVlYmI5MDM5ZjgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTUxMzM1YTljOTg0ZWE1YmUyM2RkNTkwNTI1YmY4Yy5zZXRDb250ZW50KGh0bWxfNmQ5N2VjMGI5YzM2NGQzOGJkODc0NWViYjkwMzlmODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmU5ZmE1Y2FhMmI5NDQyY2E1ZjlkYzE2NGU1YjVlMGIuYmluZFBvcHVwKHBvcHVwXzQ1NTEzMzVhOWM5ODRlYTViZTIzZGQ1OTA1MjViZjhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyNWU2MGRmYmY5MDRiM2FhNTc2OTQxZWE0YmIxNGYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhY2FjOWY2Mjk1YzRkMjQ4OGRmZTgzNDJlZGJlN2IyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3MDIwN2E5Yzg0MzRiYTViZDk0M2VkYzNkZjQ5MmM4ID0gJCgnPGRpdiBpZD0iaHRtbF83NzAyMDdhOWM4NDM0YmE1YmQ5NDNlZGMzZGY0OTJjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYWNhYzlmNjI5NWM0ZDI0ODhkZmU4MzQyZWRiZTdiMi5zZXRDb250ZW50KGh0bWxfNzcwMjA3YTljODQzNGJhNWJkOTQzZWRjM2RmNDkyYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzI1ZTYwZGZiZjkwNGIzYWE1NzY5NDFlYTRiYjE0ZjEuYmluZFBvcHVwKHBvcHVwXzJhY2FjOWY2Mjk1YzRkMjQ4OGRmZTgzNDJlZGJlN2IyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5YTYzZTUxYzY3MTRmZTFhNzQ1OGY0ZjY4MmFkZTJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiZWZjYWQ3ZDcyMDRlMTBiZThlNjA0NzFlYmIwMDU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4NzdmM2UyYTQwZTQ5NjhhMTNjN2IwY2M3Yjk1MTM5ID0gJCgnPGRpdiBpZD0iaHRtbF84ODc3ZjNlMmE0MGU0OTY4YTEzYzdiMGNjN2I5NTEzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmVmY2FkN2Q3MjA0ZTEwYmU4ZTYwNDcxZWJiMDA1NC5zZXRDb250ZW50KGh0bWxfODg3N2YzZTJhNDBlNDk2OGExM2M3YjBjYzdiOTUxMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDlhNjNlNTFjNjcxNGZlMWE3NDU4ZjRmNjgyYWRlMmIuYmluZFBvcHVwKHBvcHVwXzFiZWZjYWQ3ZDcyMDRlMTBiZThlNjA0NzFlYmIwMDU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwYTE5YTkxZWIzMzQyN2I4YjQxN2ZiMzY5NjFkNzk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiNDZiZjIzZDFhNTRkYTNiNWE5YWNlMzcyZmUzODczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2ODllYmQ2MGRhMDQ0ZTRiNzBiYTQ3ZTMxYjBjOWUzID0gJCgnPGRpdiBpZD0iaHRtbF8zNjg5ZWJkNjBkYTA0NGU0YjcwYmE0N2UzMWIwYzllMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I0NmJmMjNkMWE1NGRhM2I1YTlhY2UzNzJmZTM4NzMuc2V0Q29udGVudChodG1sXzM2ODllYmQ2MGRhMDQ0ZTRiNzBiYTQ3ZTMxYjBjOWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwYTE5YTkxZWIzMzQyN2I4YjQxN2ZiMzY5NjFkNzk2LmJpbmRQb3B1cChwb3B1cF8zYjQ2YmYyM2QxYTU0ZGEzYjVhOWFjZTM3MmZlMzg3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWUxNzJjOWI2OGE0M2YwODBhMjMzNDFhM2JjZjlkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWFmYjNmM2M4YWY0OTJmODM0OTFkMmE5YTNkZWZiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzRjZDdkZDg0MTg0OGQxYTEyNjJhMzA0NzgyN2M4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzc0Y2Q3ZGQ4NDE4NDhkMWExMjYyYTMwNDc4MjdjOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NWFmYjNmM2M4YWY0OTJmODM0OTFkMmE5YTNkZWZiZi5zZXRDb250ZW50KGh0bWxfMzc0Y2Q3ZGQ4NDE4NDhkMWExMjYyYTMwNDc4MjdjOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzVlMTcyYzliNjhhNDNmMDgwYTIzMzQxYTNiY2Y5ZDIuYmluZFBvcHVwKHBvcHVwXzU1YWZiM2YzYzhhZjQ5MmY4MzQ5MWQyYTlhM2RlZmJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzMjA1MDM5OWZjMTQxNjdiMTliNmI2OGY1NTg5ZWU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMjAzN2UyZWNkNDRlYjVhMWQ3YmY0ZmExY2ZmNjY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwM2M2OGU5ZWE5MjRmMjY5YmI0OTRmMDU5NGMyYTI2ID0gJCgnPGRpdiBpZD0iaHRtbF8xMDNjNjhlOWVhOTI0ZjI2OWJiNDk0ZjA1OTRjMmEyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxMjAzN2UyZWNkNDRlYjVhMWQ3YmY0ZmExY2ZmNjY3LnNldENvbnRlbnQoaHRtbF8xMDNjNjhlOWVhOTI0ZjI2OWJiNDk0ZjA1OTRjMmEyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzIwNTAzOTlmYzE0MTY3YjE5YjZiNjhmNTU4OWVlOS5iaW5kUG9wdXAocG9wdXBfOTEyMDM3ZTJlY2Q0NGViNWExZDdiZjRmYTFjZmY2NjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWMwM2MwZjYyZTJkNGVhNGIzM2RhYjc4NTc1Y2RkOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjcwNDZkYmI2MzAwNDVlMWI5OTNiYmJmNDliZjU2MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDVhNmQ1ZTc1MDIyNDcwMGIxYzg3ZWM0OTgzZGFmMDkgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1YTZkNWU3NTAyMjQ3MDBiMWM4N2VjNDk4M2RhZjA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzA0NmRiYjYzMDA0NWUxYjk5M2JiYmY0OWJmNTYwMy5zZXRDb250ZW50KGh0bWxfNDVhNmQ1ZTc1MDIyNDcwMGIxYzg3ZWM0OTgzZGFmMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWMwM2MwZjYyZTJkNGVhNGIzM2RhYjc4NTc1Y2RkOTUuYmluZFBvcHVwKHBvcHVwXzY3MDQ2ZGJiNjMwMDQ1ZTFiOTkzYmJiZjQ5YmY1NjAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmY2QwMWZhZTNkYjQ5NGM4NWFhZDVmODc0YjcyMmJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyYjVhOGRhZWVjYTQwNDhiYjAwMDQwNmNiOTFmZDA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxMTgzZDI4MGVmZDRjM2I5MTkyYWY0N2YyOTVlZjI2ID0gJCgnPGRpdiBpZD0iaHRtbF9jMTE4M2QyODBlZmQ0YzNiOTE5MmFmNDdmMjk1ZWYyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMmI1YThkYWVlY2E0MDQ4YmIwMDA0MDZjYjkxZmQwOC5zZXRDb250ZW50KGh0bWxfYzExODNkMjgwZWZkNGMzYjkxOTJhZjQ3ZjI5NWVmMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZjZDAxZmFlM2RiNDk0Yzg1YWFkNWY4NzRiNzIyYmQuYmluZFBvcHVwKHBvcHVwXzAyYjVhOGRhZWVjYTQwNDhiYjAwMDQwNmNiOTFmZDA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViNGY3OTM4ZDBiNzQ2NzBhNzA1YWJlYjVkNDgwNTY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmZiNDkwOTFiZGMwNDY5ZjkxMTNiMmY5MDZjZjAyZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjIwNzY2NTMwYTBjNGJjMGEwOWExM2ZkM2U0YjVkYjggPSAkKCc8ZGl2IGlkPSJodG1sXzIyMDc2NjUzMGEwYzRiYzBhMDlhMTNmZDNlNGI1ZGI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmZiNDkwOTFiZGMwNDY5ZjkxMTNiMmY5MDZjZjAyZmQuc2V0Q29udGVudChodG1sXzIyMDc2NjUzMGEwYzRiYzBhMDlhMTNmZDNlNGI1ZGI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViNGY3OTM4ZDBiNzQ2NzBhNzA1YWJlYjVkNDgwNTY2LmJpbmRQb3B1cChwb3B1cF8yZmI0OTA5MWJkYzA0NjlmOTExM2IyZjkwNmNmMDJmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZmUxYjJkNzc2NTg0M2Q1OTMyMzk4NzlhMWY4ZTdjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jMGRiYmRkNzdlNTM0MjUyOTgyNGY0MjJjMjIwYzY5Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNmY2MjMzMDcyZDA0NDQzYTcxYzRlOWUyM2I1ZDg1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kM2E0NmYxNjYxOWQ0MTFlOTRmMDMxNWU5MzY2ZTVkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDNhNDZmMTY2MTlkNDExZTk0ZjAzMTVlOTM2NmU1ZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNmY2MjMzMDcyZDA0NDQzYTcxYzRlOWUyM2I1ZDg1Yy5zZXRDb250ZW50KGh0bWxfZDNhNDZmMTY2MTlkNDExZTk0ZjAzMTVlOTM2NmU1ZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGZlMWIyZDc3NjU4NDNkNTkzMjM5ODc5YTFmOGU3Y2EuYmluZFBvcHVwKHBvcHVwX2I2ZjYyMzMwNzJkMDQ0NDNhNzFjNGU5ZTIzYjVkODVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0MDBlNjMwYjU2MDQ4OTdhOTRjODE3NjU5N2Y1Nzk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjYjQwODg0ZjE3ZDRiZmY5MTRiNmRmZjAwOThiMGI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5MzQ0NjYyZjBlYTQ1YmJiM2MwODAyMWU2NWQ5NTM2ID0gJCgnPGRpdiBpZD0iaHRtbF9lOTM0NDY2MmYwZWE0NWJiYjNjMDgwMjFlNjVkOTUzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYjQwODg0ZjE3ZDRiZmY5MTRiNmRmZjAwOThiMGI1LnNldENvbnRlbnQoaHRtbF9lOTM0NDY2MmYwZWE0NWJiYjNjMDgwMjFlNjVkOTUzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNDAwZTYzMGI1NjA0ODk3YTk0YzgxNzY1OTdmNTc5NS5iaW5kUG9wdXAocG9wdXBfZmNiNDA4ODRmMTdkNGJmZjkxNGI2ZGZmMDA5OGIwYjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2E1MDRiY2Q5NjFjNDQxNDlhNjQ1YWNhN2U2MjdlODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDc2ODk3ZjI0Y2RkNGQ0YzlkMWFhZWE1ZGU1YjY2OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWNlMjA2NDE5MzM2NGI2NTkyZTYyOWMxNWM1YTAzMjcgPSAkKCc8ZGl2IGlkPSJodG1sX2FjZTIwNjQxOTMzNjRiNjU5MmU2MjljMTVjNWEwMzI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3Njg5N2YyNGNkZDRkNGM5ZDFhYWVhNWRlNWI2NjhhLnNldENvbnRlbnQoaHRtbF9hY2UyMDY0MTkzMzY0YjY1OTJlNjI5YzE1YzVhMDMyNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYTUwNGJjZDk2MWM0NDE0OWE2NDVhY2E3ZTYyN2U4NC5iaW5kUG9wdXAocG9wdXBfMDc2ODk3ZjI0Y2RkNGQ0YzlkMWFhZWE1ZGU1YjY2OGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWMwYjQwODY1ODY3NDgwYjk0ZTM5Nzg5YWM0ZjY5NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlZjk4MDMxODI5MzQzZGNhNjM2NDNlODc4OGQzNzY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3MzhhNDhmODc1YzRhZDg5MjI4ODJkMTZiZGRlMmViID0gJCgnPGRpdiBpZD0iaHRtbF9hNzM4YTQ4Zjg3NWM0YWQ4OTIyODgyZDE2YmRkZTJlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlZjk4MDMxODI5MzQzZGNhNjM2NDNlODc4OGQzNzY0LnNldENvbnRlbnQoaHRtbF9hNzM4YTQ4Zjg3NWM0YWQ4OTIyODgyZDE2YmRkZTJlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzBiNDA4NjU4Njc0ODBiOTRlMzk3ODlhYzRmNjk0OS5iaW5kUG9wdXAocG9wdXBfYmVmOTgwMzE4MjkzNDNkY2E2MzY0M2U4Nzg4ZDM3NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjVmNDU2NmM2YmQxNDI0NGFlM2EwYjI2ZDFlNjA1MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2MwZGJiZGQ3N2U1MzQyNTI5ODI0ZjQyMmMyMjBjNjkyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjMzUzYmQ5NzFjYjQ0YjZiNTA2Mjc5OGM1NGZkMjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjOTdjYzkyZDJhMjQ3NWZiNmJhMWY0ODZiZmE5YTcwID0gJCgnPGRpdiBpZD0iaHRtbF8xYzk3Y2M5MmQyYTI0NzVmYjZiYTFmNDg2YmZhOWE3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjMzUzYmQ5NzFjYjQ0YjZiNTA2Mjc5OGM1NGZkMjlhLnNldENvbnRlbnQoaHRtbF8xYzk3Y2M5MmQyYTI0NzVmYjZiYTFmNDg2YmZhOWE3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNWY0NTY2YzZiZDE0MjQ0YWUzYTBiMjZkMWU2MDUyZS5iaW5kUG9wdXAocG9wdXBfN2MzNTNiZDk3MWNiNDRiNmI1MDYyNzk4YzU0ZmQyOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2E5ODg2YjE0ZjIzNDI3YTgwMjY4MzBmYmM2ZWFhYWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzBkYmJkZDc3ZTUzNDI1Mjk4MjRmNDIyYzIyMGM2OTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWNmNDUzZTYyYTU3NGUxNGIwZjJlMDhkZmFiYTk3ZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTVkMDQ4ZGQ2NzRlNDRkNzgxMTM2N2NmNWE1OTdjZDggPSAkKCc8ZGl2IGlkPSJodG1sXzk1ZDA0OGRkNjc0ZTQ0ZDc4MTEzNjdjZjVhNTk3Y2Q4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjZjQ1M2U2MmE1NzRlMTRiMGYyZTA4ZGZhYmE5N2Y4LnNldENvbnRlbnQoaHRtbF85NWQwNDhkZDY3NGU0NGQ3ODExMzY3Y2Y1YTU5N2NkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYTk4ODZiMTRmMjM0MjdhODAyNjgzMGZiYzZlYWFhZi5iaW5kUG9wdXAocG9wdXBfMWNmNDUzZTYyYTU3NGUxNGIwZjJlMDhkZmFiYTk3ZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7fb8b6ba55c0>" | |
| ] | |
| }, | |
| "execution_count": 45, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map of New York using latitude and longitude values\n", | |
| "map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n", | |
| " label = '{}, {}'.format(neighborhood, borough)\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_newyork) \n", | |
| " \n", | |
| "map_newyork" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Lets simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Queens neighborhood data." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "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>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Queens</td>\n", | |
| " <td>Astoria</td>\n", | |
| " <td>40.768509</td>\n", | |
| " <td>-73.915654</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Queens</td>\n", | |
| " <td>Woodside</td>\n", | |
| " <td>40.746349</td>\n", | |
| " <td>-73.901842</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Queens</td>\n", | |
| " <td>Jackson Heights</td>\n", | |
| " <td>40.751981</td>\n", | |
| " <td>-73.882821</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Queens</td>\n", | |
| " <td>Elmhurst</td>\n", | |
| " <td>40.744049</td>\n", | |
| " <td>-73.881656</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Queens</td>\n", | |
| " <td>Howard Beach</td>\n", | |
| " <td>40.654225</td>\n", | |
| " <td>-73.838138</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Neighborhood Latitude Longitude\n", | |
| "0 Queens Astoria 40.768509 -73.915654\n", | |
| "1 Queens Woodside 40.746349 -73.901842\n", | |
| "2 Queens Jackson Heights 40.751981 -73.882821\n", | |
| "3 Queens Elmhurst 40.744049 -73.881656\n", | |
| "4 Queens Howard Beach 40.654225 -73.838138" | |
| ] | |
| }, | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "queens_data = neighborhoods[neighborhoods['Borough'] == 'Queens'].reset_index(drop=True)\n", | |
| "queens_data.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Lets get the geographical location of Queens, NY" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 47, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of Queens are 40.6524927, -73.7914214158161.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'Queens, NY'\n", | |
| "\n", | |
| "geolocator = Nominatim(user_agent = 'my-application')\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of Queens are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 48, | |
| "metadata": {}, | |
| "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+ICNtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNjUyNDkyNywtNzMuNzkxNDIxNDE1ODE2MV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGVlNDkzOWU5YjU5NDc1Y2I3NTJjYWQwYjExZjI4NDAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzNzNiYjY1YTQ3NjQ0Mzc4ZDI0MWI3MWU0OTAxOThkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzY4NTA4NTkzMzU0OTIsLTczLjkxNTY1Mzc0MzA0MjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmMmI5YTFhZTA5OTQ1Y2FiNWI4NDdlMTYyZDgyYjkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwNGFmOTU0ODJhNTQ0NTZhODA4MmU0OTRjZWM4ZmRmID0gJCgnPGRpdiBpZD0iaHRtbF8wMDRhZjk1NDgyYTU0NDU2YTgwODJlNDk0Y2VjOGZkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2YyYjlhMWFlMDk5NDVjYWI1Yjg0N2UxNjJkODJiOTMuc2V0Q29udGVudChodG1sXzAwNGFmOTU0ODJhNTQ0NTZhODA4MmU0OTRjZWM4ZmRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzNzNiYjY1YTQ3NjQ0Mzc4ZDI0MWI3MWU0OTAxOThkLmJpbmRQb3B1cChwb3B1cF9jZjJiOWExYWUwOTk0NWNhYjViODQ3ZTE2MmQ4MmI5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzI2MDljNjdkNmE0YzEyOWFmZDlkZDcyY2M1MDM0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNWNmZTc2MTMwNjA0MTdlOWM2YWEyNzk5M2M4OWZkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YmRlNmNkNjIwMjE0N2FkYWQwMTViNDllNmQ4NTVjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmJkZTZjZDYyMDIxNDdhZGFkMDE1YjQ5ZTZkODU1YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNWNmZTc2MTMwNjA0MTdlOWM2YWEyNzk5M2M4OWZkYi5zZXRDb250ZW50KGh0bWxfNmJkZTZjZDYyMDIxNDdhZGFkMDE1YjQ5ZTZkODU1YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2MyNjA5YzY3ZDZhNGMxMjlhZmQ5ZGQ3MmNjNTAzNDguYmluZFBvcHVwKHBvcHVwX2Y1Y2ZlNzYxMzA2MDQxN2U5YzZhYTI3OTkzYzg5ZmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhMmZkNDQ2YjhhNDQ3MTc4MDNkZWMzMWMxMTcwNmQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxOTgxMzgwMDczNjcsLTczLjg4MjgyMTA5MTY0MzY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiOTgzYjNjOTJlNjQxNTNhMzU2M2JlMDdiNTUyMzI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2MzhlMzE2YzBjODQxMzlhNzQ4MWYyZTU3MzNjM2MxID0gJCgnPGRpdiBpZD0iaHRtbF9mNjM4ZTMxNmMwYzg0MTM5YTc0ODFmMmU1NzMzYzNjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmFja3NvbiBIZWlnaHRzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYjk4M2IzYzkyZTY0MTUzYTM1NjNiZTA3YjU1MjMyOS5zZXRDb250ZW50KGh0bWxfZjYzOGUzMTZjMGM4NDEzOWE3NDgxZjJlNTczM2MzYzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWEyZmQ0NDZiOGE0NDcxNzgwM2RlYzMxYzExNzA2ZDMuYmluZFBvcHVwKHBvcHVwXzFiOTgzYjNjOTJlNjQxNTNhMzU2M2JlMDdiNTUyMzI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2NWNjY2Q0ODkyZTRlY2NhMjYxNDY0YWNiNWU3MjhhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0MDQ4NTA1MTIyMDI0LC03My44ODE2NTYyMjI4ODM4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2I0OWYxNTUxM2I0ODI4ODM1ZDNjZjlkMDQ0OTIxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNTg2NTJhMDBjNmM0MDcwOTI5NzNiZDcxYTE1YmRkZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTU4NjUyYTAwYzZjNDA3MDkyOTczYmQ3MWExNWJkZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVsbWh1cnN0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2I0OWYxNTUxM2I0ODI4ODM1ZDNjZjlkMDQ0OTIxYi5zZXRDb250ZW50KGh0bWxfYTU4NjUyYTAwYzZjNDA3MDkyOTczYmQ3MWExNWJkZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDY1Y2NjZDQ4OTJlNGVjY2EyNjE0NjRhY2I1ZTcyOGEuYmluZFBvcHVwKHBvcHVwXzczYjQ5ZjE1NTEzYjQ4Mjg4MzVkM2NmOWQwNDQ5MjFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiY2EzMjU0YjVkZjRkNTc5YjE5NTEwOTYzMzU1ODY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE5YTAzODdhYTI1NGVkNTgxYmIxYWIzNmY0MmQyYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGFjMDJlYTIwYzRlNDYyOTk1NjdkYTQ2ZThiNDc2ZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzhhYzAyZWEyMGM0ZTQ2Mjk5NTY3ZGE0NmU4YjQ3NmRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxOWEwMzg3YWEyNTRlZDU4MWJiMWFiMzZmNDJkMmI1LnNldENvbnRlbnQoaHRtbF84YWMwMmVhMjBjNGU0NjI5OTU2N2RhNDZlOGI0NzZkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YmNhMzI1NGI1ZGY0ZDU3OWIxOTUxMDk2MzM1NTg2Ni5iaW5kUG9wdXAocG9wdXBfZjE5YTAzODdhYTI1NGVkNTgxYmIxYWIzNmY0MmQyYjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDAyNTgzNDZjY2FkNDk1ZGFjNzJlZmU0YzEwNTQzNjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDIzODE3NTAxNTY2NywtNzMuODU2ODI0OTczNDUyNThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWU0N2Y0Njg5YjJhNDFhN2I0MmYwNjBiMjRhY2JiMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQzNGM2NDkxOWY4NGRlOGI2NmQ1ODhjNWYzYmI5OWUgPSAkKCc8ZGl2IGlkPSJodG1sXzM0MzRjNjQ5MTlmODRkZThiNjZkNTg4YzVmM2JiOTllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db3JvbmE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlNDdmNDY4OWIyYTQxYTdiNDJmMDYwYjI0YWNiYjI0LnNldENvbnRlbnQoaHRtbF8zNDM0YzY0OTE5Zjg0ZGU4YjY2ZDU4OGM1ZjNiYjk5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMDI1ODM0NmNjYWQ0OTVkYWM3MmVmZTRjMTA1NDM2Ny5iaW5kUG9wdXAocG9wdXBfNWU0N2Y0Njg5YjJhNDFhN2I0MmYwNjBiMjRhY2JiMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTdiYTc0Y2IzNTVlNGQ1NWExNDdkNjcyMmNmMTcxMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjUyNjM3ODIxNjUwMywtNzMuODQ0NDc1MDA3ODg5ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM2NGZhYTVmOWE0NDFiZWJmNmQzNDc0NmU0OTRlNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk5ZGEwNmY1MzhkNDFiYmFkYjE1OTkwOWU3MmU2M2UgPSAkKCc8ZGl2IGlkPSJodG1sXzM5OWRhMDZmNTM4ZDQxYmJhZGIxNTk5MDllNzJlNjNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3Jlc3QgSGlsbHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzNjRmYWE1ZjlhNDQxYmViZjZkMzQ3NDZlNDk0ZTY1LnNldENvbnRlbnQoaHRtbF8zOTlkYTA2ZjUzOGQ0MWJiYWRiMTU5OTA5ZTcyZTYzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lN2JhNzRjYjM1NWU0ZDU1YTE0N2Q2NzIyY2YxNzEwOS5iaW5kUG9wdXAocG9wdXBfMTM2NGZhYTVmOWE0NDFiZWJmNmQzNDc0NmU0OTRlNjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTBjNjQ2MjYyMzQxNDg0NDhhYmVjOWJlMDE5NDZhMDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOGU2OTJkOWZjM2M0MmZiYTA5N2FjYTBjNTA2MGI2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MGZkNDg0OThiYjM0OTk4OGU2OGIyYTVmYzkzZWJlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODBmZDQ4NDk4YmIzNDk5ODhlNjhiMmE1ZmM5M2ViZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGU2OTJkOWZjM2M0MmZiYTA5N2FjYTBjNTA2MGI2MS5zZXRDb250ZW50KGh0bWxfODBmZDQ4NDk4YmIzNDk5ODhlNjhiMmE1ZmM5M2ViZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTBjNjQ2MjYyMzQxNDg0NDhhYmVjOWJlMDE5NDZhMDYuYmluZFBvcHVwKHBvcHVwX2U4ZTY5MmQ5ZmMzYzQyZmJhMDk3YWNhMGM1MDYwYjYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3MTA4M2I2MjdjZDQ1NGFiYzQ2NzdjNzFjYWU2MjM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk3OTQ3MzE0NzE3NjMsLTczLjgzMTgzMzIxNDQ2ODg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYWRiMjI5YjBlZTQ2OTBhMjBmOThkYWMxYzJjOWYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwNmRkZDU5MzFmMzRlZDc4ZWU0NGYxN2Y1YWQxNDJmID0gJCgnPGRpdiBpZD0iaHRtbF9jMDZkZGQ1OTMxZjM0ZWQ3OGVlNDRmMTdmNWFkMTQyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTFhZGIyMjliMGVlNDY5MGEyMGY5OGRhYzFjMmM5ZjEuc2V0Q29udGVudChodG1sX2MwNmRkZDU5MzFmMzRlZDc4ZWU0NGYxN2Y1YWQxNDJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3MTA4M2I2MjdjZDQ1NGFiYzQ2NzdjNzFjYWU2MjM1LmJpbmRQb3B1cChwb3B1cF81MWFkYjIyOWIwZWU0NjkwYTIwZjk4ZGFjMWMyYzlmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZWZjZWIyYTNiMWE0ZjY1YjNkNDU4ZTY5M2ZjMDBiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NDQ1NDE5Njk3ODQ2LC03My44MzE3NzMwMDMyOTU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOGMxYTY4NTMyMWE0OGEwYjQ0OGQ1YjZjNGYyZTlmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYmZjZWEwMDVjNTM0OTA1ODBkOWU1OWZmNTlhODVjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2JmY2VhMDA1YzUzNDkwNTgwZDllNTlmZjU5YTg1YzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsdXNoaW5nPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOGMxYTY4NTMyMWE0OGEwYjQ0OGQ1YjZjNGYyZTlmMy5zZXRDb250ZW50KGh0bWxfY2JmY2VhMDA1YzUzNDkwNTgwZDllNTlmZjU5YTg1YzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWVmY2ViMmEzYjFhNGY2NWIzZDQ1OGU2OTNmYzAwYjUuYmluZFBvcHVwKHBvcHVwXzA4YzFhNjg1MzIxYTQ4YTBiNDQ4ZDViNmM0ZjJlOWYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzMWRhNzIyODVjZDQ2NDZiZDI1NjQ4MjM1YjI4N2EzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjN2JmNDdlMWI3YjQxNWJhY2VlNzExNDg1NDBkMGU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1NzIwZTBlZDUxNjQ0N2M5MGI2YjVkYTUwOGVhM2ZhID0gJCgnPGRpdiBpZD0iaHRtbF9lNTcyMGUwZWQ1MTY0NDdjOTBiNmI1ZGE1MDhlYTNmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWM3YmY0N2UxYjdiNDE1YmFjZWU3MTE0ODU0MGQwZTUuc2V0Q29udGVudChodG1sX2U1NzIwZTBlZDUxNjQ0N2M5MGI2YjVkYTUwOGVhM2ZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzMWRhNzIyODVjZDQ2NDZiZDI1NjQ4MjM1YjI4N2EzLmJpbmRQb3B1cChwb3B1cF9lYzdiZjQ3ZTFiN2I0MTViYWNlZTcxMTQ4NTQwZDBlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGFhYjJjNTk1ODY0NTUyYmZmNDQ4NjNmY2I5MTBiOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MDE3NjI4MzUxOTI0LC03My45MjY5MTYxNzU2MTU3N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yODZiOTZmY2E1ODI0NDBmYjgxMDBhYmU2ZTIxMmRiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzg1NmQxYjExZWY0MzVhYjAyNDdiYzdkZWNkYmRiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWM4NTZkMWIxMWVmNDM1YWIwMjQ3YmM3ZGVjZGJkYjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bm55c2lkZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg2Yjk2ZmNhNTgyNDQwZmI4MTAwYWJlNmUyMTJkYjkuc2V0Q29udGVudChodG1sX2FjODU2ZDFiMTFlZjQzNWFiMDI0N2JjN2RlY2RiZGIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0YWFiMmM1OTU4NjQ1NTJiZmY0NDg2M2ZjYjkxMGI4LmJpbmRQb3B1cChwb3B1cF8yODZiOTZmY2E1ODI0NDBmYjgxMDBhYmU2ZTIxMmRiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZWI5NjUxOTlkYzg0NGU5YWZlMDNhZmU2YjIxYmZjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NDA3MzIzODgzMDkxLC03My44NjcwNDE0NzY1ODc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOTNlNzAzZTg2MTc0MmFhOTQ3ODMyOTI0ODBhZmRhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84N2RhZDk4ODhhZjg0YmRlOTYwMzIwODU0NjIxZWM4ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODdkYWQ5ODg4YWY4NGJkZTk2MDMyMDg1NDYyMWVjOGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgRWxtaHVyc3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5M2U3MDNlODYxNzQyYWE5NDc4MzI5MjQ4MGFmZGEwLnNldENvbnRlbnQoaHRtbF84N2RhZDk4ODhhZjg0YmRlOTYwMzIwODU0NjIxZWM4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZWI5NjUxOTlkYzg0NGU5YWZlMDNhZmU2YjIxYmZjNy5iaW5kUG9wdXAocG9wdXBfZDkzZTcwM2U4NjE3NDJhYTk0NzgzMjkyNDgwYWZkYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjczMTM2YzAxZWE1NGY0OWFkMmE1YTFhYTQ2MTNlY2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzNTU0NDRhNDkwODQyNWRiZjljNjVjMmIwNDVhMjMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlMmE4OGE1MWVkNzRmNDY4ZTY0MzRkNzBiY2YwZTNjID0gJCgnPGRpdiBpZD0iaHRtbF8yZTJhODhhNTFlZDc0ZjQ2OGU2NDM0ZDcwYmNmMGUzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjM1NTQ0NGE0OTA4NDI1ZGJmOWM2NWMyYjA0NWEyMzEuc2V0Q29udGVudChodG1sXzJlMmE4OGE1MWVkNzRmNDY4ZTY0MzRkNzBiY2YwZTNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3MzEzNmMwMWVhNTRmNDlhZDJhNWExYWE0NjEzZWNmLmJpbmRQb3B1cChwb3B1cF9iMzU1NDQ0YTQ5MDg0MjVkYmY5YzY1YzJiMDQ1YTIzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYmFjYjNjZmYwYjY0NDg5OGVmNjlmZWZhZTkxMTdlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwODMyMzE1NjEzODU4LC03My45MDE0MzUxNzU1OTU4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYWUxYjMzMjljYzA0M2QyOGYwMWFhZGE2ZTM3OWExMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iODQ0MTFiZTAwNWI0YmM3OGQxMDhhYzY2Y2IwN2ZlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjg0NDExYmUwMDViNGJjNzhkMTA4YWM2NmNiMDdmZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJpZGdld29vZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFlMWIzMzI5Y2MwNDNkMjhmMDFhYWRhNmUzNzlhMTEuc2V0Q29udGVudChodG1sX2I4NDQxMWJlMDA1YjRiYzc4ZDEwOGFjNjZjYjA3ZmU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiYWNiM2NmZjBiNjQ0ODk4ZWY2OWZlZmFlOTExN2VjLmJpbmRQb3B1cChwb3B1cF9mYWUxYjMzMjljYzA0M2QyOGYwMWFhZGE2ZTM3OWExMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGExN2JjNTAzMzU0ZDRlOTFkNzNhNGYyZDAxYTI3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMjc2MjQyOTY3ODM4LC03My44NzA3NDE2NzQzNTYwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTY3YmJkMDcxYTQ0YmYyOWQ4NjgzOWJlYWFmMTEwNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NjU1OTI3Y2FkZTE0MDM5OWFkZmRlYTAxM2Q0ZjZiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY1NTkyN2NhZGUxNDAzOTlhZGZkZWEwMTNkNGY2YjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW5kYWxlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTY3YmJkMDcxYTQ0YmYyOWQ4NjgzOWJlYWFmMTEwNS5zZXRDb250ZW50KGh0bWxfNzY1NTkyN2NhZGUxNDAzOTlhZGZkZWEwMTNkNGY2YjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOThhMTdiYzUwMzM1NGQ0ZTkxZDczYTRmMmQwMWEyNzkuYmluZFBvcHVwKHBvcHVwX2RhNjdiYmQwNzFhNDRiZjI5ZDg2ODM5YmVhYWYxMTA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkMGVkYTEyNGMxMzQyNDY5NjczZjBjYjA1ZTY1Yjc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMzYmFjY2JiNTQzNGMxYTg0MjRiMzFhMmM0MmY4NzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDBmYWU2YmU0MDAzNGI2MDkyZDM0YTliZjcxMzg0NGMgPSAkKCc8ZGl2IGlkPSJodG1sXzQwZmFlNmJlNDAwMzRiNjA5MmQzNGE5YmY3MTM4NDRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzM2JhY2NiYjU0MzRjMWE4NDI0YjMxYTJjNDJmODcxLnNldENvbnRlbnQoaHRtbF80MGZhZTZiZTQwMDM0YjYwOTJkMzRhOWJmNzEzODQ0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZDBlZGExMjRjMTM0MjQ2OTY3M2YwY2IwNWU2NWI3OS5iaW5kUG9wdXAocG9wdXBfZTMzYmFjY2JiNTQzNGMxYTg0MjRiMzFhMmM0MmY4NzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjgzM2QyZGFiY2U4NGVlMTk3MjNkYTlhNGJkMTI5MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODk4ODY4NzkxNTc4OSwtNzMuODU4MTEwNDY1NTQzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzIwNGM4MWNkY2Q0OTE0OGZlMzZhZWFiNjY1ZWM1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTVlMzVjM2QwNGY0ZWM0OTM2YjUyYTFlMjhiMjU1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE1ZTM1YzNkMDRmNGVjNDkzNmI1MmExZTI4YjI1NWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RoYXZlbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMyMDRjODFjZGNkNDkxNDhmZTM2YWVhYjY2NWVjNTUuc2V0Q29udGVudChodG1sX2QxNWUzNWMzZDA0ZjRlYzQ5MzZiNTJhMWUyOGIyNTVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4MzNkMmRhYmNlODRlZTE5NzIzZGE5YTRiZDEyOTJhLmJpbmRQb3B1cChwb3B1cF9lYzIwNGM4MWNkY2Q0OTE0OGZlMzZhZWFiNjY1ZWM1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82N2JhYzJmOTBhYWE0ZWQ2YWUwNjZkMWUzZmVhYzkyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MDcwODQ2ODI2NTQxNSwtNzMuODQzMjAyNjYxNzM0NDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDI2MGRlZGMxYjc2NDg4M2IzY2RhZDQyOTIwYTc1NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjIyZWUwOGMxMTkxNGRmODg4MGM0ZWUzMzQ2ZmQ4ZWUgPSAkKCc8ZGl2IGlkPSJodG1sX2YyMmVlMDhjMTE5MTRkZjg4ODBjNGVlMzM0NmZkOGVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Pem9uZSBQYXJrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjYwZGVkYzFiNzY0ODgzYjNjZGFkNDI5MjBhNzU3OC5zZXRDb250ZW50KGh0bWxfZjIyZWUwOGMxMTkxNGRmODg4MGM0ZWUzMzQ2ZmQ4ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjdiYWMyZjkwYWFhNGVkNmFlMDY2ZDFlM2ZlYWM5MmQuYmluZFBvcHVwKHBvcHVwX2QyNjBkZWRjMWI3NjQ4ODNiM2NkYWQ0MjkyMGE3NTc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1NWNjMTMyODM1MjQwMjFhNjMwMTMzNjA3YTFmMzI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2ZjcyMDZkNzRlNTQyOWJhYjM1MjUwOTZkYWE4ZmJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1NDkxNDE4NTkyNTQ2MWM4NmI3OWJhYTgzMjAyZTBlID0gJCgnPGRpdiBpZD0iaHRtbF84NTQ5MTQxODU5MjU0NjFjODZiNzliYWE4MzIwMmUwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzZmNzIwNmQ3NGU1NDI5YmFiMzUyNTA5NmRhYThmYmQuc2V0Q29udGVudChodG1sXzg1NDkxNDE4NTkyNTQ2MWM4NmI3OWJhYTgzMjAyZTBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NWNjMTMyODM1MjQwMjFhNjMwMTMzNjA3YTFmMzI2LmJpbmRQb3B1cChwb3B1cF9jNmY3MjA2ZDc0ZTU0MjliYWIzNTI1MDk2ZGFhOGZiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTlmNDFmZTc3MTk0NjQ2YWMwZjZkYTE5OTJjOTYzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NDkwMjc0OTI2MDIwNSwtNzMuODQzMDQ1Mjg4OTYxMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjYyMjZlM2E3YjIxNDZjNjhhOWM5YTkzYzNjMjgwOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTVjNzNmYmI2ZjBiNGM5MGExNzA1ZmU3NTI2ODI4YzIgPSAkKCc8ZGl2IGlkPSJodG1sX2E1YzczZmJiNmYwYjRjOTBhMTcwNWZlNzUyNjgyOGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2xsZWdlIFBvaW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NjIyNmUzYTdiMjE0NmM2OGE5YzlhOTNjM2MyODA5ZC5zZXRDb250ZW50KGh0bWxfYTVjNzNmYmI2ZjBiNGM5MGExNzA1ZmU3NTI2ODI4YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2E5ZjQxZmU3NzE5NDY0NmFjMGY2ZGExOTkyYzk2M2QuYmluZFBvcHVwKHBvcHVwXzY2MjI2ZTNhN2IyMTQ2YzY4YTljOWE5M2MzYzI4MDlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjZjFhMzlmYmM0ZTQyZTdiZWRlMTJkOTg5MTc0ZTU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgxMjkwNzY2MDI2OTQsLTczLjgxNDIwMjE2NjEwODYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyMGQ2ZDdkN2YxOTQxMDZiMTJhNzQzYjI4ZmIxNjc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmZDNkMzNlYTdkNjQwNmQ4NDVkNzNmZGE0NjIwYzkwID0gJCgnPGRpdiBpZD0iaHRtbF9jZmQzZDMzZWE3ZDY0MDZkODQ1ZDczZmRhNDYyMGM5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2hpdGVzdG9uZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTIwZDZkN2Q3ZjE5NDEwNmIxMmE3NDNiMjhmYjE2Nzkuc2V0Q29udGVudChodG1sX2NmZDNkMzNlYTdkNjQwNmQ4NDVkNzNmZGE0NjIwYzkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJjZjFhMzlmYmM0ZTQyZTdiZWRlMTJkOTg5MTc0ZTU4LmJpbmRQb3B1cChwb3B1cF8xMjBkNmQ3ZDdmMTk0MTA2YjEyYTc0M2IyOGZiMTY3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMWM4MmM1ZmQwOTY0ODI4YTQ2OGJiY2RhNGI3YWQ0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkY2NjNGMxOWI3YjRjOWZiMmVkZDEzNTZlNTAzZmMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhYzkwNWM4ZDg1NDQxNjk5NGZmOThkNjg2NzJjMTg0ID0gJCgnPGRpdiBpZD0iaHRtbF9lYWM5MDVjOGQ4NTQ0MTY5OTRmZjk4ZDY4NjcyYzE4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RjY2M0YzE5YjdiNGM5ZmIyZWRkMTM1NmU1MDNmYzMuc2V0Q29udGVudChodG1sX2VhYzkwNWM4ZDg1NDQxNjk5NGZmOThkNjg2NzJjMTg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxYzgyYzVmZDA5NjQ4MjhhNDY4YmJjZGE0YjdhZDQyLmJpbmRQb3B1cChwb3B1cF83ZGNjYzRjMTliN2I0YzlmYjJlZGQxMzU2ZTUwM2ZjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTk4OGU0NjY0MjU0ZGY1YWJjMDJkZWYwNWU4ODZjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcyOTU0OTAzMjYyLC03My43OTE3NjI0MzcyODA2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZDZlYzRlOTQ0NGI0YmI0OTI4YTAzYzAwOWYwZDY3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjZmNjc5N2RmYjA0MTc2OWNkOGNlOGE5MmIxYWYzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWI2ZjY3OTdkZmIwNDE3NjljZDhjZThhOTJiMWFmM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkF1YnVybmRhbGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNmVjNGU5NDQ0YjRiYjQ5MjhhMDNjMDA5ZjBkNjdjLnNldENvbnRlbnQoaHRtbF9lYjZmNjc5N2RmYjA0MTc2OWNkOGNlOGE5MmIxYWYzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OTk4OGU0NjY0MjU0ZGY1YWJjMDJkZWYwNWU4ODZjZS5iaW5kUG9wdXAocG9wdXBfZmQ2ZWM0ZTk0NDRiNGJiNDkyOGEwM2MwMDlmMGQ2N2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDA1YjEzNjI3MjM2NGZlMWFkMDFiYTBmNTU5MzE1ODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzA4MjYxOTI4MjY3LC03My43Mzg4OTc3NTU4MDc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0ZjE5Yjc2YWEyODRjNDA4NWQyMmFmYmI1M2Q3OWQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkMGYyNjRhNjEzMzRmYzlhNWM4NjljZjgzN2FmZDRmID0gJCgnPGRpdiBpZD0iaHRtbF9iZDBmMjY0YTYxMzM0ZmM5YTVjODY5Y2Y4MzdhZmQ0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIE5lY2s8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0ZjE5Yjc2YWEyODRjNDA4NWQyMmFmYmI1M2Q3OWQzLnNldENvbnRlbnQoaHRtbF9iZDBmMjY0YTYxMzM0ZmM5YTVjODY5Y2Y4MzdhZmQ0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDViMTM2MjcyMzY0ZmUxYWQwMWJhMGY1NTkzMTU4My5iaW5kUG9wdXAocG9wdXBfOTRmMTliNzZhYTI4NGM0MDg1ZDIyYWZiYjUzZDc5ZDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjZmNzc4NTNkZDAyNGI4YzkzMmMwOTVhZjYxZWIwNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDM5YjczMzliNGM0YThkODY0MjBhZTJlMDQyYjYyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NmU1ZjU2NjFiYmI0ZDQyYTA1MDAxMzUyYzYwMWU2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTZlNWY1NjYxYmJiNGQ0MmEwNTAwMTM1MmM2MDFlNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkMzliNzMzOWI0YzRhOGQ4NjQyMGFlMmUwNDJiNjJlLnNldENvbnRlbnQoaHRtbF81NmU1ZjU2NjFiYmI0ZDQyYTA1MDAxMzUyYzYwMWU2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNmY3Nzg1M2RkMDI0YjhjOTMyYzA5NWFmNjFlYjA2ZS5iaW5kUG9wdXAocG9wdXBfYmQzOWI3MzM5YjRjNGE4ZDg2NDIwYWUyZTA0MmI2MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYwZDg0ODJkMGRmNDc1OGJlMzdmZDVkZTEwOGM5NTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDk0NDA3OTk3NDMzMiwtNzMuNzE1NDgxMTg5OTkxNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmEyN2I1Mjc1YjI2NGI0ZGJjZDgxNWQ1MTE0MGEwMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjIxNjc5MWY3ZGYxNDk4OTg5YWY5NTc1ZjQ0MzI3ODUgPSAkKCc8ZGl2IGlkPSJodG1sX2IyMTY3OTFmN2RmMTQ5ODk4OWFmOTU3NWY0NDMyNzg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuIE9ha3M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhMjdiNTI3NWIyNjRiNGRiY2Q4MTVkNTExNDBhMDM0LnNldENvbnRlbnQoaHRtbF9iMjE2NzkxZjdkZjE0OTg5ODlhZjk1NzVmNDQzMjc4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjBkODQ4MmQwZGY0NzU4YmUzN2ZkNWRlMTA4Yzk1My5iaW5kUG9wdXAocG9wdXBfNmEyN2I1Mjc1YjI2NGI0ZGJjZDgxNWQ1MTE0MGEwMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDRlYjhjODE3MTNkNGQwMzlmZWQxYWRiNmU2YWI4MGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjg1NzMxODE3NjY3NSwtNzMuNzIwMTI4MTQ4MjY5MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI1ZTY4NDRlNmFkNDNhYjkzOThmNWZiMjA1NmRjZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FmODliMDBlZWExNDcwMzkyMTVjMWE0YWMwOTA1Y2UgPSAkKCc8ZGl2IGlkPSJodG1sXzNhZjg5YjAwZWVhMTQ3MDM5MjE1YzFhNGFjMDkwNWNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWxsZXJvc2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyNWU2ODQ0ZTZhZDQzYWI5Mzk4ZjVmYjIwNTZkY2VlLnNldENvbnRlbnQoaHRtbF8zYWY4OWIwMGVlYTE0NzAzOTIxNWMxYTRhYzA5MDVjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGViOGM4MTcxM2Q0ZDAzOWZlZDFhZGI2ZTZhYjgwYS5iaW5kUG9wdXAocG9wdXBfOTI1ZTY4NDRlNmFkNDNhYjkzOThmNWZiMjA1NmRjZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQ3MjE0MGY2NWY4NDAyZDk3MTA3OTA5MzRlMDI2YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1ZDZjMDhmNTQ1ZTQ0Yjc4OTlkMWU0MzNkMDQxYWM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNTc1NDAyYjY1MTQ0NDNhZDZkZDU3Y2VjOTNlNDUxID0gJCgnPGRpdiBpZD0iaHRtbF9iZDU3NTQwMmI2NTE0NDQzYWQ2ZGQ1N2NlYzkzZTQ1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1ZDZjMDhmNTQ1ZTQ0Yjc4OTlkMWU0MzNkMDQxYWM1LnNldENvbnRlbnQoaHRtbF9iZDU3NTQwMmI2NTE0NDQzYWQ2ZGQ1N2NlYzkzZTQ1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNDcyMTQwZjY1Zjg0MDJkOTcxMDc5MDkzNGUwMjZiOS5iaW5kUG9wdXAocG9wdXBfOTVkNmMwOGY1NDVlNDRiNzg5OWQxZTQzM2QwNDFhYzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk2ZTczOGUxNDc4NDU5ZGFkMWU5ZGQ3YmFmMzgyYWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQzOTQ0NjUzMzEzLC03My43ODI3MTMzNzAwMzI2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZGY1NmU0NjNkNzM0ZDVlYjJkYTJkNjcxMmEzZTRmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTZjY2JjMjdkMmI0ZTdhYjFlYTQzMGM1NmIxNWE2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmU2Y2NiYzI3ZDJiNGU3YWIxZWE0MzBjNTZiMTVhNjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZyZXNoIE1lYWRvd3M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkZjU2ZTQ2M2Q3MzRkNWViMmRhMmQ2NzEyYTNlNGY2LnNldENvbnRlbnQoaHRtbF9mZTZjY2JjMjdkMmI0ZTdhYjFlYTQzMGM1NmIxNWE2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTZlNzM4ZTE0Nzg0NTlkYWQxZTlkZDdiYWYzODJhYy5iaW5kUG9wdXAocG9wdXBfMGRmNTZlNDYzZDczNGQ1ZWIyZGEyZDY3MTJhM2U0ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVkYjgxOWUyYWMyNDIyY2I4NTFiYzE4YTg5N2RhMTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTA5MzU0NzI1MjI3MSwtNzMuODExNzQ4MjI0NTg2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmU1M2U3OTA5ZTVmNDBmNTg5YjliNjczNWY5ZmU1YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTEyZDkxMTI2YWI4NDhhYjkzYjAwYTE3ZmQ1YjkwMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzkxMmQ5MTEyNmFiODQ4YWI5M2IwMGExN2ZkNWI5MDM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccmlhcndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlNTNlNzkwOWU1ZjQwZjU4OWI5YjY3MzVmOWZlNWEyLnNldENvbnRlbnQoaHRtbF85MTJkOTExMjZhYjg0OGFiOTNiMDBhMTdmZDViOTAzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NWRiODE5ZTJhYzI0MjJjYjg1MWJjMThhODk3ZGExOC5iaW5kUG9wdXAocG9wdXBfNmU1M2U3OTA5ZTVmNDBmNTg5YjliNjczNWY5ZmU1YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTc1ZGRjYjM0MzhhNDEyMDkxZDU0OTExNDQ4MGMwMzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdhY2VmNWVhZTgxNDI4NzliZjI2ZmVjNmQ2NjlmZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA1NWE0NGRjYzgyNDZiNjlmMTNjNjE2MmVkNzdlZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNTVhNDRkY2M4MjQ2YjY5ZjEzYzYxNjJlZDc3ZWRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDdhY2VmNWVhZTgxNDI4NzliZjI2ZmVjNmQ2NjlmZjIuc2V0Q29udGVudChodG1sXzcwNTVhNDRkY2M4MjQ2YjY5ZjEzYzYxNjJlZDc3ZWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NWRkY2IzNDM4YTQxMjA5MWQ1NDkxMTQ0ODBjMDMwLmJpbmRQb3B1cChwb3B1cF80N2FjZWY1ZWFlODE0Mjg3OWJmMjZmZWM2ZDY2OWZmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTAxYjYyY2MzMzc0YjQ3YmJmNzI5NDk4YzdmZWQxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NTYxODU3MTQxODU1LC03My43NTQ5NDk3NjIzNDMzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NzVjYmM5NjVkNTI0YzUxYTY5OTZlM2RkYTVmMTViMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83M2E0ZDhiN2Q1N2E0NzMyYjJiZGE2MGIzZDZkYzZlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzNhNGQ4YjdkNTdhNDczMmIyYmRhNjBiM2Q2ZGM2ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9ha2xhbmQgR2FyZGVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDc1Y2JjOTY1ZDUyNGM1MWE2OTk2ZTNkZGE1ZjE1YjIuc2V0Q29udGVudChodG1sXzczYTRkOGI3ZDU3YTQ3MzJiMmJkYTYwYjNkNmRjNmU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1MDFiNjJjYzMzNzRiNDdiYmY3Mjk0OThjN2ZlZDFhLmJpbmRQb3B1cChwb3B1cF80NzVjYmM5NjVkNTI0YzUxYTY5OTZlM2RkYTVmMTViMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmU1ZjI4N2U0YmQ0NWIyYWFlYjE3ZjFiMzE2NTQwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxODg5MzA5MjE2NzM1NiwtNzMuNzM4NzE0ODQ1Nzg0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk2MWIyYmI0ZDgwNDQ1NDkyNWM2ZTRhNzJhZTVkNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2I4ODNkNmUyOGM5NDI0NGIxODBkNmMwOWQwZWU2ZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2NiODgzZDZlMjhjOTQyNDRiMTgwZDZjMDlkMGVlNmViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnMgVmlsbGFnZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTk2MWIyYmI0ZDgwNDQ1NDkyNWM2ZTRhNzJhZTVkNDYuc2V0Q29udGVudChodG1sX2NiODgzZDZlMjhjOTQyNDRiMTgwZDZjMDlkMGVlNmViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk2ZTVmMjg3ZTRiZDQ1YjJhYWViMTdmMWIzMTY1NDAyLmJpbmRQb3B1cChwb3B1cF8xOTYxYjJiYjRkODA0NDU0OTI1YzZlNGE3MmFlNWQ0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNmUyMzUxZTk4YjE0NGJkOGQ3ZDgwZWRkYmM1MGNlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDFlNTk3OGM5NmQ0M2JmYTAxY2M5MTE4NjM5Y2VkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTliMzZkMDYzYjg0ZWY1OTMwNmNiNTlmMWI1MWJjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2U5YjM2ZDA2M2I4NGVmNTkzMDZjYjU5ZjFiNTFiY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQxZTU5NzhjOTZkNDNiZmEwMWNjOTExODYzOWNlZDEuc2V0Q29udGVudChodG1sXzNlOWIzNmQwNjNiODRlZjU5MzA2Y2I1OWYxYjUxYmNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2ZTIzNTFlOThiMTQ0YmQ4ZDdkODBlZGRiYzUwY2U1LmJpbmRQb3B1cChwb3B1cF80NDFlNTk3OGM5NmQ0M2JmYTAxY2M5MTE4NjM5Y2VkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzJlZGZlNTBlZjM0ZWE2OTc4OTg1NWI3NDFiNGZjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NjkxMTI1Mzc4OTg4NSwtNzMuNzkwNDI2MTMxMzU1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iN2M3YjA2MWQxNjI0Y2M2YjAzMDgxODA1NzkzNGFlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDcyMjg5NjFmNDc0M2RjOGY4MjhhZTYzYjY1MzM0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQ3MjI4OTYxZjQ3NDNkYzhmODI4YWU2M2I2NTMzNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEphbWFpY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3YzdiMDYxZDE2MjRjYzZiMDMwODE4MDU3OTM0YWUyLnNldENvbnRlbnQoaHRtbF9hNDcyMjg5NjFmNDc0M2RjOGY4MjhhZTYzYjY1MzM0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzJlZGZlNTBlZjM0ZWE2OTc4OTg1NWI3NDFiNGZjZi5iaW5kUG9wdXAocG9wdXBfYjdjN2IwNjFkMTYyNGNjNmIwMzA4MTgwNTc5MzRhZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU4MGViZjQ0Y2RiNGFmNTljM2U5ZTMzODI0MWMzODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTQ0NDUzODUyMjM1OSwtNzMuNzU4Njc2MDM3Mjc3MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGJkNmFlZTA1OGQxNDEyNmFjNmE4OTI3NjM0ZTIwYmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTRkYjM3MTI3MGIzNGM2NThkMzY5YWRlN2NhNTMxMzUgPSAkKCc8ZGl2IGlkPSJodG1sXzE0ZGIzNzEyNzBiMzRjNjU4ZDM2OWFkZTdjYTUzMTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdC4gQWxiYW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YmQ2YWVlMDU4ZDE0MTI2YWM2YTg5Mjc2MzRlMjBiYi5zZXRDb250ZW50KGh0bWxfMTRkYjM3MTI3MGIzNGM2NThkMzY5YWRlN2NhNTMxMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWU4MGViZjQ0Y2RiNGFmNTljM2U5ZTMzODI0MWMzODUuYmluZFBvcHVwKHBvcHVwXzhiZDZhZWUwNThkMTQxMjZhYzZhODkyNzYzNGUyMGJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0MjljMDhmNTI1ZjQ2OWE4Nzg2ZGQ1YTJkODZjNzRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkODFjMTZjZDhmMDQ4MDc4MTZhZjc2ZmY1YTdlNjE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxNjc3ZjZkMGM2ODRkMGFhYTM5NDQ4YjM4MTNlM2U4ID0gJCgnPGRpdiBpZD0iaHRtbF8yMTY3N2Y2ZDBjNjg0ZDBhYWEzOTQ0OGIzODEzZTNlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkODFjMTZjZDhmMDQ4MDc4MTZhZjc2ZmY1YTdlNjE5LnNldENvbnRlbnQoaHRtbF8yMTY3N2Y2ZDBjNjg0ZDBhYWEzOTQ0OGIzODEzZTNlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDI5YzA4ZjUyNWY0NjlhODc4NmRkNWEyZDg2Yzc0Yy5iaW5kUG9wdXAocG9wdXBfNGQ4MWMxNmNkOGYwNDgwNzgxNmFmNzZmZjVhN2U2MTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWU4ZmI5NzE5OGQ2NGMwOTg0NzU2NGM0M2E4NjU2MzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjYyMzA0OTAzNjg1ODQsLTczLjc2MDQyMDkyNjgyMjg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5MjY4Zjk1ZTRiYzQzY2RhYjdmZGMyMGMyMzMyN2M0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlMTI4YjI0MzM0YzQyMDI5N2EwMjlmODEzMDk0N2E4ID0gJCgnPGRpdiBpZD0iaHRtbF9kZTEyOGIyNDMzNGM0MjAyOTdhMDI5ZjgxMzA5NDdhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3ByaW5nZmllbGQgR2FyZGVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjkyNjhmOTVlNGJjNDNjZGFiN2ZkYzIwYzIzMzI3YzQuc2V0Q29udGVudChodG1sX2RlMTI4YjI0MzM0YzQyMDI5N2EwMjlmODEzMDk0N2E4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlOGZiOTcxOThkNjRjMDk4NDc1NjRjNDNhODY1NjM4LmJpbmRQb3B1cChwb3B1cF8yOTI2OGY5NWU0YmM0M2NkYWI3ZmRjMjBjMjMzMjdjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYmFkNTViZmJlNDA0MDhjOWUxZjYzZTMyZTYyNzU5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5Mjc3NDYzOTE2MDg0NSwtNzMuNzM1MjY4NzM3MDgwMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZmY2Q5MjBiNmMyNDM2YzlkYjZhYjFmNmEyNTk4MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMThhMTA3MzZmNTE0NDFmYWJlMDZkNThmZTc1YmU3MTggPSAkKCc8ZGl2IGlkPSJodG1sXzE4YTEwNzM2ZjUxNDQxZmFiZTA2ZDU4ZmU3NWJlNzE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW1icmlhIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmZmNkOTIwYjZjMjQzNmM5ZGI2YWIxZjZhMjU5ODE2LnNldENvbnRlbnQoaHRtbF8xOGExMDczNmY1MTQ0MWZhYmUwNmQ1OGZlNzViZTcxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYmFkNTViZmJlNDA0MDhjOWUxZjYzZTMyZTYyNzU5NC5iaW5kUG9wdXAocG9wdXBfZGZmY2Q5MjBiNmMyNDM2YzlkYjZhYjFmNmEyNTk4MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWNlZTY1ZmQ4YmQ5NDMxNjg2NWI3YjM5NDBhYTVmZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwYzRmZDhiOWU2YjQxMGE5NDk1NTU5NTVmODA0ODc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4MTBmOGU4ZTU2ZjRjMGI5ZDk4MjBiZjg2YTUzMWJmID0gJCgnPGRpdiBpZD0iaHRtbF84ODEwZjhlOGU1NmY0YzBiOWQ5ODIwYmY4NmE1MzFiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwYzRmZDhiOWU2YjQxMGE5NDk1NTU5NTVmODA0ODc1LnNldENvbnRlbnQoaHRtbF84ODEwZjhlOGU1NmY0YzBiOWQ5ODIwYmY4NmE1MzFiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lY2VlNjVmZDhiZDk0MzE2ODY1YjdiMzk0MGFhNWZlYS5iaW5kUG9wdXAocG9wdXBfYjBjNGZkOGI5ZTZiNDEwYTk0OTU1NTk1NWY4MDQ4NzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWVmNzQ1ZWVmZDgwNDM4MGEzZTlmYzVkYWY2ZmJiMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDMxMzQ0MzI1MDA4OTQsLTczLjc1NDk3OTY4MDQzODcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4OWQzZjdhNDkxYzRiNjhiM2YzMWJmMjRkNTAwYWJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyNjU0NDQ3MTBhZDQzZjZhMzJkYWJiNDQ0ODIwYmE4ID0gJCgnPGRpdiBpZD0iaHRtbF8yMjY1NDQ0NzEwYWQ0M2Y2YTMyZGFiYjQ0NDgyMGJhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFyIFJvY2thd2F5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODlkM2Y3YTQ5MWM0YjY4YjNmMzFiZjI0ZDUwMGFiZi5zZXRDb250ZW50KGh0bWxfMjI2NTQ0NDcxMGFkNDNmNmEzMmRhYmI0NDQ4MjBiYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWVmNzQ1ZWVmZDgwNDM4MGEzZTlmYzVkYWY2ZmJiMDAuYmluZFBvcHVwKHBvcHVwX2M4OWQzZjdhNDkxYzRiNjhiM2YzMWJmMjRkNTAwYWJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5YmZjZWIxMDYxMDQ3YjFhMmVjOTBjMDI3YjQ5NDZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAzMDI2NTgzNTEyMzgsLTczLjgyMDA1NDg5MTEwMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDExOWZiYjM4N2EwNDBkZmIzZjE3NTM1M2JiZDIxZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQxZDBkMGQzZjNiNDhjNWIyZmE1NjI5Nzc5MzAwMDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTNlMzAzNDkyNjQ0NDE4Yzk5MzkwMGI0NGNjMWFkMDkgPSAkKCc8ZGl2IGlkPSJodG1sXzkzZTMwMzQ5MjY0NDQxOGM5OTM5MDBiNDRjYzFhZDA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9hZCBDaGFubmVsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDFkMGQwZDNmM2I0OGM1YjJmYTU2Mjk3NzkzMDAwMS5zZXRDb250ZW50KGh0bWxfOTNlMzAzNDkyNjQ0NDE4Yzk5MzkwMGI0NGNjMWFkMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjliZmNlYjEwNjEwNDdiMWEyZWM5MGMwMjdiNDk0NmEuYmluZFBvcHVwKHBvcHVwXzc0MWQwZDBkM2YzYjQ4YzViMmZhNTYyOTc3OTMwMDAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwNjE4Y2Q5ODVlYTQ0NjdiZWY1ODY5MTU4YzA5ZWQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQxMTlmYmIzODdhMDQwZGZiM2YxNzUzNTNiYmQyMWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmYTQ1Yzk0ZGNhYjQ5YWY5MmRiN2EzN2VhYmZkNGIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZmMjQxNDhmYTAyYjQwOWVhYmY3YjM0YWRjYjc3NDE2ID0gJCgnPGRpdiBpZD0iaHRtbF9mZjI0MTQ4ZmEwMmI0MDllYWJmN2IzNGFkY2I3NzQxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZmE0NWM5NGRjYWI0OWFmOTJkYjdhMzdlYWJmZDRiMi5zZXRDb250ZW50KGh0bWxfZmYyNDE0OGZhMDJiNDA5ZWFiZjdiMzRhZGNiNzc0MTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTA2MThjZDk4NWVhNDQ2N2JlZjU4NjkxNThjMDllZDUuYmluZFBvcHVwKHBvcHVwXzJmYTQ1Yzk0ZGNhYjQ5YWY5MmRiN2EzN2VhYmZkNGIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0NzgxNGUwOWE4OTQwM2ZiNWIwZGNiZmU1MjU4YjE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTIzMDE1NjQyODk2LC03My45MDIyODk2MDM5MTY3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80MTE5ZmJiMzg3YTA0MGRmYjNmMTc1MzUzYmJkMjFlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTAyZTE4MGZjNGE0ZjAxYWFhM2M2ZjBjYTM2ZDA3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOTQ0NWI4NGIxZTU0OTUxYTZhNWFlYmNiNTUzMmE0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzk0NDViODRiMWU1NDk1MWE2YTVhZWJjYjU1MzJhNGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0ZWlud2F5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTAyZTE4MGZjNGE0ZjAxYWFhM2M2ZjBjYTM2ZDA3Ny5zZXRDb250ZW50KGh0bWxfMzk0NDViODRiMWU1NDk1MWE2YTVhZWJjYjU1MzJhNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzQ3ODE0ZTA5YTg5NDAzZmI1YjBkY2JmZTUyNThiMTQuYmluZFBvcHVwKHBvcHVwXzlhMDJlMTgwZmM0YTRmMDFhYWEzYzZmMGNhMzZkMDc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlYzQwZjE5OWIyNDQwYjk4ZjZkNGIzNDAyODY4MDk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyNzgxNDAzNjAwNDgsLTczLjgwNDM2NDUxNzIwOTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9w |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment