Created
February 8, 2021 13:58
-
-
Save ipattis/4af4650b6f9181e7fe8355e893261789 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n", | |
| "\n", | |
| "<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Introduction\n", | |
| "\n", | |
| "In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the _k_-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Table of Contents\n", | |
| "\n", | |
| "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n", | |
| "\n", | |
| "<font size = 3>\n", | |
| "\n", | |
| "1. <a href=\"#item1\">Download and Explore Dataset</a>\n", | |
| "\n", | |
| "2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n", | |
| "\n", | |
| "3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n", | |
| "\n", | |
| "4. <a href=\"#item4\">Cluster Neighborhoods</a>\n", | |
| "\n", | |
| "5. <a href=\"#item5\">Examine Clusters</a> \n", | |
| " </font>\n", | |
| " </div>\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Before we get the data and start exploring it, let's download all the dependencies that we will need.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Collecting package metadata (current_repodata.json): done\n", | |
| "Solving environment: done\n", | |
| "\n", | |
| "## Package Plan ##\n", | |
| "\n", | |
| " environment location: /home/jupyterlab/conda/envs/python\n", | |
| "\n", | |
| " added / updated specs:\n", | |
| " - geopy\n", | |
| "\n", | |
| "\n", | |
| "The following packages will be downloaded:\n", | |
| "\n", | |
| " package | build\n", | |
| " ---------------------------|-----------------\n", | |
| " certifi-2020.12.5 | py36h5fab9bb_1 143 KB conda-forge\n", | |
| " geographiclib-1.50 | py_0 34 KB conda-forge\n", | |
| " geopy-2.1.0 | pyhd3deb0d_0 64 KB conda-forge\n", | |
| " ------------------------------------------------------------\n", | |
| " Total: 240 KB\n", | |
| "\n", | |
| "The following NEW packages will be INSTALLED:\n", | |
| "\n", | |
| " geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n", | |
| " geopy conda-forge/noarch::geopy-2.1.0-pyhd3deb0d_0\n", | |
| "\n", | |
| "The following packages will be UPDATED:\n", | |
| "\n", | |
| " certifi 2020.12.5-py36h5fab9bb_0 --> 2020.12.5-py36h5fab9bb_1\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "Downloading and Extracting Packages\n", | |
| "geopy-2.1.0 | 64 KB | ##################################### | 100% \n", | |
| "certifi-2020.12.5 | 143 KB | ##################################### | 100% \n", | |
| "geographiclib-1.50 | 34 KB | ##################################### | 100% \n", | |
| "Preparing transaction: done\n", | |
| "Verifying transaction: done\n", | |
| "Executing transaction: done\n", | |
| "Libraries imported.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import numpy as np # library to handle data in a vectorized manner\n", | |
| "\n", | |
| "import pandas as pd # library for data analsysis\n", | |
| "pd.set_option('display.max_columns', None)\n", | |
| "pd.set_option('display.max_rows', None)\n", | |
| "\n", | |
| "import json # library to handle JSON files\n", | |
| "\n", | |
| "!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n", | |
| "from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n", | |
| "\n", | |
| "import requests # library to handle requests\n", | |
| "from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n", | |
| "\n", | |
| "# Matplotlib and associated plotting modules\n", | |
| "import matplotlib.cm as cm\n", | |
| "import matplotlib.colors as colors\n", | |
| "\n", | |
| "# import k-means from clustering stage\n", | |
| "from sklearn.cluster import KMeans\n", | |
| "\n", | |
| "#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n", | |
| "import folium # map rendering library\n", | |
| "\n", | |
| "print('Libraries imported.')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "<a id='item1'></a>\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 1. Download and Explore Dataset\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Neighborhood has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Data downloaded!\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "!wget -q -O 'newyork_data.json' https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-DS0701EN-SkillsNetwork/labs/newyork_data.json\n", | |
| "print('Data downloaded!')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Load and explore the data\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Next, let's load the data.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with open('newyork_data.json') as json_data:\n", | |
| " newyork_data = json.load(json_data)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let's take a quick look at the data.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'type': 'FeatureCollection',\n", | |
| " 'totalFeatures': 306,\n", | |
| " 'features': [{'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.1',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84720052054902, 40.89470517661]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Wakefield',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Wakefield',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84720052054902,\n", | |
| " 40.89470517661,\n", | |
| " -73.84720052054902,\n", | |
| " 40.89470517661]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.2',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82993910812398, 40.87429419303012]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Co-op City',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Co-op',\n", | |
| " 'annoline2': 'City',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.82993910812398,\n", | |
| " 40.87429419303012,\n", | |
| " -73.82993910812398,\n", | |
| " 40.87429419303012]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.3',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82780644716412, 40.887555677350775]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Eastchester',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Eastchester',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.82780644716412,\n", | |
| " 40.887555677350775,\n", | |
| " -73.82780644716412,\n", | |
| " 40.887555677350775]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.4',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90564259591682, 40.89543742690383]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fieldston',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Fieldston',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90564259591682,\n", | |
| " 40.89543742690383,\n", | |
| " -73.90564259591682,\n", | |
| " 40.89543742690383]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.5',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9125854610857, 40.890834493891305]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Riverdale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Riverdale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.9125854610857,\n", | |
| " 40.890834493891305,\n", | |
| " -73.9125854610857,\n", | |
| " 40.890834493891305]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.6',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90281798724604, 40.88168737120521]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Kingsbridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Kingsbridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90281798724604,\n", | |
| " 40.88168737120521,\n", | |
| " -73.90281798724604,\n", | |
| " 40.88168737120521]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.7',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91065965862981, 40.87655077879964]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Marble Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Marble',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.91065965862981,\n", | |
| " 40.87655077879964,\n", | |
| " -73.91065965862981,\n", | |
| " 40.87655077879964]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.8',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86731496814176, 40.89827261213805]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Woodlawn',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Woodlawn',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.86731496814176,\n", | |
| " 40.89827261213805,\n", | |
| " -73.86731496814176,\n", | |
| " 40.89827261213805]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.9',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8793907395681, 40.87722415599446]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Norwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Norwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8793907395681,\n", | |
| " 40.87722415599446,\n", | |
| " -73.8793907395681,\n", | |
| " 40.87722415599446]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.10',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85744642974207, 40.88103887819211]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Williamsbridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Williamsbridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85744642974207,\n", | |
| " 40.88103887819211,\n", | |
| " -73.85744642974207,\n", | |
| " 40.88103887819211]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.11',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.83579759808117, 40.866858107252696]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Baychester',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Baychester',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.83579759808117,\n", | |
| " 40.866858107252696,\n", | |
| " -73.83579759808117,\n", | |
| " 40.866858107252696]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.12',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85475564017999, 40.85741349808865]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Pelham Parkway',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Pelham Parkway',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85475564017999,\n", | |
| " 40.85741349808865,\n", | |
| " -73.85475564017999,\n", | |
| " 40.85741349808865]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.13',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.78648845267413, 40.84724670491813]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'City Island',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'City',\n", | |
| " 'annoline2': 'Island',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.78648845267413,\n", | |
| " 40.84724670491813,\n", | |
| " -73.78648845267413,\n", | |
| " 40.84724670491813]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.14',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8855121841913, 40.870185164975325]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bedford Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bedford',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8855121841913,\n", | |
| " 40.870185164975325,\n", | |
| " -73.8855121841913,\n", | |
| " 40.870185164975325]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.15',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9104159619131, 40.85572707719664]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'University Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'University',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.9104159619131,\n", | |
| " 40.85572707719664,\n", | |
| " -73.9104159619131,\n", | |
| " 40.85572707719664]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.16',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91967159119565, 40.84789792606271]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Morris Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Morris',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91967159119565,\n", | |
| " 40.84789792606271,\n", | |
| " -73.91967159119565,\n", | |
| " 40.84789792606271]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.17',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.89642655981623, 40.86099679638654]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fordham',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Fordham',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.89642655981623,\n", | |
| " 40.86099679638654,\n", | |
| " -73.89642655981623,\n", | |
| " 40.86099679638654]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.18',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88735617532338, 40.84269615786053]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Tremont',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'East',\n", | |
| " 'annoline2': 'Tremont',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.88735617532338,\n", | |
| " 40.84269615786053,\n", | |
| " -73.88735617532338,\n", | |
| " 40.84269615786053]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.19',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.87774474910545, 40.83947505672653]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'West Farms',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'West',\n", | |
| " 'annoline2': 'Farms',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.87774474910545,\n", | |
| " 40.83947505672653,\n", | |
| " -73.87774474910545,\n", | |
| " 40.83947505672653]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.20',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9261020935813, 40.836623010706056]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'High Bridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Highbridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.9261020935813,\n", | |
| " 40.836623010706056,\n", | |
| " -73.9261020935813,\n", | |
| " 40.836623010706056]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.21',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90942160757436, 40.819754370594936]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Melrose',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Melrose',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90942160757436,\n", | |
| " 40.819754370594936,\n", | |
| " -73.90942160757436,\n", | |
| " 40.819754370594936]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.22',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91609987487575, 40.80623874935177]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Mott Haven',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Mott Haven',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91609987487575,\n", | |
| " 40.80623874935177,\n", | |
| " -73.91609987487575,\n", | |
| " 40.80623874935177]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.23',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91322139386135, 40.801663627756206]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Port Morris',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Port',\n", | |
| " 'annoline2': 'Morris',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91322139386135,\n", | |
| " 40.801663627756206,\n", | |
| " -73.91322139386135,\n", | |
| " 40.801663627756206]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.24',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8957882009446, 40.81509904545822]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Longwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Longwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8957882009446,\n", | |
| " 40.81509904545822,\n", | |
| " -73.8957882009446,\n", | |
| " 40.81509904545822]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.25',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88331505955291, 40.80972987938709]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hunts Point',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Hunts',\n", | |
| " 'annoline2': 'Point',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.88331505955291,\n", | |
| " 40.80972987938709,\n", | |
| " -73.88331505955291,\n", | |
| " 40.80972987938709]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.26',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90150648943059, 40.82359198585534]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Morrisania',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Morrisania',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90150648943059,\n", | |
| " 40.82359198585534,\n", | |
| " -73.90150648943059,\n", | |
| " 40.82359198585534]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.27',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86574609554924, 40.821012197914015]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Soundview',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Soundview',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.86574609554924,\n", | |
| " 40.821012197914015,\n", | |
| " -73.86574609554924,\n", | |
| " 40.821012197914015]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.28',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85414416189266, 40.80655112003589]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Clason Point',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Clason',\n", | |
| " 'annoline2': 'Point',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85414416189266,\n", | |
| " 40.80655112003589,\n", | |
| " -73.85414416189266,\n", | |
| " 40.80655112003589]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.29',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.81635002158441, 40.81510925804005]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Throgs Neck',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Throgs Neck',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.81635002158441,\n", | |
| " 40.81510925804005,\n", | |
| " -73.81635002158441,\n", | |
| " 40.81510925804005]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.30',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8240992675385, 40.844245936947374]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Country Club',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Country',\n", | |
| " 'annoline2': 'Club',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8240992675385,\n", | |
| " 40.844245936947374,\n", | |
| " -73.8240992675385,\n", | |
| " 40.844245936947374]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.31',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85600310535783, 40.837937822267286]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Parkchester',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Parkchester',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85600310535783,\n", | |
| " 40.837937822267286,\n", | |
| " -73.85600310535783,\n", | |
| " 40.837937822267286]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.32',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84219407604444, 40.8406194964327]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Westchester Square',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Westchester',\n", | |
| " 'annoline2': 'Square',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84219407604444,\n", | |
| " 40.8406194964327,\n", | |
| " -73.84219407604444,\n", | |
| " 40.8406194964327]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.33',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8662991807561, 40.84360847124718]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Van Nest',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Van',\n", | |
| " 'annoline2': 'Nest',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8662991807561,\n", | |
| " 40.84360847124718,\n", | |
| " -73.8662991807561,\n", | |
| " 40.84360847124718]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.34',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85040178030421, 40.847549063536334]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Morris Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Morris Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85040178030421,\n", | |
| " 40.847549063536334,\n", | |
| " -73.85040178030421,\n", | |
| " 40.847549063536334]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.35',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88845196134804, 40.85727710073895]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Belmont',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Belmont',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.88845196134804,\n", | |
| " 40.85727710073895,\n", | |
| " -73.88845196134804,\n", | |
| " 40.85727710073895]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.36',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91719048210393, 40.88139497727086]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Spuyten Duyvil',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Spuyten',\n", | |
| " 'annoline2': 'Duyvil',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91719048210393,\n", | |
| " 40.88139497727086,\n", | |
| " -73.91719048210393,\n", | |
| " 40.88139497727086]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.37',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90453054908927, 40.90854282950666]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'North Riverdale',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'North',\n", | |
| " 'annoline2': 'Riverdale',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90453054908927,\n", | |
| " 40.90854282950666,\n", | |
| " -73.90453054908927,\n", | |
| " 40.90854282950666]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.38',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8320737824047, 40.85064140940335]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Pelham Bay',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Pelham',\n", | |
| " 'annoline2': 'Bay',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.8320737824047,\n", | |
| " 40.85064140940335,\n", | |
| " -73.8320737824047,\n", | |
| " 40.85064140940335]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.39',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82620275994073, 40.82657951686922]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Schuylerville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Schuylerville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.82620275994073,\n", | |
| " 40.82657951686922,\n", | |
| " -73.82620275994073,\n", | |
| " 40.82657951686922]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.40',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.81388514428619, 40.821986118163494]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Edgewater Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Edgewater',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.81388514428619,\n", | |
| " 40.821986118163494,\n", | |
| " -73.81388514428619,\n", | |
| " 40.821986118163494]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.41',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84802729582735, 40.819014376988314]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Castle Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Castle',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84802729582735,\n", | |
| " 40.819014376988314,\n", | |
| " -73.84802729582735,\n", | |
| " 40.819014376988314]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.42',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86332361652777, 40.87137078192371]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Olinville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Olinville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.86332361652777,\n", | |
| " 40.87137078192371,\n", | |
| " -73.86332361652777,\n", | |
| " 40.87137078192371]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.43',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84161194831223, 40.86296562477998]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Pelham Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Pelham',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84161194831223,\n", | |
| " 40.86296562477998,\n", | |
| " -73.84161194831223,\n", | |
| " 40.86296562477998]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.44',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91558941773444, 40.83428380733851]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Concourse',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Concourse',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91558941773444,\n", | |
| " 40.83428380733851,\n", | |
| " -73.91558941773444,\n", | |
| " 40.83428380733851]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.45',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85053524451935, 40.82977429787161]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Unionport',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Unionport',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85053524451935,\n", | |
| " 40.82977429787161,\n", | |
| " -73.85053524451935,\n", | |
| " 40.82977429787161]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.46',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84808271877168, 40.88456130303732]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Edenwald',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Edenwald',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84808271877168,\n", | |
| " 40.88456130303732,\n", | |
| " -73.84808271877168,\n", | |
| " 40.88456130303732]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.47',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.03062069353813, 40.625801065010656]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bay Ridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bay Ridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.03062069353813,\n", | |
| " 40.625801065010656,\n", | |
| " -74.03062069353813,\n", | |
| " 40.625801065010656]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.48',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99517998380729, 40.61100890202044]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bensonhurst',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bensonhurst',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99517998380729,\n", | |
| " 40.61100890202044,\n", | |
| " -73.99517998380729,\n", | |
| " 40.61100890202044]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.49',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.01031618527784, 40.64510294925429]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sunset Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sunset',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.01031618527784,\n", | |
| " 40.64510294925429,\n", | |
| " -74.01031618527784,\n", | |
| " 40.64510294925429]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.50',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95424093127393, 40.7302009848647]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Greenpoint',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Greenpoint',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95424093127393,\n", | |
| " 40.7302009848647,\n", | |
| " -73.95424093127393,\n", | |
| " 40.7302009848647]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.51',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97347087708445, 40.59526001306593]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Gravesend',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Gravesend',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.97347087708445,\n", | |
| " 40.59526001306593,\n", | |
| " -73.97347087708445,\n", | |
| " 40.59526001306593]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.52',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96509448785336, 40.57682506566604]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Brighton Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Brighton',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.96509448785336,\n", | |
| " 40.57682506566604,\n", | |
| " -73.96509448785336,\n", | |
| " 40.57682506566604]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.53',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94318640482979, 40.58689012678384]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sheepshead Bay',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sheepshead',\n", | |
| " 'annoline2': 'Bay',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94318640482979,\n", | |
| " 40.58689012678384,\n", | |
| " -73.94318640482979,\n", | |
| " 40.58689012678384]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.54',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95743840559939, 40.61443251335098]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Manhattan Terrace',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Manhattan',\n", | |
| " 'annoline2': 'Terrace',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95743840559939,\n", | |
| " 40.61443251335098,\n", | |
| " -73.95743840559939,\n", | |
| " 40.61443251335098]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.55',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95840106533903, 40.63632589026677]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Flatbush',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Flatbush',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95840106533903,\n", | |
| " 40.63632589026677,\n", | |
| " -73.95840106533903,\n", | |
| " 40.63632589026677]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.56',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94329119073582, 40.67082917695294]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Crown Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Crown',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94329119073582,\n", | |
| " 40.67082917695294,\n", | |
| " -73.94329119073582,\n", | |
| " 40.67082917695294]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.57',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93610256185836, 40.64171776668961]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Flatbush',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'East Flatbush',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93610256185836,\n", | |
| " 40.64171776668961,\n", | |
| " -73.93610256185836,\n", | |
| " 40.64171776668961]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.58',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98042110559474, 40.642381958003526]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Kensington',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Kensington',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98042110559474,\n", | |
| " 40.642381958003526,\n", | |
| " -73.98042110559474,\n", | |
| " 40.642381958003526]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.59',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98007340430172, 40.65694583575104]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Windsor Terrace',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Windsor',\n", | |
| " 'annoline2': 'Terrace',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98007340430172,\n", | |
| " 40.65694583575104,\n", | |
| " -73.98007340430172,\n", | |
| " 40.65694583575104]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.60',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9648592426269, 40.676822262254724]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Prospect Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Prospect',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.9648592426269,\n", | |
| " 40.676822262254724,\n", | |
| " -73.9648592426269,\n", | |
| " 40.676822262254724]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.61',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91023536176607, 40.66394994339755]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Brownsville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Brownsville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.91023536176607,\n", | |
| " 40.66394994339755,\n", | |
| " -73.91023536176607,\n", | |
| " 40.66394994339755]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.62',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95811529220927, 40.70714439344251]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Williamsburg',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Williamsburg',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95811529220927,\n", | |
| " 40.70714439344251,\n", | |
| " -73.95811529220927,\n", | |
| " 40.70714439344251]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.63',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92525797487045, 40.69811611017901]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bushwick',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bushwick',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.92525797487045,\n", | |
| " 40.69811611017901,\n", | |
| " -73.92525797487045,\n", | |
| " 40.69811611017901]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.64',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94178488690297, 40.687231607720456]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bedford Stuyvesant',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bedford Stuyvesant',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94178488690297,\n", | |
| " 40.687231607720456,\n", | |
| " -73.94178488690297,\n", | |
| " 40.687231607720456]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.65',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99378225496424, 40.695863722724084]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Brooklyn Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Brooklyn',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99378225496424,\n", | |
| " 40.695863722724084,\n", | |
| " -73.99378225496424,\n", | |
| " 40.695863722724084]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.66',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99856139218463, 40.687919722485574]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Cobble Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Cobble',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99856139218463,\n", | |
| " 40.687919722485574,\n", | |
| " -73.99856139218463,\n", | |
| " 40.687919722485574]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.67',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99465372828006, 40.680540231076485]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Carroll Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Carroll',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99465372828006,\n", | |
| " 40.680540231076485,\n", | |
| " -73.99465372828006,\n", | |
| " 40.680540231076485]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.68',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0127589747356, 40.676253230250886]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Red Hook',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Red',\n", | |
| " 'annoline2': 'Hook',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.0127589747356,\n", | |
| " 40.676253230250886,\n", | |
| " -74.0127589747356,\n", | |
| " 40.676253230250886]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.69',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99444087145339, 40.673931143187154]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Gowanus',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Gowanus',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99444087145339,\n", | |
| " 40.673931143187154,\n", | |
| " -73.99444087145339,\n", | |
| " 40.673931143187154]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.70',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97290574369092, 40.68852726018977]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fort Greene',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Fort',\n", | |
| " 'annoline2': 'Greene',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.97290574369092,\n", | |
| " 40.68852726018977,\n", | |
| " -73.97290574369092,\n", | |
| " 40.68852726018977]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.71',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97705030183924, 40.67232052268197]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Park Slope',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Park',\n", | |
| " 'annoline2': 'Slope',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.97705030183924,\n", | |
| " 40.67232052268197,\n", | |
| " -73.97705030183924,\n", | |
| " 40.67232052268197]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.72',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.87661596457296, 40.68239101144211]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Cypress Hills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Cypress',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.87661596457296,\n", | |
| " 40.68239101144211,\n", | |
| " -73.87661596457296,\n", | |
| " 40.68239101144211]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.73',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88069863917366, 40.669925700847045]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East New York',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'East New York',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.88069863917366,\n", | |
| " 40.669925700847045,\n", | |
| " -73.88069863917366,\n", | |
| " 40.669925700847045]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.74',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.87936970045875, 40.64758905230874]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Starrett City',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Starrett',\n", | |
| " 'annoline2': 'City',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.87936970045875,\n", | |
| " 40.64758905230874,\n", | |
| " -73.87936970045875,\n", | |
| " 40.64758905230874]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.75',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90209269778966, 40.63556432797428]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Canarsie',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Canarsie',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.90209269778966,\n", | |
| " 40.63556432797428,\n", | |
| " -73.90209269778966,\n", | |
| " 40.63556432797428]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.76',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92911302644674, 40.630446043757466]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Flatlands',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Flatlands',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.92911302644674,\n", | |
| " 40.630446043757466,\n", | |
| " -73.92911302644674,\n", | |
| " 40.630446043757466]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.77',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90818571777423, 40.606336421685626]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Mill Island',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Mill',\n", | |
| " 'annoline2': 'Island',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.90818571777423,\n", | |
| " 40.606336421685626,\n", | |
| " -73.90818571777423,\n", | |
| " 40.606336421685626]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.78',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94353722891886, 40.57791350308657]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Manhattan Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Manhattan',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94353722891886,\n", | |
| " 40.57791350308657,\n", | |
| " -73.94353722891886,\n", | |
| " 40.57791350308657]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.79',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98868295821637, 40.57429256471601]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Coney Island',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Coney Island',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98868295821637,\n", | |
| " 40.57429256471601,\n", | |
| " -73.98868295821637,\n", | |
| " 40.57429256471601]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.80',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99875221443519, 40.59951870282238]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bath Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bath',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99875221443519,\n", | |
| " 40.59951870282238,\n", | |
| " -73.99875221443519,\n", | |
| " 40.59951870282238]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.81',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99049823044811, 40.633130512758015]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Borough Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Borough',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99049823044811,\n", | |
| " 40.633130512758015,\n", | |
| " -73.99049823044811,\n", | |
| " 40.633130512758015]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.82',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.01931375636022, 40.619219457722636]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Dyker Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Dyker',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.01931375636022,\n", | |
| " 40.619219457722636,\n", | |
| " -74.01931375636022,\n", | |
| " 40.619219457722636]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.83',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93010170691196, 40.590848433902046]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Gerritsen Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Gerritsen',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93010170691196,\n", | |
| " 40.590848433902046,\n", | |
| " -73.93010170691196,\n", | |
| " 40.590848433902046]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.84',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93134404108497, 40.609747779894604]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Marine Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Marine Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93134404108497,\n", | |
| " 40.609747779894604,\n", | |
| " -73.93134404108497,\n", | |
| " 40.609747779894604]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.85',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96784306216367, 40.693229421881504]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Clinton Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Clinton',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.96784306216367,\n", | |
| " 40.693229421881504,\n", | |
| " -73.96784306216367,\n", | |
| " 40.693229421881504]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.86',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0078731120024, 40.57637537890224]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sea Gate',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sea',\n", | |
| " 'annoline2': 'Gate',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.0078731120024,\n", | |
| " 40.57637537890224,\n", | |
| " -74.0078731120024,\n", | |
| " 40.57637537890224]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.87',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98346337431099, 40.69084402109802]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Downtown',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Downtown',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98346337431099,\n", | |
| " 40.69084402109802,\n", | |
| " -73.98346337431099,\n", | |
| " 40.69084402109802]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.88',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98374824115798, 40.685682912091444]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Boerum Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Boerum',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98374824115798,\n", | |
| " 40.685682912091444,\n", | |
| " -73.98374824115798,\n", | |
| " 40.685682912091444]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.89',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95489867077713, 40.658420017469815]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Prospect Lefferts Gardens',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Prospect',\n", | |
| " 'annoline2': 'Lefferts',\n", | |
| " 'annoline3': 'Gardens',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95489867077713,\n", | |
| " 40.658420017469815,\n", | |
| " -73.95489867077713,\n", | |
| " 40.658420017469815]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.90',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91306831787395, 40.678402554795355]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ocean Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Ocean',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.91306831787395,\n", | |
| " 40.678402554795355,\n", | |
| " -73.91306831787395,\n", | |
| " 40.678402554795355]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.91',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86797598081334, 40.67856995727479]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'City Line',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'City',\n", | |
| " 'annoline2': 'Line',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.86797598081334,\n", | |
| " 40.67856995727479,\n", | |
| " -73.86797598081334,\n", | |
| " 40.67856995727479]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.92',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.89855633630317, 40.61514955045308]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bergen Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bergen',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.89855633630317,\n", | |
| " 40.61514955045308,\n", | |
| " -73.89855633630317,\n", | |
| " 40.61514955045308]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.93',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95759523489838, 40.62559589869843]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Midwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Midwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95759523489838,\n", | |
| " 40.62559589869843,\n", | |
| " -73.95759523489838,\n", | |
| " 40.62559589869843]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.94',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96261316716048, 40.647008603185185]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Prospect Park South',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Prospect',\n", | |
| " 'annoline2': 'Park South',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.96261316716048,\n", | |
| " 40.647008603185185,\n", | |
| " -73.96261316716048,\n", | |
| " 40.647008603185185]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.95',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91607483951324, 40.62384524478419]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Georgetown',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Georgetown',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.91607483951324,\n", | |
| " 40.62384524478419,\n", | |
| " -73.91607483951324,\n", | |
| " 40.62384524478419]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.96',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93885815269195, 40.70849241041548]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Williamsburg',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'East',\n", | |
| " 'annoline2': 'Williamsburg',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93885815269195,\n", | |
| " 40.70849241041548,\n", | |
| " -73.93885815269195,\n", | |
| " 40.70849241041548]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.97',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95880857587582, 40.714822906532014]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'North Side',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'North Side',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95880857587582,\n", | |
| " 40.714822906532014,\n", | |
| " -73.95880857587582,\n", | |
| " 40.714822906532014]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.98',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95800095153331, 40.71086147265064]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'South Side',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'South Side',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95800095153331,\n", | |
| " 40.71086147265064,\n", | |
| " -73.95800095153331,\n", | |
| " 40.71086147265064]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.99',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96836678035541, 40.61305976667942]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ocean Parkway',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Ocean',\n", | |
| " 'annoline2': 'Parkway',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.96836678035541,\n", | |
| " 40.61305976667942,\n", | |
| " -73.96836678035541,\n", | |
| " 40.61305976667942]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.100',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.03197914537984, 40.61476812694226]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fort Hamilton',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Fort',\n", | |
| " 'annoline2': 'Hamilton',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-74.03197914537984,\n", | |
| " 40.61476812694226,\n", | |
| " -74.03197914537984,\n", | |
| " 40.61476812694226]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.101',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99427936255978, 40.71561842231432]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Chinatown',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Chinatown',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.99427936255978,\n", | |
| " 40.71561842231432,\n", | |
| " -73.99427936255978,\n", | |
| " 40.71561842231432]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.102',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93690027985234, 40.85190252555305]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Washington Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Washington',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.93690027985234,\n", | |
| " 40.85190252555305,\n", | |
| " -73.93690027985234,\n", | |
| " 40.85190252555305]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.103',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92121042203897, 40.86768396449915]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Inwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Inwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.92121042203897,\n", | |
| " 40.86768396449915,\n", | |
| " -73.92121042203897,\n", | |
| " 40.86768396449915]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.104',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94968791883366, 40.823604284811935]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hamilton Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Hamilton',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.94968791883366,\n", | |
| " 40.823604284811935,\n", | |
| " -73.94968791883366,\n", | |
| " 40.823604284811935]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.105',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9573853935188, 40.8169344294978]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Manhattanville',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Manhattanville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.9573853935188,\n", | |
| " 40.8169344294978,\n", | |
| " -73.9573853935188,\n", | |
| " 40.8169344294978]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.106',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94321112603905, 40.81597606742414]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Central Harlem',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Central',\n", | |
| " 'annoline2': 'Harlem',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.94321112603905,\n", | |
| " 40.81597606742414,\n", | |
| " -73.94321112603905,\n", | |
| " 40.81597606742414]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.107',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94418223148524, 40.79224946663033]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Harlem',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'East',\n", | |
| " 'annoline2': 'Harlem',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.94418223148524,\n", | |
| " 40.79224946663033,\n", | |
| " -73.94418223148524,\n", | |
| " 40.79224946663033]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.108',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96050763135, 40.775638573301805]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Upper East Side',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Upper',\n", | |
| " 'annoline2': 'East',\n", | |
| " 'annoline3': 'Side',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.96050763135,\n", | |
| " 40.775638573301805,\n", | |
| " -73.96050763135,\n", | |
| " 40.775638573301805]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.109',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94711784471826, 40.775929849884875]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Yorkville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Yorkville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.94711784471826,\n", | |
| " 40.775929849884875,\n", | |
| " -73.94711784471826,\n", | |
| " 40.775929849884875]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.110',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9588596881376, 40.76811265828733]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lenox Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Lenox',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.9588596881376,\n", | |
| " 40.76811265828733,\n", | |
| " -73.9588596881376,\n", | |
| " 40.76811265828733]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.111',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94916769227953, 40.76215960576283]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Roosevelt Island',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Roosevelt Island',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 56,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.94916769227953,\n", | |
| " 40.76215960576283,\n", | |
| " -73.94916769227953,\n", | |
| " 40.76215960576283]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.112',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97705923630603, 40.787657998534854]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Upper West Side',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Upper',\n", | |
| " 'annoline2': 'West',\n", | |
| " 'annoline3': 'Side',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.97705923630603,\n", | |
| " 40.787657998534854,\n", | |
| " -73.97705923630603,\n", | |
| " 40.787657998534854]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.113',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98533777001262, 40.77352888942166]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lincoln Square',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Lincoln',\n", | |
| " 'annoline2': 'Square',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98533777001262,\n", | |
| " 40.77352888942166,\n", | |
| " -73.98533777001262,\n", | |
| " 40.77352888942166]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.114',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99611936309479, 40.75910089146212]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Clinton',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Clinton',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.99611936309479,\n", | |
| " 40.75910089146212,\n", | |
| " -73.99611936309479,\n", | |
| " 40.75910089146212]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.115',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98166882730304, 40.75469110270623]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Midtown',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Midtown',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98166882730304,\n", | |
| " 40.75469110270623,\n", | |
| " -73.98166882730304,\n", | |
| " 40.75469110270623]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.116',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97833207924127, 40.748303077252174]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Murray Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Murray',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.97833207924127,\n", | |
| " 40.748303077252174,\n", | |
| " -73.97833207924127,\n", | |
| " 40.748303077252174]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.117',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.00311633472813, 40.744034706747975]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Chelsea',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Chelsea',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.00311633472813,\n", | |
| " 40.744034706747975,\n", | |
| " -74.00311633472813,\n", | |
| " 40.744034706747975]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.118',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99991402945902, 40.72693288536128]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Greenwich Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Greenwich',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.99991402945902,\n", | |
| " 40.72693288536128,\n", | |
| " -73.99991402945902,\n", | |
| " 40.72693288536128]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.119',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98222616506416, 40.727846777270244]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'East',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98222616506416,\n", | |
| " 40.727846777270244,\n", | |
| " -73.98222616506416,\n", | |
| " 40.727846777270244]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.120',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98089031999291, 40.71780674892765]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lower East Side',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Lower',\n", | |
| " 'annoline2': 'East',\n", | |
| " 'annoline3': 'Side',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98089031999291,\n", | |
| " 40.71780674892765,\n", | |
| " -73.98089031999291,\n", | |
| " 40.71780674892765]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.121',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.01068328559087, 40.721521967443216]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Tribeca',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Tribeca',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.01068328559087,\n", | |
| " 40.721521967443216,\n", | |
| " -74.01068328559087,\n", | |
| " 40.721521967443216]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.122',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99730467208073, 40.71932379395907]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Little Italy',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Little',\n", | |
| " 'annoline2': 'Italy',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.99730467208073,\n", | |
| " 40.71932379395907,\n", | |
| " -73.99730467208073,\n", | |
| " 40.71932379395907]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.123',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.00065666959759, 40.72218384131794]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Soho',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Soho',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.00065666959759,\n", | |
| " 40.72218384131794,\n", | |
| " -74.00065666959759,\n", | |
| " 40.72218384131794]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.124',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.00617998126812, 40.73443393572434]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'West Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'West',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.00617998126812,\n", | |
| " 40.73443393572434,\n", | |
| " -74.00617998126812,\n", | |
| " 40.73443393572434]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.125',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96428617740655, 40.797307041702865]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Manhattan Valley',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Manhattan',\n", | |
| " 'annoline2': 'Valley',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.96428617740655,\n", | |
| " 40.797307041702865,\n", | |
| " -73.96428617740655,\n", | |
| " 40.797307041702865]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.126',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96389627905332, 40.807999738165826]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Morningside Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Morningside',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.96389627905332,\n", | |
| " 40.807999738165826,\n", | |
| " -73.96389627905332,\n", | |
| " 40.807999738165826]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.127',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98137594833541, 40.737209832715]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Gramercy',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Gramercy',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98137594833541,\n", | |
| " 40.737209832715,\n", | |
| " -73.98137594833541,\n", | |
| " 40.737209832715]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.128',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.01686930508617, 40.71193198394565]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Battery Park City',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Battery',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': 'City',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.01686930508617,\n", | |
| " 40.71193198394565,\n", | |
| " -74.01686930508617,\n", | |
| " 40.71193198394565]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.129',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0106654452127, 40.70710710727048]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Financial District',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Financial',\n", | |
| " 'annoline2': 'District',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.0106654452127,\n", | |
| " 40.70710710727048,\n", | |
| " -74.0106654452127,\n", | |
| " 40.70710710727048]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.130',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91565374304234, 40.76850859335492]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Astoria',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Astoria',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.91565374304234,\n", | |
| " 40.76850859335492,\n", | |
| " -73.91565374304234,\n", | |
| " 40.76850859335492]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.131',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90184166838284, 40.74634908860222]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Woodside',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Woodside',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.90184166838284,\n", | |
| " 40.74634908860222,\n", | |
| " -73.90184166838284,\n", | |
| " 40.74634908860222]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.132',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88282109164365, 40.75198138007367]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Jackson Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Jackson',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.88282109164365,\n", | |
| " 40.75198138007367,\n", | |
| " -73.88282109164365,\n", | |
| " 40.75198138007367]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.133',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88165622288388, 40.744048505122024]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Elmhurst',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Elmhurst',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.88165622288388,\n", | |
| " 40.744048505122024,\n", | |
| " -73.88165622288388,\n", | |
| " 40.744048505122024]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.134',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8381376460028, 40.65422527738487]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Howard Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Howard',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8381376460028,\n", | |
| " 40.65422527738487,\n", | |
| " -73.8381376460028,\n", | |
| " 40.65422527738487]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.135',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85682497345258, 40.74238175015667]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Corona',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Corona',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.85682497345258,\n", | |
| " 40.74238175015667,\n", | |
| " -73.85682497345258,\n", | |
| " 40.74238175015667]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.136',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84447500788983, 40.72526378216503]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Forest Hills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Forest',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.84447500788983,\n", | |
| " 40.72526378216503,\n", | |
| " -73.84447500788983,\n", | |
| " 40.72526378216503]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.137',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82981905825703, 40.7051790354148]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Kew Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Kew',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.82981905825703,\n", | |
| " 40.7051790354148,\n", | |
| " -73.82981905825703,\n", | |
| " 40.7051790354148]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.138',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.83183321446887, 40.69794731471763]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Richmond Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Richmond',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.83183321446887,\n", | |
| " 40.69794731471763,\n", | |
| " -73.83183321446887,\n", | |
| " 40.69794731471763]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.139',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.83177300329582, 40.76445419697846]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Flushing',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Flushing',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.83177300329582,\n", | |
| " 40.76445419697846,\n", | |
| " -73.83177300329582,\n", | |
| " 40.76445419697846]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.140',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93920223915505, 40.75021734610528]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Long Island City',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Long',\n", | |
| " 'annoline2': 'Island',\n", | |
| " 'annoline3': 'City',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.93920223915505,\n", | |
| " 40.75021734610528,\n", | |
| " -73.93920223915505,\n", | |
| " 40.75021734610528]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.141',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92691617561577, 40.74017628351924]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sunnyside',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Sunnyside',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.92691617561577,\n", | |
| " 40.74017628351924,\n", | |
| " -73.92691617561577,\n", | |
| " 40.74017628351924]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.142',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86704147658772, 40.76407323883091]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'East Elmhurst',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'East',\n", | |
| " 'annoline2': 'Elmhurst',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.86704147658772,\n", | |
| " 40.76407323883091,\n", | |
| " -73.86704147658772,\n", | |
| " 40.76407323883091]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.143',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.89621713626859, 40.725427374093606]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Maspeth',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Maspeth',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.89621713626859,\n", | |
| " 40.725427374093606,\n", | |
| " -73.89621713626859,\n", | |
| " 40.725427374093606]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.144',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90143517559589, 40.70832315613858]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ridgewood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Ridgewood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.90143517559589,\n", | |
| " 40.70832315613858,\n", | |
| " -73.90143517559589,\n", | |
| " 40.70832315613858]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.145',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.87074167435605, 40.70276242967838]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Glendale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Glendale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.87074167435605,\n", | |
| " 40.70276242967838,\n", | |
| " -73.87074167435605,\n", | |
| " 40.70276242967838]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.146',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8578268690537, 40.72897409480735]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rego Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rego Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8578268690537,\n", | |
| " 40.72897409480735,\n", | |
| " -73.8578268690537,\n", | |
| " 40.72897409480735]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.147',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8581104655432, 40.68988687915789]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Woodhaven',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Woodhaven',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8581104655432,\n", | |
| " 40.68988687915789,\n", | |
| " -73.8581104655432,\n", | |
| " 40.68988687915789]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.148',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84320266173447, 40.680708468265415]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ozone Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Ozone Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.84320266173447,\n", | |
| " 40.680708468265415,\n", | |
| " -73.84320266173447,\n", | |
| " 40.680708468265415]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.149',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.80986478649041, 40.66854957767195]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'South Ozone Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'South',\n", | |
| " 'annoline2': 'Ozone Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.80986478649041,\n", | |
| " 40.66854957767195,\n", | |
| " -73.80986478649041,\n", | |
| " 40.66854957767195]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.150',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84304528896125, 40.784902749260205]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'College Point',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'College',\n", | |
| " 'annoline2': 'Point',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.84304528896125,\n", | |
| " 40.784902749260205,\n", | |
| " -73.84304528896125,\n", | |
| " 40.784902749260205]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.151',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.81420216610863, 40.78129076602694]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Whitestone',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Whitestone',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.81420216610863,\n", | |
| " 40.78129076602694,\n", | |
| " -73.81420216610863,\n", | |
| " 40.78129076602694]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.152',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7742736306867, 40.76604063281064]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bayside',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bayside',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7742736306867,\n", | |
| " 40.76604063281064,\n", | |
| " -73.7742736306867,\n", | |
| " 40.76604063281064]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.153',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79176243728061, 40.76172954903262]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Auburndale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Auburndale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79176243728061,\n", | |
| " 40.76172954903262,\n", | |
| " -73.79176243728061,\n", | |
| " 40.76172954903262]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.154',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7388977558074, 40.7708261928267]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Little Neck',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Little',\n", | |
| " 'annoline2': 'Neck',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7388977558074,\n", | |
| " 40.7708261928267,\n", | |
| " -73.7388977558074,\n", | |
| " 40.7708261928267]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.155',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7424982072733, 40.76684609790763]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Douglaston',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Douglaston',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7424982072733,\n", | |
| " 40.76684609790763,\n", | |
| " -73.7424982072733,\n", | |
| " 40.76684609790763]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.156',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.71548118999145, 40.74944079974332]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Glen Oaks',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Glen',\n", | |
| " 'annoline2': 'Oaks',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.71548118999145,\n", | |
| " 40.74944079974332,\n", | |
| " -73.71548118999145,\n", | |
| " 40.74944079974332]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.157',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.72012814826903, 40.72857318176675]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bellerose',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bellerose',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.72012814826903,\n", | |
| " 40.72857318176675,\n", | |
| " -73.72012814826903,\n", | |
| " 40.72857318176675]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.158',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82087764933566, 40.722578244228046]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Kew Gardens Hills',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Kew',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': 'Hills',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.82087764933566,\n", | |
| " 40.722578244228046,\n", | |
| " -73.82087764933566,\n", | |
| " 40.722578244228046]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.159',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.78271337003264, 40.7343944653313]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fresh Meadows',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Fresh',\n", | |
| " 'annoline2': 'Meadows',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.78271337003264,\n", | |
| " 40.7343944653313,\n", | |
| " -73.78271337003264,\n", | |
| " 40.7343944653313]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.160',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.81174822458634, 40.71093547252271]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Briarwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Briarwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.81174822458634,\n", | |
| " 40.71093547252271,\n", | |
| " -73.81174822458634,\n", | |
| " 40.71093547252271]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.161',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79690165888289, 40.70465736068717]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Jamaica Center',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Jamaica',\n", | |
| " 'annoline2': 'Center',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79690165888289,\n", | |
| " 40.70465736068717,\n", | |
| " -73.79690165888289,\n", | |
| " 40.70465736068717]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.162',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.75494976234332, 40.74561857141855]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Oakland Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Oakland',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.75494976234332,\n", | |
| " 40.74561857141855,\n", | |
| " -73.75494976234332,\n", | |
| " 40.74561857141855]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.163',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.73871484578424, 40.718893092167356]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Queens Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Queens',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.73871484578424,\n", | |
| " 40.718893092167356,\n", | |
| " -73.73871484578424,\n", | |
| " 40.718893092167356]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.164',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.75925009335594, 40.71124344191904]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hollis',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Hollis',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.75925009335594,\n", | |
| " 40.71124344191904,\n", | |
| " -73.75925009335594,\n", | |
| " 40.71124344191904]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.165',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7904261313554, 40.696911253789885]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'South Jamaica',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'South Jamaica',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7904261313554,\n", | |
| " 40.696911253789885,\n", | |
| " -73.7904261313554,\n", | |
| " 40.696911253789885]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.166',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.75867603727717, 40.69444538522359]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'St. Albans',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'St. Albans',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.75867603727717,\n", | |
| " 40.69444538522359,\n", | |
| " -73.75867603727717,\n", | |
| " 40.69444538522359]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.167',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.77258787620906, 40.67521139591733]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rochdale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rochdale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.77258787620906,\n", | |
| " 40.67521139591733,\n", | |
| " -73.77258787620906,\n", | |
| " 40.67521139591733]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.168',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.76042092682287, 40.666230490368584]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Springfield Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Springfield',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.76042092682287,\n", | |
| " 40.666230490368584,\n", | |
| " -73.76042092682287,\n", | |
| " 40.666230490368584]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.169',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.73526873708026, 40.692774639160845]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Cambria Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Cambria',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.73526873708026,\n", | |
| " 40.692774639160845,\n", | |
| " -73.73526873708026,\n", | |
| " 40.692774639160845]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.170',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.73526079428278, 40.659816433428084]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rosedale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rosedale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.73526079428278,\n", | |
| " 40.659816433428084,\n", | |
| " -73.73526079428278,\n", | |
| " 40.659816433428084]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.171',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.75497968043872, 40.603134432500894]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Far Rockaway',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Far Rockaway',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.75497968043872,\n", | |
| " 40.603134432500894,\n", | |
| " -73.75497968043872,\n", | |
| " 40.603134432500894]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.172',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8200548911032, 40.60302658351238]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Broad Channel',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Broad',\n", | |
| " 'annoline2': 'Channel',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8200548911032,\n", | |
| " 40.60302658351238,\n", | |
| " -73.8200548911032,\n", | |
| " 40.60302658351238]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.173',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92551196994168, 40.55740128845452]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Breezy Point',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Breezy',\n", | |
| " 'annoline2': 'Point',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.92551196994168,\n", | |
| " 40.55740128845452,\n", | |
| " -73.92551196994168,\n", | |
| " 40.55740128845452]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.174',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90228960391673, 40.775923015642896]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Steinway',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Steinway',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.90228960391673,\n", | |
| " 40.775923015642896,\n", | |
| " -73.90228960391673,\n", | |
| " 40.775923015642896]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.175',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.80436451720988, 40.79278140360048]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Beechhurst',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Beechhurst',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.80436451720988,\n", | |
| " 40.79278140360048,\n", | |
| " -73.80436451720988,\n", | |
| " 40.79278140360048]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.176',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7768022262158, 40.782842806245554]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bay Terrace',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bay',\n", | |
| " 'annoline2': 'Terrace',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7768022262158,\n", | |
| " 40.782842806245554,\n", | |
| " -73.7768022262158,\n", | |
| " 40.782842806245554]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.177',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.77613282391705, 40.595641807368494]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Edgemere',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Edgemere',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.77613282391705,\n", | |
| " 40.595641807368494,\n", | |
| " -73.77613282391705,\n", | |
| " 40.595641807368494]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.178',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79199233136943, 40.58914394372971]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Arverne',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Arverne',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79199233136943,\n", | |
| " 40.58914394372971,\n", | |
| " -73.79199233136943,\n", | |
| " 40.58914394372971]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.179',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82236121088751, 40.582801696845586]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rockaway Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Rockaway',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.82236121088751,\n", | |
| " 40.582801696845586,\n", | |
| " -73.82236121088751,\n", | |
| " 40.582801696845586]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.180',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85754672410827, 40.572036730217015]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Neponsit',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Neponsit',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.85754672410827,\n", | |
| " 40.572036730217015,\n", | |
| " -73.85754672410827,\n", | |
| " 40.572036730217015]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.181',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.81276269135866, 40.764126122614066]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Murray Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Murray',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.81276269135866,\n", | |
| " 40.764126122614066,\n", | |
| " -73.81276269135866,\n", | |
| " 40.764126122614066]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.182',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.70884705889246, 40.741378421945434]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Floral Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Floral Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.70884705889246,\n", | |
| " 40.741378421945434,\n", | |
| " -73.70884705889246,\n", | |
| " 40.741378421945434]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.183',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.76714166714729, 40.7209572076444]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Holliswood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Holliswood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.76714166714729,\n", | |
| " 40.7209572076444,\n", | |
| " -73.76714166714729,\n", | |
| " 40.7209572076444]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.184',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.7872269693666, 40.71680483014613]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Jamaica Estates',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Jamaica',\n", | |
| " 'annoline2': 'Estates',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.7872269693666,\n", | |
| " 40.71680483014613,\n", | |
| " -73.7872269693666,\n", | |
| " 40.71680483014613]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.185',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82580915110559, 40.7445723092867]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Queensboro Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Queensboro',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.82580915110559,\n", | |
| " 40.7445723092867,\n", | |
| " -73.82580915110559,\n", | |
| " 40.7445723092867]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.186',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79760300912672, 40.723824901829204]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hillcrest',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Hillcrest',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79760300912672,\n", | |
| " 40.723824901829204,\n", | |
| " -73.79760300912672,\n", | |
| " 40.723824901829204]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.187',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93157506072878, 40.761704526054146]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ravenswood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Ravenswood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.93157506072878,\n", | |
| " 40.761704526054146,\n", | |
| " -73.93157506072878,\n", | |
| " 40.761704526054146]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.188',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84963782402441, 40.66391841925139]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lindenwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Lindenwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.84963782402441,\n", | |
| " 40.66391841925139,\n", | |
| " -73.84963782402441,\n", | |
| " 40.66391841925139]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.189',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.74025607989822, 40.66788389660247]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Laurelton',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Laurelton',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.74025607989822,\n", | |
| " 40.66788389660247,\n", | |
| " -73.74025607989822,\n", | |
| " 40.66788389660247]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.190',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8625247141374, 40.736074570830795]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lefrak City',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Lefrak',\n", | |
| " 'annoline2': 'City',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8625247141374,\n", | |
| " 40.736074570830795,\n", | |
| " -73.8625247141374,\n", | |
| " 40.736074570830795]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.191',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8540175039252, 40.57615556543109]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Belle Harbor',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Belle Harbor',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8540175039252,\n", | |
| " 40.57615556543109,\n", | |
| " -73.8540175039252,\n", | |
| " 40.57615556543109]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.192',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84153370226186, 40.58034295646131]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rockaway Park',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rockaway Park',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.84153370226186,\n", | |
| " 40.58034295646131,\n", | |
| " -73.84153370226186,\n", | |
| " 40.58034295646131]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.193',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79664750844047, 40.59771061565768]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Somerville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Somerville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79664750844047,\n", | |
| " 40.59771061565768,\n", | |
| " -73.79664750844047,\n", | |
| " 40.59771061565768]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.194',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.75175310731153, 40.66000322733613]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Brookville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Brookville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.75175310731153,\n", | |
| " 40.66000322733613,\n", | |
| " -73.75175310731153,\n", | |
| " 40.66000322733613]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.195',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.73889198912481, 40.73301404027834]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bellaire',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bellaire',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.73889198912481,\n", | |
| " 40.73301404027834,\n", | |
| " -73.73889198912481,\n", | |
| " 40.73301404027834]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.196',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85751790676447, 40.7540709990489]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'North Corona',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'North',\n", | |
| " 'annoline2': 'Corona',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.85751790676447,\n", | |
| " 40.7540709990489,\n", | |
| " -73.85751790676447,\n", | |
| " 40.7540709990489]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.197',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.8410221123401, 40.7146110815117]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Forest Hills Gardens',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'Forest',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': 'Gardens',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.8410221123401,\n", | |
| " 40.7146110815117,\n", | |
| " -73.8410221123401,\n", | |
| " 40.7146110815117]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.198',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.07935312512797, 40.6449815710044]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'St. George',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'St.',\n", | |
| " 'annoline2': 'George',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.07935312512797,\n", | |
| " 40.6449815710044,\n", | |
| " -74.07935312512797,\n", | |
| " 40.6449815710044]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.199',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08701650516625, 40.64061455913511]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'New Brighton',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'New',\n", | |
| " 'annoline2': 'Brighton',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08701650516625,\n", | |
| " 40.64061455913511,\n", | |
| " -74.08701650516625,\n", | |
| " 40.64061455913511]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.200',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.07790192660066, 40.62692762538176]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Stapleton',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Stapleton',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.07790192660066,\n", | |
| " 40.62692762538176,\n", | |
| " -74.07790192660066,\n", | |
| " 40.62692762538176]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.201',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.06980526716141, 40.61530494652761]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rosebank',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rosebank',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.06980526716141,\n", | |
| " 40.61530494652761,\n", | |
| " -74.06980526716141,\n", | |
| " 40.61530494652761]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.202',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1071817826561, 40.63187892654607]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'West Brighton',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'West',\n", | |
| " 'annoline2': 'Brighton',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1071817826561,\n", | |
| " 40.63187892654607,\n", | |
| " -74.1071817826561,\n", | |
| " 40.63187892654607]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.203',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08724819983729, 40.624184791313006]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Grymes Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Grymes',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08724819983729,\n", | |
| " 40.624184791313006,\n", | |
| " -74.08724819983729,\n", | |
| " 40.624184791313006]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.204',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1113288180088, 40.59706851814673]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Todt Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Todt',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1113288180088,\n", | |
| " 40.59706851814673,\n", | |
| " -74.1113288180088,\n", | |
| " 40.59706851814673]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.205',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0795529253982, 40.58024741350956]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'South Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'South',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.0795529253982,\n", | |
| " 40.58024741350956,\n", | |
| " -74.0795529253982,\n", | |
| " 40.58024741350956]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.206',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.12943426797008, 40.63366930554365]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Port Richmond',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Port',\n", | |
| " 'annoline2': 'Richmond',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.12943426797008,\n", | |
| " 40.63366930554365,\n", | |
| " -74.12943426797008,\n", | |
| " 40.63366930554365]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.207',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.15008537046981, 40.632546390481124]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': \"Mariner's Harbor\",\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': \"Mariner's\",\n", | |
| " 'annoline2': 'Harbor',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.15008537046981,\n", | |
| " 40.632546390481124,\n", | |
| " -74.15008537046981,\n", | |
| " 40.632546390481124]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.208',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.17464532993542, 40.63968297845542]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Port Ivory',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Port',\n", | |
| " 'annoline2': 'Ivory',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.17464532993542,\n", | |
| " 40.63968297845542,\n", | |
| " -74.17464532993542,\n", | |
| " 40.63968297845542]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.209',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.11918058534842, 40.61333593766742]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Castleton Corners',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Castleton',\n", | |
| " 'annoline2': 'Corners',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.11918058534842,\n", | |
| " 40.61333593766742,\n", | |
| " -74.11918058534842,\n", | |
| " 40.61333593766742]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.210',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.16496031329827, 40.594252379161695]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'New Springville',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'New',\n", | |
| " 'annoline2': 'Springville',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.16496031329827,\n", | |
| " 40.594252379161695,\n", | |
| " -74.16496031329827,\n", | |
| " 40.594252379161695]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.211',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.19073717538116, 40.58631375103281]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Travis',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Travis',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.19073717538116,\n", | |
| " 40.58631375103281,\n", | |
| " -74.19073717538116,\n", | |
| " 40.58631375103281]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.212',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1164794360638, 40.57257231820632]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'New Dorp',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'New',\n", | |
| " 'annoline2': 'Dorp',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1164794360638,\n", | |
| " 40.57257231820632,\n", | |
| " -74.1164794360638,\n", | |
| " 40.57257231820632]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.213',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.12156593771896, 40.5584622432888]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Oakwood',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Oakwood',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.12156593771896,\n", | |
| " 40.5584622432888,\n", | |
| " -74.12156593771896,\n", | |
| " 40.5584622432888]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.214',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.14932381490992, 40.549480228713605]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Great Kills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Great',\n", | |
| " 'annoline2': 'Kills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.14932381490992,\n", | |
| " 40.549480228713605,\n", | |
| " -74.14932381490992,\n", | |
| " 40.549480228713605]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.215',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1643308041936, 40.542230747450745]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Eltingville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Eltingville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1643308041936,\n", | |
| " 40.542230747450745,\n", | |
| " -74.1643308041936,\n", | |
| " 40.542230747450745]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.216',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.17854866165878, 40.53811417474507]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Annadale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Annadale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.17854866165878,\n", | |
| " 40.53811417474507,\n", | |
| " -74.17854866165878,\n", | |
| " 40.53811417474507]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.217',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.20524582480326, 40.541967622888755]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Woodrow',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Woodrow',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.20524582480326,\n", | |
| " 40.541967622888755,\n", | |
| " -74.20524582480326,\n", | |
| " 40.541967622888755]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.218',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.24656934235283, 40.50533376115642]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Tottenville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Tottenville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.24656934235283,\n", | |
| " 40.50533376115642,\n", | |
| " -74.24656934235283,\n", | |
| " 40.50533376115642]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.219',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08055351790115, 40.637316067110326]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Tompkinsville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Tompkinsville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08055351790115,\n", | |
| " 40.637316067110326,\n", | |
| " -74.08055351790115,\n", | |
| " 40.637316067110326]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.220',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.09629029235458, 40.61919310792676]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Silver Lake',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Silver',\n", | |
| " 'annoline2': 'Lake',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.09629029235458,\n", | |
| " 40.61919310792676,\n", | |
| " -74.09629029235458,\n", | |
| " 40.61919310792676]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.221',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0971255217853, 40.61276015756489]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sunnyside',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Sunnyside',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.0971255217853,\n", | |
| " 40.61276015756489,\n", | |
| " -74.0971255217853,\n", | |
| " 40.61276015756489]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.222',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96101312466779, 40.643675183340974]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Ditmas Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Ditmas',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.96101312466779,\n", | |
| " 40.643675183340974,\n", | |
| " -73.96101312466779,\n", | |
| " 40.643675183340974]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.223',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93718680559314, 40.66094656188111]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Wingate',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Wingate',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93718680559314,\n", | |
| " 40.66094656188111,\n", | |
| " -73.93718680559314,\n", | |
| " 40.66094656188111]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.224',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.92688212616955, 40.655572313280764]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rugby',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rugby',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.92688212616955,\n", | |
| " 40.655572313280764,\n", | |
| " -73.92688212616955,\n", | |
| " 40.655572313280764]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.225',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08015734936296, 40.60919044434558]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Park Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Park',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08015734936296,\n", | |
| " 40.60919044434558,\n", | |
| " -74.08015734936296,\n", | |
| " 40.60919044434558]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.226',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.13304143951704, 40.62109047275409]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Westerleigh',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Westerleigh',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.13304143951704,\n", | |
| " 40.62109047275409,\n", | |
| " -74.13304143951704,\n", | |
| " 40.62109047275409]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.227',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.15315246387762, 40.620171512231884]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Graniteville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Graniteville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.15315246387762,\n", | |
| " 40.620171512231884,\n", | |
| " -74.15315246387762,\n", | |
| " 40.620171512231884]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.228',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.16510420241124, 40.63532509911492]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Arlington',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Arlington',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.16510420241124,\n", | |
| " 40.63532509911492,\n", | |
| " -74.16510420241124,\n", | |
| " 40.63532509911492]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.229',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.06712363225574, 40.596312571276734]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Arrochar',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Arrochar',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.06712363225574,\n", | |
| " 40.596312571276734,\n", | |
| " -74.06712363225574,\n", | |
| " 40.596312571276734]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.230',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.0766743627905, 40.59826835959991]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Grasmere',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Grasmere',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.0766743627905,\n", | |
| " 40.59826835959991,\n", | |
| " -74.0766743627905,\n", | |
| " 40.59826835959991]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.231',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08751118005578, 40.59632891379513]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Old Town',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Old',\n", | |
| " 'annoline2': 'Town',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08751118005578,\n", | |
| " 40.59632891379513,\n", | |
| " -74.08751118005578,\n", | |
| " 40.59632891379513]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.232',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.09639905312521, 40.588672948199275]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Dongan Hills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Dongan',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.09639905312521,\n", | |
| " 40.588672948199275,\n", | |
| " -74.09639905312521,\n", | |
| " 40.588672948199275]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.233',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.09348266303591, 40.57352690574283]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Midland Beach',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Midland',\n", | |
| " 'annoline2': 'Beach',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.09348266303591,\n", | |
| " 40.57352690574283,\n", | |
| " -74.09348266303591,\n", | |
| " 40.57352690574283]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.234',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.10585598545434, 40.57621558711788]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Grant City',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Grant',\n", | |
| " 'annoline2': 'City',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.10585598545434,\n", | |
| " 40.57621558711788,\n", | |
| " -74.10585598545434,\n", | |
| " 40.57621558711788]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.235',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.10432707469124, 40.56425549307335]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'New Dorp Beach',\n", | |
| " 'stacked': 3,\n", | |
| " 'annoline1': 'New',\n", | |
| " 'annoline2': 'Dorp',\n", | |
| " 'annoline3': 'Beach',\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.10432707469124,\n", | |
| " 40.56425549307335,\n", | |
| " -74.10432707469124,\n", | |
| " 40.56425549307335]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.236',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.13916622175768, 40.55398800858462]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bay Terrace',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bay',\n", | |
| " 'annoline2': 'Terrace',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.13916622175768,\n", | |
| " 40.55398800858462,\n", | |
| " -74.13916622175768,\n", | |
| " 40.55398800858462]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.237',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.19174105747814, 40.531911920489605]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Huguenot',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Huguenot',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.19174105747814,\n", | |
| " 40.531911920489605,\n", | |
| " -74.19174105747814,\n", | |
| " 40.531911920489605]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.238',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.21983106616777, 40.524699376118136]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Pleasant Plains',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Pleasant',\n", | |
| " 'annoline2': 'Plains',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.21983106616777,\n", | |
| " 40.524699376118136,\n", | |
| " -74.21983106616777,\n", | |
| " 40.524699376118136]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.239',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.22950350260027, 40.50608165346305]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Butler Manor',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Butler',\n", | |
| " 'annoline2': 'Manor',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.22950350260027,\n", | |
| " 40.50608165346305,\n", | |
| " -74.22950350260027,\n", | |
| " 40.50608165346305]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.240',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.23215775896526, 40.53053148283314]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Charleston',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Charleston',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.23215775896526,\n", | |
| " 40.53053148283314,\n", | |
| " -74.23215775896526,\n", | |
| " 40.53053148283314]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.241',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.21572851113952, 40.54940400650072]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Rossville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Rossville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.21572851113952,\n", | |
| " 40.54940400650072,\n", | |
| " -74.21572851113952,\n", | |
| " 40.54940400650072]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.242',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.18588674583893, 40.54928582278321]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Arden Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Arden',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.18588674583893,\n", | |
| " 40.54928582278321,\n", | |
| " -74.18588674583893,\n", | |
| " 40.54928582278321]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.243',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.17079414786092, 40.555295236173194]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Greenridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Greenridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.17079414786092,\n", | |
| " 40.555295236173194,\n", | |
| " -74.17079414786092,\n", | |
| " 40.555295236173194]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.244',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.15902208156601, 40.58913894875281]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Heartland Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Heartland',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.15902208156601,\n", | |
| " 40.58913894875281,\n", | |
| " -74.15902208156601,\n", | |
| " 40.58913894875281]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.245',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1895604551969, 40.59472602746295]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Chelsea',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Chelsea',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1895604551969,\n", | |
| " 40.59472602746295,\n", | |
| " -74.1895604551969,\n", | |
| " 40.59472602746295]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.246',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.18725638381567, 40.60577868452358]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bloomfield',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bloomfield',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.18725638381567,\n", | |
| " 40.60577868452358,\n", | |
| " -74.18725638381567,\n", | |
| " 40.60577868452358]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.247',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.15940948657122, 40.6095918004203]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bulls Head',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Bulls',\n", | |
| " 'annoline2': 'Head',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.15940948657122,\n", | |
| " 40.6095918004203,\n", | |
| " -74.15940948657122,\n", | |
| " 40.6095918004203]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.248',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95325646837112, 40.7826825671257]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Carnegie Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Carnegie',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.95325646837112,\n", | |
| " 40.7826825671257,\n", | |
| " -73.95325646837112,\n", | |
| " 40.7826825671257]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.249',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98843368023597, 40.72325901885768]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Noho',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Noho',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98843368023597,\n", | |
| " 40.72325901885768,\n", | |
| " -73.98843368023597,\n", | |
| " 40.72325901885768]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.250',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.00541529873355, 40.71522892046282]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Civic Center',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Civic',\n", | |
| " 'annoline2': 'Center',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.00541529873355,\n", | |
| " 40.71522892046282,\n", | |
| " -74.00541529873355,\n", | |
| " 40.71522892046282]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.251',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98871313285247, 40.7485096643122]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Midtown South',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Midtown',\n", | |
| " 'annoline2': 'South',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.98871313285247,\n", | |
| " 40.7485096643122,\n", | |
| " -73.98871313285247,\n", | |
| " 40.7485096643122]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.252',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1340572986257, 40.56960594275505]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Richmond Town',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Richmond',\n", | |
| " 'annoline2': 'Town',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1340572986257,\n", | |
| " 40.56960594275505,\n", | |
| " -74.1340572986257,\n", | |
| " 40.56960594275505]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.253',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.06667766061771, 40.60971934079284]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Shore Acres',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Shore',\n", | |
| " 'annoline2': 'Acres',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.06667766061771,\n", | |
| " 40.60971934079284,\n", | |
| " -74.06667766061771,\n", | |
| " 40.60971934079284]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.254',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.072642445484, 40.61917845202843]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Clifton',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Clifton',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.072642445484,\n", | |
| " 40.61917845202843,\n", | |
| " -74.072642445484,\n", | |
| " 40.61917845202843]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.255',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08402364740358, 40.6044731896879]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Concord',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Concord',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08402364740358,\n", | |
| " 40.6044731896879,\n", | |
| " -74.08402364740358,\n", | |
| " 40.6044731896879]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.256',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.09776206972522, 40.606794394801]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Emerson Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Emerson',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.09776206972522,\n", | |
| " 40.606794394801,\n", | |
| " -74.09776206972522,\n", | |
| " 40.606794394801]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.257',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.09805062373887, 40.63563000681151]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Randall Manor',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Randall',\n", | |
| " 'annoline2': 'Manor',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.09805062373887,\n", | |
| " 40.63563000681151,\n", | |
| " -74.09805062373887,\n", | |
| " 40.63563000681151]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.258',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.18622331749823, 40.63843283794795]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Howland Hook',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Howland',\n", | |
| " 'annoline2': 'Hook',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.18622331749823,\n", | |
| " 40.63843283794795,\n", | |
| " -74.18622331749823,\n", | |
| " 40.63843283794795]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.259',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.1418167896889, 40.630146741193826]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Elm Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Elm',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.1418167896889,\n", | |
| " 40.630146741193826,\n", | |
| " -74.1418167896889,\n", | |
| " 40.630146741193826]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.260',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91665331978048, 40.652117451793494]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Remsen Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Remsen',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.91665331978048,\n", | |
| " 40.652117451793494,\n", | |
| " -73.91665331978048,\n", | |
| " 40.652117451793494]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.261',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88511776379292, 40.6627442796966]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'New Lots',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'New',\n", | |
| " 'annoline2': 'Lots',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.88511776379292,\n", | |
| " 40.6627442796966,\n", | |
| " -73.88511776379292,\n", | |
| " 40.6627442796966]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.262',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90233474295836, 40.63131755039667]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Paerdegat Basin',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Paerdegat',\n", | |
| " 'annoline2': 'Basin',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.90233474295836,\n", | |
| " 40.63131755039667,\n", | |
| " -73.90233474295836,\n", | |
| " 40.63131755039667]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.263',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91515391550404, 40.61597423962336]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Mill Basin',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Mill',\n", | |
| " 'annoline2': 'Basin',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.91515391550404,\n", | |
| " 40.61597423962336,\n", | |
| " -73.91515391550404,\n", | |
| " 40.61597423962336]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.264',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79646462081593, 40.71145964370482]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Jamaica Hills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Jamaica',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79646462081593,\n", | |
| " 40.71145964370482,\n", | |
| " -73.79646462081593,\n", | |
| " 40.71145964370482]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.265',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.79671678028349, 40.73350025429757]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Utopia',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Utopia',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.79671678028349,\n", | |
| " 40.73350025429757,\n", | |
| " -73.79671678028349,\n", | |
| " 40.73350025429757]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.266',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.80486120040537, 40.73493618075478]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Pomonok',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Pomonok',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.80486120040537,\n", | |
| " 40.73493618075478,\n", | |
| " -73.80486120040537,\n", | |
| " 40.73493618075478]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.267',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.89467996270574, 40.7703173929982]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Astoria Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Astoria',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.89467996270574,\n", | |
| " 40.7703173929982,\n", | |
| " -73.89467996270574,\n", | |
| " 40.7703173929982]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.268',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90119903387667, 40.83142834161548]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Claremont Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Claremont',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90119903387667,\n", | |
| " 40.83142834161548,\n", | |
| " -73.90119903387667,\n", | |
| " 40.83142834161548]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.269',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91584652759009, 40.824780490842905]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Concourse Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Concourse',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91584652759009,\n", | |
| " 40.824780490842905,\n", | |
| " -73.91584652759009,\n", | |
| " 40.824780490842905]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.270',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91655551964419, 40.84382617671654]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Mount Eden',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Mount',\n", | |
| " 'annoline2': 'Eden',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.91655551964419,\n", | |
| " 40.84382617671654,\n", | |
| " -73.91655551964419,\n", | |
| " 40.84382617671654]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.271',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90829930881988, 40.84884160724665]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Mount Hope',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Mount',\n", | |
| " 'annoline2': 'Hope',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90829930881988,\n", | |
| " 40.84884160724665,\n", | |
| " -73.90829930881988,\n", | |
| " 40.84884160724665]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.272',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96355614094303, 40.76028033131374]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sutton Place',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sutton',\n", | |
| " 'annoline2': 'Place',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.96355614094303,\n", | |
| " 40.76028033131374,\n", | |
| " -73.96355614094303,\n", | |
| " 40.76028033131374]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.273',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95386782130745, 40.743414090073536]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hunters Point',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Hunters',\n", | |
| " 'annoline2': 'Point',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.95386782130745,\n", | |
| " 40.743414090073536,\n", | |
| " -73.95386782130745,\n", | |
| " 40.743414090073536]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.274',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.96770824581834, 40.75204236950722]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Turtle Bay',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Turtle',\n", | |
| " 'annoline2': 'Bay',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.96770824581834,\n", | |
| " 40.75204236950722,\n", | |
| " -73.96770824581834,\n", | |
| " 40.75204236950722]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.275',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97121928722265, 40.746917410740195]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Tudor City',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Tudor',\n", | |
| " 'annoline2': 'City',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.97121928722265,\n", | |
| " 40.746917410740195,\n", | |
| " -73.97121928722265,\n", | |
| " 40.746917410740195]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.276',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.97405170469203, 40.73099955477061]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Stuyvesant Town',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Stuyvesant',\n", | |
| " 'annoline2': 'Town',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.97405170469203,\n", | |
| " 40.73099955477061,\n", | |
| " -73.97405170469203,\n", | |
| " 40.73099955477061]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.277',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9909471052826, 40.739673047638426]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Flatiron',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Flatiron',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-73.9909471052826,\n", | |
| " 40.739673047638426,\n", | |
| " -73.9909471052826,\n", | |
| " 40.739673047638426]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.278',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.91819286431682, 40.74565180608076]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sunnyside Gardens',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sunnyside',\n", | |
| " 'annoline2': 'Gardens',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.91819286431682,\n", | |
| " 40.74565180608076,\n", | |
| " -73.91819286431682,\n", | |
| " 40.74565180608076]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.279',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93244235260178, 40.73725071694497]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Blissville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Blissville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.93244235260178,\n", | |
| " 40.73725071694497,\n", | |
| " -73.93244235260178,\n", | |
| " 40.73725071694497]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.280',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.99550751888415, 40.70328109093014]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fulton Ferry',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Fulton',\n", | |
| " 'annoline2': 'Ferry',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.99550751888415,\n", | |
| " 40.70328109093014,\n", | |
| " -73.99550751888415,\n", | |
| " 40.70328109093014]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.281',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.98111603592393, 40.70332149882874]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Vinegar Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Vinegar',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.98111603592393,\n", | |
| " 40.70332149882874,\n", | |
| " -73.98111603592393,\n", | |
| " 40.70332149882874]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.282',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.93053108817338, 40.67503986503237]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Weeksville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Weeksville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.93053108817338,\n", | |
| " 40.67503986503237,\n", | |
| " -73.93053108817338,\n", | |
| " 40.67503986503237]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.283',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90331684852599, 40.67786104769531]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Broadway Junction',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Broadway',\n", | |
| " 'annoline2': 'Junction',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.90331684852599,\n", | |
| " 40.67786104769531,\n", | |
| " -73.90331684852599,\n", | |
| " 40.67786104769531]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.284',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.9887528074504, 40.70317632822692]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Dumbo',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Dumbo',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.9887528074504,\n", | |
| " 40.70317632822692,\n", | |
| " -73.9887528074504,\n", | |
| " 40.70317632822692]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.285',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.12059399718001, 40.60180957631444]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Manor Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Manor',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.12059399718001,\n", | |
| " 40.60180957631444,\n", | |
| " -74.12059399718001,\n", | |
| " 40.60180957631444]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.286',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.13208447484298, 40.60370692627371]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Willowbrook',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Willowbrook',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.13208447484298,\n", | |
| " 40.60370692627371,\n", | |
| " -74.13208447484298,\n", | |
| " 40.60370692627371]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.287',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.21776636068567, 40.541139922091766]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Sandy Ground',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Sandy',\n", | |
| " 'annoline2': 'Ground',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.21776636068567,\n", | |
| " 40.541139922091766,\n", | |
| " -74.21776636068567,\n", | |
| " 40.541139922091766]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.288',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.12727240604946, 40.579118742961214]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Egbertville',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Egbertville',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.12727240604946,\n", | |
| " 40.579118742961214,\n", | |
| " -74.12727240604946,\n", | |
| " 40.579118742961214]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.289',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.89213760232822, 40.56737588957032]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Roxbury',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Roxbury',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.89213760232822,\n", | |
| " 40.56737588957032,\n", | |
| " -73.89213760232822,\n", | |
| " 40.56737588957032]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.290',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.95918459428702, 40.598525095137255]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Homecrest',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Homecrest',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.95918459428702,\n", | |
| " 40.598525095137255,\n", | |
| " -73.95918459428702,\n", | |
| " 40.598525095137255]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.291',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.88114319200604, 40.716414511158185]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Middle Village',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Middle',\n", | |
| " 'annoline2': 'Village',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.88114319200604,\n", | |
| " 40.716414511158185,\n", | |
| " -73.88114319200604,\n", | |
| " 40.716414511158185]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.292',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.20152556457658, 40.52626406734812]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': \"Prince's Bay\",\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': \"Prince's\",\n", | |
| " 'annoline2': 'Bay',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.20152556457658,\n", | |
| " 40.52626406734812,\n", | |
| " -74.20152556457658,\n", | |
| " 40.52626406734812]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.293',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.13792663771568, 40.57650629379489]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Lighthouse Hill',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Lighthouse',\n", | |
| " 'annoline2': 'Hill',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.13792663771568,\n", | |
| " 40.57650629379489,\n", | |
| " -74.13792663771568,\n", | |
| " 40.57650629379489]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.294',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.22957080626941, 40.51954145748909]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Richmond Valley',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Richmond',\n", | |
| " 'annoline2': 'Valley',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.22957080626941,\n", | |
| " 40.51954145748909,\n", | |
| " -74.22957080626941,\n", | |
| " 40.51954145748909]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.295',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.82667757138641, 40.79060155670148]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Malba',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Malba',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.82667757138641,\n", | |
| " 40.79060155670148,\n", | |
| " -73.82667757138641,\n", | |
| " 40.79060155670148]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.296',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.890345709872, 40.6819989345173]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Highland Park',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Highland',\n", | |
| " 'annoline2': 'Park',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.890345709872,\n", | |
| " 40.6819989345173,\n", | |
| " -73.890345709872,\n", | |
| " 40.6819989345173]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.297',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94841515328893, 40.60937770113766]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Madison',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Madison',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94841515328893,\n", | |
| " 40.60937770113766,\n", | |
| " -73.94841515328893,\n", | |
| " 40.60937770113766]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.298',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.86172577555115, 40.85272297633017]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bronxdale',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bronxdale',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.86172577555115,\n", | |
| " 40.85272297633017,\n", | |
| " -73.86172577555115,\n", | |
| " 40.85272297633017]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.299',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.85931863221647, 40.86578787802982]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Allerton',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Allerton',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.85931863221647,\n", | |
| " 40.86578787802982,\n", | |
| " -73.85931863221647,\n", | |
| " 40.86578787802982]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.300',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.90152264513144, 40.8703923914147]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Kingsbridge Heights',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Kingsbridge',\n", | |
| " 'annoline2': 'Heights',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.90152264513144,\n", | |
| " 40.8703923914147,\n", | |
| " -73.90152264513144,\n", | |
| " 40.8703923914147]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.301',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94817709920184, 40.64692606658579]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Erasmus',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Erasmus',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Brooklyn',\n", | |
| " 'bbox': [-73.94817709920184,\n", | |
| " 40.64692606658579,\n", | |
| " -73.94817709920184,\n", | |
| " 40.64692606658579]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.302',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.00011136202637, 40.75665808227519]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hudson Yards',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Hudson',\n", | |
| " 'annoline2': 'Yards',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Manhattan',\n", | |
| " 'bbox': [-74.00011136202637,\n", | |
| " 40.75665808227519,\n", | |
| " -74.00011136202637,\n", | |
| " 40.75665808227519]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.303',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.80553002968718, 40.58733774018741]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Hammels',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Hammels',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.80553002968718,\n", | |
| " 40.58733774018741,\n", | |
| " -73.80553002968718,\n", | |
| " 40.58733774018741]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.304',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.76596781445627, 40.611321691283834]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Bayswater',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Bayswater',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.76596781445627,\n", | |
| " 40.611321691283834,\n", | |
| " -73.76596781445627,\n", | |
| " 40.611321691283834]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.305',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.94563070334091, 40.756091297094706]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Queensbridge',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Queensbridge',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Queens',\n", | |
| " 'bbox': [-73.94563070334091,\n", | |
| " 40.756091297094706,\n", | |
| " -73.94563070334091,\n", | |
| " 40.756091297094706]}},\n", | |
| " {'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.306',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-74.08173992211962, 40.61731079252983]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Fox Hills',\n", | |
| " 'stacked': 2,\n", | |
| " 'annoline1': 'Fox',\n", | |
| " 'annoline2': 'Hills',\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Staten Island',\n", | |
| " 'bbox': [-74.08173992211962,\n", | |
| " 40.61731079252983,\n", | |
| " -74.08173992211962,\n", | |
| " 40.61731079252983]}}],\n", | |
| " 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n", | |
| " 'bbox': [-74.2492599487305,\n", | |
| " 40.5033187866211,\n", | |
| " -73.7061614990234,\n", | |
| " 40.9105606079102]}" | |
| ] | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "newyork_data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Notice how all the relevant data is in the _features_ key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "neighborhoods_data = newyork_data['features']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let's take a look at the first item in this list.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'type': 'Feature',\n", | |
| " 'id': 'nyu_2451_34572.1',\n", | |
| " 'geometry': {'type': 'Point',\n", | |
| " 'coordinates': [-73.84720052054902, 40.89470517661]},\n", | |
| " 'geometry_name': 'geom',\n", | |
| " 'properties': {'name': 'Wakefield',\n", | |
| " 'stacked': 1,\n", | |
| " 'annoline1': 'Wakefield',\n", | |
| " 'annoline2': None,\n", | |
| " 'annoline3': None,\n", | |
| " 'annoangle': 0.0,\n", | |
| " 'borough': 'Bronx',\n", | |
| " 'bbox': [-73.84720052054902,\n", | |
| " 40.89470517661,\n", | |
| " -73.84720052054902,\n", | |
| " 40.89470517661]}}" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods_data[0]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Tranform the data into a _pandas_ dataframe\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The next task is essentially transforming this data of nested Python dictionaries into a _pandas_ dataframe. So let's start by creating an empty dataframe.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# define the dataframe columns\n", | |
| "column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n", | |
| "\n", | |
| "# instantiate the dataframe\n", | |
| "neighborhoods = pd.DataFrame(columns=column_names)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Take a look at the empty dataframe to confirm that the columns are as intended.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| "Empty DataFrame\n", | |
| "Columns: [Borough, Neighborhood, Latitude, Longitude]\n", | |
| "Index: []" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Then let's loop through the data and fill the dataframe one row at a time.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "for data in neighborhoods_data:\n", | |
| " borough = neighborhood_name = data['properties']['borough'] \n", | |
| " neighborhood_name = data['properties']['name']\n", | |
| " \n", | |
| " neighborhood_latlon = data['geometry']['coordinates']\n", | |
| " neighborhood_lat = neighborhood_latlon[1]\n", | |
| " neighborhood_lon = neighborhood_latlon[0]\n", | |
| " \n", | |
| " neighborhoods = neighborhoods.append({'Borough': borough,\n", | |
| " 'Neighborhood': neighborhood_name,\n", | |
| " 'Latitude': neighborhood_lat,\n", | |
| " 'Longitude': neighborhood_lon}, ignore_index=True)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Quickly examine the resulting dataframe.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Wakefield</td>\n", | |
| " <td>40.894705</td>\n", | |
| " <td>-73.847201</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Co-op City</td>\n", | |
| " <td>40.874294</td>\n", | |
| " <td>-73.829939</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Eastchester</td>\n", | |
| " <td>40.887556</td>\n", | |
| " <td>-73.827806</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Fieldston</td>\n", | |
| " <td>40.895437</td>\n", | |
| " <td>-73.905643</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Bronx</td>\n", | |
| " <td>Riverdale</td>\n", | |
| " <td>40.890834</td>\n", | |
| " <td>-73.912585</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Neighborhood Latitude Longitude\n", | |
| "0 Bronx Wakefield 40.894705 -73.847201\n", | |
| "1 Bronx Co-op City 40.874294 -73.829939\n", | |
| "2 Bronx Eastchester 40.887556 -73.827806\n", | |
| "3 Bronx Fieldston 40.895437 -73.905643\n", | |
| "4 Bronx Riverdale 40.890834 -73.912585" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "neighborhoods.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "And make sure that the dataset has all 5 boroughs and 306 neighborhoods.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The dataframe has 5 boroughs and 306 neighborhoods.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n", | |
| " len(neighborhoods['Borough'].unique()),\n", | |
| " neighborhoods.shape[0]\n", | |
| " )\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Use geopy library to get the latitude and longitude values of New York City.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of New York City are 40.7127281, -74.0060152.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'New York City, NY'\n", | |
| "\n", | |
| "geolocator = Nominatim(user_agent=\"ny_explorer\")\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Create a map of New York with neighborhoods superimposed on top.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNTdiZWM3Y2E0Mjc1NDI0NTg3NTI5NTdmZDg2ZWRhNWMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzNGE1ZjczMDMzZjQxMmRhZjZiYTgwMzg5OGE5YjY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc4ZjA4ZTA3NmU5NDRiYjE5MDJkMDIxMmZmN2MzMjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2MDNkMjI0Mjg1YzRkNDQ4ZGU0YzdhODRmMDg4YTljID0gJCgnPGRpdiBpZD0iaHRtbF8wNjAzZDIyNDI4NWM0ZDQ0OGRlNGM3YTg0ZjA4OGE5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzhmMDhlMDc2ZTk0NGJiMTkwMmQwMjEyZmY3YzMyMTIuc2V0Q29udGVudChodG1sXzA2MDNkMjI0Mjg1YzRkNDQ4ZGU0YzdhODRmMDg4YTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzNGE1ZjczMDMzZjQxMmRhZjZiYTgwMzg5OGE5YjY2LmJpbmRQb3B1cChwb3B1cF83OGYwOGUwNzZlOTQ0YmIxOTAyZDAyMTJmZjdjMzIxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MjcwMjRlMTIzYjE0MGI4YjQ2MTRlMDAwNjE4ZGExNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzFiYTFlYmM4Yzc0OWYyOWUyZTg2MjJhYzM4N2ExZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjFhYTNiMWMwOGU0YjhlOTE3YjkzOWQxMDFkZDQ2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2IxYWEzYjFjMDhlNGI4ZTkxN2I5MzlkMTAxZGQ0NjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzFiYTFlYmM4Yzc0OWYyOWUyZTg2MjJhYzM4N2ExZC5zZXRDb250ZW50KGh0bWxfM2IxYWEzYjFjMDhlNGI4ZTkxN2I5MzlkMTAxZGQ0NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzI3MDI0ZTEyM2IxNDBiOGI0NjE0ZTAwMDYxOGRhMTUuYmluZFBvcHVwKHBvcHVwX2Y3MWJhMWViYzhjNzQ5ZjI5ZTJlODYyMmFjMzg3YTFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5ODk2MDA2YTRkZDRjODRhMDY4YjJmYTY3YWMzZmZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzQ5NmIyYTAyZTQ0NzZhYTZhM2UzYTEyN2RiOGE3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lY2RiNDI4MTViNjM0MTAwYjA1ZGI5NGVhZjNlZjY0NCA9ICQoJzxkaXYgaWQ9Imh0bWxfZWNkYjQyODE1YjYzNDEwMGIwNWRiOTRlYWYzZWY2NDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGM0OTZiMmEwMmU0NDc2YWE2YTNlM2ExMjdkYjhhN2Uuc2V0Q29udGVudChodG1sX2VjZGI0MjgxNWI2MzQxMDBiMDVkYjk0ZWFmM2VmNjQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5ODk2MDA2YTRkZDRjODRhMDY4YjJmYTY3YWMzZmZjLmJpbmRQb3B1cChwb3B1cF8wYzQ5NmIyYTAyZTQ0NzZhYTZhM2UzYTEyN2RiOGE3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wN2I3MThlMGIzZTE0OTYzYjE5NTE3YjkyMjkwMzQ4YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzBjMTZiNjc2ZmY0YmFiOThmMjc1MmQ3Yzg4ZGE2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTcyNDczYjUzMDM0OGQ1OWI3MjYxM2RjOTZhMTY1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzU3MjQ3M2I1MzAzNDhkNTliNzI2MTNkYzk2YTE2NTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3MGMxNmI2NzZmZjRiYWI5OGYyNzUyZDdjODhkYTY4LnNldENvbnRlbnQoaHRtbF8zNTcyNDczYjUzMDM0OGQ1OWI3MjYxM2RjOTZhMTY1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wN2I3MThlMGIzZTE0OTYzYjE5NTE3YjkyMjkwMzQ4Yi5iaW5kUG9wdXAocG9wdXBfMjcwYzE2YjY3NmZmNGJhYjk4ZjI3NTJkN2M4OGRhNjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ExOTFkZDFhOGIxNDY2Yzg5YWY2MTg5MzA2YzE3ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVjMTY4ZDBiYWIwNGNiOTgyNzA2ZWU5NzY0MzIxNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWEzOTc0YmRhNGRmNGViMDg2OTViMzBjYzZiOGI3YTcgPSAkKCc8ZGl2IGlkPSJodG1sX2VhMzk3NGJkYTRkZjRlYjA4Njk1YjMwY2M2YjhiN2E3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NWMxNjhkMGJhYjA0Y2I5ODI3MDZlZTk3NjQzMjE0My5zZXRDb250ZW50KGh0bWxfZWEzOTc0YmRhNGRmNGViMDg2OTViMzBjYzZiOGI3YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2ExOTFkZDFhOGIxNDY2Yzg5YWY2MTg5MzA2YzE3ZjkuYmluZFBvcHVwKHBvcHVwXzg1YzE2OGQwYmFiMDRjYjk4MjcwNmVlOTc2NDMyMTQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlYTk1NDc3M2U2ODQzNjI4M2E3ZDE1YmI5OTFiNWFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkOWUyYjA1ZDdkNzRkOTFiZTczY2Q3NDhmODY4N2Q3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkZWI3MDI0MjJiYTRhNDlhZGFiNTY4N2FhNmI3NTAzID0gJCgnPGRpdiBpZD0iaHRtbF8yZGViNzAyNDIyYmE0YTQ5YWRhYjU2ODdhYTZiNzUwMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDllMmIwNWQ3ZDc0ZDkxYmU3M2NkNzQ4Zjg2ODdkNy5zZXRDb250ZW50KGh0bWxfMmRlYjcwMjQyMmJhNGE0OWFkYWI1Njg3YWE2Yjc1MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmVhOTU0NzczZTY4NDM2MjgzYTdkMTViYjk5MWI1YWIuYmluZFBvcHVwKHBvcHVwXzZkOWUyYjA1ZDdkNzRkOTFiZTczY2Q3NDhmODY4N2Q3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhMmMyZGE5MmNiMTQzNDg5MDAzZDZlZDU0OGVjYWJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhMWU2ZTcxNGNhYTRiN2U4NTQ1MTY1Yjk1ZTkxYzkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4ZDZhMTRkMjY1NTQxNDM4YWE5YzY0NWQ5OTlhYzU0ID0gJCgnPGRpdiBpZD0iaHRtbF83OGQ2YTE0ZDI2NTU0MTQzOGFhOWM2NDVkOTk5YWM1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWExZTZlNzE0Y2FhNGI3ZTg1NDUxNjViOTVlOTFjOTEuc2V0Q29udGVudChodG1sXzc4ZDZhMTRkMjY1NTQxNDM4YWE5YzY0NWQ5OTlhYzU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhMmMyZGE5MmNiMTQzNDg5MDAzZDZlZDU0OGVjYWJiLmJpbmRQb3B1cChwb3B1cF81YTFlNmU3MTRjYWE0YjdlODU0NTE2NWI5NWU5MWM5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMDU1NWI3NmM2MWE0NzBhOTk2NzVhZWM3MmRlOGVjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNGI3MmY1YTk2Mzc0Y2UyOTA2OWQ5ODYyNDYyNmJkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDVhZDIwNDQ5ZTI0NDk3ODBlNDI0MTU0ODc3YTFkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQ1YWQyMDQ0OWUyNDQ5NzgwZTQyNDE1NDg3N2ExZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDRiNzJmNWE5NjM3NGNlMjkwNjlkOTg2MjQ2MjZiZDIuc2V0Q29udGVudChodG1sXzA0NWFkMjA0NDllMjQ0OTc4MGU0MjQxNTQ4NzdhMWQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwNTU1Yjc2YzYxYTQ3MGE5OTY3NWFlYzcyZGU4ZWMwLmJpbmRQb3B1cChwb3B1cF9kNGI3MmY1YTk2Mzc0Y2UyOTA2OWQ5ODYyNDYyNmJkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTE0M2ZkOWIwMGE0MTI0YWVkZjM4YWRjMjI1MWRiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5MmIyNWZhNjg2MTRmYWE4NTZhZWJhNDdkY2FiNjRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwZTIwZTQ1NDk4YzRhODhhODVkOTU2OGUwYWEzZDczID0gJCgnPGRpdiBpZD0iaHRtbF8wMGUyMGU0NTQ5OGM0YTg4YTg1ZDk1NjhlMGFhM2Q3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5MmIyNWZhNjg2MTRmYWE4NTZhZWJhNDdkY2FiNjRmLnNldENvbnRlbnQoaHRtbF8wMGUyMGU0NTQ5OGM0YTg4YTg1ZDk1NjhlMGFhM2Q3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTE0M2ZkOWIwMGE0MTI0YWVkZjM4YWRjMjI1MWRiYy5iaW5kUG9wdXAocG9wdXBfODkyYjI1ZmE2ODYxNGZhYTg1NmFlYmE0N2RjYWI2NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY5MWQwYTJkOTYwNDVmYzg5ZWQwY2Q2YmYzM2FhZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDA4NDJkMzhlY2UzNDNiNGI1M2NlZjM5YjZmNzRiNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmYyNjI3N2FiMmY1NDBhNjlmYTg2ZTIwOTJkZWFmNDYgPSAkKCc8ZGl2IGlkPSJodG1sX2JmMjYyNzdhYjJmNTQwYTY5ZmE4NmUyMDkyZGVhZjQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwODQyZDM4ZWNlMzQzYjRiNTNjZWYzOWI2Zjc0YjU5LnNldENvbnRlbnQoaHRtbF9iZjI2Mjc3YWIyZjU0MGE2OWZhODZlMjA5MmRlYWY0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjkxZDBhMmQ5NjA0NWZjODllZDBjZDZiZjMzYWFlMC5iaW5kUG9wdXAocG9wdXBfZDA4NDJkMzhlY2UzNDNiNGI1M2NlZjM5YjZmNzRiNTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODI1ODFlNmJmMTVlNDI0YzliYzYxMzRhODg5MWZiNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmZTdiZmZhYThlMTRiZTI4MmQ3MjVjMGNkYTk3ZWFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwOGU5ZjA0ZWI1ZTQ5NzI5MjQyZDdlY2U3ZDRmMWFlID0gJCgnPGRpdiBpZD0iaHRtbF84MDhlOWYwNGViNWU0OTcyOTI0MmQ3ZWNlN2Q0ZjFhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmZTdiZmZhYThlMTRiZTI4MmQ3MjVjMGNkYTk3ZWFiLnNldENvbnRlbnQoaHRtbF84MDhlOWYwNGViNWU0OTcyOTI0MmQ3ZWNlN2Q0ZjFhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MjU4MWU2YmYxNWU0MjRjOWJjNjEzNGE4ODkxZmI3NC5iaW5kUG9wdXAocG9wdXBfOGZlN2JmZmFhOGUxNGJlMjgyZDcyNWMwY2RhOTdlYWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTA3OTNhYWVkZTExNDI2YWE2ZTBhMTU3ZTg4ZWUyYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzFjNDgyYTNjNzZkNDc3ZGEwMTY3MGFlYzYzMWYyM2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjI1ZTQ3N2IwYjhhNGYwNDhkOWExZjA4YWRkMTY0YzYgPSAkKCc8ZGl2IGlkPSJodG1sXzYyNWU0NzdiMGI4YTRmMDQ4ZDlhMWYwOGFkZDE2NGM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxYzQ4MmEzYzc2ZDQ3N2RhMDE2NzBhZWM2MzFmMjNkLnNldENvbnRlbnQoaHRtbF82MjVlNDc3YjBiOGE0ZjA0OGQ5YTFmMDhhZGQxNjRjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDc5M2FhZWRlMTE0MjZhYTZlMGExNTdlODhlZTJiNi5iaW5kUG9wdXAocG9wdXBfNzFjNDgyYTNjNzZkNDc3ZGEwMTY3MGFlYzYzMWYyM2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzY4YWNmYjBmZGI4NGE4ZGEzYzIyYzg1ZjNiNDgzNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg3ZDJkYzM5NTZlNGQ0NjliOGQyZGFmMDUyYWQxZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzc2NGQwODA5Y2E1NDhhMWFmZGNhNDMwYWZlNGI1MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzc3NjRkMDgwOWNhNTQ4YTFhZmRjYTQzMGFmZTRiNTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4N2QyZGMzOTU2ZTRkNDY5YjhkMmRhZjA1MmFkMWUwLnNldENvbnRlbnQoaHRtbF83NzY0ZDA4MDljYTU0OGExYWZkY2E0MzBhZmU0YjUwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NjhhY2ZiMGZkYjg0YThkYTNjMjJjODVmM2I0ODM3NS5iaW5kUG9wdXAocG9wdXBfZDg3ZDJkYzM5NTZlNGQ0NjliOGQyZGFmMDUyYWQxZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2UyMWE2ZTM3NTg0NDI4NjllMzI3NjcyOTYzMmU2YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTRlMTc0YTM3YzcxNDg4MzlkYmQ3MTA4M2M0OTYxZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTE5YzYwNjVjZGZkNDA3ZWJmZjFmMDUwNjc4Y2I1MDAgPSAkKCc8ZGl2IGlkPSJodG1sXzUxOWM2MDY1Y2RmZDQwN2ViZmYxZjA1MDY3OGNiNTAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNGUxNzRhMzdjNzE0ODgzOWRiZDcxMDgzYzQ5NjFkNS5zZXRDb250ZW50KGh0bWxfNTE5YzYwNjVjZGZkNDA3ZWJmZjFmMDUwNjc4Y2I1MDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2UyMWE2ZTM3NTg0NDI4NjllMzI3NjcyOTYzMmU2YjcuYmluZFBvcHVwKHBvcHVwX2U0ZTE3NGEzN2M3MTQ4ODM5ZGJkNzEwODNjNDk2MWQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjMDcxYzcxMTg2ODQ1N2M4NmNiMDY0NmZmMmVmNzE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRjMTQ4ZDBkMDcxNGYxZmE3YmE4MjU4YzlhOGJlOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI2ZWMyMTFjN2Q1NDIwODg0NTgwZmUwMzRmZWJkMGYgPSAkKCc8ZGl2IGlkPSJodG1sX2UyNmVjMjExYzdkNTQyMDg4NDU4MGZlMDM0ZmViZDBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZGMxNDhkMGQwNzE0ZjFmYTdiYTgyNThjOWE4YmU5Ni5zZXRDb250ZW50KGh0bWxfZTI2ZWMyMTFjN2Q1NDIwODg0NTgwZmUwMzRmZWJkMGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmMwNzFjNzExODY4NDU3Yzg2Y2IwNjQ2ZmYyZWY3MTkuYmluZFBvcHVwKHBvcHVwXzZkYzE0OGQwZDA3MTRmMWZhN2JhODI1OGM5YThiZTk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhZmFjYzNmODlkZjQ4ZTI4NWJlYjhiODdkNWE3OWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzMmZmMDY5NGI1MTRiMDlhY2EyZWZjNmFmMDA3ZTVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NDBhODVlZjhkYzRmM2M5OTExNmEwODg2MmViNzJlID0gJCgnPGRpdiBpZD0iaHRtbF8yNjQwYTg1ZWY4ZGM0ZjNjOTkxMTZhMDg4NjJlYjcyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzJmZjA2OTRiNTE0YjA5YWNhMmVmYzZhZjAwN2U1YS5zZXRDb250ZW50KGh0bWxfMjY0MGE4NWVmOGRjNGYzYzk5MTE2YTA4ODYyZWI3MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGFmYWNjM2Y4OWRmNDhlMjg1YmViOGI4N2Q1YTc5ZjQuYmluZFBvcHVwKHBvcHVwXzkzMmZmMDY5NGI1MTRiMDlhY2EyZWZjNmFmMDA3ZTVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkNGRkOTg5YTIzYTQ4NWM4NjgzNjlhZWIxMzVlZDlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmM2FjYTg3YTRiMjQ0YTRhNGQwMmU4MDhiODRhMDBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4ZTVkODIzYWI2MDQyNDE5M2Y1ZWYwNzA1ZmZhYWRmID0gJCgnPGRpdiBpZD0iaHRtbF82OGU1ZDgyM2FiNjA0MjQxOTNmNWVmMDcwNWZmYWFkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmM2FjYTg3YTRiMjQ0YTRhNGQwMmU4MDhiODRhMDBiLnNldENvbnRlbnQoaHRtbF82OGU1ZDgyM2FiNjA0MjQxOTNmNWVmMDcwNWZmYWFkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDRkZDk4OWEyM2E0ODVjODY4MzY5YWViMTM1ZWQ5YS5iaW5kUG9wdXAocG9wdXBfMmYzYWNhODdhNGIyNDRhNGE0ZDAyZTgwOGI4NGEwMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTE0ZDMxYzg3YmE3NGZkYmJhZjg0NDhhZTNiZmQwZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjMyN2ExNGEzYzJlNGZmZDg2NjkxZTlkMDMyYmMyYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTkwZjQ0NTY1ZDA5NDhlNjk3MGEyYjNiMzQ3OGMyYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzE5MGY0NDU2NWQwOTQ4ZTY5NzBhMmIzYjM0NzhjMmJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzI3YTE0YTNjMmU0ZmZkODY2OTFlOWQwMzJiYzJiMS5zZXRDb250ZW50KGh0bWxfMTkwZjQ0NTY1ZDA5NDhlNjk3MGEyYjNiMzQ3OGMyYmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTE0ZDMxYzg3YmE3NGZkYmJhZjg0NDhhZTNiZmQwZTcuYmluZFBvcHVwKHBvcHVwX2YzMjdhMTRhM2MyZTRmZmQ4NjY5MWU5ZDAzMmJjMmIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3YTM3ZmFkNTcxYTRmYzliYjkyZjdjNTNiYzM5ODU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5NjhlNzlmZDA4ZDQ0ZGRhMTY3N2E4M2Q2ZmQ3ZDQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmN2VlNzBkYWEzOTQ1MjY5NzFkNWQ5NDE0YWNiNTQ2ID0gJCgnPGRpdiBpZD0iaHRtbF8xZjdlZTcwZGFhMzk0NTI2OTcxZDVkOTQxNGFjYjU0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5NjhlNzlmZDA4ZDQ0ZGRhMTY3N2E4M2Q2ZmQ3ZDQwLnNldENvbnRlbnQoaHRtbF8xZjdlZTcwZGFhMzk0NTI2OTcxZDVkOTQxNGFjYjU0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80N2EzN2ZhZDU3MWE0ZmM5YmI5MmY3YzUzYmMzOTg1OS5iaW5kUG9wdXAocG9wdXBfZTk2OGU3OWZkMDhkNDRkZGExNjc3YTgzZDZmZDdkNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTJlOGMzN2ZhYWYwNDNhMGE0OTdmNjY5ZDZiZDNjZjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjM5MzM3YzdjYzE5NDdiN2EwNGZmYmQ2Yzc1OTg4OWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTEzOTlhYTY4ZTcxNGI3MmIxMjAwNzVmZTZmNWVkZWYgPSAkKCc8ZGl2IGlkPSJodG1sX2UxMzk5YWE2OGU3MTRiNzJiMTIwMDc1ZmU2ZjVlZGVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzkzMzdjN2NjMTk0N2I3YTA0ZmZiZDZjNzU5ODg5ZC5zZXRDb250ZW50KGh0bWxfZTEzOTlhYTY4ZTcxNGI3MmIxMjAwNzVmZTZmNWVkZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTJlOGMzN2ZhYWYwNDNhMGE0OTdmNjY5ZDZiZDNjZjAuYmluZFBvcHVwKHBvcHVwXzYzOTMzN2M3Y2MxOTQ3YjdhMDRmZmJkNmM3NTk4ODlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjNGVhMWNkYzM1YzRmZGFhZjUyMWY4YmU0OWFiODg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kM2Q5MTUzYWY2MTQ0YzQ5OTVhZTUxYTIzYWU1MDIzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzY2NWIyYjZmYWY0NjZiYmE0Yzk2NDAyODI5YTEyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmM2NjViMmI2ZmFmNDY2YmJhNGM5NjQwMjgyOWExMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kM2Q5MTUzYWY2MTQ0YzQ5OTVhZTUxYTIzYWU1MDIzNS5zZXRDb250ZW50KGh0bWxfNmM2NjViMmI2ZmFmNDY2YmJhNGM5NjQwMjgyOWExMmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmM0ZWExY2RjMzVjNGZkYWFmNTIxZjhiZTQ5YWI4ODUuYmluZFBvcHVwKHBvcHVwX2QzZDkxNTNhZjYxNDRjNDk5NWFlNTFhMjNhZTUwMjM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1YjA3ZjFjNjMzYjQ5N2U5OTdkMDRmNTIyMTYzYjBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkZDJkOWNjOGMwYzQyMGRhZTFmMjJlYWZlZWFhNmQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1OTZiNGM4MDczZTQwMjNhYmQ2MTU3NDNkNzA5ZDNmID0gJCgnPGRpdiBpZD0iaHRtbF8zNTk2YjRjODA3M2U0MDIzYWJkNjE1NzQzZDcwOWQzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkZDJkOWNjOGMwYzQyMGRhZTFmMjJlYWZlZWFhNmQwLnNldENvbnRlbnQoaHRtbF8zNTk2YjRjODA3M2U0MDIzYWJkNjE1NzQzZDcwOWQzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNWIwN2YxYzYzM2I0OTdlOTk3ZDA0ZjUyMjE2M2IwYS5iaW5kUG9wdXAocG9wdXBfYmRkMmQ5Y2M4YzBjNDIwZGFlMWYyMmVhZmVlYWE2ZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2IzYmM2MGFlODQ1NDgxOTk3OTNhYjYzZDE0NTA2ZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I5MjlkOGEzNGQ2OTQ3M2FiYzQ1MDVhZjJjZmFjMmEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwMzJhYjA2YzE2MTRlZTRiYzcwZWI2MTRjODQwMmFiID0gJCgnPGRpdiBpZD0iaHRtbF9hMDMyYWIwNmMxNjE0ZWU0YmM3MGViNjE0Yzg0MDJhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOTI5ZDhhMzRkNjk0NzNhYmM0NTA1YWYyY2ZhYzJhMi5zZXRDb250ZW50KGh0bWxfYTAzMmFiMDZjMTYxNGVlNGJjNzBlYjYxNGM4NDAyYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2IzYmM2MGFlODQ1NDgxOTk3OTNhYjYzZDE0NTA2ZTcuYmluZFBvcHVwKHBvcHVwX2I5MjlkOGEzNGQ2OTQ3M2FiYzQ1MDVhZjJjZmFjMmEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0OGYxMDViNGE4OTRiYmFiODI2YTRlNjNiZWJmNjQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWMwZGE0NDA5YzJhNGY0ZWE4MTc4YmM4YTYwYjhlZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjhiN2YxZjc4MGQwNGEwNTg2MWMxYjU1NTA3YjIwNTIgPSAkKCc8ZGl2IGlkPSJodG1sX2I4YjdmMWY3ODBkMDRhMDU4NjFjMWI1NTUwN2IyMDUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljMGRhNDQwOWMyYTRmNGVhODE3OGJjOGE2MGI4ZWQzLnNldENvbnRlbnQoaHRtbF9iOGI3ZjFmNzgwZDA0YTA1ODYxYzFiNTU1MDdiMjA1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDhmMTA1YjRhODk0YmJhYjgyNmE0ZTYzYmViZjY0Ny5iaW5kUG9wdXAocG9wdXBfOWMwZGE0NDA5YzJhNGY0ZWE4MTc4YmM4YTYwYjhlZDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjZkMzNjMTEyZjhiNDNjOWFjZGY5NjRkZDk1YTI4ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQwNGY3MWI1NDAwNGM0OGIxOTJiMmY0MjhlMTA2YWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2M5NDYyNDhlOThjNDljNGExZjcwMDUxYWNlYmNmNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzdjOTQ2MjQ4ZTk4YzQ5YzRhMWY3MDA1MWFjZWJjZjYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkMDRmNzFiNTQwMDRjNDhiMTkyYjJmNDI4ZTEwNmFjLnNldENvbnRlbnQoaHRtbF83Yzk0NjI0OGU5OGM0OWM0YTFmNzAwNTFhY2ViY2Y2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNmQzM2MxMTJmOGI0M2M5YWNkZjk2NGRkOTVhMjhmOS5iaW5kUG9wdXAocG9wdXBfYmQwNGY3MWI1NDAwNGM0OGIxOTJiMmY0MjhlMTA2YWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2E4MGMwYTg3N2NjNDdiMmE1MzY1MDM5MGIxZTljZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY4MDc4OGI5NGEwNDNjODg3OTEzM2U5MGQ3YmMyYTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDk0ZGQ1YmI4MTgxNGI3MjhjMjgwMWU2NTU4Y2MyNDggPSAkKCc8ZGl2IGlkPSJodG1sXzA5NGRkNWJiODE4MTRiNzI4YzI4MDFlNjU1OGNjMjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODY4MDc4OGI5NGEwNDNjODg3OTEzM2U5MGQ3YmMyYTcuc2V0Q29udGVudChodG1sXzA5NGRkNWJiODE4MTRiNzI4YzI4MDFlNjU1OGNjMjQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhODBjMGE4NzdjYzQ3YjJhNTM2NTAzOTBiMWU5Y2RhLmJpbmRQb3B1cChwb3B1cF84NjgwNzg4Yjk0YTA0M2M4ODc5MTMzZTkwZDdiYzJhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNjg2MzJiNmQ3MDQ0MzE1YTU0ODA2NGJiODM0ZDRkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVmOWUyZDJhYmFkNGRmODkyZjk2OWFmYjk5NzdkN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWU3MGIyNzk1M2RlNDNhMTg2Y2RhMGY0ZWU0NGMzNjggPSAkKCc8ZGl2IGlkPSJodG1sXzVlNzBiMjc5NTNkZTQzYTE4NmNkYTBmNGVlNDRjMzY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NWY5ZTJkMmFiYWQ0ZGY4OTJmOTY5YWZiOTk3N2Q3YS5zZXRDb250ZW50KGh0bWxfNWU3MGIyNzk1M2RlNDNhMTg2Y2RhMGY0ZWU0NGMzNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjY4NjMyYjZkNzA0NDMxNWE1NDgwNjRiYjgzNGQ0ZGYuYmluZFBvcHVwKHBvcHVwXzg1ZjllMmQyYWJhZDRkZjg5MmY5NjlhZmI5OTc3ZDdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViYmU5YzlhMTgyYzQ0NmViOThhOTg4ZDM3YmQ0ZmQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwMDk1MTY2NjBlYzQ4NTM4ZmIwZWIwNzk2ZmQ5ZTViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzYzdmNjY4MWZmZjQ2ZjVhY2VmZjkwMzQyZDk5ZTIwID0gJCgnPGRpdiBpZD0iaHRtbF8xM2M3ZjY2ODFmZmY0NmY1YWNlZmY5MDM0MmQ5OWUyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAwOTUxNjY2MGVjNDg1MzhmYjBlYjA3OTZmZDllNWIuc2V0Q29udGVudChodG1sXzEzYzdmNjY4MWZmZjQ2ZjVhY2VmZjkwMzQyZDk5ZTIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViYmU5YzlhMTgyYzQ0NmViOThhOTg4ZDM3YmQ0ZmQ1LmJpbmRQb3B1cChwb3B1cF8zMDA5NTE2NjYwZWM0ODUzOGZiMGViMDc5NmZkOWU1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTdlYmIzZDlmZGQ0MjkwOTUzMzNkZmRjMTY4YzU0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZGYwZTdkMDM3ZGU0YmRjYjBhNDllNjlhMDAwYmM3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZWZiYTk4OTEyMmM0MmVkOTVmMGZhOGRmNjY3NzA3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGVmYmE5ODkxMjJjNDJlZDk1ZjBmYThkZjY2NzcwN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRmMGU3ZDAzN2RlNGJkY2IwYTQ5ZTY5YTAwMGJjN2Iuc2V0Q29udGVudChodG1sX2RlZmJhOTg5MTIyYzQyZWQ5NWYwZmE4ZGY2Njc3MDdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlN2ViYjNkOWZkZDQyOTA5NTMzM2RmZGMxNjhjNTQyLmJpbmRQb3B1cChwb3B1cF82ZGYwZTdkMDM3ZGU0YmRjYjBhNDllNjlhMDAwYmM3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjFkNTZiMzM5MmE0ZjYwOTg4ZjBiOTIwZmE3NmU2NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzEzNDVmNDUzZTQ0NzQyYjQ0N2JlYTE0YzkwOTVhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Nzc5ZjIxZjFiM2U0ZTBlYjQzMWEwNTcwMjk4OGM4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc3OWYyMWYxYjNlNGUwZWI0MzFhMDU3MDI5ODhjOGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjMTM0NWY0NTNlNDQ3NDJiNDQ3YmVhMTRjOTA5NWFhLnNldENvbnRlbnQoaHRtbF80Nzc5ZjIxZjFiM2U0ZTBlYjQzMWEwNTcwMjk4OGM4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjFkNTZiMzM5MmE0ZjYwOTg4ZjBiOTIwZmE3NmU2Ni5iaW5kUG9wdXAocG9wdXBfNmMxMzQ1ZjQ1M2U0NDc0MmI0NDdiZWExNGM5MDk1YWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTQ3YzFiNjI4YmE4NDk4YWFkZTIwNjE2ODk0MzcwMTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkMzg1MmE4NGMxYzQxODVhMTI5NmQ5NmUzYWU5NTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1YjU4MTQ4ZTg2OTQ5NjI4NDQ5NTU3ZDNhZWQyZGQ5ID0gJCgnPGRpdiBpZD0iaHRtbF80NWI1ODE0OGU4Njk0OTYyODQ0OTU1N2QzYWVkMmRkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDM4NTJhODRjMWM0MTg1YTEyOTZkOTZlM2FlOTUxMi5zZXRDb250ZW50KGh0bWxfNDViNTgxNDhlODY5NDk2Mjg0NDk1NTdkM2FlZDJkZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTQ3YzFiNjI4YmE4NDk4YWFkZTIwNjE2ODk0MzcwMTEuYmluZFBvcHVwKHBvcHVwXzBkMzg1MmE4NGMxYzQxODVhMTI5NmQ5NmUzYWU5NTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczZmY4NTc3Zjg2NTQyYmI4NzUyYjlkNmU4ZDg5MGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTliY2UxMzc5OWM2NGZmMzgzNzdhOTRhNDFiY2ZkYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWY2ZTg5NDU4YWM0NDUyYThjNjQxOTM2NDJhODk5NWUgPSAkKCc8ZGl2IGlkPSJodG1sX2VmNmU4OTQ1OGFjNDQ1MmE4YzY0MTkzNjQyYTg5OTVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OWJjZTEzNzk5YzY0ZmYzODM3N2E5NGE0MWJjZmRhNS5zZXRDb250ZW50KGh0bWxfZWY2ZTg5NDU4YWM0NDUyYThjNjQxOTM2NDJhODk5NWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzNmZjg1NzdmODY1NDJiYjg3NTJiOWQ2ZThkODkwYjguYmluZFBvcHVwKHBvcHVwXzk5YmNlMTM3OTljNjRmZjM4Mzc3YTk0YTQxYmNmZGE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4YTMyY2VlMTZjYjQzMTM5YmU4YjMwYTJhYzE5NTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2YxZGM3ZWIwNjQ4NDkwMGI2ZWY4OTQzNzU1M2M3OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmYyM2Q1MDRiZTQxNGNkMmJmZjQxMjQ5YzA4M2VkMDUgPSAkKCc8ZGl2IGlkPSJodG1sXzZmMjNkNTA0YmU0MTRjZDJiZmY0MTI0OWMwODNlZDA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmMWRjN2ViMDY0ODQ5MDBiNmVmODk0Mzc1NTNjNzk2LnNldENvbnRlbnQoaHRtbF82ZjIzZDUwNGJlNDE0Y2QyYmZmNDEyNDljMDgzZWQwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOGEzMmNlZTE2Y2I0MzEzOWJlOGIzMGEyYWMxOTU1MC5iaW5kUG9wdXAocG9wdXBfN2YxZGM3ZWIwNjQ4NDkwMGI2ZWY4OTQzNzU1M2M3OTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTYxMWYzMjE5OTdhNGM3ODllZmQyZDcxMzRjNWQ3YTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0ODBlM2NiYjkwMjRhMDliZDFjYzIzMjAxNTZhOTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxNWIzY2Q3NThkZDQ5NTNhZjczN2FmNjkxMTczOGE3ID0gJCgnPGRpdiBpZD0iaHRtbF9lMTViM2NkNzU4ZGQ0OTUzYWY3MzdhZjY5MTE3MzhhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDgwZTNjYmI5MDI0YTA5YmQxY2MyMzIwMTU2YTk5MS5zZXRDb250ZW50KGh0bWxfZTE1YjNjZDc1OGRkNDk1M2FmNzM3YWY2OTExNzM4YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTYxMWYzMjE5OTdhNGM3ODllZmQyZDcxMzRjNWQ3YTAuYmluZFBvcHVwKHBvcHVwX2Q0ODBlM2NiYjkwMjRhMDliZDFjYzIzMjAxNTZhOTkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5MjRmYTQyNmM0OTRhMmU4NzFiMzg0MjQxYWY3N2M4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjZDIyYzcwNjg1NzQzODRhYjZmYmUyZTNlNGJiNGY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5ZDIwMTM1NmMyMzRiMDY4NTdhNjZiZjE2M2ZmYmZlID0gJCgnPGRpdiBpZD0iaHRtbF8yOWQyMDEzNTZjMjM0YjA2ODU3YTY2YmYxNjNmZmJmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjZDIyYzcwNjg1NzQzODRhYjZmYmUyZTNlNGJiNGY2LnNldENvbnRlbnQoaHRtbF8yOWQyMDEzNTZjMjM0YjA2ODU3YTY2YmYxNjNmZmJmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTI0ZmE0MjZjNDk0YTJlODcxYjM4NDI0MWFmNzdjOC5iaW5kUG9wdXAocG9wdXBfMWNkMjJjNzA2ODU3NDM4NGFiNmZiZTJlM2U0YmI0ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWVkZDQ1ODhkM2YwNDUwZjhlNjgzY2M2YmUxZDBkYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWM2NzI1MTE0YmVlNDY1MTg3NDAwNDFiNGM5NWIxNzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODdjYWFiNzQ1ZmY3NDg0YzgxNGI3MTQxOWM2YjQ3NTMgPSAkKCc8ZGl2IGlkPSJodG1sXzg3Y2FhYjc0NWZmNzQ4NGM4MTRiNzE0MTljNmI0NzUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjNjcyNTExNGJlZTQ2NTE4NzQwMDQxYjRjOTViMTcwLnNldENvbnRlbnQoaHRtbF84N2NhYWI3NDVmZjc0ODRjODE0YjcxNDE5YzZiNDc1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZWRkNDU4OGQzZjA0NTBmOGU2ODNjYzZiZTFkMGRhNi5iaW5kUG9wdXAocG9wdXBfYWM2NzI1MTE0YmVlNDY1MTg3NDAwNDFiNGM5NWIxNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNiMWNmMDVkNzM3NDk3MDkwYTBmOWE2N2M1YjU2NzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTNjZGQ2OTJhOWY0NDJlMzkxNGYzNTg1NjU3YTk5M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjFkYzg0MGVlOWYxNGY0ZjlhMjBkODYyZGRiODhmMDIgPSAkKCc8ZGl2IGlkPSJodG1sX2IxZGM4NDBlZTlmMTRmNGY5YTIwZDg2MmRkYjg4ZjAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85M2NkZDY5MmE5ZjQ0MmUzOTE0ZjM1ODU2NTdhOTkzYy5zZXRDb250ZW50KGh0bWxfYjFkYzg0MGVlOWYxNGY0ZjlhMjBkODYyZGRiODhmMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWNiMWNmMDVkNzM3NDk3MDkwYTBmOWE2N2M1YjU2NzMuYmluZFBvcHVwKHBvcHVwXzkzY2RkNjkyYTlmNDQyZTM5MTRmMzU4NTY1N2E5OTNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlNjU1YWNiYjM5OTQwYTRiOTMxMDZkZDM0MDcyZGU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJhMjM4MGVjYmU0NDM4ZGIwZjczZDc5ZDk3YWM0NDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDk2MzM0YmRmOWYzNDYwODliZjBhYTkxZTJjZGRiZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzA5NjMzNGJkZjlmMzQ2MDg5YmYwYWE5MWUyY2RkYmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJhMjM4MGVjYmU0NDM4ZGIwZjczZDc5ZDk3YWM0NDAuc2V0Q29udGVudChodG1sXzA5NjMzNGJkZjlmMzQ2MDg5YmYwYWE5MWUyY2RkYmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlNjU1YWNiYjM5OTQwYTRiOTMxMDZkZDM0MDcyZGU4LmJpbmRQb3B1cChwb3B1cF8xYmEyMzgwZWNiZTQ0MzhkYjBmNzNkNzlkOTdhYzQ0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OGE1MTA2ZjY4MjY0MjM5YTg3NGQxNTY0N2Q0MjFkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjliMGQyMTkwOWM0MzIyOTQ0ODQzNWEzOWQyOTRjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWI0NDEzOGNlY2Y0NzJkYjJkNWRhYmQ5MzA1OTRiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjFiNDQxMzhjZWNmNDcyZGIyZDVkYWJkOTMwNTk0YjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMjliMGQyMTkwOWM0MzIyOTQ0ODQzNWEzOWQyOTRjZi5zZXRDb250ZW50KGh0bWxfYjFiNDQxMzhjZWNmNDcyZGIyZDVkYWJkOTMwNTk0YjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzhhNTEwNmY2ODI2NDIzOWE4NzRkMTU2NDdkNDIxZDYuYmluZFBvcHVwKHBvcHVwX2EyOWIwZDIxOTA5YzQzMjI5NDQ4NDM1YTM5ZDI5NGNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2ZDgzZjY4YmJlYTQxYzBhY2YxODZkYmI4OTFjZjk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84M2IwMTcwNWFhMDU0ZTNjODIwYmIxNzIzYTE4NjJjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZDNmNGU5MDRhY2U0YTg3YWU5MjllNmZlMWVkNjUzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2QzZjRlOTA0YWNlNGE4N2FlOTI5ZTZmZTFlZDY1MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNiMDE3MDVhYTA1NGUzYzgyMGJiMTcyM2ExODYyYzkuc2V0Q29udGVudChodG1sXzNkM2Y0ZTkwNGFjZTRhODdhZTkyOWU2ZmUxZWQ2NTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc2ZDgzZjY4YmJlYTQxYzBhY2YxODZkYmI4OTFjZjk0LmJpbmRQb3B1cChwb3B1cF84M2IwMTcwNWFhMDU0ZTNjODIwYmIxNzIzYTE4NjJjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MWRlMzhmMGMyZWU0NjEzODY1ODBlNGNkMmRhODMyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNjOGRlZDNiNDFlNGI0NDgwZGFlNzliMzAxNThmZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzg5ODNmZDFhOTk3NGI4OGE3NDM3MjY0ODIzODRjOWMgPSAkKCc8ZGl2IGlkPSJodG1sX2M4OTgzZmQxYTk5NzRiODhhNzQzNzI2NDgyMzg0YzljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYzhkZWQzYjQxZTRiNDQ4MGRhZTc5YjMwMTU4ZmRjLnNldENvbnRlbnQoaHRtbF9jODk4M2ZkMWE5OTc0Yjg4YTc0MzcyNjQ4MjM4NGM5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MWRlMzhmMGMyZWU0NjEzODY1ODBlNGNkMmRhODMyMy5iaW5kUG9wdXAocG9wdXBfZmNjOGRlZDNiNDFlNGI0NDgwZGFlNzliMzAxNThmZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWVjNjRiNjE1MGVkNDc1YzliNzcyYWJlOTc2NWU3NDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjE1ZWJjNTY1NzNjNGNjZGI5Yjk3MGRlYTNjNzMxNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGQ3MDYxMGY5YzQ1NGM2NDkyMDY4N2FiMzFmYmY1NjEgPSAkKCc8ZGl2IGlkPSJodG1sX2RkNzA2MTBmOWM0NTRjNjQ5MjA2ODdhYjMxZmJmNTYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTVlYmM1NjU3M2M0Y2NkYjliOTcwZGVhM2M3MzE2Yy5zZXRDb250ZW50KGh0bWxfZGQ3MDYxMGY5YzQ1NGM2NDkyMDY4N2FiMzFmYmY1NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWVjNjRiNjE1MGVkNDc1YzliNzcyYWJlOTc2NWU3NDAuYmluZFBvcHVwKHBvcHVwX2IxNWViYzU2NTczYzRjY2RiOWI5NzBkZWEzYzczMTZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmZTEzN2EzOGZhNTQwM2U5ZWZiNmUxZDk0OWRkYWI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkMWQwYjMyZjMwNjRlYmJiZjA4NTE0NzJlNzQ1YmJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzOGEyZDI2NjA4MjQ5OGRiYjkwNjc4NmEyMTZkNTZhID0gJCgnPGRpdiBpZD0iaHRtbF9jMzhhMmQyNjYwODI0OThkYmI5MDY3ODZhMjE2ZDU2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDFkMGIzMmYzMDY0ZWJiYmYwODUxNDcyZTc0NWJiZi5zZXRDb250ZW50KGh0bWxfYzM4YTJkMjY2MDgyNDk4ZGJiOTA2Nzg2YTIxNmQ1NmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZlMTM3YTM4ZmE1NDAzZTllZmI2ZTFkOTQ5ZGRhYjYuYmluZFBvcHVwKHBvcHVwXzNkMWQwYjMyZjMwNjRlYmJiZjA4NTE0NzJlNzQ1YmJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiODMzNTA3YmRlNjRjM2NhNDkzNGEyYTg3NGNlYzZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljM2IxNjkzYTAwYjRjMzViMmRmYjkzYjFlOTliY2E5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhMTYwNTg2ODI2MjRjODA5OTMwMDU3MDY3YjkyZTNiID0gJCgnPGRpdiBpZD0iaHRtbF83YTE2MDU4NjgyNjI0YzgwOTkzMDA1NzA2N2I5MmUzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWMzYjE2OTNhMDBiNGMzNWIyZGZiOTNiMWU5OWJjYTkuc2V0Q29udGVudChodG1sXzdhMTYwNTg2ODI2MjRjODA5OTMwMDU3MDY3YjkyZTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiODMzNTA3YmRlNjRjM2NhNDkzNGEyYTg3NGNlYzZlLmJpbmRQb3B1cChwb3B1cF85YzNiMTY5M2EwMGI0YzM1YjJkZmI5M2IxZTk5YmNhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYmE5NGYxZmExZTc0MjQ1OWFjZWY0Mzk0N2Q0MGU0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDZhNzY2NjY0N2U0OWI4OTU3NjYxM2YwYzNjM2MzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODMzODAwOGQzMTk0NjIyYTNiZjgyMGI3YTM3ODIxYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTgzMzgwMDhkMzE5NDYyMmEzYmY4MjBiN2EzNzgyMWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0NmE3NjY2NjQ3ZTQ5Yjg5NTc2NjEzZjBjM2MzYzM4LnNldENvbnRlbnQoaHRtbF9lODMzODAwOGQzMTk0NjIyYTNiZjgyMGI3YTM3ODIxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYmE5NGYxZmExZTc0MjQ1OWFjZWY0Mzk0N2Q0MGU0OC5iaW5kUG9wdXAocG9wdXBfNjQ2YTc2NjY2NDdlNDliODk1NzY2MTNmMGMzYzNjMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmVmMzczMDNlMjU5NDIxNTgxMDA3NWMxMWRjNTI4YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWJiYzA5MGJlZTk5NDFkNmI1NmJjZTM1MzBjOGU3YjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZkOTlmZWQ5ODU3NDkwODkzOTU5ZTk2NTM0YTZkMWEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2ZDk5ZmVkOTg1NzQ5MDg5Mzk1OWU5NjUzNGE2ZDFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViYmMwOTBiZWU5OTQxZDZiNTZiY2UzNTMwYzhlN2IwLnNldENvbnRlbnQoaHRtbF80NmQ5OWZlZDk4NTc0OTA4OTM5NTllOTY1MzRhNmQxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZWYzNzMwM2UyNTk0MjE1ODEwMDc1YzExZGM1MjhjNi5iaW5kUG9wdXAocG9wdXBfNWJiYzA5MGJlZTk5NDFkNmI1NmJjZTM1MzBjOGU3YjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzg5ZTQ4OGRmYzgwNGUzODhiMDE3OTI3NmE2YTY3MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2ZGQ1NTZmM2U1NDQ0YTE4MDYyN2Y0YmNjYTRlMjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZGQ3NWY0NTY1NDRmYzQ4ZGJkZmU3ZDMzZWJmN2Y2ID0gJCgnPGRpdiBpZD0iaHRtbF82MWRkNzVmNDU2NTQ0ZmM0OGRiZGZlN2QzM2ViZjdmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTZkZDU1NmYzZTU0NDRhMTgwNjI3ZjRiY2NhNGUyNzQuc2V0Q29udGVudChodG1sXzYxZGQ3NWY0NTY1NDRmYzQ4ZGJkZmU3ZDMzZWJmN2Y2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4OWU0ODhkZmM4MDRlMzg4YjAxNzkyNzZhNmE2NzA4LmJpbmRQb3B1cChwb3B1cF81NmRkNTU2ZjNlNTQ0NGExODA2MjdmNGJjY2E0ZTI3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NTU5ZmUwMzIxMjk0MWNmOThlODZmNjcxY2ZmNTA3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZTg1ZDRhNmU4MDA0NzMyYWM3ZDcwMDVkMTM0ZmFmYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjZiZjRmZTQ3MTc0Y2YwYmJkYWU3MzJhNWMwZTI5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmI2YmY0ZmU0NzE3NGNmMGJiZGFlNzMyYTVjMGUyOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2U4NWQ0YTZlODAwNDczMmFjN2Q3MDA1ZDEzNGZhZmMuc2V0Q29udGVudChodG1sX2ZiNmJmNGZlNDcxNzRjZjBiYmRhZTczMmE1YzBlMjkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1NTlmZTAzMjEyOTQxY2Y5OGU4NmY2NzFjZmY1MDdiLmJpbmRQb3B1cChwb3B1cF83ZTg1ZDRhNmU4MDA0NzMyYWM3ZDcwMDVkMTM0ZmFmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWIxYjVlYWJlOGU0YzIxODkxNDdjMDI4YzM2MjU5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZGFhMzZjYTYwOTE0ZTkxYTc1MTM1M2I3ZDg3NDE1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzlkNzY4MDZhMDg0YTI0OGJlYWYzZGIwYjFjMTVhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjM5ZDc2ODA2YTA4NGEyNDhiZWFmM2RiMGIxYzE1YWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2RhYTM2Y2E2MDkxNGU5MWE3NTEzNTNiN2Q4NzQxNTkuc2V0Q29udGVudChodG1sXzYzOWQ3NjgwNmEwODRhMjQ4YmVhZjNkYjBiMWMxNWFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1YjFiNWVhYmU4ZTRjMjE4OTE0N2MwMjhjMzYyNTk3LmJpbmRQb3B1cChwb3B1cF8zZGFhMzZjYTYwOTE0ZTkxYTc1MTM1M2I3ZDg3NDE1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTM3MTdlZGU2YzA0N2ZiYWU5ZTg2ZmVkZDliNDNjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzN2Q1ZWU3MTdjZTRlNDlhMDI1ODkzMDY4Yjg1NmExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1NTdlYzhjZDMxZjQ0NzQ5YjkzNGQxZGU3MGZlOTk5ID0gJCgnPGRpdiBpZD0iaHRtbF9hNTU3ZWM4Y2QzMWY0NDc0OWI5MzRkMWRlNzBmZTk5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzN2Q1ZWU3MTdjZTRlNDlhMDI1ODkzMDY4Yjg1NmExLnNldENvbnRlbnQoaHRtbF9hNTU3ZWM4Y2QzMWY0NDc0OWI5MzRkMWRlNzBmZTk5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTM3MTdlZGU2YzA0N2ZiYWU5ZTg2ZmVkZDliNDNjYy5iaW5kUG9wdXAocG9wdXBfMzM3ZDVlZTcxN2NlNGU0OWEwMjU4OTMwNjhiODU2YTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzllMTA2Yzk4ZGNhNDE1OWI1MmI4YjA3MjFhODY5YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQyYzlmMzUxMGNjNGM4YmEzMTQzODRkNGM1ZjlmNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGViYjQ0NzQ2MjA1NGE5MDkwMjcwOWYxYjY0YjBhYmMgPSAkKCc8ZGl2IGlkPSJodG1sXzhlYmI0NDc0NjIwNTRhOTA5MDI3MDlmMWI2NGIwYWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDJjOWYzNTEwY2M0YzhiYTMxNDM4NGQ0YzVmOWY0My5zZXRDb250ZW50KGh0bWxfOGViYjQ0NzQ2MjA1NGE5MDkwMjcwOWYxYjY0YjBhYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzllMTA2Yzk4ZGNhNDE1OWI1MmI4YjA3MjFhODY5YzYuYmluZFBvcHVwKHBvcHVwXzA0MmM5ZjM1MTBjYzRjOGJhMzE0Mzg0ZDRjNWY5ZjQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkM2M2YWRmZGZjMDRiNTRiOWU0ZmY1NzNiODlkMGVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlZjM0NjJhYWRlOTRmYTFhZjEwZmM2NTg0ZGJjMWJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjMmU4YjRkZjBjNzQxMjFiYWM3ODZjMjk2OWRiZDQ4ID0gJCgnPGRpdiBpZD0iaHRtbF82YzJlOGI0ZGYwYzc0MTIxYmFjNzg2YzI5NjlkYmQ0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZWYzNDYyYWFkZTk0ZmExYWYxMGZjNjU4NGRiYzFiZC5zZXRDb250ZW50KGh0bWxfNmMyZThiNGRmMGM3NDEyMWJhYzc4NmMyOTY5ZGJkNDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2QzYzZhZGZkZmMwNGI1NGI5ZTRmZjU3M2I4OWQwZWQuYmluZFBvcHVwKHBvcHVwXzRlZjM0NjJhYWRlOTRmYTFhZjEwZmM2NTg0ZGJjMWJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlZWExMmQ0ZDBkZTRhNGM5ZmNiODA5MjIzOTNhYzc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2NDhlNGUxYjMyNzRkZjhiZDNjNzgyMDk0ZmQ2ZDJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZlYzEwMWU2MDQ3MDQ5YmE5MGUyMmQzNmQ4ZDUwYTEyID0gJCgnPGRpdiBpZD0iaHRtbF82ZWMxMDFlNjA0NzA0OWJhOTBlMjJkMzZkOGQ1MGExMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjQ4ZTRlMWIzMjc0ZGY4YmQzYzc4MjA5NGZkNmQyYy5zZXRDb250ZW50KGh0bWxfNmVjMTAxZTYwNDcwNDliYTkwZTIyZDM2ZDhkNTBhMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWVlYTEyZDRkMGRlNGE0YzlmY2I4MDkyMjM5M2FjNzYuYmluZFBvcHVwKHBvcHVwXzc2NDhlNGUxYjMyNzRkZjhiZDNjNzgyMDk0ZmQ2ZDJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyZDFkYjBjNzBlYTRmY2E4NjZhMjhhMmMzYjYzM2E2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0ZjU1YmM0NjQ5ZjQzODJhZjQ2NzRjNzA3YTk5YWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyOThjOTVlYTY0ZDQ2MGY5MmU0OTZmYzBjNzhjNjkyID0gJCgnPGRpdiBpZD0iaHRtbF80Mjk4Yzk1ZWE2NGQ0NjBmOTJlNDk2ZmMwYzc4YzY5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NGY1NWJjNDY0OWY0MzgyYWY0Njc0YzcwN2E5OWFiMS5zZXRDb250ZW50KGh0bWxfNDI5OGM5NWVhNjRkNDYwZjkyZTQ5NmZjMGM3OGM2OTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTJkMWRiMGM3MGVhNGZjYTg2NmEyOGEyYzNiNjMzYTYuYmluZFBvcHVwKHBvcHVwXzU0ZjU1YmM0NjQ5ZjQzODJhZjQ2NzRjNzA3YTk5YWIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzZmNlN2ZjMGU0ODRhNDdhNDlhMTM3Zjg1N2Y0N2M0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyZGIyZDQ3N2E5ZDRmYmI4ODhkMTNhNmMyNDRmZjIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhYzdlOGI4ODA4YzQ2YWI4ZGM0NDEzZDYwZWFjYTc0ID0gJCgnPGRpdiBpZD0iaHRtbF9kYWM3ZThiODgwOGM0NmFiOGRjNDQxM2Q2MGVhY2E3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmRiMmQ0NzdhOWQ0ZmJiODg4ZDEzYTZjMjQ0ZmYyMi5zZXRDb250ZW50KGh0bWxfZGFjN2U4Yjg4MDhjNDZhYjhkYzQ0MTNkNjBlYWNhNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjNmY2U3ZmMwZTQ4NGE0N2E0OWExMzdmODU3ZjQ3YzQuYmluZFBvcHVwKHBvcHVwXzYyZGIyZDQ3N2E5ZDRmYmI4ODhkMTNhNmMyNDRmZjIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2ZjJlZGE4YWE0MTRjNWZiZTNiMjVmZDA2MDliYjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1NDRiNTg3Y2I0NzQzMzQ5MTY5OWYwZmZkNGNiNGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhODk3N2E3M2Q1MTRkOTlhNWE0ZWQ4NTU2YWJkYWU3ID0gJCgnPGRpdiBpZD0iaHRtbF9mYTg5NzdhNzNkNTE0ZDk5YTVhNGVkODU1NmFiZGFlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1NDRiNTg3Y2I0NzQzMzQ5MTY5OWYwZmZkNGNiNGNkLnNldENvbnRlbnQoaHRtbF9mYTg5NzdhNzNkNTE0ZDk5YTVhNGVkODU1NmFiZGFlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNmYyZWRhOGFhNDE0YzVmYmUzYjI1ZmQwNjA5YmIwMC5iaW5kUG9wdXAocG9wdXBfMTU0NGI1ODdjYjQ3NDMzNDkxNjk5ZjBmZmQ0Y2I0Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDA0YzllZTZkZGU5NDBiMmIwM2I3MzU1Mzk1MzgzNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2NhMzZkMDgzN2JkNGIyNWIwNGUwNGNlMTljZDBkMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDA2ODU1OTU3YjllNDI4NWFjZDU3ZDE3ODI2NTBmNzUgPSAkKCc8ZGl2IGlkPSJodG1sX2QwNjg1NTk1N2I5ZTQyODVhY2Q1N2QxNzgyNjUwZjc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NhMzZkMDgzN2JkNGIyNWIwNGUwNGNlMTljZDBkMGMuc2V0Q29udGVudChodG1sX2QwNjg1NTk1N2I5ZTQyODVhY2Q1N2QxNzgyNjUwZjc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNGM5ZWU2ZGRlOTQwYjJiMDNiNzM1NTM5NTM4MzVjLmJpbmRQb3B1cChwb3B1cF83Y2EzNmQwODM3YmQ0YjI1YjA0ZTA0Y2UxOWNkMGQwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MWZmMmQ4ZTdiMTY0NzIwYThkNTk2Mjc5OWEwZGYzNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDNhZjJkMTU0MjFmNDk4NjgwMTljOGY0YThhNzJlMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTdiYmM0ZmVjYmIyNDMwY2JkMTEzZDUwOWE3ODMyMGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E3YmJjNGZlY2JiMjQzMGNiZDExM2Q1MDlhNzgzMjBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDNhZjJkMTU0MjFmNDk4NjgwMTljOGY0YThhNzJlMTguc2V0Q29udGVudChodG1sX2E3YmJjNGZlY2JiMjQzMGNiZDExM2Q1MDlhNzgzMjBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxZmYyZDhlN2IxNjQ3MjBhOGQ1OTYyNzk5YTBkZjM2LmJpbmRQb3B1cChwb3B1cF9kM2FmMmQxNTQyMWY0OTg2ODAxOWM4ZjRhOGE3MmUxOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YjRmNGE1OTJjYjU0NTI1OWM1MWM3MzRlMDZiYzI5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzc1MjhjNjZjOGQ0MTM2OWU1ZTdmYzkxMjgwZWY3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNzRhMjQwZWFiYmI0YzQzYTg1ZjI1MDU1OGU1ZjllYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTc0YTI0MGVhYmJiNGM0M2E4NWYyNTA1NThlNWY5ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjNzUyOGM2NmM4ZDQxMzY5ZTVlN2ZjOTEyODBlZjdmLnNldENvbnRlbnQoaHRtbF8xNzRhMjQwZWFiYmI0YzQzYTg1ZjI1MDU1OGU1ZjllYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjRmNGE1OTJjYjU0NTI1OWM1MWM3MzRlMDZiYzI5MC5iaW5kUG9wdXAocG9wdXBfMWM3NTI4YzY2YzhkNDEzNjllNWU3ZmM5MTI4MGVmN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzgyNTFlOWUxNzczNDFiMjhkMmRkZjAwODUxZWYyNjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIwODg5NDM0NmY0NDk5NWFkNGUwMzY5MWY2NWI3ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDllOThiYmIwY2Q0NDI3MWI3NjkxYmRkNzk3ZmEyOGYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ5ZTk4YmJiMGNkNDQyNzFiNzY5MWJkZDc5N2ZhMjhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGIwODg5NDM0NmY0NDk5NWFkNGUwMzY5MWY2NWI3ZWIuc2V0Q29udGVudChodG1sXzQ5ZTk4YmJiMGNkNDQyNzFiNzY5MWJkZDc5N2ZhMjhmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4MjUxZTllMTc3MzQxYjI4ZDJkZGYwMDg1MWVmMjY2LmJpbmRQb3B1cChwb3B1cF9kYjA4ODk0MzQ2ZjQ0OTk1YWQ0ZTAzNjkxZjY1YjdlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOTM0YTEyODAxNWQ0OTcwYTJhMTBhMzY2M2M5YjFjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mN2EzNWIyNzUwYjk0MjdjYmEyYTRiYzQ3NmE4ZTAyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjFmNDJhOTY4NjQ0OWRkYjFlY2ViYTUyMDA1YmJiZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODIxZjQyYTk2ODY0NDlkZGIxZWNlYmE1MjAwNWJiYmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdhMzViMjc1MGI5NDI3Y2JhMmE0YmM0NzZhOGUwMjQuc2V0Q29udGVudChodG1sXzgyMWY0MmE5Njg2NDQ5ZGRiMWVjZWJhNTIwMDViYmJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5MzRhMTI4MDE1ZDQ5NzBhMmExMGEzNjYzYzliMWMwLmJpbmRQb3B1cChwb3B1cF9mN2EzNWIyNzUwYjk0MjdjYmEyYTRiYzQ3NmE4ZTAyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODEwOTRjOGVmZWY0NzVkYWQ3YjJjMmM1ODBjNTYzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzkwYTIwZTg5YzM0NjY5OWEwNjA3NjcyNTFmZDU2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOGU4ZjgzYzcxNjE0ZDIwYTFkOWRhZWU0NzNmZWZhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjhlOGY4M2M3MTYxNGQyMGExZDlkYWVlNDczZmVmYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3OTBhMjBlODljMzQ2Njk5YTA2MDc2NzI1MWZkNTYwLnNldENvbnRlbnQoaHRtbF8yOGU4ZjgzYzcxNjE0ZDIwYTFkOWRhZWU0NzNmZWZhNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODEwOTRjOGVmZWY0NzVkYWQ3YjJjMmM1ODBjNTYzNC5iaW5kUG9wdXAocG9wdXBfNTc5MGEyMGU4OWMzNDY2OTlhMDYwNzY3MjUxZmQ1NjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGIyYTgyNTBjNWJkNDQxZmFkNDgyMzc2MmY0MDMxNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA4M2RlNmZkMTY1NDllNjkzNGRjMzYzYjFhNDUwNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWMxNmYwYjI3NTQ1NDE5NmFjMWY0MWM2YzkzYWNjMjkgPSAkKCc8ZGl2IGlkPSJodG1sXzFjMTZmMGIyNzU0NTQxOTZhYzFmNDFjNmM5M2FjYzI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwODNkZTZmZDE2NTQ5ZTY5MzRkYzM2M2IxYTQ1MDRmLnNldENvbnRlbnQoaHRtbF8xYzE2ZjBiMjc1NDU0MTk2YWMxZjQxYzZjOTNhY2MyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYjJhODI1MGM1YmQ0NDFmYWQ0ODIzNzYyZjQwMzE2Yi5iaW5kUG9wdXAocG9wdXBfYTA4M2RlNmZkMTY1NDllNjkzNGRjMzYzYjFhNDUwNGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjE2MDQxODhiMzI5NDc1OThhOTc0MGJiMzNkOThiNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyNDFkNDM3MTliOTQ0ZGY5ZGNkNTgxYjBhMzdmYjI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkMGE1Mjk1YjYwNTQ1NzVhOWIzMjIzYzc5YjM1N2U3ID0gJCgnPGRpdiBpZD0iaHRtbF8xZDBhNTI5NWI2MDU0NTc1YTliMzIyM2M3OWIzNTdlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDI0MWQ0MzcxOWI5NDRkZjlkY2Q1ODFiMGEzN2ZiMjcuc2V0Q29udGVudChodG1sXzFkMGE1Mjk1YjYwNTQ1NzVhOWIzMjIzYzc5YjM1N2U3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNjA0MTg4YjMyOTQ3NTk4YTk3NDBiYjMzZDk4YjcxLmJpbmRQb3B1cChwb3B1cF8wMjQxZDQzNzE5Yjk0NGRmOWRjZDU4MWIwYTM3ZmIyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmI1Y2Q2YjA2MDE0YWZlYWI0NWY0MDBjMDc1NTgwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzNmOGE5ZGUzN2JlNGFkNDhjMGRhYTdkZWY3M2QwNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDZhOGRlZTkzYmNhNGJmZjg1MjUwZDM0Yzk0M2IyYjYgPSAkKCc8ZGl2IGlkPSJodG1sXzA2YThkZWU5M2JjYTRiZmY4NTI1MGQzNGM5NDNiMmI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNmOGE5ZGUzN2JlNGFkNDhjMGRhYTdkZWY3M2QwNzcuc2V0Q29udGVudChodG1sXzA2YThkZWU5M2JjYTRiZmY4NTI1MGQzNGM5NDNiMmI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmYjVjZDZiMDYwMTRhZmVhYjQ1ZjQwMGMwNzU1ODAxLmJpbmRQb3B1cChwb3B1cF8zM2Y4YTlkZTM3YmU0YWQ0OGMwZGFhN2RlZjczZDA3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZGMwMDA3NGRmZjg0NDhjODVjZTVlM2M4MWZiYTYwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDEyNThlOTFkMWI2NGNiYzg4NzkyOGY1ZTVmMmU2ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTAwMzRkNjVjMmY2NDExNTlkZWE4YzBmODgzZGRjMmUgPSAkKCc8ZGl2IGlkPSJodG1sX2UwMDM0ZDY1YzJmNjQxMTU5ZGVhOGMwZjg4M2RkYzJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxMjU4ZTkxZDFiNjRjYmM4ODc5MjhmNWU1ZjJlNmZhLnNldENvbnRlbnQoaHRtbF9lMDAzNGQ2NWMyZjY0MTE1OWRlYThjMGY4ODNkZGMyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZGMwMDA3NGRmZjg0NDhjODVjZTVlM2M4MWZiYTYwNi5iaW5kUG9wdXAocG9wdXBfMDEyNThlOTFkMWI2NGNiYzg4NzkyOGY1ZTVmMmU2ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmYxZDA5MDcwMmJkNGM4MmIwYzMxMzkyYmRjMjI5MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjZjgyOWI2NjU4NzRlOTg4MDk2NjNmYzNhN2E2MjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1Y2U1YTI1NTcxYjRiODI5MGMzOTRkYmViMjkzMzlmID0gJCgnPGRpdiBpZD0iaHRtbF8zNWNlNWEyNTU3MWI0YjgyOTBjMzk0ZGJlYjI5MzM5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWNmODI5YjY2NTg3NGU5ODgwOTY2M2ZjM2E3YTYyOWEuc2V0Q29udGVudChodG1sXzM1Y2U1YTI1NTcxYjRiODI5MGMzOTRkYmViMjkzMzlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmMWQwOTA3MDJiZDRjODJiMGMzMTM5MmJkYzIyOTMxLmJpbmRQb3B1cChwb3B1cF9hY2Y4MjliNjY1ODc0ZTk4ODA5NjYzZmMzYTdhNjI5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84M2QzYmMzNTNmODk0MDI0YjlkZGFmMzQ3NGZlZDQ2NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTRkOTE1NmRmMjk0ODc2OTc1ZDdiOTg0YjgyYWI1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTQzOTUyZjcwNTg0ODU4OWVlYjhjOTYwZjVlMWVhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmE0Mzk1MmY3MDU4NDg1ODllZWI4Yzk2MGY1ZTFlYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmE0ZDkxNTZkZjI5NDg3Njk3NWQ3Yjk4NGI4MmFiNTYuc2V0Q29udGVudChodG1sXzJhNDM5NTJmNzA1ODQ4NTg5ZWViOGM5NjBmNWUxZWE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzZDNiYzM1M2Y4OTQwMjRiOWRkYWYzNDc0ZmVkNDY2LmJpbmRQb3B1cChwb3B1cF9mYTRkOTE1NmRmMjk0ODc2OTc1ZDdiOTg0YjgyYWI1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMDM0NzQ5Yzc5MzM0OTAyOGMzNGQyMGM0Mjg3ZGQ1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzY2MzYxNmM5ZmI0NDFlMDg5ZGMwN2U0YTRkZTQ1ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjU3Y2M0MGYyMmJhNDI2YmEwOWExOTUzNzIwODY5YjIgPSAkKCc8ZGl2IGlkPSJodG1sXzY1N2NjNDBmMjJiYTQyNmJhMDlhMTk1MzcyMDg2OWIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzY2MzYxNmM5ZmI0NDFlMDg5ZGMwN2U0YTRkZTQ1ZGMuc2V0Q29udGVudChodG1sXzY1N2NjNDBmMjJiYTQyNmJhMDlhMTk1MzcyMDg2OWIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwMzQ3NDljNzkzMzQ5MDI4YzM0ZDIwYzQyODdkZDVhLmJpbmRQb3B1cChwb3B1cF83NjYzNjE2YzlmYjQ0MWUwODlkYzA3ZTRhNGRlNDVkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZGJmM2YwODE1MjU0NGVmODA1NTExMTY3NDEwYzBkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOWQxYjRiY2IwZjg0ZDliYTdkOTgxMDM4ZDI5MTQ0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NGE1NDFiZWZjNDc0ZDgxODk4OTlkMzQzYzUyMGE2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfODRhNTQxYmVmYzQ3NGQ4MTg5ODk5ZDM0M2M1MjBhNjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjlkMWI0YmNiMGY4NGQ5YmE3ZDk4MTAzOGQyOTE0NDcuc2V0Q29udGVudChodG1sXzg0YTU0MWJlZmM0NzRkODE4OTg5OWQzNDNjNTIwYTY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkYmYzZjA4MTUyNTQ0ZWY4MDU1MTExNjc0MTBjMGQzLmJpbmRQb3B1cChwb3B1cF9mOWQxYjRiY2IwZjg0ZDliYTdkOTgxMDM4ZDI5MTQ0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzBjZTg2YzEyNjk0Mzg5ODVmZWRkNmFiM2I0NWYzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTdjYmZlZDhjM2M0YTZkYmIwNTM2ZjVhZmFlMTk4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Zjg2NTA2MmY3ZDY0YWNmOTc0ZmJkY2QyZmQ0NDQ1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y4NjUwNjJmN2Q2NGFjZjk3NGZiZGNkMmZkNDQ0NTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTdjYmZlZDhjM2M0YTZkYmIwNTM2ZjVhZmFlMTk4NC5zZXRDb250ZW50KGh0bWxfN2Y4NjUwNjJmN2Q2NGFjZjk3NGZiZGNkMmZkNDQ0NTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWMwY2U4NmMxMjY5NDM4OTg1ZmVkZDZhYjNiNDVmMzIuYmluZFBvcHVwKHBvcHVwXzhlN2NiZmVkOGMzYzRhNmRiYjA1MzZmNWFmYWUxOTg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2YmFkMDY1ZDdlYjQ4NmJiNTgxOWM2OGIwNzdkYzRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxMWNlYjhkMDVjNjQ1MThiMGQ1Y2NhOGFjZWU0MGYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzYWQ1OTY3Mjk3YjRjNzVhYmIyZjFmNDQ1YmJmNmQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9lM2FkNTk2NzI5N2I0Yzc1YWJiMmYxZjQ0NWJiZjZkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxMWNlYjhkMDVjNjQ1MThiMGQ1Y2NhOGFjZWU0MGYxLnNldENvbnRlbnQoaHRtbF9lM2FkNTk2NzI5N2I0Yzc1YWJiMmYxZjQ0NWJiZjZkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NmJhZDA2NWQ3ZWI0ODZiYjU4MTljNjhiMDc3ZGM0Yi5iaW5kUG9wdXAocG9wdXBfNjExY2ViOGQwNWM2NDUxOGIwZDVjY2E4YWNlZTQwZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk0MzQ0NDExMzI2NDZjNzljMWI4Nzk0ODc0Yzg0YWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0Njg2YjRhMWIwYjQ5OGQ5Yzk1NDk0Mjg4NThmMDE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhZTlhZWY1NTFjMDQzODQ5NTllN2U4NmI4MjZiNGE1ID0gJCgnPGRpdiBpZD0iaHRtbF8xYWU5YWVmNTUxYzA0Mzg0OTU5ZTdlODZiODI2YjRhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0Njg2YjRhMWIwYjQ5OGQ5Yzk1NDk0Mjg4NThmMDE1LnNldENvbnRlbnQoaHRtbF8xYWU5YWVmNTUxYzA0Mzg0OTU5ZTdlODZiODI2YjRhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOTQzNDQ0MTEzMjY0NmM3OWMxYjg3OTQ4NzRjODRhZi5iaW5kUG9wdXAocG9wdXBfNjQ2ODZiNGExYjBiNDk4ZDljOTU0OTQyODg1OGYwMTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjM4NWE1M2QwM2UyNDZlMGJhMWJhMzYzZDk4NTgwYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWI2YWFkNGEwOGMxNDY2Nzg0ODk1NTczN2M1N2JkNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDI3ZTIzNWEzNzFmNDllMWFhMWFmYzcyNDA3ODY1Y2EgPSAkKCc8ZGl2IGlkPSJodG1sXzQyN2UyMzVhMzcxZjQ5ZTFhYTFhZmM3MjQwNzg2NWNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWI2YWFkNGEwOGMxNDY2Nzg0ODk1NTczN2M1N2JkNzMuc2V0Q29udGVudChodG1sXzQyN2UyMzVhMzcxZjQ5ZTFhYTFhZmM3MjQwNzg2NWNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzODVhNTNkMDNlMjQ2ZTBiYTFiYTM2M2Q5ODU4MGM2LmJpbmRQb3B1cChwb3B1cF81YjZhYWQ0YTA4YzE0NjY3ODQ4OTU1NzM3YzU3YmQ3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjUxNzM5Njg4ZDc0ZjEyOTQxNDJkNzkzZGI3YzI3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjA2MWI3NTFiODE0YTk5OWJkNWE3ZTI3ZWE4YmNlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83M2I5NmMwY2NjNjc0NjYzODlhY2I0YzI3YmJjMzBhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzNiOTZjMGNjYzY3NDY2Mzg5YWNiNGMyN2JiYzMwYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjIwNjFiNzUxYjgxNGE5OTliZDVhN2UyN2VhOGJjZWUuc2V0Q29udGVudChodG1sXzczYjk2YzBjY2M2NzQ2NjM4OWFjYjRjMjdiYmMzMGE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmNTE3Mzk2ODhkNzRmMTI5NDE0MmQ3OTNkYjdjMjdjLmJpbmRQb3B1cChwb3B1cF8yMjA2MWI3NTFiODE0YTk5OWJkNWE3ZTI3ZWE4YmNlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OWI0ZWFhNTUwMDQ0M2RiODQ5MDAxNDlhNmI5YjdjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE1NDA0NTI2ZDYxNGNmMjkyZjg1ZThjZjU0MTZlYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFiY2U5MTdhNTFhNGVkNjk0OGRhZTBmZDc1ZDZkMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2UxYmNlOTE3YTUxYTRlZDY5NDhkYWUwZmQ3NWQ2ZDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTU0MDQ1MjZkNjE0Y2YyOTJmODVlOGNmNTQxNmViZC5zZXRDb250ZW50KGh0bWxfZTFiY2U5MTdhNTFhNGVkNjk0OGRhZTBmZDc1ZDZkMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzliNGVhYTU1MDA0NDNkYjg0OTAwMTQ5YTZiOWI3Y2IuYmluZFBvcHVwKHBvcHVwXzQxNTQwNDUyNmQ2MTRjZjI5MmY4NWU4Y2Y1NDE2ZWJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ODY1MjQ4ZTkwNDQ1YWU5OTlkMmMyNTA2ZTc3MjkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MTU0MDhhM2NmZmM0NWM4YTdmMzExMGRlYmJjY2FjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzE5ZmQyODllZmE0MmQyODY0ZTQ1MGNhNzYwYWRkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGMxOWZkMjg5ZWZhNDJkMjg2NGU0NTBjYTc2MGFkZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODE1NDA4YTNjZmZjNDVjOGE3ZjMxMTBkZWJiY2NhY2Iuc2V0Q29udGVudChodG1sXzRjMTlmZDI4OWVmYTQyZDI4NjRlNDUwY2E3NjBhZGQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4ODY1MjQ4ZTkwNDQ1YWU5OTlkMmMyNTA2ZTc3MjkzLmJpbmRQb3B1cChwb3B1cF84MTU0MDhhM2NmZmM0NWM4YTdmMzExMGRlYmJjY2FjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjE5NTI1NjE2Y2I0MzQ5OTRmMWY5ZTlkOWUwNWM0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDBhY2QzMTFmMzk0ZGRjOWFkZDk5ZWVkN2YxMTg4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NmY0YzQ0NDM3MmE0YjY1YWNkNTQxYTJhZWFkOTg2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzZmNGM0NDQzNzJhNGI2NWFjZDU0MWEyYWVhZDk4NmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0MGFjZDMxMWYzOTRkZGM5YWRkOTllZWQ3ZjExODg5LnNldENvbnRlbnQoaHRtbF83NmY0YzQ0NDM3MmE0YjY1YWNkNTQxYTJhZWFkOTg2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjE5NTI1NjE2Y2I0MzQ5OTRmMWY5ZTlkOWUwNWM0Ny5iaW5kUG9wdXAocG9wdXBfYzQwYWNkMzExZjM5NGRkYzlhZGQ5OWVlZDdmMTE4ODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjE0MTI2OTI2OWU4NDBjNTk2MWU3ZjlmY2YxYjk1YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDliOWZmNTc0ODkwNDQ3ZjhjZjllMTJkNTYwZmM3NDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTkzMjc5NTIyOWIwNDM3Mzg2Zjk5N2RiYTYwZmYzNDIgPSAkKCc8ZGl2IGlkPSJodG1sX2E5MzI3OTUyMjliMDQzNzM4NmY5OTdkYmE2MGZmMzQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOWI5ZmY1NzQ4OTA0NDdmOGNmOWUxMmQ1NjBmYzc0Mi5zZXRDb250ZW50KGh0bWxfYTkzMjc5NTIyOWIwNDM3Mzg2Zjk5N2RiYTYwZmYzNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE0MTI2OTI2OWU4NDBjNTk2MWU3ZjlmY2YxYjk1YjMuYmluZFBvcHVwKHBvcHVwX2Q5YjlmZjU3NDg5MDQ0N2Y4Y2Y5ZTEyZDU2MGZjNzQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyMWMxOTg5ZjVmZDRiYTA5ZmNhMzdhZTRmMGFiMmU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2N2JlMmI0ZmM4YzRiY2FiNmQ1NTc4MDM4MTQzYzFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzNzY1MzUyOWVkZjQ2MDU4ZDlhZjQ1YWU3YmY4MGQxID0gJCgnPGRpdiBpZD0iaHRtbF82Mzc2NTM1MjllZGY0NjA1OGQ5YWY0NWFlN2JmODBkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2N2JlMmI0ZmM4YzRiY2FiNmQ1NTc4MDM4MTQzYzFjLnNldENvbnRlbnQoaHRtbF82Mzc2NTM1MjllZGY0NjA1OGQ5YWY0NWFlN2JmODBkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjFjMTk4OWY1ZmQ0YmEwOWZjYTM3YWU0ZjBhYjJlNC5iaW5kUG9wdXAocG9wdXBfMjY3YmUyYjRmYzhjNGJjYWI2ZDU1NzgwMzgxNDNjMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM4Mjg4ZGJiNjg1NDA3ZjgyOGY2YmNhMGUxMzJhZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhMzQwNjQxNTFmMjQzNjFhOTFmMDQyODQ5NDYyZTc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwMGQ3OTYwMWNhZTQ2NThiZmI4ZmY4YzZlYTgwMjJhID0gJCgnPGRpdiBpZD0iaHRtbF8zMDBkNzk2MDFjYWU0NjU4YmZiOGZmOGM2ZWE4MDIyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWEzNDA2NDE1MWYyNDM2MWE5MWYwNDI4NDk0NjJlNzcuc2V0Q29udGVudChodG1sXzMwMGQ3OTYwMWNhZTQ2NThiZmI4ZmY4YzZlYTgwMjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzODI4OGRiYjY4NTQwN2Y4MjhmNmJjYTBlMTMyYWVhLmJpbmRQb3B1cChwb3B1cF9hYTM0MDY0MTUxZjI0MzYxYTkxZjA0Mjg0OTQ2MmU3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZTEzNjVlNDAxZGE0ZTA2OTA1OWIxOWE4YjYwNTQzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTUzMzk1M2I1OWM4NGMxMjkwN2MwOGZiNDRjZWE4N2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY0Mjg3Y2ZmYjk0NGJlMjk4MmMwZGUwNWI5ZTJkYzUgPSAkKCc8ZGl2IGlkPSJodG1sXzZmNDI4N2NmZmI5NDRiZTI5ODJjMGRlMDViOWUyZGM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTUzMzk1M2I1OWM4NGMxMjkwN2MwOGZiNDRjZWE4N2Yuc2V0Q29udGVudChodG1sXzZmNDI4N2NmZmI5NDRiZTI5ODJjMGRlMDViOWUyZGM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FlMTM2NWU0MDFkYTRlMDY5MDU5YjE5YThiNjA1NDMwLmJpbmRQb3B1cChwb3B1cF81NTMzOTUzYjU5Yzg0YzEyOTA3YzA4ZmI0NGNlYTg3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzVhMmI5ODQ4OTU0Yzg5OTM3ZTBjZDA0N2I2OWI4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTExZTRjYjYyNGFlNGU0ODk3OGRjNThkNzc4Zjg0ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGUzYjZjYmIxOGJkNDUzZDlhMzhhYWUzMDA2NWFlOGYgPSAkKCc8ZGl2IGlkPSJodG1sXzhlM2I2Y2JiMThiZDQ1M2Q5YTM4YWFlMzAwNjVhZThmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTFlNGNiNjI0YWU0ZTQ4OTc4ZGM1OGQ3NzhmODRlYi5zZXRDb250ZW50KGh0bWxfOGUzYjZjYmIxOGJkNDUzZDlhMzhhYWUzMDA2NWFlOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTM1YTJiOTg0ODk1NGM4OTkzN2UwY2QwNDdiNjliODkuYmluZFBvcHVwKHBvcHVwXzExMWU0Y2I2MjRhZTRlNDg5NzhkYzU4ZDc3OGY4NGViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjOTBkOGRlMWY2YzQyMzViMWRjZWUwN2MxYzlmMjYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTgxMzk4OTE3ZDY0MjE3OTU2NGQ1YTVhNDg1YmYxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDc2NTQ4Y2VhYjQ0YzM4ODliNzBjYmZmZDQzMzJiZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQ3NjU0OGNlYWI0NGMzODg5YjcwY2JmZmQ0MzMyYmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTU4MTM5ODkxN2Q2NDIxNzk1NjRkNWE1YTQ4NWJmMTUuc2V0Q29udGVudChodG1sX2M0NzY1NDhjZWFiNDRjMzg4OWI3MGNiZmZkNDMzMmJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjOTBkOGRlMWY2YzQyMzViMWRjZWUwN2MxYzlmMjYyLmJpbmRQb3B1cChwb3B1cF85NTgxMzk4OTE3ZDY0MjE3OTU2NGQ1YTVhNDg1YmYxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NjZlMGMzOWYyOGQ0ODc4OWMwOTRiMmVlMmZkNjU2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTg2MmJjMjRlZjZjNDliNDgxYmJiNDQ3MTliMmJjMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTY5YTJjNjE4N2VjNDBlZjkzMmM0Yzk4NmMyNTNjMmUgPSAkKCc8ZGl2IGlkPSJodG1sX2U2OWEyYzYxODdlYzQwZWY5MzJjNGM5ODZjMjUzYzJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODYyYmMyNGVmNmM0OWI0ODFiYmI0NDcxOWIyYmMxMC5zZXRDb250ZW50KGh0bWxfZTY5YTJjNjE4N2VjNDBlZjkzMmM0Yzk4NmMyNTNjMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzY2ZTBjMzlmMjhkNDg3ODljMDk0YjJlZTJmZDY1NmMuYmluZFBvcHVwKHBvcHVwXzE4NjJiYzI0ZWY2YzQ5YjQ4MWJiYjQ0NzE5YjJiYzEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzNzU5NGU1ZWFhMDQ3NjFiOWU3ZmU5ZDNhZmU2MzM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjYzZjRhNDlkMDgyNDY4Y2I1NzYzYjU3NzBkZmVhZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTIxOTljMzI1OGMyNGNlM2E1YjdhMmM2NGY2MmMzM2QgPSAkKCc8ZGl2IGlkPSJodG1sX2UyMTk5YzMyNThjMjRjZTNhNWI3YTJjNjRmNjJjMzNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2M2Y0YTQ5ZDA4MjQ2OGNiNTc2M2I1NzcwZGZlYWRmLnNldENvbnRlbnQoaHRtbF9lMjE5OWMzMjU4YzI0Y2UzYTViN2EyYzY0ZjYyYzMzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzc1OTRlNWVhYTA0NzYxYjllN2ZlOWQzYWZlNjMzNS5iaW5kUG9wdXAocG9wdXBfMjYzZjRhNDlkMDgyNDY4Y2I1NzYzYjU3NzBkZmVhZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWJhZjg0YWNhNTY1NDlmNjkzYmQ5YzUwOGU4M2EzZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQwMzY2ZjVhMjg5NDNlMDk2ODNkZDhkZTk5MjdjZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjE4MjZjMzc1NTg0NGUyNGIwYzI1NTk4ODFiN2U4NjMgPSAkKCc8ZGl2IGlkPSJodG1sX2IxODI2YzM3NTU4NDRlMjRiMGMyNTU5ODgxYjdlODYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkMDM2NmY1YTI4OTQzZTA5NjgzZGQ4ZGU5OTI3Y2ZhLnNldENvbnRlbnQoaHRtbF9iMTgyNmMzNzU1ODQ0ZTI0YjBjMjU1OTg4MWI3ZTg2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYmFmODRhY2E1NjU0OWY2OTNiZDljNTA4ZTgzYTNlYS5iaW5kUG9wdXAocG9wdXBfZmQwMzY2ZjVhMjg5NDNlMDk2ODNkZDhkZTk5MjdjZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWJiODU5YWE4ZTgxNGJkNmI1NmNlMDI2ODc4MzBhYWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlNDQ2MzRiN2FiZDQ1NzY5NWZjZjE4N2EwYmQ5MGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2MzVkMWNlNjI1YzQzMzRhYWY4NTg3ZjEzNmVkMjE0ID0gJCgnPGRpdiBpZD0iaHRtbF9jNjM1ZDFjZTYyNWM0MzM0YWFmODU4N2YxMzZlZDIxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZTQ0NjM0YjdhYmQ0NTc2OTVmY2YxODdhMGJkOTBjOC5zZXRDb250ZW50KGh0bWxfYzYzNWQxY2U2MjVjNDMzNGFhZjg1ODdmMTM2ZWQyMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWJiODU5YWE4ZTgxNGJkNmI1NmNlMDI2ODc4MzBhYWUuYmluZFBvcHVwKHBvcHVwX2JlNDQ2MzRiN2FiZDQ1NzY5NWZjZjE4N2EwYmQ5MGM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2MWM4MTBjMjI5ODQ2MmM4YWI5YmI2OWYzYzBhMzMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MDAxNmI2ZDZmNzY0NDBhOTc5ODIxMDhjNThiNWIxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNGQ3ODczZDU3MTU0ODk1OTJhZWFjZTRmNThhZTVlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTRkNzg3M2Q1NzE1NDg5NTkyYWVhY2U0ZjU4YWU1ZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDAxNmI2ZDZmNzY0NDBhOTc5ODIxMDhjNThiNWIxMy5zZXRDb250ZW50KGh0bWxfZTRkNzg3M2Q1NzE1NDg5NTkyYWVhY2U0ZjU4YWU1ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjYxYzgxMGMyMjk4NDYyYzhhYjliYjY5ZjNjMGEzMzEuYmluZFBvcHVwKHBvcHVwXzYwMDE2YjZkNmY3NjQ0MGE5Nzk4MjEwOGM1OGI1YjEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyODU1YzVjODEzZTQ5MzU4OWVmOTBmMzdhZWUzNmY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MGM0YzczZjc4MjA0YzZhOTczYTNlMGUwNzlmOTJkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNGRmOWM4MWEzODA0YjAxODYxNDA5ZDYxNTg5M2I1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjRkZjljODFhMzgwNGIwMTg2MTQwOWQ2MTU4OTNiNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MGM0YzczZjc4MjA0YzZhOTczYTNlMGUwNzlmOTJkZS5zZXRDb250ZW50KGh0bWxfMjRkZjljODFhMzgwNGIwMTg2MTQwOWQ2MTU4OTNiNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTI4NTVjNWM4MTNlNDkzNTg5ZWY5MGYzN2FlZTM2ZjUuYmluZFBvcHVwKHBvcHVwXzYwYzRjNzNmNzgyMDRjNmE5NzNhM2UwZTA3OWY5MmRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyYTA2ZGRmM2UyYjQ5YTViMjU4ZGRkYzBiOTI0NTI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmNmRlOWRjODdlYTRiM2M4ZDkyNDgxYWYzZjQ4MjhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2M2I0N2EzODFiNDQzYzRhNWY3NzVhZGM1YjkzYmZlID0gJCgnPGRpdiBpZD0iaHRtbF82NjNiNDdhMzgxYjQ0M2M0YTVmNzc1YWRjNWI5M2JmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y2ZGU5ZGM4N2VhNGIzYzhkOTI0ODFhZjNmNDgyOGMuc2V0Q29udGVudChodG1sXzY2M2I0N2EzODFiNDQzYzRhNWY3NzVhZGM1YjkzYmZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyYTA2ZGRmM2UyYjQ5YTViMjU4ZGRkYzBiOTI0NTI0LmJpbmRQb3B1cChwb3B1cF9jZjZkZTlkYzg3ZWE0YjNjOGQ5MjQ4MWFmM2Y0ODI4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTdmMTQyMmE0M2U0NDExOWQ5OTFkOTI2ODljNTRiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjEzZGY2NTNjNTY0Y2UyODE5ZTAxZjIxNWJmYTkxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOWQ2ODQ5YzBiZTY0YWI4YmZhODI2ZDNkNzNkMGI1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjlkNjg0OWMwYmU2NGFiOGJmYTgyNmQzZDczZDBiNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2MTNkZjY1M2M1NjRjZTI4MTllMDFmMjE1YmZhOTFmLnNldENvbnRlbnQoaHRtbF9iOWQ2ODQ5YzBiZTY0YWI4YmZhODI2ZDNkNzNkMGI1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NTdmMTQyMmE0M2U0NDExOWQ5OTFkOTI2ODljNTRiMC5iaW5kUG9wdXAocG9wdXBfOTYxM2RmNjUzYzU2NGNlMjgxOWUwMWYyMTViZmE5MWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRkNjMzOTJkMzY2NGQ3Nzg1YWNkMWU1ZTgxZjYxZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTgzMmVmNjdmMTMwNDdjNzhlOWEwNGJiMzI1OGFmZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODVhYWU1MjU1YzcwNDVhZWIyMjE3MDUyNDNlZjAyMmUgPSAkKCc8ZGl2IGlkPSJodG1sXzg1YWFlNTI1NWM3MDQ1YWViMjIxNzA1MjQzZWYwMjJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTgzMmVmNjdmMTMwNDdjNzhlOWEwNGJiMzI1OGFmZjIuc2V0Q29udGVudChodG1sXzg1YWFlNTI1NWM3MDQ1YWViMjIxNzA1MjQzZWYwMjJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkZDYzMzkyZDM2NjRkNzc4NWFjZDFlNWU4MWY2MWVlLmJpbmRQb3B1cChwb3B1cF81ODMyZWY2N2YxMzA0N2M3OGU5YTA0YmIzMjU4YWZmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MzQ1NTdhODU3M2Y0OWU3YmFkMTgyZjJkYmJmMmVlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzlhOGE1ZjRhZDA3NGZiZmIyZWRjNGQ3OTIwMjQ3M2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE2ZGQyZDNmOTE3NGZiYmFhZTI1OWM3NThmOTMzZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzYxNmRkMmQzZjkxNzRmYmJhYWUyNTljNzU4ZjkzM2Y5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzlhOGE1ZjRhZDA3NGZiZmIyZWRjNGQ3OTIwMjQ3M2Yuc2V0Q29udGVudChodG1sXzYxNmRkMmQzZjkxNzRmYmJhYWUyNTljNzU4ZjkzM2Y5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzNDU1N2E4NTczZjQ5ZTdiYWQxODJmMmRiYmYyZWU5LmJpbmRQb3B1cChwb3B1cF9jOWE4YTVmNGFkMDc0ZmJmYjJlZGM0ZDc5MjAyNDczZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NmJjMThkY2FmOWQ0ZDk5OGM5OTlmMThjYzIwOGUyNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNWFmZWZlMDI3NjA0ZTc1OTc5NmRlMzc5NTQ1NTNjNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODBlNmFjMzlmNmY0YzZmOGQ1NDI0NmY4MjVhNGRjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzgwZTZhYzM5ZjZmNGM2ZjhkNTQyNDZmODI1YTRkYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNWFmZWZlMDI3NjA0ZTc1OTc5NmRlMzc5NTQ1NTNjNS5zZXRDb250ZW50KGh0bWxfNzgwZTZhYzM5ZjZmNGM2ZjhkNTQyNDZmODI1YTRkYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjZiYzE4ZGNhZjlkNGQ5OThjOTk5ZjE4Y2MyMDhlMjcuYmluZFBvcHVwKHBvcHVwXzE1YWZlZmUwMjc2MDRlNzU5Nzk2ZGUzNzk1NDU1M2M1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiZTU1ZGNiZGVlMzQxNjc5NzU2MzM5MGQ0NWNjNzI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmYTJhYzlhNzZhODQxYmZiOTAwZjdlZmU1ODZiMzgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YzY0ODQ3YTQyMzRlOGRiZTNlMDNkMjFlOTRjNDVmID0gJCgnPGRpdiBpZD0iaHRtbF8yNmM2NDg0N2E0MjM0ZThkYmUzZTAzZDIxZTk0YzQ1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZmEyYWM5YTc2YTg0MWJmYjkwMGY3ZWZlNTg2YjM4Mi5zZXRDb250ZW50KGh0bWxfMjZjNjQ4NDdhNDIzNGU4ZGJlM2UwM2QyMWU5NGM0NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmJlNTVkY2JkZWUzNDE2Nzk3NTYzMzkwZDQ1Y2M3MjguYmluZFBvcHVwKHBvcHVwXzBmYTJhYzlhNzZhODQxYmZiOTAwZjdlZmU1ODZiMzgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwMGZiYjllOTBmYzQ4ZWI5MjU0MzhmZTk0MGYyNzllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZDZjYWRjMGYzNTM0NWEyYWViNmY5YzhiMDA3NTk4ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzIyNTU1YzkyMGY0ZGViYjU3NzljNjhiNjY2YWE1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjMyMjU1NWM5MjBmNGRlYmI1Nzc5YzY4YjY2NmFhNWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDZjYWRjMGYzNTM0NWEyYWViNmY5YzhiMDA3NTk4Zi5zZXRDb250ZW50KGh0bWxfYjMyMjU1NWM5MjBmNGRlYmI1Nzc5YzY4YjY2NmFhNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzAwZmJiOWU5MGZjNDhlYjkyNTQzOGZlOTQwZjI3OWUuYmluZFBvcHVwKHBvcHVwXzdkNmNhZGMwZjM1MzQ1YTJhZWI2ZjljOGIwMDc1OThmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlY2E1OTVhZmVkZDRmYmRiYTU3MzJhM2ZmMmJiMTU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzN2U0MDg2ODNlZjQ3ZWQ4YmM2MWFlNDIyODFkNGZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1MzZkMjFjZjY1YTQ0MTliZWVkOTRmNzY3ZDIyMTUyID0gJCgnPGRpdiBpZD0iaHRtbF9hNTM2ZDIxY2Y2NWE0NDE5YmVlZDk0Zjc2N2QyMjE1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzN2U0MDg2ODNlZjQ3ZWQ4YmM2MWFlNDIyODFkNGZhLnNldENvbnRlbnQoaHRtbF9hNTM2ZDIxY2Y2NWE0NDE5YmVlZDk0Zjc2N2QyMjE1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZWNhNTk1YWZlZGQ0ZmJkYmE1NzMyYTNmZjJiYjE1Ny5iaW5kUG9wdXAocG9wdXBfMTM3ZTQwODY4M2VmNDdlZDhiYzYxYWU0MjI4MWQ0ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ZiMGI0N2NjNDBiNDBiYjlkNWEzYzNlYTlhNjk5ODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhhYzdiZGFkNDkwNDhlODgxYTUwYjZkMzM2MzBiNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZmMGZlN2U4M2YxNDUzYmJhNjJhYzdiNmE3NTVkMTYgPSAkKCc8ZGl2IGlkPSJodG1sX2FmZjBmZTdlODNmMTQ1M2JiYTYyYWM3YjZhNzU1ZDE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhhYzdiZGFkNDkwNDhlODgxYTUwYjZkMzM2MzBiNGEuc2V0Q29udGVudChodG1sX2FmZjBmZTdlODNmMTQ1M2JiYTYyYWM3YjZhNzU1ZDE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmYjBiNDdjYzQwYjQwYmI5ZDVhM2MzZWE5YTY5OTgxLmJpbmRQb3B1cChwb3B1cF84OGFjN2JkYWQ0OTA0OGU4ODFhNTBiNmQzMzYzMGI0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNWI1NjNmMGFjOGU0OTQ0OWZlZmUyNWJiN2JiNTQzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzIzZjhlYzM2YzE0Y2YxYmEzNmM3YmFlNzYwZjY4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NWRjMmZiZDBmY2E0YjRkOTUxMDhkZjI4NDFkZDNiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjVkYzJmYmQwZmNhNGI0ZDk1MTA4ZGYyODQxZGQzYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzIzZjhlYzM2YzE0Y2YxYmEzNmM3YmFlNzYwZjY4OS5zZXRDb250ZW50KGh0bWxfNjVkYzJmYmQwZmNhNGI0ZDk1MTA4ZGYyODQxZGQzYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTViNTYzZjBhYzhlNDk0NDlmZWZlMjViYjdiYjU0M2MuYmluZFBvcHVwKHBvcHVwXzczMjNmOGVjMzZjMTRjZjFiYTM2YzdiYWU3NjBmNjg5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmNDBmMTc3NjM3ZDQyMTNhMjdlZGYyZGRiODYzZGYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiMDFhN2QzN2Q3NTRlNmZiMmQ3MzAxNTJiMzc2MTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjOGM3NTRhZTQyZjRmZjE5ZTk5ZWYyMTk5MmU1YjkyID0gJCgnPGRpdiBpZD0iaHRtbF81YzhjNzU0YWU0MmY0ZmYxOWU5OWVmMjE5OTJlNWI5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiMDFhN2QzN2Q3NTRlNmZiMmQ3MzAxNTJiMzc2MTU4LnNldENvbnRlbnQoaHRtbF81YzhjNzU0YWU0MmY0ZmYxOWU5OWVmMjE5OTJlNWI5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZjQwZjE3NzYzN2Q0MjEzYTI3ZWRmMmRkYjg2M2RmMC5iaW5kUG9wdXAocG9wdXBfY2IwMWE3ZDM3ZDc1NGU2ZmIyZDczMDE1MmIzNzYxNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTQzZWExOTBiOTcwNGRiNTg0OGVjMTM3ZmVlMDIwN2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTc4NjU4MTMzN2I2NDkxODkzNDM0NDg5YjliNjQyNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U5ZDM4NmMxNWVkNDVjZDk2NDZjMGVjNTQ1OWI3ZDcgPSAkKCc8ZGl2IGlkPSJodG1sXzNlOWQzODZjMTVlZDQ1Y2Q5NjQ2YzBlYzU0NTliN2Q3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTc4NjU4MTMzN2I2NDkxODkzNDM0NDg5YjliNjQyNTQuc2V0Q29udGVudChodG1sXzNlOWQzODZjMTVlZDQ1Y2Q5NjQ2YzBlYzU0NTliN2Q3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0M2VhMTkwYjk3MDRkYjU4NDhlYzEzN2ZlZTAyMDdkLmJpbmRQb3B1cChwb3B1cF8xNzg2NTgxMzM3YjY0OTE4OTM0MzQ0ODliOWI2NDI1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iY2YyZDIxZGIwNjc0ZTdmYWI3MDEyMDBlM2VmNTViNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWFkYmJlYTA5ZDA0OTFlYWE4MjJhOGQwNmMzMWJjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTBjZDI1NjY4YzM0YzlkYmYxMmY2NDY4ZjhiNTc5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTEwY2QyNTY2OGMzNGM5ZGJmMTJmNjQ2OGY4YjU3OTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZWFkYmJlYTA5ZDA0OTFlYWE4MjJhOGQwNmMzMWJjNy5zZXRDb250ZW50KGh0bWxfZTEwY2QyNTY2OGMzNGM5ZGJmMTJmNjQ2OGY4YjU3OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmNmMmQyMWRiMDY3NGU3ZmFiNzAxMjAwZTNlZjU1YjcuYmluZFBvcHVwKHBvcHVwXzllYWRiYmVhMDlkMDQ5MWVhYTgyMmE4ZDA2YzMxYmM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlN2U5ODFhYTA4ZDRhMWRiZTMzMDAzNzg2MmJhZjllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YThlNzBjMTFkZGQ0ZWM4OTU0MWU4YjBkMGRmNGY4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YTI5Yjg0ZWU2MDQ0MzRhOTdhMjA5ZGUzYjIwMjRmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmEyOWI4NGVlNjA0NDM0YTk3YTIwOWRlM2IyMDI0ZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWE4ZTcwYzExZGRkNGVjODk1NDFlOGIwZDBkZjRmODguc2V0Q29udGVudChodG1sXzZhMjliODRlZTYwNDQzNGE5N2EyMDlkZTNiMjAyNGZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNlN2U5ODFhYTA4ZDRhMWRiZTMzMDAzNzg2MmJhZjllLmJpbmRQb3B1cChwb3B1cF85YThlNzBjMTFkZGQ0ZWM4OTU0MWU4YjBkMGRmNGY4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTJmNjBlYjQ4YTA0ZTliYjhkMGY4ZmM3NWFlZmZjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGI3YzY1M2JkZWYwNGM1Yzg5OTA3Y2U0NDczOGNiZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWRiOTBiOTJiMWZiNGFhMDg5Yjk3ZjBlYTBjODlmMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzVkYjkwYjkyYjFmYjRhYTA4OWI5N2YwZWEwYzg5ZjFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjdjNjUzYmRlZjA0YzVjODk5MDdjZTQ0NzM4Y2JkYi5zZXRDb250ZW50KGh0bWxfNWRiOTBiOTJiMWZiNGFhMDg5Yjk3ZjBlYTBjODlmMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjEyZjYwZWI0OGEwNGU5YmI4ZDBmOGZjNzVhZWZmYzAuYmluZFBvcHVwKHBvcHVwXzRiN2M2NTNiZGVmMDRjNWM4OTkwN2NlNDQ3MzhjYmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiOGM2ODg5OGJhZDQ5ZjU4YWJkNWIzNzY5N2FiNGZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjMmY4YzQ1ODkzYTQ4OTdhZDY3NGQ0MmM3NDAxZDU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjNzA5MTJlY2U4YTQ5ZGRiMWM1ZDhlMzRmZWQ0ODEzID0gJCgnPGRpdiBpZD0iaHRtbF9iYzcwOTEyZWNlOGE0OWRkYjFjNWQ4ZTM0ZmVkNDgxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWMyZjhjNDU4OTNhNDg5N2FkNjc0ZDQyYzc0MDFkNTguc2V0Q29udGVudChodG1sX2JjNzA5MTJlY2U4YTQ5ZGRiMWM1ZDhlMzRmZWQ0ODEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiOGM2ODg5OGJhZDQ5ZjU4YWJkNWIzNzY5N2FiNGZjLmJpbmRQb3B1cChwb3B1cF9hYzJmOGM0NTg5M2E0ODk3YWQ2NzRkNDJjNzQwMWQ1OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZmE3YjcwYTk2M2Y0MjVkYmNhMjNkYmMwODdjODMxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjAzYzExOGY2YzI0MjY0OTJlZWU0NzJhZjcyMGMyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NjAxZThhYWM4NmQ0MmYwODFlODk2OWU3NjcyODg0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTYwMWU4YWFjODZkNDJmMDgxZTg5NjllNzY3Mjg4NDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyMDNjMTE4ZjZjMjQyNjQ5MmVlZTQ3MmFmNzIwYzI2LnNldENvbnRlbnQoaHRtbF81NjAxZThhYWM4NmQ0MmYwODFlODk2OWU3NjcyODg0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZmE3YjcwYTk2M2Y0MjVkYmNhMjNkYmMwODdjODMxMy5iaW5kUG9wdXAocG9wdXBfMjIwM2MxMThmNmMyNDI2NDkyZWVlNDcyYWY3MjBjMjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODg0ZTZjZGNkNDVmNGQ3ZjkzM2Y5NTJkMTJlYjlmNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliOWNkODE2MDcyOTQxNDg4Mzk4M2ZmYTk0NGE1MjcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiMjAzNWZkNDcwYzRjNGE4OTZjMDQ4NTYyMTkzMGJlID0gJCgnPGRpdiBpZD0iaHRtbF9hYjIwMzVmZDQ3MGM0YzRhODk2YzA0ODU2MjE5MzBiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliOWNkODE2MDcyOTQxNDg4Mzk4M2ZmYTk0NGE1MjcyLnNldENvbnRlbnQoaHRtbF9hYjIwMzVmZDQ3MGM0YzRhODk2YzA0ODU2MjE5MzBiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ODRlNmNkY2Q0NWY0ZDdmOTMzZjk1MmQxMmViOWY1Ny5iaW5kUG9wdXAocG9wdXBfOWI5Y2Q4MTYwNzI5NDE0ODgzOTgzZmZhOTQ0YTUyNzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQ2MjEwODkwODExNDM4OTkzY2YwZTA2ZTU0NTY5NGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkYWEwOTc1ODNkNDRlNGZiYWI5ZDAzZDIzMTk2NDk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3MDg0NjhhZmFiZjQ2ZjY4ZTM2ZDI5NjllMjU5YTkxID0gJCgnPGRpdiBpZD0iaHRtbF8xNzA4NDY4YWZhYmY0NmY2OGUzNmQyOTY5ZTI1OWE5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkYWEwOTc1ODNkNDRlNGZiYWI5ZDAzZDIzMTk2NDk5LnNldENvbnRlbnQoaHRtbF8xNzA4NDY4YWZhYmY0NmY2OGUzNmQyOTY5ZTI1OWE5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZDYyMTA4OTA4MTE0Mzg5OTNjZjBlMDZlNTQ1Njk0ZS5iaW5kUG9wdXAocG9wdXBfZWRhYTA5NzU4M2Q0NGU0ZmJhYjlkMDNkMjMxOTY0OTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTVhNmVhMmZkNzI1NGE4YmJiMjNhMzFmNTNiYTMwODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjc1YzU0YjBkZTM0ZjQ3OTYzNjhmNjg1ODg1OGZjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTZjYTJlYmQxYzI0NjFjYWU5ZGY0MGU4OWYyZmE1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWU2Y2EyZWJkMWMyNDYxY2FlOWRmNDBlODlmMmZhNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTI3NWM1NGIwZGUzNGY0Nzk2MzY4ZjY4NTg4NThmY2Iuc2V0Q29udGVudChodG1sXzVlNmNhMmViZDFjMjQ2MWNhZTlkZjQwZTg5ZjJmYTUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1YTZlYTJmZDcyNTRhOGJiYjIzYTMxZjUzYmEzMDgzLmJpbmRQb3B1cChwb3B1cF9hMjc1YzU0YjBkZTM0ZjQ3OTYzNjhmNjg1ODg1OGZjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMmM2NmFkZWU2OWI0MDkxYTQxYTIzMTExNDE2ZjdiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZDAxNzU2ZDIxMzE0MDczODhlZGZlZDkxZDNjMzg1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzExYWJlNzdjZDQ0NmY2ODQ3MTAxYmVjNTZhY2YyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzcxMWFiZTc3Y2Q0NDZmNjg0NzEwMWJlYzU2YWNmMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQwMTc1NmQyMTMxNDA3Mzg4ZWRmZWQ5MWQzYzM4NTIuc2V0Q29udGVudChodG1sXzM3MTFhYmU3N2NkNDQ2ZjY4NDcxMDFiZWM1NmFjZjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyYzY2YWRlZTY5YjQwOTFhNDFhMjMxMTE0MTZmN2IxLmJpbmRQb3B1cChwb3B1cF9lZDAxNzU2ZDIxMzE0MDczODhlZGZlZDkxZDNjMzg1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzZiY2ExYmZiYzk0MWQzODQ4ZDBlYThmYzk2MTMzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzQyNTVkMjE3ZTVkNDdjYmEzY2ViYjM3YTc4ZDUwODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTMxNWViYjVmMDBlNGQyNTkwNTViNDc1YjY0MDYyMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2EzMTVlYmI1ZjAwZTRkMjU5MDU1YjQ3NWI2NDA2MjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzQyNTVkMjE3ZTVkNDdjYmEzY2ViYjM3YTc4ZDUwODguc2V0Q29udGVudChodG1sX2EzMTVlYmI1ZjAwZTRkMjU5MDU1YjQ3NWI2NDA2MjM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NmJjYTFiZmJjOTQxZDM4NDhkMGVhOGZjOTYxMzM0LmJpbmRQb3B1cChwb3B1cF8zNDI1NWQyMTdlNWQ0N2NiYTNjZWJiMzdhNzhkNTA4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmMzZWFiZTUxZmM0NDU0YTBjYTU4MGRlN2U5YzY4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzcyZjkyMmMwZDI0ODc0OTgxOWQ3Y2MxNmY4NDY5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZjgzNWU2MTA1YzY0YmQxOWU5MThlNzE3MjYyNGQ5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWY4MzVlNjEwNWM2NGJkMTllOTE4ZTcxNzI2MjRkOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3NzJmOTIyYzBkMjQ4NzQ5ODE5ZDdjYzE2Zjg0NjlhLnNldENvbnRlbnQoaHRtbF9hZjgzNWU2MTA1YzY0YmQxOWU5MThlNzE3MjYyNGQ5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmMzZWFiZTUxZmM0NDU0YTBjYTU4MGRlN2U5YzY4YS5iaW5kUG9wdXAocG9wdXBfMzc3MmY5MjJjMGQyNDg3NDk4MTlkN2NjMTZmODQ2OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzI4MmZmMDExNTg5NDFhOTg3YThmYWNhMzg1MzExNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2VmYTA1Yzk1ODJhNDQ3NTgwMjhhOThhNzY4MmQzZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjhlYjUyYmFkNGRhNDFjNDhkNGE5ZjBmYjViMDY3NTQgPSAkKCc8ZGl2IGlkPSJodG1sX2I4ZWI1MmJhZDRkYTQxYzQ4ZDRhOWYwZmI1YjA2NzU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlZmEwNWM5NTgyYTQ0NzU4MDI4YTk4YTc2ODJkM2RjLnNldENvbnRlbnQoaHRtbF9iOGViNTJiYWQ0ZGE0MWM0OGQ0YTlmMGZiNWIwNjc1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjgyZmYwMTE1ODk0MWE5ODdhOGZhY2EzODUzMTE1Zi5iaW5kUG9wdXAocG9wdXBfY2VmYTA1Yzk1ODJhNDQ3NTgwMjhhOThhNzY4MmQzZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2M2ZTliOTI1YjEzNDYyNDgzNTFhOTBlZDc5MmJjNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ5Y2NlYmQzOGQ1NDBkMDg0ZTZlYzU2ZGRkMThmOTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzRiYWExMWYzNWVkNDcwYmEwOWMxNjY5NTgzOTdhNzAgPSAkKCc8ZGl2IGlkPSJodG1sXzM0YmFhMTFmMzVlZDQ3MGJhMDljMTY2OTU4Mzk3YTcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0OWNjZWJkMzhkNTQwZDA4NGU2ZWM1NmRkZDE4ZjkzLnNldENvbnRlbnQoaHRtbF8zNGJhYTExZjM1ZWQ0NzBiYTA5YzE2Njk1ODM5N2E3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYzZlOWI5MjViMTM0NjI0ODM1MWE5MGVkNzkyYmM3NC5iaW5kUG9wdXAocG9wdXBfZTQ5Y2NlYmQzOGQ1NDBkMDg0ZTZlYzU2ZGRkMThmOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQzNDVhYjRiOGU4NGU1MjhmYzY2NjQxZWZjZjliMWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhM2FhNjE5YmYzMjRhMmE4YzQ4OWZmNmYxN2FlOWM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0MWU0N2FjY2JmYTQ2Mzk5NTY0OWEzOGRhZTAxMGU2ID0gJCgnPGRpdiBpZD0iaHRtbF9mNDFlNDdhY2NiZmE0NjM5OTU2NDlhMzhkYWUwMTBlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmEzYWE2MTliZjMyNGEyYThjNDg5ZmY2ZjE3YWU5Yzcuc2V0Q29udGVudChodG1sX2Y0MWU0N2FjY2JmYTQ2Mzk5NTY0OWEzOGRhZTAxMGU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc0MzQ1YWI0YjhlODRlNTI4ZmM2NjY0MWVmY2Y5YjFjLmJpbmRQb3B1cChwb3B1cF82YTNhYTYxOWJmMzI0YTJhOGM0ODlmZjZmMTdhZTljNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YWFiNDMwYjRhOTY0Y2QxODQwMzgzZDVkYThhMTJlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODI3YTYxMWVmYTU0NDA3MThlM2MxZDdiYjcwMDc3M2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTEzNGY1NTEwMTI3NDE0NTkzNzZlZTAzNTIwNTI1NTAgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMzRmNTUxMDEyNzQxNDU5Mzc2ZWUwMzUyMDUyNTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyN2E2MTFlZmE1NDQwNzE4ZTNjMWQ3YmI3MDA3NzNhLnNldENvbnRlbnQoaHRtbF9hMTM0ZjU1MTAxMjc0MTQ1OTM3NmVlMDM1MjA1MjU1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YWFiNDMwYjRhOTY0Y2QxODQwMzgzZDVkYThhMTJlOC5iaW5kUG9wdXAocG9wdXBfODI3YTYxMWVmYTU0NDA3MThlM2MxZDdiYjcwMDc3M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGIzM2FhOTg1MzQ0NGQzNTliMjIyYWUzODdiN2ZkZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzUxNmUzNTIyZGU5NDdkZTk2NDgyZDc5ZDg3YTZlZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJjYzBiNjRiMzQxNDQzM2EyNTNlODNmZDA2MGNhNmYgPSAkKCc8ZGl2IGlkPSJodG1sXzJiY2MwYjY0YjM0MTQ0MzNhMjUzZTgzZmQwNjBjYTZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTE2ZTM1MjJkZTk0N2RlOTY0ODJkNzlkODdhNmVmYy5zZXRDb250ZW50KGh0bWxfMmJjYzBiNjRiMzQxNDQzM2EyNTNlODNmZDA2MGNhNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGIzM2FhOTg1MzQ0NGQzNTliMjIyYWUzODdiN2ZkZGYuYmluZFBvcHVwKHBvcHVwX2M1MTZlMzUyMmRlOTQ3ZGU5NjQ4MmQ3OWQ4N2E2ZWZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4ZjhmNjk4NzRiZDQyODA4YWQ3MjBkN2QwMDg2YjQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NWM5Nzk3YmE3Nzg0MzQ2YjUzNGIyZTE2NzE2MzIzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOTM1YWQ2YjNiODY0Njk5YjNkMWRhZDM3Zjc0N2MzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDkzNWFkNmIzYjg2NDY5OWIzZDFkYWQzN2Y3NDdjMzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWM5Nzk3YmE3Nzg0MzQ2YjUzNGIyZTE2NzE2MzIzNC5zZXRDb250ZW50KGh0bWxfMDkzNWFkNmIzYjg2NDY5OWIzZDFkYWQzN2Y3NDdjMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjhmOGY2OTg3NGJkNDI4MDhhZDcyMGQ3ZDAwODZiNDkuYmluZFBvcHVwKHBvcHVwXzc1Yzk3OTdiYTc3ODQzNDZiNTM0YjJlMTY3MTYzMjM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjNDFmMWZiM2QxMDQ0YzU4NDQ4ZDYxOGU0MzlkM2Y5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwZDc0NDY5MDQxZTQ4NzU4NzI0NDE2NDc4NDlhZGEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4MzRhZDMwNWRiZDQ1ZjViYzAyMWI5ZDllNTJkMGE2ID0gJCgnPGRpdiBpZD0iaHRtbF81ODM0YWQzMDVkYmQ0NWY1YmMwMjFiOWQ5ZTUyZDBhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwZDc0NDY5MDQxZTQ4NzU4NzI0NDE2NDc4NDlhZGEyLnNldENvbnRlbnQoaHRtbF81ODM0YWQzMDVkYmQ0NWY1YmMwMjFiOWQ5ZTUyZDBhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYzQxZjFmYjNkMTA0NGM1ODQ0OGQ2MThlNDM5ZDNmOS5iaW5kUG9wdXAocG9wdXBfZDBkNzQ0NjkwNDFlNDg3NTg3MjQ0MTY0Nzg0OWFkYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmNkMTYxMzY2MjQ1NDY0MWEyZGJjYTQ1ZjZmYTNkNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyMDhmYmM0OGQ3NTQ5ZWRiY2UzZDgxYzNiMTVjOTA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5MzU0ZjhhYjNmZTQ5N2JiYmU0MWVhZmRlMTY3ODJhID0gJCgnPGRpdiBpZD0iaHRtbF9mOTM1NGY4YWIzZmU0OTdiYmJlNDFlYWZkZTE2NzgyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjA4ZmJjNDhkNzU0OWVkYmNlM2Q4MWMzYjE1YzkwNS5zZXRDb250ZW50KGh0bWxfZjkzNTRmOGFiM2ZlNDk3YmJiZTQxZWFmZGUxNjc4MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmNkMTYxMzY2MjQ1NDY0MWEyZGJjYTQ1ZjZmYTNkNDUuYmluZFBvcHVwKHBvcHVwX2MyMDhmYmM0OGQ3NTQ5ZWRiY2UzZDgxYzNiMTVjOTA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4NTA0NzIxMzE0NzQxOWJiNWZjZjBmZDUzZDkyMWQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4MWU2YmVhZmY2OTQ3ZjJhMjhhM2U3MzljZTM3NTZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlNWU2YzdlNjhjOTQ5M2U4ZjNkYTliODJiZjRiNmM4ID0gJCgnPGRpdiBpZD0iaHRtbF81ZTVlNmM3ZTY4Yzk0OTNlOGYzZGE5YjgyYmY0YjZjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4MWU2YmVhZmY2OTQ3ZjJhMjhhM2U3MzljZTM3NTZiLnNldENvbnRlbnQoaHRtbF81ZTVlNmM3ZTY4Yzk0OTNlOGYzZGE5YjgyYmY0YjZjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ODUwNDcyMTMxNDc0MTliYjVmY2YwZmQ1M2Q5MjFkMS5iaW5kUG9wdXAocG9wdXBfNTgxZTZiZWFmZjY5NDdmMmEyOGEzZTczOWNlMzc1NmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTc4NjI4NjBjYTNlNDg2NDg4NWQxYmQ5MWI0NGRlNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFmZWRlZmE1NTFkNDQ1M2FmYjk0NTRlZjczMjg0MjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWM1MTNmMGZjOWE5NDFkNjhiZDhkZGUyMzkwMzcxNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzljNTEzZjBmYzlhOTQxZDY4YmQ4ZGRlMjM5MDM3MTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhZmVkZWZhNTUxZDQ0NTNhZmI5NDU0ZWY3MzI4NDI4LnNldENvbnRlbnQoaHRtbF85YzUxM2YwZmM5YTk0MWQ2OGJkOGRkZTIzOTAzNzE1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNzg2Mjg2MGNhM2U0ODY0ODg1ZDFiZDkxYjQ0ZGU2Yy5iaW5kUG9wdXAocG9wdXBfNWFmZWRlZmE1NTFkNDQ1M2FmYjk0NTRlZjczMjg0MjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk3ZmFhYjI4MWFkNGRjZGEyNzg3NGZhOGE0OGMxNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI1MDFkMzAzYTY4NDIwYzg4NzE5NTNjNjg1MmQzYTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTg1MGJiYTMzMjExNGExMTk2MjhjZDY1MWE3YTczMDAgPSAkKCc8ZGl2IGlkPSJodG1sXzU4NTBiYmEzMzIxMTRhMTE5NjI4Y2Q2NTFhN2E3MzAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTI1MDFkMzAzYTY4NDIwYzg4NzE5NTNjNjg1MmQzYTkuc2V0Q29udGVudChodG1sXzU4NTBiYmEzMzIxMTRhMTE5NjI4Y2Q2NTFhN2E3MzAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5N2ZhYWIyODFhZDRkY2RhMjc4NzRmYThhNDhjMTZhLmJpbmRQb3B1cChwb3B1cF85MjUwMWQzMDNhNjg0MjBjODg3MTk1M2M2ODUyZDNhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YjE0NjRjNTFlYzc0OTg0ODhhN2VjZmM0MzRlN2M2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRiNmMyMjRlODVkNGE0YTg1Zjc3OGY2NTI3NTUwMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTYyM2IxZDE3ZGIwNDQ3ZmE5NjZiNWZhNjE2NGI2ZDUgPSAkKCc8ZGl2IGlkPSJodG1sX2U2MjNiMWQxN2RiMDQ0N2ZhOTY2YjVmYTYxNjRiNmQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkYjZjMjI0ZTg1ZDRhNGE4NWY3NzhmNjUyNzU1MDBmLnNldENvbnRlbnQoaHRtbF9lNjIzYjFkMTdkYjA0NDdmYTk2NmI1ZmE2MTY0YjZkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YjE0NjRjNTFlYzc0OTg0ODhhN2VjZmM0MzRlN2M2YS5iaW5kUG9wdXAocG9wdXBfNmRiNmMyMjRlODVkNGE0YTg1Zjc3OGY2NTI3NTUwMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjM3N2ZjNzYxMTY5NGNiN2FhNTA4ZTE2MGE0MjljNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwZDFmMzgwMDIyMTQwNjhiMTAwM2RlYzQyZGYyNDNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhN2VkOTk4NzQ4YjRhYTM4MmQ3M2I5NTRiY2Q4NGY1ID0gJCgnPGRpdiBpZD0iaHRtbF9kYTdlZDk5ODc0OGI0YWEzODJkNzNiOTU0YmNkODRmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMGQxZjM4MDAyMjE0MDY4YjEwMDNkZWM0MmRmMjQzZC5zZXRDb250ZW50KGh0bWxfZGE3ZWQ5OTg3NDhiNGFhMzgyZDczYjk1NGJjZDg0ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjM3N2ZjNzYxMTY5NGNiN2FhNTA4ZTE2MGE0MjljNzQuYmluZFBvcHVwKHBvcHVwX2MwZDFmMzgwMDIyMTQwNjhiMTAwM2RlYzQyZGYyNDNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhMzNjZjlhMzE0YjQyYWRhN2RiODA0ZWZjZDllOWQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOWZjMWRhY2RlZmQ0YjU3OTA5NzZjODI2OGQ3YjhmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZjQ0ZTM1NmM0MGQ0MzY3OGYwNWVjM2FiNGY5MWQ4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmY0NGUzNTZjNDBkNDM2NzhmMDVlYzNhYjRmOTFkODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5ZmMxZGFjZGVmZDRiNTc5MDk3NmM4MjY4ZDdiOGY1LnNldENvbnRlbnQoaHRtbF82ZjQ0ZTM1NmM0MGQ0MzY3OGYwNWVjM2FiNGY5MWQ4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTMzY2Y5YTMxNGI0MmFkYTdkYjgwNGVmY2Q5ZTlkNS5iaW5kUG9wdXAocG9wdXBfMjlmYzFkYWNkZWZkNGI1NzkwOTc2YzgyNjhkN2I4ZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGRkMmYzNjQxNTIwNGQ1MWFmMTEzNjczZDgxMzU5NjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDA0N2IzY2NkM2ExNDcxYWFiOWYyNTYyODMxOWEzOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQzY2I1NzMwYTNmNDA5M2JmNGU3Y2E1ODlmMDM1MGMgPSAkKCc8ZGl2IGlkPSJodG1sXzM0M2NiNTczMGEzZjQwOTNiZjRlN2NhNTg5ZjAzNTBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDQ3YjNjY2QzYTE0NzFhYWI5ZjI1NjI4MzE5YTM4YS5zZXRDb250ZW50KGh0bWxfMzQzY2I1NzMwYTNmNDA5M2JmNGU3Y2E1ODlmMDM1MGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGRkMmYzNjQxNTIwNGQ1MWFmMTEzNjczZDgxMzU5NjAuYmluZFBvcHVwKHBvcHVwXzQwNDdiM2NjZDNhMTQ3MWFhYjlmMjU2MjgzMTlhMzhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjOWU5ZDVhYzAzYTQ4NWM5ZDU0MGUxNjUyMGU0NWM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmM1NjllMjkyYzIxNDZjNjk4Y2Q4ODZkYWRiMzg5ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2MyMWE0YWEyNTcwNDQ2OTk4YWJlOGU0ZDAxMzMxNDcgPSAkKCc8ZGl2IGlkPSJodG1sXzNjMjFhNGFhMjU3MDQ0Njk5OGFiZThlNGQwMTMzMTQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmM1NjllMjkyYzIxNDZjNjk4Y2Q4ODZkYWRiMzg5ZDMuc2V0Q29udGVudChodG1sXzNjMjFhNGFhMjU3MDQ0Njk5OGFiZThlNGQwMTMzMTQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJjOWU5ZDVhYzAzYTQ4NWM5ZDU0MGUxNjUyMGU0NWM2LmJpbmRQb3B1cChwb3B1cF8yYzU2OWUyOTJjMjE0NmM2OThjZDg4NmRhZGIzODlkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNTkyNDZlMmZjMGQ0MjVmODdlMmZhMTEyNjdiMzVjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTAzOTgzOWVmMmM0OWU3ODVhZmRlOWExZDRmZmE1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Y2U1YWUzZWYxYTY0ZTg3YmM5Y2M4NzU2OTRiMTk4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWNlNWFlM2VmMWE2NGU4N2JjOWNjODc1Njk0YjE5ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTUwMzk4MzllZjJjNDllNzg1YWZkZTlhMWQ0ZmZhNTkuc2V0Q29udGVudChodG1sXzljZTVhZTNlZjFhNjRlODdiYzljYzg3NTY5NGIxOTg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1OTI0NmUyZmMwZDQyNWY4N2UyZmExMTI2N2IzNWNiLmJpbmRQb3B1cChwb3B1cF9lNTAzOTgzOWVmMmM0OWU3ODVhZmRlOWExZDRmZmE1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmRkNzljYjc5YjA0NGU1OWQ3OTg0Zjg4MjU4ZmQ1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjgwMzA0Mzk3OWU0NzljOTkxYzViMWZiYzg1YTQxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZmMwMzhkYjZmMmE0YzM0YjRjY2Q0MWJjMDk4YjE1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGZjMDM4ZGI2ZjJhNGMzNGI0Y2NkNDFiYzA5OGIxNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyODAzMDQzOTc5ZTQ3OWM5OTFjNWIxZmJjODVhNDE4LnNldENvbnRlbnQoaHRtbF8wZmMwMzhkYjZmMmE0YzM0YjRjY2Q0MWJjMDk4YjE1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmRkNzljYjc5YjA0NGU1OWQ3OTg0Zjg4MjU4ZmQ1ZC5iaW5kUG9wdXAocG9wdXBfMzI4MDMwNDM5NzllNDc5Yzk5MWM1YjFmYmM4NWE0MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRhMjVhMTY5ZGFlNGJkYjgzZjNiNDJhYjVkZjZjOGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQ4YTMzYWQxYmM5NDU2OWE4Y2FmZTIyOTM1ODVjZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTk4MmJkZmY0YWQ0NDljMGEzYTliNmZkYmIyMDNmMzMgPSAkKCc8ZGl2IGlkPSJodG1sX2U5ODJiZGZmNGFkNDQ5YzBhM2E5YjZmZGJiMjAzZjMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWQ4YTMzYWQxYmM5NDU2OWE4Y2FmZTIyOTM1ODVjZGQuc2V0Q29udGVudChodG1sX2U5ODJiZGZmNGFkNDQ5YzBhM2E5YjZmZGJiMjAzZjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0YTI1YTE2OWRhZTRiZGI4M2YzYjQyYWI1ZGY2YzhlLmJpbmRQb3B1cChwb3B1cF85ZDhhMzNhZDFiYzk0NTY5YThjYWZlMjI5MzU4NWNkZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YmUwOTcyMzE2MjA0Y2M4OTZkZjI0NjUzMjAxMzQ4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMyNmNmZDJjNTQwNDQ1ZmJiMjEwM2IyNWIyOGE4YWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWY3ZTVmZTU5ZDgxNDlhODg3YjU1NzU1YmQ1N2FjMDYgPSAkKCc8ZGl2IGlkPSJodG1sXzVmN2U1ZmU1OWQ4MTQ5YTg4N2I1NTc1NWJkNTdhYzA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzI2Y2ZkMmM1NDA0NDVmYmIyMTAzYjI1YjI4YThhZi5zZXRDb250ZW50KGh0bWxfNWY3ZTVmZTU5ZDgxNDlhODg3YjU1NzU1YmQ1N2FjMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWJlMDk3MjMxNjIwNGNjODk2ZGYyNDY1MzIwMTM0ODQuYmluZFBvcHVwKHBvcHVwX2UzMjZjZmQyYzU0MDQ0NWZiYjIxMDNiMjViMjhhOGFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjNTU5MGZjNTZiOTQ5ZGI4MzVkNTQ3ZDIwNjRmYTYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhhZjJhZWUzMTdhNGIyYmFkODM4ZWQ4OGFlZTAzMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzFkZTAyMmRiYzE1NDhkOWJiMDgyZjM0MmFhNzJhYjYgPSAkKCc8ZGl2IGlkPSJodG1sXzcxZGUwMjJkYmMxNTQ4ZDliYjA4MmYzNDJhYTcyYWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzhhZjJhZWUzMTdhNGIyYmFkODM4ZWQ4OGFlZTAzMGYuc2V0Q29udGVudChodG1sXzcxZGUwMjJkYmMxNTQ4ZDliYjA4MmYzNDJhYTcyYWI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjNTU5MGZjNTZiOTQ5ZGI4MzVkNTQ3ZDIwNjRmYTYwLmJpbmRQb3B1cChwb3B1cF9jOGFmMmFlZTMxN2E0YjJiYWQ4MzhlZDg4YWVlMDMwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTMxZmQ4Y2ZjMDM0NmI0OTUxZWUwYzNiYjQzY2M0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTIxZDYxNGMyMzY0NzNlOWFiZTdjYzAzNjgxZTE0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmE5NmUwNjZlODE0NWE5OTY0ZjE1NWZmNTljODMxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ZhOTZlMDY2ZTgxNDVhOTk2NGYxNTVmZjU5YzgzMTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTIxZDYxNGMyMzY0NzNlOWFiZTdjYzAzNjgxZTE0YS5zZXRDb250ZW50KGh0bWxfN2ZhOTZlMDY2ZTgxNDVhOTk2NGYxNTVmZjU5YzgzMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjEzMWZkOGNmYzAzNDZiNDk1MWVlMGMzYmI0M2NjNDIuYmluZFBvcHVwKHBvcHVwXzhlMjFkNjE0YzIzNjQ3M2U5YWJlN2NjMDM2ODFlMTRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxYTZjMTZiYWYwYjQzOTlhMmMwNTE3MDgyMjMxMDAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4ZGFjYWI1YWM4NTQ4YTQ5N2QzNDBlNDQzYTUzMjBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjMjAxYjY3Y2U1NjRjMzdiZjE4NDk2NmNmMzJmYzI4ID0gJCgnPGRpdiBpZD0iaHRtbF81YzIwMWI2N2NlNTY0YzM3YmYxODQ5NjZjZjMyZmMyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZGFjYWI1YWM4NTQ4YTQ5N2QzNDBlNDQzYTUzMjBkLnNldENvbnRlbnQoaHRtbF81YzIwMWI2N2NlNTY0YzM3YmYxODQ5NjZjZjMyZmMyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MWE2YzE2YmFmMGI0Mzk5YTJjMDUxNzA4MjIzMTAwMi5iaW5kUG9wdXAocG9wdXBfOThkYWNhYjVhYzg1NDhhNDk3ZDM0MGU0NDNhNTMyMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODczY2ZmYTA0ZDFlNGIzYjg1MjE4NTJiZDc5MGU4YTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ODhlYWRiYmMxNjA0NTQ2OGMzODU4NTIwYWZmNjcwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YjJiMjRjZmM3MWY0YWI2OTdiMDU4NWFiNjZiYmQ5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGIyYjI0Y2ZjNzFmNGFiNjk3YjA1ODVhYjY2YmJkOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4OGVhZGJiYzE2MDQ1NDY4YzM4NTg1MjBhZmY2NzA5LnNldENvbnRlbnQoaHRtbF80YjJiMjRjZmM3MWY0YWI2OTdiMDU4NWFiNjZiYmQ5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NzNjZmZhMDRkMWU0YjNiODUyMTg1MmJkNzkwZThhNS5iaW5kUG9wdXAocG9wdXBfNTg4ZWFkYmJjMTYwNDU0NjhjMzg1ODUyMGFmZjY3MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDliZGJmZWVlMjUwNDgyNDg5M2I2YWQ3ZDJmZjVkOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzAxYjQzMTIwYzllNDhhNzk0MDI4M2ZhYWNmMGJjNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMxYTMzNGZjZGNjNGE3NzlmMTA0NWJjNmQzNGExYmUgPSAkKCc8ZGl2IGlkPSJodG1sX2RjMWEzMzRmY2RjYzRhNzc5ZjEwNDViYzZkMzRhMWJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwMWI0MzEyMGM5ZTQ4YTc5NDAyODNmYWFjZjBiYzZkLnNldENvbnRlbnQoaHRtbF9kYzFhMzM0ZmNkY2M0YTc3OWYxMDQ1YmM2ZDM0YTFiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OWJkYmZlZWUyNTA0ODI0ODkzYjZhZDdkMmZmNWQ5Mi5iaW5kUG9wdXAocG9wdXBfMzAxYjQzMTIwYzllNDhhNzk0MDI4M2ZhYWNmMGJjNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk2YjE5NTM1NjRlNDQ5MDk5ZWJjMjJiMDNmMDI5YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjcwMTEyYTA0ZDNiNGVhOTgyYTBkNmRmNDk3Y2RiNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDI2NGJjOTkyNmRkNGQ1MDg4Y2RkMjk3ZGRlOTg5OGUgPSAkKCc8ZGl2IGlkPSJodG1sXzQyNjRiYzk5MjZkZDRkNTA4OGNkZDI5N2RkZTk4OThlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzAxMTJhMDRkM2I0ZWE5ODJhMGQ2ZGY0OTdjZGI0Mi5zZXRDb250ZW50KGh0bWxfNDI2NGJjOTkyNmRkNGQ1MDg4Y2RkMjk3ZGRlOTg5OGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTk2YjE5NTM1NjRlNDQ5MDk5ZWJjMjJiMDNmMDI5YzYuYmluZFBvcHVwKHBvcHVwX2I3MDExMmEwNGQzYjRlYTk4MmEwZDZkZjQ5N2NkYjQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmOTg3ZGNkZTM1MTRmZWFhZjg5MTQ5YTgwMGQ4YjI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1MzY5OWY4Nzc4NDQwNzdiMTM3MmEyNzU5MTlkNjEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxOTIzYWFmZmI1YjRmMzA5MzlmMzlkNjgyMWU3NmU2ID0gJCgnPGRpdiBpZD0iaHRtbF9jMTkyM2FhZmZiNWI0ZjMwOTM5ZjM5ZDY4MjFlNzZlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTM2OTlmODc3ODQ0MDc3YjEzNzJhMjc1OTE5ZDYxMy5zZXRDb250ZW50KGh0bWxfYzE5MjNhYWZmYjViNGYzMDkzOWYzOWQ2ODIxZTc2ZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY5ODdkY2RlMzUxNGZlYWFmODkxNDlhODAwZDhiMjYuYmluZFBvcHVwKHBvcHVwXzE1MzY5OWY4Nzc4NDQwNzdiMTM3MmEyNzU5MTlkNjEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2Njc3M2RlOGJjMTQ3NTJiNWI4ODg1ZTk4NDlkNDFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3ODY2MzhiZDgxYTQwZjRhZGU3ODU0NzQ2OTM4OGNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0ZGM2Zjc3ZDhhZTQ3ZTRiNTFmMWE4ZDFkODUxMmNjID0gJCgnPGRpdiBpZD0iaHRtbF8zNGRjNmY3N2Q4YWU0N2U0YjUxZjFhOGQxZDg1MTJjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3ODY2MzhiZDgxYTQwZjRhZGU3ODU0NzQ2OTM4OGNmLnNldENvbnRlbnQoaHRtbF8zNGRjNmY3N2Q4YWU0N2U0YjUxZjFhOGQxZDg1MTJjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NjY3NzNkZThiYzE0NzUyYjViODg4NWU5ODQ5ZDQxZS5iaW5kUG9wdXAocG9wdXBfMTc4NjYzOGJkODFhNDBmNGFkZTc4NTQ3NDY5Mzg4Y2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmU0OTUxZjk0ZGM3NGQ3MGEzM2JkMThiZTVkZDJmOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODllNTY1MWUxMDI5NDM5YWExZGMxZmJmMGJmMTZhZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY3NzhmY2FiOGJmNDA4MmIxNDAyMjg1OTdjMzJlODYgPSAkKCc8ZGl2IGlkPSJodG1sXzZmNzc4ZmNhYjhiZjQwODJiMTQwMjI4NTk3YzMyZTg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5ZTU2NTFlMTAyOTQzOWFhMWRjMWZiZjBiZjE2YWViLnNldENvbnRlbnQoaHRtbF82Zjc3OGZjYWI4YmY0MDgyYjE0MDIyODU5N2MzMmU4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZTQ5NTFmOTRkYzc0ZDcwYTMzYmQxOGJlNWRkMmY5Yi5iaW5kUG9wdXAocG9wdXBfODllNTY1MWUxMDI5NDM5YWExZGMxZmJmMGJmMTZhZWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjQ2MmIyODk0MDlkNDEyYTgwYzhkNGQ4YjQyOTNmMjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkZGVlNmNmMmRkNjRjMWRhYzZkZDUzNmMwNTdmYjdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhM2RlNjBjZDUzMTQ3MTE5OWVkNTZjZDExYmM3ZDFmID0gJCgnPGRpdiBpZD0iaHRtbF8wYTNkZTYwY2Q1MzE0NzExOTllZDU2Y2QxMWJjN2QxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZGRlZTZjZjJkZDY0YzFkYWM2ZGQ1MzZjMDU3ZmI3Yy5zZXRDb250ZW50KGh0bWxfMGEzZGU2MGNkNTMxNDcxMTk5ZWQ1NmNkMTFiYzdkMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjQ2MmIyODk0MDlkNDEyYTgwYzhkNGQ4YjQyOTNmMjUuYmluZFBvcHVwKHBvcHVwXzRkZGVlNmNmMmRkNjRjMWRhYzZkZDUzNmMwNTdmYjdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwZjNlYzA0NGUzZTQzNzg5NjRlNGEyNzRjY2YyNTM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0OGNjN2MyNjUyNDQ0NjQ4M2EyZmQ1YTAzMWNjNjk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3N2Y3MmQyMmM0YTQxNDNhODA5Njk5YjBkYTY3ZWYyID0gJCgnPGRpdiBpZD0iaHRtbF8wNzdmNzJkMjJjNGE0MTQzYTgwOTY5OWIwZGE2N2VmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0OGNjN2MyNjUyNDQ0NjQ4M2EyZmQ1YTAzMWNjNjk5LnNldENvbnRlbnQoaHRtbF8wNzdmNzJkMjJjNGE0MTQzYTgwOTY5OWIwZGE2N2VmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMGYzZWMwNDRlM2U0Mzc4OTY0ZTRhMjc0Y2NmMjUzNS5iaW5kUG9wdXAocG9wdXBfNzQ4Y2M3YzI2NTI0NDQ2NDgzYTJmZDVhMDMxY2M2OTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDFjNmI1MDE2MmNmNDdhY2I0NTZiM2Q2NmU2NTQ0NzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjUxOGI4YTg0N2Y0NGVjMWI1NThhMjk2ZWJlMGFjYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGM0N2UyMWFhZDFiNDNhNDkxNjA4Yzc1YzUwNWNhOTAgPSAkKCc8ZGl2IGlkPSJodG1sXzRjNDdlMjFhYWQxYjQzYTQ5MTYwOGM3NWM1MDVjYTkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTE4YjhhODQ3ZjQ0ZWMxYjU1OGEyOTZlYmUwYWNiYS5zZXRDb250ZW50KGh0bWxfNGM0N2UyMWFhZDFiNDNhNDkxNjA4Yzc1YzUwNWNhOTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDFjNmI1MDE2MmNmNDdhY2I0NTZiM2Q2NmU2NTQ0NzEuYmluZFBvcHVwKHBvcHVwXzY1MThiOGE4NDdmNDRlYzFiNTU4YTI5NmViZTBhY2JhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzYjU1Y2E1ODU3YTRmZjNiZTJkOTgwYWY0NzcyNThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmYzNmJiOTNlMWU5NDY0MTk3MTFkMDk4MDM1NDI0YzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjE2ZTk4Y2JiNjNlNDUxMmIwYmNlOGFiNDY2NjQyNTggPSAkKCc8ZGl2IGlkPSJodG1sX2YxNmU5OGNiYjYzZTQ1MTJiMGJjZThhYjQ2NjY0MjU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmYzNmJiOTNlMWU5NDY0MTk3MTFkMDk4MDM1NDI0YzYuc2V0Q29udGVudChodG1sX2YxNmU5OGNiYjYzZTQ1MTJiMGJjZThhYjQ2NjY0MjU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzYjU1Y2E1ODU3YTRmZjNiZTJkOTgwYWY0NzcyNThmLmJpbmRQb3B1cChwb3B1cF9mZjM2YmI5M2UxZTk0NjQxOTcxMWQwOTgwMzU0MjRjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMGIyZjMxMmFhZTk0NDlkYjdlNDUzNGEyY2QyODZiOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzNmJmNzc2ODRkNDQ3MzU4ZmYxODcyZWM3MTlhNzJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyN2IyODAxYzRjZDRmMWU5ZmUxMTlmODU0YTQ1YzM0ID0gJCgnPGRpdiBpZD0iaHRtbF8zMjdiMjgwMWM0Y2Q0ZjFlOWZlMTE5Zjg1NGE0NWMzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzNmJmNzc2ODRkNDQ3MzU4ZmYxODcyZWM3MTlhNzJhLnNldENvbnRlbnQoaHRtbF8zMjdiMjgwMWM0Y2Q0ZjFlOWZlMTE5Zjg1NGE0NWMzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMGIyZjMxMmFhZTk0NDlkYjdlNDUzNGEyY2QyODZiOC5iaW5kUG9wdXAocG9wdXBfZDM2YmY3NzY4NGQ0NDczNThmZjE4NzJlYzcxOWE3MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzMxN2NmY2RhYmY0NGM3Y2JiZGQzOWZjNTAzNjk0YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmYzA4MmE2NTk4YzQ3YmZiMTQxNjYzYzE2ZTA3YTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3NTM4MzdmYWFlNTQyYmQ4OTVkNTlkNzA0MWNhYzBiID0gJCgnPGRpdiBpZD0iaHRtbF9hNzUzODM3ZmFhZTU0MmJkODk1ZDU5ZDcwNDFjYWMwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmMwODJhNjU5OGM0N2JmYjE0MTY2M2MxNmUwN2E1Mi5zZXRDb250ZW50KGh0bWxfYTc1MzgzN2ZhYWU1NDJiZDg5NWQ1OWQ3MDQxY2FjMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzMxN2NmY2RhYmY0NGM3Y2JiZGQzOWZjNTAzNjk0YzYuYmluZFBvcHVwKHBvcHVwXzZmYzA4MmE2NTk4YzQ3YmZiMTQxNjYzYzE2ZTA3YTUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2OTMxNDc1NDMwZjRhMGQ4OTY5MzM2YTllZjE0NzdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkNWE5ZDAzMWNiZTQxYmI4OWI5N2ZhNTMwMDFlNDhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4OGVmNjI3NzBjODQ5MDY4MDE5MTI5NWUwMDFhZDQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9iODhlZjYyNzcwYzg0OTA2ODAxOTEyOTVlMDAxYWQ0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZDVhOWQwMzFjYmU0MWJiODliOTdmYTUzMDAxZTQ4YS5zZXRDb250ZW50KGh0bWxfYjg4ZWY2Mjc3MGM4NDkwNjgwMTkxMjk1ZTAwMWFkNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzY5MzE0NzU0MzBmNGEwZDg5NjkzMzZhOWVmMTQ3N2QuYmluZFBvcHVwKHBvcHVwXzFkNWE5ZDAzMWNiZTQxYmI4OWI5N2ZhNTMwMDFlNDhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlOGQ4M2VkMTRiMjQ3ZWI5ZjZjMWI1OGE5MDMwYWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTQzMmY2YjdiYTg0Y2UzYTA4N2Y0MTNkZDUxNTdiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNWQxZTZhZDA4ZmY0NDAxYmJjMWI1M2M2MzRmMWNiNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjVkMWU2YWQwOGZmNDQwMWJiYzFiNTNjNjM0ZjFjYjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU0MzJmNmI3YmE4NGNlM2EwODdmNDEzZGQ1MTU3YmYuc2V0Q29udGVudChodG1sX2Y1ZDFlNmFkMDhmZjQ0MDFiYmMxYjUzYzYzNGYxY2I2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlOGQ4M2VkMTRiMjQ3ZWI5ZjZjMWI1OGE5MDMwYWVlLmJpbmRQb3B1cChwb3B1cF8xNTQzMmY2YjdiYTg0Y2UzYTA4N2Y0MTNkZDUxNTdiZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDliOTAwMGMyNDM0Y2E3OWRkMjYwYTYwY2EyNjI2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTE4NWUwYmEzMTY0ZmVhOWU5MzJjNDMxMjM1ZWM0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NjkxZGI0MTc5YzQ0NDAwYWMyMGEwYzFkZTQ1NzYzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjY5MWRiNDE3OWM0NDQwMGFjMjBhMGMxZGU0NTc2M2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUxODVlMGJhMzE2NGZlYTllOTMyYzQzMTIzNWVjNDYuc2V0Q29udGVudChodG1sXzY2OTFkYjQxNzljNDQ0MDBhYzIwYTBjMWRlNDU3NjNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdkOWI5MDAwYzI0MzRjYTc5ZGQyNjBhNjBjYTI2MjZhLmJpbmRQb3B1cChwb3B1cF9iNTE4NWUwYmEzMTY0ZmVhOWU5MzJjNDMxMjM1ZWM0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjlhNDNkMGRlMDE0OWE5YjU2ZmRkM2Y2ZjJmNTJlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwYTFkZWRlNjBiNTQ5YWM4YjcxNmIyMzZlOWE3ZjBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliZThiNTI1NWFlZTQwOGY5NTIwN2VmNzE1MzQ2MjNiID0gJCgnPGRpdiBpZD0iaHRtbF85YmU4YjUyNTVhZWU0MDhmOTUyMDdlZjcxNTM0NjIzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMGExZGVkZTYwYjU0OWFjOGI3MTZiMjM2ZTlhN2YwZC5zZXRDb250ZW50KGh0bWxfOWJlOGI1MjU1YWVlNDA4Zjk1MjA3ZWY3MTUzNDYyM2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I5YTQzZDBkZTAxNDlhOWI1NmZkZDNmNmYyZjUyZTMuYmluZFBvcHVwKHBvcHVwX2MwYTFkZWRlNjBiNTQ5YWM4YjcxNmIyMzZlOWE3ZjBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzNDg0MTM5ZWM4ZDQ3Y2NhNDNmMzgwOGMwNzdhZTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiM2EzMzkwZjU0YzQ5MTg4MGY5OGYwZDEwNTliNGI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzNWEyNmViNDhhYzQ3ZTBhMmUxOTYwNjBmMWFjMDA0ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzVhMjZlYjQ4YWM0N2UwYTJlMTk2MDYwZjFhYzAwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYjNhMzM5MGY1NGM0OTE4ODBmOThmMGQxMDU5YjRiOC5zZXRDb250ZW50KGh0bWxfMjM1YTI2ZWI0OGFjNDdlMGEyZTE5NjA2MGYxYWMwMDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTM0ODQxMzllYzhkNDdjY2E0M2YzODA4YzA3N2FlODAuYmluZFBvcHVwKHBvcHVwXzJiM2EzMzkwZjU0YzQ5MTg4MGY5OGYwZDEwNTliNGI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhYTIwMmU4NDRhMDQ5Mzk5YTEwZTRiYWJmN2FkMzY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjdkYmE1MGNlYzQ0NDE0OTNmNGNlZGU3MjAzOWQyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MzMwZmY2NDRhZTU0NDUwOTAzMTBlNmMzZmRjZjc4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTMzMGZmNjQ0YWU1NDQ1MDkwMzEwZTZjM2ZkY2Y3OGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmN2RiYTUwY2VjNDQ0MTQ5M2Y0Y2VkZTcyMDM5ZDJjLnNldENvbnRlbnQoaHRtbF81MzMwZmY2NDRhZTU0NDUwOTAzMTBlNmMzZmRjZjc4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYWEyMDJlODQ0YTA0OTM5OWExMGU0YmFiZjdhZDM2Ni5iaW5kUG9wdXAocG9wdXBfM2Y3ZGJhNTBjZWM0NDQxNDkzZjRjZWRlNzIwMzlkMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM3ZDZjYjAzOTFkNGE0NDg5NDgzN2FkMTk5ZDMzMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWNjYmRjODYwZDg0NTA5OWE2Mzk3NjliZTAxMWVmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNmEyNGI3Y2JmNWE0ZGFmYjY2ZjQzOTNhZDQ1MWE5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzZhMjRiN2NiZjVhNGRhZmI2NmY0MzkzYWQ0NTFhOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVjY2JkYzg2MGQ4NDUwOTlhNjM5NzY5YmUwMTFlZjMuc2V0Q29udGVudChodG1sX2M2YTI0YjdjYmY1YTRkYWZiNjZmNDM5M2FkNDUxYTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzN2Q2Y2IwMzkxZDRhNDQ4OTQ4MzdhZDE5OWQzMzM0LmJpbmRQb3B1cChwb3B1cF9kZWNjYmRjODYwZDg0NTA5OWE2Mzk3NjliZTAxMWVmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODE3MjEzNGZlZTQ0YTFjODNlZDNhNjRmMDYyZGM3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MTQyMTE3MzU0MzM0ODFiYTgzYjZmNDhiNWM1YTZjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZDUxZjdkZjY2YTE0YmIzOTA0MzI0NGFkYTJiZTZlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmQ1MWY3ZGY2NmExNGJiMzkwNDMyNDRhZGEyYmU2ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTQyMTE3MzU0MzM0ODFiYTgzYjZmNDhiNWM1YTZjYy5zZXRDb250ZW50KGh0bWxfNmQ1MWY3ZGY2NmExNGJiMzkwNDMyNDRhZGEyYmU2ZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjgxNzIxMzRmZWU0NGExYzgzZWQzYTY0ZjA2MmRjNzguYmluZFBvcHVwKHBvcHVwXzcxNDIxMTczNTQzMzQ4MWJhODNiNmY0OGI1YzVhNmNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4MWM1NWE5MmRhNjQyMDhhY2Q5ZWUxZjJmODMwN2Q3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViMzE3YjgxYzYzMjQ0YzJiZDEyOWRhYWZiMjY0NjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4Y2VkZDYyNmJmNjQxMGZhYzQxMjM0NDIzOGYyNzYwID0gJCgnPGRpdiBpZD0iaHRtbF8yOGNlZGQ2MjZiZjY0MTBmYWM0MTIzNDQyMzhmMjc2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViMzE3YjgxYzYzMjQ0YzJiZDEyOWRhYWZiMjY0NjZlLnNldENvbnRlbnQoaHRtbF8yOGNlZGQ2MjZiZjY0MTBmYWM0MTIzNDQyMzhmMjc2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODFjNTVhOTJkYTY0MjA4YWNkOWVlMWYyZjgzMDdkNy5iaW5kUG9wdXAocG9wdXBfZWIzMTdiODFjNjMyNDRjMmJkMTI5ZGFhZmIyNjQ2NmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmFkNGVhYTAzYzY0NDRiM2I2NzgwZmMyNDRmODA0YmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0ZTI1MjgwZDNhNTRiYjc5MjVkNmQxNWExNmM0Y2YxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3OWVlNmYzNWFhYjQyNmY5MDM4ZDY5NjQ0OTdkNjIyID0gJCgnPGRpdiBpZD0iaHRtbF9lNzllZTZmMzVhYWI0MjZmOTAzOGQ2OTY0NDk3ZDYyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTRlMjUyODBkM2E1NGJiNzkyNWQ2ZDE1YTE2YzRjZjEuc2V0Q29udGVudChodG1sX2U3OWVlNmYzNWFhYjQyNmY5MDM4ZDY5NjQ0OTdkNjIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhZDRlYWEwM2M2NDQ0YjNiNjc4MGZjMjQ0ZjgwNGJhLmJpbmRQb3B1cChwb3B1cF9hNGUyNTI4MGQzYTU0YmI3OTI1ZDZkMTVhMTZjNGNmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNzc3ZGNhMTdhM2I0ODY3YmU2ZDJlYTNiZTAxYjFmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2M2I2ZWEzNjRiYTQwZjg4MTliN2JkNDE4MWQzM2M2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1ZDgyMjNjMjk4ODQ0NzdiOWU0NGQzZTI0ZDJjNjlmID0gJCgnPGRpdiBpZD0iaHRtbF9mNWQ4MjIzYzI5ODg0NDc3YjllNDRkM2UyNGQyYzY5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjNiNmVhMzY0YmE0MGY4ODE5YjdiZDQxODFkMzNjNi5zZXRDb250ZW50KGh0bWxfZjVkODIyM2MyOTg4NDQ3N2I5ZTQ0ZDNlMjRkMmM2OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjc3N2RjYTE3YTNiNDg2N2JlNmQyZWEzYmUwMWIxZmMuYmluZFBvcHVwKHBvcHVwXzk2M2I2ZWEzNjRiYTQwZjg4MTliN2JkNDE4MWQzM2M2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlZDAxMzg5Mzk0MTRmM2U5MTEwODg2M2JiYjE2YTA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiMjE1NzUxZmVjOTRlNTJiZGNhODUzMjA0MDAyNGNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4YjE1ZDFjZjk5MDQ0MWViYmE1ZWVkYzQ3YzE2YTlmID0gJCgnPGRpdiBpZD0iaHRtbF9kOGIxNWQxY2Y5OTA0NDFlYmJhNWVlZGM0N2MxNmE5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiMjE1NzUxZmVjOTRlNTJiZGNhODUzMjA0MDAyNGNhLnNldENvbnRlbnQoaHRtbF9kOGIxNWQxY2Y5OTA0NDFlYmJhNWVlZGM0N2MxNmE5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZWQwMTM4OTM5NDE0ZjNlOTExMDg4NjNiYmIxNmEwNC5iaW5kUG9wdXAocG9wdXBfMWIyMTU3NTFmZWM5NGU1MmJkY2E4NTMyMDQwMDI0Y2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzBiNWY5ZmQwNDNjNGIzODg3NzU1YTIxMDg2NTEzNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2VjOWQxZDcwOWI1NGE4MmEwZTcxMjI2NmYzOTE1ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTVlNDAzZjg5OThjNDcyZTgyNGU5ZDlkMTc5MjgzOTQgPSAkKCc8ZGl2IGlkPSJodG1sX2U1ZTQwM2Y4OTk4YzQ3MmU4MjRlOWQ5ZDE3OTI4Mzk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZWM5ZDFkNzA5YjU0YTgyYTBlNzEyMjY2ZjM5MTVmZC5zZXRDb250ZW50KGh0bWxfZTVlNDAzZjg5OThjNDcyZTgyNGU5ZDlkMTc5MjgzOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzBiNWY5ZmQwNDNjNGIzODg3NzU1YTIxMDg2NTEzNWMuYmluZFBvcHVwKHBvcHVwXzNlYzlkMWQ3MDliNTRhODJhMGU3MTIyNjZmMzkxNWZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxNDk2YjliMzdiNzRkMGI5OWFhNjg4NzZkODVkNWNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2NGU3Njc4NmY0MDQzMzk4NDQwM2EyZTlmZDM4OTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2ZTczY2JjNjUwYjQwZjJhNjdjMzRjOGY1OTBhZTFjID0gJCgnPGRpdiBpZD0iaHRtbF85NmU3M2NiYzY1MGI0MGYyYTY3YzM0YzhmNTkwYWUxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2NGU3Njc4NmY0MDQzMzk4NDQwM2EyZTlmZDM4OTliLnNldENvbnRlbnQoaHRtbF85NmU3M2NiYzY1MGI0MGYyYTY3YzM0YzhmNTkwYWUxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTQ5NmI5YjM3Yjc0ZDBiOTlhYTY4ODc2ZDg1ZDVjYS5iaW5kUG9wdXAocG9wdXBfNzY0ZTc2Nzg2ZjQwNDMzOTg0NDAzYTJlOWZkMzg5OWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjU0NzJkNTRhOGMyNDdmNmFmYjUxNWI0ZjZiOTU2ZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyMjgyM2M4ZGJiMjQ1YTRiNTQ2OTQ1MmNmMjA2NzgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0ZjIyNjU5YzVjMzQwYThhOWY3MGIxZDZmNDhmNzQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9mNGYyMjY1OWM1YzM0MGE4YTlmNzBiMWQ2ZjQ4Zjc0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzIyODIzYzhkYmIyNDVhNGI1NDY5NDUyY2YyMDY3ODMuc2V0Q29udGVudChodG1sX2Y0ZjIyNjU5YzVjMzQwYThhOWY3MGIxZDZmNDhmNzQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1NDcyZDU0YThjMjQ3ZjZhZmI1MTViNGY2Yjk1NmUwLmJpbmRQb3B1cChwb3B1cF9jMjI4MjNjOGRiYjI0NWE0YjU0Njk0NTJjZjIwNjc4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDcxYzg4OTUzYjU0NzY5ODNhNjA1NTNkN2I5NGMwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NDIyZjVlOWFhZWM0NWZmYTg1MjE0YjllMTU0NjliMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOGY1YTg3MjU0ZTA0ZjE1YmIzNjc5ZjgwZjVlMWU4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMThmNWE4NzI1NGUwNGYxNWJiMzY3OWY4MGY1ZTFlOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDIyZjVlOWFhZWM0NWZmYTg1MjE0YjllMTU0NjliMS5zZXRDb250ZW50KGh0bWxfMThmNWE4NzI1NGUwNGYxNWJiMzY3OWY4MGY1ZTFlOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjA3MWM4ODk1M2I1NDc2OTgzYTYwNTUzZDdiOTRjMDYuYmluZFBvcHVwKHBvcHVwXzU0MjJmNWU5YWFlYzQ1ZmZhODUyMTRiOWUxNTQ2OWIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3YTc3OTcxOTViZjRkNGU5ODcxMTQ2MWY2MzMwNzQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1NWQzOTM1OWNkMTQ4MDZiYjEyYmE0NGI2OGEyYjU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0Nzg2NjQ5MWY2YTQ3ODVhOTI1MDY5ZGUxNzAxZjgzID0gJCgnPGRpdiBpZD0iaHRtbF80NDc4NjY0OTFmNmE0Nzg1YTkyNTA2OWRlMTcwMWY4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTVkMzkzNTljZDE0ODA2YmIxMmJhNDRiNjhhMmI1Ni5zZXRDb250ZW50KGh0bWxfNDQ3ODY2NDkxZjZhNDc4NWE5MjUwNjlkZTE3MDFmODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdhNzc5NzE5NWJmNGQ0ZTk4NzExNDYxZjYzMzA3NDAuYmluZFBvcHVwKHBvcHVwXzE1NWQzOTM1OWNkMTQ4MDZiYjEyYmE0NGI2OGEyYjU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwYzY1OWZiMjRhYTRlMjI4ZTM5YzI0NzA5NzQ5YWVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3YTRhYjU0NGMwMDQ2NWJiYTU4ZDBlNTYyM2ExZWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4ZTRhZDdmZWJhMzQ2OGJiZmZhOTU3YjcxYTMxYzBhID0gJCgnPGRpdiBpZD0iaHRtbF9jOGU0YWQ3ZmViYTM0NjhiYmZmYTk1N2I3MWEzMWMwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lN2E0YWI1NDRjMDA0NjViYmE1OGQwZTU2MjNhMWVkNC5zZXRDb250ZW50KGh0bWxfYzhlNGFkN2ZlYmEzNDY4YmJmZmE5NTdiNzFhMzFjMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjBjNjU5ZmIyNGFhNGUyMjhlMzljMjQ3MDk3NDlhZWYuYmluZFBvcHVwKHBvcHVwX2U3YTRhYjU0NGMwMDQ2NWJiYTU4ZDBlNTYyM2ExZWQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxOTc0ZmY3MGQ4NTRkMTdhYzYzOGI2YzNlODIwOGYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiMzhmYzA4OWI4MjRkZmQ5NTE0NjFmNmU3Y2U4ZTZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1ZTExYzY4ZDkxYTQwZDM4MjliZWMwZjA4OTE5MmRmID0gJCgnPGRpdiBpZD0iaHRtbF9iNWUxMWM2OGQ5MWE0MGQzODI5YmVjMGYwODkxOTJkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2IzOGZjMDg5YjgyNGRmZDk1MTQ2MWY2ZTdjZThlNmMuc2V0Q29udGVudChodG1sX2I1ZTExYzY4ZDkxYTQwZDM4MjliZWMwZjA4OTE5MmRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQxOTc0ZmY3MGQ4NTRkMTdhYzYzOGI2YzNlODIwOGYxLmJpbmRQb3B1cChwb3B1cF8zYjM4ZmMwODliODI0ZGZkOTUxNDYxZjZlN2NlOGU2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNGQwM2QyN2I3NDA0ZThiOGMzYzI3NzQ2M2I5ZTEyNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZiYzkzZmUwNDkzNDc4Nzg0MjA0ZGI1NzdmYmYwMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmExYmEzM2Q0MTU0NGE4OTk2MTUyMzI0ZjVlYmExODUgPSAkKCc8ZGl2IGlkPSJodG1sX2JhMWJhMzNkNDE1NDRhODk5NjE1MjMyNGY1ZWJhMTg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmYmM5M2ZlMDQ5MzQ3ODc4NDIwNGRiNTc3ZmJmMDEyLnNldENvbnRlbnQoaHRtbF9iYTFiYTMzZDQxNTQ0YTg5OTYxNTIzMjRmNWViYTE4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGQwM2QyN2I3NDA0ZThiOGMzYzI3NzQ2M2I5ZTEyNi5iaW5kUG9wdXAocG9wdXBfZGZiYzkzZmUwNDkzNDc4Nzg0MjA0ZGI1NzdmYmYwMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzRiZjRhZjQ5OTdjNGFkYTk2NDE0ZmEyMTc2ZDQ3ODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxMDcwYTIzNTJhNzQ2MGRhNDdmNGJhNTZlODJhMzY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjYjRiMDc4Zjc1YTQ1NWQ5NGZiZWIyMjU2NDNlNDljID0gJCgnPGRpdiBpZD0iaHRtbF83Y2I0YjA3OGY3NWE0NTVkOTRmYmViMjI1NjQzZTQ5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxMDcwYTIzNTJhNzQ2MGRhNDdmNGJhNTZlODJhMzY4LnNldENvbnRlbnQoaHRtbF83Y2I0YjA3OGY3NWE0NTVkOTRmYmViMjI1NjQzZTQ5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNGJmNGFmNDk5N2M0YWRhOTY0MTRmYTIxNzZkNDc4MC5iaW5kUG9wdXAocG9wdXBfNTEwNzBhMjM1MmE3NDYwZGE0N2Y0YmE1NmU4MmEzNjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODRhNTBiMmM1MGNlNDE1M2IyYjQ4NjdjZDc5Y2MyZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmYTZlMDU5ZWJjMzRhOWVhZmQzMGZiMTg0NGYyYmUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhjMTZlMzU4YmEwYzQ5OWNiMmVkZmRiMjQwODE1ZmQ5ID0gJCgnPGRpdiBpZD0iaHRtbF84YzE2ZTM1OGJhMGM0OTljYjJlZGZkYjI0MDgxNWZkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGZhNmUwNTllYmMzNGE5ZWFmZDMwZmIxODQ0ZjJiZTEuc2V0Q29udGVudChodG1sXzhjMTZlMzU4YmEwYzQ5OWNiMmVkZmRiMjQwODE1ZmQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg0YTUwYjJjNTBjZTQxNTNiMmI0ODY3Y2Q3OWNjMmZjLmJpbmRQb3B1cChwb3B1cF80ZmE2ZTA1OWViYzM0YTllYWZkMzBmYjE4NDRmMmJlMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2IwYTcwYzA2NGY0NjRjYjM4NmZkZTFmMzE0MGU4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDc2ZGE5NWJmYmE1NDZhZjg4YWE0MmFmYWVhNDE4ZTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY1NDYzNTZiZDM3NDU0N2EzOWU5Y2E1YjI0ZTQ0MTkgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2NTQ2MzU2YmQzNzQ1NDdhMzllOWNhNWIyNGU0NDE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDc2ZGE5NWJmYmE1NDZhZjg4YWE0MmFmYWVhNDE4ZTIuc2V0Q29udGVudChodG1sXzQ2NTQ2MzU2YmQzNzQ1NDdhMzllOWNhNWIyNGU0NDE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzYjBhNzBjMDY0ZjQ2NGNiMzg2ZmRlMWYzMTQwZTgwLmJpbmRQb3B1cChwb3B1cF9kNzZkYTk1YmZiYTU0NmFmODhhYTQyYWZhZWE0MThlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZWIyZGYxMjA1MDQ0MDgwOTU5NWJkYmZmZTU0YTg2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwNjExYTFlMGY1NTQzYTBhM2FjNzkyZGE2NGNkZjQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxYzg5YTMyMjFiYTQ1MDU4ODRlYzc1NzAzMzhlMmRlID0gJCgnPGRpdiBpZD0iaHRtbF9jMWM4OWEzMjIxYmE0NTA1ODg0ZWM3NTcwMzM4ZTJkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDYxMWExZTBmNTU0M2EwYTNhYzc5MmRhNjRjZGY0Mi5zZXRDb250ZW50KGh0bWxfYzFjODlhMzIyMWJhNDUwNTg4NGVjNzU3MDMzOGUyZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGViMmRmMTIwNTA0NDA4MDk1OTViZGJmZmU1NGE4NmQuYmluZFBvcHVwKHBvcHVwX2UwNjExYTFlMGY1NTQzYTBhM2FjNzkyZGE2NGNkZjQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FkNGZjYzNiZDM0NTQyMGJhZGQ3ZmE3Yjc3OWQ4NDY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5YWYwNjg3MDYzNDRlOTk4NGNiYTZkZTAwMzhlODc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwMzFhZDhmMDJiOTQyODY5MTQyZGUxOWQwMmJkMjlmID0gJCgnPGRpdiBpZD0iaHRtbF83MDMxYWQ4ZjAyYjk0Mjg2OTE0MmRlMTlkMDJiZDI5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5YWYwNjg3MDYzNDRlOTk4NGNiYTZkZTAwMzhlODc2LnNldENvbnRlbnQoaHRtbF83MDMxYWQ4ZjAyYjk0Mjg2OTE0MmRlMTlkMDJiZDI5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDRmY2MzYmQzNDU0MjBiYWRkN2ZhN2I3NzlkODQ2OS5iaW5kUG9wdXAocG9wdXBfODlhZjA2ODcwNjM0NGU5OTg0Y2JhNmRlMDAzOGU4NzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjkzNTUxNzZkMTliNGFiYTljNGFmZGEzOGNjMTUxYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1MzRlZWVmODZmNjQ4YjliZWZhZmZlZWU2Y2JiNzQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2NWE1ODVjYjg1ZTRhODRhMzY4ZTQwZDQ3ODg4YThmID0gJCgnPGRpdiBpZD0iaHRtbF9mNjVhNTg1Y2I4NWU0YTg0YTM2OGU0MGQ0Nzg4OGE4ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTUzNGVlZWY4NmY2NDhiOWJlZmFmZmVlZTZjYmI3NDcuc2V0Q29udGVudChodG1sX2Y2NWE1ODVjYjg1ZTRhODRhMzY4ZTQwZDQ3ODg4YThmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI5MzU1MTc2ZDE5YjRhYmE5YzRhZmRhMzhjYzE1MWM1LmJpbmRQb3B1cChwb3B1cF9lNTM0ZWVlZjg2ZjY0OGI5YmVmYWZmZWVlNmNiYjc0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzlmOWM1OThmOTc0NTA4YjQyOGZjNzIxMjUxZGUwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzAxZTkwYmNjNzc0MTAyYTg3MjVmODRjOTBlODVmNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTNhNGFlMGU1MDE0N2ZmYjc0NWY3NmMxOTBhMDQ4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfODUzYTRhZTBlNTAxNDdmZmI3NDVmNzZjMTkwYTA0ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTcwMWU5MGJjYzc3NDEwMmE4NzI1Zjg0YzkwZTg1Zjcuc2V0Q29udGVudChodG1sXzg1M2E0YWUwZTUwMTQ3ZmZiNzQ1Zjc2YzE5MGEwNDg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzOWY5YzU5OGY5NzQ1MDhiNDI4ZmM3MjEyNTFkZTAwLmJpbmRQb3B1cChwb3B1cF81NzAxZTkwYmNjNzc0MTAyYTg3MjVmODRjOTBlODVmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Mjc3MDk4MTcyOTc0YzM0YmI3OWUxMTA5ZjhkOWU0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZjQ1YTRmYTU1YjY0MmM5ODZkYTllZjRmNWM1ZDljZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hN2UzYTdkZTM2MDc0NjY3YTljMTBjYzRkNDNhY2Y4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTdlM2E3ZGUzNjA3NDY2N2E5YzEwY2M0ZDQzYWNmODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmNDVhNGZhNTViNjQyYzk4NmRhOWVmNGY1YzVkOWNkLnNldENvbnRlbnQoaHRtbF9hN2UzYTdkZTM2MDc0NjY3YTljMTBjYzRkNDNhY2Y4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Mjc3MDk4MTcyOTc0YzM0YmI3OWUxMTA5ZjhkOWU0NS5iaW5kUG9wdXAocG9wdXBfNWY0NWE0ZmE1NWI2NDJjOTg2ZGE5ZWY0ZjVjNWQ5Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjY5NjAzOTdmODg2NDM0ZDhhNDA4Zjg4MGVhZTlhODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3OWRlZDdjOTVjZTQ5MzVhNDk1ZmIyNzBhMDZmZWY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyOWFhOTllOTVmMDRjODA5ZmU3MjdmMTk5NDAwNjYyID0gJCgnPGRpdiBpZD0iaHRtbF9jMjlhYTk5ZTk1ZjA0YzgwOWZlNzI3ZjE5OTQwMDY2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzc5ZGVkN2M5NWNlNDkzNWE0OTVmYjI3MGEwNmZlZjkuc2V0Q29udGVudChodG1sX2MyOWFhOTllOTVmMDRjODA5ZmU3MjdmMTk5NDAwNjYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2OTYwMzk3Zjg4NjQzNGQ4YTQwOGY4ODBlYWU5YTg1LmJpbmRQb3B1cChwb3B1cF8zNzlkZWQ3Yzk1Y2U0OTM1YTQ5NWZiMjcwYTA2ZmVmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZGQ2MmMyMjJjZWQ0YjhhYTIxYjkzZjcxN2I3NDRjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYTRkZWExMGZhYzQ0OTAyYTQzYTJiYzQzMmNmODMxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNjIxZDlkZDU4NmM0Njc5YmU4MWMwN2RmYzZjOTkwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjYyMWQ5ZGQ1ODZjNDY3OWJlODFjMDdkZmM2Yzk5MDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2E0ZGVhMTBmYWM0NDkwMmE0M2EyYmM0MzJjZjgzMTMuc2V0Q29udGVudChodG1sX2Y2MjFkOWRkNTg2YzQ2NzliZTgxYzA3ZGZjNmM5OTA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkZDYyYzIyMmNlZDRiOGFhMjFiOTNmNzE3Yjc0NGNiLmJpbmRQb3B1cChwb3B1cF9jYTRkZWExMGZhYzQ0OTAyYTQzYTJiYzQzMmNmODMxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNDMwZGYyZWIzODI0ZmVlOTE2NTdkYzgxNWVlY2ZmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhmYTA5NjJiZjZhNDQyNWI4NjkyMzEwY2M4YzQ4ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmU2ODQ2MWVjNTgxNDc2MGJhY2M0NWIwMWVhMGFmMjEgPSAkKCc8ZGl2IGlkPSJodG1sX2JlNjg0NjFlYzU4MTQ3NjBiYWNjNDViMDFlYTBhZjIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGZhMDk2MmJmNmE0NDI1Yjg2OTIzMTBjYzhjNDhlYi5zZXRDb250ZW50KGh0bWxfYmU2ODQ2MWVjNTgxNDc2MGJhY2M0NWIwMWVhMGFmMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQzMGRmMmViMzgyNGZlZTkxNjU3ZGM4MTVlZWNmZmMuYmluZFBvcHVwKHBvcHVwXzY4ZmEwOTYyYmY2YTQ0MjViODY5MjMxMGNjOGM0OGViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjYjgzZTdiMzZkZDRiMTk5NTAyYzljZTZhMTk3ZmM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWQ3YjcwYzFkMzY0MzAxOTFlMjEzOTc2NmNmYjg0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OWI0NjU1MmRkNjA0ZDFiYmYzYWE3ZTY4ZDYzZTZiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzliNDY1NTJkZDYwNGQxYmJmM2FhN2U2OGQ2M2U2YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxZDdiNzBjMWQzNjQzMDE5MWUyMTM5NzY2Y2ZiODQzLnNldENvbnRlbnQoaHRtbF83OWI0NjU1MmRkNjA0ZDFiYmYzYWE3ZTY4ZDYzZTZiMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jY2I4M2U3YjM2ZGQ0YjE5OTUwMmM5Y2U2YTE5N2ZjNC5iaW5kUG9wdXAocG9wdXBfNzFkN2I3MGMxZDM2NDMwMTkxZTIxMzk3NjZjZmI4NDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzE2YzIxNzY4NWQ4NDQzZjkxOGU5MDk3NTE0MGQyODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjZmVlOTBhZmE1ZTQ0ZWNhODNmZDYxZjA1ZDg3NzNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhZGZiNDU3YjU2NjQ2YjA5NjRkM2E0NGM0N2Q2YjMzID0gJCgnPGRpdiBpZD0iaHRtbF9iYWRmYjQ1N2I1NjY0NmIwOTY0ZDNhNDRjNDdkNmIzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2NmZWU5MGFmYTVlNDRlY2E4M2ZkNjFmMDVkODc3M2Yuc2V0Q29udGVudChodG1sX2JhZGZiNDU3YjU2NjQ2YjA5NjRkM2E0NGM0N2Q2YjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxNmMyMTc2ODVkODQ0M2Y5MThlOTA5NzUxNDBkMjgxLmJpbmRQb3B1cChwb3B1cF8zY2ZlZTkwYWZhNWU0NGVjYTgzZmQ2MWYwNWQ4NzczZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYjMxNGE3YWQxMDM0MjY2ODQwZjExY2RmNzk5NjJkOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWEwOTk2OWFiNjllNGNkZjkwYTkwZDFmOGRhMjFkN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWEwN2Y4YmI3NzUwNDIxMjlmMWNhNjliN2E3MmE0YjkgPSAkKCc8ZGl2IGlkPSJodG1sXzlhMDdmOGJiNzc1MDQyMTI5ZjFjYTY5YjdhNzJhNGI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTA5OTY5YWI2OWU0Y2RmOTBhOTBkMWY4ZGEyMWQ3Yy5zZXRDb250ZW50KGh0bWxfOWEwN2Y4YmI3NzUwNDIxMjlmMWNhNjliN2E3MmE0YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGIzMTRhN2FkMTAzNDI2Njg0MGYxMWNkZjc5OTYyZDkuYmluZFBvcHVwKHBvcHVwXzlhMDk5NjlhYjY5ZTRjZGY5MGE5MGQxZjhkYTIxZDdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwZDkwZWU2MmU2YjQ5ZDY5MTQwODUzZGU1ZTE1MWI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFiN2QyZjJmYzNmNDcwNWIxMWQ2YzEwYTdjNzliOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjllMWRhM2JlMmUwNGZhZWFmYmNlMzBiMTc5NDIxMGUgPSAkKCc8ZGl2IGlkPSJodG1sXzI5ZTFkYTNiZTJlMDRmYWVhZmJjZTMwYjE3OTQyMTBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExYjdkMmYyZmMzZjQ3MDViMTFkNmMxMGE3Yzc5YjllLnNldENvbnRlbnQoaHRtbF8yOWUxZGEzYmUyZTA0ZmFlYWZiY2UzMGIxNzk0MjEwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MGQ5MGVlNjJlNmI0OWQ2OTE0MDg1M2RlNWUxNTFiNC5iaW5kUG9wdXAocG9wdXBfYTFiN2QyZjJmYzNmNDcwNWIxMWQ2YzEwYTdjNzliOWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTE5ZTRmNDU1NzM0NDZmMmFhMzUyM2VkZDEyZjQ1ZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNWNjMzE3OTMzZGU0MDcxYTBlNGM3NjJjY2IzZWM5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmQyZTVmMmRjZDk0MDczYWM1N2IyYjU3MjRlNWVhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZkMmU1ZjJkY2Q5NDA3M2FjNTdiMmI1NzI0ZTVlYTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNWNjMzE3OTMzZGU0MDcxYTBlNGM3NjJjY2IzZWM5Yi5zZXRDb250ZW50KGh0bWxfMTZkMmU1ZjJkY2Q5NDA3M2FjNTdiMmI1NzI0ZTVlYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE5ZTRmNDU1NzM0NDZmMmFhMzUyM2VkZDEyZjQ1ZTQuYmluZFBvcHVwKHBvcHVwX2Q1Y2MzMTc5MzNkZTQwNzFhMGU0Yzc2MmNjYjNlYzliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlNWIyYmE5MjYxMTQ2YTFiNDI4MTNmZjYyZTI2NzQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmZlZDllOWYwOTRhNGU4ZTkxOGE0NmZhYzQ5ODIzYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2VmZmZmNjRiYzkxNDM3M2I3YjQ3ZmI3MDA1Njc5NTEgPSAkKCc8ZGl2IGlkPSJodG1sXzNlZmZmZjY0YmM5MTQzNzNiN2I0N2ZiNzAwNTY3OTUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmZlZDllOWYwOTRhNGU4ZTkxOGE0NmZhYzQ5ODIzYzIuc2V0Q29udGVudChodG1sXzNlZmZmZjY0YmM5MTQzNzNiN2I0N2ZiNzAwNTY3OTUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlNWIyYmE5MjYxMTQ2YTFiNDI4MTNmZjYyZTI2NzQ1LmJpbmRQb3B1cChwb3B1cF82ZmVkOWU5ZjA5NGE0ZThlOTE4YTQ2ZmFjNDk4MjNjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDk1YjA1OTljNmI0YmM5Yjg0MjIxZTkyYTVmMmMwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjM5ZTI4YjgzMzZjNDQ0ZTgwYTIzNWVhM2MwYWYzNjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzc4YzM0NGUyMzczNGJhMjk0YzlmZjlmYWRhYjVmM2YgPSAkKCc8ZGl2IGlkPSJodG1sX2M3OGMzNDRlMjM3MzRiYTI5NGM5ZmY5ZmFkYWI1ZjNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjM5ZTI4YjgzMzZjNDQ0ZTgwYTIzNWVhM2MwYWYzNjYuc2V0Q29udGVudChodG1sX2M3OGMzNDRlMjM3MzRiYTI5NGM5ZmY5ZmFkYWI1ZjNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZkOTViMDU5OWM2YjRiYzliODQyMjFlOTJhNWYyYzAwLmJpbmRQb3B1cChwb3B1cF82MzllMjhiODMzNmM0NDRlODBhMjM1ZWEzYzBhZjM2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTg1YzJkNGQzYWE0YjZhOTQ5YzZiYzZjNDUyZDlkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGRlMjQwM2VjODMzNDM0OWFiMGQ0MTkyODMxMTY4MzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhmNTgwMGUzYjE5NGZlODgzZDgyYzY1NGRkZDhiZTEgPSAkKCc8ZGl2IGlkPSJodG1sXzc4ZjU4MDBlM2IxOTRmZTg4M2Q4MmM2NTRkZGQ4YmUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkZTI0MDNlYzgzMzQzNDlhYjBkNDE5MjgzMTE2ODM5LnNldENvbnRlbnQoaHRtbF83OGY1ODAwZTNiMTk0ZmU4ODNkODJjNjU0ZGRkOGJlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZTg1YzJkNGQzYWE0YjZhOTQ5YzZiYzZjNDUyZDlkMy5iaW5kUG9wdXAocG9wdXBfNGRlMjQwM2VjODMzNDM0OWFiMGQ0MTkyODMxMTY4MzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWRhOTk5M2NlMTNiNDEzMjg2MjNkZDEwOWRmYTZlOTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGUyOTcyMDcwZGYyNGRiYTg1NTM3YzEzZDg3N2YyM2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNlNmRmYmU4ZDI5NDIyNjk2OWExYWFhNzcwMjNkYTAgPSAkKCc8ZGl2IGlkPSJodG1sXzEzZTZkZmJlOGQyOTQyMjY5NjlhMWFhYTc3MDIzZGEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlMjk3MjA3MGRmMjRkYmE4NTUzN2MxM2Q4NzdmMjNiLnNldENvbnRlbnQoaHRtbF8xM2U2ZGZiZThkMjk0MjI2OTY5YTFhYWE3NzAyM2RhMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZGE5OTkzY2UxM2I0MTMyODYyM2RkMTA5ZGZhNmU5NC5iaW5kUG9wdXAocG9wdXBfNGUyOTcyMDcwZGYyNGRiYTg1NTM3YzEzZDg3N2YyM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWM5MmIzMDY3ZDdjNDI5ZDlkNTA0OWJjNGRlZGRhMDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTk4OTY2NjY0ZmMxNGNmNDkzM2JlMTdjMjkxZDVlYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjMwMjU3MGEyMzk0NGY0NWI2ZDI5MGIyMDdmZWYzNTMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzMDI1NzBhMjM5NDRmNDViNmQyOTBiMjA3ZmVmMzUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTk4OTY2NjY0ZmMxNGNmNDkzM2JlMTdjMjkxZDVlYTAuc2V0Q29udGVudChodG1sX2IzMDI1NzBhMjM5NDRmNDViNmQyOTBiMjA3ZmVmMzUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjOTJiMzA2N2Q3YzQyOWQ5ZDUwNDliYzRkZWRkYTAyLmJpbmRQb3B1cChwb3B1cF9lOTg5NjY2NjRmYzE0Y2Y0OTMzYmUxN2MyOTFkNWVhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzM1NTViY2RiOGM0MjE0OTBlMjMxOTFiMjBiNmY3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzJhMGQyZjA1MjU0ODBkOTY4ZmVmNGFkNTE0MDdkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYmNkOTdlZGNlYmQ0ODg4OGQyNjJlYzI2ZDJjNWNhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmJjZDk3ZWRjZWJkNDg4ODhkMjYyZWMyNmQyYzVjYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MmEwZDJmMDUyNTQ4MGQ5NjhmZWY0YWQ1MTQwN2RkLnNldENvbnRlbnQoaHRtbF8yYmNkOTdlZGNlYmQ0ODg4OGQyNjJlYzI2ZDJjNWNhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMzM1NTViY2RiOGM0MjE0OTBlMjMxOTFiMjBiNmY3ZC5iaW5kUG9wdXAocG9wdXBfODcyYTBkMmYwNTI1NDgwZDk2OGZlZjRhZDUxNDA3ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTg0NzdiNzgzNTI2NDQ2MzhjMmRmZTcyNTQ1ZGQ5OWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTVhN2E5YzgwNTk0YzA5YWZhMjkyOTA5OGU1NGU0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTg2ZDY1ZTFiNzY0YzY4YjljYWM0ZTBhMzcxYzY0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE4NmQ2NWUxYjc2NGM2OGI5Y2FjNGUwYTM3MWM2NDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTVhN2E5YzgwNTk0YzA5YWZhMjkyOTA5OGU1NGU0OS5zZXRDb250ZW50KGh0bWxfZTE4NmQ2NWUxYjc2NGM2OGI5Y2FjNGUwYTM3MWM2NDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTg0NzdiNzgzNTI2NDQ2MzhjMmRmZTcyNTQ1ZGQ5OWIuYmluZFBvcHVwKHBvcHVwX2I1NWE3YTljODA1OTRjMDlhZmEyOTI5MDk4ZTU0ZTQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYmYzOTkzZGFkYTQzYWM5ZjFiMmY1NjBlYTkzOWYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxZjNiNDY0YTA5MjRlMTliNjcyNDdjZjk1Y2UzNmM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwOTE0NjdiZWM5ZTRkM2VhN2E4ZTlmOWNlNTNmZmEwID0gJCgnPGRpdiBpZD0iaHRtbF8yMDkxNDY3YmVjOWU0ZDNlYTdhOGU5ZjljZTUzZmZhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMWYzYjQ2NGEwOTI0ZTE5YjY3MjQ3Y2Y5NWNlMzZjNi5zZXRDb250ZW50KGh0bWxfMjA5MTQ2N2JlYzllNGQzZWE3YThlOWY5Y2U1M2ZmYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmZiZjM5OTNkYWRhNDNhYzlmMWIyZjU2MGVhOTM5ZjMuYmluZFBvcHVwKHBvcHVwX2MxZjNiNDY0YTA5MjRlMTliNjcyNDdjZjk1Y2UzNmM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmNDBlZTMyZWM2YjQ1Y2I5ODdiODZmN2Y0M2I2MWE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMjdiZDFiYmM4NzQ1ZGU5N2Y3MjQ5ZmIxYmM2YjhmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1MDA0YzNlNzBhNTRjZWVhMWQxODhiYTBkYjMzZDMwID0gJCgnPGRpdiBpZD0iaHRtbF9hNTAwNGMzZTcwYTU0Y2VlYTFkMTg4YmEwZGIzM2QzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzI3YmQxYmJjODc0NWRlOTdmNzI0OWZiMWJjNmI4Zi5zZXRDb250ZW50KGh0bWxfYTUwMDRjM2U3MGE1NGNlZWExZDE4OGJhMGRiMzNkMzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGY0MGVlMzJlYzZiNDVjYjk4N2I4NmY3ZjQzYjYxYTcuYmluZFBvcHVwKHBvcHVwX2NjMjdiZDFiYmM4NzQ1ZGU5N2Y3MjQ5ZmIxYmM2YjhmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiOTQ0MWJmYWZkOTQ3NzM5ZDMwZWU3MDQxYjIyMzFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhhZGVjYjkxODY0MjQ3Mzk5Y2M0YmYyNzdkOTVmMmMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EyODlkZjY0OGY3NTRlZGU5NGQ3OWFjZGUzMzEzYWZjID0gJCgnPGRpdiBpZD0iaHRtbF9hMjg5ZGY2NDhmNzU0ZWRlOTRkNzlhY2RlMzMxM2FmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YWRlY2I5MTg2NDI0NzM5OWNjNGJmMjc3ZDk1ZjJjMy5zZXRDb250ZW50KGh0bWxfYTI4OWRmNjQ4Zjc1NGVkZTk0ZDc5YWNkZTMzMTNhZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI5NDQxYmZhZmQ5NDc3MzlkMzBlZTcwNDFiMjIzMWYuYmluZFBvcHVwKHBvcHVwXzhhZGVjYjkxODY0MjQ3Mzk5Y2M0YmYyNzdkOTVmMmMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0YTNlNzllMWVhNTRiODFiZmZmNmYzNTQzMDNhNWRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhNzkzNDZmZDViYjQ0YzU5MjkyZDZkNmE4NTE0OTdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjNWQwMDljMmQxZDQ4YjI4MTk1YmM4ZDNiMDM0Yjg1ID0gJCgnPGRpdiBpZD0iaHRtbF9hYzVkMDA5YzJkMWQ0OGIyODE5NWJjOGQzYjAzNGI4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE3OTM0NmZkNWJiNDRjNTkyOTJkNmQ2YTg1MTQ5N2Yuc2V0Q29udGVudChodG1sX2FjNWQwMDljMmQxZDQ4YjI4MTk1YmM4ZDNiMDM0Yjg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0YTNlNzllMWVhNTRiODFiZmZmNmYzNTQzMDNhNWRmLmJpbmRQb3B1cChwb3B1cF9kYTc5MzQ2ZmQ1YmI0NGM1OTI5MmQ2ZDZhODUxNDk3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODUyNmJmYTFkZjk0M2Y5YWViYTU3MGFjNGNkMGFkNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmNDNiMTkyNzA0NTRkNmViMTlmYWEyMTMzNTEzOGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2Mjk3NTY5ZDc5MjQ3YTk5MjYxYjc2YzYwY2M2YmZmID0gJCgnPGRpdiBpZD0iaHRtbF8yNjI5NzU2OWQ3OTI0N2E5OTI2MWI3NmM2MGNjNmJmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmNDNiMTkyNzA0NTRkNmViMTlmYWEyMTMzNTEzOGZjLnNldENvbnRlbnQoaHRtbF8yNjI5NzU2OWQ3OTI0N2E5OTI2MWI3NmM2MGNjNmJmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODUyNmJmYTFkZjk0M2Y5YWViYTU3MGFjNGNkMGFkNS5iaW5kUG9wdXAocG9wdXBfYmY0M2IxOTI3MDQ1NGQ2ZWIxOWZhYTIxMzM1MTM4ZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYzMDdiZmI2ZGU0NDJmZGFhNzhlYzMxYmIwY2E1NWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0MDg0MzJkYzdhNDQ5NDU5ZGZiMDgzZTdlZDNjZDU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzM2U5ZWM5MWQwYzRhM2JhYmM4YTRlNzU4YWZlZTJhID0gJCgnPGRpdiBpZD0iaHRtbF9lMzNlOWVjOTFkMGM0YTNiYWJjOGE0ZTc1OGFmZWUyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQwODQzMmRjN2E0NDk0NTlkZmIwODNlN2VkM2NkNTQuc2V0Q29udGVudChodG1sX2UzM2U5ZWM5MWQwYzRhM2JhYmM4YTRlNzU4YWZlZTJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmMzA3YmZiNmRlNDQyZmRhYTc4ZWMzMWJiMGNhNTVkLmJpbmRQb3B1cChwb3B1cF81NDA4NDMyZGM3YTQ0OTQ1OWRmYjA4M2U3ZWQzY2Q1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjMxYjhhOWRlMDE0ZTEwYjAxODcxNmQ5ZTFjYzZiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwZGRjZDNjNWFhMjRhMDhhYTViYWRhMDcyZGI5MGUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjYmNlNTcyNmNlZTQyYmFiNWMyMTc3ZjM1ZTc3Y2Q1ID0gJCgnPGRpdiBpZD0iaHRtbF9hY2JjZTU3MjZjZWU0MmJhYjVjMjE3N2YzNWU3N2NkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTBkZGNkM2M1YWEyNGEwOGFhNWJhZGEwNzJkYjkwZTEuc2V0Q29udGVudChodG1sX2FjYmNlNTcyNmNlZTQyYmFiNWMyMTc3ZjM1ZTc3Y2Q1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyMzFiOGE5ZGUwMTRlMTBiMDE4NzE2ZDllMWNjNmI2LmJpbmRQb3B1cChwb3B1cF81MGRkY2QzYzVhYTI0YTA4YWE1YmFkYTA3MmRiOTBlMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MjRjM2M3OTUyYWU0NTNkOGE5OTQ2ZDRiNzIzZTc1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MTEyYjQ2NmZjYjI0N2Y0ODg2NjVkOGY4NTdmMGQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMGUxMDg0ZGJkNzE0MTMzYjY2MmNhYjllMDM4MWU5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDBlMTA4NGRiZDcxNDEzM2I2NjJjYWI5ZTAzODFlOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTExMmI0NjZmY2IyNDdmNDg4NjY1ZDhmODU3ZjBkNTIuc2V0Q29udGVudChodG1sXzAwZTEwODRkYmQ3MTQxMzNiNjYyY2FiOWUwMzgxZTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyNGMzYzc5NTJhZTQ1M2Q4YTk5NDZkNGI3MjNlNzVmLmJpbmRQb3B1cChwb3B1cF85MTEyYjQ2NmZjYjI0N2Y0ODg2NjVkOGY4NTdmMGQ1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODE3YjJmZmRmNjE0OWJhYjc3YTQxOTFmYTc2MjFjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjc2YTU5NzI0NWY0ODY1YTFiNjJhYTMyMWNiMGU0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZGQ5OGYxYmVhZTE0YjI4YTEyMmE1ZDdkYTIwMTQ1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGRkOThmMWJlYWUxNGIyOGExMjJhNWQ3ZGEyMDE0NTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY3NmE1OTcyNDVmNDg2NWExYjYyYWEzMjFjYjBlNDkuc2V0Q29udGVudChodG1sXzRkZDk4ZjFiZWFlMTRiMjhhMTIyYTVkN2RhMjAxNDUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4MTdiMmZmZGY2MTQ5YmFiNzdhNDE5MWZhNzYyMWM4LmJpbmRQb3B1cChwb3B1cF9iNjc2YTU5NzI0NWY0ODY1YTFiNjJhYTMyMWNiMGU0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NzgxYzFhYjgxMDQ0NjE0YTI2Yzg3NzU1ZjFiMWU2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNzNlMjc1NGZiMWM0ZDg4YTE1YjZmNjJiNjYzNDc3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjUyODQ2MjY3Njc0MWZlYmQxZjdiOWJmYTc2ZDUyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI1Mjg0NjI2NzY3NDFmZWJkMWY3YjliZmE3NmQ1MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzNlMjc1NGZiMWM0ZDg4YTE1YjZmNjJiNjYzNDc3Ny5zZXRDb250ZW50KGh0bWxfNmI1Mjg0NjI2NzY3NDFmZWJkMWY3YjliZmE3NmQ1MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTc4MWMxYWI4MTA0NDYxNGEyNmM4Nzc1NWYxYjFlNjIuYmluZFBvcHVwKHBvcHVwX2M3M2UyNzU0ZmIxYzRkODhhMTViNmY2MmI2NjM0Nzc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1ODRlMWJjM2RlYjQ1ZjJiZDEyZTg1ZDQ3ZThmNDRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM0ZTZiYjJmMDJlNDZmN2ExNDA3YmVjZDAwNTZkMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM5YzQ1NzVlYjA1NGI1Njg3MmJlMzRhZjg2MGE5NGUgPSAkKCc8ZGl2IGlkPSJodG1sXzEzOWM0NTc1ZWIwNTRiNTY4NzJiZTM0YWY4NjBhOTRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMzRlNmJiMmYwMmU0NmY3YTE0MDdiZWNkMDA1NmQxYi5zZXRDb250ZW50KGh0bWxfMTM5YzQ1NzVlYjA1NGI1Njg3MmJlMzRhZjg2MGE5NGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDU4NGUxYmMzZGViNDVmMmJkMTJlODVkNDdlOGY0NGIuYmluZFBvcHVwKHBvcHVwX2UzNGU2YmIyZjAyZTQ2ZjdhMTQwN2JlY2QwMDU2ZDFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5NWJkOWY4YTU2ZDRlOGI5YTZmNGUwMzM3ZTIzMjI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGU5MmI1NTk5YjI0YjAwYjM4NzdmMGI5MzQ1MjM3MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NGVkNmQ4YTVmMmQ0MDQ2ODNmZWE1YmFhNTE3NjMyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTRlZDZkOGE1ZjJkNDA0NjgzZmVhNWJhYTUxNzYzMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGU5MmI1NTk5YjI0YjAwYjM4NzdmMGI5MzQ1MjM3Mi5zZXRDb250ZW50KGh0bWxfOTRlZDZkOGE1ZjJkNDA0NjgzZmVhNWJhYTUxNzYzMmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzk1YmQ5ZjhhNTZkNGU4YjlhNmY0ZTAzMzdlMjMyMjcuYmluZFBvcHVwKHBvcHVwX2VkZTkyYjU1OTliMjRiMDBiMzg3N2YwYjkzNDUyMzcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzMDI4NWFhYzg3ZTQ2ZTRiZDIzYTI3N2FlMTRhM2JmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWExZTQ4OTI1N2YzNDgxMjllYzA2Y2ZmOTRhZTgyNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGFmODBmMmMxYThhNDJmYjkwM2YwZmYxYzNkNzRiMTkgPSAkKCc8ZGl2IGlkPSJodG1sXzhhZjgwZjJjMWE4YTQyZmI5MDNmMGZmMWMzZDc0YjE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhMWU0ODkyNTdmMzQ4MTI5ZWMwNmNmZjk0YWU4MjU1LnNldENvbnRlbnQoaHRtbF84YWY4MGYyYzFhOGE0MmZiOTAzZjBmZjFjM2Q3NGIxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMzAyODVhYWM4N2U0NmU0YmQyM2EyNzdhZTE0YTNiZi5iaW5kUG9wdXAocG9wdXBfNWExZTQ4OTI1N2YzNDgxMjllYzA2Y2ZmOTRhZTgyNTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTA1YzQ5ZDk4YmI0NDMzNGIwZjFhNWUzMDVlNmE1ZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMjUzNjg5NmVmZDc0NzUzYWVlYWI2ZGU4NDc1MGZkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDQ0YzUwNjljNGM0YzAwOWI1MzQ3ZGVjMTgwNTMwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTA0NGM1MDY5YzRjNGMwMDliNTM0N2RlYzE4MDUzMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjUzNjg5NmVmZDc0NzUzYWVlYWI2ZGU4NDc1MGZkNy5zZXRDb250ZW50KGh0bWxfMTA0NGM1MDY5YzRjNGMwMDliNTM0N2RlYzE4MDUzMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTA1YzQ5ZDk4YmI0NDMzNGIwZjFhNWUzMDVlNmE1ZWIuYmluZFBvcHVwKHBvcHVwX2YyNTM2ODk2ZWZkNzQ3NTNhZWVhYjZkZTg0NzUwZmQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkOWJhNzc4MTRkYzQzYzRhODc0ZTM3ZDgyMTE0ODFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3MzA0YTFmMDYwODRkYzU4YTU2MDMxNGM3NzMwYjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjMmMzZGQ2OWJlZDQ4ZjlhMWM1YWFiNTRiNWU4ODg0ID0gJCgnPGRpdiBpZD0iaHRtbF8wYzJjM2RkNjliZWQ0OGY5YTFjNWFhYjU0YjVlODg4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDczMDRhMWYwNjA4NGRjNThhNTYwMzE0Yzc3MzBiM2Uuc2V0Q29udGVudChodG1sXzBjMmMzZGQ2OWJlZDQ4ZjlhMWM1YWFiNTRiNWU4ODg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlkOWJhNzc4MTRkYzQzYzRhODc0ZTM3ZDgyMTE0ODFmLmJpbmRQb3B1cChwb3B1cF8wNzMwNGExZjA2MDg0ZGM1OGE1NjAzMTRjNzczMGIzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MmRmYTU4ZjE5NjU0NzVlOWVkMGY5NzBmYzk0ZjE5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWMxZDMzNmM5N2U0NDIyMGI2NDlhODU1NGI1NzEwMjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhkNTE4ZDMzMTVlNGY2NzkyN2Q0NmQ4ZDMyNjJhNzYgPSAkKCc8ZGl2IGlkPSJodG1sXzA4ZDUxOGQzMzE1ZTRmNjc5MjdkNDZkOGQzMjYyYTc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWMxZDMzNmM5N2U0NDIyMGI2NDlhODU1NGI1NzEwMjMuc2V0Q29udGVudChodG1sXzA4ZDUxOGQzMzE1ZTRmNjc5MjdkNDZkOGQzMjYyYTc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyZGZhNThmMTk2NTQ3NWU5ZWQwZjk3MGZjOTRmMTk5LmJpbmRQb3B1cChwb3B1cF9hYzFkMzM2Yzk3ZTQ0MjIwYjY0OWE4NTU0YjU3MTAyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzQ0MTY3ZGY5M2E0MTQyOWJiOWY2MmVjZGY5YTYwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTFkYmQzYTZiMzI0YjNjYmQ5OGRhNDZiMzUyN2U5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzJiMjlhNTVlY2I0NmE3OWFhNjIxYzY2MGQwNTllZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDMyYjI5YTU1ZWNiNDZhNzlhYTYyMWM2NjBkMDU5ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlMWRiZDNhNmIzMjRiM2NiZDk4ZGE0NmIzNTI3ZTk3LnNldENvbnRlbnQoaHRtbF8wMzJiMjlhNTVlY2I0NmE3OWFhNjIxYzY2MGQwNTllZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYzQ0MTY3ZGY5M2E0MTQyOWJiOWY2MmVjZGY5YTYwMy5iaW5kUG9wdXAocG9wdXBfYmUxZGJkM2E2YjMyNGIzY2JkOThkYTQ2YjM1MjdlOTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTFmYzFkZjQ4NmYwNDM0OGFmOGM5YmYyZWM4NTNmMDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDEyMDkyYjYzNzM1NDc4YTkzMGZjYjIwMTljMjFmNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmNhNDM0ZWY5ODhkNGMzOThjNjM3ZDE1YmMyMjBkNTYgPSAkKCc8ZGl2IGlkPSJodG1sX2JjYTQzNGVmOTg4ZDRjMzk4YzYzN2QxNWJjMjIwZDU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDEyMDkyYjYzNzM1NDc4YTkzMGZjYjIwMTljMjFmNzUuc2V0Q29udGVudChodG1sX2JjYTQzNGVmOTg4ZDRjMzk4YzYzN2QxNWJjMjIwZDU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxZmMxZGY0ODZmMDQzNDhhZjhjOWJmMmVjODUzZjA0LmJpbmRQb3B1cChwb3B1cF8wMTIwOTJiNjM3MzU0NzhhOTMwZmNiMjAxOWMyMWY3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OGM0YTQwNjI0NmU0MzRkOWIwODNiZDVlNDI1MDQ0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmEzODdiYmQyNzEyNGNiOWJjNjJiN2M3ZmZjMTAwYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWE0ZmY1ZGI1YWFhNGUzODg2MjU0YmRlYjRmNmVlZjIgPSAkKCc8ZGl2IGlkPSJodG1sX2FhNGZmNWRiNWFhYTRlMzg4NjI1NGJkZWI0ZjZlZWYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhMzg3YmJkMjcxMjRjYjliYzYyYjdjN2ZmYzEwMGI0LnNldENvbnRlbnQoaHRtbF9hYTRmZjVkYjVhYWE0ZTM4ODYyNTRiZGViNGY2ZWVmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OGM0YTQwNjI0NmU0MzRkOWIwODNiZDVlNDI1MDQ0Ni5iaW5kUG9wdXAocG9wdXBfZmEzODdiYmQyNzEyNGNiOWJjNjJiN2M3ZmZjMTAwYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2FkODlhYWFjZDUzNDM3Y2FiNWYyNTk5NzU4MzAyZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc5MTAyN2VkZDgxNDIwNDg2NzJkYjY1Y2JmZWJiYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODM4YjU3MWNhMjRhNDAwMmJiYzc2OTdkNTNmMzgxNTYgPSAkKCc8ZGl2IGlkPSJodG1sXzgzOGI1NzFjYTI0YTQwMDJiYmM3Njk3ZDUzZjM4MTU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3OTEwMjdlZGQ4MTQyMDQ4NjcyZGI2NWNiZmViYmJmLnNldENvbnRlbnQoaHRtbF84MzhiNTcxY2EyNGE0MDAyYmJjNzY5N2Q1M2YzODE1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YWQ4OWFhYWNkNTM0MzdjYWI1ZjI1OTk3NTgzMDJmYy5iaW5kUG9wdXAocG9wdXBfNDc5MTAyN2VkZDgxNDIwNDg2NzJkYjY1Y2JmZWJiYmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTc1NDk2NGIxZTljNGY4N2IzZDZjNmY5YTc0NTk2ZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzllNzUxNGJiNDQ0NTU1YTI4ZjgwMmJiNmUyOTUxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MjFiZDgzZWY4ZDg0Y2IzYmJjODIyZDQ2ZDllMGRmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzIxYmQ4M2VmOGQ4NGNiM2JiYzgyMmQ0NmQ5ZTBkZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzllNzUxNGJiNDQ0NTU1YTI4ZjgwMmJiNmUyOTUxYi5zZXRDb250ZW50KGh0bWxfNzIxYmQ4M2VmOGQ4NGNiM2JiYzgyMmQ0NmQ5ZTBkZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTc1NDk2NGIxZTljNGY4N2IzZDZjNmY5YTc0NTk2ZGEuYmluZFBvcHVwKHBvcHVwXzUzOWU3NTE0YmI0NDQ1NTVhMjhmODAyYmI2ZTI5NTFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczMTVkYjkzZDE0YzQ2OGE5ZTBkYjhkMTZkNGJkZjVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGE2MTZkNTQ5MDQ2NDliMzhiMzNkNGY5M2RjMWE2ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI4ZDBhMjYzODRhNDAxNmE3YWVjNGZmNDZlODU2MmMgPSAkKCc8ZGl2IGlkPSJodG1sXzcyOGQwYTI2Mzg0YTQwMTZhN2FlYzRmZjQ2ZTg1NjJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTYxNmQ1NDkwNDY0OWIzOGIzM2Q0ZjkzZGMxYTZmZS5zZXRDb250ZW50KGh0bWxfNzI4ZDBhMjYzODRhNDAxNmE3YWVjNGZmNDZlODU2MmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzMxNWRiOTNkMTRjNDY4YTllMGRiOGQxNmQ0YmRmNWMuYmluZFBvcHVwKHBvcHVwX2RhNjE2ZDU0OTA0NjQ5YjM4YjMzZDRmOTNkYzFhNmZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4YTFhZGIyYzcxMjQ2ZmE5M2Q3MTJkMmY5MzhkMDkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzdiYjg5NTg4MTA0NGNhYTJiOTBkNzY4OTkwYWZlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTNlOGZjOTdmMDI0ZWI4ODI1YTIzN2U2ZTQzZThmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDUzZThmYzk3ZjAyNGViODgyNWEyMzdlNmU0M2U4ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzdiYjg5NTg4MTA0NGNhYTJiOTBkNzY4OTkwYWZlZC5zZXRDb250ZW50KGh0bWxfMDUzZThmYzk3ZjAyNGViODgyNWEyMzdlNmU0M2U4ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZThhMWFkYjJjNzEyNDZmYTkzZDcxMmQyZjkzOGQwOTMuYmluZFBvcHVwKHBvcHVwX2ZjN2JiODk1ODgxMDQ0Y2FhMmI5MGQ3Njg5OTBhZmVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkNzJlNDIyMzZiMjQxNDY5NTEzZThlY2ZlMDBiOGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZjI2NjQ5ZjkxZjQ1ZWViZDM3YmY5MzJiNTNjZDZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3ZDY3NmQ2MGZkZjRkMTdiYWE1NmI4OWQyMzA1NGE3ID0gJCgnPGRpdiBpZD0iaHRtbF8yN2Q2NzZkNjBmZGY0ZDE3YmFhNTZiODlkMjMwNTRhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwZjI2NjQ5ZjkxZjQ1ZWViZDM3YmY5MzJiNTNjZDZhLnNldENvbnRlbnQoaHRtbF8yN2Q2NzZkNjBmZGY0ZDE3YmFhNTZiODlkMjMwNTRhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZDcyZTQyMjM2YjI0MTQ2OTUxM2U4ZWNmZTAwYjhiMy5iaW5kUG9wdXAocG9wdXBfMDBmMjY2NDlmOTFmNDVlZWJkMzdiZjkzMmI1M2NkNmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2M1YjFhZmNkMWU4NDA5ZTllNThkNzAxMzFhZTI0MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkwYzc2OTU1MDYyNGJkMWI1MjRjZDE3NGZjMmJjOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE1YTdlYTU4MTlhNGEyYmI5MzA2NDE0NDhmZmI3YjEgPSAkKCc8ZGl2IGlkPSJodG1sXzFhNWE3ZWE1ODE5YTRhMmJiOTMwNjQxNDQ4ZmZiN2IxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkwYzc2OTU1MDYyNGJkMWI1MjRjZDE3NGZjMmJjOWEuc2V0Q29udGVudChodG1sXzFhNWE3ZWE1ODE5YTRhMmJiOTMwNjQxNDQ4ZmZiN2IxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjNWIxYWZjZDFlODQwOWU5ZTU4ZDcwMTMxYWUyNDE0LmJpbmRQb3B1cChwb3B1cF9lOTBjNzY5NTUwNjI0YmQxYjUyNGNkMTc0ZmMyYmM5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTZjMGQ5ZWEyNDU0ODI5YTU3OTBmZDc2ODk0MGZmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Q3NDA0MmIzNWNjNDJhZmFmOTgxNTE0MDA5NWZhODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM0MjJhYjMwY2Y2NDE3ZmE4NDI1ZWNmNzU4ZDMyNzcgPSAkKCc8ZGl2IGlkPSJodG1sXzQzNDIyYWIzMGNmNjQxN2ZhODQyNWVjZjc1OGQzMjc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDc0MDQyYjM1Y2M0MmFmYWY5ODE1MTQwMDk1ZmE4Ny5zZXRDb250ZW50KGh0bWxfNDM0MjJhYjMwY2Y2NDE3ZmE4NDI1ZWNmNzU4ZDMyNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjE2YzBkOWVhMjQ1NDgyOWE1NzkwZmQ3Njg5NDBmZjguYmluZFBvcHVwKHBvcHVwX2NkNzQwNDJiMzVjYzQyYWZhZjk4MTUxNDAwOTVmYTg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5NjYxMDg4MjA0NDQ0ZmI5MWZmNDdmNDMwNGZjMjA1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiM2JjYzZjMmUwYzQwZjE4ZTliZDZkNmE0YWI3NGY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyMmU1OGRkMmI5ZjRjMWQ4NDkxNjRiNmU0NmU4ZjgxID0gJCgnPGRpdiBpZD0iaHRtbF8zMjJlNThkZDJiOWY0YzFkODQ5MTY0YjZlNDZlOGY4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiM2JjYzZjMmUwYzQwZjE4ZTliZDZkNmE0YWI3NGY1LnNldENvbnRlbnQoaHRtbF8zMjJlNThkZDJiOWY0YzFkODQ5MTY0YjZlNDZlOGY4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OTY2MTA4ODIwNDQ0NGZiOTFmZjQ3ZjQzMDRmYzIwNS5iaW5kUG9wdXAocG9wdXBfNmIzYmNjNmMyZTBjNDBmMThlOWJkNmQ2YTRhYjc0ZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzliMTVmNjQ3YzIwNDRmMTgwOWM1YjU3ZDc0YjJhNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhMGZiMmQ2ZDZmMTRjYWM4MWQ1OTcwNzc0NzJhMDcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2ZTdiYzA4ZmUwMzRmYjQ4MWY4MGM3MmRiYWRkMDgxID0gJCgnPGRpdiBpZD0iaHRtbF9lNmU3YmMwOGZlMDM0ZmI0ODFmODBjNzJkYmFkZDA4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWEwZmIyZDZkNmYxNGNhYzgxZDU5NzA3NzQ3MmEwNzAuc2V0Q29udGVudChodG1sX2U2ZTdiYzA4ZmUwMzRmYjQ4MWY4MGM3MmRiYWRkMDgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5YjE1ZjY0N2MyMDQ0ZjE4MDljNWI1N2Q3NGIyYTRjLmJpbmRQb3B1cChwb3B1cF8xYTBmYjJkNmQ2ZjE0Y2FjODFkNTk3MDc3NDcyYTA3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNmVlYjIxYThlZTg0MzdmYjIyZGI0NzU5ZGRhNzM1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzhkYTY4OTAxNjQ0MTNmYjU3ODcwMTYzYjgwZGIxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MTM0OTZmYzA2ZWM0ZmI0YjE2NTU1NzZlYzhkNTY2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTEzNDk2ZmMwNmVjNGZiNGIxNjU1NTc2ZWM4ZDU2NjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzhkYTY4OTAxNjQ0MTNmYjU3ODcwMTYzYjgwZGIxNS5zZXRDb250ZW50KGh0bWxfOTEzNDk2ZmMwNmVjNGZiNGIxNjU1NTc2ZWM4ZDU2NjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZlZWIyMWE4ZWU4NDM3ZmIyMmRiNDc1OWRkYTczNWQuYmluZFBvcHVwKHBvcHVwX2MzOGRhNjg5MDE2NDQxM2ZiNTc4NzAxNjNiODBkYjE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiMmZlMWE3MjFmYzQwZDZhZDRlZGFkZmE4OTkzN2Q1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdhNTVkMmVkYzM3NDFkNDk5YmExM2U4OTk1MzU4N2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzcyZGZkMWU1MzJiNGZkMzgzODBkZDIyZTg1YjViMGEgPSAkKCc8ZGl2IGlkPSJodG1sX2M3MmRmZDFlNTMyYjRmZDM4MzgwZGQyMmU4NWI1YjBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3YTU1ZDJlZGMzNzQxZDQ5OWJhMTNlODk5NTM1ODdlLnNldENvbnRlbnQoaHRtbF9jNzJkZmQxZTUzMmI0ZmQzODM4MGRkMjJlODViNWIwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YjJmZTFhNzIxZmM0MGQ2YWQ0ZWRhZGZhODk5MzdkNS5iaW5kUG9wdXAocG9wdXBfYjdhNTVkMmVkYzM3NDFkNDk5YmExM2U4OTk1MzU4N2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDZkMzFlMWFjNTBmNDgzMGE3NTExZWViNjIzODg0ODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhZDM1MmQwOTIyMDRjNjBiMjM3ZWViZGY3NDg1MWE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4MGQzMjllYmJmNTQ5Njk4NTAxN2Q1ZDU0OWY0ZTIwID0gJCgnPGRpdiBpZD0iaHRtbF84ODBkMzI5ZWJiZjU0OTY5ODUwMTdkNWQ1NDlmNGUyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWQzNTJkMDkyMjA0YzYwYjIzN2VlYmRmNzQ4NTFhOC5zZXRDb250ZW50KGh0bWxfODgwZDMyOWViYmY1NDk2OTg1MDE3ZDVkNTQ5ZjRlMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDZkMzFlMWFjNTBmNDgzMGE3NTExZWViNjIzODg0ODkuYmluZFBvcHVwKHBvcHVwXzlhZDM1MmQwOTIyMDRjNjBiMjM3ZWViZGY3NDg1MWE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmMzFiYzNhODI5MjRlNTBiZDBhNjAzNjNiZTU0ZWU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyOWJhNjA1MzI1MTQzMzNiNGU4YjJhMDU1ZjAwYWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyMDA2OTljNmRhZTQ0YTA4ZTFjYjhmMWZhYTNkOTRlID0gJCgnPGRpdiBpZD0iaHRtbF80MjAwNjk5YzZkYWU0NGEwOGUxY2I4ZjFmYWEzZDk0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyOWJhNjA1MzI1MTQzMzNiNGU4YjJhMDU1ZjAwYWIxLnNldENvbnRlbnQoaHRtbF80MjAwNjk5YzZkYWU0NGEwOGUxY2I4ZjFmYWEzZDk0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjMxYmMzYTgyOTI0ZTUwYmQwYTYwMzYzYmU1NGVlOC5iaW5kUG9wdXAocG9wdXBfYTI5YmE2MDUzMjUxNDMzM2I0ZThiMmEwNTVmMDBhYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTMwYjNjOWM3ODU4NDYzOGJjN2E0NzZiMWE3ZThiNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhMjhhNTdiNGVkYzRlNjI5YTZlMTRhMjM2MjcyYTU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzNzRiOGE4YTY0ZDRhYjlhMTg2MGNmZjQ0ZjY0MWUzID0gJCgnPGRpdiBpZD0iaHRtbF9hMzc0YjhhOGE2NGQ0YWI5YTE4NjBjZmY0NGY2NDFlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTI4YTU3YjRlZGM0ZTYyOWE2ZTE0YTIzNjI3MmE1OS5zZXRDb250ZW50KGh0bWxfYTM3NGI4YThhNjRkNGFiOWExODYwY2ZmNDRmNjQxZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTMwYjNjOWM3ODU4NDYzOGJjN2E0NzZiMWE3ZThiNDUuYmluZFBvcHVwKHBvcHVwX2ZhMjhhNTdiNGVkYzRlNjI5YTZlMTRhMjM2MjcyYTU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2ZTVlZjYyNTgxYzQwNGZhZDc0NWI5YmRlN2M3ZjAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3MjNjYTY3MzVlNjQ1MjY5NjdhOTIwMjk2OTI2YjNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhYTJjY2Y2NDNiNTQwNjM4YmVmZmVlMjMzNDRhMzIxID0gJCgnPGRpdiBpZD0iaHRtbF8zYWEyY2NmNjQzYjU0MDYzOGJlZmZlZTIzMzQ0YTMyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NzIzY2E2NzM1ZTY0NTI2OTY3YTkyMDI5NjkyNmIzZi5zZXRDb250ZW50KGh0bWxfM2FhMmNjZjY0M2I1NDA2MzhiZWZmZWUyMzM0NGEzMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTZlNWVmNjI1ODFjNDA0ZmFkNzQ1YjliZGU3YzdmMDMuYmluZFBvcHVwKHBvcHVwXzQ3MjNjYTY3MzVlNjQ1MjY5NjdhOTIwMjk2OTI2YjNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1ZTdkMjAzZDk0MTQ3MTNiMzZiNDllMzJkYjE2YmE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjOGFhNDc4Y2IzYzQ1YmU5Y2UyMmU0NTFlOGI5NGMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjNDRiMDAwNDRkYzRjMmRiMDUyZjMwMTY1ZjU4NTAxID0gJCgnPGRpdiBpZD0iaHRtbF9kYzQ0YjAwMDQ0ZGM0YzJkYjA1MmYzMDE2NWY1ODUwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjOGFhNDc4Y2IzYzQ1YmU5Y2UyMmU0NTFlOGI5NGMxLnNldENvbnRlbnQoaHRtbF9kYzQ0YjAwMDQ0ZGM0YzJkYjA1MmYzMDE2NWY1ODUwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNWU3ZDIwM2Q5NDE0NzEzYjM2YjQ5ZTMyZGIxNmJhOC5iaW5kUG9wdXAocG9wdXBfOGM4YWE0NzhjYjNjNDViZTljZTIyZTQ1MWU4Yjk0YzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdhODViNTg2NDdkNDExMjlhNjZiMTk4YTVlZmU5MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzZjNlZmMxYjVmNzQ5NGNhMDQ4ZmVmZTM3YTY2OTM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzNWVkOTQ2NjQ2YzQwMzVhY2NkMTdlYWQ3MjEyYTdiID0gJCgnPGRpdiBpZD0iaHRtbF85MzVlZDk0NjY0NmM0MDM1YWNjZDE3ZWFkNzIxMmE3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kM2YzZWZjMWI1Zjc0OTRjYTA0OGZlZmUzN2E2NjkzOS5zZXRDb250ZW50KGh0bWxfOTM1ZWQ5NDY2NDZjNDAzNWFjY2QxN2VhZDcyMTJhN2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjdhODViNTg2NDdkNDExMjlhNjZiMTk4YTVlZmU5MmUuYmluZFBvcHVwKHBvcHVwX2QzZjNlZmMxYjVmNzQ5NGNhMDQ4ZmVmZTM3YTY2OTM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkN2E0NTU0ZTQxNjRlN2JiYzM2ZTY1OGRmZWE2OThlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhYmE5YTczMzE5MTQwOWM5NzI3NTVkNWY0MjFhOWM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwM2MzMWE5MWYyNzQ1MzhhYzc3MTQwMjEwNmJjNmViID0gJCgnPGRpdiBpZD0iaHRtbF9jMDNjMzFhOTFmMjc0NTM4YWM3NzE0MDIxMDZiYzZlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YWJhOWE3MzMxOTE0MDljOTcyNzU1ZDVmNDIxYTljNS5zZXRDb250ZW50KGh0bWxfYzAzYzMxYTkxZjI3NDUzOGFjNzcxNDAyMTA2YmM2ZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQ3YTQ1NTRlNDE2NGU3YmJjMzZlNjU4ZGZlYTY5OGUuYmluZFBvcHVwKHBvcHVwXzdhYmE5YTczMzE5MTQwOWM5NzI3NTVkNWY0MjFhOWM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2N2ZiMGFmYjkyNjQzZTY4YmUwMTRiYWM2ZTI2MmE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNzczYjY5MGU5MTM0ZTM1YmI4ZTBhZjhmODc0NjNlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMWNmYzEwN2E1NDM0ODllYTZjYzc4Y2VlOTBiNmYzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTFjZmMxMDdhNTQzNDg5ZWE2Y2M3OGNlZTkwYjZmM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzczYjY5MGU5MTM0ZTM1YmI4ZTBhZjhmODc0NjNlMi5zZXRDb250ZW50KGh0bWxfMTFjZmMxMDdhNTQzNDg5ZWE2Y2M3OGNlZTkwYjZmM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTY3ZmIwYWZiOTI2NDNlNjhiZTAxNGJhYzZlMjYyYTUuYmluZFBvcHVwKHBvcHVwX2Q3NzNiNjkwZTkxMzRlMzViYjhlMGFmOGY4NzQ2M2UyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmNDc1YTI3OGIyYTQyYmM5NTcwYTY1MDdiNjZkZTlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThjMTlmZTQ3MzEzNGYxYmI3ZTVhZmEwNzQ2YzliNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2NhZjhiNTQwMGU4NDBiYWE4ZDIzMDVhNTY2Zjc3ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzdjYWY4YjU0MDBlODQwYmFhOGQyMzA1YTU2NmY3N2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThjMTlmZTQ3MzEzNGYxYmI3ZTVhZmEwNzQ2YzliNWEuc2V0Q29udGVudChodG1sXzdjYWY4YjU0MDBlODQwYmFhOGQyMzA1YTU2NmY3N2U1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmNDc1YTI3OGIyYTQyYmM5NTcwYTY1MDdiNjZkZTlkLmJpbmRQb3B1cChwb3B1cF8xOGMxOWZlNDczMTM0ZjFiYjdlNWFmYTA3NDZjOWI1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81M2YwNWI3NzkxYmM0NWUwYTljZTAyZDM0MjBhY2MwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmQ3MDcyMDk4MWM0NDJmYjFlZmM5MTRiZGZlOTUyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZGY4MGI3NjQzNTQ0MWQxYjA2MGRiODJjZWEyMGU4ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2RmODBiNzY0MzU0NDFkMWIwNjBkYjgyY2VhMjBlOGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YmQ3MDcyMDk4MWM0NDJmYjFlZmM5MTRiZGZlOTUyMy5zZXRDb250ZW50KGh0bWxfY2RmODBiNzY0MzU0NDFkMWIwNjBkYjgyY2VhMjBlOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNmMDViNzc5MWJjNDVlMGE5Y2UwMmQzNDIwYWNjMGUuYmluZFBvcHVwKHBvcHVwXzRiZDcwNzIwOTgxYzQ0MmZiMWVmYzkxNGJkZmU5NTIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2YmY1ZDI1YTQ0ZjQ4NDRiMTQ2MDNmNWY1NDdlMjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDA4ZDEyM2Q1NjM0ODA2YTA1NWE0ZDUzYzM4OGQ2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjNhNjJlMTAzZGE0MTNlYTgxNzcyZDgwMDUzYjEyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTIzYTYyZTEwM2RhNDEzZWE4MTc3MmQ4MDA1M2IxMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQwOGQxMjNkNTYzNDgwNmEwNTVhNGQ1M2MzODhkNjguc2V0Q29udGVudChodG1sXzkyM2E2MmUxMDNkYTQxM2VhODE3NzJkODAwNTNiMTJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2YmY1ZDI1YTQ0ZjQ4NDRiMTQ2MDNmNWY1NDdlMjAwLmJpbmRQb3B1cChwb3B1cF9lNDA4ZDEyM2Q1NjM0ODA2YTA1NWE0ZDUzYzM4OGQ2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNmRhNzBkN2M4YjE0ODI4YWRlNjg1NGI2M2U5MjA1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZWNhMGRjYjg3ODQ0NmZlOGUyZGIxMmMxYjQ2ZDU4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTczNThhNzI3ZWQ0MWUyYmE2YmE2OWJlZjU0MDRmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfODU3MzU4YTcyN2VkNDFlMmJhNmJhNjliZWY1NDA0ZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlY2EwZGNiODc4NDQ2ZmU4ZTJkYjEyYzFiNDZkNTg3LnNldENvbnRlbnQoaHRtbF84NTczNThhNzI3ZWQ0MWUyYmE2YmE2OWJlZjU0MDRmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNmRhNzBkN2M4YjE0ODI4YWRlNjg1NGI2M2U5MjA1Ni5iaW5kUG9wdXAocG9wdXBfMmVjYTBkY2I4Nzg0NDZmZThlMmRiMTJjMWI0NmQ1ODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNlYTg1YzE4OWIxNGQ3YWIzZWEwMzczYjE1NDNmNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzhkNTA5M2I3NzkxNGNiZGI1NjNlYjAyNDdlNWZhMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2MzM2M3N2JlZTQ2NDQ2ZGIyZDUzMzgwMzJiZjNiNDggPSAkKCc8ZGl2IGlkPSJodG1sX2NjMzNjNzdiZWU0NjQ0NmRiMmQ1MzM4MDMyYmYzYjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOGQ1MDkzYjc3OTE0Y2JkYjU2M2ViMDI0N2U1ZmExNS5zZXRDb250ZW50KGh0bWxfY2MzM2M3N2JlZTQ2NDQ2ZGIyZDUzMzgwMzJiZjNiNDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNlYTg1YzE4OWIxNGQ3YWIzZWEwMzczYjE1NDNmNWYuYmluZFBvcHVwKHBvcHVwXzM4ZDUwOTNiNzc5MTRjYmRiNTYzZWIwMjQ3ZTVmYTE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwMzZiMzcxYTk2YjRkMGM5ZTBjNWRlNjQ2NDhmZWVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMThmZmIzMDc5MDQ3ODhhODgzMjQ1ZjcxMGRjZGM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyYzM4NzA5Njk0MzQyMDc4ZmQ0ZDkzZTQzYjliNGQzID0gJCgnPGRpdiBpZD0iaHRtbF9lMmMzODcwOTY5NDM0MjA3OGZkNGQ5M2U0M2I5YjRkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMThmZmIzMDc5MDQ3ODhhODgzMjQ1ZjcxMGRjZGM2LnNldENvbnRlbnQoaHRtbF9lMmMzODcwOTY5NDM0MjA3OGZkNGQ5M2U0M2I5YjRkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMDM2YjM3MWE5NmI0ZDBjOWUwYzVkZTY0NjQ4ZmVlYS5iaW5kUG9wdXAocG9wdXBfNmIxOGZmYjMwNzkwNDc4OGE4ODMyNDVmNzEwZGNkYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjQyZmYzOTYxZjFlNDM4NjlhN2ViNjRlNGRhMTM2ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA2YzhkNTY4Mzc0NDFiYzhiOWQyNzE2NjNlODQ1MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2NlMGZkYjE2NTA4NDYxODlmMjFlODQwMTMwNmMzM2UgPSAkKCc8ZGl2IGlkPSJodG1sXzNjZTBmZGIxNjUwODQ2MTg5ZjIxZTg0MDEzMDZjMzNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTA2YzhkNTY4Mzc0NDFiYzhiOWQyNzE2NjNlODQ1MTUuc2V0Q29udGVudChodG1sXzNjZTBmZGIxNjUwODQ2MTg5ZjIxZTg0MDEzMDZjMzNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0MmZmMzk2MWYxZTQzODY5YTdlYjY0ZTRkYTEzNmZmLmJpbmRQb3B1cChwb3B1cF9hMDZjOGQ1NjgzNzQ0MWJjOGI5ZDI3MTY2M2U4NDUxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGZjMGFhOWM4ZmM0MzhmYjU4YTNhMGQwZjNmNGIxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ2YWNlNmM4ZWQwNGUxYzg4MDE5ODZkYTZlYzE5YzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVlZjQ4MDliNmZjNDgxNWIyNGNmZThkODFhY2M2YzkgPSAkKCc8ZGl2IGlkPSJodG1sX2RlZWY0ODA5YjZmYzQ4MTViMjRjZmU4ZDgxYWNjNmM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQ2YWNlNmM4ZWQwNGUxYzg4MDE5ODZkYTZlYzE5YzYuc2V0Q29udGVudChodG1sX2RlZWY0ODA5YjZmYzQ4MTViMjRjZmU4ZDgxYWNjNmM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0ZmMwYWE5YzhmYzQzOGZiNThhM2EwZDBmM2Y0YjFlLmJpbmRQb3B1cChwb3B1cF9mZDZhY2U2YzhlZDA0ZTFjODgwMTk4NmRhNmVjMTljNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTgwODRlMTcxM2M0ZDczYmRkZDFlY2IwZjJlYjdmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDk3NGYzNjgwZmEzNGQzYjgwOTUxMGY2N2ZjYmQzMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWYxMmI1MWJiYzEwNDUyMGFhOWVlNjc2NTQyZWNhMzYgPSAkKCc8ZGl2IGlkPSJodG1sX2FmMTJiNTFiYmMxMDQ1MjBhYTllZTY3NjU0MmVjYTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5NzRmMzY4MGZhMzRkM2I4MDk1MTBmNjdmY2JkMzA2LnNldENvbnRlbnQoaHRtbF9hZjEyYjUxYmJjMTA0NTIwYWE5ZWU2NzY1NDJlY2EzNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYTgwODRlMTcxM2M0ZDczYmRkZDFlY2IwZjJlYjdmYS5iaW5kUG9wdXAocG9wdXBfZDk3NGYzNjgwZmEzNGQzYjgwOTUxMGY2N2ZjYmQzMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjE3ZTUxODVjNjI4NDU4MDhlMGJlOGRlNGJkYThlZDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTFjNjAzYTM4NGEyNDY3N2ExMzcxNjM3NDczZmU1N2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQwOTljMjE5MzdjNGI5NThkYzc2YTI1NzZiY2I4ODkgPSAkKCc8ZGl2IGlkPSJodG1sX2JkMDk5YzIxOTM3YzRiOTU4ZGM3NmEyNTc2YmNiODg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExYzYwM2EzODRhMjQ2NzdhMTM3MTYzNzQ3M2ZlNTdhLnNldENvbnRlbnQoaHRtbF9iZDA5OWMyMTkzN2M0Yjk1OGRjNzZhMjU3NmJjYjg4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTdlNTE4NWM2Mjg0NTgwOGUwYmU4ZGU0YmRhOGVkNi5iaW5kUG9wdXAocG9wdXBfMTFjNjAzYTM4NGEyNDY3N2ExMzcxNjM3NDczZmU1N2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODQxNjQzNjI1NjU3NGNiZDlhNDUwODgwNzNhYzZjZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUzYTBmZTVjMDJhNGU3ZGI3MWVlMzBkMzlmMzBiNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWY2MjE2NjA2OTY1NDk5MWE1NDFmZWJlMDkyYmI4NjYgPSAkKCc8ZGl2IGlkPSJodG1sX2FmNjIxNjYwNjk2NTQ5OTFhNTQxZmViZTA5MmJiODY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTNhMGZlNWMwMmE0ZTdkYjcxZWUzMGQzOWYzMGI1NS5zZXRDb250ZW50KGh0bWxfYWY2MjE2NjA2OTY1NDk5MWE1NDFmZWJlMDkyYmI4NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODQxNjQzNjI1NjU3NGNiZDlhNDUwODgwNzNhYzZjZTYuYmluZFBvcHVwKHBvcHVwX2I1M2EwZmU1YzAyYTRlN2RiNzFlZTMwZDM5ZjMwYjU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwODM1NThhYTQ0ODRlMDJiODcwZjFkMGQ0MWFjZWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzNmFiZGM2MTIyYTRmMTI5MDAwNDNkYmU0OTIxOTI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0ZDk5MTFlMjZiNDRiY2M5YmRiM2FkZTllODc0NTJmID0gJCgnPGRpdiBpZD0iaHRtbF8yNGQ5OTExZTI2YjQ0YmNjOWJkYjNhZGU5ZTg3NDUyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MzZhYmRjNjEyMmE0ZjEyOTAwMDQzZGJlNDkyMTkyNC5zZXRDb250ZW50KGh0bWxfMjRkOTkxMWUyNmI0NGJjYzliZGIzYWRlOWU4NzQ1MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTA4MzU1OGFhNDQ4NGUwMmI4NzBmMWQwZDQxYWNlZmUuYmluZFBvcHVwKHBvcHVwXzQzNmFiZGM2MTIyYTRmMTI5MDAwNDNkYmU0OTIxOTI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjNzg2NGNlNmEzMjQ1ZTQ5OTgwZmU5MmRkY2MxNjk3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzOWYzNzZmYTBkNzQzYTg5YzgyYzdhZjkwNTZhZmY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwMWFjNmM0NjVkOTRhYzg4MWJkYWI0ZjQ3NjgwY2E1ID0gJCgnPGRpdiBpZD0iaHRtbF81MDFhYzZjNDY1ZDk0YWM4ODFiZGFiNGY0NzY4MGNhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM5ZjM3NmZhMGQ3NDNhODljODJjN2FmOTA1NmFmZjcuc2V0Q29udGVudChodG1sXzUwMWFjNmM0NjVkOTRhYzg4MWJkYWI0ZjQ3NjgwY2E1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjNzg2NGNlNmEzMjQ1ZTQ5OTgwZmU5MmRkY2MxNjk3LmJpbmRQb3B1cChwb3B1cF8wMzlmMzc2ZmEwZDc0M2E4OWM4MmM3YWY5MDU2YWZmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDkxY2Q5OTQ1MWI0YjM0YTYzN2NkNjZlZmVlYzgyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY1ZmMwODhmNzZkNDZmN2FhYmNmNzI2MjFhMzRiMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNiZTllMzE0YjlhNDE3ZTg5YmZmYmRkOWZmNWMxZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzEzYmU5ZTMxNGI5YTQxN2U4OWJmZmJkZDlmZjVjMWZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjVmYzA4OGY3NmQ0NmY3YWFiY2Y3MjYyMWEzNGIyNC5zZXRDb250ZW50KGh0bWxfMTNiZTllMzE0YjlhNDE3ZTg5YmZmYmRkOWZmNWMxZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzA5MWNkOTk0NTFiNGIzNGE2MzdjZDY2ZWZlZWM4MjQuYmluZFBvcHVwKHBvcHVwX2Q2NWZjMDg4Zjc2ZDQ2ZjdhYWJjZjcyNjIxYTM0YjI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyNzE4MDcwN2E2NTRhOWFhYmFmNmQ4NDNiMTIyMTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmNjMyMTI2OTc4MjQ4NjZiN2M0YjlkNzBhMTI0MDkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5MWUwZWZlOTY5ZDQ2ZjNiNzczMjUxZTgxYzM0MmQwID0gJCgnPGRpdiBpZD0iaHRtbF9lOTFlMGVmZTk2OWQ0NmYzYjc3MzI1MWU4MWMzNDJkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmNjMyMTI2OTc4MjQ4NjZiN2M0YjlkNzBhMTI0MDkzLnNldENvbnRlbnQoaHRtbF9lOTFlMGVmZTk2OWQ0NmYzYjc3MzI1MWU4MWMzNDJkMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MjcxODA3MDdhNjU0YTlhYWJhZjZkODQzYjEyMjEyYS5iaW5kUG9wdXAocG9wdXBfYmY2MzIxMjY5NzgyNDg2NmI3YzRiOWQ3MGExMjQwOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzZlZmUzZmY3ZmY2NGY4MGFjMGM1MWMxZjlmOGEyYTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YWRmMDAzYWIwZGU0MWFjOTJjY2I0MTliZDNjMzZmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NjgwMTBhYzVjZDg0MzQ3ODM3ZDZjY2ExNDUxNmRjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjY4MDEwYWM1Y2Q4NDM0NzgzN2Q2Y2NhMTQ1MTZkY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlhZGYwMDNhYjBkZTQxYWM5MmNjYjQxOWJkM2MzNmY2LnNldENvbnRlbnQoaHRtbF82NjgwMTBhYzVjZDg0MzQ3ODM3ZDZjY2ExNDUxNmRjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNmVmZTNmZjdmZjY0ZjgwYWMwYzUxYzFmOWY4YTJhNy5iaW5kUG9wdXAocG9wdXBfOWFkZjAwM2FiMGRlNDFhYzkyY2NiNDE5YmQzYzM2ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjM5ODkyNWNjZjU0NDBmZDg4NjcwNmNkMjg4MTRiNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmU3OTJlOWYxMGEzNDVkMGFkNjY1M2U5OTY5ZjMzYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWUzY2Q4YzJjZmQwNDUyZWJlNDVlODc0YjkzY2Q2YWMgPSAkKCc8ZGl2IGlkPSJodG1sXzVlM2NkOGMyY2ZkMDQ1MmViZTQ1ZTg3NGI5M2NkNmFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTc5MmU5ZjEwYTM0NWQwYWQ2NjUzZTk5NjlmMzNhNS5zZXRDb250ZW50KGh0bWxfNWUzY2Q4YzJjZmQwNDUyZWJlNDVlODc0YjkzY2Q2YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjM5ODkyNWNjZjU0NDBmZDg4NjcwNmNkMjg4MTRiNjguYmluZFBvcHVwKHBvcHVwXzJlNzkyZTlmMTBhMzQ1ZDBhZDY2NTNlOTk2OWYzM2E1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5NDJmYTc1Y2E1ODQ2NjZhMDdiYTcwNzQ0ZGIzMDM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTVjYjEyZGE0N2Y2NDk2MzkzYTQxOGRkNWZlOTY4NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWUxNGJkMzUxYmJkNDdiMmJmNjFmNmNjZjk1M2JmNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzVlMTRiZDM1MWJiZDQ3YjJiZjYxZjZjY2Y5NTNiZjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWNiMTJkYTQ3ZjY0OTYzOTNhNDE4ZGQ1ZmU5Njg3MC5zZXRDb250ZW50KGh0bWxfNWUxNGJkMzUxYmJkNDdiMmJmNjFmNmNjZjk1M2JmNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDk0MmZhNzVjYTU4NDY2NmEwN2JhNzA3NDRkYjMwMzcuYmluZFBvcHVwKHBvcHVwXzk1Y2IxMmRhNDdmNjQ5NjM5M2E0MThkZDVmZTk2ODcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1YTdhYTI2N2I1NzRjNWQ4NTQ4YmRhMjc2NGNlZWZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RhZDQ5ZWVkNTFiNGRiYWE2ZTJhM2E5YjhkMjg5MDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2M4YWY2YmJhZjVlNDk5M2JmNjcxYjgzOTk2NGRkNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzdjOGFmNmJiYWY1ZTQ5OTNiZjY3MWI4Mzk5NjRkZDVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYWQ0OWVlZDUxYjRkYmFhNmUyYTNhOWI4ZDI4OTA1LnNldENvbnRlbnQoaHRtbF83YzhhZjZiYmFmNWU0OTkzYmY2NzFiODM5OTY0ZGQ1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNWE3YWEyNjdiNTc0YzVkODU0OGJkYTI3NjRjZWVmZC5iaW5kUG9wdXAocG9wdXBfN2RhZDQ5ZWVkNTFiNGRiYWE2ZTJhM2E5YjhkMjg5MDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2MyZGM1MWI2MWQzNDA4NTgyZWU0ZGUzMmM2NGM2N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjllNDE5MTdjMTBjNDkxMmI1ZWFmNTEyMzZkNTY5NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTgzYWI0MmM5NDMzNDViNmIzNDFkZjc2ODNhY2YzMzQgPSAkKCc8ZGl2IGlkPSJodG1sX2U4M2FiNDJjOTQzMzQ1YjZiMzQxZGY3NjgzYWNmMzM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5ZTQxOTE3YzEwYzQ5MTJiNWVhZjUxMjM2ZDU2OTczLnNldENvbnRlbnQoaHRtbF9lODNhYjQyYzk0MzM0NWI2YjM0MWRmNzY4M2FjZjMzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYzJkYzUxYjYxZDM0MDg1ODJlZTRkZTMyYzY0YzY3Yy5iaW5kUG9wdXAocG9wdXBfYjllNDE5MTdjMTBjNDkxMmI1ZWFmNTEyMzZkNTY5NzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTU4NjZhNmEwYTUwNDU5MDhjNjA4YjViYWQ4N2Q5MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTU1NzU5NWE1YjA3NGE0YTg5MDI2OWI5M2I3ODU3ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWViMTQwYzFlNWVkNDlmYjk1OTI0MDY4MDNmZmVlN2MgPSAkKCc8ZGl2IGlkPSJodG1sX2VlYjE0MGMxZTVlZDQ5ZmI5NTkyNDA2ODAzZmZlZTdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTU1NzU5NWE1YjA3NGE0YTg5MDI2OWI5M2I3ODU3ZmUuc2V0Q29udGVudChodG1sX2VlYjE0MGMxZTVlZDQ5ZmI5NTkyNDA2ODAzZmZlZTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU1ODY2YTZhMGE1MDQ1OTA4YzYwOGI1YmFkODdkOTEwLmJpbmRQb3B1cChwb3B1cF9hNTU3NTk1YTViMDc0YTRhODkwMjY5YjkzYjc4NTdmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YTI5OTczNzQ4NGQ0MTRmOTE2YzBkNWU2ODkxNjczYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzMjJkOGI5MWNlYjQyZDc5ZjJhZTYxM2I5ZThjNDQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlNThkNTYzMjg5NTRiMmE4MjM5NzE3Y2FkZjUyMWJiID0gJCgnPGRpdiBpZD0iaHRtbF9jZTU4ZDU2MzI4OTU0YjJhODIzOTcxN2NhZGY1MjFiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMzIyZDhiOTFjZWI0MmQ3OWYyYWU2MTNiOWU4YzQ0NC5zZXRDb250ZW50KGh0bWxfY2U1OGQ1NjMyODk1NGIyYTgyMzk3MTdjYWRmNTIxYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmEyOTk3Mzc0ODRkNDE0ZjkxNmMwZDVlNjg5MTY3M2EuYmluZFBvcHVwKHBvcHVwXzIzMjJkOGI5MWNlYjQyZDc5ZjJhZTYxM2I5ZThjNDQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyY2QxODEwZWQyNjRmMzBiMGI5Nzc2ZDllMjg5NTE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmU2YTJkOTQ1MjUzNDAzMWFlYTUxYjVjZGRlYTE4MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGQ1NzdlMTljZTg5NDA1OTliNzJlYzVhMGNmMzQzOWYgPSAkKCc8ZGl2IGlkPSJodG1sXzRkNTc3ZTE5Y2U4OTQwNTk5YjcyZWM1YTBjZjM0MzlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZTZhMmQ5NDUyNTM0MDMxYWVhNTFiNWNkZGVhMTgwMS5zZXRDb250ZW50KGh0bWxfNGQ1NzdlMTljZTg5NDA1OTliNzJlYzVhMGNmMzQzOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDJjZDE4MTBlZDI2NGYzMGIwYjk3NzZkOWUyODk1MTcuYmluZFBvcHVwKHBvcHVwX2JlNmEyZDk0NTI1MzQwMzFhZWE1MWI1Y2RkZWExODAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4NTUxZTk4OWMzMjQwZWViNTUzMDJmNDM1MDAzOGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4OGRhM2Y0MzZlNTQ0NjM4MjllMGVhMWQ5NzI5ZWM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlYWUxYzhiNWFkNDQ5MDk4YmUwOGFjYWE1MTc2ZDExID0gJCgnPGRpdiBpZD0iaHRtbF9mZWFlMWM4YjVhZDQ0OTA5OGJlMDhhY2FhNTE3NmQxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4OGRhM2Y0MzZlNTQ0NjM4MjllMGVhMWQ5NzI5ZWM0LnNldENvbnRlbnQoaHRtbF9mZWFlMWM4YjVhZDQ0OTA5OGJlMDhhY2FhNTE3NmQxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODU1MWU5ODljMzI0MGVlYjU1MzAyZjQzNTAwMzhlMC5iaW5kUG9wdXAocG9wdXBfYzg4ZGEzZjQzNmU1NDQ2MzgyOWUwZWExZDk3MjllYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2E5MmM5ZGQzYmM2NGFmMzk3MGQxNmIxZjNlNjY3MTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyNGU2NTk1ZDBjODRlYTY5MGEyNjU3NjcwYWFiMzJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2MGQ4MjBkM2MyYzRhMGRhY2JkOTIwNDU1YWIzY2E3ID0gJCgnPGRpdiBpZD0iaHRtbF9mNjBkODIwZDNjMmM0YTBkYWNiZDkyMDQ1NWFiM2NhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjI0ZTY1OTVkMGM4NGVhNjkwYTI2NTc2NzBhYWIzMmEuc2V0Q29udGVudChodG1sX2Y2MGQ4MjBkM2MyYzRhMGRhY2JkOTIwNDU1YWIzY2E3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhOTJjOWRkM2JjNjRhZjM5NzBkMTZiMWYzZTY2NzExLmJpbmRQb3B1cChwb3B1cF82MjRlNjU5NWQwYzg0ZWE2OTBhMjY1NzY3MGFhYjMyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YTIzNjBkNzYyMTc0Y2U1OTZlOWY5ODJiYmVjOWQwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5MWQ0OTM5ODliMzQyNDJhYjE5MTgxMDg5ZmY1NjBlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjYTQ4NDg3ODA3ZjRmZGY4ODIwOWU1NGM5ZDU4ZjA5ID0gJCgnPGRpdiBpZD0iaHRtbF9hY2E0ODQ4NzgwN2Y0ZmRmODgyMDllNTRjOWQ1OGYwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTkxZDQ5Mzk4OWIzNDI0MmFiMTkxODEwODlmZjU2MGUuc2V0Q29udGVudChodG1sX2FjYTQ4NDg3ODA3ZjRmZGY4ODIwOWU1NGM5ZDU4ZjA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlhMjM2MGQ3NjIxNzRjZTU5NmU5Zjk4MmJiZWM5ZDBiLmJpbmRQb3B1cChwb3B1cF8xOTFkNDkzOTg5YjM0MjQyYWIxOTE4MTA4OWZmNTYwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZjE3MWMxNDc3ZTY0NWI4YjJlOGM2ZmQyYTljYWQ5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGY1NGFhNTgwNzNmNDdlNDhhNDdhMjBmYzAwOTJlODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTFkNjYyYTg2Y2JlNDdlNDgwNWFiNzc4M2RmYWJjMTUgPSAkKCc8ZGl2IGlkPSJodG1sX2ExZDY2MmE4NmNiZTQ3ZTQ4MDVhYjc3ODNkZmFiYzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmNTRhYTU4MDczZjQ3ZTQ4YTQ3YTIwZmMwMDkyZTg5LnNldENvbnRlbnQoaHRtbF9hMWQ2NjJhODZjYmU0N2U0ODA1YWI3NzgzZGZhYmMxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZjE3MWMxNDc3ZTY0NWI4YjJlOGM2ZmQyYTljYWQ5Yi5iaW5kUG9wdXAocG9wdXBfOGY1NGFhNTgwNzNmNDdlNDhhNDdhMjBmYzAwOTJlODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzEyMGY5YTZjZDdjNDU4MmEyOTZmYWYwODFhYTYzNWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGYwZDkyM2QxYWE5NDk4NThiYTQ1MDg2Y2Q3MTU2MTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2NjYTViZjBkZTMwNDQxNDhmY2U5ZTYwMmE5MjJhOTYgPSAkKCc8ZGl2IGlkPSJodG1sXzdjY2E1YmYwZGUzMDQ0MTQ4ZmNlOWU2MDJhOTIyYTk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZjBkOTIzZDFhYTk0OTg1OGJhNDUwODZjZDcxNTYxOC5zZXRDb250ZW50KGh0bWxfN2NjYTViZjBkZTMwNDQxNDhmY2U5ZTYwMmE5MjJhOTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzEyMGY5YTZjZDdjNDU4MmEyOTZmYWYwODFhYTYzNWQuYmluZFBvcHVwKHBvcHVwX2RmMGQ5MjNkMWFhOTQ5ODU4YmE0NTA4NmNkNzE1NjE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzMGZiOWY5ZmExYjQ1YjQ5MTM4YjBmODg5MmMwZmM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0YTcxODMwMzc2MTRjOWJiNDg4NDE1NzQ3YjRkNjJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwOTNhMWFhM2YzYzQwZGE5N2MwMmJkOTIxN2RkMzg2ID0gJCgnPGRpdiBpZD0iaHRtbF9lMDkzYTFhYTNmM2M0MGRhOTdjMDJiZDkyMTdkZDM4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGE3MTgzMDM3NjE0YzliYjQ4ODQxNTc0N2I0ZDYyYi5zZXRDb250ZW50KGh0bWxfZTA5M2ExYWEzZjNjNDBkYTk3YzAyYmQ5MjE3ZGQzODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjMwZmI5ZjlmYTFiNDViNDkxMzhiMGY4ODkyYzBmYzYuYmluZFBvcHVwKHBvcHVwXzQ0YTcxODMwMzc2MTRjOWJiNDg4NDE1NzQ3YjRkNjJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiOTgwMmM0NGM0NDRjMWVhZGQxZTIzZjNlY2Y4MTgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxMTBkMjA0OGE0MzQwYmNiNzRkNGUxZmEyMzg5NjFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4ZmIyOWYzNmY2YjQ1OTQ5NzM5MTgzOWI0NDA2OWYwID0gJCgnPGRpdiBpZD0iaHRtbF81OGZiMjlmMzZmNmI0NTk0OTczOTE4MzliNDQwNjlmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxMTBkMjA0OGE0MzQwYmNiNzRkNGUxZmEyMzg5NjFhLnNldENvbnRlbnQoaHRtbF81OGZiMjlmMzZmNmI0NTk0OTczOTE4MzliNDQwNjlmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYjk4MDJjNDRjNDQ0YzFlYWRkMWUyM2YzZWNmODE4My5iaW5kUG9wdXAocG9wdXBfYzExMGQyMDQ4YTQzNDBiY2I3NGQ0ZTFmYTIzODk2MWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzhmYjdjOGI0Mzk2NDhkYWJmMjU5NzZhNWMwOTBhMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyOWMyM2M1YzBjNDRiMzRhZWI0YTE1NTE4Yzc2YjIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllODc4Yzg3YjI0YTQ4NGU5MGE0ZjBlZWQ4MWY3YmI3ID0gJCgnPGRpdiBpZD0iaHRtbF85ZTg3OGM4N2IyNGE0ODRlOTBhNGYwZWVkODFmN2JiNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjljMjNjNWMwYzQ0YjM0YWViNGExNTUxOGM3NmIyMi5zZXRDb250ZW50KGh0bWxfOWU4NzhjODdiMjRhNDg0ZTkwYTRmMGVlZDgxZjdiYjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzhmYjdjOGI0Mzk2NDhkYWJmMjU5NzZhNWMwOTBhMTUuYmluZFBvcHVwKHBvcHVwXzEyOWMyM2M1YzBjNDRiMzRhZWI0YTE1NTE4Yzc2YjIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhMzA1ZDczNGRkYjQ1ZTZiM2FlZGYxNzUzYWI4YmFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDIyZTgwMjdkNDQ2NGM1Nzk5ODc5OTIxMmYzZGE4YmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGYyOWNlMTI0MzA4NDM1ZTlhMmE5NWZiOTQxZTNiZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzhmMjljZTEyNDMwODQzNWU5YTJhOTVmYjk0MWUzYmZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyMmU4MDI3ZDQ0NjRjNTc5OTg3OTkyMTJmM2RhOGJhLnNldENvbnRlbnQoaHRtbF84ZjI5Y2UxMjQzMDg0MzVlOWEyYTk1ZmI5NDFlM2JmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYTMwNWQ3MzRkZGI0NWU2YjNhZWRmMTc1M2FiOGJhYi5iaW5kUG9wdXAocG9wdXBfZDIyZTgwMjdkNDQ2NGM1Nzk5ODc5OTIxMmYzZGE4YmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTJhZDIzNDVmNjVlNDVmMThkMTA3YjE0ZGZlNjI5NjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGQ3ZWRlYjYyNTE0NDcyY2I2OTk4YjI3YmU2YzY5OTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2ZjYjIxZGE1ZjZmNDc1ZThkYmRmMDYzMGUwYzZiZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzdmY2IyMWRhNWY2ZjQ3NWU4ZGJkZjA2MzBlMGM2YmRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDdlZGViNjI1MTQ0NzJjYjY5OThiMjdiZTZjNjk5NS5zZXRDb250ZW50KGh0bWxfN2ZjYjIxZGE1ZjZmNDc1ZThkYmRmMDYzMGUwYzZiZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTJhZDIzNDVmNjVlNDVmMThkMTA3YjE0ZGZlNjI5NjIuYmluZFBvcHVwKHBvcHVwXzhkN2VkZWI2MjUxNDQ3MmNiNjk5OGIyN2JlNmM2OTk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4NzA2Mzk3YTQxYzQ3MDRhN2U1MDhmZDIwNjAyMDg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyZDM3ZDA3MzRjNzQ2Mzc4YzAzZjVlZGQ3MDZkNDYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1YTI5MDc4YzYzZDQxZGNiMzYxZGZiNTc1ZTU4NDhiID0gJCgnPGRpdiBpZD0iaHRtbF85NWEyOTA3OGM2M2Q0MWRjYjM2MWRmYjU3NWU1ODQ4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyZDM3ZDA3MzRjNzQ2Mzc4YzAzZjVlZGQ3MDZkNDYzLnNldENvbnRlbnQoaHRtbF85NWEyOTA3OGM2M2Q0MWRjYjM2MWRmYjU3NWU1ODQ4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODcwNjM5N2E0MWM0NzA0YTdlNTA4ZmQyMDYwMjA4Ny5iaW5kUG9wdXAocG9wdXBfMTJkMzdkMDczNGM3NDYzNzhjMDNmNWVkZDcwNmQ0NjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWRiZmYzNjgxOGRmNGUwY2FjMDU0MTQ4MWEyZGIyMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTU0YmZlNTFhNzVlNDEwODlkZDYzNjA3Njg0OTYzMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDRjNDc5NWUyNTg2NGE5NGI2NTIyZDYyOTMwMzVkODAgPSAkKCc8ZGl2IGlkPSJodG1sXzA0YzQ3OTVlMjU4NjRhOTRiNjUyMmQ2MjkzMDM1ZDgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1NGJmZTUxYTc1ZTQxMDg5ZGQ2MzYwNzY4NDk2MzBmLnNldENvbnRlbnQoaHRtbF8wNGM0Nzk1ZTI1ODY0YTk0YjY1MjJkNjI5MzAzNWQ4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZGJmZjM2ODE4ZGY0ZTBjYWMwNTQxNDgxYTJkYjIxZC5iaW5kUG9wdXAocG9wdXBfOTU0YmZlNTFhNzVlNDEwODlkZDYzNjA3Njg0OTYzMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTFhMDNhY2RmMDQxNDk3OGFiYjdkZDI3OGU1YjNkMGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTA1ODczNmUxNmY4NGM1YmIyOWMyNzRmYjdlYmJhMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDMzNWZjNmQyMWJjNDA4NGJlMTM3NzM2OWJkZWVlODAgPSAkKCc8ZGl2IGlkPSJodG1sX2QzMzVmYzZkMjFiYzQwODRiZTEzNzczNjliZGVlZTgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTA1ODczNmUxNmY4NGM1YmIyOWMyNzRmYjdlYmJhMjIuc2V0Q29udGVudChodG1sX2QzMzVmYzZkMjFiYzQwODRiZTEzNzczNjliZGVlZTgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UxYTAzYWNkZjA0MTQ5NzhhYmI3ZGQyNzhlNWIzZDBjLmJpbmRQb3B1cChwb3B1cF8xMDU4NzM2ZTE2Zjg0YzViYjI5YzI3NGZiN2ViYmEyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZmIxY2ZhYzJmMTY0MjMxOGU3ZTg0ZmI4NmRjMjAwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTk4NGYwZTE0Y2U0ZjBkOTEwOWFjOWUwNTFlMmM1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDBhMGQxNTEyMWE0MmM4OWFhNDQwMmFlOGJmZjdkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQwYTBkMTUxMjFhNDJjODlhYTQ0MDJhZThiZmY3ZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmU5ODRmMGUxNGNlNGYwZDkxMDlhYzllMDUxZTJjNTMuc2V0Q29udGVudChodG1sX2Y0MGEwZDE1MTIxYTQyYzg5YWE0NDAyYWU4YmZmN2QxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFmYjFjZmFjMmYxNjQyMzE4ZTdlODRmYjg2ZGMyMDA4LmJpbmRQb3B1cChwb3B1cF8yZTk4NGYwZTE0Y2U0ZjBkOTEwOWFjOWUwNTFlMmM1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZjRlNzQ4YjJkOTc0OWJkODQyNTA1MDI2NDMyMzgyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljZTIwMDUyYWQwYTRmNDFhMjRmNjIwNWQ0M2E4ZWYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhMGRkZDExYmQxNTQwMzlhMDM0YWM2NzExMmRhYzViID0gJCgnPGRpdiBpZD0iaHRtbF8yYTBkZGQxMWJkMTU0MDM5YTAzNGFjNjcxMTJkYWM1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljZTIwMDUyYWQwYTRmNDFhMjRmNjIwNWQ0M2E4ZWYyLnNldENvbnRlbnQoaHRtbF8yYTBkZGQxMWJkMTU0MDM5YTAzNGFjNjcxMTJkYWM1Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjRlNzQ4YjJkOTc0OWJkODQyNTA1MDI2NDMyMzgyZS5iaW5kUG9wdXAocG9wdXBfOWNlMjAwNTJhZDBhNGY0MWEyNGY2MjA1ZDQzYThlZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmU5MGQ2YjA2NmQxNDRiNGFmMGU0MjJjNWY1OTBkODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVjYjIwMDM1ZmY2NGMzMWFhODAxODM3ZGVmYTMzZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjc4NTI5OTg3OTUwNDVkMWE3NWVhMTlkNjg3ZWQ3MTMgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3ODUyOTk4Nzk1MDQ1ZDFhNzVlYTE5ZDY4N2VkNzEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1Y2IyMDAzNWZmNjRjMzFhYTgwMTgzN2RlZmEzM2QyLnNldENvbnRlbnQoaHRtbF9mNzg1Mjk5ODc5NTA0NWQxYTc1ZWExOWQ2ODdlZDcxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZTkwZDZiMDY2ZDE0NGI0YWYwZTQyMmM1ZjU5MGQ4Ny5iaW5kUG9wdXAocG9wdXBfNzVjYjIwMDM1ZmY2NGMzMWFhODAxODM3ZGVmYTMzZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDUwYjY3ZDZhYjVkNDQ3NjkyMWI1NDBkZDVjZDdlMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyYzhlYzAyZGZkMjQ3ZTRhNzRlOTE3ZTY1OWZiN2FmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1OWJjODIzNjc3YjRlMDk5MzA5Yzc3NTE0YjkyOGIzID0gJCgnPGRpdiBpZD0iaHRtbF8yNTliYzgyMzY3N2I0ZTA5OTMwOWM3NzUxNGI5MjhiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMmM4ZWMwMmRmZDI0N2U0YTc0ZTkxN2U2NTlmYjdhZi5zZXRDb250ZW50KGh0bWxfMjU5YmM4MjM2NzdiNGUwOTkzMDljNzc1MTRiOTI4YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDUwYjY3ZDZhYjVkNDQ3NjkyMWI1NDBkZDVjZDdlMTIuYmluZFBvcHVwKHBvcHVwXzEyYzhlYzAyZGZkMjQ3ZTRhNzRlOTE3ZTY1OWZiN2FmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyNzkwZjVkYjljMTRhMmVhMGZjMWQ1YTUyYTNkZGFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmYjhlNzZjZGVmYjQ1Mjg5NzZkZTJmNjNhMWM0YzMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3YTlhMWFhYjY4YjRhNDViOGE4NjhhNjQyZWUwNmYxID0gJCgnPGRpdiBpZD0iaHRtbF81N2E5YTFhYWI2OGI0YTQ1YjhhODY4YTY0MmVlMDZmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmYjhlNzZjZGVmYjQ1Mjg5NzZkZTJmNjNhMWM0YzMyLnNldENvbnRlbnQoaHRtbF81N2E5YTFhYWI2OGI0YTQ1YjhhODY4YTY0MmVlMDZmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjc5MGY1ZGI5YzE0YTJlYTBmYzFkNWE1MmEzZGRhZS5iaW5kUG9wdXAocG9wdXBfN2ZiOGU3NmNkZWZiNDUyODk3NmRlMmY2M2ExYzRjMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTgzM2Y5OTlkZDY3NDFmMjk1ZjliN2NmNThiMDk2NTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFhYmVmZjRmMDEwNGJmY2IzNjRkMDE2YjkxM2E0YzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjJlNGFjMTZiOWI3NDI4ZGExMGYzNTZiNzBjNmY5OWMgPSAkKCc8ZGl2IGlkPSJodG1sX2IyZTRhYzE2YjliNzQyOGRhMTBmMzU2YjcwYzZmOTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFhYmVmZjRmMDEwNGJmY2IzNjRkMDE2YjkxM2E0YzUuc2V0Q29udGVudChodG1sX2IyZTRhYzE2YjliNzQyOGRhMTBmMzU2YjcwYzZmOTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4MzNmOTk5ZGQ2NzQxZjI5NWY5YjdjZjU4YjA5NjU0LmJpbmRQb3B1cChwb3B1cF9iYWFiZWZmNGYwMTA0YmZjYjM2NGQwMTZiOTEzYTRjNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDMwMWQ5Yzk3MjE0ZjgxYjhjY2RlMGY5ZThkMTBkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNDI1MjExNzc0NDQ0MjQ2YjcxNjBlODY1YTRmZTMzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYjhiN2MxODcyZGI0YzVmYjk3NDVjODc1NjI3NTE2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmI4YjdjMTg3MmRiNGM1ZmI5NzQ1Yzg3NTYyNzUxNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNDI1MjExNzc0NDQ0MjQ2YjcxNjBlODY1YTRmZTMzZi5zZXRDb250ZW50KGh0bWxfMmI4YjdjMTg3MmRiNGM1ZmI5NzQ1Yzg3NTYyNzUxNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2QzMDFkOWM5NzIxNGY4MWI4Y2NkZTBmOWU4ZDEwZDEuYmluZFBvcHVwKHBvcHVwX2I0MjUyMTE3NzQ0NDQyNDZiNzE2MGU4NjVhNGZlMzNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3MWQyZDg0YmI3NDRkMDA5MjcyODk1NDUzNjZiZWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTE3MTc2ZDk4NjM0NDIxOTU2MzEzMWM4MGZkMjU0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMDM2N2VlZGI3MGU0N2U0YTM2ZmFlYjcyYTgzNTU4YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjAzNjdlZWRiNzBlNDdlNGEzNmZhZWI3MmE4MzU1OGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzUxNzE3NmQ5ODYzNDQyMTk1NjMxMzFjODBmZDI1NDguc2V0Q29udGVudChodG1sXzIwMzY3ZWVkYjcwZTQ3ZTRhMzZmYWViNzJhODM1NThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M3MWQyZDg0YmI3NDRkMDA5MjcyODk1NDUzNjZiZWQyLmJpbmRQb3B1cChwb3B1cF83NTE3MTc2ZDk4NjM0NDIxOTU2MzEzMWM4MGZkMjU0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDYxYzg2NWM2MmU0ZmE0OTlkMTRhY2QwNzVmNTU4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MjZmZThkNDg2NWM0OGFjODE1YTRmMzU1YWY3ZTdlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNDQyMWZhZmY4NzE0YmE1OWM2ZmQxN2I2YTkzMzE4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzQ0MjFmYWZmODcxNGJhNTljNmZkMTdiNmE5MzMxODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTI2ZmU4ZDQ4NjVjNDhhYzgxNWE0ZjM1NWFmN2U3ZWEuc2V0Q29udGVudChodG1sXzM0NDIxZmFmZjg3MTRiYTU5YzZmZDE3YjZhOTMzMTg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwNjFjODY1YzYyZTRmYTQ5OWQxNGFjZDA3NWY1NTgyLmJpbmRQb3B1cChwb3B1cF85MjZmZThkNDg2NWM0OGFjODE1YTRmMzU1YWY3ZTdlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTlmZGRkZjFmNGE0ZjUxOTY0MGE3Mzg4ZTI2MjdjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDRjZjY5MWQ1NWMxNDU2NGFlMDA0ZDY3MjUxZWE5NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGU1ODc0MDk0NjcyNGY4MzlkODQ3ZTNmZWQ0MjBlYzkgPSAkKCc8ZGl2IGlkPSJodG1sXzRlNTg3NDA5NDY3MjRmODM5ZDg0N2UzZmVkNDIwZWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0Y2Y2OTFkNTVjMTQ1NjRhZTAwNGQ2NzI1MWVhOTRmLnNldENvbnRlbnQoaHRtbF80ZTU4NzQwOTQ2NzI0ZjgzOWQ4NDdlM2ZlZDQyMGVjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTlmZGRkZjFmNGE0ZjUxOTY0MGE3Mzg4ZTI2MjdjYy5iaW5kUG9wdXAocG9wdXBfMDRjZjY5MWQ1NWMxNDU2NGFlMDA0ZDY3MjUxZWE5NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTAzOWI1MzU2YjRmNDVhZWI3YjJhYzBhNDkyMjU0YzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjg5NjRjNTQ5ZWMyNGRhN2I1NmU2NmY2ZjkzOTgyMmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzFkY2JmMjk1N2UxNGMwYmI3YTc3MDI0MDliMjNjMjAgPSAkKCc8ZGl2IGlkPSJodG1sXzcxZGNiZjI5NTdlMTRjMGJiN2E3NzAyNDA5YjIzYzIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg5NjRjNTQ5ZWMyNGRhN2I1NmU2NmY2ZjkzOTgyMmUuc2V0Q29udGVudChodG1sXzcxZGNiZjI5NTdlMTRjMGJiN2E3NzAyNDA5YjIzYzIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwMzliNTM1NmI0ZjQ1YWViN2IyYWMwYTQ5MjI1NGM4LmJpbmRQb3B1cChwb3B1cF8yODk2NGM1NDllYzI0ZGE3YjU2ZTY2ZjZmOTM5ODIyZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTZiODZiZjBmYjY0OGM1YjRiZjBhNzY0MmJkNzMyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDlhNWYwZWU4Mzk0NjU1OTM0MzM5YmE0MmE1OTYwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzUwMjY5MjQ1MGU0YmI0YTg1ZThlNTE5YThlOTY4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjc1MDI2OTI0NTBlNGJiNGE4NWU4ZTUxOWE4ZTk2ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwOWE1ZjBlZTgzOTQ2NTU5MzQzMzliYTQyYTU5NjBmLnNldENvbnRlbnQoaHRtbF9iNzUwMjY5MjQ1MGU0YmI0YTg1ZThlNTE5YThlOTY4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTZiODZiZjBmYjY0OGM1YjRiZjBhNzY0MmJkNzMyNS5iaW5kUG9wdXAocG9wdXBfZTA5YTVmMGVlODM5NDY1NTkzNDMzOWJhNDJhNTk2MGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjBhN2Q4OGI3NWEwNDhiMTk1YjMwZjAyMjlkZTJhYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZhNDU0NDkyNzIwNGMwMmEyOWEwMWZlNWRmYmEwY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjU1NWQ5ZDc4MDA3NGU5Njk2YTVlNzNmYzdkMzY1MGQgPSAkKCc8ZGl2IGlkPSJodG1sXzI1NTVkOWQ3ODAwNzRlOTY5NmE1ZTczZmM3ZDM2NTBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNmE0NTQ0OTI3MjA0YzAyYTI5YTAxZmU1ZGZiYTBjYy5zZXRDb250ZW50KGh0bWxfMjU1NWQ5ZDc4MDA3NGU5Njk2YTVlNzNmYzdkMzY1MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjBhN2Q4OGI3NWEwNDhiMTk1YjMwZjAyMjlkZTJhYjEuYmluZFBvcHVwKHBvcHVwXzM2YTQ1NDQ5MjcyMDRjMDJhMjlhMDFmZTVkZmJhMGNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2NDE4YzJkZDFhZjQ3YTdhMTVkZWI4ODZlMWEwNDVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjNmM1ZDE1YjM1NDRhMDZiYTRiNGQ0ZDk2YzhjOTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjODljZmY4NWJhMDRiYWM5YzczNGFkYjliMGIxZDg0ID0gJCgnPGRpdiBpZD0iaHRtbF9iYzg5Y2ZmODViYTA0YmFjOWM3MzRhZGI5YjBiMWQ4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzZjNWQxNWIzNTQ0YTA2YmE0YjRkNGQ5NmM4YzkxYy5zZXRDb250ZW50KGh0bWxfYmM4OWNmZjg1YmEwNGJhYzljNzM0YWRiOWIwYjFkODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjY0MThjMmRkMWFmNDdhN2ExNWRlYjg4NmUxYTA0NWYuYmluZFBvcHVwKHBvcHVwX2VjNmM1ZDE1YjM1NDRhMDZiYTRiNGQ0ZDk2YzhjOTFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA0ODk0Y2I2YmY2ZjQzNTZhYzIwODc5YmE0MDg3MGRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzNGJkZGQyYTMzOTRmMTFhYmFjNDVhN2U5YWVkODA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjOTQwOWM2YjE2MjRlY2M4OWY4OTUzZWU1Yjk5NzY5ID0gJCgnPGRpdiBpZD0iaHRtbF9mYzk0MDljNmIxNjI0ZWNjODlmODk1M2VlNWI5OTc2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjM0YmRkZDJhMzM5NGYxMWFiYWM0NWE3ZTlhZWQ4MDkuc2V0Q29udGVudChodG1sX2ZjOTQwOWM2YjE2MjRlY2M4OWY4OTUzZWU1Yjk5NzY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0ODk0Y2I2YmY2ZjQzNTZhYzIwODc5YmE0MDg3MGRkLmJpbmRQb3B1cChwb3B1cF9iMzRiZGRkMmEzMzk0ZjExYWJhYzQ1YTdlOWFlZDgwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNWQ3OGVhZWQ5NWU0MWI0OTJhZWVjZTdkYTdlNTQ3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNmExYTY4ZDVlYmE0MzgwOTM2OGYwYzYxMmMzMTdjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTQzMTc1YWVmM2I0ZmJmYjk2MmRhMDAzYzY4NWIzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWU0MzE3NWFlZjNiNGZiZmI5NjJkYTAwM2M2ODViM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2YTFhNjhkNWViYTQzODA5MzY4ZjBjNjEyYzMxN2M2LnNldENvbnRlbnQoaHRtbF85ZTQzMTc1YWVmM2I0ZmJmYjk2MmRhMDAzYzY4NWIzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNWQ3OGVhZWQ5NWU0MWI0OTJhZWVjZTdkYTdlNTQ3My5iaW5kUG9wdXAocG9wdXBfMTZhMWE2OGQ1ZWJhNDM4MDkzNjhmMGM2MTJjMzE3YzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWYxY2EwNDk1ZTgxNDgyZDhmZDBkZTU1ZTEyODgzZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQxOTQ5NWRmYjMxNGQxZWJhMzU1MzU3MjZiODBhZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTVhOTA0OGFhMmIwNDdmYmIwZmQxN2NkM2RiZGRmZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzE1YTkwNDhhYTJiMDQ3ZmJiMGZkMTdjZDNkYmRkZmZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQxOTQ5NWRmYjMxNGQxZWJhMzU1MzU3MjZiODBhZWQuc2V0Q29udGVudChodG1sXzE1YTkwNDhhYTJiMDQ3ZmJiMGZkMTdjZDNkYmRkZmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFmMWNhMDQ5NWU4MTQ4MmQ4ZmQwZGU1NWUxMjg4M2YxLmJpbmRQb3B1cChwb3B1cF9mZDE5NDk1ZGZiMzE0ZDFlYmEzNTUzNTcyNmI4MGFlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Mjk4ZWNkOWVkNjU0YTIwODhlZTYzNjYzNmY5MmY0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jY2UzMzE5NTE3MTg0NjdlYWZhODY0OGYzYjdkMWU1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYTJkNGU4NDA3OGE0MzM3ODYxMzhjMDlmZGI4NWM2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2EyZDRlODQwNzhhNDMzNzg2MTM4YzA5ZmRiODVjNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2NlMzMxOTUxNzE4NDY3ZWFmYTg2NDhmM2I3ZDFlNWQuc2V0Q29udGVudChodG1sXzNhMmQ0ZTg0MDc4YTQzMzc4NjEzOGMwOWZkYjg1YzY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyOThlY2Q5ZWQ2NTRhMjA4OGVlNjM2NjM2ZjkyZjQyLmJpbmRQb3B1cChwb3B1cF9jY2UzMzE5NTE3MTg0NjdlYWZhODY0OGYzYjdkMWU1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDIzMzI0NzNlZDc0Yzg2ODllNDU5OWMwZjE0MmNlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiNDc1MjQwNTdkYTQzMjhiNmY1MTFiNzZhMDFmZjA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyNDlhMWQwMTdiYjRhYWY5ZjhjNzQ0ZTc3YTMyMWM4ID0gJCgnPGRpdiBpZD0iaHRtbF9mMjQ5YTFkMDE3YmI0YWFmOWY4Yzc0NGU3N2EzMjFjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjQ3NTI0MDU3ZGE0MzI4YjZmNTExYjc2YTAxZmYwOS5zZXRDb250ZW50KGh0bWxfZjI0OWExZDAxN2JiNGFhZjlmOGM3NDRlNzdhMzIxYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzAyMzMyNDczZWQ3NGM4Njg5ZTQ1OTljMGYxNDJjZWEuYmluZFBvcHVwKHBvcHVwXzNiNDc1MjQwNTdkYTQzMjhiNmY1MTFiNzZhMDFmZjA5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczY2FmZDdiZWQzYTRkZjA5OGM0YTc0YmU4MzBmYjI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwMjlkMjkwYTIwNzQwNmY4NjJiNWNiZDM3MWVkZDU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5OWJiNDg1ZDIxMTRlMDk4NmRkZmQxYzE1YjZiZDkyID0gJCgnPGRpdiBpZD0iaHRtbF81OTliYjQ4NWQyMTE0ZTA5ODZkZGZkMWMxNWI2YmQ5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTAyOWQyOTBhMjA3NDA2Zjg2MmI1Y2JkMzcxZWRkNTkuc2V0Q29udGVudChodG1sXzU5OWJiNDg1ZDIxMTRlMDk4NmRkZmQxYzE1YjZiZDkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczY2FmZDdiZWQzYTRkZjA5OGM0YTc0YmU4MzBmYjI1LmJpbmRQb3B1cChwb3B1cF9hMDI5ZDI5MGEyMDc0MDZmODYyYjVjYmQzNzFlZGQ1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjU2YzQwOWZjNjA0ZDgzOTgyMmQ0NjdlYTBkZGJlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTU1NGNkODFjYTI0NmY2OTkwYWIxYzhlMDNhYWVkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMDg0MTAyYjQ1ODQ0YzAzODdjODg4YmZhNWVlNmFkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjA4NDEwMmI0NTg0NGMwMzg3Yzg4OGJmYTVlZTZhZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTU1NGNkODFjYTI0NmY2OTkwYWIxYzhlMDNhYWVkZS5zZXRDb250ZW50KGh0bWxfZjA4NDEwMmI0NTg0NGMwMzg3Yzg4OGJmYTVlZTZhZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjI1NmM0MDlmYzYwNGQ4Mzk4MjJkNDY3ZWEwZGRiZWYuYmluZFBvcHVwKHBvcHVwX2FhNTU0Y2Q4MWNhMjQ2ZjY5OTBhYjFjOGUwM2FhZWRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I3ODhmNDQ2ODNhZTQ3YjdiY2VjNTlkMTUyMjMzOGMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODhmYmExMGZjODI0MDMxYjVmY2I0YWNlYTc3ODM1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMDc4NDYzYjgwY2I0ZDk4ODMzNmYwMTRhMjY4ODNhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzA3ODQ2M2I4MGNiNGQ5ODgzMzZmMDE0YTI2ODgzYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjg4ZmJhMTBmYzgyNDAzMWI1ZmNiNGFjZWE3NzgzNTcuc2V0Q29udGVudChodG1sXzMwNzg0NjNiODBjYjRkOTg4MzM2ZjAxNGEyNjg4M2E4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I3ODhmNDQ2ODNhZTQ3YjdiY2VjNTlkMTUyMjMzOGMwLmJpbmRQb3B1cChwb3B1cF9iODhmYmExMGZjODI0MDMxYjVmY2I0YWNlYTc3ODM1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTY1MjczZTljZTQ0Y2NhYTY5ZGZjODE5ZDZlODEzOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzQ0NmMyN2MzMGM2NDQ5YTkwMmY3ZjU2M2E4YjIyOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU2Njk0NjdkNGJiNGIyZDk2OTJlODgwOWFjYTYzYzIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1NjY5NDY3ZDRiYjRiMmQ5NjkyZTg4MDlhY2E2M2MyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzQ0NmMyN2MzMGM2NDQ5YTkwMmY3ZjU2M2E4YjIyOWUuc2V0Q29udGVudChodG1sX2Q1NjY5NDY3ZDRiYjRiMmQ5NjkyZTg4MDlhY2E2M2MyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5NjUyNzNlOWNlNDRjY2FhNjlkZmM4MTlkNmU4MTM5LmJpbmRQb3B1cChwb3B1cF9jNDQ2YzI3YzMwYzY0NDlhOTAyZjdmNTYzYThiMjI5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMGU2MWE3MTdhNzk0YzdlYjhjZGQxMmU2YzEyZTk1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NzNmYThlYTdkMGQ0NGUzOGIzN2JjNTU3Nzk3NjgxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWMyMDY4MzI5OTQ0NTJiOGEyZGU0Y2Y1MWZjNDhkZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTFjMjA2ODMyOTk0NDUyYjhhMmRlNGNmNTFmYzQ4ZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzczZmE4ZWE3ZDBkNDRlMzhiMzdiYzU1Nzc5NzY4MTcuc2V0Q29udGVudChodG1sX2UxYzIwNjgzMjk5NDQ1MmI4YTJkZTRjZjUxZmM0OGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwZTYxYTcxN2E3OTRjN2ViOGNkZDEyZTZjMTJlOTUxLmJpbmRQb3B1cChwb3B1cF83NzNmYThlYTdkMGQ0NGUzOGIzN2JjNTU3Nzk3NjgxNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYTQzNjc4OGQzNTQ0NjE5OWU2ZjIwMTM1ZThjNTY2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU1OThiMTE5YTEwNDViZmJlOGRiYTM3ZDEyM2UzYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjkxMmE1MGQ2YTZlNDgwNjhmMjY3ODg2NjU5MzlmYTQgPSAkKCc8ZGl2IGlkPSJodG1sXzY5MTJhNTBkNmE2ZTQ4MDY4ZjI2Nzg4NjY1OTM5ZmE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTU5OGIxMTlhMTA0NWJmYmU4ZGJhMzdkMTIzZTNhYS5zZXRDb250ZW50KGh0bWxfNjkxMmE1MGQ2YTZlNDgwNjhmMjY3ODg2NjU5MzlmYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmE0MzY3ODhkMzU0NDYxOTllNmYyMDEzNWU4YzU2NjUuYmluZFBvcHVwKHBvcHVwX2M1NTk4YjExOWExMDQ1YmZiZThkYmEzN2QxMjNlM2FhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzMDc5MzMwMzAwNDRhYzZhYmZkZjQ1ZTUyMjEyN2U2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Yzg3MzBjZjBmMDM0OTQwOTM4MTZhZDFhODE0NDBlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZDhhOTFhNTkxMmI0YWVhOWM3ZjEzMDNjZTI2NDQ1ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmQ4YTkxYTU5MTJiNGFlYTljN2YxMzAzY2UyNjQ0NWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjODczMGNmMGYwMzQ5NDA5MzgxNmFkMWE4MTQ0MGVjLnNldENvbnRlbnQoaHRtbF82ZDhhOTFhNTkxMmI0YWVhOWM3ZjEzMDNjZTI2NDQ1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzA3OTMzMDMwMDQ0YWM2YWJmZGY0NWU1MjIxMjdlNi5iaW5kUG9wdXAocG9wdXBfN2M4NzMwY2YwZjAzNDk0MDkzODE2YWQxYTgxNDQwZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTY5YzUzYzdiMDdjNGRiZThkYzA4OGM2YTMzM2ZlNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjdjZmY5NWUwODJkNDAwNGJkMTg5NWM5NDk1MjYwZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E3ZWRmYjcxNWM2NGQyYjg0NzczNzYyOTQ0ZjdhNTggPSAkKCc8ZGl2IGlkPSJodG1sX2NhN2VkZmI3MTVjNjRkMmI4NDc3Mzc2Mjk0NGY3YTU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yN2NmZjk1ZTA4MmQ0MDA0YmQxODk1Yzk0OTUyNjBmYi5zZXRDb250ZW50KGh0bWxfY2E3ZWRmYjcxNWM2NGQyYjg0NzczNzYyOTQ0ZjdhNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTY5YzUzYzdiMDdjNGRiZThkYzA4OGM2YTMzM2ZlNmIuYmluZFBvcHVwKHBvcHVwXzI3Y2ZmOTVlMDgyZDQwMDRiZDE4OTVjOTQ5NTI2MGZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkZmM2NzJkMjY4MzQ2NDJiMzliYWM4OTE1MDc5MjgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ODA0MmNlNTIwOTRkODg5OWY5MTkxNmFjZDI1NzU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2ZDUzNmQyNGY4YTRmNTQ4NGRiNjA4OTkxOThlZmY5ID0gJCgnPGRpdiBpZD0iaHRtbF9iNmQ1MzZkMjRmOGE0ZjU0ODRkYjYwODk5MTk4ZWZmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NzgwNDJjZTUyMDk0ZDg4OTlmOTE5MTZhY2QyNTc1NS5zZXRDb250ZW50KGh0bWxfYjZkNTM2ZDI0ZjhhNGY1NDg0ZGI2MDg5OTE5OGVmZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGRmYzY3MmQyNjgzNDY0MmIzOWJhYzg5MTUwNzkyODAuYmluZFBvcHVwKHBvcHVwXzU3ODA0MmNlNTIwOTRkODg5OWY5MTkxNmFjZDI1NzU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5ZWMxNjczMDZjZTQ1MTViM2Y4MTVhN2I4NmVmMDZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxNzE4ZGMyNTliZDQ1MzM4MjBlNTMwNDljZDNlYzk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmNjM4ZDQwZjIwMTQ1YTNiZGYzNTBlZjViNjdhZTU2ID0gJCgnPGRpdiBpZD0iaHRtbF8zZjYzOGQ0MGYyMDE0NWEzYmRmMzUwZWY1YjY3YWU1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTcxOGRjMjU5YmQ0NTMzODIwZTUzMDQ5Y2QzZWM5OS5zZXRDb250ZW50KGh0bWxfM2Y2MzhkNDBmMjAxNDVhM2JkZjM1MGVmNWI2N2FlNTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjllYzE2NzMwNmNlNDUxNWIzZjgxNWE3Yjg2ZWYwNmUuYmluZFBvcHVwKHBvcHVwXzUxNzE4ZGMyNTliZDQ1MzM4MjBlNTMwNDljZDNlYzk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxMjVmZjE2MjRlOTQwMzNhNjQ5M2U0ZmUyMGUyNWVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2MDVlYWVmMzY4MDQ2ZjZiM2YwOGVhMGVlYjg4MzhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiNWZiNWRhMTNhYTRlZTY4MjliNTU2MmUxZTg0NjcwID0gJCgnPGRpdiBpZD0iaHRtbF84YjVmYjVkYTEzYWE0ZWU2ODI5YjU1NjJlMWU4NDY3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTYwNWVhZWYzNjgwNDZmNmIzZjA4ZWEwZWViODgzOGMuc2V0Q29udGVudChodG1sXzhiNWZiNWRhMTNhYTRlZTY4MjliNTU2MmUxZTg0NjcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxMjVmZjE2MjRlOTQwMzNhNjQ5M2U0ZmUyMGUyNWVhLmJpbmRQb3B1cChwb3B1cF81NjA1ZWFlZjM2ODA0NmY2YjNmMDhlYTBlZWI4ODM4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjU1ODk1MzRkNTI0ZjQ5YTdmNzg1YTcyYTI3OGM0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjYzOWFkZDU0ZjA0NmJhOTY5Y2VmNGQ2OTI5NmI5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjNlZGRmZjAxMjU0MDg1ODFjYjcyNjQzYjg4NDcwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjYzZWRkZmYwMTI1NDA4NTgxY2I3MjY0M2I4ODQ3MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMjYzOWFkZDU0ZjA0NmJhOTY5Y2VmNGQ2OTI5NmI5MS5zZXRDb250ZW50KGh0bWxfYjYzZWRkZmYwMTI1NDA4NTgxY2I3MjY0M2I4ODQ3MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI1NTg5NTM0ZDUyNGY0OWE3Zjc4NWE3MmEyNzhjNDMuYmluZFBvcHVwKHBvcHVwXzIyNjM5YWRkNTRmMDQ2YmE5NjljZWY0ZDY5Mjk2YjkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4Zjk0NjUyN2Q5NzQzM2ZhMTg4YWM5ZDYwNjA4YzYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczNzYxMWNjMTlmYzQxMmE5ZDZiMjNiYmUzZGU4NTEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkNjQyNTM1ZjUwZTQwMGNhYzU4YTQ1ZjRhNDA1ZDJlID0gJCgnPGRpdiBpZD0iaHRtbF84ZDY0MjUzNWY1MGU0MDBjYWM1OGE0NWY0YTQwNWQyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczNzYxMWNjMTlmYzQxMmE5ZDZiMjNiYmUzZGU4NTEzLnNldENvbnRlbnQoaHRtbF84ZDY0MjUzNWY1MGU0MDBjYWM1OGE0NWY0YTQwNWQyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOGY5NDY1MjdkOTc0MzNmYTE4OGFjOWQ2MDYwOGM2Mi5iaW5kUG9wdXAocG9wdXBfNzM3NjExY2MxOWZjNDEyYTlkNmIyM2JiZTNkZTg1MTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWIyYmI5YWY0NGY0NGFkNWI3YWM0ZWY2YTAzZjEyYjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjE0ZTQwM2UyMzY2NGQzNThlZGM3ZDhiYTkzNGJlMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWZjMTAzMzQyMmIyNGZkZDhiYmM0YmI4NWQwMzNhZDggPSAkKCc8ZGl2IGlkPSJodG1sXzVmYzEwMzM0MjJiMjRmZGQ4YmJjNGJiODVkMDMzYWQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMTRlNDAzZTIzNjY0ZDM1OGVkYzdkOGJhOTM0YmUzNS5zZXRDb250ZW50KGh0bWxfNWZjMTAzMzQyMmIyNGZkZDhiYmM0YmI4NWQwMzNhZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWIyYmI5YWY0NGY0NGFkNWI3YWM0ZWY2YTAzZjEyYjcuYmluZFBvcHVwKHBvcHVwXzIxNGU0MDNlMjM2NjRkMzU4ZWRjN2Q4YmE5MzRiZTM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMGNjOWFhMjU2MDQ0MzM4ZjczYTAwM2M3MGUxNzYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2MDNjNTc1ZDg1NjRmM2JhZTQ4MzRmNTE2NjMwODgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjYWM2YWY0YjlmYTRlMjg4NmI2ZThkOWM1OGU4ZWI3ID0gJCgnPGRpdiBpZD0iaHRtbF8zY2FjNmFmNGI5ZmE0ZTI4ODZiNmU4ZDljNThlOGViNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjAzYzU3NWQ4NTY0ZjNiYWU0ODM0ZjUxNjYzMDg4MS5zZXRDb250ZW50KGh0bWxfM2NhYzZhZjRiOWZhNGUyODg2YjZlOGQ5YzU4ZThlYjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmQwY2M5YWEyNTYwNDQzMzhmNzNhMDAzYzcwZTE3NjMuYmluZFBvcHVwKHBvcHVwXzM2MDNjNTc1ZDg1NjRmM2JhZTQ4MzRmNTE2NjMwODgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzMGQzMzFjNjEwNTQxMmI4OWUyZDY1NGE5NTY3MTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjcwYWM5MDQ2YmE4NDAxOGIxYjkwNTkyMjU4MDZkOWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDgwNjAxYzJmZGM5NDliZjhkMmRiZjNiNmMyOWFkZjkgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4MDYwMWMyZmRjOTQ5YmY4ZDJkYmYzYjZjMjlhZGY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjcwYWM5MDQ2YmE4NDAxOGIxYjkwNTkyMjU4MDZkOWYuc2V0Q29udGVudChodG1sX2Q4MDYwMWMyZmRjOTQ5YmY4ZDJkYmYzYjZjMjlhZGY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzMGQzMzFjNjEwNTQxMmI4OWUyZDY1NGE5NTY3MTMyLmJpbmRQb3B1cChwb3B1cF82NzBhYzkwNDZiYTg0MDE4YjFiOTA1OTIyNTgwNmQ5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODFlMzE5ZWQ2MWQ0ZGE1YThkM2EwNDViMDc1N2MzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zYjNhMjRlOGE0Y2U0NGE1YWViZGUxYmQ0ODY0MGUzMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ODkxOWRjZTMzMDk0YzRmODkwMjYzNTg1MDg3NDIwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMTJhN2E2OTMxZWU0MWYzYTc4YWIxNjg4ZDJhMDFjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzEyYTdhNjkzMWVlNDFmM2E3OGFiMTY4OGQyYTAxYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ODkxOWRjZTMzMDk0YzRmODkwMjYzNTg1MDg3NDIwZC5zZXRDb250ZW50KGh0bWxfYzEyYTdhNjkzMWVlNDFmM2E3OGFiMTY4OGQyYTAxYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjgxZTMxOWVkNjFkNGRhNWE4ZDNhMDQ1YjA3NTdjM2UuYmluZFBvcHVwKHBvcHVwXzg4OTE5ZGNlMzMwOTRjNGY4OTAyNjM1ODUwODc0MjBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3YTBkOTUxYjI2NjQzZGJiZmE5MzFjYzEwMDY0ZTJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5NmIyZjQ1YjNlMzRmM2FhMDEyZTYzNTIxYjVlZDYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmMTUxZmQ0NzMwZjRjNGM4ZTBkZmQ0M2M2Y2YyZDljID0gJCgnPGRpdiBpZD0iaHRtbF81ZjE1MWZkNDczMGY0YzRjOGUwZGZkNDNjNmNmMmQ5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5NmIyZjQ1YjNlMzRmM2FhMDEyZTYzNTIxYjVlZDYwLnNldENvbnRlbnQoaHRtbF81ZjE1MWZkNDczMGY0YzRjOGUwZGZkNDNjNmNmMmQ5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kN2EwZDk1MWIyNjY0M2RiYmZhOTMxY2MxMDA2NGUyYy5iaW5kUG9wdXAocG9wdXBfYTk2YjJmNDViM2UzNGYzYWEwMTJlNjM1MjFiNWVkNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE1NzgwZmQ2OWRhNGVhZTk0NjNkNzI4YTUzNjEzZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTk5ZTZiOWU0NTM1NDM4MmJlY2M5NTc3YWJhMWYyZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZjYjJlZWIwNGVkNDlkYWFhYzNkMzBjYTg2YzEzZGUgPSAkKCc8ZGl2IGlkPSJodG1sX2FmY2IyZWViMDRlZDQ5ZGFhYWMzZDMwY2E4NmMxM2RlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5OWU2YjllNDUzNTQzODJiZWNjOTU3N2FiYTFmMmU5LnNldENvbnRlbnQoaHRtbF9hZmNiMmVlYjA0ZWQ0OWRhYWFjM2QzMGNhODZjMTNkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMTU3ODBmZDY5ZGE0ZWFlOTQ2M2Q3MjhhNTM2MTNmZi5iaW5kUG9wdXAocG9wdXBfZTk5ZTZiOWU0NTM1NDM4MmJlY2M5NTc3YWJhMWYyZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTE5NDM5N2E0YzRkNDkwMzg2MjNjOTZkZjg5ZjllMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I5MGUyMjc2MjVkMDRmMDk4ZjE4MjdmYTUzMDNlZGRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhNDU5ZTk0YjhhNzQxNTY4ZDQ1OWM1MzVmMzY3ZTBmID0gJCgnPGRpdiBpZD0iaHRtbF84YTQ1OWU5NGI4YTc0MTU2OGQ0NTljNTM1ZjM2N2UwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5MGUyMjc2MjVkMDRmMDk4ZjE4MjdmYTUzMDNlZGRiLnNldENvbnRlbnQoaHRtbF84YTQ1OWU5NGI4YTc0MTU2OGQ0NTljNTM1ZjM2N2UwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTk0Mzk3YTRjNGQ0OTAzODYyM2M5NmRmODlmOWUxZS5iaW5kUG9wdXAocG9wdXBfYjkwZTIyNzYyNWQwNGYwOThmMTgyN2ZhNTMwM2VkZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjZjY2E3ZTEyZTAwNDI2Yjg2ZWJjODc3M2VjNjA1MTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzNiM2EyNGU4YTRjZTQ0YTVhZWJkZTFiZDQ4NjQwZTMxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiNDI3YjVjMTI0NjRjZTI4OWYxNDk3ZGY3Y2E0MzBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk3M2Y5MGY1NDE1YzRkODJiZThjZWFiYWEwMTU2NTczID0gJCgnPGRpdiBpZD0iaHRtbF85NzNmOTBmNTQxNWM0ZDgyYmU4Y2VhYmFhMDE1NjU3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiNDI3YjVjMTI0NjRjZTI4OWYxNDk3ZGY3Y2E0MzBiLnNldENvbnRlbnQoaHRtbF85NzNmOTBmNTQxNWM0ZDgyYmU4Y2VhYmFhMDE1NjU3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NmNjYTdlMTJlMDA0MjZiODZlYmM4NzczZWM2MDUxMS5iaW5kUG9wdXAocG9wdXBfN2I0MjdiNWMxMjQ2NGNlMjg5ZjE0OTdkZjdjYTQzMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWVhYjRkMWQ0OWZiNGNjMzk4ZTUwYWE0ZDdlMzBiZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfM2IzYTI0ZThhNGNlNDRhNWFlYmRlMWJkNDg2NDBlMzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDViZGQ1OTJmZjQ0NDQxOWIxYmExZTVlNTgxODdlMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRlYjU4NzEyMGJkNDBkZjgzOGQwNGFlZmVjNTIxNzQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkZWI1ODcxMjBiZDQwZGY4MzhkMDRhZWZlYzUyMTc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1YmRkNTkyZmY0NDQ0MTliMWJhMWU1ZTU4MTg3ZTJmLnNldENvbnRlbnQoaHRtbF9mZGViNTg3MTIwYmQ0MGRmODM4ZDA0YWVmZWM1MjE3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZWFiNGQxZDQ5ZmI0Y2MzOThlNTBhYTRkN2UzMGJmOC5iaW5kUG9wdXAocG9wdXBfMDViZGQ1OTJmZjQ0NDQxOWIxYmExZTVlNTgxODdlMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<folium.folium.Map at 0x7f15a26edd30>" | |
| ] | |
| }, | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map of New York using latitude and longitude values\n", | |
| "map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n", | |
| " label = '{}, {}'.format(neighborhood, borough)\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_newyork) \n", | |
| " \n", | |
| "map_newyork" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Manhattan data.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Manhattan</td>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.910660</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Manhattan</td>\n", | |
| " <td>Chinatown</td>\n", | |
| " <td>40.715618</td>\n", | |
| " <td>-73.994279</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Manhattan</td>\n", | |
| " <td>Washington Heights</td>\n", | |
| " <td>40.851903</td>\n", | |
| " <td>-73.936900</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Manhattan</td>\n", | |
| " <td>Inwood</td>\n", | |
| " <td>40.867684</td>\n", | |
| " <td>-73.921210</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Manhattan</td>\n", | |
| " <td>Hamilton Heights</td>\n", | |
| " <td>40.823604</td>\n", | |
| " <td>-73.949688</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Neighborhood Latitude Longitude\n", | |
| "0 Manhattan Marble Hill 40.876551 -73.910660\n", | |
| "1 Manhattan Chinatown 40.715618 -73.994279\n", | |
| "2 Manhattan Washington Heights 40.851903 -73.936900\n", | |
| "3 Manhattan Inwood 40.867684 -73.921210\n", | |
| "4 Manhattan Hamilton Heights 40.823604 -73.949688" | |
| ] | |
| }, | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n", | |
| "manhattan_data.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let's get the geographical coordinates of Manhattan.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of Manhattan are 40.7896239, -73.9598939.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'Manhattan, NY'\n", | |
| "\n", | |
| "geolocator = Nominatim(user_agent=\"ny_explorer\")\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude = location.latitude\n", | |
| "longitude = location.longitude\n", | |
| "print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzg5NjIzOSwtNzMuOTU5ODkzOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZDI5NGNlM2JhNTRkNDBjOGFmZGE2ODEyNWI0ZWIzYTkgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjODBlNDdiZjc5NTRlMjlhNTgyOGY2NzU2OWMyNmEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0M2M4YmExMzQ5ZDQyZmE4Nzc5YmQxMDczOTM4MjgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlZjQ4NWQ2ODYzNzQ2N2ZhZWI4MmVmZDQwNGIwNWE5ID0gJCgnPGRpdiBpZD0iaHRtbF83ZWY0ODVkNjg2Mzc0NjdmYWViODJlZmQ0MDRiMDVhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0M2M4YmExMzQ5ZDQyZmE4Nzc5YmQxMDczOTM4MjgxLnNldENvbnRlbnQoaHRtbF83ZWY0ODVkNjg2Mzc0NjdmYWViODJlZmQ0MDRiMDVhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYzgwZTQ3YmY3OTU0ZTI5YTU4MjhmNjc1NjljMjZhMi5iaW5kUG9wdXAocG9wdXBfNDQzYzhiYTEzNDlkNDJmYTg3NzliZDEwNzM5MzgyODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWYzOTQ0YjZiMWQ5NDE5YjgyMjRjOTE1NGE2NDg2M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkyY2Y0Nzc5NDRlNDE3OTkxNWMzNmMxNTY1Y2MzNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjNmMDhiNDBmNTYxNDVhMzgxNmEzOWU3N2YyZDQ0MDMgPSAkKCc8ZGl2IGlkPSJodG1sXzYzZjA4YjQwZjU2MTQ1YTM4MTZhMzllNzdmMmQ0NDAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5MmNmNDc3OTQ0ZTQxNzk5MTVjMzZjMTU2NWNjMzQ4LnNldENvbnRlbnQoaHRtbF82M2YwOGI0MGY1NjE0NWEzODE2YTM5ZTc3ZjJkNDQwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZjM5NDRiNmIxZDk0MTliODIyNGM5MTU0YTY0ODYzYi5iaW5kUG9wdXAocG9wdXBfZTkyY2Y0Nzc5NDRlNDE3OTkxNWMzNmMxNTY1Y2MzNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODFkNTA0MzE4ZWUxNDU5ZGE5OTFlYTlkNjE2ZTE5YzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQwY2Y5NDY3MjkyNDVjN2FjMDJkNDU4NTdjNTFjYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU0OTkzMTQ1N2YyNDQ0MjgxOTdlZjhkYTFmZWQ0NzAgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1NDk5MzE0NTdmMjQ0NDI4MTk3ZWY4ZGExZmVkNDcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkMGNmOTQ2NzI5MjQ1YzdhYzAyZDQ1ODU3YzUxY2IyLnNldENvbnRlbnQoaHRtbF9kNTQ5OTMxNDU3ZjI0NDQyODE5N2VmOGRhMWZlZDQ3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MWQ1MDQzMThlZTE0NTlkYTk5MWVhOWQ2MTZlMTljMy5iaW5kUG9wdXAocG9wdXBfMmQwY2Y5NDY3MjkyNDVjN2FjMDJkNDU4NTdjNTFjYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU3ODQwNDM1NjFkNDM1MDhiMmI0MDZlMmRmYjAwYmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjg2NGFkMmZiODYzNDI3N2JhZjBiNDIzYWE3N2Q1ODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDlhZjc5YzdkYzczNGZmMWExYTYxMTUzNmJmYjYzNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzQ5YWY3OWM3ZGM3MzRmZjFhMWE2MTE1MzZiZmI2MzZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4NjRhZDJmYjg2MzQyNzdiYWYwYjQyM2FhNzdkNTg5LnNldENvbnRlbnQoaHRtbF80OWFmNzljN2RjNzM0ZmYxYTFhNjExNTM2YmZiNjM2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTc4NDA0MzU2MWQ0MzUwOGIyYjQwNmUyZGZiMDBiZS5iaW5kUG9wdXAocG9wdXBfNjg2NGFkMmZiODYzNDI3N2JhZjBiNDIzYWE3N2Q1ODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDY1OGFiYmJkMDM1NDM1MDgyYTM1NmVmMTJkNTE0NDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjYjdlNDFiNTEyNjRhYjk5N2NmYmJmOGRiZDFmZmQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1ZjhhYzQ2N2NhNTRkYTk4NDViNWM3MzZmZDc1YWIwID0gJCgnPGRpdiBpZD0iaHRtbF8wNWY4YWM0NjdjYTU0ZGE5ODQ1YjVjNzM2ZmQ3NWFiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGNiN2U0MWI1MTI2NGFiOTk3Y2ZiYmY4ZGJkMWZmZDkuc2V0Q29udGVudChodG1sXzA1ZjhhYzQ2N2NhNTRkYTk4NDViNWM3MzZmZDc1YWIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2NThhYmJiZDAzNTQzNTA4MmEzNTZlZjEyZDUxNDQ3LmJpbmRQb3B1cChwb3B1cF8wY2I3ZTQxYjUxMjY0YWI5OTdjZmJiZjhkYmQxZmZkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zM2QzM2Q1YjI4Mjc0MWU1ODE2NTE3MzdhYzlhZDUyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjIwNWMwMjkzNjQxNDE0OTk4MWMwNjkwODI4OTMzYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjYwNGJjZDU2MjAwNDEwMGE5NDg2YzBiMDY0NDZjMWYgPSAkKCc8ZGl2IGlkPSJodG1sXzY2MDRiY2Q1NjIwMDQxMDBhOTQ4NmMwYjA2NDQ2YzFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjIwNWMwMjkzNjQxNDE0OTk4MWMwNjkwODI4OTMzYjIuc2V0Q29udGVudChodG1sXzY2MDRiY2Q1NjIwMDQxMDBhOTQ4NmMwYjA2NDQ2YzFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMzZDMzZDViMjgyNzQxZTU4MTY1MTczN2FjOWFkNTJlLmJpbmRQb3B1cChwb3B1cF8yMjA1YzAyOTM2NDE0MTQ5OTgxYzA2OTA4Mjg5MzNiMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNjRmMTViMjVmZmE0NzUzYjQxNDA5MDQyNzE2YWNjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTg5ZTFmMDI1YTk0YTg2YTFlMzIwMjBhZDM4ODdmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYWE4ODQxOGQyMTU0NzA3OTQ0MjgzZTY0Zjg0NTVjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWFhODg0MThkMjE1NDcwNzk0NDI4M2U2NGY4NDU1Y2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTg5ZTFmMDI1YTk0YTg2YTFlMzIwMjBhZDM4ODdmNS5zZXRDb250ZW50KGh0bWxfZWFhODg0MThkMjE1NDcwNzk0NDI4M2U2NGY4NDU1Y2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDY0ZjE1YjI1ZmZhNDc1M2I0MTQwOTA0MjcxNmFjYzkuYmluZFBvcHVwKHBvcHVwXzJlODllMWYwMjVhOTRhODZhMWUzMjAyMGFkMzg4N2Y1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4OGE5NjIwOWE5YzRmOWZiZjc3N2Y3MWEwYTc4ZDc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1YmExODNjMTI2MjQ1NDk4OWJjMGU1Y2JjOTI2NjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiNDE0YjliMzUxMDQ1NmJiMDg3MWZlNGM2NzE0YTQxID0gJCgnPGRpdiBpZD0iaHRtbF9jYjQxNGI5YjM1MTA0NTZiYjA4NzFmZTRjNjcxNGE0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1YmExODNjMTI2MjQ1NDk4OWJjMGU1Y2JjOTI2NjlhLnNldENvbnRlbnQoaHRtbF9jYjQxNGI5YjM1MTA0NTZiYjA4NzFmZTRjNjcxNGE0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODhhOTYyMDlhOWM0ZjlmYmY3NzdmNzFhMGE3OGQ3OC5iaW5kUG9wdXAocG9wdXBfZjViYTE4M2MxMjYyNDU0OTg5YmMwZTVjYmM5MjY2OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFjNjQ5MzRmYWVjNDY0MzhiNmE4MThmZTRlMzY4ODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4ZDBkMGJiYmU5ODQzNWU5NTQwYjBiNWJlOGY1YmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzYjU1NjkzZDZlNzQ2YzQ4MWIzNTljOGM0NDFiMjhiID0gJCgnPGRpdiBpZD0iaHRtbF9jM2I1NTY5M2Q2ZTc0NmM0ODFiMzU5YzhjNDQxYjI4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOGQwZDBiYmJlOTg0MzVlOTU0MGIwYjViZThmNWJhMC5zZXRDb250ZW50KGh0bWxfYzNiNTU2OTNkNmU3NDZjNDgxYjM1OWM4YzQ0MWIyOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFjNjQ5MzRmYWVjNDY0MzhiNmE4MThmZTRlMzY4ODIuYmluZFBvcHVwKHBvcHVwX2M4ZDBkMGJiYmU5ODQzNWU5NTQwYjBiNWJlOGY1YmEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2ODQxZTE0MmU2MDRjMTU4OGY3MTBmYmYxZWM3MmQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZGZiNjlhMzY3OGU0YzUwYTFjYTgzNDk4MzU1NTVmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTNjMDY4YWJjNGE0YTIyYThiMGJiMmEwODVkMGE4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjkzYzA2OGFiYzRhNGEyMmE4YjBiYjJhMDg1ZDBhOGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGRmYjY5YTM2NzhlNGM1MGExY2E4MzQ5ODM1NTU1ZmIuc2V0Q29udGVudChodG1sXzI5M2MwNjhhYmM0YTRhMjJhOGIwYmIyYTA4NWQwYThmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2ODQxZTE0MmU2MDRjMTU4OGY3MTBmYmYxZWM3MmQ4LmJpbmRQb3B1cChwb3B1cF8wZGZiNjlhMzY3OGU0YzUwYTFjYTgzNDk4MzU1NTVmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYTljZjRhNmMwMWM0ZmYwYjIwMjMwYmM3ZDVjYzkwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5OTNjNjg3ZWQ4MDRkOTVhMGQxZmViYjZlZGM0ZmE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2ODMwMjE3YWYwNDRiNjliYjJkYmI0ZTY5MjA2ZDBkID0gJCgnPGRpdiBpZD0iaHRtbF82NjgzMDIxN2FmMDQ0YjY5YmIyZGJiNGU2OTIwNmQwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODk5M2M2ODdlZDgwNGQ5NWEwZDFmZWJiNmVkYzRmYTcuc2V0Q29udGVudChodG1sXzY2ODMwMjE3YWYwNDRiNjliYjJkYmI0ZTY5MjA2ZDBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhOWNmNGE2YzAxYzRmZjBiMjAyMzBiYzdkNWNjOTA3LmJpbmRQb3B1cChwb3B1cF84OTkzYzY4N2VkODA0ZDk1YTBkMWZlYmI2ZWRjNGZhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNzU3OGMwMzA0MDI0NGJkYmU4OWNmY2UxMThkMTEyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZDQzYzE2ZjFkMjY0ZTgwOTU4YThlYWNmODdjNjA2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZTA4ZmY4NDZmZTk0MWY3ODBkOTlkYzg3YjY2ZTM4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGUwOGZmODQ2ZmU5NDFmNzgwZDk5ZGM4N2I2NmUzODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkNDNjMTZmMWQyNjRlODA5NThhOGVhY2Y4N2M2MDY2LnNldENvbnRlbnQoaHRtbF8wZTA4ZmY4NDZmZTk0MWY3ODBkOTlkYzg3YjY2ZTM4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzU3OGMwMzA0MDI0NGJkYmU4OWNmY2UxMThkMTEyNS5iaW5kUG9wdXAocG9wdXBfOGQ0M2MxNmYxZDI2NGU4MDk1OGE4ZWFjZjg3YzYwNjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk1OTAwZTkwZDkwNGJjZjhlZTQwN2Q1ZTk5ZTU1NzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzODhmZjdjZjcwYTQwNTZiM2E1OGU0ODZiOGVmMTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiNjhlYzE5ZGVjZDQ2MzU5ZGVlN2IxYjhhNDJmNGY1ID0gJCgnPGRpdiBpZD0iaHRtbF9iYjY4ZWMxOWRlY2Q0NjM1OWRlZTdiMWI4YTQyZjRmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzg4ZmY3Y2Y3MGE0MDU2YjNhNThlNDg2YjhlZjE4Mi5zZXRDb250ZW50KGh0bWxfYmI2OGVjMTlkZWNkNDYzNTlkZWU3YjFiOGE0MmY0ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzk1OTAwZTkwZDkwNGJjZjhlZTQwN2Q1ZTk5ZTU1NzEuYmluZFBvcHVwKHBvcHVwX2EzODhmZjdjZjcwYTQwNTZiM2E1OGU0ODZiOGVmMTgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhY2NjMjgxMjk5YjQxOTU4M2FkZjVmNmNkYzU4NWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVkMWY3MmE0ZmI5ZTQyYWZiOTIxN2E2NjdkNzg1ZTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwOWM0NjZjYTA3YzQ1NGY5NzJjNGNhNWQyNGQwOTFlID0gJCgnPGRpdiBpZD0iaHRtbF9lMDljNDY2Y2EwN2M0NTRmOTcyYzRjYTVkMjRkMDkxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkMWY3MmE0ZmI5ZTQyYWZiOTIxN2E2NjdkNzg1ZTM3LnNldENvbnRlbnQoaHRtbF9lMDljNDY2Y2EwN2M0NTRmOTcyYzRjYTVkMjRkMDkxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYWNjYzI4MTI5OWI0MTk1ODNhZGY1ZjZjZGM1ODVmNC5iaW5kUG9wdXAocG9wdXBfNWQxZjcyYTRmYjllNDJhZmI5MjE3YTY2N2Q3ODVlMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTcwNzIxYzk5OGY0NDFjZWEwODUyZTY1OWZlOTIwY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBjNzVhNzg1ODEwNDAwN2I3Yjg5YTIxOTBkNjA2YjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGNiNGM3ZTRlYmZhNDE2MzgwZmIxYTVmMTAyYWI5ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzBjYjRjN2U0ZWJmYTQxNjM4MGZiMWE1ZjEwMmFiOWU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGM3NWE3ODU4MTA0MDA3YjdiODlhMjE5MGQ2MDZiOS5zZXRDb250ZW50KGh0bWxfMGNiNGM3ZTRlYmZhNDE2MzgwZmIxYTVmMTAyYWI5ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTcwNzIxYzk5OGY0NDFjZWEwODUyZTY1OWZlOTIwY2EuYmluZFBvcHVwKHBvcHVwXzgwYzc1YTc4NTgxMDQwMDdiN2I4OWEyMTkwZDYwNmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmYWM5ZjdiODRjNTQxNDNhYzQ3ZjdmZTVjNzAwYzllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkMWM5ZGUwYzNkYzQzZTI5M2U1NTgzNWU1Y2RmNDZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlMDcxZDFlOWJkYjQ1MmFhOTNkMGI0ZGEyNGFhNWI5ID0gJCgnPGRpdiBpZD0iaHRtbF81ZTA3MWQxZTliZGI0NTJhYTkzZDBiNGRhMjRhYTViOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQxYzlkZTBjM2RjNDNlMjkzZTU1ODM1ZTVjZGY0NmMuc2V0Q29udGVudChodG1sXzVlMDcxZDFlOWJkYjQ1MmFhOTNkMGI0ZGEyNGFhNWI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmYWM5ZjdiODRjNTQxNDNhYzQ3ZjdmZTVjNzAwYzllLmJpbmRQb3B1cChwb3B1cF80ZDFjOWRlMGMzZGM0M2UyOTNlNTU4MzVlNWNkZjQ2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzEzNTkyNGMwZGQ0MzUyOGE0OWRhOTEzNWMzMjY0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE4NzE2YWMyMWNhNDUyMmE1MzkzMmFlODA5YmUzMTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmZlMmYwNGFkNjYwNGRhYmE5OGU4YjQ2YjQ0ZDVjMGQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmZTJmMDRhZDY2MDRkYWJhOThlOGI0NmI0NGQ1YzBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE4NzE2YWMyMWNhNDUyMmE1MzkzMmFlODA5YmUzMTkuc2V0Q29udGVudChodG1sX2ZmZTJmMDRhZDY2MDRkYWJhOThlOGI0NmI0NGQ1YzBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjMTM1OTI0YzBkZDQzNTI4YTQ5ZGE5MTM1YzMyNjRjLmJpbmRQb3B1cChwb3B1cF9lYTg3MTZhYzIxY2E0NTIyYTUzOTMyYWU4MDliZTMxOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMWVkMDlhMjQ3ZWQ0ZGJmOWYyMjhiMzliYjY2MjBlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWNkNzMxYmI5N2FlNGMwYmFhZGQ0NTA5N2MwYzA2MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDI5YzQwNTdkYWQxNDhkMDg2ZDgyMDI4Mjk2ODgzMmQgPSAkKCc8ZGl2IGlkPSJodG1sXzAyOWM0MDU3ZGFkMTQ4ZDA4NmQ4MjAyODI5Njg4MzJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2Q3MzFiYjk3YWU0YzBiYWFkZDQ1MDk3YzBjMDYwMy5zZXRDb250ZW50KGh0bWxfMDI5YzQwNTdkYWQxNDhkMDg2ZDgyMDI4Mjk2ODgzMmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTFlZDA5YTI0N2VkNGRiZjlmMjI4YjM5YmI2NjIwZTAuYmluZFBvcHVwKHBvcHVwX2FjZDczMWJiOTdhZTRjMGJhYWRkNDUwOTdjMGMwNjAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4Njk4ZDQzNTlhYzQ5MDE4OGNmZThlYWMwMzg1N2M0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwNTliMDVhZDJmYTQ3M2ZhZDVjNjlkNjQxMjlhNTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0MTZjZWIyYmM2YzQ1YjBiNWYzMDNkM2U4ZDBiNTQzID0gJCgnPGRpdiBpZD0iaHRtbF8wNDE2Y2ViMmJjNmM0NWIwYjVmMzAzZDNlOGQwYjU0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNTliMDVhZDJmYTQ3M2ZhZDVjNjlkNjQxMjlhNTAxLnNldENvbnRlbnQoaHRtbF8wNDE2Y2ViMmJjNmM0NWIwYjVmMzAzZDNlOGQwYjU0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODY5OGQ0MzU5YWM0OTAxODhjZmU4ZWFjMDM4NTdjNC5iaW5kUG9wdXAocG9wdXBfOTA1OWIwNWFkMmZhNDczZmFkNWM2OWQ2NDEyOWE1MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU5YzI5Zjg1MzMyNDc2Njk1NDNiYjAxMTNkNDk5MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyNDQyZjRlOTE3MjRmOWE4YTEyNzE5YjMyZjI5OTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjZDQyNGFlMWZjZDQzNTJhZGYyYzYwMDhiNWUyZTg1ID0gJCgnPGRpdiBpZD0iaHRtbF9iY2Q0MjRhZTFmY2Q0MzUyYWRmMmM2MDA4YjVlMmU4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjQ0MmY0ZTkxNzI0ZjlhOGExMjcxOWIzMmYyOTk3YS5zZXRDb250ZW50KGh0bWxfYmNkNDI0YWUxZmNkNDM1MmFkZjJjNjAwOGI1ZTJlODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU5YzI5Zjg1MzMyNDc2Njk1NDNiYjAxMTNkNDk5MjMuYmluZFBvcHVwKHBvcHVwXzUyNDQyZjRlOTE3MjRmOWE4YTEyNzE5YjMyZjI5OTdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzMDVmZDA3MDliZTQ2YTNhZWI4MzBmZGQ4ODNiYWNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3MGI0M2Q4OWExMzQ0ODBiYWZlYTY4OWViZDZlNDkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwMjBlZDJhMTk2MzQ1MGQ5NzA3NTM1YTk4YWFlNzY1ID0gJCgnPGRpdiBpZD0iaHRtbF82MDIwZWQyYTE5NjM0NTBkOTcwNzUzNWE5OGFhZTc2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzBiNDNkODlhMTM0NDgwYmFmZWE2ODllYmQ2ZTQ5Mi5zZXRDb250ZW50KGh0bWxfNjAyMGVkMmExOTYzNDUwZDk3MDc1MzVhOThhYWU3NjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODMwNWZkMDcwOWJlNDZhM2FlYjgzMGZkZDg4M2JhY2IuYmluZFBvcHVwKHBvcHVwXzM3MGI0M2Q4OWExMzQ0ODBiYWZlYTY4OWViZDZlNDkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3MmU1MDNjMjA5ZTRiZTM5Mzc4N2M0OTg3ZWVjN2I2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2MxM2Y4N2E4MjQ0ZjMzYWNhZWU2ZmRkMTkwZmUzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OGE3MTA2MmE1YTc0Y2EwYTZmMDMxNjdkZjU2ZTUwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfODhhNzEwNjJhNWE3NGNhMGE2ZjAzMTY3ZGY1NmU1MDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzYzEzZjg3YTgyNDRmMzNhY2FlZTZmZGQxOTBmZTM3LnNldENvbnRlbnQoaHRtbF84OGE3MTA2MmE1YTc0Y2EwYTZmMDMxNjdkZjU2ZTUwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzJlNTAzYzIwOWU0YmUzOTM3ODdjNDk4N2VlYzdiNi5iaW5kUG9wdXAocG9wdXBfNDNjMTNmODdhODI0NGYzM2FjYWVlNmZkZDE5MGZlMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzg0Y2FmMDI5YWM5NGVlYzhlNjhmNTAwZjg2YzkxZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWRlN2EyZmU4MDQ5NDVkMjlmMzk3YmYwZWNmOTJmMDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGQwNTQ3OWYxMjk5NDY3M2E5ODE2NzliNzk3OWMzOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzRkMDU0NzlmMTI5OTQ2NzNhOTgxNjc5Yjc5NzljMzk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkZTdhMmZlODA0OTQ1ZDI5ZjM5N2JmMGVjZjkyZjA5LnNldENvbnRlbnQoaHRtbF80ZDA1NDc5ZjEyOTk0NjczYTk4MTY3OWI3OTc5YzM5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zODRjYWYwMjlhYzk0ZWVjOGU2OGY1MDBmODZjOTFlOS5iaW5kUG9wdXAocG9wdXBfNWRlN2EyZmU4MDQ5NDVkMjlmMzk3YmYwZWNmOTJmMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTFjNjNiZWJlZDdiNDMwMWEwOWMzNGIwN2ZkOGIzNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQ5ZmM3NmY3ZjE2NGM2Yzg5YzFjZmRlN2ViNzQzODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzdkMGI5MDFjMzA4NDgyYjhhZmY1MTNjNzE4NzVjNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzM3ZDBiOTAxYzMwODQ4MmI4YWZmNTEzYzcxODc1YzcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDlmYzc2ZjdmMTY0YzZjODljMWNmZGU3ZWI3NDM4Mi5zZXRDb250ZW50KGh0bWxfMzdkMGI5MDFjMzA4NDgyYjhhZmY1MTNjNzE4NzVjNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTFjNjNiZWJlZDdiNDMwMWEwOWMzNGIwN2ZkOGIzNDcuYmluZFBvcHVwKHBvcHVwX2Y0OWZjNzZmN2YxNjRjNmM4OWMxY2ZkZTdlYjc0MzgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkYzhhMWFkYzIwNDQ2MWU5YTg1YzExZTAzZDEyZTM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5MjYzZWRkNjBmNTRiNDNhMzE1N2E3MjIyZmE5MjAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0YTdmNDgyMGY5YjQ4ZmY5Mjk1OTdkZDVmODllMzVkID0gJCgnPGRpdiBpZD0iaHRtbF84NGE3ZjQ4MjBmOWI0OGZmOTI5NTk3ZGQ1Zjg5ZTM1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOTI2M2VkZDYwZjU0YjQzYTMxNTdhNzIyMmZhOTIwMS5zZXRDb250ZW50KGh0bWxfODRhN2Y0ODIwZjliNDhmZjkyOTU5N2RkNWY4OWUzNWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRjOGExYWRjMjA0NDYxZTlhODVjMTFlMDNkMTJlMzcuYmluZFBvcHVwKHBvcHVwX2Q5MjYzZWRkNjBmNTRiNDNhMzE1N2E3MjIyZmE5MjAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhZTU4OWEyZTk2YjQwNDU4NjA5N2RhOWRhMTJkMDNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yN2M0NWNmNmZlMjE0NjJhODIyMzFiOGViYWZjNTgyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZWI0OGMzZGE5ZTk0MmFjYmI1OGY3MzVhN2U2NDNiYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmViNDhjM2RhOWU5NDJhY2JiNThmNzM1YTdlNjQzYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3YzQ1Y2Y2ZmUyMTQ2MmE4MjIzMWI4ZWJhZmM1ODJmLnNldENvbnRlbnQoaHRtbF9iZWI0OGMzZGE5ZTk0MmFjYmI1OGY3MzVhN2U2NDNiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YWU1ODlhMmU5NmI0MDQ1ODYwOTdkYTlkYTEyZDAzYy5iaW5kUG9wdXAocG9wdXBfMjdjNDVjZjZmZTIxNDYyYTgyMjMxYjhlYmFmYzU4MmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTdhNTY1MDBmZTdjNDUzYWJkZmMyN2U2ZWVlMDRiZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljNzdkYzAwZTdjNTQ0NGM4NTg4MTllZjQxOGJlY2I1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3OTg0YzA5OTc5ZjQ3YWY4ODhkYTdkZmEwMzRhZDE1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNzk4NGMwOTk3OWY0N2FmODg4ZGE3ZGZhMDM0YWQxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWM3N2RjMDBlN2M1NDQ0Yzg1ODgxOWVmNDE4YmVjYjUuc2V0Q29udGVudChodG1sX2U3OTg0YzA5OTc5ZjQ3YWY4ODhkYTdkZmEwMzRhZDE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3YTU2NTAwZmU3YzQ1M2FiZGZjMjdlNmVlZTA0YmU2LmJpbmRQb3B1cChwb3B1cF85Yzc3ZGMwMGU3YzU0NDRjODU4ODE5ZWY0MThiZWNiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjllNDc0OWMwZGY0ZmNmYjI0N2ZlZWI1ZGRjYWM1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzM4MzFhYTNhYjliNDBkYmE0YzYxMTRiY2NjMDVlZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTMzZjcxY2RmY2QzNGI1OGE3OGJkZWFiNzMwODMyNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzkzM2Y3MWNkZmNkMzRiNThhNzhiZGVhYjczMDgzMjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzM4MzFhYTNhYjliNDBkYmE0YzYxMTRiY2NjMDVlZGQuc2V0Q29udGVudChodG1sXzkzM2Y3MWNkZmNkMzRiNThhNzhiZGVhYjczMDgzMjQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2OWU0NzQ5YzBkZjRmY2ZiMjQ3ZmVlYjVkZGNhYzUxLmJpbmRQb3B1cChwb3B1cF8zMzgzMWFhM2FiOWI0MGRiYTRjNjExNGJjY2MwNWVkZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNWUyNWFmOWM2OWM0MGRmOWExMzFmYzQ2OTQ2ODFhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjA5YjVhMjFjZjI0Mjc3OWU0YzliNzMzZTk4YjU5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGIxZTk0MjY2YzQ0MjU2OTEwY2VkZGJjMzU4Y2UxZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjhiMWU5NDI2NmM0NDI1NjkxMGNlZGRiYzM1OGNlMWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NjA5YjVhMjFjZjI0Mjc3OWU0YzliNzMzZTk4YjU5Mi5zZXRDb250ZW50KGh0bWxfNjhiMWU5NDI2NmM0NDI1NjkxMGNlZGRiYzM1OGNlMWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVlMjVhZjljNjljNDBkZjlhMTMxZmM0Njk0NjgxYTYuYmluZFBvcHVwKHBvcHVwXzY2MDliNWEyMWNmMjQyNzc5ZTRjOWI3MzNlOThiNTkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3Y2ViOWNiM2NjNTRmN2ZhNDVkM2RhNzdkZWZlYWFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjdjN2JjMWYyNzg1NDhkNjkzYjNmODY0ZjhlMDYzNTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc3NzA1ODAyNTVlNDA5Y2FmMWE5NDAwMWZhOTEzYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzU3NzcwNTgwMjU1ZTQwOWNhZjFhOTQwMDFmYTkxM2E2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3YzdiYzFmMjc4NTQ4ZDY5M2IzZjg2NGY4ZTA2MzUxLnNldENvbnRlbnQoaHRtbF81Nzc3MDU4MDI1NWU0MDljYWYxYTk0MDAxZmE5MTNhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2NlYjljYjNjYzU0ZjdmYTQ1ZDNkYTc3ZGVmZWFhZS5iaW5kUG9wdXAocG9wdXBfNjdjN2JjMWYyNzg1NDhkNjkzYjNmODY0ZjhlMDYzNTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzIwMjZkZDczMmM3NDc2Yzg5ZWFmZjkxODJiYmJlZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yM2EzYzc1NTY5YTc0NDBjYmE2Mzg5M2M0ODZmZTAzYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YTczMjFiMzJmZTA0NThlOGU3OTc4ZmJlZGFiZTJkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNWYxN2M4NTg3ZTE0Yzg4YjVlNGFiMmY2MmM3YWFkNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjVmMTdjODU4N2UxNGM4OGI1ZTRhYjJmNjJjN2FhZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhhNzMyMWIzMmZlMDQ1OGU4ZTc5NzhmYmVkYWJlMmQ5LnNldENvbnRlbnQoaHRtbF8yNWYxN2M4NTg3ZTE0Yzg4YjVlNGFiMmY2MmM3YWFkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MjAyNmRkNzMyYzc0NzZjODllYWZmOTE4MmJiYmVkMC5iaW5kUG9wdXAocG9wdXBfOGE3MzIxYjMyZmUwNDU4ZThlNzk3OGZiZWRhYmUyZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmVlYWM1OTlhN2EyNGNhNjg2NjA1Mzc0N2NhMzdiNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjcxMThhYmIxY2NmNDFjY2I2MzNmNjRhMGNiNjljNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjYyZDZkZmYyNjRlNDk4NmJjMmJhMzM4MGY3MWFiMWMgPSAkKCc8ZGl2IGlkPSJodG1sX2I2MmQ2ZGZmMjY0ZTQ5ODZiYzJiYTMzODBmNzFhYjFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzExOGFiYjFjY2Y0MWNjYjYzM2Y2NGEwY2I2OWM1ZC5zZXRDb250ZW50KGh0bWxfYjYyZDZkZmYyNjRlNDk4NmJjMmJhMzM4MGY3MWFiMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmVlYWM1OTlhN2EyNGNhNjg2NjA1Mzc0N2NhMzdiNTcuYmluZFBvcHVwKHBvcHVwXzY3MTE4YWJiMWNjZjQxY2NiNjMzZjY0YTBjYjY5YzVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzMjU1ZTgxMGVmMzQyNWU5NmFhY2QzYjk2N2E0NTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2YTQwZTI2YjYyODRhODBhZDk2ZTdkMTRkZmU3NjAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1NGZhODIxNmNmNDQ3ZDBiZDcwZjM3ZTE4Y2E1OGJlID0gJCgnPGRpdiBpZD0iaHRtbF8zNTRmYTgyMTZjZjQ0N2QwYmQ3MGYzN2UxOGNhNThiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmE0MGUyNmI2Mjg0YTgwYWQ5NmU3ZDE0ZGZlNzYwMy5zZXRDb250ZW50KGh0bWxfMzU0ZmE4MjE2Y2Y0NDdkMGJkNzBmMzdlMThjYTU4YmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjMyNTVlODEwZWYzNDI1ZTk2YWFjZDNiOTY3YTQ1NjEuYmluZFBvcHVwKHBvcHVwX2Y2YTQwZTI2YjYyODRhODBhZDk2ZTdkMTRkZmU3NjAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlMzdkZTFhYzg3MzQ4OWRhY2MzZjM1NjE3YzcyMGY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVlYWQ2MDM3ZTczNDU5M2EyMWU2MzI3MmFkN2ExYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODBlMjQwMzZkMmIwNGE1YTk3NWFlZDM3NTliOGVhMjkgPSAkKCc8ZGl2IGlkPSJodG1sXzgwZTI0MDM2ZDJiMDRhNWE5NzVhZWQzNzU5YjhlYTI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZWVhZDYwMzdlNzM0NTkzYTIxZTYzMjcyYWQ3YTFjMS5zZXRDb250ZW50KGh0bWxfODBlMjQwMzZkMmIwNGE1YTk3NWFlZDM3NTliOGVhMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWUzN2RlMWFjODczNDg5ZGFjYzNmMzU2MTdjNzIwZjcuYmluZFBvcHVwKHBvcHVwX2JlZWFkNjAzN2U3MzQ1OTNhMjFlNjMyNzJhZDdhMWMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmODUyNTAwYWRiNjQ4ZmY5ZTkwZGY5MzI0MWRmZDZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiNTg4OTI3MjlkNTQ2MThhNjA1ODQyNjU0OTlhZjlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4YWRjNzI3MDdmYjQ2MDQ5MmYxZDZkYzkzZWM0Y2I5ID0gJCgnPGRpdiBpZD0iaHRtbF8yOGFkYzcyNzA3ZmI0NjA0OTJmMWQ2ZGM5M2VjNGNiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjU4ODkyNzI5ZDU0NjE4YTYwNTg0MjY1NDk5YWY5ZC5zZXRDb250ZW50KGh0bWxfMjhhZGM3MjcwN2ZiNDYwNDkyZjFkNmRjOTNlYzRjYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGY4NTI1MDBhZGI2NDhmZjllOTBkZjkzMjQxZGZkNmIuYmluZFBvcHVwKHBvcHVwX2NiNTg4OTI3MjlkNTQ2MThhNjA1ODQyNjU0OTlhZjlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5NzljZTdmYjUyMTQ2MjdhZmNkM2RiNGVmNDljMDFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxM2I2ZDhiOTNiZTQwMzdiNTUzZTg1MGJhYTIyMGI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllZTA4ZDZiOGJiODQ1ODU5OGI0MjZmNGVmYjBhZDNiID0gJCgnPGRpdiBpZD0iaHRtbF85ZWUwOGQ2YjhiYjg0NTg1OThiNDI2ZjRlZmIwYWQzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODEzYjZkOGI5M2JlNDAzN2I1NTNlODUwYmFhMjIwYjguc2V0Q29udGVudChodG1sXzllZTA4ZDZiOGJiODQ1ODU5OGI0MjZmNGVmYjBhZDNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5NzljZTdmYjUyMTQ2MjdhZmNkM2RiNGVmNDljMDFiLmJpbmRQb3B1cChwb3B1cF84MTNiNmQ4YjkzYmU0MDM3YjU1M2U4NTBiYWEyMjBiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NGFlNzBkMjk5MGI0Yjk0OWViOWFmNDI2MmJkMzc0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzgwNDU0NzkzZDFmNDdlYjgwYzFhNWI3Yzg1MmY4NDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDllZTM2MDYwOGZlNDk0MDkwNjg1MmExN2VhMmMyZTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q5ZWUzNjA2MDhmZTQ5NDA5MDY4NTJhMTdlYTJjMmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODA0NTQ3OTNkMWY0N2ViODBjMWE1YjdjODUyZjg0My5zZXRDb250ZW50KGh0bWxfZDllZTM2MDYwOGZlNDk0MDkwNjg1MmExN2VhMmMyZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTRhZTcwZDI5OTBiNGI5NDllYjlhZjQyNjJiZDM3NGEuYmluZFBvcHVwKHBvcHVwXzM4MDQ1NDc5M2QxZjQ3ZWI4MGMxYTViN2M4NTJmODQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkNzQ4NzIxZTE5MTQ2YTU4ZGY4MzUzMzExMjIwOGI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlOTIwOTI0NzMwNTQzOGQ4NTdkODAxZTUzMDFkZTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzZWY3NGU3ZTY0MTQ1NDZiYWFhOGU3YmQzYzQ0NmZlID0gJCgnPGRpdiBpZD0iaHRtbF9hM2VmNzRlN2U2NDE0NTQ2YmFhYThlN2JkM2M0NDZmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTkyMDkyNDczMDU0MzhkODU3ZDgwMWU1MzAxZGUxYS5zZXRDb250ZW50KGh0bWxfYTNlZjc0ZTdlNjQxNDU0NmJhYWE4ZTdiZDNjNDQ2ZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q3NDg3MjFlMTkxNDZhNThkZjgzNTMzMTEyMjA4YjkuYmluZFBvcHVwKHBvcHVwXzZlOTIwOTI0NzMwNTQzOGQ4NTdkODAxZTUzMDFkZTFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4MDk4ZTIwZDNlNDRmYzQ5YjM3ZTVjYmQ5Y2Q0YzdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzIzYTNjNzU1NjlhNzQ0MGNiYTYzODkzYzQ4NmZlMDNhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmMzQyZjcxYWU5NDQwNTQ5MDY0MWJkM2M3YmNkMTM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5YzlkN2EwMjgwMDRjZWY4M2M3YWZjNjBkNjQ3NDExID0gJCgnPGRpdiBpZD0iaHRtbF9mOWM5ZDdhMDI4MDA0Y2VmODNjN2FmYzYwZDY0NzQxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmMzQyZjcxYWU5NDQwNTQ5MDY0MWJkM2M3YmNkMTM1LnNldENvbnRlbnQoaHRtbF9mOWM5ZDdhMDI4MDA0Y2VmODNjN2FmYzYwZDY0NzQxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ODA5OGUyMGQzZTQ0ZmM0OWIzN2U1Y2JkOWNkNGM3ZC5iaW5kUG9wdXAocG9wdXBfZmYzNDJmNzFhZTk0NDA1NDkwNjQxYmQzYzdiY2QxMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDVhY2EzMjg3OWU0NDc3MTkzMGI4YTMzMzYwZTJiNjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjNhM2M3NTU2OWE3NDQwY2JhNjM4OTNjNDg2ZmUwM2EpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFjNmVlMzYxOGY4NGRiZjk0YzI5MDRhYzViZDI1YmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI4MGI5OWU3NjI1NDc2MmI5YjA0NDM0ZGNkNTg5NGQgPSAkKCc8ZGl2IGlkPSJodG1sXzhiODBiOTllNzYyNTQ3NjJiOWIwNDQzNGRjZDU4OTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxYzZlZTM2MThmODRkYmY5NGMyOTA0YWM1YmQyNWJlLnNldENvbnRlbnQoaHRtbF84YjgwYjk5ZTc2MjU0NzYyYjliMDQ0MzRkY2Q1ODk0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNWFjYTMyODc5ZTQ0NzcxOTMwYjhhMzMzNjBlMmI2OS5iaW5kUG9wdXAocG9wdXBfOTFjNmVlMzYxOGY4NGRiZjk0YzI5MDRhYzViZDI1YmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<folium.folium.Map at 0x7f15a214af60>" | |
| ] | |
| }, | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map of Manhattan using latitude and longitude values\n", | |
| "map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_data['Neighborhood']):\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_manhattan) \n", | |
| " \n", | |
| "map_manhattan" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Define Foursquare Credentials and Version\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Your credentails:\n", | |
| "CLIENT_ID: LRCVSE0QNZ1PZQOKHW5ZAPO20LXQI22HSVDFCAPVZAGFCXPN\n", | |
| "CLIENT_SECRET:02IYWPLU21L2SBK1FI2C4UQOCEZIQQMP0UANHZYBJMYL1DFV\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "CLIENT_ID = 'LRCVSE0QNZ1PZQOKHW5ZAPO20LXQI22HSVDFCAPVZAGFCXPN' # your Foursquare ID\n", | |
| "CLIENT_SECRET = '02IYWPLU21L2SBK1FI2C4UQOCEZIQQMP0UANHZYBJMYL1DFV' # your Foursquare Secret\n", | |
| "VERSION = '20180605' # Foursquare API version\n", | |
| "LIMIT = 100 # A default Foursquare API limit value\n", | |
| "\n", | |
| "print('Your credentails:')\n", | |
| "print('CLIENT_ID: ' + CLIENT_ID)\n", | |
| "print('CLIENT_SECRET:' + CLIENT_SECRET)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Let's explore the first neighborhood in our dataframe.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Get the neighborhood's name.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "'Marble Hill'" | |
| ] | |
| }, | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "manhattan_data.loc[0, 'Neighborhood']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Get the neighborhood's latitude and longitude values.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n", | |
| "neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n", | |
| "\n", | |
| "neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n", | |
| "\n", | |
| "print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n", | |
| " neighborhood_latitude, \n", | |
| " neighborhood_longitude))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "First, let's create the GET request URL. Name your URL **url**.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "'https://api.foursquare.com/v2/venues/explore?&client_id=LRCVSE0QNZ1PZQOKHW5ZAPO20LXQI22HSVDFCAPVZAGFCXPN&client_secret=02IYWPLU21L2SBK1FI2C4UQOCEZIQQMP0UANHZYBJMYL1DFV&v=20180605&ll=40.87655077879964,-73.91065965862981&radius=500&limit=100'" | |
| ] | |
| }, | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# type your answer here\n", | |
| "LIMIT = 100\n", | |
| "radius = 500\n", | |
| "\n", | |
| "url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
| " CLIENT_ID, \n", | |
| " CLIENT_SECRET, \n", | |
| " VERSION, \n", | |
| " neighborhood_latitude, \n", | |
| " neighborhood_longitude, \n", | |
| " radius, \n", | |
| " LIMIT)\n", | |
| "url" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Double-click **here** for the solution.\n", | |
| "\n", | |
| "<!-- The correct answer is:\n", | |
| "LIMIT = 100 # limit of number of venues returned by Foursquare API\n", | |
| "-->\n", | |
| "\n", | |
| "<!--\n", | |
| "radius = 500 # define radius\n", | |
| "-->\n", | |
| "\n", | |
| "<!--\n", | |
| "\\\\\\\\ # create URL\n", | |
| "url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
| " CLIENT_ID, \n", | |
| " CLIENT_SECRET, \n", | |
| " VERSION, \n", | |
| " neighborhood_latitude, \n", | |
| " neighborhood_longitude, \n", | |
| " radius, \n", | |
| " LIMIT)\n", | |
| "url # display URL\n", | |
| "--> \n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Send the GET request and examine the resutls\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'meta': {'code': 200, 'requestId': '6021412b20a3ba26ffdf8351'},\n", | |
| " 'response': {'suggestedFilters': {'header': 'Tap to show:',\n", | |
| " 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n", | |
| " 'headerLocation': 'Marble Hill',\n", | |
| " 'headerFullLocation': 'Marble Hill, New York',\n", | |
| " 'headerLocationGranularity': 'neighborhood',\n", | |
| " 'totalResults': 23,\n", | |
| " 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n", | |
| " 'lng': -73.90471933917806},\n", | |
| " 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n", | |
| " 'groups': [{'type': 'Recommended Places',\n", | |
| " 'name': 'recommended',\n", | |
| " 'items': [{'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b4429abf964a52037f225e3',\n", | |
| " 'name': \"Arturo's\",\n", | |
| " 'location': {'address': '5198 Broadway',\n", | |
| " 'crossStreet': 'at 225th St.',\n", | |
| " 'lat': 40.87441177110231,\n", | |
| " 'lng': -73.91027100981574,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87441177110231,\n", | |
| " 'lng': -73.91027100981574},\n", | |
| " {'label': 'entrance', 'lat': 40.874401, 'lng': -73.910339}],\n", | |
| " 'distance': 240,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'New York',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5198 Broadway (at 225th St.)',\n", | |
| " 'New York, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n", | |
| " 'name': 'Pizza Place',\n", | |
| " 'pluralName': 'Pizza Places',\n", | |
| " 'shortName': 'Pizza',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'delivery': {'id': '72548',\n", | |
| " 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n", | |
| " 'provider': {'name': 'seamless',\n", | |
| " 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
| " 'sizes': [40, 50],\n", | |
| " 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4baf59e8f964a520a6f93be3',\n", | |
| " 'name': 'Bikram Yoga',\n", | |
| " 'location': {'address': '5500 Broadway',\n", | |
| " 'crossStreet': '230th Street',\n", | |
| " 'lat': 40.876843690797934,\n", | |
| " 'lng': -73.90620384419528,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.876843690797934,\n", | |
| " 'lng': -73.90620384419528}],\n", | |
| " 'distance': 376,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5500 Broadway (230th Street)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d102941735',\n", | |
| " 'name': 'Yoga Studio',\n", | |
| " 'pluralName': 'Yoga Studios',\n", | |
| " 'shortName': 'Yoga Studio',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b79cc46f964a520c5122fe3',\n", | |
| " 'name': 'Tibbett Diner',\n", | |
| " 'location': {'address': '3033 Tibbett Ave',\n", | |
| " 'crossStreet': 'btwn 230th & 231st',\n", | |
| " 'lat': 40.8804044222466,\n", | |
| " 'lng': -73.90893738006402,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.8804044222466,\n", | |
| " 'lng': -73.90893738006402},\n", | |
| " {'label': 'entrance', 'lat': 40.880388, 'lng': -73.90896}],\n", | |
| " 'distance': 452,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d147941735',\n", | |
| " 'name': 'Diner',\n", | |
| " 'pluralName': 'Diners',\n", | |
| " 'shortName': 'Diner',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'delivery': {'id': '2539986',\n", | |
| " 'url': 'https://www.seamless.com/menu/tibbett-diner-3033-tibbett-ave-bronx/2539986?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=2539986',\n", | |
| " 'provider': {'name': 'seamless',\n", | |
| " 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
| " 'sizes': [40, 50],\n", | |
| " 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '55f81cd2498ee903149fcc64',\n", | |
| " 'name': 'Starbucks',\n", | |
| " 'location': {'address': '171 W 230th St',\n", | |
| " 'crossStreet': 'Kimberly Pl',\n", | |
| " 'lat': 40.87753134921497,\n", | |
| " 'lng': -73.90558216359267,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87753134921497,\n", | |
| " 'lng': -73.90558216359267}],\n", | |
| " 'distance': 441,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n", | |
| " 'name': 'Coffee Shop',\n", | |
| " 'pluralName': 'Coffee Shops',\n", | |
| " 'shortName': 'Coffee Shop',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-55f81cd2498ee903149fcc64-3'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b5357adf964a520319827e3',\n", | |
| " 'name': \"Dunkin'\",\n", | |
| " 'location': {'address': '5501 Broadway',\n", | |
| " 'crossStreet': 'W 230th St',\n", | |
| " 'lat': 40.87713584201589,\n", | |
| " 'lng': -73.90666550701411,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87713584201589,\n", | |
| " 'lng': -73.90666550701411}],\n", | |
| " 'distance': 342,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5501 Broadway (W 230th St)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d148941735',\n", | |
| " 'name': 'Donut Shop',\n", | |
| " 'pluralName': 'Donut Shops',\n", | |
| " 'shortName': 'Donuts',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'delivery': {'id': '2200464',\n", | |
| " 'url': 'https://www.seamless.com/menu/dunkin-5501-broadway-bronx/2200464?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=2200464',\n", | |
| " 'provider': {'name': 'seamless',\n", | |
| " 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
| " 'sizes': [40, 50],\n", | |
| " 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b5357adf964a520319827e3-4'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n", | |
| " 'name': 'TCR The Club of Riverdale',\n", | |
| " 'location': {'address': '2600 Netherland Ave',\n", | |
| " 'lat': 40.8786283,\n", | |
| " 'lng': -73.9145678,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.8786283,\n", | |
| " 'lng': -73.9145678}],\n", | |
| " 'distance': 402,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['2600 Netherland Ave',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n", | |
| " 'name': 'Tennis Stadium',\n", | |
| " 'pluralName': 'Tennis Stadiums',\n", | |
| " 'shortName': 'Tennis',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []},\n", | |
| " 'venuePage': {'id': '40358759'}},\n", | |
| " 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-5'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '55f751ca498eacc0307d1cfe',\n", | |
| " 'name': 'Blink Fitness',\n", | |
| " 'location': {'address': '5520 Broadway',\n", | |
| " 'crossStreet': 'at W 230th St',\n", | |
| " 'lat': 40.877271495944626,\n", | |
| " 'lng': -73.90559491338075,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.877271495944626,\n", | |
| " 'lng': -73.90559491338075}],\n", | |
| " 'distance': 433,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'neighborhood': 'Kingsbridge',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5520 Broadway (at W 230th St)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d176941735',\n", | |
| " 'name': 'Gym',\n", | |
| " 'pluralName': 'Gyms',\n", | |
| " 'shortName': 'Gym',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-55f751ca498eacc0307d1cfe-6'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '546d31ca498e561c698a0320',\n", | |
| " 'name': 'T.J. Maxx',\n", | |
| " 'location': {'lat': 40.87723198343352,\n", | |
| " 'lng': -73.90504239962168,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87723198343352,\n", | |
| " 'lng': -73.90504239962168}],\n", | |
| " 'distance': 478,\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['Bronx, NY', 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n", | |
| " 'name': 'Department Store',\n", | |
| " 'pluralName': 'Department Stores',\n", | |
| " 'shortName': 'Department Store',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-546d31ca498e561c698a0320-7'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4cf6ae55d3a8a1cd71a9d243',\n", | |
| " 'name': 'Astral Fitness & Wellness Center',\n", | |
| " 'location': {'address': '5500 Broadway',\n", | |
| " 'crossStreet': '230th St',\n", | |
| " 'lat': 40.87670526507199,\n", | |
| " 'lng': -73.90637207670373,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87670526507199,\n", | |
| " 'lng': -73.90637207670373},\n", | |
| " {'label': 'entrance', 'lat': 40.87685, 'lng': -73.906058}],\n", | |
| " 'distance': 361,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5500 Broadway (230th St)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d176941735',\n", | |
| " 'name': 'Gym',\n", | |
| " 'pluralName': 'Gyms',\n", | |
| " 'shortName': 'Gym',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []},\n", | |
| " 'venuePage': {'id': '75803748'}},\n", | |
| " 'referralId': 'e-0-4cf6ae55d3a8a1cd71a9d243-8'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '57655be738faa66160da7527',\n", | |
| " 'name': 'Starbucks',\n", | |
| " 'location': {'address': '50 W 225th St',\n", | |
| " 'lat': 40.873754554218515,\n", | |
| " 'lng': -73.90861305343668,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.873754554218515,\n", | |
| " 'lng': -73.90861305343668},\n", | |
| " {'label': 'entrance', 'lat': 40.873502, 'lng': -73.907986}],\n", | |
| " 'distance': 355,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'New York',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['50 W 225th St',\n", | |
| " 'New York, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n", | |
| " 'name': 'Coffee Shop',\n", | |
| " 'pluralName': 'Coffee Shops',\n", | |
| " 'shortName': 'Coffee Shop',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-57655be738faa66160da7527-9'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '5631194e498e2de074de661c',\n", | |
| " 'name': 'Vitamin Shoppe',\n", | |
| " 'location': {'address': '5510 Broadway',\n", | |
| " 'lat': 40.87716,\n", | |
| " 'lng': -73.905632,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87716,\n", | |
| " 'lng': -73.905632},\n", | |
| " {'label': 'entrance', 'lat': 40.877165, 'lng': -73.905673}],\n", | |
| " 'distance': 428,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5510 Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n", | |
| " 'name': 'Supplement Shop',\n", | |
| " 'pluralName': 'Supplement Shops',\n", | |
| " 'shortName': 'Supplement Shop',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-5631194e498e2de074de661c-10'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b9c9c6af964a520b27236e3',\n", | |
| " 'name': 'Land & Sea Restaurant',\n", | |
| " 'location': {'address': '5535 Broadway',\n", | |
| " 'crossStreet': '231st St',\n", | |
| " 'lat': 40.87788463309788,\n", | |
| " 'lng': -73.90587282193539,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87788463309788,\n", | |
| " 'lng': -73.90587282193539},\n", | |
| " {'label': 'entrance', 'lat': 40.877906, 'lng': -73.905722}],\n", | |
| " 'distance': 429,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5535 Broadway (231st St)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n", | |
| " 'name': 'Seafood Restaurant',\n", | |
| " 'pluralName': 'Seafood Restaurants',\n", | |
| " 'shortName': 'Seafood',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b9c9c6af964a520b27236e3-11'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n", | |
| " 'name': 'Lot Less Closeouts',\n", | |
| " 'location': {'address': '5545 Broadway',\n", | |
| " 'crossStreet': '231st St',\n", | |
| " 'lat': 40.878270422202085,\n", | |
| " 'lng': -73.9052646742604,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.878270422202085,\n", | |
| " 'lng': -73.9052646742604},\n", | |
| " {'label': 'entrance', 'lat': 40.87828, 'lng': -73.905466}],\n", | |
| " 'distance': 492,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5545 Broadway (231st St)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n", | |
| " 'name': 'Discount Store',\n", | |
| " 'pluralName': 'Discount Stores',\n", | |
| " 'shortName': 'Discount Store',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-12'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b88e053f964a5208a1132e3',\n", | |
| " 'name': 'Rite Aid',\n", | |
| " 'location': {'address': '5237 Broadway',\n", | |
| " 'crossStreet': '228th Street',\n", | |
| " 'lat': 40.875466574434704,\n", | |
| " 'lng': -73.90890629016033,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.875466574434704,\n", | |
| " 'lng': -73.90890629016033}],\n", | |
| " 'distance': 190,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5237 Broadway (228th Street)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d10f951735',\n", | |
| " 'name': 'Pharmacy',\n", | |
| " 'pluralName': 'Pharmacies',\n", | |
| " 'shortName': 'Pharmacy',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b88e053f964a5208a1132e3-13'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n", | |
| " 'name': 'Baskin-Robbins',\n", | |
| " 'location': {'address': '5501 Broadway',\n", | |
| " 'lat': 40.87714929478882,\n", | |
| " 'lng': -73.90665810372622,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87714929478882,\n", | |
| " 'lng': -73.90665810372622},\n", | |
| " {'label': 'entrance', 'lat': 40.877129, 'lng': -73.906608}],\n", | |
| " 'distance': 343,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5501 Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n", | |
| " 'name': 'Ice Cream Shop',\n", | |
| " 'pluralName': 'Ice Cream Shops',\n", | |
| " 'shortName': 'Ice Cream',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-14'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b4f7b65f964a5205a0827e3',\n", | |
| " 'name': 'Subway',\n", | |
| " 'location': {'address': '5209 Broadway',\n", | |
| " 'lat': 40.8746665302951,\n", | |
| " 'lng': -73.9095858429637,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.8746665302951,\n", | |
| " 'lng': -73.9095858429637}],\n", | |
| " 'distance': 228,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5209 Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n", | |
| " 'name': 'Sandwich Place',\n", | |
| " 'pluralName': 'Sandwich Places',\n", | |
| " 'shortName': 'Sandwiches',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b4f7b65f964a5205a0827e3-15'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '585c205665e7c70a2f1055ea',\n", | |
| " 'name': 'Boston Market',\n", | |
| " 'location': {'address': '5520 Broadway',\n", | |
| " 'lat': 40.87743,\n", | |
| " 'lng': -73.9054121,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87743,\n", | |
| " 'lng': -73.9054121}],\n", | |
| " 'distance': 452,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5520 Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d14e941735',\n", | |
| " 'name': 'American Restaurant',\n", | |
| " 'pluralName': 'American Restaurants',\n", | |
| " 'shortName': 'American',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'delivery': {'id': '1436334',\n", | |
| " 'url': 'https://www.seamless.com/menu/boston-market-5520-broadway-bronx/1436334?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=1436334',\n", | |
| " 'provider': {'name': 'seamless',\n", | |
| " 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n", | |
| " 'sizes': [40, 50],\n", | |
| " 'name': '/delivery_provider_seamless_20180129.png'}}},\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-585c205665e7c70a2f1055ea-16'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '56229ff8498e2abb44b6f12b',\n", | |
| " 'name': 'Five Below',\n", | |
| " 'location': {'address': '171 W 230th St',\n", | |
| " 'lat': 40.8772564,\n", | |
| " 'lng': -73.9049384,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.8772564,\n", | |
| " 'lng': -73.9049384}],\n", | |
| " 'distance': 487,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['171 W 230th St',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n", | |
| " 'name': 'Discount Store',\n", | |
| " 'pluralName': 'Discount Stores',\n", | |
| " 'shortName': 'Discount Store',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-56229ff8498e2abb44b6f12b-17'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4b9f030af964a520eb0f37e3',\n", | |
| " 'name': 'GameStop',\n", | |
| " 'location': {'address': '90 W 225th St Ste A-B',\n", | |
| " 'crossStreet': 'btw Broadway & Exterior St.',\n", | |
| " 'lat': 40.874266802124836,\n", | |
| " 'lng': -73.90934218062803,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.874266802124836,\n", | |
| " 'lng': -73.90934218062803}],\n", | |
| " 'distance': 277,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d10b951735',\n", | |
| " 'name': 'Video Game Store',\n", | |
| " 'pluralName': 'Video Game Stores',\n", | |
| " 'shortName': 'Video Games',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4b9f030af964a520eb0f37e3-18'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n", | |
| " 'name': 'Subway',\n", | |
| " 'location': {'address': '5549 Broadway',\n", | |
| " 'lat': 40.878464979323944,\n", | |
| " 'lng': -73.9055176422437,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.878464979323944,\n", | |
| " 'lng': -73.9055176422437},\n", | |
| " {'label': 'entrance', 'lat': 40.878473, 'lng': -73.905329}],\n", | |
| " 'distance': 482,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['5549 Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n", | |
| " 'name': 'Sandwich Place',\n", | |
| " 'pluralName': 'Sandwich Places',\n", | |
| " 'shortName': 'Sandwiches',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-19'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4dfe40df8877333e195b68fc',\n", | |
| " 'name': 'Parrilla Latina',\n", | |
| " 'location': {'address': '230th St & Broadway',\n", | |
| " 'lat': 40.87747294351472,\n", | |
| " 'lng': -73.90607346968568,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.87747294351472,\n", | |
| " 'lng': -73.90607346968568}],\n", | |
| " 'distance': 399,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['230th St & Broadway',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n", | |
| " 'name': 'Steakhouse',\n", | |
| " 'pluralName': 'Steakhouses',\n", | |
| " 'shortName': 'Steakhouse',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4dfe40df8877333e195b68fc-20'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n", | |
| " 'name': \"The Children's Place\",\n", | |
| " 'location': {'address': '44 W 225th St',\n", | |
| " 'lat': 40.873671591133125,\n", | |
| " 'lng': -73.90815619608166,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.873671591133125,\n", | |
| " 'lng': -73.90815619608166}],\n", | |
| " 'distance': 383,\n", | |
| " 'postalCode': '10463',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'Bronx',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['44 W 225th St',\n", | |
| " 'Bronx, NY 10463',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d105951735',\n", | |
| " 'name': 'Kids Store',\n", | |
| " 'pluralName': 'Kids Stores',\n", | |
| " 'shortName': 'Kids Store',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-21'},\n", | |
| " {'reasons': {'count': 0,\n", | |
| " 'items': [{'summary': 'This spot is popular',\n", | |
| " 'type': 'general',\n", | |
| " 'reasonName': 'globalInteractionReason'}]},\n", | |
| " 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n", | |
| " 'name': 'Terrace View Delicatessen',\n", | |
| " 'location': {'address': '135 Terrace View Ave.',\n", | |
| " 'lat': 40.875995,\n", | |
| " 'lng': -73.913151,\n", | |
| " 'labeledLatLngs': [{'label': 'display',\n", | |
| " 'lat': 40.875995,\n", | |
| " 'lng': -73.913151},\n", | |
| " {'label': 'entrance', 'lat': 40.875964, 'lng': -73.912985}],\n", | |
| " 'distance': 218,\n", | |
| " 'postalCode': '10034',\n", | |
| " 'cc': 'US',\n", | |
| " 'city': 'New York',\n", | |
| " 'state': 'NY',\n", | |
| " 'country': 'United States',\n", | |
| " 'formattedAddress': ['135 Terrace View Ave.',\n", | |
| " 'New York, NY 10034',\n", | |
| " 'United States']},\n", | |
| " 'categories': [{'id': '4bf58dd8d48988d146941735',\n", | |
| " 'name': 'Deli / Bodega',\n", | |
| " 'pluralName': 'Delis / Bodegas',\n", | |
| " 'shortName': 'Deli / Bodega',\n", | |
| " 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n", | |
| " 'suffix': '.png'},\n", | |
| " 'primary': True}],\n", | |
| " 'photos': {'count': 0, 'groups': []}},\n", | |
| " 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-22'}]}]}}" | |
| ] | |
| }, | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "results = requests.get(url).json()\n", | |
| "results" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "From the Foursquare lab in the previous module, we know that all the information is in the _items_ key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# function that extracts the category of the venue\n", | |
| "def get_category_type(row):\n", | |
| " try:\n", | |
| " categories_list = row['categories']\n", | |
| " except:\n", | |
| " categories_list = row['venue.categories']\n", | |
| " \n", | |
| " if len(categories_list) == 0:\n", | |
| " return None\n", | |
| " else:\n", | |
| " return categories_list[0]['name']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Now we are ready to clean the json and structure it into a _pandas_ dataframe.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead\n", | |
| " This is separate from the ipykernel package so we can avoid doing imports until\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>name</th>\n", | |
| " <th>categories</th>\n", | |
| " <th>lat</th>\n", | |
| " <th>lng</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Arturo's</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>40.874412</td>\n", | |
| " <td>-73.910271</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Bikram Yoga</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>40.876844</td>\n", | |
| " <td>-73.906204</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Tibbett Diner</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>40.880404</td>\n", | |
| " <td>-73.908937</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Starbucks</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>40.877531</td>\n", | |
| " <td>-73.905582</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Dunkin'</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>40.877136</td>\n", | |
| " <td>-73.906666</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " name categories lat lng\n", | |
| "0 Arturo's Pizza Place 40.874412 -73.910271\n", | |
| "1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n", | |
| "2 Tibbett Diner Diner 40.880404 -73.908937\n", | |
| "3 Starbucks Coffee Shop 40.877531 -73.905582\n", | |
| "4 Dunkin' Donut Shop 40.877136 -73.906666" | |
| ] | |
| }, | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "venues = results['response']['groups'][0]['items']\n", | |
| " \n", | |
| "nearby_venues = json_normalize(venues) # flatten JSON\n", | |
| "\n", | |
| "# filter columns\n", | |
| "filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n", | |
| "nearby_venues =nearby_venues.loc[:, filtered_columns]\n", | |
| "\n", | |
| "# filter the category for each row\n", | |
| "nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n", | |
| "\n", | |
| "# clean columns\n", | |
| "nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n", | |
| "\n", | |
| "nearby_venues.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "And how many venues were returned by Foursquare?\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 25, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "23 venues were returned by Foursquare.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "<a id='item2'></a>\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 2. Explore Neighborhoods in Manhattan\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 26, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def getNearbyVenues(names, latitudes, longitudes, radius=500):\n", | |
| " \n", | |
| " venues_list=[]\n", | |
| " for name, lat, lng in zip(names, latitudes, longitudes):\n", | |
| " print(name)\n", | |
| " \n", | |
| " # create the API request URL\n", | |
| " url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
| " CLIENT_ID, \n", | |
| " CLIENT_SECRET, \n", | |
| " VERSION, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " radius, \n", | |
| " LIMIT)\n", | |
| " \n", | |
| " # make the GET request\n", | |
| " results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n", | |
| " \n", | |
| " # return only relevant information for each nearby venue\n", | |
| " venues_list.append([(\n", | |
| " name, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " v['venue']['name'], \n", | |
| " v['venue']['location']['lat'], \n", | |
| " v['venue']['location']['lng'], \n", | |
| " v['venue']['categories'][0]['name']) for v in results])\n", | |
| "\n", | |
| " nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n", | |
| " nearby_venues.columns = ['Neighborhood', \n", | |
| " 'Neighborhood Latitude', \n", | |
| " 'Neighborhood Longitude', \n", | |
| " 'Venue', \n", | |
| " 'Venue Latitude', \n", | |
| " 'Venue Longitude', \n", | |
| " 'Venue Category']\n", | |
| " \n", | |
| " return(nearby_venues)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Now write the code to run the above function on each neighborhood and create a new dataframe called _manhattan_venues_.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Marble Hill\n", | |
| "Chinatown\n", | |
| "Washington Heights\n", | |
| "Inwood\n", | |
| "Hamilton Heights\n", | |
| "Manhattanville\n", | |
| "Central Harlem\n", | |
| "East Harlem\n", | |
| "Upper East Side\n", | |
| "Yorkville\n", | |
| "Lenox Hill\n", | |
| "Roosevelt Island\n", | |
| "Upper West Side\n", | |
| "Lincoln Square\n", | |
| "Clinton\n", | |
| "Midtown\n", | |
| "Murray Hill\n", | |
| "Chelsea\n", | |
| "Greenwich Village\n", | |
| "East Village\n", | |
| "Lower East Side\n", | |
| "Tribeca\n", | |
| "Little Italy\n", | |
| "Soho\n", | |
| "West Village\n", | |
| "Manhattan Valley\n", | |
| "Morningside Heights\n", | |
| "Gramercy\n", | |
| "Battery Park City\n", | |
| "Financial District\n", | |
| "Carnegie Hill\n", | |
| "Noho\n", | |
| "Civic Center\n", | |
| "Midtown South\n", | |
| "Sutton Place\n", | |
| "Turtle Bay\n", | |
| "Tudor City\n", | |
| "Stuyvesant Town\n", | |
| "Flatiron\n", | |
| "Hudson Yards\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# type your answer here\n", | |
| "\n", | |
| "manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n", | |
| " latitudes=manhattan_data['Latitude'],\n", | |
| " longitudes=manhattan_data['Longitude']\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Double-click **here** for the solution.\n", | |
| "\n", | |
| "<!-- The correct answer is:\n", | |
| "manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n", | |
| " latitudes=manhattan_data['Latitude'],\n", | |
| " longitudes=manhattan_data['Longitude']\n", | |
| " )\n", | |
| "--> \n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Let's check the size of the resulting dataframe\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 28, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(3169, 7)\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Neighborhood Latitude</th>\n", | |
| " <th>Neighborhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.91066</td>\n", | |
| " <td>Arturo's</td>\n", | |
| " <td>40.874412</td>\n", | |
| " <td>-73.910271</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.91066</td>\n", | |
| " <td>Bikram Yoga</td>\n", | |
| " <td>40.876844</td>\n", | |
| " <td>-73.906204</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.91066</td>\n", | |
| " <td>Tibbett Diner</td>\n", | |
| " <td>40.880404</td>\n", | |
| " <td>-73.908937</td>\n", | |
| " <td>Diner</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.91066</td>\n", | |
| " <td>Starbucks</td>\n", | |
| " <td>40.877531</td>\n", | |
| " <td>-73.905582</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>40.876551</td>\n", | |
| " <td>-73.91066</td>\n", | |
| " <td>Dunkin'</td>\n", | |
| " <td>40.877136</td>\n", | |
| " <td>-73.906666</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood Neighborhood Latitude Neighborhood Longitude Venue \\\n", | |
| "0 Marble Hill 40.876551 -73.91066 Arturo's \n", | |
| "1 Marble Hill 40.876551 -73.91066 Bikram Yoga \n", | |
| "2 Marble Hill 40.876551 -73.91066 Tibbett Diner \n", | |
| "3 Marble Hill 40.876551 -73.91066 Starbucks \n", | |
| "4 Marble Hill 40.876551 -73.91066 Dunkin' \n", | |
| "\n", | |
| " Venue Latitude Venue Longitude Venue Category \n", | |
| "0 40.874412 -73.910271 Pizza Place \n", | |
| "1 40.876844 -73.906204 Yoga Studio \n", | |
| "2 40.880404 -73.908937 Diner \n", | |
| "3 40.877531 -73.905582 Coffee Shop \n", | |
| "4 40.877136 -73.906666 Donut Shop " | |
| ] | |
| }, | |
| "execution_count": 28, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "print(manhattan_venues.shape)\n", | |
| "manhattan_venues.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let's check how many venues were returned for each neighborhood\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 29, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighborhood Latitude</th>\n", | |
| " <th>Neighborhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>Battery Park City</th>\n", | |
| " <td>71</td>\n", | |
| " <td>71</td>\n", | |
| " <td>71</td>\n", | |
| " <td>71</td>\n", | |
| " <td>71</td>\n", | |
| " <td>71</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Carnegie Hill</th>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Central Harlem</th>\n", | |
| " <td>44</td>\n", | |
| " <td>44</td>\n", | |
| " <td>44</td>\n", | |
| " <td>44</td>\n", | |
| " <td>44</td>\n", | |
| " <td>44</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Chelsea</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Chinatown</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Civic Center</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Clinton</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>East Harlem</th>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>East Village</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Financial District</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Flatiron</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Gramercy</th>\n", | |
| " <td>85</td>\n", | |
| " <td>85</td>\n", | |
| " <td>85</td>\n", | |
| " <td>85</td>\n", | |
| " <td>85</td>\n", | |
| " <td>85</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Greenwich Village</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Hamilton Heights</th>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Hudson Yards</th>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " <td>63</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Inwood</th>\n", | |
| " <td>57</td>\n", | |
| " <td>57</td>\n", | |
| " <td>57</td>\n", | |
| " <td>57</td>\n", | |
| " <td>57</td>\n", | |
| " <td>57</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Lenox Hill</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Lincoln Square</th>\n", | |
| " <td>93</td>\n", | |
| " <td>93</td>\n", | |
| " <td>93</td>\n", | |
| " <td>93</td>\n", | |
| " <td>93</td>\n", | |
| " <td>93</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Little Italy</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Lower East Side</th>\n", | |
| " <td>49</td>\n", | |
| " <td>49</td>\n", | |
| " <td>49</td>\n", | |
| " <td>49</td>\n", | |
| " <td>49</td>\n", | |
| " <td>49</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Manhattan Valley</th>\n", | |
| " <td>48</td>\n", | |
| " <td>48</td>\n", | |
| " <td>48</td>\n", | |
| " <td>48</td>\n", | |
| " <td>48</td>\n", | |
| " <td>48</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Manhattanville</th>\n", | |
| " <td>43</td>\n", | |
| " <td>43</td>\n", | |
| " <td>43</td>\n", | |
| " <td>43</td>\n", | |
| " <td>43</td>\n", | |
| " <td>43</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Marble Hill</th>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Midtown</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Midtown South</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Morningside Heights</th>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Murray Hill</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Noho</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Roosevelt Island</th>\n", | |
| " <td>28</td>\n", | |
| " <td>28</td>\n", | |
| " <td>28</td>\n", | |
| " <td>28</td>\n", | |
| " <td>28</td>\n", | |
| " <td>28</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Soho</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Stuyvesant Town</th>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Sutton Place</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Tribeca</th>\n", | |
| " <td>83</td>\n", | |
| " <td>83</td>\n", | |
| " <td>83</td>\n", | |
| " <td>83</td>\n", | |
| " <td>83</td>\n", | |
| " <td>83</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Tudor City</th>\n", | |
| " <td>77</td>\n", | |
| " <td>77</td>\n", | |
| " <td>77</td>\n", | |
| " <td>77</td>\n", | |
| " <td>77</td>\n", | |
| " <td>77</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Turtle Bay</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Upper East Side</th>\n", | |
| " <td>98</td>\n", | |
| " <td>98</td>\n", | |
| " <td>98</td>\n", | |
| " <td>98</td>\n", | |
| " <td>98</td>\n", | |
| " <td>98</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Upper West Side</th>\n", | |
| " <td>81</td>\n", | |
| " <td>81</td>\n", | |
| " <td>81</td>\n", | |
| " <td>81</td>\n", | |
| " <td>81</td>\n", | |
| " <td>81</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Washington Heights</th>\n", | |
| " <td>82</td>\n", | |
| " <td>82</td>\n", | |
| " <td>82</td>\n", | |
| " <td>82</td>\n", | |
| " <td>82</td>\n", | |
| " <td>82</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>West Village</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Yorkville</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood Latitude Neighborhood Longitude Venue \\\n", | |
| "Neighborhood \n", | |
| "Battery Park City 71 71 71 \n", | |
| "Carnegie Hill 86 86 86 \n", | |
| "Central Harlem 44 44 44 \n", | |
| "Chelsea 100 100 100 \n", | |
| "Chinatown 100 100 100 \n", | |
| "Civic Center 100 100 100 \n", | |
| "Clinton 100 100 100 \n", | |
| "East Harlem 39 39 39 \n", | |
| "East Village 100 100 100 \n", | |
| "Financial District 100 100 100 \n", | |
| "Flatiron 100 100 100 \n", | |
| "Gramercy 85 85 85 \n", | |
| "Greenwich Village 100 100 100 \n", | |
| "Hamilton Heights 63 63 63 \n", | |
| "Hudson Yards 63 63 63 \n", | |
| "Inwood 57 57 57 \n", | |
| "Lenox Hill 100 100 100 \n", | |
| "Lincoln Square 93 93 93 \n", | |
| "Little Italy 100 100 100 \n", | |
| "Lower East Side 49 49 49 \n", | |
| "Manhattan Valley 48 48 48 \n", | |
| "Manhattanville 43 43 43 \n", | |
| "Marble Hill 23 23 23 \n", | |
| "Midtown 100 100 100 \n", | |
| "Midtown South 100 100 100 \n", | |
| "Morningside Heights 39 39 39 \n", | |
| "Murray Hill 100 100 100 \n", | |
| "Noho 100 100 100 \n", | |
| "Roosevelt Island 28 28 28 \n", | |
| "Soho 100 100 100 \n", | |
| "Stuyvesant Town 17 17 17 \n", | |
| "Sutton Place 100 100 100 \n", | |
| "Tribeca 83 83 83 \n", | |
| "Tudor City 77 77 77 \n", | |
| "Turtle Bay 100 100 100 \n", | |
| "Upper East Side 98 98 98 \n", | |
| "Upper West Side 81 81 81 \n", | |
| "Washington Heights 82 82 82 \n", | |
| "West Village 100 100 100 \n", | |
| "Yorkville 100 100 100 \n", | |
| "\n", | |
| " Venue Latitude Venue Longitude Venue Category \n", | |
| "Neighborhood \n", | |
| "Battery Park City 71 71 71 \n", | |
| "Carnegie Hill 86 86 86 \n", | |
| "Central Harlem 44 44 44 \n", | |
| "Chelsea 100 100 100 \n", | |
| "Chinatown 100 100 100 \n", | |
| "Civic Center 100 100 100 \n", | |
| "Clinton 100 100 100 \n", | |
| "East Harlem 39 39 39 \n", | |
| "East Village 100 100 100 \n", | |
| "Financial District 100 100 100 \n", | |
| "Flatiron 100 100 100 \n", | |
| "Gramercy 85 85 85 \n", | |
| "Greenwich Village 100 100 100 \n", | |
| "Hamilton Heights 63 63 63 \n", | |
| "Hudson Yards 63 63 63 \n", | |
| "Inwood 57 57 57 \n", | |
| "Lenox Hill 100 100 100 \n", | |
| "Lincoln Square 93 93 93 \n", | |
| "Little Italy 100 100 100 \n", | |
| "Lower East Side 49 49 49 \n", | |
| "Manhattan Valley 48 48 48 \n", | |
| "Manhattanville 43 43 43 \n", | |
| "Marble Hill 23 23 23 \n", | |
| "Midtown 100 100 100 \n", | |
| "Midtown South 100 100 100 \n", | |
| "Morningside Heights 39 39 39 \n", | |
| "Murray Hill 100 100 100 \n", | |
| "Noho 100 100 100 \n", | |
| "Roosevelt Island 28 28 28 \n", | |
| "Soho 100 100 100 \n", | |
| "Stuyvesant Town 17 17 17 \n", | |
| "Sutton Place 100 100 100 \n", | |
| "Tribeca 83 83 83 \n", | |
| "Tudor City 77 77 77 \n", | |
| "Turtle Bay 100 100 100 \n", | |
| "Upper East Side 98 98 98 \n", | |
| "Upper West Side 81 81 81 \n", | |
| "Washington Heights 82 82 82 \n", | |
| "West Village 100 100 100 \n", | |
| "Yorkville 100 100 100 " | |
| ] | |
| }, | |
| "execution_count": 29, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "manhattan_venues.groupby('Neighborhood').count()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Let's find out how many unique categories can be curated from all the returned venues\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "There are 334 uniques categories.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "<a id='item3'></a>\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## 3. Analyze Each Neighborhood\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Accessories Store</th>\n", | |
| " <th>Adult Boutique</th>\n", | |
| " <th>Afghan Restaurant</th>\n", | |
| " <th>African Restaurant</th>\n", | |
| " <th>American Restaurant</th>\n", | |
| " <th>Antique Shop</th>\n", | |
| " <th>Arepa Restaurant</th>\n", | |
| " <th>Argentinian Restaurant</th>\n", | |
| " <th>Art Gallery</th>\n", | |
| " <th>Art Museum</th>\n", | |
| " <th>Arts & Crafts Store</th>\n", | |
| " <th>Asian Restaurant</th>\n", | |
| " <th>Athletics & Sports</th>\n", | |
| " <th>Auditorium</th>\n", | |
| " <th>Australian Restaurant</th>\n", | |
| " <th>Austrian Restaurant</th>\n", | |
| " <th>Auto Workshop</th>\n", | |
| " <th>BBQ Joint</th>\n", | |
| " <th>Baby Store</th>\n", | |
| " <th>Bagel Shop</th>\n", | |
| " <th>Bakery</th>\n", | |
| " <th>Bank</th>\n", | |
| " <th>Bar</th>\n", | |
| " <th>Baseball Field</th>\n", | |
| " <th>Basketball Court</th>\n", | |
| " <th>Bed & Breakfast</th>\n", | |
| " <th>Beer Bar</th>\n", | |
| " <th>Beer Garden</th>\n", | |
| " <th>Beer Store</th>\n", | |
| " <th>Big Box Store</th>\n", | |
| " <th>Bike Rental / Bike Share</th>\n", | |
| " <th>Bike Shop</th>\n", | |
| " <th>Bike Trail</th>\n", | |
| " <th>Bistro</th>\n", | |
| " <th>Board Shop</th>\n", | |
| " <th>Boat or Ferry</th>\n", | |
| " <th>Bookstore</th>\n", | |
| " <th>Boutique</th>\n", | |
| " <th>Boxing Gym</th>\n", | |
| " <th>Brazilian Restaurant</th>\n", | |
| " <th>Breakfast Spot</th>\n", | |
| " <th>Brewery</th>\n", | |
| " <th>Bridal Shop</th>\n", | |
| " <th>Bridge</th>\n", | |
| " <th>Bubble Tea Shop</th>\n", | |
| " <th>Building</th>\n", | |
| " <th>Burger Joint</th>\n", | |
| " <th>Burrito Place</th>\n", | |
| " <th>Bus Line</th>\n", | |
| " <th>Bus Station</th>\n", | |
| " <th>Bus Stop</th>\n", | |
| " <th>Butcher</th>\n", | |
| " <th>Cafeteria</th>\n", | |
| " <th>Café</th>\n", | |
| " <th>Cajun / Creole Restaurant</th>\n", | |
| " <th>Camera Store</th>\n", | |
| " <th>Candy Store</th>\n", | |
| " <th>Cantonese Restaurant</th>\n", | |
| " <th>Caribbean Restaurant</th>\n", | |
| " <th>Cheese Shop</th>\n", | |
| " <th>Chinese Restaurant</th>\n", | |
| " <th>Chocolate Shop</th>\n", | |
| " <th>Christmas Market</th>\n", | |
| " <th>Circus</th>\n", | |
| " <th>Climbing Gym</th>\n", | |
| " <th>Clothing Store</th>\n", | |
| " <th>Club House</th>\n", | |
| " <th>Cocktail Bar</th>\n", | |
| " <th>Coffee Shop</th>\n", | |
| " <th>College Academic Building</th>\n", | |
| " <th>College Arts Building</th>\n", | |
| " <th>College Bookstore</th>\n", | |
| " <th>College Cafeteria</th>\n", | |
| " <th>College Theater</th>\n", | |
| " <th>Comedy Club</th>\n", | |
| " <th>Community Center</th>\n", | |
| " <th>Concert Hall</th>\n", | |
| " <th>Convenience Store</th>\n", | |
| " <th>Cooking School</th>\n", | |
| " <th>Cosmetics Shop</th>\n", | |
| " <th>Creperie</th>\n", | |
| " <th>Cuban Restaurant</th>\n", | |
| " <th>Cupcake Shop</th>\n", | |
| " <th>Cycle Studio</th>\n", | |
| " <th>Czech Restaurant</th>\n", | |
| " <th>Dance Studio</th>\n", | |
| " <th>Daycare</th>\n", | |
| " <th>Deli / Bodega</th>\n", | |
| " <th>Department Store</th>\n", | |
| " <th>Dessert Shop</th>\n", | |
| " <th>Dim Sum Restaurant</th>\n", | |
| " <th>Diner</th>\n", | |
| " <th>Discount Store</th>\n", | |
| " <th>Dive Bar</th>\n", | |
| " <th>Doctor's Office</th>\n", | |
| " <th>Dog Run</th>\n", | |
| " <th>Donut Shop</th>\n", | |
| " <th>Drugstore</th>\n", | |
| " <th>Dry Cleaner</th>\n", | |
| " <th>Dumpling Restaurant</th>\n", | |
| " <th>Duty-free Shop</th>\n", | |
| " <th>Eastern European Restaurant</th>\n", | |
| " <th>Electronics Store</th>\n", | |
| " <th>Empanada Restaurant</th>\n", | |
| " <th>English Restaurant</th>\n", | |
| " <th>Ethiopian Restaurant</th>\n", | |
| " <th>Event Space</th>\n", | |
| " <th>Exhibit</th>\n", | |
| " <th>Eye Doctor</th>\n", | |
| " <th>Falafel Restaurant</th>\n", | |
| " <th>Farmers Market</th>\n", | |
| " <th>Fast Food Restaurant</th>\n", | |
| " <th>Filipino Restaurant</th>\n", | |
| " <th>Fish Market</th>\n", | |
| " <th>Flea Market</th>\n", | |
| " <th>Flower Shop</th>\n", | |
| " <th>Food & Drink Shop</th>\n", | |
| " <th>Food Court</th>\n", | |
| " <th>Food Stand</th>\n", | |
| " <th>Food Truck</th>\n", | |
| " <th>Fountain</th>\n", | |
| " <th>French Restaurant</th>\n", | |
| " <th>Fried Chicken Joint</th>\n", | |
| " <th>Frozen Yogurt Shop</th>\n", | |
| " <th>Furniture / Home Store</th>\n", | |
| " <th>Gaming Cafe</th>\n", | |
| " <th>Garden</th>\n", | |
| " <th>Garden Center</th>\n", | |
| " <th>Gas Station</th>\n", | |
| " <th>Gastropub</th>\n", | |
| " <th>Gay Bar</th>\n", | |
| " <th>General Entertainment</th>\n", | |
| " <th>German Restaurant</th>\n", | |
| " <th>Gift Shop</th>\n", | |
| " <th>Golf Course</th>\n", | |
| " <th>Golf Driving Range</th>\n", | |
| " <th>Gourmet Shop</th>\n", | |
| " <th>Greek Restaurant</th>\n", | |
| " <th>Grocery Store</th>\n", | |
| " <th>Gym</th>\n", | |
| " <th>Gym / Fitness Center</th>\n", | |
| " <th>Gym Pool</th>\n", | |
| " <th>Gymnastics Gym</th>\n", | |
| " <th>Harbor / Marina</th>\n", | |
| " <th>Hardware Store</th>\n", | |
| " <th>Hawaiian Restaurant</th>\n", | |
| " <th>Health & Beauty Service</th>\n", | |
| " <th>Health Food Store</th>\n", | |
| " <th>Heliport</th>\n", | |
| " <th>High School</th>\n", | |
| " <th>Hill</th>\n", | |
| " <th>Himalayan Restaurant</th>\n", | |
| " <th>Historic Site</th>\n", | |
| " <th>History Museum</th>\n", | |
| " <th>Hobby Shop</th>\n", | |
| " <th>Hookah Bar</th>\n", | |
| " <th>Hostel</th>\n", | |
| " <th>Hot Dog Joint</th>\n", | |
| " <th>Hotel</th>\n", | |
| " <th>Hotel Bar</th>\n", | |
| " <th>Hotpot Restaurant</th>\n", | |
| " <th>Ice Cream Shop</th>\n", | |
| " <th>Indian Restaurant</th>\n", | |
| " <th>Indie Movie Theater</th>\n", | |
| " <th>Indie Theater</th>\n", | |
| " <th>Irish Pub</th>\n", | |
| " <th>Israeli Restaurant</th>\n", | |
| " <th>Italian Restaurant</th>\n", | |
| " <th>Japanese Curry Restaurant</th>\n", | |
| " <th>Japanese Restaurant</th>\n", | |
| " <th>Jazz Club</th>\n", | |
| " <th>Jewelry Store</th>\n", | |
| " <th>Jewish Restaurant</th>\n", | |
| " <th>Juice Bar</th>\n", | |
| " <th>Karaoke Bar</th>\n", | |
| " <th>Kebab Restaurant</th>\n", | |
| " <th>Kids Store</th>\n", | |
| " <th>Kitchen Supply Store</th>\n", | |
| " <th>Korean Restaurant</th>\n", | |
| " <th>Kosher Restaurant</th>\n", | |
| " <th>Latin American Restaurant</th>\n", | |
| " <th>Laundry Service</th>\n", | |
| " <th>Lebanese Restaurant</th>\n", | |
| " <th>Library</th>\n", | |
| " <th>Lingerie Store</th>\n", | |
| " <th>Liquor Store</th>\n", | |
| " <th>Lounge</th>\n", | |
| " <th>Malay Restaurant</th>\n", | |
| " <th>Market</th>\n", | |
| " <th>Martial Arts School</th>\n", | |
| " <th>Massage Studio</th>\n", | |
| " <th>Mattress Store</th>\n", | |
| " <th>Medical Center</th>\n", | |
| " <th>Mediterranean Restaurant</th>\n", | |
| " <th>Memorial Site</th>\n", | |
| " <th>Men's Store</th>\n", | |
| " <th>Metro Station</th>\n", | |
| " <th>Mexican Restaurant</th>\n", | |
| " <th>Middle Eastern Restaurant</th>\n", | |
| " <th>Mini Golf</th>\n", | |
| " <th>Miscellaneous Shop</th>\n", | |
| " <th>Mobile Phone Shop</th>\n", | |
| " <th>Modern European Restaurant</th>\n", | |
| " <th>Molecular Gastronomy Restaurant</th>\n", | |
| " <th>Monument / Landmark</th>\n", | |
| " <th>Moroccan Restaurant</th>\n", | |
| " <th>Movie Theater</th>\n", | |
| " <th>Museum</th>\n", | |
| " <th>Music School</th>\n", | |
| " <th>Music Store</th>\n", | |
| " <th>Music Venue</th>\n", | |
| " <th>Nail Salon</th>\n", | |
| " <th>New American Restaurant</th>\n", | |
| " <th>Newsstand</th>\n", | |
| " <th>Nightclub</th>\n", | |
| " <th>Non-Profit</th>\n", | |
| " <th>Noodle House</th>\n", | |
| " <th>North Indian Restaurant</th>\n", | |
| " <th>Office</th>\n", | |
| " <th>Opera House</th>\n", | |
| " <th>Optical Shop</th>\n", | |
| " <th>Organic Grocery</th>\n", | |
| " <th>Other Great Outdoors</th>\n", | |
| " <th>Outdoor Sculpture</th>\n", | |
| " <th>Outdoors & Recreation</th>\n", | |
| " <th>Paella Restaurant</th>\n", | |
| " <th>Paper / Office Supplies Store</th>\n", | |
| " <th>Park</th>\n", | |
| " <th>Pedestrian Plaza</th>\n", | |
| " <th>Performing Arts Venue</th>\n", | |
| " <th>Persian Restaurant</th>\n", | |
| " <th>Peruvian Restaurant</th>\n", | |
| " <th>Pet Café</th>\n", | |
| " <th>Pet Service</th>\n", | |
| " <th>Pet Store</th>\n", | |
| " <th>Pharmacy</th>\n", | |
| " <th>Photography Studio</th>\n", | |
| " <th>Physical Therapist</th>\n", | |
| " <th>Pie Shop</th>\n", | |
| " <th>Pier</th>\n", | |
| " <th>Pilates Studio</th>\n", | |
| " <th>Pizza Place</th>\n", | |
| " <th>Playground</th>\n", | |
| " <th>Plaza</th>\n", | |
| " <th>Poke Place</th>\n", | |
| " <th>Pool</th>\n", | |
| " <th>Post Office</th>\n", | |
| " <th>Pub</th>\n", | |
| " <th>Public Art</th>\n", | |
| " <th>Ramen Restaurant</th>\n", | |
| " <th>Record Shop</th>\n", | |
| " <th>Recording Studio</th>\n", | |
| " <th>Rental Car Location</th>\n", | |
| " <th>Residential Building (Apartment / Condo)</th>\n", | |
| " <th>Resort</th>\n", | |
| " <th>Rest Area</th>\n", | |
| " <th>Restaurant</th>\n", | |
| " <th>River</th>\n", | |
| " <th>Rock Climbing Spot</th>\n", | |
| " <th>Rock Club</th>\n", | |
| " <th>Roof Deck</th>\n", | |
| " <th>Sake Bar</th>\n", | |
| " <th>Salad Place</th>\n", | |
| " <th>Salon / Barbershop</th>\n", | |
| " <th>Sandwich Place</th>\n", | |
| " <th>Scandinavian Restaurant</th>\n", | |
| " <th>Scenic Lookout</th>\n", | |
| " <th>School</th>\n", | |
| " <th>Seafood Restaurant</th>\n", | |
| " <th>Shabu-Shabu Restaurant</th>\n", | |
| " <th>Shanghai Restaurant</th>\n", | |
| " <th>Shipping Store</th>\n", | |
| " <th>Shoe Repair</th>\n", | |
| " <th>Shoe Store</th>\n", | |
| " <th>Shopping Mall</th>\n", | |
| " <th>Skate Park</th>\n", | |
| " <th>Skating Rink</th>\n", | |
| " <th>Smoke Shop</th>\n", | |
| " <th>Smoothie Shop</th>\n", | |
| " <th>Snack Place</th>\n", | |
| " <th>Soccer Field</th>\n", | |
| " <th>Social Club</th>\n", | |
| " <th>Soup Place</th>\n", | |
| " <th>South American Restaurant</th>\n", | |
| " <th>South Indian Restaurant</th>\n", | |
| " <th>Southern / Soul Food Restaurant</th>\n", | |
| " <th>Spa</th>\n", | |
| " <th>Spanish Restaurant</th>\n", | |
| " <th>Speakeasy</th>\n", | |
| " <th>Sporting Goods Shop</th>\n", | |
| " <th>Sports Bar</th>\n", | |
| " <th>Sports Club</th>\n", | |
| " <th>Steakhouse</th>\n", | |
| " <th>Street Art</th>\n", | |
| " <th>Strip Club</th>\n", | |
| " <th>Supermarket</th>\n", | |
| " <th>Supplement Shop</th>\n", | |
| " <th>Sushi Restaurant</th>\n", | |
| " <th>Swiss Restaurant</th>\n", | |
| " <th>Szechuan Restaurant</th>\n", | |
| " <th>Taco Place</th>\n", | |
| " <th>Tailor Shop</th>\n", | |
| " <th>Taiwanese Restaurant</th>\n", | |
| " <th>Tapas Restaurant</th>\n", | |
| " <th>Tattoo Parlor</th>\n", | |
| " <th>Tea Room</th>\n", | |
| " <th>Tech Startup</th>\n", | |
| " <th>Tennis Court</th>\n", | |
| " <th>Tennis Stadium</th>\n", | |
| " <th>Thai Restaurant</th>\n", | |
| " <th>Theater</th>\n", | |
| " <th>Thrift / Vintage Store</th>\n", | |
| " <th>Tiki Bar</th>\n", | |
| " <th>Tourist Information Center</th>\n", | |
| " <th>Toy / Game Store</th>\n", | |
| " <th>Trail</th>\n", | |
| " <th>Train Station</th>\n", | |
| " <th>Turkish Restaurant</th>\n", | |
| " <th>Udon Restaurant</th>\n", | |
| " <th>Used Bookstore</th>\n", | |
| " <th>Vegetarian / Vegan Restaurant</th>\n", | |
| " <th>Venezuelan Restaurant</th>\n", | |
| " <th>Veterinarian</th>\n", | |
| " <th>Video Game Store</th>\n", | |
| " <th>Video Store</th>\n", | |
| " <th>Vietnamese Restaurant</th>\n", | |
| " <th>Volleyball Court</th>\n", | |
| " <th>Waterfront</th>\n", | |
| " <th>Whisky Bar</th>\n", | |
| " <th>Wine Bar</th>\n", | |
| " <th>Wine Shop</th>\n", | |
| " <th>Wings Joint</th>\n", | |
| " <th>Women's Store</th>\n", | |
| " <th>Yoga Studio</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Marble Hill</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>1</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n", | |
| "0 Marble Hill 0 0 0 \n", | |
| "1 Marble Hill 0 0 0 \n", | |
| "2 Marble Hill 0 0 0 \n", | |
| "3 Marble Hill 0 0 0 \n", | |
| "4 Marble Hill 0 0 0 \n", | |
| "\n", | |
| " African Restaurant American Restaurant Antique Shop Arepa Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Argentinian Restaurant Art Gallery Art Museum Arts & Crafts Store \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Asian Restaurant Athletics & Sports Auditorium Australian Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Austrian Restaurant Auto Workshop BBQ Joint Baby Store Bagel Shop \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Bakery Bank Bar Baseball Field Basketball Court Bed & Breakfast \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Beer Bar Beer Garden Beer Store Big Box Store Bike Rental / Bike Share \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Bike Shop Bike Trail Bistro Board Shop Boat or Ferry Bookstore \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Boutique Boxing Gym Brazilian Restaurant Breakfast Spot Brewery \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Bridal Shop Bridge Bubble Tea Shop Building Burger Joint \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Burrito Place Bus Line Bus Station Bus Stop Butcher Cafeteria Café \\\n", | |
| "0 0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Cajun / Creole Restaurant Camera Store Candy Store Cantonese Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Caribbean Restaurant Cheese Shop Chinese Restaurant Chocolate Shop \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Christmas Market Circus Climbing Gym Clothing Store Club House \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Cocktail Bar Coffee Shop College Academic Building \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 1 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " College Arts Building College Bookstore College Cafeteria \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " College Theater Comedy Club Community Center Concert Hall \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Convenience Store Cooking School Cosmetics Shop Creperie \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Cuban Restaurant Cupcake Shop Cycle Studio Czech Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Dance Studio Daycare Deli / Bodega Department Store Dessert Shop \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Dim Sum Restaurant Diner Discount Store Dive Bar Doctor's Office \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 1 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Dog Run Donut Shop Drugstore Dry Cleaner Dumpling Restaurant \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 1 0 0 0 \n", | |
| "\n", | |
| " Duty-free Shop Eastern European Restaurant Electronics Store \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Empanada Restaurant English Restaurant Ethiopian Restaurant Event Space \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Exhibit Eye Doctor Falafel Restaurant Farmers Market \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Fast Food Restaurant Filipino Restaurant Fish Market Flea Market \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Flower Shop Food & Drink Shop Food Court Food Stand Food Truck \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Fountain French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Gastropub Gay Bar General Entertainment German Restaurant Gift Shop \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Golf Course Golf Driving Range Gourmet Shop Greek Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Grocery Store Gym Gym / Fitness Center Gym Pool Gymnastics Gym \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Harbor / Marina Hardware Store Hawaiian Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Health & Beauty Service Health Food Store Heliport High School Hill \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Himalayan Restaurant Historic Site History Museum Hobby Shop \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Hookah Bar Hostel Hot Dog Joint Hotel Hotel Bar Hotpot Restaurant \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Ice Cream Shop Indian Restaurant Indie Movie Theater Indie Theater \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Irish Pub Israeli Restaurant Italian Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Japanese Curry Restaurant Japanese Restaurant Jazz Club Jewelry Store \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Jewish Restaurant Juice Bar Karaoke Bar Kebab Restaurant Kids Store \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Kitchen Supply Store Korean Restaurant Kosher Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Latin American Restaurant Laundry Service Lebanese Restaurant Library \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Lingerie Store Liquor Store Lounge Malay Restaurant Market \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Martial Arts School Massage Studio Mattress Store Medical Center \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Mediterranean Restaurant Memorial Site Men's Store Metro Station \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Mexican Restaurant Middle Eastern Restaurant Mini Golf \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Miscellaneous Shop Mobile Phone Shop Modern European Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Molecular Gastronomy Restaurant Monument / Landmark Moroccan Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Movie Theater Museum Music School Music Store Music Venue Nail Salon \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " New American Restaurant Newsstand Nightclub Non-Profit Noodle House \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " North Indian Restaurant Office Opera House Optical Shop \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Organic Grocery Other Great Outdoors Outdoor Sculpture \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Outdoors & Recreation Paella Restaurant Paper / Office Supplies Store \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Park Pedestrian Plaza Performing Arts Venue Persian Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Peruvian Restaurant Pet Café Pet Service Pet Store Pharmacy \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Photography Studio Physical Therapist Pie Shop Pier Pilates Studio \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Pizza Place Playground Plaza Poke Place Pool Post Office Pub \\\n", | |
| "0 1 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Public Art Ramen Restaurant Record Shop Recording Studio \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Rental Car Location Residential Building (Apartment / Condo) Resort \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Rest Area Restaurant River Rock Climbing Spot Rock Club Roof Deck \\\n", | |
| "0 0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 0 \n", | |
| "\n", | |
| " Sake Bar Salad Place Salon / Barbershop Sandwich Place \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Scandinavian Restaurant Scenic Lookout School Seafood Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Shabu-Shabu Restaurant Shanghai Restaurant Shipping Store Shoe Repair \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Shoe Store Shopping Mall Skate Park Skating Rink Smoke Shop \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Smoothie Shop Snack Place Soccer Field Social Club Soup Place \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " South American Restaurant South Indian Restaurant \\\n", | |
| "0 0 0 \n", | |
| "1 0 0 \n", | |
| "2 0 0 \n", | |
| "3 0 0 \n", | |
| "4 0 0 \n", | |
| "\n", | |
| " Southern / Soul Food Restaurant Spa Spanish Restaurant Speakeasy \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Sporting Goods Shop Sports Bar Sports Club Steakhouse Street Art \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Strip Club Supermarket Supplement Shop Sushi Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Swiss Restaurant Szechuan Restaurant Taco Place Tailor Shop \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Taiwanese Restaurant Tapas Restaurant Tattoo Parlor Tea Room \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Tech Startup Tennis Court Tennis Stadium Thai Restaurant Theater \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Thrift / Vintage Store Tiki Bar Tourist Information Center \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Toy / Game Store Trail Train Station Turkish Restaurant \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Udon Restaurant Used Bookstore Vegetarian / Vegan Restaurant \\\n", | |
| "0 0 0 0 \n", | |
| "1 0 0 0 \n", | |
| "2 0 0 0 \n", | |
| "3 0 0 0 \n", | |
| "4 0 0 0 \n", | |
| "\n", | |
| " Venezuelan Restaurant Veterinarian Video Game Store Video Store \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "\n", | |
| " Vietnamese Restaurant Volleyball Court Waterfront Whisky Bar Wine Bar \\\n", | |
| "0 0 0 0 0 0 \n", | |
| "1 0 0 0 0 0 \n", | |
| "2 0 0 0 0 0 \n", | |
| "3 0 0 0 0 0 \n", | |
| "4 0 0 0 0 0 \n", | |
| "\n", | |
| " Wine Shop Wings Joint Women's Store Yoga Studio \n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 1 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 " | |
| ] | |
| }, | |
| "execution_count": 31, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# one hot encoding\n", | |
| "manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n", | |
| "\n", | |
| "# add neighborhood column back to dataframe\n", | |
| "manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n", | |
| "\n", | |
| "# move neighborhood column to the first column\n", | |
| "fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n", | |
| "manhattan_onehot = manhattan_onehot[fixed_columns]\n", | |
| "\n", | |
| "manhattan_onehot.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "And let's examine the new dataframe size.\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 32, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(3169, 335)" | |
| ] | |
| }, | |
| "execution_count": 32, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "manhattan_onehot.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 33, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighborhood</th>\n", | |
| " <th>Accessories Store</th>\n", | |
| " <th>Adult Boutique</th>\n", | |
| " <th>Afghan Restaurant</th>\n", | |
| " <th>African Restaurant</th>\n", | |
| " <th>American Restaurant</th>\n", | |
| " <th>Antique Shop</th>\n", | |
| " <th>Arepa Restaurant</th>\n", | |
| " <th>Argentinian Restaurant</th>\n", | |
| " <th>Art Gallery</th>\n", | |
| " <th>Art Museum</th>\n", | |
| " <th>Arts & Crafts Store</th>\n", | |
| " <th>Asian Restaurant</th>\n", | |
| " <th>Athletics & Sports</th>\n", | |
| " <th>Auditorium</th>\n", | |
| " <th>Australian Restaurant</th>\n", | |
| " <th>Austrian Restaurant</th>\n", | |
| " <th>Auto Workshop</th>\n", | |
| " <th>BBQ Joint</th>\n", | |
| " <th>Baby Store</th>\n", | |
| " <th>Bagel Shop</th>\n", | |
| " <th>Bakery</th>\n", | |
| " <th>Bank</th>\n", | |
| " <th>Bar</th>\n", | |
| " <th>Baseball Field</th>\n", | |
| " <th>Basketball Court</th>\n", | |
| " <th>Bed & Breakfast</th>\n", | |
| " <th>Beer Bar</th>\n", | |
| " <th>Beer Garden</th>\n", | |
| " <th>Beer Store</th>\n", | |
| " <th>Big Box Store</th>\n", | |
| " <th>Bike Rental / Bike Share</th>\n", | |
| " <th>Bike Shop</th>\n", | |
| " <th>Bike Trail</th>\n", | |
| " <th>Bistro</th>\n", | |
| " <th>Board Shop</th>\n", | |
| " <th>Boat or Ferry</th>\n", | |
| " <th>Bookstore</th>\n", | |
| " <th>Boutique</th>\n", | |
| " <th>Boxing Gym</th>\n", | |
| " <th>Brazilian Restaurant</th>\n", | |
| " <th>Breakfast Spot</th>\n", | |
| " <th>Brewery</th>\n", | |
| " <th>Bridal Shop</th>\n", | |
| " <th>Bridge</th>\n", | |
| " <th>Bubble Tea Shop</th>\n", | |
| " <th>Building</th>\n", | |
| " <th>Burger Joint</th>\n", | |
| " <th>Burrito Place</th>\n", | |
| " <th>Bus Line</th>\n", | |
| " <th>Bus Station</th>\n", | |
| " <th>Bus Stop</th>\n", | |
| " <th>Butcher</th>\n", | |
| " <th>Cafeteria</th>\n", | |
| " <th>Café</th>\n", | |
| " <th>Cajun / Creole Restaurant</th>\n", | |
| " <th>Camera Store</th>\n", | |
| " <th>Candy Store</th>\n", | |
| " <th>Cantonese Restaurant</th>\n", | |
| " <th>Caribbean Restaurant</th>\n", | |
| " <th>Cheese Shop</th>\n", | |
| " <th>Chinese Restaurant</th>\n", | |
| " <th>Chocolate Shop</th>\n", | |
| " <th>Christmas Market</th>\n", | |
| " <th>Circus</th>\n", | |
| " <th>Climbing Gym</th>\n", | |
| " <th>Clothing Store</th>\n", | |
| " <th>Club House</th>\n", | |
| " <th>Cocktail Bar</th>\n", | |
| " <th>Coffee Shop</th>\n", | |
| " <th>College Academic Building</th>\n", | |
| " <th>College Arts Building</th>\n", | |
| " <th>College Bookstore</th>\n", | |
| " <th>College Cafeteria</th>\n", | |
| " <th>College Theater</th>\n", | |
| " <th>Comedy Club</th>\n", | |
| " <th>Community Center</th>\n", | |
| " <th>Concert Hall</th>\n", | |
| " <th>Convenience Store</th>\n", | |
| " <th>Cooking School</th>\n", | |
| " <th>Cosmetics Shop</th>\n", | |
| " <th>Creperie</th>\n", | |
| " <th>Cuban Restaurant</th>\n", | |
| " <th>Cupcake Shop</th>\n", | |
| " <th>Cycle Studio</th>\n", | |
| " <th>Czech Restaurant</th>\n", | |
| " <th>Dance Studio</th>\n", | |
| " <th>Daycare</th>\n", | |
| " <th>Deli / Bodega</th>\n", | |
| " <th>Department Store</th>\n", | |
| " <th>Dessert Shop</th>\n", | |
| " <th>Dim Sum Restaurant</th>\n", | |
| " <th>Diner</th>\n", | |
| " <th>Discount Store</th>\n", | |
| " <th>Dive Bar</th>\n", | |
| " <th>Doctor's Office</th>\n", | |
| " <th>Dog Run</th>\n", | |
| " <th>Donut Shop</th>\n", | |
| " <th>Drugstore</th>\n", | |
| " <th>Dry Cleaner</th>\n", | |
| " <th>Dumpling Restaurant</th>\n", | |
| " <th>Duty-free Shop</th>\n", | |
| " <th>Eastern European Restaurant</th>\n", | |
| " <th>Electronics Store</th>\n", | |
| " <th>Empanada Restaurant</th>\n", | |
| " <th>English Restaurant</th>\n", | |
| " <th>Ethiopian Restaurant</th>\n", | |
| " <th>Event Space</th>\n", | |
| " <th>Exhibit</th>\n", | |
| " <th>Eye Doctor</th>\n", | |
| " <th>Falafel Restaurant</th>\n", | |
| " <th>Farmers Market</th>\n", | |
| " <th>Fast Food Restaurant</th>\n", | |
| " <th>Filipino Restaurant</th>\n", | |
| " <th>Fish Market</th>\n", | |
| " <th>Flea Market</th>\n", | |
| " <th>Flower Shop</th>\n", | |
| " <th>Food & Drink Shop</th>\n", | |
| " <th>Food Court</th>\n", | |
| " <th>Food Stand</th>\n", | |
| " <th>Food Truck</th>\n", | |
| " <th>Fountain</th>\n", | |
| " <th>French Restaurant</th>\n", | |
| " <th>Fried Chicken Joint</th>\n", | |
| " <th>Frozen Yogurt Shop</th>\n", | |
| " <th>Furniture / Home Store</th>\n", | |
| " <th>Gaming Cafe</th>\n", | |
| " <th>Garden</th>\n", | |
| " <th>Garden Center</th>\n", | |
| " <th>Gas Station</th>\n", | |
| " <th>Gastropub</th>\n", | |
| " <th>Gay Bar</th>\n", | |
| " <th>General Entertainment</th>\n", | |
| " <th>German Restaurant</th>\n", | |
| " <th>Gift Shop</th>\n", | |
| " <th>Golf Course</th>\n", | |
| " <th>Golf Driving Range</th>\n", | |
| " <th>Gourmet Shop</th>\n", | |
| " <th>Greek Restaurant</th>\n", | |
| " <th>Grocery Store</th>\n", | |
| " <th>Gym</th>\n", | |
| " <th>Gym / Fitness Center</th>\n", | |
| " <th>Gym Pool</th>\n", | |
| " <th>Gymnastics Gym</th>\n", | |
| " <th>Harbor / Marina</th>\n", | |
| " <th>Hardware Store</th>\n", | |
| " <th>Hawaiian Restaurant</th>\n", | |
| " <th>Health & Beauty Service</th>\n", | |
| " <th>Health Food Store</th>\n", | |
| " <th>Heliport</th>\n", | |
| " <th>High School</th>\n", | |
| " <th>Hill</th>\n", | |
| " <th>Himalayan Restaurant</th>\n", | |
| " <th>Historic Site</th>\n", | |
| " <th>History Museum</th>\n", | |
| " <th>Hobby Shop</th>\n", | |
| " <th>Hookah Bar</th>\n", | |
| " <th>Hostel</th>\n", | |
| " <th>Hot Dog Joint</th>\n", | |
| " <th>Hotel</th>\n", | |
| " <th>Hotel Bar</th>\n", | |
| " <th>Hotpot Restaurant</th>\n", | |
| " <th>Ice Cream Shop</th>\n", | |
| " <th>Indian Restaurant</th>\n", | |
| " <th>Indie Movie Theater</th>\n", | |
| " <th>Indie Theater</th>\n", | |
| " <th>Irish Pub</th>\n", | |
| " <th>Israeli Restaurant</th>\n", | |
| " <th>Italian Restaurant</th>\n", | |
| " <th>Japanese Curry Restaurant</th>\n", | |
| " <th>Japanese Restaurant</th>\n", | |
| " <th>Jazz Club</th>\n", | |
| " <th>Jewelry Store</th>\n", | |
| " <th>Jewish Restaurant</th>\n", | |
| " <th>Juice Bar</th>\n", | |
| " <th>Karaoke Bar</th>\n", | |
| " <th>Kebab Restaurant</th>\n", | |
| " <th>Kids Store</th>\n", | |
| " <th>Kitchen Supply Store</th>\n", | |
| " <th>Korean Restaurant</th>\n", | |
| " <th>Kosher Restaurant</th>\n", | |
| " <th>Latin American Restaurant</th>\n", | |
| " <th>Laundry Service</th>\n", | |
| " <th>Lebanese Restaurant</th>\n", | |
| " <th>Library</th>\n", | |
| " <th>Lingerie Store</th>\n", | |
| " <th>Liquor Store</th>\n", | |
| " <th>Lounge</th>\n", | |
| " <th>Malay Restaurant</th>\n", | |
| " <th>Market</th>\n", | |
| " <th>Martial Arts School</th>\n", | |
| " <th>Massage Studio</th>\n", | |
| " <th>Mattress Store</th>\n", | |
| " <th>Medical Center</th>\n", | |
| " <th>Mediterranean Restaurant</th>\n", | |
| " <th>Memorial Site</th>\n", | |
| " <th>Men's Store</th>\n", | |
| " <th>Metro Station</th>\n", | |
| " <th>Mexican Restaurant</th>\n", | |
| " <th>Middle Eastern Restaurant</th>\n", | |
| " <th>Mini Golf</th>\n", | |
| " <th>Miscellaneous Shop</th>\n", | |
| " <th>Mobile Phone Shop</th>\n", | |
| " <th>Modern European Restaurant</th>\n", | |
| " <th>Molecular Gastronomy Restaurant</th>\n", | |
| " <th>Monument / Landmark</th>\n", | |
| " <th>Moroccan Restaurant</th>\n", | |
| " <th>Movie Theater</th>\n", | |
| " <th>Museum</th>\n", | |
| " <th>Music School</th>\n", | |
| " <th>Music Store</th>\n", | |
| " <th>Music Venue</th>\n", | |
| " <th>Nail Salon</th>\n", | |
| " <th>New American Restaurant</th>\n", | |
| " <th>Newsstand</th>\n", | |
| " <th>Nightclub</th>\n", | |
| " <th>Non-Profit</th>\n", | |
| " <th>Noodle House</th>\n", | |
| " <th> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment