Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sofia100/60ed34eb532aff7a8eb9fa6b12855326 to your computer and use it in GitHub Desktop.
Save sofia100/60ed34eb532aff7a8eb9fa6b12855326 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n",
"\n",
"<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the *k*-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"<font size = 3>\n",
"\n",
"1. <a href=\"#item1\">Download and Explore Dataset</a>\n",
"\n",
"2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n",
"\n",
"3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n",
"\n",
"4. <a href=\"#item4\">Cluster Neighborhoods</a>\n",
"\n",
"5. <a href=\"#item5\">Examine Clusters</a> \n",
"</font>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get the data and start exploring it, let's download all the dependencies that we will need."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geopy\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geographiclib-1.50 | py_0 34 KB conda-forge\n",
" geopy-1.22.0 | pyh9f0ad1d_0 63 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 97 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n",
" geopy conda-forge/noarch::geopy-1.22.0-pyh9f0ad1d_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"geopy-1.22.0 | 63 KB | ##################################### | 100% \n",
"geographiclib-1.50 | 34 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\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",
"\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",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\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 imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item1'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Download and Explore Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neighborhood 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. Feel free to try to find this dataset on your own, but here is 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": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'newyork_data.json' https://cocl.us/new_york_dataset\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load and explore the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's load the data."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"with open('newyork_data.json') as json_data:\n",
" newyork_data = json.load(json_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a quick look at the data."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'FeatureCollection',\n",
" 'totalFeatures': 306,\n",
" 'features': [{'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]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.2',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82993910812398, 40.87429419303012]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Co-op City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Co-op',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82993910812398,\n",
" 40.87429419303012,\n",
" -73.82993910812398,\n",
" 40.87429419303012]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.3',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82780644716412, 40.887555677350775]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eastchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eastchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82780644716412,\n",
" 40.887555677350775,\n",
" -73.82780644716412,\n",
" 40.887555677350775]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.4',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90564259591682, 40.89543742690383]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fieldston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fieldston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90564259591682,\n",
" 40.89543742690383,\n",
" -73.90564259591682,\n",
" 40.89543742690383]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.5',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9125854610857, 40.890834493891305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Riverdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Riverdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9125854610857,\n",
" 40.890834493891305,\n",
" -73.9125854610857,\n",
" 40.890834493891305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.6',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90281798724604, 40.88168737120521]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90281798724604,\n",
" 40.88168737120521,\n",
" -73.90281798724604,\n",
" 40.88168737120521]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.7',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91065965862981, 40.87655077879964]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Marble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.91065965862981,\n",
" 40.87655077879964,\n",
" -73.91065965862981,\n",
" 40.87655077879964]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.8',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86731496814176, 40.89827261213805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodlawn',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodlawn',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86731496814176,\n",
" 40.89827261213805,\n",
" -73.86731496814176,\n",
" 40.89827261213805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.9',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8793907395681, 40.87722415599446]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Norwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Norwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8793907395681,\n",
" 40.87722415599446,\n",
" -73.8793907395681,\n",
" 40.87722415599446]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.10',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85744642974207, 40.88103887819211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85744642974207,\n",
" 40.88103887819211,\n",
" -73.85744642974207,\n",
" 40.88103887819211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.11',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83579759808117, 40.866858107252696]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Baychester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Baychester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.83579759808117,\n",
" 40.866858107252696,\n",
" -73.83579759808117,\n",
" 40.866858107252696]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.12',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85475564017999, 40.85741349808865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Parkway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pelham Parkway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85475564017999,\n",
" 40.85741349808865,\n",
" -73.85475564017999,\n",
" 40.85741349808865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.13',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78648845267413, 40.84724670491813]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.78648845267413,\n",
" 40.84724670491813,\n",
" -73.78648845267413,\n",
" 40.84724670491813]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.14',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8855121841913, 40.870185164975325]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bedford',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8855121841913,\n",
" 40.870185164975325,\n",
" -73.8855121841913,\n",
" 40.870185164975325]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.15',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9104159619131, 40.85572707719664]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'University Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'University',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9104159619131,\n",
" 40.85572707719664,\n",
" -73.9104159619131,\n",
" 40.85572707719664]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.16',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91967159119565, 40.84789792606271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morris',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91967159119565,\n",
" 40.84789792606271,\n",
" -73.91967159119565,\n",
" 40.84789792606271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.17',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89642655981623, 40.86099679638654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fordham',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fordham',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.89642655981623,\n",
" 40.86099679638654,\n",
" -73.89642655981623,\n",
" 40.86099679638654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.18',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88735617532338, 40.84269615786053]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Tremont',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Tremont',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88735617532338,\n",
" 40.84269615786053,\n",
" -73.88735617532338,\n",
" 40.84269615786053]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.19',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87774474910545, 40.83947505672653]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Farms',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Farms',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.87774474910545,\n",
" 40.83947505672653,\n",
" -73.87774474910545,\n",
" 40.83947505672653]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.20',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9261020935813, 40.836623010706056]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'High Bridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Highbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9261020935813,\n",
" 40.836623010706056,\n",
" -73.9261020935813,\n",
" 40.836623010706056]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.21',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90942160757436, 40.819754370594936]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Melrose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Melrose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90942160757436,\n",
" 40.819754370594936,\n",
" -73.90942160757436,\n",
" 40.819754370594936]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.22',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91609987487575, 40.80623874935177]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mott Haven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Mott Haven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91609987487575,\n",
" 40.80623874935177,\n",
" -73.91609987487575,\n",
" 40.80623874935177]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.23',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91322139386135, 40.801663627756206]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Morris',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Morris',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91322139386135,\n",
" 40.801663627756206,\n",
" -73.91322139386135,\n",
" 40.801663627756206]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.24',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8957882009446, 40.81509904545822]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Longwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Longwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8957882009446,\n",
" 40.81509904545822,\n",
" -73.8957882009446,\n",
" 40.81509904545822]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.25',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88331505955291, 40.80972987938709]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunts Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunts',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88331505955291,\n",
" 40.80972987938709,\n",
" -73.88331505955291,\n",
" 40.80972987938709]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.26',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90150648943059, 40.82359198585534]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morrisania',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morrisania',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90150648943059,\n",
" 40.82359198585534,\n",
" -73.90150648943059,\n",
" 40.82359198585534]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.27',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86574609554924, 40.821012197914015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soundview',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soundview',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86574609554924,\n",
" 40.821012197914015,\n",
" -73.86574609554924,\n",
" 40.821012197914015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.28',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85414416189266, 40.80655112003589]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clason Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clason',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85414416189266,\n",
" 40.80655112003589,\n",
" -73.85414416189266,\n",
" 40.80655112003589]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.29',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81635002158441, 40.81510925804005]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Throgs Neck',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Throgs Neck',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81635002158441,\n",
" 40.81510925804005,\n",
" -73.81635002158441,\n",
" 40.81510925804005]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.30',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8240992675385, 40.844245936947374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Country Club',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Country',\n",
" 'annoline2': 'Club',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8240992675385,\n",
" 40.844245936947374,\n",
" -73.8240992675385,\n",
" 40.844245936947374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.31',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85600310535783, 40.837937822267286]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Parkchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Parkchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85600310535783,\n",
" 40.837937822267286,\n",
" -73.85600310535783,\n",
" 40.837937822267286]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.32',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84219407604444, 40.8406194964327]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westchester Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Westchester',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84219407604444,\n",
" 40.8406194964327,\n",
" -73.84219407604444,\n",
" 40.8406194964327]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.33',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8662991807561, 40.84360847124718]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Van Nest',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Van',\n",
" 'annoline2': 'Nest',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8662991807561,\n",
" 40.84360847124718,\n",
" -73.8662991807561,\n",
" 40.84360847124718]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.34',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85040178030421, 40.847549063536334]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morris Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85040178030421,\n",
" 40.847549063536334,\n",
" -73.85040178030421,\n",
" 40.847549063536334]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.35',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88845196134804, 40.85727710073895]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belmont',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belmont',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88845196134804,\n",
" 40.85727710073895,\n",
" -73.88845196134804,\n",
" 40.85727710073895]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.36',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91719048210393, 40.88139497727086]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Spuyten Duyvil',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Spuyten',\n",
" 'annoline2': 'Duyvil',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91719048210393,\n",
" 40.88139497727086,\n",
" -73.91719048210393,\n",
" 40.88139497727086]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.37',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90453054908927, 40.90854282950666]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Riverdale',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Riverdale',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90453054908927,\n",
" 40.90854282950666,\n",
" -73.90453054908927,\n",
" 40.90854282950666]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.38',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8320737824047, 40.85064140940335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8320737824047,\n",
" 40.85064140940335,\n",
" -73.8320737824047,\n",
" 40.85064140940335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.39',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82620275994073, 40.82657951686922]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Schuylerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Schuylerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82620275994073,\n",
" 40.82657951686922,\n",
" -73.82620275994073,\n",
" 40.82657951686922]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.40',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81388514428619, 40.821986118163494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgewater Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Edgewater',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81388514428619,\n",
" 40.821986118163494,\n",
" -73.81388514428619,\n",
" 40.821986118163494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.41',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84802729582735, 40.819014376988314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castle Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castle',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84802729582735,\n",
" 40.819014376988314,\n",
" -73.84802729582735,\n",
" 40.819014376988314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.42',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86332361652777, 40.87137078192371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Olinville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Olinville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86332361652777,\n",
" 40.87137078192371,\n",
" -73.86332361652777,\n",
" 40.87137078192371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.43',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84161194831223, 40.86296562477998]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84161194831223,\n",
" 40.86296562477998,\n",
" -73.84161194831223,\n",
" 40.86296562477998]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.44',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91558941773444, 40.83428380733851]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91558941773444,\n",
" 40.83428380733851,\n",
" -73.91558941773444,\n",
" 40.83428380733851]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.45',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85053524451935, 40.82977429787161]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Unionport',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Unionport',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85053524451935,\n",
" 40.82977429787161,\n",
" -73.85053524451935,\n",
" 40.82977429787161]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.46',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84808271877168, 40.88456130303732]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edenwald',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edenwald',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84808271877168,\n",
" 40.88456130303732,\n",
" -73.84808271877168,\n",
" 40.88456130303732]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.47',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03062069353813, 40.625801065010656]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Ridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bay Ridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03062069353813,\n",
" 40.625801065010656,\n",
" -74.03062069353813,\n",
" 40.625801065010656]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.48',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99517998380729, 40.61100890202044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bensonhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bensonhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99517998380729,\n",
" 40.61100890202044,\n",
" -73.99517998380729,\n",
" 40.61100890202044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.49',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01031618527784, 40.64510294925429]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunset Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunset',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01031618527784,\n",
" 40.64510294925429,\n",
" -74.01031618527784,\n",
" 40.64510294925429]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.50',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95424093127393, 40.7302009848647]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenpoint',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenpoint',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95424093127393,\n",
" 40.7302009848647,\n",
" -73.95424093127393,\n",
" 40.7302009848647]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.51',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97347087708445, 40.59526001306593]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gravesend',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gravesend',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97347087708445,\n",
" 40.59526001306593,\n",
" -73.97347087708445,\n",
" 40.59526001306593]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.52',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96509448785336, 40.57682506566604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brighton Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brighton',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96509448785336,\n",
" 40.57682506566604,\n",
" -73.96509448785336,\n",
" 40.57682506566604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.53',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94318640482979, 40.58689012678384]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sheepshead Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sheepshead',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94318640482979,\n",
" 40.58689012678384,\n",
" -73.94318640482979,\n",
" 40.58689012678384]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.54',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95743840559939, 40.61443251335098]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95743840559939,\n",
" 40.61443251335098,\n",
" -73.95743840559939,\n",
" 40.61443251335098]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.55',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95840106533903, 40.63632589026677]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95840106533903,\n",
" 40.63632589026677,\n",
" -73.95840106533903,\n",
" 40.63632589026677]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.56',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94329119073582, 40.67082917695294]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Crown Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Crown',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94329119073582,\n",
" 40.67082917695294,\n",
" -73.94329119073582,\n",
" 40.67082917695294]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.57',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93610256185836, 40.64171776668961]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93610256185836,\n",
" 40.64171776668961,\n",
" -73.93610256185836,\n",
" 40.64171776668961]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.58',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98042110559474, 40.642381958003526]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kensington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kensington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98042110559474,\n",
" 40.642381958003526,\n",
" -73.98042110559474,\n",
" 40.642381958003526]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.59',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98007340430172, 40.65694583575104]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Windsor Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Windsor',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98007340430172,\n",
" 40.65694583575104,\n",
" -73.98007340430172,\n",
" 40.65694583575104]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.60',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9648592426269, 40.676822262254724]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9648592426269,\n",
" 40.676822262254724,\n",
" -73.9648592426269,\n",
" 40.676822262254724]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.61',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91023536176607, 40.66394994339755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brownsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brownsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91023536176607,\n",
" 40.66394994339755,\n",
" -73.91023536176607,\n",
" 40.66394994339755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.62',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95811529220927, 40.70714439344251]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsburg',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsburg',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95811529220927,\n",
" 40.70714439344251,\n",
" -73.95811529220927,\n",
" 40.70714439344251]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.63',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92525797487045, 40.69811611017901]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bushwick',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bushwick',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92525797487045,\n",
" 40.69811611017901,\n",
" -73.92525797487045,\n",
" 40.69811611017901]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.64',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94178488690297, 40.687231607720456]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Stuyvesant',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bedford Stuyvesant',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94178488690297,\n",
" 40.687231607720456,\n",
" -73.94178488690297,\n",
" 40.687231607720456]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.65',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99378225496424, 40.695863722724084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brooklyn Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brooklyn',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99378225496424,\n",
" 40.695863722724084,\n",
" -73.99378225496424,\n",
" 40.695863722724084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.66',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99856139218463, 40.687919722485574]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cobble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cobble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99856139218463,\n",
" 40.687919722485574,\n",
" -73.99856139218463,\n",
" 40.687919722485574]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.67',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99465372828006, 40.680540231076485]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carroll Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carroll',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99465372828006,\n",
" 40.680540231076485,\n",
" -73.99465372828006,\n",
" 40.680540231076485]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.68',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0127589747356, 40.676253230250886]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Red Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Red',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0127589747356,\n",
" 40.676253230250886,\n",
" -74.0127589747356,\n",
" 40.676253230250886]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.69',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99444087145339, 40.673931143187154]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gowanus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gowanus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99444087145339,\n",
" 40.673931143187154,\n",
" -73.99444087145339,\n",
" 40.673931143187154]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.70',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97290574369092, 40.68852726018977]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Greene',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Greene',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97290574369092,\n",
" 40.68852726018977,\n",
" -73.97290574369092,\n",
" 40.68852726018977]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.71',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705030183924, 40.67232052268197]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Slope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Slope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97705030183924,\n",
" 40.67232052268197,\n",
" -73.97705030183924,\n",
" 40.67232052268197]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.72',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87661596457296, 40.68239101144211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cypress Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cypress',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87661596457296,\n",
" 40.68239101144211,\n",
" -73.87661596457296,\n",
" 40.68239101144211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.73',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88069863917366, 40.669925700847045]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East New York',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East New York',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88069863917366,\n",
" 40.669925700847045,\n",
" -73.88069863917366,\n",
" 40.669925700847045]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.74',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87936970045875, 40.64758905230874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Starrett City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Starrett',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87936970045875,\n",
" 40.64758905230874,\n",
" -73.87936970045875,\n",
" 40.64758905230874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.75',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90209269778966, 40.63556432797428]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Canarsie',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Canarsie',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90209269778966,\n",
" 40.63556432797428,\n",
" -73.90209269778966,\n",
" 40.63556432797428]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.76',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92911302644674, 40.630446043757466]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatlands',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatlands',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92911302644674,\n",
" 40.630446043757466,\n",
" -73.92911302644674,\n",
" 40.630446043757466]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.77',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90818571777423, 40.606336421685626]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90818571777423,\n",
" 40.606336421685626,\n",
" -73.90818571777423,\n",
" 40.606336421685626]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.78',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94353722891886, 40.57791350308657]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94353722891886,\n",
" 40.57791350308657,\n",
" -73.94353722891886,\n",
" 40.57791350308657]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.79',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98868295821637, 40.57429256471601]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Coney Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Coney Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98868295821637,\n",
" 40.57429256471601,\n",
" -73.98868295821637,\n",
" 40.57429256471601]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.80',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99875221443519, 40.59951870282238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bath Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bath',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99875221443519,\n",
" 40.59951870282238,\n",
" -73.99875221443519,\n",
" 40.59951870282238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.81',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99049823044811, 40.633130512758015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Borough Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Borough',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99049823044811,\n",
" 40.633130512758015,\n",
" -73.99049823044811,\n",
" 40.633130512758015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.82',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01931375636022, 40.619219457722636]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dyker Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dyker',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01931375636022,\n",
" 40.619219457722636,\n",
" -74.01931375636022,\n",
" 40.619219457722636]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.83',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93010170691196, 40.590848433902046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gerritsen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Gerritsen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93010170691196,\n",
" 40.590848433902046,\n",
" -73.93010170691196,\n",
" 40.590848433902046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.84',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93134404108497, 40.609747779894604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marine Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Marine Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93134404108497,\n",
" 40.609747779894604,\n",
" -73.93134404108497,\n",
" 40.609747779894604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.85',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96784306216367, 40.693229421881504]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96784306216367,\n",
" 40.693229421881504,\n",
" -73.96784306216367,\n",
" 40.693229421881504]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.86',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0078731120024, 40.57637537890224]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sea Gate',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sea',\n",
" 'annoline2': 'Gate',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0078731120024,\n",
" 40.57637537890224,\n",
" -74.0078731120024,\n",
" 40.57637537890224]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.87',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98346337431099, 40.69084402109802]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Downtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Downtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98346337431099,\n",
" 40.69084402109802,\n",
" -73.98346337431099,\n",
" 40.69084402109802]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.88',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98374824115798, 40.685682912091444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Boerum Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Boerum',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98374824115798,\n",
" 40.685682912091444,\n",
" -73.98374824115798,\n",
" 40.685682912091444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.89',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95489867077713, 40.658420017469815]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Lefferts Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Lefferts',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95489867077713,\n",
" 40.658420017469815,\n",
" -73.95489867077713,\n",
" 40.658420017469815]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.90',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91306831787395, 40.678402554795355]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91306831787395,\n",
" 40.678402554795355,\n",
" -73.91306831787395,\n",
" 40.678402554795355]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.91',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86797598081334, 40.67856995727479]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Line',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Line',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.86797598081334,\n",
" 40.67856995727479,\n",
" -73.86797598081334,\n",
" 40.67856995727479]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.92',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89855633630317, 40.61514955045308]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bergen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bergen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.89855633630317,\n",
" 40.61514955045308,\n",
" -73.89855633630317,\n",
" 40.61514955045308]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.93',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95759523489838, 40.62559589869843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95759523489838,\n",
" 40.62559589869843,\n",
" -73.95759523489838,\n",
" 40.62559589869843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.94',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96261316716048, 40.647008603185185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Park South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Park South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96261316716048,\n",
" 40.647008603185185,\n",
" -73.96261316716048,\n",
" 40.647008603185185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.95',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91607483951324, 40.62384524478419]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Georgetown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Georgetown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91607483951324,\n",
" 40.62384524478419,\n",
" -73.91607483951324,\n",
" 40.62384524478419]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.96',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93885815269195, 40.70849241041548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Williamsburg',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Williamsburg',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93885815269195,\n",
" 40.70849241041548,\n",
" -73.93885815269195,\n",
" 40.70849241041548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.97',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95880857587582, 40.714822906532014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'North Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95880857587582,\n",
" 40.714822906532014,\n",
" -73.95880857587582,\n",
" 40.714822906532014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.98',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95800095153331, 40.71086147265064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95800095153331,\n",
" 40.71086147265064,\n",
" -73.95800095153331,\n",
" 40.71086147265064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.99',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96836678035541, 40.61305976667942]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Parkway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Parkway',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96836678035541,\n",
" 40.61305976667942,\n",
" -73.96836678035541,\n",
" 40.61305976667942]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.100',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03197914537984, 40.61476812694226]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Hamilton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Hamilton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03197914537984,\n",
" 40.61476812694226,\n",
" -74.03197914537984,\n",
" 40.61476812694226]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.101',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99427936255978, 40.71561842231432]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chinatown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chinatown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99427936255978,\n",
" 40.71561842231432,\n",
" -73.99427936255978,\n",
" 40.71561842231432]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.102',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93690027985234, 40.85190252555305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Washington Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Washington',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.93690027985234,\n",
" 40.85190252555305,\n",
" -73.93690027985234,\n",
" 40.85190252555305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.103',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92121042203897, 40.86768396449915]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Inwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Inwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.92121042203897,\n",
" 40.86768396449915,\n",
" -73.92121042203897,\n",
" 40.86768396449915]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.104',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94968791883366, 40.823604284811935]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hamilton Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hamilton',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94968791883366,\n",
" 40.823604284811935,\n",
" -73.94968791883366,\n",
" 40.823604284811935]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.105',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9573853935188, 40.8169344294978]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattanville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattanville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9573853935188,\n",
" 40.8169344294978,\n",
" -73.9573853935188,\n",
" 40.8169344294978]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.106',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94321112603905, 40.81597606742414]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Central Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Central',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94321112603905,\n",
" 40.81597606742414,\n",
" -73.94321112603905,\n",
" 40.81597606742414]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.107',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94418223148524, 40.79224946663033]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94418223148524,\n",
" 40.79224946663033,\n",
" -73.94418223148524,\n",
" 40.79224946663033]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.108',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96050763135, 40.775638573301805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96050763135,\n",
" 40.775638573301805,\n",
" -73.96050763135,\n",
" 40.775638573301805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.109',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94711784471826, 40.775929849884875]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Yorkville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Yorkville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94711784471826,\n",
" 40.775929849884875,\n",
" -73.94711784471826,\n",
" 40.775929849884875]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.110',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9588596881376, 40.76811265828733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lenox Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lenox',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9588596881376,\n",
" 40.76811265828733,\n",
" -73.9588596881376,\n",
" 40.76811265828733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.111',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94916769227953, 40.76215960576283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roosevelt Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roosevelt Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 56,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94916769227953,\n",
" 40.76215960576283,\n",
" -73.94916769227953,\n",
" 40.76215960576283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.112',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705923630603, 40.787657998534854]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper West Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'West',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97705923630603,\n",
" 40.787657998534854,\n",
" -73.97705923630603,\n",
" 40.787657998534854]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.113',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98533777001262, 40.77352888942166]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lincoln Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lincoln',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98533777001262,\n",
" 40.77352888942166,\n",
" -73.98533777001262,\n",
" 40.77352888942166]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.114',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99611936309479, 40.75910089146212]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99611936309479,\n",
" 40.75910089146212,\n",
" -73.99611936309479,\n",
" 40.75910089146212]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.115',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98166882730304, 40.75469110270623]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98166882730304,\n",
" 40.75469110270623,\n",
" -73.98166882730304,\n",
" 40.75469110270623]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.116',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97833207924127, 40.748303077252174]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97833207924127,\n",
" 40.748303077252174,\n",
" -73.97833207924127,\n",
" 40.748303077252174]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.117',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00311633472813, 40.744034706747975]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00311633472813,\n",
" 40.744034706747975,\n",
" -74.00311633472813,\n",
" 40.744034706747975]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.118',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99991402945902, 40.72693288536128]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenwich Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Greenwich',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99991402945902,\n",
" 40.72693288536128,\n",
" -73.99991402945902,\n",
" 40.72693288536128]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.119',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98222616506416, 40.727846777270244]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98222616506416,\n",
" 40.727846777270244,\n",
" -73.98222616506416,\n",
" 40.727846777270244]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.120',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98089031999291, 40.71780674892765]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lower East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Lower',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98089031999291,\n",
" 40.71780674892765,\n",
" -73.98089031999291,\n",
" 40.71780674892765]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.121',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01068328559087, 40.721521967443216]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tribeca',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tribeca',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01068328559087,\n",
" 40.721521967443216,\n",
" -74.01068328559087,\n",
" 40.721521967443216]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.122',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99730467208073, 40.71932379395907]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Italy',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Italy',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99730467208073,\n",
" 40.71932379395907,\n",
" -73.99730467208073,\n",
" 40.71932379395907]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.123',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00065666959759, 40.72218384131794]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00065666959759,\n",
" 40.72218384131794,\n",
" -74.00065666959759,\n",
" 40.72218384131794]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.124',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00617998126812, 40.73443393572434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00617998126812,\n",
" 40.73443393572434,\n",
" -74.00617998126812,\n",
" 40.73443393572434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.125',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96428617740655, 40.797307041702865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96428617740655,\n",
" 40.797307041702865,\n",
" -73.96428617740655,\n",
" 40.797307041702865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.126',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96389627905332, 40.807999738165826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morningside Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morningside',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96389627905332,\n",
" 40.807999738165826,\n",
" -73.96389627905332,\n",
" 40.807999738165826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.127',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98137594833541, 40.737209832715]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gramercy',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gramercy',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98137594833541,\n",
" 40.737209832715,\n",
" -73.98137594833541,\n",
" 40.737209832715]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.128',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01686930508617, 40.71193198394565]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Battery Park City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Battery',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01686930508617,\n",
" 40.71193198394565,\n",
" -74.01686930508617,\n",
" 40.71193198394565]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.129',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0106654452127, 40.70710710727048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Financial District',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Financial',\n",
" 'annoline2': 'District',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.0106654452127,\n",
" 40.70710710727048,\n",
" -74.0106654452127,\n",
" 40.70710710727048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.130',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91565374304234, 40.76850859335492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91565374304234,\n",
" 40.76850859335492,\n",
" -73.91565374304234,\n",
" 40.76850859335492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.131',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90184166838284, 40.74634908860222]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90184166838284,\n",
" 40.74634908860222,\n",
" -73.90184166838284,\n",
" 40.74634908860222]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.132',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88282109164365, 40.75198138007367]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jackson Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jackson',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88282109164365,\n",
" 40.75198138007367,\n",
" -73.88282109164365,\n",
" 40.75198138007367]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.133',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88165622288388, 40.744048505122024]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elmhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Elmhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88165622288388,\n",
" 40.744048505122024,\n",
" -73.88165622288388,\n",
" 40.744048505122024]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.134',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8381376460028, 40.65422527738487]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howard Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howard',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8381376460028,\n",
" 40.65422527738487,\n",
" -73.8381376460028,\n",
" 40.65422527738487]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.135',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85682497345258, 40.74238175015667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Corona',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Corona',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85682497345258,\n",
" 40.74238175015667,\n",
" -73.85682497345258,\n",
" 40.74238175015667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.136',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84447500788983, 40.72526378216503]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84447500788983,\n",
" 40.72526378216503,\n",
" -73.84447500788983,\n",
" 40.72526378216503]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.137',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82981905825703, 40.7051790354148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82981905825703,\n",
" 40.7051790354148,\n",
" -73.82981905825703,\n",
" 40.7051790354148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.138',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83183321446887, 40.69794731471763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83183321446887,\n",
" 40.69794731471763,\n",
" -73.83183321446887,\n",
" 40.69794731471763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.139',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83177300329582, 40.76445419697846]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flushing',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flushing',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83177300329582,\n",
" 40.76445419697846,\n",
" -73.83177300329582,\n",
" 40.76445419697846]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.140',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93920223915505, 40.75021734610528]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Long Island City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Long',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93920223915505,\n",
" 40.75021734610528,\n",
" -73.93920223915505,\n",
" 40.75021734610528]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.141',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92691617561577, 40.74017628351924]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92691617561577,\n",
" 40.74017628351924,\n",
" -73.92691617561577,\n",
" 40.74017628351924]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.142',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86704147658772, 40.76407323883091]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Elmhurst',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Elmhurst',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.86704147658772,\n",
" 40.76407323883091,\n",
" -73.86704147658772,\n",
" 40.76407323883091]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.143',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89621713626859, 40.725427374093606]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Maspeth',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Maspeth',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89621713626859,\n",
" 40.725427374093606,\n",
" -73.89621713626859,\n",
" 40.725427374093606]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.144',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90143517559589, 40.70832315613858]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ridgewood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ridgewood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90143517559589,\n",
" 40.70832315613858,\n",
" -73.90143517559589,\n",
" 40.70832315613858]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.145',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87074167435605, 40.70276242967838]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glendale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Glendale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.87074167435605,\n",
" 40.70276242967838,\n",
" -73.87074167435605,\n",
" 40.70276242967838]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.146',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8578268690537, 40.72897409480735]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rego Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rego Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8578268690537,\n",
" 40.72897409480735,\n",
" -73.8578268690537,\n",
" 40.72897409480735]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.147',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8581104655432, 40.68988687915789]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodhaven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodhaven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8581104655432,\n",
" 40.68988687915789,\n",
" -73.8581104655432,\n",
" 40.68988687915789]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.148',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84320266173447, 40.680708468265415]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ozone Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ozone Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84320266173447,\n",
" 40.680708468265415,\n",
" -73.84320266173447,\n",
" 40.680708468265415]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.149',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80986478649041, 40.66854957767195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Ozone Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Ozone Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80986478649041,\n",
" 40.66854957767195,\n",
" -73.80986478649041,\n",
" 40.66854957767195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.150',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84304528896125, 40.784902749260205]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'College Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'College',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84304528896125,\n",
" 40.784902749260205,\n",
" -73.84304528896125,\n",
" 40.784902749260205]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.151',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81420216610863, 40.78129076602694]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Whitestone',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Whitestone',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81420216610863,\n",
" 40.78129076602694,\n",
" -73.81420216610863,\n",
" 40.78129076602694]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.152',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7742736306867, 40.76604063281064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7742736306867,\n",
" 40.76604063281064,\n",
" -73.7742736306867,\n",
" 40.76604063281064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.153',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79176243728061, 40.76172954903262]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Auburndale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Auburndale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79176243728061,\n",
" 40.76172954903262,\n",
" -73.79176243728061,\n",
" 40.76172954903262]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.154',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7388977558074, 40.7708261928267]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Neck',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Neck',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7388977558074,\n",
" 40.7708261928267,\n",
" -73.7388977558074,\n",
" 40.7708261928267]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.155',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7424982072733, 40.76684609790763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Douglaston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Douglaston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7424982072733,\n",
" 40.76684609790763,\n",
" -73.7424982072733,\n",
" 40.76684609790763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.156',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.71548118999145, 40.74944079974332]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glen Oaks',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Glen',\n",
" 'annoline2': 'Oaks',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.71548118999145,\n",
" 40.74944079974332,\n",
" -73.71548118999145,\n",
" 40.74944079974332]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.157',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.72012814826903, 40.72857318176675]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellerose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellerose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.72012814826903,\n",
" 40.72857318176675,\n",
" -73.72012814826903,\n",
" 40.72857318176675]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.158',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82087764933566, 40.722578244228046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens Hills',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': 'Hills',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82087764933566,\n",
" 40.722578244228046,\n",
" -73.82087764933566,\n",
" 40.722578244228046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.159',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78271337003264, 40.7343944653313]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fresh Meadows',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fresh',\n",
" 'annoline2': 'Meadows',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.78271337003264,\n",
" 40.7343944653313,\n",
" -73.78271337003264,\n",
" 40.7343944653313]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.160',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81174822458634, 40.71093547252271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Briarwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Briarwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81174822458634,\n",
" 40.71093547252271,\n",
" -73.81174822458634,\n",
" 40.71093547252271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.161',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79690165888289, 40.70465736068717]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79690165888289,\n",
" 40.70465736068717,\n",
" -73.79690165888289,\n",
" 40.70465736068717]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.162',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75494976234332, 40.74561857141855]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakland Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Oakland',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75494976234332,\n",
" 40.74561857141855,\n",
" -73.75494976234332,\n",
" 40.74561857141855]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.163',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73871484578424, 40.718893092167356]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queens Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queens',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73871484578424,\n",
" 40.718893092167356,\n",
" -73.73871484578424,\n",
" 40.718893092167356]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.164',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75925009335594, 40.71124344191904]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hollis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hollis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75925009335594,\n",
" 40.71124344191904,\n",
" -73.75925009335594,\n",
" 40.71124344191904]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.165',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7904261313554, 40.696911253789885]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Jamaica',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Jamaica',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7904261313554,\n",
" 40.696911253789885,\n",
" -73.7904261313554,\n",
" 40.696911253789885]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.166',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75867603727717, 40.69444538522359]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. Albans',\n",
" 'stacked': 1,\n",
" 'annoline1': 'St. Albans',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75867603727717,\n",
" 40.69444538522359,\n",
" -73.75867603727717,\n",
" 40.69444538522359]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.167',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77258787620906, 40.67521139591733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rochdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rochdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77258787620906,\n",
" 40.67521139591733,\n",
" -73.77258787620906,\n",
" 40.67521139591733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.168',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76042092682287, 40.666230490368584]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Springfield Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Springfield',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76042092682287,\n",
" 40.666230490368584,\n",
" -73.76042092682287,\n",
" 40.666230490368584]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.169',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526873708026, 40.692774639160845]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cambria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cambria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526873708026,\n",
" 40.692774639160845,\n",
" -73.73526873708026,\n",
" 40.692774639160845]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.170',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526079428278, 40.659816433428084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosedale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosedale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526079428278,\n",
" 40.659816433428084,\n",
" -73.73526079428278,\n",
" 40.659816433428084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.171',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75497968043872, 40.603134432500894]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Far Rockaway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Far Rockaway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75497968043872,\n",
" 40.603134432500894,\n",
" -73.75497968043872,\n",
" 40.603134432500894]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.172',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8200548911032, 40.60302658351238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broad Channel',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broad',\n",
" 'annoline2': 'Channel',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8200548911032,\n",
" 40.60302658351238,\n",
" -73.8200548911032,\n",
" 40.60302658351238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.173',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92551196994168, 40.55740128845452]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Breezy Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Breezy',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92551196994168,\n",
" 40.55740128845452,\n",
" -73.92551196994168,\n",
" 40.55740128845452]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.174',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90228960391673, 40.775923015642896]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Steinway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Steinway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90228960391673,\n",
" 40.775923015642896,\n",
" -73.90228960391673,\n",
" 40.775923015642896]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.175',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80436451720988, 40.79278140360048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Beechhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Beechhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80436451720988,\n",
" 40.79278140360048,\n",
" -73.80436451720988,\n",
" 40.79278140360048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.176',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7768022262158, 40.782842806245554]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7768022262158,\n",
" 40.782842806245554,\n",
" -73.7768022262158,\n",
" 40.782842806245554]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.177',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77613282391705, 40.595641807368494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgemere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edgemere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77613282391705,\n",
" 40.595641807368494,\n",
" -73.77613282391705,\n",
" 40.595641807368494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.178',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79199233136943, 40.58914394372971]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arverne',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arverne',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79199233136943,\n",
" 40.58914394372971,\n",
" -73.79199233136943,\n",
" 40.58914394372971]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.179',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82236121088751, 40.582801696845586]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Rockaway',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82236121088751,\n",
" 40.582801696845586,\n",
" -73.82236121088751,\n",
" 40.582801696845586]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.180',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85754672410827, 40.572036730217015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Neponsit',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Neponsit',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85754672410827,\n",
" 40.572036730217015,\n",
" -73.85754672410827,\n",
" 40.572036730217015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.181',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81276269135866, 40.764126122614066]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81276269135866,\n",
" 40.764126122614066,\n",
" -73.81276269135866,\n",
" 40.764126122614066]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.182',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.70884705889246, 40.741378421945434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Floral Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Floral Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.70884705889246,\n",
" 40.741378421945434,\n",
" -73.70884705889246,\n",
" 40.741378421945434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.183',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76714166714729, 40.7209572076444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Holliswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Holliswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76714166714729,\n",
" 40.7209572076444,\n",
" -73.76714166714729,\n",
" 40.7209572076444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.184',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7872269693666, 40.71680483014613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Estates',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Estates',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7872269693666,\n",
" 40.71680483014613,\n",
" -73.7872269693666,\n",
" 40.71680483014613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.185',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82580915110559, 40.7445723092867]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensboro Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queensboro',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82580915110559,\n",
" 40.7445723092867,\n",
" -73.82580915110559,\n",
" 40.7445723092867]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.186',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79760300912672, 40.723824901829204]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hillcrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hillcrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79760300912672,\n",
" 40.723824901829204,\n",
" -73.79760300912672,\n",
" 40.723824901829204]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.187',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93157506072878, 40.761704526054146]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ravenswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ravenswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93157506072878,\n",
" 40.761704526054146,\n",
" -73.93157506072878,\n",
" 40.761704526054146]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.188',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84963782402441, 40.66391841925139]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lindenwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Lindenwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84963782402441,\n",
" 40.66391841925139,\n",
" -73.84963782402441,\n",
" 40.66391841925139]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.189',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.74025607989822, 40.66788389660247]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Laurelton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Laurelton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.74025607989822,\n",
" 40.66788389660247,\n",
" -73.74025607989822,\n",
" 40.66788389660247]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.190',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8625247141374, 40.736074570830795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lefrak City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lefrak',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8625247141374,\n",
" 40.736074570830795,\n",
" -73.8625247141374,\n",
" 40.736074570830795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.191',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8540175039252, 40.57615556543109]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belle Harbor',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belle Harbor',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8540175039252,\n",
" 40.57615556543109,\n",
" -73.8540175039252,\n",
" 40.57615556543109]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.192',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84153370226186, 40.58034295646131]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rockaway Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84153370226186,\n",
" 40.58034295646131,\n",
" -73.84153370226186,\n",
" 40.58034295646131]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.193',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79664750844047, 40.59771061565768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Somerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Somerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79664750844047,\n",
" 40.59771061565768,\n",
" -73.79664750844047,\n",
" 40.59771061565768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.194',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75175310731153, 40.66000322733613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brookville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brookville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75175310731153,\n",
" 40.66000322733613,\n",
" -73.75175310731153,\n",
" 40.66000322733613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.195',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73889198912481, 40.73301404027834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellaire',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellaire',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73889198912481,\n",
" 40.73301404027834,\n",
" -73.73889198912481,\n",
" 40.73301404027834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.196',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85751790676447, 40.7540709990489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Corona',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Corona',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85751790676447,\n",
" 40.7540709990489,\n",
" -73.85751790676447,\n",
" 40.7540709990489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.197',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8410221123401, 40.7146110815117]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8410221123401,\n",
" 40.7146110815117,\n",
" -73.8410221123401,\n",
" 40.7146110815117]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.198',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07935312512797, 40.6449815710044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. George',\n",
" 'stacked': 2,\n",
" 'annoline1': 'St.',\n",
" 'annoline2': 'George',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07935312512797,\n",
" 40.6449815710044,\n",
" -74.07935312512797,\n",
" 40.6449815710044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.199',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08701650516625, 40.64061455913511]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08701650516625,\n",
" 40.64061455913511,\n",
" -74.08701650516625,\n",
" 40.64061455913511]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.200',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07790192660066, 40.62692762538176]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stapleton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Stapleton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07790192660066,\n",
" 40.62692762538176,\n",
" -74.07790192660066,\n",
" 40.62692762538176]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.201',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06980526716141, 40.61530494652761]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosebank',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosebank',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06980526716141,\n",
" 40.61530494652761,\n",
" -74.06980526716141,\n",
" 40.61530494652761]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.202',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1071817826561, 40.63187892654607]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1071817826561,\n",
" 40.63187892654607,\n",
" -74.1071817826561,\n",
" 40.63187892654607]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.203',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08724819983729, 40.624184791313006]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grymes Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grymes',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08724819983729,\n",
" 40.624184791313006,\n",
" -74.08724819983729,\n",
" 40.624184791313006]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.204',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1113288180088, 40.59706851814673]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Todt Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Todt',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1113288180088,\n",
" 40.59706851814673,\n",
" -74.1113288180088,\n",
" 40.59706851814673]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.205',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0795529253982, 40.58024741350956]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0795529253982,\n",
" 40.58024741350956,\n",
" -74.0795529253982,\n",
" 40.58024741350956]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.206',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12943426797008, 40.63366930554365]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Richmond',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Richmond',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12943426797008,\n",
" 40.63366930554365,\n",
" -74.12943426797008,\n",
" 40.63366930554365]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.207',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15008537046981, 40.632546390481124]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Mariner's Harbor\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Mariner's\",\n",
" 'annoline2': 'Harbor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15008537046981,\n",
" 40.632546390481124,\n",
" -74.15008537046981,\n",
" 40.632546390481124]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.208',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17464532993542, 40.63968297845542]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Ivory',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Ivory',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17464532993542,\n",
" 40.63968297845542,\n",
" -74.17464532993542,\n",
" 40.63968297845542]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.209',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.11918058534842, 40.61333593766742]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castleton Corners',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castleton',\n",
" 'annoline2': 'Corners',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.11918058534842,\n",
" 40.61333593766742,\n",
" -74.11918058534842,\n",
" 40.61333593766742]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.210',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16496031329827, 40.594252379161695]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Springville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Springville',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16496031329827,\n",
" 40.594252379161695,\n",
" -74.16496031329827,\n",
" 40.594252379161695]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.211',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19073717538116, 40.58631375103281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Travis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Travis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19073717538116,\n",
" 40.58631375103281,\n",
" -74.19073717538116,\n",
" 40.58631375103281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.212',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1164794360638, 40.57257231820632]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1164794360638,\n",
" 40.57257231820632,\n",
" -74.1164794360638,\n",
" 40.57257231820632]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.213',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12156593771896, 40.5584622432888]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Oakwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12156593771896,\n",
" 40.5584622432888,\n",
" -74.12156593771896,\n",
" 40.5584622432888]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.214',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.14932381490992, 40.549480228713605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Great Kills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Great',\n",
" 'annoline2': 'Kills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.14932381490992,\n",
" 40.549480228713605,\n",
" -74.14932381490992,\n",
" 40.549480228713605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.215',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1643308041936, 40.542230747450745]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eltingville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eltingville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1643308041936,\n",
" 40.542230747450745,\n",
" -74.1643308041936,\n",
" 40.542230747450745]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.216',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17854866165878, 40.53811417474507]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Annadale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Annadale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17854866165878,\n",
" 40.53811417474507,\n",
" -74.17854866165878,\n",
" 40.53811417474507]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.217',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20524582480326, 40.541967622888755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodrow',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodrow',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20524582480326,\n",
" 40.541967622888755,\n",
" -74.20524582480326,\n",
" 40.541967622888755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.218',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.24656934235283, 40.50533376115642]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tottenville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tottenville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.24656934235283,\n",
" 40.50533376115642,\n",
" -74.24656934235283,\n",
" 40.50533376115642]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.219',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08055351790115, 40.637316067110326]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tompkinsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tompkinsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08055351790115,\n",
" 40.637316067110326,\n",
" -74.08055351790115,\n",
" 40.637316067110326]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.220',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09629029235458, 40.61919310792676]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Silver Lake',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Silver',\n",
" 'annoline2': 'Lake',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09629029235458,\n",
" 40.61919310792676,\n",
" -74.09629029235458,\n",
" 40.61919310792676]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.221',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0971255217853, 40.61276015756489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0971255217853,\n",
" 40.61276015756489,\n",
" -74.0971255217853,\n",
" 40.61276015756489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.222',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96101312466779, 40.643675183340974]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ditmas Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ditmas',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96101312466779,\n",
" 40.643675183340974,\n",
" -73.96101312466779,\n",
" 40.643675183340974]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.223',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93718680559314, 40.66094656188111]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wingate',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wingate',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93718680559314,\n",
" 40.66094656188111,\n",
" -73.93718680559314,\n",
" 40.66094656188111]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.224',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92688212616955, 40.655572313280764]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rugby',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rugby',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92688212616955,\n",
" 40.655572313280764,\n",
" -73.92688212616955,\n",
" 40.655572313280764]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.225',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08015734936296, 40.60919044434558]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08015734936296,\n",
" 40.60919044434558,\n",
" -74.08015734936296,\n",
" 40.60919044434558]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.226',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13304143951704, 40.62109047275409]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westerleigh',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Westerleigh',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13304143951704,\n",
" 40.62109047275409,\n",
" -74.13304143951704,\n",
" 40.62109047275409]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.227',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15315246387762, 40.620171512231884]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Graniteville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Graniteville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15315246387762,\n",
" 40.620171512231884,\n",
" -74.15315246387762,\n",
" 40.620171512231884]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.228',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16510420241124, 40.63532509911492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arlington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arlington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16510420241124,\n",
" 40.63532509911492,\n",
" -74.16510420241124,\n",
" 40.63532509911492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.229',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06712363225574, 40.596312571276734]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arrochar',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arrochar',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06712363225574,\n",
" 40.596312571276734,\n",
" -74.06712363225574,\n",
" 40.596312571276734]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.230',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0766743627905, 40.59826835959991]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grasmere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Grasmere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0766743627905,\n",
" 40.59826835959991,\n",
" -74.0766743627905,\n",
" 40.59826835959991]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.231',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08751118005578, 40.59632891379513]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Old Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Old',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08751118005578,\n",
" 40.59632891379513,\n",
" -74.08751118005578,\n",
" 40.59632891379513]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.232',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09639905312521, 40.588672948199275]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dongan Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dongan',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09639905312521,\n",
" 40.588672948199275,\n",
" -74.09639905312521,\n",
" 40.588672948199275]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.233',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09348266303591, 40.57352690574283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midland Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midland',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09348266303591,\n",
" 40.57352690574283,\n",
" -74.09348266303591,\n",
" 40.57352690574283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.234',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10585598545434, 40.57621558711788]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grant City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grant',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10585598545434,\n",
" 40.57621558711788,\n",
" -74.10585598545434,\n",
" 40.57621558711788]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.235',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10432707469124, 40.56425549307335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp Beach',\n",
" 'stacked': 3,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': 'Beach',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10432707469124,\n",
" 40.56425549307335,\n",
" -74.10432707469124,\n",
" 40.56425549307335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.236',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13916622175768, 40.55398800858462]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13916622175768,\n",
" 40.55398800858462,\n",
" -74.13916622175768,\n",
" 40.55398800858462]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.237',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19174105747814, 40.531911920489605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Huguenot',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Huguenot',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19174105747814,\n",
" 40.531911920489605,\n",
" -74.19174105747814,\n",
" 40.531911920489605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.238',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21983106616777, 40.524699376118136]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pleasant Plains',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pleasant',\n",
" 'annoline2': 'Plains',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21983106616777,\n",
" 40.524699376118136,\n",
" -74.21983106616777,\n",
" 40.524699376118136]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.239',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22950350260027, 40.50608165346305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Butler Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Butler',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22950350260027,\n",
" 40.50608165346305,\n",
" -74.22950350260027,\n",
" 40.50608165346305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.240',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.23215775896526, 40.53053148283314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Charleston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Charleston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.23215775896526,\n",
" 40.53053148283314,\n",
" -74.23215775896526,\n",
" 40.53053148283314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.241',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21572851113952, 40.54940400650072]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rossville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rossville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21572851113952,\n",
" 40.54940400650072,\n",
" -74.21572851113952,\n",
" 40.54940400650072]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.242',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18588674583893, 40.54928582278321]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arden Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Arden',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18588674583893,\n",
" 40.54928582278321,\n",
" -74.18588674583893,\n",
" 40.54928582278321]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.243',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17079414786092, 40.555295236173194]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17079414786092,\n",
" 40.555295236173194,\n",
" -74.17079414786092,\n",
" 40.555295236173194]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.244',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15902208156601, 40.58913894875281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Heartland Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Heartland',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15902208156601,\n",
" 40.58913894875281,\n",
" -74.15902208156601,\n",
" 40.58913894875281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.245',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1895604551969, 40.59472602746295]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1895604551969,\n",
" 40.59472602746295,\n",
" -74.1895604551969,\n",
" 40.59472602746295]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.246',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18725638381567, 40.60577868452358]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bloomfield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bloomfield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18725638381567,\n",
" 40.60577868452358,\n",
" -74.18725638381567,\n",
" 40.60577868452358]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.247',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15940948657122, 40.6095918004203]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bulls Head',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bulls',\n",
" 'annoline2': 'Head',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15940948657122,\n",
" 40.6095918004203,\n",
" -74.15940948657122,\n",
" 40.6095918004203]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.248',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95325646837112, 40.7826825671257]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carnegie Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carnegie',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.95325646837112,\n",
" 40.7826825671257,\n",
" -73.95325646837112,\n",
" 40.7826825671257]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.249',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98843368023597, 40.72325901885768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Noho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Noho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98843368023597,\n",
" 40.72325901885768,\n",
" -73.98843368023597,\n",
" 40.72325901885768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.250',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00541529873355, 40.71522892046282]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Civic Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Civic',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00541529873355,\n",
" 40.71522892046282,\n",
" -74.00541529873355,\n",
" 40.71522892046282]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.251',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98871313285247, 40.7485096643122]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': 'South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98871313285247,\n",
" 40.7485096643122,\n",
" -73.98871313285247,\n",
" 40.7485096643122]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.252',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1340572986257, 40.56960594275505]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1340572986257,\n",
" 40.56960594275505,\n",
" -74.1340572986257,\n",
" 40.56960594275505]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.253',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06667766061771, 40.60971934079284]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Shore Acres',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Shore',\n",
" 'annoline2': 'Acres',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06667766061771,\n",
" 40.60971934079284,\n",
" -74.06667766061771,\n",
" 40.60971934079284]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.254',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.072642445484, 40.61917845202843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clifton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clifton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.072642445484,\n",
" 40.61917845202843,\n",
" -74.072642445484,\n",
" 40.61917845202843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.255',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08402364740358, 40.6044731896879]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concord',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concord',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08402364740358,\n",
" 40.6044731896879,\n",
" -74.08402364740358,\n",
" 40.6044731896879]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.256',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09776206972522, 40.606794394801]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Emerson Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Emerson',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09776206972522,\n",
" 40.606794394801,\n",
" -74.09776206972522,\n",
" 40.606794394801]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.257',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09805062373887, 40.63563000681151]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Randall Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Randall',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09805062373887,\n",
" 40.63563000681151,\n",
" -74.09805062373887,\n",
" 40.63563000681151]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.258',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18622331749823, 40.63843283794795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howland Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howland',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18622331749823,\n",
" 40.63843283794795,\n",
" -74.18622331749823,\n",
" 40.63843283794795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.259',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1418167896889, 40.630146741193826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elm Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Elm',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1418167896889,\n",
" 40.630146741193826,\n",
" -74.1418167896889,\n",
" 40.630146741193826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.260',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91665331978048, 40.652117451793494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Remsen Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Remsen',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91665331978048,\n",
" 40.652117451793494,\n",
" -73.91665331978048,\n",
" 40.652117451793494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.261',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88511776379292, 40.6627442796966]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Lots',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Lots',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88511776379292,\n",
" 40.6627442796966,\n",
" -73.88511776379292,\n",
" 40.6627442796966]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.262',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90233474295836, 40.63131755039667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Paerdegat Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Paerdegat',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90233474295836,\n",
" 40.63131755039667,\n",
" -73.90233474295836,\n",
" 40.63131755039667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.263',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91515391550404, 40.61597423962336]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91515391550404,\n",
" 40.61597423962336,\n",
" -73.91515391550404,\n",
" 40.61597423962336]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.264',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79646462081593, 40.71145964370482]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79646462081593,\n",
" 40.71145964370482,\n",
" -73.79646462081593,\n",
" 40.71145964370482]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.265',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79671678028349, 40.73350025429757]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Utopia',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Utopia',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79671678028349,\n",
" 40.73350025429757,\n",
" -73.79671678028349,\n",
" 40.73350025429757]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.266',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80486120040537, 40.73493618075478]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pomonok',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pomonok',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80486120040537,\n",
" 40.73493618075478,\n",
" -73.80486120040537,\n",
" 40.73493618075478]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.267',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89467996270574, 40.7703173929982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89467996270574,\n",
" 40.7703173929982,\n",
" -73.89467996270574,\n",
" 40.7703173929982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.268',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90119903387667, 40.83142834161548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Claremont Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Claremont',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90119903387667,\n",
" 40.83142834161548,\n",
" -73.90119903387667,\n",
" 40.83142834161548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.269',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91584652759009, 40.824780490842905]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91584652759009,\n",
" 40.824780490842905,\n",
" -73.91584652759009,\n",
" 40.824780490842905]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.270',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91655551964419, 40.84382617671654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Eden',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Eden',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91655551964419,\n",
" 40.84382617671654,\n",
" -73.91655551964419,\n",
" 40.84382617671654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.271',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90829930881988, 40.84884160724665]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Hope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Hope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90829930881988,\n",
" 40.84884160724665,\n",
" -73.90829930881988,\n",
" 40.84884160724665]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.272',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96355614094303, 40.76028033131374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sutton Place',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sutton',\n",
" 'annoline2': 'Place',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96355614094303,\n",
" 40.76028033131374,\n",
" -73.96355614094303,\n",
" 40.76028033131374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.273',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95386782130745, 40.743414090073536]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunters Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunters',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.95386782130745,\n",
" 40.743414090073536,\n",
" -73.95386782130745,\n",
" 40.743414090073536]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.274',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96770824581834, 40.75204236950722]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Turtle Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Turtle',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96770824581834,\n",
" 40.75204236950722,\n",
" -73.96770824581834,\n",
" 40.75204236950722]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.275',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97121928722265, 40.746917410740195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tudor City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Tudor',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97121928722265,\n",
" 40.746917410740195,\n",
" -73.97121928722265,\n",
" 40.746917410740195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.276',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97405170469203, 40.73099955477061]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stuyvesant Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Stuyvesant',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97405170469203,\n",
" 40.73099955477061,\n",
" -73.97405170469203,\n",
" 40.73099955477061]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.277',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9909471052826, 40.739673047638426]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatiron',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatiron',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9909471052826,\n",
" 40.739673047638426,\n",
" -73.9909471052826,\n",
" 40.739673047638426]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.278',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91819286431682, 40.74565180608076]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91819286431682,\n",
" 40.74565180608076,\n",
" -73.91819286431682,\n",
" 40.74565180608076]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.279',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93244235260178, 40.73725071694497]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Blissville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Blissville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93244235260178,\n",
" 40.73725071694497,\n",
" -73.93244235260178,\n",
" 40.73725071694497]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.280',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99550751888415, 40.70328109093014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fulton Ferry',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fulton',\n",
" 'annoline2': 'Ferry',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99550751888415,\n",
" 40.70328109093014,\n",
" -73.99550751888415,\n",
" 40.70328109093014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.281',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98111603592393, 40.70332149882874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Vinegar Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Vinegar',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98111603592393,\n",
" 40.70332149882874,\n",
" -73.98111603592393,\n",
" 40.70332149882874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.282',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93053108817338, 40.67503986503237]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Weeksville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Weeksville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93053108817338,\n",
" 40.67503986503237,\n",
" -73.93053108817338,\n",
" 40.67503986503237]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.283',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90331684852599, 40.67786104769531]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broadway Junction',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broadway',\n",
" 'annoline2': 'Junction',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90331684852599,\n",
" 40.67786104769531,\n",
" -73.90331684852599,\n",
" 40.67786104769531]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.284',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9887528074504, 40.70317632822692]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dumbo',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Dumbo',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9887528074504,\n",
" 40.70317632822692,\n",
" -73.9887528074504,\n",
" 40.70317632822692]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.285',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12059399718001, 40.60180957631444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manor Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manor',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12059399718001,\n",
" 40.60180957631444,\n",
" -74.12059399718001,\n",
" 40.60180957631444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.286',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13208447484298, 40.60370692627371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Willowbrook',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Willowbrook',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13208447484298,\n",
" 40.60370692627371,\n",
" -74.13208447484298,\n",
" 40.60370692627371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.287',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21776636068567, 40.541139922091766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sandy Ground',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sandy',\n",
" 'annoline2': 'Ground',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21776636068567,\n",
" 40.541139922091766,\n",
" -74.21776636068567,\n",
" 40.541139922091766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.288',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12727240604946, 40.579118742961214]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Egbertville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Egbertville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12727240604946,\n",
" 40.579118742961214,\n",
" -74.12727240604946,\n",
" 40.579118742961214]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.289',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89213760232822, 40.56737588957032]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roxbury',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roxbury',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89213760232822,\n",
" 40.56737588957032,\n",
" -73.89213760232822,\n",
" 40.56737588957032]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.290',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95918459428702, 40.598525095137255]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Homecrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Homecrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95918459428702,\n",
" 40.598525095137255,\n",
" -73.95918459428702,\n",
" 40.598525095137255]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.291',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88114319200604, 40.716414511158185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Middle Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Middle',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88114319200604,\n",
" 40.716414511158185,\n",
" -73.88114319200604,\n",
" 40.716414511158185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.292',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20152556457658, 40.52626406734812]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Prince's Bay\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Prince's\",\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20152556457658,\n",
" 40.52626406734812,\n",
" -74.20152556457658,\n",
" 40.52626406734812]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.293',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13792663771568, 40.57650629379489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lighthouse Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lighthouse',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13792663771568,\n",
" 40.57650629379489,\n",
" -74.13792663771568,\n",
" 40.57650629379489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.294',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22957080626941, 40.51954145748909]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22957080626941,\n",
" 40.51954145748909,\n",
" -74.22957080626941,\n",
" 40.51954145748909]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.295',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82667757138641, 40.79060155670148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Malba',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Malba',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82667757138641,\n",
" 40.79060155670148,\n",
" -73.82667757138641,\n",
" 40.79060155670148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.296',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.890345709872, 40.6819989345173]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Highland Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Highland',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.890345709872,\n",
" 40.6819989345173,\n",
" -73.890345709872,\n",
" 40.6819989345173]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.297',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94841515328893, 40.60937770113766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Madison',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Madison',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94841515328893,\n",
" 40.60937770113766,\n",
" -73.94841515328893,\n",
" 40.60937770113766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.298',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86172577555115, 40.85272297633017]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bronxdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bronxdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86172577555115,\n",
" 40.85272297633017,\n",
" -73.86172577555115,\n",
" 40.85272297633017]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.299',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85931863221647, 40.86578787802982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Allerton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Allerton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85931863221647,\n",
" 40.86578787802982,\n",
" -73.85931863221647,\n",
" 40.86578787802982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.300',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90152264513144, 40.8703923914147]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90152264513144,\n",
" 40.8703923914147,\n",
" -73.90152264513144,\n",
" 40.8703923914147]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.301',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94817709920184, 40.64692606658579]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Erasmus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Erasmus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94817709920184,\n",
" 40.64692606658579,\n",
" -73.94817709920184,\n",
" 40.64692606658579]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.302',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00011136202637, 40.75665808227519]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hudson Yards',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hudson',\n",
" 'annoline2': 'Yards',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00011136202637,\n",
" 40.75665808227519,\n",
" -74.00011136202637,\n",
" 40.75665808227519]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.303',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80553002968718, 40.58733774018741]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hammels',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hammels',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80553002968718,\n",
" 40.58733774018741,\n",
" -73.80553002968718,\n",
" 40.58733774018741]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.304',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76596781445627, 40.611321691283834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayswater',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayswater',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76596781445627,\n",
" 40.611321691283834,\n",
" -73.76596781445627,\n",
" 40.611321691283834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.305',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94563070334091, 40.756091297094706]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Queensbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.94563070334091,\n",
" 40.756091297094706,\n",
" -73.94563070334091,\n",
" 40.756091297094706]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.306',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08173992211962, 40.61731079252983]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fox Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fox',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08173992211962,\n",
" 40.61731079252983,\n",
" -74.08173992211962,\n",
" 40.61731079252983]}}],\n",
" 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n",
" 'bbox': [-74.2492599487305,\n",
" 40.5033187866211,\n",
" -73.7061614990234,\n",
" 40.9105606079102]}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newyork_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": 7,
"metadata": {},
"outputs": [],
"source": [
"neighborhoods_data = newyork_data['features']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the first item in this list."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods_data[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tranform the data into a *pandas* dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next task is essentially transforming this data of nested Python dictionaries into a *pandas* dataframe. So let's start by creating an empty dataframe."
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": "markdown",
"metadata": {},
"source": [
"Take a look at the empty dataframe to confirm that the columns are as intended."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Borough, Neighborhood, Latitude, Longitude]\n",
"Index: []"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then let's loop through the data and fill the dataframe one row at a time."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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": "markdown",
"metadata": {},
"source": [
"Quickly examine the resulting dataframe."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>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": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And make sure that the dataset has all 5 boroughs and 306 neighborhoods."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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 geopy library to get the latitude and longitude values of New York City."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"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=\"ny_explorer\")\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": "markdown",
"metadata": {},
"source": [
"#### Create a map of New York with neighborhoods superimposed on top."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNTJkMWE0YWNmMDBkNDkxYjg4NzkxN2M3YTIzMGIxNzMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyM2NhZjM4MTFhNTQzNzRiN2IzMDY2OWU4YmI2NDhhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhhOTE1MzMyNmE5NzQ0NjQ4YjkyMWMzNDg5N2Q0ZWU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkMTQyZTQ0MWFjYzRmYThhNjExMGMwYjQxYjQ3MjQ1ID0gJCgnPGRpdiBpZD0iaHRtbF83ZDE0MmU0NDFhY2M0ZmE4YTYxMTBjMGI0MWI0NzI0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGE5MTUzMzI2YTk3NDQ2NDhiOTIxYzM0ODk3ZDRlZTcuc2V0Q29udGVudChodG1sXzdkMTQyZTQ0MWFjYzRmYThhNjExMGMwYjQxYjQ3MjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyM2NhZjM4MTFhNTQzNzRiN2IzMDY2OWU4YmI2NDhhLmJpbmRQb3B1cChwb3B1cF84YTkxNTMzMjZhOTc0NDY0OGI5MjFjMzQ4OTdkNGVlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzRiYWI3ODNkNzk0MzU2OTkzY2UzMmRiMDc1ZTE1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTViZDljYmU2MGQ0OTVkYTY5NWIyZGQ3OGJlMTJkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMmNmZjU4NDMwNWE0NjRlYTE1NzIzZGUyNzIyZDIzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjJjZmY1ODQzMDVhNDY0ZWExNTcyM2RlMjcyMmQyMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTViZDljYmU2MGQ0OTVkYTY5NWIyZGQ3OGJlMTJkOS5zZXRDb250ZW50KGh0bWxfYjJjZmY1ODQzMDVhNDY0ZWExNTcyM2RlMjcyMmQyMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDM0YmFiNzgzZDc5NDM1Njk5M2NlMzJkYjA3NWUxNTYuYmluZFBvcHVwKHBvcHVwX2E1NWJkOWNiZTYwZDQ5NWRhNjk1YjJkZDc4YmUxMmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2MTg1MTJjZDdlZTQ4MTE5ZDQ5OGE4M2QxZjY0MmFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YTIyY2E1OWEyMjU0Yjg5OWEwNjMyM2RjOWQyZjQ0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOWJhNGE3NGQ1M2M0YjRlOWM2M2E5ZDJiNjRmZGY4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjliYTRhNzRkNTNjNGI0ZTljNjNhOWQyYjY0ZmRmODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2EyMmNhNTlhMjI1NGI4OTlhMDYzMjNkYzlkMmY0NGMuc2V0Q29udGVudChodG1sX2Y5YmE0YTc0ZDUzYzRiNGU5YzYzYTlkMmI2NGZkZjgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2MTg1MTJjZDdlZTQ4MTE5ZDQ5OGE4M2QxZjY0MmFlLmJpbmRQb3B1cChwb3B1cF83YTIyY2E1OWEyMjU0Yjg5OWEwNjMyM2RjOWQyZjQ0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjBlYjYzYWU5Y2E0NmFkOThiYzA3Yzc4MTQ0MGI3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NmU2NzkxM2ExMDk0MjQ1ODZlMWI2OTU2NmUyMjdjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ODRmZDAwY2Y4Yzk0MDU0OGU2N2VkNTg1OGQzMDA5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfODg0ZmQwMGNmOGM5NDA1NDhlNjdlZDU4NThkMzAwOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2ZTY3OTEzYTEwOTQyNDU4NmUxYjY5NTY2ZTIyN2NkLnNldENvbnRlbnQoaHRtbF84ODRmZDAwY2Y4Yzk0MDU0OGU2N2VkNTg1OGQzMDA5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YjBlYjYzYWU5Y2E0NmFkOThiYzA3Yzc4MTQ0MGI3OS5iaW5kUG9wdXAocG9wdXBfNzZlNjc5MTNhMTA5NDI0NTg2ZTFiNjk1NjZlMjI3Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGVkZGU4ZjI3MDk4NDJmZGE0NGU4NzU4NzliMjkwNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjZlMzc5ZmI5Y2FlNDZiYjhkYjJmNTNkNThiMDdjMDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzU1N2ViMWM0MzI5NDE1ZmFmOTAxMTdkMzRkY2IzODQgPSAkKCc8ZGl2IGlkPSJodG1sX2M1NTdlYjFjNDMyOTQxNWZhZjkwMTE3ZDM0ZGNiMzg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmUzNzlmYjljYWU0NmJiOGRiMmY1M2Q1OGIwN2MwNy5zZXRDb250ZW50KGh0bWxfYzU1N2ViMWM0MzI5NDE1ZmFmOTAxMTdkMzRkY2IzODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGVkZGU4ZjI3MDk4NDJmZGE0NGU4NzU4NzliMjkwNjMuYmluZFBvcHVwKHBvcHVwXzY2ZTM3OWZiOWNhZTQ2YmI4ZGIyZjUzZDU4YjA3YzA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwZGM2ZjE5YzIxYjQ4ZjFiZDk0ZTQzODg3MjQ2M2UwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1ZmM0NjViOGFjYzQ4MmE5ODk1Y2U4OTNkYmJjMGYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2YTYyZjg4Mzk1ZDQ5YTZiZmFhNTI3MjgyOTFkNDMzID0gJCgnPGRpdiBpZD0iaHRtbF8zNmE2MmY4ODM5NWQ0OWE2YmZhYTUyNzI4MjkxZDQzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NWZjNDY1YjhhY2M0ODJhOTg5NWNlODkzZGJiYzBmMy5zZXRDb250ZW50KGh0bWxfMzZhNjJmODgzOTVkNDlhNmJmYWE1MjcyODI5MWQ0MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjBkYzZmMTljMjFiNDhmMWJkOTRlNDM4ODcyNDYzZTAuYmluZFBvcHVwKHBvcHVwXzQ1ZmM0NjViOGFjYzQ4MmE5ODk1Y2U4OTNkYmJjMGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzNWRlMGNlZmExOTQyYjg5OTkyNzdmZWMzMmExY2MwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhZjg5NTVmMTY5NTQ1ZmFhYzNlMTE0MjU1OGIxMjViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiZTM5Yjk3MzZmMTQ4MDJhNDBkODFkMzA2YWQ0MGVlID0gJCgnPGRpdiBpZD0iaHRtbF80YmUzOWI5NzM2ZjE0ODAyYTQwZDgxZDMwNmFkNDBlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFmODk1NWYxNjk1NDVmYWFjM2UxMTQyNTU4YjEyNWIuc2V0Q29udGVudChodG1sXzRiZTM5Yjk3MzZmMTQ4MDJhNDBkODFkMzA2YWQ0MGVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzNWRlMGNlZmExOTQyYjg5OTkyNzdmZWMzMmExY2MwLmJpbmRQb3B1cChwb3B1cF9iYWY4OTU1ZjE2OTU0NWZhYWMzZTExNDI1NThiMTI1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2JjZTc1NWRjMDA0ZWViYjcxN2ViYjM5ZjVkNzBmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOGFlZTFmOWQwZDI0YzI4YTRhZjczZmY5MjZkYjJlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMDU1MDE2YTBjYWE0YmRkOGZiYjZmOTZlODlhMzVmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjA1NTAxNmEwY2FhNGJkZDhmYmI2Zjk2ZTg5YTM1ZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjhhZWUxZjlkMGQyNGMyOGE0YWY3M2ZmOTI2ZGIyZTIuc2V0Q29udGVudChodG1sX2YwNTUwMTZhMGNhYTRiZGQ4ZmJiNmY5NmU4OWEzNWY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzYmNlNzU1ZGMwMDRlZWJiNzE3ZWJiMzlmNWQ3MGZlLmJpbmRQb3B1cChwb3B1cF9iOGFlZTFmOWQwZDI0YzI4YTRhZjczZmY5MjZkYjJlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNzZlMGJmZTFiNWI0ZWFkOTZmZWM0ZmY1NDc2ZDhlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyNzNjZjkwYmFjNDQxYzRhYzY0MDdlMTE4ZDE1ZjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhZDA1MTVjZmI0NzRmMDA4ZWI2NmZlMmMxODQ2NjBlID0gJCgnPGRpdiBpZD0iaHRtbF9kYWQwNTE1Y2ZiNDc0ZjAwOGViNjZmZTJjMTg0NjYwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyNzNjZjkwYmFjNDQxYzRhYzY0MDdlMTE4ZDE1ZjRlLnNldENvbnRlbnQoaHRtbF9kYWQwNTE1Y2ZiNDc0ZjAwOGViNjZmZTJjMTg0NjYwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNzZlMGJmZTFiNWI0ZWFkOTZmZWM0ZmY1NDc2ZDhlMy5iaW5kUG9wdXAocG9wdXBfODI3M2NmOTBiYWM0NDFjNGFjNjQwN2UxMThkMTVmNGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQ2NDAzNTIyMjdmNGM0YmJlYmYwZjg3ZTI1OGQ1YmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFmNzFmNDcxZTIxNDE4OTkxYzhjMjczZDI1MzU0NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNiNmQ3YzU4MGRmNDZkZjk5MjgyZWNhNmZhZDcxNTAgPSAkKCc8ZGl2IGlkPSJodG1sX2VjYjZkN2M1ODBkZjQ2ZGY5OTI4MmVjYTZmYWQ3MTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExZjcxZjQ3MWUyMTQxODk5MWM4YzI3M2QyNTM1NDcwLnNldENvbnRlbnQoaHRtbF9lY2I2ZDdjNTgwZGY0NmRmOTkyODJlY2E2ZmFkNzE1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDY0MDM1MjIyN2Y0YzRiYmViZjBmODdlMjU4ZDViZC5iaW5kUG9wdXAocG9wdXBfYTFmNzFmNDcxZTIxNDE4OTkxYzhjMjczZDI1MzU0NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDhkMmZmOTM0M2E3NGFiOGEyYTA0NzYxNmQ3NDc1ODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiNWQzODI1NmQ0NzQ3MTc4ZGU0MzE3NGQwYTU0ZmQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZmZGY4ZDA1YmU3YjQwNWE4NzY2ZWQ0MWMzMGEyZWFkID0gJCgnPGRpdiBpZD0iaHRtbF9mZmRmOGQwNWJlN2I0MDVhODc2NmVkNDFjMzBhMmVhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiNWQzODI1NmQ0NzQ3MTc4ZGU0MzE3NGQwYTU0ZmQ3LnNldENvbnRlbnQoaHRtbF9mZmRmOGQwNWJlN2I0MDVhODc2NmVkNDFjMzBhMmVhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOGQyZmY5MzQzYTc0YWI4YTJhMDQ3NjE2ZDc0NzU4Mi5iaW5kUG9wdXAocG9wdXBfY2I1ZDM4MjU2ZDQ3NDcxNzhkZTQzMTc0ZDBhNTRmZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE0NmU2OGZiMGU1NDRkMGFiMzc1MWQzMjY2YjQzOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTU0MDk2ZWM2MDM4NDJhYTkyNzAxNTQ4YTA0MDE4YWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc1MWFmOGQzODBhNGRjZWI2ZGE4YzI3ZjE4ZDBkYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzI3NTFhZjhkMzgwYTRkY2ViNmRhOGMyN2YxOGQwZGJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1NDA5NmVjNjAzODQyYWE5MjcwMTU0OGEwNDAxOGFjLnNldENvbnRlbnQoaHRtbF8yNzUxYWY4ZDM4MGE0ZGNlYjZkYThjMjdmMThkMGRiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMTQ2ZTY4ZmIwZTU0NGQwYWIzNzUxZDMyNjZiNDM4ZC5iaW5kUG9wdXAocG9wdXBfOTU0MDk2ZWM2MDM4NDJhYTkyNzAxNTQ4YTA0MDE4YWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzY5ZGFmYmU2YjY4NGU3OWE3MmMxOGNkNjYwYWQxMzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI4MGZlMmExMjA4NGEyYWFjYzU1NDNmNWNhMDk4ZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTk2YjhmYzAzZjI4NGMzOWI1YmIyMTczOTQ5YTIxM2UgPSAkKCc8ZGl2IGlkPSJodG1sXzU5NmI4ZmMwM2YyODRjMzliNWJiMjE3Mzk0OWEyMTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyODBmZTJhMTIwODRhMmFhY2M1NTQzZjVjYTA5OGQwLnNldENvbnRlbnQoaHRtbF81OTZiOGZjMDNmMjg0YzM5YjViYjIxNzM5NDlhMjEzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNjlkYWZiZTZiNjg0ZTc5YTcyYzE4Y2Q2NjBhZDEzNi5iaW5kUG9wdXAocG9wdXBfOTI4MGZlMmExMjA4NGEyYWFjYzU1NDNmNWNhMDk4ZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODllMDFlNTJiNGQ1NDI4MjlhNTRiYmYzZThhNDlkYzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDk3YzBlZDBlOWZhNDQzMzhkN2M4NDY2NzRlMGUzOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhhNWYzNjZlNWU3NGI4Y2E3Yjg0OWJkYjk2MDg2YjMgPSAkKCc8ZGl2IGlkPSJodG1sXzI4YTVmMzY2ZTVlNzRiOGNhN2I4NDliZGI5NjA4NmIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOTdjMGVkMGU5ZmE0NDMzOGQ3Yzg0NjY3NGUwZTM5Yi5zZXRDb250ZW50KGh0bWxfMjhhNWYzNjZlNWU3NGI4Y2E3Yjg0OWJkYjk2MDg2YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODllMDFlNTJiNGQ1NDI4MjlhNTRiYmYzZThhNDlkYzMuYmluZFBvcHVwKHBvcHVwXzA5N2MwZWQwZTlmYTQ0MzM4ZDdjODQ2Njc0ZTBlMzliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlNTE1OGM3MzM1MDRkYTlhNzFmN2EyMmFiYzYxYTVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMzYjlkYmEwZGUzNDVmYjg3YmE2ZGMwNDI4MzRjZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNThmNDc4N2YzOTlhNDU3OGIyYmIyNWFmODY3NmNhZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzU4ZjQ3ODdmMzk5YTQ1NzhiMmJiMjVhZjg2NzZjYWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzNiOWRiYTBkZTM0NWZiODdiYTZkYzA0MjgzNGNlZS5zZXRDb250ZW50KGh0bWxfNThmNDc4N2YzOTlhNDU3OGIyYmIyNWFmODY3NmNhZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWU1MTU4YzczMzUwNGRhOWE3MWY3YTIyYWJjNjFhNWUuYmluZFBvcHVwKHBvcHVwX2UzM2I5ZGJhMGRlMzQ1ZmI4N2JhNmRjMDQyODM0Y2VlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmY2QyZDk3ODFmMDQzYmI4ZTcxNjk1Y2QzMDBkZWExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4ZTA0YjY0ZTE5NzRhZTFiMTQ5NDEzZWRjNDFkZTUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3OTIyNDYyYzdmNTRiODViYWEyNGU1Y2E0ODJkODg4ID0gJCgnPGRpdiBpZD0iaHRtbF9kNzkyMjQ2MmM3ZjU0Yjg1YmFhMjRlNWNhNDgyZDg4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OGUwNGI2NGUxOTc0YWUxYjE0OTQxM2VkYzQxZGU1MC5zZXRDb250ZW50KGh0bWxfZDc5MjI0NjJjN2Y1NGI4NWJhYTI0ZTVjYTQ4MmQ4ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2ZjZDJkOTc4MWYwNDNiYjhlNzE2OTVjZDMwMGRlYTEuYmluZFBvcHVwKHBvcHVwXzg4ZTA0YjY0ZTE5NzRhZTFiMTQ5NDEzZWRjNDFkZTUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhOGQxNzQ5NjhjMDRjY2U4ZmY4OGE4OTgwYTI5NDI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0Y2Q3ZTkyMzUxMDQ5NTY4ZDFjNjMyN2JkMzEwMDBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwMjcxYmM4ODRlNTQyN2RiYjRhNTg3MWJiZGU4NjZmID0gJCgnPGRpdiBpZD0iaHRtbF9kMDI3MWJjODg0ZTU0MjdkYmI0YTU4NzFiYmRlODY2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0Y2Q3ZTkyMzUxMDQ5NTY4ZDFjNjMyN2JkMzEwMDBkLnNldENvbnRlbnQoaHRtbF9kMDI3MWJjODg0ZTU0MjdkYmI0YTU4NzFiYmRlODY2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YThkMTc0OTY4YzA0Y2NlOGZmODhhODk4MGEyOTQyNi5iaW5kUG9wdXAocG9wdXBfNDRjZDdlOTIzNTEwNDk1NjhkMWM2MzI3YmQzMTAwMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWI0ODg1MjEwZDVlNDNmMjgwM2UwZjA0MzI3NzQ3OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjA2ZTUxMjM5Yzg3NDYyYTlmMGMyMjM3NDVmZTdmYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM2NWZkMWViMTZiNDQzMjk3MGE0ZTY4MTM2M2U2YmMgPSAkKCc8ZGl2IGlkPSJodG1sX2EzNjVmZDFlYjE2YjQ0MzI5NzBhNGU2ODEzNjNlNmJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDZlNTEyMzljODc0NjJhOWYwYzIyMzc0NWZlN2ZjOC5zZXRDb250ZW50KGh0bWxfYTM2NWZkMWViMTZiNDQzMjk3MGE0ZTY4MTM2M2U2YmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWI0ODg1MjEwZDVlNDNmMjgwM2UwZjA0MzI3NzQ3OTEuYmluZFBvcHVwKHBvcHVwXzYwNmU1MTIzOWM4NzQ2MmE5ZjBjMjIzNzQ1ZmU3ZmM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0YzU2Mjc1OTcyZTQwOGM4OTE1MDU2MDhiNDg4YTRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZGM3MjQ5MTc4ZTQ1NDBhNGU3ZGRkMjg0YTFhZWQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5NmZlYmY3MDBiNjQ2OGI4MTJmZTgyMWExNzAzZDZmID0gJCgnPGRpdiBpZD0iaHRtbF8yOTZmZWJmNzAwYjY0NjhiODEyZmU4MjFhMTcwM2Q2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZGM3MjQ5MTc4ZTQ1NDBhNGU3ZGRkMjg0YTFhZWQ4LnNldENvbnRlbnQoaHRtbF8yOTZmZWJmNzAwYjY0NjhiODEyZmU4MjFhMTcwM2Q2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNGM1NjI3NTk3MmU0MDhjODkxNTA1NjA4YjQ4OGE0Yy5iaW5kUG9wdXAocG9wdXBfZWRkYzcyNDkxNzhlNDU0MGE0ZTdkZGQyODRhMWFlZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDE0MGM5NjlkNWQ3NGQ4Mzk5NjhmNjE3M2Q5ZjE5ZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTZmZDE0ZjcxNjE1NGVmNWE2OTE2OTFkOGI4NTk0NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2Y0MDBlNjI2NzgwNDk2Y2I1YzUzOTcwYTUwYjI0MzggPSAkKCc8ZGl2IGlkPSJodG1sXzNmNDAwZTYyNjc4MDQ5NmNiNWM1Mzk3MGE1MGIyNDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NmZkMTRmNzE2MTU0ZWY1YTY5MTY5MWQ4Yjg1OTQ3OC5zZXRDb250ZW50KGh0bWxfM2Y0MDBlNjI2NzgwNDk2Y2I1YzUzOTcwYTUwYjI0MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDE0MGM5NjlkNWQ3NGQ4Mzk5NjhmNjE3M2Q5ZjE5ZGMuYmluZFBvcHVwKHBvcHVwXzU2ZmQxNGY3MTYxNTRlZjVhNjkxNjkxZDhiODU5NDc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3NjhiZDRjYzE3NzQyMWU5NGQxNDI2ZThkZjhhNGJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNmI1NDRkZTk3NTE0OTdlOGY4MWY3YTc0ZGQ4YTI1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTgyNjE1YTRiZGY0YjY5YWY0M2ZmN2JhOTk4YWM3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzk4MjYxNWE0YmRmNGI2OWFmNDNmZjdiYTk5OGFjN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmI1NDRkZTk3NTE0OTdlOGY4MWY3YTc0ZGQ4YTI1YS5zZXRDb250ZW50KGh0bWxfYzk4MjYxNWE0YmRmNGI2OWFmNDNmZjdiYTk5OGFjN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTc2OGJkNGNjMTc3NDIxZTk0ZDE0MjZlOGRmOGE0YmUuYmluZFBvcHVwKHBvcHVwX2Y2YjU0NGRlOTc1MTQ5N2U4ZjgxZjdhNzRkZDhhMjVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2MDlkZWEzZDNmMTQxMGQ4MzVkMGY4MjQ2ZDdlZTZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyMDA1MDI5MzRiOTRmODE5OWM0MmJmZDIxZTBjMGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiODg4MDI0MzM5OTQ5ZGZiY2ZiYzVmYjI4NjM4YTgxID0gJCgnPGRpdiBpZD0iaHRtbF9hYjg4ODAyNDMzOTk0OWRmYmNmYmM1ZmIyODYzOGE4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyMDA1MDI5MzRiOTRmODE5OWM0MmJmZDIxZTBjMGZiLnNldENvbnRlbnQoaHRtbF9hYjg4ODAyNDMzOTk0OWRmYmNmYmM1ZmIyODYzOGE4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNjA5ZGVhM2QzZjE0MTBkODM1ZDBmODI0NmQ3ZWU2Zi5iaW5kUG9wdXAocG9wdXBfMDIwMDUwMjkzNGI5NGY4MTk5YzQyYmZkMjFlMGMwZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTlhNGU2MzMyNGFhNDIyNWJjMDYzNjk0ZmNhYjBkYmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2ZmM0NDM5MGQwZDQ4MDM4NzYyMzZiYzE2MDdhYjc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkNTQ2MjM0NmVmOTRjYmY4ODRkMmRjMWQ1NDQ3NTBmID0gJCgnPGRpdiBpZD0iaHRtbF9hZDU0NjIzNDZlZjk0Y2JmODg0ZDJkYzFkNTQ0NzUwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNmZjNDQzOTBkMGQ0ODAzODc2MjM2YmMxNjA3YWI3OS5zZXRDb250ZW50KGh0bWxfYWQ1NDYyMzQ2ZWY5NGNiZjg4NGQyZGMxZDU0NDc1MGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTlhNGU2MzMyNGFhNDIyNWJjMDYzNjk0ZmNhYjBkYmIuYmluZFBvcHVwKHBvcHVwX2U2ZmM0NDM5MGQwZDQ4MDM4NzYyMzZiYzE2MDdhYjc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2NGMwYzM4MjIwMzQ1YzFiYjEzZWQxZWE0ZWU4ZTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRlMDE5NTZkZjgxNDgwZWJkMjVjYTc5MDU2NjlmYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDMyMmJlODczNmIzNDJkNWE1M2JmODY5YTQxOTgwYjYgPSAkKCc8ZGl2IGlkPSJodG1sX2QzMjJiZTg3MzZiMzQyZDVhNTNiZjg2OWE0MTk4MGI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkZTAxOTU2ZGY4MTQ4MGViZDI1Y2E3OTA1NjY5ZmJlLnNldENvbnRlbnQoaHRtbF9kMzIyYmU4NzM2YjM0MmQ1YTUzYmY4NjlhNDE5ODBiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNjRjMGMzODIyMDM0NWMxYmIxM2VkMWVhNGVlOGUxNi5iaW5kUG9wdXAocG9wdXBfNmRlMDE5NTZkZjgxNDgwZWJkMjVjYTc5MDU2NjlmYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWRmMDYwZGEzYjljNGI1ZmFkMjgyY2FhMGNkZDcxNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzM5NDVkMzkyOTQzNDhkODk3YmVjMmVmOTM1NWQzNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGUxNTY1ODIwOGExNDFiM2E1YTQ3ZmEyNTAwOWFhNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzBlMTU2NTgyMDhhMTQxYjNhNWE0N2ZhMjUwMDlhYTYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczOTQ1ZDM5Mjk0MzQ4ZDg5N2JlYzJlZjkzNTVkMzU1LnNldENvbnRlbnQoaHRtbF8wZTE1NjU4MjA4YTE0MWIzYTVhNDdmYTI1MDA5YWE2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZGYwNjBkYTNiOWM0YjVmYWQyODJjYWEwY2RkNzE2Yy5iaW5kUG9wdXAocG9wdXBfNzM5NDVkMzkyOTQzNDhkODk3YmVjMmVmOTM1NWQzNTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzhmMDIyNzAxYmJkNGRmZWEwMGYzNGExYmY4MWMyNWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGVkZWMwMTY0NDA3NGIyZDgyZGM4ZTBkODJlMmM0ODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ0M2I4NjAyOThmNDNmNzljNDM3NzVhNjRhMzRlODQgPSAkKCc8ZGl2IGlkPSJodG1sXzU0NDNiODYwMjk4ZjQzZjc5YzQzNzc1YTY0YTM0ZTg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVkZWMwMTY0NDA3NGIyZDgyZGM4ZTBkODJlMmM0ODkuc2V0Q29udGVudChodG1sXzU0NDNiODYwMjk4ZjQzZjc5YzQzNzc1YTY0YTM0ZTg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4ZjAyMjcwMWJiZDRkZmVhMDBmMzRhMWJmODFjMjVkLmJpbmRQb3B1cChwb3B1cF9kZWRlYzAxNjQ0MDc0YjJkODJkYzhlMGQ4MmUyYzQ4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZGI2MDMxMDdhYjQ0YmEyOTk3ZDExNjYxODc4MDc4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGRhZmJhMTBkMzE3NGRhOTk3ZGZkZWFjNzQwOWYwNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTcwOTlkN2FkYTI0NDUwMmFkM2JjOGU0NWVjYTY3YWUgPSAkKCc8ZGl2IGlkPSJodG1sXzE3MDk5ZDdhZGEyNDQ1MDJhZDNiYzhlNDVlY2E2N2FlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGFmYmExMGQzMTc0ZGE5OTdkZmRlYWM3NDA5ZjA2Mi5zZXRDb250ZW50KGh0bWxfMTcwOTlkN2FkYTI0NDUwMmFkM2JjOGU0NWVjYTY3YWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWRiNjAzMTA3YWI0NGJhMjk5N2QxMTY2MTg3ODA3ODIuYmluZFBvcHVwKHBvcHVwXzhkYWZiYTEwZDMxNzRkYTk5N2RmZGVhYzc0MDlmMDYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlZWViMjRhOTQ3MzRiYzdhNjQ4Y2MzOGYwOWU3NTcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlNTg4OWM0MTJmYzQ5MzU5NjI3NTUzMGMwNjc5MWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiOGQ0ZTI1NzZkZDQ2ZTBiZTdmNmQwYzg0YTUyMDkzID0gJCgnPGRpdiBpZD0iaHRtbF8wYjhkNGUyNTc2ZGQ0NmUwYmU3ZjZkMGM4NGE1MjA5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWU1ODg5YzQxMmZjNDkzNTk2Mjc1NTMwYzA2NzkxZjUuc2V0Q29udGVudChodG1sXzBiOGQ0ZTI1NzZkZDQ2ZTBiZTdmNmQwYzg0YTUyMDkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlZWViMjRhOTQ3MzRiYzdhNjQ4Y2MzOGYwOWU3NTcyLmJpbmRQb3B1cChwb3B1cF8xZTU4ODljNDEyZmM0OTM1OTYyNzU1MzBjMDY3OTFmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNGE2MWEyNWY5Njk0YzdkOWJkZTI1MzkzNjY1Mjg5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjhmMjY0YWZlOWU0M2JiYWExZjM3OGRjOTBiOTY0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjEyNjExMDg4Yzk0MTY2OTNkMWI5Njk3ODVkYjc0ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGIxMjYxMTA4OGM5NDE2NjkzZDFiOTY5Nzg1ZGI3NGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmI4ZjI2NGFmZTllNDNiYmFhMWYzNzhkYzkwYjk2NDcuc2V0Q29udGVudChodG1sX2RiMTI2MTEwODhjOTQxNjY5M2QxYjk2OTc4NWRiNzRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0YTYxYTI1Zjk2OTRjN2Q5YmRlMjUzOTM2NjUyODkwLmJpbmRQb3B1cChwb3B1cF82YjhmMjY0YWZlOWU0M2JiYWExZjM3OGRjOTBiOTY0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTBkZjFmNGRiY2Q0YmU5YjBjZmU5MTk0MmRlODNmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZjEzNjlhZDkyNmQ0MWUxOWFhNTMwZTY0MTVjNDlhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZGVjYTE3YzI2MmU0NDgxODk5YmM5Y2M0NTlmZjc3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWRlY2ExN2MyNjJlNDQ4MTg5OWJjOWNjNDU5ZmY3N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmMTM2OWFkOTI2ZDQxZTE5YWE1MzBlNjQxNWM0OWE2LnNldENvbnRlbnQoaHRtbF9lZGVjYTE3YzI2MmU0NDgxODk5YmM5Y2M0NTlmZjc3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTBkZjFmNGRiY2Q0YmU5YjBjZmU5MTk0MmRlODNmNy5iaW5kUG9wdXAocG9wdXBfOWYxMzY5YWQ5MjZkNDFlMTlhYTUzMGU2NDE1YzQ5YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmUzYmJlYTM1MGRmNGVlOWI2MWRkZmI2YTcwZTIzYjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2NzEzMmU4YmFiMTRjMTNiYjg4NWJlMTg1ODQ3NTcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5ZTU4YzA1MTIyZjRkNDU5M2I5NGViNDc2M2Y3ZDc3ID0gJCgnPGRpdiBpZD0iaHRtbF8xOWU1OGMwNTEyMmY0ZDQ1OTNiOTRlYjQ3NjNmN2Q3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjcxMzJlOGJhYjE0YzEzYmI4ODViZTE4NTg0NzU3MS5zZXRDb250ZW50KGh0bWxfMTllNThjMDUxMjJmNGQ0NTkzYjk0ZWI0NzYzZjdkNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmUzYmJlYTM1MGRmNGVlOWI2MWRkZmI2YTcwZTIzYjkuYmluZFBvcHVwKHBvcHVwX2M2NzEzMmU4YmFiMTRjMTNiYjg4NWJlMTg1ODQ3NTcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhODk4MDE2YzI1NDQ2MmY5Y2UwMzAwODM5MGU5MThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjNiNTBjYzljM2ZkNGEwOWE1MzJjNDY2ODljYjhjZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTNlM2U1Mzg1ZjY3NGExM2EzNjAxNjRkZGExYjlmNDMgPSAkKCc8ZGl2IGlkPSJodG1sXzkzZTNlNTM4NWY2NzRhMTNhMzYwMTY0ZGRhMWI5ZjQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82M2I1MGNjOWMzZmQ0YTA5YTUzMmM0NjY4OWNiOGNmNy5zZXRDb250ZW50KGh0bWxfOTNlM2U1Mzg1ZjY3NGExM2EzNjAxNjRkZGExYjlmNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGE4OTgwMTZjMjU0NDYyZjljZTAzMDA4MzkwZTkxOGYuYmluZFBvcHVwKHBvcHVwXzYzYjUwY2M5YzNmZDRhMDlhNTMyYzQ2Njg5Y2I4Y2Y3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkZjU3YThmYWU0ZDRlZmRhNWJhYTcwYzlkYzY0YjVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzljOWQ3MDUyMjU0NDY3YmEyZjMyZjJlYjYxZDM0ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDgyMTVkYmE5MjM4NGIzOGE3NTUyMmI3YzExZGMxZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ4MjE1ZGJhOTIzODRiMzhhNzU1MjJiN2MxMWRjMWZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5YzlkNzA1MjI1NDQ2N2JhMmYzMmYyZWI2MWQzNGZhLnNldENvbnRlbnQoaHRtbF80ODIxNWRiYTkyMzg0YjM4YTc1NTIyYjdjMTFkYzFmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZGY1N2E4ZmFlNGQ0ZWZkYTViYWE3MGM5ZGM2NGI1YS5iaW5kUG9wdXAocG9wdXBfNzljOWQ3MDUyMjU0NDY3YmEyZjMyZjJlYjYxZDM0ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjdmZDE1MDlmMGNkNGZiNGIzMDVmNmNiNjhlOTk4ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlNmVhODZiMGU1ZDQ4ZDQ5OTA0MjhhOTJlNjI3NzA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1ZWI2YmU4OGZiODQ0MzI4ZTVmNjg1MDU4MDc4MmEwID0gJCgnPGRpdiBpZD0iaHRtbF9mNWViNmJlODhmYjg0NDMyOGU1ZjY4NTA1ODA3ODJhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTZlYTg2YjBlNWQ0OGQ0OTkwNDI4YTkyZTYyNzcwNi5zZXRDb250ZW50KGh0bWxfZjVlYjZiZTg4ZmI4NDQzMjhlNWY2ODUwNTgwNzgyYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjdmZDE1MDlmMGNkNGZiNGIzMDVmNmNiNjhlOTk4ZjkuYmluZFBvcHVwKHBvcHVwXzFlNmVhODZiMGU1ZDQ4ZDQ5OTA0MjhhOTJlNjI3NzA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0MGQ5M2FiOWVhMjRlYTRhMWJlYTQzZDAwNjc3MjdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1MzUwNzFiYTljNjRkODQ5Mjg0MTIzMDgyNjU1MjJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4ZmE3ZTg4ZmJkMDRjNWJhYjZhYTNmZTgyYmI1ZGE1ID0gJCgnPGRpdiBpZD0iaHRtbF80OGZhN2U4OGZiZDA0YzViYWI2YWEzZmU4MmJiNWRhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1MzUwNzFiYTljNjRkODQ5Mjg0MTIzMDgyNjU1MjJlLnNldENvbnRlbnQoaHRtbF80OGZhN2U4OGZiZDA0YzViYWI2YWEzZmU4MmJiNWRhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDBkOTNhYjllYTI0ZWE0YTFiZWE0M2QwMDY3NzI3Yi5iaW5kUG9wdXAocG9wdXBfOTUzNTA3MWJhOWM2NGQ4NDkyODQxMjMwODI2NTUyMmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTE0OGRiYWYwOGI5NDk5M2FiOTE5M2YyNWFlM2E5ZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJkNzVkY2Q1MDljNDEyMThiMzBhN2Q0OWE0Y2ExMDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjU1ZGZiYWFkMzBhNDIzZWE1YzI5MTk5Mjc1YjNiZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzI1NWRmYmFhZDMwYTQyM2VhNWMyOTE5OTI3NWIzYmRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyZDc1ZGNkNTA5YzQxMjE4YjMwYTdkNDlhNGNhMTA4LnNldENvbnRlbnQoaHRtbF8yNTVkZmJhYWQzMGE0MjNlYTVjMjkxOTkyNzViM2JkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTQ4ZGJhZjA4Yjk0OTkzYWI5MTkzZjI1YWUzYTllNy5iaW5kUG9wdXAocG9wdXBfNjJkNzVkY2Q1MDljNDEyMThiMzBhN2Q0OWE0Y2ExMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODY2YjIyNGY3ODU0NGQ1YTk2NWRkMmU3NTAxMWZiODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2Q1OGUyYzAwZTMyNDk2NDg0YmI1NGQ3YTQ2MDlmNWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M4YjVlNDM2YzNlNGY1OWE1MDQzZTZiOWQ0NTBjZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzNjOGI1ZTQzNmMzZTRmNTlhNTA0M2U2YjlkNDUwY2YyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDU4ZTJjMDBlMzI0OTY0ODRiYjU0ZDdhNDYwOWY1Yy5zZXRDb250ZW50KGh0bWxfM2M4YjVlNDM2YzNlNGY1OWE1MDQzZTZiOWQ0NTBjZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY2YjIyNGY3ODU0NGQ1YTk2NWRkMmU3NTAxMWZiODQuYmluZFBvcHVwKHBvcHVwXzNkNThlMmMwMGUzMjQ5NjQ4NGJiNTRkN2E0NjA5ZjVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiZGFkYWM2YmExNzQ4YjBiMWRlMGNjZDVhMGU4ZjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2E5YzA1OTIxOTE2NDQ1OTkxMjEwNjM0NzUxMzc3ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJkYzE5MDE4ZTVkNGY4Njk2Y2Q0MjcyNTc4ODQ4OTMgPSAkKCc8ZGl2IGlkPSJodG1sX2FiZGMxOTAxOGU1ZDRmODY5NmNkNDI3MjU3ODg0ODkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E5YzA1OTIxOTE2NDQ1OTkxMjEwNjM0NzUxMzc3ZGIuc2V0Q29udGVudChodG1sX2FiZGMxOTAxOGU1ZDRmODY5NmNkNDI3MjU3ODg0ODkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiZGFkYWM2YmExNzQ4YjBiMWRlMGNjZDVhMGU4ZjBmLmJpbmRQb3B1cChwb3B1cF83YTljMDU5MjE5MTY0NDU5OTEyMTA2MzQ3NTEzNzdkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTNjMjA3N2IzNWM0ODIzYjQ2MWI2MjMxM2Y0NDgyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGI4Y2RiMGUyNGE0ZjQ2YjRjNjllZWE3OGMzYTQ3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZmU4NzcwZTdhMTM0YmUwODhjMDA4NjJkYzMyY2U4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2ZlODc3MGU3YTEzNGJlMDg4YzAwODYyZGMzMmNlODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZGI4Y2RiMGUyNGE0ZjQ2YjRjNjllZWE3OGMzYTQ3My5zZXRDb250ZW50KGh0bWxfM2ZlODc3MGU3YTEzNGJlMDg4YzAwODYyZGMzMmNlODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODEzYzIwNzdiMzVjNDgyM2I0NjFiNjIzMTNmNDQ4MmUuYmluZFBvcHVwKHBvcHVwX2FkYjhjZGIwZTI0YTRmNDZiNGM2OWVlYTc4YzNhNDczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlMmFlYjYzZWZjYzRmNWViZWZmNmZiNzliY2U4MDhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjg4NDc1NTdjYmY0MjM0YWEyNDI3ZTZkY2E2NjJmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YjQyY2U3YWM2YTg0Yzg2YWQ4YWM3Y2MzM2I4N2U3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGI0MmNlN2FjNmE4NGM4NmFkOGFjN2NjMzNiODdlNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWI4ODQ3NTU3Y2JmNDIzNGFhMjQyN2U2ZGNhNjYyZmUuc2V0Q29udGVudChodG1sXzhiNDJjZTdhYzZhODRjODZhZDhhYzdjYzMzYjg3ZTcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlMmFlYjYzZWZjYzRmNWViZWZmNmZiNzliY2U4MDhiLmJpbmRQb3B1cChwb3B1cF9lYjg4NDc1NTdjYmY0MjM0YWEyNDI3ZTZkY2E2NjJmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTkxZTBlYTdiOWI0YzNkYmFmNjBlMGUxNTFmNTMzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJhNjJjNjQ2ZTAwNDJjOGFlYjc1MThiNDNkMDJhMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzNkZmY5YjUxNmU0NDQwMjk3Njg4NWUzZTRhN2I5NTMgPSAkKCc8ZGl2IGlkPSJodG1sX2MzZGZmOWI1MTZlNDQ0MDI5NzY4ODVlM2U0YTdiOTUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyYTYyYzY0NmUwMDQyYzhhZWI3NTE4YjQzZDAyYTFjLnNldENvbnRlbnQoaHRtbF9jM2RmZjliNTE2ZTQ0NDAyOTc2ODg1ZTNlNGE3Yjk1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTkxZTBlYTdiOWI0YzNkYmFmNjBlMGUxNTFmNTMzYi5iaW5kUG9wdXAocG9wdXBfNjJhNjJjNjQ2ZTAwNDJjOGFlYjc1MThiNDNkMDJhMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ZkZGQyMjFlMmY1NGViNmJlZjBmNDgzYTlmOWFjNTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYwMTlkNmE4MGI5NDU0YmEzNzdlMzYxMTVjYjE1OTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTEwNTcyNWE0NWRmNGZiMmJmNjAyYzBkZTA0NjQwNzIgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMDU3MjVhNDVkZjRmYjJiZjYwMmMwZGUwNDY0MDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjAxOWQ2YTgwYjk0NTRiYTM3N2UzNjExNWNiMTU5NC5zZXRDb250ZW50KGh0bWxfYTEwNTcyNWE0NWRmNGZiMmJmNjAyYzBkZTA0NjQwNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ZkZGQyMjFlMmY1NGViNmJlZjBmNDgzYTlmOWFjNTguYmluZFBvcHVwKHBvcHVwXzc2MDE5ZDZhODBiOTQ1NGJhMzc3ZTM2MTE1Y2IxNTk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1YTBhMDMyZmY2OTRkNzBhNjkzMjJlNTE1YmE0ZTRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzNGY5MDcwZjExYTQ0YWNiMmY2M2RmMGFhZjk3ZTE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3ODc2YTg2NmIxOTQzZmNiNzg0NWVjNzQ2MzVlMTU5ID0gJCgnPGRpdiBpZD0iaHRtbF84Nzg3NmE4NjZiMTk0M2ZjYjc4NDVlYzc0NjM1ZTE1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzRmOTA3MGYxMWE0NGFjYjJmNjNkZjBhYWY5N2UxOC5zZXRDb250ZW50KGh0bWxfODc4NzZhODY2YjE5NDNmY2I3ODQ1ZWM3NDYzNWUxNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDVhMGEwMzJmZjY5NGQ3MGE2OTMyMmU1MTViYTRlNGEuYmluZFBvcHVwKHBvcHVwXzMzNGY5MDcwZjExYTQ0YWNiMmY2M2RmMGFhZjk3ZTE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0ZjAzMjAwZDU4YjQ3ZWY5ZTk1NjZlNzVkYTk0ZWFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3YTQxYmNkNDY2YzQ2ODM5MTlmYjdkYjljNDYyMjliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiMjMxNWM5MjM4YTRiNDViN2EyNzlmYTIzMDY2OTE5ID0gJCgnPGRpdiBpZD0iaHRtbF84YjIzMTVjOTIzOGE0YjQ1YjdhMjc5ZmEyMzA2NjkxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdhNDFiY2Q0NjZjNDY4MzkxOWZiN2RiOWM0NjIyOWIuc2V0Q29udGVudChodG1sXzhiMjMxNWM5MjM4YTRiNDViN2EyNzlmYTIzMDY2OTE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0ZjAzMjAwZDU4YjQ3ZWY5ZTk1NjZlNzVkYTk0ZWFlLmJpbmRQb3B1cChwb3B1cF8xN2E0MWJjZDQ2NmM0NjgzOTE5ZmI3ZGI5YzQ2MjI5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZjNhMjlkZTQ2YWU0MTA3YjFkNzMzNmU1NmFhY2U0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzU5MzZkNGJhMjk0NGRlYTE4MjMyNWNkNTVlYjRlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZjgxMDEwODM4NjE0N2Q5YTNhNTAxNmI1OTgxYmUyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmY4MTAxMDgzODYxNDdkOWEzYTUwMTZiNTk4MWJlMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjNTkzNmQ0YmEyOTQ0ZGVhMTgyMzI1Y2Q1NWViNGVhLnNldENvbnRlbnQoaHRtbF8yZjgxMDEwODM4NjE0N2Q5YTNhNTAxNmI1OTgxYmUyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZjNhMjlkZTQ2YWU0MTA3YjFkNzMzNmU1NmFhY2U0YS5iaW5kUG9wdXAocG9wdXBfZGM1OTM2ZDRiYTI5NDRkZWExODIzMjVjZDU1ZWI0ZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGY5NGQ0YzY3ODk0NGVmZmE2OWYzOWI4MmFiODZmNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc5ZjIxN2ZjODYwNDEzZGJhNTlkYzZlOWUzNzY3M2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzY4NDRhYmE3MDU5NDY5NDk4ZjVhZGYzNWYwY2M5NGIgPSAkKCc8ZGl2IGlkPSJodG1sX2M2ODQ0YWJhNzA1OTQ2OTQ5OGY1YWRmMzVmMGNjOTRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3OWYyMTdmYzg2MDQxM2RiYTU5ZGM2ZTllMzc2NzNiLnNldENvbnRlbnQoaHRtbF9jNjg0NGFiYTcwNTk0Njk0OThmNWFkZjM1ZjBjYzk0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZjk0ZDRjNjc4OTQ0ZWZmYTY5ZjM5YjgyYWI4NmY1Ni5iaW5kUG9wdXAocG9wdXBfYjc5ZjIxN2ZjODYwNDEzZGJhNTlkYzZlOWUzNzY3M2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmVmODI4NzY3MGIxNGI2OWE3ZjBjYjdhODIzNjRhOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0NGNhZGMxNDdkNzQyYTk4YWMwZWYyYWNhYjYwNGQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxYmE4MzBiMGRhYjRmMzliOTcxYTExMzgyN2RhNjAwID0gJCgnPGRpdiBpZD0iaHRtbF9jMWJhODMwYjBkYWI0ZjM5Yjk3MWExMTM4MjdkYTYwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzQ0Y2FkYzE0N2Q3NDJhOThhYzBlZjJhY2FiNjA0ZDQuc2V0Q29udGVudChodG1sX2MxYmE4MzBiMGRhYjRmMzliOTcxYTExMzgyN2RhNjAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlZjgyODc2NzBiMTRiNjlhN2YwY2I3YTgyMzY0YTliLmJpbmRQb3B1cChwb3B1cF8zNDRjYWRjMTQ3ZDc0MmE5OGFjMGVmMmFjYWI2MDRkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNTAxYTFlMDhhNmE0ZjdmOGFmZjM2ODJiNmM5NGEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNDljYWEyY2Q2ZjM0ZWMzODdjYTUxNzlmMTZjNTY3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjQ0NjE4ZTZkODQ0MDU5OTc3ZTcxYWIxNDAyODQxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTI0NDYxOGU2ZDg0NDA1OTk3N2U3MWFiMTQwMjg0MTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ5Y2FhMmNkNmYzNGVjMzg3Y2E1MTc5ZjE2YzU2NzAuc2V0Q29udGVudChodG1sX2UyNDQ2MThlNmQ4NDQwNTk5NzdlNzFhYjE0MDI4NDExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1MDFhMWUwOGE2YTRmN2Y4YWZmMzY4MmI2Yzk0YTM0LmJpbmRQb3B1cChwb3B1cF9iNDljYWEyY2Q2ZjM0ZWMzODdjYTUxNzlmMTZjNTY3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNGRkZDY1MzZjNDA0NTdkYjYxOGQwNGIwMDYyOTJiOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDE3YWE0ZTZlYTU0ODkzYmNhMmM1YjMyNGFlOGQzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMWJkZmU0ZGJiZmE0MTllOGE0ZTNjMGJjNjMxN2QyNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzFiZGZlNGRiYmZhNDE5ZThhNGUzYzBiYzYzMTdkMjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTAxN2FhNGU2ZWE1NDg5M2JjYTJjNWIzMjRhZThkMzcuc2V0Q29udGVudChodG1sXzMxYmRmZTRkYmJmYTQxOWU4YTRlM2MwYmM2MzE3ZDI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0ZGRkNjUzNmM0MDQ1N2RiNjE4ZDA0YjAwNjI5MmI4LmJpbmRQb3B1cChwb3B1cF9lMDE3YWE0ZTZlYTU0ODkzYmNhMmM1YjMyNGFlOGQzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNWNkN2IwMzE2ZWM0OWE5OTUzYzExMzcxYjNiODA3MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjN2UyNzI1MDFhNDRlMWM4YzFkNjc1YjVkY2M3YzhlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhYjMzNjZiNjgyZjRhYjA4NzY3MjAwZjA0MWY2YWUwID0gJCgnPGRpdiBpZD0iaHRtbF9iYWIzMzY2YjY4MmY0YWIwODc2NzIwMGYwNDFmNmFlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjN2UyNzI1MDFhNDRlMWM4YzFkNjc1YjVkY2M3YzhlLnNldENvbnRlbnQoaHRtbF9iYWIzMzY2YjY4MmY0YWIwODc2NzIwMGYwNDFmNmFlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNWNkN2IwMzE2ZWM0OWE5OTUzYzExMzcxYjNiODA3Mi5iaW5kUG9wdXAocG9wdXBfZWM3ZTI3MjUwMWE0NGUxYzhjMWQ2NzViNWRjYzdjOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM0NDczNGMyNjgwNDkyMTg0ODVkYmRhYjIwNjJhZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRkMmRmZmM1MjNhNDA0Y2IxOTM3NjdkYmNkYjJjMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTA2NjQzYjNiNTYzNGM0MGE1MmVhNzFhYTdmZjFhZDkgPSAkKCc8ZGl2IGlkPSJodG1sX2UwNjY0M2IzYjU2MzRjNDBhNTJlYTcxYWE3ZmYxYWQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGQyZGZmYzUyM2E0MDRjYjE5Mzc2N2RiY2RiMmMxMS5zZXRDb250ZW50KGh0bWxfZTA2NjQzYjNiNTYzNGM0MGE1MmVhNzFhYTdmZjFhZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM0NDczNGMyNjgwNDkyMTg0ODVkYmRhYjIwNjJhZjguYmluZFBvcHVwKHBvcHVwXzQ0ZDJkZmZjNTIzYTQwNGNiMTkzNzY3ZGJjZGIyYzExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyMWFjYmZjZGZlMTRiN2ZhMWZjOThlNTMwN2E0MGE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkMjI5MDhlNDVkNjRjMzk5N2QwMTlhMGEyOWMxMjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmZWY3MTI3MTFmZTRmNjdiNGFlYjZlMTYyNTk2ODc4ID0gJCgnPGRpdiBpZD0iaHRtbF85ZmVmNzEyNzExZmU0ZjY3YjRhZWI2ZTE2MjU5Njg3OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDIyOTA4ZTQ1ZDY0YzM5OTdkMDE5YTBhMjljMTIxNy5zZXRDb250ZW50KGh0bWxfOWZlZjcxMjcxMWZlNGY2N2I0YWViNmUxNjI1OTY4NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDIxYWNiZmNkZmUxNGI3ZmExZmM5OGU1MzA3YTQwYTkuYmluZFBvcHVwKHBvcHVwX2NkMjI5MDhlNDVkNjRjMzk5N2QwMTlhMGEyOWMxMjE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3NDAwMTM0MDc2NTQzNDRhYWExZTg1NmVkYmUwYTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkYjY3OTgwYzE1NjQxMTJiNWY2M2YzYTQzOWY0OTJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0ZGJjMWI4ODhlNDRmNTg4NWQzOThkYjFmZTkzZWFhID0gJCgnPGRpdiBpZD0iaHRtbF83NGRiYzFiODg4ZTQ0ZjU4ODVkMzk4ZGIxZmU5M2VhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZGI2Nzk4MGMxNTY0MTEyYjVmNjNmM2E0MzlmNDkyZi5zZXRDb250ZW50KGh0bWxfNzRkYmMxYjg4OGU0NGY1ODg1ZDM5OGRiMWZlOTNlYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDc0MDAxMzQwNzY1NDM0NGFhYTFlODU2ZWRiZTBhMjMuYmluZFBvcHVwKHBvcHVwXzFkYjY3OTgwYzE1NjQxMTJiNWY2M2YzYTQzOWY0OTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmOWI4ODA4ZTNkNzRkZDM4ZTA3YTY0MzE2NjMzMGI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3NmUwM2QxOTRmMDRlNmI4ZTE4Mzk3ZjQ0MTg1NzVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhYWI0NGEwYjE4YjQ2MmI4NzQ2MTRlMzUyODYzNjhlID0gJCgnPGRpdiBpZD0iaHRtbF9iYWFiNDRhMGIxOGI0NjJiODc0NjE0ZTM1Mjg2MzY4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzZlMDNkMTk0ZjA0ZTZiOGUxODM5N2Y0NDE4NTc1Zi5zZXRDb250ZW50KGh0bWxfYmFhYjQ0YTBiMThiNDYyYjg3NDYxNGUzNTI4NjM2OGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY5Yjg4MDhlM2Q3NGRkMzhlMDdhNjQzMTY2MzMwYjYuYmluZFBvcHVwKHBvcHVwXzc3NmUwM2QxOTRmMDRlNmI4ZTE4Mzk3ZjQ0MTg1NzVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2NjcyMTlmODdhZjQwYjJhMjgzMjRmNjIxM2E0MWVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1OGZmODc4NWY4ZTRiZGViMWM5MGExOGEzOTlhODQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3NzFjMmQzOWUyZDQ2ZTZhZTkwOGEwYTJhNzcwOWVlID0gJCgnPGRpdiBpZD0iaHRtbF8wNzcxYzJkMzllMmQ0NmU2YWU5MDhhMGEyYTc3MDllZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNThmZjg3ODVmOGU0YmRlYjFjOTBhMThhMzk5YTg0MS5zZXRDb250ZW50KGh0bWxfMDc3MWMyZDM5ZTJkNDZlNmFlOTA4YTBhMmE3NzA5ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDY2NzIxOWY4N2FmNDBiMmEyODMyNGY2MjEzYTQxZWYuYmluZFBvcHVwKHBvcHVwX2Y1OGZmODc4NWY4ZTRiZGViMWM5MGExOGEzOTlhODQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzOTk0YWQ5NDYxNDQyZGRiZDJlNDk3MGYxZDg0ZTExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmOTZlYjVlNGEzYjQ0M2I5MWNkODI0OTliYzQ3YTRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlZDA0YjE5MGM0YTQ4MmU5OWI4ZTNlNTk1MTcyNjZhID0gJCgnPGRpdiBpZD0iaHRtbF9lZWQwNGIxOTBjNGE0ODJlOTliOGUzZTU5NTE3MjY2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmOTZlYjVlNGEzYjQ0M2I5MWNkODI0OTliYzQ3YTRjLnNldENvbnRlbnQoaHRtbF9lZWQwNGIxOTBjNGE0ODJlOTliOGUzZTU5NTE3MjY2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMzk5NGFkOTQ2MTQ0MmRkYmQyZTQ5NzBmMWQ4NGUxMS5iaW5kUG9wdXAocG9wdXBfOGY5NmViNWU0YTNiNDQzYjkxY2Q4MjQ5OWJjNDdhNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjgyYWVhMzhjYTY0NGUwNjg1YWFiY2I1ZjAwNGJlYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGQwYTc5OWYwYjU5NDVkYWI3MTY3MWRhOTEzYjQ3ZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM0M2ZmYjY2Mzk3NGVhZmEwMWU0NzQ4NDUyZGI2NjkgPSAkKCc8ZGl2IGlkPSJodG1sXzAzNDNmZmI2NjM5NzRlYWZhMDFlNDc0ODQ1MmRiNjY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGQwYTc5OWYwYjU5NDVkYWI3MTY3MWRhOTEzYjQ3ZDYuc2V0Q29udGVudChodG1sXzAzNDNmZmI2NjM5NzRlYWZhMDFlNDc0ODQ1MmRiNjY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY4MmFlYTM4Y2E2NDRlMDY4NWFhYmNiNWYwMDRiZWIxLmJpbmRQb3B1cChwb3B1cF84ZDBhNzk5ZjBiNTk0NWRhYjcxNjcxZGE5MTNiNDdkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MGJhMWI4YmQ4ZWI0NDhiODA0Yjg3NWU4ZjE3OTliNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzI1M2M5M2YyY2E0NGU4MWE0MmViNzM1YjY1YTgwNzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTlhNzgyYTMxNzVhNDYwYmIwNWQ1OWU0ZDFhNmVjM2QgPSAkKCc8ZGl2IGlkPSJodG1sXzE5YTc4MmEzMTc1YTQ2MGJiMDVkNTllNGQxYTZlYzNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzI1M2M5M2YyY2E0NGU4MWE0MmViNzM1YjY1YTgwNzguc2V0Q29udGVudChodG1sXzE5YTc4MmEzMTc1YTQ2MGJiMDVkNTllNGQxYTZlYzNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwYmExYjhiZDhlYjQ0OGI4MDRiODc1ZThmMTc5OWI2LmJpbmRQb3B1cChwb3B1cF8zMjUzYzkzZjJjYTQ0ZTgxYTQyZWI3MzViNjVhODA3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjVhM2VjNjczNGY0MTI5Yjk2ZTc4OGZjMjBhNzY0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTg5YTIyYzQyMzc0M2EzYmZjN2U5ZTBiY2NlZWY5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzNmZGNhYmU0OTA0ZmRlOTMwM2I3ZGRlZDUzMTA5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjMzZmRjYWJlNDkwNGZkZTkzMDNiN2RkZWQ1MzEwOWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxODlhMjJjNDIzNzQzYTNiZmM3ZTllMGJjY2VlZjkzLnNldENvbnRlbnQoaHRtbF8yMzNmZGNhYmU0OTA0ZmRlOTMwM2I3ZGRlZDUzMTA5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjVhM2VjNjczNGY0MTI5Yjk2ZTc4OGZjMjBhNzY0Ny5iaW5kUG9wdXAocG9wdXBfNzE4OWEyMmM0MjM3NDNhM2JmYzdlOWUwYmNjZWVmOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTQ1NTg3YTFiMzY1NGM4NTk3ZDViYWJjOTBjOGI0MGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTI4NThmOGUzOTFjNGZhMGE5NDI0MWQxMTVkZDI3ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFhZDEyNWQ5YmQwNGJkODgxODZjZjU2YzA1MWM1NjcgPSAkKCc8ZGl2IGlkPSJodG1sXzYxYWQxMjVkOWJkMDRiZDg4MTg2Y2Y1NmMwNTFjNTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI4NThmOGUzOTFjNGZhMGE5NDI0MWQxMTVkZDI3ZWEuc2V0Q29udGVudChodG1sXzYxYWQxMjVkOWJkMDRiZDg4MTg2Y2Y1NmMwNTFjNTY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0NTU4N2ExYjM2NTRjODU5N2Q1YmFiYzkwYzhiNDBkLmJpbmRQb3B1cChwb3B1cF8xMjg1OGY4ZTM5MWM0ZmEwYTk0MjQxZDExNWRkMjdlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2Y4NThmZTZjOWE0ZGEyOTg0YjkxMTYxZDA4MjJjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTk4NmFmOWFiZWQ0ZjMxYjI0N2RkNmZmZTU4NTJkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWZmOTFiOGIzZWM0MGIxYjA5MzM1YTcwNjRmZDBhOSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FmZjkxYjhiM2VjNDBiMWIwOTMzNWE3MDY0ZmQwYTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjE5ODZhZjlhYmVkNGYzMWIyNDdkZDZmZmU1ODUyZGIuc2V0Q29udGVudChodG1sX2NhZmY5MWI4YjNlYzQwYjFiMDkzMzVhNzA2NGZkMGE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzZjg1OGZlNmM5YTRkYTI5ODRiOTExNjFkMDgyMmMzLmJpbmRQb3B1cChwb3B1cF82MTk4NmFmOWFiZWQ0ZjMxYjI0N2RkNmZmZTU4NTJkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDA1ZjhkOGYzYTc0ZTkyYjRiNGQ0YzE0M2Q5MTExMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hY2VlMmEwZGE0MmQ0Mzg0ODIwZjI2YzlhMTI4ZDBmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTA4MzhjODZjZjA0MWNiODhjNTNhNjFlOGI2NjJjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDEwODM4Yzg2Y2YwNDFjYjg4YzUzYTYxZThiNjYyYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjZWUyYTBkYTQyZDQzODQ4MjBmMjZjOWExMjhkMGZlLnNldENvbnRlbnQoaHRtbF9kMTA4MzhjODZjZjA0MWNiODhjNTNhNjFlOGI2NjJjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMDA1ZjhkOGYzYTc0ZTkyYjRiNGQ0YzE0M2Q5MTExMS5iaW5kUG9wdXAocG9wdXBfYWNlZTJhMGRhNDJkNDM4NDgyMGYyNmM5YTEyOGQwZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzk2MjMzYWZhNzJhNGM3MWI0MGIyMzk2NTVhOGQ3ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVmMjM3ODc4ZDM4NDg1Njk4YTk5NDI1NDU3ZWY1YWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjYwNDAwZDk2MDIxNGY3MzgwOGE3OTc1YzcxNWIwOTQgPSAkKCc8ZGl2IGlkPSJodG1sX2I2MDQwMGQ5NjAyMTRmNzM4MDhhNzk3NWM3MTViMDk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1ZjIzNzg3OGQzODQ4NTY5OGE5OTQyNTQ1N2VmNWFkLnNldENvbnRlbnQoaHRtbF9iNjA0MDBkOTYwMjE0ZjczODA4YTc5NzVjNzE1YjA5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zOTYyMzNhZmE3MmE0YzcxYjQwYjIzOTY1NWE4ZDdlNS5iaW5kUG9wdXAocG9wdXBfODVmMjM3ODc4ZDM4NDg1Njk4YTk5NDI1NDU3ZWY1YWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjIzOTI5ODI4YzE4NDBjNmI1ZTdkNDQ1MDJlYmI4ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjY2U5M2ExNzBhOTQwNDE5MjJjYmU5YmYwYjdmOTNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjOTFmMzRlOTliYTQwZmRiODE3YWI2MDRlYTcxZmRmID0gJCgnPGRpdiBpZD0iaHRtbF9iYzkxZjM0ZTk5YmE0MGZkYjgxN2FiNjA0ZWE3MWZkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGNjZTkzYTE3MGE5NDA0MTkyMmNiZTliZjBiN2Y5M2Uuc2V0Q29udGVudChodG1sX2JjOTFmMzRlOTliYTQwZmRiODE3YWI2MDRlYTcxZmRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyMzkyOTgyOGMxODQwYzZiNWU3ZDQ0NTAyZWJiOGZiLmJpbmRQb3B1cChwb3B1cF8wY2NlOTNhMTcwYTk0MDQxOTIyY2JlOWJmMGI3ZjkzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kN2FlYmVkN2ExZWQ0Y2VkYTM3OTkwNGNlMDEwNmUzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzZhYmY2YjY1OWVkNDVkMjllY2JmNGNjNWUxNDc4OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDY5YWJlNjc1MzEwNDJmM2E1OGI3NzFkNTNkMjJiNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2OWFiZTY3NTMxMDQyZjNhNThiNzcxZDUzZDIyYjc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzZhYmY2YjY1OWVkNDVkMjllY2JmNGNjNWUxNDc4OTIuc2V0Q29udGVudChodG1sX2Q2OWFiZTY3NTMxMDQyZjNhNThiNzcxZDUzZDIyYjc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3YWViZWQ3YTFlZDRjZWRhMzc5OTA0Y2UwMTA2ZTM0LmJpbmRQb3B1cChwb3B1cF9jNmFiZjZiNjU5ZWQ0NWQyOWVjYmY0Y2M1ZTE0Nzg5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zM2U2MTI3ZmNlM2M0OGExOTFhZDQzNmFlZjA1NmFhMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWFhYjQyN2YzY2FlNGM5NWFhNTE1M2MxNWU2NmIzMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg3MTIyNjYwYmY4NDg3MjlhNWE3N2VlNGYxYjQ5ZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzk4NzEyMjY2MGJmODQ4NzI5YTVhNzdlZTRmMWI0OWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlhYWI0MjdmM2NhZTRjOTVhYTUxNTNjMTVlNjZiMzFjLnNldENvbnRlbnQoaHRtbF85ODcxMjI2NjBiZjg0ODcyOWE1YTc3ZWU0ZjFiNDlmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zM2U2MTI3ZmNlM2M0OGExOTFhZDQzNmFlZjA1NmFhMS5iaW5kUG9wdXAocG9wdXBfOWFhYjQyN2YzY2FlNGM5NWFhNTE1M2MxNWU2NmIzMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM1NWE3NDJhODVkNDllYWFlNTE0NTIwNGMwMDMwNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyNjRiZTAxOWVkODRkNmZhMjM4YWJiNjYxMTkzZThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiOTczZmM4NDU0MDQ4M2FhODdiZTk1MzE4Y2ZlNWQxID0gJCgnPGRpdiBpZD0iaHRtbF8wYjk3M2ZjODQ1NDA0ODNhYTg3YmU5NTMxOGNmZTVkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI2NGJlMDE5ZWQ4NGQ2ZmEyMzhhYmI2NjExOTNlOGUuc2V0Q29udGVudChodG1sXzBiOTczZmM4NDU0MDQ4M2FhODdiZTk1MzE4Y2ZlNWQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzNTVhNzQyYTg1ZDQ5ZWFhZTUxNDUyMDRjMDAzMDRiLmJpbmRQb3B1cChwb3B1cF9iMjY0YmUwMTllZDg0ZDZmYTIzOGFiYjY2MTE5M2U4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmVhNWE4NzY2MjY0YmQyODAxODU4YmYzZTRmNGEzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODNkNTc2ZjY4ZmE0MmI3YWFiYjBiNGJiYTEwYzlmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTI4NzRlYjk3MTg0MzRmOTZlODdmMDBlMGJiMzcyNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjEyODc0ZWI5NzE4NDM0Zjk2ZTg3ZjAwZTBiYjM3MjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTgzZDU3NmY2OGZhNDJiN2FhYmIwYjRiYmExMGM5ZmEuc2V0Q29udGVudChodG1sX2IxMjg3NGViOTcxODQzNGY5NmU4N2YwMGUwYmIzNzI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmZWE1YTg3NjYyNjRiZDI4MDE4NThiZjNlNGY0YTM3LmJpbmRQb3B1cChwb3B1cF81ODNkNTc2ZjY4ZmE0MmI3YWFiYjBiNGJiYTEwYzlmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjA1MWM3YjNiZjg0YTRiYjg0YTEyMDk3NTZhMTg2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQ5NmQ4ZTM1NmRlNGIzZThiMDU0YmU3ODgzZWMzMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODcxMzUxOGExNzEzNDUyZGE3YTBmMWM0Mjc4NTIxMGYgPSAkKCc8ZGl2IGlkPSJodG1sXzg3MTM1MThhMTcxMzQ1MmRhN2EwZjFjNDI3ODUyMTBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzQ5NmQ4ZTM1NmRlNGIzZThiMDU0YmU3ODgzZWMzMTEuc2V0Q29udGVudChodG1sXzg3MTM1MThhMTcxMzQ1MmRhN2EwZjFjNDI3ODUyMTBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyMDUxYzdiM2JmODRhNGJiODRhMTIwOTc1NmExODY5LmJpbmRQb3B1cChwb3B1cF83NDk2ZDhlMzU2ZGU0YjNlOGIwNTRiZTc4ODNlYzMxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjlmOTNmOTg5NGM0ZTQ0ODBlMjhhNjRjMGRlYjZmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTI4NjcwZTdhODM0Mjk5YmQxNmIzZThlYjJhM2FiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzYzNWQyNDczOTQ0ZWUyYmY1Y2ExNmMyMzg2NjFjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjM2MzVkMjQ3Mzk0NGVlMmJmNWNhMTZjMjM4NjYxYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmEyODY3MGU3YTgzNDI5OWJkMTZiM2U4ZWIyYTNhYmUuc2V0Q29udGVudChodG1sXzYzNjM1ZDI0NzM5NDRlZTJiZjVjYTE2YzIzODY2MWM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2OWY5M2Y5ODk0YzRlNDQ4MGUyOGE2NGMwZGViNmZiLmJpbmRQb3B1cChwb3B1cF82YTI4NjcwZTdhODM0Mjk5YmQxNmIzZThlYjJhM2FiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Y2NhNGU1Yzc1MjQ0NDE5YmFkOTk0YTBkMzQ4YWE0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOWExZTQ1ZDI2YTU0MDY4YTk4YTQ5YjRiMDJkMTNjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85M2JiN2I4ZTE4MGI0NWM4YThmZGJkZTYyMjVkZjk5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTNiYjdiOGUxODBiNDVjOGE4ZmRiZGU2MjI1ZGY5OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOWExZTQ1ZDI2YTU0MDY4YTk4YTQ5YjRiMDJkMTNjOS5zZXRDb250ZW50KGh0bWxfOTNiYjdiOGUxODBiNDVjOGE4ZmRiZGU2MjI1ZGY5OWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmNjYTRlNWM3NTI0NDQxOWJhZDk5NGEwZDM0OGFhNDYuYmluZFBvcHVwKHBvcHVwX2U5YTFlNDVkMjZhNTQwNjhhOThhNDliNGIwMmQxM2M5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmMjUwMDNiNTE4NTQ2ZWVhYjE0YWQ4ZmUzYTkyNTg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0MTI0ZTIwNDdlNzRhNWY4ZTczMjdjOTU5M2ZjYTcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4NzUxMWYyMThiZTQ3MjA5NzE5YjEzNjM3MmUyODk4ID0gJCgnPGRpdiBpZD0iaHRtbF9lODc1MTFmMjE4YmU0NzIwOTcxOWIxMzYzNzJlMjg5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0MTI0ZTIwNDdlNzRhNWY4ZTczMjdjOTU5M2ZjYTcwLnNldENvbnRlbnQoaHRtbF9lODc1MTFmMjE4YmU0NzIwOTcxOWIxMzYzNzJlMjg5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZjI1MDAzYjUxODU0NmVlYWIxNGFkOGZlM2E5MjU4NS5iaW5kUG9wdXAocG9wdXBfYjQxMjRlMjA0N2U3NGE1ZjhlNzMyN2M5NTkzZmNhNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTkwOGI5Y2I2MTZiNDdlNmIzYTM4MjMwMDQzOTM4OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlMGQyZGIzODc3OTRmZGM4NDFiYzk2MDZjNTQ3OTg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NGUxNDgzNzgzZDRlZTk5ZjZjZGExNTExMzhmYzY0ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjRlMTQ4Mzc4M2Q0ZWU5OWY2Y2RhMTUxMTM4ZmM2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlMGQyZGIzODc3OTRmZGM4NDFiYzk2MDZjNTQ3OTg4LnNldENvbnRlbnQoaHRtbF8yNjRlMTQ4Mzc4M2Q0ZWU5OWY2Y2RhMTUxMTM4ZmM2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTA4YjljYjYxNmI0N2U2YjNhMzgyMzAwNDM5Mzg5Ny5iaW5kUG9wdXAocG9wdXBfYmUwZDJkYjM4Nzc5NGZkYzg0MWJjOTYwNmM1NDc5ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ExZDYyZjRkMjM4NDgzMmFjMGQwNWZkZTNkNTU5YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzI4ZDFhYjE5NTM5NGIyOWExZmEwOWM4OTZkOGY3YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTJiOTU3YzFhODI4NDdhZjhlOTAwZWI2MjQwYzcxMTMgPSAkKCc8ZGl2IGlkPSJodG1sX2EyYjk1N2MxYTgyODQ3YWY4ZTkwMGViNjI0MGM3MTEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzI4ZDFhYjE5NTM5NGIyOWExZmEwOWM4OTZkOGY3YTQuc2V0Q29udGVudChodG1sX2EyYjk1N2MxYTgyODQ3YWY4ZTkwMGViNjI0MGM3MTEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhMWQ2MmY0ZDIzODQ4MzJhYzBkMDVmZGUzZDU1OWJmLmJpbmRQb3B1cChwb3B1cF83MjhkMWFiMTk1Mzk0YjI5YTFmYTA5Yzg5NmQ4ZjdhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYTg5Njg3YzA5YTI0MDA1YTZhYzJjZjYyYjA4MzQ4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iN2M3ZDczNDBlZmM0NzNhYWRiYmVhYzA5NzlhYWRiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OTM2ODYwNWU4OWM0YTEyOTA3MzNmYjMyYzczZTgyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTkzNjg2MDVlODljNGExMjkwNzMzZmIzMmM3M2U4MmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdjN2Q3MzQwZWZjNDczYWFkYmJlYWMwOTc5YWFkYjEuc2V0Q29udGVudChodG1sXzU5MzY4NjA1ZTg5YzRhMTI5MDczM2ZiMzJjNzNlODJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhODk2ODdjMDlhMjQwMDVhNmFjMmNmNjJiMDgzNDgyLmJpbmRQb3B1cChwb3B1cF9iN2M3ZDczNDBlZmM0NzNhYWRiYmVhYzA5NzlhYWRiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2QwZjA2NmMxN2Y0ODFhOGRmYzZhMmQzMGQ4ZGE3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzJiODhkMWJhNDQ3NGQ3NzgyMTU2NjU4ZDZmNjc0MDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTcyYjZmMDY0MzlkNDgzZjk3ZmJkMjk5ZGRkYTc3MDggPSAkKCc8ZGl2IGlkPSJodG1sXzU3MmI2ZjA2NDM5ZDQ4M2Y5N2ZiZDI5OWRkZGE3NzA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMmI4OGQxYmE0NDc0ZDc3ODIxNTY2NThkNmY2NzQwOS5zZXRDb250ZW50KGh0bWxfNTcyYjZmMDY0MzlkNDgzZjk3ZmJkMjk5ZGRkYTc3MDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTNkMGYwNjZjMTdmNDgxYThkZmM2YTJkMzBkOGRhN2YuYmluZFBvcHVwKHBvcHVwX2MyYjg4ZDFiYTQ0NzRkNzc4MjE1NjY1OGQ2ZjY3NDA5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiM2M2MDk1MWRkYTQwZjQ5ZDBmOGI3NTQ4Y2JiYzkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTQ5Yjg1MGE4ZTc0NDllYjE3YjAwMTUzODk4ZDUzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODUzMzRjYWY3NDY0OWY0ODI1NjFjMzQ5OTI5YjJmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg1MzM0Y2FmNzQ2NDlmNDgyNTYxYzM0OTkyOWIyZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjE0OWI4NTBhOGU3NDQ5ZWIxN2IwMDE1Mzg5OGQ1M2Uuc2V0Q29udGVudChodG1sXzU4NTMzNGNhZjc0NjQ5ZjQ4MjU2MWMzNDk5MjliMmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiM2M2MDk1MWRkYTQwZjQ5ZDBmOGI3NTQ4Y2JiYzkyLmJpbmRQb3B1cChwb3B1cF82MTQ5Yjg1MGE4ZTc0NDllYjE3YjAwMTUzODk4ZDUzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMTdkZGMxMzM3MDg0ZjI4YWEyZDRhYzI5NDhjNzJkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNGVjN2U5M2Q0OGU0NTAwYTcxYmY5ZTBmNDdiOTMyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGViNzgxZTU2ZjE0MDkyYWZhOWJlZWQwZWFjOWI5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWRlYjc4MWU1NmYxNDA5MmFmYTliZWVkMGVhYzliOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0ZWM3ZTkzZDQ4ZTQ1MDBhNzFiZjllMGY0N2I5MzJjLnNldENvbnRlbnQoaHRtbF81ZGViNzgxZTU2ZjE0MDkyYWZhOWJlZWQwZWFjOWI5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMTdkZGMxMzM3MDg0ZjI4YWEyZDRhYzI5NDhjNzJkNy5iaW5kUG9wdXAocG9wdXBfZTRlYzdlOTNkNDhlNDUwMGE3MWJmOWUwZjQ3YjkzMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmUyODg4YjgzYjFjNDVjN2JlYzA3MGE5NTcyMzY0MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODMxZTBmMTczNTI3NDMzMWE2NzQ5Njc0Zjg0YmM3OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJlNDhiMjc2OTdmNGI5Nzk0NzViOGUxZDk5ZmM3NTIgPSAkKCc8ZGl2IGlkPSJodG1sXzJiZTQ4YjI3Njk3ZjRiOTc5NDc1YjhlMWQ5OWZjNzUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzFlMGYxNzM1Mjc0MzMxYTY3NDk2NzRmODRiYzc4YS5zZXRDb250ZW50KGh0bWxfMmJlNDhiMjc2OTdmNGI5Nzk0NzViOGUxZDk5ZmM3NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUyODg4YjgzYjFjNDVjN2JlYzA3MGE5NTcyMzY0MmUuYmluZFBvcHVwKHBvcHVwXzgzMWUwZjE3MzUyNzQzMzFhNjc0OTY3NGY4NGJjNzhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViZjFiMTQ2M2NmMDQ1NzI5N2RhM2ZlMWIxZjRhZmI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4MmU0YzBjNmQwNjRjYzVhMTZiMWM3ODBhMDA1NWExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5MGZhZGYxMzdkYzQwYzRhMzg2NDg4MWE3ODJlZjlhID0gJCgnPGRpdiBpZD0iaHRtbF8yOTBmYWRmMTM3ZGM0MGM0YTM4NjQ4ODFhNzgyZWY5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4MmU0YzBjNmQwNjRjYzVhMTZiMWM3ODBhMDA1NWExLnNldENvbnRlbnQoaHRtbF8yOTBmYWRmMTM3ZGM0MGM0YTM4NjQ4ODFhNzgyZWY5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YmYxYjE0NjNjZjA0NTcyOTdkYTNmZTFiMWY0YWZiNS5iaW5kUG9wdXAocG9wdXBfYzgyZTRjMGM2ZDA2NGNjNWExNmIxYzc4MGEwMDU1YTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNmMjAzOTNkMGViNDZmMjgxZTBmMWQ4YWMxZDhhYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5Mjg5YWFjMjM5ZjRhNDhhYTcyMzRiZGEwOTQ5OTNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViNTIzNmY4NDdlOTQ3MzQ5NzFjMGY0MjQ4ZWQyY2E3ID0gJCgnPGRpdiBpZD0iaHRtbF9lYjUyMzZmODQ3ZTk0NzM0OTcxYzBmNDI0OGVkMmNhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzkyODlhYWMyMzlmNGE0OGFhNzIzNGJkYTA5NDk5M2Quc2V0Q29udGVudChodG1sX2ViNTIzNmY4NDdlOTQ3MzQ5NzFjMGY0MjQ4ZWQyY2E3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjZjIwMzkzZDBlYjQ2ZjI4MWUwZjFkOGFjMWQ4YWM1LmJpbmRQb3B1cChwb3B1cF9jOTI4OWFhYzIzOWY0YTQ4YWE3MjM0YmRhMDk0OTkzZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzQ2YzQ2YTMxYTg0YmRlODY1YTk5OGM1ZDI4NjYxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM2NjcxYzY3ZmMyNDE1NmI5NTUwNzRiYmFmZGUyZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTJkOTNiNzc3YWRhNGY3Njg4YTQwMmVhYjBmMDJjMjAgPSAkKCc8ZGl2IGlkPSJodG1sX2EyZDkzYjc3N2FkYTRmNzY4OGE0MDJlYWIwZjAyYzIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM2NjcxYzY3ZmMyNDE1NmI5NTUwNzRiYmFmZGUyZjAuc2V0Q29udGVudChodG1sX2EyZDkzYjc3N2FkYTRmNzY4OGE0MDJlYWIwZjAyYzIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3NDZjNDZhMzFhODRiZGU4NjVhOTk4YzVkMjg2NjE2LmJpbmRQb3B1cChwb3B1cF9mMzY2NzFjNjdmYzI0MTU2Yjk1NTA3NGJiYWZkZTJmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNGNiNzZhM2EwNjk0Njk0OTU1ZmVlNjcxODZjODFhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWZlNTNkZWRlZDM5NDkzYmExZDdkNWRlZjMxZTQ5M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNhMDlhYTdlODE5NDllYWFiMjg0Mjg5ODg0ZWZkMjAgPSAkKCc8ZGl2IGlkPSJodG1sXzJjYTA5YWE3ZTgxOTQ5ZWFhYjI4NDI4OTg4NGVmZDIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmU1M2RlZGVkMzk0OTNiYTFkN2Q1ZGVmMzFlNDkzYy5zZXRDb250ZW50KGh0bWxfMmNhMDlhYTdlODE5NDllYWFiMjg0Mjg5ODg0ZWZkMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDRjYjc2YTNhMDY5NDY5NDk1NWZlZTY3MTg2YzgxYTUuYmluZFBvcHVwKHBvcHVwXzFmZTUzZGVkZWQzOTQ5M2JhMWQ3ZDVkZWYzMWU0OTNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I0ZWZkNTI0YWU0MjQzMTVhNmNmODZmMzViZWQ1MTZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODMxMDE2MTJlZDE0NGUyYTlhNGQ1ZDcyYzMxZDYxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmM3ZGU5NjJmYmM0Yjc5OTY3MDdmNWU2MDk0MzI3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmZjN2RlOTYyZmJjNGI3OTk2NzA3ZjVlNjA5NDMyN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDgzMTAxNjEyZWQxNDRlMmE5YTRkNWQ3MmMzMWQ2MWQuc2V0Q29udGVudChodG1sX2JmYzdkZTk2MmZiYzRiNzk5NjcwN2Y1ZTYwOTQzMjdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I0ZWZkNTI0YWU0MjQzMTVhNmNmODZmMzViZWQ1MTZhLmJpbmRQb3B1cChwb3B1cF8wODMxMDE2MTJlZDE0NGUyYTlhNGQ1ZDcyYzMxZDYxZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMmVmNmVjZTczZmU0YzA0OGIyMWI4OGUxZDdkOGQzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWVkMTBlMGRmNTU3NDMxYmFmNmE4MGY2NGRiZDFjMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDc3NGE0MjMyZDgxNGYzMGJkODY0YWFjYTEzNTUxODcgPSAkKCc8ZGl2IGlkPSJodG1sXzA3NzRhNDIzMmQ4MTRmMzBiZDg2NGFhY2ExMzU1MTg3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZWQxMGUwZGY1NTc0MzFiYWY2YTgwZjY0ZGJkMWMwMi5zZXRDb250ZW50KGh0bWxfMDc3NGE0MjMyZDgxNGYzMGJkODY0YWFjYTEzNTUxODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTJlZjZlY2U3M2ZlNGMwNDhiMjFiODhlMWQ3ZDhkM2YuYmluZFBvcHVwKHBvcHVwX2FlZDEwZTBkZjU1NzQzMWJhZjZhODBmNjRkYmQxYzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3Njk0MTQ4YzljYjQ2ZGZiZWU3OTI5ZWY0MzgyNmUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTY1NmQ5OTYzMjkxNGQ0YWJkZDM2MTJhZDk2ZWY1NTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE4ZThjOGExOGVlNDkwNGIzNmEzN2RkMzk0YTRjMmYgPSAkKCc8ZGl2IGlkPSJodG1sX2UxOGU4YzhhMThlZTQ5MDRiMzZhMzdkZDM5NGE0YzJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2NTZkOTk2MzI5MTRkNGFiZGQzNjEyYWQ5NmVmNTUzLnNldENvbnRlbnQoaHRtbF9lMThlOGM4YTE4ZWU0OTA0YjM2YTM3ZGQzOTRhNGMyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzY5NDE0OGM5Y2I0NmRmYmVlNzkyOWVmNDM4MjZlMi5iaW5kUG9wdXAocG9wdXBfOTY1NmQ5OTYzMjkxNGQ0YWJkZDM2MTJhZDk2ZWY1NTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWYwNTA2YjhjYjM0NDU5MDgzMWRmOTQwOGRlZjljNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWY5OTllYjAzMTQ2NDg3ZmJiOGM2ZTllOWMwM2U4MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmUyOWNhNTRiMzI2NDIyOGJjMTczZjQ5ODYyYWE2ODEgPSAkKCc8ZGl2IGlkPSJodG1sXzZlMjljYTU0YjMyNjQyMjhiYzE3M2Y0OTg2MmFhNjgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmOTk5ZWIwMzE0NjQ4N2ZiYjhjNmU5ZTljMDNlODAxLnNldENvbnRlbnQoaHRtbF82ZTI5Y2E1NGIzMjY0MjI4YmMxNzNmNDk4NjJhYTY4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjA1MDZiOGNiMzQ0NTkwODMxZGY5NDA4ZGVmOWM3MS5iaW5kUG9wdXAocG9wdXBfYWY5OTllYjAzMTQ2NDg3ZmJiOGM2ZTllOWMwM2U4MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODYzYTRhNmFkNWI0NDRiMzg4NWQ4MjM5YjNiNWY1MjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5ZjRlMmJkOWEzMzRmODZiMTA3MWFjNDVmZjIwNTEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczYTU2YWRhZWRiNzRjNjFhNjQwNDE2OGNkZDI2MmRiID0gJCgnPGRpdiBpZD0iaHRtbF83M2E1NmFkYWVkYjc0YzYxYTY0MDQxNjhjZGQyNjJkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWY0ZTJiZDlhMzM0Zjg2YjEwNzFhYzQ1ZmYyMDUxMC5zZXRDb250ZW50KGh0bWxfNzNhNTZhZGFlZGI3NGM2MWE2NDA0MTY4Y2RkMjYyZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODYzYTRhNmFkNWI0NDRiMzg4NWQ4MjM5YjNiNWY1MjYuYmluZFBvcHVwKHBvcHVwXzM5ZjRlMmJkOWEzMzRmODZiMTA3MWFjNDVmZjIwNTEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjMDE1NmJlMzFjZTQxYWM5ZTY2NjA4ZGRlZTNhYjUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZWFkZmJkNjE1MGI0ZWQzODYyZWViYjRmMDE0ZjU4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMGZmZDhjZTM5OTU0M2Y0OGFjMWM2N2M2YjYxZjgxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzBmZmQ4Y2UzOTk1NDNmNDhhYzFjNjdjNmI2MWY4MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWFkZmJkNjE1MGI0ZWQzODYyZWViYjRmMDE0ZjU4MC5zZXRDb250ZW50KGh0bWxfMzBmZmQ4Y2UzOTk1NDNmNDhhYzFjNjdjNmI2MWY4MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2MwMTU2YmUzMWNlNDFhYzllNjY2MDhkZGVlM2FiNTMuYmluZFBvcHVwKHBvcHVwXzJlYWRmYmQ2MTUwYjRlZDM4NjJlZWJiNGYwMTRmNTgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllZmE4ZGU0MmQ0MjQ4MzVhMzZmYjI5YmU5N2U4OTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjE5NGNmZGU1MWE0MzI1ODBmOWFkNWZmNjI2N2QwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YWZlMzliOTZjYjg0NjU4YTUyMDExMWQ5NzlkMTk1ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWFmZTM5Yjk2Y2I4NDY1OGE1MjAxMTFkOTc5ZDE5NWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjE5NGNmZGU1MWE0MzI1ODBmOWFkNWZmNjI2N2QwNy5zZXRDb250ZW50KGh0bWxfOWFmZTM5Yjk2Y2I4NDY1OGE1MjAxMTFkOTc5ZDE5NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWVmYThkZTQyZDQyNDgzNWEzNmZiMjliZTk3ZTg5NjEuYmluZFBvcHVwKHBvcHVwXzM2MTk0Y2ZkZTUxYTQzMjU4MGY5YWQ1ZmY2MjY3ZDA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiMzcxNTExODNlMDRjYWZiMjI5NDUyOWU2YmUzOTQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyMjczMWU0N2RhOTRhNWZhZjI4OTFkZDI0ZTJmY2U0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkMGMwZWJmZmI4OTRmOWFhZWMxMWFmNDE4OTM1ZDA0ID0gJCgnPGRpdiBpZD0iaHRtbF9mZDBjMGViZmZiODk0ZjlhYWVjMTFhZjQxODkzNWQwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjIyNzMxZTQ3ZGE5NGE1ZmFmMjg5MWRkMjRlMmZjZTQuc2V0Q29udGVudChodG1sX2ZkMGMwZWJmZmI4OTRmOWFhZWMxMWFmNDE4OTM1ZDA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiMzcxNTExODNlMDRjYWZiMjI5NDUyOWU2YmUzOTQxLmJpbmRQb3B1cChwb3B1cF8yMjI3MzFlNDdkYTk0YTVmYWYyODkxZGQyNGUyZmNlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmFhYmE1NDBmMGQ0OWI4YmUwODlkMjA2ZTkzOWU1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTdmOTI3ODBmYTk0OTgzYjFjN2IxMjI2Y2Q1NjcwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDg4YjZiODNlZjg0YmZhODM3NWE3MDJhMmY5ZTI4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQ4OGI2YjgzZWY4NGJmYTgzNzVhNzAyYTJmOWUyODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1N2Y5Mjc4MGZhOTQ5ODNiMWM3YjEyMjZjZDU2NzA4LnNldENvbnRlbnQoaHRtbF81ZDg4YjZiODNlZjg0YmZhODM3NWE3MDJhMmY5ZTI4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZmFhYmE1NDBmMGQ0OWI4YmUwODlkMjA2ZTkzOWU1OS5iaW5kUG9wdXAocG9wdXBfMzU3ZjkyNzgwZmE5NDk4M2IxYzdiMTIyNmNkNTY3MDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTJiMGYwYWQ0MTg3NGQ4MmE0NWQ4MTdlYjZjNTc1YzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDljMzhhMWIzYTQyNDg0Njg0ZTczMjdjYTE2ZDZjMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTRlMmUxNWQ3YTA5NDZhNDk1MGNkMmU3NDM4ZDM5MzAgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ZTJlMTVkN2EwOTQ2YTQ5NTBjZDJlNzQzOGQzOTMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDljMzhhMWIzYTQyNDg0Njg0ZTczMjdjYTE2ZDZjMWMuc2V0Q29udGVudChodG1sXzU0ZTJlMTVkN2EwOTQ2YTQ5NTBjZDJlNzQzOGQzOTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyYjBmMGFkNDE4NzRkODJhNDVkODE3ZWI2YzU3NWMzLmJpbmRQb3B1cChwb3B1cF8wOWMzOGExYjNhNDI0ODQ2ODRlNzMyN2NhMTZkNmMxYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTFjYjczNDQ4MGQ0YmQ5YjRhOTVlN2ZiM2YzODAwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTc0OWQzNmU5YjZhNGQxM2FhZWZlNmEzOWY5MjU3NzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGY5Nzc4YTE0M2Y5NDdhZWIzM2ExZjU1ZDY4ZWNlNmIgPSAkKCc8ZGl2IGlkPSJodG1sXzBmOTc3OGExNDNmOTQ3YWViMzNhMWY1NWQ2OGVjZTZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTc0OWQzNmU5YjZhNGQxM2FhZWZlNmEzOWY5MjU3NzUuc2V0Q29udGVudChodG1sXzBmOTc3OGExNDNmOTQ3YWViMzNhMWY1NWQ2OGVjZTZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhMWNiNzM0NDgwZDRiZDliNGE5NWU3ZmIzZjM4MDAxLmJpbmRQb3B1cChwb3B1cF85NzQ5ZDM2ZTliNmE0ZDEzYWFlZmU2YTM5ZjkyNTc3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjNmN2UzMThhMGM0ZWExYjllMmFiYzc4N2Q5MzUzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lODczZTdjMzM5ODE0NmQ3OTQ5Mzg5MDU2ZTdjNGYwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNWU3OTAxYzBjY2Y0OGI3OGE0NTk1NjJhMzlkNjg0NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzVlNzkwMWMwY2NmNDhiNzhhNDU5NTYyYTM5ZDY4NDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODczZTdjMzM5ODE0NmQ3OTQ5Mzg5MDU2ZTdjNGYwYy5zZXRDb250ZW50KGh0bWxfMzVlNzkwMWMwY2NmNDhiNzhhNDU5NTYyYTM5ZDY4NDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWYzZjdlMzE4YTBjNGVhMWI5ZTJhYmM3ODdkOTM1M2EuYmluZFBvcHVwKHBvcHVwX2U4NzNlN2MzMzk4MTQ2ZDc5NDkzODkwNTZlN2M0ZjBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiYTRlYjQ5YzJiYzQ5N2U4ZTgwMmQ4OWYyZThiZWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmMjk5ZmQ4MTBiNDQwZTY4NzUzZTdlNTk5MzA2Y2NlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwNzBjMTkxYWRkZjQyMmViZjAwMGZlYmUwMmNhMGVlID0gJCgnPGRpdiBpZD0iaHRtbF9kMDcwYzE5MWFkZGY0MjJlYmYwMDBmZWJlMDJjYTBlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjI5OWZkODEwYjQ0MGU2ODc1M2U3ZTU5OTMwNmNjZS5zZXRDb250ZW50KGh0bWxfZDA3MGMxOTFhZGRmNDIyZWJmMDAwZmViZTAyY2EwZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmJhNGViNDljMmJjNDk3ZThlODAyZDg5ZjJlOGJlZWUuYmluZFBvcHVwKHBvcHVwX2VmMjk5ZmQ4MTBiNDQwZTY4NzUzZTdlNTk5MzA2Y2NlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkODY1NjgzMjMyZjQzZjQ5N2MyMWFhZWNlYzhhZTYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MmYwMDU2ZTQzMzA0OTAwYWQ4MjM4YmFhNTZhNjRkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNDA2NGQyN2EyMDk0OTI4YjRkYWNmODkyYmY4MTVmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDQwNjRkMjdhMjA5NDkyOGI0ZGFjZjg5MmJmODE1ZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MmYwMDU2ZTQzMzA0OTAwYWQ4MjM4YmFhNTZhNjRkMS5zZXRDb250ZW50KGh0bWxfZDQwNjRkMjdhMjA5NDkyOGI0ZGFjZjg5MmJmODE1ZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGQ4NjU2ODMyMzJmNDNmNDk3YzIxYWFlY2VjOGFlNjAuYmluZFBvcHVwKHBvcHVwXzcyZjAwNTZlNDMzMDQ5MDBhZDgyMzhiYWE1NmE2NGQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2MWM0MmM4ODA5ZjQ5NjRhYzM4YmJlOGJmYmM4MGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1ZWRmYWFjNjFiYzRhM2FiOTIxODM0NmNkZmYyN2YyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlMGE1NTIxMzljNTRkNDRiN2JjMWNjZjU2ZGJhNzk0ID0gJCgnPGRpdiBpZD0iaHRtbF8wZTBhNTUyMTM5YzU0ZDQ0YjdiYzFjY2Y1NmRiYTc5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1ZWRmYWFjNjFiYzRhM2FiOTIxODM0NmNkZmYyN2YyLnNldENvbnRlbnQoaHRtbF8wZTBhNTUyMTM5YzU0ZDQ0YjdiYzFjY2Y1NmRiYTc5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NjFjNDJjODgwOWY0OTY0YWMzOGJiZThiZmJjODBlMC5iaW5kUG9wdXAocG9wdXBfMjVlZGZhYWM2MWJjNGEzYWI5MjE4MzQ2Y2RmZjI3ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmEyNmYyODg0ZTk4NDk3OTgxNzlmNmMxYjJkY2Q2MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFhMGQ2Zjg2ODlhNDRhMTkyNWQzMTYyYjIwNDQ2YmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODI2MDNhYjkzZjU0NGVkY2E0ODZjNmE4MzdhYzI2NDcgPSAkKCc8ZGl2IGlkPSJodG1sXzgyNjAzYWI5M2Y1NDRlZGNhNDg2YzZhODM3YWMyNjQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFhMGQ2Zjg2ODlhNDRhMTkyNWQzMTYyYjIwNDQ2YmIuc2V0Q29udGVudChodG1sXzgyNjAzYWI5M2Y1NDRlZGNhNDg2YzZhODM3YWMyNjQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhMjZmMjg4NGU5ODQ5Nzk4MTc5ZjZjMWIyZGNkNjMxLmJpbmRQb3B1cChwb3B1cF81YWEwZDZmODY4OWE0NGExOTI1ZDMxNjJiMjA0NDZiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmE5ZGRmZDU3MGQ0ZTZiYjRjY2VkNjAwOThlMGQ5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lY2UyNWZkYTI0Yzc0MjAyOGU1YmFmNDljMTQwYzg0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTY3MjBhNzM4OTI0NDc0YmRmNzE2ZGQ4ZWIwNzY3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzk2NzIwYTczODkyNDQ3NGJkZjcxNmRkOGViMDc2NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lY2UyNWZkYTI0Yzc0MjAyOGU1YmFmNDljMTQwYzg0Yy5zZXRDb250ZW50KGh0bWxfNzk2NzIwYTczODkyNDQ3NGJkZjcxNmRkOGViMDc2NzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZhOWRkZmQ1NzBkNGU2YmI0Y2NlZDYwMDk4ZTBkOTguYmluZFBvcHVwKHBvcHVwX2VjZTI1ZmRhMjRjNzQyMDI4ZTViYWY0OWMxNDBjODRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhNjE2OTdkYjlkZDQ4MjA4YTM1NjA1MGU0MjEyMTJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyOTlkN2U1Nzc5MjQ3M2Q4MmNhOTVkMWFiYTNlZmVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyYTY0Zjg3NTM1MDQ0MTBhZjc3NjZjZmExMmFiMDYzID0gJCgnPGRpdiBpZD0iaHRtbF9mMmE2NGY4NzUzNTA0NDEwYWY3NzY2Y2ZhMTJhYjA2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyOTlkN2U1Nzc5MjQ3M2Q4MmNhOTVkMWFiYTNlZmVlLnNldENvbnRlbnQoaHRtbF9mMmE2NGY4NzUzNTA0NDEwYWY3NzY2Y2ZhMTJhYjA2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYTYxNjk3ZGI5ZGQ0ODIwOGEzNTYwNTBlNDIxMjEyYy5iaW5kUG9wdXAocG9wdXBfMDI5OWQ3ZTU3NzkyNDczZDgyY2E5NWQxYWJhM2VmZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjU3OTY4OTlhZjE2NGFkZjhkM2MyMjdmMTA2ZmZjMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE0ZGI3ODkzNDc5NDIwNTlhMDc2NGZhMTQwMjY2ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNiMDExNDFhN2VlNDIwZTgwNTk1NTQzMjY2ZDE0ZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzhjYjAxMTQxYTdlZTQyMGU4MDU5NTU0MzI2NmQxNGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzE0ZGI3ODkzNDc5NDIwNTlhMDc2NGZhMTQwMjY2ZDMuc2V0Q29udGVudChodG1sXzhjYjAxMTQxYTdlZTQyMGU4MDU5NTU0MzI2NmQxNGUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1Nzk2ODk5YWYxNjRhZGY4ZDNjMjI3ZjEwNmZmYzEyLmJpbmRQb3B1cChwb3B1cF8zMTRkYjc4OTM0Nzk0MjA1OWEwNzY0ZmExNDAyNjZkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MjQyZWVhODcyYWE0MGZmOTZmODNiMTU2ZDA3NTNmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzUyNmQ2OWY5YmE0YThkYmJhZTI1NjZiMDQzMmMxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNDQ3N2UwYzg4MjU0NmVkODdiNDRiZTBhYTFlNThhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTQ0NzdlMGM4ODI1NDZlZDg3YjQ0YmUwYWExZTU4YWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzUyNmQ2OWY5YmE0YThkYmJhZTI1NjZiMDQzMmMxOC5zZXRDb250ZW50KGh0bWxfMTQ0NzdlMGM4ODI1NDZlZDg3YjQ0YmUwYWExZTU4YWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTI0MmVlYTg3MmFhNDBmZjk2ZjgzYjE1NmQwNzUzZmMuYmluZFBvcHVwKHBvcHVwX2VjNTI2ZDY5ZjliYTRhOGRiYmFlMjU2NmIwNDMyYzE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiYWEyMTZiYWI2ZDQ0NmRiYzVlYjYzZDJkZjUwNWE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjE4MDRlNWM4MWY0OWI1YmQ1MmJjYWE5MDNmYWRlMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzM0MDA4YzY1NmU0NjliODBiYmRmOTFkNDI0N2FmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjczNDAwOGM2NTZlNDY5YjgwYmJkZjkxZDQyNDdhZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjIxODA0ZTVjODFmNDliNWJkNTJiY2FhOTAzZmFkZTAuc2V0Q29udGVudChodG1sX2Y3MzQwMDhjNjU2ZTQ2OWI4MGJiZGY5MWQ0MjQ3YWZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiYWEyMTZiYWI2ZDQ0NmRiYzVlYjYzZDJkZjUwNWE3LmJpbmRQb3B1cChwb3B1cF82MjE4MDRlNWM4MWY0OWI1YmQ1MmJjYWE5MDNmYWRlMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDQ5ZTE2MjAzYzM0ZmI3OTEyYzhmYTg2OTI3MjUxOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjMwMWFjZmRkZDMwNDBiZjkwM2ZmYmQyMjQ5ZTliMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJkM2VjNDVjM2YyNDdmNzllZDFkZDM5OWQzZTBhNzcgPSAkKCc8ZGl2IGlkPSJodG1sX2FiZDNlYzQ1YzNmMjQ3Zjc5ZWQxZGQzOTlkM2UwYTc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzAxYWNmZGRkMzA0MGJmOTAzZmZiZDIyNDllOWIwNi5zZXRDb250ZW50KGh0bWxfYWJkM2VjNDVjM2YyNDdmNzllZDFkZDM5OWQzZTBhNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTA0OWUxNjIwM2MzNGZiNzkxMmM4ZmE4NjkyNzI1MTguYmluZFBvcHVwKHBvcHVwX2IzMDFhY2ZkZGQzMDQwYmY5MDNmZmJkMjI0OWU5YjA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1NGUyNWM4ZWNjNTQ5OTBiOTk2YWFkY2U0NzAwMjYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5YTkyYzA1NWI3YzQyODdiZTFhOTZhM2YyNmMxMDdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5MTA4MzdjNzkzYjQ1ZTA4ZjViNTZiNzAxNDQ5NTI5ID0gJCgnPGRpdiBpZD0iaHRtbF85OTEwODM3Yzc5M2I0NWUwOGY1YjU2YjcwMTQ0OTUyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDlhOTJjMDU1YjdjNDI4N2JlMWE5NmEzZjI2YzEwN2Yuc2V0Q29udGVudChodG1sXzk5MTA4MzdjNzkzYjQ1ZTA4ZjViNTZiNzAxNDQ5NTI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1NGUyNWM4ZWNjNTQ5OTBiOTk2YWFkY2U0NzAwMjYwLmJpbmRQb3B1cChwb3B1cF9kOWE5MmMwNTViN2M0Mjg3YmUxYTk2YTNmMjZjMTA3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYmViN2NhMWUwNDQ0MTJlYTJhYjFmNzlhMDRkYTE3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTIzYmQyNWNkYzc0ZGE3YmI4Njc5YzI3ZGFkZGQxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjFhMTAyMDBlODg0YWE3YTdkYzNlMTk4Y2I0YjkxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTIxYTEwMjAwZTg4NGFhN2E3ZGMzZTE5OGNiNGI5MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxMjNiZDI1Y2RjNzRkYTdiYjg2NzljMjdkYWRkZDE5LnNldENvbnRlbnQoaHRtbF9hMjFhMTAyMDBlODg0YWE3YTdkYzNlMTk4Y2I0YjkxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYmViN2NhMWUwNDQ0MTJlYTJhYjFmNzlhMDRkYTE3ZS5iaW5kUG9wdXAocG9wdXBfNjEyM2JkMjVjZGM3NGRhN2JiODY3OWMyN2RhZGRkMTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZkNjgzMmY0YjU2NGNiYTk0NGY0NGQ5ODhmYWExMDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzMmQ3NWYzOTc5NzRlY2JhMjQ1OWZmNjE4MjJlZDdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0Yjc3ZDNmZDUxMjQ0MTQ5NWE4ZGI4ZWM4NTVmMjBkID0gJCgnPGRpdiBpZD0iaHRtbF83NGI3N2QzZmQ1MTI0NDE0OTVhOGRiOGVjODU1ZjIwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzMmQ3NWYzOTc5NzRlY2JhMjQ1OWZmNjE4MjJlZDdkLnNldENvbnRlbnQoaHRtbF83NGI3N2QzZmQ1MTI0NDE0OTVhOGRiOGVjODU1ZjIwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNmQ2ODMyZjRiNTY0Y2JhOTQ0ZjQ0ZDk4OGZhYTEwNC5iaW5kUG9wdXAocG9wdXBfMzMyZDc1ZjM5Nzk3NGVjYmEyNDU5ZmY2MTgyMmVkN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI4MDkwMDQ5YTI4NDhmOWI4OTU2MDFiMTk5MjRjODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5ZmVjMWJhMGQ1YzQzNjA4NDAwZmJlZTJkMGI3ZWYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViYjljZjNjZDEzMTQyNGE5YWYxMDViNjU1ZTRkZDRmID0gJCgnPGRpdiBpZD0iaHRtbF81YmI5Y2YzY2QxMzE0MjRhOWFmMTA1YjY1NWU0ZGQ0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5ZmVjMWJhMGQ1YzQzNjA4NDAwZmJlZTJkMGI3ZWYxLnNldENvbnRlbnQoaHRtbF81YmI5Y2YzY2QxMzE0MjRhOWFmMTA1YjY1NWU0ZGQ0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YjgwOTAwNDlhMjg0OGY5Yjg5NTYwMWIxOTkyNGM4NC5iaW5kUG9wdXAocG9wdXBfMjlmZWMxYmEwZDVjNDM2MDg0MDBmYmVlMmQwYjdlZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2QzM2YzNDQ0MjZkNDU1ZWE1MGFkZmVjNmVjZTkxMjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMGYyNzY1ZWZjYTg0ZmQzYWMyMTg4MGViNGVkMWM1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTI3MjI5MDRkNTk0NmFjODdmOGVjZDc1ZThhNDUzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDUyNzIyOTA0ZDU5NDZhYzg3ZjhlY2Q3NWU4YTQ1MzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTBmMjc2NWVmY2E4NGZkM2FjMjE4ODBlYjRlZDFjNTcuc2V0Q29udGVudChodG1sXzQ1MjcyMjkwNGQ1OTQ2YWM4N2Y4ZWNkNzVlOGE0NTM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkMzNmMzQ0NDI2ZDQ1NWVhNTBhZGZlYzZlY2U5MTIyLmJpbmRQb3B1cChwb3B1cF9hMGYyNzY1ZWZjYTg0ZmQzYWMyMTg4MGViNGVkMWM1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDEzMWI4ZmQyMDE0ZDY4ODdhNjM1ZDE0ZjA3N2Q0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNGE2NDhhYzNmM2U0NjNkYTlmYzQ0ZTk3MTg5MzM4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjRjODkzMTllMWU0ODk4YjFlZjZkODZiODM0NWFlMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTI0Yzg5MzE5ZTFlNDg5OGIxZWY2ZDg2YjgzNDVhZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTRhNjQ4YWMzZjNlNDYzZGE5ZmM0NGU5NzE4OTMzODIuc2V0Q29udGVudChodG1sX2EyNGM4OTMxOWUxZTQ4OThiMWVmNmQ4NmI4MzQ1YWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwMTMxYjhmZDIwMTRkNjg4N2E2MzVkMTRmMDc3ZDRiLmJpbmRQb3B1cChwb3B1cF8xNGE2NDhhYzNmM2U0NjNkYTlmYzQ0ZTk3MTg5MzM4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iM2RlZGVlZWVlYWQ0OWYyYjMzMTgwNGExZGU2NzdmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODU1OGMzMzE3NWQwNGQ4YTgxNDcwNTI4YzBhNDdmZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmFmNTNkZTkzMjAxNDAyM2FmOWUwYjFiNWExYzI1ZTEgPSAkKCc8ZGl2IGlkPSJodG1sX2JhZjUzZGU5MzIwMTQwMjNhZjllMGIxYjVhMWMyNWUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODU1OGMzMzE3NWQwNGQ4YTgxNDcwNTI4YzBhNDdmZjAuc2V0Q29udGVudChodG1sX2JhZjUzZGU5MzIwMTQwMjNhZjllMGIxYjVhMWMyNWUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzZGVkZWVlZWVhZDQ5ZjJiMzMxODA0YTFkZTY3N2Y2LmJpbmRQb3B1cChwb3B1cF84NTU4YzMzMTc1ZDA0ZDhhODE0NzA1MjhjMGE0N2ZmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMTFiN2IzZTA0Zjk0OTgxOWVjMGQzMmY0MWQ1M2EyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMmI3NGUyYjMyNDE0Nzc2ODAyZDBhYjRkYjViOGYwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzI0MDUxZjU5MzA0NWMxOTdmYWYwMmMyYWE5ZjdkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2MyNDA1MWY1OTMwNDVjMTk3ZmFmMDJjMmFhOWY3ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyYjc0ZTJiMzI0MTQ3NzY4MDJkMGFiNGRiNWI4ZjAwLnNldENvbnRlbnQoaHRtbF8zYzI0MDUxZjU5MzA0NWMxOTdmYWYwMmMyYWE5ZjdkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMTFiN2IzZTA0Zjk0OTgxOWVjMGQzMmY0MWQ1M2EyMy5iaW5kUG9wdXAocG9wdXBfMTJiNzRlMmIzMjQxNDc3NjgwMmQwYWI0ZGI1YjhmMDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWY0NTY0YzZjNTRlNGFiNGEzOGFkYjdmMDhmOGY1YzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2E1MTQ5YWIyMWMwNGNmZDkxNWI4YzE3ZWJkYTU4MzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDBlYjA0ZjMyZTMwNDg5Mzg1OTE4OTg1NjI3YmQzZjcgPSAkKCc8ZGl2IGlkPSJodG1sXzAwZWIwNGYzMmUzMDQ4OTM4NTkxODk4NTYyN2JkM2Y3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhNTE0OWFiMjFjMDRjZmQ5MTViOGMxN2ViZGE1ODM2LnNldENvbnRlbnQoaHRtbF8wMGViMDRmMzJlMzA0ODkzODU5MTg5ODU2MjdiZDNmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjQ1NjRjNmM1NGU0YWI0YTM4YWRiN2YwOGY4ZjVjNC5iaW5kUG9wdXAocG9wdXBfY2E1MTQ5YWIyMWMwNGNmZDkxNWI4YzE3ZWJkYTU4MzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk3MmI3MTQ0YmQ1NDNkNDg0OWE1YWNkNmMwMGE0YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJiOGY0ZTVkNWYyNGQ0NGFjNDNlMDM5NGYyM2M4YWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE4MjNjNDg0ZDM3NGRlN2I0MmQ0ZWEzZGYzMjUxM2QgPSAkKCc8ZGl2IGlkPSJodG1sXzYxODIzYzQ4NGQzNzRkZTdiNDJkNGVhM2RmMzI1MTNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyYjhmNGU1ZDVmMjRkNDRhYzQzZTAzOTRmMjNjOGFjLnNldENvbnRlbnQoaHRtbF82MTgyM2M0ODRkMzc0ZGU3YjQyZDRlYTNkZjMyNTEzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTcyYjcxNDRiZDU0M2Q0ODQ5YTVhY2Q2YzAwYTRhNi5iaW5kUG9wdXAocG9wdXBfZDJiOGY0ZTVkNWYyNGQ0NGFjNDNlMDM5NGYyM2M4YWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzUzNWY2NjNkNTZmNDRlYjkzMTM1NDIwZDI3NzQwZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliYmMyZWRmNzg4MzQ1MTVhYmJmYzNlMGQ2ZjdkMzJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxYjg4YTBjMzNlMjQyYTliNDE0ZWY0NmQxYjg5Nzc4ID0gJCgnPGRpdiBpZD0iaHRtbF9iMWI4OGEwYzMzZTI0MmE5YjQxNGVmNDZkMWI4OTc3OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWJiYzJlZGY3ODgzNDUxNWFiYmZjM2UwZDZmN2QzMmIuc2V0Q29udGVudChodG1sX2IxYjg4YTBjMzNlMjQyYTliNDE0ZWY0NmQxYjg5Nzc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1MzVmNjYzZDU2ZjQ0ZWI5MzEzNTQyMGQyNzc0MGU4LmJpbmRQb3B1cChwb3B1cF85YmJjMmVkZjc4ODM0NTE1YWJiZmMzZTBkNmY3ZDMyYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDdkYzRkYTFmNDI0MGQ0ODkzNWIzMWQ2YjBmMmFmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWUwZmZiYWNhZTYzNDQwNThiMzMyYzJhMDEwMjI0Y2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRjN2RhODAwMDlmNDg3ODlkMGRiZWE0NzU0MjEyY2QgPSAkKCc8ZGl2IGlkPSJodG1sXzc0YzdkYTgwMDA5ZjQ4Nzg5ZDBkYmVhNDc1NDIxMmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllMGZmYmFjYWU2MzQ0MDU4YjMzMmMyYTAxMDIyNGNkLnNldENvbnRlbnQoaHRtbF83NGM3ZGE4MDAwOWY0ODc4OWQwZGJlYTQ3NTQyMTJjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDdkYzRkYTFmNDI0MGQ0ODkzNWIzMWQ2YjBmMmFmOS5iaW5kUG9wdXAocG9wdXBfOWUwZmZiYWNhZTYzNDQwNThiMzMyYzJhMDEwMjI0Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDkwNTY5MDM3MTM0NDFiNThjMWMxN2U2ZmU3NTFiYmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmNiMTY3NTE5MjEwNGQ5ZjljYWIzNGUyNDFkZmQ3YTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGI5Zjk1NGE1YThhNDg1YmFhNWExNGZhODM1N2QxNDYgPSAkKCc8ZGl2IGlkPSJodG1sX2RiOWY5NTRhNWE4YTQ4NWJhYTVhMTRmYTgzNTdkMTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yY2IxNjc1MTkyMTA0ZDlmOWNhYjM0ZTI0MWRmZDdhNi5zZXRDb250ZW50KGh0bWxfZGI5Zjk1NGE1YThhNDg1YmFhNWExNGZhODM1N2QxNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDkwNTY5MDM3MTM0NDFiNThjMWMxN2U2ZmU3NTFiYmUuYmluZFBvcHVwKHBvcHVwXzJjYjE2NzUxOTIxMDRkOWY5Y2FiMzRlMjQxZGZkN2E2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkYzIzYmJhMmI2NTQ4ZTZhMmU1OGI3OGVkNWVjZDQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTE5NDkxOGY2Mzk0OGQxOGE4YmE2OGNmYmU4YTMzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYmRmY2FkMzAxNDY0M2MwYWQwYjYwOTJhZmUzYzczNyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2JkZmNhZDMwMTQ2NDNjMGFkMGI2MDkyYWZlM2M3MzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOTE5NDkxOGY2Mzk0OGQxOGE4YmE2OGNmYmU4YTMzOS5zZXRDb250ZW50KGh0bWxfY2JkZmNhZDMwMTQ2NDNjMGFkMGI2MDkyYWZlM2M3MzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGRjMjNiYmEyYjY1NDhlNmEyZTU4Yjc4ZWQ1ZWNkNDUuYmluZFBvcHVwKHBvcHVwX2U5MTk0OTE4ZjYzOTQ4ZDE4YThiYTY4Y2ZiZThhMzM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiYWU1N2JmZTZjZTQ2Nzc4MGViNTYzNGVjNDY3MTcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxZTAwOGJlOGVmYjQ1ZTBhNDlkOTg2Njg4OTMyOWIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjY2NlMGFhNGZmMzQ5ZGZiNjNkYzIxZmQ3NmMwOGRjID0gJCgnPGRpdiBpZD0iaHRtbF8wY2NjZTBhYTRmZjM0OWRmYjYzZGMyMWZkNzZjMDhkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxZTAwOGJlOGVmYjQ1ZTBhNDlkOTg2Njg4OTMyOWIzLnNldENvbnRlbnQoaHRtbF8wY2NjZTBhYTRmZjM0OWRmYjYzZGMyMWZkNzZjMDhkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYmFlNTdiZmU2Y2U0Njc3ODBlYjU2MzRlYzQ2NzE3MS5iaW5kUG9wdXAocG9wdXBfNTFlMDA4YmU4ZWZiNDVlMGE0OWQ5ODY2ODg5MzI5YjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDgzOGZkMTcyMjQ1NDJhM2E4OTQ5Zjc0MGIwMTMyYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0MjFmOGE0N2MxMjRiNGZiOGNkZTg5ZjQ4OTk3MzdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2YTgwNjdkZDczODQ2ZWFiNTFhZDFiMzVkODFiNWE3ID0gJCgnPGRpdiBpZD0iaHRtbF9iNmE4MDY3ZGQ3Mzg0NmVhYjUxYWQxYjM1ZDgxYjVhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDIxZjhhNDdjMTI0YjRmYjhjZGU4OWY0ODk5NzM3Yi5zZXRDb250ZW50KGh0bWxfYjZhODA2N2RkNzM4NDZlYWI1MWFkMWIzNWQ4MWI1YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDgzOGZkMTcyMjQ1NDJhM2E4OTQ5Zjc0MGIwMTMyYTkuYmluZFBvcHVwKHBvcHVwXzE0MjFmOGE0N2MxMjRiNGZiOGNkZTg5ZjQ4OTk3MzdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwMTRmNTgyOThiMzQzZTFiMmNlNTI2MjVmNWU0NzczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5Y2VhZGI2ZDFjYjRjMmZhOWViMTFkMDNlMjBmNjdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiNjFhZDVlNGRkZjQ0MmU4ZGIxNjE5NjZhYWI1OGM0ID0gJCgnPGRpdiBpZD0iaHRtbF9hYjYxYWQ1ZTRkZGY0NDJlOGRiMTYxOTY2YWFiNThjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5Y2VhZGI2ZDFjYjRjMmZhOWViMTFkMDNlMjBmNjdkLnNldENvbnRlbnQoaHRtbF9hYjYxYWQ1ZTRkZGY0NDJlOGRiMTYxOTY2YWFiNThjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDE0ZjU4Mjk4YjM0M2UxYjJjZTUyNjI1ZjVlNDc3My5iaW5kUG9wdXAocG9wdXBfMDljZWFkYjZkMWNiNGMyZmE5ZWIxMWQwM2UyMGY2N2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTMxMTA2MDcyNjliNGVlNWJlZDg0NzU2NGU4OWRmY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDBlMDA2ODQyMzQ0NDIwNWI1ZDU2NTMzM2FiNGUxYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmZhMjliYjlmMGIwNDJiNGE1NzExZGI5MGI1NDExNjAgPSAkKCc8ZGl2IGlkPSJodG1sX2JmYTI5YmI5ZjBiMDQyYjRhNTcxMWRiOTBiNTQxMTYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwZTAwNjg0MjM0NDQyMDViNWQ1NjUzMzNhYjRlMWMzLnNldENvbnRlbnQoaHRtbF9iZmEyOWJiOWYwYjA0MmI0YTU3MTFkYjkwYjU0MTE2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzExMDYwNzI2OWI0ZWU1YmVkODQ3NTY0ZTg5ZGZjZS5iaW5kUG9wdXAocG9wdXBfNDBlMDA2ODQyMzQ0NDIwNWI1ZDU2NTMzM2FiNGUxYzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzNjY2NkZTA1ZTE3NDgzMTljMjdmZWNiNmE1MTc1MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWNmMGY1NDIzNzYyNDQyNWFlN2ZmZGJiOWUwMWZiNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI5MmI0MDNmMTg0NGFmNzhlZDljMmQxN2JiNjYxN2UgPSAkKCc8ZGl2IGlkPSJodG1sXzliOTJiNDAzZjE4NDRhZjc4ZWQ5YzJkMTdiYjY2MTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWNmMGY1NDIzNzYyNDQyNWFlN2ZmZGJiOWUwMWZiNGQuc2V0Q29udGVudChodG1sXzliOTJiNDAzZjE4NDRhZjc4ZWQ5YzJkMTdiYjY2MTdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzY2NjZGUwNWUxNzQ4MzE5YzI3ZmVjYjZhNTE3NTM0LmJpbmRQb3B1cChwb3B1cF81Y2YwZjU0MjM3NjI0NDI1YWU3ZmZkYmI5ZTAxZmI0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNGM4ODE3NzRhYTA0ZmMwODBhYTBlOTMzNWRkNjVjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDYyOTc4ZmY0YWZiNDIxYWI0N2EyMTM3ZWQ1NjE0YzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY5OTJiMTJiODA4NGVlMjkwNjJmMzUwM2Y3ZTQ0MTIgPSAkKCc8ZGl2IGlkPSJodG1sXzZmOTkyYjEyYjgwODRlZTI5MDYyZjM1MDNmN2U0NDEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2Mjk3OGZmNGFmYjQyMWFiNDdhMjEzN2VkNTYxNGM0LnNldENvbnRlbnQoaHRtbF82Zjk5MmIxMmI4MDg0ZWUyOTA2MmYzNTAzZjdlNDQxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNGM4ODE3NzRhYTA0ZmMwODBhYTBlOTMzNWRkNjVjNy5iaW5kUG9wdXAocG9wdXBfNDYyOTc4ZmY0YWZiNDIxYWI0N2EyMTM3ZWQ1NjE0YzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjE1MzNmMDFjNzQ0NDQ0NjliOGYyNzJlYjZhMzg2NTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczYWQyZGJmMDJkYTRjOWU5M2FhMzU4ZTFiYTg2MTQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmODQ1NDQ0MTdkMzRjYTQ5MGEyNGM5ZTBhMTI1YjE5ID0gJCgnPGRpdiBpZD0iaHRtbF85Zjg0NTQ0NDE3ZDM0Y2E0OTBhMjRjOWUwYTEyNWIxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2FkMmRiZjAyZGE0YzllOTNhYTM1OGUxYmE4NjE0My5zZXRDb250ZW50KGh0bWxfOWY4NDU0NDQxN2QzNGNhNDkwYTI0YzllMGExMjViMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjE1MzNmMDFjNzQ0NDQ0NjliOGYyNzJlYjZhMzg2NTMuYmluZFBvcHVwKHBvcHVwXzczYWQyZGJmMDJkYTRjOWU5M2FhMzU4ZTFiYTg2MTQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0MzJlZTExMGRiMTQ5M2RhNDMyOGMzNTg0YTI0YWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMmIwZDA3MGVkODI0ZmU2OGY3ODA2OWJjYjNjMGJiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzc1ZDJlYWQ0YzE0MmQ3YTQyZTE3YWIyOThlZTNkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjM3NWQyZWFkNGMxNDJkN2E0MmUxN2FiMjk4ZWUzZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyYjBkMDcwZWQ4MjRmZTY4Zjc4MDY5YmNiM2MwYmJhLnNldENvbnRlbnQoaHRtbF9mMzc1ZDJlYWQ0YzE0MmQ3YTQyZTE3YWIyOThlZTNkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNDMyZWUxMTBkYjE0OTNkYTQzMjhjMzU4NGEyNGFkMi5iaW5kUG9wdXAocG9wdXBfMTJiMGQwNzBlZDgyNGZlNjhmNzgwNjliY2IzYzBiYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM1OTM1YTY1ZDA1NGYyZGEyZmQxNGM3ZWRjOTZkZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQwMDI0OGNlYjFlNGYxNzgzMDc5ZGFhMzU3Y2ExYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQ2M2QyZDJmMjdkNDU3Y2IwOWYzMTQ2MTUxM2NmZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2M0NjNkMmQyZjI3ZDQ1N2NiMDlmMzE0NjE1MTNjZmY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDAwMjQ4Y2ViMWU0ZjE3ODMwNzlkYWEzNTdjYTFiNS5zZXRDb250ZW50KGh0bWxfYzQ2M2QyZDJmMjdkNDU3Y2IwOWYzMTQ2MTUxM2NmZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWM1OTM1YTY1ZDA1NGYyZGEyZmQxNGM3ZWRjOTZkZjEuYmluZFBvcHVwKHBvcHVwX2Q0MDAyNDhjZWIxZTRmMTc4MzA3OWRhYTM1N2NhMWI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYmZiNGY1OTA4ZTRhMzNiMmU0OWRhMjFmMmJmODViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjVkMGY4ZDE1NjM2NDNjZWIwYTg5ZmI5Y2RjMDYxYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTMzOTRlZGU3M2E5NDdlODhjOTNkNzQxMGE0OGUyNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzUzMzk0ZWRlNzNhOTQ3ZTg4YzkzZDc0MTBhNDhlMjZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjVkMGY4ZDE1NjM2NDNjZWIwYTg5ZmI5Y2RjMDYxYjEuc2V0Q29udGVudChodG1sXzUzMzk0ZWRlNzNhOTQ3ZTg4YzkzZDc0MTBhNDhlMjZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhYmZiNGY1OTA4ZTRhMzNiMmU0OWRhMjFmMmJmODViLmJpbmRQb3B1cChwb3B1cF9iNWQwZjhkMTU2MzY0M2NlYjBhODlmYjljZGMwNjFiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDY4Yzg2ZTUwZTc0NDEyYTE3NWRhOTY0Y2FkODM1MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODExZTM1MTA4OWY0ZTVlOTFiODc5N2M4YzU4MWRmYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMWQ2M2Q5YTgzYjc0YWY2ODJmMzMzYWE3OTU0NTA4YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTFkNjNkOWE4M2I3NGFmNjgyZjMzM2FhNzk1NDUwOGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjgxMWUzNTEwODlmNGU1ZTkxYjg3OTdjOGM1ODFkZmMuc2V0Q29udGVudChodG1sX2ExZDYzZDlhODNiNzRhZjY4MmYzMzNhYTc5NTQ1MDhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNjhjODZlNTBlNzQ0MTJhMTc1ZGE5NjRjYWQ4MzUyLmJpbmRQb3B1cChwb3B1cF9iODExZTM1MTA4OWY0ZTVlOTFiODc5N2M4YzU4MWRmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YjQyODk4YjdhMjU0ZWM2YTBkYWIxZGFhODY5ZDY5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTUzYjFhYjZhNGQ0YTI1ODcyY2ZhODY3ZWJlMDBkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGI5ZGNmODdiNjQ0NDc4OTBhZjVkNGFiYThlYThhMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZThiOWRjZjg3YjY0NDQ3ODkwYWY1ZDRhYmE4ZWE4YTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxNTNiMWFiNmE0ZDRhMjU4NzJjZmE4NjdlYmUwMGQ4LnNldENvbnRlbnQoaHRtbF9lOGI5ZGNmODdiNjQ0NDc4OTBhZjVkNGFiYThlYThhMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YjQyODk4YjdhMjU0ZWM2YTBkYWIxZGFhODY5ZDY5ZC5iaW5kUG9wdXAocG9wdXBfYjE1M2IxYWI2YTRkNGEyNTg3MmNmYTg2N2ViZTAwZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGFiMzU3ODVmOGMzNDJiMmE2ODFjZTIyY2ZlNjQwY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzFkMTkyODYzOGY1NDRhZWIxYzFlMWFhN2M4NjQ1N2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWZjODhmZjFkNjNmNDQyNDg2MjJiMDQ2MzQzZTkxYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzFmYzg4ZmYxZDYzZjQ0MjQ4NjIyYjA0NjM0M2U5MWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzFkMTkyODYzOGY1NDRhZWIxYzFlMWFhN2M4NjQ1N2Muc2V0Q29udGVudChodG1sXzFmYzg4ZmYxZDYzZjQ0MjQ4NjIyYjA0NjM0M2U5MWJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhYjM1Nzg1ZjhjMzQyYjJhNjgxY2UyMmNmZTY0MGNjLmJpbmRQb3B1cChwb3B1cF8zMWQxOTI4NjM4ZjU0NGFlYjFjMWUxYWE3Yzg2NDU3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NjE1YTEyOWNlOGY0MDU2OTJjMGFjNTdkMmQ2NWM3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM5ZGI2ZTA2OGIyNGYxMjgzNDA4ZDg5YWZjOWUzZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzYzMWVkMmI1YzFjNDI5YjhhYmI0ZmJjZTdmNmU3OGEgPSAkKCc8ZGl2IGlkPSJodG1sX2M2MzFlZDJiNWMxYzQyOWI4YWJiNGZiY2U3ZjZlNzhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzlkYjZlMDY4YjI0ZjEyODM0MDhkODlhZmM5ZTNmZS5zZXRDb250ZW50KGh0bWxfYzYzMWVkMmI1YzFjNDI5YjhhYmI0ZmJjZTdmNmU3OGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTYxNWExMjljZThmNDA1NjkyYzBhYzU3ZDJkNjVjNzUuYmluZFBvcHVwKHBvcHVwXzEzOWRiNmUwNjhiMjRmMTI4MzQwOGQ4OWFmYzllM2ZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1YjMwOWIyMWMwMDQ1Y2Q5NmI0YmE1MzFjMzViZmE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGExMTNmMTQ2MzM2NGJlY2I2MWQ4MmM5YTMwYzlmYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzllYmY3ZDk0ZDFiNDA0OGExMDBiYTcwMmRkZGVkOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2M5ZWJmN2Q5NGQxYjQwNDhhMTAwYmE3MDJkZGRlZDhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGExMTNmMTQ2MzM2NGJlY2I2MWQ4MmM5YTMwYzlmYmYuc2V0Q29udGVudChodG1sX2M5ZWJmN2Q5NGQxYjQwNDhhMTAwYmE3MDJkZGRlZDhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1YjMwOWIyMWMwMDQ1Y2Q5NmI0YmE1MzFjMzViZmE2LmJpbmRQb3B1cChwb3B1cF9kYTExM2YxNDYzMzY0YmVjYjYxZDgyYzlhMzBjOWZiZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTZjMTUzYjIyNmE0Mzg3OTNjMzMxYjZiNjkyZmNlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDYxYTY5NDA4NTk0ZGU2ODIxMjhjNzc2MjAwYzk0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MmEyZDY2MGJlMGQ0ZjU0ODE0NGJjNTg1YTcxMTAxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTJhMmQ2NjBiZTBkNGY1NDgxNDRiYzU4NWE3MTEwMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDYxYTY5NDA4NTk0ZGU2ODIxMjhjNzc2MjAwYzk0ZS5zZXRDb250ZW50KGh0bWxfOTJhMmQ2NjBiZTBkNGY1NDgxNDRiYzU4NWE3MTEwMWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTU2YzE1M2IyMjZhNDM4NzkzYzMzMWI2YjY5MmZjZTMuYmluZFBvcHVwKHBvcHVwXzkwNjFhNjk0MDg1OTRkZTY4MjEyOGM3NzYyMDBjOTRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlZjNmYWMyY2U4NjRiZjU4ODMyYmVhNmEzZjcwMGY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2MzI0OTg1NmYzYTRmOWJhOTk4OGU0NzVlZDU5MjUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiMGIzMjczMDQxMjQ0MGQ5YTM4NTY5ZjA1Zjc2YzVkID0gJCgnPGRpdiBpZD0iaHRtbF82YjBiMzI3MzA0MTI0NDBkOWEzODU2OWYwNWY3NmM1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2MzI0OTg1NmYzYTRmOWJhOTk4OGU0NzVlZDU5MjUyLnNldENvbnRlbnQoaHRtbF82YjBiMzI3MzA0MTI0NDBkOWEzODU2OWYwNWY3NmM1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZWYzZmFjMmNlODY0YmY1ODgzMmJlYTZhM2Y3MDBmNS5iaW5kUG9wdXAocG9wdXBfODYzMjQ5ODU2ZjNhNGY5YmE5OTg4ZTQ3NWVkNTkyNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmQxY2YxMmJhNjIzNDkxMDgwM2YyNWNmMDM1MWVmYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTE0OTgxNmJlNmU0OWFiOGZjYWRkYjMzMzhhYWIyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNWZmNTljODc3Nzk0ZTQ2OTJmNzE3ZWNlNWRlNjIzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDVmZjU5Yzg3Nzc5NGU0NjkyZjcxN2VjZTVkZTYyM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MTQ5ODE2YmU2ZTQ5YWI4ZmNhZGRiMzMzOGFhYjJjLnNldENvbnRlbnQoaHRtbF9kNWZmNTljODc3Nzk0ZTQ2OTJmNzE3ZWNlNWRlNjIzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZDFjZjEyYmE2MjM0OTEwODAzZjI1Y2YwMzUxZWZjOC5iaW5kUG9wdXAocG9wdXBfYjUxNDk4MTZiZTZlNDlhYjhmY2FkZGIzMzM4YWFiMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzU4MTg4ZGM3NjFiNDkwNmE2MTFhYmQwNzZkNjEwMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2NlZjMwZjI2YzM4NGRiNTk3MmU5NWFjNDk3NWQ4OGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM4MzZjZTYwMzdjNDM0ZWI0Y2U0MmU2MWNmNWE4ZTAgPSAkKCc8ZGl2IGlkPSJodG1sX2IzODM2Y2U2MDM3YzQzNGViNGNlNDJlNjFjZjVhOGUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjZWYzMGYyNmMzODRkYjU5NzJlOTVhYzQ5NzVkODhiLnNldENvbnRlbnQoaHRtbF9iMzgzNmNlNjAzN2M0MzRlYjRjZTQyZTYxY2Y1YThlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTgxODhkYzc2MWI0OTA2YTYxMWFiZDA3NmQ2MTAyYy5iaW5kUG9wdXAocG9wdXBfM2NlZjMwZjI2YzM4NGRiNTk3MmU5NWFjNDk3NWQ4OGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDUxMjc4YTUwMjVlNGY3OTk1NjM0YmY5NGI2MGYxMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmYyZTVmY2RmYjFhNGRkY2I2N2Y4N2I4NTlmNmQ3OTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmMwMDAyYTNjOTIzNDU4MDhiNzA2ODFmMjJkNGVlYzcgPSAkKCc8ZGl2IGlkPSJodG1sXzJjMDAwMmEzYzkyMzQ1ODA4YjcwNjgxZjIyZDRlZWM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjJlNWZjZGZiMWE0ZGRjYjY3Zjg3Yjg1OWY2ZDc5OC5zZXRDb250ZW50KGh0bWxfMmMwMDAyYTNjOTIzNDU4MDhiNzA2ODFmMjJkNGVlYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDUxMjc4YTUwMjVlNGY3OTk1NjM0YmY5NGI2MGYxMzQuYmluZFBvcHVwKHBvcHVwX2JmMmU1ZmNkZmIxYTRkZGNiNjdmODdiODU5ZjZkNzk4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjNTcyZGFjZTY5MjQ0MTM5MDA1MWQxZTU0YjViYzRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5MmQ1YzZiMzNhZDQyNjZiNTliMTlmZWRlZWFhMjI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2MjQzNWQ3OTcxNDRjZmJiMGE5ZDBjMGJhOTBmYmY0ID0gJCgnPGRpdiBpZD0iaHRtbF9kNjI0MzVkNzk3MTQ0Y2ZiYjBhOWQwYzBiYTkwZmJmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTJkNWM2YjMzYWQ0MjY2YjU5YjE5ZmVkZWVhYTIyOC5zZXRDb250ZW50KGh0bWxfZDYyNDM1ZDc5NzE0NGNmYmIwYTlkMGMwYmE5MGZiZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGM1NzJkYWNlNjkyNDQxMzkwMDUxZDFlNTRiNWJjNGIuYmluZFBvcHVwKHBvcHVwX2M5MmQ1YzZiMzNhZDQyNjZiNTliMTlmZWRlZWFhMjI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1YTZiNDI3YzRmNzRlNjI5ODMwOWZmYTY4MzVhNmFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5YWVlNTQ2YTIzZTQ5OWFhZWJkNjU0YzE4ZDFhNDA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0ZTkyMDgwODU0MDRjODE5NjJkMTE3NDRkOThiYjQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9hNGU5MjA4MDg1NDA0YzgxOTYyZDExNzQ0ZDk4YmI0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5YWVlNTQ2YTIzZTQ5OWFhZWJkNjU0YzE4ZDFhNDA1LnNldENvbnRlbnQoaHRtbF9hNGU5MjA4MDg1NDA0YzgxOTYyZDExNzQ0ZDk4YmI0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NWE2YjQyN2M0Zjc0ZTYyOTgzMDlmZmE2ODM1YTZhYS5iaW5kUG9wdXAocG9wdXBfMTlhZWU1NDZhMjNlNDk5YWFlYmQ2NTRjMThkMWE0MDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTRmZGI0NzgyNDE4NDA5NWJmOGM3YjZjMmM3ZjBkYTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNjYmQxMGNiNWZjNDkwMWE5YjFlNTAxMTFkM2UyODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjY4Y2FhZjg4NDFiNDNkMWE0NTBmYzU1YzZkZGFmY2QgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2OGNhYWY4ODQxYjQzZDFhNDUwZmM1NWM2ZGRhZmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjY2JkMTBjYjVmYzQ5MDFhOWIxZTUwMTExZDNlMjgwLnNldENvbnRlbnQoaHRtbF9mNjhjYWFmODg0MWI0M2QxYTQ1MGZjNTVjNmRkYWZjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNGZkYjQ3ODI0MTg0MDk1YmY4YzdiNmMyYzdmMGRhMy5iaW5kUG9wdXAocG9wdXBfZmNjYmQxMGNiNWZjNDkwMWE5YjFlNTAxMTFkM2UyODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzJiNWM0Y2ExZTRmNDNkMzg0NzRmZDczMmVjNWM5YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmOTZlOGEwOGU4MzRiODY4YTg0NDhhMDM4NTRlYWEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkY2I0YzhiYjJkODQ2NzU5NGQwNjM3Zjc3ZWQyZmVhID0gJCgnPGRpdiBpZD0iaHRtbF83ZGNiNGM4YmIyZDg0Njc1OTRkMDYzN2Y3N2VkMmZlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjk2ZThhMDhlODM0Yjg2OGE4NDQ4YTAzODU0ZWFhMC5zZXRDb250ZW50KGh0bWxfN2RjYjRjOGJiMmQ4NDY3NTk0ZDA2MzdmNzdlZDJmZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzJiNWM0Y2ExZTRmNDNkMzg0NzRmZDczMmVjNWM5YWMuYmluZFBvcHVwKHBvcHVwX2ZmOTZlOGEwOGU4MzRiODY4YTg0NDhhMDM4NTRlYWEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ODc1NTFjODhiZDQ3ZTBiYzkwNWM4ZTRiMWJiZmYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmYjgxZDllZmM1YjQ2NTM4OGE4YjU1M2FkNzc4ZWE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2MjkzNWUwMmZhNjQ1MGJhOTBmYzVhMGExMWJmNGM4ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjI5MzVlMDJmYTY0NTBiYTkwZmM1YTBhMTFiZjRjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VmYjgxZDllZmM1YjQ2NTM4OGE4YjU1M2FkNzc4ZWE5LnNldENvbnRlbnQoaHRtbF8yNjI5MzVlMDJmYTY0NTBiYTkwZmM1YTBhMTFiZjRjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODg3NTUxYzg4YmQ0N2UwYmM5MDVjOGU0YjFiYmZmMy5iaW5kUG9wdXAocG9wdXBfZWZiODFkOWVmYzViNDY1Mzg4YThiNTUzYWQ3NzhlYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTI4NzA5OWJlMWQzNDJhYjg5ZjIwNjkzN2JjZDg4MzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWI4NjdiY2ZmZTczNGI0NmFhNWZiYjNmMTFhZjBhMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWY5MjQyZTkyYjRmNDcxZjhjY2ZkODNmNmFhNTdmZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2VmOTI0MmU5MmI0ZjQ3MWY4Y2NmZDgzZjZhYTU3ZmY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYjg2N2JjZmZlNzM0YjQ2YWE1ZmJiM2YxMWFmMGExZC5zZXRDb250ZW50KGh0bWxfZWY5MjQyZTkyYjRmNDcxZjhjY2ZkODNmNmFhNTdmZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTI4NzA5OWJlMWQzNDJhYjg5ZjIwNjkzN2JjZDg4MzguYmluZFBvcHVwKHBvcHVwXzFiODY3YmNmZmU3MzRiNDZhYTVmYmIzZjExYWYwYTFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0NzY0ZWFkMGM5YzQ5YmVhMWE0MGNjYzYxOThhMGU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM1NGU4NjdhNDQxNDJlM2E1NTQ1ZDM4YmM0YTk4M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDAxMzdhOGQ3MDdjNDIwMzhiYjliZmIzZjIxZWU1N2EgPSAkKCc8ZGl2IGlkPSJodG1sX2QwMTM3YThkNzA3YzQyMDM4YmI5YmZiM2YyMWVlNTdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM1NGU4NjdhNDQxNDJlM2E1NTQ1ZDM4YmM0YTk4M2Muc2V0Q29udGVudChodG1sX2QwMTM3YThkNzA3YzQyMDM4YmI5YmZiM2YyMWVlNTdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0NzY0ZWFkMGM5YzQ5YmVhMWE0MGNjYzYxOThhMGU3LmJpbmRQb3B1cChwb3B1cF85MzU0ZTg2N2E0NDE0MmUzYTU1NDVkMzhiYzRhOTgzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMWUxZjAxOTExNjA0MGI0OWNjZmI5OGYwMDU2MGYxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmNTkyNDM0NGFlNjQxMzFiZGQ5ZGNjMzMwMDM3MjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNTkyYmNiZWJmNjRjMGRhNDFmMWZiYTE1YjlhY2ZhID0gJCgnPGRpdiBpZD0iaHRtbF8wMzU5MmJjYmViZjY0YzBkYTQxZjFmYmExNWI5YWNmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmNTkyNDM0NGFlNjQxMzFiZGQ5ZGNjMzMwMDM3MjZlLnNldENvbnRlbnQoaHRtbF8wMzU5MmJjYmViZjY0YzBkYTQxZjFmYmExNWI5YWNmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMWUxZjAxOTExNjA0MGI0OWNjZmI5OGYwMDU2MGYxZS5iaW5kUG9wdXAocG9wdXBfZmY1OTI0MzQ0YWU2NDEzMWJkZDlkY2MzMzAwMzcyNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTViNGJkYzkyYWQ4NDQ2ZDhlMDhjZDhiOTkzN2ZkZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkZGY5Y2Y4ZWZiYTRhZWNiMGM1Zjc0ODE3OGJlYzlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiOTg5ZjdjMDg3MjRmNzdhOWM0ZmVjZDIyZGVjMmQzID0gJCgnPGRpdiBpZD0iaHRtbF8zYjk4OWY3YzA4NzI0Zjc3YTljNGZlY2QyMmRlYzJkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZGRmOWNmOGVmYmE0YWVjYjBjNWY3NDgxNzhiZWM5ZC5zZXRDb250ZW50KGh0bWxfM2I5ODlmN2MwODcyNGY3N2E5YzRmZWNkMjJkZWMyZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTViNGJkYzkyYWQ4NDQ2ZDhlMDhjZDhiOTkzN2ZkZGUuYmluZFBvcHVwKHBvcHVwXzNkZGY5Y2Y4ZWZiYTRhZWNiMGM1Zjc0ODE3OGJlYzlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlMjhjZDRhMzZiNzQxNzU5NmYwNmNlZjI0NjYxYzczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzNWY0ZmEzNTNkZTQ5NjI4ZWQzMDkxOTJmMmEzODJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3YmZhNmM3ZTE0NTQyNzg5OWI0Y2UyNzY5N2MwOTc5ID0gJCgnPGRpdiBpZD0iaHRtbF8xN2JmYTZjN2UxNDU0Mjc4OTliNGNlMjc2OTdjMDk3OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzVmNGZhMzUzZGU0OTYyOGVkMzA5MTkyZjJhMzgyZC5zZXRDb250ZW50KGh0bWxfMTdiZmE2YzdlMTQ1NDI3ODk5YjRjZTI3Njk3YzA5NzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWUyOGNkNGEzNmI3NDE3NTk2ZjA2Y2VmMjQ2NjFjNzMuYmluZFBvcHVwKHBvcHVwX2IzNWY0ZmEzNTNkZTQ5NjI4ZWQzMDkxOTJmMmEzODJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzMDg2NDBlM2RkYzQxOTBiMGE0Y2VkYzhkMzNlNzExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTNmYWE4ZDdhYzY0NmU5OGNkNTQ4ZDU2MDZkZDIzMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYzAyMWI1MTFkYmY0MGNhYTY3NzBjZjkyNjhhNzA1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGMwMjFiNTExZGJmNDBjYWE2NzcwY2Y5MjY4YTcwNWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmEzZmFhOGQ3YWM2NDZlOThjZDU0OGQ1NjA2ZGQyMzEuc2V0Q29udGVudChodG1sXzBjMDIxYjUxMWRiZjQwY2FhNjc3MGNmOTI2OGE3MDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzMDg2NDBlM2RkYzQxOTBiMGE0Y2VkYzhkMzNlNzExLmJpbmRQb3B1cChwb3B1cF9mYTNmYWE4ZDdhYzY0NmU5OGNkNTQ4ZDU2MDZkZDIzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2Q3YTk1MzVmZmU0NzBjOWRmZjU2YTU5YzUzNzNlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MGE5MzFjOTdmZTc0YTQ4OWNkMDY5ZGJjMWU0OWU2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTkyZTU5YzE3ZWM0OGI3YWNjZThkZjU4ZjQyYzM5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmE5MmU1OWMxN2VjNDhiN2FjY2U4ZGY1OGY0MmMzOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTBhOTMxYzk3ZmU3NGE0ODljZDA2OWRiYzFlNDllNjYuc2V0Q29udGVudChodG1sX2JhOTJlNTljMTdlYzQ4YjdhY2NlOGRmNThmNDJjMzkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzZDdhOTUzNWZmZTQ3MGM5ZGZmNTZhNTljNTM3M2U4LmJpbmRQb3B1cChwb3B1cF85MGE5MzFjOTdmZTc0YTQ4OWNkMDY5ZGJjMWU0OWU2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NmU1ZjRkMjk1MDc0NTBhOWJlNzkxYzQyNjM4YmQ3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3MjdiMDQ3Njg3MDQ3NzJiNTRjZTIwMTBhZGY2ODQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczZmNkYzUzYzZkNTRlZTg4MTZjMGZmMWE1NjM3ZjUyID0gJCgnPGRpdiBpZD0iaHRtbF83M2ZjZGM1M2M2ZDU0ZWU4ODE2YzBmZjFhNTYzN2Y1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzI3YjA0NzY4NzA0NzcyYjU0Y2UyMDEwYWRmNjg0Mi5zZXRDb250ZW50KGh0bWxfNzNmY2RjNTNjNmQ1NGVlODgxNmMwZmYxYTU2MzdmNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjZlNWY0ZDI5NTA3NDUwYTliZTc5MWM0MjYzOGJkNzEuYmluZFBvcHVwKHBvcHVwX2I3MjdiMDQ3Njg3MDQ3NzJiNTRjZTIwMTBhZGY2ODQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmNTcwN2FiNDVjZDQzN2JhODVhMWM1NzA5MGRmNjViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNjMyNmJhYWRiNzQ4NDZiN2U2OWVkMGM0NTc5YWNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhNWI0NGE2MDdmMTQxMzRhNDc4ODE1NWFjMGFiN2M0ID0gJCgnPGRpdiBpZD0iaHRtbF81YTViNDRhNjA3ZjE0MTM0YTQ3ODgxNTVhYzBhYjdjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzYzMjZiYWFkYjc0ODQ2YjdlNjllZDBjNDU3OWFjZS5zZXRDb250ZW50KGh0bWxfNWE1YjQ0YTYwN2YxNDEzNGE0Nzg4MTU1YWMwYWI3YzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmY1NzA3YWI0NWNkNDM3YmE4NWExYzU3MDkwZGY2NWIuYmluZFBvcHVwKHBvcHVwX2RjNjMyNmJhYWRiNzQ4NDZiN2U2OWVkMGM0NTc5YWNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyZDkzODMxNDUyYjRhYTU4MjAwYzg3YWUzZTg2YzFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzM0MGU3ZWVhYWM0MTQyODNlMWExZDFjMmNjZTU4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmI5MTkwZGNjYmI0YzFkOTE2Njk3ZjY3NTY4MDE3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJiOTE5MGRjY2JiNGMxZDkxNjY5N2Y2NzU2ODAxNzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MzQwZTdlZWFhYzQxNDI4M2UxYTFkMWMyY2NlNThjLnNldENvbnRlbnQoaHRtbF9kYmI5MTkwZGNjYmI0YzFkOTE2Njk3ZjY3NTY4MDE3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMmQ5MzgzMTQ1MmI0YWE1ODIwMGM4N2FlM2U4NmMxZi5iaW5kUG9wdXAocG9wdXBfODczNDBlN2VlYWFjNDE0MjgzZTFhMWQxYzJjY2U1OGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjI0ZjQyNmIwNWJkNDQ5ODgzMzM3MjBkNGM5MTNkMGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NmU3YmU1MDRmOGU0Mzg5YmU5MzY0MmZlNjcwZDg4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjNmZGQ2ZmVmNzE0MmRjODgyNjFmYTMyMmI2MWFlYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGIzZmRkNmZlZjcxNDJkYzg4MjYxZmEzMjJiNjFhZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODZlN2JlNTA0ZjhlNDM4OWJlOTM2NDJmZTY3MGQ4ODguc2V0Q29udGVudChodG1sXzBiM2ZkZDZmZWY3MTQyZGM4ODI2MWZhMzIyYjYxYWVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyNGY0MjZiMDViZDQ0OTg4MzMzNzIwZDRjOTEzZDBhLmJpbmRQb3B1cChwb3B1cF84NmU3YmU1MDRmOGU0Mzg5YmU5MzY0MmZlNjcwZDg4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDIxNzExMjJjMzQ0MzBiODRlMzY5ZWRhNTAzMjg2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMzFmMTUyNzJmZDU0NzgxODMyMTk4NDZjZjMzN2YzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzI0NDdjMDhiNTM0ZGE4ODBhZjkwNGQ2NDAwNjgwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzMyNDQ3YzA4YjUzNGRhODgwYWY5MDRkNjQwMDY4MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzFmMTUyNzJmZDU0NzgxODMyMTk4NDZjZjMzN2YzMC5zZXRDb250ZW50KGh0bWxfYzMyNDQ3YzA4YjUzNGRhODgwYWY5MDRkNjQwMDY4MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjAyMTcxMTIyYzM0NDMwYjg0ZTM2OWVkYTUwMzI4NmEuYmluZFBvcHVwKHBvcHVwX2IzMWYxNTI3MmZkNTQ3ODE4MzIxOTg0NmNmMzM3ZjMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxYjZjNmIzMzIwNjQ3MTQ4NDY5NWFjODZhNDk5OTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxMTI2MjAzN2I3MjRmZjZiNWFmOWI2MmI5NmFjNDVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkYWM5NDBmNWJlNTQ2Mjc5MDBjYmFkMzE1MGQwMDM2ID0gJCgnPGRpdiBpZD0iaHRtbF8yZGFjOTQwZjViZTU0NjI3OTAwY2JhZDMxNTBkMDAzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxMTI2MjAzN2I3MjRmZjZiNWFmOWI2MmI5NmFjNDVlLnNldENvbnRlbnQoaHRtbF8yZGFjOTQwZjViZTU0NjI3OTAwY2JhZDMxNTBkMDAzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MWI2YzZiMzMyMDY0NzE0ODQ2OTVhYzg2YTQ5OTk4MC5iaW5kUG9wdXAocG9wdXBfZTExMjYyMDM3YjcyNGZmNmI1YWY5YjYyYjk2YWM0NWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGU1ZGZlY2M1MDFjNDk0NjhhMmUwMjQxZTE3ZWMxOGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0OTYxMGMyM2QzNTRlNDNhZjkxMzQ2MmMxZDdjMTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EyYWEzMTMzMjVhYzRmYWE5MjhhMTlkMmMxOGJhMThjID0gJCgnPGRpdiBpZD0iaHRtbF9hMmFhMzEzMzI1YWM0ZmFhOTI4YTE5ZDJjMThiYTE4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQ5NjEwYzIzZDM1NGU0M2FmOTEzNDYyYzFkN2MxMDkuc2V0Q29udGVudChodG1sX2EyYWEzMTMzMjVhYzRmYWE5MjhhMTlkMmMxOGJhMThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlNWRmZWNjNTAxYzQ5NDY4YTJlMDI0MWUxN2VjMThhLmJpbmRQb3B1cChwb3B1cF9lNDk2MTBjMjNkMzU0ZTQzYWY5MTM0NjJjMWQ3YzEwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZWQ4YWIzNjFjNTI0Yjg5OGMxYmU2MTlhZTRiMjUxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OTY5NTU3MDJmYTRjNDI5ZTljZjdhODQ2NTJhN2JmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4ZTdhNmM4NzEyZjRmYjc4MzNkZmY1YzYwNzJlZDcyID0gJCgnPGRpdiBpZD0iaHRtbF84OGU3YTZjODcxMmY0ZmI3ODMzZGZmNWM2MDcyZWQ3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODk2OTU1NzAyZmE0YzQyOWU5Y2Y3YTg0NjUyYTdiZi5zZXRDb250ZW50KGh0bWxfODhlN2E2Yzg3MTJmNGZiNzgzM2RmZjVjNjA3MmVkNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWVkOGFiMzYxYzUyNGI4OThjMWJlNjE5YWU0YjI1MWYuYmluZFBvcHVwKHBvcHVwXzM4OTY5NTU3MDJmYTRjNDI5ZTljZjdhODQ2NTJhN2JmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0ODMxOThiNjlhMTQ2NmM5MjliMWMzZjNlMjUzYTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4OGE0YWIxYWY1ODQ1NmM4OTE5NTZjZjAyZmQxMmJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2OWYzY2UyZWEwNjQ1N2RhMGZkOGQ4MmEwMWVmZTA0ID0gJCgnPGRpdiBpZD0iaHRtbF9lNjlmM2NlMmVhMDY0NTdkYTBmZDhkODJhMDFlZmUwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4OGE0YWIxYWY1ODQ1NmM4OTE5NTZjZjAyZmQxMmJjLnNldENvbnRlbnQoaHRtbF9lNjlmM2NlMmVhMDY0NTdkYTBmZDhkODJhMDFlZmUwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NDgzMTk4YjY5YTE0NjZjOTI5YjFjM2YzZTI1M2E0NS5iaW5kUG9wdXAocG9wdXBfZTg4YTRhYjFhZjU4NDU2Yzg5MTk1NmNmMDJmZDEyYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDEzZTJjOThjMGUzNDA2YjkxNzU2ZmRkZDZlMjNkZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRlNGQ2ZWQ2YTM1NGIxMzljYmYzNTc0NDViYzhmMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGY5YjY0MmFlNTQ5NDU2ZWE4ZWNlYTk2OTBjNmFhOWYgPSAkKCc8ZGl2IGlkPSJodG1sXzRmOWI2NDJhZTU0OTQ1NmVhOGVjZWE5NjkwYzZhYTlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGU0ZDZlZDZhMzU0YjEzOWNiZjM1NzQ0NWJjOGYyMC5zZXRDb250ZW50KGh0bWxfNGY5YjY0MmFlNTQ5NDU2ZWE4ZWNlYTk2OTBjNmFhOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDEzZTJjOThjMGUzNDA2YjkxNzU2ZmRkZDZlMjNkZTQuYmluZFBvcHVwKHBvcHVwXzJkZTRkNmVkNmEzNTRiMTM5Y2JmMzU3NDQ1YmM4ZjIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1NjU3MjgwZmNlMzQyMGFiZTZjZGQ2NzAyMzlkY2FmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2ZjU4ZTgwYzMzYzRhMzJiODIzMzExMjQ4YjFhMWJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2NGNkZjBhMzQ2NTQ1YTM4YWRiN2U3ZjI4MmVmZjEyID0gJCgnPGRpdiBpZD0iaHRtbF9jNjRjZGYwYTM0NjU0NWEzOGFkYjdlN2YyODJlZmYxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2ZjU4ZTgwYzMzYzRhMzJiODIzMzExMjQ4YjFhMWJkLnNldENvbnRlbnQoaHRtbF9jNjRjZGYwYTM0NjU0NWEzOGFkYjdlN2YyODJlZmYxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNTY1NzI4MGZjZTM0MjBhYmU2Y2RkNjcwMjM5ZGNhZi5iaW5kUG9wdXAocG9wdXBfYjZmNThlODBjMzNjNGEzMmI4MjMzMTEyNDhiMWExYmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjY4YTFmYWU4MzZiNDcyNjkyM2Q2MmZhMjFmY2E3M2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlZmY5ODM0NjY5ZjRiOTU5ZjUxZGEyMjYyMTVkYTE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5OTc0NzhiZDRiZDRhOTlhNGUzNTljZTUxZDMyMTBjID0gJCgnPGRpdiBpZD0iaHRtbF83OTk3NDc4YmQ0YmQ0YTk5YTRlMzU5Y2U1MWQzMjEwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2VmZjk4MzQ2NjlmNGI5NTlmNTFkYTIyNjIxNWRhMTUuc2V0Q29udGVudChodG1sXzc5OTc0NzhiZDRiZDRhOTlhNGUzNTljZTUxZDMyMTBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2OGExZmFlODM2YjQ3MjY5MjNkNjJmYTIxZmNhNzNlLmJpbmRQb3B1cChwb3B1cF9jZWZmOTgzNDY2OWY0Yjk1OWY1MWRhMjI2MjE1ZGExNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDE3YTBhMzY4ZjI0OTYwODhkZTU5MmExZTRiYjA5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2ZhMjY3MDdhMWE0MjVjYjA2Yzg0MTlmNjQxN2Q4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OGE3ZGRhYTE5ZmY0MDQyYTEyMjJjMjcwOTk0ZWQ1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzhhN2RkYWExOWZmNDA0MmExMjIyYzI3MDk5NGVkNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80M2ZhMjY3MDdhMWE0MjVjYjA2Yzg0MTlmNjQxN2Q4Mi5zZXRDb250ZW50KGh0bWxfNzhhN2RkYWExOWZmNDA0MmExMjIyYzI3MDk5NGVkNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjAxN2EwYTM2OGYyNDk2MDg4ZGU1OTJhMWU0YmIwOTQuYmluZFBvcHVwKHBvcHVwXzQzZmEyNjcwN2ExYTQyNWNiMDZjODQxOWY2NDE3ZDgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwYWEzMWViMmUyZjRkYTBhMmQ5MzE0ZGQxZjc4NDk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxZTBjNWQxN2IzYzQyYmRiODc0NTZlZjI5NDA1MTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2ODkyNDFiMTA1YjRkMjc4YzY3ODAyMGMxZDEzZDdjID0gJCgnPGRpdiBpZD0iaHRtbF81Njg5MjQxYjEwNWI0ZDI3OGM2NzgwMjBjMWQxM2Q3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MWUwYzVkMTdiM2M0MmJkYjg3NDU2ZWYyOTQwNTExYi5zZXRDb250ZW50KGh0bWxfNTY4OTI0MWIxMDViNGQyNzhjNjc4MDIwYzFkMTNkN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjBhYTMxZWIyZTJmNGRhMGEyZDkzMTRkZDFmNzg0OTUuYmluZFBvcHVwKHBvcHVwXzcxZTBjNWQxN2IzYzQyYmRiODc0NTZlZjI5NDA1MTFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwOWIzMGNlNTlkZDQ0ZDRhMDVhZjY5YzYzOTNmYmMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmZTNlNmQ2ZTM2ODQ2Y2M5Mjk3NWU4ZDNlYTdhYzNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0NzVmNDRiZjM5MjRlZTY5MjEwMGM3ODI2NjU0ZGY5ID0gJCgnPGRpdiBpZD0iaHRtbF8yNDc1ZjQ0YmYzOTI0ZWU2OTIxMDBjNzgyNjY1NGRmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZmUzZTZkNmUzNjg0NmNjOTI5NzVlOGQzZWE3YWMzZS5zZXRDb250ZW50KGh0bWxfMjQ3NWY0NGJmMzkyNGVlNjkyMTAwYzc4MjY2NTRkZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjA5YjMwY2U1OWRkNDRkNGEwNWFmNjljNjM5M2ZiYzAuYmluZFBvcHVwKHBvcHVwXzJmZTNlNmQ2ZTM2ODQ2Y2M5Mjk3NWU4ZDNlYTdhYzNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiNjBmOGFjMmU2MzQwMDA5YjFmZmZhMzU2MDA0NmI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2NzRjODgwNDE3ZDQ4Njc4ZjQ3M2E5ODY1ZjRlMTE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhNGRiYTMwOWIzNDQ4MTc5OTI4ZjI3Yjk2YzkyNWM3ID0gJCgnPGRpdiBpZD0iaHRtbF8wYTRkYmEzMDliMzQ0ODE3OTkyOGYyN2I5NmM5MjVjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY3NGM4ODA0MTdkNDg2NzhmNDczYTk4NjVmNGUxMTUuc2V0Q29udGVudChodG1sXzBhNGRiYTMwOWIzNDQ4MTc5OTI4ZjI3Yjk2YzkyNWM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiNjBmOGFjMmU2MzQwMDA5YjFmZmZhMzU2MDA0NmI4LmJpbmRQb3B1cChwb3B1cF9hNjc0Yzg4MDQxN2Q0ODY3OGY0NzNhOTg2NWY0ZTExNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYTg4OGZmNGQ3YzA0Yjk5OWI3NzYwZDEwOTdjMGZlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTAxNTQwNDJlNDU2NDNjNzk3OTNmMDM5NTg0YzQxZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2UyY2M1NDVjMmRjNGI4YWExZWZkNTcyOWMyNmViNTkgPSAkKCc8ZGl2IGlkPSJodG1sX2NlMmNjNTQ1YzJkYzRiOGFhMWVmZDU3MjljMjZlYjU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwMTU0MDQyZTQ1NjQzYzc5NzkzZjAzOTU4NGM0MWRjLnNldENvbnRlbnQoaHRtbF9jZTJjYzU0NWMyZGM0YjhhYTFlZmQ1NzI5YzI2ZWI1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYTg4OGZmNGQ3YzA0Yjk5OWI3NzYwZDEwOTdjMGZlOC5iaW5kUG9wdXAocG9wdXBfOTAxNTQwNDJlNDU2NDNjNzk3OTNmMDM5NTg0YzQxZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjYyN2JhM2VkMDM1NDlhMGE0MDJjMDZkNmJhNDM4MWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkMGNkODg3YWUyZTQwMGZhYTQyNmJhN2U0OTQyMjhkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1NGVmN2EzOWQ4ZTQ1NmI5MTZlM2Y2YzhhNjhlNDgxID0gJCgnPGRpdiBpZD0iaHRtbF9lNTRlZjdhMzlkOGU0NTZiOTE2ZTNmNmM4YTY4ZTQ4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkMGNkODg3YWUyZTQwMGZhYTQyNmJhN2U0OTQyMjhkLnNldENvbnRlbnQoaHRtbF9lNTRlZjdhMzlkOGU0NTZiOTE2ZTNmNmM4YTY4ZTQ4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjI3YmEzZWQwMzU0OWEwYTQwMmMwNmQ2YmE0MzgxYi5iaW5kUG9wdXAocG9wdXBfNGQwY2Q4ODdhZTJlNDAwZmFhNDI2YmE3ZTQ5NDIyOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTMwNzg4M2I1ZDZlNDgxZGE4Y2RhNThmZmIyMzNiMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhZDJiMDAxZTI1YjRjY2U4MTgyNWYxYjBlYTBkZDg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5OWY3ZjRlYmNiMjRhYjU5M2Q3OThiYzM3NzZkMGNhID0gJCgnPGRpdiBpZD0iaHRtbF80OTlmN2Y0ZWJjYjI0YWI1OTNkNzk4YmMzNzc2ZDBjYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmFkMmIwMDFlMjViNGNjZTgxODI1ZjFiMGVhMGRkODkuc2V0Q29udGVudChodG1sXzQ5OWY3ZjRlYmNiMjRhYjU5M2Q3OThiYzM3NzZkMGNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzMDc4ODNiNWQ2ZTQ4MWRhOGNkYTU4ZmZiMjMzYjI5LmJpbmRQb3B1cChwb3B1cF8yYWQyYjAwMWUyNWI0Y2NlODE4MjVmMWIwZWEwZGQ4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTk0MjVhMGFlMjI0Yjg4YjVjNjlmYzcwMjA3N2IyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQyZTI4NGM2M2M1NGZmYWIwYTAxODgxNTMxNzFhN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTBmMzI2NDMxYjA2NGUyYjljZmFiN2E4ZmNjNTRhYTUgPSAkKCc8ZGl2IGlkPSJodG1sX2UwZjMyNjQzMWIwNjRlMmI5Y2ZhYjdhOGZjYzU0YWE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQyZTI4NGM2M2M1NGZmYWIwYTAxODgxNTMxNzFhN2Uuc2V0Q29udGVudChodG1sX2UwZjMyNjQzMWIwNjRlMmI5Y2ZhYjdhOGZjYzU0YWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5OTQyNWEwYWUyMjRiODhiNWM2OWZjNzAyMDc3YjIyLmJpbmRQb3B1cChwb3B1cF8wNDJlMjg0YzYzYzU0ZmZhYjBhMDE4ODE1MzE3MWE3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjVmNWM4OThmYzM0MzVjODdhMDg3Y2IwOTFlMDFlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjZjg4M2VhM2UwYjRlYTJiZTYwNjc1NzY3Y2UxZjZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0ZTFiZjI1YTg2NTQ1MmRhMjk2YmIyZjY1ZjAxYTY1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNGUxYmYyNWE4NjU0NTJkYTI5NmJiMmY2NWYwMWE2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2Y4ODNlYTNlMGI0ZWEyYmU2MDY3NTc2N2NlMWY2Zi5zZXRDb250ZW50KGh0bWxfZTRlMWJmMjVhODY1NDUyZGEyOTZiYjJmNjVmMDFhNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTI1ZjVjODk4ZmMzNDM1Yzg3YTA4N2NiMDkxZTAxZTMuYmluZFBvcHVwKHBvcHVwX2FjZjg4M2VhM2UwYjRlYTJiZTYwNjc1NzY3Y2UxZjZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkxNjU4ZGFmNWNiYTQzMzI5MTMxNDJlZGY2NGQwMjVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiZjdhOTQwOTgxZTQ2NDk5MDdlM2U2MjE1N2Q0MTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjZWU3YjNlZWRlMzQ1NDk4YTY1NzQ2N2FlZTQ5NmM1ID0gJCgnPGRpdiBpZD0iaHRtbF8yY2VlN2IzZWVkZTM0NTQ5OGE2NTc0NjdhZWU0OTZjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiZjdhOTQwOTgxZTQ2NDk5MDdlM2U2MjE1N2Q0MTAxLnNldENvbnRlbnQoaHRtbF8yY2VlN2IzZWVkZTM0NTQ5OGE2NTc0NjdhZWU0OTZjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTY1OGRhZjVjYmE0MzMyOTEzMTQyZWRmNjRkMDI1ZS5iaW5kUG9wdXAocG9wdXBfY2JmN2E5NDA5ODFlNDY0OTkwN2UzZTYyMTU3ZDQxMDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM1MDU2OGIyNDQxNGM5Njg3ODAwMWE5ZjhmMDVjMmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3YWVlZjMxZDIzNDRkOGNiNjQ0ZTFmNzNlZmRiNmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmOGU3MjA5ODdlYzQ2NDc4Y2I3M2Q4MzYxMTdhYmU5ID0gJCgnPGRpdiBpZD0iaHRtbF81ZjhlNzIwOTg3ZWM0NjQ3OGNiNzNkODM2MTE3YWJlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdhZWVmMzFkMjM0NGQ4Y2I2NDRlMWY3M2VmZGI2ZmMuc2V0Q29udGVudChodG1sXzVmOGU3MjA5ODdlYzQ2NDc4Y2I3M2Q4MzYxMTdhYmU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczNTA1NjhiMjQ0MTRjOTY4NzgwMDFhOWY4ZjA1YzJlLmJpbmRQb3B1cChwb3B1cF8xN2FlZWYzMWQyMzQ0ZDhjYjY0NGUxZjczZWZkYjZmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDA4YTNhYzljMTE0YzA2OWQ3ZTM1MTM4MzVlMWFmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NmM0YTY2OWM3YTQ0Mjk4OWUzZjVmYTA2NTZlYjBmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMmQ1ZWU5YTgzYWM0NDQ3YTVlZWE2MjU4YTQ3MmRmZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjJkNWVlOWE4M2FjNDQ0N2E1ZWVhNjI1OGE0NzJkZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTZjNGE2NjljN2E0NDI5ODllM2Y1ZmEwNjU2ZWIwZjguc2V0Q29udGVudChodG1sX2IyZDVlZTlhODNhYzQ0NDdhNWVlYTYyNThhNDcyZGZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0MDhhM2FjOWMxMTRjMDY5ZDdlMzUxMzgzNWUxYWYyLmJpbmRQb3B1cChwb3B1cF85NmM0YTY2OWM3YTQ0Mjk4OWUzZjVmYTA2NTZlYjBmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDdiYjUyMTRmMjk0NTkxOWU1NDY2MTU2NjZjMDUwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZjY0MWJlOTZhMmE0NDRkYTJlYjMxYTQyNTYzNmJhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTVlNzlmYWIxZWM0OTc3YmFjNzk1ZDg2OTU2ZDEzZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjU1ZTc5ZmFiMWVjNDk3N2JhYzc5NWQ4Njk1NmQxM2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmNjQxYmU5NmEyYTQ0NGRhMmViMzFhNDI1NjM2YmEzLnNldENvbnRlbnQoaHRtbF9mNTVlNzlmYWIxZWM0OTc3YmFjNzk1ZDg2OTU2ZDEzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDdiYjUyMTRmMjk0NTkxOWU1NDY2MTU2NjZjMDUwNy5iaW5kUG9wdXAocG9wdXBfNmY2NDFiZTk2YTJhNDQ0ZGEyZWIzMWE0MjU2MzZiYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNmMmQ2NDJkYzgxNGI5MmE4MWE4NzIyZTBkZmFmMGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxNTU2NzIwYzRkYjRiYTQ4NjJmNTkwYzYzN2RjYmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5NjFmZGU3MjhkODQ5MjQ5YzIwM2FhMDM1NjA4NjVkID0gJCgnPGRpdiBpZD0iaHRtbF9lOTYxZmRlNzI4ZDg0OTI0OWMyMDNhYTAzNTYwODY1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjE1NTY3MjBjNGRiNGJhNDg2MmY1OTBjNjM3ZGNiZjYuc2V0Q29udGVudChodG1sX2U5NjFmZGU3MjhkODQ5MjQ5YzIwM2FhMDM1NjA4NjVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljZjJkNjQyZGM4MTRiOTJhODFhODcyMmUwZGZhZjBhLmJpbmRQb3B1cChwb3B1cF82MTU1NjcyMGM0ZGI0YmE0ODYyZjU5MGM2MzdkY2JmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Yjk4YmEzODU5YTI0YzFmODY4NzdjNjc5ZjM2ZTcwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzE1OTcxNTYzYzI0OTA0YWRkOGZkYmVkNWViMDU0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MWFhMTNhMjE0YzA0YjJkYjdkZDhmYWE5MGNkMjU5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfODFhYTEzYTIxNGMwNGIyZGI3ZGQ4ZmFhOTBjZDI1OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGMxNTk3MTU2M2MyNDkwNGFkZDhmZGJlZDVlYjA1NDIuc2V0Q29udGVudChodG1sXzgxYWExM2EyMTRjMDRiMmRiN2RkOGZhYTkwY2QyNTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRiOThiYTM4NTlhMjRjMWY4Njg3N2M2NzlmMzZlNzBjLmJpbmRQb3B1cChwb3B1cF8wYzE1OTcxNTYzYzI0OTA0YWRkOGZkYmVkNWViMDU0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjRhNDdmOTE3Yzc0YjI5OWIyNzA4MWZlMjQ1Mzg1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmViNTQyZmExNWRiNDY2NjgyYjhlZmMzMDhlNjdjM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI3NGRkNGRlNTdhNGU2N2FiYWJmMDI1NTA2NzQ3MzMgPSAkKCc8ZGl2IGlkPSJodG1sXzFiNzRkZDRkZTU3YTRlNjdhYmFiZjAyNTUwNjc0NzMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZWI1NDJmYTE1ZGI0NjY2ODJiOGVmYzMwOGU2N2MzZS5zZXRDb250ZW50KGh0bWxfMWI3NGRkNGRlNTdhNGU2N2FiYWJmMDI1NTA2NzQ3MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY0YTQ3ZjkxN2M3NGIyOTliMjcwODFmZTI0NTM4NWMuYmluZFBvcHVwKHBvcHVwX2ZlYjU0MmZhMTVkYjQ2NjY4MmI4ZWZjMzA4ZTY3YzNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhN2EzZjlkZmIzOTQ2NGNiNmY1ZWIyMWE1Njg1MjJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDZlNDIwYzA2ZmI0N2IwOTFlZjg2NDkyMjgwZmM4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzU3ZGFjZTI4NDg0ZDU1YjQ5NzBlMDQ4YTliNmRjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGM1N2RhY2UyODQ4NGQ1NWI0OTcwZTA0OGE5YjZkYzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0NmU0MjBjMDZmYjQ3YjA5MWVmODY0OTIyODBmYzg4LnNldENvbnRlbnQoaHRtbF80YzU3ZGFjZTI4NDg0ZDU1YjQ5NzBlMDQ4YTliNmRjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYTdhM2Y5ZGZiMzk0NjRjYjZmNWViMjFhNTY4NTIyYS5iaW5kUG9wdXAocG9wdXBfOTQ2ZTQyMGMwNmZiNDdiMDkxZWY4NjQ5MjI4MGZjODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTE2Nzg1NTgwZDNlNGQ1Nzk2NjdlODFiNjBhZDhiYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0MDliNWU4YWFkNjQ2NGI4NDQ3MzJhZmQ2YjIzNWJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjMjQ0ZDZjYWI0OTQ1ZTM5YmEyNTgxYzQzNGVkMWZiID0gJCgnPGRpdiBpZD0iaHRtbF9jYzI0NGQ2Y2FiNDk0NWUzOWJhMjU4MWM0MzRlZDFmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQwOWI1ZThhYWQ2NDY0Yjg0NDczMmFmZDZiMjM1YmUuc2V0Q29udGVudChodG1sX2NjMjQ0ZDZjYWI0OTQ1ZTM5YmEyNTgxYzQzNGVkMWZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UxNjc4NTU4MGQzZTRkNTc5NjY3ZTgxYjYwYWQ4YmI4LmJpbmRQb3B1cChwb3B1cF9iNDA5YjVlOGFhZDY0NjRiODQ0NzMyYWZkNmIyMzViZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kM2IwNjUzNmQyNWE0NzZlOWE3ZTNlZDYyMjE5ODEwYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDAwODIxYWI0ZTJmNDJjN2JkY2I4MTMyYTZhNWUzYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmE0YjJjZTI4NTEzNGMxYzg4YWNkMjM4MjE1OGViNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzJhNGIyY2UyODUxMzRjMWM4OGFjZDIzODIxNThlYjQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDA4MjFhYjRlMmY0MmM3YmRjYjgxMzJhNmE1ZTNjMi5zZXRDb250ZW50KGh0bWxfMmE0YjJjZTI4NTEzNGMxYzg4YWNkMjM4MjE1OGViNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDNiMDY1MzZkMjVhNDc2ZTlhN2UzZWQ2MjIxOTgxMGEuYmluZFBvcHVwKHBvcHVwX2QwMDgyMWFiNGUyZjQyYzdiZGNiODEzMmE2YTVlM2MyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyZTM4NmU5MGFlODRkOWRhMmE2ZjI4NWVlMmE4MWQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjYxYmVmZDA2Y2NkNDNiMGE1ODE3NTc5Njg5NTc3ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA3YTE3M2Y4NWYzNGRkOTlkYzdkN2FmN2EyNWY4ZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzgwN2ExNzNmODVmMzRkZDk5ZGM3ZDdhZjdhMjVmOGQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2MWJlZmQwNmNjZDQzYjBhNTgxNzU3OTY4OTU3N2RiLnNldENvbnRlbnQoaHRtbF84MDdhMTczZjg1ZjM0ZGQ5OWRjN2Q3YWY3YTI1ZjhkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMmUzODZlOTBhZTg0ZDlkYTJhNmYyODVlZTJhODFkOC5iaW5kUG9wdXAocG9wdXBfZjYxYmVmZDA2Y2NkNDNiMGE1ODE3NTc5Njg5NTc3ZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIxYjNkYjM4YzhhNDk1YzgyZTRmYTllNTA4YTRmYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzVlOTEzY2ZjNjY0YmE4YWJiOTJhZjljMDIwODc5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OTBkNDJmMzgwN2M0ODI1YTBlN2I0MzkzMGFiMmE1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTkwZDQyZjM4MDdjNDgyNWEwZTdiNDM5MzBhYjJhNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzVlOTEzY2ZjNjY0YmE4YWJiOTJhZjljMDIwODc5ZC5zZXRDb250ZW50KGh0bWxfOTkwZDQyZjM4MDdjNDgyNWEwZTdiNDM5MzBhYjJhNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTIxYjNkYjM4YzhhNDk1YzgyZTRmYTllNTA4YTRmYzYuYmluZFBvcHVwKHBvcHVwXzFjNWU5MTNjZmM2NjRiYThhYmI5MmFmOWMwMjA4NzlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiNTQ5NjIxYWYwZDQ3ZThiNDU0OTdlMDkxNjYyM2U1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWI5ZjQ4OWZjZjFhNDBmMTg4NTM1MjA3ODhlYzkwOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc1MThjNDdlYmMxNDYzZThkNDUwYTEwNDE5Yjc3NDYgPSAkKCc8ZGl2IGlkPSJodG1sXzU3NTE4YzQ3ZWJjMTQ2M2U4ZDQ1MGExMDQxOWI3NzQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWI5ZjQ4OWZjZjFhNDBmMTg4NTM1MjA3ODhlYzkwOGIuc2V0Q29udGVudChodG1sXzU3NTE4YzQ3ZWJjMTQ2M2U4ZDQ1MGExMDQxOWI3NzQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiNTQ5NjIxYWYwZDQ3ZThiNDU0OTdlMDkxNjYyM2U1LmJpbmRQb3B1cChwb3B1cF9lYjlmNDg5ZmNmMWE0MGYxODg1MzUyMDc4OGVjOTA4Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hM2QxZjUwYWYxYjU0NmVhODIxMjAxYzcyMTk3ODIzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY0MWIxYzhiNzBmNDIxYzkyM2QxNDRmNGU3NjQwZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjAxYjEzZjNlNWI2NDEyOGEwNThjYWViZjYyYmQ0ZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzIwMWIxM2YzZTViNjQxMjhhMDU4Y2FlYmY2MmJkNGRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY0MWIxYzhiNzBmNDIxYzkyM2QxNDRmNGU3NjQwZWMuc2V0Q29udGVudChodG1sXzIwMWIxM2YzZTViNjQxMjhhMDU4Y2FlYmY2MmJkNGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzZDFmNTBhZjFiNTQ2ZWE4MjEyMDFjNzIxOTc4MjMyLmJpbmRQb3B1cChwb3B1cF8yZjQxYjFjOGI3MGY0MjFjOTIzZDE0NGY0ZTc2NDBlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTZlMzY5YTgyNjI0ZDI0ODQxMDM4ZGE2ZjUyODQ5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU5NmJiNjc3ZjU3NGZmMjhmYzUyZGZlN2I3MjdmMjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY4MGY0NjQ2OTc2NDRhMWIwMTc2NDU0MjFjNDQzMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzk2ODBmNDY0Njk3NjQ0YTFiMDE3NjQ1NDIxYzQ0MzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1OTZiYjY3N2Y1NzRmZjI4ZmM1MmRmZTdiNzI3ZjI4LnNldENvbnRlbnQoaHRtbF85NjgwZjQ2NDY5NzY0NGExYjAxNzY0NTQyMWM0NDMxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOTZlMzY5YTgyNjI0ZDI0ODQxMDM4ZGE2ZjUyODQ5Ni5iaW5kUG9wdXAocG9wdXBfMTU5NmJiNjc3ZjU3NGZmMjhmYzUyZGZlN2I3MjdmMjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWJhMWFmMDQzNmVlNDNjOWI2YmQ4ZTI3YjJkYjBkMjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjA0MjRkNDc4MjdlNDFlZWJmZWNmYzdkYmY5MmM1NmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODZiYWM5YWUwZjg2NGJiNjg1ZWRiNzNmNTNiNjQ4NmIgPSAkKCc8ZGl2IGlkPSJodG1sXzg2YmFjOWFlMGY4NjRiYjY4NWVkYjczZjUzYjY0ODZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwNDI0ZDQ3ODI3ZTQxZWViZmVjZmM3ZGJmOTJjNTZlLnNldENvbnRlbnQoaHRtbF84NmJhYzlhZTBmODY0YmI2ODVlZGI3M2Y1M2I2NDg2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YmExYWYwNDM2ZWU0M2M5YjZiZDhlMjdiMmRiMGQyMy5iaW5kUG9wdXAocG9wdXBfMjA0MjRkNDc4MjdlNDFlZWJmZWNmYzdkYmY5MmM1NmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzVlNGYwZDg2NzdkNDhhMTlkN2EwYWRmY2VmZWFlMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM0Mzc4ODBiMTQyNGU2MWJiN2YzOTBkZWI0ODkzNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDgwM2Q4NWUzYTU2NDY1YWIyODY0NTBjNmZlYzc5YzkgPSAkKCc8ZGl2IGlkPSJodG1sXzA4MDNkODVlM2E1NjQ2NWFiMjg2NDUwYzZmZWM3OWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmM0Mzc4ODBiMTQyNGU2MWJiN2YzOTBkZWI0ODkzNDIuc2V0Q29udGVudChodG1sXzA4MDNkODVlM2E1NjQ2NWFiMjg2NDUwYzZmZWM3OWM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1ZTRmMGQ4Njc3ZDQ4YTE5ZDdhMGFkZmNlZmVhZTM4LmJpbmRQb3B1cChwb3B1cF82YzQzNzg4MGIxNDI0ZTYxYmI3ZjM5MGRlYjQ4OTM0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWNlY2Y5ZGVjMzQ0MWU2OWQ3OTNkZTJiNzNiYWU2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNGUwZGY3ZjY1MTE0M2NkYWY4NGEyYjdjZGI4ZDEwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTQxNTlmNmU2ZTY0YjliYTJhYzRjMzY3ZjMyN2U2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjU0MTU5ZjZlNmU2NGI5YmEyYWM0YzM2N2YzMjdlNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZTBkZjdmNjUxMTQzY2RhZjg0YTJiN2NkYjhkMTAzLnNldENvbnRlbnQoaHRtbF9mNTQxNTlmNmU2ZTY0YjliYTJhYzRjMzY3ZjMyN2U2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYWNlY2Y5ZGVjMzQ0MWU2OWQ3OTNkZTJiNzNiYWU2OS5iaW5kUG9wdXAocG9wdXBfYjRlMGRmN2Y2NTExNDNjZGFmODRhMmI3Y2RiOGQxMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ViNjk4Y2E0NGVmNDJhMDlmNzQ1NDZmZGYxMzZlMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yODEzYTBmMDkzMjA0NDVjOTVmZDIzOTlmZjk3N2E1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NmEzNDA1MjBhZGY0MjBkYTg5MzM5N2Q2MDk4NTkwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTZhMzQwNTIwYWRmNDIwZGE4OTMzOTdkNjA5ODU5MGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yODEzYTBmMDkzMjA0NDVjOTVmZDIzOTlmZjk3N2E1Yi5zZXRDb250ZW50KGh0bWxfOTZhMzQwNTIwYWRmNDIwZGE4OTMzOTdkNjA5ODU5MGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2ViNjk4Y2E0NGVmNDJhMDlmNzQ1NDZmZGYxMzZlMWEuYmluZFBvcHVwKHBvcHVwXzI4MTNhMGYwOTMyMDQ0NWM5NWZkMjM5OWZmOTc3YTViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3ZTNlMThkYWI5MDQ4NGNiYzU0ZDhkZGQ1YWE0MTI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyZGRkMzIyZjdhOTRlMTY4YjU0ZTAyZjRkNmFiNDdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5MWVmMzc3YWJlNjQ0YzVhYzY4MTE2MmZmYmRkYTYyID0gJCgnPGRpdiBpZD0iaHRtbF8zOTFlZjM3N2FiZTY0NGM1YWM2ODExNjJmZmJkZGE2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MmRkZDMyMmY3YTk0ZTE2OGI1NGUwMmY0ZDZhYjQ3Zi5zZXRDb250ZW50KGh0bWxfMzkxZWYzNzdhYmU2NDRjNWFjNjgxMTYyZmZiZGRhNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDdlM2UxOGRhYjkwNDg0Y2JjNTRkOGRkZDVhYTQxMjQuYmluZFBvcHVwKHBvcHVwXzUyZGRkMzIyZjdhOTRlMTY4YjU0ZTAyZjRkNmFiNDdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0N2YxN2EwYzIzYjRjMDlhMjA3NjZkYjNkZDIyNGQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwNmU0MjZkMWIxYTQ3NWM5YWRmNWQxNmMyZmU4MDI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyMDU2NDUzYTJlZTQwZWY4NTQzMzRlY2FjM2UxMDMzID0gJCgnPGRpdiBpZD0iaHRtbF8yMjA1NjQ1M2EyZWU0MGVmODU0MzM0ZWNhYzNlMTAzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMDZlNDI2ZDFiMWE0NzVjOWFkZjVkMTZjMmZlODAyOS5zZXRDb250ZW50KGh0bWxfMjIwNTY0NTNhMmVlNDBlZjg1NDMzNGVjYWMzZTEwMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjQ3ZjE3YTBjMjNiNGMwOWEyMDc2NmRiM2RkMjI0ZDkuYmluZFBvcHVwKHBvcHVwXzEwNmU0MjZkMWIxYTQ3NWM5YWRmNWQxNmMyZmU4MDI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4NzIyZDhiMDE2YzQ1ZjU4OWU1NGJlZDM0MzM3ZTg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljMDA2NzBmNTkyYzQ2Y2ZiMmFjMjJjZjM0ZGJmZDA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyZWMxOGNhZjUyMDQxOGFiYTEwMzdjMDU5YjA3OTM4ID0gJCgnPGRpdiBpZD0iaHRtbF8wMmVjMThjYWY1MjA0MThhYmExMDM3YzA1OWIwNzkzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzAwNjcwZjU5MmM0NmNmYjJhYzIyY2YzNGRiZmQwNC5zZXRDb250ZW50KGh0bWxfMDJlYzE4Y2FmNTIwNDE4YWJhMTAzN2MwNTliMDc5MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg3MjJkOGIwMTZjNDVmNTg5ZTU0YmVkMzQzMzdlODkuYmluZFBvcHVwKHBvcHVwXzljMDA2NzBmNTkyYzQ2Y2ZiMmFjMjJjZjM0ZGJmZDA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4MTcxOGU5YTYxNDRjMmI4ODZjOGNiODY0ZTQ2ZjViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkZjMzMTU3ZmMxMDQ0NmFhNzg3NjQwM2JhOThhYzI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwNTI0ZTczNGYyNDQ4ZGE5MGIxMmNmNDgwNWMxNTdhID0gJCgnPGRpdiBpZD0iaHRtbF9kMDUyNGU3MzRmMjQ0OGRhOTBiMTJjZjQ4MDVjMTU3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2RmMzMxNTdmYzEwNDQ2YWE3ODc2NDAzYmE5OGFjMjYuc2V0Q29udGVudChodG1sX2QwNTI0ZTczNGYyNDQ4ZGE5MGIxMmNmNDgwNWMxNTdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4MTcxOGU5YTYxNDRjMmI4ODZjOGNiODY0ZTQ2ZjViLmJpbmRQb3B1cChwb3B1cF8zZGYzMzE1N2ZjMTA0NDZhYTc4NzY0MDNiYTk4YWMyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZDgyNTMxMTdhMjA0YTViOGVmZTUxYjM2YzFjZmM1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2MDg5NDIzMTdhMjQyZWI4MDk3ZWJkY2MxNzhjY2MyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViYjM4ZDEyYzlkZTQ2MWE5OGY1ZDIyZTRjNGYxOGUzID0gJCgnPGRpdiBpZD0iaHRtbF81YmIzOGQxMmM5ZGU0NjFhOThmNWQyMmU0YzRmMThlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2MDg5NDIzMTdhMjQyZWI4MDk3ZWJkY2MxNzhjY2MyLnNldENvbnRlbnQoaHRtbF81YmIzOGQxMmM5ZGU0NjFhOThmNWQyMmU0YzRmMThlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDgyNTMxMTdhMjA0YTViOGVmZTUxYjM2YzFjZmM1ZC5iaW5kUG9wdXAocG9wdXBfMTYwODk0MjMxN2EyNDJlYjgwOTdlYmRjYzE3OGNjYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI0NGYzMDUxNTVmNGNmNWJjOWRjMmJhNTMzMzU0YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0ZjhlMjQxNjUyZTQ2ZWI4Nzk2OTQ3OTA0ZjRmZjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhZmVjN2UxMDRkNzQzMDU5NDY2MmJiNWE2Zjg1ZjI4ID0gJCgnPGRpdiBpZD0iaHRtbF8yYWZlYzdlMTA0ZDc0MzA1OTQ2NjJiYjVhNmY4NWYyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjRmOGUyNDE2NTJlNDZlYjg3OTY5NDc5MDRmNGZmODMuc2V0Q29udGVudChodG1sXzJhZmVjN2UxMDRkNzQzMDU5NDY2MmJiNWE2Zjg1ZjI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiNDRmMzA1MTU1ZjRjZjViYzlkYzJiYTUzMzM1NGJmLmJpbmRQb3B1cChwb3B1cF8yNGY4ZTI0MTY1MmU0NmViODc5Njk0NzkwNGY0ZmY4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOGM1NGYxY2Q0MmM0OWJjYTlmNGZhNjNmNWUxOGE0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmMWZlNTMzYzliMzQyMTJiY2FlOGVjNDExZjU2N2ZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4OGEwNjI3YmEyYzQwMjhhYTkyYzJjNTBmMTYzZDQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9mODhhMDYyN2JhMmM0MDI4YWE5MmMyYzUwZjE2M2Q0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmYxZmU1MzNjOWIzNDIxMmJjYWU4ZWM0MTFmNTY3ZmEuc2V0Q29udGVudChodG1sX2Y4OGEwNjI3YmEyYzQwMjhhYTkyYzJjNTBmMTYzZDQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4YzU0ZjFjZDQyYzQ5YmNhOWY0ZmE2M2Y1ZTE4YTRmLmJpbmRQb3B1cChwb3B1cF82ZjFmZTUzM2M5YjM0MjEyYmNhZThlYzQxMWY1NjdmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80N2U2MGZkZTA2NWI0MWNhYjcwMTY0YjhhOTcyNzM1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNGQzYzBjN2Y3NGY0YzU5OTNlZjBmYTYzMzMwNWQ1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNWNmYTMwOTRiYzA0YzgxOGExMjQwMTYyZjFjMDE0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzVjZmEzMDk0YmMwNGM4MThhMTI0MDE2MmYxYzAxNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTRkM2MwYzdmNzRmNGM1OTkzZWYwZmE2MzMzMDVkNTguc2V0Q29udGVudChodG1sXzM1Y2ZhMzA5NGJjMDRjODE4YTEyNDAxNjJmMWMwMTQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3ZTYwZmRlMDY1YjQxY2FiNzAxNjRiOGE5NzI3MzUxLmJpbmRQb3B1cChwb3B1cF9hNGQzYzBjN2Y3NGY0YzU5OTNlZjBmYTYzMzMwNWQ1OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzIxOWQzMzFmMGU0ZTZmODEwNjJhY2ViMTlhNDJjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDBmYjk3MmVmMTQ0OTZmOWNmMDFiYmEwNDE5ZDM1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjIyYzkyZTllYTI0ZWE5YjlhN2IzOGNhZjc5MWExZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmIyMmM5MmU5ZWEyNGVhOWI5YTdiMzhjYWY3OTFhMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmQwZmI5NzJlZjE0NDk2ZjljZjAxYmJhMDQxOWQzNWQuc2V0Q29udGVudChodG1sXzZiMjJjOTJlOWVhMjRlYTliOWE3YjM4Y2FmNzkxYTFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjMjE5ZDMzMWYwZTRlNmY4MTA2MmFjZWIxOWE0MmM1LmJpbmRQb3B1cChwb3B1cF8yZDBmYjk3MmVmMTQ0OTZmOWNmMDFiYmEwNDE5ZDM1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjdiODQ1ODA2MmQ0Y2U3OGI3YWVkYTExNmY1Y2E1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOTQ0ZThhNDYxNWQ0OGU2ODk2MmU4NGI0MWUxMmJmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYzEwOGZjNDdmMzU0ZDE2OGNmZTlkOWYyNWUzNTJhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2MxMDhmYzQ3ZjM1NGQxNjhjZmU5ZDlmMjVlMzUyYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOTQ0ZThhNDYxNWQ0OGU2ODk2MmU4NGI0MWUxMmJmOC5zZXRDb250ZW50KGh0bWxfY2MxMDhmYzQ3ZjM1NGQxNjhjZmU5ZDlmMjVlMzUyYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWY3Yjg0NTgwNjJkNGNlNzhiN2FlZGExMTZmNWNhNWIuYmluZFBvcHVwKHBvcHVwXzI5NDRlOGE0NjE1ZDQ4ZTY4OTYyZTg0YjQxZTEyYmY4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyMTBlNmQ4MWZjMTRlYThhNDU1NmNjNDNlOTAwYWQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2I5N2U1YjJkMjZmNGM4NThjOTkyZjUyMjgzOWE5MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGFiNzM0ZTUzZmJmNGZlNGI1ZGMxMDgxZTU3ZDlmYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzhhYjczNGU1M2ZiZjRmZTRiNWRjMTA4MWU1N2Q5ZmJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Yjk3ZTViMmQyNmY0Yzg1OGM5OTJmNTIyODM5YTkyNi5zZXRDb250ZW50KGh0bWxfOGFiNzM0ZTUzZmJmNGZlNGI1ZGMxMDgxZTU3ZDlmYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTIxMGU2ZDgxZmMxNGVhOGE0NTU2Y2M0M2U5MDBhZDQuYmluZFBvcHVwKHBvcHVwXzdiOTdlNWIyZDI2ZjRjODU4Yzk5MmY1MjI4MzlhOTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3OTIzOTNiYjZiNzRlNjVhNmQxZGQ1YzYxM2IzMGFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDk4YmYyMzdjMGY0NTg0OTUyNDVlMGRhZjA1YWU4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjI5MGY3OThhYTI0NWM0YmNlNzhmNTVmZjU3MTNjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmIyOTBmNzk4YWEyNDVjNGJjZTc4ZjU1ZmY1NzEzYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDk4YmYyMzdjMGY0NTg0OTUyNDVlMGRhZjA1YWU4Mi5zZXRDb250ZW50KGh0bWxfZmIyOTBmNzk4YWEyNDVjNGJjZTc4ZjU1ZmY1NzEzYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjc5MjM5M2JiNmI3NGU2NWE2ZDFkZDVjNjEzYjMwYWUuYmluZFBvcHVwKHBvcHVwXzk0OThiZjIzN2MwZjQ1ODQ5NTI0NWUwZGFmMDVhZTgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlYmQ2MDQyOTJmNDRmYTlhNjhiYWZjNzk4ZDFjMTUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUzMTU0OGEyNjcyNDhiNTg3OGE3MzJiOGRhYjVkODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBkZDJiYzY3NTQyNDE0ZWI4NTYxNTJjMWQwMWI3MjQgPSAkKCc8ZGl2IGlkPSJodG1sX2EwZGQyYmM2NzU0MjQxNGViODU2MTUyYzFkMDFiNzI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1MzE1NDhhMjY3MjQ4YjU4NzhhNzMyYjhkYWI1ZDg2LnNldENvbnRlbnQoaHRtbF9hMGRkMmJjNjc1NDI0MTRlYjg1NjE1MmMxZDAxYjcyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZWJkNjA0MjkyZjQ0ZmE5YTY4YmFmYzc5OGQxYzE1My5iaW5kUG9wdXAocG9wdXBfYTUzMTU0OGEyNjcyNDhiNTg3OGE3MzJiOGRhYjVkODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmU5M2NlZDUwYzc4NDU1MWFkYThjNTE0N2YwNzhiYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYWQyNGRmYWE3N2M0NGUzOWM0OTg1MzE3NjY3NGE3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNGE3MzYyZjBlNjg0MjY5YTYwYWRmZWMyNjA1NjQ1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTRhNzM2MmYwZTY4NDI2OWE2MGFkZmVjMjYwNTY0NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYWQyNGRmYWE3N2M0NGUzOWM0OTg1MzE3NjY3NGE3Ny5zZXRDb250ZW50KGh0bWxfMTRhNzM2MmYwZTY4NDI2OWE2MGFkZmVjMjYwNTY0NTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmU5M2NlZDUwYzc4NDU1MWFkYThjNTE0N2YwNzhiYzkuYmluZFBvcHVwKHBvcHVwX2JhZDI0ZGZhYTc3YzQ0ZTM5YzQ5ODUzMTc2Njc0YTc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyZjc1NDQ0MzkzZTRlYzg4OTQxODllNjk2NGNmZjlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzNzE3OGY0YmEzNzQ0Yzk4ZTExNzMyNWEyYjBmZDZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1NmMyZjA3YmIxNzRkMGRiNDM0MTZiNzExMzU3NTllID0gJCgnPGRpdiBpZD0iaHRtbF80NTZjMmYwN2JiMTc0ZDBkYjQzNDE2YjcxMTM1NzU5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzM3MTc4ZjRiYTM3NDRjOThlMTE3MzI1YTJiMGZkNmMuc2V0Q29udGVudChodG1sXzQ1NmMyZjA3YmIxNzRkMGRiNDM0MTZiNzExMzU3NTllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyZjc1NDQ0MzkzZTRlYzg4OTQxODllNjk2NGNmZjlmLmJpbmRQb3B1cChwb3B1cF9jMzcxNzhmNGJhMzc0NGM5OGUxMTczMjVhMmIwZmQ2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYmE1MmJiNGNjYmI0ZjU5YmM1ZjY0NjUyNzk2NDYxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmNiMjhhZmRmM2E2NDJmMTljMzg2YWM4YjZhOTg1MTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMxN2E3MTM0YzFlNGQ2M2I4YzYwMTQ5ZmI4MDQ3NzMgPSAkKCc8ZGl2IGlkPSJodG1sX2VjMTdhNzEzNGMxZTRkNjNiOGM2MDE0OWZiODA0NzczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmNiMjhhZmRmM2E2NDJmMTljMzg2YWM4YjZhOTg1MTAuc2V0Q29udGVudChodG1sX2VjMTdhNzEzNGMxZTRkNjNiOGM2MDE0OWZiODA0NzczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViYTUyYmI0Y2NiYjRmNTliYzVmNjQ2NTI3OTY0NjEzLmJpbmRQb3B1cChwb3B1cF9iY2IyOGFmZGYzYTY0MmYxOWMzODZhYzhiNmE5ODUxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjc2OWUxMTc0YzE0YWRkYmU4MTBiZDkzNWJmZTJhNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMWExZDNiNmI5ZWY0YTVjYWYzOTRhYWFiZjgyYTBmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjcwYjRiODM5NzY0MzY5YTI0N2I1NmVkYTljZmFjMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTI3MGI0YjgzOTc2NDM2OWEyNDdiNTZlZGE5Y2ZhYzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxYTFkM2I2YjllZjRhNWNhZjM5NGFhYWJmODJhMGZlLnNldENvbnRlbnQoaHRtbF9lMjcwYjRiODM5NzY0MzY5YTI0N2I1NmVkYTljZmFjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjc2OWUxMTc0YzE0YWRkYmU4MTBiZDkzNWJmZTJhNy5iaW5kUG9wdXAocG9wdXBfZTFhMWQzYjZiOWVmNGE1Y2FmMzk0YWFhYmY4MmEwZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGI5NDA4NGY3MjIzNDUwZThmM2NlOWMyMDdiMGMzZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM3Y2VkZTc1MjNlNGVjMzk5YTA1YTg1ODYyNDMxMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU1Mjg1Y2Q5MGNkNDUwYWFkOTBmNzRiYjdlNjk5YTYgPSAkKCc8ZGl2IGlkPSJodG1sXzhlNTI4NWNkOTBjZDQ1MGFhZDkwZjc0YmI3ZTY5OWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM3Y2VkZTc1MjNlNGVjMzk5YTA1YTg1ODYyNDMxMjUuc2V0Q29udGVudChodG1sXzhlNTI4NWNkOTBjZDQ1MGFhZDkwZjc0YmI3ZTY5OWE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiOTQwODRmNzIyMzQ1MGU4ZjNjZTljMjA3YjBjM2Q4LmJpbmRQb3B1cChwb3B1cF84MzdjZWRlNzUyM2U0ZWMzOTlhMDVhODU4NjI0MzEyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODYyZDliYmVkZDk0ZjUwOGNmYWJjMjE1NDExNDhkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWNmMjRlMzk0ZmUwNDc4ZmI2ZDIzM2Q3YzY4N2RlYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZThhZGVlOTU2NmYzNGZiNzg5NjM4ZGM0YzI1NWQyYjcgPSAkKCc8ZGl2IGlkPSJodG1sX2U4YWRlZTk1NjZmMzRmYjc4OTYzOGRjNGMyNTVkMmI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVjZjI0ZTM5NGZlMDQ3OGZiNmQyMzNkN2M2ODdkZWE2LnNldENvbnRlbnQoaHRtbF9lOGFkZWU5NTY2ZjM0ZmI3ODk2MzhkYzRjMjU1ZDJiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lODYyZDliYmVkZDk0ZjUwOGNmYWJjMjE1NDExNDhkYy5iaW5kUG9wdXAocG9wdXBfNWNmMjRlMzk0ZmUwNDc4ZmI2ZDIzM2Q3YzY4N2RlYTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWM2MWYwYzYxOGUzNDNlNmJjZGQ1NGI1ZGRlMDMyMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTIzNTEyOWJlODY4NDExMTk3NjM2M2FjMzJiNjg1NmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjFjZjBjY2VjYTY0NDZhZGI2OTgwZTI5YmJjZjkzNmIgPSAkKCc8ZGl2IGlkPSJodG1sX2IxY2YwY2NlY2E2NDQ2YWRiNjk4MGUyOWJiY2Y5MzZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyMzUxMjliZTg2ODQxMTE5NzYzNjNhYzMyYjY4NTZhLnNldENvbnRlbnQoaHRtbF9iMWNmMGNjZWNhNjQ0NmFkYjY5ODBlMjliYmNmOTM2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YzYxZjBjNjE4ZTM0M2U2YmNkZDU0YjVkZGUwMzIwNS5iaW5kUG9wdXAocG9wdXBfMTIzNTEyOWJlODY4NDExMTk3NjM2M2FjMzJiNjg1NmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDE5NTAwOGJmMzk1NGE3NzlhOTEyOWY2YWVmYTRjYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTA5NjJmZjBmNzk0NjA2OGQ3MjVhY2U2MDc5NTg4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMGM1YmFjMTQwOTU0YzNmYWUwYjU1MWVkZDRkZjkwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzBjNWJhYzE0MDk1NGMzZmFlMGI1NTFlZGQ0ZGY5MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTA5NjJmZjBmNzk0NjA2OGQ3MjVhY2U2MDc5NTg4Yy5zZXRDb250ZW50KGh0bWxfMzBjNWJhYzE0MDk1NGMzZmFlMGI1NTFlZGQ0ZGY5MDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDE5NTAwOGJmMzk1NGE3NzlhOTEyOWY2YWVmYTRjYzIuYmluZFBvcHVwKHBvcHVwXzc1MDk2MmZmMGY3OTQ2MDY4ZDcyNWFjZTYwNzk1ODhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiNTAzMjhjNDE2YjQzNTliMzI5MWM1NTFlMmY3ZjcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JlMWQ3OWM4ZjUxNDVhNGJlNTVmNDExMzQ0YzU1NzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDVjNDdmNjJhMGY2NGIyYTg2MTMzYWJkMTUxNzM0OWQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1YzQ3ZjYyYTBmNjRiMmE4NjEzM2FiZDE1MTczNDlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYmUxZDc5YzhmNTE0NWE0YmU1NWY0MTEzNDRjNTU3Ni5zZXRDb250ZW50KGh0bWxfZDVjNDdmNjJhMGY2NGIyYTg2MTMzYWJkMTUxNzM0OWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI1MDMyOGM0MTZiNDM1OWIzMjkxYzU1MWUyZjdmNzEuYmluZFBvcHVwKHBvcHVwX2NiZTFkNzljOGY1MTQ1YTRiZTU1ZjQxMTM0NGM1NTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2YmI1YzhmNWM2NTRkNjQ5NzA4NWJhYzgyYWVjNGFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Y2VjNWEwMmY3ZjY0ZTNmYTlhNWI3MzM1ZDhkZGMwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wN2E0ZjRhNDRmMTg0NzZiYjI3Yjg4OGNjY2JmNmM3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDdhNGY0YTQ0ZjE4NDc2YmIyN2I4ODhjY2NiZjZjNzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84Y2VjNWEwMmY3ZjY0ZTNmYTlhNWI3MzM1ZDhkZGMwZS5zZXRDb250ZW50KGh0bWxfMDdhNGY0YTQ0ZjE4NDc2YmIyN2I4ODhjY2NiZjZjNzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZiYjVjOGY1YzY1NGQ2NDk3MDg1YmFjODJhZWM0YWEuYmluZFBvcHVwKHBvcHVwXzhjZWM1YTAyZjdmNjRlM2ZhOWE1YjczMzVkOGRkYzBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3ZDI5NWY5MWEyMTRmYjlhZmE1M2E5NTEyMjM2MmIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwYzc5MDdlMzBkZjQ4OTZhYWY0MDUwMjM4NDVmNWNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkMWVhZDgxOWRiYzRjZTBiYjVmNTVmNDc5ZTVhMjYzID0gJCgnPGRpdiBpZD0iaHRtbF8zZDFlYWQ4MTlkYmM0Y2UwYmI1ZjU1ZjQ3OWU1YTI2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYzc5MDdlMzBkZjQ4OTZhYWY0MDUwMjM4NDVmNWNkLnNldENvbnRlbnQoaHRtbF8zZDFlYWQ4MTlkYmM0Y2UwYmI1ZjU1ZjQ3OWU1YTI2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lN2QyOTVmOTFhMjE0ZmI5YWZhNTNhOTUxMjIzNjJiMC5iaW5kUG9wdXAocG9wdXBfYTBjNzkwN2UzMGRmNDg5NmFhZjQwNTAyMzg0NWY1Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2MwZjcyNWI3OTE0NDUxNWJmZjI5Nzc2ZTVhZGI4M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjFjYjNlZmU3MzEzNGRiN2I1MWQ2ZWI3YjNjNGQ0MGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJmMWI4ZWQ2ODAwNDI2MGI0ZDkyM2FhM2I0NTg5YzggPSAkKCc8ZGl2IGlkPSJodG1sXzliZjFiOGVkNjgwMDQyNjBiNGQ5MjNhYTNiNDU4OWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjFjYjNlZmU3MzEzNGRiN2I1MWQ2ZWI3YjNjNGQ0MGUuc2V0Q29udGVudChodG1sXzliZjFiOGVkNjgwMDQyNjBiNGQ5MjNhYTNiNDU4OWM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjMGY3MjViNzkxNDQ1MTViZmYyOTc3NmU1YWRiODNmLmJpbmRQb3B1cChwb3B1cF9iMWNiM2VmZTczMTM0ZGI3YjUxZDZlYjdiM2M0ZDQwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjA0NjEzZjM5NzM0OTQ0YWM3NTJlNTZjOWY1M2Q4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTI3NzEzOTI3YmFjNGZmMWFhMjdjYzFiNjJmMTZkNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTVjYmEwOThmNDAyNDI3MGEwYWE5ZjI1NTg3OTk0YjIgPSAkKCc8ZGl2IGlkPSJodG1sXzE1Y2JhMDk4ZjQwMjQyNzBhMGFhOWYyNTU4Nzk5NGIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjc3MTM5MjdiYWM0ZmYxYWEyN2NjMWI2MmYxNmQ1ZC5zZXRDb250ZW50KGh0bWxfMTVjYmEwOThmNDAyNDI3MGEwYWE5ZjI1NTg3OTk0YjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTIwNDYxM2YzOTczNDk0NGFjNzUyZTU2YzlmNTNkOGUuYmluZFBvcHVwKHBvcHVwXzEyNzcxMzkyN2JhYzRmZjFhYTI3Y2MxYjYyZjE2ZDVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyNjI5NzJhNTYyMDRjMmQ5ZWVkMjBiMTU0MjJkZjY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0ZGUyODJjMjhmZjRiMTI4ODIyOTlhZmVjNTgwYzk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyNmEzMzJlZDRkNTQ2ZGNhMzFiZDY3MjU4MjVlMDIyID0gJCgnPGRpdiBpZD0iaHRtbF9lMjZhMzMyZWQ0ZDU0NmRjYTMxYmQ2NzI1ODI1ZTAyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZGUyODJjMjhmZjRiMTI4ODIyOTlhZmVjNTgwYzk3LnNldENvbnRlbnQoaHRtbF9lMjZhMzMyZWQ0ZDU0NmRjYTMxYmQ2NzI1ODI1ZTAyMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjYyOTcyYTU2MjA0YzJkOWVlZDIwYjE1NDIyZGY2Ni5iaW5kUG9wdXAocG9wdXBfYjRkZTI4MmMyOGZmNGIxMjg4MjI5OWFmZWM1ODBjOTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTA0YjkxYzI1NGQ1NDQ2M2I2Yjk3NzQwZTNlYjcwZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0YjU5YjA3MTRlNzRmZGE4YmM3ZmM3YmJmMDg1NTk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk0MjExZTdlM2Q5MzRhMjRiMzJmOTJhMDA5M2YxNDIyID0gJCgnPGRpdiBpZD0iaHRtbF85NDIxMWU3ZTNkOTM0YTI0YjMyZjkyYTAwOTNmMTQyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTRiNTliMDcxNGU3NGZkYThiYzdmYzdiYmYwODU1OTQuc2V0Q29udGVudChodG1sXzk0MjExZTdlM2Q5MzRhMjRiMzJmOTJhMDA5M2YxNDIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwNGI5MWMyNTRkNTQ0NjNiNmI5Nzc0MGUzZWI3MGY5LmJpbmRQb3B1cChwb3B1cF85NGI1OWIwNzE0ZTc0ZmRhOGJjN2ZjN2JiZjA4NTU5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzViOTI0N2RkZDQ0NDA4YWZmMmJkN2VmMDU0NTcwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmE4YjU1Y2M0NTc0ODQwOGU0NmIwMTllNGI1MzIxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzZkNzMwYTdmZTA0ODgxYjVkNDNjZmU4YmM5YmQ5OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzc2ZDczMGE3ZmUwNDg4MWI1ZDQzY2ZlOGJjOWJkOTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYmE4YjU1Y2M0NTc0ODQwOGU0NmIwMTllNGI1MzIxYy5zZXRDb250ZW50KGh0bWxfYzc2ZDczMGE3ZmUwNDg4MWI1ZDQzY2ZlOGJjOWJkOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGM1YjkyNDdkZGQ0NDQwOGFmZjJiZDdlZjA1NDU3MGUuYmluZFBvcHVwKHBvcHVwXzNiYThiNTVjYzQ1NzQ4NDA4ZTQ2YjAxOWU0YjUzMjFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1NGIyM2M2NTNhODQxODk4MmNlMjNmZGQ3YjFmYWFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODE4NTllYzE1M2E3NGQxY2FkNzE5N2Y5MTljNWMzZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjIyMjljMmRjMDY1NDdmZTg0MzlhMWM5ZjdlZTRhYjEgPSAkKCc8ZGl2IGlkPSJodG1sX2IyMjI5YzJkYzA2NTQ3ZmU4NDM5YTFjOWY3ZWU0YWIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxODU5ZWMxNTNhNzRkMWNhZDcxOTdmOTE5YzVjM2YwLnNldENvbnRlbnQoaHRtbF9iMjIyOWMyZGMwNjU0N2ZlODQzOWExYzlmN2VlNGFiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NTRiMjNjNjUzYTg0MTg5ODJjZTIzZmRkN2IxZmFhZi5iaW5kUG9wdXAocG9wdXBfODE4NTllYzE1M2E3NGQxY2FkNzE5N2Y5MTljNWMzZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODkwNWNjOWFlYWNmNDFiN2EwNjQ3YTE1MzdkYTMwNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyOTExMTliNGY2MDRjNTE4OTAyOGE3MzkxM2M2Njc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhNDI4M2M4MmRiYzQ0NDZhOTg3NTAzZDBkZmEzMzllID0gJCgnPGRpdiBpZD0iaHRtbF83YTQyODNjODJkYmM0NDQ2YTk4NzUwM2QwZGZhMzM5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjkxMTE5YjRmNjA0YzUxODkwMjhhNzM5MTNjNjY3Ni5zZXRDb250ZW50KGh0bWxfN2E0MjgzYzgyZGJjNDQ0NmE5ODc1MDNkMGRmYTMzOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODkwNWNjOWFlYWNmNDFiN2EwNjQ3YTE1MzdkYTMwNDMuYmluZFBvcHVwKHBvcHVwXzgyOTExMTliNGY2MDRjNTE4OTAyOGE3MzkxM2M2Njc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViNDI1ZWZiMjc5ODQzZjZhMDM4OTk5NTM3OWZlODI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0YzMwNzhiOTNhZDRlMTI5ZjU0ZGRlYTBkZDk2ZjM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2Yzg3ODNmNzI2YTRjYTk4Y2JhNmViYzcwMTdjMDBhID0gJCgnPGRpdiBpZD0iaHRtbF9jNmM4NzgzZjcyNmE0Y2E5OGNiYTZlYmM3MDE3YzAwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0YzMwNzhiOTNhZDRlMTI5ZjU0ZGRlYTBkZDk2ZjM1LnNldENvbnRlbnQoaHRtbF9jNmM4NzgzZjcyNmE0Y2E5OGNiYTZlYmM3MDE3YzAwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YjQyNWVmYjI3OTg0M2Y2YTAzODk5OTUzNzlmZTgyNi5iaW5kUG9wdXAocG9wdXBfZjRjMzA3OGI5M2FkNGUxMjlmNTRkZGVhMGRkOTZmMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWRjZTNmODFiMGEzNDg5MWJkZjI1YzFmNTcyMGZmZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2YTg2MTFjYTdjMjQ1MzE4NTRlYmYzNDRhNTg4NjBlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkMzc4MDg3YzkyOTQ5NTE5YjU3OWVmNWM3NDViNDg5ID0gJCgnPGRpdiBpZD0iaHRtbF9iZDM3ODA4N2M5Mjk0OTUxOWI1NzllZjVjNzQ1YjQ4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmE4NjExY2E3YzI0NTMxODU0ZWJmMzQ0YTU4ODYwZS5zZXRDb250ZW50KGh0bWxfYmQzNzgwODdjOTI5NDk1MTliNTc5ZWY1Yzc0NWI0ODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWRjZTNmODFiMGEzNDg5MWJkZjI1YzFmNTcyMGZmZDcuYmluZFBvcHVwKHBvcHVwXzY2YTg2MTFjYTdjMjQ1MzE4NTRlYmYzNDRhNTg4NjBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmZjNhY2Q2YmNjNjQwOWY4ZTI3NGM4MjE2Yzg5OGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlYmY3YjJjYTYzZDRjYWE4MGYxM2Q3YjM0ZDFhNmE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5ZTEzODc5YTU1YTRlNDNhYWIwZGM4ZjY1OWI3YWNjID0gJCgnPGRpdiBpZD0iaHRtbF9jOWUxMzg3OWE1NWE0ZTQzYWFiMGRjOGY2NTliN2FjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZWJmN2IyY2E2M2Q0Y2FhODBmMTNkN2IzNGQxYTZhNy5zZXRDb250ZW50KGh0bWxfYzllMTM4NzlhNTVhNGU0M2FhYjBkYzhmNjU5YjdhY2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZmM2FjZDZiY2M2NDA5ZjhlMjc0YzgyMTZjODk4ZDAuYmluZFBvcHVwKHBvcHVwXzdlYmY3YjJjYTYzZDRjYWE4MGYxM2Q3YjM0ZDFhNmE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4NDhjY2M4YWQ2YzQzYWFhNDk5ZDFkN2M2ZjBkZTMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5Yzc1Mjk4YWIwMTQwODNiNzJlOWZmNGFlOWE1ODExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NmZlMjRiYTUxODRiZGZiNjA5ODJhZTRlMDFjMjVlID0gJCgnPGRpdiBpZD0iaHRtbF8yNjZmZTI0YmE1MTg0YmRmYjYwOTgyYWU0ZTAxYzI1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5Yzc1Mjk4YWIwMTQwODNiNzJlOWZmNGFlOWE1ODExLnNldENvbnRlbnQoaHRtbF8yNjZmZTI0YmE1MTg0YmRmYjYwOTgyYWU0ZTAxYzI1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kODQ4Y2NjOGFkNmM0M2FhYTQ5OWQxZDdjNmYwZGUzMS5iaW5kUG9wdXAocG9wdXBfYTljNzUyOThhYjAxNDA4M2I3MmU5ZmY0YWU5YTU4MTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTUxZDk4NmRhODk1NDY0ZGJlYjI5ZDVhMGM1NzU1ZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNWY3ODQwMTVjYjQ4NzQ4MGRkYmYwNDIwMjY4MmI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4MjhjMGFkYmE1NjRhNWZiNzFjMDllZTAyNWUzZThjID0gJCgnPGRpdiBpZD0iaHRtbF85ODI4YzBhZGJhNTY0YTVmYjcxYzA5ZWUwMjVlM2U4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTVmNzg0MDE1Y2I0ODc0ODBkZGJmMDQyMDI2ODJiNy5zZXRDb250ZW50KGh0bWxfOTgyOGMwYWRiYTU2NGE1ZmI3MWMwOWVlMDI1ZTNlOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTUxZDk4NmRhODk1NDY0ZGJlYjI5ZDVhMGM1NzU1ZGIuYmluZFBvcHVwKHBvcHVwX2NhNWY3ODQwMTVjYjQ4NzQ4MGRkYmYwNDIwMjY4MmI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3YjcxZWRkOGIzNTQ1NWE5Y2JmYWZjNzRmMjVmNWEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2Y2MzM2Y4YTZlOTQ3NDZiNzMyNTcxOTVjNWVjZTdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5YjI0NzIxNTg4NjQwMWJiNDg0ZGJmYmM5N2QyYmQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8wOWIyNDcyMTU4ODY0MDFiYjQ4NGRiZmJjOTdkMmJkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmNjMzNmOGE2ZTk0NzQ2YjczMjU3MTk1YzVlY2U3Yy5zZXRDb250ZW50KGh0bWxfMDliMjQ3MjE1ODg2NDAxYmI0ODRkYmZiYzk3ZDJiZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDdiNzFlZGQ4YjM1NDU1YTljYmZhZmM3NGYyNWY1YTAuYmluZFBvcHVwKHBvcHVwX2E2Y2MzM2Y4YTZlOTQ3NDZiNzMyNTcxOTVjNWVjZTdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzZjJmMjljY2Q5MTQ2NWRiY2ViOGZmNjBmOGQxMDg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzA2Y2Y5MDk2ZjU0NmFkODJlZWYxNTIxYWE2NmQ3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMWYzNTYzMTM0MzY0MjkwYjliODk4ZDg5NjFhYzRlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzFmMzU2MzEzNDM2NDI5MGI5Yjg5OGQ4OTYxYWM0ZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzA2Y2Y5MDk2ZjU0NmFkODJlZWYxNTIxYWE2NmQ3OC5zZXRDb250ZW50KGh0bWxfMzFmMzU2MzEzNDM2NDI5MGI5Yjg5OGQ4OTYxYWM0ZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzNmMmYyOWNjZDkxNDY1ZGJjZWI4ZmY2MGY4ZDEwODUuYmluZFBvcHVwKHBvcHVwXzczMDZjZjkwOTZmNTQ2YWQ4MmVlZjE1MjFhYTY2ZDc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0NmQ0N2NiMDU0NzRiM2ZiMjljMDY1ZTRmMjY1NTY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTFhZjMxZTg2MTk5NDMzNzk0MjE2NmI3NjU0MjdlNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjgyM2EyNzkxYTE3NDhiYzk3NmM3YzY5MzNkYjQxMWEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4MjNhMjc5MWExNzQ4YmM5NzZjN2M2OTMzZGI0MTFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTFhZjMxZTg2MTk5NDMzNzk0MjE2NmI3NjU0MjdlNmMuc2V0Q29udGVudChodG1sX2Y4MjNhMjc5MWExNzQ4YmM5NzZjN2M2OTMzZGI0MTFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0NmQ0N2NiMDU0NzRiM2ZiMjljMDY1ZTRmMjY1NTY0LmJpbmRQb3B1cChwb3B1cF8xMWFmMzFlODYxOTk0MzM3OTQyMTY2Yjc2NTQyN2U2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNzVhMDA4OGU3OWE0ZGU2YjkyODg0MTE3N2I1ZTVmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTNhMmQ3NGY4OWM0MjFiOTRkOTQ3MmI0OTVmMDZkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYmYzYTQ5Y2Q5OGI0MjY0OGI3NjQ2YWIyMjNkNmVmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmJmM2E0OWNkOThiNDI2NDhiNzY0NmFiMjIzZDZlZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTNhMmQ3NGY4OWM0MjFiOTRkOTQ3MmI0OTVmMDZkZS5zZXRDb250ZW50KGh0bWxfZmJmM2E0OWNkOThiNDI2NDhiNzY0NmFiMjIzZDZlZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDc1YTAwODhlNzlhNGRlNmI5Mjg4NDExNzdiNWU1ZmYuYmluZFBvcHVwKHBvcHVwXzZlM2EyZDc0Zjg5YzQyMWI5NGQ5NDcyYjQ5NWYwNmRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2OGViOTBmNzY2NTQ4YzU5MWJjY2UxOWY2NTQxMTAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mY2Y5MDM3MGQzOWE0NDZhOWY4MDMxODk3NmRmOWYxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDQwMzEwOWU4N2Y0NTFiYmY4MzBlYTQ0OGIyNzkxYyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2Q0MDMxMDllODdmNDUxYmJmODMwZWE0NDhiMjc5MWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmNmOTAzNzBkMzlhNDQ2YTlmODAzMTg5NzZkZjlmMWIuc2V0Q29udGVudChodG1sX2NkNDAzMTA5ZTg3ZjQ1MWJiZjgzMGVhNDQ4YjI3OTFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2OGViOTBmNzY2NTQ4YzU5MWJjY2UxOWY2NTQxMTAyLmJpbmRQb3B1cChwb3B1cF9mY2Y5MDM3MGQzOWE0NDZhOWY4MDMxODk3NmRmOWYxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNWRkNWE0YmVhZjM0MDJkOGFmNWI5YTg5ZjY0NTIwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZmUwODc4YzFjZDg0MGI5ODI4OTNjMzY3ODI3NTQ1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTEzZWE2NDI1OWM0OGU2YjJmMmNmNWJjNzgzNTRmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmUxM2VhNjQyNTljNDhlNmIyZjJjZjViYzc4MzU0ZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmZTA4NzhjMWNkODQwYjk4Mjg5M2MzNjc4Mjc1NDUwLnNldENvbnRlbnQoaHRtbF9mZTEzZWE2NDI1OWM0OGU2YjJmMmNmNWJjNzgzNTRmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNWRkNWE0YmVhZjM0MDJkOGFmNWI5YTg5ZjY0NTIwZi5iaW5kUG9wdXAocG9wdXBfM2ZlMDg3OGMxY2Q4NDBiOTgyODkzYzM2NzgyNzU0NTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTY2ZDgxODc1OGQ3NDVlMmI4ZDQyZGVkZjc0MzRlMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTQ0Zjk4MjIzYTg2NGJhZDk4MDdiOGJiZmI4NDZmOGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjMxMTE3YjI3MTYyNGY0Yjk4MDI4NGRhMTBhYjc4MjMgPSAkKCc8ZGl2IGlkPSJodG1sX2YzMTExN2IyNzE2MjRmNGI5ODAyODRkYTEwYWI3ODIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNDRmOTgyMjNhODY0YmFkOTgwN2I4YmJmYjg0NmY4ZS5zZXRDb250ZW50KGh0bWxfZjMxMTE3YjI3MTYyNGY0Yjk4MDI4NGRhMTBhYjc4MjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTY2ZDgxODc1OGQ3NDVlMmI4ZDQyZGVkZjc0MzRlMTUuYmluZFBvcHVwKHBvcHVwX2E0NGY5ODIyM2E4NjRiYWQ5ODA3YjhiYmZiODQ2ZjhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwMTlkMzcxOWZlMTRiMmY4NGVmNmU1MzBkZDkxYTc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxZjJkM2M1YTQwNTQyMjY4ODcwZjgxNTFjNTFhZTczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkODQ4ZjY5OTJiMDQyZTM5MmFmZWQxNDI1YmIxNzg4ID0gJCgnPGRpdiBpZD0iaHRtbF9lZDg0OGY2OTkyYjA0MmUzOTJhZmVkMTQyNWJiMTc4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxZjJkM2M1YTQwNTQyMjY4ODcwZjgxNTFjNTFhZTczLnNldENvbnRlbnQoaHRtbF9lZDg0OGY2OTkyYjA0MmUzOTJhZmVkMTQyNWJiMTc4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDE5ZDM3MTlmZTE0YjJmODRlZjZlNTMwZGQ5MWE3NC5iaW5kUG9wdXAocG9wdXBfODFmMmQzYzVhNDA1NDIyNjg4NzBmODE1MWM1MWFlNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTkwYzhlMTJkYjEwNGM2MGJiYzkyNDE4YzViZDFhMjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBlNTU2NzIxYjM5NGFlOGJiMTYwYWY0NjE3MDg2MGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQxYTkyZTVmY2ZmNDE2NzgzZDIwMTUzZGY2M2YwOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzU0MWE5MmU1ZmNmZjQxNjc4M2QyMDE1M2RmNjNmMDhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjBlNTU2NzIxYjM5NGFlOGJiMTYwYWY0NjE3MDg2MGMuc2V0Q29udGVudChodG1sXzU0MWE5MmU1ZmNmZjQxNjc4M2QyMDE1M2RmNjNmMDhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5MGM4ZTEyZGIxMDRjNjBiYmM5MjQxOGM1YmQxYTIyLmJpbmRQb3B1cChwb3B1cF8yMGU1NTY3MjFiMzk0YWU4YmIxNjBhZjQ2MTcwODYwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDRlNDMxZWViMWM0ZTJjOGU2MTc1YjMxMDAwMjMyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM0ZDQwYjc4NDZjNGE1M2JmOWZjODBhMmI1ZWE1ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzc0ZmNiMjNhMTBmNDViOWJkMGI4YjkxZDc0ZjkzN2MgPSAkKCc8ZGl2IGlkPSJodG1sXzM3NGZjYjIzYTEwZjQ1YjliZDBiOGI5MWQ3NGY5MzdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM0ZDQwYjc4NDZjNGE1M2JmOWZjODBhMmI1ZWE1ZmUuc2V0Q29udGVudChodG1sXzM3NGZjYjIzYTEwZjQ1YjliZDBiOGI5MWQ3NGY5MzdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwNGU0MzFlZWIxYzRlMmM4ZTYxNzViMzEwMDAyMzI1LmJpbmRQb3B1cChwb3B1cF8xMzRkNDBiNzg0NmM0YTUzYmY5ZmM4MGEyYjVlYTVmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTY1ZjQxNDcxN2U0Y2FmOWEzNmVkZTcxMGE5MDRkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmIyYTY3ODIxNWFhNDJmNTk5M2ZiMWNkY2M2ZjlmMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmI4ZmYxMDQwNzRlNGZjM2E1ODIzZWU2ZGY5YmViODMgPSAkKCc8ZGl2IGlkPSJodG1sXzJiOGZmMTA0MDc0ZTRmYzNhNTgyM2VlNmRmOWJlYjgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiMmE2NzgyMTVhYTQyZjU5OTNmYjFjZGNjNmY5ZjMwLnNldENvbnRlbnQoaHRtbF8yYjhmZjEwNDA3NGU0ZmMzYTU4MjNlZTZkZjliZWI4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTY1ZjQxNDcxN2U0Y2FmOWEzNmVkZTcxMGE5MDRkNy5iaW5kUG9wdXAocG9wdXBfYmIyYTY3ODIxNWFhNDJmNTk5M2ZiMWNkY2M2ZjlmMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWNlNjBjYjBkMWM0NGY3OTgwYTkxY2M1ZGUwZGQ3YzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTlmMGUzMWZkMDUyNDc1NThkMWIzODdlYTJkYTliZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODU5NjY0YWRhNTAyNGNjZTkyNmFlYzc2Y2FlZGMzZWIgPSAkKCc8ZGl2IGlkPSJodG1sXzg1OTY2NGFkYTUwMjRjY2U5MjZhZWM3NmNhZWRjM2ViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZjBlMzFmZDA1MjQ3NTU4ZDFiMzg3ZWEyZGE5YmU4LnNldENvbnRlbnQoaHRtbF84NTk2NjRhZGE1MDI0Y2NlOTI2YWVjNzZjYWVkYzNlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81Y2U2MGNiMGQxYzQ0Zjc5ODBhOTFjYzVkZTBkZDdjMS5iaW5kUG9wdXAocG9wdXBfYTlmMGUzMWZkMDUyNDc1NThkMWIzODdlYTJkYTliZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThkYTA2ZDUzZDFjNDdmODgwNmM3MGRjMDRjNGNlZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQ4MjI4NDg5ZWFiNGQ5ZWI5MGM3MzdmZDU5ODdhMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmYzYWZiYzI2YTM1NDEzZmIzYWZjMjI4MjlmNDdhNDYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmM2FmYmMyNmEzNTQxM2ZiM2FmYzIyODI5ZjQ3YTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDgyMjg0ODllYWI0ZDllYjkwYzczN2ZkNTk4N2EzMC5zZXRDb250ZW50KGh0bWxfZmYzYWZiYzI2YTM1NDEzZmIzYWZjMjI4MjlmNDdhNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNThkYTA2ZDUzZDFjNDdmODgwNmM3MGRjMDRjNGNlZTcuYmluZFBvcHVwKHBvcHVwXzZkODIyODQ4OWVhYjRkOWViOTBjNzM3ZmQ1OTg3YTMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2MzFiMjgzZTUwMjQwYTg5MjQzZmIxYTBjZWI4MmE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxNWNlMzNlNGZhMDQ4MjJhYmQxMjZmMDU2ZDY2ZDkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5NTJiYjgyZjY5ZjRjNTE5M2VkOGE0NjQ0MTE1ZjkwID0gJCgnPGRpdiBpZD0iaHRtbF8yOTUyYmI4MmY2OWY0YzUxOTNlZDhhNDY0NDExNWY5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTVjZTMzZTRmYTA0ODIyYWJkMTI2ZjA1NmQ2NmQ5MC5zZXRDb250ZW50KGh0bWxfMjk1MmJiODJmNjlmNGM1MTkzZWQ4YTQ2NDQxMTVmOTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzYzMWIyODNlNTAyNDBhODkyNDNmYjFhMGNlYjgyYTYuYmluZFBvcHVwKHBvcHVwX2YxNWNlMzNlNGZhMDQ4MjJhYmQxMjZmMDU2ZDY2ZDkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlMTAxZmFmZDYwZTQzNTRhYzU2ZGZiMmE3MDE4ZjI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyMzJkNTE1ZmE2ODRiYWE5MmIyOGU0YWEzYjA3Y2JkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2YTdmZGU1ODNiOTRhYTM5MjEyYWNjZWM3YmUzN2YxID0gJCgnPGRpdiBpZD0iaHRtbF85NmE3ZmRlNTgzYjk0YWEzOTIxMmFjY2VjN2JlMzdmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTIzMmQ1MTVmYTY4NGJhYTkyYjI4ZTRhYTNiMDdjYmQuc2V0Q29udGVudChodG1sXzk2YTdmZGU1ODNiOTRhYTM5MjEyYWNjZWM3YmUzN2YxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlMTAxZmFmZDYwZTQzNTRhYzU2ZGZiMmE3MDE4ZjI1LmJpbmRQb3B1cChwb3B1cF81MjMyZDUxNWZhNjg0YmFhOTJiMjhlNGFhM2IwN2NiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYmU5NzU5NWViODk0ODgzYTVhNTM5Mjk5M2MzOWJjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGJmMjM5MjkzZjRkNDFlY2FhN2QxOWNmOGQzYjhlOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjI2Nzk3ODMzMTdlNDEzZDg5MjMyMDAxOThhODNiMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzIyNjc5NzgzMzE3ZTQxM2Q4OTIzMjAwMTk4YTgzYjJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYmYyMzkyOTNmNGQ0MWVjYWE3ZDE5Y2Y4ZDNiOGU5Yy5zZXRDb250ZW50KGh0bWxfMjI2Nzk3ODMzMTdlNDEzZDg5MjMyMDAxOThhODNiMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWJlOTc1OTVlYjg5NDg4M2E1YTUzOTI5OTNjMzliY2EuYmluZFBvcHVwKHBvcHVwX2RiZjIzOTI5M2Y0ZDQxZWNhYTdkMTljZjhkM2I4ZTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlY2FlYTAzM2M1MTQ0NjY5NzRiNmFhNzBlMjk0NDJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwYzQwNTgxOTI5YTQ1NTc4Zjk5ODg4ZjYxM2FkYjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhZWNkNzU1ZjAzYjRmZTRhZjE5Y2MxMDU2MDE2MzhhID0gJCgnPGRpdiBpZD0iaHRtbF82YWVjZDc1NWYwM2I0ZmU0YWYxOWNjMTA1NjAxNjM4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwYzQwNTgxOTI5YTQ1NTc4Zjk5ODg4ZjYxM2FkYjEyLnNldENvbnRlbnQoaHRtbF82YWVjZDc1NWYwM2I0ZmU0YWYxOWNjMTA1NjAxNjM4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZWNhZWEwMzNjNTE0NDY2OTc0YjZhYTcwZTI5NDQyYS5iaW5kUG9wdXAocG9wdXBfZTBjNDA1ODE5MjlhNDU1NzhmOTk4ODhmNjEzYWRiMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWE2NzY4YjlmNTk4NGM0MmEwZTQyZDQ5ZDFjODg5YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDU3NWFjMjJjODM0NjEwYWRkY2JlOGExMTVjMTVkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZWI4YTY5ZDYxNmY0YTE2YjYyNjFlNWI5OTYzOWNiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmViOGE2OWQ2MTZmNGExNmI2MjYxZTViOTk2MzljYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwNTc1YWMyMmM4MzQ2MTBhZGRjYmU4YTExNWMxNWQ0LnNldENvbnRlbnQoaHRtbF82ZWI4YTY5ZDYxNmY0YTE2YjYyNjFlNWI5OTYzOWNiMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTY3NjhiOWY1OTg0YzQyYTBlNDJkNDlkMWM4ODliNS5iaW5kUG9wdXAocG9wdXBfNzA1NzVhYzIyYzgzNDYxMGFkZGNiZThhMTE1YzE1ZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTY2YjA3N2Q3N2VkNDZhNjljNzFmNTA4YjMyMzEzZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzIyNzEzZjdiOTQ3NGEwM2IzZDQ4YTQ1ZDY2NzU5NmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQ5NWUxYjQzZThhNGQwNmIwYmVkN2M3MzE3Y2NkNjcgPSAkKCc8ZGl2IGlkPSJodG1sX2JkOTVlMWI0M2U4YTRkMDZiMGJlZDdjNzMxN2NjZDY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MjI3MTNmN2I5NDc0YTAzYjNkNDhhNDVkNjY3NTk2ZS5zZXRDb250ZW50KGh0bWxfYmQ5NWUxYjQzZThhNGQwNmIwYmVkN2M3MzE3Y2NkNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTY2YjA3N2Q3N2VkNDZhNjljNzFmNTA4YjMyMzEzZjkuYmluZFBvcHVwKHBvcHVwXzcyMjcxM2Y3Yjk0NzRhMDNiM2Q0OGE0NWQ2Njc1OTZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4ODZlMWJjZjlhOTQ3NzZhN2U1ZTE4NWY5YjQ3MzY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2I2YTdlNDgyZWM2NDVhOGI4YTY5MTYyNmRhZDgwM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjA1NzU4OGQzZTA3NDgxMGEzMTA0MzhmYWMxOGJhMTcgPSAkKCc8ZGl2IGlkPSJodG1sX2IwNTc1ODhkM2UwNzQ4MTBhMzEwNDM4ZmFjMThiYTE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjZhN2U0ODJlYzY0NWE4YjhhNjkxNjI2ZGFkODAzZS5zZXRDb250ZW50KGh0bWxfYjA1NzU4OGQzZTA3NDgxMGEzMTA0MzhmYWMxOGJhMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzg4NmUxYmNmOWE5NDc3NmE3ZTVlMTg1ZjliNDczNjcuYmluZFBvcHVwKHBvcHVwXzdiNmE3ZTQ4MmVjNjQ1YThiOGE2OTE2MjZkYWQ4MDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkMzcyNTFmNmU5ODRkNDQ4YjcyYzljN2JiNDExNzFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGI0YzJmYmNlZDBjNDNlMjgzY2FiMDMwNWNhODUzYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Y0NWQwYzQ0ZDM5NDk4ZThiZTVhZDcyZmM1OWFhNDggPSAkKCc8ZGl2IGlkPSJodG1sXzdmNDVkMGM0NGQzOTQ5OGU4YmU1YWQ3MmZjNTlhYTQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiNGMyZmJjZWQwYzQzZTI4M2NhYjAzMDVjYTg1M2FhLnNldENvbnRlbnQoaHRtbF83ZjQ1ZDBjNDRkMzk0OThlOGJlNWFkNzJmYzU5YWE0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDM3MjUxZjZlOTg0ZDQ0OGI3MmM5YzdiYjQxMTcxZC5iaW5kUG9wdXAocG9wdXBfOGI0YzJmYmNlZDBjNDNlMjgzY2FiMDMwNWNhODUzYWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWU4ZjgwOGU1Y2ExNDk0ODlhYmJmZDY0YzgxYzNkOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U1YTMwNjdhZjIzNDZmN2FmN2YzNWQzNGJkMDJlYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjgxNzMwM2JjODQzNDdhMTljNDIzN2YxZTE0OWEzYWIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4MTczMDNiYzg0MzQ3YTE5YzQyMzdmMWUxNDlhM2FiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlNWEzMDY3YWYyMzQ2ZjdhZjdmMzVkMzRiZDAyZWJjLnNldENvbnRlbnQoaHRtbF9mODE3MzAzYmM4NDM0N2ExOWM0MjM3ZjFlMTQ5YTNhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZThmODA4ZTVjYTE0OTQ4OWFiYmZkNjRjODFjM2Q5Zi5iaW5kUG9wdXAocG9wdXBfM2U1YTMwNjdhZjIzNDZmN2FmN2YzNWQzNGJkMDJlYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU2YzIxNGMzNmEwNDVhMmE4YjYyMDFhMmQ0Y2E4YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQxZmQ2NTFiZmQ2NDUxMjhjYjAxOTI3Y2IyMTk4ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2M5NjhjYjhkM2IyNGRiYzg5ODhkMGJiNTE3YjFlZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzdjOTY4Y2I4ZDNiMjRkYmM4OTg4ZDBiYjUxN2IxZWZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmQxZmQ2NTFiZmQ2NDUxMjhjYjAxOTI3Y2IyMTk4ZWIuc2V0Q29udGVudChodG1sXzdjOTY4Y2I4ZDNiMjRkYmM4OTg4ZDBiYjUxN2IxZWZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllNmMyMTRjMzZhMDQ1YTJhOGI2MjAxYTJkNGNhOGM2LmJpbmRQb3B1cChwb3B1cF8yZDFmZDY1MWJmZDY0NTEyOGNiMDE5MjdjYjIxOThlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTI0MjdiMGFmMzc0ODNhOWY3YzkzOTQ5YTE3OWVhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzMzAyYjNjOGIwMDQ1NGE4ZDJlMjhlY2ZmMWU2NWZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyZmI0NDVkYTI2NDRmZTg4ZjUyZDM0N2RiNWYzYTliID0gJCgnPGRpdiBpZD0iaHRtbF9lMmZiNDQ1ZGEyNjQ0ZmU4OGY1MmQzNDdkYjVmM2E5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzMwMmIzYzhiMDA0NTRhOGQyZTI4ZWNmZjFlNjVmZC5zZXRDb250ZW50KGh0bWxfZTJmYjQ0NWRhMjY0NGZlODhmNTJkMzQ3ZGI1ZjNhOWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTUyNDI3YjBhZjM3NDgzYTlmN2M5Mzk0OWExNzllYTAuYmluZFBvcHVwKHBvcHVwXzgzMzAyYjNjOGIwMDQ1NGE4ZDJlMjhlY2ZmMWU2NWZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2NWU2MzdhMzhiODRkM2I4YTY2NDUyMGNmOWFlODQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE1ZDYwOGY0N2UwNDAyN2E5MWUwZWVhOTMyMjlhMGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNkMmUwZDc4NWVlNGE3MWJkMjcwYzQ1ZTA0OWIyYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzJjZDJlMGQ3ODVlZTRhNzFiZDI3MGM0NWUwNDliMmJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTVkNjA4ZjQ3ZTA0MDI3YTkxZTBlZWE5MzIyOWEwYS5zZXRDb250ZW50KGh0bWxfMmNkMmUwZDc4NWVlNGE3MWJkMjcwYzQ1ZTA0OWIyYmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY1ZTYzN2EzOGI4NGQzYjhhNjY0NTIwY2Y5YWU4NDYuYmluZFBvcHVwKHBvcHVwXzQxNWQ2MDhmNDdlMDQwMjdhOTFlMGVlYTkzMjI5YTBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E4ODI4ZDRiZTI5ODQ0NmQ5NjNhODM0ZGQwNTI0YTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxZTUwZTA2ZGEyMDRlMTZiMmY2Zjk2ZDdiNjY5NjkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxNGViZTNmODA1NTRlYTliZGFkNmFmNzUyN2Q1ZWQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9iMTRlYmUzZjgwNTU0ZWE5YmRhZDZhZjc1MjdkNWVkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxZTUwZTA2ZGEyMDRlMTZiMmY2Zjk2ZDdiNjY5NjkxLnNldENvbnRlbnQoaHRtbF9iMTRlYmUzZjgwNTU0ZWE5YmRhZDZhZjc1MjdkNWVkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hODgyOGQ0YmUyOTg0NDZkOTYzYTgzNGRkMDUyNGE1NS5iaW5kUG9wdXAocG9wdXBfMzFlNTBlMDZkYTIwNGUxNmIyZjZmOTZkN2I2Njk2OTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODA4NGZhZWViN2ZmNDcxZGFiY2MwMWEyM2EzZjAxODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0M2NkNDcwNjU5MzQ4NTU4M2Q0ZTBlZWFkM2UyMjU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExYmE0MmJjMzcxNjQ0ZDdhOWJlMjUwYWMyMzNlMTg4ID0gJCgnPGRpdiBpZD0iaHRtbF8xMWJhNDJiYzM3MTY0NGQ3YTliZTI1MGFjMjMzZTE4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQzY2Q0NzA2NTkzNDg1NTgzZDRlMGVlYWQzZTIyNTUuc2V0Q29udGVudChodG1sXzExYmE0MmJjMzcxNjQ0ZDdhOWJlMjUwYWMyMzNlMTg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwODRmYWVlYjdmZjQ3MWRhYmNjMDFhMjNhM2YwMTgxLmJpbmRQb3B1cChwb3B1cF8xNDNjZDQ3MDY1OTM0ODU1ODNkNGUwZWVhZDNlMjI1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTgxOWNjY2M3YTk0MjUwOWVkNDA3MWNiZTJlOGY3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxY2U3OGE4OWI1ZjRlZjM4ZjVmZjQxMDBiYjEwZDYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5NzcyYzJlODNlNDQ0M2ZiYzQxMjI1MzZjMmVlNWVhID0gJCgnPGRpdiBpZD0iaHRtbF84OTc3MmMyZTgzZTQ0NDNmYmM0MTIyNTM2YzJlZTVlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDFjZTc4YTg5YjVmNGVmMzhmNWZmNDEwMGJiMTBkNjMuc2V0Q29udGVudChodG1sXzg5NzcyYzJlODNlNDQ0M2ZiYzQxMjI1MzZjMmVlNWVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ODE5Y2NjYzdhOTQyNTA5ZWQ0MDcxY2JlMmU4ZjdhLmJpbmRQb3B1cChwb3B1cF8wMWNlNzhhODliNWY0ZWYzOGY1ZmY0MTAwYmIxMGQ2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOWVjMWMwNjZjMzQ0ZDc1OWJmODNkZGRkMTc4YjA5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmUxZGY4OWVlOWI5NDY5MDllMTlkN2U4YWU5ZDBmMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRhZWE0ZTJhZmY3NDI5M2FlYmVhZTNlOWJlODc0NTAgPSAkKCc8ZGl2IGlkPSJodG1sXzI0YWVhNGUyYWZmNzQyOTNhZWJlYWUzZTliZTg3NDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlMWRmODllZTliOTQ2OTA5ZTE5ZDdlOGFlOWQwZjM0LnNldENvbnRlbnQoaHRtbF8yNGFlYTRlMmFmZjc0MjkzYWViZWFlM2U5YmU4NzQ1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOWVjMWMwNjZjMzQ0ZDc1OWJmODNkZGRkMTc4YjA5Yi5iaW5kUG9wdXAocG9wdXBfYmUxZGY4OWVlOWI5NDY5MDllMTlkN2U4YWU5ZDBmMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTY3MWEzOWI4YTUyNGYxMDk4OGQyZGU1MTdiMTQyYjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjlmMmRkNjJlZGI1NDJmYmFlYWIyMDI3ZWMyMzJmYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU1YWQwODllMTYxNDA3MGE1ODgxM2QwMjAwNWE5ZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzk1NWFkMDg5ZTE2MTQwNzBhNTg4MTNkMDIwMDVhOWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWYyZGQ2MmVkYjU0MmZiYWVhYjIwMjdlYzIzMmZiOS5zZXRDb250ZW50KGh0bWxfOTU1YWQwODllMTYxNDA3MGE1ODgxM2QwMjAwNWE5ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTY3MWEzOWI4YTUyNGYxMDk4OGQyZGU1MTdiMTQyYjIuYmluZFBvcHVwKHBvcHVwXzY5ZjJkZDYyZWRiNTQyZmJhZWFiMjAyN2VjMjMyZmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1Y2E2MDE3YzY2YjQ5YTY5ZDM2OWNjMmNmNWVlMjliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjY2M4MzU4NzI4YzQxM2I5YmMyNGVhZGEwMGNmYThhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0N2QyYTEwZDJjOTQ4ZDJhZGExODEyOThlMmIzZjY4ID0gJCgnPGRpdiBpZD0iaHRtbF8xNDdkMmExMGQyYzk0OGQyYWRhMTgxMjk4ZTJiM2Y2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wY2NjODM1ODcyOGM0MTNiOWJjMjRlYWRhMDBjZmE4YS5zZXRDb250ZW50KGh0bWxfMTQ3ZDJhMTBkMmM5NDhkMmFkYTE4MTI5OGUyYjNmNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDVjYTYwMTdjNjZiNDlhNjlkMzY5Y2MyY2Y1ZWUyOWIuYmluZFBvcHVwKHBvcHVwXzBjY2M4MzU4NzI4YzQxM2I5YmMyNGVhZGEwMGNmYThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhMDg5MTI3YzRlMzQ5MGRiYzEzYmRmYTdjMzM5ZmZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkZWM2MjJiYjdmYzRiMGViZDJhYTVkYTFlNjNjY2NmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0MjAzYmI4YzlmNTQzZmY5MjIwYWNjMWRmZWRhMzI2ID0gJCgnPGRpdiBpZD0iaHRtbF84NDIwM2JiOGM5ZjU0M2ZmOTIyMGFjYzFkZmVkYTMyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkZWM2MjJiYjdmYzRiMGViZDJhYTVkYTFlNjNjY2NmLnNldENvbnRlbnQoaHRtbF84NDIwM2JiOGM5ZjU0M2ZmOTIyMGFjYzFkZmVkYTMyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTA4OTEyN2M0ZTM0OTBkYmMxM2JkZmE3YzMzOWZmYS5iaW5kUG9wdXAocG9wdXBfZmRlYzYyMmJiN2ZjNGIwZWJkMmFhNWRhMWU2M2NjY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjgzMzE0MWRhNmI3NGJiZmExYmQ4YzE0Y2JkZGEzYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiZTA0MGRhYjU0MzQ4MDE4MjE0Nzk3MTEyMTE3NGY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwNWFjYzhmZjZlMzRhNWU5ZmU0NjFjMmY3ZThlYzM4ID0gJCgnPGRpdiBpZD0iaHRtbF83MDVhY2M4ZmY2ZTM0YTVlOWZlNDYxYzJmN2U4ZWMzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYmUwNDBkYWI1NDM0ODAxODIxNDc5NzExMjExNzRmNS5zZXRDb250ZW50KGh0bWxfNzA1YWNjOGZmNmUzNGE1ZTlmZTQ2MWMyZjdlOGVjMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjgzMzE0MWRhNmI3NGJiZmExYmQ4YzE0Y2JkZGEzYTkuYmluZFBvcHVwKHBvcHVwX2JiZTA0MGRhYjU0MzQ4MDE4MjE0Nzk3MTEyMTE3NGY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNzRiNmIzZDg3ZDRmMWNhMDQ1Nzg0NjQyZjBhNWNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDcyYjA0ZjIxYTQ3NDIwZWE3MGJlZDFkMjUwMWM5MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmJjMWM1NTg4ZDYyNDg1NWJkY2IyZjk4Zjg5YjkwODMgPSAkKCc8ZGl2IGlkPSJodG1sXzZiYzFjNTU4OGQ2MjQ4NTViZGNiMmY5OGY4OWI5MDgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3MmIwNGYyMWE0NzQyMGVhNzBiZWQxZDI1MDFjOTE2LnNldENvbnRlbnQoaHRtbF82YmMxYzU1ODhkNjI0ODU1YmRjYjJmOThmODliOTA4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjc0YjZiM2Q4N2Q0ZjFjYTA0NTc4NDY0MmYwYTVjYS5iaW5kUG9wdXAocG9wdXBfMDcyYjA0ZjIxYTQ3NDIwZWE3MGJlZDFkMjUwMWM5MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZjMGNjZDQ0MGIzNGMzZGE3NmFiYTViOWJlOTIzNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzgwMmVlOGNiYzI5NDdkNDgyOTA2ODBiM2QxYmQ0ZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNiNjVlNDU5MzQ4NDc3YzlhZWYwMjk5NGI3ZjYwMjEgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjYjY1ZTQ1OTM0ODQ3N2M5YWVmMDI5OTRiN2Y2MDIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODAyZWU4Y2JjMjk0N2Q0ODI5MDY4MGIzZDFiZDRkMS5zZXRDb250ZW50KGh0bWxfZmNiNjVlNDU5MzQ4NDc3YzlhZWYwMjk5NGI3ZjYwMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZjMGNjZDQ0MGIzNGMzZGE3NmFiYTViOWJlOTIzNDguYmluZFBvcHVwKHBvcHVwX2M4MDJlZThjYmMyOTQ3ZDQ4MjkwNjgwYjNkMWJkNGQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1ODgzMzg5OGM2MjQ5YTQ4MWQ5NDM2MTQ0YTJlZGY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1NjU4OWFhYTQ0NDQzY2Q4ODA2NTc0ZTI2M2M3OThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyODkzYWRmZjViOTQ4ZjZiYjI2OWVjYjM4Mzk5MzY2ID0gJCgnPGRpdiBpZD0iaHRtbF81Mjg5M2FkZmY1Yjk0OGY2YmIyNjllY2IzODM5OTM2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NjU4OWFhYTQ0NDQzY2Q4ODA2NTc0ZTI2M2M3OThmLnNldENvbnRlbnQoaHRtbF81Mjg5M2FkZmY1Yjk0OGY2YmIyNjllY2IzODM5OTM2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NTg4MzM4OThjNjI0OWE0ODFkOTQzNjE0NGEyZWRmNy5iaW5kUG9wdXAocG9wdXBfMTU2NTg5YWFhNDQ0NDNjZDg4MDY1NzRlMjYzYzc5OGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGIxMDM5ZTZjZjc5NDllNzhjYzllYzhmZTFjNjgwNzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzJlYzc5NWU2MDc4NDM5OWJlMzdlOWQ5ZDM3NGNmZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzc1NzM2Y2Y2NjNiNDIyZTg0NmQwYjBiNTYwYjAxNjggPSAkKCc8ZGl2IGlkPSJodG1sXzM3NTczNmNmNjYzYjQyMmU4NDZkMGIwYjU2MGIwMTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyZWM3OTVlNjA3ODQzOTliZTM3ZTlkOWQzNzRjZmZmLnNldENvbnRlbnQoaHRtbF8zNzU3MzZjZjY2M2I0MjJlODQ2ZDBiMGI1NjBiMDE2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjEwMzllNmNmNzk0OWU3OGNjOWVjOGZlMWM2ODA3MC5iaW5kUG9wdXAocG9wdXBfYzJlYzc5NWU2MDc4NDM5OWJlMzdlOWQ5ZDM3NGNmZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTk4MWYwYjMwYWExNDg4MDhhNDBiNGU3ZjI0YzQ2MjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDZmMjMzNGI3ZGQyNGVkOWE5NjYzN2VjOTNmMDIzYjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU3Y2E5OTVkODZlNDQ4ZThkMmJlY2Y4ODJiNzY5NDQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1N2NhOTk1ZDg2ZTQ0OGU4ZDJiZWNmODgyYjc2OTQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDZmMjMzNGI3ZGQyNGVkOWE5NjYzN2VjOTNmMDIzYjMuc2V0Q29udGVudChodG1sX2Q1N2NhOTk1ZDg2ZTQ0OGU4ZDJiZWNmODgyYjc2OTQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5ODFmMGIzMGFhMTQ4ODA4YTQwYjRlN2YyNGM0NjI2LmJpbmRQb3B1cChwb3B1cF80NmYyMzM0YjdkZDI0ZWQ5YTk2NjM3ZWM5M2YwMjNiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNWY1Yjc0YWNmNjM0ZDNjYjlhOGZkODViZDZhNDc2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTc4Y2E0OGQxZTU0NjQ1ODkzYTVkZGU1NjdkYjVhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNGVkZTA3ZDBmN2I0MDQwYTkxN2M4MjdhNDcwYTFkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjRlZGUwN2QwZjdiNDA0MGE5MTdjODI3YTQ3MGExZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E3OGNhNDhkMWU1NDY0NTg5M2E1ZGRlNTY3ZGI1YWQuc2V0Q29udGVudChodG1sXzI0ZWRlMDdkMGY3YjQwNDBhOTE3YzgyN2E0NzBhMWRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E1ZjViNzRhY2Y2MzRkM2NiOWE4ZmQ4NWJkNmE0NzZiLmJpbmRQb3B1cChwb3B1cF8zYTc4Y2E0OGQxZTU0NjQ1ODkzYTVkZGU1NjdkYjVhZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZGZlZDA2MjVjNzg0NDgwOGY1N2Q1MGJlMWVjNzEyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3N2M0ZDNmOGFhNDQxZGZhMzczZGNjYzE1NTQ2ZjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2OGY0YmEwNmVmMDRiZTNiNTE1ZjkyNmJmZTU3YmIyID0gJCgnPGRpdiBpZD0iaHRtbF8zNjhmNGJhMDZlZjA0YmUzYjUxNWY5MjZiZmU1N2JiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3N2M0ZDNmOGFhNDQxZGZhMzczZGNjYzE1NTQ2ZjNlLnNldENvbnRlbnQoaHRtbF8zNjhmNGJhMDZlZjA0YmUzYjUxNWY5MjZiZmU1N2JiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZGZlZDA2MjVjNzg0NDgwOGY1N2Q1MGJlMWVjNzEyMi5iaW5kUG9wdXAocG9wdXBfMjc3YzRkM2Y4YWE0NDFkZmEzNzNkY2NjMTU1NDZmM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNlYTZlZDk1OTI2NGNhZDgwYjMyNmE2M2M0NWY5YjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODYyZjYzZTVjODI2NDY4N2JjNmVlOWJmZDlhYTNlZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmEyMjhkMjliM2QzNDI0YTk4OTg0MzAyNWRjOGRhMTAgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhMjI4ZDI5YjNkMzQyNGE5ODk4NDMwMjVkYzhkYTEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2MmY2M2U1YzgyNjQ2ODdiYzZlZTliZmQ5YWEzZWQ4LnNldENvbnRlbnQoaHRtbF9mYTIyOGQyOWIzZDM0MjRhOTg5ODQzMDI1ZGM4ZGExMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hY2VhNmVkOTU5MjY0Y2FkODBiMzI2YTYzYzQ1ZjliMC5iaW5kUG9wdXAocG9wdXBfODYyZjYzZTVjODI2NDY4N2JjNmVlOWJmZDlhYTNlZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzZhMTIxMGQ2YjM3NDdkMzgyODhkMDFiODUwZTJiZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5NWI2OTg1ZjIyMzQzZjA5NGI1NjM1N2UzNDhlZmU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3OGNmZmJjMjY0ZTQzZTFiYjcyYzEzNTJmNWYzYmQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8wNzhjZmZiYzI2NGU0M2UxYmI3MmMxMzUyZjVmM2JkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOTViNjk4NWYyMjM0M2YwOTRiNTYzNTdlMzQ4ZWZlNC5zZXRDb250ZW50KGh0bWxfMDc4Y2ZmYmMyNjRlNDNlMWJiNzJjMTM1MmY1ZjNiZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzZhMTIxMGQ2YjM3NDdkMzgyODhkMDFiODUwZTJiZmEuYmluZFBvcHVwKHBvcHVwX2Q5NWI2OTg1ZjIyMzQzZjA5NGI1NjM1N2UzNDhlZmU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhZGE2MDA0N2Y0ODQzOTNiN2QzMzg4MzM2Mjg4ZWFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViOWY0YWZhYzVkNzQ4ZDFiMTk5NDc5Y2I5ZjcyMDE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwMWI1YThmNGZkZTRjZTNhOWFjOGViNmM3MDBlZDU5ID0gJCgnPGRpdiBpZD0iaHRtbF9lMDFiNWE4ZjRmZGU0Y2UzYTlhYzhlYjZjNzAwZWQ1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViOWY0YWZhYzVkNzQ4ZDFiMTk5NDc5Y2I5ZjcyMDE4LnNldENvbnRlbnQoaHRtbF9lMDFiNWE4ZjRmZGU0Y2UzYTlhYzhlYjZjNzAwZWQ1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YWRhNjAwNDdmNDg0MzkzYjdkMzM4ODMzNjI4OGVhYS5iaW5kUG9wdXAocG9wdXBfZWI5ZjRhZmFjNWQ3NDhkMWIxOTk0NzljYjlmNzIwMTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU2YjI2YjlkM2JmNDA1MzllNzU0NzhjNzhhNjQ3ZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhhN2QxNzUxZGE2NDE0OGI0NmI4YjVmYWIzMzg5M2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWUwN2VhN2Y0ZDBhNGMwMzhkNGFlYmZmODNjYjk0YTEgPSAkKCc8ZGl2IGlkPSJodG1sX2FlMDdlYTdmNGQwYTRjMDM4ZDRhZWJmZjgzY2I5NGExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjhhN2QxNzUxZGE2NDE0OGI0NmI4YjVmYWIzMzg5M2Iuc2V0Q29udGVudChodG1sX2FlMDdlYTdmNGQwYTRjMDM4ZDRhZWJmZjgzY2I5NGExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlNmIyNmI5ZDNiZjQwNTM5ZTc1NDc4Yzc4YTY0N2U2LmJpbmRQb3B1cChwb3B1cF82OGE3ZDE3NTFkYTY0MTQ4YjQ2YjhiNWZhYjMzODkzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZmYxMzhkYmFhOGE0OWEzOWQ0NWVlZjYzZWViOTBjNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTYwNDRiN2NkYTM0OWUwYWE3ZTgyMTExNzAxOTk2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYmJiODBkMWVmMDU0YjIxOTEyMmFjNDhlODkzYTk1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWJiYjgwZDFlZjA1NGIyMTkxMjJhYzQ4ZTg5M2E5NWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTYwNDRiN2NkYTM0OWUwYWE3ZTgyMTExNzAxOTk2Mi5zZXRDb250ZW50KGh0bWxfMWJiYjgwZDFlZjA1NGIyMTkxMjJhYzQ4ZTg5M2E5NWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZmMTM4ZGJhYThhNDlhMzlkNDVlZWY2M2VlYjkwYzUuYmluZFBvcHVwKHBvcHVwXzYxNjA0NGI3Y2RhMzQ5ZTBhYTdlODIxMTE3MDE5OTYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5ZGUxZWRjZTdlOTRiYzZiYmY4MmE3YWI2ZmExYWQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDhhYzVhOTk0ZTU0YTM0YjMwNmU1ODBkZDYxZGI3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNGYwZDBkOTk0Zjc0NTk1OTY0ZjQyYjI2Yzc2YjAxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTRmMGQwZDk5NGY3NDU5NTk2NGY0MmIyNmM3NmIwMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDA4YWM1YTk5NGU1NGEzNGIzMDZlNTgwZGQ2MWRiN2Muc2V0Q29udGVudChodG1sXzE0ZjBkMGQ5OTRmNzQ1OTU5NjRmNDJiMjZjNzZiMDE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5ZGUxZWRjZTdlOTRiYzZiYmY4MmE3YWI2ZmExYWQ2LmJpbmRQb3B1cChwb3B1cF80MDhhYzVhOTk0ZTU0YTM0YjMwNmU1ODBkZDYxZGI3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTI4MzdjOGQwNDY0Zjk2OGM4ZGQ4YTEyYTc2NjM0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MjFiZGYyM2M4NjI0OWY0ODA0MzEzNDBhY2YzN2FkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZjNmNWQ4MTQ3MWQ0ZGJjYTVhZjQyNGY0NzNlY2U3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2YzZjVkODE0NzFkNGRiY2E1YWY0MjRmNDczZWNlNzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzIxYmRmMjNjODYyNDlmNDgwNDMxMzQwYWNmMzdhZGQuc2V0Q29udGVudChodG1sXzNmM2Y1ZDgxNDcxZDRkYmNhNWFmNDI0ZjQ3M2VjZTcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UxMjgzN2M4ZDA0NjRmOTY4YzhkZDhhMTJhNzY2MzQ1LmJpbmRQb3B1cChwb3B1cF83MjFiZGYyM2M4NjI0OWY0ODA0MzEzNDBhY2YzN2FkZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDMxNTVkNDUyYzQ0YTM5OWVjZDFiYjM3NDVhODUzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmVlMzM4OWY5YTQ2NDcwYzgwMTY1YzU0ODViMzE5ZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQ0MThhMTQ0NGRiNDYxMWI1ZDY2MDczNDk2NjQ4OTEgPSAkKCc8ZGl2IGlkPSJodG1sXzI0NDE4YTE0NDRkYjQ2MTFiNWQ2NjA3MzQ5NjY0ODkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlZTMzODlmOWE0NjQ3MGM4MDE2NWM1NDg1YjMxOWVlLnNldENvbnRlbnQoaHRtbF8yNDQxOGExNDQ0ZGI0NjExYjVkNjYwNzM0OTY2NDg5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NDMxNTVkNDUyYzQ0YTM5OWVjZDFiYjM3NDVhODUzOC5iaW5kUG9wdXAocG9wdXBfNmVlMzM4OWY5YTQ2NDcwYzgwMTY1YzU0ODViMzE5ZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDllMmUyOWZjNTE1NDRhZGI3NDVkNWRiYzNiNjY0ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM0M2UwMzRhNTllNDBhY2EwYmM0MjBlNzcxZTYwM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JkNTJjODM2NjE0NDUwOGIzZjZjOGU1M2UxNDJhMTUgPSAkKCc8ZGl2IGlkPSJodG1sX2NiZDUyYzgzNjYxNDQ1MDhiM2Y2YzhlNTNlMTQyYTE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM0M2UwMzRhNTllNDBhY2EwYmM0MjBlNzcxZTYwM2Euc2V0Q29udGVudChodG1sX2NiZDUyYzgzNjYxNDQ1MDhiM2Y2YzhlNTNlMTQyYTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ZTJlMjlmYzUxNTQ0YWRiNzQ1ZDVkYmMzYjY2NGZiLmJpbmRQb3B1cChwb3B1cF8xMzQzZTAzNGE1OWU0MGFjYTBiYzQyMGU3NzFlNjAzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODk2YzZhNTQxOTU0ODUwYmMzMDRiODA4NTI5YjUzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTYxNGY1ZWFlNmQ0MTNhOTU2NTNiOWIwZjM4NzAxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDJlNmE5YjE4MGI0MDNiYjcyOGM0NTdkOGRmNGM3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTAyZTZhOWIxODBiNDAzYmI3MjhjNDU3ZDhkZjRjN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlNjE0ZjVlYWU2ZDQxM2E5NTY1M2I5YjBmMzg3MDFhLnNldENvbnRlbnQoaHRtbF85MDJlNmE5YjE4MGI0MDNiYjcyOGM0NTdkOGRmNGM3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODk2YzZhNTQxOTU0ODUwYmMzMDRiODA4NTI5YjUzYy5iaW5kUG9wdXAocG9wdXBfNmU2MTRmNWVhZTZkNDEzYTk1NjUzYjliMGYzODcwMWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDYzYTQ1ZTBhMzBkNDdhNmEwMDcxNmQyYTFmYWM2YTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTYwY2EwNGM4ZmI0NGUxOTg3YTZjODdjYzM1ZmIyMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGFkOWRmNTIwZDkwNDRmYTk5MjY1MzhlZDJhZTJjMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzRhZDlkZjUyMGQ5MDQ0ZmE5OTI2NTM4ZWQyYWUyYzM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjBjYTA0YzhmYjQ0ZTE5ODdhNmM4N2NjMzVmYjIxMC5zZXRDb250ZW50KGh0bWxfNGFkOWRmNTIwZDkwNDRmYTk5MjY1MzhlZDJhZTJjMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDYzYTQ1ZTBhMzBkNDdhNmEwMDcxNmQyYTFmYWM2YTEuYmluZFBvcHVwKHBvcHVwX2E2MGNhMDRjOGZiNDRlMTk4N2E2Yzg3Y2MzNWZiMjEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjYmJhYmU2MDE2NDQyODE5NDNiMTk2MGE4ZWZjMDUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiMDA5YTIxZjBjOTQ4NDc5MmY5MDRlNDRkZDY4YTg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2OWY4YWYyNDczMDRlNDViMDc1NjExODU0YzU1MDUxID0gJCgnPGRpdiBpZD0iaHRtbF9iNjlmOGFmMjQ3MzA0ZTQ1YjA3NTYxMTg1NGM1NTA1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjAwOWEyMWYwYzk0ODQ3OTJmOTA0ZTQ0ZGQ2OGE4NS5zZXRDb250ZW50KGh0bWxfYjY5ZjhhZjI0NzMwNGU0NWIwNzU2MTE4NTRjNTUwNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NiYmFiZTYwMTY0NDI4MTk0M2IxOTYwYThlZmMwNTIuYmluZFBvcHVwKHBvcHVwXzdiMDA5YTIxZjBjOTQ4NDc5MmY5MDRlNDRkZDY4YTg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyYWMxYjgyMTk0MTRiNTRiYTIzMjAwYzI4NjExNWJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0MWMzZDJhMmVmOTQzNGZhNTNjZmE5Yjg3YzAwY2UyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1NGY5NWJjM2JhMzRiNjJhMTdhNGM2ZTc0MzUwMzg0ID0gJCgnPGRpdiBpZD0iaHRtbF84NTRmOTViYzNiYTM0YjYyYTE3YTRjNmU3NDM1MDM4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQxYzNkMmEyZWY5NDM0ZmE1M2NmYTliODdjMDBjZTIuc2V0Q29udGVudChodG1sXzg1NGY5NWJjM2JhMzRiNjJhMTdhNGM2ZTc0MzUwMzg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyYWMxYjgyMTk0MTRiNTRiYTIzMjAwYzI4NjExNWJiLmJpbmRQb3B1cChwb3B1cF84NDFjM2QyYTJlZjk0MzRmYTUzY2ZhOWI4N2MwMGNlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YWRiMDc0OGY5ODk0YmEzYjU3MTdlNTY3NWExOTA3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNGIyNGM1NzliNjY0ZTQ5ODAwYjAxZDI1ZTEzOWYzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWRmYzI1MDE2OWE0ODBmODRiYWVjZmI0MzVhNjQ3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FkZmMyNTAxNjlhNDgwZjg0YmFlY2ZiNDM1YTY0NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0YjI0YzU3OWI2NjRlNDk4MDBiMDFkMjVlMTM5ZjM2LnNldENvbnRlbnQoaHRtbF8zYWRmYzI1MDE2OWE0ODBmODRiYWVjZmI0MzVhNjQ3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YWRiMDc0OGY5ODk0YmEzYjU3MTdlNTY3NWExOTA3ZS5iaW5kUG9wdXAocG9wdXBfMDRiMjRjNTc5YjY2NGU0OTgwMGIwMWQyNWUxMzlmMzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTNkYzI5MGVhNWQ5NGNhOGE0M2UyMzQxMzY0YzhkNWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDUzN2ViMzcxOTk0NDM4OGIyNDVhZWMzMGM3OGFkNWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDFlZjZiNWZjMWI1NDM3NDhmZTljMWQzNzJkZDQ4MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzAxZWY2YjVmYzFiNTQzNzQ4ZmU5YzFkMzcyZGQ0ODExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDUzN2ViMzcxOTk0NDM4OGIyNDVhZWMzMGM3OGFkNWYuc2V0Q29udGVudChodG1sXzAxZWY2YjVmYzFiNTQzNzQ4ZmU5YzFkMzcyZGQ0ODExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzZGMyOTBlYTVkOTRjYThhNDNlMjM0MTM2NGM4ZDVkLmJpbmRQb3B1cChwb3B1cF9kNTM3ZWIzNzE5OTQ0Mzg4YjI0NWFlYzMwYzc4YWQ1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2JkM2Y3MzMyODk0ZmYyYTQzOTc5ODFhMGUwNTg5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzBlZWQ4ZTQwM2I0Zjc0ODI1ZDZjMGE4MjY5Y2FjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMWRmNWJlNTM5YzM0Zjc3OWZmY2E1M2RhNDk4OTQ4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzFkZjViZTUzOWMzNGY3NzlmZmNhNTNkYTQ5ODk0ODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTMwZWVkOGU0MDNiNGY3NDgyNWQ2YzBhODI2OWNhY2Muc2V0Q29udGVudChodG1sXzMxZGY1YmU1MzljMzRmNzc5ZmZjYTUzZGE0OTg5NDg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjYmQzZjczMzI4OTRmZjJhNDM5Nzk4MWEwZTA1ODk1LmJpbmRQb3B1cChwb3B1cF85MzBlZWQ4ZTQwM2I0Zjc0ODI1ZDZjMGE4MjY5Y2FjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmFiNmZiMThhNzc0ODcxODNmOGQyNDEzMDg5YWVmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyZmU0ZDNlMzI5MDRiNjFhNzBjYzRjNmM4N2M3NmRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyYTA2N2FkODliYTRjYmJhNzYxYzZiYmFlMWNkOTlmID0gJCgnPGRpdiBpZD0iaHRtbF84MmEwNjdhZDg5YmE0Y2JiYTc2MWM2YmJhZTFjZDk5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MmZlNGQzZTMyOTA0YjYxYTcwY2M0YzZjODdjNzZkZi5zZXRDb250ZW50KGh0bWxfODJhMDY3YWQ4OWJhNGNiYmE3NjFjNmJiYWUxY2Q5OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmZhYjZmYjE4YTc3NDg3MTgzZjhkMjQxMzA4OWFlZjIuYmluZFBvcHVwKHBvcHVwXzUyZmU0ZDNlMzI5MDRiNjFhNzBjYzRjNmM4N2M3NmRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwOTc1M2Y0Zjc2MDQwNjg4MTk3ODIxNGJlYjUzZmFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2NTg5YjE4OGZmZTQyYjM5OWMwMzM1MWRmOTQ5MjZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NWYwMWUxYTU1OTRmNmRhMGNjMmIxYmZkMmJlMWU0ID0gJCgnPGRpdiBpZD0iaHRtbF80NjVmMDFlMWE1NTk0ZjZkYTBjYzJiMWJmZDJiZTFlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY1ODliMTg4ZmZlNDJiMzk5YzAzMzUxZGY5NDkyNmEuc2V0Q29udGVudChodG1sXzQ2NWYwMWUxYTU1OTRmNmRhMGNjMmIxYmZkMmJlMWU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwOTc1M2Y0Zjc2MDQwNjg4MTk3ODIxNGJlYjUzZmFiLmJpbmRQb3B1cChwb3B1cF8wNjU4OWIxODhmZmU0MmIzOTljMDMzNTFkZjk0OTI2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNDQ2ZWY4NjU3NzE0MzBlYTZhNmFmOTA4ZTA3OWFjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTk0M2ZhMzg4OTk0Mjg1YjFjMzY0ODRiNDZmOGJlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZGFmY2ZjYzY2ZDk0N2QzYTFhNjE5YWNlNjQyYzRjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2RhZmNmY2M2NmQ5NDdkM2ExYTYxOWFjZTY0MmM0Y2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YTk0M2ZhMzg4OTk0Mjg1YjFjMzY0ODRiNDZmOGJlYy5zZXRDb250ZW50KGh0bWxfY2RhZmNmY2M2NmQ5NDdkM2ExYTYxOWFjZTY0MmM0Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQ0NmVmODY1NzcxNDMwZWE2YTZhZjkwOGUwNzlhY2MuYmluZFBvcHVwKHBvcHVwXzZhOTQzZmEzODg5OTQyODViMWMzNjQ4NGI0NmY4YmVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjZTZmMDM3YWUyNzRlNTZhMDhhNjEzZTllNDRkOWZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzUyNDNmNzQ0ZWI0NjNjOTRmMzc0MTYzNGFiYjUwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNzQ0ZjM0YzRiNjE0ZDQzYWI4ZWU0ZTFhYWFmZWM5NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDc0NGYzNGM0YjYxNGQ0M2FiOGVlNGUxYWFhZmVjOTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM1MjQzZjc0NGViNDYzYzk0ZjM3NDE2MzRhYmI1MDkuc2V0Q29udGVudChodG1sXzA3NDRmMzRjNGI2MTRkNDNhYjhlZTRlMWFhYWZlYzk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VjZTZmMDM3YWUyNzRlNTZhMDhhNjEzZTllNDRkOWZkLmJpbmRQb3B1cChwb3B1cF8wMzUyNDNmNzQ0ZWI0NjNjOTRmMzc0MTYzNGFiYjUwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NzQ2ZjAwZmUxYjE0ZmZkYjE1MjcxNjhjYmEwNGMzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVhYzY2MzdiNzc0NDE1YWI3OWM5OGQ2MTJmYjZiNzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDViZTJmNjI0ZjhiNGNhMjhjY2MxYmY3Mjk3N2Y3YzUgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1YmUyZjYyNGY4YjRjYTI4Y2NjMWJmNzI5NzdmN2M1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzVhYzY2MzdiNzc0NDE1YWI3OWM5OGQ2MTJmYjZiNzkuc2V0Q29udGVudChodG1sX2Q1YmUyZjYyNGY4YjRjYTI4Y2NjMWJmNzI5NzdmN2M1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3NDZmMDBmZTFiMTRmZmRiMTUyNzE2OGNiYTA0YzNhLmJpbmRQb3B1cChwb3B1cF8zNWFjNjYzN2I3NzQ0MTVhYjc5Yzk4ZDYxMmZiNmI3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iN2Q3Y2RlNDZhZGY0ZGFmYTA0ZDUwODY1MDM0MjE3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODg3NGUyNjk4YWY0NmY0YmE5NmI0YzQ0YTgyZGEyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNmRhZmZmYmNkMGQ0NWE4YTRkNTFmODkwMjRkYjNhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTZkYWZmZmJjZDBkNDVhOGE0ZDUxZjg5MDI0ZGIzYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzg4NzRlMjY5OGFmNDZmNGJhOTZiNGM0NGE4MmRhMjIuc2V0Q29udGVudChodG1sX2U2ZGFmZmZiY2QwZDQ1YThhNGQ1MWY4OTAyNGRiM2E1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I3ZDdjZGU0NmFkZjRkYWZhMDRkNTA4NjUwMzQyMTcwLmJpbmRQb3B1cChwb3B1cF83ODg3NGUyNjk4YWY0NmY0YmE5NmI0YzQ0YTgyZGEyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YTY5ZTA5YTZkZjY0MGVlYWFlZmNkMzExMjRmNmE3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2JkZGE2MmUzYWVkNGIwOGI0NTgxZDNkYzQwMWMzZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjIzNTA0NTMzNTk5NGNiNzg1YzBiYzRhNTRiZTFhNzQgPSAkKCc8ZGl2IGlkPSJodG1sXzYyMzUwNDUzMzU5OTRjYjc4NWMwYmM0YTU0YmUxYTc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYmRkYTYyZTNhZWQ0YjA4YjQ1ODFkM2RjNDAxYzNkMi5zZXRDb250ZW50KGh0bWxfNjIzNTA0NTMzNTk5NGNiNzg1YzBiYzRhNTRiZTFhNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2E2OWUwOWE2ZGY2NDBlZWFhZWZjZDMxMTI0ZjZhN2MuYmluZFBvcHVwKHBvcHVwXzNiZGRhNjJlM2FlZDRiMDhiNDU4MWQzZGM0MDFjM2QyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhODgyZTMzNWY2NTQ3MDliZDc0YmZlYjkzNjM1N2RiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzE3YWFkMDA2M2M0MDIyOWJmZjZkNzdlZDFmMWE1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOGU2ZWNmNDRkNzA0YTZjOGFlNThiY2FlNWFiZDY2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMThlNmVjZjQ0ZDcwNGE2YzhhZTU4YmNhZTVhYmQ2NjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3MTdhYWQwMDYzYzQwMjI5YmZmNmQ3N2VkMWYxYTU4LnNldENvbnRlbnQoaHRtbF8xOGU2ZWNmNDRkNzA0YTZjOGFlNThiY2FlNWFiZDY2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YTg4MmUzMzVmNjU0NzA5YmQ3NGJmZWI5MzYzNTdkYi5iaW5kUG9wdXAocG9wdXBfZjcxN2FhZDAwNjNjNDAyMjliZmY2ZDc3ZWQxZjFhNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTVmZDI5ODY2YmVkNDk5Yjg2Mzg0ZmY4ZDhhNWNmNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDliNDNiYTJmMGU5NDVmYjgyYTc5ZTc2ZDhjODc1OGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDlkY2Q3ZGI1NzIyNGE1YTliM2RjMDUwNzI3NzYwMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2Q5ZGNkN2RiNTcyMjRhNWE5YjNkYzA1MDcyNzc2MDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWI0M2JhMmYwZTk0NWZiODJhNzllNzZkOGM4NzU4Yi5zZXRDb250ZW50KGh0bWxfZDlkY2Q3ZGI1NzIyNGE1YTliM2RjMDUwNzI3NzYwMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTVmZDI5ODY2YmVkNDk5Yjg2Mzg0ZmY4ZDhhNWNmNzcuYmluZFBvcHVwKHBvcHVwXzQ5YjQzYmEyZjBlOTQ1ZmI4MmE3OWU3NmQ4Yzg3NThiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4YTg5YTMyYTdkOTQ1ZGNhYzRhN2MyNzA5NGVhMzY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4OTBkMTJmOTgyZTQ2MDE4ZDUzOTYwOTM5ZWJhZDExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMjhmMWE4NDIwMDQ0NDc4NGI5OTc4ZGEzOGVmZDU3ID0gJCgnPGRpdiBpZD0iaHRtbF8zYTI4ZjFhODQyMDA0NDQ3ODRiOTk3OGRhMzhlZmQ1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODkwZDEyZjk4MmU0NjAxOGQ1Mzk2MDkzOWViYWQxMS5zZXRDb250ZW50KGh0bWxfM2EyOGYxYTg0MjAwNDQ0Nzg0Yjk5NzhkYTM4ZWZkNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhhODlhMzJhN2Q5NDVkY2FjNGE3YzI3MDk0ZWEzNjUuYmluZFBvcHVwKHBvcHVwX2U4OTBkMTJmOTgyZTQ2MDE4ZDUzOTYwOTM5ZWJhZDExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlOTdkOWZlNGExNjRiODU4M2EyZjg3NDg2YTQwMTViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExYTRiNDllMTM0NzQ3ZGE4MzRmNjAzMDdjYTE2ODI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0YTdlZjk2YjAzNTQ3Yjc4NWNhNTgyMjMxNmZmNTY4ID0gJCgnPGRpdiBpZD0iaHRtbF9kNGE3ZWY5NmIwMzU0N2I3ODVjYTU4MjIzMTZmZjU2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMWE0YjQ5ZTEzNDc0N2RhODM0ZjYwMzA3Y2ExNjgyNi5zZXRDb250ZW50KGh0bWxfZDRhN2VmOTZiMDM1NDdiNzg1Y2E1ODIyMzE2ZmY1NjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWU5N2Q5ZmU0YTE2NGI4NTgzYTJmODc0ODZhNDAxNWIuYmluZFBvcHVwKHBvcHVwX2ExYTRiNDllMTM0NzQ3ZGE4MzRmNjAzMDdjYTE2ODI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyM2YwYmI3YTc4YzQzMTA5YTMyY2I0MDIzYWU4NjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhN2JhYTc0MjcyYTQyOWY4MTNiYTEyYjRmZDk2NDFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlZmQ1ZTllYjA1OTQxZDBiYmQ3YzU2M2FhMjZkNTc4ID0gJCgnPGRpdiBpZD0iaHRtbF80ZWZkNWU5ZWIwNTk0MWQwYmJkN2M1NjNhYTI2ZDU3OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE3YmFhNzQyNzJhNDI5ZjgxM2JhMTJiNGZkOTY0MWYuc2V0Q29udGVudChodG1sXzRlZmQ1ZTllYjA1OTQxZDBiYmQ3YzU2M2FhMjZkNTc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyM2YwYmI3YTc4YzQzMTA5YTMyY2I0MDIzYWU4NjAwLmJpbmRQb3B1cChwb3B1cF9kYTdiYWE3NDI3MmE0MjlmODEzYmExMmI0ZmQ5NjQxZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWE3NDU5ODhhZTk0MDAxYTJhNzI3MDk2MGY2MjMzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zY2I5NmUzMTFiYjE0ODVhOTE5NTkyZTJkNTlkODRjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NjRlZGEzMjAzNDk0YTg5OTdiMDYyOTMxNDE0MGNhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY0ZWRhMzIwMzQ5NGE4OTk3YjA2MjkzMTQxNDBjYTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zY2I5NmUzMTFiYjE0ODVhOTE5NTkyZTJkNTlkODRjMi5zZXRDb250ZW50KGh0bWxfNzY0ZWRhMzIwMzQ5NGE4OTk3YjA2MjkzMTQxNDBjYTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTVhNzQ1OTg4YWU5NDAwMWEyYTcyNzA5NjBmNjIzMzMuYmluZFBvcHVwKHBvcHVwXzNjYjk2ZTMxMWJiMTQ4NWE5MTk1OTJlMmQ1OWQ4NGMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmNjBlNzVhYzkyMzQzY2E4MzlmZjAxNDMxMDgyODJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1MTliN2UxNzA3ODRkNmRiNWFiMjA0ZGMyYWIzZmQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyODc0NDRjYmM4ZTQ5Y2ViMDNkYTM4M2Y4NjhjY2Y3ID0gJCgnPGRpdiBpZD0iaHRtbF9iMjg3NDQ0Y2JjOGU0OWNlYjAzZGEzODNmODY4Y2NmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1MTliN2UxNzA3ODRkNmRiNWFiMjA0ZGMyYWIzZmQyLnNldENvbnRlbnQoaHRtbF9iMjg3NDQ0Y2JjOGU0OWNlYjAzZGEzODNmODY4Y2NmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZjYwZTc1YWM5MjM0M2NhODM5ZmYwMTQzMTA4MjgyYS5iaW5kUG9wdXAocG9wdXBfMzUxOWI3ZTE3MDc4NGQ2ZGI1YWIyMDRkYzJhYjNmZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmU0MjI1M2YzNWY4NGUxOTk5MGFmZjYyMDI2OWZmYjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQxNDk1YWIyNjY5NDkyNTlhNGI2MGJiNTQxYjZmOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWI4ZGFiYTdjNGU3NGE4NDk1M2YxODgzZmU0MDZhZjAgPSAkKCc8ZGl2IGlkPSJodG1sX2FiOGRhYmE3YzRlNzRhODQ5NTNmMTg4M2ZlNDA2YWYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDE0OTVhYjI2Njk0OTI1OWE0YjYwYmI1NDFiNmY4YS5zZXRDb250ZW50KGh0bWxfYWI4ZGFiYTdjNGU3NGE4NDk1M2YxODgzZmU0MDZhZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmU0MjI1M2YzNWY4NGUxOTk5MGFmZjYyMDI2OWZmYjIuYmluZFBvcHVwKHBvcHVwX2Q0MTQ5NWFiMjY2OTQ5MjU5YTRiNjBiYjU0MWI2ZjhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E4YWI0MzdjNmM2OTRjZjE5N2JkZjQ3OTE5NGRhM2I4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1ZmNhM2MzYThhZDQ3MmU4MGQzZTA1YTVmMWUxZmMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiNGJjYWZmMDBhOTRlNGI5MGY3OWMzOGMzNDA0OGFiID0gJCgnPGRpdiBpZD0iaHRtbF8yYjRiY2FmZjAwYTk0ZTRiOTBmNzljMzhjMzQwNDhhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWZjYTNjM2E4YWQ0NzJlODBkM2UwNWE1ZjFlMWZjMS5zZXRDb250ZW50KGh0bWxfMmI0YmNhZmYwMGE5NGU0YjkwZjc5YzM4YzM0MDQ4YWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYThhYjQzN2M2YzY5NGNmMTk3YmRmNDc5MTk0ZGEzYjguYmluZFBvcHVwKHBvcHVwXzk1ZmNhM2MzYThhZDQ3MmU4MGQzZTA1YTVmMWUxZmMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwMDI3MTY3NmNlODQ1NjRhOGM1MzVhNmNhMzQ4MzM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmY4NTcyYzczMDY5NDIyNjg0ZmFhNzUzOGIzNTgwYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTdiZmE5ZjZiYzM2NDBmZGI0NjY2ZTYxNjMwZTc0MzggPSAkKCc8ZGl2IGlkPSJodG1sXzk3YmZhOWY2YmMzNjQwZmRiNDY2NmU2MTYzMGU3NDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmY4NTcyYzczMDY5NDIyNjg0ZmFhNzUzOGIzNTgwYWMuc2V0Q29udGVudChodG1sXzk3YmZhOWY2YmMzNjQwZmRiNDY2NmU2MTYzMGU3NDM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwMDI3MTY3NmNlODQ1NjRhOGM1MzVhNmNhMzQ4MzM2LmJpbmRQb3B1cChwb3B1cF9mZjg1NzJjNzMwNjk0MjI2ODRmYWE3NTM4YjM1ODBhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjEwMjU0NWYwOTA0YTUxOWNiN2RmYmJhYjczOTUxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zODgyM2E3ZDZjOTc0MWZhOGZhMmI0MTIwMjJmYWU3ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjU2ZTNlOGM0MmI0NTJjOTM2YWVmMjY4ZDdkMWI0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOWE3MDU4ZTJmNTI0MTdiYmUwYjQ1MzQ4YTFkN2IwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTlhNzA1OGUyZjUyNDE3YmJlMGI0NTM0OGExZDdiMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjU2ZTNlOGM0MmI0NTJjOTM2YWVmMjY4ZDdkMWI0OC5zZXRDb250ZW50KGh0bWxfZTlhNzA1OGUyZjUyNDE3YmJlMGI0NTM0OGExZDdiMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjIxMDI1NDVmMDkwNGE1MTljYjdkZmJiYWI3Mzk1MTQuYmluZFBvcHVwKHBvcHVwXzk2NTZlM2U4YzQyYjQ1MmM5MzZhZWYyNjhkN2QxYjQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFiYjU5Mjc5Y2FiODRhNmJhYjFhZjY3ZjE2YzQ2MTg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1NDBlNDQzODZkZDRiYzQ4NTU0NGQxYTU2MzgwMDZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwMTRlNjIxNWQxNDQ0ZDJhYmQyM2I3Y2Q2ZjQ2MWRmID0gJCgnPGRpdiBpZD0iaHRtbF9lMDE0ZTYyMTVkMTQ0NGQyYWJkMjNiN2NkNmY0NjFkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1NDBlNDQzODZkZDRiYzQ4NTU0NGQxYTU2MzgwMDZkLnNldENvbnRlbnQoaHRtbF9lMDE0ZTYyMTVkMTQ0NGQyYWJkMjNiN2NkNmY0NjFkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYmI1OTI3OWNhYjg0YTZiYWIxYWY2N2YxNmM0NjE4OS5iaW5kUG9wdXAocG9wdXBfYzU0MGU0NDM4NmRkNGJjNDg1NTQ0ZDFhNTYzODAwNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI1NWI5Y2YzOTc1NDAyMjhjNmY0ZTA3NWU0ZTU5ZmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIwNDAwMjY5Mzk2NGExNWFkZjBhMjFhYTAxMTQ5NTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjMzYWMxYWZjNTFjNDM4MTg3OGI1ZWVjZDc3MWMyMWIgPSAkKCc8ZGl2IGlkPSJodG1sXzYzM2FjMWFmYzUxYzQzODE4NzhiNWVlY2Q3NzFjMjFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiMDQwMDI2OTM5NjRhMTVhZGYwYTIxYWEwMTE0OTU5LnNldENvbnRlbnQoaHRtbF82MzNhYzFhZmM1MWM0MzgxODc4YjVlZWNkNzcxYzIxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YjU1YjljZjM5NzU0MDIyOGM2ZjRlMDc1ZTRlNTlmZS5iaW5kUG9wdXAocG9wdXBfZGIwNDAwMjY5Mzk2NGExNWFkZjBhMjFhYTAxMTQ5NTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQ1ZmU2YTgwMmQ1NDRlYTkxZWU3YmY1NTkyY2E4NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0YzgyZGRjZmE3ZTRhZjg4MDMyN2I4ZGYxNTNlNzQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxMTc3YTkzZjVkNjRkNjJiYzNhMzAxZmNmZTJiOTEzID0gJCgnPGRpdiBpZD0iaHRtbF8wMTE3N2E5M2Y1ZDY0ZDYyYmMzYTMwMWZjZmUyYjkxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0YzgyZGRjZmE3ZTRhZjg4MDMyN2I4ZGYxNTNlNzQ4LnNldENvbnRlbnQoaHRtbF8wMTE3N2E5M2Y1ZDY0ZDYyYmMzYTMwMWZjZmUyYjkxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNDVmZTZhODAyZDU0NGVhOTFlZTdiZjU1OTJjYTg0OS5iaW5kUG9wdXAocG9wdXBfZjRjODJkZGNmYTdlNGFmODgwMzI3YjhkZjE1M2U3NDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjU4ZGE4ZTQ5ZTlkNGI0NDlhZjdlMzI3N2QyNjFjYzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzM4ODIzYTdkNmM5NzQxZmE4ZmEyYjQxMjAyMmZhZTdkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyOTM4N2IzMDIwZjQ3ZGFhNGJhYjFmNjg0NjVlNTAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlZDg0NzA5YjQ1ODRhN2FhNWEwYjFkMzU1ZTI2N2YxID0gJCgnPGRpdiBpZD0iaHRtbF81ZWQ4NDcwOWI0NTg0YTdhYTVhMGIxZDM1NWUyNjdmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyOTM4N2IzMDIwZjQ3ZGFhNGJhYjFmNjg0NjVlNTAwLnNldENvbnRlbnQoaHRtbF81ZWQ4NDcwOWI0NTg0YTdhYTVhMGIxZDM1NWUyNjdmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNThkYThlNDllOWQ0YjQ0OWFmN2UzMjc3ZDI2MWNjMC5iaW5kUG9wdXAocG9wdXBfYTI5Mzg3YjMwMjBmNDdkYWE0YmFiMWY2ODQ2NWU1MDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjRlM2U5YzhlYzQyNDYxYmE2YzE5ZDQ2OTk0NmNmNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzg4MjNhN2Q2Yzk3NDFmYThmYTJiNDEyMDIyZmFlN2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTI4ZjEzOWMwYWFhNGU2NmI1NDY0MTEwZWRkZWRjNzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2ZkMGMzY2JmMGNkNDRjMGFmMDljM2VjODU3ZDY4YWQgPSAkKCc8ZGl2IGlkPSJodG1sX2NmZDBjM2NiZjBjZDQ0YzBhZjA5YzNlYzg1N2Q2OGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyOGYxMzljMGFhYTRlNjZiNTQ2NDExMGVkZGVkYzcxLnNldENvbnRlbnQoaHRtbF9jZmQwYzNjYmYwY2Q0NGMwYWYwOWMzZWM4NTdkNjhhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGUzZTljOGVjNDI0NjFiYTZjMTlkNDY5OTQ2Y2Y0OS5iaW5kUG9wdXAocG9wdXBfYTI4ZjEzOWMwYWFhNGU2NmI1NDY0MTEwZWRkZWRjNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f131d5b8c88>"
]
},
"execution_count": 17,
"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": [
"**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."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, for illustration purposes, let's 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 Manhattan data."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>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>Manhattan</td>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.910660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Manhattan</td>\n",
" <td>Chinatown</td>\n",
" <td>40.715618</td>\n",
" <td>-73.994279</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Manhattan</td>\n",
" <td>Washington Heights</td>\n",
" <td>40.851903</td>\n",
" <td>-73.936900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manhattan</td>\n",
" <td>Inwood</td>\n",
" <td>40.867684</td>\n",
" <td>-73.921210</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manhattan</td>\n",
" <td>Hamilton Heights</td>\n",
" <td>40.823604</td>\n",
" <td>-73.949688</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Manhattan Marble Hill 40.876551 -73.910660\n",
"1 Manhattan Chinatown 40.715618 -73.994279\n",
"2 Manhattan Washington Heights 40.851903 -73.936900\n",
"3 Manhattan Inwood 40.867684 -73.921210\n",
"4 Manhattan Hamilton Heights 40.823604 -73.949688"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n",
"manhattan_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get the geographical coordinates of Manhattan."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Manhattan are 40.7896239, -73.9598939.\n"
]
}
],
"source": [
"address = 'Manhattan, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzg5NjIzOSwtNzMuOTU5ODkzOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGIxMTExYzA1ZTg1NDQ1OWFjZjYzOGY3YTEwMTQ1MzEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzMDVlZGJlOTQ4ZTQ3MzViZjUxMzNiZDRmNmJmOWZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwYjEyOThlYjZlODQzZDQ5MDFiYWRiYTgxM2UxZTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlY2JhN2E5YmNmNTQ3ZTI4YzE0YmRiYjJhMDBkYjEzID0gJCgnPGRpdiBpZD0iaHRtbF9iZWNiYTdhOWJjZjU0N2UyOGMxNGJkYmIyYTAwZGIxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwYjEyOThlYjZlODQzZDQ5MDFiYWRiYTgxM2UxZTA5LnNldENvbnRlbnQoaHRtbF9iZWNiYTdhOWJjZjU0N2UyOGMxNGJkYmIyYTAwZGIxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMzA1ZWRiZTk0OGU0NzM1YmY1MTMzYmQ0ZjZiZjlmZC5iaW5kUG9wdXAocG9wdXBfNjBiMTI5OGViNmU4NDNkNDkwMWJhZGJhODEzZTFlMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNhZDcxMjU1NjgxNDZmMmFmYzEwOGUzZmQ3YmVlN2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWI3NDU0ZjI4MmFhNGVlNDk5MDRkYTY4MDU4MGJhYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE3NDNkNjBlM2JiNDE4ODg3ODg3ZWI3OThhMzgyOTYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhNzQzZDYwZTNiYjQxODg4Nzg4N2ViNzk4YTM4Mjk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiNzQ1NGYyODJhYTRlZTQ5OTA0ZGE2ODA1ODBiYWI0LnNldENvbnRlbnQoaHRtbF9mYTc0M2Q2MGUzYmI0MTg4ODc4ODdlYjc5OGEzODI5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wM2FkNzEyNTU2ODE0NmYyYWZjMTA4ZTNmZDdiZWU3YS5iaW5kUG9wdXAocG9wdXBfYWI3NDU0ZjI4MmFhNGVlNDk5MDRkYTY4MDU4MGJhYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmQ0ZTUyNzg1OThhNGZkN2IzMTE5OGUyNTE0ODVhZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGNiZDc1N2ExMzhkNDljNGEyMTEwNGMwMGMwZjg0NmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDcwMTIyYzZhMDFlNGJjNWJiYTNkY2U3OTg4MTlhZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3MDEyMmM2YTAxZTRiYzViYmEzZGNlNzk4ODE5YWZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjYmQ3NTdhMTM4ZDQ5YzRhMjExMDRjMDBjMGY4NDZlLnNldENvbnRlbnQoaHRtbF9kNzAxMjJjNmEwMWU0YmM1YmJhM2RjZTc5ODgxOWFmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZDRlNTI3ODU5OGE0ZmQ3YjMxMTk4ZTI1MTQ4NWFlZC5iaW5kUG9wdXAocG9wdXBfOGNiZDc1N2ExMzhkNDljNGEyMTEwNGMwMGMwZjg0NmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTM1NTI4OTJjMGE1NDExNTlkN2YxZWYwMjg4NmZmZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIxNTAwNzRlMzM3NDk3NDlhZjQ5NjY5ZjJkMjY5YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQzMzJjOGNmZjQxNGUyZGI4Y2Y4M2JmZGMwZThhMGYgPSAkKCc8ZGl2IGlkPSJodG1sXzY0MzMyYzhjZmY0MTRlMmRiOGNmODNiZmRjMGU4YTBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyMTUwMDc0ZTMzNzQ5NzQ5YWY0OTY2OWYyZDI2OWMzLnNldENvbnRlbnQoaHRtbF82NDMzMmM4Y2ZmNDE0ZTJkYjhjZjgzYmZkYzBlOGEwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMzU1Mjg5MmMwYTU0MTE1OWQ3ZjFlZjAyODg2ZmZmYi5iaW5kUG9wdXAocG9wdXBfMzIxNTAwNzRlMzM3NDk3NDlhZjQ5NjY5ZjJkMjY5YzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjJlMzkwMTQwZDZjNDIzNDgwZjM1NTcyOGJlNmNlZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2NmU5MjdhZTBkMzQ5OGY4OTBiNzc5NGY0OTQyOGE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2Mjg3MTA2YzY5MjQ4NjA5M2IwYWIxYzMwNjg3YTYwID0gJCgnPGRpdiBpZD0iaHRtbF8zNjI4NzEwNmM2OTI0ODYwOTNiMGFiMWMzMDY4N2E2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY2ZTkyN2FlMGQzNDk4Zjg5MGI3Nzk0ZjQ5NDI4YTkuc2V0Q29udGVudChodG1sXzM2Mjg3MTA2YzY5MjQ4NjA5M2IwYWIxYzMwNjg3YTYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyZTM5MDE0MGQ2YzQyMzQ4MGYzNTU3MjhiZTZjZWQ3LmJpbmRQb3B1cChwb3B1cF9hNjZlOTI3YWUwZDM0OThmODkwYjc3OTRmNDk0MjhhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjI5NWFmYzBhNDY0ZjBiOGFlM2Y4NGQzZjJhMjU0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2RlZTJlOGE3NDRmNGM1MTg4NWQzM2YyYTFmZDU4ODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ0MTUxNzY3YzIwNDVlODkzYTRkZWFhYWE3ZmQ4ZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzFkNDE1MTc2N2MyMDQ1ZTg5M2E0ZGVhYWFhN2ZkOGRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2RlZTJlOGE3NDRmNGM1MTg4NWQzM2YyYTFmZDU4ODUuc2V0Q29udGVudChodG1sXzFkNDE1MTc2N2MyMDQ1ZTg5M2E0ZGVhYWFhN2ZkOGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2Mjk1YWZjMGE0NjRmMGI4YWUzZjg0ZDNmMmEyNTQxLmJpbmRQb3B1cChwb3B1cF8zZGVlMmU4YTc0NGY0YzUxODg1ZDMzZjJhMWZkNTg4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYWNiZDc1YmE4ZmE0OTRkODVhZDhjYmM3NmQxNGRmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2IzMDQ1MGQyZTY0ZWE0OTNmMzBlYmE2YjAyNTYzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYTNkODA1Njk1MzU0YTk3YjA4NGQ2Y2ZlZmMzNDU2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZWEzZDgwNTY5NTM1NGE5N2IwODRkNmNmZWZjMzQ1NmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2IzMDQ1MGQyZTY0ZWE0OTNmMzBlYmE2YjAyNTYzOC5zZXRDb250ZW50KGh0bWxfZWEzZDgwNTY5NTM1NGE5N2IwODRkNmNmZWZjMzQ1NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2FjYmQ3NWJhOGZhNDk0ZDg1YWQ4Y2JjNzZkMTRkZjIuYmluZFBvcHVwKHBvcHVwX2RjYjMwNDUwZDJlNjRlYTQ5M2YzMGViYTZiMDI1NjM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNjI1ZDAzN2QwNjRhNDRhMzVlNWYyNGI1NzUxMTQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3NTkzYzU2MTkwYzQxMzI5N2UwNWI5Y2ZhZDg1OGUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1MDdjMTdiNDY3MzRiOWQ5OWI1ODAzNzRlZDRmNzQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTA3YzE3YjQ2NzM0YjlkOTliNTgwMzc0ZWQ0Zjc0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3NTkzYzU2MTkwYzQxMzI5N2UwNWI5Y2ZhZDg1OGUxLnNldENvbnRlbnQoaHRtbF9iNTA3YzE3YjQ2NzM0YjlkOTliNTgwMzc0ZWQ0Zjc0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjYyNWQwMzdkMDY0YTQ0YTM1ZTVmMjRiNTc1MTE0Ni5iaW5kUG9wdXAocG9wdXBfODc1OTNjNTYxOTBjNDEzMjk3ZTA1YjljZmFkODU4ZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjBhZmViODdmYjA2NGVjOTk5OGI1OTdiMTI0NTAwOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjMDg4ODQzMTNkNzRmOTg5MzEwNTI2YjVhY2IyMmE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxYzQ3Y2U5NmUwODRjNjU5NmVmZjM2Y2U2Y2Q0YTUyID0gJCgnPGRpdiBpZD0iaHRtbF9jMWM0N2NlOTZlMDg0YzY1OTZlZmYzNmNlNmNkNGE1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzA4ODg0MzEzZDc0Zjk4OTMxMDUyNmI1YWNiMjJhNS5zZXRDb250ZW50KGh0bWxfYzFjNDdjZTk2ZTA4NGM2NTk2ZWZmMzZjZTZjZDRhNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjBhZmViODdmYjA2NGVjOTk5OGI1OTdiMTI0NTAwOTcuYmluZFBvcHVwKHBvcHVwXzZjMDg4ODQzMTNkNzRmOTg5MzEwNTI2YjVhY2IyMmE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmODRiOWIxNWY3NzRlZDM5NWM2YTZlM2YxMDIyNGEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTkwZTY3MmFhNGM0ZWMzYmY3ZjFhYWE5ZjlmNmVjMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iY2EwYWE0ZWI0NDg0OGMzYjcwYmE3YmM1MGYyMjJmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmNhMGFhNGViNDQ4NDhjM2I3MGJhN2JjNTBmMjIyZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmU5MGU2NzJhYTRjNGVjM2JmN2YxYWFhOWY5ZjZlYzEuc2V0Q29udGVudChodG1sX2JjYTBhYTRlYjQ0ODQ4YzNiNzBiYTdiYzUwZjIyMmY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JmODRiOWIxNWY3NzRlZDM5NWM2YTZlM2YxMDIyNGEzLmJpbmRQb3B1cChwb3B1cF9iZTkwZTY3MmFhNGM0ZWMzYmY3ZjFhYWE5ZjlmNmVjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNjdjNTJiZWQ1Zjg0MjFmYTVmMGUzZTQ0NDhhZDZlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4ZDgwYTlkOTAyNTRlNTU5ZWNhZjExNjZkOTIxZTVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4ZjkzZmNhNjU1NjQzYmE4NzFmNmIzMGM5NmMwNTFhID0gJCgnPGRpdiBpZD0iaHRtbF80OGY5M2ZjYTY1NTY0M2JhODcxZjZiMzBjOTZjMDUxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThkODBhOWQ5MDI1NGU1NTllY2FmMTE2NmQ5MjFlNWQuc2V0Q29udGVudChodG1sXzQ4ZjkzZmNhNjU1NjQzYmE4NzFmNmIzMGM5NmMwNTFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2N2M1MmJlZDVmODQyMWZhNWYwZTNlNDQ0OGFkNmVmLmJpbmRQb3B1cChwb3B1cF81OGQ4MGE5ZDkwMjU0ZTU1OWVjYWYxMTY2ZDkyMWU1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OWU1MmFlNzg4Yjc0YTkwYTM1ZDU4ZjM1OTJiYTg3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MWI5M2FmZTEyZDM0ZmE1YmViMTBkNzFlYjFlNWM0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDg3MTMwZWY1YzU0YmRjYjBhZmM1OGQ5NWQzNjVkNSA9ICQoJzxkaXYgaWQ9Imh0bWxfODQ4NzEzMGVmNWM1NGJkY2IwYWZjNThkOTVkMzY1ZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxYjkzYWZlMTJkMzRmYTViZWIxMGQ3MWViMWU1YzRjLnNldENvbnRlbnQoaHRtbF84NDg3MTMwZWY1YzU0YmRjYjBhZmM1OGQ5NWQzNjVkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OWU1MmFlNzg4Yjc0YTkwYTM1ZDU4ZjM1OTJiYTg3OC5iaW5kUG9wdXAocG9wdXBfOTFiOTNhZmUxMmQzNGZhNWJlYjEwZDcxZWIxZTVjNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWJiYzA3MmZhMzljNGFjM2IwOGNjYWFjZDJjMDM4NzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzMzVkMGIxZTU2ZDQ2Zjg4NDI3NDg1NmQwNWVmMDUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4ZTdjNzIxZDBjYzQ0YjM4MGFiYzBmNTBiNmUyYmYwID0gJCgnPGRpdiBpZD0iaHRtbF84OGU3YzcyMWQwY2M0NGIzODBhYmMwZjUwYjZlMmJmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzM1ZDBiMWU1NmQ0NmY4ODQyNzQ4NTZkMDVlZjA1My5zZXRDb250ZW50KGh0bWxfODhlN2M3MjFkMGNjNDRiMzgwYWJjMGY1MGI2ZTJiZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWJiYzA3MmZhMzljNGFjM2IwOGNjYWFjZDJjMDM4NzEuYmluZFBvcHVwKHBvcHVwX2UzMzVkMGIxZTU2ZDQ2Zjg4NDI3NDg1NmQwNWVmMDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3MjA3YTEzNGU5NDRiNDNiNTUxNDM3ODI3MThmOTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzYzU2ZmM1NTQxZDQ0NTI5NTcwMjJkZjY2ZWJiNjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1OWFlMzU5MTI3MzQ0YTI4MjRiMThmMjVkYjM1YmZmID0gJCgnPGRpdiBpZD0iaHRtbF85NTlhZTM1OTEyNzM0NGEyODI0YjE4ZjI1ZGIzNWJmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzYzU2ZmM1NTQxZDQ0NTI5NTcwMjJkZjY2ZWJiNjkyLnNldENvbnRlbnQoaHRtbF85NTlhZTM1OTEyNzM0NGEyODI0YjE4ZjI1ZGIzNWJmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNzIwN2ExMzRlOTQ0YjQzYjU1MTQzNzgyNzE4ZjkxZi5iaW5kUG9wdXAocG9wdXBfZjNjNTZmYzU1NDFkNDQ1Mjk1NzAyMmRmNjZlYmI2OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI0YjFlZGE5ZDE3NDg2Y2FjODRjYzIzZmFlZDQ3NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTA1MWMzZGQ1YTk5NDI4MmIwMmYzNjNmZmEzYjc0NTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzc3OWYyMjVlMDNjNDgwMmJiMjBmOTA4YTZiMWRiZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzc3NzlmMjI1ZTAzYzQ4MDJiYjIwZjkwOGE2YjFkYmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDUxYzNkZDVhOTk0MjgyYjAyZjM2M2ZmYTNiNzQ1Ny5zZXRDb250ZW50KGh0bWxfNzc3OWYyMjVlMDNjNDgwMmJiMjBmOTA4YTZiMWRiZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI0YjFlZGE5ZDE3NDg2Y2FjODRjYzIzZmFlZDQ3NDEuYmluZFBvcHVwKHBvcHVwXzkwNTFjM2RkNWE5OTQyODJiMDJmMzYzZmZhM2I3NDU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0MWJiNzJhODc5MDQzOTFhNzZjODRhMjkzMTMyMjM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzllYWJiNTgyODEzZjQyOTQ4Y2Y3NWMwNzE0NzQ1OWIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3MjEzMWU5NWVlZDQ4MDFhNTg4NmUzYjY3NzQxODE5ID0gJCgnPGRpdiBpZD0iaHRtbF83NzIxMzFlOTVlZWQ0ODAxYTU4ODZlM2I2Nzc0MTgxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWVhYmI1ODI4MTNmNDI5NDhjZjc1YzA3MTQ3NDU5YjAuc2V0Q29udGVudChodG1sXzc3MjEzMWU5NWVlZDQ4MDFhNTg4NmUzYjY3NzQxODE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0MWJiNzJhODc5MDQzOTFhNzZjODRhMjkzMTMyMjM3LmJpbmRQb3B1cChwb3B1cF85ZWFiYjU4MjgxM2Y0Mjk0OGNmNzVjMDcxNDc0NTliMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjM0NTlkNTFhNGY0NWY1YTRmYTc0ZjEzODBkZTU2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjdlMGNmNDk0ODgzNDA1ZWJiY2QxZmFlMWI2M2UxZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg0MTI1ZDI1ZjU1NGExNmFhOWZhYjNiMjBhMmIxNjggPSAkKCc8ZGl2IGlkPSJodG1sX2Y4NDEyNWQyNWY1NTRhMTZhYTlmYWIzYjIwYTJiMTY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjdlMGNmNDk0ODgzNDA1ZWJiY2QxZmFlMWI2M2UxZTMuc2V0Q29udGVudChodG1sX2Y4NDEyNWQyNWY1NTRhMTZhYTlmYWIzYjIwYTJiMTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2MzQ1OWQ1MWE0ZjQ1ZjVhNGZhNzRmMTM4MGRlNTY5LmJpbmRQb3B1cChwb3B1cF82N2UwY2Y0OTQ4ODM0MDVlYmJjZDFmYWUxYjYzZTFlMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MmY2NmY2NGQ1Mzk0OTYzYWQxZWJkNWViYTI3MmM3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JlZGMwNzY4NjNmNGFkY2I4M2I0MzQzMTY0YmFhZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTBlM2MxM2FlZDFhNDRmNGE0Yjg1MjRjMjRhOWNiZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzEwZTNjMTNhZWQxYTQ0ZjRhNGI4NTI0YzI0YTljYmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYmVkYzA3Njg2M2Y0YWRjYjgzYjQzNDMxNjRiYWFkYS5zZXRDb250ZW50KGh0bWxfMTBlM2MxM2FlZDFhNDRmNGE0Yjg1MjRjMjRhOWNiZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzJmNjZmNjRkNTM5NDk2M2FkMWViZDVlYmEyNzJjN2MuYmluZFBvcHVwKHBvcHVwX2NiZWRjMDc2ODYzZjRhZGNiODNiNDM0MzE2NGJhYWRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkNzEwNmE2YmYwMzRjY2Y5ZjFlOTVlMjA0YWE5NzFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyZmQxNDE3NGI5MTQ3NDNhYjhkN2RkMWVkMTAzOWYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyZjI0Yjc0ZmQxMzQ5NzBiNWVjODZhMDE4MWE1MjM5ID0gJCgnPGRpdiBpZD0iaHRtbF8xMmYyNGI3NGZkMTM0OTcwYjVlYzg2YTAxODFhNTIzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyZmQxNDE3NGI5MTQ3NDNhYjhkN2RkMWVkMTAzOWYwLnNldENvbnRlbnQoaHRtbF8xMmYyNGI3NGZkMTM0OTcwYjVlYzg2YTAxODFhNTIzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZDcxMDZhNmJmMDM0Y2NmOWYxZTk1ZTIwNGFhOTcxYS5iaW5kUG9wdXAocG9wdXBfOTJmZDE0MTc0YjkxNDc0M2FiOGQ3ZGQxZWQxMDM5ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODg1MTBmNGI3MDNmNGE4NThlM2ZjYmY3OWI0MmZmMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0YTNlN2ViYWNkNjQ2YmFhZTUxZTQ2MTYxOTY2MGQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4MDFlYzQyNjk0MzRkZGI4YzY5ZmFmNzYzOTI3NTFjID0gJCgnPGRpdiBpZD0iaHRtbF8wODAxZWM0MjY5NDM0ZGRiOGM2OWZhZjc2MzkyNzUxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNGEzZTdlYmFjZDY0NmJhYWU1MWU0NjE2MTk2NjBkNS5zZXRDb250ZW50KGh0bWxfMDgwMWVjNDI2OTQzNGRkYjhjNjlmYWY3NjM5Mjc1MWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODg1MTBmNGI3MDNmNGE4NThlM2ZjYmY3OWI0MmZmMjcuYmluZFBvcHVwKHBvcHVwX2Y0YTNlN2ViYWNkNjQ2YmFhZTUxZTQ2MTYxOTY2MGQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0ZWU5ZjNlOTg3OTQwYmFiNzc3YWM5MmRlOGNlMzUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlNDFjMWM1MDA2MTQ3Y2FiMmRmZmVkNTFkOWJmNzc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2MTg4ODk0ZTYxODQyNzk4ZjNkNjU4OWMxOTEyZDcxID0gJCgnPGRpdiBpZD0iaHRtbF8wNjE4ODg5NGU2MTg0Mjc5OGYzZDY1ODljMTkxMmQ3MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTQxYzFjNTAwNjE0N2NhYjJkZmZlZDUxZDliZjc3Ny5zZXRDb250ZW50KGh0bWxfMDYxODg4OTRlNjE4NDI3OThmM2Q2NTg5YzE5MTJkNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjRlZTlmM2U5ODc5NDBiYWI3NzdhYzkyZGU4Y2UzNTMuYmluZFBvcHVwKHBvcHVwX2VlNDFjMWM1MDA2MTQ3Y2FiMmRmZmVkNTFkOWJmNzc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5MDQxOTAyZTdjMTRjY2E5NTMyNDNlZGM3NTc1Y2Q3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMTE4OGEyMDk1Mzc0ZWQzOTE2MGM3ZjYwOTIxOTY1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTg3ODFhMTM4Y2I0NmZhOWU5NzFmN2IwZDk0ODdkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2U4NzgxYTEzOGNiNDZmYTllOTcxZjdiMGQ5NDg3ZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxMTg4YTIwOTUzNzRlZDM5MTYwYzdmNjA5MjE5NjU4LnNldENvbnRlbnQoaHRtbF9jZTg3ODFhMTM4Y2I0NmZhOWU5NzFmN2IwZDk0ODdkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OTA0MTkwMmU3YzE0Y2NhOTUzMjQzZWRjNzU3NWNkNy5iaW5kUG9wdXAocG9wdXBfMzExODhhMjA5NTM3NGVkMzkxNjBjN2Y2MDkyMTk2NTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODdmNjhlYmVmY2IyNDFjMGFmNjBjMWI4MTA1ODc3ZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmJjNjkyOTVjNDBjNDFjNjg2Mjc2M2ViM2E4Yjg1ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDE3OTg1YWZiYmIyNDJkMGEyZGVkNDhlMjA1YzM0OTcgPSAkKCc8ZGl2IGlkPSJodG1sXzAxNzk4NWFmYmJiMjQyZDBhMmRlZDQ4ZTIwNWMzNDk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiYzY5Mjk1YzQwYzQxYzY4NjI3NjNlYjNhOGI4NWQ1LnNldENvbnRlbnQoaHRtbF8wMTc5ODVhZmJiYjI0MmQwYTJkZWQ0OGUyMDVjMzQ5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84N2Y2OGViZWZjYjI0MWMwYWY2MGMxYjgxMDU4NzdlZC5iaW5kUG9wdXAocG9wdXBfMmJjNjkyOTVjNDBjNDFjNjg2Mjc2M2ViM2E4Yjg1ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2MxN2ZkNmRhYjFjNDU5ODk1YTFmYzI0MmVkY2I4ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ2YjVhYTY5NjIyNGJlZTlmNjExNjVjYTJhMjQ0ZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODU3MjE4M2MxNmMzNDZhNjhjYjk5NTM0NmRiMWQyNTMgPSAkKCc8ZGl2IGlkPSJodG1sXzg1NzIxODNjMTZjMzQ2YTY4Y2I5OTUzNDZkYjFkMjUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDZiNWFhNjk2MjI0YmVlOWY2MTE2NWNhMmEyNDRlYy5zZXRDb250ZW50KGh0bWxfODU3MjE4M2MxNmMzNDZhNjhjYjk5NTM0NmRiMWQyNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2MxN2ZkNmRhYjFjNDU5ODk1YTFmYzI0MmVkY2I4ZjkuYmluZFBvcHVwKHBvcHVwXzVkNmI1YWE2OTYyMjRiZWU5ZjYxMTY1Y2EyYTI0NGVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4YTRlOTczYzI5NzQ2MzE4NmU2MmRmNWI1ZmI2NGM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MDlmYjUyYzlkMDRlYmFhY2NlYTdiNTAwN2QwYzg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2MmRmY2ZmYmI0YjRiMWM4YjNjOTJhMDVjYjY2ZGZlID0gJCgnPGRpdiBpZD0iaHRtbF9jNjJkZmNmZmJiNGI0YjFjOGIzYzkyYTA1Y2I2NmRmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNDA5ZmI1MmM5ZDA0ZWJhYWNjZWE3YjUwMDdkMGM4OC5zZXRDb250ZW50KGh0bWxfYzYyZGZjZmZiYjRiNGIxYzhiM2M5MmEwNWNiNjZkZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDhhNGU5NzNjMjk3NDYzMTg2ZTYyZGY1YjVmYjY0YzguYmluZFBvcHVwKHBvcHVwXzM0MDlmYjUyYzlkMDRlYmFhY2NlYTdiNTAwN2QwYzg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkY2E0NDUxMTJiYzQ5NmViNDdmN2E5MTU2YzUxNTEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Nzk1ZTNmMjRmMTM0YjJiYmI2ZTgxZmJiNGY4YmFiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjM5OGQyYzIxMjc0MTI1YmIxN2Q1NDRjMjc2ODBmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWIzOThkMmMyMTI3NDEyNWJiMTdkNTQ0YzI3NjgwZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3OTVlM2YyNGYxMzRiMmJiYjZlODFmYmI0ZjhiYWIyLnNldENvbnRlbnQoaHRtbF8xYjM5OGQyYzIxMjc0MTI1YmIxN2Q1NDRjMjc2ODBmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZGNhNDQ1MTEyYmM0OTZlYjQ3ZjdhOTE1NmM1MTUxMy5iaW5kUG9wdXAocG9wdXBfNjc5NWUzZjI0ZjEzNGIyYmJiNmU4MWZiYjRmOGJhYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTA0MjIxY2YzZWM3NGIzZjkyNmU3YzdkOGQwNGIyODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkMzQ3NTg4MzNhMzQ4NDRiMzNlNzIzODMwY2M3Yjg2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjNGY5OTI0MzJjNzQ2ZmFhMGMwOGRlNzNjOWRhYzkzID0gJCgnPGRpdiBpZD0iaHRtbF8xYzRmOTkyNDMyYzc0NmZhYTBjMDhkZTczYzlkYWM5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2QzNDc1ODgzM2EzNDg0NGIzM2U3MjM4MzBjYzdiODYuc2V0Q29udGVudChodG1sXzFjNGY5OTI0MzJjNzQ2ZmFhMGMwOGRlNzNjOWRhYzkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwNDIyMWNmM2VjNzRiM2Y5MjZlN2M3ZDhkMDRiMjg3LmJpbmRQb3B1cChwb3B1cF83ZDM0NzU4ODMzYTM0ODQ0YjMzZTcyMzgzMGNjN2I4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMTEzZTZhYzVjMmY0YTVlYjM1ZjMwODhmZmQ4ODViOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmM4MDk4NDQ2ZjRjNGExZjg4YmRiZTJkODgwMjNmNWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDA0ZGFhODY0NzUwNGNhMjk5MjFjZDJjYWUxZGU4MGUgPSAkKCc8ZGl2IGlkPSJodG1sXzQwNGRhYTg2NDc1MDRjYTI5OTIxY2QyY2FlMWRlODBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmM4MDk4NDQ2ZjRjNGExZjg4YmRiZTJkODgwMjNmNWYuc2V0Q29udGVudChodG1sXzQwNGRhYTg2NDc1MDRjYTI5OTIxY2QyY2FlMWRlODBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxMTNlNmFjNWMyZjRhNWViMzVmMzA4OGZmZDg4NWI5LmJpbmRQb3B1cChwb3B1cF82YzgwOTg0NDZmNGM0YTFmODhiZGJlMmQ4ODAyM2Y1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNGQwNzAwMmFjMmY0Zjk3OGE0NjNkZDZiOWE5NGVhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjQ2ZmY1NWZlYmM0NTVjYjUwYTZiYWU1MWE4YTUxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZjNiYjJmNWEzZDk0MjQ2YjBmMTFiM2MxOGM4NzI2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGYzYmIyZjVhM2Q5NDI0NmIwZjExYjNjMThjODcyNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjQ2ZmY1NWZlYmM0NTVjYjUwYTZiYWU1MWE4YTUxMC5zZXRDb250ZW50KGh0bWxfMGYzYmIyZjVhM2Q5NDI0NmIwZjExYjNjMThjODcyNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRkMDcwMDJhYzJmNGY5NzhhNDYzZGQ2YjlhOTRlYTAuYmluZFBvcHVwKHBvcHVwXzM2NDZmZjU1ZmViYzQ1NWNiNTBhNmJhZTUxYThhNTEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzNzJmOWY0ZTMyZTQzOWRhMTYxYmNlNThhMDRmZGYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGIyYTIzNmQzZDkxNDVmZTllYzllY2NmMjFjYzEyYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQxZDhkNTIxYjk5NDU0YmE4NzllMzQxMGE0YTUwODkgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0MWQ4ZDUyMWI5OTQ1NGJhODc5ZTM0MTBhNGE1MDg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiMmEyMzZkM2Q5MTQ1ZmU5ZWM5ZWNjZjIxY2MxMmFjLnNldENvbnRlbnQoaHRtbF80NDFkOGQ1MjFiOTk0NTRiYTg3OWUzNDEwYTRhNTA4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMzcyZjlmNGUzMmU0MzlkYTE2MWJjZTU4YTA0ZmRmMi5iaW5kUG9wdXAocG9wdXBfOGIyYTIzNmQzZDkxNDVmZTllYzllY2NmMjFjYzEyYWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2Y2ZTQzNzZjNWE0NDI3ZWJkZGIwMDlkNTA0ZDAxNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzZkMWY4ZjFlMGY0OTUwODQwNTdmOTczZDA4ZmRhYyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmMzMjYwZjM1NWQ0MGVhODZhZDRhMjAyYjE3Njk3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTBkZmRiN2UxNjY0NjAyYjczNzdhODUzZjU2ZDFjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjUwZGZkYjdlMTY2NDYwMmI3Mzc3YTg1M2Y1NmQxYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyYzMyNjBmMzU1ZDQwZWE4NmFkNGEyMDJiMTc2OTdlLnNldENvbnRlbnQoaHRtbF9mNTBkZmRiN2UxNjY0NjAyYjczNzdhODUzZjU2ZDFjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZjZlNDM3NmM1YTQ0MjdlYmRkYjAwOWQ1MDRkMDE3Ni5iaW5kUG9wdXAocG9wdXBfNDJjMzI2MGYzNTVkNDBlYTg2YWQ0YTIwMmIxNzY5N2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcwYzA0NzQ0ZDM1NGQxNWJiZmFlYmJlN2Q2ZmZkMmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjMyZGVhYzZmYjM2NGYzOWI4NjBhYWEyMThiYmZmNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmM2Njg2ZWQ0YWFiNDAxOGJiNzA1NGI3NzlmODAwY2YgPSAkKCc8ZGl2IGlkPSJodG1sXzZjNjY4NmVkNGFhYjQwMThiYjcwNTRiNzc5ZjgwMGNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzJkZWFjNmZiMzY0ZjM5Yjg2MGFhYTIxOGJiZmY3Ny5zZXRDb250ZW50KGh0bWxfNmM2Njg2ZWQ0YWFiNDAxOGJiNzA1NGI3NzlmODAwY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTcwYzA0NzQ0ZDM1NGQxNWJiZmFlYmJlN2Q2ZmZkMmUuYmluZFBvcHVwKHBvcHVwX2YzMmRlYWM2ZmIzNjRmMzliODYwYWFhMjE4YmJmZjc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmOTMxMGFlYThhZTRjYTA5ZWJiZTVkMWE2Mzg2NjEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3OWYzMjY4MmE5ZTQxMGM5NzI5ZWE2ZjFkNWRjODIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmZWY1MzAxYjQ4YzQ5OGRhNjBlZmE3ZDU1YzVkYTlkID0gJCgnPGRpdiBpZD0iaHRtbF8yZmVmNTMwMWI0OGM0OThkYTYwZWZhN2Q1NWM1ZGE5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzlmMzI2ODJhOWU0MTBjOTcyOWVhNmYxZDVkYzgyMC5zZXRDb250ZW50KGh0bWxfMmZlZjUzMDFiNDhjNDk4ZGE2MGVmYTdkNTVjNWRhOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmY5MzEwYWVhOGFlNGNhMDllYmJlNWQxYTYzODY2MTMuYmluZFBvcHVwKHBvcHVwXzE3OWYzMjY4MmE5ZTQxMGM5NzI5ZWE2ZjFkNWRjODIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxMjA4MTRiNTVkZjQwMDU5Yjk3ZDQ3MjI2Yjg3MzBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM0MWQzMDUyMTc1NDA5N2E2NjNhZjIxOTU4ZDQwMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODgwMzU0NmNjOWE0NGI4MTgxMTAzNTkxYjE2YTg3MWMgPSAkKCc8ZGl2IGlkPSJodG1sXzg4MDM1NDZjYzlhNDRiODE4MTEwMzU5MWIxNmE4NzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzQxZDMwNTIxNzU0MDk3YTY2M2FmMjE5NThkNDAwMi5zZXRDb250ZW50KGh0bWxfODgwMzU0NmNjOWE0NGI4MTgxMTAzNTkxYjE2YTg3MWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjEyMDgxNGI1NWRmNDAwNTliOTdkNDcyMjZiODczMGEuYmluZFBvcHVwKHBvcHVwX2EzNDFkMzA1MjE3NTQwOTdhNjYzYWYyMTk1OGQ0MDAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlYmY5MWZiZWVlMzQ2ZWJiYTMyYTBlYzE5MzA0MzIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhMjgyNWRjZGY5MzQxYTU5MmE1Yzc4NWM0ZThhYWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzMmQ0OTA3NmRhYjQ3NTVhYWFiYzg0Yjk0MWY5NDE2ID0gJCgnPGRpdiBpZD0iaHRtbF85MzJkNDkwNzZkYWI0NzU1YWFhYmM4NGI5NDFmOTQxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YTI4MjVkY2RmOTM0MWE1OTJhNWM3ODVjNGU4YWFmYS5zZXRDb250ZW50KGh0bWxfOTMyZDQ5MDc2ZGFiNDc1NWFhYWJjODRiOTQxZjk0MTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ViZjkxZmJlZWUzNDZlYmJhMzJhMGVjMTkzMDQzMjAuYmluZFBvcHVwKHBvcHVwXzZhMjgyNWRjZGY5MzQxYTU5MmE1Yzc4NWM0ZThhYWZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4NjNiM2IxMmU3NzQwMDA4MmYxNDAxZDAzMzNlMmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjMjY5YTY1ZDA3NjRiODQ5OTM0YWY4NDY3NDUwZGQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmZGU5YmVlODRjMTRhYzliNzQ2OWFhZWE4NDQwN2RlID0gJCgnPGRpdiBpZD0iaHRtbF82ZmRlOWJlZTg0YzE0YWM5Yjc0NjlhYWVhODQ0MDdkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmMyNjlhNjVkMDc2NGI4NDk5MzRhZjg0Njc0NTBkZDguc2V0Q29udGVudChodG1sXzZmZGU5YmVlODRjMTRhYzliNzQ2OWFhZWE4NDQwN2RlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q4NjNiM2IxMmU3NzQwMDA4MmYxNDAxZDAzMzNlMmVmLmJpbmRQb3B1cChwb3B1cF82YzI2OWE2NWQwNzY0Yjg0OTkzNGFmODQ2NzQ1MGRkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNmQyZjhmOTQ1OWY0ZTBkYjdjNGFkNTRlYWZlYWQ1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2UxNDZhYTcxY2Q3NDJlNTllZTUzYzBmOTI3NDhhMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM5MTU4NzM2YTQ4NDJhZGJhOWJlNGUxOGYyMmI5NDUgPSAkKCc8ZGl2IGlkPSJodG1sXzQzOTE1ODczNmE0ODQyYWRiYTliZTRlMThmMjJiOTQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZTE0NmFhNzFjZDc0MmU1OWVlNTNjMGY5Mjc0OGEyNi5zZXRDb250ZW50KGh0bWxfNDM5MTU4NzM2YTQ4NDJhZGJhOWJlNGUxOGYyMmI5NDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjZkMmY4Zjk0NTlmNGUwZGI3YzRhZDU0ZWFmZWFkNTYuYmluZFBvcHVwKHBvcHVwXzdlMTQ2YWE3MWNkNzQyZTU5ZWU1M2MwZjkyNzQ4YTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmOWQxOTRhYjExNDQ0ZDk4ZGIxNGMyNjIzOTA0ZWFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZlN2M3YjI1MTBlYTQ4OGRhMGUyMTNhZmQzYzc4ZWQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxN2UwNDg2NDEwMTQ1ODg5YzUwNzdiMTNkMWQ2NWU0ID0gJCgnPGRpdiBpZD0iaHRtbF84MTdlMDQ4NjQxMDE0NTg4OWM1MDc3YjEzZDFkNjVlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZTdjN2IyNTEwZWE0ODhkYTBlMjEzYWZkM2M3OGVkOC5zZXRDb250ZW50KGh0bWxfODE3ZTA0ODY0MTAxNDU4ODljNTA3N2IxM2QxZDY1ZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWY5ZDE5NGFiMTE0NDRkOThkYjE0YzI2MjM5MDRlYWIuYmluZFBvcHVwKHBvcHVwX2ZlN2M3YjI1MTBlYTQ4OGRhMGUyMTNhZmQzYzc4ZWQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwZWY4NTMxOTk5MTRjZDE4OTFiZDM2NGI5MWE1MTgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjNmQxZjhmMWUwZjQ5NTA4NDA1N2Y5NzNkMDhmZGFjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkZmI3MWNkZDJmZDRkMTBiMTg0OGU5NDc2MzYwOThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmMzJkYmNhZmUyNzQ4ZWI4ODM5ODAwNmUyYzIxMjY5ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjMyZGJjYWZlMjc0OGViODgzOTgwMDZlMmMyMTI2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkZmI3MWNkZDJmZDRkMTBiMTg0OGU5NDc2MzYwOThmLnNldENvbnRlbnQoaHRtbF82ZjMyZGJjYWZlMjc0OGViODgzOTgwMDZlMmMyMTI2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMGVmODUzMTk5OTE0Y2QxODkxYmQzNjRiOTFhNTE4MS5iaW5kUG9wdXAocG9wdXBfMGRmYjcxY2RkMmZkNGQxMGIxODQ4ZTk0NzYzNjA5OGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjI5Zjk5NzY1NWRhNGMyYThiYTUyMTExNDFhNThhYzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M2ZDFmOGYxZTBmNDk1MDg0MDU3Zjk3M2QwOGZkYWMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQ3ODY1MDRjMDk2NGY1N2I4YzViMjEyMWNlOTEwNzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRiZTU3MjJhYjI0NDczNWJkNWNmZmFjZDZhOGFhMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzlkYmU1NzIyYWIyNDQ3MzViZDVjZmZhY2Q2YThhYTM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkNzg2NTA0YzA5NjRmNTdiOGM1YjIxMjFjZTkxMDcyLnNldENvbnRlbnQoaHRtbF85ZGJlNTcyMmFiMjQ0NzM1YmQ1Y2ZmYWNkNmE4YWEzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMjlmOTk3NjU1ZGE0YzJhOGJhNTIxMTE0MWE1OGFjMy5iaW5kUG9wdXAocG9wdXBfYmQ3ODY1MDRjMDk2NGY1N2I4YzViMjEyMWNlOTEwNzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f131d05fe80>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Manhattan using latitude and longitude values\n",
"map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n",
"\n",
"# add markers to map\n",
"for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_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_manhattan) \n",
" \n",
"map_manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define Foursquare Credentials and Version"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: Q5SAY0XAYHJ2KXJ3AIRKQJ2IPWSWFCPR5FOA5OFWCBE2DEUF\n",
"CLIENT_SECRET:HK1XAI1VDMPCZWIXOUIUPVJ0ECGRR1OJTE0MEKZIBVRH5PGW\n"
]
}
],
"source": [
"CLIENT_ID = 'Q5SAY0XAYHJ2KXJ3AIRKQJ2IPWSWFCPR5FOA5OFWCBE2DEUF' #'your-client-ID' # your Foursquare ID\n",
"CLIENT_SECRET ='HK1XAI1VDMPCZWIXOUIUPVJ0ECGRR1OJTE0MEKZIBVRH5PGW' # 'your-client-secret' # 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": [
"#### Let's explore the first neighborhood in our dataframe."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's name."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'Marble Hill'"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data.loc[0, 'Neighborhood']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's latitude and longitude values."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n"
]
}
],
"source": [
"neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n",
"neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n",
"\n",
"neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create the GET request URL. Name your URL **url**."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/explore?&client_id=Q5SAY0XAYHJ2KXJ3AIRKQJ2IPWSWFCPR5FOA5OFWCBE2DEUF&client_secret=HK1XAI1VDMPCZWIXOUIUPVJ0ECGRR1OJTE0MEKZIBVRH5PGW&v=20180605&ll=40.87655077879964,-73.91065965862981&radius=500&limit=100'"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# type your answer here\n",
"url='https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius=500&limit=100'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude)\n",
"url\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"-->\n",
"\n",
"<!--\n",
"radius = 500 # define radius\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # create 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",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send the GET request and examine the resutls"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5ec73d8f1a4b0a001b81e373'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Marble Hill',\n",
" 'headerFullLocation': 'Marble Hill, New York',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 26,\n",
" 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n",
" 'lng': -73.90471933917806},\n",
" 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n",
" 'groups': [{'type': 'Recommended Places',\n",
" 'name': 'recommended',\n",
" 'items': [{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4429abf964a52037f225e3',\n",
" 'name': \"Arturo's\",\n",
" 'location': {'address': '5198 Broadway',\n",
" 'crossStreet': 'at 225th St.',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574},\n",
" {'label': 'entrance', 'lat': 40.874401, 'lng': -73.910339}],\n",
" 'distance': 240,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5198 Broadway (at 225th St.)',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n",
" 'name': 'Pizza Place',\n",
" 'pluralName': 'Pizza Places',\n",
" 'shortName': 'Pizza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '72548',\n",
" 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4baf59e8f964a520a6f93be3',\n",
" 'name': 'Bikram Yoga',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th Street',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528}],\n",
" 'distance': 376,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d102941735',\n",
" 'name': 'Yoga Studio',\n",
" 'pluralName': 'Yoga Studios',\n",
" 'shortName': 'Yoga Studio',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b79cc46f964a520c5122fe3',\n",
" 'name': 'Tibbett Diner',\n",
" 'location': {'address': '3033 Tibbett Ave',\n",
" 'crossStreet': 'btwn 230th & 231st',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402},\n",
" {'label': 'entrance', 'lat': 40.880388, 'lng': -73.90896}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d147941735',\n",
" 'name': 'Diner',\n",
" 'pluralName': 'Diners',\n",
" 'shortName': 'Diner',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f81cd2498ee903149fcc64',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'crossStreet': 'Kimberly Pl',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267}],\n",
" 'distance': 441,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f81cd2498ee903149fcc64-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b5357adf964a520319827e3',\n",
" 'name': \"Dunkin'\",\n",
" 'location': {'address': '5501 Broadway',\n",
" 'crossStreet': 'W 230th St',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411}],\n",
" 'distance': 342,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway (W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d148941735',\n",
" 'name': 'Donut Shop',\n",
" 'pluralName': 'Donut Shops',\n",
" 'shortName': 'Donuts',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b5357adf964a520319827e3-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b88e053f964a5208a1132e3',\n",
" 'name': 'Rite Aid',\n",
" 'location': {'address': '5237 Broadway',\n",
" 'crossStreet': '228th Street',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033}],\n",
" 'distance': 190,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5237 Broadway (228th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b88e053f964a5208a1132e3-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n",
" 'name': 'TCR The Club of Riverdale',\n",
" 'location': {'address': '2600 Netherland Ave',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678}],\n",
" 'distance': 402,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['2600 Netherland Ave',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n",
" 'name': 'Tennis Stadium',\n",
" 'pluralName': 'Tennis Stadiums',\n",
" 'shortName': 'Tennis',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '40358759'}},\n",
" 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c6af964a520b27236e3',\n",
" 'name': 'Land & Sea Restaurant',\n",
" 'location': {'address': '5535 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539},\n",
" {'label': 'entrance', 'lat': 40.877906, 'lng': -73.905722}],\n",
" 'distance': 429,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5535 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n",
" 'name': 'Seafood Restaurant',\n",
" 'pluralName': 'Seafood Restaurants',\n",
" 'shortName': 'Seafood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c6af964a520b27236e3-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '57655be738faa66160da7527',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '50 W 225th St',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668},\n",
" {'label': 'entrance', 'lat': 40.873502, 'lng': -73.907986}],\n",
" 'distance': 355,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['50 W 225th St',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-57655be738faa66160da7527-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4cf6ae55d3a8a1cd71a9d243',\n",
" 'name': 'Astral Fitness & Wellness Center',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th St',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373},\n",
" {'label': 'entrance', 'lat': 40.87685, 'lng': -73.906058}],\n",
" 'distance': 361,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '75803748'}},\n",
" 'referralId': 'e-0-4cf6ae55d3a8a1cd71a9d243-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f751ca498eacc0307d1cfe',\n",
" 'name': 'Blink Fitness',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'crossStreet': 'at W 230th St',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075}],\n",
" 'distance': 433,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Kingsbridge',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway (at W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f751ca498eacc0307d1cfe-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5631194e498e2de074de661c',\n",
" 'name': 'Vitamin Shoppe',\n",
" 'location': {'address': '5510 Broadway',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632},\n",
" {'label': 'entrance', 'lat': 40.877165, 'lng': -73.905673}],\n",
" 'distance': 428,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5510 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n",
" 'name': 'Supplement Shop',\n",
" 'pluralName': 'Supplement Shops',\n",
" 'shortName': 'Supplement Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5631194e498e2de074de661c-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dfe40df8877333e195b68fc',\n",
" 'name': 'Parrilla Latina',\n",
" 'location': {'address': '230th St & Broadway',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568}],\n",
" 'distance': 399,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['230th St & Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n",
" 'name': 'Steakhouse',\n",
" 'pluralName': 'Steakhouses',\n",
" 'shortName': 'Steakhouse',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dfe40df8877333e195b68fc-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '546d31ca498e561c698a0320',\n",
" 'name': 'T.J. Maxx',\n",
" 'location': {'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168}],\n",
" 'distance': 478,\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n",
" 'name': 'Department Store',\n",
" 'pluralName': 'Department Stores',\n",
" 'shortName': 'Department Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-546d31ca498e561c698a0320-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '585c205665e7c70a2f1055ea',\n",
" 'name': 'Boston Market',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d14e941735',\n",
" 'name': 'American Restaurant',\n",
" 'pluralName': 'American Restaurants',\n",
" 'shortName': 'American',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-585c205665e7c70a2f1055ea-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4f7b65f964a5205a0827e3',\n",
" 'name': 'Subway Sandwiches',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637}],\n",
" 'distance': 228,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4f7b65f964a5205a0827e3-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n",
" 'name': 'Baskin-Robbins',\n",
" 'location': {'address': '5501 Broadway',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622},\n",
" {'label': 'entrance', 'lat': 40.877129, 'lng': -73.906608}],\n",
" 'distance': 343,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n",
" 'name': 'Ice Cream Shop',\n",
" 'pluralName': 'Ice Cream Shops',\n",
" 'shortName': 'Ice Cream',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n",
" 'name': 'Lot Less Closeouts',\n",
" 'location': {'address': '5545 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604},\n",
" {'label': 'entrance', 'lat': 40.87828, 'lng': -73.905466}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5545 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-17'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9f030af964a520eb0f37e3',\n",
" 'name': 'GameStop',\n",
" 'location': {'address': '90 W 225th St Ste A-B',\n",
" 'crossStreet': 'btw Broadway & Exterior St.',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803}],\n",
" 'distance': 277,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10b951735',\n",
" 'name': 'Video Game Store',\n",
" 'pluralName': 'Video Game Stores',\n",
" 'shortName': 'Video Games',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9f030af964a520eb0f37e3-18'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ec68016cc21b428e1d2060a',\n",
" 'name': 'TD Bank',\n",
" 'location': {'address': '281 W 230th St',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856},\n",
" {'label': 'entrance', 'lat': 40.879414, 'lng': -73.909311}],\n",
" 'distance': 347,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['281 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10a951735',\n",
" 'name': 'Bank',\n",
" 'pluralName': 'Banks',\n",
" 'shortName': 'Bank',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/financial_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ec68016cc21b428e1d2060a-19'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5549 Broadway',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437},\n",
" {'label': 'entrance', 'lat': 40.878473, 'lng': -73.905329}],\n",
" 'distance': 482,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5549 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-20'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n",
" 'name': \"The Children's Place\",\n",
" 'location': {'address': '44 W 225th St',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166}],\n",
" 'distance': 383,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['44 W 225th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d105951735',\n",
" 'name': 'Kids Store',\n",
" 'pluralName': 'Kids Stores',\n",
" 'shortName': 'Kids Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-21'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56229ff8498e2abb44b6f12b',\n",
" 'name': 'Five Below',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384}],\n",
" 'distance': 487,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ff941735',\n",
" 'name': 'Miscellaneous Shop',\n",
" 'pluralName': 'Miscellaneous Shops',\n",
" 'shortName': 'Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-22'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d0a529133d6b60cf4cf9985',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263}],\n",
" 'distance': 463,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d0a529133d6b60cf4cf9985-23'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '53319bb511d2ef06787f02b4',\n",
" 'name': 'Broadway Plaza',\n",
" 'location': {'address': '171 W 231st St',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178}],\n",
" 'distance': 456,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 231st St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd941735',\n",
" 'name': 'Shopping Mall',\n",
" 'pluralName': 'Shopping Malls',\n",
" 'shortName': 'Mall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mall_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-53319bb511d2ef06787f02b4-24'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n",
" 'name': 'Terrace View Delicatessen',\n",
" 'location': {'address': '135 Terrace View Ave.',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151},\n",
" {'label': 'entrance', 'lat': 40.875964, 'lng': -73.912985}],\n",
" 'distance': 218,\n",
" 'postalCode': '10034',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['135 Terrace View Ave.',\n",
" 'New York, NY 10034',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d146941735',\n",
" 'name': 'Deli / Bodega',\n",
" 'pluralName': 'Delis / Bodegas',\n",
" 'shortName': 'Deli / Bodega',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-25'}]}]}}"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the Foursquare lab in the previous module, we know that all the information is in the *items* key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are ready to clean the json and structure it into a *pandas* dataframe."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead\n",
" This is separate from the ipykernel package so we can avoid doing imports until\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>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Arturo's</td>\n",
" <td>Pizza Place</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bikram Yoga</td>\n",
" <td>Yoga Studio</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Tibbett Diner</td>\n",
" <td>Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Starbucks</td>\n",
" <td>Coffee Shop</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Dunkin'</td>\n",
" <td>Donut Shop</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories lat lng\n",
"0 Arturo's Pizza Place 40.874412 -73.910271\n",
"1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n",
"2 Tibbett Diner Diner 40.880404 -73.908937\n",
"3 Starbucks Coffee Shop 40.877531 -73.905582\n",
"4 Dunkin' Donut Shop 40.877136 -73.906666"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['groups'][0]['items']\n",
" \n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n",
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And how many venues were returned by Foursquare?"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"26 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item2'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Explore Neighborhoods in Manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan"
]
},
{
"cell_type": "code",
"execution_count": 32,
"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",
" LIMIT)\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",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now write the code to run the above function on each neighborhood and create a new dataframe called *manhattan_venues*."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Marble Hill\n",
"Chinatown\n",
"Washington Heights\n",
"Inwood\n",
"Hamilton Heights\n",
"Manhattanville\n",
"Central Harlem\n",
"East Harlem\n",
"Upper East Side\n",
"Yorkville\n",
"Lenox Hill\n",
"Roosevelt Island\n",
"Upper West Side\n",
"Lincoln Square\n",
"Clinton\n",
"Midtown\n",
"Murray Hill\n",
"Chelsea\n",
"Greenwich Village\n",
"East Village\n",
"Lower East Side\n",
"Tribeca\n",
"Little Italy\n",
"Soho\n",
"West Village\n",
"Manhattan Valley\n",
"Morningside Heights\n",
"Gramercy\n",
"Battery Park City\n",
"Financial District\n",
"Carnegie Hill\n",
"Noho\n",
"Civic Center\n",
"Midtown South\n",
"Sutton Place\n",
"Turtle Bay\n",
"Tudor City\n",
"Stuyvesant Town\n",
"Flatiron\n",
"Hudson Yards\n"
]
}
],
"source": [
"# type your answer here\n",
"LIMIT =100\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's check the size of the resulting dataframe"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3062, 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>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Arturo's</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Bikram Yoga</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" <td>Yoga Studio</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Tibbett Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" <td>Diner</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Starbucks</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Dunkin'</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" <td>Donut Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"0 Marble Hill 40.876551 -73.91066 Arturo's \n",
"1 Marble Hill 40.876551 -73.91066 Bikram Yoga \n",
"2 Marble Hill 40.876551 -73.91066 Tibbett Diner \n",
"3 Marble Hill 40.876551 -73.91066 Starbucks \n",
"4 Marble Hill 40.876551 -73.91066 Dunkin' \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 40.874412 -73.910271 Pizza Place \n",
"1 40.876844 -73.906204 Yoga Studio \n",
"2 40.880404 -73.908937 Diner \n",
"3 40.877531 -73.905582 Coffee Shop \n",
"4 40.877136 -73.906666 Donut Shop "
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(manhattan_venues.shape)\n",
"manhattan_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>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>Battery Park City</th>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carnegie Hill</th>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Central Harlem</th>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chelsea</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinatown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Civic Center</th>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clinton</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Harlem</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Financial District</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Flatiron</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gramercy</th>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greenwich Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hamilton Heights</th>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" <td>61</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hudson Yards</th>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Inwood</th>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lenox Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lincoln Square</th>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Little Italy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lower East Side</th>\n",
" <td>47</td>\n",
" <td>47</td>\n",
" <td>47</td>\n",
" <td>47</td>\n",
" <td>47</td>\n",
" <td>47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Valley</th>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattanville</th>\n",
" <td>48</td>\n",
" <td>48</td>\n",
" <td>48</td>\n",
" <td>48</td>\n",
" <td>48</td>\n",
" <td>48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marble Hill</th>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" <td>26</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown South</th>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" <td>96</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Morningside Heights</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Murray Hill</th>\n",
" <td>76</td>\n",
" <td>76</td>\n",
" <td>76</td>\n",
" <td>76</td>\n",
" <td>76</td>\n",
" <td>76</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Noho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roosevelt Island</th>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soho</th>\n",
" <td>81</td>\n",
" <td>81</td>\n",
" <td>81</td>\n",
" <td>81</td>\n",
" <td>81</td>\n",
" <td>81</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Stuyvesant Town</th>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sutton Place</th>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" <td>97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tribeca</th>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" <td>69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tudor City</th>\n",
" <td>74</td>\n",
" <td>74</td>\n",
" <td>74</td>\n",
" <td>74</td>\n",
" <td>74</td>\n",
" <td>74</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Turtle Bay</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper East Side</th>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper West Side</th>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Washington Heights</th>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yorkville</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"Neighborhood \n",
"Battery Park City 63 63 63 \n",
"Carnegie Hill 85 85 85 \n",
"Central Harlem 46 46 46 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 88 88 88 \n",
"Clinton 100 100 100 \n",
"East Harlem 42 42 42 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 78 78 78 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 61 61 61 \n",
"Hudson Yards 58 58 58 \n",
"Inwood 59 59 59 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 97 97 97 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 47 47 47 \n",
"Manhattan Valley 40 40 40 \n",
"Manhattanville 48 48 48 \n",
"Marble Hill 26 26 26 \n",
"Midtown 100 100 100 \n",
"Midtown South 96 96 96 \n",
"Morningside Heights 42 42 42 \n",
"Murray Hill 76 76 76 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 24 24 24 \n",
"Soho 81 81 81 \n",
"Stuyvesant Town 17 17 17 \n",
"Sutton Place 97 97 97 \n",
"Tribeca 69 69 69 \n",
"Tudor City 74 74 74 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 88 88 88 \n",
"Upper West Side 72 72 72 \n",
"Washington Heights 88 88 88 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"Neighborhood \n",
"Battery Park City 63 63 63 \n",
"Carnegie Hill 85 85 85 \n",
"Central Harlem 46 46 46 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 88 88 88 \n",
"Clinton 100 100 100 \n",
"East Harlem 42 42 42 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 78 78 78 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 61 61 61 \n",
"Hudson Yards 58 58 58 \n",
"Inwood 59 59 59 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 97 97 97 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 47 47 47 \n",
"Manhattan Valley 40 40 40 \n",
"Manhattanville 48 48 48 \n",
"Marble Hill 26 26 26 \n",
"Midtown 100 100 100 \n",
"Midtown South 96 96 96 \n",
"Morningside Heights 42 42 42 \n",
"Murray Hill 76 76 76 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 24 24 24 \n",
"Soho 81 81 81 \n",
"Stuyvesant Town 17 17 17 \n",
"Sutton Place 97 97 97 \n",
"Tribeca 69 69 69 \n",
"Tudor City 74 74 74 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 88 88 88 \n",
"Upper West Side 72 72 72 \n",
"Washington Heights 88 88 88 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's find out how many unique categories can be curated from all the returned venues"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 332 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item3'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Analyze Each Neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>College Theater</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cultural Center</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Egyptian Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Service</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Financial or Legal Service</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kids Store</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Mac &amp; Cheese Joint</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mattress Store</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Mini Golf</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoor Supply Store</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pedestrian Plaza</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Studio</th>\n",
" <th>Physical Therapist</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pier</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Soccer Field</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>South Indian Restaurant</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Spiritual Center</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Sri Lankan Restaurant</th>\n",
" <th>Stables</th>\n",
" <th>Steakhouse</th>\n",
" <th>Street Art</th>\n",
" <th>Strip Club</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Swiss Restaurant</th>\n",
" <th>Szechuan Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tattoo Parlor</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Temple</th>\n",
" <th>Tennis Court</th>\n",
" <th>Tennis Stadium</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Park Ride / Attraction</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tiki Bar</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Track</th>\n",
" <th>Trail</th>\n",
" <th>Train Station</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Udon Restaurant</th>\n",
" <th>Used Bookstore</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Veterinarian</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Volleyball Court</th>\n",
" <th>Waterfront</th>\n",
" <th>Whisky Bar</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble 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>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",
" <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",
" <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",
" <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",
" <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",
" <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",
" <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>Marble 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>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",
" <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",
" <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",
" <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",
" <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",
" <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",
" <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",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble 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>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",
" <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",
" <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",
" <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",
" <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",
" <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",
" <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>Marble 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>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",
" <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",
" <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",
" <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",
" <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",
" <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",
" <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>Marble 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>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",
" <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",
" <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",
" <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",
" <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",
" <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",
" <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",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Marble Hill 0 0 0 \n",
"1 Marble Hill 0 0 0 \n",
"2 Marble Hill 0 0 0 \n",
"3 Marble Hill 0 0 0 \n",
"4 Marble Hill 0 0 0 \n",
"\n",
" African Restaurant American Restaurant Antique Shop Arcade \\\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",
" Arepa Restaurant Argentinian Restaurant Art Gallery Art Museum \\\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",
" Arts & Crafts Store Asian Restaurant Athletics & Sports Auditorium \\\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",
" Australian Restaurant Austrian Restaurant BBQ Joint Baby Store \\\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",
" Bagel Shop Bakery Bank Bar Baseball Field Basketball Court \\\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 0 0 \n",
"\n",
" Basketball Stadium Beer Bar Beer Garden Beer Store \\\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",
" Bike Rental / Bike Share Bike Shop Bike Trail Bistro Board Shop \\\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",
" Boat or Ferry Bookstore Boutique Boxing Gym Brazilian 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",
" Breakfast Spot Bridal Shop Bridge Bubble Tea Shop Building \\\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",
" Burger Joint Burrito Place Bus Line Bus Station Bus Stop Butcher \\\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 0 0 \n",
"\n",
" Cafeteria Café Cambodian Restaurant Camera Store Candy Store \\\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",
" Cantonese Restaurant Caribbean Restaurant Caucasian Restaurant \\\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",
" Cheese Shop Chinese Restaurant Chocolate Shop Circus Climbing Gym \\\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",
" Clothing Store Club House Cocktail Bar Coffee Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 1 \n",
"4 0 0 0 0 \n",
"\n",
" College Academic Building College Arts Building College Bookstore \\\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",
" College Cafeteria College Theater Comedy Club Community 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",
" Concert Hall Convenience Store Cooking School Cosmetics Shop \\\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",
" Coworking Space Creperie Cuban Restaurant Cultural Center Cupcake Shop \\\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",
" Cycle Studio Czech Restaurant Dance Studio Daycare Deli / Bodega \\\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",
" Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 1 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Doctor's Office Dog Run Donut Shop Drugstore Dry Cleaner \\\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 1 0 0 \n",
"\n",
" Dumpling Restaurant Duty-free Shop Eastern European Restaurant \\\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",
" Egyptian Restaurant Electronics Store Empanada Restaurant \\\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",
" English Restaurant Ethiopian Restaurant Event Service Event Space \\\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",
" Exhibit Falafel Restaurant Farmers Market Fast Food 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",
" Filipino Restaurant Financial or Legal Service Fish Market Flea Market \\\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",
" Flower Shop Food Food & Drink Shop Food Court Food Truck Fountain \\\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 0 0 \n",
"\n",
" French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\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",
" Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station \\\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",
" Gastropub Gay Bar General Entertainment German Restaurant Gift Shop \\\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",
" Golf Course Gourmet Shop Greek Restaurant Grocery Store Gym \\\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",
" Gym / Fitness Center Gym Pool Gymnastics Gym Harbor / Marina \\\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",
" Hardware Store Hawaiian Restaurant Health & Beauty Service \\\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",
" Health Food Store Heliport High School Historic Site History Museum \\\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",
" Hobby Shop Hookah Bar Hostel Hot Dog Joint Hotel Hotel 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 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Hotpot Restaurant Ice Cream Shop Indian Restaurant Indie Movie Theater \\\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",
" Indie Theater Irish Pub Israeli Restaurant 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",
" Japanese Curry Restaurant Japanese Restaurant Jazz Club Jewelry Store \\\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",
" Jewish Restaurant Juice Bar Karaoke Bar Kids Store \\\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",
" Kitchen Supply Store Korean Restaurant Kosher Restaurant \\\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",
" Latin American Restaurant Laundry Service Lebanese Restaurant Library \\\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",
" Lingerie Store Liquor Store Lounge Mac & Cheese Joint Malay 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",
" Market Martial Arts Dojo Massage Studio Mattress Store Medical Center \\\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",
" Mediterranean Restaurant Memorial Site Men's Store Metro Station \\\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",
" Mexican Restaurant Middle Eastern Restaurant Mini Golf \\\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",
" Miscellaneous Shop Mobile Phone Shop Modern European Restaurant \\\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",
" Molecular Gastronomy Restaurant Monument / Landmark Moroccan Restaurant \\\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",
" Movie Theater Museum Music School Music Venue Nail Salon \\\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",
" New American Restaurant Newsstand Nightclub Non-Profit Noodle House \\\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",
" North Indian Restaurant Office Opera House Optical Shop \\\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",
" Organic Grocery Other Great Outdoors Outdoor Sculpture \\\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",
" Outdoor Supply Store Outdoors & Recreation Paella Restaurant \\\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",
" Paper / Office Supplies Store Park Pedestrian Plaza \\\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",
" Performing Arts Venue Persian Restaurant Peruvian Restaurant Pet Café \\\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",
" Pet Service Pet Store Pharmacy Photography Studio Physical Therapist \\\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",
" Pie Shop Pier Pilates Studio Pizza Place Playground Plaza Poke Place \\\n",
"0 0 0 0 1 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" Pool Pub Public Art Ramen Restaurant Record Shop Rental Car Location \\\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 0 0 \n",
"\n",
" Residential Building (Apartment / Condo) Resort Rest Area 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",
" River Rock Club Roof Deck Russian Restaurant Sake Bar Salad Place \\\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 0 0 \n",
"\n",
" Salon / Barbershop Sandwich Place Scandinavian Restaurant \\\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",
" Scenic Lookout School Sculpture Garden Seafood 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",
" Shanghai Restaurant Shipping Store Shoe Store Shopping Mall Skate Park \\\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",
" Smoke Shop Snack Place Soba Restaurant Soccer Field Soup Place \\\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",
" South American Restaurant South Indian Restaurant \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
" Southern / Soul Food Restaurant Spa Spanish Restaurant Speakeasy \\\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",
" Spiritual Center Sporting Goods Shop Sports Bar Sports Club \\\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",
" Sri Lankan Restaurant Stables Steakhouse Street Art Strip Club \\\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",
" Supermarket Supplement Shop Sushi Restaurant Swiss 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",
" Szechuan Restaurant Taco Place Tailor Shop Taiwanese 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",
" Tapas Restaurant Tattoo Parlor Tea Room Tech Startup Temple \\\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",
" Tennis Court Tennis Stadium Thai Restaurant Theater \\\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",
" Theme Park Ride / Attraction Thrift / Vintage Store Tiki Bar \\\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",
" Tourist Information Center Toy / Game Store Track Trail Train Station \\\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",
" Turkish Restaurant Udon Restaurant Used Bookstore \\\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",
" Vegetarian / Vegan Restaurant Veterinarian Video Game Store Video Store \\\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",
" Vietnamese Restaurant Volleyball Court Waterfront Whisky Bar Wine Bar \\\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",
" Wine Shop Wings Joint Women's Store Yoga Studio \n",
"0 0 0 0 0 \n",
"1 0 0 0 1 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# one hot encoding\n",
"manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
"# add neighborhood column back to dataframe\n",
"manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n",
"\n",
"# move neighborhood column to the first column\n",
"fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n",
"manhattan_onehot = manhattan_onehot[fixed_columns]\n",
"\n",
"manhattan_onehot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's examine the new dataframe size."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(3062, 333)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_onehot.shape"
]
},
{
"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": 40,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>College Theater</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cultural Center</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Egyptian Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Service</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Fil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment