Skip to content

Instantly share code, notes, and snippets.

@alfredo-g-zapiola
Created March 19, 2019 19:29
Show Gist options
  • Save alfredo-g-zapiola/3faf467769868e920d80e2d52c2999b0 to your computer and use it in GitHub Desktop.
Save alfredo-g-zapiola/3faf467769868e920d80e2d52c2999b0 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"FINAL PART: K MEANS CLUSTERING FOR COFFEE SHOPS IN TORONTO\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>PostalCode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Malvern,Rouge</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek,Rouge Hill,Port Union</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Morningside,Guildwood,West Hill</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>5</td>\n",
" <td>M1J</td>\n",
" <td>Scarborough</td>\n",
" <td>Scarborough Village</td>\n",
" <td>43.744734</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>6</td>\n",
" <td>M1K</td>\n",
" <td>Scarborough</td>\n",
" <td>Ionview,Kennedy Park,East Birchmount Park</td>\n",
" <td>43.727929</td>\n",
" <td>-79.262029</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>7</td>\n",
" <td>M1L</td>\n",
" <td>Scarborough</td>\n",
" <td>Golden Mile,Clairlea,Oakridge</td>\n",
" <td>43.711112</td>\n",
" <td>-79.284577</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>8</td>\n",
" <td>M1M</td>\n",
" <td>Scarborough</td>\n",
" <td>Cliffside,Scarborough Village West,Cliffcrest</td>\n",
" <td>43.716316</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>9</td>\n",
" <td>M1N</td>\n",
" <td>Scarborough</td>\n",
" <td>Cliffside West,Birch Cliff</td>\n",
" <td>43.692657</td>\n",
" <td>-79.264848</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>10</td>\n",
" <td>M1P</td>\n",
" <td>Scarborough</td>\n",
" <td>Scarborough Town Centre,Wexford Heights,Dorset...</td>\n",
" <td>43.757410</td>\n",
" <td>-79.273304</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>11</td>\n",
" <td>M1R</td>\n",
" <td>Scarborough</td>\n",
" <td>Wexford,Maryvale</td>\n",
" <td>43.750071</td>\n",
" <td>-79.295849</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>12</td>\n",
" <td>M1S</td>\n",
" <td>Scarborough</td>\n",
" <td>Agincourt</td>\n",
" <td>43.794200</td>\n",
" <td>-79.262029</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>13</td>\n",
" <td>M1T</td>\n",
" <td>Scarborough</td>\n",
" <td>Sullivan,Clarks Corners,Tam O'Shanter</td>\n",
" <td>43.781638</td>\n",
" <td>-79.304302</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>14</td>\n",
" <td>M1V</td>\n",
" <td>Scarborough</td>\n",
" <td>Agincourt North,Steeles East,L'Amoreaux East,M...</td>\n",
" <td>43.815252</td>\n",
" <td>-79.284577</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>15</td>\n",
" <td>M1W</td>\n",
" <td>Scarborough</td>\n",
" <td>L'Amoreaux West,Steeles West</td>\n",
" <td>43.799525</td>\n",
" <td>-79.318389</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>16</td>\n",
" <td>M1X</td>\n",
" <td>Scarborough</td>\n",
" <td>Upper Rouge</td>\n",
" <td>43.836125</td>\n",
" <td>-79.205636</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>17</td>\n",
" <td>M2H</td>\n",
" <td>North York</td>\n",
" <td>Hillcrest Village</td>\n",
" <td>43.803762</td>\n",
" <td>-79.363452</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>18</td>\n",
" <td>M2J</td>\n",
" <td>North York</td>\n",
" <td>Fairview,Oriole,Henry Farm</td>\n",
" <td>43.778517</td>\n",
" <td>-79.346556</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>19</td>\n",
" <td>M2K</td>\n",
" <td>North York</td>\n",
" <td>Bayview Village</td>\n",
" <td>43.786947</td>\n",
" <td>-79.385975</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 PostalCode Borough \\\n",
"0 0 M1B Scarborough \n",
"1 1 M1C Scarborough \n",
"2 2 M1E Scarborough \n",
"3 3 M1G Scarborough \n",
"4 4 M1H Scarborough \n",
"5 5 M1J Scarborough \n",
"6 6 M1K Scarborough \n",
"7 7 M1L Scarborough \n",
"8 8 M1M Scarborough \n",
"9 9 M1N Scarborough \n",
"10 10 M1P Scarborough \n",
"11 11 M1R Scarborough \n",
"12 12 M1S Scarborough \n",
"13 13 M1T Scarborough \n",
"14 14 M1V Scarborough \n",
"15 15 M1W Scarborough \n",
"16 16 M1X Scarborough \n",
"17 17 M2H North York \n",
"18 18 M2J North York \n",
"19 19 M2K North York \n",
"\n",
" Neighbourhood Latitude Longitude \n",
"0 Malvern,Rouge 43.806686 -79.194353 \n",
"1 Highland Creek,Rouge Hill,Port Union 43.784535 -79.160497 \n",
"2 Morningside,Guildwood,West Hill 43.763573 -79.188711 \n",
"3 Woburn 43.770992 -79.216917 \n",
"4 Cedarbrae 43.773136 -79.239476 \n",
"5 Scarborough Village 43.744734 -79.239476 \n",
"6 Ionview,Kennedy Park,East Birchmount Park 43.727929 -79.262029 \n",
"7 Golden Mile,Clairlea,Oakridge 43.711112 -79.284577 \n",
"8 Cliffside,Scarborough Village West,Cliffcrest 43.716316 -79.239476 \n",
"9 Cliffside West,Birch Cliff 43.692657 -79.264848 \n",
"10 Scarborough Town Centre,Wexford Heights,Dorset... 43.757410 -79.273304 \n",
"11 Wexford,Maryvale 43.750071 -79.295849 \n",
"12 Agincourt 43.794200 -79.262029 \n",
"13 Sullivan,Clarks Corners,Tam O'Shanter 43.781638 -79.304302 \n",
"14 Agincourt North,Steeles East,L'Amoreaux East,M... 43.815252 -79.284577 \n",
"15 L'Amoreaux West,Steeles West 43.799525 -79.318389 \n",
"16 Upper Rouge 43.836125 -79.205636 \n",
"17 Hillcrest Village 43.803762 -79.363452 \n",
"18 Fairview,Oriole,Henry Farm 43.778517 -79.346556 \n",
"19 Bayview Village 43.786947 -79.385975 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"df = pd.read_csv('TorontoZipLATLONG.csv')\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"#!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"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.cluster import KMeans\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",
"from geopy.geocoders import Nominatim\n",
"import json\n",
"from pandas.io.json import json_normalize"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjcwMjc4LC03OS4zODY2NjddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2QwMjAwM2JiMmM3YzRkNzM5N2VhMDc3NmJmOGFiYjBlID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f13c4b0c668>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of ONTARIO using latitude and longitude values\n",
"latitude = 43.670278\n",
"longitude = -79.386667\n",
"map_on= folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"map_on"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjcwMjc4LC03OS4zODY2NjddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2QwMjAwM2JiMmM3YzRkNzM5N2VhMDc3NmJmOGFiYjBlID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNDIwZDYyNDAzY2I0NTAzYTgzM2MwZjkzYjFiOWE2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjMsLTc5LjE5NDM1MzQwMDAwMDAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyZTU4NGUxMzQ1ZTRjMGI5MjU4ZjY5Y2NlNmE0NWNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3NjJiM2FiMzMwODQ1NzA4MmE5ZWYzZWI3YzYwNDI1ID0gJCgnPGRpdiBpZD0iaHRtbF9mNzYyYjNhYjMzMDg0NTcwODJhOWVmM2ViN2M2MDQyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFCPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmU1ODRlMTM0NWU0YzBiOTI1OGY2OWNjZTZhNDVjYi5zZXRDb250ZW50KGh0bWxfZjc2MmIzYWIzMzA4NDU3MDgyYTllZjNlYjdjNjA0MjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzQyMGQ2MjQwM2NiNDUwM2E4MzNjMGY5M2IxYjlhNmEuYmluZFBvcHVwKHBvcHVwXzYyZTU4NGUxMzQ1ZTRjMGI5MjU4ZjY5Y2NlNmE0NWNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwMWRhM2I0YWU3YzQ3NDVhYWFlOTg3MzU4YWViZTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg0NTM1MSwtNzkuMTYwNDk3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTgyOTYyZjBkNzY0NGE3Zjg0OGUxNTEzZTFhY2ViYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODhiNzA2ZTU3MWU3NDMwMjllODI4NjE2NTk3Mzc0YWQgPSAkKCc8ZGl2IGlkPSJodG1sXzg4YjcwNmU1NzFlNzQzMDI5ZTgyODYxNjU5NzM3NGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4Mjk2MmYwZDc2NDRhN2Y4NDhlMTUxM2UxYWNlYmM5LnNldENvbnRlbnQoaHRtbF84OGI3MDZlNTcxZTc0MzAyOWU4Mjg2MTY1OTczNzRhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDFkYTNiNGFlN2M0NzQ1YWFhZTk4NzM1OGFlYmU1ZC5iaW5kUG9wdXAocG9wdXBfNTgyOTYyZjBkNzY0NGE3Zjg0OGUxNTEzZTFhY2ViYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE0MzNkZjkzNDYyNGY4OWI5NTlmMjdlYjM1MGFmZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjM1NzI2LC03OS4xODg3MTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMWZhMzRlM2Y2NDRmNzhhYTQ2ZWRjMWI2OWFlYmEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5NDZlODJjNWM5MjRlZjJhMDcxMmIxZjQ0NjFjYjRhID0gJCgnPGRpdiBpZD0iaHRtbF8zOTQ2ZTgyYzVjOTI0ZWYyYTA3MTJiMWY0NDYxY2I0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTFmYTM0ZTNmNjQ0Zjc4YWE0NmVkYzFiNjlhZWJhMi5zZXRDb250ZW50KGh0bWxfMzk0NmU4MmM1YzkyNGVmMmEwNzEyYjFmNDQ2MWNiNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTE0MzNkZjkzNDYyNGY4OWI5NTlmMjdlYjM1MGFmZGIuYmluZFBvcHVwKHBvcHVwXzkxMWZhMzRlM2Y2NDRmNzhhYTQ2ZWRjMWI2OWFlYmEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyYjQxZTU2MmI1MzQzOGU4MGI0Y2M4NzJkMzkyNmIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzcwOTkyMSwtNzkuMjE2OTE3NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTEyZjZiZTI0Zjc0NGIxNThhNDUyNzA1OTA4NzBkNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjcwNTg0MDkxYTVkNDVhN2FmYjhiOWIxZDgzN2VhZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3MDU4NDA5MWE1ZDQ1YTdhZmI4YjliMWQ4MzdlYWQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMUc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExMmY2YmUyNGY3NDRiMTU4YTQ1MjcwNTkwODcwZDZiLnNldENvbnRlbnQoaHRtbF9mNzA1ODQwOTFhNWQ0NWE3YWZiOGI5YjFkODM3ZWFkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MmI0MWU1NjJiNTM0MzhlODBiNGNjODcyZDM5MjZiMC5iaW5kUG9wdXAocG9wdXBfYTEyZjZiZTI0Zjc0NGIxNThhNDUyNzA1OTA4NzBkNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGEyMjdiYmQyODA1NGVkN2E0ZWEwMzVhZTk0OTZiMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzMxMzYsLTc5LjIzOTQ3NjA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5ZjNlMTEyYTUwMzQ1YWU5YzU3MDU5ZDEzZTM1OWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmNDViNDVlMjZjYzQzN2RhN2I4YzZiZjJiYjczODgxID0gJCgnPGRpdiBpZD0iaHRtbF9jZjQ1YjQ1ZTI2Y2M0MzdkYTdiOGM2YmYyYmI3Mzg4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFIPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOWYzZTExMmE1MDM0NWFlOWM1NzA1OWQxM2UzNTlmNC5zZXRDb250ZW50KGh0bWxfY2Y0NWI0NWUyNmNjNDM3ZGE3YjhjNmJmMmJiNzM4ODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGEyMjdiYmQyODA1NGVkN2E0ZWEwMzVhZTk0OTZiMGYuYmluZFBvcHVwKHBvcHVwXzI5ZjNlMTEyYTUwMzQ1YWU5YzU3MDU5ZDEzZTM1OWY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzM2Q4NzczZWE4NTRmNTlhNmFjZDY3Y2Y0MjY1MmM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzJhZTM3YWU4MzUxNDg5OWI1ZWJhNWQ2NjdhOGZlYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQ3NDk4YTk1MGNhNDllZWIzZjVkNzQ3N2E0YjI2MDYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0NzQ5OGE5NTBjYTQ5ZWViM2Y1ZDc0NzdhNGIyNjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMUo8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyYWUzN2FlODM1MTQ4OTliNWViYTVkNjY3YThmZWEwLnNldENvbnRlbnQoaHRtbF80NDc0OThhOTUwY2E0OWVlYjNmNWQ3NDc3YTRiMjYwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzNkODc3M2VhODU0ZjU5YTZhY2Q2N2NmNDI2NTJjNi5iaW5kUG9wdXAocG9wdXBfNzJhZTM3YWU4MzUxNDg5OWI1ZWJhNWQ2NjdhOGZlYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODk3OWY5NDA2ZWY5NGZlNjhiNjhjMmRjNjY1Zjg5YTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mjc5MjkyLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNWY2NjYyMDMwNmE0Y2IyYjgzNjY4NjVkYmY3MTdmNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81Mjk0ODNkMmIyM2U0MmZhOTI0ZGM3NDg3OGIxZGUwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTI5NDgzZDJiMjNlNDJmYTkyNGRjNzQ4NzhiMWRlMDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0xSzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzVmNjY2MjAzMDZhNGNiMmI4MzY2ODY1ZGJmNzE3Zjcuc2V0Q29udGVudChodG1sXzUyOTQ4M2QyYjIzZTQyZmE5MjRkYzc0ODc4YjFkZTA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5NzlmOTQwNmVmOTRmZTY4YjY4YzJkYzY2NWY4OWE4LmJpbmRQb3B1cChwb3B1cF8zNWY2NjYyMDMwNmE0Y2IyYjgzNjY4NjVkYmY3MTdmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZjEyZmU1MTY4NGM0ZGUwYmViZmRhNDhkMTFjNjFiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMTExMTcsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU2NDYwOGRmZjhhNGQzN2JiMTQ3OGEyOGY0NGVjY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q2ZWVlOWViNGVmNGNmMDhmYjFjOGMwMWViZDMxN2EgPSAkKCc8ZGl2IGlkPSJodG1sX2NkNmVlZTllYjRlZjRjZjA4ZmIxYzhjMDFlYmQzMTdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1NjQ2MDhkZmY4YTRkMzdiYjE0NzhhMjhmNDRlY2NjLnNldENvbnRlbnQoaHRtbF9jZDZlZWU5ZWI0ZWY0Y2YwOGZiMWM4YzAxZWJkMzE3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjEyZmU1MTY4NGM0ZGUwYmViZmRhNDhkMTFjNjFiMS5iaW5kUG9wdXAocG9wdXBfYzU2NDYwOGRmZjhhNGQzN2JiMTQ3OGEyOGY0NGVjY2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODcxNmQ2NGI5ZWQzNDFlOWE0ZGU0NTQwZDA4NWYxNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTYzMTYsLTc5LjIzOTQ3NjA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyNzEzZjEzZjc4MzRlNDM4ZTgzNTI5M2U1NzYxYjBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0YTk1YjExNjU2YjRiNmQ4YzU0OGVjNmQ3MjBlZmIzID0gJCgnPGRpdiBpZD0iaHRtbF81NGE5NWIxMTY1NmI0YjZkOGM1NDhlYzZkNzIwZWZiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjcxM2YxM2Y3ODM0ZTQzOGU4MzUyOTNlNTc2MWIwYi5zZXRDb250ZW50KGh0bWxfNTRhOTViMTE2NTZiNGI2ZDhjNTQ4ZWM2ZDcyMGVmYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODcxNmQ2NGI5ZWQzNDFlOWE0ZGU0NTQwZDA4NWYxNDkuYmluZFBvcHVwKHBvcHVwX2QyNzEzZjEzZjc4MzRlNDM4ZTgzNTI5M2U1NzYxYjBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0N2NjYWFiZWIwMDQ2NTViMjBkNWJkNmUyMWM4NjIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyNjU3LC03OS4yNjQ4NDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0ZmJmMjVhN2U1NjQ3ZjJhOGJhYTI5MWZjN2I3OWIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwMDcyM2M2NGNmODQwMmRiOWMxYzM5MDJmOGQ5YTVhID0gJCgnPGRpdiBpZD0iaHRtbF9kMDA3MjNjNjRjZjg0MDJkYjljMWMzOTAyZjhkOWE1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFOPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNGZiZjI1YTdlNTY0N2YyYThiYWEyOTFmYzdiNzliMi5zZXRDb250ZW50KGh0bWxfZDAwNzIzYzY0Y2Y4NDAyZGI5YzFjMzkwMmY4ZDlhNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODQ3Y2NhYWJlYjAwNDY1NWIyMGQ1YmQ2ZTIxYzg2MjAuYmluZFBvcHVwKHBvcHVwXzA0ZmJmMjVhN2U1NjQ3ZjJhOGJhYTI5MWZjN2I3OWIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5OTI5MDljZTc0ZjQ2MmY5YzhlMzIxMGVhMjVlZDM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDA5NiwtNzkuMjczMzA0MDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ4YTg2NmU2ZGY4NDc5ZjhkZWQyMGE1NzkzYzhmZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTQ4NzQwMjZiNGYxNDQ3ZDlmZDQwYzI4MTkyMzY4NTIgPSAkKCc8ZGl2IGlkPSJodG1sX2U0ODc0MDI2YjRmMTQ0N2Q5ZmQ0MGMyODE5MjM2ODUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMVA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0OGE4NjZlNmRmODQ3OWY4ZGVkMjBhNTc5M2M4ZmYyLnNldENvbnRlbnQoaHRtbF9lNDg3NDAyNmI0ZjE0NDdkOWZkNDBjMjgxOTIzNjg1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOTkyOTA5Y2U3NGY0NjJmOWM4ZTMyMTBlYTI1ZWQzNi5iaW5kUG9wdXAocG9wdXBfOTQ4YTg2NmU2ZGY4NDc5ZjhkZWQyMGE1NzkzYzhmZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjgxZmFmNzY2NDg3NDFiMWEwZWI1OGU3MDUyNDVjMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTAwNzE1LC03OS4yOTU4NDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjZTFkMDgwZDBjZTRiOGE5MGQ0M2RiNmQ5YjIxZTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1YmUwMTNiZmRjMzQ2YTA5ZTM0OTJlNmZkNmIyYjViID0gJCgnPGRpdiBpZD0iaHRtbF9mNWJlMDEzYmZkYzM0NmEwOWUzNDkyZTZmZDZiMmI1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFSPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2UxZDA4MGQwY2U0YjhhOTBkNDNkYjZkOWIyMWUxYy5zZXRDb250ZW50KGh0bWxfZjViZTAxM2JmZGMzNDZhMDllMzQ5MmU2ZmQ2YjJiNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjgxZmFmNzY2NDg3NDFiMWEwZWI1OGU3MDUyNDVjMjguYmluZFBvcHVwKHBvcHVwXzVjZTFkMDgwZDBjZTRiOGE5MGQ0M2RiNmQ5YjIxZTFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0OGFlOWRjZWFlMTRhMmI5MDhiYTkwM2RjMzEzYzc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzk0MjAwMywtNzkuMjYyMDI5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2ZmYjBmMTQ3MjBlNGNkNWI4NzBiY2I5ZTA2MTc0M2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2U1ZTgxNGM0M2M3NDM3N2FhZDllOGI5ZjMxMDYzNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzdlNWU4MTRjNDNjNzQzNzdhYWQ5ZThiOWYzMTA2MzRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmZmIwZjE0NzIwZTRjZDViODcwYmNiOWUwNjE3NDNlLnNldENvbnRlbnQoaHRtbF83ZTVlODE0YzQzYzc0Mzc3YWFkOWU4YjlmMzEwNjM0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NDhhZTlkY2VhZTE0YTJiOTA4YmE5MDNkYzMxM2M3OS5iaW5kUG9wdXAocG9wdXBfM2ZmYjBmMTQ3MjBlNGNkNWI4NzBiY2I5ZTA2MTc0M2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzEwY2U3YTcwNmM5NDk0NDhhYTQ0ODc3NzczOTc2ZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODE2Mzc1LC03OS4zMDQzMDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjZGRhZGM2ZDFlZTRiODU4MzJiM2Q5YjI1MDQ3MWY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkMGZmOWNjMDg5MDRlZDViMDQ2YWNjYjc0YzYyNmQ5ID0gJCgnPGRpdiBpZD0iaHRtbF81ZDBmZjljYzA4OTA0ZWQ1YjA0NmFjY2I3NGM2MjZkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2RkYWRjNmQxZWU0Yjg1ODMyYjNkOWIyNTA0NzFmNy5zZXRDb250ZW50KGh0bWxfNWQwZmY5Y2MwODkwNGVkNWIwNDZhY2NiNzRjNjI2ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzEwY2U3YTcwNmM5NDk0NDhhYTQ0ODc3NzczOTc2ZDAuYmluZFBvcHVwKHBvcHVwX2FjZGRhZGM2ZDFlZTRiODU4MzJiM2Q5YjI1MDQ3MWY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4NjUyMTc5MzZkZjRmYmQ5NjlhZjdjNGFjYTlkODZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODE1MjUyMiwtNzkuMjg0NTc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTdhOTdjMmVhZjk0NjUwOWI5YzFlNjFjMDIwZjY4NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzk1NDYwZjNmYTY0MjY4ODRjMGZjYzUxN2MzMWM1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWM5NTQ2MGYzZmE2NDI2ODg0YzBmY2M1MTdjMzFjNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0xVjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmU3YTk3YzJlYWY5NDY1MDliOWMxZTYxYzAyMGY2ODUuc2V0Q29udGVudChodG1sX2VjOTU0NjBmM2ZhNjQyNjg4NGMwZmNjNTE3YzMxYzU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4NjUyMTc5MzZkZjRmYmQ5NjlhZjdjNGFjYTlkODZjLmJpbmRQb3B1cChwb3B1cF9iZTdhOTdjMmVhZjk0NjUwOWI5YzFlNjFjMDIwZjY4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zODVjZTJlMWQyZmE0YjFjOGYwZGJjNGZmYmFhMzliMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAxLC03OS4zMTgzODg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjOWYxMWYxNWE5ODQ2NWRiOTFiMGE3MmMwZTliZjVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwOTBkOTY4N2Q2NjRkMGFhYjU1NTg2ODY0NjgwMGUxID0gJCgnPGRpdiBpZD0iaHRtbF81MDkwZDk2ODdkNjY0ZDBhYWI1NTU4Njg2NDY4MDBlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTFXPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YzlmMTFmMTVhOTg0NjVkYjkxYjBhNzJjMGU5YmY1ZS5zZXRDb250ZW50KGh0bWxfNTA5MGQ5Njg3ZDY2NGQwYWFiNTU1ODY4NjQ2ODAwZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg1Y2UyZTFkMmZhNGIxYzhmMGRiYzRmZmJhYTM5YjIuYmluZFBvcHVwKHBvcHVwXzVjOWYxMWYxNWE5ODQ2NWRiOTFiMGE3MmMwZTliZjVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5MWJiMzAzYTgwNzQ5NTZiMDZmMmZkNzQ0MTVmZTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODM2MTI0NzAwMDAwMDA2LC03OS4yMDU2MzYwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjczMGMyODBmYjA0YzBjOWY0MTM5NmI2OTZmMzZiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmJlNzdmZjVmYjg0MWE0YmI2ZWI3ZGE1YjgwNGNmZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZiZTc3ZmY1ZmI4NDFhNGJiNmViN2RhNWI4MDRjZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0xWDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Y3MzBjMjgwZmIwNGMwYzlmNDEzOTZiNjk2ZjM2YjUuc2V0Q29udGVudChodG1sXzE2YmU3N2ZmNWZiODQxYTRiYjZlYjdkYTViODA0Y2ZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5MWJiMzAzYTgwNzQ5NTZiMDZmMmZkNzQ0MTVmZTI2LmJpbmRQb3B1cChwb3B1cF8zZjczMGMyODBmYjA0YzBjOWY0MTM5NmI2OTZmMzZiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjI4YWY1OTkxMDQ0YTY3YmY1NjYzMTA5Y2I1MGEzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMzc2MjIsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODdkZWI5MzIzMTkzNDg0MjlmN2M5NjQwY2JlOTk3YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNThhNmU0Mjc0Mzc5NDdlMTg1MWFhNDE4MDc1OWFkNjkgPSAkKCc8ZGl2IGlkPSJodG1sXzU4YTZlNDI3NDM3OTQ3ZTE4NTFhYTQxODA3NTlhZDY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMkg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3ZGViOTMyMzE5MzQ4NDI5ZjdjOTY0MGNiZTk5N2FlLnNldENvbnRlbnQoaHRtbF81OGE2ZTQyNzQzNzk0N2UxODUxYWE0MTgwNzU5YWQ2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjI4YWY1OTkxMDQ0YTY3YmY1NjYzMTA5Y2I1MGEzNy5iaW5kUG9wdXAocG9wdXBfODdkZWI5MzIzMTkzNDg0MjlmN2M5NjQwY2JlOTk3YWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGExNzNkMGUwMTkxNDUwNWJmMTM2NDk1NWM1Y2M3MzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzg1MTc1LC03OS4zNDY1NTU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiMzI0NTU5Njk3MjRjZTNhZmQ0YTJlYTEwMmMyZTIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwYTE4MzgwM2M3MTQxNGRhNDdkZDgzNWUzNmUxZWZkID0gJCgnPGRpdiBpZD0iaHRtbF80MGExODM4MDNjNzE0MTRkYTQ3ZGQ4MzVlMzZlMWVmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTJKPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjMyNDU1OTY5NzI0Y2UzYWZkNGEyZWExMDJjMmUyMC5zZXRDb250ZW50KGh0bWxfNDBhMTgzODAzYzcxNDE0ZGE0N2RkODM1ZTM2ZTFlZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGExNzNkMGUwMTkxNDUwNWJmMTM2NDk1NWM1Y2M3MzcuYmluZFBvcHVwKHBvcHVwX2NiMzI0NTU5Njk3MjRjZTNhZmQ0YTJlYTEwMmMyZTIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5YTNjOWM0NjI0MTRkMDNiMDk3YWRiOWEzYjEyZDI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg2OTQ3MywtNzkuMzg1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4OTYyZDZjYmZjZTQxZGM5NmQ0NjRlNmQ2NmZlYThiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzNmI3ZmE0ZWQ4NDRhZjc5OGFjODBkODE5NmMyN2FjID0gJCgnPGRpdiBpZD0iaHRtbF9kMzZiN2ZhNGVkODQ0YWY3OThhYzgwZDgxOTZjMjdhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTJLPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODk2MmQ2Y2JmY2U0MWRjOTZkNDY0ZTZkNjZmZWE4Yi5zZXRDb250ZW50KGh0bWxfZDM2YjdmYTRlZDg0NGFmNzk4YWM4MGQ4MTk2YzI3YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDlhM2M5YzQ2MjQxNGQwM2IwOTdhZGI5YTNiMTJkMjcuYmluZFBvcHVwKHBvcHVwX2U4OTYyZDZjYmZjZTQxZGM5NmQ0NjRlNmQ2NmZlYThiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmYjg3MzU2OThhNDQ4YmE4M2I5ZDIyNDUxNDU3MzhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDkwMiwtNzkuMzc0NzE0MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzEyZGU5MTU4Njc5NDRhZmJkNjFjZDE3N2M2NmMwNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmFhYzY2NzdiNzY3NDU0ODkxZDFhM2E0NzJmZGExNDMgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhYWM2Njc3Yjc2NzQ1NDg5MWQxYTNhNDcyZmRhMTQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMkw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxMmRlOTE1ODY3OTQ0YWZiZDYxY2QxNzdjNjZjMDZhLnNldENvbnRlbnQoaHRtbF9mYWFjNjY3N2I3Njc0NTQ4OTFkMWEzYTQ3MmZkYTE0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZmI4NzM1Njk4YTQ0OGJhODNiOWQyMjQ1MTQ1NzM4Yy5iaW5kUG9wdXAocG9wdXBfNzEyZGU5MTU4Njc5NDRhZmJkNjFjZDE3N2M2NmMwNmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZkZDQ1ZmYwZWE4NGZjOWIwMzY3MDdmY2JlNmQzYmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODkwNTMsLTc5LjQwODQ5Mjc5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzMmM3ZjA0MWM3MTRiYzhiYWJmZGRiMjU4ZmU2MjljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzNzIxZDRhNmIwODQ4NDk4YWMyODg4NDJiMTA2ZTNkID0gJCgnPGRpdiBpZD0iaHRtbF8yMzcyMWQ0YTZiMDg0ODQ5OGFjMjg4ODQyYjEwNmUzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTJNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzJjN2YwNDFjNzE0YmM4YmFiZmRkYjI1OGZlNjI5Yy5zZXRDb250ZW50KGh0bWxfMjM3MjFkNGE2YjA4NDg0OThhYzI4ODg0MmIxMDZlM2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZkZDQ1ZmYwZWE4NGZjOWIwMzY3MDdmY2JlNmQzYmEuYmluZFBvcHVwKHBvcHVwXzgzMmM3ZjA0MWM3MTRiYzhiYWJmZGRiMjU4ZmU2MjljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyMGU3ZGM4MzY4YzQ5MjJhNTU1MDQzMjYzZDliMDM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzcwMTE5OSwtNzkuNDA4NDkyNzk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTMwY2RmM2UxNWJhNDZiMDllOWNjZDE3NTczNGJkYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQ1ZWY2ZGQyOGNiNDJiZGIyYzI3ZWY4NDkzOGY2NWYgPSAkKCc8ZGl2IGlkPSJodG1sX2M0NWVmNmRkMjhjYjQyYmRiMmMyN2VmODQ5MzhmNjVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NMk48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzMGNkZjNlMTViYTQ2YjA5ZTljY2QxNzU3MzRiZGExLnNldENvbnRlbnQoaHRtbF9jNDVlZjZkZDI4Y2I0MmJkYjJjMjdlZjg0OTM4ZjY1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjBlN2RjODM2OGM0OTIyYTU1NTA0MzI2M2Q5YjAzNi5iaW5kUG9wdXAocG9wdXBfYTMwY2RmM2UxNWJhNDZiMDllOWNjZDE3NTczNGJkYTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWE4MTJlODVlNzg3NDhjZThhMjQ2OTcwN2E3OTAyMTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTI3NTgzLC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyMjNjZTk3YzY5OTQxMzI4Zjg1ZGE0OTM4ZDUzOWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4NmY1ZTJhZDhhOTRhZjFiMDI0NDcwYzhmZTQ0ZGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8yODZmNWUyYWQ4YTk0YWYxYjAyNDQ3MGM4ZmU0NGRkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTJQPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjIzY2U5N2M2OTk0MTMyOGY4NWRhNDkzOGQ1MzlmYS5zZXRDb250ZW50KGh0bWxfMjg2ZjVlMmFkOGE5NGFmMWIwMjQ0NzBjOGZlNDRkZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWE4MTJlODVlNzg3NDhjZThhMjQ2OTcwN2E3OTAyMTkuYmluZFBvcHVwKHBvcHVwX2MyMjNjZTk3YzY5OTQxMzI4Zjg1ZGE0OTM4ZDUzOWZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkYTQ5ZGNmNTc2NjRhYjRhYzcxOTAwNzkzZDEwMDBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgyNzM2NCwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMGU1MjQxMzVkZTc0MmRjYWJmNjNmNjUxMDM2ZGZkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzMzNDQ5ZjY4ZDE0YTY5YThhNGEzMDAzMGMwN2U5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfODMzMzQ0OWY2OGQxNGE2OWE4YTRhMzAwMzBjMDdlOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0yUjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzBlNTI0MTM1ZGU3NDJkY2FiZjYzZjY1MTAzNmRmZGYuc2V0Q29udGVudChodG1sXzgzMzM0NDlmNjhkMTRhNjlhOGE0YTMwMDMwYzA3ZTkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkYTQ5ZGNmNTc2NjRhYjRhYzcxOTAwNzkzZDEwMDBlLmJpbmRQb3B1cChwb3B1cF8zMGU1MjQxMzVkZTc0MmRjYWJmNjNmNjUxMDM2ZGZkZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYmUzMmIyYzBhYWI0NWVhODFkYjJmNTMyNmVmMTVmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1MzI1ODYsLTc5LjMyOTY1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2MwN2UxZDI2MDU4NGJkMGJlZDI4Nzk2ZTcyMWVhNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQzY2Y2ZWI3ZWM3NDA1YzhmMDdjYmEyNmYzZjVhZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzJkM2NmNmViN2VjNzQwNWM4ZjA3Y2JhMjZmM2Y1YWZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NM0E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjMDdlMWQyNjA1ODRiZDBiZWQyODc5NmU3MjFlYTU4LnNldENvbnRlbnQoaHRtbF8yZDNjZjZlYjdlYzc0MDVjOGYwN2NiYTI2ZjNmNWFmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYmUzMmIyYzBhYWI0NWVhODFkYjJmNTMyNmVmMTVmNi5iaW5kUG9wdXAocG9wdXBfN2MwN2UxZDI2MDU4NGJkMGJlZDI4Nzk2ZTcyMWVhNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTI5NGJhNzI4N2NlNDVjZGJhOWFiNWNkOWQyM2ZjMzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDU5MDU4LC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjE4NzNlNTVmMmQ0NDIxYmIxOTdkZmU5YTgxNzc2M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmIyOTBjODRiYTNiNDM3Mzg5NjgyYTliYWE4MTZkNDQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiMjkwYzg0YmEzYjQzNzM4OTY4MmE5YmFhODE2ZDQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NM0I8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxODczZTU1ZjJkNDQyMWJiMTk3ZGZlOWE4MTc3NjNjLnNldENvbnRlbnQoaHRtbF9mYjI5MGM4NGJhM2I0MzczODk2ODJhOWJhYTgxNmQ0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjk0YmE3Mjg3Y2U0NWNkYmE5YWI1Y2Q5ZDIzZmMzMC5iaW5kUG9wdXAocG9wdXBfYjE4NzNlNTVmMmQ0NDIxYmIxOTdkZmU5YTgxNzc2M2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWFhY2EzNTU5MmM5NGQ3NzhiMzU4ZWRmNzNhYjE1ODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4OTk3MDAwMDAwMSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwYjhlMTQ2YWRhZDQ1OTJhZmY3NGFhMDk5MDI5M2VjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkNjE5NjNmNzlmMzRiOTRhNmY4NTAyNzUyZGQ4YzBhID0gJCgnPGRpdiBpZD0iaHRtbF82ZDYxOTYzZjc5ZjM0Yjk0YTZmODUwMjc1MmRkOGMwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTNDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGI4ZTE0NmFkYWQ0NTkyYWZmNzRhYTA5OTAyOTNlYy5zZXRDb250ZW50KGh0bWxfNmQ2MTk2M2Y3OWYzNGI5NGE2Zjg1MDI3NTJkZDhjMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWFhY2EzNTU5MmM5NGQ3NzhiMzU4ZWRmNzNhYjE1ODcuYmluZFBvcHVwKHBvcHVwXzAwYjhlMTQ2YWRhZDQ1OTJhZmY3NGFhMDk5MDI5M2VjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwNjhjOTcxMWY1YTRlZDNhMWJhYWI5M2NmYzE3ZjlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU0MzI4MywtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzkwYWFmMmI0MzA0MzI4OTFlODRiMTY0MGI1NjA2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZWNlMmEyNWM4M2M0YTMyOTY5NzY5Zjc4MjBmMTFhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGVjZTJhMjVjODNjNGEzMjk2OTc2OWY3ODIwZjExYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0zSDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM5MGFhZjJiNDMwNDMyODkxZTg0YjE2NDBiNTYwNmMuc2V0Q29udGVudChodG1sX2RlY2UyYTI1YzgzYzRhMzI5Njk3NjlmNzgyMGYxMWFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwNjhjOTcxMWY1YTRlZDNhMWJhYWI5M2NmYzE3ZjlhLmJpbmRQb3B1cChwb3B1cF8xMzkwYWFmMmI0MzA0MzI4OTFlODRiMTY0MGI1NjA2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNTlkNTg3YjY4M2Y0OWVkYmE5MDEzZTI0MmY2ZmEyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2Nzk4MDMsLTc5LjQ4NzI2MTkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmOTZhMzRkOTk5YTRiYjc4MzExMDcwNTJiYjY1YTkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxZGY1YjY2N2VkMjQyMGM5NjM3YjQwZjRiYjM3MDM2ID0gJCgnPGRpdiBpZD0iaHRtbF83MWRmNWI2NjdlZDI0MjBjOTYzN2I0MGY0YmIzNzAzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTNKPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84Zjk2YTM0ZDk5OWE0YmI3ODMxMTA3MDUyYmI2NWE5My5zZXRDb250ZW50KGh0bWxfNzFkZjViNjY3ZWQyNDIwYzk2MzdiNDBmNGJiMzcwMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjU5ZDU4N2I2ODNmNDllZGJhOTAxM2UyNDJmNmZhMjIuYmluZFBvcHVwKHBvcHVwXzhmOTZhMzRkOTk5YTRiYjc4MzExMDcwNTJiYjY1YTkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyMzk5YWY5ODExNDRmNmNhNWRmMDQyZjk5ZjQ5NjM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM3NDczMiwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODliZWNhZTZkNmE0NDliNjkzYzRmMjJkZjVmMjY2MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMwN2JmYzZjMmQ5NDVlNmJiMjJlNzFlODQ4MTdhN2IgPSAkKCc8ZGl2IGlkPSJodG1sXzZjMDdiZmM2YzJkOTQ1ZTZiYjIyZTcxZTg0ODE3YTdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NM0s8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5YmVjYWU2ZDZhNDQ5YjY5M2M0ZjIyZGY1ZjI2NjE1LnNldENvbnRlbnQoaHRtbF82YzA3YmZjNmMyZDk0NWU2YmIyMmU3MWU4NDgxN2E3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjM5OWFmOTgxMTQ0ZjZjYTVkZjA0MmY5OWY0OTYzNy5iaW5kUG9wdXAocG9wdXBfODliZWNhZTZkNmE0NDliNjkzYzRmMjJkZjVmMjY2MTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFlNDZkODU5NzE0NDJlZTkwOWJmN2NiNjk5NjZlMzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzkwMTQ2LC03OS41MDY5NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1NTlhMGVjYTA2MzQwZmNiNmU2NzdhMzdhNTczODkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhjNTMxYmRjNjAyMDQ0NTBiYTdmNWY4YmNhZTJhZmYyID0gJCgnPGRpdiBpZD0iaHRtbF84YzUzMWJkYzYwMjA0NDUwYmE3ZjVmOGJjYWUyYWZmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTNMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNTU5YTBlY2EwNjM0MGZjYjZlNjc3YTM3YTU3Mzg5My5zZXRDb250ZW50KGh0bWxfOGM1MzFiZGM2MDIwNDQ1MGJhN2Y1ZjhiY2FlMmFmZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjFlNDZkODU5NzE0NDJlZTkwOWJmN2NiNjk5NjZlMzMuYmluZFBvcHVwKHBvcHVwXzI1NTlhMGVjYTA2MzQwZmNiNmU2NzdhMzdhNTczODkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmMTJiMmRlMDczMDRiYzViZGVkZjY2OWIxYWNlNGEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4NDk2NCwtNzkuNDk1Njk3NDAwMDAwMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY5NjY3YmVlZTA4NDcyODk5MGVjZTc2NzI2NDc4MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmZlODA1YTJlYmU5NGQzZjkyNjExMzA5MTZmNDdlNjQgPSAkKCc8ZGl2IGlkPSJodG1sXzZmZTgwNWEyZWJlOTRkM2Y5MjYxMTMwOTE2ZjQ3ZTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NM008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2OTY2N2JlZWUwODQ3Mjg5OTBlY2U3NjcyNjQ3ODJlLnNldENvbnRlbnQoaHRtbF82ZmU4MDVhMmViZTk0ZDNmOTI2MTEzMDkxNmY0N2U2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjEyYjJkZTA3MzA0YmM1YmRlZGY2NjliMWFjZTRhMy5iaW5kUG9wdXAocG9wdXBfNjY5NjY3YmVlZTA4NDcyODk5MGVjZTc2NzI2NDc4MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGY2ZDY3OWVhYTRlNDg4MmE3ODEzMGVhMDMwMDBkODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjE2MzEzLC03OS41MjA5OTk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzRlZTY5YjZkODY0ZjE4ODI5ZjBjYTRmY2RlNjY5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Zjk3NDJmY2I3ZGM0MzcyOGVhODhiZjNiNTFiZWMyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y5NzQyZmNiN2RjNDM3MjhlYTg4YmYzYjUxYmVjMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk0zTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc0ZWU2OWI2ZDg2NGYxODgyOWYwY2E0ZmNkZTY2OTMuc2V0Q29udGVudChodG1sXzdmOTc0MmZjYjdkYzQzNzI4ZWE4OGJmM2I1MWJlYzJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmNmQ2NzllYWE0ZTQ4ODJhNzgxMzBlYTAzMDAwZDgyLmJpbmRQb3B1cChwb3B1cF81NzRlZTY5YjZkODY0ZjE4ODI5ZjBjYTRmY2RlNjY5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OGJiYWYwM2M4ODg0NWYwYTQ4NmRmZjRkZmViY2Y1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg4MjMsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljYjlkY2MxOTcwYjQ4NzZhYzBjYTM3ZDY5MzBkYTg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwYTBlNGYyNmNiNDRiY2Y4MWZiNTNlMjU0Njg4MGY3ID0gJCgnPGRpdiBpZD0iaHRtbF9jMGEwZTRmMjZjYjQ0YmNmODFmYjUzZTI1NDY4ODBmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTRBPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Y2I5ZGNjMTk3MGI0ODc2YWMwY2EzN2Q2OTMwZGE4NC5zZXRDb250ZW50KGh0bWxfYzBhMGU0ZjI2Y2I0NGJjZjgxZmI1M2UyNTQ2ODgwZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODhiYmFmMDNjODg4NDVmMGE0ODZkZmY0ZGZlYmNmNTAuYmluZFBvcHVwKHBvcHVwXzljYjlkY2MxOTcwYjQ4NzZhYzBjYTM3ZDY5MzBkYTg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5YTA5NTkxMmFiMzRhZTVhM2NlOTAwNDFiNzU4ZDNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2Mzk3MiwtNzkuMzA5OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhYWFmMGEyN2JmNzRjY2U5MmY3YjJiNTJiNzVhYmZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QyZTQ3Y2FhNWE2OTQzYzE4Y2JiMDViMDYyZDcyMDIwID0gJCgnPGRpdiBpZD0iaHRtbF9kMmU0N2NhYTVhNjk0M2MxOGNiYjA1YjA2MmQ3MjAyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTRCPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYWFhZjBhMjdiZjc0Y2NlOTJmN2IyYjUyYjc1YWJmZi5zZXRDb250ZW50KGh0bWxfZDJlNDdjYWE1YTY5NDNjMThjYmIwNWIwNjJkNzIwMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTlhMDk1OTEyYWIzNGFlNWEzY2U5MDA0MWI3NThkM2EuYmluZFBvcHVwKHBvcHVwXzJhYWFmMGEyN2JmNzRjY2U5MmY3YjJiNTJiNzVhYmZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzODgyOTVlMjQ4ZjRkZDM4ZjU1Nzc4MjA2YTE2NThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk1MzQzOTAwMDAwMDEsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjIwNDBmZGMyYjAzNDI5MDhiMTgyNTFlOTgzZWY1MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY4ZmVjYTAzMmRkNDdjZjgzYWRjOWUyYzIyNzc0NjIgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2OGZlY2EwMzJkZDQ3Y2Y4M2FkYzllMmMyMjc3NDYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNEM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyMDQwZmRjMmIwMzQyOTA4YjE4MjUxZTk4M2VmNTE2LnNldENvbnRlbnQoaHRtbF80NjhmZWNhMDMyZGQ0N2NmODNhZGM5ZTJjMjI3NzQ2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Mzg4Mjk1ZTI0OGY0ZGQzOGY1NTc3ODIwNmExNjU4Zi5iaW5kUG9wdXAocG9wdXBfNjIwNDBmZGMyYjAzNDI5MDhiMTgyNTFlOTgzZWY1MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODkwYjE2ZGYzZTljNGIxZDgwNzFmOWU3Mjc5MTI0NzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzYzNTczOTk5OTk5OSwtNzkuMjkzMDMxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MjA1ZDcwNGEzODM0MWE0OWU4OWFmZThkYzdjMTE4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzE1NWJhZjU3Yjk0NWM2OTVkMTliMGI5MjMyNzVjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmMxNTViYWY1N2I5NDVjNjk1ZDE5YjBiOTIzMjc1YzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00RTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTIwNWQ3MDRhMzgzNDFhNDllODlhZmU4ZGM3YzExODIuc2V0Q29udGVudChodG1sX2JjMTU1YmFmNTdiOTQ1YzY5NWQxOWIwYjkyMzI3NWM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5MGIxNmRmM2U5YzRiMWQ4MDcxZjllNzI3OTEyNDc5LmJpbmRQb3B1cChwb3B1cF85MjA1ZDcwNGEzODM0MWE0OWU4OWFmZThkYzdjMTE4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDE0YzBmYzQxNWU0Yzk4OTdiMzY5OGIzOTMwODE0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwOTA2MDQsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFmYzc0NzJkNTJjNGU3YzkwNjFkYjk3M2YxOWEwZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQ2ZjY0MzQ0NjgxNGQzZWE0NzhhYjlmMTQ4NmVhYzggPSAkKCc8ZGl2IGlkPSJodG1sXzBkNmY2NDM0NDY4MTRkM2VhNDc4YWI5ZjE0ODZlYWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNEc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxZmM3NDcyZDUyYzRlN2M5MDYxZGI5NzNmMTlhMGUzLnNldENvbnRlbnQoaHRtbF8wZDZmNjQzNDQ2ODE0ZDNlYTQ3OGFiOWYxNDg2ZWFjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NDE0YzBmYzQxNWU0Yzk4OTdiMzY5OGIzOTMwODE0NC5iaW5kUG9wdXAocG9wdXBfOTFmYzc0NzJkNTJjNGU3YzkwNjFkYjk3M2YxOWEwZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDgxZGFlYTYzMzNkNGNhNGFiODdjZmFlMTAzYjUzMjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjlhNDNiMzZjODM0ZjYzYmJmZGQyODIyYmE0Mjk1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MGNlMDc3OGY5ZDM0NThlYmViODc2N2Q5NmM5YTUyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjBjZTA3NzhmOWQzNDU4ZWJlYjg3NjdkOTZjOWE1MmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00SDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY5YTQzYjM2YzgzNGY2M2JiZmRkMjgyMmJhNDI5NWIuc2V0Q29udGVudChodG1sXzYwY2UwNzc4ZjlkMzQ1OGViZWI4NzY3ZDk2YzlhNTJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4MWRhZWE2MzMzZDRjYTRhYjg3Y2ZhZTEwM2I1MzIwLmJpbmRQb3B1cChwb3B1cF9hZjlhNDNiMzZjODM0ZjYzYmJmZGQyODIyYmE0Mjk1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTM3M2QwYzE1NWU0MDk3YjE2OGVkN2IyMDQ5NDhmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NTM0NywtNzkuMzM4MTA2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDhmMmY1ZGQ0NzE0MWE0YTNlZjAwMzI2MWQ3NjcwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjYzMjFjNzA0M2Y0YTRiYTZjZDBmMzMxZDQ2YTNkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWY2MzIxYzcwNDNmNGE0YmE2Y2QwZjMzMWQ0NmEzZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00SjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQ4ZjJmNWRkNDcxNDFhNGEzZWYwMDMyNjFkNzY3MDQuc2V0Q29udGVudChodG1sXzlmNjMyMWM3MDQzZjRhNGJhNmNkMGYzMzFkNDZhM2RhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxMzczZDBjMTU1ZTQwOTdiMTY4ZWQ3YjIwNDk0OGZjLmJpbmRQb3B1cChwb3B1cF8wZDhmMmY1ZGQ0NzE0MWE0YTNlZjAwMzI2MWQ3NjcwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYmQxN2NlNmM4MjU0MDczOTUyNWY2MTBjMWFlMTA2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU1NzEsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOTc2ZWUxNWRiNTc0OWQ5YWI3OWQzNWEwMzhkMWFiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NmFiMzI1NTJhODc0ZjZlYmVhMmZlNzVhODZmMDRhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTZhYjMyNTUyYTg3NGY2ZWJlYTJmZTc1YTg2ZjA0YTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00SzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDk3NmVlMTVkYjU3NDlkOWFiNzlkMzVhMDM4ZDFhYjEuc2V0Q29udGVudChodG1sXzU2YWIzMjU1MmE4NzRmNmViZWEyZmU3NWE4NmYwNGE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNiZDE3Y2U2YzgyNTQwNzM5NTI1ZjYxMGMxYWUxMDYwLmJpbmRQb3B1cChwb3B1cF9kOTc2ZWUxNWRiNTc0OWQ5YWI3OWQzNWEwMzhkMWFiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTMzZDNjNDNkMTg0YTYwOGUxZTg5NjQwODMyYmNhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2ODk5ODUsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiMGRjNDhkMzA0ZjRkMTU4OThjNmNmMGU0NzM3MmMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxYTBjN2NjOTcwOTQxOTJiOTY2ODZmODJiNjBlZWZhID0gJCgnPGRpdiBpZD0iaHRtbF8zMWEwYzdjYzk3MDk0MTkyYjk2Njg2ZjgyYjYwZWVmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTRMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjBkYzQ4ZDMwNGY0ZDE1ODk4YzZjZjBlNDczNzJjMC5zZXRDb250ZW50KGh0bWxfMzFhMGM3Y2M5NzA5NDE5MmI5NjY4NmY4MmI2MGVlZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTkzM2QzYzQzZDE4NGE2MDhlMWU4OTY0MDgzMmJjYWMuYmluZFBvcHVwKHBvcHVwXzdiMGRjNDhkMzA0ZjRkMTU4OThjNmNmMGU0NzM3MmMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkZjU0MjdhYjFhYjQ0MGI4Zjg3YzYxZTMyM2I2YjMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU5NTI1NSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyMGI0N2IyZjk5MjQ5ODU4YmQ5Y2ViOWFjYzBkYjQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhZTk1NzI3YmI0NjQ3ODY5NzcxZTQzMGY1MWI3MmIxID0gJCgnPGRpdiBpZD0iaHRtbF83YWU5NTcyN2JiNDY0Nzg2OTc3MWU0MzBmNTFiNzJiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTRNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjBiNDdiMmY5OTI0OTg1OGJkOWNlYjlhY2MwZGI0NC5zZXRDb250ZW50KGh0bWxfN2FlOTU3MjdiYjQ2NDc4Njk3NzFlNDMwZjUxYjcyYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2RmNTQyN2FiMWFiNDQwYjhmODdjNjFlMzIzYjZiMzIuYmluZFBvcHVwKHBvcHVwX2YyMGI0N2IyZjk5MjQ5ODU4YmQ5Y2ViOWFjYzBkYjQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2MDljMWU2NmY5ZDQyNzlhYjQwOTI3ZjZkYzIxNDQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MDIwNSwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYTk5YmEyNmMwMzQ0NWRmYWQxMDkwMDQ4YzNjYTkyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MzNlZWQ5ZGViNjY0ZDExOWNkNDZlYzljMGNmYTI2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTMzZWVkOWRlYjY2NGQxMTljZDQ2ZWM5YzBjZmEyNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00TjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGE5OWJhMjZjMDM0NDVkZmFkMTA5MDA0OGMzY2E5MjYuc2V0Q29udGVudChodG1sXzkzM2VlZDlkZWI2NjRkMTE5Y2Q0NmVjOWMwY2ZhMjY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU2MDljMWU2NmY5ZDQyNzlhYjQwOTI3ZjZkYzIxNDQ4LmJpbmRQb3B1cChwb3B1cF8wYTk5YmEyNmMwMzQ0NWRmYWQxMDkwMDQ4YzNjYTkyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDk4ZThmNjJjMWE0OWViYjgzMmJiNGQyZjE1ZjU1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMjc1MTEsLTc5LjM5MDE5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzhiNjYwYTIyZWI0NDE2ZGIyMGI2NzllNDRlM2I3NGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg4M2E0Y2UwMWY4NDdhMjk4NmU1ZWYxZWQxN2YwMWMgPSAkKCc8ZGl2IGlkPSJodG1sX2I4ODNhNGNlMDFmODQ3YTI5ODZlNWVmMWVkMTdmMDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNFA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4YjY2MGEyMmViNDQxNmRiMjBiNjc5ZTQ0ZTNiNzRkLnNldENvbnRlbnQoaHRtbF9iODgzYTRjZTAxZjg0N2EyOTg2ZTVlZjFlZDE3ZjAxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZDk4ZThmNjJjMWE0OWViYjgzMmJiNGQyZjE1ZjU1My5iaW5kUG9wdXAocG9wdXBfNzhiNjYwYTIyZWI0NDE2ZGIyMGI2NzllNDRlM2I3NGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTc3MTEzODkzYWYzNDg3NWJjZGQ4NzUwY2Y2YTBiZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTUzODM0LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGMxOGYxNWIxYmU0NDEwOWI4ZDNkOWJlMzVkZWRjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85N2I1ZjU1MjQzZjU0YmEwYjQ5MzNjYzg0OTMwY2NmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTdiNWY1NTI0M2Y1NGJhMGI0OTMzY2M4NDkzMGNjZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00UjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRjMThmMTViMWJlNDQxMDliOGQzZDliZTM1ZGVkYzkuc2V0Q29udGVudChodG1sXzk3YjVmNTUyNDNmNTRiYTBiNDkzM2NjODQ5MzBjY2YyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NzExMzg5M2FmMzQ4NzViY2RkODc1MGNmNmEwYmY2LmJpbmRQb3B1cChwb3B1cF84NGMxOGYxNWIxYmU0NDEwOWI4ZDNkOWJlMzVkZWRjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTFkMmFmYjI3ODY0ZjkyOTgwMjhlMDM3ZWRlYjlmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNDMyNDQsLTc5LjM4ODc5MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVlNmU1ZGMwZTBmNGIwOTkzZWZhY2NkYTkyNTQ1NzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFhMzI0MmQzZWU2NDlmYzk1Y2NiM2NkNDdjZWQ5MzEgPSAkKCc8ZGl2IGlkPSJodG1sXzYxYTMyNDJkM2VlNjQ5ZmM5NWNjYjNjZDQ3Y2VkOTMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1ZTZlNWRjMGUwZjRiMDk5M2VmYWNjZGE5MjU0NTc3LnNldENvbnRlbnQoaHRtbF82MWEzMjQyZDNlZTY0OWZjOTVjY2IzY2Q0N2NlZDkzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTFkMmFmYjI3ODY0ZjkyOTgwMjhlMDM3ZWRlYjlmYy5iaW5kUG9wdXAocG9wdXBfODVlNmU1ZGMwZTBmNGIwOTkzZWZhY2NkYTkyNTQ1NzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzU2M2YwYTYwYmZhNDE4OTlmMTIxNWVlZTc2ZmMxMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODk1NzQzLC03OS4zODMxNTk5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDkwNjdlOGM0ZTQ0Mzg1OGQ5Nzk1NWRhMWVhZTdmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjZhMjQ4YTUwMDI0YzRiYTI2YjdiMzRmY2RlNWNmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWY2YTI0OGE1MDAyNGM0YmEyNmI3YjM0ZmNkZTVjZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00VDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA5MDY3ZThjNGU0NDM4NThkOTc5NTVkYTFlYWU3ZjUuc2V0Q29udGVudChodG1sXzVmNmEyNDhhNTAwMjRjNGJhMjZiN2IzNGZjZGU1Y2Y5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NjNmMGE2MGJmYTQxODk5ZjEyMTVlZWU3NmZjMTAxLmJpbmRQb3B1cChwb3B1cF9iMDkwNjdlOGM0ZTQ0Mzg1OGQ5Nzk1NWRhMWVhZTdmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmNlYzZiOTJjMWI0NDNiODEzN2U1NmFmZDM5ZWQ2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NjQxMjI5OTk5OTk5LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2ZTM3ZGVhNTVhMzQ5NDY5YjEzNTMzMzBjMTkwYjc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhOWY1Nzc2ODc0ZTQ0ODhhZjg3YjM5ODNjMWQzMDBjID0gJCgnPGRpdiBpZD0iaHRtbF9hYTlmNTc3Njg3NGU0NDg4YWY4N2IzOTgzYzFkMzAwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTRWPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NmUzN2RlYTU1YTM0OTQ2OWIxMzUzMzMwYzE5MGI3Ny5zZXRDb250ZW50KGh0bWxfYWE5ZjU3NzY4NzRlNDQ4OGFmODdiMzk4M2MxZDMwMGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZjZWM2YjkyYzFiNDQzYjgxMzdlNTZhZmQzOWVkNmMuYmluZFBvcHVwKHBvcHVwXzY2ZTM3ZGVhNTVhMzQ5NDY5YjEzNTMzMzBjMTkwYjc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3MTk2NDJiZTRkYjQyODViYzczYTJiYzY5MDZkYjBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTYyNiwtNzkuMzc3NTI5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzcxNjk3Mjg3ZjU1NDNlODg1MjAxNGE1ZWM3MzU0OWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMThhYzM4NDllMTA2NDY3OWJkYWZlOGY4ZjRkYjRmZWMgPSAkKCc8ZGl2IGlkPSJodG1sXzE4YWMzODQ5ZTEwNjQ2NzliZGFmZThmOGY0ZGI0ZmVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNFc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3MTY5NzI4N2Y1NTQzZTg4NTIwMTRhNWVjNzM1NDljLnNldENvbnRlbnQoaHRtbF8xOGFjMzg0OWUxMDY0Njc5YmRhZmU4ZjhmNGRiNGZlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNzE5NjQyYmU0ZGI0Mjg1YmM3M2EyYmM2OTA2ZGIwYS5iaW5kUG9wdXAocG9wdXBfMzcxNjk3Mjg3ZjU1NDNlODg1MjAxNGE1ZWM3MzU0OWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2FhYTI2ZTBhNTQ4NDVmZjk5MzM0YWQ0YjA5NmQ5OTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc5NjcsLTc5LjM2NzY3NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzEyN2VlMTJkZDMzNGU3YTk2ZmU1NjQyZWIwYWQ3YWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGE2NDI5ZTVkMDkzNDFmMjhkZjhjMDgzNTc4ZWNhMzYgPSAkKCc8ZGl2IGlkPSJodG1sXzBhNjQyOWU1ZDA5MzQxZjI4ZGY4YzA4MzU3OGVjYTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNFg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxMjdlZTEyZGQzMzRlN2E5NmZlNTY0MmViMGFkN2FmLnNldENvbnRlbnQoaHRtbF8wYTY0MjllNWQwOTM0MWYyOGRmOGMwODM1NzhlY2EzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYWFhMjZlMGE1NDg0NWZmOTkzMzRhZDRiMDk2ZDk5NC5iaW5kUG9wdXAocG9wdXBfMzEyN2VlMTJkZDMzNGU3YTk2ZmU1NjQyZWIwYWQ3YWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzVmYWU4NmIzMGIyNDFlODhmMDZiZGMyM2YwMmFkNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjU4NTk5LC03OS4zODMxNTk5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYWY2MDdiZDVjMWQ0MjRmYWI2ZjFmMjk2YzgxM2EzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjgzMzNhY2ZkYTk0MzUxYmM4ZWMwMWZmZjVjMmM1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDY4MzMzYWNmZGE5NDM1MWJjOGVjMDFmZmY1YzJjNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk00WTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWFmNjA3YmQ1YzFkNDI0ZmFiNmYxZjI5NmM4MTNhMzkuc2V0Q29udGVudChodG1sX2Q2ODMzM2FjZmRhOTQzNTFiYzhlYzAxZmZmNWMyYzUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1ZmFlODZiMzBiMjQxZTg4ZjA2YmRjMjNmMDJhZDY0LmJpbmRQb3B1cChwb3B1cF9hYWY2MDdiZDVjMWQ0MjRmYWI2ZjFmMjk2YzgxM2EzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lN2YxMjJhMmQzZTY0ZTI1OWM1OGQ1NjkxMmFkY2IzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NDI1OTksLTc5LjM2MDYzNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE5MDc5NTNiZWNkNDIyN2ExYmQ3NzgzZGExMTQ3ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWNhMzExY2JhNDg3NDlhOGI0NWJjOGRiMTczMTc0ZjMgPSAkKCc8ZGl2IGlkPSJodG1sXzVjYTMxMWNiYTQ4NzQ5YThiNDViYzhkYjE3MzE3NGYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNUE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhOTA3OTUzYmVjZDQyMjdhMWJkNzc4M2RhMTE0N2ZhLnNldENvbnRlbnQoaHRtbF81Y2EzMTFjYmE0ODc0OWE4YjQ1YmM4ZGIxNzMxNzRmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lN2YxMjJhMmQzZTY0ZTI1OWM1OGQ1NjkxMmFkY2IzMy5iaW5kUG9wdXAocG9wdXBfMGE5MDc5NTNiZWNkNDIyN2ExYmQ3NzgzZGExMTQ3ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFlYzU2YjBiNDAwNGY3N2I5OWJhNjU2OThkYTYxOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTcxNjE4LC03OS4zNzg5MzcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOWI5ZDE3ZjdmMGU0MGYwYThmNmVhNmEyNzdjMTllYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZGQyMWIyYTQzNTk0Y2VkYjMyMmJiNDc3YWMzMmMzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmRkMjFiMmE0MzU5NGNlZGIzMjJiYjQ3N2FjMzJjMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01QjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTliOWQxN2Y3ZjBlNDBmMGE4ZjZlYTZhMjc3YzE5ZWIuc2V0Q29udGVudChodG1sXzJkZDIxYjJhNDM1OTRjZWRiMzIyYmI0NzdhYzMyYzM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxZWM1NmIwYjQwMDRmNzdiOTliYTY1Njk4ZGE2MTliLmJpbmRQb3B1cChwb3B1cF8xOWI5ZDE3ZjdmMGU0MGYwYThmNmVhNmEyNzdjMTllYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDMwZGM2NzQ0OGM0M2U0YjBmOGM1MjBkNjg2OTAzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MTQ5MzksLTc5LjM3NTQxNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDUwMDRkNzIyYWFjNDhmYjkxMjhiZTg2NDUxNWIxZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2MxNmRkZjU5MzcwNGU0NThhNTdhYTYxMjFlODNjMTQgPSAkKCc8ZGl2IGlkPSJodG1sXzNjMTZkZGY1OTM3MDRlNDU4YTU3YWE2MTIxZTgzYzE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1MDA0ZDcyMmFhYzQ4ZmI5MTI4YmU4NjQ1MTViMWZkLnNldENvbnRlbnQoaHRtbF8zYzE2ZGRmNTkzNzA0ZTQ1OGE1N2FhNjEyMWU4M2MxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NDMwZGM2NzQ0OGM0M2U0YjBmOGM1MjBkNjg2OTAzMS5iaW5kUG9wdXAocG9wdXBfZDUwMDRkNzIyYWFjNDhmYjkxMjhiZTg2NDUxNWIxZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE4MTcxNWJkOGM2NDJmYWE4NTRmNGY2YmU5ODI2YzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDQ3NzA4LC03OS4zNzMzMDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2NjQ3ZTVlNjIyNzQxMDc4NjBhNmM3YjEyZGU1NzRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1MGRiZTRjNDI0OTQ0NWQ4NzdlZWM4NmQzODRhZDk1ID0gJCgnPGRpdiBpZD0iaHRtbF8zNTBkYmU0YzQyNDk0NDVkODc3ZWVjODZkMzg0YWQ5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NjY0N2U1ZTYyMjc0MTA3ODYwYTZjN2IxMmRlNTc0Yy5zZXRDb250ZW50KGh0bWxfMzUwZGJlNGM0MjQ5NDQ1ZDg3N2VlYzg2ZDM4NGFkOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTE4MTcxNWJkOGM2NDJmYWE4NTRmNGY2YmU5ODI2YzEuYmluZFBvcHVwKHBvcHVwXzY2NjQ3ZTVlNjIyNzQxMDc4NjBhNmM3YjEyZGU1NzRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxZDJiZWQzZWRkMTQ3NmZhZGEyNzhmMmM3YWRhOGVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3OTUyNCwtNzkuMzg3MzgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTBiYWQ0MDFhNWQ0ZWEwOTQ0ZjRiOThhOTg2MDVjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYWQzNGFjOGE4MmY0NTQxYjA4M2IzNTZmMmM2ZWE1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGFkMzRhYzhhODJmNDU0MWIwODNiMzU2ZjJjNmVhNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01RzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTUwYmFkNDAxYTVkNGVhMDk0NGY0Yjk4YTk4NjA1YzYuc2V0Q29udGVudChodG1sXzBhZDM0YWM4YTgyZjQ1NDFiMDgzYjM1NmYyYzZlYTU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxZDJiZWQzZWRkMTQ3NmZhZGEyNzhmMmM3YWRhOGVmLmJpbmRQb3B1cChwb3B1cF9lNTBiYWQ0MDFhNWQ0ZWEwOTQ0ZjRiOThhOTg2MDVjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzExY2JmNjBmZDQ0ZmIyOTNjMzllNDg0ZTM4NGQ5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MDU3MTIwMDAwMDAxLC03OS4zODQ1Njc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmZmRlNWFjODdlYjQ2ZjlhZWQ5MTc3OGUzZTYzYTI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2OGI0Njg3NTkzMzRkNmE4ZGFlOWMzMTg3Mjk2YzM2ID0gJCgnPGRpdiBpZD0iaHRtbF9iNjhiNDY4NzU5MzM0ZDZhOGRhZTljMzE4NzI5NmMzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVIPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZmZkZTVhYzg3ZWI0NmY5YWVkOTE3NzhlM2U2M2EyOC5zZXRDb250ZW50KGh0bWxfYjY4YjQ2ODc1OTMzNGQ2YThkYWU5YzMxODcyOTZjMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2MxMWNiZjYwZmQ0NGZiMjkzYzM5ZTQ4NGUzODRkOTUuYmluZFBvcHVwKHBvcHVwXzhmZmRlNWFjODdlYjQ2ZjlhZWQ5MTc3OGUzZTYzYTI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmMDc4MWFhZDBmMjQ1NmI5NDIxODUzZTNhNDAyYjI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQwODE1NywtNzkuMzgxNzUyMjk5OTk5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjU2ZWQ1MzRjNzIxNGIyNzk4YzIwZDM3NTZiZTNmOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGVlZTc4ZDNhNjUzNGViZGFmNjcwMzFmOWRmOGZlMGEgPSAkKCc8ZGl2IGlkPSJodG1sXzRlZWU3OGQzYTY1MzRlYmRhZjY3MDMxZjlkZjhmZTBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNUo8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1NmVkNTM0YzcyMTRiMjc5OGMyMGQzNzU2YmUzZjhmLnNldENvbnRlbnQoaHRtbF80ZWVlNzhkM2E2NTM0ZWJkYWY2NzAzMWY5ZGY4ZmUwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZjA3ODFhYWQwZjI0NTZiOTQyMTg1M2UzYTQwMmIyNi5iaW5kUG9wdXAocG9wdXBfYjU2ZWQ1MzRjNzIxNGIyNzk4YzIwZDM3NTZiZTNmOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjFjMWNjYjhhZWU2NDQxZDkyM2E1MmRjNzg0MGI5OGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDcxNzY4LC03OS4zODE1NzY0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTYxZDllNWJjMGE0ZWE5OWYzY2VlYTdkM2ExODM4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzExZWRjYWIxZDA0NTNhOTExMDZmNThkNGMyMDdiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDcxMWVkY2FiMWQwNDUzYTkxMTA2ZjU4ZDRjMjA3YmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01SzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU2MWQ5ZTViYzBhNGVhOTlmM2NlZWE3ZDNhMTgzODguc2V0Q29udGVudChodG1sXzQ3MTFlZGNhYjFkMDQ1M2E5MTEwNmY1OGQ0YzIwN2JmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxYzFjY2I4YWVlNjQ0MWQ5MjNhNTJkYzc4NDBiOThmLmJpbmRQb3B1cChwb3B1cF8xNTYxZDllNWJjMGE0ZWE5OWYzY2VlYTdkM2ExODM4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzFhNjAwN2NkMzg0MjA3Yjc2ZmRkNWYxNGE4MzJhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODE5ODUsLTc5LjM3OTgxNjkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjMmEyNmRlODE4MzQ2ZjViZGU5YWVmYTE1YWJhNGViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1NDg5MmNiNzcxMjRjNjA4Y2E1MmEyMDM2N2ViNzMwID0gJCgnPGRpdiBpZD0iaHRtbF9lNTQ4OTJjYjc3MTI0YzYwOGNhNTJhMjAzNjdlYjczMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYzJhMjZkZTgxODM0NmY1YmRlOWFlZmExNWFiYTRlYi5zZXRDb250ZW50KGh0bWxfZTU0ODkyY2I3NzEyNGM2MDhjYTUyYTIwMzY3ZWI3MzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWMxYTYwMDdjZDM4NDIwN2I3NmZkZDVmMTRhODMyYWYuYmluZFBvcHVwKHBvcHVwXzBjMmEyNmRlODE4MzQ2ZjViZGU5YWVmYTE1YWJhNGViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiZTlmMzk0NGJjZjQ5OTlhNjdlOTI5ZDQ3NDk1OTlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzMzMjgyNSwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMGEyZmU4M2U2NDM0NTY4ODJlOGVjMWE0Yzk5MDk5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjYzMjNhNzliMmI0OTUyOWU0ZjVhMWVmZGM1MDg0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODI2MzIzYTc5YjJiNDk1MjllNGY1YTFlZmRjNTA4NGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01TTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDBhMmZlODNlNjQzNDU2ODgyZThlYzFhNGM5OTA5OTguc2V0Q29udGVudChodG1sXzgyNjMyM2E3OWIyYjQ5NTI5ZTRmNWExZWZkYzUwODRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZTlmMzk0NGJjZjQ5OTlhNjdlOTI5ZDQ3NDk1OTlkLmJpbmRQb3B1cChwb3B1cF8wMGEyZmU4M2U2NDM0NTY4ODJlOGVjMWE0Yzk5MDk5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMmYwZWZlMjc3NjY0ZmRlYTNjZTc4ZGY5NmY4NmVmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMTY5NDgsLTc5LjQxNjkzNTU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiYmQ1ODcwYjY3MDRiMDM4NWFlYzE2MDVmYTEwMTM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkM2IwMTNkNWNjZTRmNWI5ODdhNjBhNWQ5YmFjMGMxID0gJCgnPGRpdiBpZD0iaHRtbF83ZDNiMDEzZDVjY2U0ZjViOTg3YTYwYTVkOWJhYzBjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVOPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YmJkNTg3MGI2NzA0YjAzODVhZWMxNjA1ZmExMDEzOS5zZXRDb250ZW50KGh0bWxfN2QzYjAxM2Q1Y2NlNGY1Yjk4N2E2MGE1ZDliYWMwYzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTJmMGVmZTI3NzY2NGZkZWEzY2U3OGRmOTZmODZlZjIuYmluZFBvcHVwKHBvcHVwXzZiYmQ1ODcwYjY3MDRiMDM4NWFlYzE2MDVmYTEwMTM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5M2FhYzVkOWZmOTQxOTA4NjY2YzJlM2IyNWQxZWE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2OTQ3NiwtNzkuNDExMzA3MjAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjZlMzFmNTdiZWJlNDIwOTg0NjQ1YzYyYjMwMjA1MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2JlOTEwNTFjMGZmNDQwYjkwNWQ2MTgzMTBmNTkzOGUgPSAkKCc8ZGl2IGlkPSJodG1sXzdiZTkxMDUxYzBmZjQ0MGI5MDVkNjE4MzEwZjU5MzhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNVA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2ZTMxZjU3YmViZTQyMDk4NDY0NWM2MmIzMDIwNTMyLnNldENvbnRlbnQoaHRtbF83YmU5MTA1MWMwZmY0NDBiOTA1ZDYxODMxMGY1OTM4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTNhYWM1ZDlmZjk0MTkwODY2NmMyZTNiMjVkMWVhOS5iaW5kUG9wdXAocG9wdXBfZjZlMzFmNTdiZWJlNDIwOTg0NjQ1YzYyYjMwMjA1MzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQ4ODM2ZDE5NmQ5NDk5OTg1OGYzODhjMjg2OTE3MGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjNkNWRhN2I0ZWE0NjgxYjk2OTRmZjVmOGNhNjIxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzUxMzQwOTQyZGE0YmExOGNlMmZhMjIwMTg5YTIxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc1MTM0MDk0MmRhNGJhMThjZTJmYTIyMDE4OWEyMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01UjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDYzZDVkYTdiNGVhNDY4MWI5Njk0ZmY1ZjhjYTYyMTAuc2V0Q29udGVudChodG1sXzQ3NTEzNDA5NDJkYTRiYTE4Y2UyZmEyMjAxODlhMjEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM0ODgzNmQxOTZkOTQ5OTk4NThmMzg4YzI4NjkxNzBhLmJpbmRQb3B1cChwb3B1cF80NjNkNWRhN2I0ZWE0NjgxYjk2OTRmZjVmOGNhNjIxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYjE2MmI1YWI2MzU0MTdhODRiNzRmZDEwMzYzNTA4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjY5NTYsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTRiMjhjZGIxYzI3NGJlYzhkNDdkZWNiNWYyNmQ5MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmNlZjc1MmM1NDNjNDg0Yzg2MWU5OGU4NGI0MzMwMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzZjZWY3NTJjNTQzYzQ4NGM4NjFlOThlODRiNDMzMDIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0YjI4Y2RiMWMyNzRiZWM4ZDQ3ZGVjYjVmMjZkOTI1LnNldENvbnRlbnQoaHRtbF82Y2VmNzUyYzU0M2M0ODRjODYxZTk4ZTg0YjQzMzAyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYjE2MmI1YWI2MzU0MTdhODRiNzRmZDEwMzYzNTA4NC5iaW5kUG9wdXAocG9wdXBfOTRiMjhjZGIxYzI3NGJlYzhkNDdkZWNiNWYyNmQ5MjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTdmMDBiNDNhM2E5NDEwM2E1ZDQzNjdmZGM4NTk3MWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTMyMDU3LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3NjhjZmFlMDliNTQ4NzM4ODM2OGY3YzJjNjc4MzQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwZDNhY2RkZWM5NTQ2YzU5ZGYyZjBmNDE2NDM5OTVkID0gJCgnPGRpdiBpZD0iaHRtbF83MGQzYWNkZGVjOTU0NmM1OWRmMmYwZjQxNjQzOTk1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzY4Y2ZhZTA5YjU0ODczODgzNjhmN2MyYzY3ODM0NC5zZXRDb250ZW50KGh0bWxfNzBkM2FjZGRlYzk1NDZjNTlkZjJmMGY0MTY0Mzk5NWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTdmMDBiNDNhM2E5NDEwM2E1ZDQzNjdmZGM4NTk3MWQuYmluZFBvcHVwKHBvcHVwX2I3NjhjZmFlMDliNTQ4NzM4ODM2OGY3YzJjNjc4MzQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczZGY5ZThmNDc1ZDQ4YTk4ZGU5N2VmNjI0YzhlZGM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjI4OTQ2NywtNzkuMzk0NDE5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMmEwOTZkNTY3MTI0YTEwOWM4OTUwNmI1MjUzOTQxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNmYzMTcwNmRmZjI0MDk1OTc4MzM3NThhYjRkM2UyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDZmMzE3MDZkZmYyNDA5NTk3ODMzNzU4YWI0ZDNlMjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01VjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzJhMDk2ZDU2NzEyNGExMDljODk1MDZiNTI1Mzk0MWEuc2V0Q29udGVudChodG1sX2Q2ZjMxNzA2ZGZmMjQwOTU5NzgzMzc1OGFiNGQzZTIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczZGY5ZThmNDc1ZDQ4YTk4ZGU5N2VmNjI0YzhlZGM0LmJpbmRQb3B1cChwb3B1cF9jMmEwOTZkNTY3MTI0YTEwOWM4OTUwNmI1MjUzOTQxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYWRiMWExMzcxNzY0MTJkOTE3MmQ2OTU2ODg4NTQ0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NjQzNTIsLTc5LjM3NDg0NTk5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyODMyY2M3NGY1MzRjZDM4ZGE3ZjE3ODdkMmY2YWYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2ZTlmNTNhYzU1MjRjNjhhYTY1NTBiNGY3OGY4MTlkID0gJCgnPGRpdiBpZD0iaHRtbF80NmU5ZjUzYWM1NTI0YzY4YWE2NTUwYjRmNzhmODE5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTVXPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjgzMmNjNzRmNTM0Y2QzOGRhN2YxNzg3ZDJmNmFmMy5zZXRDb250ZW50KGh0bWxfNDZlOWY1M2FjNTUyNGM2OGFhNjU1MGI0Zjc4ZjgxOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGFkYjFhMTM3MTc2NDEyZDkxNzJkNjk1Njg4ODU0NGMuYmluZFBvcHVwKHBvcHVwXzQyODMyY2M3NGY1MzRjZDM4ZGE3ZjE3ODdkMmY2YWYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyZDQ0Yjk4ZGVkMDQ4ZmQ4YWY5ZTEwNmY3NjE1OWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NDI5MiwtNzkuMzgyMjgwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOTY4N2U0ZDBjYmQ0ZjMwOWE5NjUzZjljMzZkMzcxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDk2Nzk2N2NmNjU0MWViYjg5YTdjNzI2OGVmNzc2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTA5Njc5NjdjZjY1NDFlYmI4OWE3YzcyNjhlZjc3NjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk01WDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk2ODdlNGQwY2JkNGYzMDlhOTY1M2Y5YzM2ZDM3MTAuc2V0Q29udGVudChodG1sXzUwOTY3OTY3Y2Y2NTQxZWJiODlhN2M3MjY4ZWY3NzYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyZDQ0Yjk4ZGVkMDQ4ZmQ4YWY5ZTEwNmY3NjE1OWZlLmJpbmRQb3B1cChwb3B1cF9jOTY4N2U0ZDBjYmQ0ZjMwOWE5NjUzZjljMzZkMzcxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNzg1ZGQ1YTQ5YTg0NDY3OWExOTdjNjY4ZDk5Nzg3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxODUxOCwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTAyMjM4NmY0ZjE1NGI1ZGFlNjRlMzYwNjczYjIyZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBjY2I4MjdlYzhlNGI0Yjk2ZTNkN2EwOTE5MDg5NTQgPSAkKCc8ZGl2IGlkPSJodG1sX2EwY2NiODI3ZWM4ZTRiNGI5NmUzZDdhMDkxOTA4OTU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNkE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwMjIzODZmNGYxNTRiNWRhZTY0ZTM2MDY3M2IyMmRjLnNldENvbnRlbnQoaHRtbF9hMGNjYjgyN2VjOGU0YjRiOTZlM2Q3YTA5MTkwODk1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNzg1ZGQ1YTQ5YTg0NDY3OWExOTdjNjY4ZDk5Nzg3NS5iaW5kUG9wdXAocG9wdXBfNTAyMjM4NmY0ZjE1NGI1ZGFlNjRlMzYwNjczYjIyZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGJkMzIxYTBiZDgyNDE1YWEwMzcyNWZiYWU1MTM3NjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDk1NzcsLTc5LjQ0NTA3MjU5OTk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyMzNlOWY3N2M2NjRkNjlhYmE1MjM4YTRkZThiZjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0MDRmYmYxZTVlMjQ5OGQ5MmVjZGE3NmQ2ZTRlZTJjID0gJCgnPGRpdiBpZD0iaHRtbF9jNDA0ZmJmMWU1ZTI0OThkOTJlY2RhNzZkNmU0ZWUyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTZCPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjMzZTlmNzdjNjY0ZDY5YWJhNTIzOGE0ZGU4YmYxNy5zZXRDb250ZW50KGh0bWxfYzQwNGZiZjFlNWUyNDk4ZDkyZWNkYTc2ZDZlNGVlMmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGJkMzIxYTBiZDgyNDE1YWEwMzcyNWZiYWU1MTM3NjIuYmluZFBvcHVwKHBvcHVwXzYyMzNlOWY3N2M2NjRkNjlhYmE1MjM4YTRkZThiZjE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxMGE2ODE3ODVjNDQwNDM5Y2NmNzdiNjAyYTJkNDdhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcxNzI5ZjdjNTkwNDFmZmJiMjA1NDE3ODc1MWU0NjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNjZmY5NWRmY2MzNDFhMGExNzU0MDllNDkyNDgzMjYgPSAkKCc8ZGl2IGlkPSJodG1sX2VjY2ZmOTVkZmNjMzQxYTBhMTc1NDA5ZTQ5MjQ4MzI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNkM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3MTcyOWY3YzU5MDQxZmZiYjIwNTQxNzg3NTFlNDYxLnNldENvbnRlbnQoaHRtbF9lY2NmZjk1ZGZjYzM0MWEwYTE3NTQwOWU0OTI0ODMyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MTBhNjgxNzg1YzQ0MDQzOWNjZjc3YjYwMmEyZDQ3YS5iaW5kUG9wdXAocG9wdXBfZDcxNzI5ZjdjNTkwNDFmZmJiMjA1NDE3ODc1MWU0NjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRhNDkzZmZjNGIwNGYwOTg1ZTg5YjVhMzY2OGJmNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODkwMjU2LC03OS40NTM1MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGZhODA2YzM1ODJiNGZmOThiZWRjZjc4YmJiMTdhN2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQ0MmU3ZTUwNWY3NDFmMGI0MTEyN2Q5MjM3MjFlNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzY0NDJlN2U1MDVmNzQxZjBiNDExMjdkOTIzNzIxZTZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNkU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmYTgwNmMzNTgyYjRmZjk4YmVkY2Y3OGJiYjE3YTdkLnNldENvbnRlbnQoaHRtbF82NDQyZTdlNTA1Zjc0MWYwYjQxMTI3ZDkyMzcyMWU2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZGE0OTNmZmM0YjA0ZjA5ODVlODliNWEzNjY4YmY2ZS5iaW5kUG9wdXAocG9wdXBfOGZhODA2YzM1ODJiNGZmOThiZWRjZjc4YmJiMTdhN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTczNWI2NjNmZWQwNDgwNjlkODQwZGQwMzFhMTViYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njk1NDIsLTc5LjQyMjU2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTVmZjE1MzYzZWVlNDFmMmEzNTE2NWU3YjUxMzAxMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ5MmVlNTk5N2FkNDE1M2JlNmM1MDIyMzQ3ZGY3ZTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0OTJlZTU5OTdhZDQxNTNiZTZjNTAyMjM0N2RmN2U2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNkc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1ZmYxNTM2M2VlZTQxZjJhMzUxNjVlN2I1MTMwMTBiLnNldENvbnRlbnQoaHRtbF9mNDkyZWU1OTk3YWQ0MTUzYmU2YzUwMjIzNDdkZjdlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzM1YjY2M2ZlZDA0ODA2OWQ4NDBkZDAzMWExNWJiMC5iaW5kUG9wdXAocG9wdXBfZTVmZjE1MzYzZWVlNDFmMmEzNTE2NWU3YjUxMzAxMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRhZmU0ZTFiODg1NDYxZWI0NWZlMWE4ODMxNjJkNTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYWI3NzcyOTEyYWQ0NWEwYTAzYjEwMWY5ZmRjZDQyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjM1N2JmMzEzYTA0M2ViYWU5YzQ1ZWYyNjdhYTA5OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmIzNTdiZjMxM2EwNDNlYmFlOWM0NWVmMjY3YWEwOTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk02SDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2FiNzc3MjkxMmFkNDVhMGEwM2IxMDFmOWZkY2Q0MjUuc2V0Q29udGVudChodG1sXzZiMzU3YmYzMTNhMDQzZWJhZTljNDVlZjI2N2FhMDk5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkYWZlNGUxYjg4NTQ2MWViNDVmZTFhODgzMTYyZDUxLmJpbmRQb3B1cChwb3B1cF8zYWI3NzcyOTEyYWQ0NWEwYTAzYjEwMWY5ZmRjZDQyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZjI4MDBkMmU0ZTY0MjhlYjdkYmU3Yjg2MjA3MTJhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzkyNjcwMDAwMDAwNiwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmZmNDg3ODQ5MzU0NDc4YWExYTUzYTIxYTkzNmJiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZDdlMzEwYjJkZWU0NTc1YjNjMWIxOGQwYzhhODEyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2Q3ZTMxMGIyZGVlNDU3NWIzYzFiMThkMGM4YTgxMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk02SjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZmZjQ4Nzg0OTM1NDQ3OGFhMWE1M2EyMWE5MzZiYmUuc2V0Q29udGVudChodG1sXzNkN2UzMTBiMmRlZTQ1NzViM2MxYjE4ZDBjOGE4MTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVmMjgwMGQyZTRlNjQyOGViN2RiZTdiODYyMDcxMmE0LmJpbmRQb3B1cChwb3B1cF9hNmZmNDg3ODQ5MzU0NDc4YWExYTUzYTIxYTkzNmJiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTU1MzA5ODU4NTU0NGIyOTgwMGMxMDJhNGE5OWU2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzOTZjN2NkYmQ1OTQ0MmE4YzQ1ZDJmMjBmNDFlNjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjNjM1MzUzOWQzYTQwMzZhODYxNzAyZjM3YjQyNTc5ID0gJCgnPGRpdiBpZD0iaHRtbF8xYzYzNTM1MzlkM2E0MDM2YTg2MTcwMmYzN2I0MjU3OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTZLPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzk2YzdjZGJkNTk0NDJhOGM0NWQyZjIwZjQxZTY0ZS5zZXRDb250ZW50KGh0bWxfMWM2MzUzNTM5ZDNhNDAzNmE4NjE3MDJmMzdiNDI1NzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTk1NTMwOTg1ODU1NDRiMjk4MDBjMTAyYTRhOTllNjkuYmluZFBvcHVwKHBvcHVwX2MzOTZjN2NkYmQ1OTQ0MmE4YzQ1ZDJmMjBmNDFlNjRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViMWZiMzdmMjg0MzRjZTRhMjIzYzJiNDg1ZjNmNGRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzNzU2MjAwMDAwMDEsLTc5LjQ5MDA3MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWVkNWVhMDhlZjIxNGViZTlkNjFkNWZiOWVlZmQ4Y2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDJhMmI2MzUxMTBjNGE2NTk1NWIxM2U2MTY0OGE0NDEgPSAkKCc8ZGl2IGlkPSJodG1sXzQyYTJiNjM1MTEwYzRhNjU5NTViMTNlNjE2NDhhNDQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NNkw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllZDVlYTA4ZWYyMTRlYmU5ZDYxZDVmYjllZWZkOGNiLnNldENvbnRlbnQoaHRtbF80MmEyYjYzNTExMGM0YTY1OTU1YjEzZTYxNjQ4YTQ0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjFmYjM3ZjI4NDM0Y2U0YTIyM2MyYjQ4NWYzZjRkYy5iaW5kUG9wdXAocG9wdXBfOWVkNWVhMDhlZjIxNGViZTlkNjFkNWZiOWVlZmQ4Y2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGVlNGQ1ZjNhOGQzNDdiOWJlMzc2NTI5ZDgwZDIwODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTExMTU4LC03OS40NzYwMTMyOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTRjMzQxNDQzZTc0N2ZkOTI1YmQwNDRmZGRkNTM4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjFiZmNlNTFmOTA0ZTM2OThhOTU5YjlkYWQ5OWE0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTYxYmZjZTUxZjkwNGUzNjk4YTk1OWI5ZGFkOTlhNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk02TTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmE0YzM0MTQ0M2U3NDdmZDkyNWJkMDQ0ZmRkZDUzOGMuc2V0Q29udGVudChodG1sXzE2MWJmY2U1MWY5MDRlMzY5OGE5NTliOWRhZDk5YTQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlZTRkNWYzYThkMzQ3YjliZTM3NjUyOWQ4MGQyMDg5LmJpbmRQb3B1cChwb3B1cF8yYTRjMzQxNDQzZTc0N2ZkOTI1YmQwNDRmZGRkNTM4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MzQyNzE1MTUzNWQ0MTFiYjAzMGM0NjQ2YjE0MjJjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MzE4NTI5OTk5OTk5LC03OS40ODcyNjE5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTU4NTk5YTE5NTI0MTBkOWE5OWE4YzhlNTUyYzRlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTFkY2UxOTJlMzQ0NmYyODE1YmFiYjBmMDM5MDdhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDExZGNlMTkyZTM0NDZmMjgxNWJhYmIwZjAzOTA3YWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk02TjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWU1ODU5OWExOTUyNDEwZDlhOTlhOGM4ZTU1MmM0ZWIuc2V0Q29udGVudChodG1sXzQxMWRjZTE5MmUzNDQ2ZjI4MTViYWJiMGYwMzkwN2FmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzNDI3MTUxNTM1ZDQxMWJiMDMwYzQ2NDZiMTQyMmNhLmJpbmRQb3B1cChwb3B1cF85ZTU4NTk5YTE5NTI0MTBkOWE5OWE4YzhlNTUyYzRlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZjg3ODYwZjEzYjI0NGUzYmU3MjNlMjBlOGIzYWQyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MTYwODMsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3YjYxODk1ZTY2ODQ1NGU4YTNjOGNkZjA5NTJlMzQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5NWVmZmEyNjMzMjQyODY5ZDJlMTQ2OGYzZjM5Nzg2ID0gJCgnPGRpdiBpZD0iaHRtbF9jOTVlZmZhMjYzMzI0Mjg2OWQyZTE0NjhmM2YzOTc4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTZQPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xN2I2MTg5NWU2Njg0NTRlOGEzYzhjZGYwOTUyZTM0MS5zZXRDb250ZW50KGh0bWxfYzk1ZWZmYTI2MzMyNDI4NjlkMmUxNDY4ZjNmMzk3ODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2Y4Nzg2MGYxM2IyNDRlM2JlNzIzZTIwZThiM2FkMmUuYmluZFBvcHVwKHBvcHVwXzE3YjYxODk1ZTY2ODQ1NGU4YTNjOGNkZjA5NTJlMzQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4NWYxOGVhYWRhMTRmOTc4N2ZiYTc1N2Q4NmJhZWFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4OTU5NywtNzkuNDU2MzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkOGQ2OTFhZDE3MDQ3ZTRhYWRmMThiMzg2MTA1OGFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwOTIxNTc3MjI0NjQxNTE5ZTEyMTU2OWJhOTc1ZWI1ID0gJCgnPGRpdiBpZD0iaHRtbF8xMDkyMTU3NzIyNDY0MTUxOWUxMjE1NjliYTk3NWViNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTZSPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZDhkNjkxYWQxNzA0N2U0YWFkZjE4YjM4NjEwNThhZC5zZXRDb250ZW50KGh0bWxfMTA5MjE1NzcyMjQ2NDE1MTllMTIxNTY5YmE5NzVlYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODg1ZjE4ZWFhZGExNGY5Nzg3ZmJhNzU3ZDg2YmFlYWQuYmluZFBvcHVwKHBvcHVwX2RkOGQ2OTFhZDE3MDQ3ZTRhYWRmMThiMzg2MTA1OGFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1N2YzZTNhMmM3MDQ5Nzk5ZGI5NjllOTVmMmJjZTJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNTcwNiwtNzkuNDg0NDQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MjVmYTNkZmRmYjU0MDY3OWUwZjMwNWY4YzU0N2M0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTMzMWQzMGQ1MmM0ZTI0OGVkMmZmOTY5MmQ5YmMyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTEzMzFkMzBkNTJjNGUyNDhlZDJmZjk2OTJkOWJjMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk02UzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTI1ZmEzZGZkZmI1NDA2NzllMGYzMDVmOGM1NDdjNDMuc2V0Q29udGVudChodG1sX2UxMzMxZDMwZDUyYzRlMjQ4ZWQyZmY5NjkyZDliYzJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1N2YzZTNhMmM3MDQ5Nzk5ZGI5NjllOTVmMmJjZTJlLmJpbmRQb3B1cChwb3B1cF81MjVmYTNkZmRmYjU0MDY3OWUwZjMwNWY4YzU0N2M0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzIxY2UwZTA4OGE0MDI0ODQ2MjgyNWRlZDUxMTc3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWE0ZjQzNDQ5MWI0NDYxZTg4ZTBiMjJlMmZkZjg3MDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE3NDlkNzIzYjQ4NGU4OWI1Y2U0NGYxNjc5ODYxY2MgPSAkKCc8ZGl2IGlkPSJodG1sX2MxNzQ5ZDcyM2I0ODRlODliNWNlNDRmMTY3OTg2MWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NN0E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhNGY0MzQ0OTFiNDQ2MWU4OGUwYjIyZTJmZGY4NzA2LnNldENvbnRlbnQoaHRtbF9jMTc0OWQ3MjNiNDg0ZTg5YjVjZTQ0ZjE2Nzk4NjFjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YzIxY2UwZTA4OGE0MDI0ODQ2MjgyNWRlZDUxMTc3OC5iaW5kUG9wdXAocG9wdXBfNWE0ZjQzNDQ5MWI0NDYxZTg4ZTBiMjJlMmZkZjg3MDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTNlMTU5OTI0YWIwNDIyZDllYmJhNTBjMTk3NzFjZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzY5NjU2LC03OS42MTU4MTg5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lODI0Y2VkZDBkZmM0MDc2YmI0OWMyYzYzOWU4NGU5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZmI5NDNhNzBmMzg0M2Q3OTRlOTQzNjQ3NjAwNTA4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWZiOTQzYTcwZjM4NDNkNzk0ZTk0MzY0NzYwMDUwODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk03UjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTgyNGNlZGQwZGZjNDA3NmJiNDljMmM2MzllODRlOTAuc2V0Q29udGVudChodG1sX2FmYjk0M2E3MGYzODQzZDc5NGU5NDM2NDc2MDA1MDg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzZTE1OTkyNGFiMDQyMmQ5ZWJiYTUwYzE5NzcxY2RiLmJpbmRQb3B1cChwb3B1cF9lODI0Y2VkZDBkZmM0MDc2YmI0OWMyYzYzOWU4NGU5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZTM4MzQyNjY1NTM0MDQwYmYwZmM2OGFmNTgwOWVhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Mjc0MzksLTc5LjMyMTU1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTk0ZDk2M2Q3MzU0Yzk4YTgyNWM1YjBkMjk5ZGI5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjFjY2IyMDY2NGE0YmY5ODMzZTMxZWE3NzgwYTBmMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjIxY2NiMjA2NjRhNGJmOTgzM2UzMWVhNzc4MGEwZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk03WTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDU5NGQ5NjNkNzM1NGM5OGE4MjVjNWIwZDI5OWRiOTQuc2V0Q29udGVudChodG1sXzIyMWNjYjIwNjY0YTRiZjk4MzNlMzFlYTc3ODBhMGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlMzgzNDI2NjU1MzQwNDBiZjBmYzY4YWY1ODA5ZWFlLmJpbmRQb3B1cChwb3B1cF80NTk0ZDk2M2Q3MzU0Yzk4YTgyNWM1YjBkMjk5ZGI5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTk3YWFkZGMxYTY0OWUyODJmZjFlNzEwMTVlZmM1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYwNTY0NjYsLTc5LjUwMTMyMDcwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2YmZjZjQ5ZTU4NzQ1ODc5MDQ2Njk1Zjk5MzI4ZmFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlMDI5ZDViMGZhYzRkNzY4MGI3ZDA2YmUwZTlmZDQzID0gJCgnPGRpdiBpZD0iaHRtbF83ZTAyOWQ1YjBmYWM0ZDc2ODBiN2QwNmJlMGU5ZmQ0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TThWPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmJmY2Y0OWU1ODc0NTg3OTA0NjY5NWY5OTMyOGZhZC5zZXRDb250ZW50KGh0bWxfN2UwMjlkNWIwZmFjNGQ3NjgwYjdkMDZiZTBlOWZkNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTk5N2FhZGRjMWE2NDllMjgyZmYxZTcxMDE1ZWZjNWMuYmluZFBvcHVwKHBvcHVwX2Y2YmZjZjQ5ZTU4NzQ1ODc5MDQ2Njk1Zjk5MzI4ZmFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc0MTQ5NDIyYjM3YTQ4MmRiM2ZlODZkN2Y1ZWY2OTNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0NGExOGUyM2RjMDRkYWVhMTRmNDY3ZjgzZTczYzM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmOTA5ODRiZjNhYjQzN2FiM2Y0ZTRjOTg0YmNiMTU5ID0gJCgnPGRpdiBpZD0iaHRtbF9jZjkwOTg0YmYzYWI0MzdhYjNmNGU0Yzk4NGJjYjE1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TThXPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDRhMThlMjNkYzA0ZGFlYTE0ZjQ2N2Y4M2U3M2MzOC5zZXRDb250ZW50KGh0bWxfY2Y5MDk4NGJmM2FiNDM3YWIzZjRlNGM5ODRiY2IxNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQxNDk0MjJiMzdhNDgyZGIzZmU4NmQ3ZjVlZjY5M2MuYmluZFBvcHVwKHBvcHVwX2Y0NGExOGUyM2RjMDRkYWVhMTRmNDY3ZjgzZTczYzM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkZmEzZjA4N2FlZjQ4ZTc5NjQ2MGE0NTU0MWFlMjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUzNjUzNjAwMDAwMDEsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzA5NzBlNjVkMWRhNDk3OTgxMjQwMjdiMDEzMDFkOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI2Mjc4NmYzZGMwNDVmNDlhNzFlMmNhODQ5ZDc0NzYgPSAkKCc8ZGl2IGlkPSJodG1sXzViNjI3ODZmM2RjMDQ1ZjQ5YTcxZTJjYTg0OWQ3NDc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NOFg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwOTcwZTY1ZDFkYTQ5Nzk4MTI0MDI3YjAxMzAxZDlkLnNldENvbnRlbnQoaHRtbF81YjYyNzg2ZjNkYzA0NWY0OWE3MWUyY2E4NDlkNzQ3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZGZhM2YwODdhZWY0OGU3OTY0NjBhNDU1NDFhZTIxYS5iaW5kUG9wdXAocG9wdXBfYzA5NzBlNjVkMWRhNDk3OTgxMjQwMjdiMDEzMDFkOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGI1YjMwNjI2YzllNDI4ZDhmM2VhZmE0NmMzZmNlNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzYyNTc5LC03OS40OTg1MDkwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZTZiNjgyMGIzYzg0MjljOWM3ZTY3ZWEyYTA1ZjAwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDFhNjUwYTVlMjg0ODQ2ODllZWIzYjE0MzEzNTdkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGQxYTY1MGE1ZTI4NDg0Njg5ZWViM2IxNDMxMzU3ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk04WTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGU2YjY4MjBiM2M4NDI5YzljN2U2N2VhMmEwNWYwMGEuc2V0Q29udGVudChodG1sXzRkMWE2NTBhNWUyODQ4NDY4OWVlYjNiMTQzMTM1N2RmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiNWIzMDYyNmM5ZTQyOGQ4ZjNlYWZhNDZjM2ZjZTQ0LmJpbmRQb3B1cChwb3B1cF80ZTZiNjgyMGIzYzg0MjljOWM3ZTY3ZWEyYTA1ZjAwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmRmNWVmZjg4ODg0NzU5YTM4NzI3MzQ5MGI0MTBhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiZmM5N2I4ZDJjYTRjZTc5OTJiNzM2ZDVhZDI3YmFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhZDE5NDQzOTRjMDQ1NDZhZTVkZTExMzQ3ZTg5MDE5ID0gJCgnPGRpdiBpZD0iaHRtbF85YWQxOTQ0Mzk0YzA0NTQ2YWU1ZGUxMTM0N2U4OTAxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TThaPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYmZjOTdiOGQyY2E0Y2U3OTkyYjczNmQ1YWQyN2JhYi5zZXRDb250ZW50KGh0bWxfOWFkMTk0NDM5NGMwNDU0NmFlNWRlMTEzNDdlODkwMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWZkZjVlZmY4ODg4NDc1OWEzODcyNzM0OTBiNDEwYTYuYmluZFBvcHVwKHBvcHVwXzBiZmM5N2I4ZDJjYTRjZTc5OTJiNzM2ZDVhZDI3YmFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxMWM4NTQ4ZTRiMDRhZmViODMxOTMyNmU4YTdhNjJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3ODU1NiwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGMxYjBkZThlYzljNDliNmJiNjNmNjcxN2RhOWZhZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2I3ZjFhYjAxYTkwNGM2YjgzNDUzMGU5NzA2NDQwNjQgPSAkKCc8ZGl2IGlkPSJodG1sXzNiN2YxYWIwMWE5MDRjNmI4MzQ1MzBlOTcwNjQ0MDY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NOUE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjMWIwZGU4ZWM5YzQ5YjZiYjYzZjY3MTdkYTlmYWYyLnNldENvbnRlbnQoaHRtbF8zYjdmMWFiMDFhOTA0YzZiODM0NTMwZTk3MDY0NDA2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMTFjODU0OGU0YjA0YWZlYjgzMTkzMjZlOGE3YTYyYS5iaW5kUG9wdXAocG9wdXBfNGMxYjBkZThlYzljNDliNmJiNjNmNjcxN2RhOWZhZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQ2M2FhNzM2M2QyNDYwNGEwZjVhYWY0YzdiMzEyNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA5NDMyLC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YTVkMzA1YTZmM2Q0MmVkYTFlYTM5ODViNzY2MWI4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTUxOTlkNTZiMTY0YzJhYjUyM2FiNmJlODcxNjczMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmE1MTk5ZDU2YjE2NGMyYWI1MjNhYjZiZTg3MTY3MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk05QjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGE1ZDMwNWE2ZjNkNDJlZGExZWEzOTg1Yjc2NjFiODYuc2V0Q29udGVudChodG1sXzJhNTE5OWQ1NmIxNjRjMmFiNTIzYWI2YmU4NzE2NzMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0NjNhYTczNjNkMjQ2MDRhMGY1YWFmNGM3YjMxMjYxLmJpbmRQb3B1cChwb3B1cF80YTVkMzA1YTZmM2Q0MmVkYTFlYTM5ODViNzY2MWI4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTQzNjYxYzAxYjI0MmFhOTg3MDE2NDEwOWQ3MWUzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2YzEzYjU4ZWQ4MzRlZTc5NWE2MDI1NGM1YTNjYTYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0OTMwNjgxNTJmYzQ2NTk5NTRhZGIwNTgzZjRjMWNkID0gJCgnPGRpdiBpZD0iaHRtbF8xNDkzMDY4MTUyZmM0NjU5OTU0YWRiMDU4M2Y0YzFjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTlDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NmMxM2I1OGVkODM0ZWU3OTVhNjAyNTRjNWEzY2E2Mi5zZXRDb250ZW50KGh0bWxfMTQ5MzA2ODE1MmZjNDY1OTk1NGFkYjA1ODNmNGMxY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzk0MzY2MWMwMWIyNDJhYTk4NzAxNjQxMDlkNzFlMzcuYmluZFBvcHVwKHBvcHVwXzU2YzEzYjU4ZWQ4MzRlZTc5NWE2MDI1NGM1YTNjYTYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyZDZjOTM4NGI5MTQwNWI4NzExMDQxMjYwM2I3Yzk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU2MzAzMywtNzkuNTY1OTYzMjk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzk0NzRlNDg3NjI3NDlkMGFkZWQwNDk1ZWRjMTg4MWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBiZjdhMjQ4MzVkNDdhYjk5YzI4MjljZGVjMjAwZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzcwYmY3YTI0ODM1ZDQ3YWI5OWMyODI5Y2RlYzIwMGQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NOUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM5NDc0ZTQ4NzYyNzQ5ZDBhZGVkMDQ5NWVkYzE4ODFjLnNldENvbnRlbnQoaHRtbF83MGJmN2EyNDgzNWQ0N2FiOTljMjgyOWNkZWMyMDBkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MmQ2YzkzODRiOTE0MDViODcxMTA0MTI2MDNiN2M5OS5iaW5kUG9wdXAocG9wdXBfMzk0NzRlNDg3NjI3NDlkMGFkZWQwNDk1ZWRjMTg4MWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGY0NzQxY2RjMzE3NDkwYjkzNTNkNjU3Njk0ODFjZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjQ3NjU5LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDNjMjhkYWQ0MmM0YTE3OTljYzU2Yjg1NDA5NmMyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMGY4ZTRiZjQ4Nzg0NDFkODMwYzlmNTI2YzRmZDYwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDBmOGU0YmY0ODc4NDQxZDgzMGM5ZjUyNmM0ZmQ2MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk05TTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2QzYzI4ZGFkNDJjNGExNzk5Y2M1NmI4NTQwOTZjMjcuc2V0Q29udGVudChodG1sX2QwZjhlNGJmNDg3ODQ0MWQ4MzBjOWY1MjZjNGZkNjA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmNDc0MWNkYzMxNzQ5MGI5MzUzZDY1NzY5NDgxY2ZjLmJpbmRQb3B1cChwb3B1cF9jZDNjMjhkYWQ0MmM0YTE3OTljYzU2Yjg1NDA5NmMyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjllMTNkM2U3M2E0NzVjOTJlMzdjOWNiMjdmYjZmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjg3NiwtNzkuNTE4MTg4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE4Nzk5ZTk1NDVmNDZmMTljMzM1Mzk1MjE0NjNiMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdiN2UwYTM3ZDkxNDZmNWIyYWI0OTQ2ZTc2M2RjZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2M3YjdlMGEzN2Q5MTQ2ZjViMmFiNDk0NmU3NjNkY2ZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NOU48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhODc5OWU5NTQ1ZjQ2ZjE5YzMzNTM5NTIxNDYzYjM3LnNldENvbnRlbnQoaHRtbF9jN2I3ZTBhMzdkOTE0NmY1YjJhYjQ5NDZlNzYzZGNmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjllMTNkM2U3M2E0NzVjOTJlMzdjOWNiMjdmYjZmNS5iaW5kUG9wdXAocG9wdXBfMGE4Nzk5ZTk1NDVmNDZmMTljMzM1Mzk1MjE0NjNiMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE0MGViNzdiYTBhNDE5Y2ExZGM2ODRlOTgxODBlNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0OTdiNDVlYjQ0NjRjODhhYzYwZGY3YzYwMzhjMTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4YmI0MDFmN2E2ZjQ4MDU4YTA5M2JjYTViM2JjMjhjID0gJCgnPGRpdiBpZD0iaHRtbF9kOGJiNDAxZjdhNmY0ODA1OGEwOTNiY2E1YjNiYzI4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTlQPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNDk3YjQ1ZWI0NDY0Yzg4YWM2MGRmN2M2MDM4YzEwOC5zZXRDb250ZW50KGh0bWxfZDhiYjQwMWY3YTZmNDgwNThhMDkzYmNhNWIzYmMyOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmE0MGViNzdiYTBhNDE5Y2ExZGM2ODRlOTgxODBlNjguYmluZFBvcHVwKHBvcHVwXzI0OTdiNDVlYjQ0NjRjODhhYzYwZGY3YzYwMzhjMTA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyZDFkMWExY2UzMTRhYmJiOGRkMjA1OGVjMjdiNDNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg4OTA1NCwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGRlYmFhMzM3NmQ3NGE2OGI1OTQyOTk0NjBhZDZkZWYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZkYmRlMTk3YzQ2NGJlNWEyOTg1YjhmM2FlZGRlYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzJlMWY0MDczZTAzNDFkNjhmYmNkNWY1Y2VhMDJiYmMgPSAkKCc8ZGl2IGlkPSJodG1sXzcyZTFmNDA3M2UwMzQxZDY4ZmJjZDVmNWNlYTAyYmJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NOVI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmZGJkZTE5N2M0NjRiZTVhMjk4NWI4ZjNhZWRkZWMzLnNldENvbnRlbnQoaHRtbF83MmUxZjQwNzNlMDM0MWQ2OGZiY2Q1ZjVjZWEwMmJiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMmQxZDFhMWNlMzE0YWJiYjhkZDIwNThlYzI3YjQzYi5iaW5kUG9wdXAocG9wdXBfNWZkYmRlMTk3YzQ2NGJlNWEyOTg1YjhmM2FlZGRlYzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQxNjIwMTRmNDVlNGJlYmI3M2ZiNzQ3OGU5MWExNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mzk0MTY0LC03OS41ODg0MzY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRkZWJhYTMzNzZkNzRhNjhiNTk0Mjk5NDYwYWQ2ZGVmKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4Y2UyYzVlMTA2OTRmM2U5ZmEzNDE4NTBhOTdiYTcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhODZkZWE3OGU4NzRmOWRiODNjMzI1MGRhNTAyNzE3ID0gJCgnPGRpdiBpZD0iaHRtbF80YTg2ZGVhNzhlODc0ZjlkYjgzYzMyNTBkYTUwMjcxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TTlWPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OGNlMmM1ZTEwNjk0ZjNlOWZhMzQxODUwYTk3YmE3Mi5zZXRDb250ZW50KGh0bWxfNGE4NmRlYTc4ZTg3NGY5ZGI4M2MzMjUwZGE1MDI3MTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQxNjIwMTRmNDVlNGJlYmI3M2ZiNzQ3OGU5MWExNmQuYmluZFBvcHVwKHBvcHVwXzk4Y2UyYzVlMTA2OTRmM2U5ZmEzNDE4NTBhOTdiYTcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4Njk5ZjdhMmIxYzQwYmZiMjA1NjM1ZGM2MTliNDAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2NzQ4MywtNzkuNTk0MDU0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80ZGViYWEzMzc2ZDc0YTY4YjU5NDI5OTQ2MGFkNmRlZik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NDJiNWIwOWQ5Njg0ZWUzOTFlM2NjYmFkNTQyYmQ0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NzE2ZTIwM2Y4ZjY0ODE0OTE4Mjk1NTE4ZWFkZDgzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfODcxNmUyMDNmOGY2NDgxNDkxODI5NTUxOGVhZGQ4MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk05VzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzQyYjViMDlkOTY4NGVlMzkxZTNjY2JhZDU0MmJkNGQuc2V0Q29udGVudChodG1sXzg3MTZlMjAzZjhmNjQ4MTQ5MTgyOTU1MThlYWRkODMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4Njk5ZjdhMmIxYzQwYmZiMjA1NjM1ZGM2MTliNDAwLmJpbmRQb3B1cChwb3B1cF83NDJiNWIwOWQ5Njg0ZWUzOTFlM2NjYmFkNTQyYmQ0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f13c4b0c668>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for lat, lng, zipc in zip(df['Latitude'], df['Longitude'], df['PostalCode']):\n",
" label = zipc\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_on) \n",
" \n",
"map_on"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: your-client-ID\n",
"CLIENT_SECRET:your-client-secret\n"
]
}
],
"source": [
"#foursquare\n",
"CLIENT_ID = '4DO4NABHC4XVZFAOFZA4XFA5XGSRMW14MOZMQMRASGFXGEBO' # your Foursquare ID\n",
"CLIENT_SECRET = 'BKWVXLJXJYXJ20GIEOHEQUVOEAPHUYW2PA4TSNTB2501TFII' # 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": "code",
"execution_count": null,
"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)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment