{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
Please cite us if you use the software
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Example-8 (Confidence interval)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Environment check" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking that the notebook is running on Google Colab or not." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "try:\n", " import google.colab\n", " !{sys.executable} -m pip -q -q install pycm\n", "except:\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Install matplotlib" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide_output": true }, "outputs": [], "source": [ "!{sys.executable} -m pip -q -q install matplotlib;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot function" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pycm\n", "\n", "def plot_ci(cm, param, alpha=0.05, method=\"normal-approx\"):\n", " \"\"\"\n", " Plot two-sided confidence interval.\n", " \n", " :param cm: ConfusionMatrix\n", " :type cm : pycm.ConfusionMatrix object\n", " :param param: input parameter\n", " :type param: str\n", " :param alpha: type I error\n", " :type alpha: float\n", " :param method: binomial confidence intervals method\n", " :type method: str\n", " :return: None\n", " \"\"\"\n", " conf_str = str(round(100 * (1-alpha)))\n", " print(conf_str + \"%CI :\")\n", " if param in cm.class_stat.keys():\n", " mean = []\n", " error = [[], []]\n", " data = cm.CI(param, alpha=alpha, binom_method=method)\n", " class_names_str = list(map(str,(cm.classes)))\n", " for class_index, class_name in enumerate(cm.classes):\n", " print(str(class_name) +\" : \" + str(data[class_name][1]))\n", " mean.append(cm.class_stat[param][class_name])\n", " error[0].append(cm.class_stat[param][class_name] - data[class_name][1][0])\n", " error[1].append(data[class_name][1][1] - cm.class_stat[param][class_name])\n", " fig = plt.figure()\n", " plt.errorbar(mean, class_names_str, xerr=error, fmt='o', capsize=5, linestyle=\"dotted\")\n", " plt.ylabel('Class')\n", " fig.suptitle(\"Param :\" + param + \", Alpha:\" + str(alpha), fontsize=16)\n", " for index,value in enumerate(mean):\n", " down_point = data[cm.classes[index]][1][0]\n", " up_point = data[cm.classes[index]][1][1]\n", " plt.text(value, class_names_str[index], \"%f\" % value, ha=\"center\", va=\"top\", color=\"red\")\n", " plt.text(down_point, class_names_str[index], \"%f\" % down_point, ha=\"right\", va=\"bottom\", color=\"red\")\n", " plt.text(up_point , class_names_str[index], \"%f\" % up_point, ha=\"left\", va=\"bottom\", color=\"red\")\n", " else:\n", " mean = cm.overall_stat[param]\n", " data = cm.CI(param, alpha=alpha, binom_method=method)\n", " print(data[1])\n", " error = [[], []]\n", " up_point = data[1][1]\n", " down_point = data[1][0]\n", " error[0] = [cm.overall_stat[param] - down_point]\n", " error[1] = [up_point - cm.overall_stat[param]]\n", " fig = plt.figure()\n", " plt.errorbar(mean, [param], xerr=error, fmt='o',capsize=5, linestyle=\"dotted\")\n", " fig.suptitle(\"Alpha:\" + str(alpha), fontsize=16)\n", " plt.text(mean, param, \"%f\" % mean, ha=\"center\", va=\"top\", color=\"red\")\n", " plt.text(down_point, param, \"%f\" % down_point, ha=\"right\", va=\"bottom\", color=\"red\")\n", " plt.text(up_point, param, \"%f\" % up_point, ha=\"left\", va=\"bottom\", color=\"red\")\n", " \n", " \n", " plt.show()\n", " \n", " \n", "\n", " " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "cm = pycm.ConfusionMatrix(matrix={0:{0:13,1:2,2:5},1:{0:1,1:10,2:6},2:{0:2,1:0,2:9}})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## TPR" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "95%CI :\n", "0 : (0.4409588557245249, 0.8590411442754751)\n", "1 : (0.3542806291426003, 0.8221899590926939)\n", "2 : (0.5902508705143656, 1.0461127658492708)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ0AAAEVCAYAAAA7PDgXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XeYVOX1wPHv2UavUqQvTTqIgAqogAURA1gIYlRsMcaoMcYoWKImJtafsWJH0RhBRQSkKdJUVOoiTaWXBaR32H5+f7yzzu6wZbbNnZk9n+eZhzvvbWeGvXPmLfcdUVWMMcaYUIjxOgBjjDHlhyUdY4wxIWNJxxhjTMhY0jHGGBMylnSMMcaEjCUdY4wxIWNJJ4KIyA0iojkeR0TkBxG5Q0TivI6vLIjIvIDXnN8jUUT6BpSdEJE1IvKwiFTKccyxAdsdF5FlInJTKcX8kO+4E/NZn/3/mFiMY48VkeSSxhjEeWJE5H4R2SwiKb6/syuLsP9lIpLk23eL7z2JDdjm0Xz+LyeV/isy4SIqP6jKgd8CyUB13/JLQD3gYS+DKiN/wr3ObH8HegCDA7bbCST6lv8MLAYqAxcDjwCtgBE5tt+T4xj1gbuAMSJyWFUnlDDm7PNcKiKnqOq+Eh7PC48BfwMeBJYCw4GPReQ3qjq9oB1F5GLgE2AM8FegK/A4UA0Ymccu5wCZOZ7vL3H0Jnypqj0i5AHcACjQKqB8LnC4FI4fC8R5/ToLiXEskJzPur6+9+fCgPJ3fOW18zsGUBU4AMwsYXy9fOea5vv3jgL+HxNL8/WX4ntcD0gF/hFQPhtYEcT+ScD8gLKHgTTg1Bxlj/reh7D+m7NH6T6seS06LAaqiUg9ABEZLiJzRGSPiBz1NXNcH7iTrynj3yIySkQ24T4UOolIRRF5TkRW+fb/RUQ+E5G2AftnNxP1EpGPfM19u0Tkft/6Ab5zHxORxSLSLQTvRV4W+/5tld8GqnoUWAs0LeG5rsd9a78F2Ebu2lW+fM1Y74vILSKy3tcstUxE+uWzfVcR+drXNLhORP4YsL6uiLwuImt922wTkQ9EpFEQ4VwMJADvB5S/j/v7aF7A62gCnJ7Hvv8F4oFLgji/iWKWdKJDc9wH3VHf8xbABOAa4DLgM+CtwA8mnxuAS3FNKZcCO4AKuKaQf/nKbgMqAt+LyKl5HONdYCVwOTAJeFxEngKeAZ4CrgKqAJNEJKGgF5KjX+aGYF54kLI/JA8WcN5YoAmwobgnEZGKwDBglqruwH3w9hCRdkEeog+uOepBXHNWKjBDRNoEbFcd+MB3/CG4pPpqQIKqDaQA9wMDgHuB1sACX5zZMSf63u9Hc+zbwXfu9QHnXe37t30Br6GD799VOQtVdRNwPJ99t4lIpq/v56mc/W8m+lifTmSKFTdwoBruQ+4K4DNVPQ6gqo9nbygiMcA8oAEuebwWcCwB+qvqiYDy3+c4RizwObALuBp4LmDb/6rqY75t5+GSz1+B03wfNtlxTAZ6AvMLeG2KS6BZBWxTmBjf+1MZ6I973ctVdW3OjcQ/+KIe8ABQA5doi2sIUBN4z/f8XdyH/vXAqCD2rw/0VtWtvvhmA1uAh4DrcmxXDfiTqs71bfcV7nVejWtqRVV/xvVT4dsmFlgAbMXVNj71rcrr/a4NHFTVwIkZ9+dYn5/sdQfyWHcgYN/1uPclyRdHf+Bu4AzgogLOYSKYJZ3I9FOO5Szgf8BfsgtEpDXwT+A84FT8NdrUPI41M4+Eg4gMA+4B2uA+jLMFfusGmJG9oKoZIrIeqJGdcAJibpLPa8refz4l/7v8POD5VOCOgLJGQHrOUwNXq+rCEpz3euAwrraHqv4sIguBa0XkAVUtLJF+n51wfPsfEZFpuESd0/HshOPbLlVE1hHQNCgitwF/BFriaprZ2uTYdwsnv9+Cez8CSSHx59ym0P1VNbAJbpZvZN7zInKhqn4ZxPlMhLHmtch0OW4EV1ugiqqOUNX9ACJSFZgFdMF9izzXt+3buGazQDsDC0RkEPAh8CPwO+As3zH24JrZAgV+q03Lp4x89i9tt+Pi7QhUVdVBvg/XnHb7tjkL9xo3AW8H9lsFy9fs2B83gKCCiNQUkZq4UVyNgAuCOMyufMoC+2HyqkWkkuO9FZE7gVeAL3E14TOBs32rC/s/2A/UEpHAJFMrx/qC9oW8a0M1C9kXYJzv3x6FbGcilNV0ItMqVQ1sb8/WE2gGnKuq32QXSv738eT1jXQ4sF5Vb8ixfzwFN6uEk7WquqSQbdJzbLNIRJYBK4Bncf1YRXUtbvTf1b5HoOtxXwYKUj+fsu3FiGc4MFtV78kuKGgAQIDVuC8oLcndr5PdH7OmkH3B9e18l+PcibjmzoL2zcl+cyVKWU0n+lT2/ftr05GI1ML1NxTlGBkBZdfhPlSjkq8PZDQwUESK8y17BK7/pV8ej5nA5SJSrZBjnO0b/QWAb/tLyfHhXQSVyd18CHBjkPvOxNVMrwkovxb3hWfTybs4vubBH/LZN50cTbH5yN6vJM2cJoxZ0ok+3+L6FUaLyKW+vpn5wN4iHGMm0NY3bPoCEbkP10eU7+iv0iIifUQkQ0SCGmpcyp4EjpHjJttgRtOJyBlAJ+AdVZ0X+ABewCWBoYWcfxfwhYhcJSKXAV/g+mIeK8ZrmQlcLCIPiMiFIvI4rvYTGHsz3/v962tW1d24wSL3i8hffe/Bq8D5uAEXOfef7evDy+kBoI9vyHZfEbkbNxjiBVX9Jce+SSJyt4gMFJFLROQ/wNO4fsa5mKhkzWtRRlX3iMjluGaiCbgh0C/gmsYeCfIwb+I6/G8CbsUNyR2Ef8RTWRJcjSrkX4hUdbeIvIj7sO2qqkn4O+B/KWDX63HNQWPzWf8F7p6d63E3quZnPm6k4eNAY1xT1CWBo+6C9E9cH8rduD6c+bj7bzYGbJff+/0gbgj+XbjBKD8Dw1T1s4DtYgn4HFHV6SIyFPf3dgMumT4O/Dtg359xAzwa+I6zwRf308G/TBNp5ORRkcaYbL4awmCgUx5DiEvzPJuBb1T12rI6hzHhwJrXjClYH+Dxskw4xpQn1rxmTAFUtbfXMRgTTax5zRhjTMhY85oxxpiQsaRjjDEmZCzpGGOMCRlLOsYYY0LGko4xxpiQsaRjjDEmZCzpGGOMCRlLOsYYY0LGko4xxpiQsaRjjDEmZCzpGGOMCRlLOsYYY0ImrGeZrlOnjiYmJnodhjHGRJSlS5fuVdW6XseRJ1UN20e3bt3UFGLGDNXTTlNt2VL1iSdOXv/OO6p16qh26eIeb77pX3fffaodOrjH+PH+8o0bVc88U7VVK9Vhw1RTU135s8+qtmun2qmT6vnnq27e7N8nJsZ/jkGD/OUvveRiA9U9e0r1pRsT9W68UbVuXXeN5iUrS/XOO9011qmT6tKlqqoKLFFVFKorbFd4WbM/WyFB4Q2FtQo/KVzpKz9PYZlChsJQzfl5DDMVDipMDSgfo/CDwgqFCQpVtZDPdWtei2SZmXD77TBjBqxZA+PGuX8DXXUVLF/uHr//vSubNg2WLXNlCxfCM8/A4cNu3ciRcPfdsG4d1KoFY8a48q5dYckSWLEChg6F++7zn6NSJf85pkzxl/fuDV9+Cc2alc17YEw0u+EGmDkz//UzZrjrdN06eOMNuO22wC0ew/1UeU4PArtRPQ1on2P9VtzPi3+Qx5meAa7Lo/xuVLug2tm3/x0Fvh6sTyeyLVoErVpBixaQkADDh8PkycHtu2YN9OkDcXFQpQp06eL+uFVhzhyXVACuvx4mTXLL/fpB5cpu+eyzITm58PN07QrWRGpM8Zx3HtSunf/6yZNhxAgQcdfkwYOwc6dbJ9INqA98EbDXTcATAKhmobrXt7wZ1RVA1knnUZ0NHMmj/LDvXAJUAgr9gTZLOpFs+3Zo0sT/vHFjVxbok0+gc2eXSLZtc2VdurhvScePw969MHeuW7dvH9Ss6ZJRQcccMwYuucT/PCUFund3f/jZScoYU7by+QzwfbA/C9yba3uRmr6lxxBZhsjHiNQvUQwi7wC/AG2Blwrb3JJOJMvrV19Fcj8fNAg2b3ZNYhde6GouAP37w8CB0KsXXH019OzpEk0wx3z/fdfMdm+Ov+etW13ZBx/AX/4CGzYUGPpzs9YW/vqMKceCukbyuV5HQl1gOqrbAtbGAY2BBaieAXwH/F+JAlW9EWgI/AhcVdjmlnQiWePG/poLuOauhg1zb3PKKVChglu+5RZYutS/7sEHXR/MrFnuj7d1a6hTx1XRMzLyPuaXX8K//+36bbKPC/5tWrSAvn0hKanA0F+Yva5or9WYciaoaySfz4CzoSpwByKbcUllBCJPAvuA48Cnvj0+Bs4ocbCqmcCHwJWFbRrSpCMiTURkroj8KCKrReSuUJ4/6vTo4ToQN22CtDQYPx4GD869TXb7LrhE0a6dW87MdE1p4GpBK1a42o+I67uZMMGte/ddGDLELSclwa23uuPUq+c/7oEDkJrqlvfuhQULoH370n+9pkxMStpO7yfn0HzUNHo/OYdJSXk0p5rwNHgwvPee+9L4/fdQowY0aMAQ2IRqU1QTgb8B76E6Cjey7TOgr+8IFwB5jD4Kgogg0urXZRgE/FTYbqG+TycDuEdVl4lINWCpiMxS1eK96PIuLg5efhkuvtglkZtugg4d4OGHXf/K4MHw4osuScTFuQ7JsWPdvunpcO65brl6dddklt2P89RTblDCQw+5gQA33+zK770Xjh6F3/7WPW/a1B37xx9dMoqJgawsGDXKn3RefBGefhp++cX1Kw0cCG+9FbK3yBRsUtJ27p+4khPpmQBsP3iC+yeuBOCyro28DM2Aa/qeN899mWvcGP7xD3ftAvzxj+56mj7dDSiqXBneeSeYo44E/ovI88Ae4EYARHrgakC1gEGI/APVDr51X+P6bKoikgzcDMwC3kWkOiDAD8BJw+cCiebVJhgiIjIZN358Vl7ru3fvrkuWLAlxVCYUEkdN46zmBYzKMSGRtPUgaZknD1ZKiI2ha9OaeexhQmXhpv1sfvLSYu0rIktVtXsph1QqPOvTEZFEoCuwMKD8DyKyRESW7Nmzx4vQjCk38ko4BZUbU2KF3T1aFg9cJ9dS4IqCtrMZCaJXs5FTvQ4hchU2C8WWLap9+6qefrq7S33aNFe+d68rr1JF9fbbVVW11xOztdnIqXrnoHv1xzrNdE3dRJ3X/Ay95KGJbp+PPlJt315VRHXxYv850tJUR4xQ7dhRtW1b1ccfd+Vbt7pztG3r9nv++TJ8I6JbSa4RsmckCMNHyGs6IhIPfAL8T1Unhvr8xkS0YGah+Ne/YNgwN/Bj/Hj4059cecWK8Nhj8H//R2aW8tXaPdx7cRuqxsLDs9/g6qsf55KbXmb9qS34z+6v3T4dO8LEie4mxZw+/tgNHlm50o2IfP11NzQ/Lg6efdb1833/PYwenfcsGabcCvXoNQHGAD+q6n9CeW5jokIws1CI+Kc0OnTIP5y9ShU45xyoWJGV2w9x49jFnN6kJv8e0oFYgSrpqTSqUZHzG1akbbe2bp927aBNm5PjEIFjx9zQ+hMnXCzVq0ODBnCGbwRutWpu/7xuLjblVqhHr/XGzd+zUkSW+8oeUNXpIY7DmMiU1x3oCxfm3ubRR93w95deconhyy9POkzHhjV4/dpuJNapQmKdKjD2Lb656SaXmFq3hpvHFhzH0KEu2TVo4Ga1eO65k6dr2bzZ1bbOOqs4r9REqZDWdFT1G1UVVe2sqqf7HpZwyqG7LmjtdQiRKZgZI8aNcxNFJie74bTXXQdZWRxLzeCZz38iPTOLuFjhwva+2U/S0+HVV12C2LHDDW1/4omC41i0CGJj3fabNrkmtY0b/euPHoUrr4Tnn3c1IFNk0XqN2IwExhN3X3Sa1yFEpmBmoRgzxvXpgJveKCUF9u7l2w37eH3+RjbvO5Z7++W+RoeWLV0CGzYMvv224Dg++AAGDID4eHejcO/ebhokcEnsyivhmmvgiiuK/1rLuWi9RizpGBNJgpmFomlTmD3bLf/4o0s6detyUfv6zP1bX1rXq5Z7+0aNXGd/9i0Ks2b5Z67IT9OmbjZyVdeE9/330Late37zzW7/v/61dF6ziS5eD58r6GFDpo3Jw7Rpqq1bq7Zoofqvf7myv/9ddfJkt7x6tWqvXqqdO2tGp8765N0v6KrtB926Zs1Ua9Vyw6YbNXLbqqq++qob5typk+pvfuOGV6uqTpzotktIUK1XT7V/f1d+5Ijq0KFuWHS7dqpPP+3Kv/5aFdxxsn/UL3vItgkZwnjItKczEhTGZiQwpmSSDxznujGLeHhQe/q1qVf4DiYqhPOMBKEevWaMCYFjqRlUqRBH41qV+eLu84iPtZZ0Ex7sL9GYKHPweBqDX/6G0XPXA1jCMWHF/hqNiTLVK8bTq2Udujer5XUoxpzEmteMiRLbD56gcnwstaok8NhlHb0Ox5g8WU3HmCiQkZnFdWMWcse4ZV6HYkyBrKZjTBSIi43h4d+0p07VCoVvbIyHLOkYE8HW7z7K9oMn6HNaXfrakGgTAax5zZgI9u9pa3hg4kpSMzK9DsWYoFhNx5gI9txVp7P/WBoV4mK9DsWYoFhNx5gIs2r7IR6dspqsLKVm5QRa1K3qdUjGBM2SjjER5pv1e5m1Zhd7j6V6HYoxRWbNa8ZEiMwsJTZG+GOfllx9ZlNqVIr3OiRjisxqOsZEgEWb9jPg+a/Ytv84gCUcE7Es6RgTAapUiKVGpXgqxNklayKb/QUbE8Z+OZQCQIeGNfj4jz2pV72ixxEZUzKWdIwJU8u2HqDPM3OZvnInACLicUTGlJwlHWPCVIeG1RnRsxm9Wp7idSjGlBpLOsaEmQXr93IiLZMKcbE8eGl7alZO8DokY0qNJR1jwsj2gye44Z1FPD97rdehGFMm7D4dY8JIo5qVeP26bpzV3JrUTHSymo4xYeCjJdtI2noAgPPb1qdKBfs+aKKTJR1jPJaSnsnouet5e8Fmr0MxpszZ1yljPFYxPpaPbu1Jzco2y4CJflbTMcYjb3y1gadm/oSqUr96Rft5AlMuWE3HGA+oKpv3HefwiXSyFGLtvk9TTljSMSaEVJXjaZlUqRDHv4Z0RIHYGMs4pvyw5jVjQuiF2eu44pVvOZySTkyMWMIx5Y7VdIwJoTMTa3PweDpVE+zSM+WT/eUbU8ZUlR93HqF9w+r0alWHXq3qeB2SMZ6x5jVjytiYbzYxZPQ3rN11xOtQjPGc1XSMKWPDejQhIS6G1vWqeh2KMZ6zmo4xZSAzS3n/+y1kZGZRvWI8I3om2u/hGIMlHWPKxLyfd/PQpFXM+Wm316EYE1asec2YMnBBu/p8clsvujWr5XUoxoQVq+kYU0pSMzK5f+IKNu45CmAJx5g8WNIxppTsOpTKrDW7WLL5gNehGBO2rHnNmBLKzFJiY4Smp1Rm9j19qVHJZos2Jj9W0zGmBE6kZXLdmIW8++1mAEs4xhTCko4xJRAXK9SoFE/1StZoYEww7EoxphgOp6QTK0KVCnG8cs0Zdg+OMUGymo4xRZSVpdzw9iJu/e9SVNUSjjFFYDUdY4ooJka4oXdzKsfHWsIxpogs6RgTpL1HU9m2/zhdm9ZicJeGXodjTESy5jVjgvTgpyu55b2lnEjL9DoUYyKW1XSMCdI/h3Rk6/7jVEqI9ToUYyKW1XSMKcCOgycYPXc9qkr96hXpkVjb65CMiWiWdIwpwMRlybw2fwPJB054HYoxUcGa14wpwO39WjHk9EY0qV3Z61CMiQpW0zEmwIY9R/ndm9+z+0gKImIJx5hSZEnHmAAHjqWRfOAEB4+nex2KMVHHmteM8TmelkHlhDi6J9Zm9j19iI+172TGlDa7qowB1u06wnlPz+OL1b8AWMIxpozYlWUM0LBmJXq2PIU2p1bzOhRjopo1r5lybe2uIzSvU4UqFeJ46equXodjTNSzmo4pt3YfSeGKV77lyRk/eR2KMeWG1XRMuVWvWkUeHtSePqfV9ToUY8oNSzqm3Fmwfi91q1XgtPrVGNa9idfhGFOuWPOaKVfSMrK4f+JKHpu6xutQjCmXrKZjypWEuBjG3tiDWpUTvA7FmHLJajqmXJixcidvfrURgBZ1q1KriiUdY7xgSceUC1+s2cXM1b+QnpnldSjGlGvWvGaiWmaWEhsjPD20M2kZWTbTgDEesyvQRK2Plmxj2OvfcTQ1g/jYGKpUsO9YxnjNko6JWjUqxVOzUjxxMeJ1KMYYH/vqZ6LOL4dSOLVGRS7ucCr929dHxJKOMeHCajomqkxYmky//5vHmh2HASzhGBNmLOmYqNK3TV1G9GxG6/pVvQ7FGJMHSzomKsz5aReqSp2qFbh/YDsbpWZMmLIr00S8r9ft4aaxS5i8fIfXoRhjCmEDCUzEO6dVHV655gwGdDjV61CMMYWwmo6JSKrK6Lnr2XnoBCLCwE4NiLGh0caEPUs6JiIlHzjBa/M2MHHZdq9DMcYUgTWvmYjUpHZlpt91Lo1rVfI6FGNMEVhNx0SMzCxl5IQVfJqUDLjEY/fhGBNZrKZjIkZ6ZhZb9x+nkdVujIlYlnRM2EvPzCJLlYrxsbx385l2D44xEcyuXhPWVJU/j0vi9v8tIytLLeEYE+GspmPCmojQu1Ud0jOzbEi0MVHAko4JSynpmSQfOEGrelW59uxmXodjjCklxWqrEJG7RKS6OGNEZJmI9C/t4Ez59eCnq7jq9e84nJLudSjGmFIUXNIRGYDIz4isR2QUcJOqHgb6A3UXwrSfYTIiyxH5BpH2vv0SETnhK1+OyGt5HHsKIqtyPH8GkZ8QWfHMhg1w8KArT0+H66+HTp2gXTt44gn/MW66CerVg44di/cumLDz5wta8cjgDlSvGO91KOXTzJnQpg20agVPPnny+q1boV8/6NoVOneG6dNd+axZ0K2bu067dYM5c1z58eNw6aXQti106ACjRvmP9dVXcMYZEBcHEybkPs/Ike667tgRPvzQX75pE5x1FrRuDVddBWlppfv6TdlR1YIfEKuwQaGFQoLCD13hZ1UFeAG4XKE6kOTbfrDCTN9yosKqAo59hcIHubaB/gpxqsrY+vVV77tPVVX1f/9Tveoqt3zsmGqzZqqbNrnn8+erLl2q2qGDmsh1+ESafrR4q9dhmIwM1RYtVDdsUE1NVe3cWXX16tzb3HKL6iuvuOXVq931qKq6bJnq9u1ueeVK1YYN3fKxY6pz5rjl1FTVc85RnT7dPd+0SfWHH1Svu07144/955g6VfXCC1XT01WPHlXt1k310CG37re/VR03zi3feqs/FqOqqsASLeyz3aNHMDWdM4H1qG5ENQ0YfwscEZEvgIHA5wIKZPm2r4J7XjCRqsBfgX8FZMEvUM0AWFmlCiQnZ28Px45BRgacOAEJCVC9ult33nlQu3YQL8WEs/e+28L9E1eyYc9Rr0Mp3xYtcjWcFi3cdTZ8OEyenHsbETjsfiiPQ4egYUO33LWrf7lDB0hJgdRUqFzZ1YzAHfOMM/zXdmKiqy3FBHwcrVkDffq4GlCVKtCli6uBqboa1NChbrvrr4dJk0r9bTBlI5ik0wjYluN58q3wPTAK6KGqx4H4xTATkQ3A08Cfc2zfHJEkROYjcm6O8seAZ4Hj+Z148L59cMkl7snQoe4Pr0EDaNoU/vY3SzRR5o99WjLhtl60rGs/wOap7duhSRP/88aNXVlOjz4K77/v1g0cCC+9dPJxPvnEJaEKFXKXHzwIn30GF1xQcBxdusCMGa5pbu9emDsXtm2DffugZk2XjPKLz4StYJLOSeNU18OpuCa2gyJyLfBQD3gD1ZbASOAh36Y7gaaodsXVaj5ApDoipwOtUP00/7PKg5kicM017vmiRRAbCzt2uPbcZ5+FjRsLDPy5WWuDeHnGS/uPpXHPRz9w6Hg6sTHC6U1qeh1SufbcrLWuJhEocLqhcePghhtcbWX6dLjuOsjK8q9fvdr1x7z+eu79MjLg6qvhz392NamC9O/vElqvXm6fnj1dogkmPhO2gkk6yUCOrz00ngC9geMi0gW4D9gCvOdbPx64DADVVFT3+ZaXAhuA04CeQDdENgPfAKchMu/XM4hcD/zmoebN/X9MH3wAAwZAfLwbNNC7NyxZUmDgL8xeF8TLM1766ZfDfLHmF37edcTrUAy+a6ZxY1ejyJac7G8yyzZmDAwb5pZ79nTNaHv3+re//HJ47z1o2TL3fn/4g+v8/8tfggvowQdh+XI3QEHV7VunjqstZWTkH58JW8EkncVAa0SaI5IADJ8IB3ydVUOAFxSmA9V8218KuE97kbqIxPqWW+yHHnVghsDtqDZENRE4B1iLal/fdgNwtaXBqTnbeJs2de24qq5v5/vv3UgYE1EmJW2n95NzaD5qGr2fnMPuw6l8M/J8zmxuTaVho0cPWLfOtSikpcH48TB4cO5tmjaF2bPd8o8/uqRTt65LBpde6kaX9u6de5+HHnL9P88/H1wcmZmuKQ1gxQr36N/ffRHt188/0u3dd2HIkOK/XhNaQY04gIEKa32j2B4E5k+E2cNgO3BqBry4FlIUlivMVejg2+9KhdUKPygs+6/rBzqD3KPVEgNGr61X2Kaw/KdKldzIFFXVI0dUhw5Vbd9etV071aef9g/VGD5c9dRTVePiVBs1Un3rLVVVbTZyagnGf5jS9umyZG370AxtNnLqr4+2D83QT5clex2a8fn1mpk2TbV1azeK7V//cmV//7vq5MluefVq1V693Mi2Ll1UP//clT/2mGrlyq4s+7Frl+q2baqg2ratv/zNN90+ixa567ZyZdXatd01rqp64oS71tu1Uz3rLNWkJH+gGzao9uih2rKl+1xISSn7NyeCEMaj10Tzah8thIicCvwOWKyqX4tIU6Cvqr5XyK6ISCIwVVULvamme/fuuqSQJrSCJI6axln2DTpsJG09SFpm1knlCbExdG1qfTnhYOGm/Wx+8lKvwzAlJCJLVbW713HkpVjT4KjqL8B/cjzfir9Pp0RE5A/AHwCaNm1aGoc0YSKvhFNQuTEm+hQr6YjI2cBLQDsgAYiIEkJHAAAXKklEQVQFjqpqjZIGpKpvAG+Aq+mU9Hgf3tqzpIcov2bOhLvucm3rv/997rvIAcaOhXvvhUaN3PM77nDbAdx3H0yb5kY0XXQRvPACvZ+aS7dvZ/Kn7z5CRdhdtTZ/+c09VG54Kh+un+iG0SYkuM7nd95xw2IXLXKdz+D68x591HVSg7u/o1o1N6oxLq7QgSWmcImjpnkdgolyxZ3w82VgOPAx0B0YAbQuraBMGMjMhNtvd6OGGjd2ncuDB0P79rm3u+oqePnl3GXffgsLFriOX4BzzoH587nvgpac89gbXHjzKxyoXINRc9/m5uXTaXzjU7Anw3U+x8W5obZPPAFPPeWmP1myxJXv3Onu3Rg0yH+Pxty5bjSTMSYiFHuWaVVdLyKxqpoJvCMi35ZiXMZrOe9KB/9d6YFJJy8ibjRTWpqrnaSnQ/36DGnVkNSEWJpVUA6qcippNDvvTLp2bYS7B9nn7LP9I5MqV/aXp6TY/RjGRLji/iLWcXHDp5eLyNMicjdu+psCicg44DugjYgki8jNxTy/KWvB3JUO7q7zzp3djBHZ93b07OmGtDZo4B4XX+wmaY2Pp8KbrzPp9dvY9N4tXFbhEF3/8beTj/n22/6ZKAAWLnRTqnTqBK+95q/liLghtN26wRtvlN5rN8aUmeImnetw/Th3AMdwN49eWdhOqnq1qjZQ1XhVbayqY4p5/qDcdYG1+BVbMHd9DxoEmze7ZrQLL3RzYAGsX+/u3UhOdolqzhw3k3B6Orz6KiQlMXt2EstrNsk9WzjAv//tkkr2TBTgZhNevRoWL3bbp6S48gULYNkyN1XK6NHuHKZE7JoxZa1YSUdVt6jqCVU9rKr/UNW/qur60g6upO6+6DSvQ4hcwdyVfsop/nm1brkFli51y59+6prIqlZ1j0sucTfzLl/u1rdsSdK2Q7zRoAdZCxb4j/fuuzB1Kvzvf3k3o7Vr5+bfW+X7JYzseOrVc4MLFi0q+esu5+yaMWWtSElHRFaKyIr8HmUVpPFAMHel79zpX54yxSUFcHerz5/vpilJT3fL7dq5UW5r1sCePdxxfitG191LTHYf0cyZbuDAlCm5+3E2bfJPd7JlC/z8sxu1duwYHPFNnXPsGHzxhf2ekjERoKgDCa4A6pN71mmAZsCOUonIhIe4ODcq7eKL3Ui2m25y/SoPPwzdu7sE9OKLLknExbkZv8eOdfsOHeqa1Dp1cjWWAQNcUxzAI4/AeedRMT4emjXz73PHHW4K/Isucs/PPtv133zzjfsRsfh4N/X9K6+40WobN/qHTmdkwO9+585jjAlrRZqRQESmAg+o6oqA8u7AI6o6qDSDK+mMBCa8fbI0mWkrdzLm+u6IjUozptSE84wERe3TSQxMOACqugRILJWITLmRnpnFibRMjqVleh2KMSZEitq8VrGAdZVKEogpf4af2ZThZ9pUR8aUJ0Wt6SwWkVsCC3332ywtnZBMeZOVVeLZjowxEaKoNZ2/AJ+KyDX4k0x33Pxrl5dmYKZ8+O/3W3h5zjq+vu98EuKKe9uYMSZSFCnpqOouoJeI9AOyx6dOU9U5pR6ZKRean1KFC9vV53haBglxCV6HY4wpY8X9aYO5wNxSjsWUQ+e0rsM5rW3CTmPKC2vPMGFh95EUr0MwxoSAJR3jubELNnHW47PZfyzN61CMMWXMko7xXO9WdXjo0vbE2g2ixkS9Yv+ejjGlpXX9arSuX83rMIwxIWA1HRMWUtIz+Xb9XooyLZMxJvJY0jFhYVLSdn731kLW7z7qdSjGmDJkzWsmLFzYvj7vVK9Ik9qVC9/YGBOxLOmYsFCnagX6ta3ndRjGmDJmzWsmbOw6nMK7324mJd1mnTYmWlnSMWFj9Y5DPDJlNcu3HfQ6FGNMGbHmNRM2erWsw/x7+9LslCpeh2KMKSNW0zFho2J8rCUcY6KcJR0TVjbtPcYjk1fZXGzGRClLOiasHEvN4KMlyaz9xe7XMSYaWZ+OCSvtG1Rn+SMXUSEu1utQjDFlwJKOCSsxMUKFGEs4xkQra14zYWfdriNcN2Yha3Yc9joUY0wps6Rjwk6NSvHsOpzCgeP2+zrGRBtrXjNhp171inxxdx+vwzDGlAGr6ZiwpapkZdlPHRgTTSzpmLC0fvcRznlqLvPX7vE6FGNMKbKkY8JS41qVOb1JTapVtBZgY6KJXdEmLFWMj2X0NWd4HYYxppRZTceEtSMp6RxLzfA6DGNMKbGkY8LWtv3H6frPWXz2ww6vQzHGlBJLOiZsNa5ViT9f0JrTm9b0OhRjTCmxPh0TtkSEP1/Q2uswjDGlyGo6JqypKmt2HGbnoRNeh2KMKQWWdExYO3A8nUtf+pqPlyR7HYoxphRY85oJa7WrJPD6td04vYn16xgTDSzpmLDXv8OpXodgjCkl1rxmwl5aRhZTV+xgZfIhr0MxxpSQJR0TEUZOWMEny6xfx5hIZ81rJuwlxMUw5c5zaFa7stehGGNKyJKOiQgt61b1OgRjTCmw5jUTEdIzs3hx9jo+X/2L16EYY0rAko6JCHExwifLklmyeb/XoRhjSsCa10xEEBE+/8t5VIyP9ToUY0wJWE3HRAxLOMZEPks6JmKoKn/9aDlvfrXR61CMMcVkScdEDBHhaEoGx9LsR92MiVTWp2MiyhsjunsdgjGmBKymYyJSVpZ6HYIxphgs6ZiIc92YhTzw6UqvwzDGFIM1r5mI07VpLepUTfA6DGNMMVjSMRHnrxed5nUIxphisuY1E5EyMrPYezTV6zCMMUVkScdEpCtf+457PvrB6zCMMUVkzWsmIt3UO9FmKDAmAlnSMRFpyOmNvA7BGFMM1rxmItauwyn2E9bGRBhLOiZi3TU+ifs+WeF1GMaYIrDmNROxRg5oS4U469cxJpJY0jERq2vTWl6HYIwpImteMxFt6Zb9fPbDDq/DMMYEyZKOiWjvfbeFx6f/iKpNAGpMJLDmNRPRRl3SlmoV4xERr0MxxgTBko6JaA1qVPI6BGNMEVjzmol4M1bu5D+z1nodhjEmCJZ0TMRL2naQz37YQab9sJsxYU/CuQO2e/fuumTJEq/DMGEuNSOThNgY69cxxkdElqpqWP62u/XpmIhnN4gaEzmsec1EhXGLtvL7d61WbEy4s6RjokJ6ZhapGZmkpGd6HYoxpgDWvGaiwoieiYzomeh1GMaYQlhNx0SVLBvBZkxYs6RjosZbX2+k91NzbOi0MWHMko6JGi3rVaV/+/ocT8vwOhRjTD6sT8dEjX5t6tGvTT2vwzDGFMBqOibq7Dqc4nUIxph8WNIxUeXVeRvo/eQcjqSkex2KMSYP1rxmokrfNnWpnGAzFBgTrizpmKjSrkF12jWo7nUYxph8WPOaiTrH0zL4Zt1er8MwxuQhspPOzJnQpg20agVPPpn/dhMmgAgEzli9dStUrQr/93+FH3POHDjjDOjYEa6/HjJ8w3LnzYMaNeD0093jn//07/PCC277Dh3g+edL/HJNcD5eksy1YxayZd8xr0Mpvwq7NrduhX79oGtX6NwZpk935Zs3Q6VK/uvpj3/07/Phh27bDh3gvvv85ampcNVV7lxnneWOEXiuwOv8ppugXj13fZrQUtWwfXTr1k3zlZGh2qKF6oYNqqmpqp07q65effJ2hw+rnnuu6llnqS5enHvdFVeoDh2q+swzBR8zM1O1cWPVn3922/3976pvveWW585VvfTSk8+7cqVqhw6qx46ppqerXnCB6tq1+b8eU2p2HTqhX6/doynpGV6HUj4Fc23ecovqK6+45dWrVZs1c8ubNrnrJtDevapNmqju3u2ejxih+uWXbnn0aNVbb3XL48apDhuWe9/A61xVdf581aVL8z5XFACWaBh8huf1iNyazqJF7ptNixaQkADDh8PkySdv9/e/u29FFSvmLp80ye3boUPhx9y3DypUgNNOc9tddBF88knB8f34I5x9NlSuDHFx0KcPfPppyV6zCUq96hU5p3Ud+8kDrwRzbYrA4cNu+dAhaNiw4GNu3Oiuv7p13fMLL/Rfg5Mnu9YHgKFDYfZsyP6dsLyuc4DzzoPatYv/Gk2xRW7S2b4dmjTxP2/c2JXllJQE27bBb36Tu/zYMXjqKXjkkeCOWacOpKf7m+cmTHDHzfbdd9ClC1xyCaxe7co6doSvvnIJ6/hx13yQcx9TprYfPMGYbzaRnpnldSjlTzDX5qOPwvvvu3UDB8JLL/nXbdrkmt369IGvv3ZlrVrBTz+5prOMDJdMsq+nnOeLi3PN3fv25X+dG09FbtLJ6xdPc/5yZFYW3H03PPvsyds98ohbV7VqcMcUgfHj3T5nngnVqrk/bnD9PFu2wA8/wJ13wmWXufJ27WDkSFcrGjDAJSXfPs/NWluMF2yKYmXyQR6buoZV2w95HUq5M/WH7ScXBv6q67hxcMMNkJzsvpBdd527Zhs0cH0wSUnwn//A737nakS1asGrr7q+m3PPhcRE/zWY33Wb33VuPBW5Q6YbN85dc0hOzl1FP3IEVq2Cvn3d819+gcGDYcoUWLjQ1Vbuuw8OHoSYGNf81q1b/sfs2dP/reuLL2CtL3FUzzE8d+BA+NOfYO9eVzu6+Wb3AHjgARcz8MLsddx90Wml916Yk/Q5rR4LRp1Po5qVvA6l3Hl7czq/2V3AtQkwZowbbADu2kpJcddNvXquKRvc9diypbvWuneHQYPcA+CNNyDW13ya/VnQuLGrBR065JrO8rvO77ijbN8AU7BQdyIBA4CfgfXAqIK2LXAgQXq6avPmqhs3+jsrV63Kf/s+fU4eSKCq+sgj/g7Ggo65a5f7NyVF9fzzVWfPds937lTNynLLCxe6zs7s59n7bNmi2qaN6v79qqrabOTU/OM0pebTZcna64nZmjhyqvZ6YrZ+uizZ65DKhRb3Ti782hwwQPWdd9zymjWqDRq462b3bjcQQdUNRGjYUHXfPvc8+3rav1+1Sxf/wJ6XX849kOC3vz05qJzXebb8Bi1EAcJ4IEFIazoiEguMBi4CkoHFIjJFVdcU+WBxcfDyy3DxxZCZ6YZAdugADz/svhUNHlz0APM7JsAzz8DUqa4J4Lbb4PzzXfmECa7aHxfnhnqOH+9vSrjySte2HB8Po0e7JgITEpOStjPykxWkZrg+ne0HT3D/xJUAXNa1kZehRb3MmNjCr81nn4VbboHnnnPXy9ix7t+vvnLbxcW5msxrr/k7/O+6yzVjg9sme2DPzTe75rlWrdy248cXHuTVV7vbHfbudTWkf/zD3yphypRoXu2hZXUykZ7Ao6p6se/5/QCq+kRe23fv3l2XBN5bEwUSR03jrOY2cqYsJW09SFoegwgSYmPo2rSmBxGVHws37Wfzk5d6HUa5JiJLVbW713HkJdQDCRoBOYdwJfvKfiUifxCRJSKyZM+ePSENzkSPvBJOQeXGmNAI9UACyaMsV1VLVd8A3gBX0wlFUF748NaeXocQfmbOdE0omZnw+9/DqFEnb/PRR264rYgbEfjBB648NhY6dXLLTZvSu9df2H7wBI0P/sLLU56mRsoRVtdvxTPXPOje+9RUGDECli6FU05xd7snJrr9n3jCdXTHxsKLL7pmomDjMySOmuZ1CCaMhbqmkwzkGMBPY2BHiGMw4SgzE26/HWbMgDVr3JDaNQFdfevWuYSwYIG7Hyrn1EKVKsHy5e4xZQr3XtyGSvGxjJo3ljHdh9DvD29ytHI1Xji+zG0/ZozrY1u/3g2rHTnSla9Z4/oEVq92SeZPf3KxBROfMaZQoU46i4HWItJcRBKA4cCUEMdgwlEwd7G/+ab74M8ekFEv/18JvaxrI564vCPnbFvBjLbn0KhmJRrceSunL53nNsjvLvbJk925K1SA5s1dTIsWBT8DhjGmQCFNOqqaAdwBfA78CHykqqtDGYMJU8Hcxb52rXv07u2mGMq+zwPcfR7du7vySZMAuKxpRWo2qMv6pwezYNT59Lmgq/+Y+d3Fnl8cwcRnjClUyG8OVdXpwPRQnzec3HVBa69DCD+FzTAB7sa/devcUNfkZHdn+qpVULOmu4u9YUM3R9f557v+nep5/K5O9jHzO19+5Vl5DEAIjM8A9vdtCha50+BEMJuNIA+FzTCRvc2QIe6+p+bN3dT569a5ddnbtmjhZqFISnKzQhw86P8ZipzHzHm+nHex5xdHMPEZwP6+TcEs6Zjw0KOHSyCbNkFamuvMD7zB97LLYO5ct7x3r2tqa9ECDhxwo9GyyxcsgPbtXU2kXz93Ay/Au++6pAXu2O++65YnTHC1IxFXPn68O96mTS6mM88MLj5jTKEid+41E12CmWHi4ovdvHft27vhzM8844Y7f/st3Hqrm1srK8sNZW7f3h33qadcp/9DD7mZi7PvOs/vLvYOHWDYMLd/XJybSSJ7jq/8ZqswxgQtpDMSFFW0zkhgjDFlKZxnJAjrpCMie4AtXseRQx1gr9dBFIHFW7Ys3rJl8RZfM1Wt63UQeQnrpBNuRGRJuH57yIvFW7Ys3rJl8UYnG0hgjDEmZCzpGGOMCRlLOkXzhtcBFJHFW7Ys3rJl8UYh69MxxhgTMlbTMcYYEzKWdAKIyAAR+VlE1otIvj+YIiJDRURFxNPRKoXFKyI3iMgeEVnue/zeizhzxFPo+ysiw0RkjYisFpEPQh1jQCyFvb/P5Xhv14rIQS/izBFPYfE2FZG5IpIkIitEZKAXceaIp7B4m4nIbF+s80SksRdx5ojnbRHZLSKr8lkvIvKi7/WsEJEzQh1j2FNVe/geQCywAWgBJAA/AO3z2K4a8BXwPdA9nOMFbgBe9vq9LUK8rYEkoJbveb1wjjdg+zuBt8M5Xly/w22+5fbA5jCP92Pget/y+cB/vYrXF8N5wBnAqnzWDwRm4H6w8mxgoZfxhuPDajq5nQmsV9WNqpoGjAeG5LHdY8DTQEoog8tDsPGGi2DivQUYraoHAFR1d4hjzKmo7+/VwLiQRJa3YOJVIHv67Rp4+yOKwcTbHpjtW56bx/qQUtWvgP0FbDIEeE+d74GaItIgNNFFBks6uTUCckwlTLKv7Fci0hVooqpTQxlYPgqN1+dKX1V/gog0yWN9qAQT72nAaSKyQES+F5EBIYvuZMG+v4hIM6A5MCcEceUnmHgfBa4VkWTcT4zcGZrQ8hRMvD8AV/qWLweqicgpIYituIL+mymvLOnkltcPpPw6vE9EYoDngHtCFlHBCozX5zMgUVU7A18C75Z5VPkLJt44XBNbX1zN4S0RqVnGceUnmHizDQcmqGpmGcZTmGDivRoYq6qNcU1B//X9XXshmHj/BvQRkSSgD7AdyCjrwEqgKH8z5ZIlndySgZw1gcbkbn6oBnQE5onIZlyb7RQPBxMUFi+quk9VffP+8ybQLUSx5aXQeH3bTFbVdFXdBPyMS0JeCCbebMPxtmkNgov3ZuAjAFX9DqiImzPMC8H8/e5Q1StUtSvwoK/sUOhCLLKi/M2US5Z0clsMtBaR5iKSgPsgmZK9UlUPqWodVU1U1UTcQILBqurVVNgFxgsQ0J48GPcz4V4pNF5gEtAPQETq4JrbNoY0Sr9g4kVE2gC1gO9CHF+gYOLdClwAICLtcElnT0ij9Avm77dOjprY/cDbIY6xqKYAI3yj2M4GDqnqTq+DCif2ezo5qGqGiNwBfI4bWfO2qq4WkX8CS1T1pA8cLwUZ759FZDCuSWI/bjRbOMf7OdBfRNYAmcC9qrovjOMF12Q1Xn3Dl7wSZLz3AG+KyN24Zp8bvIo7yHj7Ak+IiOJGjN7uRazZRGScL6Y6vn6xR4B4AFV9DddPNhBYDxwHbvQm0vBlMxIYY4wJGWteM8YYEzKWdIwxxoSMJR1jjDEhY0nHGGNMyFjSMcYYEzKWdIwxxoSMJR1jjDEhY0nHGGNMyPw/PDhV6oqskb4AAAAASUVORK5CYII=\n", "text/plain": [ "