{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "AbhishekMetricaData.ipynb", "provenance": [], "collapsed_sections": [], "machine_shape": "hm" }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "KkFlDuzYFaja", "colab_type": "text" }, "source": [ "Import data." ] }, { "cell_type": "code", "metadata": { "id": "rrTirNum9zsa", "colab_type": "code", "colab": {} }, "source": [ "import pandas as pd\n", "import numpy as np\n", "away_data = pd.read_csv('https://raw.githubusercontent.com/metrica-sports/sample-data/master/data/Sample_Game_1/Sample_Game_1_RawTrackingData_Away_Team.csv', skiprows=2)\n", "home_data = pd.read_csv('https://raw.githubusercontent.com/metrica-sports/sample-data/master/data/Sample_Game_1/Sample_Game_1_RawTrackingData_Home_Team.csv', skiprows=2)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "9S0SWVl9Fd_-", "colab_type": "text" }, "source": [ "Reformat into lists indexed by player, e.g. `locs_home[0]` contains locations for player 0 on home team." ] }, { "cell_type": "code", "metadata": { "id": "KlbLZEqhG_w0", "colab_type": "code", "colab": {} }, "source": [ "locs_home = [np.asarray(home_data.iloc[:,range(3 + j*2,3 + j*2 +2)]) * np.array([105,68]) for j in range(14)]\n", "locs_away = [np.asarray(away_data.iloc[:,range(3 + j*2,3 + j*2 +2)]) * np.array([105,68]) for j in range(14)]\n", "locs_ball = [np.asarray(home_data.iloc[:,range(31,33)]) * np.array([105,68])]\n", "t = home_data['Time [s]']" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "mvL6dcfO9EQZ", "colab_type": "code", "outputId": "a4c8d270-f282-4cb7-ffb9-79e101cf05da", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "np.all(np.isfinite(locs_home[0][24000:25000,:]))" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "C9vQbW8xFscO", "colab_type": "text" }, "source": [ "Influence function as defined in appendix of the paper (I've tried to keep their notation as much as possible)." ] }, { "cell_type": "code", "metadata": { "id": "2r5-59a3_oMF", "colab_type": "code", "colab": {} }, "source": [ "def influence_function(player_index, location, time_index, home_or_away):\n", " from scipy.stats import multivariate_normal as mvn\n", " if home_or_away == 'h':\n", " data = locs_home.copy()\n", " elif home_or_away == 'a':\n", " data = locs_away.copy()\n", " else:\n", " raise ValueError(\"Enter either 'h' or 'a'.\")\n", " return\n", " if np.all(np.isfinite(data[player_index][[time_index,time_index + 1],:])) & np.all(np.isfinite(locs_ball[0][time_index,:])):\n", " jitter = 1e-10 ## to prevent identically zero covariance matrices when velocity is zero\n", " ## compute velocity by fwd difference\n", " s = np.linalg.norm(data[player_index][time_index + 1,:] - data[player_index][time_index,:] + jitter) / (t[time_index + 1] - t[time_index])\n", " ## velocities in x,y directions\n", " sxy = (data[player_index][time_index + 1,:] - data[player_index][time_index,:] + jitter) / (t[time_index + 1] - t[time_index])\n", " ## angle between velocity vector & x-axis\n", " theta = np.arccos(sxy[0] / np.linalg.norm(sxy))\n", " ## rotation matrix\n", " R = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta),np.cos(theta)]])\n", " mu = data[player_index][time_index,:] + sxy * 0.5\n", " Srat = (s / 13) ** 2\n", " Ri = np.linalg.norm(locs_ball[0][time_index,:] - data[player_index][time_index,:])\n", " Ri = np.minimum(4 + Ri**3/ (18**3/6),10) ## don't think this function is specified in the paper but looks close enough to fig 9\n", " S = np.array([[(1 + Srat) * Ri / 2, 0], [0, (1 - Srat) * Ri / 2]])\n", " Sigma = np.matmul(R,S)\n", " Sigma = np.matmul(Sigma,S)\n", " Sigma = np.matmul(Sigma,np.linalg.inv(R)) ## this is not efficient, forgive me.\n", " out = mvn.pdf(location,mu,Sigma) / mvn.pdf(data[player_index][time_index,:],mu,Sigma)\n", " else:\n", " out = np.zeros(location.shape[0])\n", " return out" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "kaQV0iezUye-", "colab_type": "text" }, "source": [ "Here's a plot of the pitch control at the 24000th timepoint. " ] }, { "cell_type": "code", "metadata": { "id": "GB-Lxt5O7B1S", "colab_type": "code", "outputId": "cdc15c11-ea64-4f02-d86d-814466c214dc", "colab": { "base_uri": "https://localhost:8080/", "height": 286 } }, "source": [ "import matplotlib.pyplot as plt\n", "\n", "xx,yy = np.meshgrid(np.linspace(0,105,200),np.linspace(0,68,200))\n", "Zh = np.zeros(40000)\n", "Za = np.zeros(40000)\n", "\n", "for k in range(11):\n", " Zh += influence_function(k,np.c_[xx.flatten(),yy.flatten()],24000,'h')\n", " Za += influence_function(k,np.c_[xx.flatten(),yy.flatten()],24000,'a')\n", "Zh = Zh.reshape((200,200))\n", "Za = Za.reshape((200,200))\n", "plt.contourf(xx,yy,1 / (1 + np.exp(-Za + Zh)))\n", "for k in range(11):\n", " plt.scatter(locs_home[k][24000,0],locs_home[k][24000,1],color='darkgray')\n", " plt.scatter(locs_away[k][24000,0],locs_away[k][24000,1],color='black')\n", "plt.scatter(locs_ball[0][24000,0],locs_ball[0][24000,1],color = 'red')\n", "plt.colorbar()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 42 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "RzIWl28bVALP", "colab_type": "text" }, "source": [ "And, for reference, the locations of the home players (grey), away players (black) & the ball (red). \n", "\n", "Seems sensible, I think, but quite possibly some mistakes on my end. Guess we'll see what Javi produces over next few days :)" ] }, { "cell_type": "code", "metadata": { "id": "p_5FIBX93MWi", "colab_type": "code", "outputId": "d91033a9-717e-4dfb-884b-5889c2987637", "colab": { "base_uri": "https://localhost:8080/", "height": 557 } }, "source": [ "from IPython.display import HTML\n", "import matplotlib.animation as animation\n", "\n", "fig,ax = plt.subplots()\n", "ims= []\n", "xx,yy = np.meshgrid(np.linspace(0,105,200),np.linspace(0,68,200))\n", "\n", "def animate(i):\n", " fr = 23000 + i\n", " Zh = np.zeros(40000)\n", " Za = np.zeros(40000)\n", " for k in range(11):\n", " Zh += influence_function(k,np.c_[xx.flatten(),yy.flatten()],fr,'h')\n", " Za += influence_function(k,np.c_[xx.flatten(),yy.flatten()],fr,'a')\n", " Zh = Zh.reshape((200,200))\n", " Za = Za.reshape((200,200))\n", " im = plt.contourf(xx,yy,1 / (1 + np.exp(-Za + Zh)))\n", "\n", " for k in range(11):\n", " plt.scatter(locs_home[k][fr,0],locs_home[k][fr,1],color='darkgray')\n", " plt.scatter(locs_away[k][fr,0],locs_away[k][fr,1],color='black')\n", " plt.scatter(locs_ball[0][fr,0],locs_ball[0][fr,1],color = 'red')\n", "\n", "HTML(animation.FuncAnimation(fig, animate, frames=1000, interval = 40,repeat=False).to_html5_video())" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 46 }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3df3Ac533f8feXAEgBAkBCpEVRpGJSskSRbU06olyzMtNYojiWLVtOx/XYyiScRjPoH2ljNck4SjOTptOkk6hpbGcm4xYTO2E6sSVbsSuOLNuSaGbMKoosMqEcmxQlU7ITgr9Mij8AASTx49s/7g48HO7H7t3u7e7t5zWDIW7vbu+5W+7nvnj22X3M3RERkexZlHQDRESkOQpwEZGMUoCLiGSUAlxEJKMU4CIiGdXdzhdbsWKFr127tp0vKSKSeQcOHDjj7m+rXN7WAF+7di379+9v50uKiGSemf242vKGXShmtt7MDpb9XDSzh83sOjN71sxeK/47FH2zRUSkloYB7u5H3H2zu28G7gAmgK8BjwB73P1WYE/xtoiItEnYg5j3AEfd/cfAA8Cu4vJdwEeibJiIiNQXNsA/Dnyp+PtKdz9R/P0ksLLaE8xs2Mz2m9n+n/zkJ002U0REKgUOcDNbDHwY+ErlfV64oErVi6q4+4i7b3H3LW9724KDqCIi0qQwFfh9wN+5+6ni7VNmtgqg+O/pqBsnIiK1hQnwT3C1+wRgN7Cz+PtO4MmoGiXpYGY1f7Zv355080RyL1CAm9m1wL3AV8sW/z5wr5m9Bmwv3paM6+rqmgvpevbs2RPocSISn0An8rj7W8DyimVnKYxKkQ6wevVqjh8/3tRzzQxdV16k/aydO96Sn7rJV//6w217PRGRTvDGJ3/9gLtvqVyui1mJiGSUAlxEJKMU4CIiGaUAFxHJKAW4iEhGKcBFRDJKAS4iklEKcBGRjFKAi4hklAJcRCSjFOAiIhmlABcRySgFuIhIRinARUQySgEuIpJRCnARkYxSgIuIZJQCXEQkoxTgIiIZpQAXEcmoQAFuZsvM7Akze8XMDpvZVjO7zsyeNbPXiv8Oxd1YERG5KmgF/lngm+5+O7AJOAw8Auxx91uBPcXbIiLSJg0D3MyWAj8DfB7A3a+4+3ngAWBX8WG7gI/E1UgREVmoO8Bj1gE/Af7MzDYBB4BPAivd/UTxMSeBldWebGbDwDBA15B6Wcp13zgR+jnTx/tiaImIZFGQLpRu4KeBz7n7u4C3qOgucXcHvNqT3X3E3be4+5au/mtbbW/mdd84MfeTxPNFpHMECfBjwDF3f7F4+wkKgX7KzFYBFP89HU8TO0McoasgF8m3hgHu7ieBfzKz9cVF9wCHgN3AzuKyncCTsbQw49oRsgpxkXwK0gcO8B+BvzSzxcDrwL+jEP5fNrOHgB8DH4unidnVzmAtvZb6yEXyI1CAu/tBYEuVu+6JtjmdIcmKuPvGCYW4SE7oTMyIpaE7Iw1tEJH4KcA7lEJcpPMpwCOk0BSRdlKARySN4Z3GNolIdBTgIiIZ1dYAX3Slna/WPmmudNPcNhFpTdBx4JHpO1b4zphYM9vul06tDTecqnv/4ZNVLzMjIjnX9gAv6Tu2KPch3ii4Kx+nIBeRcon2gfcdWzRXkWdVO7sogga+iORDKtKzE4I8LIWxiLQqVamZtxAXEWlF6hIzD9V4K9W3KncRKUnsIGYjGq0Cx555lcMjLzB5epze6/vZMLyVsXduS7pZIpISqS91SxV5J1XlQUaTHHvmVV5+dC+Tp8bBYfLUOC8/upeL+15uQwtFJAsylYppDPK4Lt16eOQFZi5Pz1s2c3mas198LtR6dGlZkc6VrjQMKI1BHlajKnzy9HjV5dNnL8TRnEA64XMX6SSZ3huz3r1SL8R7r++vurx7+dLA64+i+q72GWf5MxfpJB2zFyYZKq0EZa0Q3zC8la4l848x2+Ielj+4PfY2Bf1iVIiLJCu1o1CaVR4q7RzBMn28r+mzMquG+DtXsuLfD3L2i88xffYC3cuXsvzB7Qxu29RiS2tTIItkS8cFeLmkwjwqg9s2NRXYzVTfzYa3rmkjkpyODvBy7RhX3koVHtXrh5WFqjvoZ6oRN5I3uQnwkrir8lKItDvIw4ZXlMEdRxXezOdX+RwFunS6QAFuZj8CxoAZYNrdt5jZdcDjwFrgR8DH3P1cPM2MR5xh3s5qPExQpb3ijvIzK61LQS6dKsze/D533+zuW4q3HwH2uPutwJ7i7cyKY0ji9PG+WMMj7PrTHN7dN07E9oUX57pFktTKHv0AsKv4+y7gI603Jx3SHuTNBHfc4d3K+tsVrgpx6TRB+8AdeMbMHPjf7j4CrHT3E8X7TwJVBzSb2TAwDNAzONRic9sr6i6W8tANGyZ5P0AZ5eupS0U6RdAAf6+7j5rZ9cCzZvZK+Z3u7sVwX6AY9iMAvTfcVPUxWRBnmEctC8ENyVXECnHpFIEC3N1Hi/+eNrOvAe8GTpnZKnc/YWargNMxtjNV0jq+PCvBnQYKcekEDfd4M7vWzAZKvwM7gO8Du4GdxYftBJ6Mq5FplobrsST9+s1IQ390Gtog0oogFfhK4GtmVnr8F939m2b2EvBlM3sI+DHwsfiamQ3trsyjCO3+0avtHF+drS+BKKgSlyxrGODu/jqw4Hxudz8L3BNHozpBZbhGFeithnZ5YNe7r5kwD3pCT9oqX4W4ZFXuzsRMSq3grRd4UXWL1AvtRs9Ja1W+4YZTgWY2EulkCvCExdl33UxwV1tHGkK82mTOlctaCXRV4ZJFCvAOFEVwV64vqhAP231SLbgbPVaVueRF8qWVRKZ/dDby8C5fd7uFCe8onieSNarAmxAkzNrV7ZBEsGZBM33k6kaRrFGABxQ2KGs9PopgTyq0g3SlRHVpWVXRIo0pwBuIoz9Z2kMjVaTTKcBrUNCm27FnXuXwyAtMnh6n9/p+NgxvZc2O25JulkhbKcCryEt4r1/dx7aNSxno7WJscoZ9hy5wZLT+KJE0DCs89syrvPzoXmYuTwMweWqclx/dC9ByiKsfXLJEo1Aq5Cm8d2weYrCvGzNjsK+bHZuHWL863vCKIhwPj7wwF94lM5enOTzyQsvrFskSBXiZvIQ3wLaNS+npnr/5e7oXsW3j0pbXHfeFtSZPj4daLtKpFOBFeQpvgIHerlDLyyX9WfVe3x9quUinUh94hAbemKx539i63ja2pLGxyRkG+xZu/rHJmQRaE86G4a3z+sABupZ0s2F4a4KtEmk/VeC0VlEOvDE59xP0cY0e2w77Dl1ganr++56anmXfoQuRrL9eN0qQfvB6w//W7LiNTZ96H70r+8Ggd2U/mz71Po1CkdxRBd6kVkO49PykKvPSaJOwo1Da6fDJlTVP6Fmz4zYFtuRe7gO8meo7ygp64I3JyEM8yDC//tFZjoxONB3YrZ6VOX28L/brguskHul0uQ/wsIKG9y3rB7jzrhX0D3QzPjbNS8+f4eiRsZrrbDXEw47Nrvb4pA9OVlOvCm/0PJFOl+s+8LgC65b1A2zbvpKBwR7MjIHBHrZtX8kt6wdqPqfZqn589aLITqwJu64gn1+rfeFQCOMwgazwlrzIdYCHFTRk77xrBT09FWOsexZx510rIm1PXGdEhgnydoU4BAvyVsNbZ2FKlqgLJQb9A9U/1lrLm9GO09nHVy9KbbeKiOS4Ag8bTGG6OMbHpkMtD/sa7bwWSdADoo0+z6iqcBG5KnBJaGZdwH5g1N3vN7N1wGPAcuAA8AvufiWeZmbLS8+fYdv2lfO6UaamZnnp+TNtb0u1USBhT3UPWok3GpmS9KgUSYcw21lf7vWF2ZM/CRwuu/0HwKfd/R3AOeChKBuWZUePjLHvuVOMXZzC3Rm7OMW+507VHIUSRpCKeGLN7NxPM/e3QpW4VOq+cWLeT7PPlYUCVeBmtgb4IPB7wK+amQF3Aw8WH7IL+B3gczG0MXJxdp+UHD0yFklgh9FMIE+smY384lOqxAXCT2AddH36or8q6J77GeBTQGmvWw6cd/dSp+4xYHW1J5rZsJntN7P9M5NvtdTYvIur7zuJSryeJHdQfXlEI87PURX5VQ0rcDO7Hzjt7gfM7GfDvoC7jwAjAL033OSl5WF28KQnEMiCeiE8tv8A5576BjPnztM1tIyh++9jYMsdC57fzkq80dyZqsSzqZ3bTJNvBOtCuQv4sJl9ALgGGAQ+Cywzs+5iFb4GGG20oq6p5iqzyue0EuhpHBbXqkbhffaxJ/CpKQBmzp3n7GNPACwI8TgoxPMjiW2V9xBvmITu/pvuvsbd1wIfB77t7j8P7AU+WnzYTuDJ2FpZoTRsrRPDOGrnnvrGXHiX+NQU5576xoLHxtGVAvW/NBtV/UnsnPrSCC/JzyzP26uVv5l/g8IBzR9S6BP/fDRNCidMkOcx8GfOnQ+1vJYku7EU4umWhs8qDW1IQqi90t3/2t3vL/7+uru/293f4e7/1t0vx9PEYBpV5XkMb4CuoWWhlsellSo8KXkNhTDS9BmlqS3tks49p0XlYd5qV0saJl9oxdD992E9PfOWWU8PQ/ffl1CLmpNUP2ceQyGoNH42aWxTnDoywLMs6i+MgS13sPzjH52ruLuGlrH84x+teQAzrn7wKCjEJYg8bS9dzCpDgkyiUM3AljvaMuKkFY1GpJQkNTIl76MdKuUpJNNMAR6D7qPzR1RO31L1HKea6k3wUC3Eg4Zfq4JcE2X96r6q07R1wlh+nQkYjaATdLRy1cm8fOFmf69KmcrwrrWskST73pv9Mli/uo8dm4cY7OvGzBjs62bH5iHe/i+ujbiFycp79dnK+w8zu9KGG041NRtTnijAG4hqvsooQ7xaFdyukRz1JnvYtnEpPd0VE1l0L+Ke1YMN1xvmSyMNlVXeQ7wZzYaxQrw2BXjKJRXijQK1WpAP9HZVfezSxdWXB32ttFKIB5dECOdh+yTaB16vmyDqmdrToPvoaOj+cKjdJ97sQc0olb/+hSszLFuy8L/UhSszNZ+f1fAuyUtfayuiCO8NN5zSTExVJBbgjfp4S/dnOcjX3XE9Wz58M9cOXcNb5y6xf/frvHEg2hCvFOUBzbAXuNozepEPvX0Zi7uuPufKzCx7Ri9WXXenyFOIJ1nVKsQXanuAhz04FzS40mbdHdfz3k/cTveSQvdB/3W9vPcTtwNEGuJxj0oprSdIkP/gzcK2vWf1IEsXd3Hhygx7Ri/OLY+qTWn80zhPIR6HY8+8yuGRF5g8PU7v9f1sGN7Kmh23Jd2s1MvEMMIshviWD988F94l3Uu62PLhm3njwOlIu1PCdqXUCsB6ARQ0yH/w5uT8wO6j8JMDCvGFgnSfHHvmVV5+dC8zlwvTC0yeGuflR/cCKMQbaGsH6qLL2TylPcyXRymUrx26pur95cu7j462fYhhveo1yIXyg07V1kldJBKvwyMvzIV3yczlaQ6PvJBQi7IjFRX4LesHuPOuFfQPdDM+Ns1Lz59p+3RkUZq+ZTVvnbtE/3ULg/+tc5cWLGvmxJ/KSryyCm+lGyXICStJBXQau0/KqQoPb/L0eKjlclXiAX7L+oF5M7gPDPawbXvhQEWaQnxsXW+oyve7L57nZ+5ePK8bZfryDPt3v97wuaVALw/yal9yB69M11pF9fU2MaEspGPcdZQa/Vnf6oEyhfhVh0+ubPh5917fz+SphWHde31/XM3qGIkH+J13rZgL75KenkXcedeKBQGepb7wUttLoXt1FMrpwOso9ZPX/JJ77lToEG9Gs4EUZCq3sO1oRdDhbKXHacRDe2wY3jqvDxyga0k3G4a3JtiqbEg8wPsHqjeh2vKkwztsFb5wZvoeqNI9Uq8fvPvoKHf+0ntrfskd3HsyUFtaDb+w1XjVqdwef4KuoSsMbtsU+guhXeFd+ZxmQ1xVeHClA5WNRqHoC3WhxAN8fGyagcGeqstjeb2yfuK0TPJQ3lVSrT88zJdcWNWCrd6O0ijIS/ef/8bTC6dyuzLF2S8+x+C2TfMCOe6ga+VEEo09nq+Zq0EG6UZZs+M2jThpQuIB/tLzZ+Z1DwBMTc3y0vNnIn+tyqF2pdthgjxsFR5WtQOYzXzJBTnIWNqpqo3BHXvntrrPbbQTT5+9EHh50C+FpCjEk6fPv7rEr4Vy9MgY+547xdjFKdydsYtT7Hvu1IL+71a7T+qNk076dPRGXnr+DFNT8wN5amqW77y68AzHaqoFYHl4v/zo3sJBJL86Bnfge/taanP38qWhlpfaWdnWJLpOolpP0l88adJKADf73Dx0YSVegUO1vuJoBQnoINe6Lom7Cq9UeUC0NArlSAQHMOuNwb33idua3nmWP7id0/9rN37lajeKLe5h+YPbGz5X/cfp1uykGqX/S2G+DFV519fWAJ9d0lyl20r1Haa6TnuIl3/JVX4mYd5n+Q4U1xjcwW2bADj7xeeYPnuB7uVLWf7g9rnljbS7eg1yKre6UqIRJMhb/ZzzUgA0DHAzuwb4DrCk+Pgn3P2/mNk64DFgOXAA+AV3v9JofaXgCRp+7R55EibE0yrMSTZxjsEd3LYpcGAnSadyhxfF1Hb6MmxdkLLtMnC3u28CNgPvN7P3AH8AfNrd3wGcAx4K88KNgnlsXW+s/d5RPC+pYY1hXrfRTrZheCtdFZeATcMY3CgqqMBTd+lU7o6Sl+obAlTg7u5AqUTrKf44cDfwYHH5LuB3gM+FefE4A7DVA5NprcSrfWbl7zXsKe5Bx+C2U2kHbLXKCzJ8DXQqd7OSmmBargrUB25mXRS6Sd4B/AlwFDjv7qWy5RgQ/tJ6KRckxNvZFx72Cy/ozlVrDG4Sf+ImUT3pVO7mpS3E81R9Q8BhhO4+4+6bgTXAu4Hbg76AmQ2b2X4z2z916a0mmxlO2ocFNqNWeId9r+2YEbwZ08f7qu587dgh09qNJOHkLbwh5CgUdz9vZnuBrcAyM+suVuFrgKrng7v7CDAC0L/8Jm+xvQ1FHd5p7Uqpprz7pN7Y73qSCO4gj4mzytOp3K1JQxWex/CGYKNQ3gZMFcO7F7iXwgHMvcBHKYxE2Qk8GWdDg+jEyjsqcVyBr9kzJ9u5swXtB9ep3K0pbdMkgjyv4Q3BKvBVwK5iP/gi4Mvu/pSZHQIeM7PfBf4e+HyM7WwozvDOUhUOC3eiKMM7aMUctaSrvCi/4DpZu7dTHj/jckFGoXwPeFeV5a9T6A9PXB4q72YvpRvVqeRZ3lGCVuESjXaEeJb/P0Yp88nXSeHdaOx72NEunRberbQjiWtx5Fmtg9JpXW9WpeJaKM1od3DH2Y1SGdr1hiY2mkotSp22o4StxFsJ7k777JpV/jm0UpXr86wucwGexYq73pyfzXSLtGNmorTuMFGc3FMS9lro0ppq/6eqbcu0/t9Lo8wEeBaDG+rP+VlvOrRGJwjFGeJ52YHiCuu8fH5R0GfVmrYG+ExPuEkUshLa9cK21pyfW/712zj47InQ6y2v5scmZ9h36AJHRicy81lFIekRKSJpkVgFnsXAqdcPXivEa017NtDbVXV5vfVWVvODfd3s2DwEwAEuBVqfxEsVpbRT9lI0xapeaKrGtGdjkzNXH7N60byfWuutWs13L2LbxsIsN33HWt+cWQmgNLYzjW2SzqYAD6nRXw6loYCln++8epGp6Yrp0KZnefbkxZqBXW352LreutV8+V8GCpL202cuScjMQcw0CTOk8Mhooa9228alDPR2ceHKDHtGL/KDNwvdIrUu/9p3bNGC4wVjkzMM9i3cZOXVfLkgw+ayPOoiLX3hCm9JigK8SWEOxh7gEgcOXe2jnlgzCw32+VKwlwf5vkMX2LF5iJ7uq9X51NQs+w5dnem979giJtbMzoVbp5+FmHSIK7wlSQrwFoU5GFtZbQcJnoli0vcdW8QBLvH6F7/Fob99inNvnmVo6Do2/7P7eOumzUDtk3pe/MpJLj7+rQVX2qusvoOEUbV+9rCTSEQtqRBXeEvSFOAxqxZu5WHTaGLX0mMn6OPKM3/PoW99GZ8uzPT+5ptn+evnH2fDzZfof/d75p5XXoVPHH2Be/7ka/zezCw/BfzjqXF+67/vYc+FQQa3Be8+qXeAtPy+pMO8HRTckhY6iBmDiTWzcz8l3TdOzP1AIbgbdW2UP6b7xglO/s3X58K7ZHZ2iteOPzd3u9SlUwrV7X/6NCMzs6ylsLHXAiMzs9z7hafnradeKIUZ3RLFSJhmtCNUdR0OSRtV4BGoV3U2urTr3Steqbvub5+5fe45r50/X/UxVyaqLwf43YlJrq1Ydi3w38Yn2VG8HVV4Vz6n3dV4XNekVmhLWinAm9AomOrNhnPsmVfnZn4ZWnUNgw/fzJYPraq5rlLAf/vM7TXnblzct4z1q/sWjnQ5NslP1VhvaXnU4V35/CS6VFrtE1dgS1YowENoJbihEN4vP7qXmcuFk3vOHb/E479dCOh6IQ6FID82vHXe8wGsu4d33f9z80anLFvSzYfevgyA4719rJlc2K7Ra+t3B0TVFZJkiIt0OgV4AEECKMgsOIdHXpgXvgBTl2b5+mde57c/ca7qep8e3zj3+y8+OMtf8D6+97nvMn32Al3LlnHDv/ogv3T/9nlDCwEWdy3intWD/PHdP8fvfPMx+maujhWf6Orif/6bB2q+l6T6sUUkHAV4A1GF990rXmH36YXdHwDnT9S+jskH+g/NC/HS3I2lIYDTx/tYurj6dVWWLu7i6Y13APArf/N1bjx3nuNDy/jD++9j95Y7qj4njvBOqgoX6XQK8DqiDG+AoVXXcO74wrBedWPw0Lx7xStzBzZLIX5+Zoah7oWb8sKVQtX99MY7eHrjHQ3fT5DwrnXiUjsvTtZ944S6SETQMMKamqkY64U3wAcfvpmeayouRnXNIn71NwbCN7Co+8YJvjV+gSuz89t7ZWaWPaMX5y0LOpa7mv7R2bpnnTa6v5nKvnzoZeUwzFrLRfJEFXgVQcO7UWhUDhEsHaj8+mde59yJSwytuoYPPnwz3feuAg411VaAg5cK7Xh/71KWLl54vZVyzQRpmKnkopjirdkwLj1P1bnkhQK8Qtx9tVs+tKrqiJOnxzfygf6FIV7e/13PwUsTHLw0EXkfdjPzgDYb4lFV0epikbxoGOBmdhPwF8BKwIERd/+smV0HPE7h5L4fAR9z9+pDKSSQoGFdqTywJtbMRhbiYcK7fBx6aaagykkm6h3MjLoLRCEueRBkT58Gfs3dNwLvAX7ZzDYCjwB73P1WYE/xdqZlYaTEt8/c3vAxcb+PgTcm5/1sXlyYGWiwrxszm5sp6A6uibUdInnXMMDd/YS7/13x9zHgMLAaeADYVXzYLuAjcTVSCoKEd9yqTRt3510rFoxDL58pqJG4DkDqwKZ0ulB94Ga2FngX8CKw0t1Ls/KepNDFUu05w8AwQM/gULPtzKRvn7m94bVOgqyjmvJLwVbrKmi1K6Va90mtiZtbnfczTupKkU4WOMDNrB/4K+Bhd79oZnP3ububmVd7nruPACMAvTfcVPUxWVV5zY1WJ08IWmEHnUUnyv7wesbHphkY7FmwvNZMQeVUJYs0L1CAm1kPhfD+S3f/anHxKTNb5e4nzGwVcDquRmZZKZRrVeKthnYaqsuXnj/Dtu0r5024PDVdmCkoimGFrVIVLp0qyCgUAz4PHHb3Pyq7azewE/j94r9PxtLClAtahTfTf92o0g4SSu2owo8eGQMKfeH9A91zo1BK84GKSDyCVOB3Ab8A/IOZHSwu+88UgvvLZvYQ8GPgY/E0MXta6UoJ0j2Sxmry6JGxuSAfW9ebcGtE8qFhgLv7/wOsxt33RNucbKp2/emwIZ6F4B5b11vzQGYt9bpP2tn/rW4U6UQ6EzMitUIcGs972Wi9SRhfvaipszDrVd9ZGGcvkiUK8AjVmgkm6KiRautLm2aq8FZUva56k5+nSKfR1QgjFkXoRjl5bhwHMGtV2VH3fdf6y6WVoZoinUQBHoNWAjhNVXe9/uvysB5b19u28A56fzUacy6dRl0oMQo6S3pcoR338MFGoR3F+O/ySaB7r+9nw/BW1uy4DWDepBYieaQAb4M0VdVZUjkJ9OSpcV5+dC/AXIiL5Jm6UDpUJ0xMXG0S6JnL0xweeSGhFomkS/b3clmgE8IbYLLGJNC1lovkTWfs6TInzeFd2bZ6XUuHT66k9/r+qvfVWi6SN+nd2xOQ5vALIm3tb+ZEoHIbhrfStWT+YZquJd1sGN7a0npFOkW69niRMmPv3MamT72P3pX9YNC7sp9Nn3qfDmCKFGkUSodIW/UdVK2zV0vG3rmNe5+oHthhhxBqNJB0GgV4B0hLeLc6sXEtlRcG09hvkQIFeIVmAkYK4b1j89Dc3JiliY05eG5BiDdDoS2yUDpKN2laWqrvbRuXNj2xcTu6NtR9Ip0oHXu/ZF6tCYzTMLGxSKdSgFeRlqq2kTS1s9YExtWWV2u3KmSR8NKTAJJp+w5dYGp6/rGD0sTGSdOXg3QqBXhGtav6DnpFwSOjEzxz8BwXJ6Zxdy5OTPPMwXOhJjaOI2gV3tLJNAqlBo1GCe/I6ESqZqJXeEunUwWeQe3u+47iut5BRRW6Cm/Jg4Z7ppl9wcxOm9n3y5ZdZ2bPmtlrxX+H4m1mMtJ0kDCraoV/nJ+twlvyIshe9OfA+yuWPQLscfdbgT3F29IGSX2pZKUKV3hLnjTcK939O8CbFYsfAHYVf98FfCTidkkVSf9FEDbEWwn9sPOKRjkRtEhWNHsQc6W7nyj+fhKoeZ6zmQ0DwwA9g9nradHBzPlKodzoUrFRVez15hVVYEvetTwKxd3dzLzO/SPACEDvDTfVfFyapSHEk66+K1UL8ji7WRTWIgs1G+CnzGyVu58ws1XA6SgbJfOlLbzLtbNvXETma3bv2w3sLP6+E3gymuakV5pDNIuS/otGpBMEGUb4JeAFYL2ZHTOzh4DfB+41s9eA7cXbEgN9cYhILQ27UNz9EzXuuifitqReu/vCFd4iUo8SIqUU3iLSiFIiJAWriKSF0qgJcYd4p39J6ACmSDQ6OyliFFfIdnp4i0h0lBYpovAWkZBRX28AAAVASURBVDCUGC2IMnDzEt7qPhGJTj5SI0Z5CV4RSR+lTwrk5UtA1bdItPKRHDHLSwCLSLooeaQtVH2LRE8BHpFWqnCFm4g0QwEusdMXlEg8FOAp0akh16nvSyQNFOARiSKoFHYiEoYCXGKjLySReCnAU6ZTQq9T3odIminAUyjr4Zf19otkhQI8AnEEVlZDMKvtFsmiZmellzYohWEWzvRUcIu0X/qTQVIfjmlvn0inUoC3qF3hldaQTGu7RPJAXSgZkqYuFQW3SPJaSgIze7+ZHTGzH5rZI1E1SuqbWDObWIAm+doiMl/TFbiZdQF/AtwLHANeMrPd7n4oqsZJfe2syBXaIunTShfKu4EfuvvrAGb2GPAAkJsAT0uoxRnkaXmPIrJQKwG+GvinstvHgH9Z+SAzGwaGizcv/+B//Or3W3jNrFsBnEm6EQmp9t6vA9Y1eN4bwJuxtKi98rztQe+/1ff/9moLYz+I6e4jwAiAme139y1xv2Za5fn95/m9g96/3n8877+Vv7lHgZvKbq8pLhMRkTZoJcBfAm41s3Vmthj4OLA7mmaJiEgjTXehuPu0mf0H4FtAF/AFd/9Bg6eNNPt6HSLP7z/P7x30/vX+Y2DuHsd6RUQkZsmf0iciIk1RgIuIZFRbAjxvp9yb2U1mttfMDpnZD8zsk8Xl15nZs2b2WvHfoaTbGicz6zKzvzezp4q315nZi8X/B48XD353JDNbZmZPmNkrZnbYzLbmZfub2X8q/r//vpl9ycyu6eRtb2ZfMLPTZvb9smVVt7UV/HHxc/iemf10K68de4CXnXJ/H7AR+ISZbYz7dRM2Dfyau28E3gP8cvE9PwLscfdbgT3F253sk8Dhstt/AHza3d8BnAMeSqRV7fFZ4JvufjuwicLn0PHb38xWA78CbHH3f05hgMPH6ext/+fA+yuW1drW9wG3Fn+Ggc+18sLtqMDnTrl39ytA6ZT7juXuJ9z974q/j1HYeVdTeN+7ig/bBXwkmRbGz8zWAB8E/rR424C7gSeKD+nY929mS4GfAT4P4O5X3P08+dn+3UCvmXUDfcAJOnjbu/t3WHi2cK1t/QDwF17wt8AyM1vV7Gu3I8CrnXK/ug2vmwpmthZ4F/AisNLdTxTvOgmsTKhZ7fAZ4FNA6WIqy4Hz7j5dvN3J/w/WAT8B/qzYhfSnZnYtOdj+7j4K/CHwjxSC+wJwgPxs+5Ja2zrSPNRBzBiZWT/wV8DD7n6x/D4vjN/syDGcZnY/cNrdDyTdloR0Az8NfM7d3wW8RUV3Sadu/2Jf7wMUvsRuBK5lYfdCrsS5rdsR4Lk85d7MeiiE91+6+1eLi0+V/lwq/ns6qfbF7C7gw2b2IwpdZndT6BNeVvyzGjr7/8Ex4Ji7v1i8/QSFQM/D9t8OvOHuP3H3KeCrFP4/5GXbl9Ta1pHmYTsCPHen3Bf7ez8PHHb3Pyq7azews/j7TuDJdretHdz9N919jbuvpbC9v+3uPw/sBT5afFgnv/+TwD+Z2frionsoXGY5D9v/H4H3mFlfcT8ovfdcbPsytbb1buAXi6NR3gNcKOtqCc/dY/8BPgC8ChwFfqsdr5nkD/BeCn8yfQ84WPz5AIV+4D3Aa8BzwHVJt7UNn8XPAk8Vf78Z+C7wQ+ArwJKk2xfj+94M7C/+H/i/wFBetj/wX4FXgO8D/wdY0snbHvgShf7+KQp/fT1Ua1sDRmFU3lHgHyiM1mn6tXUqvYhIRukgpohIRinARUQySgEuIpJRCnARkYxSgIuIZJQCXEQkoxTgIiIZ9f8BBGPEczyOIagAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] } ] }