Skip to content

Instantly share code, notes, and snippets.

@prhbrt
Last active August 4, 2017 09:35
Show Gist options
  • Save prhbrt/88963844d1be0a17cb22d522cc4a3a46 to your computer and use it in GitHub Desktop.
Save prhbrt/88963844d1be0a17cb22d522cc4a3a46 to your computer and use it in GitHub Desktop.
Paalplekken of logerenbijdeboswachter, places in Holland where you're allowed to camp free(ish)ly
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"import folium\n",
"import pandas\n",
"import requests\n",
"from ipy_table import make_table\n",
"import json"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def find_and_chop(text, f):\n",
" \"\"\"Essentially str.split, find f in text and return what is in after and before it.\n",
" if f is not found, return None, None\"\"\"\n",
" index = text.find(f)\n",
" if index < 0:\n",
" return None, None\n",
" return text[index+len(f):], text[:index]\n",
" \n",
"html = requests.get('https://www.logerenbijdeboswachter.nl/paalkamperen').text\n",
"paalplekken = []\n",
"while True:\n",
" html, _ = find_and_chop(html, '<article class=\"visualLink\">')\n",
" if not html: break\n",
" html, _ = find_and_chop(html, '<a class=\"title\">')\n",
" if not html: break\n",
" html, title = find_and_chop(html, '</a>')\n",
" html, _ = find_and_chop(html, '<a href=\"https://www.google.nl/maps/place/')\n",
" html, link_end = find_and_chop(html, '\" target=\"_blank\">GPS locatie</a>')\n",
" location = tuple(map(float, link_end.split('!3d')[1].split('!4d')))\n",
" paalplekken.append({'location': location, 'title': title})"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\" style=\"border:1px solid black;border-collapse:collapse;\"><tr><td>Title</td><td>Latitude</td><td>Longitude</td></tr><tr><td>Campanula</td><td>52.299331</td><td>5.4937778</td></tr><tr><td>Chaamse&nbspBossen&nbsp1</td><td>51.517251</td><td>4.897231</td></tr><tr><td>Chaamse&nbspBossen&nbsp2</td><td>51.500343</td><td>4.924649</td></tr><tr><td>Chaamse&nbspBossen&nbsp3</td><td>51.481923</td><td>4.91356</td></tr><tr><td>Strijbeekse&nbspHeide</td><td>51.49778</td><td>4.818909</td></tr><tr><td>Het&nbspSchot</td><td>52.661743</td><td>6.263569</td></tr><tr><td>Kaapweg</td><td>52.211007</td><td>5.219079</td></tr><tr><td>Austerlitz</td><td>52.106527</td><td>5.300451</td></tr><tr><td>Gooren&nbspen&nbspKrochten</td><td>51.4575614</td><td>4.6892055</td></tr><tr><td>Leidschendamerhout</td><td>52.09756</td><td>4.425901</td></tr><tr><td>Weipoortse&nbspvliet</td><td>52.130173</td><td>4.530134</td></tr><tr><td>Dokse&nbspLaagten</td><td>51.892169</td><td>4.776023</td></tr><tr><td>Avelingen</td><td>51.831983</td><td>4.921445</td></tr><tr><td>Oeverlanden</td><td>51.707123</td><td>4.539019</td></tr><tr><td>Canisvliet</td><td>51.21797</td><td>3.812917</td></tr><tr><td>Fort&nbspSint&nbspLivinus</td><td>51.247573</td><td>3.937469</td></tr><tr><td>De&nbspzoete&nbspvaart</td><td>51.266807</td><td>4.061247</td></tr></table>"
],
"text/plain": [
"<ipy_table.IpyTable at 0x7ff2003da208>"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"make_table([['Title', 'Latitude', 'Longitude']] + [\n",
" [paalplek['title']] + list(paalplek['location'])\n",
" for paalplek in paalplekken\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9sZWFmbGV0QDEuMC4xL2Rpc3QvbGVhZmxldC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4xMS4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS4wLjEvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IEwubGF0TG5nKC05MCwgLTE4MCk7CiAgICAgICAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gTC5sYXRMbmcoOTAsIDE4MCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzUyLjAsNS4wXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzAwODZmOTZhZDJhMzQyZDc5N2YyM2Y1MGY2MThiOTUyID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQvdG9uZXIve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNXb3JsZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbm9XcmFwOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T0RiTDwvYT4uJywKICAgICAgICAgICAgICAgICAgICBkZXRlY3RSZXRpbmE6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwoKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODRhN2ZjNDg3Yjk0MWRiOTU3YWYyZTM1Yzc4ZDJhNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjI5OTMzMSw1LjQ5Mzc3NzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYjcxNjc2NGU2MTk0MGVhODg4OWQyNjRiNGYyMjBlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOTgzYzQ2YTMzOTk0OGY2OGQ1ZGVlNjUzY2RmMGViYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDk4M2M0NmEzMzk5NDhmNjhkNWRlZTY1M2NkZjBlYmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbXBhbnVsYTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2I3MTY3NjRlNjE5NDBlYTg4ODlkMjY0YjRmMjIwZWYuc2V0Q29udGVudChodG1sXzA5ODNjNDZhMzM5OTQ4ZjY4ZDVkZWU2NTNjZGYwZWJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjg0YTdmYzQ4N2I5NDFkYjk1N2FmMmUzNWM3OGQyYTcuYmluZFBvcHVwKHBvcHVwX2NiNzE2NzY0ZTYxOTQwZWE4ODg5ZDI2NGI0ZjIyMGVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgyOGYzZGY4YzVkYjRkMmU4YzExNjA1ZTA3Zjk1ODk0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTE3MjUxLDQuODk3MjMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzJjMDhlNmRjMGQ2NGUwYWFhNmE4Y2E3NjZiNDFjYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTdiN2IyZmI3Yzc1NDdkY2EwMzIyMmQ2Y2VjOWZhN2UgPSAkKCc8ZGl2IGlkPSJodG1sX2U3YjdiMmZiN2M3NTQ3ZGNhMDMyMjJkNmNlYzlmYTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFhbXNlIEJvc3NlbiAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMmMwOGU2ZGMwZDY0ZTBhYWE2YThjYTc2NmI0MWNjMS5zZXRDb250ZW50KGh0bWxfZTdiN2IyZmI3Yzc1NDdkY2EwMzIyMmQ2Y2VjOWZhN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MjhmM2RmOGM1ZGI0ZDJlOGMxMTYwNWUwN2Y5NTg5NC5iaW5kUG9wdXAocG9wdXBfMzJjMDhlNmRjMGQ2NGUwYWFhNmE4Y2E3NjZiNDFjYzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTk5MzA4MTI2ZjE5NGZkNWE5OTBmODJjZDkxYzE0MzIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MDAzNDMsNC45MjQ2NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Mzg3YjMxODdlNWE0Njc0YjJiOTc4NzJmOGMyYzhjOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMGExMTU4NjZjYzM0Y2QwYjc3MmUzN2UwYzc4MDZlNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDBhMTE1ODY2Y2MzNGNkMGI3NzJlMzdlMGM3ODA2ZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoYWFtc2UgQm9zc2VuIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYzODdiMzE4N2U1YTQ2NzRiMmI5Nzg3MmY4YzJjOGM4LnNldENvbnRlbnQoaHRtbF9kMGExMTU4NjZjYzM0Y2QwYjc3MmUzN2UwYzc4MDZlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU5OTMwODEyNmYxOTRmZDVhOTkwZjgyY2Q5MWMxNDMyLmJpbmRQb3B1cChwb3B1cF82Mzg3YjMxODdlNWE0Njc0YjJiOTc4NzJmOGMyYzhjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85NmYzNDFjMzQxMGY0OWY2YjdhM2MyNzBjYjE5ZmU5NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ4MTkyMyw0LjkxMzU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjFiMjkzZTEyOTA0NGI0OTk1YTA1ZjlhYmExZjkwZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjRmYTRjNTdjODkyNDI4N2IxNTIyZDE4ZmEyNjZmZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2I0ZmE0YzU3Yzg5MjQyODdiMTUyMmQxOGZhMjY2ZmU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFhbXNlIEJvc3NlbiAzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMWIyOTNlMTI5MDQ0YjQ5OTVhMDVmOWFiYTFmOTBmNi5zZXRDb250ZW50KGh0bWxfYjRmYTRjNTdjODkyNDI4N2IxNTIyZDE4ZmEyNjZmZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NmYzNDFjMzQxMGY0OWY2YjdhM2MyNzBjYjE5ZmU5NS5iaW5kUG9wdXAocG9wdXBfMjFiMjkzZTEyOTA0NGI0OTk1YTA1ZjlhYmExZjkwZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTM2MDU5NTM4YTYxNGE3ODhhNmIxMTU3ODc0ZGExOTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40OTc3OCw0LjgxODkwOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1MzZkMThhNGRlOTRmNGE4OGNmYTI4OGZmZTAzYWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiMDUzY2IyNzIzODQ3NzliYTg1MGJhODUyMDZjNjgyID0gJCgnPGRpdiBpZD0iaHRtbF9hYjA1M2NiMjcyMzg0Nzc5YmE4NTBiYTg1MjA2YzY4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RyaWpiZWVrc2UgSGVpZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1MzZkMThhNGRlOTRmNGE4OGNmYTI4OGZmZTAzYWNmLnNldENvbnRlbnQoaHRtbF9hYjA1M2NiMjcyMzg0Nzc5YmE4NTBiYTg1MjA2YzY4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzNjA1OTUzOGE2MTRhNzg4YTZiMTE1Nzg3NGRhMTk5LmJpbmRQb3B1cChwb3B1cF9hNTM2ZDE4YTRkZTk0ZjRhODhjZmEyODhmZmUwM2FjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84NzlhMDgzMGZhZWU0YzhmYjJjYmJjZTI3OWFmZGJjNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjY2MTc0Myw2LjI2MzU2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1OGE1ZmE3NjhhMDQ3ZDhhZmUzNWMzNjQ0NTlhMTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMTg3YzVkZTZmZjRmYjM5OWI2ODQ1ZWYzOGEwNjM2ID0gJCgnPGRpdiBpZD0iaHRtbF9mYzE4N2M1ZGU2ZmY0ZmIzOTliNjg0NWVmMzhhMDYzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGV0IFNjaG90PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNThhNWZhNzY4YTA0N2Q4YWZlMzVjMzY0NDU5YTE4Mi5zZXRDb250ZW50KGh0bWxfZmMxODdjNWRlNmZmNGZiMzk5YjY4NDVlZjM4YTA2MzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NzlhMDgzMGZhZWU0YzhmYjJjYmJjZTI3OWFmZGJjNC5iaW5kUG9wdXAocG9wdXBfMjU4YTVmYTc2OGEwNDdkOGFmZTM1YzM2NDQ1OWExODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTM0YTAxNGRhYmExNGIxYmFkOGJmZTRhYmViMDhkZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4yMTEwMDcsNS4yMTkwNzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNThhMDUwNjg3NTg0YjE1OTRjMmRlZTBlNWI2YjU1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODliYmIzODRjNDM0NGNjODA2NmFkMGQ1NDIxNDEwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg5YmJiMzg0YzQzNDRjYzgwNjZhZDBkNTQyMTQxMDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkthYXB3ZWc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1OGEwNTA2ODc1ODRiMTU5NGMyZGVlMGU1YjZiNTU0LnNldENvbnRlbnQoaHRtbF81ODliYmIzODRjNDM0NGNjODA2NmFkMGQ1NDIxNDEwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEzNGEwMTRkYWJhMTRiMWJhZDhiZmU0YWJlYjA4ZGViLmJpbmRQb3B1cChwb3B1cF9jNThhMDUwNjg3NTg0YjE1OTRjMmRlZTBlNWI2YjU1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNjBiNDY4YjUxZmU0NjgzYTlhNjQwMGNmM2M1ZTRhMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjEwNjUyNyw1LjMwMDQ1MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlZWM2NzAwYjk1MDRjZDk4ODcyZWY5YWI5NjU0MTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmOTZiNGI2YjMwMTQ0NDM4NzI4OTAxMmZmNmIwMzM5ID0gJCgnPGRpdiBpZD0iaHRtbF9jZjk2YjRiNmIzMDE0NDQzODcyODkwMTJmZjZiMDMzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVzdGVybGl0ejwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmVlYzY3MDBiOTUwNGNkOTg4NzJlZjlhYjk2NTQxNzQuc2V0Q29udGVudChodG1sX2NmOTZiNGI2YjMwMTQ0NDM4NzI4OTAxMmZmNmIwMzM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTYwYjQ2OGI1MWZlNDY4M2E5YTY0MDBjZjNjNWU0YTMuYmluZFBvcHVwKHBvcHVwXzJlZWM2NzAwYjk1MDRjZDk4ODcyZWY5YWI5NjU0MTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzlkYWIyYTEzZTk1ZTQ0OGY5YjQyZTc3MGI2ZjhlNzY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDU3NTYxNCw0LjY4OTIwNTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MmQ1NThkMWNjOGQ0OTFiYWI3Zjk4Nzc4NTg4OWE0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzQ0NzQ1OGZjZWY0MWZiYWVmZWZhODZkMDc0ZjU2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWM0NDc0NThmY2VmNDFmYmFlZmVmYTg2ZDA3NGY1NmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdvb3JlbiBlbiBLcm9jaHRlbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzJkNTU4ZDFjYzhkNDkxYmFiN2Y5ODc3ODU4ODlhNDEuc2V0Q29udGVudChodG1sX2FjNDQ3NDU4ZmNlZjQxZmJhZWZlZmE4NmQwNzRmNTZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWRhYjJhMTNlOTVlNDQ4ZjliNDJlNzcwYjZmOGU3NjkuYmluZFBvcHVwKHBvcHVwXzcyZDU1OGQxY2M4ZDQ5MWJhYjdmOTg3Nzg1ODg5YTQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2M0YzFlZTJiZGQ2MjRiNWZhYzgxMWM0YzBmNThlM2I1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMDk3NTYsNC40MjU5MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNWM1ODE0ZjM5YTY0ZmEzYTQ3NTYyZDhkNzAwNzBlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDBjYjViZGExZWE0OGNmOGRmMTNiYmMyYTIyMDMyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQwY2I1YmRhMWVhNDhjZjhkZjEzYmJjMmEyMjAzMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlaWRzY2hlbmRhbWVyaG91dDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTVjNTgxNGYzOWE2NGZhM2E0NzU2MmQ4ZDcwMDcwZTIuc2V0Q29udGVudChodG1sX2M0MGNiNWJkYTFlYTQ4Y2Y4ZGYxM2JiYzJhMjIwMzJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzRjMWVlMmJkZDYyNGI1ZmFjODExYzRjMGY1OGUzYjUuYmluZFBvcHVwKHBvcHVwXzE1YzU4MTRmMzlhNjRmYTNhNDc1NjJkOGQ3MDA3MGUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI2NDVlZTViNGY1MzRlZTZhYTcxYmZiMDZhMzdkOWZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMTMwMTczLDQuNTMwMTM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODZlMDUyOGI0NDI4NGQ2ZjlmMTVhNGQyOGQ3YjI2MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRiMGIyZGU4NTk5NDg1MDkwYjYxY2NkNjFmMDVhYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzhkYjBiMmRlODU5OTQ4NTA5MGI2MWNjZDYxZjA1YWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWlwb29ydHNlIHZsaWV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmUwNTI4YjQ0Mjg0ZDZmOWYxNWE0ZDI4ZDdiMjYxNi5zZXRDb250ZW50KGh0bWxfOGRiMGIyZGU4NTk5NDg1MDkwYjYxY2NkNjFmMDVhYWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNjQ1ZWU1YjRmNTM0ZWU2YWE3MWJmYjA2YTM3ZDlmZi5iaW5kUG9wdXAocG9wdXBfODZlMDUyOGI0NDI4NGQ2ZjlmMTVhNGQyOGQ3YjI2MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjA3ZTI5YTk4OTczNDNlZmIwOGYyODcyNjE4MGMwMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS44OTIxNjksNC43NzYwMjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzYwY2M2OTlhZjE0OGY5YTlmZGZmY2RmZTEyZWJlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ODEwNzY0ZjkxZTU0YjgyOGJhZjA2M2Y4NmZhMDhiZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzgxMDc2NGY5MWU1NGI4MjhiYWYwNjNmODZmYTA4YmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRva3NlIExhYWd0ZW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3NjBjYzY5OWFmMTQ4ZjlhOWZkZmZjZGZlMTJlYmU0LnNldENvbnRlbnQoaHRtbF83ODEwNzY0ZjkxZTU0YjgyOGJhZjA2M2Y4NmZhMDhiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YwN2UyOWE5ODk3MzQzZWZiMDhmMjg3MjYxODBjMDM0LmJpbmRQb3B1cChwb3B1cF84NzYwY2M2OTlhZjE0OGY5YTlmZGZmY2RmZTEyZWJlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYzY2NmE0MzQ2OTI0YzA2YmM1NWQzNzc5Y2I1N2E3MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjgzMTk4Myw0LjkyMTQ0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMTRlNjM1MzMxZjQ4NGU5MzJkMzFmZGEzMDEwNjgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkNTg3N2Q2Y2VmNTRjMDQ4M2E1Mjk1NWY5Yzk2NjQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8yZDU4NzdkNmNlZjU0YzA0ODNhNTI5NTVmOWM5NjY0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXZlbGluZ2VuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzE0ZTYzNTMzMWY0ODRlOTMyZDMxZmRhMzAxMDY4MC5zZXRDb250ZW50KGh0bWxfMmQ1ODc3ZDZjZWY1NGMwNDgzYTUyOTU1ZjljOTY2NDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYzY2NmE0MzQ2OTI0YzA2YmM1NWQzNzc5Y2I1N2E3Mi5iaW5kUG9wdXAocG9wdXBfY2MxNGU2MzUzMzFmNDg0ZTkzMmQzMWZkYTMwMTA2ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjQwMTkyNTA1OGU0NDc5Y2JiNjQ2ODk0MDAxYmNiMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS43MDcxMjMsNC41MzkwMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xOGY5OWY1Mjc3OWI0MjgzYThiZWVkYTg1ZmJiZWVlMyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZmJjOTQ4MDJhOTg0YzMyODljMWMzMjM2NGFkMjY3NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTQ5ZGMzYjA3YmY0ZjRlYjkzMDNjODk4MmJmZDQyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2E0OWRjM2IwN2JmNGY0ZWI5MzAzYzg5ODJiZmQ0MmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9ldmVybGFuZGVuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmJjOTQ4MDJhOTg0YzMyODljMWMzMjM2NGFkMjY3Ni5zZXRDb250ZW50KGh0bWxfY2E0OWRjM2IwN2JmNGY0ZWI5MzAzYzg5ODJiZmQ0MmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82NDAxOTI1MDU4ZTQ0NzljYmI2NDY4OTQwMDFiY2IxYy5iaW5kUG9wdXAocG9wdXBfMWZiYzk0ODAyYTk4NGMzMjg5YzFjMzIzNjRhZDI2NzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2ViMTZjNzY5ZjIwNGIyOGIwMWY0ZGM1Y2ZiNjE0NGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4yMTc5NywzLjgxMjkxN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzE4Zjk5ZjUyNzc5YjQyODNhOGJlZWRhODVmYmJlZWUzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwNzIyMGZjNzc5ZjRhNTNiYjk5NzVkYjNjZGMxYjhmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlYTU4YjkyYWM4YzRlYzE5YmZlNzNiMWEyZDI1OTMwID0gJCgnPGRpdiBpZD0iaHRtbF9kZWE1OGI5MmFjOGM0ZWMxOWJmZTczYjFhMmQyNTkzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuaXN2bGlldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA3MjIwZmM3NzlmNGE1M2JiOTk3NWRiM2NkYzFiOGYuc2V0Q29udGVudChodG1sX2RlYTU4YjkyYWM4YzRlYzE5YmZlNzNiMWEyZDI1OTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2ViMTZjNzY5ZjIwNGIyOGIwMWY0ZGM1Y2ZiNjE0NGYuYmluZFBvcHVwKHBvcHVwX2IwNzIyMGZjNzc5ZjRhNTNiYjk5NzVkYjNjZGMxYjhmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IxOTBjOWEwOWMwZTRmNDI5NDUwMDc2NGE1MWZiZDZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMjQ3NTczLDMuOTM3NDY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU2ODRmMzI5YzBjNDg2ZTk4YzA3YmI4YjVmMjExNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNkZWZlZWY0ZjZlNDRiNmJhZjNhNTFlNjE3MThkYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzhjZGVmZWVmNGY2ZTQ0YjZiYWYzYTUxZTYxNzE4ZGJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3J0IFNpbnQgTGl2aW51czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWU2ODRmMzI5YzBjNDg2ZTk4YzA3YmI4YjVmMjExNTQuc2V0Q29udGVudChodG1sXzhjZGVmZWVmNGY2ZTQ0YjZiYWYzYTUxZTYxNzE4ZGJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjE5MGM5YTA5YzBlNGY0Mjk0NTAwNzY0YTUxZmJkNmEuYmluZFBvcHVwKHBvcHVwXzFlNjg0ZjMyOWMwYzQ4NmU5OGMwN2JiOGI1ZjIxMTU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RkNGY0NzBlYzRmNDRjNjY4MDRiNzVjNTI2ODM1MGU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMjY2ODA3LDQuMDYxMjQ3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMThmOTlmNTI3NzliNDI4M2E4YmVlZGE4NWZiYmVlZTMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVmYzUxNGM4ZTM5NDZlNDgzMmE2Y2I5YTY4OWUxNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTM4NzRmYTRlMzRiNGQ5NjlmODliM2JlMTE5YjVmMzcgPSAkKCc8ZGl2IGlkPSJodG1sX2EzODc0ZmE0ZTM0YjRkOTY5Zjg5YjNiZTExOWI1ZjM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZSB6b2V0ZSB2YWFydDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmVmYzUxNGM4ZTM5NDZlNDgzMmE2Y2I5YTY4OWUxNGIuc2V0Q29udGVudChodG1sX2EzODc0ZmE0ZTM0YjRkOTY5Zjg5YjNiZTExOWI1ZjM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGQ0ZjQ3MGVjNGY0NGM2NjgwNGI3NWM1MjY4MzUwZTYuYmluZFBvcHVwKHBvcHVwX2ZlZmM1MTRjOGUzOTQ2ZTQ4MzJhNmNiOWE2ODllMTRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7ff200359080>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map([52., 5.], tiles='stamentoner', zoom_start=7)\n",
"for paalplek in paalplekken:\n",
" folium.Marker(paalplek['location'], popup=paalplek['title']).add_to(m)\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\"type\": \"FeatureCollection\", \"features\": [{\"geometry\": {\"coordinates\": [52.299331, 5.4937778], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Campanula\"}}, {\"geometry\": {\"coordinates\": [51.517251, 4.897231], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Chaamse Bossen 1\"}}, {\"geometry\": {\"coordinates\": [51.500343, 4.924649], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Chaamse Bossen 2\"}}, {\"geometry\": {\"coordinates\": [51.481923, 4.91356], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Chaamse Bossen 3\"}}, {\"geometry\": {\"coordinates\": [51.49778, 4.818909], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Strijbeekse Heide\"}}, {\"geometry\": {\"coordinates\": [52.661743, 6.263569], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Het Schot\"}}, {\"geometry\": {\"coordinates\": [52.211007, 5.219079], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Kaapweg\"}}, {\"geometry\": {\"coordinates\": [52.106527, 5.300451], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Austerlitz\"}}, {\"geometry\": {\"coordinates\": [51.4575614, 4.6892055], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Gooren en Krochten\"}}, {\"geometry\": {\"coordinates\": [52.09756, 4.425901], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Leidschendamerhout\"}}, {\"geometry\": {\"coordinates\": [52.130173, 4.530134], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Weipoortse vliet\"}}, {\"geometry\": {\"coordinates\": [51.892169, 4.776023], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Dokse Laagten\"}}, {\"geometry\": {\"coordinates\": [51.831983, 4.921445], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Avelingen\"}}, {\"geometry\": {\"coordinates\": [51.707123, 4.539019], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Oeverlanden\"}}, {\"geometry\": {\"coordinates\": [51.21797, 3.812917], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Canisvliet\"}}, {\"geometry\": {\"coordinates\": [51.247573, 3.937469], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"Fort Sint Livinus\"}}, {\"geometry\": {\"coordinates\": [51.266807, 4.061247], \"type\": \"Point\"}, \"type\": \"Feature\", \"properties\": {\"name\": \"De zoete vaart\"}}]}\n"
]
}
],
"source": [
"print(json.dumps({\n",
" \"type\": \"FeatureCollection\",\n",
" \"features\": [\n",
" {\n",
" \"type\": \"Feature\",\n",
" \"properties\": {\"name\": paalplek['title']},\n",
" \"geometry\": {\n",
" \"type\": \"Point\",\n",
" \"coordinates\": list(paalplek['location'])\n",
" }\n",
" }\n",
" for paalplek in paalplekken\n",
" ]\n",
"}))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment