├── 001_Read_and_Analyze_GPX_Strava_Route.ipynb
├── 002_Visualize_GPX_Strava_Routes_with_Folium.ipynb
├── 003_Elevation_and_Distance_Between_Points.ipynb
├── 004_Calculate_and_Visualize_Gradients.ipynb
└── 005_GradientProfile.ipynb
/001_Read_and_Analyze_GPX_Strava_Route.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "2ce70558-8243-4ff4-b548-6112b3f05537",
6 | "metadata": {},
7 | "source": [
8 | "# Data Science for Cycling #1 - How To Read GPX Strava Routes With Python\n",
9 | "- Notebook 1/6\n",
10 | "- Make sure to have `gpxpy` installed:\n",
11 | "
\n",
12 | "\n",
13 | "```\n",
14 | "pip install gpxpy\n",
15 | "```\n",
16 | "\n",
17 | "- Let's import the libraries and tweak Matplotlib's default stylings:"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 1,
23 | "id": "fd92ae56-c120-4081-96a8-958327826c26",
24 | "metadata": {},
25 | "outputs": [],
26 | "source": [
27 | "import gpxpy\n",
28 | "import gpxpy.gpx\n",
29 | "\n",
30 | "import pandas as pd\n",
31 | "import matplotlib.pyplot as plt\n",
32 | "plt.rcParams['axes.spines.top'] = False\n",
33 | "plt.rcParams['axes.spines.right'] = False"
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "id": "7ab807b5-13a5-40d9-a7b8-f62f6ef385c5",
39 | "metadata": {},
40 | "source": [
41 | "- You can read GPX files with Python's context manager syntax:"
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": 3,
47 | "id": "a5c4e1aa-8589-4ac4-ba50-6ddb473b934d",
48 | "metadata": {},
49 | "outputs": [],
50 | "source": [
51 | "with open('../src_code/Zg288.gpx', 'r') as gpx_file:\n",
52 | " gpx = gpxpy.parse(gpx_file)"
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "id": "483d3c00-01c2-4e47-bb14-2ce6b5c89df0",
58 | "metadata": {},
59 | "source": [
60 | "- It's a specific GPX object:"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 10,
66 | "id": "d521e73c-5f9f-48a4-a117-3b46da950e2e",
67 | "metadata": {},
68 | "outputs": [
69 | {
70 | "data": {
71 | "text/plain": [
72 | "GPX(tracks=[GPXTrack(name='Zg288', segments=[GPXTrackSegment(points=[...])])])"
73 | ]
74 | },
75 | "execution_count": 10,
76 | "metadata": {},
77 | "output_type": "execute_result"
78 | }
79 | ],
80 | "source": [
81 | "gpx"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "id": "f82304af-1de4-43f5-b713-3714eaeb2073",
87 | "metadata": {},
88 | "source": [
89 | "- Get the number of data points (number of times geolocation was taken):"
90 | ]
91 | },
92 | {
93 | "cell_type": "code",
94 | "execution_count": 22,
95 | "id": "6a7272df-f0df-4025-b65c-dec0bdff4b1d",
96 | "metadata": {},
97 | "outputs": [
98 | {
99 | "data": {
100 | "text/plain": [
101 | "835"
102 | ]
103 | },
104 | "execution_count": 22,
105 | "metadata": {},
106 | "output_type": "execute_result"
107 | }
108 | ],
109 | "source": [
110 | "gpx.get_track_points_no()"
111 | ]
112 | },
113 | {
114 | "cell_type": "markdown",
115 | "id": "d16ac89b-3049-4aa0-b4ce-d07cfd61c19a",
116 | "metadata": {},
117 | "source": [
118 | "- Get the minimum and maximum altitudes:"
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": 17,
124 | "id": "877183c5-51a8-474b-b3ea-f7fa18808694",
125 | "metadata": {},
126 | "outputs": [
127 | {
128 | "data": {
129 | "text/plain": [
130 | "MinimumMaximum(minimum=113.96000000000001, maximum=239.16)"
131 | ]
132 | },
133 | "execution_count": 17,
134 | "metadata": {},
135 | "output_type": "execute_result"
136 | }
137 | ],
138 | "source": [
139 | "gpx.get_elevation_extremes()"
140 | ]
141 | },
142 | {
143 | "cell_type": "markdown",
144 | "id": "d1a08fcd-2315-408b-89fc-ced315f44126",
145 | "metadata": {},
146 | "source": [
147 | "- Get the number of meters of uphil and downhil ride\n",
148 | "- It's a roundtrip, so the numbers should be almost identical"
149 | ]
150 | },
151 | {
152 | "cell_type": "code",
153 | "execution_count": 18,
154 | "id": "1f774255-cf8c-4594-8a5d-6f2dde900c84",
155 | "metadata": {},
156 | "outputs": [
157 | {
158 | "data": {
159 | "text/plain": [
160 | "UphillDownhill(uphill=295.7459999999997, downhill=295.7260000000002)"
161 | ]
162 | },
163 | "execution_count": 18,
164 | "metadata": {},
165 | "output_type": "execute_result"
166 | }
167 | ],
168 | "source": [
169 | "gpx.get_uphill_downhill()"
170 | ]
171 | },
172 | {
173 | "cell_type": "markdown",
174 | "id": "e4e5027f-6f33-41af-9b88-1ad038e27082",
175 | "metadata": {},
176 | "source": [
177 | "- You can dump the entire GPX file to XML\n",
178 | "- Here are the first 1000 characters:"
179 | ]
180 | },
181 | {
182 | "cell_type": "code",
183 | "execution_count": 9,
184 | "id": "a0858ff9-8c98-4c5b-bc53-94da96050d44",
185 | "metadata": {},
186 | "outputs": [
187 | {
188 | "data": {
189 | "text/plain": [
190 | "'\\n\\n \\n Zg288\\n \\n Dario Radečić\\n \\n \\n \\n \\n 2020\\n https://www.openstreetmap.org/copyright\\n \\n \\n \\n \\n \\n Zg288\\n \\n \\n Ride\\n \\n \\n 113.96000000000001\\n \\n \\n '"
191 | ]
192 | },
193 | "execution_count": 9,
194 | "metadata": {},
195 | "output_type": "execute_result"
196 | }
197 | ],
198 | "source": [
199 | "gpx.to_xml()[:1000]"
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "id": "321d8e18-43c5-48f8-9aca-18745633f886",
205 | "metadata": {},
206 | "source": [
207 | "
\n",
208 | "\n",
209 | "## Basic analysis\n",
210 | "- There's only one track available in the file\n",
211 | "- Access it with Python's list indexing syntax:"
212 | ]
213 | },
214 | {
215 | "cell_type": "code",
216 | "execution_count": 11,
217 | "id": "f17aa437-8c29-4be8-9b73-09aacb2bbcf5",
218 | "metadata": {},
219 | "outputs": [
220 | {
221 | "data": {
222 | "text/plain": [
223 | "GPXTrack(name='Zg288', segments=[GPXTrackSegment(points=[...])])"
224 | ]
225 | },
226 | "execution_count": 11,
227 | "metadata": {},
228 | "output_type": "execute_result"
229 | }
230 | ],
231 | "source": [
232 | "gpx.tracks[0]"
233 | ]
234 | },
235 | {
236 | "cell_type": "markdown",
237 | "id": "1c017826-2595-490f-89fc-fd503d84250c",
238 | "metadata": {},
239 | "source": [
240 | "- The track has only one segment - access it the same way:"
241 | ]
242 | },
243 | {
244 | "cell_type": "code",
245 | "execution_count": 12,
246 | "id": "7c7b5f59-e86f-493a-b67b-c89ab4620904",
247 | "metadata": {},
248 | "outputs": [
249 | {
250 | "data": {
251 | "text/plain": [
252 | "GPXTrackSegment(points=[...])"
253 | ]
254 | },
255 | "execution_count": 12,
256 | "metadata": {},
257 | "output_type": "execute_result"
258 | }
259 | ],
260 | "source": [
261 | "gpx.tracks[0].segments[0]"
262 | ]
263 | },
264 | {
265 | "cell_type": "markdown",
266 | "id": "fc95d72d-6a96-48a0-9c62-670ee87aa8f3",
267 | "metadata": {},
268 | "source": [
269 | "- The segment has 835 data points\n",
270 | "- Here are the first 10:"
271 | ]
272 | },
273 | {
274 | "cell_type": "code",
275 | "execution_count": 23,
276 | "id": "c7a5c1f9-735a-4d50-acd3-b2f6146e0c87",
277 | "metadata": {},
278 | "outputs": [
279 | {
280 | "data": {
281 | "text/plain": [
282 | "[GPXTrackPoint(45.77248, 15.95804, elevation=113.96000000000001),\n",
283 | " GPXTrackPoint(45.77277, 15.959090000000002, elevation=115.82000000000001),\n",
284 | " GPXTrackPoint(45.77327000046602, 15.958795002593812, elevation=116.15),\n",
285 | " GPXTrackPoint(45.773770000000006, 15.9585, elevation=116.12000000000002),\n",
286 | " GPXTrackPoint(45.77423500296469, 15.95933499290041, elevation=115.98000000000002),\n",
287 | " GPXTrackPoint(45.7747, 15.960170000000002, elevation=115.10000000000001),\n",
288 | " GPXTrackPoint(45.77487000000001, 15.960220000000001, elevation=115.25),\n",
289 | " GPXTrackPoint(45.77533000042586, 15.960000001712027, elevation=116.14),\n",
290 | " GPXTrackPoint(45.77579, 15.959780000000002, elevation=116.07000000000001),\n",
291 | " GPXTrackPoint(45.776320000000005, 15.959510000000002, elevation=115.78)]"
292 | ]
293 | },
294 | "execution_count": 23,
295 | "metadata": {},
296 | "output_type": "execute_result"
297 | }
298 | ],
299 | "source": [
300 | "gpx.tracks[0].segments[0].points[:10]"
301 | ]
302 | },
303 | {
304 | "cell_type": "markdown",
305 | "id": "9e361b78-d193-4677-9faa-98af2166d24c",
306 | "metadata": {},
307 | "source": [
308 | "- Let's now extract all dat apoints\n",
309 | "- Store latitude, longitude, and elevation as a list of dicts"
310 | ]
311 | },
312 | {
313 | "cell_type": "code",
314 | "execution_count": 24,
315 | "id": "a0ead523-faaf-4587-be3a-a9982066bef4",
316 | "metadata": {},
317 | "outputs": [],
318 | "source": [
319 | "route_info = []\n",
320 | "\n",
321 | "for track in gpx.tracks:\n",
322 | " for segment in track.segments:\n",
323 | " for point in segment.points:\n",
324 | " route_info.append({\n",
325 | " 'latitude': point.latitude,\n",
326 | " 'longitude': point.longitude,\n",
327 | " 'elevation': point.elevation\n",
328 | " })"
329 | ]
330 | },
331 | {
332 | "cell_type": "code",
333 | "execution_count": 25,
334 | "id": "71d033ad-2998-415b-ab5a-fa42b0dfc959",
335 | "metadata": {},
336 | "outputs": [
337 | {
338 | "data": {
339 | "text/plain": [
340 | "[{'latitude': 45.77248,\n",
341 | " 'longitude': 15.95804,\n",
342 | " 'elevation': 113.96000000000001},\n",
343 | " {'latitude': 45.77277,\n",
344 | " 'longitude': 15.959090000000002,\n",
345 | " 'elevation': 115.82000000000001},\n",
346 | " {'latitude': 45.77327000046602,\n",
347 | " 'longitude': 15.958795002593812,\n",
348 | " 'elevation': 116.15}]"
349 | ]
350 | },
351 | "execution_count": 25,
352 | "metadata": {},
353 | "output_type": "execute_result"
354 | }
355 | ],
356 | "source": [
357 | "route_info[:3]"
358 | ]
359 | },
360 | {
361 | "cell_type": "markdown",
362 | "id": "be715000-2a30-4373-b8bc-51c15abb3e98",
363 | "metadata": {},
364 | "source": [
365 | "- Convert it to Pandas DataFrame for faster and easier analysis"
366 | ]
367 | },
368 | {
369 | "cell_type": "code",
370 | "execution_count": 26,
371 | "id": "939968ff-e834-4603-b39e-6ebab08958aa",
372 | "metadata": {},
373 | "outputs": [
374 | {
375 | "data": {
376 | "text/html": [
377 | "\n",
378 | "\n",
391 | "
\n",
392 | " \n",
393 | " \n",
394 | " | \n",
395 | " latitude | \n",
396 | " longitude | \n",
397 | " elevation | \n",
398 | "
\n",
399 | " \n",
400 | " \n",
401 | " \n",
402 | " 0 | \n",
403 | " 45.772480 | \n",
404 | " 15.958040 | \n",
405 | " 113.96 | \n",
406 | "
\n",
407 | " \n",
408 | " 1 | \n",
409 | " 45.772770 | \n",
410 | " 15.959090 | \n",
411 | " 115.82 | \n",
412 | "
\n",
413 | " \n",
414 | " 2 | \n",
415 | " 45.773270 | \n",
416 | " 15.958795 | \n",
417 | " 116.15 | \n",
418 | "
\n",
419 | " \n",
420 | " 3 | \n",
421 | " 45.773770 | \n",
422 | " 15.958500 | \n",
423 | " 116.12 | \n",
424 | "
\n",
425 | " \n",
426 | " 4 | \n",
427 | " 45.774235 | \n",
428 | " 15.959335 | \n",
429 | " 115.98 | \n",
430 | "
\n",
431 | " \n",
432 | "
\n",
433 | "
"
434 | ],
435 | "text/plain": [
436 | " latitude longitude elevation\n",
437 | "0 45.772480 15.958040 113.96\n",
438 | "1 45.772770 15.959090 115.82\n",
439 | "2 45.773270 15.958795 116.15\n",
440 | "3 45.773770 15.958500 116.12\n",
441 | "4 45.774235 15.959335 115.98"
442 | ]
443 | },
444 | "execution_count": 26,
445 | "metadata": {},
446 | "output_type": "execute_result"
447 | }
448 | ],
449 | "source": [
450 | "route_df = pd.DataFrame(route_info)\n",
451 | "route_df.head()"
452 | ]
453 | },
454 | {
455 | "cell_type": "markdown",
456 | "id": "d325daf4-9057-4705-83ee-096467891134",
457 | "metadata": {},
458 | "source": [
459 | "- Save it to CSV for later use:"
460 | ]
461 | },
462 | {
463 | "cell_type": "code",
464 | "execution_count": 37,
465 | "id": "6121d955-82a8-41ac-b51c-b7a5c599b6ec",
466 | "metadata": {},
467 | "outputs": [],
468 | "source": [
469 | "route_df.to_csv('../data/route_df.csv', index=False)"
470 | ]
471 | },
472 | {
473 | "cell_type": "markdown",
474 | "id": "fe96a890-5947-48c5-894a-eb5889bf22b5",
475 | "metadata": {},
476 | "source": [
477 | "
\n",
478 | "\n",
479 | "## Basic visualization\n",
480 | "- You can use matplotlib to visualize all data points\n",
481 | "- It won't show the map, but you should still see how the route looks like:"
482 | ]
483 | },
484 | {
485 | "cell_type": "code",
486 | "execution_count": 35,
487 | "id": "56d0931e-a147-47cc-9772-036b01bee8db",
488 | "metadata": {},
489 | "outputs": [
490 | {
491 | "data": {
492 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAz8AAAHnCAYAAACWp+MoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABvE0lEQVR4nO3df3xceX3f+/dHsxI7FguewUtYNCTETm7ILSLbxKGBlJgfoU5hC4Z2EjC0OFYjr7tuxLbT2CS9E9BtGxtEWTf21VpE7iaQheQk4KQpjUnhYpKGkGt+ZEXKJlRmgRHbZY3GsMjatZC+948zRzsanTO/f8/r+XjoIen8mPnOnPlxPuf7+X6+5pwTAAAAAPS7oU43AAAAAADageAHAAAAwEAg+AEAAAAwEAh+AAAAAAwEgh8AAAAAA4HgBwAAAMBAIPgBMPDM7O1m5szspS2+n0+YWUfnFzCzQ4XHeqiT7WilWp9nM3vIzB5qYZOaxszuKxy/53awDS8ttOHtnWpDMxQewyc63Q4A7UXwAyA4CSj+WTez5cJJ5CEzsw606bmFttzX7vuuVz0npv1yIonO6cX3Sj/phosaAKp3U6cbAKCrvKPwe1jSD0h6naR9kvZKOtapRvWRfyZpR6cbgZ72NkknJS11uiF94IclXe90IwC0F8EPgE3OubcX/29mPynpk5L+hZm92zn35Y40rE84577a6TagtznnHpb0cKfb0Q+ccw92ug0A2o+0NwCRnHP/Q9KDkkzSj5WuN7OfNbNPmtm3zGzVzBbM7G1m9pSQbSPz60vTxQopYEGg9ZaSlLxDJfvuN7OPmNlVM3vCzBbN7F1mtrP+R7552wfM7P1m9rdmtmJm3zGzz5jZL5rZUMm2TtJbCv9+uai9DxVtsyU9ppCm9P8W/v3Vksf50uC5iBqPVC7dycx+wMw8M8sX2v7nZvbqCo83ZWZnzOxK4bn8ppn9oZn9eMUna+vtHDKz3y/czqqZfdvM/oeZvTli+08UHsdNZvbLZvalwv1/zcxOmdlIxH5vKByPVTP7hpm9z8yeXUtbKzyOp5jZCTN7wMyuFx7Hn5rZz4Zsu3ksCn9/sPCafNzMLpvZHRH38XQzu8fMcoVtHzSzf2Vmu8OObT3vFaswzivqvWlm32Nm82b2SOE5/ryZvSXkJor3SZrZr5nZFwv7fMvMPmZm/6DcflFtMrNnF47rNwq39xkzOxixz5CZ3Wlm/1/hvbpS+Pto6fs16nEXv9/M7J+Y2V8Wjv1y4ZiOFW373ML7eV/R7bnS2zWzF5jZB8wfW/aEmT1qZp8tHPfhWp4XAI2j5wdAJcF4n7UtC83+g/wUnKuS7pf0HUn/UNJ/kLTfzF7pnNuyTw0+IWmnpClJfyXpQtG6zxe1ISs/VW9Z0h9J+oakF0jKSHqVmb3IOfftOtsg+elFG5I+LT/N6OmSXi7ptKQfl/RPi7Z9h6QDkn6ksP5aYfk1RbtQ+P0WSZfkP+7AQ/U22sx+UNKnJD1D0n+T/5z9QOH+/lvEPj8q6aOSkpIuSvqQpF3yH9OfmdnrnHMfqbIJs5L+p/xew4cL7XiVpPeZ2Q855/6viP3ul/SSQhu/XdjnlyQ9U9LPl7T3bkn/Uf7z+1uF3/sl/bmkb1XZzkiFgOui/BPbByWdlZ+y+E8k/Y6Z3e6c++WQXb9P0l9KuiLpffKfz5+T9Adm9tPOuSDYlZndLOnjkn5U0uck/bb819ivyH8eqvEJVfFeqZWZPUP+c7lb0p8Vfm6TdK/810nYPt9XaM9zJf2ppD+WNCrpDkl/bGZHnHPvraEZiUIbrkn6z/If589K+m0zG3POvatk+/dJOijpa5J+Q5KTn7r7/0j6+5LeVMN9/wtJr5H0h/Lfm39P/nH8kcKxf6LQrndIOiT/uL+jaP+HJD/wkf/54Qq39WVJT5P/fvwXkv6tSj5bAbSYc44ffvgZ8B/5X8wuZPlPSVqX9ISk24qWv6iwz1clPato+U2S/kth3S+H3McnIu7/vsL65xYte25h2X0R+7yssP7PJe0sWXeosO49VT7+txe2f2nJ8j0h2w5J+s3C9n+v0uMoWf+J0udZ0ksL+7y9lraVe47kn5w6SVMly18bHGtJh0qO2/+S9LikfSX7PFt+4PewpKdU+XyGPW8jkj4m/0RvLOx5kfQZScmi5aOFdq2XvM6eW3hNLpe8ZoYk/X7U67lMex+S9FDJsrcVbucjkm4qWv7MwvZO0otDjoWT9Kslt7U/uK2S5f9XYfkHJFnR8udIejTi2G57jUW9DkLeD4ci1m97b0qaU8h7SP74v7Ww12zhOG5IekPJ8p3yA7FVSd9T5TEJnsvflTRUtPz7C8f9hqTdRcvfWNj+s5KeWvIaulxYd7CKx/32wvJvSxovWXd/Yd3Phr1+Ix7Huwv7vDZkXaL4sfHDDz/t+SHtDcCmQsrH283s35vZ70j67/J7fjLOH2sQOFz4/e+cc/87WOic+66kfy3/BOift7i5v1j4/QvOuWvFK5xz98k/2arlSu82zrnFkGUb8nt2JP+ktquYWUrSK+VfYT5TvM459wfyr2KXerWkPZJ+3Tl3qWSfr0t6p6RnSXpFNW2IeN5uyO89uanM7Rx3zi0X7bMivzdkSP5Jd+BN8oOpX3fOPVS0/YakfyP/9deow/JPWv9V4XUd3Mc3JP3fhX/DXuNfkfTvihc45y7Kv1DwwpJt31Jo69ucc65o+69JuqfB9tetkIr1JkmPyQ8GNjnnLss/JqX7/Ij8XrLfd859sGSfa5J+VdLNkv5xDU1Zl/+a2Dyezh93+J/kF2Up7nkNPpNOOOe+U7T9iqTjhX9r+Uz6T865hZJlQa9V6XGsxmrpAudcvvixAWgP0t4AFPvVkv+dpAnn3H8uWf6jhd8fL70B59zfmllO0veb2c7SwKSJXiT/CnTazNIh60ck3Wpmz3DOfbOeOyik/vwb+elXu+VfRS42tm2nzvu7hd9/5pxbD1n/CRXGKBR5UeH391l4ye0fLPz+Yfk9IWWZ2ffKP+F8haTvlRQv2STqebscsuxrhd+JomXB629bIOecu2JmX5OfhlQXM7tFflrSkgsfFB+87v9uyLrPRzzvX9OTz7PM7GnyA86vFQdwRf6spkY31/Pkp/j9qXMuLIXwE3pyfFsgeGxPj3gN3Vr4/cM1tOOrLrzIyifkf1YVP/8/Kj+Q/ETI9pfkB1JhxytKta/FSn5HfkriBTP7PfkXlP5H2AUCAO1B8ANgk3POJMnMRuWfzMxLutfMvuKcKw50nl74HVV16mH5J71PV/kxL414hvzPsNKArdRTJdUc/JhfMOH/k59m85fyx5UsS/qunhxjsa2wQxcIjs0jEev/d8iyZxR+hwWRxZ5a6c7NbLf85yshf9zHR+WPwVmXn571FkU8bxGBctDrEitaVs1jrDv4UXWvb8l/HZS6FrHPd7W1yNDTCr+jHkPU8nZo5DX0ysJPlIqvoSKV7v/pRcueLmm50MO4hXPuu2Z2VX7KYrWuhSwLey2W5Zz7SzN7ifxxXP9Ehd4qM/sbSe9wzn2ghjYBaAKCHwDbFFJF/ruZ/SP5OfS/WRioHsyJEVwNfpaksCuYt5VsJ/m9SFGfOTvraOa35OfLJ+vYtxr/XH7g8w63vQT4i+QHP+0QpMWEPXc7Q5YFz/n3RNzes8rs81rn3B9W37RQ/0r+ifDPF9IPN5nZG7W9x6AexY/xr0PWhz3Gem4/6nbCXt+1CgpxRB2nqOX1iHwNWXhVxEZeQ1POuf9UU+uiVbr/4uf/W5KSZjbsSgqtmNlN8ot3NFL8pG7OuU9JusP8Kpg/JulnJP1LSfeb2aPOuf/eiXYBg4oxPwAiOecekJ/nnpJ0d9GqzxV+v7R0HzP7gcL2Xy65kp+XP5C7dPuYpNtD7j5IHYq6yvoXkhJm9nciH0BjfqDw+/dD1pWmjQUqtbmeffKF39ueO20dBxMIjs3fLzy3pV4asuwvCr+rrTBWTj3PW60+G3V7hZ6nsOeqas65x+QH9WOFynmlXlbSjnru49vyK8KNWaFsdYm/X8PNNfs19KD8yT9vN7Onh6x/aciyZr6GAt8b8dwE9/+5omWfk39O81Mh2/+U/Oem7uNVwbq0+VkWyTn3hHPuz51zWT05ZvG1LWoTgAgEPwAq+Xfyq4BlzCzIdT9f+P1vzSzI5Q++/Gfkf7bMl9zOX8o/mSmd7+PfKjxFKS+/t+h7I9r1nsLv91rI3C5mNmpmPxGxbzUeKvx+acnt/l35lcDCBOl1UW2uZ5+/LPz++cIV7KAdz5GULd3YOZeT9Cfye62OFa8zs9cqPAD5A/kn+3eZ2avCGmFmLzKzHWUeR+Chwu+Xluy/X80rgvHb8sd7/cvik+PCXC7vUnO+287LL/bxruKTWjPbJb9KW7BNI35Lflt/zcyCkvLBsX1rDbdT6b1yWX7vz8HiY2hmSfnFLLYo9Jz8tqRbVFLwwMz2KqSQSKEQwp9Ker2ZHS5dX9h33MxqST2LSTpVPEePmX2//MDhu5LeX7RtcCx+reQx7pBfsl7a/pnULJHvYTN7SUQAGfRqXQ9ZB6CFSHsDUJZzbsnMzslP8/ol+ZWp/tzM3ln4/wuFgbwr8uf5eb78wdqlc3DMyK+O9geFSnLLkl4s/yT9Eyo5WXbOfcfMPi3pJWb225L+Vv4V1j90zj3gnPuYmZ2Q9GuSvmRmH5Ff4eyp8oOpfYV2/EydD/235Bc7uMfMXibpS/IH/t8hfw6cnwvZ52OFfd5beE6+I+mac+5MyLaBv5FfSvoNZnZDflUwJ+l9zrmvOOc+bWaflH/1+i/N7OPyT5z+kfx5aMKu5t8lf56fewrB5l/J75F5nfxS5P+oeGPn3JqZvb5we//VzP5cfrW864Xb/3H5BR9uU+WTtf9H/pw8npn9fuGxPV/+cfhdhT9vNXHOPVQ49u+W9LnC6+lb8l9fOyU9IH++p0bMyH89v1bSXxVeXzvkj4t6pqR3OucaLUrwTvnzKL1B0g+Z2Uflj135WflzJB1QFZXrqnivPFxY/k8lfd7M/qv8MUevKtxPWCGAX5ZfsOKthYAnmOfn5+QXvXhNyD4H5ReDmDezX5Q/v801+T3BL5D/OniR/Pm4qvGA/Pl1PlP03Pyc/GP8S8VFA5xz9xeC+5+V9NdmdkH+++iA/M+Y33XObatS1yQfk/+6+FDhdbIq6SvOuffJr375D8yf9PSK/M+EvyP/tZWXX1IcQDt1utY2P/zw0/kfVZgXRf7J9krh53uKlr9B/knRY/J7h/5a/sDemyNu5zXyr0I/Lv9q6QflByr3KWR+HPkn7P+lsO2GQuYqkZ8e9LuSvi5/7o9H5Z+4/0dJe6t8/G9X+Dw//6f8iQm/UXjsn5Hfe/FcRcyrIn/Myxflz0PjVDR/jCLmA5EfXHxM/gn8Rmlb5J/svbfQjickfUHSZIV2/ICk35N/8rkiPxh6tcrM+SL/pP5k4favyz9R+1Lhdt6sovluKjyfL5Z/EpwvvDb+TP5J6EsVPT9M6OuvQnvfKD+V6fHCcX+//HmJIm8v4j4eUsk8P4XlN8sPAr4g/4Q2eCxvDNk28lhUOPY75Zdu/nrh2D4o/4T5hYXbu6dk+/tUx3tFfpGJd0nKyX+f/C/5PZg3KWIOLvlja84XnttV+e+rQ1HHsbDPLYXn7DOF18+q/IsS/1X+a3a0ymPiCs/ZswvH9RuF4/xZlczXU7TPkPyJQy8XXr/XC+24SyHz6YQ9btU3r1ZM/uTOV/TkHEifKKz7B/InaP2f8t/fK/IvePwnSd9X7WuUH374ad6PObc5tQAAAOgCZvYL8nsF7nTOnet0e9rNzJykS865l3a6LQD6C2N+AADokIjxas+RP67ou5L+qO2NAoA+xpgfAAA65/fNbFh+etY1+alVd8gfX/Q259xS55oGAP2H4AcAgM55n/xCBP9Y/oD+78gvFHDGOfehTjYMAPpR1WN+CqU+L0tacs7dYWZvl/QL8gdCStIvO+c+ErLf3fIHCDtJC/InvnvczP5v+VV0NuQPZDzknPt6g48HAAAAAELVMuZnSn4Fo2Lvcc7dXvgJC3zG5Nfj3+uce778iihvKKx+l3PuBc652+XnNG+brwIAAAAAmqWqtDczS8kvkfrv5ZdxrfU+4ma2Jj+H+evS5uzWgVH5PUNl/czP/Iz74z/+4xrvHgAAAMAAsagV1fb83CN/MsPSydaOmdkDZna+aOb3TYWBmjPyJ+17WNK3nHMf3WyV2b83s6/Jny26Ys/P1atXq2wuAAAAAGxVMfgxszskfcM595mSVbOS9ki6XX5g8+6QfRPyx/V8v/yJykbN7M3BeufcrzjnniPptyUdi7j/STO7bGaXH3300bBNAAAAAKCianp+flLSa8zsIfmzsb/czN7vnHvEObfunNuQP/P4C0P2/WlJX3bOPeqcW5P0Ifkzf5e6X36lm22cc3POub3Oub233nprFc0FAAAAgO0qBj/Oubc551LOuefKL1bwcefcm83stqLNXifpCyG7f1XST5jZDjMzSa9QoWiCmf1g0XavkfRgnY8BAAAAACpqZJ6fd5rZ7fILFTwk6Yi0OVv1bzjnXuWc+7SZ/Z6kz8qfqfpzkuYK+580sx+SP47oK5LubKAtAAAAAFBW1fP8dIO9e/e6y5cvd7oZAAAAALpXw9XeAAAAAKCnEfwAAAAAGAgEPwAAAAAGAsEPAAAAgIFA8AMAAABgIBD8AAAAABgIBD8AAAAABgLBDwAAAICBQPADAAAAYCAQ/AAAAAAYCAQ/AOR5nvbs2aNEIrH5k0wmlclkOt00AACAprmp0w0A0Fme5+nYsWO6cePGluXOOc3Pz0uSZmZmOtE0AACApjLnXKfbULW9e/e6y5cvd7oZQF/ZvXu38vl85PpYLKarV6+2sUUAAAANsagVpL0BA8zzvLKBjyStr6/L87w2tQgAAKB1CH6AATY9PV3VdlNTUwRAAACg5xH8AAPG8zyNj48rmUwql8tVtc/q6mrVgRIAAEC3IvgBBojneZqamlIul1Ot4/1yuRy9PwAAoKdR7Q3oY57n6cSJE1peXq56HzOLDIympqYkSel0uintAwAAaCd6foA+FZSwrjbwMTOlUikdPnxY8Xg8dJvV1VXdeeedSiaTGh8fVyaT2UyhGx8fp2cIAAB0NUpdA32qUgnrYqlUSgsLC5v/e56nycnJuu43kUjo1KlT9A4BAIBOodQ1MEiqKWEdiMfjymazW5al02mlUqm67jufz1MdDgAAdCWCHwycoNpZIpHY8nPgwIFON60pPM/T0aNHq9o2lUrp9OnTob00pQFRLagOBwAAuhFpbxgInudpenpauVyu7ID+ffv26cKFC+1tXBMF1dxWV1fLbjc8PKyzZ89WTE2rJXWulJnVVGgBAACgSUh7w+DKZDI6cuTI5pw25QL+S5cutatZLTE9PV0x8EkkElUFPpJ06tSpyOIHlSQSibr2AwAAaBWCH/Q1z/N0/vz5mue06RXFE5aOj4+XnbQ0Ho9rbm5OV65cqboYQTqd1unTp5VKpWRmSiaTSiQSm5XhJiYmlEwmQ/d97LHHGPcDAAC6Cmlv6Gv1pG3Vm+bVbplMZltgF5XSF4vFNDs727IKbFHPc2kVOQAAgDYg7Q2Dp5aKZ4F9+/a1qDXNFdWj5ZyT2db3ezweb2ngI0nXrl0LXV6uJwoAAKDdCH7QV4rTwKqteBaIxWI9U+xgeno6MpXPObeZplaumlszjY2NhS43M1LfAABA1yD4Qd8IKp3lcjk557S+vl7T/rVu3wlBcFeuRyVINVteXtbCwkJbJhvNZrPbepwkPxCj5DUAAOgWBD/oWaWD/Y8fP16x0lkvKw7uophZQ/Pz1CudTkf2RC0tLbW5NQAAAOEIftAynudpz549m5OIBpXCxsfHG06FKu3lyeVyVY3vKVe2OaznoptUKmNtZjp8+HBbenrCpFKp0OWUvAYAAN2C4AdNFwQ9k5OTWya5DHoGcrmcJicntXv37pqCoNLxPNX28sRisS3jX6J0c+VDz/MqprqdO3dOMzMzbWzVVtlsViMjI9uWU/Ia6IxMJqNdu3YpkUho165dymQynW4SAHQcpa7RNJ7n6cSJE1sCnkqC3orik3bP8zQ9Pa2lpSWNjY1tpnFNTU3VnNYWj8e3DfiPGjPTrWWZw0paF+umdlPyGugOmUxG8/PzkesTiYROnTrVsZ5iAGixyHQegh80RZCGVu+Ym5GREQ0PD2tlZWXbung8rptvvrmqtLZkMqkdO3ZsCZxKv9yj2toNJwOlgd/+/fvLBj5hwV0nJZPJ0LaaWU1BMYDGRL0XS01MTHS0xxgAWoTgB61Vz2SizVZLIFCul6oTQVBUe6ImLQ3Mzc11TeAj9V6vGtCvahlrNzIyotHRUV27di3yohEA9BgmOUXr1DOZaLOUjuep9gs7nU5rx44doevy+byOHDnStOIMYYrHL+3Zs0d33XVXaCBWLvBJpVJdd4KSzWa3FZUwM+3fv79DLQJQyY0bN5TP5zeLx0xNTTFOD0DfIvhBQzzPq3ky0Xokk8ltJ9XxeFyzs7N1z2dTrgRzcXGGI0eONHWgcGmluuXlZa2trdV0G50qaV1JOp3WwYMHt1TOc87p/PnzDLYG2mh0dLTufVdXV5mfC0DfIvhB3YKT+HKTgyYSCc3NzSmfzyufz2tiYqLm+4nH4zp58qROnz6tVCpVV09PmLGxsaq2c85pfn6+KSfvQbBYy9io0hLcnS5pXcnFixe39VgFARBXk4H2eM973tPQ/szPBaBfMeYHdas0zieZTGpxcXHb8kpViIq1cvxNPUUaGhkcXM/9xeNxHTx4UBcvXixbxKGblBtoHYvFNDs729XtB/pFLZ+1paI+vwGgR1DwAM1V6Uu1UvEBz/N09913h1Z3k6QdO3bonnvuaflJcj3luestMlBrUYhuqD5Xj6iiB4Fuq1AH9LN6JxkeHh7W2bNneZ8C6FUUPEBzBBOYlgt8YrFYxZPbdDqtXC6nubk5JZPJzeVBmtzS0lJbvnTT6bQWFxc1NzenVCpV1T4nTpyo+X4qFYUYGRlRIpHYTOmbm5vTlStXevLEI5vNbkvVK7a6uqqjR4+SAge0QfHnay3W1tbq+qwDgG5Hzw+qUksPSbeVX65VNakitVa3K9cb0o+pYJUmZpXoAQLaIRhnWDo2c2RkRGfOnJEkTU5ORu7f65/nAAYWaW+oXTDhZrkUplL9kideKQCqNfgpNw6mX08uok66ijH/D9B6e/bsCb1wFbz/yl2c4T0KoEeR9obaZDIZHTlypKbAx8x08uTJFraqfZo943lUZblkMtmXgY/kpxTOzs5uK1FeLJfLtWwuJQC+qB774PO9XNn8XC7X0jnPAKDdCH6wKRjPk0gkND8/XzZlqVS3l1+uR9RA4VoHEHuep+vXr29bHpTw7mfpdFqnT59WLBaL3IZJFYHWinr/BcvT6XTFz7VWzHkGAJ1A8IPNoGdycrKmqmeBRCKhc+fONb23pNNe//rXhy5/wQteUPVtBOWtS5/XRCIxMONdqukBoggC0DpRqafFy0+dOlX2PSoxXxeA/kDwM8CaEfT0clWySi5evBi6/NKlS1Vf/Zyeng6d12d0dLQvn7MoQQ9QuYp66+vr9AABTVbu/VT8fgzeo5U457hQAaCnUfBgQHmep7vuuktra2s17xukuPVbT0+pckUKpOomPI1KJTGzugLOflBpHiAGWAPNU25+sbBiK7t27SpbpCRAtUYAXY6CB9jq+PHjdQU+qVSqL1PcwkQVKQhUSv/wPC9yvptKt93PstksRRCANilXmTIscDl06FBVt7u6uso8QAB6EsHPgKqlVHOQ3pbP57WwsDAwV/oqTdbpnNP09HTk+unp6dCeIzMrW12p31VbBIHB1UD7zczMaGJiouz7M7C8vMx7FEDPIfhBpH4f01NJOp3W4cOHy26ztLQUuS4qtcs5N5DPZ7FqiiAwuBporaj31szMjK5evap8Pq+5ubmygdD8/Lx2797N+xRAzyD4GUDlvqSGhoY2e3kGNegpFlwFjeKcC03RKpfyVm7Q/yCppgiCc47UGqAByWQyct3x48cr7h9cqCgnn8/TUwugZxD8DKByqVr33nvvwAc8pYIAKCqYCUvROn78OClvVUin01pYWCgbAC0vL3NVGahTubnEqk1/rmYeIOec5ufnea8C6HpUextA5b7EahkLNGg8z9P09HRkOpuZ6dy5c5KkycnJyNvhOd7O8zwdOXIksrpeMpnU4uJim1sF9IdmfOZXeo8GhoaGuIgGoBtQ7Q1PqjTbN8IFvRRRPUBBila5VBJS3sJVGl/FwGqgfqOjozUtDxO8R8sVgZGkjY0N5usC0NUIfgZQNbN9I1q5MtXLy8tlr6SS8hZtZmam7BVqih8A9XnKU55S0/IoMzMzOnfuXNlxRJJfBvvo0aNKJpOUrQfQdQh+BlDUCSa9EtWpVAI7SjKZJBWkglOnTkWuq1RaHEC4qAmV60nBTafTWlxc1I4dO8put76+LueccrkcPUEAugrBz4DxPE8rKyvblg8PD9MrUaVqSmCHKTfwGL5KA6vLlRYHsF25oKORyZbvueceDQ8PV7UtPUEAugnBz4CZnp7WjRs3ti2/5ZZb6JWowczMTE358vT6VO/UqVNlx1Vx8gRUr9wYxEYueKXTaZ09e7ZiClyguCfo2LFjvIcBdAzBz4CJunJOBbLajYyMVLVdPB6n16cGlQZW53I5TU5OKpFIEAgBFZT7bG/0gkyQAjc3N6dUKiUzq6pwzo0bN5i/C0DHEPwMmKg0h0bSHwbVtWvXKm6TSqV0+vRpen1qFAysrjQOLQiEdu/erUwmo/Hx8c3UmuL/9+zZo927dyuRSGjXrl0ETkATBZUwl5eXNTs7q3g8XnGfqHFIANBqVc/zY2YxSZclLTnn7jCzt0v6BUmPFjb5ZefcR0L2u1vSP5fkJC1I+nnn3ONm9i5J/0jSDUmLheXXyrWBeX4a53mepqamtLq6urksHo9zgl6H8fHxyDl/JGlubo7ntAmSyWTFuUXqZWY6fPiwZmZmWnL7QKdFjaEbGhrSN7/5zZbcZ7VzApFxAKCFmjLPz5SkL5Yse49z7vbCT1jgMybpFyXtdc49X1JM0hsKq/9E0vOdcy+Q9LeS3lZDW9CA4qtyiUSCwKdO2Ww2MvVtYmKC57RJWtkrGcxKzxxC6EflejY3NjZadr/pdLpi4FMclHmet6XXlh5ZAK1UVfBjZilJr5b0G3Xcx02S4mZ2k6Qdkr4uSc65jzrnvlvY5i8kUWe5xYJen+J0g8cff7yDLept6XRaZ86c2TLgN5FIaG5ujp6EJqq3tHgtmEMI/aibJ1zO5/Ob6apTU1PK5XKbBRGCMX3FPwcOHOhoewH0j6rS3szs9yT9mqRbJGWK0t4OSfq2/HS4f+2c29aHbWZTkv69pFVJH3XOvSlkm/8i6Xecc+8v1w7S3hoTlaaVSqW0sLDQgRYB1clkMjp//nzL0t8k3gfoL57naXJyMnJ9q9Nyy5Wsb1QqlVI2m6V3HUA59ae9mdkdkr7hnPtMyapZSXsk3S7pYUnvDtk3Iem1kr5f0rMljZrZm0u2+RVJ35X02xH3P2lml83s8qOPPhq2CaoUVemNuVPQ7UoLIAwNNb9WS7nxW0CvKTchcDtK71eaBLURuVxOR44coXAJgLpUcwbxk5JeY2YPSfqgpJeb2fudc48459adcxuS3ivphSH7/rSkLzvnHnXOrUn6kKQXByvN7C2S7pD0JhdxSdc5N+ec2+uc23vrrbfW9OCwFZXe0MuCilL5fF7f/OY3t5TXTaVSmpiYiPw/mUxWvBJdTYneVike8xBUpiv9m5M81KLcRa12lN6/5557WpquGpwyFFd85P0BoBpVV3uTJDN7qZ5Me7vNOfdwYfndkv6ec+4NJdv/PUnnJf24/LS3+yRdds79upn9jKT/KGmfc66qLh3S3urneZ5OnDixrbwold4waMoFQc2qPuV5nqanp7W0tKSxsbEtKTql6/bv36/7779/SwXGKCMjIxodHdW1a9e23S5QLCrNOZlManFxsS1t8DxPd999t1ZWVspuZ2ZNS2lNJBI6deoU7wsATan2VuqdZrZgZg9IepmkuyXJzJ5tZh+RJOfcpyX9nqTPyi9zPSRprrD/GfljiP7EzD5vZvc20BaU4Xme7rrrrm2BD5XeMIiienjq6fkprVKVyWS0Z88eTU5ObhnAPTU1Jc/zNouOFK87f/58VYGP5E8Omc/nN/c9duwYPUMItX///m09L+2ecDmdTiuXy2lubm5LYZhiw8PDOnz4cNMKMOTzeXqCAJRVU89Pp9HzU5/du3eHXtFOJBK6cuVKB1oEdE65np+5ubltvTIXL17c1oMT1ZNaTnBy18qxRcEV9FgspvX1dQaGD6iw+dy6YU6r0vdNWC9NPe+tKGQ2AAMtsueH4GcAtCPNB+gF5SpgmZluvvnmsr0w8XhcBw8erDpNrfT2JbW0Yl2YoM1hQRz6Uz9V9gzSRHO53GZQX0uaXC8+ZgBNQfAzyAh+AF/USWEtghOwWpXr+WnmmIcwpbfPFfH+lkwmQ19PZtaUHpVOq7V3iB5QYCC1ZMwPekRUrnXUcqBfNaOsez2BTzweVzabVTabVTwe37YuGPNQXJku7O/h4eG62lx6Iry6uqoTJ05sGa/E+Ij+0e+VPdPptBYXF8uOJSpWPO4OAAh++lTxQGxp+2DukZGRtg58BbpBuZO/asvy1loYobiwSDqd1unTp7eU5D59+rRmZma0sLCg5eVlLS4u6sqVK6F/nz17dkuQVG8wJEnLy8vbijJkMhkCoj4QFWRns9kOtag1agmCVldXNTk5yesaAGlv/ShssCslcgH/vXHs2DHduHFjy/KhoSH9/M//fMWxPOXG/CQSCb3+9a9v69ia4vEQUalztaTUkR7XPzKZjO677z6tr68rFovp0KFDHS120A7F74dyeF0DA4ExP4Pkmc98ptbW1rYtZ+AnUL7iVNgcPFHV3qLm8enk4yodGJ5KpWqaRyhMMpnUjh07uuqxorywC2CDdMJfzdg+vg+BvkfwMygOHDigS5cuha7rl8GuAGpTGqytrKzUXewkOImW1HUBIHz9VO2tHmHBX5i5uTles0D/IvgZFOUquw3KFx+A8qLmgan2+yCZTGp1dbXr5pGBr9+rvVWjmhQ4XrNAX6PaG/wZvwEgrPDC4cOHtw2Sj7K8vLztqrpzTufPn2cweRfYuXNnTcv7UTqd1sLCgubm5iJf18Wv2eIiQRRFAPobPT99plzPTyKR0JUrV9rYGgC9pJnpcZ0oAAHfnj17Qnt4ksmkFhcXO9Cizio3ubEU3pM5SGOkgD5F2tugeNaznqUnnngicj05zgCqFTVw/uabb64rKAqqTubz+S1FGQiKmisq7U0a3Imt653geGRkRGtra3LODUzVPKBPkPY2KH7913+97HomegNQrah5iU6dOlX1vEjFbty4sXnyHUwWm8vldOTIEWUymaa2fZBFzWdlZgP7+Z/NZut+zQaB5Pr6uubn5zU2NjawzyPQD+j56UOpVEorKyuR62OxmGZnZ7nSCqBumUxG58+fr7pIQiVmpnPnzvG51ASe5+nIkSOhx2aQC9+EvWbr7ckkLQ7oeqS9DZKoiRyLUeUGQKM8z9PRo0c3e3EaxZxCzVNu/Oegpr5J28e1ZbNZSaqqNHapQQ4kgR5A8DNoqj0pSSaTOnnyJCcYAOpSzcWWenF1vX6Uu65NvYH8IAeSQJdjzM+gSafTmp2drVi6dnl5WUeOHFEikdCuXbu2/N69e7f27NlD6U8AkdLptM6cOaNkMrlleSKR0MTExOZ4oWQyqeHh4Zpue3V1VUePHuUzqA5RFzZ76YJnOwXfmSMjI1XvMzTEKRTQi+j56XPNTEvhKiyARlQz8WQ5QbW4a9eukRZXQbm0t4mJCVKeI3iepxMnTmz2jo2MjJTt1eS5BLoWaW+DrNzg11qR4wygGZoxp9DIyIiGh4c3C7wkEgmdOnWKgEjRc/0EOGmvXqUy2Tt27NDq6ioBOdBdCH4GXbMqM5EvDqAVwuYUqhcn9pXHYvFZXr1Kk6QWo5gQ0DUY8zPoZmZmdO7cubKpENWImj8CABpROqdQLBar+7bOnz8/8OODgrFYUXrpwmen1dKT45zT/Py8EokE49SALkXPzwAqzrs3s5q+BJ/3vOfpU5/6VAtbBwCN9wSRouuj5HVz7N69u6Hna9++fbpw4ULzGgSgEnp+8KR0Oq2FhQXl83mdO3dOqVRKkjavtJa74vrggw+2pY0ABltpT1Ct1eJyuRxV4uSnYdWyHOFOnTrVUG/kpUuXdODAgeY1CEDd6PlBKK4WAug2xUUSEomEvvWtb1VVyXKQK1XyWd48nufp7rvv3iywUQ+ec6Bt6PkBAPS2oNd6eXlZi4uLmp2d1ejoaMX9VldXNTk5OZC9QFHBT9Djj+ql02nlcjnNzc1t9khW8/oD0F0IfhBq3759NS0HgHYLOxktJ5fLaWpqamACIM/zQnsphoeHlc1mO9Ci/lAchOdyOU1MTJBGCPQQgh+EetOb3qSnPOUpW5Y95SlP0Zve9KYOtQgAwhWfjFbq0VhdXdX09HSbWtZZ09PToaWub7nlloFMAWyVoJpqpdceFw+B7kDwg22CKktPPPHEluVPPPHEQF01BdB7stms4vF42W0GpRjC0tJS6HLGnTRfcSGhubm50G24eAh0B4IfbDM9PR1ZXnaQrpoC6D3FVeLKcc4pl8tpcnJSiURCu3fv3hIIeZ6n8fFxJZNJ7dmzR7t3794WMBVvEywPW9YpUfOyMV9ba504caKm5QDai2pv2FQ8/085zAwOoBfUO1dQMpnUY489prW1tdD18XhcBw8e1P3337/ltkdGRuSc27JfsO3Fixe1tLSksbEx7d+/f8v/2Wy2JWlomUxG58+f3zKX2yBXvmsXKuwBXSFyIB7BDyTVdpLA5IEAekVxeexmft/FYrGqymxLqjiZdLA+uM1UKtVwQBQW+JiZDh8+rJmZmbpvF+V5nqfJycnI9QQ/QNtQ6hrhghSNycnJqgKfeDxOlSAAPaOWYgi1qDbwkVQx6ArWB7fZaFU6z/O2BT7B/Vy8eLGu20R5xd+lALobwc8AC3p7KqW5BVKpFOkSAHpWNcUQqhWLxZpyO1EaGV85PT0dGXBFFUFA/TKZjI4cOVLVd2nY+DIA7UXwM8DKFTYoFaS6EfgA6FVBMYRkMtnQ7cTjcR06dGhbIDUyMqLh4eEtyxqZ/yWXy9VVPKFcgEOxg+byPE/z8/M1pVTm83ndeeedymQyetaznqVEIrH5c+DAgdY1FoAkgp+BEVaBqNorgKS6AegX6XRai4uLmpubKxsEjYyMKJFIyMyUTCY3/w56wGdmZjarygXLz5w5o7Nnz25Zdvjw4bp7m8xMuVxuS2W6anoNogIcM+OzvMnuvvvuuvbb2NjQ/Pz8tiklLl26RAAEtBgFDwZAWDGDeDyum2++OXLwZTMH3gJAtysujNDsCmyltx1Ue8vlcpHFEMoVSahUsS3sM59iB61RrrJbIyiMADSMam+DbHx8PDQXOZlManV1dVtQxLgeAGiP4ikGii86VRo/EovFtLGxERmoZTIZ3XfffVpfX1csFtOhQ4cIfFqA4AfoWlR7GySlKW5RX6L5fH5b2gaBDwC0T1CNLp/P6+rVq8rn81pYWKhYmW59fX0zHa60Mpznebr//vs3q8etr6/r/vvvZ5B9CzQypgtAZ9Dz02ei0h3CjjPz9QBAd6p1gtbiz/Ooi16JREJXrlxpajsHXSaT0fz8fNNvl54foGH0/PSr0l6e48ePb/uydM5tuzpFEQMA6F61VqbL5XJV9fbT+9NcMzMzmpiYaOptNvv2AGxFz08Pq+fKYCsG8wIAWqe4YMLQ0FDFCVbLFUugx781av0+jjIyMqJHHnmkSa0CBhoFD/pRuSt8pfjCA4De14yTbFKqWiOseEW5QDTM6Oho1d/rAMoi7a0fVFvIoBQpbgDQH4J0uKBQDbpHWPGKc+fObRavGBqqfMq1srLS6mYCA4+enx5RSyGDZDKpHTt2kOIGAH2ulgthAXp+Oq9ciWyOD9AU9Pz0uunp6aoLGZw8eVILCwtaXl7WwsICgQ8A9KlsNqt4PN7pZqAGnudF9tq1at4gAE8i+OlS1aa4OeeYpwcABlStaXDVpF6hdYIsjrCsjeHhYZ06daoDrQIGC2lvXYi5egAA9aiUBjcxMaGZmZk2tgjFoo5PLBbT7OwsFy+B5iHtrZfUkuJGIQMAQKBcGhyBT+ctLS2FLt/Y2CDwAdqE4KcLkOIGAGiG0jS4VCqlubk55fN5Ap8uMDY2VtNyAM13U6cbMOhKU9xyuRwpbgCAuqXTaS6MdSHP80JLWZPFAbQXwU+bFc/UPTY2ppWVlcgUt+IAiA9HAAB6U9TktMlkUidPniRYBdqIggdtVOvM3KlUirl6AADocVEp7WR0AC0TWfCAnp82CitkEIUPRAAA+kPUWN6oAggAWoeCBy1UbSGDUqS4AQDQH8pNakqhA6D9CH5aJEhxy+Vycs5tFjIIk0wmqeIGAEAfmp6eDi1iZGZc6AQ6gDE/LRLV0xNWyIBgBwCA/pRMJkODH0nK5/Ntbg0wMJjktNWYqwcAAJSKSm1LpVJtbgkAiYIHDfE8T8ePH9925Ya5egAAgCRls1kdO3ZMN27c2Fw2MjJCyhvQIQQ/dThw4IAuXbpUdhvm6gEAAJK2XQztpSEHQL8h7a1G1QQ+AVLcAAAYbNPT01pbW9uybG1tTdPT0x1qETDY6PmpUbWBj0SKGwAAgy5qLh/m+AE6g56fFiHFDQAAJBKJ0OXM8QN0RtXBj5nFzOxzZvZHhf/fbmZLZvb5ws+rIva728z+2sy+YGYfMLObC8vTheUbZra3OQ+nOyQSCVLcAAAYcJ7n6Vvf+lbouuXlZXme1+YWAail52dK0hdLlr3HOXd74ecjpTuY2ZikX5S01zn3fEkxSW8orP6CpNdL+mTtze5eExMTunLlCoEPAAADbnp6Wuvr66Hrrl+/rqmpKQIgoM2qCn7MLCXp1ZJ+o477uElS3MxukrRD0tclyTn3Refc39Rxex01MTFRdv3MzEybWgIAALpZpXE9q6urOnHixJZ5AgmGgNaqtufnHkm/JGmjZPkxM3vAzM6b2bakVufckqQZSV+V9LCkbznnPtpAeztuZmZGZuGTxsZisTa3BgAAdKtqxvUsLy8rl8vJOadcLrfZGxRMnp5IJLRr1y4lEgmCI6AJKgY/ZnaHpG845z5TsmpW0h5Jt8sPbN4dsm9C0mslfb+kZ0saNbM319JAM5s0s8tmdvnRRx+tZdeWiarPH9W1DQAABk89hY+C3qCpqSnlcjlJT55fFAdHAOpTTc/PT0p6jZk9JOmDkl5uZu93zj3inFt3zm1Ieq+kF4bs+9OSvuyce9Q5tybpQ5JeXEsDnXNzzrm9zrm9t956ay27tkwqlappOQAAGDzpdFr79u2reb/l5WWtrq6GrltdXdXk5KR2795NEATUoWLw45x7m3Mu5Zx7rvxiBR93zr3ZzG4r2ux18gsYlPqqpJ8wsx3m54q9QtuLJvScbDareDy+ZRmlrQEAQKkLFy5oYmJiW2p8KpWKLINdjXw+r7vuumtLihzjhoDKGpnn551mtmBmD0h6maS7JcnMnm1mH5Ek59ynJf2epM9KWijc31xhu9eZWU7SiyT9VzO72EBb2q44+KG0NQAAiDIzM6OrV68qn89v/iwsLOjUqVOhF1OrDYrW1ta2pMiVjhsCsN1NtWzsnPuEpE8U/v6nEdt8XdKriv7/VUm/GrLdhyV9uJb77wae52lqampLd/Tjjz/ewRYBAIBeFFw0nZ6e1tLSksbGxjazSErPNaIsLy9vW7a6uqrp6enQ2+ZCLQadRQ3e70Z79+51ly9f7mgbxsfHNwcgFkulUlpYWOhAiwAAQL/xPE/T09Oh5xzVisfjWwKoeDyu06dPSyIoQt8LL80sgp+aJZPJ0GpvZhZ69QUAAKARnufp2LFjunHjxpblw8PDeupTn6p8Pr9tn1gsFlqFNplManV1NTQoIgBCH4kMfhoZ8zOQomr2V1PLHwAAoFbpdFpnzpxRMpncXJZIJHT27NnIcUNR02+EVZIrnmyVeYXQ7wh+apTNZjU8PLxl2fDwMJXeAABAy6TTaS0uLm4WTLhy5YrS6bTS6bROnz6tVColM1Mqldr8vxbBZKsS8wqhvxH81MGv2h39PwAAQLuk02ktLCxoeXlZCwsLSqfTkdNy1FpeO5hXiN4g9AvG/NSIggcAAKAXBEUT6q0kV04ikdCpU6cYJ4RuRcGDZqHgAQAA6GWlQdHKykpo0YRKKJSALkbBg2ah4AEAAOhlpWlyYUUTqrG6uqo777xTiURCiURCu3fvViaT0fj4uJLJpMbHx7f973mePM+juAI6hp6fGoVNcsqVDwAA0MuK5xWKKpPdDCMjI3LOaW1tLXTd6Oiorl27xvxDaBQ9P81UfHUkkUgQ+AAAgJ4W9Abl83ldvXpVc3NzdfUGVXLjxo3QwCdYl8/n5ZxTLpfTsWPHtHv3bnqI0FQ3dboBvSSs1+fxxx/vYIsAAACaL7ioG/QGDQ0NaWNjo61tuHHjxubErqXlt4vbCNSCtLcaUOkNAAAMquJCCUNDQy1LjatGLBbT7OwsARCikPbWDEtLSzUtBwAA6BfFhRJmZ2c1MjJS822MjIxsmyy+Huvr60zAiroQ/NSASm8AAAB+IHTmzBklk8nNZYlEQhMTE0qlUjIzpVKpbf+fOXNGZ8+eVSqVkuT34Ej+VCK1BkWrq6s6ceLEtmpyQDmkvdUgk8lofn5+2/KJiQnNzMx0oEUAAAD9oTitLpFI6LHHHossjlAOE7BCTHLaHIz5AQAAaI/i8tu1isfj+r7v+z49+OCDm8v27dunCxcuNLGF6GIEP82QTCYV9nyZmZaXlzvQIgAAgP4XVnG3HgRAA4OCB80QNbZn586d7W0IAADAAEmn0zp9+vSW8UOJRKLm27l06VILWodeQvBTg2w2GzoYb2VlhQF2AAAALVRcbW5hYUGnTp1qyUSs6G8EPzVIp9O65ZZbti2/ceOGpqenO9AiAACAwRT0BhVXnAMqIfipUT6fD13OXD8AAADtlU6ntbi4qLm5uS0pcWbhQz6C0toYXAQ/NWKuHwAAgO5SmhIXNR77aU97Wnsbhq5D8FOjPXv21LQcAAAA7XXt2rWalmNwEPzU6M/+7M9qWg4AAID2iqoEV0+FOPQXgp8ara+v17QcAAAA7RU1j2UvzW+J1iD4qVG5gXKUuwYAAOg80t4QheCnRocOHYpcR7lrAACAzqNAFaIQ/NRoZmYmcl0ul2tjSwAAABBm//79ocspUAWCnzqkUqnQ5WZG6hsAAECHffjDHw5dfunSJc7VBhzBTx2y2Wzo5FnOOVLfAAAAOmx5eTly3YkTJ9rYEnQbgp86pNPpyGohS0tLbW4NAAAAqlUuMEL/I/ipU1TqW9SMwgAAAAA6i+CnTtlsVsPDw9uWr6yskEsKAADQpZjodLAR/NQpnU7rlltu2bb8xo0bjPsBAADoUqdOnep0E9BBBD8NyOfzocsZ9wMAANCd0ul0p5uADiL4aQATaAEAAHSfqLHZyWSyzS1BtyH4aUA2m1U8Ht+yzMwiJ9YCAABA62WzWY2MjGxb/thjjzE2e8AR/DQgnU7r4MGDW+b8cc7p/vvv540FAADQIel0WqOjo9uWr62tMTZ7wBH8NOjixYvb5vxZXV3V8ePHO9QiAAAARI3NzuVybW4JugnBT4Oiihvk83l6fwAAADokFovVtByDgeCnQeWKG9CtCgAA0Bnr6+s1LcdgIPhpUDabjVzXDSWvPc/T+Pi4ksmkxsfHy/ZG1bItAABAN4uq+Ba1HIPBSserdLO9e/e6y5cvd7oZ2+zZs0fLy8vblqdSKS0sLDT9/jzP0/T0tJaWljQ2Nqb9+/fr4sWLWlpa0s6dO2Vmyufz2rlzp1ZWVnTjxo3NfePxuE6fPi1J227j/vvv1+rq6pZtDx48uHnbY2Njymaz1McHAABdz/M8HTt2bMt50MjIiM6cOcO5TP+zyBUEP43LZDKan58PXReLxXTo0CHNzMw0dB9BwJPL5WRm24os1CKRSOjxxx/fEuhE3WbY8mQyqZMnT/LBAQAAupbnebrrrru0tra2uWx4eFhnz57lHKb/Efy00vj4eMXKIfv27dOFCxeqvs3i3p2wHpxOC3qQ+PAAAADdKOr8rFWZOegqkcEPY36aoJqxPZcuXVImk6nq9jzP09TUlHK5nJxzyufzXRX4SH45bwo6AACAbhV1ftYNY7LROQQ/TVCu4lux8+fPbysi4Hmedu/erUQioUQioWc84xmanJzckpLWTPF4XMlkMnRd8WStYf+XyuVyFEYAAABdKer8rNrzNvQngp8mKFfxrZhzTpOTk5uBTiqV0tGjR7dMwrWxsdHUtg0PDyuZTMrMlEqldPr0aZ08eVLxeHzLdvF4XIcPH1Yqldrc9vDhw9u2K5XL5TQ5OVl1rxYAAEA7ZLPZbecxZqb9+/d3qEXoBoz5aZJEItHW+wsKEaRSqchqb+Wqs5VWjCu33fHjxyNnSS42NzfHGCAAANA1MpmMzp8/v6V4E+OWBwIFD1qt1cHP8PCwbrnllopBTasUV5uLkkgkdOXKlba1CQAAoByKHgwsCh60WtQ4mmZIpVI6e/asFhcXtby8rIWFhbZfrUin0xU/JPL5POlvAACga1D0AKUIfprk5MmTGhkZ2bZ8dHS07tuMx+Oam5vrSLATpVKQF1bUAQAAoBMoeoBSBD9Nkk6ndebMmS0FA+bm5pTL5TQ3N6fh4eHQ/WKx2JYAaWjIPyRBcYJuCXoCJ0+eVCwWi1zvnKMENgAA6AoUPUApxvy0SVjhgGQyqZMnT3ZdgFOJ53m68847IyvTmZmWl5fb3CoAAIDtKHowkCh4gObyPE9HjhxR1OsnlUq1vSgDAABAKYoeDCQKHqC50um0Dh8+HDkRai6X05EjRyiAAAAAOiqqUm25CrboXwQ/qNvMzIzOnTunVCoVut45RwEEAADQUVFjlcuNYUb/IvhBQ4IS2FE9QM45HT16tOkBUCaT0a5du5RIJLRr1y56mAAAQKj19fWalqO/EfygKcqVjFxfX9ddd93VtAAok8lofn5+80NrfX1d8/PzBEAAAGCbqGk6WjlHI7oXwQ+aIpvNRvb+SNLa2pqOHz/e8P14nqf5+fnQdefPn2/49gEAQH954oknQpf3UtEvNA/BD5qiUgEESVvKfNcqk8komUxqcnIychvnnMbHxxljBAAAJPkXTVdWVkLXXbt2rb2NQVeoOvgxs5iZfc7M/qjw/9vNbMnMPl/4eVXEfneb2V+b2RfM7ANmdnNhedLM/sTMvlT4nWjOQ0KnBAUQyqknNe3AgQOan5+v6gpNLpfT1NQUARAAANCJEyci15VL2Uf/qqXnZ0rSF0uWvcc5d3vh5yOlO5jZmKRflLTXOfd8STFJbyisPiHpY865H5T0scL/6HHpdLpsDu38/Lz27NlTdXDieZ4uXbpUUxtWV1c1PT1d0z4AAKC/eJ5XdtL1bDbbxtagW1QV/JhZStKrJf1GHfdxk6S4md0kaYekrxeWv1bSbxb+/k1JB+q4bXShkydPll2/vLxcdQGEcldsyllaWqprPwAA0B/KXQhNJBJMxD6gqu35uUfSL0naKFl+zMweMLPzYWlrzrklSTOSvirpYUnfcs59tLD6e5xzDxe2e1jSM+toP7pQpd4fqfoCCOWu2JTD+B8AAAZbuUlMT5061caWoJtUDH7M7A5J33DOfaZk1aykPZJulx/YvDtk34T8Hp7vl/RsSaNm9uZaGmhmk2Z22cwuP/roo7Xsig46efJk2eIHkl8AoZHgZGhoSBMTE4rH46HrGf8DAMBg8jwv8jyEXp/BVk3Pz09Keo2ZPSTpg5Jebmbvd8494pxbd85tSHqvpBeG7PvTkr7snHvUObcm6UOSXlxY94iZ3SZJhd/fCLtz59ycc26vc27vrbfeWtODQ+dUU/1NUsXgJJGIroOxseF3RJ4+fVqpVCp0G8b/AAAweKanp0MLJZkZvT4DrmLw45x7m3Mu5Zx7rvxiBR93zr05CFwKXifpCyG7f1XST5jZDvPPgl+hJ4sm/KGktxT+foukP6jzMaBLBdXfhoaiX2aVgpNKH1Dz8/NKp9NaWFiIDLRyuRy9PwAADJColDfnHL0+A66ReX7eaWYLZvaApJdJuluSzOzZZvYRSXLOfVrS70n6rKSFwv3NFfY/KemVZvYlSa8s/I8+k06nde+992pkZCRym3LBSTqdLtv7I2lz33IlK0l/AwBgcMRisZqWY3BYL81uu3fvXnf58uVONwN18DxPR48e1fr6euj6eDyu06dPh16NyWQymp+fj7ztVCqlhYUFeZ6nqakpra6ult0OAAD0t3IXThuZdB09I3LcRSM9P0DV0um0ZmdnI4sThKW/eZ6n3bt3lw18pCfLWqfTaZ0+fbridgAAoL9FjQWOWo7BQfCDtqkUnATpb5lMRslkUpOTk1VdnSlOd0un05EfbMzkDADAYNi/f39NyzE4CH7QVuWCE0manJzU/Px8aIWWMPF4fNsMzdlsdlsPk5kpl8sx9w8AAAPg4sWLNS3H4CD4QduFBSf1SKVSoeOEgh6mIMgys81girl/AADof1Gp7uUmPsVgIPhB21VKf6skHo9rbm5OCwsLkeUqg/LXqVRqWy8Sc/8AANDfolLdzYwLoAOO4AcdUSn9LUoymYysChcm6soPxQ8AAOhf2Ww2dP4/5xwXQAccwQ86pnSsTiVzc3NaXFysaXKyqCs/zjnG/wAA0KfS6XTk+GEugA42gh90TDqdDr0qEyaVStU1I3O58UWM/wEAoH9R/RVhCH7QUYcPH664zcjISM29RIHS4gelGP8DAEB/iroA+tSnPrUDrUG3sGpLCneDvXv3usuXL3e6GWiyF73oRXrwwQdD1yWTSZ08ebKuXp+w2wp7vZuZlpeXG759AADQXaLOMfbt26cLFy60v0Fol8jUInp+0HGf+tSnNDExoVgsJkmKxWKamJhQPp+veYxPOVHd3HR/AwDQn6Iurl66dKnNLUG3IPhBV5iZmdHVq1eVz+d19epVzczMNP0+mPwUAABgsBH8YGAw+SkAAMBgY8wPBtL4+HjoLM+pVEoLCwsdaBEAAGi2RCIRuS6fz7exJWgzxvwAxZj8FACA/rdv377IdWR7DCaCHwykqCIHQ0NDSiaTjAECAKAPXLhwQcPDw6HrmOpiMBH8YCBF1f5fX1+Xc44xQAAA9Invfve7ocvJ9hhMBD8YSMXFD8xss8x2MSZABQCg9zHVBYoR/GBgpdNpLSwsaHl5WRsbG6HbcFUIAIDels1mNTIysmXZyMiIstlsh1qETiL4AcRVIQAA+llpdeNeqnaM5iL4AcQEqAAA9Kvp6Wmtra1tWba2tkZq+4Ai+AHEBKgAAPQrprdAMYIfoCAYA5RKpbZ1h1P8AACA3hSVwl5uAlT0L4IfoARXiAAA6B9hBQ8k6bHHHiOrYwAR/AAlKH4AAED/SKfTGh0d3baccT+DieAHKEHxAwAA+su1a9dCl5PVMXgIfoASFD8AAKC/MO4HAYIfIATFDwAA6B+M+0HAemmSp71797rLly93uhkYIMlkMnQiNDPT8vJyB1oEAADqsXv3buXz+W3LU6mUFhYWOtAitJBFraDnBygjqpvcOcf4HwAAekivj/vxPE/j4+NKJpOcgzSA4AcoI6z4QYDxPwAA9I5eGPdTHODs2bNHu3fv3vz7zjvvVC6Xk3NOuVxOR48e3VwfBENhAVLpskwmM9BBFGlvQAWe52l6elq5XC50Pd3lAAB0P8/zdOzYMd24cWPL8lgsptnZWaXT6YZvf3p6WktLSxobG9P+/fv1wQ9+UCsrK5vb7NixQ2984xt18eLFLdtdvHhRuVxuS5GlWo2MjMg5p7W1tbLLyhkdHdXIyIiuXbumsbExZbPZhp+XDolMeyP4AarE+B8AAHpbKpXaEowERkdHlcvltgUw2WxWkiou279/v+6//36trq629fG0SywW06FDhzQzM9PpplSL4Ado1Pj4eNnenx6+OgIAwEAol+I2MTGxLYCptjelkR6bXjIxMdErARDBD9Aoz/M0NTUVeVUnHo/r9OnTBEAAAHSpcsFPLBbT+vp6G1vTe2KxmK5evdrpZlSDam9Ao0onPy3F/D8AAPSuXg98RkZGNDw8XHFZI9bX13u+QALBD1CDYPJTs/ALCr1SLhMAgEFUqeenEVHnBvXeTjKZVCKRkJkplUppYmJCqVQq8v8zZ87o7NmzFZcF+9Wr1yvdkvYG1CFq/E+zKsYAAIDm8zxPR48e3dbLMzw8rH/2z/5Z3WN+4vG4Dh48uK2KWy3V3ooLKrTrPMLzPJ04cWKzcNPo6GhoQYhSPVDpljE/QDOVG//D2B8AALpX6Ql/IpHQqVOnlE6n66721k9Fj8oVeAr0QKVbgh+g2aKuHkk9cUUEAABgG8/zNDk5WXabHjjPoeAB0GzpdFobGxuh6xj7AwAAelE6ndZtt90WuT4ej2/2fvUigh+gAWNjY6HLnXMaHx/v6QGBAABg8LzoRS/Sww8/HLoulUr1fGo/wQ/QgGw2q3g8Hroul8v1fEUUAAAwODzP04MPPhi5fmFhoacDH4ngB2gIc/8AAIB+ceLEiU43oeUIfoAGMfcPAADoB11ewa0pCH6AJoka/xO1HAAAoFtUStPft29fm1rSWgQ/QJOEjf8ZHh7W9evXlUwmKYAAAAC6UjB/YZShoSFduHChfQ1qIYIfoEmKx/+YmRKJxOYkYM455XI5HTlyRJlMptNNBQAA2DQ9PR06cbvkX8i9995729yi1iH4AZooGP+zvLys0dFR3bhxY8t655zOnz9PDxAAAOga5cYnnz17tucrvBUj+AFaJOqDxDlHBTgAANAVPM/T0FB4SJBKpfoq8JEIfoCWKVfoIJfLMQYIAAB0VDDWZ319fdu6eDyubDbbgVa1FsEP0CLZbDay/LXkB0CTk5Pas2cPQRAAAGi7qLE+sVhMp0+f7rteH4ngB2iZdDqtw4cPlw2AJL+mPoUQAABAu0Wl6G9sbPRl4CMR/AAtNTMzo3PnzimVSpXdzjmn+fl5AiAAANAW5cb69PMchQQ/QIsFFeAqBUCSqAQHAABaLpPJ6MiRIwM11idA8AO0SdgkqKWoBAcAAFrJ8zzNz8/LObdtXT+P9QlY2APvVnv37nWXL1/udDOAunmep+PHjyufz0duE0yMCgAA0GypVEorKyuh6/roHCRywDU9P0AbpdNpXblyRRMTE5HbOOeUSCS0a9cuxgABAICmigp8pP4e6xO4qdMNAAbRzMyMJH+MT1Tv6/r6uubn57dsDwAAUK9K44r7eaxPgLQ3oIM8z9P09LSWlpYigyBJZdPkAAAAqjE+Pq5cLhe5vo/ON0h7A7pRUAmuT/JrAQBAF4ua12eQEPwAPWB8fJwS2AAAoG7l5vWRpEQi0cbWdE7VwY+Zxczsc2b2R4X/325mS2b2+cLPq0L2+aGi9Z83s2+b2VsL637EzD5lZgtm9l/M7GlNe1RADzKL7KFVLpfT1NQUARAAAKiZ53mampoKnddH8ktcnzp1qs2t6oxaen6mJH2xZNl7nHO3F34+UrqDc+5vgvWSfkzSdUkfLqz+DUknnHPjhWX/pubWA33k8OHDZdevrq4yBxAAAKjZ9PS0VldXQ9clk0nNzs729dw+xaoKfswsJenV8gOWer1C0qJz7iuF/39I0icLf/+JpH/cwG0DPW9mZkYTExOKxWKR2+RyOXp/AABATaLG+piZFhcXBybwkarv+blH0i9J2ihZfszMHjCz82ZWKVHwDZI+UPT/FyS9pvB3WtJzwnYys0kzu2xmlx999NEqmwv0ppmZGV29elWpVCpyG9LfAABALaLm7xmEeX1KVQx+zOwOSd9wzn2mZNWspD2Sbpf0sKR3l7mNEfmBTvEZ22FJd5nZZyTdIulG2L7OuTnn3F7n3N5bb721UnOBvpDNZhWPx0PXkf4GAACq5Xle6MSm8Xh8IOb1KVVNz89PSnqNmT0k6YOSXm5m73fOPeKcW3fObUh6r6QXlrmNfyjps865R4IFzrkHnXP/wDn3Y/J7hBbrfhRAn0mn0zp9+nTk+lwup2QySRU4AAAQKSh0UDp/TzKZ1OnTpwcq3S1QMfhxzr3NOZdyzj1Xfurax51zbzaz24o2e538NLYob9TWlDeZ2TMLv4ck/VtJ99bYdqCvpdPpsulvzjmqwAEAgEhRhQ527NgxkIGP1Ng8P+8slKl+QNLLJN0tSWb2bDPbrPxmZjskvVLSh0r2f6OZ/a2kByV9XdJ/bqAtQF8ql/4WIA0OAACEiSp0MMiTnZpzrtNtqNrevXvd5cuXO90MoK08z9P09LSWlpYU9X41My0vL7e5ZQAAoBsF5w65XC50fSqV0sLCQptb1VaRkyc20vMDoA3S6bQWFha0vLwcmQY3NDTEGCAAALA5zicq8BnUQgcBgh+gh0Slwa2vrzMGCAAAlJ3QNJVKDWyhgwBpb0CPKU6DGxoa0vr6+rZtBqA7GwAAhEgmk6Fp8gOWIk/aG9AvitPgNjZK5x32DfJARgAABpXneRoaCj+9H8QJTcMQ/AA9LOqDbOfOnRofH2ccEAAAAyIY6xOWETLo43yKEfwAPSxsDNDw8LBWVlaUy+UYBwQAwICIGusTi8UGfpxPMcb8AD2ueAzQ2NiYrl+/HprTyzggAAD6F2N9togc80PwA/QZPvwAABg84+PjoeWtB/TiJwUPgEERNQ6IuYAAAOhPnudpZWVl23LG+mxH8AP0GeYCAgBgcASFDvL5/JblyWSSsT4hSHsD+hBzAQEAMBhIdwvFmB9gUDEGCACA/sX3fCjG/ACDijFAAAD0r6jveSY1DUfwA/Q5xgABANC/wr7nKXQQjeAH6HPpdFqnT59WKpWSmSkWi23bZnV1VdPT0x1oHQAAqJXnedq9e7cSiYQmJyc3sznMTKlUikIHZTDmBxgwUbnBkj84MpgsNZvN8sEJAECX8TxPd911l9bW1rYsHxkZ0ZkzZ/ju9lHwAIAvqiqMmW0JiuLxOFeOAADoMnv27IksZDDgFd6KUfAAgC8sN7g08JFIhQMAoNt4nle2gtvS0lIbW9ObCH6AAVM6BiiVSkWmweVyOSrCAQDQJSpdlKTCW2UEP8AASqfTWlhY0PLyshYWFpRKpSK3pSIcAACd53leaNp6YGRkhApvVSD4ARBZDrsYaXAAAHSG53mampqKXD80NESxgyoR/ADYlgoXhTQ4AADab3p6Wqurq6Hr4vG47r33XgKfKhH8AJC0NRWONDgAALpDpXQ3KrPWhuAHwDakwQEA0Hme5+no0aOR61OpFIFPjQh+AGxDGhwAAJ134sQJra+vh64zMwoc1IFJTgFUFDUxajEmRQUAoHk8z9Pk5GTZbfL5fJta03OY5BRA/UiDAwCgfTzP07Fjx8puU258LqIR/ACoiDQ4tIrneRofH9983WQymS3/8zoCMIhOnDihGzdulN2GlLf6kPYGoGakwaEamUxG58+fV/H3zOjoqJ7ylKcon89r586dWllZKfsFPzw8rFtuuUX5fF5jY2PKZrO8pgD0vUQiUXb9xMSEZmZm2tSanhR5pZbgB0DNgsnWouYcCKRSKS0sLLSpVegmmUxG8/PzTb/dIKiW/HkvlpaWCIoA9J1KwQ9jfSpizA+A5qklDY4UpsFRnMLWisBH8seWHT9+XFNTU8rlctvmnSpNo+M1B6AXlQt+GOvTGHp+ADQsKg3OzLakPJEK17+q7Q1spUQioccff3xLG4LXYCqVoncIQM+I6j2PxWKanZ3ls6wy0t4AtE7YiW9p4BMgFa4/eJ63Je3s+vXrWl5e7nSzymL8EIBeEXVRMZFI6MqVKx1oUc+JDH5uamcrAPSn4ASy+GQ4qiDC0tJSO5uGBnmep7e+9a26fv365rKRkRFJ2ixUUKn4RTmlAcn+/ft18eJFLS0thRZEiMfjisfjdQVaa2trm/sFqXKSCIAAdJ2o78pr1661tyF9iJ4fAC1R7qrV6OgoA9V7gOd5uvPOO7WxsdG02yyu9lbN8S/tYQpKu5b2NNYbFNETCaAbRX2H8plVNdLeALRXWCrc8PCwzGzblXzGAXWP4mBjaGhI6+vrdd9WK49ttUFRNVKpFME4gK4STHJa/H05MjKiM2fO8BlVHaq9AWiv0opwqVRKt9xyy7Y5XVZXVzU9Pd2hVqJYELAGVdRqDXwSicSW493KoDadTmthYUHLy8taWFhQOp3e8pqTVLYSYcDMtlSNm5yc1J49e6gSB6DjSjsoeqnDopvR8wOgbZLJZOSHN1ffO6NZPT3d2INX/NjCxg9FFeUIJJNJnTx5sqseE4DBQNpbw+j5AdB5Y2NjoctLr74Hc7ag+Yrnwdm9e7eOHTtWV0+PmSmZTLall6dexb1DV65c0ZkzZ7b0TFW6+Le8vMxrEUBHRBU8oGhQ4+j5AdA2lMTurGbNxTM6Oqr3vOc9XRfs1CrqymopXosA2i3q8ymZTGpxcbEDLeo59PwA6LywcUBRF2ByudxmD8X4+DhX3xsQ9PZMTk7WHPjE43HNzc0pn89v/uRyuZ4PfCQpm80qHo9X3I7XIoB2y2azm9MKFHvsscf4DGoQPT8AOirq6lZpj1A3jinpZsF4l1wuV3FsS6lYLKaNjY2BGH/leZ6OHz+ufD4fuQ2vRQCdsHv37tDPJnqjq0KpawDdiVS45mskvW1QT+yjgiBeiwA6JapIkJnVNdHzgCHtDUB3qjUVjtSjcMWFDI4ePVp14DM8PNz1hQvaIZ1O68qVK5qbm6vqtcigYwCtFlUkKGo5qkPPD4CuU81A9EHtoQhTb09PKpXq+7S2RkW9FgcpNRBAZzDRaUPo+QHQO6oZiD7ok6PW29MjPVnEIJgcFNGiXovr6+uUZgfQckx02nwEPwC6TmkqXJRBTYMLenpqmZ8neB4HObWtHqWvxVgstm2b1dVVHT16dKBegwBab3p6Wmtra1uWra2tDfSFv2Yg7Q1A1yMN7snqbUtLSxoaGqoq4CE1q/miBiBL/f8aBNBeFDxoCGlvAHrXoKfB1dPTE4/HNTs7q+XlZdLbmqjcQON+fg0CaL9ynzf0NNeP4AdA1xv0NLjp6emqxvTEYrGBr9rWapUC8Vwu11evPQCdk81mQ1NtnXO68847+aypE2lvAHpONWlwkp8ycPLkyZ4MAorT3Kr5nCblqn08z9PRo0cje+A4FgCapVyqLfONlUXaG4D+UU0anCQtLy/3ZCWu0jS3KPT0dEY6ndbs7Gzka5D0NwDNUu47oJqLgNiO4AdAz6k2DU7qnUpctZauZkxPZwWvwSj9moIJoL3C0t4CQ0OcxteDZw1AT0qn01pYWNDy8rJSqVTZbdfX17u6B6iWggb09HSPdDpd9rXHPEAAauV5nsbGxpRIJJRIJMp+H2xsbLSxZf2D4AdAz+vVanBBb8/k5GRVBQ1SqRQ9PV2m2tfe8ePH29QiAL0qk8locnJS169fr3ofLqzUjuAHQM8LUpASiUTZ7bopFam4t6ca8Xhc2Wy2xa1CrapNwczn8x1/zQHoXp7n6fz58zXv120X9XoB1d4A9JVKlbgCna7IVU3FOiYp7S2e5+nIkSNUZgJQs2qrmJZiwtNIVHsDMBgqVeIKdCoNLkh1q/QlR0GD3jM9PV2xMhO9PwCkrUVu6g18pPIToSIcwQ+AvlPLpKjFXz6tPjGtNtWNgga9aWlpqeI2FD8AUFrkJpfLVaxcGsbMtH///ha0sL+R9gag70VdVTOzLVfqW50KV+nqXqdT8dCYaq/eJhIJXblypQ0tAtCN6unpGRoa0kte8hJ98pOfbOv3Vg8j7Q3A4AqryFUa+EjNT4WrJa2B3p7eV+3ku/l8XplMpg0tAtCNquklLnXvvfdqcXGx5d9bg6Dq4MfMYmb2OTP7o8L/bzezJTP7fOHnVSH7/FDR+s+b2bfN7K2Fdbeb2V8Ull82sxc27VEBQJHSNLhUKhU5NqOeL6UwtaQ1BAPhCXx6W/HrrJLz58+T/gYMkOKLYbVOTjo0NKR0Oh35/dSs761BUcuzPyXpiyXL3uOcu73w85HSHZxzfxOsl/Rjkq5L+nBh9TslvaOwLlv4HwBaonhS1IWFhcgT1KGhoYbGAJWbu8c5ty0AooR1fwleZ5U457haCwyIaiayLjfmJ5jMNKq4AUUPalNV8GNmKUmvlvQbDdzXKyQtOue+UvjfSXpa4e+nS/p6A7cNADWJSlFaX1/f7KmpdXB6NQUNnHNbeqBIdetPyWSy4jb1VncC0Fump6dDJ7KOxWIVsxEkbV6siypuQNGD2lRV8MDMfk/Sr0m6RVLGOXeHmb1d0iFJ35Z0WdK/ds7ly9zGeUmfdc6dKfz/w5Iuyh+QNCTpxUWBUfF+k5ImJel7v/d7f+wrX9m2CQDUxfM8TU9Pa2lpSUNDQ6FX42qZm6WaQazM9TIYPM/TsWPHdOPGjchtYrGYrl692sZWAeiEZDIZGtwUz9Gza9euyPnp5ubmlE6nI79j+F4JVX/BAzO7Q9I3nHOfKVk1K2mPpNslPSzp3WVuY0TSayQVX0I9Kulu59xzJN0taT5sX+fcnHNur3Nu76233lqpuQBQteJUuCCtoFQ15bBrmbuHFLfBkE6ndebMmbLjfypNxAugd1Uzxqc4Xa3c50GQHcCYn+aoJu3tJyW9xswekvRBSS83s/c75x5xzq075zYkvVdSuYIF/1B+r88jRcveIulDhb+9CvsDQEtF5Uyb2ZaiBaWpcMzdgyhBcF0uAGrH/FIA2quaMT6lF8OiPieKlzPmpzkqBj/Oubc551LOuedKeoOkjzvn3mxmtxVt9jpJXyhzM2+U9IGSZV+XtK/w98slfanqVgNAk9VbDjsqlzsQj8c1NzdHNbcBVq4Edj1jywB0t2rG+JReDIv6Dioez1PNNqiskXl+3mlmC2b2gKSXyU9dk5k928w2K7+Z2Q5Jr9STvTyBX5D0bjP7K0n/QYVxPQDQCbWUw87lckokEkokEszdg4oqlcBmng6gv0SloW1sbGxWHC39Xkin0zp48OCWqm/OOd1///2bF0eq2QaVVVXwoFvs3bvXXb58udPNADAg6pmFO8AAVISpZuAzgN5SXDxnbGxM169fD30/V/peqKagAUUPqlZ/wQMAGFTl0pXKobABokTl5jvnGP8D9KCwCa0fe+wxjYyMbNmumu+FagoaUPSgcQQ/ABChNBWuGqS6oRzG/wD9JWx8z9ramkZHR2ue062aggYUPWgcwQ8AlFFcDrtc1S7pybQDAh9EYfwP0F+ielyuXbu2+d1R7fdCNQUNooob7Nmzp4ZWDzaCHwCoUjab1fDwcOi6kZERUt1QlSCgjupNJH0F6G61zuFTraCgQTHnnH7rt35rs0f44sWLofteunSJXuMqEfwAQJXS6bTOnj2rRCKxZXkymdSZM2fo8UFNok6Odu7cWXFiXQCdUc8cPrX4wAdKZ4bx0+iOHz8uqfzFkbvvvruu+xw0BD8AUIN0Oq0rV64on89v/iwuLhL4oGZhKS7Dw8NaWVkpO7EugM6pZw6fanmep+vXr4euy+fzksr3KK2srCiTydR8v4OGUtcAAHRIs0rkAmiPVparrzS9Qj6fl+d5mpyMnhrTzHTu3DkuyJUpdU3wAwBAl2AeIKC7tPMCRWlKdbFkMqnFxUVJ2mxHFC6WSGKeHwAAuh/jgIDu0cw5fCo5cOBA2fUnT57c/Puee+4puy1FU8q7qdMNAAAAvmw2q6mpqS1jCoJxQEHOfzAOSBKpLUALRc3hk0gk9MxnPnOzNyibzTb0XsxkMrp06VLFtoT9HYY5f8oj7Q0AgC7COCCgO7QrDXXXrl2hVeNKxWIxDQ0NaW1tLXKbeDzORNs+0t4AAOgFxRPrLiwsbPb4lMrlcqTBAU3Wqjl8yqkm8Am2Kxf4NFJpbpCQ9gYAQBcbGxuLrABVXA5bIg0OaEQwxidIdWv2HD5RYrFY1QFQFDOjJ7hK9PwAANDFwuYDKrW6ulpxHACA8lo5h085hw4davg2emkYS6cR/AAA0MXS6bROnz6tVCols8g0di0tLW1J2SEdDqhNVJW0jY2NzTTUVvSuzszMaGJiQrFYTJI2f7dCJpPRrl27lEgktGvXrs1JUWtd3ssoeAAAQA+JmggxkUjo8ccf33LlmsHPQLRuLi5Sbs6fciYmJjQzM6NMJqP77rtP6+vrisVim71L8/Pz2/Z53vOepwcffLDq5U9/+tP1ne98Z8ttz8zM1NXeFmKSUwAA+kHpuATJD3Li8XjkiVs2m91yktdoaV6g14W9j4aHh2VmunHjxuayTl1ASKVSWllZqWvfqKDFzFqWHhcEXV2E4AcAgH5ResU6m83qyJEjkSc28XicHiGgSLke1NHR0Y5fKPA8T5OTk22/33rFYjFdvXq1080oRvADAEA/izqZi6okRY8QBlm75vBpxIEDBypOftpNosrydwjz/AAA0M/CqsLF4/HIErpBiexcLrelZLbneRROQN8pfU1Hjalp9hw+jbhw4YL27dvX8vt53vOeV9PyXkfwAwBAHyitCheU5U2lUqHbx2KxbWV9V1dXdfz48cigCOhFwfie4tf0Y489ppGRkS3btWIOn0ZduHBBc3NzW4K1ZDKp2267LXKfqKBlYmJiW1W5iYkJfepTn4pc3o8BEGlvAAD0sagCCWHzmZQTVLwKG29Eqhy6WbeP76nXi170om2FDcpVe6u3IEEmkwmtEldsaGhI3/zmN+u6/RZhzA8AAIMqLGCZnp4OPSGMYmY6d+5caCB1+vRpSSIoQlfqhfE93aya4gtDQ0O69957u+k9T/ADAACeVE/JbEnMMYSeUBzwDw0NRRb9aPf8Pb0oquesVJc9nxQ8AAAAT4oaI3Ty5MnQwgnZbFZLS0uht5XP50PHD01PT0vaPtic8UNopdIxPmGBTzeO7+lW1fYQ19KT3En0/AAAgC2ixvVUewU4UClVjl4htEK5su8bGxukZdZo165dkVUjiwXv9y55Xkl7AwAAjWlmqhzzDKFVGOPTXFFlwcN0UeobaW8AAKAxzUyVKzfPkESqHKrXi3P49ArP8zZLYFcjl8t1/XuVnh8AANCwWlPlYrFY5CD0bDZLqhyqkslkdP78+S09PcPDwzIz3bhxY3MZr5/ahfX0BswstHdN6prnmrQ3AADQfrXOM2RmGhsbY8wGKvI8T0eOHAk9Ce/1OXy6QbkLF4cOHdL73ve+LQFmsS5IfyP4AQAAnVHLPEOpVEpLS0uRV5UD8XhcBw8e1MWLFznBHTDB66lc8Q3G9zQuKn0weG53796tfD5fdpsOigx+bmpnKwAAwOBJp9OhQUlYj1C1E7Curq5uSXcKxgwF94f+VC4VqxjjexqTyWQi1wXP7bVr1ypu040oeAAAANouqnhCOp1WNpvdVkAhTGnvUDC3EMUS+k9wTCcnJysGPmbGHD4N8DxP8/PzketXVlaUTCY1NBQeRnT780/aGwAA6DrFqXJDQ0NVzTMSKB1T1CUDsFGnant7JP/E+/Dhw5qZmWlDy/pTuXS2Srro+WfMDwAA6E1hJ79R1aaiqsgxAL53VTu5blApkOPamFrm9ZG6thAJY34AAEBvCk6miosm7N+/X/fff3/VVeTy+fzm1WzGB3W/4p6/aopf0LPXORsbG50ublATxvwAAICul06ntbCwoOXlZS0sLGhmZiZ0zFAqlarq9lZXV3X06FHGBXWhoKcvmAC3nOKxYmiOZDJZ0/bdXNwgDGlvAACgb9QyPqQYvQfdo5o0N45X63iep2PHjkXO4VOsi49DZNobPT8AAKBvhFWRq+ZKNpXiOi947ivN30NvT2ul02mdOXOm4na9ehzo+QEAAH2tlt4gKsV1RjXHKJVKaWFhoY2tGmzlAtFkMqnFxcU2t6gm9PwAAIDBVNobFIvFQreLxWLbTr5XV1d1/PhxeoOarLSH7cSJE2UDn2ACXLRPuee7lwoclKLnBwAADJSwXoZyleJK0RvUmFrHZVHCunPKlb2udy6gNqHnBwAAQAofF1RrpTh6g2pT3NNz9OjRmgKfhYUFAp8OKRf8ZDKZNrakeZjnBwAADJx0Oh16Ql1tjwTzBlWvtKcnbBLaMKS6dd6pU6d01113aW1tbdu6+fl5SdLMzEy7m9UQen4AAABUf6U4iWpx5UxPT1cVUCYSiW29cQST7ZfJZLRr1y4lEgkdPXpUL37xiyO3ve+++9rXsCZhzA8AAECEWsenDHq1OM/zND09raWlJY2NjSmbzerIkSMVJysdtOepW2Uymc0enWp16difyDE/BD8AAABllJ7QX79+PbTaVSwWC03p6ucSzcXPzc6dO7WysrJlcsx4PK54PB75fG1sbGwGSQQ+nbdr166q0xIl/xhevXq1hS2qGwUPAAAA6pFOp7WwsKDl5WUtLCzo5MmTisfjW7aJx+ORJ41LS0t9mQ4X9Irlcjk555TP57cEPpKfDuicC32+ZmdnN59TAp/uUEvgI0mHDh1qTUNaiOAHAACgBrVWi9u5c+eWICEokNArAVAQuCUSic2xINXMzRO4du1a6PNFwNN9ys2BNTExsbk++L/Xih1IpL0BAAA0RdT8QUNDQ1pZWdm2fS+kwx04cECXLl1q6DZ64XHCFzXmpwcDHdLeAAAAWimsR+jgwYOhgY/kl8ju5hS4TCbTcOBDuereMjMz0zc9PFHo+QEAAGiR8fFx5XK5stsMDw9rZGRkM0hKJpM6efJkx9PCah38LvmP5ZZbblE+n6eQATqJnh8AAIB2W1paqrjN2tralt6h5eVlTU5Obo6taVfPUHFRhrGxsaoCn9K5ec6ePavFxUUKGaBr0fMDAADQItX0/FRiZnLOKZVKbaaQFZfe3r9/vy5evFj3/8Ft1jKfkcTcPOhqzPMDAADQbrVOklrJ8PCwzGxbSelGlJuLJ0oQiBH4oEtFBj83tbMVAAAAgyQIDspNBFqLtbW1ZjZPkj8XT63BGdXb0KsY8wMAANBCxZOkXrlyRWfOnNkcJ5NIJCLnVulWiUSi000A6kbwAwAA0EalwdDs7GzHA4pEIiGzyEyhTbFYTKdOnWpDi4DWIPgBAADooHQ6rStXriifzyufz2tubk6pVEqStgUkQVnsZjIznTp1SocPHy4bACWTSc3OzjLOBz2N4AcAAKCLBD1D+Xxe586d21ZKujhtLpVKaWJioqr/pe3BlJnp8OHDSqfTmpmZ2XZ/c3Nzm0HZ4uIigQ96HtXeAAAABoTneVvKZFOxDX2q8VLXZhaTdFnSknPuDjN7u6RfkPRoYZNfds59pGSfH5L0O0WLdkvKOufuMbPfkfRDheU7JV1zzt1erg0EPwAAAAAqaEqp6ylJX5T0tKJl73HOzUTt4Jz7G0m3S5vB05KkDxfW/dxm68zeLelbNbQFAAAAAGpS1ZgfM0tJerWk32jgvl4hadE595WS2zZJPyvpAw3cNgAAAACUVW3Bg3sk/ZKkjZLlx8zsATM7b2aVajS+QeEBzkskPeKc+1LYTmY2aWaXzezyo48+GrYJAAAAAFRUMfgxszskfcM595mSVbOS9shPa3tY0rvL3MaIpNdI8kJWv1Flen2cc3POub3Oub233nprpeYCAAAAQKhqxvz8pKTXmNmrJN0s6Wlm9n7n3JuDDczsvZL+qMxt/ENJn3XOPVK80MxukvR6ST9Wc8sBAAAAoAYVe36cc29zzqWcc8+Vn7r2cefcm83stqLNXifpC2VuJqp356clPeicy9XQZgAAAACoWSOTnL7TzBbM7AFJL5N0tySZ2bPNbLPktZntkPRKSR8KuY2ocUAAAAAA0FRMcgoAAACgn0TO89NIzw8AAAAA9AyCHwAAAAADgeAHAAAAwEAg+AEAAAAwEAh+AAAAAAwEgh8AAAAAA4HgBwAAAMBA6Kl5fszsUUlfqWPXXZKuNrk5aB6OT/fjGHU3jk934/h0P45Rd+P4dLduPD5XnXM/E7aip4KfepnZZefc3k63A+E4Pt2PY9TdOD7djePT/ThG3Y3j09167fiQ9gYAAABgIBD8AAAAABgIgxL8zHW6ASiL49P9OEbdjePT3Tg+3Y9j1N04Pt2tp47PQIz5AQAAAIBB6fkBAAAAMOB6Lvgxs/Nm9g0z+0LRsreb2ZKZfb7w86qIfe82s782sy+Y2QfM7ObC8neZ2YNm9oCZfdjMdrbp4fSdVhyfovUZM3NmtqvVj6Nfter4mNm/NLO/Kax/ZzseS79q0Wfc7Wb2F4V9L5vZC9v1ePpNg8dnqnBs/trM3lq0PGlmf2JmXyr8TrThofSlFh0fzhGaqBXHqGg95wkNatXx6abzhJ4LfiTdJymsbvd7nHO3F34+UrrSzMYk/aKkvc6550uKSXpDYfWfSHq+c+4Fkv5W0tta0vLBcJ+af3xkZs+R9EpJX21JqwfHfWry8TGzl0l6raQXOOf+jqSZVjV+QNyn5r+H3inpHc652yVlC/+jPvepvuPzfEm/IOmFkn5E0h1m9oOF1Sckfcw594OSPlb4H/W5T80/PpwjNNd9av4x4jyhee5Tk49Pt50n9Fzw45z7pKTlOne/SVLczG6StEPS1wu3+VHn3HcL2/yFpFTDDR1QrTg+Be+R9EuSGKTWgBYdn6OSTjrnnijcxzcabugAa9ExcpKeVvj76dr63kINGjg+PyzpL5xz1wvfN5ckva6w7rWSfrPw929KOtBoOwdVK44P5wjN1aL3kMR5QlO06Ph01XlCzwU/ZRwrdEmfD0sZcM4tyY80vyrpYUnfcs59NOR2Dkv6b61t6kCq+/iY2WskLTnn/qqtLR4sjbx//g9JLzGzT5vZJTP78fY1e6A0cozeKuldZva1wjZcuW6+ssdH0hck/ZSZPcPMdkh6laTnFNZ9j3PuYUkq/H5me5o8UBo5PsU4R2iduo8R5wlt0ch7qKvOE/ol+JmVtEfS7fK/9N9dukHhQL1W0vdLerakUTN7c8k2vyLpu5J+u8XtHTR1H5/CG+hX5KfqoDUaff/cJCkh6Sck/RtJv2tm1vpmD5RGj9FRSXc7554j6W5J821o8yCpeHycc1+UdEp+CtUfS/or+d83aL2mHB/OEVqq7mPEeUJbNPoe6qrzhL4Ifpxzjzjn1p1zG5LeKz/fsNRPS/qyc+5R59yapA9JenGw0szeIukOSW9y1P9uqgaPzx75J3N/ZWYPyU83+KyZPas9re9/TXj/5CR9yPn+UtKGJAabNlETjtFbCv9LkhexP+pU5fGRc27eOfejzrmfkp9W8qXCqkfM7DZJKvwmdbSJmnB8OEdosQaPEecJLdaE91BXnSf0RfATfGkUvE5+11upr0r6CTPbUYg2XyHpi4X9f0bScUmvcc5db3V7B00jx8c5t+Cce6Zz7rnOuefKfwP9qHPuf7e84QOi0fePpAuSXl64rf9D0oikqy1r8ABqwjH6uqR9hb9frqKTOjSuyuMjM3tm4ff3Snq9pA8UVv2h/ABVhd9/0JqWDqZGjw/nCK3XyDHiPKH1mvAZd0HddJ7gnOupH/lP5MOS1uS/wCckvU/SgqQH5H+J3FbY9tmSPlK07zskPSj/oL1P0lMKy/+XpK9J+nzh595OP85e/WnF8Sm5/Yck7er04+zVnxa9f0Ykvb+w/LOSXt7px9nLPy06Rn9f0mfkpyF8WtKPdfpx9upPg8fnTyX9z8JxeEXR8mfIr/L2pcLvZKcfZ6/+tOj4cI7Q5ceo5PY5T+iy49Nt5wlWaBQAAAAA9LW+SHsDAAAAgEoIfgAAAAAMBIIfAAAAAAOB4AcAAADAQCD4AQAAADAQCH4AAAAADASCHwAAAAADgeAHAAAAwED4/wFK09NR+Mq9SQAAAABJRU5ErkJggg==\n",
493 | "text/plain": [
494 | ""
495 | ]
496 | },
497 | "metadata": {
498 | "needs_background": "light"
499 | },
500 | "output_type": "display_data"
501 | }
502 | ],
503 | "source": [
504 | "plt.figure(figsize=(14, 8))\n",
505 | "plt.scatter(route_df['longitude'], route_df['latitude'], color='#101010')\n",
506 | "plt.title('Route latitude and longitude points', size=20);"
507 | ]
508 | },
509 | {
510 | "cell_type": "markdown",
511 | "id": "5f91006b-b7f5-4c28-9c46-10482c8871a7",
512 | "metadata": {},
513 | "source": [
514 | "- You'll see in the following notebook how to visualize the route on a map with Folium"
515 | ]
516 | }
517 | ],
518 | "metadata": {
519 | "kernelspec": {
520 | "display_name": "Python 3 (ipykernel)",
521 | "language": "python",
522 | "name": "python3"
523 | },
524 | "language_info": {
525 | "codemirror_mode": {
526 | "name": "ipython",
527 | "version": 3
528 | },
529 | "file_extension": ".py",
530 | "mimetype": "text/x-python",
531 | "name": "python",
532 | "nbconvert_exporter": "python",
533 | "pygments_lexer": "ipython3",
534 | "version": "3.9.4"
535 | }
536 | },
537 | "nbformat": 4,
538 | "nbformat_minor": 5
539 | }
540 |
--------------------------------------------------------------------------------
/003_Elevation_and_Distance_Between_Points.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "79181b70-9da9-4726-af5e-d5b9769eab9d",
6 | "metadata": {},
7 | "source": [
8 | "# Data Science for Cycling #3 - How To Calculate Elevation Difference and Distance From a GPX Route File\n",
9 | "- Noteook 3/6\n",
10 | "- Make sure to have the `haversine` package installed\n",
11 | "\n",
12 | " pip install haversine\n",
13 | " \n",
14 | "- Let's import the libraries and tweak Matplotlib's default stylings:"
15 | ]
16 | },
17 | {
18 | "cell_type": "code",
19 | "execution_count": 1,
20 | "id": "1f87a665-8046-4cfe-ae98-7e32fcf8e7e1",
21 | "metadata": {},
22 | "outputs": [],
23 | "source": [
24 | "import numpy as np\n",
25 | "import pandas as pd\n",
26 | "import matplotlib.pyplot as plt\n",
27 | "import haversine as hs\n",
28 | "\n",
29 | "plt.rcParams['figure.figsize'] = (16, 6)\n",
30 | "plt.rcParams['axes.spines.top'] = False\n",
31 | "plt.rcParams['axes.spines.right'] = False"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "id": "43fa1bdf-f1c7-4015-b372-b880d364271e",
37 | "metadata": {},
38 | "source": [
39 | "- Let's read in the dataset\n",
40 | "- We've saved it to a CSV file in the first notebook:"
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": 2,
46 | "id": "d4f7f190-46ba-44bc-8566-7a9a1bfe69e4",
47 | "metadata": {},
48 | "outputs": [
49 | {
50 | "data": {
51 | "text/html": [
52 | "\n",
53 | "\n",
66 | "
\n",
67 | " \n",
68 | " \n",
69 | " | \n",
70 | " latitude | \n",
71 | " longitude | \n",
72 | " elevation | \n",
73 | "
\n",
74 | " \n",
75 | " \n",
76 | " \n",
77 | " 0 | \n",
78 | " 45.772480 | \n",
79 | " 15.958040 | \n",
80 | " 113.96 | \n",
81 | "
\n",
82 | " \n",
83 | " 1 | \n",
84 | " 45.772770 | \n",
85 | " 15.959090 | \n",
86 | " 115.82 | \n",
87 | "
\n",
88 | " \n",
89 | " 2 | \n",
90 | " 45.773270 | \n",
91 | " 15.958795 | \n",
92 | " 116.15 | \n",
93 | "
\n",
94 | " \n",
95 | " 3 | \n",
96 | " 45.773770 | \n",
97 | " 15.958500 | \n",
98 | " 116.12 | \n",
99 | "
\n",
100 | " \n",
101 | " 4 | \n",
102 | " 45.774235 | \n",
103 | " 15.959335 | \n",
104 | " 115.98 | \n",
105 | "
\n",
106 | " \n",
107 | "
\n",
108 | "
"
109 | ],
110 | "text/plain": [
111 | " latitude longitude elevation\n",
112 | "0 45.772480 15.958040 113.96\n",
113 | "1 45.772770 15.959090 115.82\n",
114 | "2 45.773270 15.958795 116.15\n",
115 | "3 45.773770 15.958500 116.12\n",
116 | "4 45.774235 15.959335 115.98"
117 | ]
118 | },
119 | "execution_count": 2,
120 | "metadata": {},
121 | "output_type": "execute_result"
122 | }
123 | ],
124 | "source": [
125 | "route_df = pd.read_csv('../data/route_df.csv')\n",
126 | "route_df.head()"
127 | ]
128 | },
129 | {
130 | "cell_type": "markdown",
131 | "id": "9df4ae0b-268e-4923-8b10-3150b33c0b8a",
132 | "metadata": {},
133 | "source": [
134 | "
\n",
135 | "\n",
136 | "## Calculate elevation difference\n",
137 | "- Put simply, you can use Python's `diff()` function to difference a column\n",
138 | "- If you apply it to the Elevation column, you get the elevation difference between point T+1 and T\n",
139 | "- The first differenced value will be Null, as there's no data point before it:"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 3,
145 | "id": "70b6b1db-27bd-4f46-ab85-18f049a87c96",
146 | "metadata": {},
147 | "outputs": [
148 | {
149 | "data": {
150 | "text/html": [
151 | "\n",
152 | "\n",
165 | "
\n",
166 | " \n",
167 | " \n",
168 | " | \n",
169 | " latitude | \n",
170 | " longitude | \n",
171 | " elevation | \n",
172 | " elevation_diff | \n",
173 | "
\n",
174 | " \n",
175 | " \n",
176 | " \n",
177 | " 0 | \n",
178 | " 45.772480 | \n",
179 | " 15.958040 | \n",
180 | " 113.96 | \n",
181 | " NaN | \n",
182 | "
\n",
183 | " \n",
184 | " 1 | \n",
185 | " 45.772770 | \n",
186 | " 15.959090 | \n",
187 | " 115.82 | \n",
188 | " 1.86 | \n",
189 | "
\n",
190 | " \n",
191 | " 2 | \n",
192 | " 45.773270 | \n",
193 | " 15.958795 | \n",
194 | " 116.15 | \n",
195 | " 0.33 | \n",
196 | "
\n",
197 | " \n",
198 | " 3 | \n",
199 | " 45.773770 | \n",
200 | " 15.958500 | \n",
201 | " 116.12 | \n",
202 | " -0.03 | \n",
203 | "
\n",
204 | " \n",
205 | " 4 | \n",
206 | " 45.774235 | \n",
207 | " 15.959335 | \n",
208 | " 115.98 | \n",
209 | " -0.14 | \n",
210 | "
\n",
211 | " \n",
212 | "
\n",
213 | "
"
214 | ],
215 | "text/plain": [
216 | " latitude longitude elevation elevation_diff\n",
217 | "0 45.772480 15.958040 113.96 NaN\n",
218 | "1 45.772770 15.959090 115.82 1.86\n",
219 | "2 45.773270 15.958795 116.15 0.33\n",
220 | "3 45.773770 15.958500 116.12 -0.03\n",
221 | "4 45.774235 15.959335 115.98 -0.14"
222 | ]
223 | },
224 | "execution_count": 3,
225 | "metadata": {},
226 | "output_type": "execute_result"
227 | }
228 | ],
229 | "source": [
230 | "route_df['elevation_diff'] = route_df['elevation'].diff()\n",
231 | "\n",
232 | "route_df.head()"
233 | ]
234 | },
235 | {
236 | "cell_type": "markdown",
237 | "id": "c9aacdce-adad-4e02-be5e-af529a9f7ae6",
238 | "metadata": {},
239 | "source": [
240 | "
\n",
241 | "\n",
242 | "## Calculate distance between geolocations\n",
243 | "- Calculating distance is tricky in this case\n",
244 | "- It's best to use Google's API\n",
245 | " - But it's not free\n",
246 | " - And applies to road, which is limiting for let's say mountain bike trails\n",
247 | "- The best free option is to use **haversine distance**\n",
248 | " - It calculates a great circle distance between two points on a sphere given their latitudes and longitudes\n",
249 | " - Learn more: https://en.wikipedia.org/wiki/Haversine_formula\n",
250 | "- The GPX route measures 36,4 kilometers and has 835 data points\n",
251 | " - Which means there's on average 43,6 meters between two points\n",
252 | " - Haversine distance will be off, but hopefully not much\n",
253 | "- Let's first define a function to calculate haversine distance:"
254 | ]
255 | },
256 | {
257 | "cell_type": "code",
258 | "execution_count": 4,
259 | "id": "cc860cc9-7b65-4952-ad30-73ec73e8eef2",
260 | "metadata": {
261 | "tags": []
262 | },
263 | "outputs": [],
264 | "source": [
265 | "def haversine_distance(lat1, lon1, lat2, lon2) -> float:\n",
266 | " distance = hs.haversine(\n",
267 | " point1=(lat1, lon1),\n",
268 | " point2=(lat2, lon2),\n",
269 | " unit=hs.Unit.METERS\n",
270 | " )\n",
271 | " return np.round(distance, 2)"
272 | ]
273 | },
274 | {
275 | "cell_type": "markdown",
276 | "id": "50eda61d-be83-43ae-9ec3-2966d2f161ca",
277 | "metadata": {},
278 | "source": [
279 | "- Let's test it\n",
280 | "- The example below measures the distance between the first and the second point:"
281 | ]
282 | },
283 | {
284 | "cell_type": "code",
285 | "execution_count": 5,
286 | "id": "8c794c26-ede1-49cb-8106-93cdb46d3e9f",
287 | "metadata": {},
288 | "outputs": [
289 | {
290 | "data": {
291 | "text/plain": [
292 | "87.59"
293 | ]
294 | },
295 | "execution_count": 5,
296 | "metadata": {},
297 | "output_type": "execute_result"
298 | }
299 | ],
300 | "source": [
301 | "haversine_distance(\n",
302 | " lat1=route_df.iloc[0]['latitude'],\n",
303 | " lon1=route_df.iloc[0]['longitude'],\n",
304 | " lat2=route_df.iloc[1]['latitude'],\n",
305 | " lon2=route_df.iloc[1]['longitude']\n",
306 | ")"
307 | ]
308 | },
309 | {
310 | "cell_type": "markdown",
311 | "id": "e8023c63-73f3-41db-9f2d-fdaabaf531b9",
312 | "metadata": {},
313 | "source": [
314 | "- It's 87,59 meters, but we can't verify it through Strava\n",
315 | "- Let's calculate the distances between all data points\n",
316 | " - We have to skip the first row as there's no data point before it:"
317 | ]
318 | },
319 | {
320 | "cell_type": "code",
321 | "execution_count": 6,
322 | "id": "90284425-1392-439f-96b0-992eb9728bf2",
323 | "metadata": {},
324 | "outputs": [
325 | {
326 | "data": {
327 | "text/html": [
328 | "\n",
329 | "\n",
342 | "
\n",
343 | " \n",
344 | " \n",
345 | " | \n",
346 | " latitude | \n",
347 | " longitude | \n",
348 | " elevation | \n",
349 | " elevation_diff | \n",
350 | " distance | \n",
351 | "
\n",
352 | " \n",
353 | " \n",
354 | " \n",
355 | " 0 | \n",
356 | " 45.772480 | \n",
357 | " 15.958040 | \n",
358 | " 113.96 | \n",
359 | " NaN | \n",
360 | " NaN | \n",
361 | "
\n",
362 | " \n",
363 | " 1 | \n",
364 | " 45.772770 | \n",
365 | " 15.959090 | \n",
366 | " 115.82 | \n",
367 | " 1.86 | \n",
368 | " 87.59 | \n",
369 | "
\n",
370 | " \n",
371 | " 2 | \n",
372 | " 45.773270 | \n",
373 | " 15.958795 | \n",
374 | " 116.15 | \n",
375 | " 0.33 | \n",
376 | " 60.12 | \n",
377 | "
\n",
378 | " \n",
379 | " 3 | \n",
380 | " 45.773770 | \n",
381 | " 15.958500 | \n",
382 | " 116.12 | \n",
383 | " -0.03 | \n",
384 | " 60.12 | \n",
385 | "
\n",
386 | " \n",
387 | " 4 | \n",
388 | " 45.774235 | \n",
389 | " 15.959335 | \n",
390 | " 115.98 | \n",
391 | " -0.14 | \n",
392 | " 82.87 | \n",
393 | "
\n",
394 | " \n",
395 | "
\n",
396 | "
"
397 | ],
398 | "text/plain": [
399 | " latitude longitude elevation elevation_diff distance\n",
400 | "0 45.772480 15.958040 113.96 NaN NaN\n",
401 | "1 45.772770 15.959090 115.82 1.86 87.59\n",
402 | "2 45.773270 15.958795 116.15 0.33 60.12\n",
403 | "3 45.773770 15.958500 116.12 -0.03 60.12\n",
404 | "4 45.774235 15.959335 115.98 -0.14 82.87"
405 | ]
406 | },
407 | "execution_count": 6,
408 | "metadata": {},
409 | "output_type": "execute_result"
410 | }
411 | ],
412 | "source": [
413 | "distances = [np.nan]\n",
414 | "\n",
415 | "for i in range(len(route_df)):\n",
416 | " if i == 0:\n",
417 | " continue\n",
418 | " else:\n",
419 | " distances.append(haversine_distance(\n",
420 | " lat1=route_df.iloc[i - 1]['latitude'],\n",
421 | " lon1=route_df.iloc[i - 1]['longitude'],\n",
422 | " lat2=route_df.iloc[i]['latitude'],\n",
423 | " lon2=route_df.iloc[i]['longitude']\n",
424 | " ))\n",
425 | " \n",
426 | "route_df['distance'] = distances\n",
427 | "route_df.head()"
428 | ]
429 | },
430 | {
431 | "cell_type": "markdown",
432 | "id": "c069b292-2e8d-435d-a153-54b93541bf97",
433 | "metadata": {},
434 | "source": [
435 | "### Total Uphill\n",
436 | "- How to calculate it?\n",
437 | "- Simple - subset the column so only the rows with positive `elevation_diff` are kept, and then calculate the sum of the elevation difference:"
438 | ]
439 | },
440 | {
441 | "cell_type": "code",
442 | "execution_count": 7,
443 | "id": "0e8fc860-0c4d-401f-8f7a-e2420682d93d",
444 | "metadata": {},
445 | "outputs": [
446 | {
447 | "data": {
448 | "text/plain": [
449 | "311.97999999999996"
450 | ]
451 | },
452 | "execution_count": 7,
453 | "metadata": {},
454 | "output_type": "execute_result"
455 | }
456 | ],
457 | "source": [
458 | "route_df[route_df['elevation_diff'] >= 0]['elevation_diff'].sum()"
459 | ]
460 | },
461 | {
462 | "cell_type": "markdown",
463 | "id": "924decb9-0bbf-4638-bd25-2161aedee92c",
464 | "metadata": {},
465 | "source": [
466 | "- The official Strava route states there's 288 meters of elevation, so we're a bit off"
467 | ]
468 | },
469 | {
470 | "cell_type": "markdown",
471 | "id": "71df9dc0-2bde-4934-9268-7bf553fcf90f",
472 | "metadata": {},
473 | "source": [
474 | "### Total Distance\n",
475 | "- To calculate the total distance, simply sum the `distance` column:"
476 | ]
477 | },
478 | {
479 | "cell_type": "code",
480 | "execution_count": 8,
481 | "id": "46462286-22d7-4a5c-809b-34731c85fec1",
482 | "metadata": {},
483 | "outputs": [
484 | {
485 | "data": {
486 | "text/plain": [
487 | "36449.990000000005"
488 | ]
489 | },
490 | "execution_count": 8,
491 | "metadata": {},
492 | "output_type": "execute_result"
493 | }
494 | ],
495 | "source": [
496 | "route_df['distance'].sum()"
497 | ]
498 | },
499 | {
500 | "cell_type": "markdown",
501 | "id": "674046ac-74ea-43d0-a823-8d36ad2b6252",
502 | "metadata": {},
503 | "source": [
504 | "- The official Strava route states 36,4 km - we're dead on even with the simple haversine distance calculation!"
505 | ]
506 | },
507 | {
508 | "cell_type": "markdown",
509 | "id": "2a078176-9b0f-4697-9a69-3b5fc1ee881a",
510 | "metadata": {},
511 | "source": [
512 | "
\n",
513 | "\n",
514 | "## Visualize the Elevation profile\n",
515 | "- Let's see if our calculations make sense by visualizing the elevation profile\n",
516 | " - Shows meters of climbing at different distances\n",
517 | "- To make things simpler, we'll calculate a cumulative sum for elevation and distance"
518 | ]
519 | },
520 | {
521 | "cell_type": "code",
522 | "execution_count": 9,
523 | "id": "22527405-8ae9-48ad-b9b9-7cb94d89ec34",
524 | "metadata": {},
525 | "outputs": [
526 | {
527 | "data": {
528 | "text/html": [
529 | "\n",
530 | "\n",
543 | "
\n",
544 | " \n",
545 | " \n",
546 | " | \n",
547 | " latitude | \n",
548 | " longitude | \n",
549 | " elevation | \n",
550 | " elevation_diff | \n",
551 | " distance | \n",
552 | " cum_elevation | \n",
553 | " cum_distance | \n",
554 | "
\n",
555 | " \n",
556 | " \n",
557 | " \n",
558 | " 0 | \n",
559 | " 45.772480 | \n",
560 | " 15.958040 | \n",
561 | " 113.96 | \n",
562 | " NaN | \n",
563 | " NaN | \n",
564 | " NaN | \n",
565 | " NaN | \n",
566 | "
\n",
567 | " \n",
568 | " 1 | \n",
569 | " 45.772770 | \n",
570 | " 15.959090 | \n",
571 | " 115.82 | \n",
572 | " 1.86 | \n",
573 | " 87.59 | \n",
574 | " 1.86 | \n",
575 | " 87.59 | \n",
576 | "
\n",
577 | " \n",
578 | " 2 | \n",
579 | " 45.773270 | \n",
580 | " 15.958795 | \n",
581 | " 116.15 | \n",
582 | " 0.33 | \n",
583 | " 60.12 | \n",
584 | " 2.19 | \n",
585 | " 147.71 | \n",
586 | "
\n",
587 | " \n",
588 | " 3 | \n",
589 | " 45.773770 | \n",
590 | " 15.958500 | \n",
591 | " 116.12 | \n",
592 | " -0.03 | \n",
593 | " 60.12 | \n",
594 | " 2.16 | \n",
595 | " 207.83 | \n",
596 | "
\n",
597 | " \n",
598 | " 4 | \n",
599 | " 45.774235 | \n",
600 | " 15.959335 | \n",
601 | " 115.98 | \n",
602 | " -0.14 | \n",
603 | " 82.87 | \n",
604 | " 2.02 | \n",
605 | " 290.70 | \n",
606 | "
\n",
607 | " \n",
608 | "
\n",
609 | "
"
610 | ],
611 | "text/plain": [
612 | " latitude longitude elevation elevation_diff distance cum_elevation \\\n",
613 | "0 45.772480 15.958040 113.96 NaN NaN NaN \n",
614 | "1 45.772770 15.959090 115.82 1.86 87.59 1.86 \n",
615 | "2 45.773270 15.958795 116.15 0.33 60.12 2.19 \n",
616 | "3 45.773770 15.958500 116.12 -0.03 60.12 2.16 \n",
617 | "4 45.774235 15.959335 115.98 -0.14 82.87 2.02 \n",
618 | "\n",
619 | " cum_distance \n",
620 | "0 NaN \n",
621 | "1 87.59 \n",
622 | "2 147.71 \n",
623 | "3 207.83 \n",
624 | "4 290.70 "
625 | ]
626 | },
627 | "execution_count": 9,
628 | "metadata": {},
629 | "output_type": "execute_result"
630 | }
631 | ],
632 | "source": [
633 | "route_df['cum_elevation'] = route_df['elevation_diff'].cumsum()\n",
634 | "route_df['cum_distance'] = route_df['distance'].cumsum()\n",
635 | "\n",
636 | "route_df.head()"
637 | ]
638 | },
639 | {
640 | "cell_type": "markdown",
641 | "id": "8aabdbb9-e59d-410e-96a0-8e76fbb55b6f",
642 | "metadata": {},
643 | "source": [
644 | "- Let's get rid of the NaNs\n",
645 | "- We'll fill the NaNs with zeros, as that makes more sense for this dataset:"
646 | ]
647 | },
648 | {
649 | "cell_type": "code",
650 | "execution_count": 10,
651 | "id": "3b152671-7b3c-4e7f-8116-3e52a1f5e00b",
652 | "metadata": {},
653 | "outputs": [
654 | {
655 | "data": {
656 | "text/html": [
657 | "\n",
658 | "\n",
671 | "
\n",
672 | " \n",
673 | " \n",
674 | " | \n",
675 | " latitude | \n",
676 | " longitude | \n",
677 | " elevation | \n",
678 | " elevation_diff | \n",
679 | " distance | \n",
680 | " cum_elevation | \n",
681 | " cum_distance | \n",
682 | "
\n",
683 | " \n",
684 | " \n",
685 | " \n",
686 | " 0 | \n",
687 | " 45.772480 | \n",
688 | " 15.958040 | \n",
689 | " 113.96 | \n",
690 | " 0.00 | \n",
691 | " 0.00 | \n",
692 | " 0.00 | \n",
693 | " 0.00 | \n",
694 | "
\n",
695 | " \n",
696 | " 1 | \n",
697 | " 45.772770 | \n",
698 | " 15.959090 | \n",
699 | " 115.82 | \n",
700 | " 1.86 | \n",
701 | " 87.59 | \n",
702 | " 1.86 | \n",
703 | " 87.59 | \n",
704 | "
\n",
705 | " \n",
706 | " 2 | \n",
707 | " 45.773270 | \n",
708 | " 15.958795 | \n",
709 | " 116.15 | \n",
710 | " 0.33 | \n",
711 | " 60.12 | \n",
712 | " 2.19 | \n",
713 | " 147.71 | \n",
714 | "
\n",
715 | " \n",
716 | " 3 | \n",
717 | " 45.773770 | \n",
718 | " 15.958500 | \n",
719 | " 116.12 | \n",
720 | " -0.03 | \n",
721 | " 60.12 | \n",
722 | " 2.16 | \n",
723 | " 207.83 | \n",
724 | "
\n",
725 | " \n",
726 | " 4 | \n",
727 | " 45.774235 | \n",
728 | " 15.959335 | \n",
729 | " 115.98 | \n",
730 | " -0.14 | \n",
731 | " 82.87 | \n",
732 | " 2.02 | \n",
733 | " 290.70 | \n",
734 | "
\n",
735 | " \n",
736 | "
\n",
737 | "
"
738 | ],
739 | "text/plain": [
740 | " latitude longitude elevation elevation_diff distance cum_elevation \\\n",
741 | "0 45.772480 15.958040 113.96 0.00 0.00 0.00 \n",
742 | "1 45.772770 15.959090 115.82 1.86 87.59 1.86 \n",
743 | "2 45.773270 15.958795 116.15 0.33 60.12 2.19 \n",
744 | "3 45.773770 15.958500 116.12 -0.03 60.12 2.16 \n",
745 | "4 45.774235 15.959335 115.98 -0.14 82.87 2.02 \n",
746 | "\n",
747 | " cum_distance \n",
748 | "0 0.00 \n",
749 | "1 87.59 \n",
750 | "2 147.71 \n",
751 | "3 207.83 \n",
752 | "4 290.70 "
753 | ]
754 | },
755 | "execution_count": 10,
756 | "metadata": {},
757 | "output_type": "execute_result"
758 | }
759 | ],
760 | "source": [
761 | "route_df = route_df.fillna(0)\n",
762 | "\n",
763 | "route_df.head()"
764 | ]
765 | },
766 | {
767 | "cell_type": "markdown",
768 | "id": "f85108d7-73ba-401a-8187-d7a40266d057",
769 | "metadata": {},
770 | "source": [
771 | "- We'll save this dataset for the upcoming notebooks:"
772 | ]
773 | },
774 | {
775 | "cell_type": "code",
776 | "execution_count": 11,
777 | "id": "87578b62-af38-406b-9dae-2fdf6e06ddc0",
778 | "metadata": {},
779 | "outputs": [],
780 | "source": [
781 | "route_df.to_csv('../data/route_df_elevation_distance.csv', index=False)"
782 | ]
783 | },
784 | {
785 | "cell_type": "markdown",
786 | "id": "036d18e8-08bf-4d18-baf4-a20b54ab5317",
787 | "metadata": {},
788 | "source": [
789 | "- Finally, let's use Matplotlib to plot the elevation profile:"
790 | ]
791 | },
792 | {
793 | "cell_type": "code",
794 | "execution_count": 14,
795 | "id": "1050d8cc-550e-43cd-a8e4-da1430f4549e",
796 | "metadata": {},
797 | "outputs": [
798 | {
799 | "data": {
800 | "image/png": "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z7p162ozzHpDzZJjT02TRUSkvlGfWxGpNn9Npn9uzWRw0EEHlVn+8ssvvXJOTg79+vUrM1hW6frzzz9/j/VSc2qWHHv+5HbixIkBRiIiIlI79pbcuvCj/DoREZYuXeqV/X1Yk0FKSgpvvvmmtzx+/Hh2794NwLPPPltm3zPPPBOzUMOV6dOnc9111+3R31hqRs2SY8+f3E6bNo0tW7YEGI2IiEj87S25NeD/zGycmY0DGgHP+pZfinuEIpKw/Mlt9+7dA4ykeg4++GAyMjIAWL58uZfsfv75594+xx9/PM8//zwPPPCAt27cuHGMHTu2doOt49QsOfbatm1L//79Adi9ezfjx48POCIREZH42lty+yKwBsgNP/4PWOlbXoMSXJF6yz+FTjImtxkZGVx77bXe8quvvkpubi6zZ88GIDU1lVGjRgFw6aWXctFFF3n7/vGPf2T9+vW1G3AdVVxczLZt2wAwMyW3MXT66ad75XHjxgUYiYiISPxVmtw65y6O5lFbwYpIYknmZsmlfvWrX5GSEvqn8KuvvuLNN9/0mhz379+frKwsb9+77rrLGzgrLy+PJ598svYDroP8/W2bNm3q3Q+puZNPPtkrT548Wc3pRUSkTtM3CBGpFudc0jdLhtCUKSeddJK3fMstt3jl8iNAN2vWjPvvv99bfuGFF8okZlI96m8bP7169fLe09zcXFauXBlwRCIiIvGj5FZEqmXKlCleUtKiRQvatm0bcETVd8stt3gDRvnts88+e6wbOXKktz4/P59XXnkl7vHVdepvGz8pKSkMGjTIW54+fXqA0YiIiMSXklsRqZYJEyZ45VNOOSVicpgs9ttvP84999wy6zp27Mjll1++x76pqalceeWV3vKTTz5JUVFR3GOsy1RzG1/Dhg3zypMmTQowEhERkfhScisi1eIfTGrIkCHBBRIj9913n1cjO2TIECZPnkz79u0j7nvuuefSsmVLAFauXMl7771Xa3HWRUpu4+vQQw/1yt98802AkYiIiMSXklsRqZYVK1Z45S5dugQYSWxkZWXx6aef8s477/DBBx/QtGnTCvdt0qQJv/nNb7zld999tzZCrLP8/ZbVLDn2hg0bRmpqKgDff/89y5cvDzgiERGR+FByKyLVUteSWwgluEcccQQNGzbc676nnXaaV/7iiy8oKSmJZ2h1mmpu46tp06Yc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ZjYr/DgJ+BtwnJktBI4LL4tILZo/fz5FRUUAdO/enaysrIAjSnznnHOO9z4tWbKE//3vfwFHlLhUc5uYhg0bxieffMKBBx4IQHFxMY888kiwQYmIiEQh8OTWOfeVc86cc/2dcwPDjw+cc7nOuWOcc73Cz5p4T6SWqb9t1WVkZHDRRRd5y/fcc0+97rM4duxYfvOb3zBjxow9tqnPbeIyM2677TZvecyYMaxZsybAiERERPYu8ORWRBKXf7RUTQEUvcsuu4wmTZoA8P333/PYY48FHFEwVq1axeWXX85bb73FhRdeyO7du/fYXqpdu3a1HZ7sxWGHHcawYcOAUP/bf/3rXwFHJCIiUjkltyJSIX+zUSUf0cvOzubWW2/1lh988EF+/PHHACMKxttvv+01a1+zZg1vv/12me0LFy70yv5plCQxmBk33nijtzx69Gjy86OezEBERKTWKbkVkQr5myGq2WjVXH755d6gPLt27eKCCy5gxYoVAUdVe5xzvPzyy2XWPfXUUzjnANi+fTsrV64EQgNxde/evdZjlL07/vjjvVYbhYWFfP311wFHJCIiUjEltyIS0ddff82nn37qLWvAn6pJTU3l0UcfpUGDBkColvKEE05g/PjxAUdWOyZMmLBHbfXMmTOZNGkSAIsXL/bWd+vWjYYNG9ZqfBIdM+PYY4/1lr/66qsAoxEREamcklsR2YNzjptvvrnMOtWsVd3+++/Ps88+6yVua9eu5dxzz+Xvf/97wJHF36OPPhpx/a233sr27dvLNEnu1atXbYUl1XDYYYd55YkTJwYYiYiISOWU3IrIHj755BPmzZvnLQ8cOJC2bdsGGFHy+tnPfsabb75Js2bNvHV/+9vfOP7443nwwQeZNGmS11S3rvjLX/7CF1984S2/+uqrpKamAjBr1iwuvvhiXnvtNW+7+tsmttIpgSBU417X/l5FRKTusLr0n9TQoUPdtGnTgg5DJOmdfPLJfPPNN0AosX3vvffIyMgIOKrktmbNGs4//3xmzZq1x7YDDjiAJ598kv3337/2A4uxTz75hLPOOstbHjlyJK+++irPPfccf/zjHyMeM3r0aE4//fTaClGqyDlH586d2bZtGwBz584lOzs7qmO3b9/OU089xXfffUdWVhapqank5+ezdu1ali1bxo4dO8jIyGDfffflzjvvpHfv3vF8KSIiUjdYhRuU3IqI3/Tp070+dg0aNGDmzJl06tQp4Kjqhu+++46jjjqKkpKSPbY1b96csWPHMmjQoAAii42CggIOPfRQb4qfgQMH8vbbb5OVlQXAn//8Z5566qkyx3Tr1o2pU6d6fZMlMZ122mlek+QHH3yQSy+9dK/HrFmzhl/+8pfMnTs3qmtkZmby7LPPcsIJJ9QoVhERqfMqTG7VLFlEynjppZe88s9//nMltjF0wAEHMG7cOP70pz9xyy23cMEFF9C4cWMANm/ezM9+9jNmzJgRcJSV27JlC7/73e8455xzeOihh9i0aZO37a677vIS25YtW/LGG294iS3AvffeyxtvvMEZZ5xBeno66enpPPjgg0psk8BJJ53klR9//HF27dq112N+//vfR53YQujHkXPPPZe//OUvUZ1fRESkPNXciohn1apVDBkyxPti+eGHH3LwwQcHHFXdNmvWLM4880zy8vK8dYcffjg33XRTmYF8EsH06dM57bTT2L59u7euS5cujBkzhs2bN3PyySd760eNGlWmeXJ5O3bsoKSkhCZNmsQ1ZomNrVu3MmDAAO/HjPPOO4/HH3+clJQ9fyMvTVJLpw0yM2699VZatGhBUVERWVlZtG7dmm7dupGZmcmiRYu4/PLLvR9GAPbdd19uvfVWRo4ciVnoB/qSkhKWLFlC165dSUtLq4VXLSIiCUrNkkVk766//npefPFFAIYNG8b//vc/74ulxM/MmTMZOXIkO3fuLLO+c+fODB8+nOHDhzNixIio+znGw9dff83Pf/7zPWKEUPP1oqIib/mEE05gzJgx+tupY0aNGlVmFPXjjz+e3/72txQWFrJixQpatmxJly5d+Otf/8r06dO9/Y4++mj++9//VnruDRs2cMUVV/DZZ5+VWd+hQwcGDBhARkYGkyZN8ubePvPMM3nkkUfIzMyM4SsUEZEkoeRWRCo3a9YsjjvuOC9JeeuttzjqqKOCDaoe+fbbb/n73//Ol19+GbFPblpaGg8//DAXXnhhrcc2ceJELrjgAvLz8711zZo1o6SkhK1bt5bZNzMzk2+//ZaOHTvWdpgSZ845rrnmGl599dWoj8nMzOTtt99m8ODBe923pKSEUaNGcdddd1FYWLjX/a+++mruueeeqGMREZE6Q31uRSSyoqIiRo0axYknnugltoceeihHHnlkwJHVLwcffDBvvfWW10y5fHPd3bt3c+211/LEE09ErD2NtYULF/LQQw9x7LHHctppp3mJbWpqKg888ADLli1j/PjxdO7cucxxd999txLbOsrMeOyxx7jyyiv3um+DBg247bbbWLZsWVSJLUBKSgpXXHEFM2fO5Oqrr6Zp06aV7v/yyy+zcuXKqM4tIiL1g2puReqpadOm8cILL/Dll1+W6euWmZnJe++9R//+/QOMTnbv3s2sWbP4+uuvee2115g/f763rXnz5lx99dXccMMNEfs87s22bduYPHkyrVq1Ii0tjR9//JHMzEw6dOhA06ZNef311/nb3/5GcXFxmeMyMzN5//33OeCAA7x1eXl5vPTSS8yePZvBgwdz9dVXqzlyPTB16lSeeOIJVqxYwbZt29hvv/1Yt24d3377LV27duWZZ55h2LBhNbpGUVERCxcu5Pvvv6ekpITGjRvTrl07jj/+eG+fRo0acdZZZzFo0CDatGnDoEGDAm2+LyIitULNkkUkZObMmTz33HOMGTOG8p//fv368dJLL9GzZ8+AopNINm/ezM9//vOIIykPGjSIc845h1//+tc0bNhwr+eZMmUK1157LevWrYv6+mlpafzyl7/khhtuoHv37lWOX+qPzZs306xZs2r96BKtDz74gAsvvDBi832A3r17c9RRRzF06FDat29P27ZtadeuHVlZWfrhRUSkblByKyLw2muvccUVV+yxvlmzZlx33XVceeWV3tQ0kli2bt3Kv/71L8aMGcOKFSsi7jNixAiGDBnCPvvsQ+fOndm8eTPOOTZv3sz48eP58MMPK0wIIhk2bBiXXHIJRx99NG3atInVSxGpsU8++YS7776bOXPmRH1Mw4YNadOmDe3bt+fII4/k7LPPpkePHhp5WUQk+Si5Fanvdu3axZAhQ8o0QT766KO54YYbGDJkCI0aNQowOolWcXExd999N08++SS7d++u8fk6duyIc46MjAxSUlLYunUr6enpnHfeeVx//fWag1YSlnOOb7/9lk8++YQNGzawfPlyJk+eXKU+6RkZGRxxxBEcd9xxnHrqqbRu3TqOESeuzZs306BBg732cxYRSRBKbkUSRVFRUZUSBucczrkaN/N7+eWXufbaa73lxx57jAsuuEDN9JLUli1bWLt2LW+88Qb/93//F3Uz44EDBzJ48GCOOOIITjvtNN1/qVMKCwv59ttv+eKLL1i+fDnr1q1j/fr1rF+/noKCgkqPbdGiBZMnT64zrRS2bNnCypUrWb16NYWFhezcuZO8vDzWr1/Phg0b2LRpE7t372bx4sUsWbIEwPuRKy0tjSOPPJJ77rlHA8SJSCJScisSpMLCQr788kseeeQRpkyZwoUXXsiDDz641+Zw8+bN45e//CXr16+nb9++3HnnnYwYMaLK1y8qKmLYsGEsW7YMgL/+9a9cf/311XglkqhWrFjBN998w48//sjSpUtZuXIl6enpZGVlkZGRQZcuXTjrrLPo27dv0KGKBGL79u1s2LCB2bNnM3r0aGbPns2mTZvK7PPYY48FMt1WVZWUlLBu3TpWrlzJihUrmD9/PnPnzmXTpk0UFBSwevXqvSbz0bjgggt4/PHHYxCxiEhMKbkVqU1bt27lmWee4ZNPPsE5x+zZs9mxY0eZfYYNG8YNN9zAYYcdFrEp2JYtWxgxYgRLly711rVp04bp06eTmZm51xhyc3MZP348zZs3Z+zYsYwdOxYIjbQ7Z86cqM4hIlKXLV68mLPOOqvMv7PvvfcehxxySFwHxaquSZMmccsttzB//nx27doVs/M2bNgQM9ujSXffvn2ZNGlSzK4jIhIjSm5FasPq1av5z3/+w9NPP83GjRujOiYtLY2DDz6YESNGcNZZZ9GpUye2bNnC+eefz9dff73H/r/73e+46667Kj3npk2bOOGEE1i0aNEe2/70pz9x0003RfeCRETquBUrVjBw4MAyo8cPHDiQN954I+H64J500klRJ5uNGjWic+fOZGdn06xZMxo0aEDz5s1p27Ytbdq0oXXr1jRs2JAWLVowcOBAGjZsSH5+vje1E4TmtV61apXGZBCRRKPkViReiouL+fjjj3nuuef4/PPPKxyNtlevXhx77LFs27aNl156KeI+qamp9OvXj02bNrFmzRpv/eGHH87EiRO95XvvvZcrr7wyYn/JTz/9lGuvvbbM8aV+/vOf8+STT+51yhgRkfrkN7/5DW+99VaZdaeeemqF/1YHpW/fvl7/+hYtWtC1a1c6d+5Mt27d6N+/P506dSIjI4MOHTrQqlWravepHzJkiNcPd8KECQwYMCBmr0FEJAaU3IrEypYtW1i2bBlPPvkkn332Gfn5+RGbh2VnZ3PFFVfQu3dv+vbtS5cuXbxtEydOZOzYsUyZMoXvv/++0uv99a9/5brrruPkk08u84t9+/btyc7Opn///uy///4UFRXxzjvv8M033+xxjp49e3LXXXcxcuTIGrxyEZG6adu2bbzyyit88803vPPOO976c889lzvuuIO2bdsGGF3I7t27ad++vfcD6rp16+L2Q+VFF13EuHHjAHjiiSc477zz4nKdumbTpk1s2LCB3r17a7A+kfhScisV++GHH3j11VfJzc3FzGjRogUDBgxg2LBhdOzYUbV8YVOnTuWGG25g7ty5Fe5jZhxxxBGce+65nH766VE15crJyWHChAm8/PLLZZLXRo0a8eijj3L22WcDMH/+fH72s59FPSpuq1atePTRRzn55JOj2l9ERODYY49l+vTp3nLPnj157733aNeuXYBRweuvv87ll18OhKbwmjdvXtyu9cADD3D//fcDcNVVV3HvvffywQcf8O2333LUUUdxxBFHaJowYPny5dx9991s3ryZLVu2MGPGDEpKSrjpppv405/+FHR4InWZkluJbPfu3QwcODBiE1YIJWunnnoqzz77bL1JcktKSliwYAFpaWmsXbuWsWPHMn/+/Er7ObVq1YrzzjuPSy65hK5du1b72suWLSM3N5ddu3ax33770axZszLbc3Nzufvuu3nppZeo6LPboEEDzjnnHG677bbAv4yJiCSbH3/8kd///vd7tILJyMjguOOO43e/+x2DBw/e63mKiooYN24caWlpnHTSSaSmplY7JucchxxyCAsWLADglltu4eabb672+fbm/fff54ILLgDgiCOO4KabbuKUU07xtnfs2JGLL76Y9u3bk5WVxaBBg8jOzq53tZWXX345r7/++h7ru3fvzowZMwKISKTeUHIrka1cuZL+/fvvdb/SX27rsi1btjBmzBieffZZr69RRbp06UL//v258MILOfzww2nUqFGt/qeek5PD3LlzKSgoYOHChaxevZq0tDTatm3LueeeW6YJtIiIVN0TTzzBbbfdtsd6M2PEiBEccsgh7LfffqxevZrVq1eTn59P9+7dOe644/jss8/417/+5f1wfOihh/Laa6+xevVq78fLikZj3rp1KzfccAPLly/n8ccfp3fv3nz44Yde0+CmTZsyd+5csrKy4vbaly1bxqBBg6p0TLt27Rg8eDBDhgzh4IMPpkuXLuzcuZPmzZsn3MBcsXLYYYdFrEFv0KABOTk5tVa7XVxczIsvvsh3332Hc46SkhIyMjIYNmwYAwYMoH379mRkZNRKLCK1RMmtRDZnzhyOPPJIb/mxxx5j9erVTJo0iYkTJ5apHXzllVc46aSTgggzblavXs3jjz/O/PnzmT59Olu3bq10/x49evDCCy9E9YOAiIgktw8++IC///3vzJkzJ6bn7dOnD6+++io9evQosz4/P3+P1j/du3cvM1XRWWedxahRo2IaT3klJSUccMABFbbqqqo2bdpw8MEHc8opp9CsWTM2b97M2rVr6datGyNGjIhroh5PXbt2JT8/H4CHHnqIm2++meLiYgBmzpxJt27daiWO//znP1x55ZWV7pOZmUn79u3p378/I0eOpGPHjuTm5pKamkpmZiYZGRk0bdqUpk2bkpGRwYYNG5g3bx7r16+ncePGZGZmss8++9CzZ0/S09Nr5XWJVELJrUQ2YcIEzjjjDCA0Im/pABIQagZ1/vnn8+GHH3rr8vLyaj3G6ti+fTvLly9n1apVfP3112zYsIGrrrrKm94A4LvvvuOXv/wlOTk5Ec/RsmVLMjMzOfzwwznllFPo0aMH3bt3Vz8jEZF6pqioiPnz53P33Xfz0UcfxeSc++23H5988kmZsRkeeeQR7rzzzkqP+/DDDzn44INjEkNlPv74Y8455xxvAKsOHTrw97//nREjRvD0008zdepUsrKyWLt2LTNnztzrj8MVadCgAT179qRDhw40b96cJk2akJ+fT15eHikpKTRu3JiePXuy//77U1xcTE5ODkuWLGHHjh2ceuqpnH766VHNSVxcXExRUVGliVlBQQGNGjWiQYMGbNu2zStHsnjxYoYOHQpA48aNWb16NSeddBLffvstAGPHjmXEiBHVeEeq7oorruC1116rlWulpqbSsWNHOnToQN++fTniiCMYPnw47dq1q3fN0iVQSm4lsv/+979ceumlAJx++umMHj26zPY1a9aUSQjffPNNjjnmmNoMMWrLli3jn//8JzNmzGD+/PkUFRWV2Z6Zmcnrr7/OwQcfzPr16zn00EPJzc0ts0/fvn257LLLOPvss9WER0REynDOMW/ePGbPns0777zDmjVr6NevH3369KFhw4a89tprfP/99wwZMoQLL7yQkSNH8vLLL3PPPfcAoUTO/39T7969GTVqlDfVTkV9OEv9/e9/57LLLovvi/T59ttv+fbbb+nUqRMnnHACmZmZEfcrLi5m4cKFTJ8+nSlTpjBlyhS2bNlCo0aNWLt2LYWFhXGLMTMzkwMPPJCLLrooYt/mSZMm8eKLLzJu3DgKCwtp3bo1rVu3Jj8/ny1btpCamkqbNm3YunWrN2Bjeno6O3fupHHjxrRq1Yr169fToUMHBg8eTIcOHdixYwefffYZy5YtA2DYsGF89NFHXHXVVYwZMwaAhx9+mN/85jdxe91+w4cP92ZeuOGGG+jSpQurVq3i22+/ZdmyZaxbt47du3fHNYamTZvSuXNnr+Y3IyODXr16ceihh5KdnU1WVhZZWVlkZGSUSYK3bdvG999/j5l5P3A0atSoRn3UpV5QciuR+fsUXXLJJTz00EN77DNy5Ejvl0iAK6+8krvuuqvKNZjFxcXMmjWL3NxcsrKy6Nq1K/Pnzyc9PZ1BgwZVa5L4kpISpk6dytixY3nllVfYtm1bpftnZGTwwQcf8OCDD/Lee+8B0KxZM2699VaOOOII+vTpo18eRUSkWpxzbNmyhebNm5dZP3fuXHJzcxk4cCCvvvoqf/7zn71tpTWXzZs3L/N/bdu2bTnooIMoKiqiW7duXH755TUasDAoxcXF/Pjjj7zzzjtMmzaNlJQUMjMzadWqFVOnTmXWrFkxu1a3bt24+eabOfPMM/nuu++4//77+fTTT2N2/kjS09MZN24cBx54IA8++CD33XcfANdccw133313XK8NsGPHDjp37uz9aLJ8+fI9BqN0zrFp0yaWL1/Op59+ymeffUZRURGtWrWipKSEbdu2sXXrVu9569atZGRksN9++9GlSxd27dpFbm4uCxYsYPny5TWKNzU1laysLJo2bUqDBg1Yvny515Tbb5999mHMmDH06tWrytfIzc3lwgsvZPHixXTq1IlzzjmHtWvXsmrVKnbv3s2+++5Lv379SE1N9a7dvn17unTpQuvWrfU9MDkoua3LFixYwMsvv8wBBxzA2WefvceH0jnH//73PzZv3szIkSPL9G258cYb+fe//w3APffcw9VXXx3x/OWbQI0YMYKLL76Yjh07Mnjw4DLXzM3NZcmSJd4cfM45lixZwjPPPFPhP4odO3bk5ZdfZtCgQRG/GPht2bKFBQsW8N133zFq1Ch+/PHHiPv16NGDdu3a0aBBAyZOnFjh+d566y2OOuqoCreLiIjESklJCY888ggPP/ww27dvr3C/r776qkzLqbpq8+bNrFy5kpycHAoKCti+fTsZGRm0atUK5xz5+fnMmjWLJUuW0KRJE1q2bEn79u2ZPn06X331FRs3btzjnGYWcUaBlJQUr5l1JGlpaRQVFeGcIy0tba+1nWbGc889x5lnngnAG2+84dWsn3LKKbz88stVeSuqZfbs2d53mNoYpbmwsJCcnBxWrlzJt99+y4QJE5g3bx4FBQVxud4NN9xA8+bNyczMpFmzZmzfvp21a9eSnp5ORkYGTZo08foK9+3bl9atW3PVVVfxxhtvVOt6jRo1ori4mFatWnHMMcdwzz33VPqdNCg//PADzz//PEceeSSnnHJKfUzIldzWRc45/u///o+bb77Za/IzatQozjrrLCD0a+no0aN54403mDx5MhD60F588cVezesZZ5zBhAkTgMoHjBo9ejS///3vI27r378/hx12GPPnz2fevHlRz8NaXqNGjdixYwcQapr1t7/9rcz25cuXc9ddd/H2229X+J9T7969ueKKKzjttNNo1aqVt37+/Pkcf/zxe/zje9FFF/HII49UK14REZHqWrJkCVdeeSVTpkwpsz4lJYW//OUvXHfddQFFljyccyxfvpyXX36Zf//732zevHmPfVJSUjjnnHP47W9/ywEHHMC6deu8FmTNmzenqKiINWvW0LBhQ/bZZx8gVBvapEkTNm7cyMaNG+nYsSNLly5l5syZbN++nfT0dNLT0xkwYECZASanTZvGcccdB4T6VH/11Vd7xBvrJOSVV17hmmuuAeC0007jxRdfjOn5o+GcIzc3lzVr1rBt2zYKCwvJy8tj6tSpzJw5ky1btniP8k3UzYw+ffqQnp5OTk4OGzZsqHCqwyD89a9/5frrrw/k2uvWrWPcuHEcfPDBHHDAAd76vLw8Bg8e7P29/+IXv+Dhhx/eo8a+jlNyW9csXbqUP/7xj3s0txk4cCCff/45zjnOPvtsPvnkk4jHn3feeTz++OP07duXDRs2ADB16lR69uxZ4TXnzp3Lv/71rxoNWpCamspBBx3Exo0bWblyJT169GDBggV79I8FuOyyyzjnnHOYMWMGb731FpMmTYqY1DZt2pSf//znnHnmmQwfPrzCfhr+efsgNDftjBkz6ts/BiIikiCKi4t5+umnGTduHM2aNWPAgAGceeaZ7LvvvkGHlnTy8/N54okneOqppygoKKBjx44cdNBB/PGPf6Rfv361EkNubm6Z71FPPPEEffv2ZefOndxzzz1MmTKF/fffn2HDhtG3b1+6d+9O48aNadiwIV27di3zo3y0brnlFp555hkAbr31Vv7whz/E7PXEw86dO8nPz2f79u0UFhbSsWPHPb6HPfTQQzGbfvLiiy9m165ddOrUiezsbCA0U8jSpUtJTU2lQYMGFBcXs3r1apYvX75HJcj555/Pv/71r5jEUpnt27czbtw4Pv74Y3bv3k1xcTETJ06koKCAlJQUXnvtNY499lggcoVTdnY2f/vb3zj55JPrSy2uktu65D//+Q+///3vvVrO8ubMmcP8+fM5++yzKz3P8OHD+frrr4FQgrh8+fKoRhx85plnuOeeeyocGbFx48bss88+ZGdnU1xcjHOOli1b0rt3b371q1/Rtm3bMvsvWLCAs846i5UrV+712qX23Xdf+vTpw7777su5557r/YO1N/fccw8PP/wwAP/4xz+4+OKLo76miIiIJLaSkhKv5rW2Oefo1q2bNz1QVe233360b9+eRYsW0bRpU2/qnuHDhzNixIiI39FOPvlkvvnmGwDGjBnDiSeeWKPXkAicc4wfP56lS5eSn59PQUEBBQUF5Ofnk5aWRnZ2NkVFRWzdupXt27ezbds2NmzYwPfff8+2bdto0qQJ5513Hn/4wx9o165dla5dUFDAxx9/zCWXXALAscceW+0mzpXZtWsXixYt4t5772X+/PksWbKk0v3btGnD3LlzadiwIWeeeSaff/55xP1+8Ytf8Pjjj1drHJsko+S2LigqKuLhhx8u01zXzLj00kuZO3cukyZNAkK/3L344ousWrXK2+/111/n2GOP5brrrovYB+Sggw5i/PjxVY5p06ZNvPnmm+Tl5dG3b1/2228/unfvXuVR7tauXcu5555b6cASZsbhhx/On//8Zw466KAqxwqhfzDff/99INQfRkRERCRWzj//fD744IOYn/fYY4/ln//8J506dfLW5eXl0adPH69v8Lx58+jYsWPMr50snHPk5OTQtGnTGrXKmzFjhjczSP/+/fniiy9iFSIAixYt4sQTT9xjxo69GTNmDAceeCC9e/f2BsK6++67efTRR8v0PT/ooIN4+eWXadOmTUzjTjBKbhNJfn4+Tz/9NLNmzfKGSh84cCDHHnssW7Zs4f7772f79u3079+fc845hyZNmvDSSy/x+OOPe8POQ2jamieffJJBgwbx/PPPR2yK0qJFC7799luvtrS4uJhrr72WV199tcx+v/3tb3nggQfi+rr3pqSkhEWLFtGjRw8++ugjHn/8cVasWEGHDh04++yzOf3006v8C5yIiIhIbVmyZAk33ngjGzZsoEWLFqxYsQLnHP379+fKK6+ksLCQWbNmsXjxYlatWsXOnTspLCyMOIVhJKmpqbRt25ZTTjmFtm3bes13hwwZUmFXNKmaVatWeX1c27dvzw8//BDT85933nl8+OGHe6zv3bs3v/zlL9lnn33YuXMnzZo144svvuDpp58G4KSTTqJRo0aMHTsW+GkKqry8PG6//XZeeeUV71yZmZlcddVVXHHFFd6AWDk5OSxcuJDPP/+cnJwcNm7cyOrVq8nPz+foo4/mjjvuqFbT+IAouU0U33//PWeccQbr16/fY9tRRx1FSkoKn332mbcuIyODtLS0PQZJGDFiBC+88II38nH5+WhLPf/8894ofn6ffPIJN954IytWrCA1NZXPPvuszKAIIiIiIlI7CgoKmDJlCnl5ed70N0uXLmX8+PFRjXXywAMP8Nvf/jbeYdYLO3fupH379kBoQLI1a9aQnp4ek3MXFBTQrVu3MmPIHHTQQbz22mtlZjMpNW/ePA477LCI57rrrrv43e9+B4RqrZ988kluv/32MgNymRldunRh9+7drFmzptLYWrduzdNPP+3VWic4JbeJ4qSTTvKaD1dHixYtuPLKK7n++utJS0srs+3cc88t07T4zDPP5Pnnn6/wXFu2bOHdd99lwIABZUZhExEREZHE8MUXX/Dwww/z9ddfRxxYs0GDBsyfPz+Zat0SXo8ePcjLywNC8ycfffTRQGgqpIKCAnbs2EFRUZH32LVrFzt27CA9PZ0DDjiAgQMHMnDgQDp16sSGDRvYunVrmQHkIFQLP3nyZHr06FHpIFCHHXYY8+bNK7OuUaNGzJ49e49xbD755BNuv/125s+fX63XnZGRwcyZM5OhSbOS20Qwa9YsRowY4S3/6U9/okOHDnz99dcRf5Xr0aOH18G8TZs2XHrppVx99dVkZGREPH9BQQHPP/88+fn5dOjQgQsvvLA+dCgXERERqfNKSkooKipi/Pjx3HfffSxYsACAa665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\n",
801 | "text/plain": [
802 | ""
803 | ]
804 | },
805 | "metadata": {
806 | "needs_background": "light"
807 | },
808 | "output_type": "display_data"
809 | }
810 | ],
811 | "source": [
812 | "plt.plot(route_df['cum_distance'], route_df['cum_elevation'], color='#101010', lw=3)\n",
813 | "plt.title('Route elevation profile', size=20)\n",
814 | "plt.xlabel('Distance in meters', size=14)\n",
815 | "plt.ylabel('Elevation in meters', size=14);\n",
816 | "plt.savefig('fig.jpg', dpi=300, bbox_inches='tight')"
817 | ]
818 | },
819 | {
820 | "cell_type": "markdown",
821 | "id": "34ae3aa8-5722-42fd-86aa-bd214dbba852",
822 | "metadata": {},
823 | "source": [
824 | "- It's difficult to say if it looks exactly like the one on Strava, but it looks almost identical!\n",
825 | "- In the next notebook, you'll learn how to calculate gradients based on the elevation difference and distance between the data points."
826 | ]
827 | }
828 | ],
829 | "metadata": {
830 | "kernelspec": {
831 | "display_name": "Python 3 (ipykernel)",
832 | "language": "python",
833 | "name": "python3"
834 | },
835 | "language_info": {
836 | "codemirror_mode": {
837 | "name": "ipython",
838 | "version": 3
839 | },
840 | "file_extension": ".py",
841 | "mimetype": "text/x-python",
842 | "name": "python",
843 | "nbconvert_exporter": "python",
844 | "pygments_lexer": "ipython3",
845 | "version": "3.9.4"
846 | }
847 | },
848 | "nbformat": 4,
849 | "nbformat_minor": 5
850 | }
851 |
--------------------------------------------------------------------------------