Skip to content

Instantly share code, notes, and snippets.

@QuantumDamage
Created January 21, 2019 16:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save QuantumDamage/9156549e0d638b2299c4f1d87008680f to your computer and use it in GitHub Desktop.
Save QuantumDamage/9156549e0d638b2299c4f1d87008680f to your computer and use it in GitHub Desktop.
dumanie nad transformacją lat,lon i x,y,z
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%matplotlib inline\nimport requests\nimport pandas as pd\nimport numpy as np\nimport json",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import time",
"execution_count": 4,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "r = requests.get('http://api.gios.gov.pl/pjp-api/rest/station/findAll')\nallStations = pd.io.json.json_normalize(r.json())",
"execution_count": 5,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "pollutants = [\"PM2.5\", \"PM10\", \"C6H6\", \"NO2\", \"SO2\", \"O3\", \"CO\"]",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def get_sensors(Id):\n stationId = Id\n r = requests.get('http://api.gios.gov.pl/pjp-api/rest/station/sensors/' + str(stationId))\n \n sensors = pd.io.json.json_normalize(r.json())\n return sensors[[\"param.paramCode\",\"id\"]].set_index(\"param.paramCode\").to_dict(orient = \"index\")",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "allStations[\"gegrLat\"] = allStations[\"gegrLat\"].astype(\"float\")\nallStations[\"gegrLon\"] = allStations[\"gegrLon\"].astype(\"float\")",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%%time\nallStations[\"sensors\"] = allStations[\"id\"].apply(get_sensors)",
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": "CPU times: user 2.63 s, sys: 78.6 ms, total: 2.71 s\nWall time: 30.6 s\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "allStations2 = pd.concat([allStations, allStations['sensors'].str.join('|').str.get_dummies()], axis=1, sort=False)\nallStations2[pollutants].sum()",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "PM2.5 63\nPM10 136\nC6H6 53\nNO2 143\nSO2 125\nO3 101\nCO 76\ndtype: int64"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "#points = allStations2[allStations2[\"PM2.5\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\n#points = allStations2[allStations2[\"PM10\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\n#points = allStations2[allStations2[\"C6H6\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\n#points = allStations2[allStations2[\"NO2\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\n#points = allStations2[allStations2[\"SO2\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\n#points = allStations2[allStations2[\"O3\"] == 1][[\"gegrLat\",\"gegrLon\"]].values\npoints = allStations2[allStations2[\"CO\"] == 1][[\"gegrLat\",\"gegrLon\"]].values",
"execution_count": 247,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lat_max = points[:,0].max()\nlat_min = points[:,0].min()\nlon_max = points[:,1].max()\nlon_min = points[:,1].min()\n\n\nlat_max, lat_min, lon_max, lon_min",
"execution_count": 248,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 248,
"data": {
"text/plain": "(54.560836, 49.293564, 23.00075, 15.008175)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "points[:3]",
"execution_count": 249,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 249,
"data": {
"text/plain": "array([[51.129378, 17.02925 ],\n [51.086225, 17.012689],\n [51.204503, 16.180513]])"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import pyproj",
"execution_count": 250,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lats = points[:,0]\nlons = points[:,1]\nalts = np.zeros(lats.shape)\n\necef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84')\nlla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84') \nx, y, z = pyproj.transform(lla, ecef, lons, lats, alts, radians=False)\nprint (x,y,z)",
"execution_count": 251,
"outputs": [
{
"output_type": "stream",
"text": "[3834981.24111618 3838893.67152115 3845707.07698888 3880125.48107186\n 3872262.52205653 3877925.16465747 3869998.10037573 3648359.23263694\n 3647154.80693829 3728533.84607212 3728920.49190347 3722897.81394391\n 3731001.58156403 3753682.85310983 3787033.20858048 3664260.24882533\n 3873170.5212753 3806545.80940342 3805405.93095525 3763724.43736442\n 3450486.08474459 3557118.43220582 3730348.13294337 3730108.54919302\n 3762225.55378914 3717803.39344389 3670131.16526164 3725235.41587773\n 3852091.10293227 3863690.32165227 3863751.31990053 3886227.04965217\n 3888876.97829728 3898843.36419296 3815087.29044785 3813269.70408825\n 3913510.60551212 3895978.13103253 3773809.17820207 3793679.14987059\n 3748093.16836347 3537353.22557138 3529381.5169706 3857314.03095435\n 3853265.89279632 3833759.93441245 3470148.53516383 3530013.89842869\n 3525480.33330244 3515128.81531242 3533764.32709501 3524447.13710031\n 3528015.66447893 3552114.27467214 3563467.01256625 3549153.25587762\n 3531427.4764622 3560685.15323363 3859961.94099799 3917387.04406171\n 3655508.32434349 3658835.79074094 3658774.32716318 3718895.48091976\n 3692207.78136076 3658265.00903596 3666154.53697835 3693261.88955179\n 3734014.87444186 3796586.58259952 3761532.84923129 3793288.05499396\n 3828769.97191697 3644002.21176281 3664433.76951843 3600604.44777872] [1174612.55152773 1174597.28851616 1115862.95622844 1132399.34134647\n 1038161.80280697 1094828.51170148 1056936.03483108 1184572.43468005\n 1184730.38948361 1322524.8811893 1316884.85003308 1312590.08220956\n 1316449.90728658 1343788.05532954 1337243.62338769 1414742.31653423\n 1276173.97189856 1538761.6518523 1537843.5237447 1529244.0774935\n 1415687.88097743 1292498.52317143 1137600.55602892 1131678.79259489\n 1225934.97154371 1227317.37018783 1105252.82106777 1138896.22524444\n 1343794.15924031 1331843.9700902 1313249.79108354 1301530.71585396\n 1315520.00218967 1346180.48603049 1322392.01946512 1322707.74853301\n 1320013.29919989 1300215.89200165 1421014.83676227 1477367.58073867\n 1429805.97769607 1321582.37953798 1243649.08987623 1398322.67347345\n 1406549.49940701 1471072.78963634 1473044.27058953 1190401.42652329\n 1190395.09649848 1175690.71415472 1186345.00320858 1184719.03278554\n 1188698.38289105 1089158.43672374 1156181.042619 1224351.44754335\n 1130160.2333425 1169521.21821657 1365175.83580079 1422722.33996583\n 1403563.99166453 1309164.76918026 1310736.29918642 1438543.66474253\n 1401915.54170287 1421687.81150889 1261454.20268044 1535022.63885726\n 1016515.82350689 1054232.67078382 1016520.370713 1110492.83082193\n 1035075.23207977 1227249.14607899 1266010.52495935 1223091.32129925] [4942589.94277523 4939575.73538475 4947830.70833963 4917313.16401395\n 4944056.67543508 4927478.38813731 4941866.06975731 5078687.07319759\n 5079509.69402966 4986184.64047599 4987380.06131803 4992970.73089642\n 4985947.92596846 4961734.76607408 4938262.67411145 5008321.46406459\n 4887694.55861997 4864521.82645145 4865695.94432173 4900466.95150336\n 5156684.26313614 5116692.67467985 5029958.92868002 5031462.05772431\n 4985564.95746307 5018221.19068099 5080866.41645833 5033430.25122983\n 4886239.37594206 4880389.08929584 4885343.74971212 4870728.98839341\n 4864891.54543614 4848609.20335363 4920755.11173066 4922070.06290721\n 4844016.13864845 4863334.44283947 4925062.22040401 4893326.09833642\n 4942011.94659277 5122920.09683039 5147702.95909205 4866910.36853432\n 4867740.78522753 4864093.82062319 5127538.2816625 5159762.71451956\n 5162842.1099513 5173189.60334699 5158140.4567091 5164839.2907402\n 5161509.95704815 5166906.79473928 5144628.67477505 5138787.35562949\n 5172242.62457141 5143546.66909151 4874167.28304756 4811914.55221999\n 5017789.36759296 5040674.56052299 5040313.19364276 4961365.37843122\n 4991487.9411873 5010720.68347238 5047472.02213916 4951657.15690398\n 5052958.01145233 4998675.54643944 5032642.84324139 4989053.26927921\n 4978227.40608754 5071723.87732819 5047580.08909741 5103410.42734767]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "converted = pd.DataFrame({\"x\":x,\"y\":y,\"z\":z})",
"execution_count": 252,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "converted.shape",
"execution_count": 253,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 253,
"data": {
"text/plain": "(76, 3)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from scipy.spatial import voronoi_plot_2d\nfrom scipy.spatial import Voronoi\n\nvor = Voronoi(converted)",
"execution_count": 254,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "vertices_xyz = pd.DataFrame(vor.vertices, columns = [\"x\", \"y\", \"z\"])",
"execution_count": 255,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "#import matplotlib.pyplot as plt\n#voronoi_plot_2d(vor)\n#plt.show()\n",
"execution_count": 256,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lons_ver, lats_ver, alts_ver = pyproj.transform(ecef,lla, vertices_xyz[\"x\"].values,\n vertices_xyz[\"y\"].values, \n vertices_xyz[\"z\"].values, radians=False)\n",
"execution_count": 257,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "vertices_xyz.head()",
"execution_count": 258,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 258,
"data": {
"text/plain": " x y z\n0 -9574.456414 -2795.087146 -46614.811354\n1 -83905.932240 -29653.491721 -147825.476361\n2 6753.273057 2557.749623 -24393.929931\n3 19187.311667 7662.561331 -6631.947835\n4 9168.679595 3798.431266 -20994.936650",
"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>x</th>\n <th>y</th>\n <th>z</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>-9574.456414</td>\n <td>-2795.087146</td>\n <td>-46614.811354</td>\n </tr>\n <tr>\n <th>1</th>\n <td>-83905.932240</td>\n <td>-29653.491721</td>\n <td>-147825.476361</td>\n </tr>\n <tr>\n <th>2</th>\n <td>6753.273057</td>\n <td>2557.749623</td>\n <td>-24393.929931</td>\n </tr>\n <tr>\n <th>3</th>\n <td>19187.311667</td>\n <td>7662.561331</td>\n <td>-6631.947835</td>\n </tr>\n <tr>\n <th>4</th>\n <td>9168.679595</td>\n <td>3798.431266</td>\n <td>-20994.936650</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "vertices = pd.DataFrame()\nvertices[\"Lat\"] = lats_ver\nvertices[\"Lon\"] = lons_ver",
"execution_count": 259,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "vertices[(vertices[\"Lat\"] < lat_max) & (vertices[\"Lat\"] > lat_min)]",
"execution_count": 260,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 260,
"data": {
"text/plain": " Lat Lon\n38 50.401710 20.565719\n56 52.105918 20.116088\n60 50.943521 21.597556\n66 50.619931 19.925491\n85 50.621107 19.902210\n136 54.299764 19.046350\n149 52.446123 16.000309\n158 50.619295 19.917425\n164 53.627330 17.969675\n165 54.395755 18.126882\n167 54.395218 18.129956\n181 51.047320 18.100943\n244 51.545597 15.778879",
"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>Lat</th>\n <th>Lon</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>38</th>\n <td>50.401710</td>\n <td>20.565719</td>\n </tr>\n <tr>\n <th>56</th>\n <td>52.105918</td>\n <td>20.116088</td>\n </tr>\n <tr>\n <th>60</th>\n <td>50.943521</td>\n <td>21.597556</td>\n </tr>\n <tr>\n <th>66</th>\n <td>50.619931</td>\n <td>19.925491</td>\n </tr>\n <tr>\n <th>85</th>\n <td>50.621107</td>\n <td>19.902210</td>\n </tr>\n <tr>\n <th>136</th>\n <td>54.299764</td>\n <td>19.046350</td>\n </tr>\n <tr>\n <th>149</th>\n <td>52.446123</td>\n <td>16.000309</td>\n </tr>\n <tr>\n <th>158</th>\n <td>50.619295</td>\n <td>19.917425</td>\n </tr>\n <tr>\n <th>164</th>\n <td>53.627330</td>\n <td>17.969675</td>\n </tr>\n <tr>\n <th>165</th>\n <td>54.395755</td>\n <td>18.126882</td>\n </tr>\n <tr>\n <th>167</th>\n <td>54.395218</td>\n <td>18.129956</td>\n </tr>\n <tr>\n <th>181</th>\n <td>51.047320</td>\n <td>18.100943</td>\n </tr>\n <tr>\n <th>244</th>\n <td>51.545597</td>\n <td>15.778879</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "proper_vertices = pd.DataFrame(vertices[(vertices[\"Lon\"] < lon_max) & \n (vertices[\"Lon\"] > lon_min) & \n (vertices[\"Lat\"] < lat_max) & \n (vertices[\"Lat\"] > lat_min)], copy = True)",
"execution_count": 261,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import geopy.distance",
"execution_count": 262,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for index, row in proper_vertices.iterrows():\n list_of_dists = []\n for point in points:\n #list_of_dists.append(np.sqrt(np.square(row[\"Lat\"] - point[0]) + np.square(row[\"Lon\"] - point[0])))\n coords_1 = (row[\"Lat\"], row[\"Lon\"])\n coords_2 = (point[0], point[1])\n #print(coords_1,coords_2)\n list_of_dists.append(geopy.distance.vincenty(coords_1, coords_2).km)\n #print(list_of_dists)\n proper_vertices.at[index, 'dist'] = min(list_of_dists)",
"execution_count": 263,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "proper_vertices.sort_values(\"dist\").tail(n=1)",
"execution_count": 264,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 264,
"data": {
"text/plain": " Lat Lon dist\n181 51.04732 18.100943 75.639616",
"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>Lat</th>\n <th>Lon</th>\n <th>dist</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>181</th>\n <td>51.04732</td>\n <td>18.100943</td>\n <td>75.639616</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import folium\nfrom folium.plugins import MarkerCluster",
"execution_count": 265,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "boulder_coords = [lat_min + (lat_max - lat_min)/2, lon_min + (lon_max - lon_min)/2]",
"execution_count": 266,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "my_map = folium.Map(location = boulder_coords)\nmy_map.fit_bounds(bounds=[(lat_min, lon_min), (lat_max, lon_max)])",
"execution_count": 267,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for point in points:\n folium.Marker(point).add_to(my_map)",
"execution_count": 268,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from geopy.geocoders import Nominatim\ngeolocator = Nominatim(user_agent=\"jakbadacdane.pl\")",
"execution_count": 269,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "for index, row in proper_vertices.sort_values(\"dist\", ascending=False).iterrows():\n location = geolocator.reverse(\"{}, {}\".format(row[\"Lat\"], row[\"Lon\"]), timeout = 30)\n #print(location.raw)\n #print(row[\"Lat\"], row[\"Lon\"])\n \n if location.raw == {'error': 'Unable to geocode'}:\n print(\"Out of space\")\n continue\n \n try:\n is_poland = location.raw[\"address\"][\"country\"] == \"RP\"\n except KeyError:\n print(location)\n break\n \n if is_poland:\n print(location)\n folium.Circle(radius=row[\"dist\"]*1000, location=[row[\"Lat\"], row[\"Lon\"]], fill = True).add_to(my_map)\n break\n else:\n print(location.raw[\"address\"][\"country\"])",
"execution_count": 270,
"outputs": [
{
"output_type": "stream",
"text": "1336O, Skałągi, gmina Wołczyn, powiat kluczborski, opolskie, 46-262, RP\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "#for index, row in proper_vertices.sort_values(\"dist\").tail(n=1).iterrows():\n# #print(row[\"dist\"]*1000)\n# folium.Circle(radius=row[\"dist\"]*1000, location=[row[\"Lat\"], row[\"Lon\"]], fill = True).add_to(my_map)",
"execution_count": 271,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "my_map",
"execution_count": 272,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 272,
"data": {
"text/plain": "<folium.folium.Map at 0x7f836c091588>",
"text/html": "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTEuOTI3MiwxOS4wMDQ0NjI1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81NjBhMTI3YmEwZmE0NzlkYjA3NTljZWJkMTg0NDMwNiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5My5maXRCb3VuZHMoCiAgICAgICAgICAgICAgICAgICAgW1s0OS4yOTM1NjQsIDE1LjAwODE3NV0sIFs1NC41NjA4MzYsIDIzLjAwMDc1XV0sCiAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yOTJhNWM4MDRmMDE0MTZlYWMyZTNhMWE1NDM0YzJlNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjEyOTM3OCwxNy4wMjkyNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTE4YjIzOTQ0NWVkNDZkMTgzMGE0ZDYwYjFjMTNjYTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4wODYyMjUsMTcuMDEyNjg5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYzgyNTkwNDM4YmU0YThjYjU0NWJkMjZhOGYyNjY5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjIwNDUwMywxNi4xODA1MTNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q3MTAxMGQ3OWFhYTQzMjk4NDMxZjYxNDgxYjRjYjI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNzY4NzI5LDE2LjI2OTY3N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjliNjE1YTVjNGU0NDYyYWE0MzJjYjBmNGUyYWM0ZmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4xNTAzOTEsMTUuMDA4MTc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YzZmYjE1NzI2Yjc0N2Q0YjFlYTgyOWZlZmRkYjkwMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjkxMzQzMywxNS43NjU2MDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E3NjAzYzAzMmJjYTQxNzM5NTk0MTBmNjFjN2Q4MDYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMTE5MDExLDE1LjI3NTUzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmM3M2ZmMjU1MmJlNDQyZWFjNTU3Y2IzM2E2ZjM1NWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1My4xMjE3NjQsMTcuOTg3OTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NzBjZjVmMzUxZDA0MjZiYTRjZmQ1N2NmMzRhYzZkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjEzNDA4MywxNy45OTU3MDhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRjNDAxNjg0ZTQ1ZjRiNzdiNjI3NTJlM2FkMjQ1NTg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNzU4MDUsMTkuNTI5Nzg2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjExYThkZWQ1Mzg0YzRjYjZlMWJlN2ZiMGNkYjQ3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjc3NTQxMSwxOS40NTA5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MDlmZjI4M2NkNmE0YzI3YjEzZjU4OGY2M2U1ODNlZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjg1NjY5MiwxOS40MjEyMzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA0MTZjNTc0MWM1YTRlOTBhMGY5MmJlMzRmOThlZmUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNzU0NjEzLDE5LjQzNDkyNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGJiMmU2YjUxZjQxNDQ1Nzg3YzE2OTJiYWUwZWEwMDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40MDQ0MDYsMTkuNjk2OTU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZGNjNTMzOTBhZDk0OWQwYThhODI3YjU2NDE5MDFkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjA2NzQzOSwxOS40NDg2OTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EwYjBhNTZmZDQ2MjRiYTA4Y2M2ODY2OGQzMmJmNDA1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMDgwNjI1LDIxLjExMTE4Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmIyNDlmNmFhZjYyNGM0MGJmNGE2NmU4MjEzZjNkNDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4zNDk2MDgsMTguMjM2NTc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80Y2RhYTVlYTJiM2M0ZWYwOTc4Zjk2YTBkYTljMjNlOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjAyNDI0MiwyMi4wMTA1NzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y3ZTZhYzgyMmIzNTRiOGM5NzY5Y2Y1Y2I1OWE4OTYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDQwNjc1LDIyLjAwNDY1Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTczZTc1YjVmYjBjNGExZThhNTQ2Zjk5NmM5NmMwNzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC41Mjk4OTIsMjIuMTEyNDY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZjlmOTQ5ZTkwZjg0NDY5OTRhZjVhZDFiN2VlZGE4YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjMwNTkwOCwyMi4zMDc2ODFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VhN2U5ODU3YThiNDRjYjA5Y2ZkZTlhYjM4OWE1MGY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNjk0NjI4LDE5Ljk2ODg5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTg1ZjFjOGMyMzJmNGVjOWEwNDY0MmRhZjdlNDk1NzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4zOTgxNzUsMTYuOTU5NTE5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81MDIyZmM5MzFlYjM0ZDNiODU1ZWNlZmQyZTdjMzdjNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjQyMDMxOSwxNi44NzcyODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VjYjE3NGMzZTU1YjQyYWVhZTAxYjFjYzhjZjJmOGM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNzQ5MDUzLDE4LjA0ODM4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjgwYmU4NTVmMGU4NDQ0NGEyNGE3Y2VjZDIxMDcwZTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi4yMjU2MzMsMTguMjY5MDM2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMmQyYmQ1OGNiNDY0OGI0YjM1NTI3Y2Y2MDU1ZDA2NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUzLjE1NDQwOCwxNi43NTk1NzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc4ZTI1MWFjODBjNjQ4ZmQ4ZGYzYmQzODNhNGU5NjZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNDQ5MzMxLDE2Ljk5OTY4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzgwZDNjMDE0MmY1NGZlYmFjMjQ3ZmMwMzRiZDBiMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4zMjkxMTEsMTkuMjMxMjIyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NmU0NTE2NzVjMGM0ODcwYTdmYTk2ZTI0M2I0Y2Y5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjI0Njc5NSwxOS4wMTk0NjldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg1YjYwMmU3MTFkYTRlMGQ5MWY5OTU5OTk4ZDlkY2NmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMzE2NSwxOC43NzIzNzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzMwMDM5ZmY2ZDQ0ZjRlNTdhYjE0MjA2Y2U2MjNmNjJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMTExMTgxLDE4LjUxNjEzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDQ4ZWNlNTU4NmI0NDlkYTllZTQ5NDAwNGM4NmExMjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMjk0MTYsMTguNjg5NTI3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wMDIxMTBjMmRkNjI0OGMxYjg3YTZlM2YwYjQ1YWFmMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjgwMjA3NSwxOS4wNDg2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWNhNWE1NTNjMTU3NGFmYWJlZjZiNzA1NWQ5MWVmNTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC44MTc2NzYsMTkuMTE3NDI2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yODE4ZjNiODY2ZmQ0OThkODE5ODQzODk3Y2FiMDk4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjgzNjM4OSwxOS4xMzAxMTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MzMDZhMjgzMzVhMTQ4NDE4NjdlNTE0ZTIzNGVkYzI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDkuNzM4MTM2LDE4LjYzOTA2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzQxZTg4NmRmZmFmNDc1YWI3OWQzMGMyNzczNzJiNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wMDc2MjksMTguNDU1NTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jNGM4ODUxMjk3YjY0MGI0OTg5M2NkOTBiYWNkN2NhNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjg3ODk5OCwyMC42MzM2OTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IzYjUxMDMwYTU1MzQ3OTFhOGM3MmMzOGU2ZjViOWE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuNDI5MDE0LDIxLjI3NzM2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTAwODViNzg0ZGIxNDBlMWEzYmIxM2NiODQ0NzA3MzIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS4xMjExLDIwLjg4MDYzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTM1ZWZjM2NiYzZkNDMyYmI3NmQ1YmI3M2RiOWIxYTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1My43ODkyMzMsMjAuNDg2MDc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MDI1MTczZDBkZGM0MDRhYjQ1ODcxMzhjYjg2ZTQwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjE2Nzg0NywxOS40MTA5NDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQwZWY2ZGI5NzQ4NjRhZDg4MWEwNzU5NDZjYjFkNWQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuMDU3Njc4LDE5LjkyNjE4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDg5YmI0NzBjNjg0NGQzZjg5YTkxYzMwM2NhNmQ2ZDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4wNjkzMDgsMjAuMDUzNDkyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZjU3OTFlNGVjNzE0MjQ3ODg2N2IyMWRiMzNiMDYwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUwLjAxODI1MywyMC45OTI1NzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzcxNmZhOWU1M2IzNjQ2OWViMjZjYWYwNjQ2YjE0YzFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuODU5NTI4LDIzLjAwMDc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YTljMWZmMmExMjU0M2U5OTZjMTRhZWJiYWYzNmU4OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjM1MzMzNiwxOC42MzUyODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRiMmJlZjdjMGE2ODQxZDU4ZWEzNDQ0ZTkzYTE3ZWFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNDAwODMzLDE4LjY1NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTM1Y2Q5OGRlNTRmNDYyMDhmZGYxMDI5YmMwYzFiYTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC41NjA4MzYsMTguNDkzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYWRjNTRkMDBkMTg0MmQ2YTVmMzAwMjc0ZjE3YmVmNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjMyODMzNiwxOC41NTc3ODFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU4NDAwZjg3Yzk3NDQwOTA4NzAxZTVhMTcyYzQ0ZjRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuNDMxNjY3LDE4LjU3OTcyMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTMxY2U4Y2MyYmE2NDFjOGI1NmNjNzI1ZjYzZmIyMzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC4zODAyNzksMTguNjIwMjc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZGE1OThjZmQ0ZmQ0OTU1YmY1ZDI2ZDI2MWNkOGFhMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjQ2MzYxMSwxNy4wNDY3MjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdlMzJkNWRlYmY3NTQ1NmFiNDg3NDlhOTgxMmZhZjM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMTIwNjk0LDE3Ljk3NTg2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmI1NWQ0OWYzNTQ3NGJiMGFmZDlkOTNmMGRmMTJkOGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1NC4wMzEyNDcsMTkuMDMyODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mZGMwYWI4OTBmYTk0NGE4OTIyMGQ4OGY3ZTE0Y2M5NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjU0NjE2NywxNy43NDYxOTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhhODFhMjVhMzdmYjRkYTdiOWZkNDE3NDNhZGUyMjM2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTQuMTA0MTExLDE4LjE4Mjk3Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2NmMjg2ZGY3N2Y2NGMwMTg5NTQ0Njc5MjZkYTVjYzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MC4xNTk0MDYsMTkuNDc3NDY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZDc0ZmQxM2Q5Zjg0NDNhOTM2NDdkZTRiZTVmZjQ1NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ5LjI5MzU2NCwxOS45NjAwODNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VjNzhjMGFlYWI4MTRlYWM4YjE2NGU0ZTU4NTRlMThmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMjE5Mjk4LDIxLjAwNDcyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTVkZGFiYjcyMzY2NDZmNmE5YzUwNGNhYTkxOTM1ZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi41NTYyNzksMTkuNjg3NjcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ODYwYTQyNWRkNzg0OGQxOTRlM2E5MDRmMWY0MjkxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjU1MDkzOCwxOS43MDk3OTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhjMWNjMTNjNDYxZjQ5ZjVhOWU0NDgyMjI5MWI1OGE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMzk5MDg0LDIxLjE0NzQ3NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjhhN2VkMmRhZmMyNDQ4MzlkMDUzZWVlNTFlZWVmYWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS44MzUxMiwyMC43OTE1NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzEzODFjYTQ1OTNkZDRkZGY4OWI5ZTEyZDk2YWRlYTE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuMTE1NzI1LDIxLjIzNzI5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDY0MzI3MmY1NThjNDhjOTk3NjI2YjQyZDVhYjlkOWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi42NTY4NjYsMTguOTg3MzY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MTJkM2QyZWMyZTI0NjIzOGViOThhNjkxZDZlMWJjOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjI1OTQzMSwyMi41NjkxMzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzVkYzY1NzBjMjA5YjQxYmU5ZmYxYWFlODQ3Yzg1MTI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNzM4MjE0LDE1LjIyODY2N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDk1NmRhODMxMWE4NDQzMjk5OWU3OWYyYzhiNTcyZWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS45Mzk3ODMsMTUuNTE4ODYxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zN2FhZDY2NzY4NmI0YTZkOThjYzc4NjJjZmU0N2NjNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjQzNzcyMiwxNS4xMjI0NDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZkODAzZWIzNTlkNTRlYjViMTc2MjdkMjIxMDViNGJkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNzk5NzIyLDE2LjMxNzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRhYWFhNjgzMjU0YTRmNTViZDNiN2NkNjY0MTE0OTYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNjQyNjU2LDE1LjEyNzgwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzg2NDlkZWJmZDQyMTQwNzU4ZGVlMzI2NzA2NTliYjkzKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzVlZmNhMjE2YzQxNDE1ZTk4ZGUzZDQ2Y2E4YWVhMmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1My4wMTc2MjgsMTguNjEyODA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZWVlZTE0YjIwYzc0MTVhODM0OGZhOTMxNTVhZGU0NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjY1ODQ2NywxOS4wNTkzMTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84NjQ5ZGViZmQ0MjE0MDc1OGRlZTMyNjcwNjU5YmI5Myk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk5YzQ4MjdjNTVhYzQxYWU5NjIxMmM5OTA1YWUxNjNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTMuNDkzNTUsMTguNzYyMTM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9kMDk2YTZmNzMxMDE0MWI4YmJhMzk5YTZjNjAzNmE2ZSA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUxLjA0NzMxOTUwODg2MjQsMTguMTAwOTQzMDI5Mjc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDc1NjM5LjYxNjA0NzE0ODksCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfODY0OWRlYmZkNDIxNDA3NThkZWUzMjY3MDY1OWJiOTMpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "\n",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"_draft": {
"nbviewer_url": "https://gist.github.com/bbcf796d75dfe7a8d06040fcd73d35eb"
},
"gist": {
"id": "bbcf796d75dfe7a8d06040fcd73d35eb",
"data": {
"description": "dumanie nad transformacją lat,lon i x,y,z",
"public": true
}
},
"kernelspec": {
"name": "conda-env-jakbadacdane.pl-py",
"display_name": "Python [conda env:jakbadacdane.pl]",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.7",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment