Skip to content

Instantly share code, notes, and snippets.

@adityantamarapu
Created June 7, 2020 05:56
Show Gist options
  • Save adityantamarapu/b8a793ee65887eb32ea726a066c6ec30 to your computer and use it in GitHub Desktop.
Save adityantamarapu/b8a793ee65887eb32ea726a066c6ec30 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Project Description"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"My friend Michelangelo wants to open a Pizza restaurant in Manhattan. Where would we recommend that he set it up?\n",
"To answer this question, we need to explore Pizza restaurants in Manhattan and find popular restaurants and analyze the dataset. We will use Foursquare API to explore the restaurants."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Getting the Dataset"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"CLIENT_ID = 'NM2ZJ4MDHZEN140JF3CDFT5JKTFY5XKPACFFJV1LR2ORR3W0' # your Foursquare ID\n",
"CLIENT_SECRET = 'GYL1KCRUWNUQKY51A5E4FKOLYSAEG4C4GIO2VEFUNITJYZFC' # your Foursquare Secret\n",
"VERSION = '20180605'"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geopy\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geographiclib-1.50 | py_0 34 KB conda-forge\n",
" geopy-1.22.0 | pyh9f0ad1d_0 63 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 97 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n",
" geopy conda-forge/noarch::geopy-1.22.0-pyh9f0ad1d_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"geopy-1.22.0 | 63 KB | ##################################### | 100% \n",
"geographiclib-1.50 | 34 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"40.7579801 -73.9855452\n"
]
}
],
"source": [
"address='Theater District, New York, NY 10020, USA'\n",
"# lat=40.761432\n",
"# lng=-73.982762\n",
"!conda install -c conda-forge geopy --yes \n",
"from geopy.geocoders import Nominatim\n",
"geolocator = Nominatim(user_agent=\"foursquare_agent\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print(latitude, longitude)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"LIMIT=30\n",
"search_query='Pizza'\n",
"radius=500"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/search?client_id=NM2ZJ4MDHZEN140JF3CDFT5JKTFY5XKPACFFJV1LR2ORR3W0&client_secret=GYL1KCRUWNUQKY51A5E4FKOLYSAEG4C4GIO2VEFUNITJYZFC&ll=40.7579801,-73.9855452&v=20180605&query=Pizza&radius=500&limit=30'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = 'https://api.foursquare.com/v2/venues/search?client_id={}&client_secret={}&ll={},{}&v={}&query={}&radius={}&limit={}'.format(CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION, search_query, radius, LIMIT)\n",
"url"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5edc79e3c8cff2001b3c71a9'},\n",
" 'response': {'venues': [{'id': '598de3c33b83073f81718721',\n",
" 'name': \"Joe's Pizza\",\n",
" 'location': {'address': '1435 Broadway',\n",
" 'crossStreet': 'W 40th St',\n",
" 'lat': 40.75467949999999,\n",
" 'lng': -73.9870291,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75467949999999,\n",
" 'lng': -73.9870291}],\n",
" 'distance': 388,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1435 Broadway (W 40th St)',\n",
" 'New York, NY 10018',\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': '469121',\n",
" 'url': 'https://www.seamless.com/menu/joes-pizza-1435-broadway-new-york/469121?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=469121',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4aa88507f964a5208a5120e3',\n",
" 'name': \"Famous Amadeus Pizza - Hell's Kitchen\",\n",
" 'location': {'address': '840 8th Ave',\n",
" 'lat': 40.76235730570203,\n",
" 'lng': -73.98566722869873,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76235730570203,\n",
" 'lng': -73.98566722869873},\n",
" {'label': 'entrance', 'lat': 40.762595, 'lng': -73.985674}],\n",
" 'distance': 487,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['840 8th Ave',\n",
" 'New York, NY 10019',\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': '65046',\n",
" 'url': 'https://www.seamless.com/menu/amadeus-pizza-840-8th-ave-new-york/65046?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=65046',\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",
" 'venuePage': {'id': '47491715'},\n",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4dc9931218387d1569587cf9',\n",
" 'name': '99¢ Pizza Spot',\n",
" 'location': {'address': '43rd and 8th Ave',\n",
" 'crossStreet': 'Corner of 43rd',\n",
" 'lat': 40.758062033149805,\n",
" 'lng': -73.98948968496855,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758062033149805,\n",
" 'lng': -73.98948968496855}],\n",
" 'distance': 332,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['43rd and 8th Ave (Corner of 43rd)',\n",
" 'New York, NY 10036',\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': '206336',\n",
" 'url': 'https://www.seamless.com/menu/99-cent-express-pizza-301-w-43rd-st-new-york/206336?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=206336',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '509c8753e4b0ca91f9ee1756',\n",
" 'name': '99¢ Fresh Pizza',\n",
" 'location': {'address': '143 W 40th St',\n",
" 'lat': 40.75457557893008,\n",
" 'lng': -73.98758014806872,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75457557893008,\n",
" 'lng': -73.98758014806872}],\n",
" 'distance': 416,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['143 W 40th St',\n",
" 'New York, NY 10018',\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': '2111937',\n",
" 'url': 'https://www.seamless.com/menu/99-cent-fresh-pizza-143-w-40th-st-new-york/2111937?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=2111937',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4b91992af964a520b1c833e3',\n",
" 'name': \"Domino's Pizza\",\n",
" 'location': {'address': '227 W 40th St',\n",
" 'crossStreet': 'btw 7th & 8th',\n",
" 'lat': 40.75529519335076,\n",
" 'lng': -73.98882418870926,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75529519335076,\n",
" 'lng': -73.98882418870926},\n",
" {'label': 'entrance', 'lat': 40.755586, 'lng': -73.989638}],\n",
" 'distance': 407,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['227 W 40th St (btw 7th & 8th)',\n",
" 'New York, NY 10018',\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': '295996',\n",
" 'url': 'https://www.seamless.com/menu/dominos-pizza-227-w-40th-st-new-york/295996?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=295996',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4cd73e0367adf04dd5653791',\n",
" 'name': 'Mama’s Pizza',\n",
" 'location': {'address': '705 8th Ave',\n",
" 'lat': 40.75872357572102,\n",
" 'lng': -73.98892405251033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75872357572102,\n",
" 'lng': -73.98892405251033}],\n",
" 'distance': 296,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['705 8th Ave',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4b4c704bf964a520feb226e3',\n",
" 'name': \"Famous Original Ray's Pizza\",\n",
" 'location': {'address': '736 7th Ave',\n",
" 'crossStreet': 'btwn 48th & 49th St.',\n",
" 'lat': 40.760437746601376,\n",
" 'lng': -73.98392887296407,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.760437746601376,\n",
" 'lng': -73.98392887296407},\n",
" {'label': 'entrance', 'lat': 40.760368, 'lng': -73.984}],\n",
" 'distance': 305,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['736 7th Ave (btwn 48th & 49th St.)',\n",
" 'New York, NY 10019',\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': '292848',\n",
" 'url': 'https://www.seamless.com/menu/famous-original-rays-pizza-736-7th-ave-new-york/292848?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=292848',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4b2ac163f964a520fcae24e3',\n",
" 'name': 'Pizza Hut',\n",
" 'location': {'address': '761-69 7th Ave',\n",
" 'crossStreet': '50th St.',\n",
" 'lat': 40.761113973251526,\n",
" 'lng': -73.98288577795034,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.761113973251526,\n",
" 'lng': -73.98288577795034}],\n",
" 'distance': 414,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['761-69 7th Ave (50th St.)',\n",
" 'New York, NY 10019',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4e24cec8d4c04ce22533785e',\n",
" 'name': 'Times Square Pizza',\n",
" 'location': {'address': '765 8th Ave',\n",
" 'lat': 40.76056822794468,\n",
" 'lng': -73.98740193948298,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76056822794468,\n",
" 'lng': -73.98740193948298}],\n",
" 'distance': 327,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['765 8th Ave',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4e4c445abd413c4cc6681705',\n",
" 'name': 'Pizza In The City',\n",
" 'location': {'address': '416 W 46th St',\n",
" 'lat': 40.759734,\n",
" 'lng': -73.991704,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.759734,\n",
" 'lng': -73.991704}],\n",
" 'distance': 554,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['416 W 46th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '5a5cf46d2e2680114c06eb1a',\n",
" 'name': 'Bryant Park Pizza',\n",
" 'location': {'address': '1095 Avenue Of The Americas',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445}],\n",
" 'distance': 382,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1095 Avenue Of The Americas',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4e4e4a31bd4101d0d7a6f154',\n",
" 'name': 'Pronto Pizza & Beer',\n",
" 'location': {'address': '30 W 48th St',\n",
" 'lat': 40.758220893723006,\n",
" 'lng': -73.97949801942443,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758220893723006,\n",
" 'lng': -73.97949801942443},\n",
" {'label': 'entrance', 'lat': 40.757827, 'lng': -73.979669}],\n",
" 'distance': 510,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['30 W 48th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4c7d96bbd65437043defc0a2',\n",
" 'name': '2 Bros. Pizza',\n",
" 'location': {'address': '31 W 46th St',\n",
" 'crossStreet': 'btwn 5th & 6th Ave',\n",
" 'lat': 40.75672851136888,\n",
" 'lng': -73.98055343233084,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75672851136888,\n",
" 'lng': -73.98055343233084},\n",
" {'label': 'entrance', 'lat': 40.756679, 'lng': -73.980303}],\n",
" 'distance': 443,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['31 W 46th St (btwn 5th & 6th Ave)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4addf59cf964a520c36621e3',\n",
" 'name': 'Le Mirage Cafe & Pizza',\n",
" 'location': {'address': '20 W 43rd St',\n",
" 'lat': 40.754712244422876,\n",
" 'lng': -73.98175938588064,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.754712244422876,\n",
" 'lng': -73.98175938588064}],\n",
" 'distance': 483,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['20 W 43rd St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4c2fce5a3896e21e75a2e490',\n",
" 'name': 'iPizzaNY',\n",
" 'location': {'address': '642 9th Ave',\n",
" 'crossStreet': 'btwn 45th & 46th St',\n",
" 'lat': 40.760492976454806,\n",
" 'lng': -73.99109772294537,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.760492976454806,\n",
" 'lng': -73.99109772294537}],\n",
" 'distance': 545,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['642 9th Ave (btwn 45th & 46th St)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4afa1ac2f964a520c81622e3',\n",
" 'name': 'Villa Pizza',\n",
" 'location': {'address': '263 West 42nd St',\n",
" 'crossStreet': 'at 8th Ave',\n",
" 'lat': 40.757291,\n",
" 'lng': -73.989259,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.757291,\n",
" 'lng': -73.989259}],\n",
" 'distance': 322,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['263 West 42nd St (at 8th Ave)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '5c351c9c121384002c5d27e7',\n",
" 'name': 'Upside Pizza',\n",
" 'location': {'address': '598 8th Ave',\n",
" 'crossStreet': 'at W 39th St',\n",
" 'lat': 40.755387883317105,\n",
" 'lng': -73.99109507455074,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.755387883317105,\n",
" 'lng': -73.99109507455074}],\n",
" 'distance': 549,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['598 8th Ave (at W 39th St)',\n",
" 'New York, NY 10018',\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': '1443984',\n",
" 'url': 'https://www.seamless.com/menu/upside-pizza-598-8th-ave-new-york/1443984?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=1443984',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4bcddf98b6c49c742b169691',\n",
" 'name': 'Pizza Pasta',\n",
" 'location': {'address': 'Lexington Ave',\n",
" 'crossStreet': 'at E 93rd',\n",
" 'lat': 40.75870920855404,\n",
" 'lng': -73.98145622842769,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75870920855404,\n",
" 'lng': -73.98145622842769}],\n",
" 'distance': 354,\n",
" 'postalCode': '10022',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Lexington Ave (at E 93rd)',\n",
" 'New York, NY 10022',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d110941735',\n",
" 'name': 'Italian Restaurant',\n",
" 'pluralName': 'Italian Restaurants',\n",
" 'shortName': 'Italian',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/italian_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4f32b55d19836c91c7f1f14c',\n",
" 'name': 'Rays Pizza Restaurant',\n",
" 'location': {'address': '252 E 51st St',\n",
" 'lat': 40.760394436637924,\n",
" 'lng': -73.9838841783013,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.760394436637924,\n",
" 'lng': -73.9838841783013}],\n",
" 'distance': 303,\n",
" 'postalCode': '10022',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['252 E 51st St',\n",
" 'New York, NY 10022',\n",
" 'United States']},\n",
" 'categories': [{'id': '4d4b7105d754a06374d81259',\n",
" 'name': 'Food',\n",
" 'pluralName': 'Food',\n",
" 'shortName': 'Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4c3ddfeb83a3a5937140ed33',\n",
" 'name': 'Pizza Place',\n",
" 'location': {'lat': 40.75368157338077,\n",
" 'lng': -73.9836141525577,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75368157338077,\n",
" 'lng': -73.9836141525577}],\n",
" 'distance': 505,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY 10018', '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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4b4cb8adf964a520c9bb26e3',\n",
" 'name': 'Pizza Place Next To Paramount Hotel',\n",
" 'location': {'address': '210-226 W 46th St',\n",
" 'lat': 40.76241466588694,\n",
" 'lng': -73.98743637356685,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76241466588694,\n",
" 'lng': -73.98743637356685}],\n",
" 'distance': 518,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['210-226 W 46th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4ad10f7cf964a52060dc20e3',\n",
" 'name': 'Tuscany Pizza Cafe',\n",
" 'location': {'address': '709 8th Ave',\n",
" 'crossStreet': '44th',\n",
" 'lat': 40.759098,\n",
" 'lng': -73.988845,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.759098,\n",
" 'lng': -73.988845},\n",
" {'label': 'entrance', 'lat': 40.759032, 'lng': -73.988689}],\n",
" 'distance': 304,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['709 8th Ave (44th)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '599b0c1d31ac6c7b96420e71',\n",
" 'name': 'Pizza Parlor',\n",
" 'location': {'address': '1095 Avenue Of The Americas',\n",
" 'lat': 40.754508,\n",
" 'lng': -73.984705,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.754508,\n",
" 'lng': -73.984705}],\n",
" 'distance': 392,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1095 Avenue Of The Americas',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '5e287e0e144dc80008e5d5a0',\n",
" 'name': 'Artichoke Pizza',\n",
" 'location': {'address': '1410 Broadway',\n",
" 'crossStreet': '39th St',\n",
" 'lat': 40.753272,\n",
" 'lng': -73.986648,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.753272,\n",
" 'lng': -73.986648}],\n",
" 'distance': 532,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1410 Broadway (39th St)',\n",
" 'New York, NY 10018',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '593ae2d1f427de5f7fc75fe3',\n",
" 'name': 'Rock Pizza Scissors',\n",
" 'location': {'address': '1471 Broadway',\n",
" 'lat': 40.756198,\n",
" 'lng': -73.986535,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.756198,\n",
" 'lng': -73.986535}],\n",
" 'distance': 215,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1471 Broadway',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4e3c27b3d22d102e852fdb59',\n",
" 'name': \"John's resturant + pizza\",\n",
" 'location': {'address': '306 12th St',\n",
" 'lat': 40.75835312290508,\n",
" 'lng': -73.98852104404719,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75835312290508,\n",
" 'lng': -73.98852104404719}],\n",
" 'distance': 254,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['306 12th St',\n",
" 'New York, NY 10019',\n",
" 'United States']},\n",
" 'categories': [],\n",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4f32447519836c91c7c6c727',\n",
" 'name': \"Ray's Real Pizza\",\n",
" 'location': {'address': '709 8th Ave',\n",
" 'lat': 40.758801,\n",
" 'lng': -73.9888,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758801,\n",
" 'lng': -73.9888},\n",
" {'label': 'entrance', 'lat': 40.759032, 'lng': -73.988689}],\n",
" 'distance': 289,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['709 8th Ave',\n",
" 'New York, NY 10036',\n",
" 'United States']},\n",
" 'categories': [{'id': '4d4b7105d754a06374d81259',\n",
" 'name': 'Food',\n",
" 'pluralName': 'Food',\n",
" 'shortName': 'Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '4af5d32bf964a5205dfd21e3',\n",
" 'name': 'Z Deli & Pizza',\n",
" 'location': {'address': '803 8th Ave',\n",
" 'crossStreet': 'btwn 48th & 49th St.',\n",
" 'lat': 40.76141387737374,\n",
" 'lng': -73.98674129122485,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76141387737374,\n",
" 'lng': -73.98674129122485},\n",
" {'label': 'entrance', 'lat': 40.76143, 'lng': -73.986935}],\n",
" 'distance': 395,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['803 8th Ave (btwn 48th & 49th St.)',\n",
" 'New York, NY 10019',\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': '65681',\n",
" 'url': 'https://www.seamless.com/menu/z-deli-pizzeria-803-8th-ave-new-york/65681?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=65681',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '582b7d248781882095529e7f',\n",
" 'name': 'Little Italy Pizza',\n",
" 'location': {'address': '696 9th Ave',\n",
" 'crossStreet': 'at W 48th St',\n",
" 'lat': 40.76207308705856,\n",
" 'lng': -73.98994741713837,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76207308705856,\n",
" 'lng': -73.98994741713837},\n",
" {'label': 'entrance', 'lat': 40.762003, 'lng': -73.989826}],\n",
" 'distance': 587,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['696 9th Ave (at W 48th St)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False},\n",
" {'id': '5891509a65be5835dedb1957',\n",
" 'name': 'Acerra Brick Oven Pizza',\n",
" 'location': {'address': '142 W 49th St',\n",
" 'lat': 40.7599775,\n",
" 'lng': -73.982976,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.7599775,\n",
" 'lng': -73.982976},\n",
" {'label': 'entrance', 'lat': 40.760025, 'lng': -73.982906}],\n",
" 'distance': 310,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['142 W 49th St',\n",
" 'New York, NY 10019',\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",
" 'delivery': {'id': '264801',\n",
" 'url': 'https://www.seamless.com/menu/acerra-brick-oven-pizza-142a-w-49th-st-new-york/264801?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=264801',\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",
" 'referralId': 'v-1591507467',\n",
" 'hasPerk': False}]}}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import requests\n",
"results=requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "code",
"execution_count": 27,
"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>id</th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>referralId</th>\n",
" <th>hasPerk</th>\n",
" <th>location.address</th>\n",
" <th>location.crossStreet</th>\n",
" <th>location.lat</th>\n",
" <th>location.lng</th>\n",
" <th>location.labeledLatLngs</th>\n",
" <th>...</th>\n",
" <th>location.state</th>\n",
" <th>location.country</th>\n",
" <th>location.formattedAddress</th>\n",
" <th>delivery.id</th>\n",
" <th>delivery.url</th>\n",
" <th>delivery.provider.name</th>\n",
" <th>delivery.provider.icon.prefix</th>\n",
" <th>delivery.provider.icon.sizes</th>\n",
" <th>delivery.provider.icon.name</th>\n",
" <th>venuePage.id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>598de3c33b83073f81718721</td>\n",
" <td>Joe's Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591507467</td>\n",
" <td>False</td>\n",
" <td>1435 Broadway</td>\n",
" <td>W 40th St</td>\n",
" <td>40.754679</td>\n",
" <td>-73.987029</td>\n",
" <td>[{'label': 'display', 'lat': 40.75467949999999...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1435 Broadway (W 40th St), New York, NY 10018...</td>\n",
" <td>469121</td>\n",
" <td>https://www.seamless.com/menu/joes-pizza-1435-...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4aa88507f964a5208a5120e3</td>\n",
" <td>Famous Amadeus Pizza - Hell's Kitchen</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591507467</td>\n",
" <td>False</td>\n",
" <td>840 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.762357</td>\n",
" <td>-73.985667</td>\n",
" <td>[{'label': 'display', 'lat': 40.76235730570203...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[840 8th Ave, New York, NY 10019, United States]</td>\n",
" <td>65046</td>\n",
" <td>https://www.seamless.com/menu/amadeus-pizza-84...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>47491715</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4dc9931218387d1569587cf9</td>\n",
" <td>99¢ Pizza Spot</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591507467</td>\n",
" <td>False</td>\n",
" <td>43rd and 8th Ave</td>\n",
" <td>Corner of 43rd</td>\n",
" <td>40.758062</td>\n",
" <td>-73.989490</td>\n",
" <td>[{'label': 'display', 'lat': 40.75806203314980...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[43rd and 8th Ave (Corner of 43rd), New York, ...</td>\n",
" <td>206336</td>\n",
" <td>https://www.seamless.com/menu/99-cent-express-...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>509c8753e4b0ca91f9ee1756</td>\n",
" <td>99¢ Fresh Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591507467</td>\n",
" <td>False</td>\n",
" <td>143 W 40th St</td>\n",
" <td>NaN</td>\n",
" <td>40.754576</td>\n",
" <td>-73.987580</td>\n",
" <td>[{'label': 'display', 'lat': 40.75457557893008...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[143 W 40th St, New York, NY 10018, United Sta...</td>\n",
" <td>2111937</td>\n",
" <td>https://www.seamless.com/menu/99-cent-fresh-pi...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4b91992af964a520b1c833e3</td>\n",
" <td>Domino's Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591507467</td>\n",
" <td>False</td>\n",
" <td>227 W 40th St</td>\n",
" <td>btw 7th &amp; 8th</td>\n",
" <td>40.755295</td>\n",
" <td>-73.988824</td>\n",
" <td>[{'label': 'display', 'lat': 40.75529519335076...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[227 W 40th St (btw 7th &amp; 8th), New York, NY 1...</td>\n",
" <td>295996</td>\n",
" <td>https://www.seamless.com/menu/dominos-pizza-22...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" id name \\\n",
"0 598de3c33b83073f81718721 Joe's Pizza \n",
"1 4aa88507f964a5208a5120e3 Famous Amadeus Pizza - Hell's Kitchen \n",
"2 4dc9931218387d1569587cf9 99¢ Pizza Spot \n",
"3 509c8753e4b0ca91f9ee1756 99¢ Fresh Pizza \n",
"4 4b91992af964a520b1c833e3 Domino's Pizza \n",
"\n",
" categories referralId hasPerk \\\n",
"0 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591507467 False \n",
"1 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591507467 False \n",
"2 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591507467 False \n",
"3 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591507467 False \n",
"4 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591507467 False \n",
"\n",
" location.address location.crossStreet location.lat location.lng \\\n",
"0 1435 Broadway W 40th St 40.754679 -73.987029 \n",
"1 840 8th Ave NaN 40.762357 -73.985667 \n",
"2 43rd and 8th Ave Corner of 43rd 40.758062 -73.989490 \n",
"3 143 W 40th St NaN 40.754576 -73.987580 \n",
"4 227 W 40th St btw 7th & 8th 40.755295 -73.988824 \n",
"\n",
" location.labeledLatLngs ... location.state \\\n",
"0 [{'label': 'display', 'lat': 40.75467949999999... ... NY \n",
"1 [{'label': 'display', 'lat': 40.76235730570203... ... NY \n",
"2 [{'label': 'display', 'lat': 40.75806203314980... ... NY \n",
"3 [{'label': 'display', 'lat': 40.75457557893008... ... NY \n",
"4 [{'label': 'display', 'lat': 40.75529519335076... ... NY \n",
"\n",
" location.country location.formattedAddress \\\n",
"0 United States [1435 Broadway (W 40th St), New York, NY 10018... \n",
"1 United States [840 8th Ave, New York, NY 10019, United States] \n",
"2 United States [43rd and 8th Ave (Corner of 43rd), New York, ... \n",
"3 United States [143 W 40th St, New York, NY 10018, United Sta... \n",
"4 United States [227 W 40th St (btw 7th & 8th), New York, NY 1... \n",
"\n",
" delivery.id delivery.url \\\n",
"0 469121 https://www.seamless.com/menu/joes-pizza-1435-... \n",
"1 65046 https://www.seamless.com/menu/amadeus-pizza-84... \n",
"2 206336 https://www.seamless.com/menu/99-cent-express-... \n",
"3 2111937 https://www.seamless.com/menu/99-cent-fresh-pi... \n",
"4 295996 https://www.seamless.com/menu/dominos-pizza-22... \n",
"\n",
" delivery.provider.name delivery.provider.icon.prefix \\\n",
"0 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"1 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"2 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"3 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"4 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"\n",
" delivery.provider.icon.sizes delivery.provider.icon.name \\\n",
"0 [40, 50] /delivery_provider_seamless_20180129.png \n",
"1 [40, 50] /delivery_provider_seamless_20180129.png \n",
"2 [40, 50] /delivery_provider_seamless_20180129.png \n",
"3 [40, 50] /delivery_provider_seamless_20180129.png \n",
"4 [40, 50] /delivery_provider_seamless_20180129.png \n",
"\n",
" venuePage.id \n",
"0 NaN \n",
"1 47491715 \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN \n",
"\n",
"[5 rows x 24 columns]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pandas.io.json import json_normalize\n",
"venues=results['response']['venues']\n",
"df=json_normalize(venues)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filter the Dataset"
]
},
{
"cell_type": "code",
"execution_count": 30,
"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>name</th>\n",
" <th>categories</th>\n",
" <th>address</th>\n",
" <th>crossStreet</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" <th>labeledLatLngs</th>\n",
" <th>distance</th>\n",
" <th>postalCode</th>\n",
" <th>cc</th>\n",
" <th>city</th>\n",
" <th>state</th>\n",
" <th>country</th>\n",
" <th>formattedAddress</th>\n",
" <th>id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Joe's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1435 Broadway</td>\n",
" <td>W 40th St</td>\n",
" <td>40.754679</td>\n",
" <td>-73.987029</td>\n",
" <td>[{'label': 'display', 'lat': 40.75467949999999...</td>\n",
" <td>388</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1435 Broadway (W 40th St), New York, NY 10018...</td>\n",
" <td>598de3c33b83073f81718721</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Famous Amadeus Pizza - Hell's Kitchen</td>\n",
" <td>Pizza Place</td>\n",
" <td>840 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.762357</td>\n",
" <td>-73.985667</td>\n",
" <td>[{'label': 'display', 'lat': 40.76235730570203...</td>\n",
" <td>487</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[840 8th Ave, New York, NY 10019, United States]</td>\n",
" <td>4aa88507f964a5208a5120e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>99¢ Pizza Spot</td>\n",
" <td>Pizza Place</td>\n",
" <td>43rd and 8th Ave</td>\n",
" <td>Corner of 43rd</td>\n",
" <td>40.758062</td>\n",
" <td>-73.989490</td>\n",
" <td>[{'label': 'display', 'lat': 40.75806203314980...</td>\n",
" <td>332</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[43rd and 8th Ave (Corner of 43rd), New York, ...</td>\n",
" <td>4dc9931218387d1569587cf9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>99¢ Fresh Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>143 W 40th St</td>\n",
" <td>NaN</td>\n",
" <td>40.754576</td>\n",
" <td>-73.987580</td>\n",
" <td>[{'label': 'display', 'lat': 40.75457557893008...</td>\n",
" <td>416</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[143 W 40th St, New York, NY 10018, United Sta...</td>\n",
" <td>509c8753e4b0ca91f9ee1756</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Domino's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>227 W 40th St</td>\n",
" <td>btw 7th &amp; 8th</td>\n",
" <td>40.755295</td>\n",
" <td>-73.988824</td>\n",
" <td>[{'label': 'display', 'lat': 40.75529519335076...</td>\n",
" <td>407</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[227 W 40th St (btw 7th &amp; 8th), New York, NY 1...</td>\n",
" <td>4b91992af964a520b1c833e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Mama’s Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>705 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.758724</td>\n",
" <td>-73.988924</td>\n",
" <td>[{'label': 'display', 'lat': 40.75872357572102...</td>\n",
" <td>296</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[705 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4cd73e0367adf04dd5653791</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Famous Original Ray's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>736 7th Ave</td>\n",
" <td>btwn 48th &amp; 49th St.</td>\n",
" <td>40.760438</td>\n",
" <td>-73.983929</td>\n",
" <td>[{'label': 'display', 'lat': 40.76043774660137...</td>\n",
" <td>305</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[736 7th Ave (btwn 48th &amp; 49th St.), New York,...</td>\n",
" <td>4b4c704bf964a520feb226e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Pizza Hut</td>\n",
" <td>Pizza Place</td>\n",
" <td>761-69 7th Ave</td>\n",
" <td>50th St.</td>\n",
" <td>40.761114</td>\n",
" <td>-73.982886</td>\n",
" <td>[{'label': 'display', 'lat': 40.76111397325152...</td>\n",
" <td>414</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[761-69 7th Ave (50th St.), New York, NY 10019...</td>\n",
" <td>4b2ac163f964a520fcae24e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Times Square Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>765 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.760568</td>\n",
" <td>-73.987402</td>\n",
" <td>[{'label': 'display', 'lat': 40.76056822794468...</td>\n",
" <td>327</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[765 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4e24cec8d4c04ce22533785e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Pizza In The City</td>\n",
" <td>Pizza Place</td>\n",
" <td>416 W 46th St</td>\n",
" <td>NaN</td>\n",
" <td>40.759734</td>\n",
" <td>-73.991704</td>\n",
" <td>[{'label': 'display', 'lat': 40.759734, 'lng':...</td>\n",
" <td>554</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[416 W 46th St, New York, NY 10036, United Sta...</td>\n",
" <td>4e4c445abd413c4cc6681705</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Bryant Park Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1095 Avenue Of The Americas</td>\n",
" <td>NaN</td>\n",
" <td>40.754691</td>\n",
" <td>-73.984224</td>\n",
" <td>[{'label': 'display', 'lat': 40.7546911111111,...</td>\n",
" <td>382</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1095 Avenue Of The Americas, New York, NY 100...</td>\n",
" <td>5a5cf46d2e2680114c06eb1a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Pronto Pizza &amp; Beer</td>\n",
" <td>Pizza Place</td>\n",
" <td>30 W 48th St</td>\n",
" <td>NaN</td>\n",
" <td>40.758221</td>\n",
" <td>-73.979498</td>\n",
" <td>[{'label': 'display', 'lat': 40.75822089372300...</td>\n",
" <td>510</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[30 W 48th St, New York, NY 10036, United States]</td>\n",
" <td>4e4e4a31bd4101d0d7a6f154</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>2 Bros. Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>31 W 46th St</td>\n",
" <td>btwn 5th &amp; 6th Ave</td>\n",
" <td>40.756729</td>\n",
" <td>-73.980553</td>\n",
" <td>[{'label': 'display', 'lat': 40.75672851136888...</td>\n",
" <td>443</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[31 W 46th St (btwn 5th &amp; 6th Ave), New York, ...</td>\n",
" <td>4c7d96bbd65437043defc0a2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Le Mirage Cafe &amp; Pizza</td>\n",
" <td>American Restaurant</td>\n",
" <td>20 W 43rd St</td>\n",
" <td>NaN</td>\n",
" <td>40.754712</td>\n",
" <td>-73.981759</td>\n",
" <td>[{'label': 'display', 'lat': 40.75471224442287...</td>\n",
" <td>483</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[20 W 43rd St, New York, NY 10036, United States]</td>\n",
" <td>4addf59cf964a520c36621e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>iPizzaNY</td>\n",
" <td>Pizza Place</td>\n",
" <td>642 9th Ave</td>\n",
" <td>btwn 45th &amp; 46th St</td>\n",
" <td>40.760493</td>\n",
" <td>-73.991098</td>\n",
" <td>[{'label': 'display', 'lat': 40.76049297645480...</td>\n",
" <td>545</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[642 9th Ave (btwn 45th &amp; 46th St), New York, ...</td>\n",
" <td>4c2fce5a3896e21e75a2e490</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Villa Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>263 West 42nd St</td>\n",
" <td>at 8th Ave</td>\n",
" <td>40.757291</td>\n",
" <td>-73.989259</td>\n",
" <td>[{'label': 'display', 'lat': 40.757291, 'lng':...</td>\n",
" <td>322</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[263 West 42nd St (at 8th Ave), New York, NY 1...</td>\n",
" <td>4afa1ac2f964a520c81622e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Upside Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>598 8th Ave</td>\n",
" <td>at W 39th St</td>\n",
" <td>40.755388</td>\n",
" <td>-73.991095</td>\n",
" <td>[{'label': 'display', 'lat': 40.75538788331710...</td>\n",
" <td>549</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[598 8th Ave (at W 39th St), New York, NY 1001...</td>\n",
" <td>5c351c9c121384002c5d27e7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Pizza Pasta</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>Lexington Ave</td>\n",
" <td>at E 93rd</td>\n",
" <td>40.758709</td>\n",
" <td>-73.981456</td>\n",
" <td>[{'label': 'display', 'lat': 40.75870920855404...</td>\n",
" <td>354</td>\n",
" <td>10022</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[Lexington Ave (at E 93rd), New York, NY 10022...</td>\n",
" <td>4bcddf98b6c49c742b169691</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Rays Pizza Restaurant</td>\n",
" <td>Food</td>\n",
" <td>252 E 51st St</td>\n",
" <td>NaN</td>\n",
" <td>40.760394</td>\n",
" <td>-73.983884</td>\n",
" <td>[{'label': 'display', 'lat': 40.76039443663792...</td>\n",
" <td>303</td>\n",
" <td>10022</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[252 E 51st St, New York, NY 10022, United Sta...</td>\n",
" <td>4f32b55d19836c91c7f1f14c</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Pizza Place</td>\n",
" <td>Pizza Place</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>40.753682</td>\n",
" <td>-73.983614</td>\n",
" <td>[{'label': 'display', 'lat': 40.75368157338077...</td>\n",
" <td>505</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[New York, NY 10018, United States]</td>\n",
" <td>4c3ddfeb83a3a5937140ed33</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Pizza Place Next To Paramount Hotel</td>\n",
" <td>Pizza Place</td>\n",
" <td>210-226 W 46th St</td>\n",
" <td>NaN</td>\n",
" <td>40.762415</td>\n",
" <td>-73.987436</td>\n",
" <td>[{'label': 'display', 'lat': 40.76241466588694...</td>\n",
" <td>518</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[210-226 W 46th St, New York, NY 10036, United...</td>\n",
" <td>4b4cb8adf964a520c9bb26e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Tuscany Pizza Cafe</td>\n",
" <td>Pizza Place</td>\n",
" <td>709 8th Ave</td>\n",
" <td>44th</td>\n",
" <td>40.759098</td>\n",
" <td>-73.988845</td>\n",
" <td>[{'label': 'display', 'lat': 40.759098, 'lng':...</td>\n",
" <td>304</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[709 8th Ave (44th), New York, NY 10036, Unite...</td>\n",
" <td>4ad10f7cf964a52060dc20e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Pizza Parlor</td>\n",
" <td>Pizza Place</td>\n",
" <td>1095 Avenue Of The Americas</td>\n",
" <td>NaN</td>\n",
" <td>40.754508</td>\n",
" <td>-73.984705</td>\n",
" <td>[{'label': 'display', 'lat': 40.754508, 'lng':...</td>\n",
" <td>392</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1095 Avenue Of The Americas, New York, NY 100...</td>\n",
" <td>599b0c1d31ac6c7b96420e71</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Artichoke Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1410 Broadway</td>\n",
" <td>39th St</td>\n",
" <td>40.753272</td>\n",
" <td>-73.986648</td>\n",
" <td>[{'label': 'display', 'lat': 40.753272, 'lng':...</td>\n",
" <td>532</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1410 Broadway (39th St), New York, NY 10018, ...</td>\n",
" <td>5e287e0e144dc80008e5d5a0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Rock Pizza Scissors</td>\n",
" <td>Pizza Place</td>\n",
" <td>1471 Broadway</td>\n",
" <td>NaN</td>\n",
" <td>40.756198</td>\n",
" <td>-73.986535</td>\n",
" <td>[{'label': 'display', 'lat': 40.756198, 'lng':...</td>\n",
" <td>215</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1471 Broadway, New York, NY 10036, United Sta...</td>\n",
" <td>593ae2d1f427de5f7fc75fe3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>John's resturant + pizza</td>\n",
" <td>None</td>\n",
" <td>306 12th St</td>\n",
" <td>NaN</td>\n",
" <td>40.758353</td>\n",
" <td>-73.988521</td>\n",
" <td>[{'label': 'display', 'lat': 40.75835312290508...</td>\n",
" <td>254</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[306 12th St, New York, NY 10019, United States]</td>\n",
" <td>4e3c27b3d22d102e852fdb59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Ray's Real Pizza</td>\n",
" <td>Food</td>\n",
" <td>709 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.758801</td>\n",
" <td>-73.988800</td>\n",
" <td>[{'label': 'display', 'lat': 40.758801, 'lng':...</td>\n",
" <td>289</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[709 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4f32447519836c91c7c6c727</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Z Deli &amp; Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>803 8th Ave</td>\n",
" <td>btwn 48th &amp; 49th St.</td>\n",
" <td>40.761414</td>\n",
" <td>-73.986741</td>\n",
" <td>[{'label': 'display', 'lat': 40.76141387737374...</td>\n",
" <td>395</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[803 8th Ave (btwn 48th &amp; 49th St.), New York,...</td>\n",
" <td>4af5d32bf964a5205dfd21e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Little Italy Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>696 9th Ave</td>\n",
" <td>at W 48th St</td>\n",
" <td>40.762073</td>\n",
" <td>-73.989947</td>\n",
" <td>[{'label': 'display', 'lat': 40.76207308705856...</td>\n",
" <td>587</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[696 9th Ave (at W 48th St), New York, NY 1003...</td>\n",
" <td>582b7d248781882095529e7f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Acerra Brick Oven Pizza</td>\n",
" <td>Sandwich Place</td>\n",
" <td>142 W 49th St</td>\n",
" <td>NaN</td>\n",
" <td>40.759977</td>\n",
" <td>-73.982976</td>\n",
" <td>[{'label': 'display', 'lat': 40.7599775, 'lng'...</td>\n",
" <td>310</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[142 W 49th St, New York, NY 10019, United Sta...</td>\n",
" <td>5891509a65be5835dedb1957</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories \\\n",
"0 Joe's Pizza Pizza Place \n",
"1 Famous Amadeus Pizza - Hell's Kitchen Pizza Place \n",
"2 99¢ Pizza Spot Pizza Place \n",
"3 99¢ Fresh Pizza Pizza Place \n",
"4 Domino's Pizza Pizza Place \n",
"5 Mama’s Pizza Pizza Place \n",
"6 Famous Original Ray's Pizza Pizza Place \n",
"7 Pizza Hut Pizza Place \n",
"8 Times Square Pizza Pizza Place \n",
"9 Pizza In The City Pizza Place \n",
"10 Bryant Park Pizza Pizza Place \n",
"11 Pronto Pizza & Beer Pizza Place \n",
"12 2 Bros. Pizza Pizza Place \n",
"13 Le Mirage Cafe & Pizza American Restaurant \n",
"14 iPizzaNY Pizza Place \n",
"15 Villa Pizza Pizza Place \n",
"16 Upside Pizza Pizza Place \n",
"17 Pizza Pasta Italian Restaurant \n",
"18 Rays Pizza Restaurant Food \n",
"19 Pizza Place Pizza Place \n",
"20 Pizza Place Next To Paramount Hotel Pizza Place \n",
"21 Tuscany Pizza Cafe Pizza Place \n",
"22 Pizza Parlor Pizza Place \n",
"23 Artichoke Pizza Pizza Place \n",
"24 Rock Pizza Scissors Pizza Place \n",
"25 John's resturant + pizza None \n",
"26 Ray's Real Pizza Food \n",
"27 Z Deli & Pizza Pizza Place \n",
"28 Little Italy Pizza Pizza Place \n",
"29 Acerra Brick Oven Pizza Sandwich Place \n",
"\n",
" address crossStreet lat lng \\\n",
"0 1435 Broadway W 40th St 40.754679 -73.987029 \n",
"1 840 8th Ave NaN 40.762357 -73.985667 \n",
"2 43rd and 8th Ave Corner of 43rd 40.758062 -73.989490 \n",
"3 143 W 40th St NaN 40.754576 -73.987580 \n",
"4 227 W 40th St btw 7th & 8th 40.755295 -73.988824 \n",
"5 705 8th Ave NaN 40.758724 -73.988924 \n",
"6 736 7th Ave btwn 48th & 49th St. 40.760438 -73.983929 \n",
"7 761-69 7th Ave 50th St. 40.761114 -73.982886 \n",
"8 765 8th Ave NaN 40.760568 -73.987402 \n",
"9 416 W 46th St NaN 40.759734 -73.991704 \n",
"10 1095 Avenue Of The Americas NaN 40.754691 -73.984224 \n",
"11 30 W 48th St NaN 40.758221 -73.979498 \n",
"12 31 W 46th St btwn 5th & 6th Ave 40.756729 -73.980553 \n",
"13 20 W 43rd St NaN 40.754712 -73.981759 \n",
"14 642 9th Ave btwn 45th & 46th St 40.760493 -73.991098 \n",
"15 263 West 42nd St at 8th Ave 40.757291 -73.989259 \n",
"16 598 8th Ave at W 39th St 40.755388 -73.991095 \n",
"17 Lexington Ave at E 93rd 40.758709 -73.981456 \n",
"18 252 E 51st St NaN 40.760394 -73.983884 \n",
"19 NaN NaN 40.753682 -73.983614 \n",
"20 210-226 W 46th St NaN 40.762415 -73.987436 \n",
"21 709 8th Ave 44th 40.759098 -73.988845 \n",
"22 1095 Avenue Of The Americas NaN 40.754508 -73.984705 \n",
"23 1410 Broadway 39th St 40.753272 -73.986648 \n",
"24 1471 Broadway NaN 40.756198 -73.986535 \n",
"25 306 12th St NaN 40.758353 -73.988521 \n",
"26 709 8th Ave NaN 40.758801 -73.988800 \n",
"27 803 8th Ave btwn 48th & 49th St. 40.761414 -73.986741 \n",
"28 696 9th Ave at W 48th St 40.762073 -73.989947 \n",
"29 142 W 49th St NaN 40.759977 -73.982976 \n",
"\n",
" labeledLatLngs distance postalCode \\\n",
"0 [{'label': 'display', 'lat': 40.75467949999999... 388 10018 \n",
"1 [{'label': 'display', 'lat': 40.76235730570203... 487 10019 \n",
"2 [{'label': 'display', 'lat': 40.75806203314980... 332 10036 \n",
"3 [{'label': 'display', 'lat': 40.75457557893008... 416 10018 \n",
"4 [{'label': 'display', 'lat': 40.75529519335076... 407 10018 \n",
"5 [{'label': 'display', 'lat': 40.75872357572102... 296 10036 \n",
"6 [{'label': 'display', 'lat': 40.76043774660137... 305 10019 \n",
"7 [{'label': 'display', 'lat': 40.76111397325152... 414 10019 \n",
"8 [{'label': 'display', 'lat': 40.76056822794468... 327 10036 \n",
"9 [{'label': 'display', 'lat': 40.759734, 'lng':... 554 10036 \n",
"10 [{'label': 'display', 'lat': 40.7546911111111,... 382 10036 \n",
"11 [{'label': 'display', 'lat': 40.75822089372300... 510 10036 \n",
"12 [{'label': 'display', 'lat': 40.75672851136888... 443 10036 \n",
"13 [{'label': 'display', 'lat': 40.75471224442287... 483 10036 \n",
"14 [{'label': 'display', 'lat': 40.76049297645480... 545 10036 \n",
"15 [{'label': 'display', 'lat': 40.757291, 'lng':... 322 10036 \n",
"16 [{'label': 'display', 'lat': 40.75538788331710... 549 10018 \n",
"17 [{'label': 'display', 'lat': 40.75870920855404... 354 10022 \n",
"18 [{'label': 'display', 'lat': 40.76039443663792... 303 10022 \n",
"19 [{'label': 'display', 'lat': 40.75368157338077... 505 10018 \n",
"20 [{'label': 'display', 'lat': 40.76241466588694... 518 10036 \n",
"21 [{'label': 'display', 'lat': 40.759098, 'lng':... 304 10036 \n",
"22 [{'label': 'display', 'lat': 40.754508, 'lng':... 392 10036 \n",
"23 [{'label': 'display', 'lat': 40.753272, 'lng':... 532 10018 \n",
"24 [{'label': 'display', 'lat': 40.756198, 'lng':... 215 10036 \n",
"25 [{'label': 'display', 'lat': 40.75835312290508... 254 10019 \n",
"26 [{'label': 'display', 'lat': 40.758801, 'lng':... 289 10036 \n",
"27 [{'label': 'display', 'lat': 40.76141387737374... 395 10019 \n",
"28 [{'label': 'display', 'lat': 40.76207308705856... 587 10036 \n",
"29 [{'label': 'display', 'lat': 40.7599775, 'lng'... 310 10019 \n",
"\n",
" cc city state country \\\n",
"0 US New York NY United States \n",
"1 US New York NY United States \n",
"2 US New York NY United States \n",
"3 US New York NY United States \n",
"4 US New York NY United States \n",
"5 US New York NY United States \n",
"6 US New York NY United States \n",
"7 US New York NY United States \n",
"8 US New York NY United States \n",
"9 US New York NY United States \n",
"10 US New York NY United States \n",
"11 US New York NY United States \n",
"12 US New York NY United States \n",
"13 US New York NY United States \n",
"14 US New York NY United States \n",
"15 US New York NY United States \n",
"16 US New York NY United States \n",
"17 US New York NY United States \n",
"18 US New York NY United States \n",
"19 US New York NY United States \n",
"20 US New York NY United States \n",
"21 US New York NY United States \n",
"22 US New York NY United States \n",
"23 US New York NY United States \n",
"24 US New York NY United States \n",
"25 US New York NY United States \n",
"26 US New York NY United States \n",
"27 US New York NY United States \n",
"28 US New York NY United States \n",
"29 US New York NY United States \n",
"\n",
" formattedAddress \\\n",
"0 [1435 Broadway (W 40th St), New York, NY 10018... \n",
"1 [840 8th Ave, New York, NY 10019, United States] \n",
"2 [43rd and 8th Ave (Corner of 43rd), New York, ... \n",
"3 [143 W 40th St, New York, NY 10018, United Sta... \n",
"4 [227 W 40th St (btw 7th & 8th), New York, NY 1... \n",
"5 [705 8th Ave, New York, NY 10036, United States] \n",
"6 [736 7th Ave (btwn 48th & 49th St.), New York,... \n",
"7 [761-69 7th Ave (50th St.), New York, NY 10019... \n",
"8 [765 8th Ave, New York, NY 10036, United States] \n",
"9 [416 W 46th St, New York, NY 10036, United Sta... \n",
"10 [1095 Avenue Of The Americas, New York, NY 100... \n",
"11 [30 W 48th St, New York, NY 10036, United States] \n",
"12 [31 W 46th St (btwn 5th & 6th Ave), New York, ... \n",
"13 [20 W 43rd St, New York, NY 10036, United States] \n",
"14 [642 9th Ave (btwn 45th & 46th St), New York, ... \n",
"15 [263 West 42nd St (at 8th Ave), New York, NY 1... \n",
"16 [598 8th Ave (at W 39th St), New York, NY 1001... \n",
"17 [Lexington Ave (at E 93rd), New York, NY 10022... \n",
"18 [252 E 51st St, New York, NY 10022, United Sta... \n",
"19 [New York, NY 10018, United States] \n",
"20 [210-226 W 46th St, New York, NY 10036, United... \n",
"21 [709 8th Ave (44th), New York, NY 10036, Unite... \n",
"22 [1095 Avenue Of The Americas, New York, NY 100... \n",
"23 [1410 Broadway (39th St), New York, NY 10018, ... \n",
"24 [1471 Broadway, New York, NY 10036, United Sta... \n",
"25 [306 12th St, New York, NY 10019, United States] \n",
"26 [709 8th Ave, New York, NY 10036, United States] \n",
"27 [803 8th Ave (btwn 48th & 49th St.), New York,... \n",
"28 [696 9th Ave (at W 48th St), New York, NY 1003... \n",
"29 [142 W 49th St, New York, NY 10019, United Sta... \n",
"\n",
" id \n",
"0 598de3c33b83073f81718721 \n",
"1 4aa88507f964a5208a5120e3 \n",
"2 4dc9931218387d1569587cf9 \n",
"3 509c8753e4b0ca91f9ee1756 \n",
"4 4b91992af964a520b1c833e3 \n",
"5 4cd73e0367adf04dd5653791 \n",
"6 4b4c704bf964a520feb226e3 \n",
"7 4b2ac163f964a520fcae24e3 \n",
"8 4e24cec8d4c04ce22533785e \n",
"9 4e4c445abd413c4cc6681705 \n",
"10 5a5cf46d2e2680114c06eb1a \n",
"11 4e4e4a31bd4101d0d7a6f154 \n",
"12 4c7d96bbd65437043defc0a2 \n",
"13 4addf59cf964a520c36621e3 \n",
"14 4c2fce5a3896e21e75a2e490 \n",
"15 4afa1ac2f964a520c81622e3 \n",
"16 5c351c9c121384002c5d27e7 \n",
"17 4bcddf98b6c49c742b169691 \n",
"18 4f32b55d19836c91c7f1f14c \n",
"19 4c3ddfeb83a3a5937140ed33 \n",
"20 4b4cb8adf964a520c9bb26e3 \n",
"21 4ad10f7cf964a52060dc20e3 \n",
"22 599b0c1d31ac6c7b96420e71 \n",
"23 5e287e0e144dc80008e5d5a0 \n",
"24 593ae2d1f427de5f7fc75fe3 \n",
"25 4e3c27b3d22d102e852fdb59 \n",
"26 4f32447519836c91c7c6c727 \n",
"27 4af5d32bf964a5205dfd21e3 \n",
"28 582b7d248781882095529e7f \n",
"29 5891509a65be5835dedb1957 "
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filtered_columns = ['name', 'categories'] + [col for col in df.columns if col.startswith('location.')] + ['id']\n",
"df_filtered = df.loc[:, filtered_columns]\n",
"\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']\n",
"df_filtered['categories'] = df_filtered.apply(get_category_type, axis=1)\n",
"df_filtered.columns = [column.split('.')[-1] for column in df_filtered.columns]\n",
"df_filtered"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"source_hidden": true
}
},
"outputs": [],
"source": [
"# keep only columns that include venue name, and anything that is associated with location\n",
"filtered_columns = ['name', 'categories'] + [col for col in df.columns if col.startswith('location.')] + ['id']\n",
"dataframe_filtered = df.loc[:, filtered_columns]\n",
"\n",
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['name']\n",
" except:\n",
" categories_list = row['venue.name']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['categories']\n",
"\n",
"# filter the category for each row\n",
"dataframe_filtered['name'] = dataframe_filtered.apply(get_category_type, axis=1)\n",
"\n",
"# clean column names by keeping only last term\n",
"dataframe_filtered.columns = [column.split('.')[-1] for column in dataframe_filtered.columns]\n",
"\n",
"dataframe_filtered"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true,
"source_hidden": true
}
},
"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+ICNtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzU3OTgwMSwtNzMuOTg1NTQ1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNDMyMjY4NTViNzQyNDA0ZDgzNmJhOGJiOTAzY2M4NzggPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxNjg1NGRjYjNlODQzZDliNTNiYWI4MDQ0MDNlY2FmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU3OTgwMSwtNzMuOTg1NTQ1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0NGM0NjNlMGU2ZTQzMjRhMGY5ZTVhNjVjZTY5NTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmYzMxMmRjZWIwMjRmMDZiMjlkMzA0Yjc3MWVlOTY1ID0gJCgnPGRpdiBpZD0iaHRtbF9hZmMzMTJkY2ViMDI0ZjA2YjI5ZDMwNGI3NzFlZTk2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWRkcmVzczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQ0YzQ2M2UwZTZlNDMyNGEwZjllNWE2NWNlNjk1N2Euc2V0Q29udGVudChodG1sX2FmYzMxMmRjZWIwMjRmMDZiMjlkMzA0Yjc3MWVlOTY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxNjg1NGRjYjNlODQzZDliNTNiYWI4MDQ0MDNlY2FmLmJpbmRQb3B1cChwb3B1cF9kNDRjNDYzZTBlNmU0MzI0YTBmOWU1YTY1Y2U2OTU3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Nzc4YzZhM2IzZjc0NWQ0YmJmNTVhNGM1N2YxNDAzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDY3OTQ5OTk5OTk5LC03My45ODcwMjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzODEwOWVkODVhYjQzZjY5ZTZkODU0ZDc2NGRiOWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4NWVlNzc0NzJjNzQ5MDY5ZGRiYmIxYjFiYjJiZWQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9hODVlZTc3NDcyYzc0OTA2OWRkYmJiMWIxYmIyYmVkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzODEwOWVkODVhYjQzZjY5ZTZkODU0ZDc2NGRiOWZiLnNldENvbnRlbnQoaHRtbF9hODVlZTc3NDcyYzc0OTA2OWRkYmJiMWIxYmIyYmVkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Nzc4YzZhM2IzZjc0NWQ0YmJmNTVhNGM1N2YxNDAzNC5iaW5kUG9wdXAocG9wdXBfNDM4MTA5ZWQ4NWFiNDNmNjllNmQ4NTRkNzY0ZGI5ZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjUwNGY2MTQyY2QwNDNhMmJlOWUwNTJiMmU2YWJjMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjIzNTczMDU3MDIwMywtNzMuOTg1NjY3MjI4Njk4NzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzU4ZjM2YjQyMTQ2NDU1MmJkYjQwODk2NDk3ZDYzNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ZjZTAxMzM1Mzk3NDUxM2E0Y2MyZTNhOTI4OTU4YWIgPSAkKCc8ZGl2IGlkPSJodG1sXzNmY2UwMTMzNTM5NzQ1MTNhNGNjMmUzYTkyODk1OGFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzU4ZjM2YjQyMTQ2NDU1MmJkYjQwODk2NDk3ZDYzNzQuc2V0Q29udGVudChodG1sXzNmY2UwMTMzNTM5NzQ1MTNhNGNjMmUzYTkyODk1OGFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1MDRmNjE0MmNkMDQzYTJiZTllMDUyYjJlNmFiYzBmLmJpbmRQb3B1cChwb3B1cF83NThmMzZiNDIxNDY0NTUyYmRiNDA4OTY0OTdkNjM3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYWZjOTY2ZWFkMDU0M2M4YmYzODI1YWMxNWU0ZjcxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODA2MjAzMzE0OTgwNSwtNzMuOTg5NDg5Njg0OTY4NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZjOTY1YzE1Y2IxNDZiNmJlZDQyNjQ4Njc1ZjA1N2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E2YWQ4OTU3ZGNlNDhhNGIxZWVhYzE5YjJhNTA5Y2MgPSAkKCc8ZGl2IGlkPSJodG1sXzNhNmFkODk1N2RjZTQ4YTRiMWVlYWMxOWIyYTUwOWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjZjOTY1YzE1Y2IxNDZiNmJlZDQyNjQ4Njc1ZjA1N2Quc2V0Q29udGVudChodG1sXzNhNmFkODk1N2RjZTQ4YTRiMWVlYWMxOWIyYTUwOWNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhZmM5NjZlYWQwNTQzYzhiZjM4MjVhYzE1ZTRmNzFhLmJpbmRQb3B1cChwb3B1cF9iNmM5NjVjMTVjYjE0NmI2YmVkNDI2NDg2NzVmMDU3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zODgxNTNlMTM0YTE0MTE1OTk2ZDdiY2JhZjBlMmUwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDU3NTU3ODkzMDA4LC03My45ODc1ODAxNDgwNjg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWU5OTc4ODY1YTE0NjI3YWRmY2QyM2RlYWQ4NDZiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjI3MjJhNzA5ODU0YThiYWJjN2ExMjYwMzM2M2JiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjYyNzIyYTcwOTg1NGE4YmFiYzdhMTI2MDMzNjNiYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWU5OTc4ODY1YTE0NjI3YWRmY2QyM2RlYWQ4NDZiMS5zZXRDb250ZW50KGh0bWxfYjYyNzIyYTcwOTg1NGE4YmFiYzdhMTI2MDMzNjNiYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg4MTUzZTEzNGExNDExNTk5NmQ3YmNiYWYwZTJlMDcuYmluZFBvcHVwKHBvcHVwXzk1ZTk5Nzg4NjVhMTQ2MjdhZGZjZDIzZGVhZDg0NmIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkZjc3YWU2Zjk2NzRjYTViMmI1NmU4YmJlM2QwZTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1Mjk1MTkzMzUwNzYsLTczLjk4ODgyNDE4ODcwOTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhOGI0YmUxNDBmNjRkOTViZmJiNGY5ZjU5ZmFiYTQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhMDAyNTBjZjNiNDRjMWQ4N2UwZDNmZDhjYzE2NjA5ID0gJCgnPGRpdiBpZD0iaHRtbF9hYTAwMjUwY2YzYjQ0YzFkODdlMGQzZmQ4Y2MxNjYwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhOGI0YmUxNDBmNjRkOTViZmJiNGY5ZjU5ZmFiYTQ5LnNldENvbnRlbnQoaHRtbF9hYTAwMjUwY2YzYjQ0YzFkODdlMGQzZmQ4Y2MxNjYwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZGY3N2FlNmY5Njc0Y2E1YjJiNTZlOGJiZTNkMGUzZC5iaW5kUG9wdXAocG9wdXBfYWE4YjRiZTE0MGY2NGQ5NWJmYmI0ZjlmNTlmYWJhNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjQwMjQ2NTlhMjRlNGIxZGE4ODA0YTJkNzA1OTE4MzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTg3MjM1NzU3MjEwMiwtNzMuOTg4OTI0MDUyNTEwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODI1YzE3N2Q4YjBiNGJhYTgwMTcxZTU2MTViMzQ4NDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNmNGYyMDA5OGIzNDYwNjlhMzdkMjkzMGI0YmIzNGYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjZjRmMjAwOThiMzQ2MDY5YTM3ZDI5MzBiNGJiMzRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODI1YzE3N2Q4YjBiNGJhYTgwMTcxZTU2MTViMzQ4NDcuc2V0Q29udGVudChodG1sX2ZjZjRmMjAwOThiMzQ2MDY5YTM3ZDI5MzBiNGJiMzRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0MDI0NjU5YTI0ZTRiMWRhODgwNGEyZDcwNTkxODMyLmJpbmRQb3B1cChwb3B1cF84MjVjMTc3ZDhiMGI0YmFhODAxNzFlNTYxNWIzNDg0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzU0ZGUxMGRkNTk0ODYzOWQ1ZjY5OWZhNGJmODEyNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDQzNzc0NjYwMTM3NiwtNzMuOTgzOTI4ODcyOTY0MDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2E3YTAwMjViZTkwNDYyMWEwYjJkNTFmODc5YTI4N2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjY3NTg0YzM3M2Q1NGRiZDk2NmY4NTY5YzRhNjRhYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzI2NzU4NGMzNzNkNTRkYmQ5NjZmODU2OWM0YTY0YWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E3YTAwMjViZTkwNDYyMWEwYjJkNTFmODc5YTI4N2Yuc2V0Q29udGVudChodG1sXzI2NzU4NGMzNzNkNTRkYmQ5NjZmODU2OWM0YTY0YWFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjNTRkZTEwZGQ1OTQ4NjM5ZDVmNjk5ZmE0YmY4MTI3LmJpbmRQb3B1cChwb3B1cF83YTdhMDAyNWJlOTA0NjIxYTBiMmQ1MWY4NzlhMjg3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNDI1YmNmN2U2ZWM0YWM5OTc4ZmJiMmJhYmViMjJjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTExMzk3MzI1MTUyNiwtNzMuOTgyODg1Nzc3OTUwMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzNhZjZjYWZlZjY0NDZkMTllMjY4ZjhlZGIwMjRkNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJkNjQ0MjYwYjM0NDg0NGIxODg0YzFiYWM4ZDk1MzUgPSAkKCc8ZGl2IGlkPSJodG1sX2YyZDY0NDI2MGIzNDQ4NDRiMTg4NGMxYmFjOGQ5NTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzNhZjZjYWZlZjY0NDZkMTllMjY4ZjhlZGIwMjRkNDYuc2V0Q29udGVudChodG1sX2YyZDY0NDI2MGIzNDQ4NDRiMTg4NGMxYmFjOGQ5NTM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0MjViY2Y3ZTZlYzRhYzk5NzhmYmIyYmFiZWIyMmM5LmJpbmRQb3B1cChwb3B1cF9jM2FmNmNhZmVmNjQ0NmQxOWUyNjhmOGVkYjAyNGQ0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDhkN2RjYTQ4ZDc0YTdlOGU3NTFiNzRmOGRjM2M2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDU2ODIyNzk0NDY4LC03My45ODc0MDE5Mzk0ODI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OGFlZGQzZjdkMjQ0YWEwYmQxZTM5NTgzZDUyYTAyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTUxMzdkOTU3ZjA0YWUyOThkMDMyYzBiYzlmNDMyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjU1MTM3ZDk1N2YwNGFlMjk4ZDAzMmMwYmM5ZjQzMjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGFlZGQzZjdkMjQ0YWEwYmQxZTM5NTgzZDUyYTAyZS5zZXRDb250ZW50KGh0bWxfZjU1MTM3ZDk1N2YwNGFlMjk4ZDAzMmMwYmM5ZjQzMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q4ZDdkY2E0OGQ3NGE3ZThlNzUxYjc0ZjhkYzNjNmMuYmluZFBvcHVwKHBvcHVwXzY4YWVkZDNmN2QyNDRhYTBiZDFlMzk1ODNkNTJhMDJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3YzY1MDA2YWI1OTQ2MGM4YzdmZTM2ZjZlN2NmNjFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU5NzM0LC03My45OTE3MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZjNjZmZDZhODk3NGU1OWI5MTMxOTA0OWVhNzI1NTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjI1MWU0ODY4ZTMzNGYwM2FjZTMyNWRhZTU2MGY5OWUgPSAkKCc8ZGl2IGlkPSJodG1sX2IyNTFlNDg2OGUzMzRmMDNhY2UzMjVkYWU1NjBmOTllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmZjNjZmZDZhODk3NGU1OWI5MTMxOTA0OWVhNzI1NTYuc2V0Q29udGVudChodG1sX2IyNTFlNDg2OGUzMzRmMDNhY2UzMjVkYWU1NjBmOTllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3YzY1MDA2YWI1OTQ2MGM4YzdmZTM2ZjZlN2NmNjFmLmJpbmRQb3B1cChwb3B1cF9iZmM2NmZkNmE4OTc0ZTU5YjkxMzE5MDQ5ZWE3MjU1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZDgzZDQzNmY3ZjU0MDdmYTZlZWU4MTRjZTg5NjJhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDY5MTExMTExMTEsLTczLjk4NDIyNDQ0NDQ0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE2Y2Q1NGQ3N2VmNGFhNmFiMmFiYTY2ZDU3YTA3YzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjA2OTVjZDM4Mjc3NDI4Zjg0YmQ3MDczOWUzNWIzZmQgPSAkKCc8ZGl2IGlkPSJodG1sX2IwNjk1Y2QzODI3NzQyOGY4NGJkNzA3MzllMzViM2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE2Y2Q1NGQ3N2VmNGFhNmFiMmFiYTY2ZDU3YTA3Yzkuc2V0Q29udGVudChodG1sX2IwNjk1Y2QzODI3NzQyOGY4NGJkNzA3MzllMzViM2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkODNkNDM2ZjdmNTQwN2ZhNmVlZTgxNGNlODk2MmFjLmJpbmRQb3B1cChwb3B1cF8xMTZjZDU0ZDc3ZWY0YWE2YWIyYWJhNjZkNTdhMDdjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iM2NkNmJjZTJiN2E0YTY2YWIyOTUyZDZiODBjM2RjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODIyMDg5MzcyMzAwNiwtNzMuOTc5NDk4MDE5NDI0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDM3M2Q5ODFhZTNlNDIxOWE1NTgyMTJjYzlkODc4NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ0MDZjNDEzZWFlNGRiOTkxM2Y2OWVhNGIzOTRjYTAgPSAkKCc8ZGl2IGlkPSJodG1sXzM0NDA2YzQxM2VhZTRkYjk5MTNmNjllYTRiMzk0Y2EwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDM3M2Q5ODFhZTNlNDIxOWE1NTgyMTJjYzlkODc4NWUuc2V0Q29udGVudChodG1sXzM0NDA2YzQxM2VhZTRkYjk5MTNmNjllYTRiMzk0Y2EwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzY2Q2YmNlMmI3YTRhNjZhYjI5NTJkNmI4MGMzZGNiLmJpbmRQb3B1cChwb3B1cF80MzczZDk4MWFlM2U0MjE5YTU1ODIxMmNjOWQ4Nzg1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDY0NDVhNmQ0Y2U0MDNkOGFmODA1OTIxYjRmMjhiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NjcyODUxMTM2ODg4LC03My45ODA1NTM0MzIzMzA4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTg2ODBjNGMxM2U0YzA2OGQ5NjhmOGZiY2JjNGFlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYjY3ODhhYWQ3Zjc0NGU0OWU5ZDc1MjA3ZmY0MWY0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmI2Nzg4YWFkN2Y3NDRlNDllOWQ3NTIwN2ZmNDFmNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTg2ODBjNGMxM2U0YzA2OGQ5NjhmOGZiY2JjNGFlMy5zZXRDb250ZW50KGh0bWxfMmI2Nzg4YWFkN2Y3NDRlNDllOWQ3NTIwN2ZmNDFmNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzA2NDQ1YTZkNGNlNDAzZDhhZjgwNTkyMWI0ZjI4YmQuYmluZFBvcHVwKHBvcHVwXzc1ODY4MGM0YzEzZTRjMDY4ZDk2OGY4ZmJjYmM0YWUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5YjFkMjYwOTA0OTQ4MzE4MjM2ODA3YjkxNDAyMGRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NzEyMjQ0NDIyODc2LC03My45ODE3NTkzODU4ODA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Y2VmODM4NjU1YWY0OGU0YTgyMDBkNzBiNTAxZTNjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTFmNWQwYWU1OTE0MjFjYWZiMzIxMTAzZmEwMDUxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjUxZjVkMGFlNTkxNDIxY2FmYjMyMTEwM2ZhMDA1MTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFtZXJpY2FuIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjZWY4Mzg2NTVhZjQ4ZTRhODIwMGQ3MGI1MDFlM2M5LnNldENvbnRlbnQoaHRtbF8yNTFmNWQwYWU1OTE0MjFjYWZiMzIxMTAzZmEwMDUxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOWIxZDI2MDkwNDk0ODMxODIzNjgwN2I5MTQwMjBkZi5iaW5kUG9wdXAocG9wdXBfOGNlZjgzODY1NWFmNDhlNGE4MjAwZDcwYjUwMWUzYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTRiNWNkNGQwNzE0NDE5MDhhM2ExM2UzYWNmMjdlZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjA0OTI5NzY0NTQ4MDYsLTczLjk5MTA5NzcyMjk0NTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZDMwNmEyMjI5YzQzYzZiZDg1NmQ3MWYyOTc2NmE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkMTA2Mjg0MGY5ZTRmMjhiMjU0MjM3ZTQzZjZmYzM4ID0gJCgnPGRpdiBpZD0iaHRtbF9hZDEwNjI4NDBmOWU0ZjI4YjI1NDIzN2U0M2Y2ZmMzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZDMwNmEyMjI5YzQzYzZiZDg1NmQ3MWYyOTc2NmE0LnNldENvbnRlbnQoaHRtbF9hZDEwNjI4NDBmOWU0ZjI4YjI1NDIzN2U0M2Y2ZmMzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNGI1Y2Q0ZDA3MTQ0MTkwOGEzYTEzZTNhY2YyN2VkYi5iaW5kUG9wdXAocG9wdXBfZWRkMzA2YTIyMjljNDNjNmJkODU2ZDcxZjI5NzY2YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNhMmM5ZTIyMmZjNGVmODhhMjZiMzJjMTFlZDQxOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTcyOTEsLTczLjk4OTI1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OTUxYmI3M2NiOTE0MDg0ODdhMzE2NTJkNTZhMmE1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODQzMjViMTMxMzI0NmY0OGQyM2I5M2UxZTIwN2RjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg0MzI1YjEzMTMyNDZmNDhkMjNiOTNlMWUyMDdkY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTUxYmI3M2NiOTE0MDg0ODdhMzE2NTJkNTZhMmE1NS5zZXRDb250ZW50KGh0bWxfZTg0MzI1YjEzMTMyNDZmNDhkMjNiOTNlMWUyMDdkY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNhMmM5ZTIyMmZjNGVmODhhMjZiMzJjMTFlZDQxOGYuYmluZFBvcHVwKHBvcHVwXzY5NTFiYjczY2I5MTQwODQ4N2EzMTY1MmQ1NmEyYTU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlMzJmY2U5NjkxMDRmZGNiZjJjYjIyZGM2NzE1NzE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1Mzg3ODgzMzE3MTA1LC03My45OTEwOTUwNzQ1NTA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYWM3MDIwNWJjNGM0MTYxOTkzMThlNzAyZDM2ZjI5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MWRkMDMxYzFlNjI0MmZjYjQxZjI0ZjJkYmY5N2UzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODFkZDAzMWMxZTYyNDJmY2I0MWYyNGYyZGJmOTdlMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYWM3MDIwNWJjNGM0MTYxOTkzMThlNzAyZDM2ZjI5My5zZXRDb250ZW50KGh0bWxfODFkZDAzMWMxZTYyNDJmY2I0MWYyNGYyZGJmOTdlMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWUzMmZjZTk2OTEwNGZkY2JmMmNiMjJkYzY3MTU3MTcuYmluZFBvcHVwKHBvcHVwX2ZhYzcwMjA1YmM0YzQxNjE5OTMxOGU3MDJkMzZmMjkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyOWNiMTAyZjJiMTRlMjE4MWM3YWU5MzI4MjZhM2FiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4NzA5MjA4NTU0MDQsLTczLjk4MTQ1NjIyODQyNzY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjNjAzMDcwMjU4NjRiYjVhODA3OGU1MjQwMjFhM2M4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwMDczNWZhYTNmYjQ4MGM4ZmE5NjNiYTZkNzBhMDI5ID0gJCgnPGRpdiBpZD0iaHRtbF9jMDA3MzVmYWEzZmI0ODBjOGZhOTYzYmE2ZDcwYTAyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SXRhbGlhbiBSZXN0YXVyYW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzYwMzA3MDI1ODY0YmI1YTgwNzhlNTI0MDIxYTNjOC5zZXRDb250ZW50KGh0bWxfYzAwNzM1ZmFhM2ZiNDgwYzhmYTk2M2JhNmQ3MGEwMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTI5Y2IxMDJmMmIxNGUyMTgxYzdhZTkzMjgyNmEzYWIuYmluZFBvcHVwKHBvcHVwXzhjNjAzMDcwMjU4NjRiYjVhODA3OGU1MjQwMjFhM2M4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhYzQ5NGQ2NGE2YjQyZTc5OWUyNDQ2YWZhNjhhNjNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMzk0NDM2NjM3OTI0LC03My45ODM4ODQxNzgzMDEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1NzQ1ZjhlNjZjYjQ2YzQ5MTdjOGM3ZWJlNjZhMmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwZDIyNjUxNWQ1YzRkNTA4MWRjYzY4MzMxZmY1ZDdkID0gJCgnPGRpdiBpZD0iaHRtbF85MGQyMjY1MTVkNWM0ZDUwODFkY2M2ODMzMWZmNWQ3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9vZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU3NDVmOGU2NmNiNDZjNDkxN2M4YzdlYmU2NmEyZmMuc2V0Q29udGVudChodG1sXzkwZDIyNjUxNWQ1YzRkNTA4MWRjYzY4MzMxZmY1ZDdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhYzQ5NGQ2NGE2YjQyZTc5OWUyNDQ2YWZhNjhhNjNlLmJpbmRQb3B1cChwb3B1cF9jNTc0NWY4ZTY2Y2I0NmM0OTE3YzhjN2ViZTY2YTJmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDM3ODk2ZjQ2ZmE0Njk1OWM4ZGJhOGU1NDk0ZGMwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MzY4MTU3MzM4MDc3LC03My45ODM2MTQxNTI1NTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzNDE1ZmZmZTE3NDQxNjk5ODFjNDU0MTg1ZjEzN2NiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxODIyYjMwZTQ0ZTRjN2E5Y2Y1ZTVjYjBmODdmNWQ2ID0gJCgnPGRpdiBpZD0iaHRtbF8yMTgyMmIzMGU0NGU0YzdhOWNmNWU1Y2IwZjg3ZjVkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzNDE1ZmZmZTE3NDQxNjk5ODFjNDU0MTg1ZjEzN2NiLnNldENvbnRlbnQoaHRtbF8yMTgyMmIzMGU0NGU0YzdhOWNmNWU1Y2IwZjg3ZjVkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDM3ODk2ZjQ2ZmE0Njk1OWM4ZGJhOGU1NDk0ZGMwZS5iaW5kUG9wdXAocG9wdXBfYTM0MTVmZmZlMTc0NDE2OTk4MWM0NTQxODVmMTM3Y2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzkxZjhjYmRkNDhiNDg0OThhZjAyOGZhYmNlOTc3ODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjI0MTQ2NjU4ODY5NCwtNzMuOTg3NDM2MzczNTY2ODVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGQzMDdiZDcwYWQ5NDczMThlOTU4MWU1OTFhZmRlMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDkzY2I0YzhiMzMyNDBmM2JhOWYwNzM2NjlkNGQzZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ5M2NiNGM4YjMzMjQwZjNiYTlmMDczNjY5ZDRkM2ZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGQzMDdiZDcwYWQ5NDczMThlOTU4MWU1OTFhZmRlMTEuc2V0Q29udGVudChodG1sXzQ5M2NiNGM4YjMzMjQwZjNiYTlmMDczNjY5ZDRkM2ZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5MWY4Y2JkZDQ4YjQ4NDk4YWYwMjhmYWJjZTk3Nzg1LmJpbmRQb3B1cChwb3B1cF9kZDMwN2JkNzBhZDk0NzMxOGU5NTgxZTU5MWFmZGUxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NmRkMWQxN2U0NDY0NjQxYTMzOTUxYjI2MDliYTc1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1OTA5OCwtNzMuOTg4ODQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1ZGM5ZjA0NjQ3ODRhNGY5NGY5ODJhYTNlODczMjY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViOGNmNWQ1MmQ3YzQ2Y2I5YTJmMzIyMzI5NDBhNTQ2ID0gJCgnPGRpdiBpZD0iaHRtbF81YjhjZjVkNTJkN2M0NmNiOWEyZjMyMjMyOTQwYTU0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ZGM5ZjA0NjQ3ODRhNGY5NGY5ODJhYTNlODczMjY4LnNldENvbnRlbnQoaHRtbF81YjhjZjVkNTJkN2M0NmNiOWEyZjMyMjMyOTQwYTU0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NmRkMWQxN2U0NDY0NjQxYTMzOTUxYjI2MDliYTc1Zi5iaW5kUG9wdXAocG9wdXBfMDVkYzlmMDQ2NDc4NGE0Zjk0Zjk4MmFhM2U4NzMyNjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjY5MjA1YTk1MWFmNDE2MjliNDhkZjQ3ZWY1NGFjNDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ1MDgsLTczLjk4NDcwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZDkxOTkyZjU2NGM0OTAzYmZjN2ZlNDE1ZWZhMWEyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZmViMmY1ODdmN2E0NjAyODc1MTZiZWRlNWMzMzgyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2ZlYjJmNTg3ZjdhNDYwMjg3NTE2YmVkZTVjMzM4MmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDkxOTkyZjU2NGM0OTAzYmZjN2ZlNDE1ZWZhMWEyMC5zZXRDb250ZW50KGh0bWxfM2ZlYjJmNTg3ZjdhNDYwMjg3NTE2YmVkZTVjMzM4MmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjY5MjA1YTk1MWFmNDE2MjliNDhkZjQ3ZWY1NGFjNDYuYmluZFBvcHVwKHBvcHVwXzlkOTE5OTJmNTY0YzQ5MDNiZmM3ZmU0MTVlZmExYTIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiYTg2NTBmZDNhMjRlMjU5Yzc0YjViMTQwMTY4ZmExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUzMjcyLC03My45ODY2NDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUwNTM3YzEzNTJlNGFhZDkyZmYzZDVmMTkxNGEyODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGM3NGNjNjM0NWRkNDFkNWFkMWM4OGM5NTM2ZjdmODIgPSAkKCc8ZGl2IGlkPSJodG1sX2RjNzRjYzYzNDVkZDQxZDVhZDFjODhjOTUzNmY3ZjgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUwNTM3YzEzNTJlNGFhZDkyZmYzZDVmMTkxNGEyODYuc2V0Q29udGVudChodG1sX2RjNzRjYzYzNDVkZDQxZDVhZDFjODhjOTUzNmY3ZjgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiYTg2NTBmZDNhMjRlMjU5Yzc0YjViMTQwMTY4ZmExLmJpbmRQb3B1cChwb3B1cF9iNTA1MzdjMTM1MmU0YWFkOTJmZjNkNWYxOTE0YTI4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMTM5M2VlYjQ2OTY0NTI4OTZmZGQzNGM5NDEzNTc3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NjE5OCwtNzMuOTg2NTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4NWQ1ODY3YWUzNTRhMTc4YzA0NTMzMjYwZGVlZWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5ODE0NjhmMGZmYTRmOWFiYzJmZjhhYTFmNzNmMDQzID0gJCgnPGRpdiBpZD0iaHRtbF9lOTgxNDY4ZjBmZmE0ZjlhYmMyZmY4YWExZjczZjA0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4NWQ1ODY3YWUzNTRhMTc4YzA0NTMzMjYwZGVlZWFlLnNldENvbnRlbnQoaHRtbF9lOTgxNDY4ZjBmZmE0ZjlhYmMyZmY4YWExZjczZjA0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMTM5M2VlYjQ2OTY0NTI4OTZmZGQzNGM5NDEzNTc3MS5iaW5kUG9wdXAocG9wdXBfNDg1ZDU4NjdhZTM1NGExNzhjMDQ1MzMyNjBkZWVlYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2E3MGQ2YTliYmVhNGFmZjhhNGQwNWY0YmY2NWMyMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTgzNTMxMjI5MDUwOCwtNzMuOTg4NTIxMDQ0MDQ3MTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOTRjNWMxYTFiY2U0NTIyOTQ0YzkwZThjODM3OThiZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODgwMSwtNzMuOTg4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTNkMjczOTU1OTM0ZGUyOTIxZTY2NzBjYzViZmYyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OTRmMDM5YTU3MTk0NTNmYWRiMGIyMDlmNDIzMjI1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfODk0ZjAzOWE1NzE5NDUzZmFkYjBiMjA5ZjQyMzIyNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1M2QyNzM5NTU5MzRkZTI5MjFlNjY3MGNjNWJmZjI1LnNldENvbnRlbnQoaHRtbF84OTRmMDM5YTU3MTk0NTNmYWRiMGIyMDlmNDIzMjI1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOTRjNWMxYTFiY2U0NTIyOTQ0YzkwZThjODM3OThiZS5iaW5kUG9wdXAocG9wdXBfZDUzZDI3Mzk1NTkzNGRlMjkyMWU2NjcwY2M1YmZmMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE4ZWQxNmY0MjEyNDZhNTliNmVhZmViNjk0NDUxM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjE0MTM4NzczNzM3NCwtNzMuOTg2NzQxMjkxMjI0ODVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNWE2MTVjOWI4NjMyNDUxNGE2ZjQzMGI1MjExNWU2Y2IpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQ4MTU0N2YxYjczNDE1M2IyYzA3ZjA1MjVhZjM4NmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRkZjJhMGI4YmJiNDVhMDljZDcwMjY4ZGM2NTYzMmIgPSAkKCc8ZGl2IGlkPSJodG1sXzhkZGYyYTBiOGJiYjQ1YTA5Y2Q3MDI2OGRjNjU2MzJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQ4MTU0N2YxYjczNDE1M2IyYzA3ZjA1MjVhZjM4NmUuc2V0Q29udGVudChodG1sXzhkZGYyYTBiOGJiYjQ1YTA5Y2Q3MDI2OGRjNjU2MzJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhOGVkMTZmNDIxMjQ2YTU5YjZlYWZlYjY5NDQ1MTNlLmJpbmRQb3B1cChwb3B1cF80NDgxNTQ3ZjFiNzM0MTUzYjJjMDdmMDUyNWFmMzg2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWNmMzk4MjkzMzQ0MDc3OWNmNTZiNzkyZDVlZTQzOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjA3MzA4NzA1ODU2LC03My45ODk5NDc0MTcxMzgzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF81YTYxNWM5Yjg2MzI0NTE0YTZmNDMwYjUyMTE1ZTZjYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTFmNGU4NDM4NzY0M2YxOTAyYWRkMmVjZjc4MjNjZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDBhNTU4MTliZTk0OTkwODY3ZmZiY2E2YjA0MDMyZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQwYTU1ODE5YmU5NDk5MDg2N2ZmYmNhNmIwNDAzMmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTFmNGU4NDM4NzY0M2YxOTAyYWRkMmVjZjc4MjNjZS5zZXRDb250ZW50KGh0bWxfYjQwYTU1ODE5YmU5NDk5MDg2N2ZmYmNhNmIwNDAzMmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGVjZjM5ODI5MzM0NDA3NzljZjU2Yjc5MmQ1ZWU0MzkuYmluZFBvcHVwKHBvcHVwXzM5MWY0ZTg0Mzg3NjQzZjE5MDJhZGQyZWNmNzgyM2NlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxZTIxNWFhNTcxMjQzYzJiNDE4MmY1OWYyMDY3ZGVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU5OTc3NSwtNzMuOTgyOTc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzVhNjE1YzliODYzMjQ1MTRhNmY0MzBiNTIxMTVlNmNiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwMjk3ZTU5Y2FiODRmMjhiNjNjYzhhYTNkNzMxMGI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4MjJjZjI2MmQ1ZTRkZGU4NDg5MjA4ZTQwYTBhMjVmID0gJCgnPGRpdiBpZD0iaHRtbF8yODIyY2YyNjJkNWU0ZGRlODQ4OTIwOGU0MGEwYTI1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FuZHdpY2ggUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwMjk3ZTU5Y2FiODRmMjhiNjNjYzhhYTNkNzMxMGI4LnNldENvbnRlbnQoaHRtbF8yODIyY2YyNjJkNWU0ZGRlODQ4OTIwOGU0MGEwYTI1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MWUyMTVhYTU3MTI0M2MyYjQxODJmNTlmMjA2N2RlYS5iaW5kUG9wdXAocG9wdXBfNzAyOTdlNTljYWI4NGYyOGI2M2NjOGFhM2Q3MzEwYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== 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 0x7f28d4af9cf8>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"venues_map = folium.Map(location=[latitude, longitude], zoom_start=13) # generate map centred around the Conrad Hotel\n",
"\n",
"# add a red circle marker to represent the Conrad Hotel\n",
"folium.features.CircleMarker(\n",
" [latitude, longitude],\n",
" radius=10,\n",
" color='red',\n",
" popup='address',\n",
" fill = True,\n",
" fill_color = 'red',\n",
" fill_opacity = 0.6\n",
").add_to(venues_map)\n",
"\n",
"# add the Italian restaurants as blue circle markers\n",
"for lat, lng, label in zip(dataframe_filtered.lat, dataframe_filtered.lng, dataframe_filtered.categories):\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" color='blue',\n",
" popup=label,\n",
" fill = True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" ).add_to(venues_map)\n",
"\n",
"# display map\n",
"venues_map"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment