{ "cells": [ { "cell_type": "markdown", "id": "672e8bf1-ca83-42ab-a628-ff9ebde23298", "metadata": {}, "source": [ "###
San Jose State University
Department of Applied Data Science

**DATA 200
Computational Programming for Data Analytics**

Spring 2024
Instructor: Ron Mak
" ] }, { "cell_type": "markdown", "id": "6cb2da7a-1c9e-4cb9-81c0-23d2258fffab", "metadata": {}, "source": [ "# Binary Search\n", "#### If the list we're searching is sorted, we can do a binary search. We'll use sorted lists of different lengths containing even random values and search them for odd random values. We'll time each search, which will fail after going \"all the way\", and draw a graph of search times vs. list size." ] }, { "cell_type": "code", "execution_count": 32, "id": "900a3e37-66f4-420d-b010-a3f192ff89e3", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import random\n", "import time\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 33, "id": "03fb2d1a-b27d-42d4-b09e-dcb54016f6e5", "metadata": {}, "outputs": [], "source": [ "def sorted_values(size):\n", " return list(range(0, 2*size, 2))" ] }, { "cell_type": "code", "execution_count": 34, "id": "aa06ef0a-5dfb-4288-965d-0d9d918765cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted_values(20)" ] }, { "cell_type": "code", "execution_count": 35, "id": "6a469d57-ccfc-45e1-9162-c18e8b563c08", "metadata": {}, "outputs": [], "source": [ "SEARCH_COUNT = 100_000\n", "SIZES = list(range(0, 1_000_001, 100_000))" ] }, { "cell_type": "markdown", "id": "72fc9716-536a-4c8b-a08d-170f3dd1b526", "metadata": {}, "source": [ "## Binary search function" ] }, { "cell_type": "code", "execution_count": 36, "id": "6aa9d1b9-b2f4-47f6-8010-5609e26f8119", "metadata": {}, "outputs": [], "source": [ "def binary_search(target, values):\n", " \"\"\"\n", " Perform a binary search of a sorted list\n", " for a target value.\n", " @param target the value to search for.\n", " @param values the sorted list.\n", " @return the tuple of 1 if found else 0\n", " and the elapsed time in seconds\n", " \"\"\"\n", " found = 0\n", " start = time.time()\n", " \n", " low = 0\n", " high = len(values) - 1\n", "\n", " while low <= high:\n", " mid = (low + high)//2\n", "\n", " # Found!\n", " if target == values[mid]:\n", " found = 1\n", " break\n", "\n", " # Next search lower half.\n", " elif target < values[mid]:\n", " high = mid - 1\n", "\n", " # Next search upper half.\n", " else:\n", " low = mid + 1\n", " \n", " elapsed_time = time.time() - start\n", " return found, elapsed_time" ] }, { "cell_type": "code", "execution_count": 37, "id": "9e129939-87ff-44b1-862e-9cec3ea81a6d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "size = 0 count = 0 total_time = 0.017442\n", "size = 100,000 count = 49,872 total_time = 0.247033\n", "size = 200,000 count = 49,859 total_time = 0.280423\n", "size = 300,000 count = 50,150 total_time = 0.289390\n", "size = 400,000 count = 49,981 total_time = 0.323004\n", "size = 500,000 count = 49,991 total_time = 0.314749\n", "size = 600,000 count = 49,993 total_time = 0.326566\n", "size = 700,000 count = 50,091 total_time = 0.321426\n", "size = 800,000 count = 50,151 total_time = 0.339466\n", "size = 900,000 count = 50,163 total_time = 0.348330\n", "size = 1,000,000 count = 50,139 total_time = 0.345617\n" ] } ], "source": [ "times = []\n", "\n", "for size in SIZES:\n", " values = sorted_values(size)\n", " count = 0\n", " total_time = 0\n", "\n", " for _ in range(SEARCH_COUNT):\n", " target_value = random.randint(0, size)\n", " found, elapsed_time = binary_search(target_value, values)\n", "\n", " count += found\n", " total_time += elapsed_time\n", "\n", " times.append(total_time)\n", " print(f'{size = :9,d} {count = :6,d} {total_time = :f}')" ] }, { "cell_type": "code", "execution_count": 38, "id": "fdfc3a23-8a7b-49f9-b2c3-85ca39a153d0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 0.2555331523279244,\n", " 0.2709176567368305,\n", " 0.27991704283282187,\n", " 0.2863022166333831,\n", " 0.291254945457098,\n", " 0.2953016212253492,\n", " 0.2987230378074748,\n", " 0.30168680427391514,\n", " 0.3043010319826573,\n", " 0.30663953864643834]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log2_of_n = [np.log2(n + 1)/65 for n in SIZES]\n", "log2_of_n" ] }, { "cell_type": "code", "execution_count": 39, "id": "cd8f60ca-2f55-417d-91e7-b7514d203487", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/rmak/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n", " with pd.option_context('mode.use_inf_as_na', True):\n", "/Users/rmak/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n", " with pd.option_context('mode.use_inf_as_na', True):\n", "/Users/rmak/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n", " with pd.option_context('mode.use_inf_as_na', True):\n", "/Users/rmak/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n", " with pd.option_context('mode.use_inf_as_na', True):\n" ] }, { "data": { "text/plain": [ "Text(0, 0.5, 'Search time in seconds')" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAHJCAYAAACG+j24AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACMfUlEQVR4nOzdd3xT5f7A8c9J0nSniy4KpQyhlI0UUKYggrhx4b2gIiAiAoICIl5x42Uqo4oCep24UbiiF/UnLkQQFJVpKYVCB3SlM2mS8/sjbSC0QFPapOP7fr36Kj15zsn3PBT67fN8z/MoqqqqCCGEEEI0URpPByCEEEII4UmSDAkhhBCiSZNkSAghhBBNmiRDQgghhGjSJBkSQgghRJMmyZAQQgghmjRJhoQQQgjRpEkyJIQQQogmTZIhIYQQQjRpkgwJIVw2duxYOnTo4PTRq1cv7rzzTn755ZdKbceOHeuhSKvv4MGDzJgxg379+tG5c2f69+/Pgw8+yN69ez0dmpOPP/6YDh06kJaW5ulQhGg0dJ4OQAjRMCUkJDB//nwArFYrubm5vPvuu4wfP56PP/6YSy65BMDRpj47dOgQt99+O127dmXevHk0a9aMjIwM3nrrLW6//XbefPNNunfv7ukwhRB1RJIhIUSNBAQEVEoQLr/8ci677DI+/vhj5syZA0C7du08EJ1rXnvtNYKDg1mzZg1eXl6O41deeSVXX301SUlJvPLKKx6MUAhRl2SaTAhRa3x9ffH29kZRFMexs6fJOnTowNtvv828efPo3bs3PXr0YNq0aZw6dcrRxmq18sorr3DttdfStWtXunfvzujRo9m2bZujzYoVKxg2bBgrV66kT58+XHnllTz22GN07dqVgoICp7heeeUVevToQXFxcZVxV7z32ftW+/n5MXfuXK6++mqn41999RWjRo2iS5cu9OvXj2eeeabStb/66iv+8Y9/0KNHDzp37syIESN46623HK9v376dDh06sH79eq644gouv/xyfvjhBwB+/PFH/vnPf9KjRw/69+/P448/Tn5+vtP1f//9d0aPHk2XLl0YPHgwa9eurfLehBAXJsmQEKJGVFXFYrFgsVgoKyvj5MmTLF26FLPZzM0333zec5ctW4bNZmPp0qXMnj2bb7/9lueee87x+uLFi1m1ahW33347a9as4amnniI3N5fp06c7JR0nTpxgy5YtLF26lAcffJBx48ZhMpn44osvnN5vw4YNjBgxAj8/vyrjGTx4MCdOnGD06NG8/fbbJCcnOxKjESNGcNNNNznabty4kSlTptCmTRtWrVrFAw88wGeffcb999/vOOfbb79lypQpdOrUiaSkJFasWEFMTAxPP/00u3btqtQXc+bMYc6cOXTv3p2tW7cyYcIEgoODWbZsGbNmzeKbb75h2rRpTuc98cQTXHvttaxevZquXbuycOFC/u///u+8/S6EqJpMkwkhamTHjh106tSp0vGZM2fStm3b857bvn17FixY4Ph6z549TglMVlYWM2bMcBpR8vHxYerUqRw4cIAePXoAYLFYmDNnDpdffrmjXY8ePfj000+59dZbHddOTk7mqaeeOmc8//jHPzh58iRr1651tAsJCaF///6MHTuWbt26AfYEcPHixQwYMIDFixc7zo+Li+Puu+9m69atDB48mL///psbb7yRefPmOcXVp08fduzYQc+ePR3HR48ezYgRIxxfL1++nPj4eFatWuV070uXLiUzM9NxbObMmdxxxx0AdO/enW+++Yaff/6ZK6644pz3KYSomiRDQoga6dSpE08++SRgTxKMRiPfffcdy5Yto7i4mBkzZpzz3LNrjaKioigpKXF8vWTJEgBycnJITU0lJSWFb775BoCysjKnc9u3b+/09c0338y//vUv0tLSaNGiBR9//DGxsbH06tXrvPczffp07r77br7//nu2bdvG9u3b2bhxI5s2bWLu3LncddddHD58mIyMDCZNmoTFYnGcm5iYSEBAAD/++CODBw9mwoQJABQXF3P06FFSUlL4448/qoy/Q4cOjj+Xlpby119/MXXqVKc2w4cPZ/jw4U7HzrwfPz8/mjVrhtFoPO89CiGqJsmQEKJG/P396dKli9Ox/v37U1xczJo1a7jzzjsJCwur8lxfX1+nrzUajVO9zh9//MGTTz7JH3/8gY+PD+3atSMmJgaoXNfTrFkzp69HjhzJc889x2effcaECRPYvHkzd911V7XuKSgoiGuvvZZrr70WgL179zJ79mwWL17M9ddfT15eHgBPPvmkIxE8U1ZWFmBP4ubPn89XX32Foii0atWKSy+9tMr4z+yj/Px8VFU9Z7+d6UJ9KISoPkmGhBC1qmPHjnzwwQekpaVV64f62QoLC5kwYQIdOnRg06ZNtG3bFo1Gw9atW/nyyy8veL6/vz8jRoxg8+bNdOzYEaPRyI033njO9pmZmdx8881Mnz7dMbVWISEhgQcffJApU6Zw7NgxDAYDALNnz6Z3796VrhUUFATAww8/THJyMq+99ho9e/ZEr9dTUlLCBx98cN7YAwICUBSFnJwcp+Nms5lt27bRtWvXC96/EMJ1UkAthKhVu3fvRqvV0rJlyxqdf/jwYfLy8rjzzju55JJL0Gjs/0199913ANhstgte45ZbbuHgwYOsW7eOvn370rx583O2bdasGTqdjnfeeQeTyVRlPN7e3rRq1Yo2bdoQFhZGWloaXbp0cXxERUWxZMkSxwKNv/76K8OHD6dv377o9fpqx+/v70/Hjh35+uuvnY7/8MMP3HvvvWRkZFzw3oUQrpORISFEjRQWFvLbb785vi4rK+Prr79m48aN3H777YSGhtbouq1btyYgIICXX34ZnU6HTqfjyy+/5MMPPwRwqi06l0svvZQ2bdrwyy+/OBU6V0Wr1fLEE08wZcoUbr75Zv75z3/Stm1bSkpK+PHHH3n77beZPn26Y9RnxowZPP7442i1Wq644gqMRiNJSUlkZmY6Csq7du3Kxo0b6dSpE1FRUezevZvVq1ejKMoF4582bRqTJ0/mwQcfZNSoUeTk5LBkyRKuuOIKOnbsyL59+6rTjUIIF0gyJISokb1793L77bc7vvb29iY2NpYZM2Ywfvz4Gl83MDCQpKQkFi5cyPTp0x2jJW+99RYTJ05k586dDBky5ILXGTx4MCdPnmTYsGHVavv++++zdu1aXn75ZXJyctDr9SQkJLBs2TKuuuoqR9tbb70Vf39/1qxZw3vvvYefnx89e/Zk8eLFjtGw559/nqeffpqnn34asD9t9uSTT/LZZ5+xc+fO88ZyxRVXsHr1alasWMGUKVMICQnh6quvZvr06Re8DyFEzSiqVNwJIRoZVVW57rrr6NOnD//61788HY4Qop6TkSEhRKNRWFjI66+/zh9//MGRI0dISkrydEhCiAZAkiEhRKPh4+PD+vXrsdlsPPvss8TGxno6JCFEAyDTZEIIIYRo0uTReiGEEEI0aZIMCSGEEKJJk2RICCGEEE2aJENCCCGEaNLkabJqUlUVm632a801GqVOriucST+7h/Sz+0hfu4f0s3vUVT9rNAqKolywnSRD1WSzqeTkFNXqNXU6DSEh/hiNxVgsF95vSdSM9LN7SD+7j/S1e0g/u0dd9nNoqD9a7YWTIZkmE0IIIUSTJsmQEEIIIZo0SYaEEEII0aRJMiSEEEKIJk0KqGuRzWbDarW40F6htFSL2WzCapWnFepKQ+hnrVaHRiO/mwghhCdIMlQLVFXFaMyhpKTQ5XNPndJgs8lTCnWtIfSzr28ABkNotR4DFUIIUXskGaoFFYlQQEAIer23Sz/MtFql3o5WNCb1uZ9VVcVsNlFYmAtAUFCYhyMSQoimRZKhi2SzWR2JUECAweXzdTqNrF/hBvW9n/V6bwAKC3MJDAyRKTMhhHAjj/+Pa7PZWL58OQMGDKBbt27cc889pKamnrP9n3/+yV133UWPHj3o27cvjz/+OEaj0anNkCFD6NChg9PHww8/XCfxW61W4PQPMyFqquJ7yJW6MyGEEBfP48lQUlIS69ev55lnnuG9995DURQmTpyI2Wyu1DYrK4tx48YRGxvLJ598QlJSErt27WLOnDmONoWFhZw4cYLVq1fzww8/OD7mz59fp/chdR7iYsn3kBBCeIZHkyGz2cy6deuYOnUqgwYNIj4+nmXLlpGZmcmWLVsqtT9+/DgDBgxg/vz5xMXF0bNnT2699Va2bdvmaHPw4EFUVaVnz56Eh4c7PgIDA915a0IIIYRoIDyaDO3fv5+ioiL69u3rOGYwGEhISGDHjh2V2vfo0YOlS5ei09lLnf7++28++eQT+vXr52hz4MABwsPDMRhcr98RQgghRNPj0QLqjIwMAKKjo52OR0REkJ6eft5zhw8fzpEjR4iJiSEpKclx/ODBg/j5+TF16lR2795NaGgoo0aN4s4777zoolSdrvL5NlvNpzYqZkUUBdR68KBT//69ePTR+YwceV2Vr69du5rNmzfx4Ycb3RzZxfFEPz/77BOkp59g5cpXXD5Xq1Wq/F6r77RajdNnUXekr91D+tk96kM/ezQZKikpAUCv1zsd9/b2Jj8//7znLl68mNLSUhYvXsydd97Jp59+ir+/P4cOHaKgoICRI0fywAMPsHPnThYvXkx+fj7Tp0+vcawajUJIiH+l46WlWk6d0lzUD7D69A9Nozn3fYwdexe33Ta6Qf6gBvf2s6IoKIpr3xM2m4JGoyEoyA8fH586jK5uGQy+ng6hyZC+do/63s9Wq420k4WkHM8n5YQRi82Gn7cX/r46/Hy88Pfxws9Hh7+v/bNf+dfeXtp6VavoyX72aDJU8R++2Wx2+s/fZDLh63v+TunSpQsAK1asYNCgQWzZsoUbb7yR1157DZPJREBAAAAdOnSgqKiIl156ialTp9Z4dMhmUzEaiysdN5tN5StPqy4/uq0o9h/QVqutXowMgf0+z3Ufer0Per1PvX5EvSqe6GdVVVFV174nrFYVm81Gfn4xJSXWOoyubmi1GgwGX4zGEqzWhvU90tBIX7tHfexnU5mVY5mFHM0sIDWjgNTMAo5lFVJWg/+XtRoFX28dft46fH3KP3vr8PXWVnncz0eHr975mI/+4hOquuxng8G3Wr8IezQZqpgey8rKIjY21nE8KyuL+Pj4Su2Tk5NJS0tj0KBBjmMREREEBQWRmZkJgJeXF15eXk7ntW/fnuLiYvLz8wkJCalxvFX9YDvXQn6qqmIuu/Bfqk7nehJVHXovTY2+QVNTjzB58ngOHNhHTEwLpk2bSWKivabrzGmy9PQT3Hrr9Tz11PO8++6bJCcfIiwsnLvuuodrr70BqCiQf4VvvtlCVlYmfn7+JCb2YebM2QQFBTuuMWHCfXz88Qfo9XoGDBjMjz9+x/vvf+qIqbCwkOuvH85TTz1H//6DKsW8efMm3n77DU6cSMNgCOKKK65k8uSpjhHHPXt+Z/Xqlezdu5fg4GD69RvIffdNwd/fnjBnZWXy8ssr2bFjO0ZjPmFhzRg+fCQTJ05Go9Hw+ecbWbfuFQYMGMzmzRvp2rUHCxcu4/jxNFaufIFdu3ag1epITOzN9OkPExpqXzTRarWwatWLbN68idLSEhIT+zBr1qOO18+lJol1fWK12hp0/A2J9LV7eKqfjcVmR+JzNMv+OSOnuMpf6rz1WlpGBBAbEYCPXkeJyUKJyUJx+efTH1ZKzBZUFaw2lcKSMgpLymoco6JgT5DOSKIciZR35ePOr2nx89YR4Gf/v9qT388eTYbi4+MJCAhg+/btjmTIaDSyd+9exowZU6n9999/zwsvvMAPP/zgGPk5evQoubm5tG3bFpvNxpVXXsmtt97K5MmTHef98ccfNGvW7KISIVeoqsqCt3bx9/HzT/XVpXYtgpj7z54uJ0QffPAu06Y9xNy5j/Pll58zc+ZUXn31DeLjO1bZfuXKZcycOZuWLVuxfv1bLFz4LD179qJ58xiSkpbz/fffMm/eEzRvHsPhw8k8++x8/vOftUyb9pDjGv/732ZefPElTKZSvLz0fPDBu/z++29069YdgK+//h/+/v707duv0vv//fchFi58lscff5qOHTuTmprCE0/MIygoiLvvnsDffx9i+vT7ufvu8cyZ8y9ycnJYteoFZsx4gNWrX0NRFGbPnkFISAhLl67Az8+fbdt+4IUXFpOQ0IkBAwYDkJGRzsmTWaxd+xYmk4nCwkKmTJlIXFxrXnzxJbRaLYsWLWDevNm89NJaAP74Yw+xsXEkJb3KqVOnmD//UVatepF//espl/5OhBCNm6qqnMwv5VhmAanlyc+xrEJyC0xVtjf464mNDKBVZCAtI+yfw0N80VTz/3tVVSk1W50SpGKThVLzWclTqdXxtfNr9nOtNhVVheLypOti9O/WnHuvS7ioa1wMjyZDer2eMWPGsHjxYkJDQ4mJiWHRokVERUUxbNgwrFYrOTk5BAYG4uPjww033MDatWuZNWsWM2fOJD8/n2eeeYauXbtyxRVXoNFoGD58OGvWrCEuLo5OnTqxbds21qxZw7x589x7c/VnGtYlN954MzfeeDMAEydOZteuHbz//js8/vjTVbYfPfqfjtGaKVMeZOPGDfz11x80bx5Dx44JDBp0BT16XApAVFQ0vXtfRnLy307XuOmmW2nduo3j6w4dOvLll/91JENffLGJ4cNHOp4iPNOJE8dRFIXo6BiioqKIiopi2bKV+PnZ67veffcNevVK5J57JmCx2GjZMpYnnniW2267gd27f6VTp84MHz6SK64YSlSUfaTylltG89Zb/yE5+W9HMgRw990TiIlpAcCnn35MYWEBTz21AIMhCIBHHvkXX375OSaT/T+wsLAwZs+eh1arJTY2jqFDr2Lnzu3V/8sQQjQ6FquNE6eKOJpZyNGsAo5mFnIsq4ASU9VT45EhvrSMDKRVZAAtI+yfgwIubpFfRVEcozQ1paoqZovNecSpytGocx23UGK2Oqb3TuaWXNQ9XSyPb8cxbdo0LBYLjz32GKWlpSQmJrJ27Vr0ej1paWkMHTqUBQsWMGrUKEJCQnjjjTd4/vnnueOOO9BqtQwdOpRHHnkErVYLwEMPPYTBYGDJkiVkZGTQokUL5s2bx2233ea2e1IUhbn/7FnNabK62SaiptNk3br1cPo6IaEzv/6685ztW7Vq7fhzxWidxWL/DWH48JHs3PkLq1ev4tixoxw5ksLRo0fo2rW70zVatGjp9PU111zPK68k8eCDs8jKyuSPP/Ywa9ajVb5/nz6X0blzVyZMGEuLFrEkJvZhwIBBdOhgH8k6cOAAaWlHueKKyqNKqalH6NmzFzfffBvffvs177//Dmlpx/j770OcOnXSsbp4hZYtT8eZnHyIli1jHYkQQJs2bZk8earj65iYlo7vS4DAwEBHoiSEaPxKTBaOZTlPc504VYSlivIKnVYhplkALctHfGIjA2gRHnBRCUtdUhQFby8t3l5agi8iOSuz2Ciz2mjZPJj8/Mp1ue7i8V7WarXMmjWLWbNmVXqtRYsWHDhwwOlY69atWb169Tmvp9PpmDx5stM0mScoioK3XnvBdjqdBq2m/gwjnV1gbrXaKtVgnamq19TyCe3Fi5/n66//x9VXX8Pll/fnrrvu4d133yIrK9Opvbe38z+kYcNGsHLlC/z00/ckJ/9Nx44JtGnTrsr39/b2Zvnylzl4cD/bt//Mjh0/8+mnHzFixDU8+uh8VNXGVVddzbhx4yvVdwUHh1BaWsqUKRMpLS1hyJBhDB9+DTNmdGLKlIlVvNfpIn+dTnfBZLOqYn21vlTKCyFqVV6hyZ70nFHjk3WO0Q5fbx2xEQHElic9sZGBRIf5oatHTxa7i5dOg6+PDo2Hfw56PBkS9cuBA/udpob++ON32rW7xOXr5OfnsWHDhzz55HMMHXqV4/iRIyn4+fmd99zAwEAGDhzMt99+Q0pKMjfeeMs5227b9iP79+9l3LiJtG8fz9ixd/Of/6zljTfW8eij82ndui0pKcm0bBnrGIE7evQIK1e+yH33TeHYsaMcOLCPzz770lHYbDTmk5OTfd4Y4+LasHHjBgoLCx0jYgcP7ufBB6ewbt1b1eojIUTDY1NVsnJLKiU+xqLKW0gBhAR6V0p8mgX51KtH2oUkQ+Is7733NjExLejUqTMbNnzE4cN/M3/+My5fx98/gICAAL7/fisdOnTEZDLx4YfvcfDgfhISOl/w/GuuuZ5HHpmJqsKVVw4/ZzudTstrr72Kn58fAwYMxmjM58cfv6dz524AjB49hilTJvDvfz/LqFG3U1xczJIlz1NcXEyLFrGUlpYC8OWXm7niiqFkZmayevVKLBZLlfvjVbjqqqt5/fU1PP30v5gwYTJWq5WlS/9N27btHLVHQoiGzWyxcuhYLn8eOklKupFjmYUcyyrEVFa5vkdRICrUzynpaRkRgMFPX8WVRX0jyZBwcvfdE/jgg/UsXJhMXFxrFi58gdjYVi5fR6fT8fTTz7Ny5QvceedoDAYDPXv2YtKkKbzxxmuOBTfPpVev3gQFBdOlS7fz7iuXmNiXRx75F++++yavvJKEj48Pffv244EHZgDQuXMXli5dyZo1LzN+/Fh8fX3o2TORKVMeRK/Xk5DQmalTZ/Dee+/w6qsvER4eztChVxEREcnevX+e8319fHxYtmwVK1Ys5f77x6PX6+nXbyBTptR8YU8hhOepqsrBY3l8vyednfuzMFdR0+ml09AiPMBe1HxGfY+314VLI0T9pKhSxFAtVquNnJyiSsfLysxkZ6cTFhaNl5frvwHUVQF1Q1dSUsINN4zg2WcXkpjY56Kv1xD6+WK/lzxNp9MQEuJPbm5Rve/rhk76uvblFpj46c90vt+T7lTrE+jnRcuIQGIj7MXNsZGBRIX6or3I7Z3EaXX5/Rwa6l//F10U4mxGo5Fdu3bwzTdfERkZSa9evT0dkhCikbJYbexJzub730+w53C2YzFDb72W3vERDO4ZQ2Ln5uTlFUvS2chJMiTqFavVwvPPP01wcAhPPbVAigyFELUuPbuI739P56c/0zEWn159uV2LIAZ0jSYxPgIfvQ6drmZLlIiGR5IhUa+EhITyxRffejoMIUQjU2q2sGNfFt/vSXfaHcDg58XlXaIZ0DWa6LDKm3GLpkGSISGEEI2SqqokHzfy3Z4T7NiX5XgKTKModG0bxoCu0XRpG9Yk1/cRziQZEkII0ajkF5nZ9mcG3+85QXr26VWNI0N86d81mn5doi9q1WTR+EgyJIQQosGz2mz8cTjHXgydnI3VZq+G1ntpSOwQwYBuzbmkRZDUAIkqSTIkhBCiwcrMKeb7Pen8+Gc6+YWnF0pt09xA/67R9OkYWW/39xL1h3yHCCGEaFBMZVZ27rcXQx88luc4HuDrxeWdo+jfNZoW4QGeC1A0OJIMCSGEqPdUVeVIRgHf/36C7fsyKTHZi6EVoFObUAZ2bU73S5pJMbSoEUmGhBBC1FsFxWa2/ZXJD3tOkHby9C4AzYJ8GFBeDB1q8PFghKIxkGRIOPTv34tHH53PyJHX1do1f/jhO15/fQ2pqSkEBQVzxRVXMmHCJLy9T//nZbVamTx5PDNnziE+vuMFr7l16zd88cV/WbBgSa3FKURDkFtgYn9qLqlZBYQG+eHrpSHIX09ooDchBm/8vHWNokDYZlP560gO3+9JZ/fBk45iaC+dhks7hDOgSzQdWoWgaQT3KuoHSYZEnfn9993MmzeLCRMmc8UVQ0lLO8bChc+Sn5/Ho4/Od7R79903admyZbUSIYBBg4bwwQfr+d//NnPVVVfXVfhCeFxeoYn9R3PZn5rHgaO5ZOaef4Njby8tIYHehAR6OxKkkEAfx9ehBh/8fepvwnQyr4Qfyouhc4wmx/FWkYEM6BZNn4RI/H28PBihaKwkGRJ15tNPP6Znz16MHXs3AC1atGTSpCk899yTPPzwXPR6PYWFhbz55musXPmqS9cePfqfvPjiEoYMGYZOJ9/GonHILzJz4Ggu+4/msT81l4ycYqfXFcWeGLSPDUar1ZJ+qpCc/FJyCkwUlpRhKrOSkVNc6bwzeek0p5OlQHuyFGqoSKDsiVOAn5fbRl3KLFZ+PXCS7/eksy8113Hc30dH34QoBnSLJjYy0C2xiKZLforUIbXMdO4XFQVFp6/zthfjp59+4PXX15CSkoyfnz9XXjmce++9H29v+2Jlubm5vPDCQrZv34ZWq+Waa25g//69dOvWg/HjJzF69D9RlMrFjFarleLiYvR6PZ999jHh4RFcckl7x+v9+/di9ux5fPPNFvbs+R2DwcDNN9/G2LHjHG369LmcgoL5fPvt11x55fBauV9xcVRVJcdYitUqG1pWV0GxmQNH8+yjP0fzOHGqyOl1BWgZGUB8bAjxrUJo3yIIPx+vKnf5NpdZyS00kWs0kVtgIqeg1P65/OvcglKMxWWUWWxk5ZY47cx+Np1WITjAPpJ0OmlyTpwM/vqLSphSMwr4fs8Jfv4rk2KTxXE8IS6EAV2b07N9M7x02hpfXwhXSDJUhwpfm3TO17Qtu+J39czTbd+cChZz1W2jO+B33VzH10XvPoxaWlBlW014a/xvml/la6747rtveeyx2dxzz7089tgTHDt2jCVLnicj4wTPPrsIm83G7NkPYrVaWbx4OV5eelasWMrvv++mW7ceALRvH+90zbKyMtavf4v27eMJDg4G4Pvvv+XyywdUev+kpBeZMWM2M2fO4csvP2f16lV07drdcW0vLy969erDDz98J8lQPZBjLGXtf/exLzUXnVYhOsyfFuH+tAgPICY8gBbh/oQEetfb6Rl3KSwp4+Ax+6jP/qO5TgXBFVqEBxDfKpiOsSFc0jKYAN/qTQvpvbREhvgRGeJ3zjZlFht5heXJkrE8WSo4nSzlFJgwFpqxWFVO5ZdyKr/0nNfSauwJU4jhrFGmwIpjPgT569FoTv+dF5WW8fNfmXy/5wRHMwsdx0MN3vTvEk3/LtE0C/at1v0KUZskGRJVevPN1xg4cDB33z0BgNjYOFRV5ZFHZnLkSAo5Odns2/cX77zzIbGxcQA8/fTz3Hxz1cXXFouFp59+nCNHUhxTYjabjX379nLjjbdUan/11dcxfPhIACZOnMzHH3/Anj2/OZIhgHbtLuHzzzfW5m2LGvj1wEle37yPolL7b/cWq8qxrEKOZRUCmY52/j46R2LUIjyAFhEBxDTzb9QL4hWXlnHgWJ599Cc1l2NZhahntYlp5l8+8hNMh9iQaic/NeGl0xAe7Ev4eRIOi/V0wnT2yFJF8pRXaMJqU8k2lpJtPHfCpFEUggLsBd6+3jr2H83DUj5yqNMq9LgknAHdokloFeqUNAnhbo33f6F6IGDc6nO/eNZvyAFjV1S7rf8di6vdtqYOH/6bYcOcR1y6d+8JQHLyIbKysggMNDgSIbDvOB8b26rStYqLi/jXv+aye/dOnn7633Tq1BmA/Px8LBYLwcEhlc5p1SrO6Wt/f3/KysqcjgUHB5OTk12T2xO1wFRm5b2vD/HtbycAaB1tYM5diRQVlHIkw0jaySLSsgpJO1lIZk4JRaUWDh7Lc1okD+yPSNtHkPxpGWEfSYoK9UWraXjrxZSY7PdYMe11NLMA9azsJzrMzzHt1aFlMAb/2pnWri06rYZmQb40Czp3wmS12cgvNJ9OmM4YaTqdOJmxqarjWIUW4f4M6NqcyzpH1WniJ4QrJBmqQ4pX9TcCrKu2NWX/D9w5sbLZ7Iuc6XQ6tFotqnrh2pBTp07x8MPTSE8/zuLFy+nZs5fjtYopE5ut8nX0+so/INSzfqpYrTY0Gqkp8ISjmQWs/uwv0rOLUYARfWO59Yp2hDcLIFenEBLoTY9Lwh3tyyxW0rOLSTtZSFpWkf3zyULyCs2O6Zjf/j7laO801RYRYB9JCg8gOEBfr6baSs0WDqXll0975ZGaUYDtrO/TyFA/OsbaR33iY4MJagQbhGo1Gns90XnW97HZVIzFZseUnLHITFy0gbiowHr1dygESDIkzqFt27bs2bOb2267w3Hs9993A9CqVWsCAw0UFhaSmnrEMYpjNOaTlnbU0d5oNDJ9+n0UFRWRlLSWtm3bOb1HcHAwer2evLxcaiIvL5ewsLAanStqxqaqfLUzjQ+//RuLVSUoQM/EaxNIiAs978q/XjotsZGBlZ4KKiwp4/hJ+5Ra2skijp8sJO1UESaz9fRU21/OU20ViVFMRHlNkhun2kxlVv5Oyy8f+cnlSHqBYw2cChHBvo4pr/jYEEICG37yUxOa8pqi4ABvWkcbPB2OEOclyZCo0h133Mn8+XN5/fU1DBkyjGPHjrJs2SIuv3wAcXGtiYtrTadOXXj66cd58MFZeHt78/LLKyktLXX81rdixVJOnDjOkiUrCA4OJjv79G/+wcEhaLVaOnbsxIED+7n66mtdjvHgwf106tSl1u5ZnF9+kZm1/93Ln4dzAOjerhnjRsYT6FfzaZ4AXy86xIbQIfb0VKlNVcnOL3VMsaWdtI8kZeQUU1RqsdfgnGOqrUXE6aLt2phqM5dZST6ez77yJ75SThgrJT/NgnwcNT/xsSGyGrIQDZAkQ6JKQ4ZcidVq4a23Xuc//1lLcHAIw4YNZ/z400/IPfvsQpYs+TcPPjgZb29vbrrpVo4cOYyXlxc2m42vv95CWVkZ06bdV+n6H3zwGdHRzRkwYFCNiqAtFgt79vzOI488dlH3KapnT3I26/67F2NxGV46DaOHtGNwj5g6me7QKIqjyLdHe+epthOn7FNtx8sTpGMnC8k/51SbhuZhfvai7Qh/WpYnSeebaiuzWDl8wsi+8mmvwyfysVidk59Qg7c9+Smf9pKnn4Ro+CQZEg4//LDT6ethw0YwbNiIKtvm5eVx4MB+nn76eceih2VlZbz33juEh0eg0Wj45psfL/ieI0dez2uvvcr+/XuJj0+oMg6ADz90Tpi2bv0/AgIC6ddvYLXuTdRMmcXKB98m89XONMBe/Drp+k7EeGBHcC+dllZRgbSKqjzVdvYo0vGTRZjKrBzNKuRoViH8dbr9mVNtLSL8CTX4kJJuZH9qLsknjJRZnGvYggP0xLcKcRQ9hwf5SM2LEI2MJEOiRrRaLfPnz+WGG27mpptuoaysjHfffRO93ou+fftV+zoGg4E77hjLe++9w/z5z1T7vA8+eJfx4++V1afr0PFTRbzy2V/lj8jDlZe24NYr2ta7hfACfL3syUor56m2U/mlHC9Pko6V1yOdb6qtQpC/ng6xwcS3CqFjbAgRIb6S/AjRyMlPElEjgYGBLFz4Aq++msRnn32Coih07dqN5ctXOxZUrK4xY+5m8uR72LfvLzp27HTB9t988xUGQxAjRlxTw+jF+aiqytbfTrD+60OYLTYC/bwYf01HurZt5unQqk2jKEQE+xJxnqm2ipGk7PxSWkQE0LE8AYoK9ZPkR4gmRlHPfl5ZVMlqtZGTU3m12LIyM9nZ6YSFRePl5XohqU6ncSynL+pOQ+jni/1eqg2FJWW89vk+dh+y1950bh3K+Gs6Vutx8Kq2iBB1Q/raPaSf3aMu+zk01B/teZ50dcRQq+8qhGiw9h3J4dVNe8krNKPTKtwyuB1X9mrhtg07hRDCUyQZqiUywCYulqe+hyxWGxu+T2Hzz6mo2FdIvve6TpUKlYUQorGSZOgiabX2YlKz2YRe3zQXVxO1w2y2b1mg1brvn2VmbjGvfPYXKen2jX8HdW/O6CGX4K2vX0XSQghRlyQZukgajRZf3wAKC+2rKOv1ru3MbbMpWK0yqlTX6nM/q6qK2WyisDAXX98ANG7Yk0tVVX76M4O3thzEZLbi76Pj7qvjubRDRJ2/txBC1DeSDNUCgyEUwJEQuUKj0VS5N5eoXQ2hn319AxzfS3WpuLSMN748wC/7sgCIjw1mwrUJsnKyEKLOqDYbWEpRzaWollIwl6KWlaIJbQGBwZ4OT5Kh2qAoCkFBYQQGhmC1Wqp9nlarEBTkR35+cb0dtWgMGkI/a7U6t4wIHUrL45XP9pJtLEWjKNw0sDVX92mFRiNF0kKI085OXjT+oShe9l+YrLknsKbvRzWXOtpQZk9u1LJSvC+9EW1EGwDKDv1E6fevg8Vc5fv4XDkFAvu467bOSZKhWqTRaNBoqv9ItE6nwcfHh5ISqzy2WYekn8Fqs7Hpp1Q++zEFVYXwYB/uvb4TbZsHeTo0IUQtUFUVLCbQeqFo7DV/NmMW1pw0R6LiSFjKkxd995FogqIAKDv4I6Zdn0FZib3tWcmL78iH0bXoDIA14yCmH944Zyy2DgMcyRCKxvlaihb0Pihe5R9ar1rshZrzeDJks9lYuXIlH3zwAUajkUsvvZT58+fTqlWrKtv/+eefLFq0iD179uDt7c1VV13Fww8/jMFwelfkzZs3s2LFCo4dO0ZcXByzZs1i4EDZtkE0TafyS3hl417+TssH4PLOUfxzWHu37fQuhDg/1WJGNReDuQTV8VFsT17MJeguuQyNj/3pzrLk7ZQd/LG8fSlqmb09ZSWgqvjdNB9teGsALCk7MW1//5zvq2vX15EMqRYzqjGzciNFA14+cEaZgSYoEl3cpeDlg+LlbR8x8vJB0fuiePmgDY87/R6x3fAfvbC8rY89WauHy3V4/H/DpKQk1q9fz4IFC4iMjGTRokVMnDiRTZs2odc7j7JkZWUxbtw4RowYwZNPPklOTg6PP/44c+bM4aWXXgLg559/ZtasWTzyyCNcdtllfPjhh0yZMoUNGzbQtm1bT9yiEB7zy75M/vPFAUpMFny9tYy9qgN9O0V5OiwhGjxVVcFa5pSUaEJbOEY6LCf2Yc04ZE9UzCVnJC2lqOZifIdPRxNoXx3dvOszzL9tOud7aaMugfJkyFaQjfXYnnPHZS5x/FkJaIYmog2Kl+/phOWM5EUTeHpVeV1cD3v8FUlLRbsqkhdd847omnesVj8pel8Uff3fzNijyZDZbGbdunXMmjWLQYMGAbBs2TIGDBjAli1buOYa5+0Wjh8/zoABA5g/fz46nY64uDhuvfVWli1b5mjz6quvMmzYMMaMGQPAnDlz2L17N//5z3946qmn3HdzQnhQicnCO18d5Mc/MgBo29zAvdd3Ilx2WBfCia04D7UwB9VcbP8w2T8wF2MuKyZoxN2OtqbdGynb/50jAUK1Ol3Lf/RCFIP9iUxr2l/nTXBUUxGUJ0PofUFRwMvXkTwoXr6g93UkJhV0sV3Q+AaC3s8xEqPoy9vqfUF7ehDBq21vvNr2rlY/aPyC0fgFV6ttY+TRZGj//v0UFRXRt29fxzGDwUBCQgI7duyolAz16NGDHj16OL7++++/+eSTT+jXz74xqM1mY9euXTzyyCNO5/Xp04ctW7bU4Z0IUX+kpBtZ/dlfZOWWoChw7WVxXN8/Dq0bCrSFcBdVtdlHXEz2JEYT1hJFsX+PW47+jjUruTyxKTo9BWUqRjUX4X/z0yg+AQCYf/2Usn3/d873sQ66GShfgLSsFLXg5FktFMcUkWotcxzVRLTBK35geYLjh6L3OZ3g6H3RGCIdbfVdR6DvNrJa00fa0JZoQ1tWr5NEtXk0GcrIsP/WGh0d7XQ8IiKC9PT08547fPhwjhw5QkxMDElJSQAYjUaKi4uJinKeBqjO9apDp6vdHyYV+6VUZ98UUXNNpZ9tqsrmbal8+G0yVptKqMGb+27o7LSbe11qKv1cHzSWvlbLTKilhajmYmwViYvp9AiNz6XXOYqBS3ZuoCx55+nRG3MJcPrp0KB7VjnqakzHfsf81zfnfF+NtQStzl5nqg0IwRoQhuLtZ//Ql3/29kfj7Y9G74vWau9npfMQvNv0LE9uykdivLwdSdiZdO16Qbte1eyJhv33eLHqw/ezR5OhkhL73ObZtUHe3t7k5+ef99zFixdTWlrK4sWLufPOO/n0008pLS095/VMJtNFxarRKISE+F/UNc7FYJCpC3dozP2cnV/C0nd2sedv+war/bo254FbuxHg5/4NXxtzP9c39aGvVdXmlAyUHj9IWfYJrCUF2EoKsJUUOv5sLS0mZtwCR4KT+clqivb+eM5rRw64Hq2v/f9di6WQ0uyjldooOj0anwCC/LToguxtvdp3p9RHj8bH3+lD623/7BXeAo3O/m8j5Kp/wlX/PO89Oh7PqaOfAcLOk9/PHk2GfHzsaxaYzWbHnwFMJhO+vufvlC5dugCwYsUKBg0axJYtWxx1R2az8yOB1bnehdhsKkZj8UVd42xarQaDwRejsQSrtWk+8u0Ojb2ffz2QxdpN+ygsKUPvpWHs8A4M7NacMlMZuaayC1+gljT2fq5P6qKvVVWFslJs5SM1umann+g1H/wJS9Zh1NJCbKVFqKZC+4hOaSGquYTgSetQyqdhC3/YQNnf28/5PjmZp9CUT1GVKd6g0aJ4+1calVH0fuTlFaMpLU+02g0koHnXM9r6o3j7OgqWC2xAbpG9bXR3tNHd7fcFWMs/HP8aCsrO/Oqc5HvaPeqynw0G3/q/a33F9FhWVhaxsbGO41lZWcTHx1dqn5ycTFpamiPpAfsUWFBQEJmZmQQHB+Pn50dWVpbTeVlZWZWmzmqirtaosVptTXb9G3dqbP1sKrPy/jd/83+7jwPQKjKQe69PIDrMv3xxSc8sMNnY+rk+O1dfq1aLc8JiKgRzCV4dBjjamH79FOvxv8rb2RMcbKcLggMmrHWM4JgO78Jy+JdzxlFWXOCYolJCW6FtUYTiHWBPXHwC7B/lSYwVHbbymPWX/RP95WPPWStjA0dbglugBLew31/5Byrghu81+Z52D0/2s0eTofj4eAICAti+fbsjGTIajezdu9fxNNiZvv/+e1544QV++OEHAgLsv1kcPXqU3Nxc2rZti6Io9OzZk19++YVbb73Vcd727du59NJL3XNTQrjBsaxCVn/2FydO2X8THtEnllED26Br4DUkojLVZkUtLUAtKUAtMaKWGrGYCsjBTElhAfo+dzjalnyzGkvqbigrrfJauksuP70gX94JrBkHKzfS6lC8A+zX8LZPC+nieqAJbFae1ASAj7892Sn/WvE+PX3k3X0kdB9ZrXuriEUIT/NoMqTX6xkzZgyLFy8mNDSUmJgYFi1aRFRUFMOGDcNqtZKTk0NgYCA+Pj7ccMMNrF27llmzZjFz5kzy8/N55pln6Nq1K1dccQUA48aN49577yUhIYGBAwfy0UcfsW/fPp599llP3qoQtUJVVb76NY0P/i8Zi9VGkL+eCdcm0Kl13e9pJmqPai6xJzYlRmylxtOJTokRtcyE7+DxjrYlm5diPf5XpWtUrCbjlXjb6aSifKoLAEU5naiUj8xgLYPytl4JQ9DFXXp61KYi0dHpK43UeLW7DNpdVuv9IER94fFFF6dNm4bFYuGxxx6jtLSUxMRE1q5di16vJy0tjaFDh7JgwQJGjRpFSEgIb7zxBs8//zx33HEHWq2WoUOH8sgjj6DV2v+B9+/fn+eee46kpCSWLVtGu3btePnll2XBRdHgGYvMrPt8H3uSswHo1jaMcdd0xOCBImlRma3EiFqUWz6KY0QtyUctKcBWYgSLCd8rpzjalmxZWWWCU0EdeBeKxv7fs+JrsCc2PoEoPgYU30A0fgZ8g0IwK972qa3yBMe79y14J46yJz563yqfcqqgi+5QS3cuRMOnqKpaP3eurGesVhs5OUW1ek2dTkNIiD+5uUUyH12HGkM//3k4mzX/3YexyIxOq+H2Ie0Y0jOmXi1r3xj6+Wy2gpPYCnPKp6fOGL0pMaJazPhdPdPRtvjzxVjT/jzntQLGr0HR2hOciuksxScQxdeAxtee5NiTHQNeHQejlD/tpJZV7Dd1OrFpjH1dH0k/u0dd9nNoqH/9L6AWQpxfmcXGR1uT+d+OYwDEhPsz6fpOtAgP8HBkDZetKBdbwSn7KE5RLrbiXPs0VakRykz4Xf+oo23p9/85b4KjWi2OBEfxC0bxDULxNZR/nE5uFN9Azixo9xk8odr1MsoZqw8LIeqGJENC1FPp2UWs/vQvjmYVAjC0ZwtuvaItei8pOj2bqqpgLsZWlIdanItamGNPcopyUU3F+F55v6Nt6da1F0hwyhyPa2sCw7EZIu1TU74GxzRVRcJzJt/BE6odrxQOC1G/SDIkRD1hKrOSllXI0cwCUjML+PmvTMwWGwG+XtxzTUe6t2t24Ys0QqrNilqcj1qci618NEctLcS7102ONqX/W25/iupc17BMcEw7aQLDsQU2Q+MXguIfYh/R8Qsqn6qy1+dU8BlwV93dmBCi3pBkSAgPKCwp42hmAUczTyc/GTnFnF3B1ykuhPHXJhAc0DinSlRzSfkITh5qSb79qaVypT+9jeXwDtSSfCp1DKDvPhJFZ++Xin2m8PYvT3KC0fhXJDshOE1RSYIjhDiLJENC1CFVVcktMHE0s5DUzILyBKiAbGPV28MY/PXERgbQKjKQNs0NdGvXDE09KpKuLlW12YuMi/PRnrmS8Z4vsBz7w16rU5QLZSVO5+niejoSHMpKUYvz7H9WtCh+QSj+IY4kB6sFytt69x2Nd78xp88VQggXSDIkRC2xqSqZOcWO0R77iE8hhSVVL/sfHuxDbGQgsZGBtIoMIDYysEGOAFmO/YE14yClhScpLs7FnH8StSgfVPtqxgHjVjuKgG25Jyo/Uu7l60hw1DKTI6HRdxuJV8JQFP9ge43OeR4TP3PRPyGEcJUkQ0LUgMVq4/jJIsdUV2pmAceyCjGVWSu11SgK0c38iI04nfTERgbg5+PlgcirT7VaUAtOYTNm2T8KTqIas7AZT+J30+OOGhzL4V8oO/B95QsoCopvEKqp0JEM6dr3QxvdwWmER/HyqXwuoAmOrrN7E0KIM0kyJMQFlJgsHMsqdKrxOX6qCKutch2Ll05Dy4jTCU+ryEBimvnX2yfAVHOJI9nRterueIqq9Of1lP3xZZW1OmBff0cbEgOANqYTaLTogiMJbN6SEvyxeQfZp7XOempKF90BZLE/IUQ9I8mQEGcwFpvPKmwuJCunuMotT/28dcSWj/S0Kk9+osL80Grq5/5gloxDWNP+wGY8ic2YhWrMQi0tcLzud9tzaIObA6Do/eyJkFaPxhCBxhCOYogo/3MEGv/T2394teuLV7u+6HQaAkL8KZMF6oQQDYwkQ6JJUlWV7PxSUs+o7zmaVUhuQdWFzcEB+vKE53SNT1iQT71YAVq1WVALsk9PZ5UnOjbjSXyvmoomKBIA64m9mHd9Vul8xScQxRABltO1TV4JV+AVP9C+iGA9uEchhKhLkgyJRk9VVY5mGPnjYBYp6UbHqE9RqaXK9pEhvk7TXLGRgRj8Pbv/l1pWeno6Kzre8Si5ec+XmLavP/d0Vn6mIxnSRl6CV/zg8hGecMcoj6L3rXSexiew7m5GCCHqGUmGRKOWmVPMq5v2cviEsdJrWo1C82b+jimu2MhAWkYE4Ovt2X8W1twTWFJ3Y8tJcxQtqyWn4/e9eia6ll2B8vV1HNNZ9gRHMUSgCbT/WRvRxnGeLiYBXUyC2+9HCCHqO0mGRKOkqio/7Ennna8OYSqzotdpaBUV6ChubhUZSPNm/njpPFPfo6oqalEO1lOp2E6lomvb21GQbMtKxvzLB5XOUbwD7NNZZzxirovrif8/l9mLlc/z6LkQQohzk2RINDqFJWW88cV+dh44CUDHViHMGpuIDpvHCnttpQVY0/6yJz/ZR7GdSkU1FTpeV3wCHcmQJqItuja90YS1RBMUecZ0ll+l6yp63yqnuYQQQlSfJEOiUdmfmsurm/aSW2BCq1G4aWAbrr08jrAQX3Jzi+r8/VWrBVvucaynjqANbYE2oi1gX2yw9JuXnRsrWjShzdGEtXJaU0cb0txpY1EhhBB1S5Ih0ShYrDY2fJ/C5p9TUbEXQd97fSdaRxvQaOrmaSjVasF6MgXbqVRs2an2UZ/c42CzL7zo1fkqRzKkDYtFE9EWbbNWaJq1QhvWCk1ojGNdHyGEEJ4jyZBo8DJziln92V8cybCvmTOgazR3XHkJPvra+/a2lRZgO5UKOj26qPYAqKUFlHz2bOXGej970hMc5Tik6H3xv/FftRaPEEKI2iPJkGiwzi6S9vfRcdeIeHrFR1zUNdWiHGynjmI9dQRb9lGsp1JRi3IA0MZ2QzfCngwpfsFowmJR/EPsIz/N4tA2i0UJaCZr8wghRAMiyZBokM4uko6PDWbCtQmEGqre56oqqmpDzc9CNRWijWxXcZSiD+ZBWWml9oohEk1A2OmvFQX/m5+6qPsQQgjheZIMiQanqiLpEb1jz1sbpFrLsJxKpSzziOOJLmv2USgrRRMUhf/tzwOgKBq0zeJQTYWna3uatUIb1rLKp7mEEEI0fJIMiQbjfEXSF3L89XmYM5Irv6DVg08Aqs3q2FTU99rZsmaPEEI0IZIMiQahukXStqJcLEd+xZr2Fz7DpqKUb5qqj2hJWW66/TH2sFjHU12aoKhKO6tLIiSEEE2LJEOiXqtOkbStMAdLyk4sKTuxZhyC8j3mrRkH0DXvCECz4RPR9RuH1Vr1Hl5CCCGaLkmGRL11oSJpS/oBTL98gC3zb6fzNJHt8Grdy2khQ43eB0UpoiJREkIIISpIMiTqpaqKpK+K90Gj5gP2ZEjRepUnQgraqEvQtUlEF3cpmoBQj8YuhBCiYZFkSNQrZxdJx4eYubNjIYEnvqVkTypeHQbgM2g8AJrw1ngPHIeuZVc0/iGeDVwIIUSDJcmQqDcqiqSLs9IY5pNKv6DjBJedhP1gA1AU1DPW/1EUBX38II/FK4QQonGQZEh4nHORtIXHgr8lXJMPZYCiQRuTgK51L3RxPdH4XvgxeiGEEMIVkgwJj1BVFVtOGsUHt3Nq307ezBqKBS3xsSGExg1Em5+KV3kCpPgEeDpcIYQQjZgkQ8JtVFXFln0Uy+EdlKXsQM3PBKAZkKA/QfvLB5evJN3Ts4EKIYRoUmqcDBUVFeHv7w/A5s2bycjI4IorriAuLq62YhONiOX4Xkq/ew214KTjWJmqYV9ZDClel3DjLcOJi430YIRCCCGaKpeToZSUFCZNmsTIkSN58MEHWbZsGa+88gqqqvLCCy+wbt06Lr300rqIVTQQqqpiy0oGrRfaZq0A0PiHoBacRNV6ccgWy08FzdlrbkHvrrFVriQthBBCuIvL+w4sXrwYrVbL0KFDKSsr49133+Xqq69m586dDBgwgBdeeKEOwhT1narasGQcovSndyh65yGKP30G8+6NjteVoCiSO9zFY3m3syq7Hwc1lzD+xh6MG9lREiEhhBAe5fJPoR07dvDss8/SpUsXtm3bRkFBAbfffjsBAQGMHj2aqVOn1kWcop6ypB/AcngHlpSdqMV5p1/w8kHxtu/yfnolaRXQVFpJWgghhPAkl5OhsrIygoKCANi6dSu+vr6OaTGr1YpOJ7/lN2aqqqIoiuNr08/rsZ1MsX/h5YsurgderRPRtuiEotNXuZK0vUhaOcc7CCGEEO7lcubSoUMH/ve//xEXF8fnn39O//790el0lJWV8fbbb9O+ffu6iFPUE6VbVuAzeAKK3j7q49VhANaQGLzaJKKNSUDRegHlK0l/m+xYSToyxJd7r+9E62hZJ0gIIUT94nIyNG3aNO6//37efvtt9Ho9EydOBGD48OGcOnWKl19+2aXr2Ww2Vq5cyQcffIDRaOTSSy9l/vz5tGrVqsr2hw4dYtGiRfz+++9oNBoSExN55JFHaN68uaPNkCFDOH78uNN51113HYsXL3bxbsWZVIsZS+puTL9+ivelN6Do/dAnDIGEIU7tKlaSPpJRAMDAbtGMHipF0kIIIeonl386XX755WzcuJE//viDbt26ERMTA8Bdd91F37596dChg0vXS0pKYv369SxYsIDIyEgWLVrExIkT2bRpE3q93qltbm4u48aNIzExkbfeeguTycS///1vJkyYwCeffIK3tzeFhYWcOHGC1atX06lTJ8e5Pj5Sn3KxbDlpoKpYDv2Ed9/RlV53Xknair+PjrtGxNMrPsID0QohhBDVU6Nf1Vu2bEnLli2djt11110uX8dsNrNu3TpmzZrFoEH2PaaWLVvGgAED2LJlC9dcc41T+6+++oqSkhKef/55vL29AVi0aBGDBg1i165dXHbZZRw8eBBVVenZsycGg0zJ1CZrzjEANGGxTnVDcGaRtH0dISmSFkII0VBUKxmaO3euSxddsGBBtdrt37+foqIi+vbt6zhmMBhISEhgx44dlZKhyy67jFWrVjkSoTPl5+cDcODAAcLDwyURqgO27IpkyDkRliJpIYQQDVm1kqHt27c7fZ2VlYXFYqF58+aEh4eTl5fHsWPH0Ov1xMfHV/vNMzIyAIiOjnY6HhERQXp6eqX2LVq0oEWLFk7HVq9ejbe3N4mJiQAcPHgQPz8/pk6dyu7duwkNDWXUqFHceeedaDQuL6vkRKe7uPPPptVqnD7Xd2quPRnyCm+FTqfBYrXx8dbD/PenI/Yi6VA/Jt/YmTbN61ci2tD6uaGSfnYf6Wv3kH52j/rQz9VKhr755hvHnzdu3MjixYtZsWIFXbt2dRz/+++/mTJlCldffXW137ykpASgUm2Qt7e3Y6TnfN544w3eeecd5s6dS1hYGGAvsC4oKGDkyJE88MAD7Ny5k8WLF5Ofn8/06dOrHdvZNBqFkBD/Gp9/PgaDb51ctzapqkp++chQSOv2ZFtUFr29i7+P5QFwVZ9WTLihM77e9bdIuiH0c2Mg/ew+0tfuIf3sHp7sZ5d/ci1btoyHHnrIKRECaNeuHdOnT2fBggXVrh+qKGo2m81OBc4mkwlf33N3iqqqvPjii7z00ktMmjSJu+++2/Haa6+9hslkIiDAvtN5hw4dKCoq4qWXXmLq1Kk1Hh2y2VSMxuIanXsuWq0Gg8EXo7EEq9VWq9eubdaCU9hMxaDR8sWfxby55VtHkfQ913QksWMkpcUmSotNng61kobUzw2Z9LP7SF+7h/Sze9RlPxsMvtUacXI5GcrNzSUwMLDqi+l0FBdXP2GomB7LysoiNjbWcTwrK+uc021lZWXMnTuXTZs2MXv2bMaPH+/0upeXF15eXk7H2rdvT3FxMfn5+YSEhFQ7vrNZLHXzj8FqtdXZtWuLDR3efW7nrwPHWPP5IcC5SLq+xw8No58bA+ln95G+dg/pZ/fwZD+7PEzSvXt3Vq5cSW5urtPxrKwsVqxYQZ8+fap9rfj4eAICApxqkoxGI3v37qVXr15VnjN79my++OILlixZUikRstlsDBkyhJdeesnp+B9//EGzZs0uKhFq6jS+BpROw0k6cgkAowa24eHRPeRpMSGEEA2eyyNDc+bMYezYsQwZMoQePXoQEhJCdnY2u3fvJigoqFIicj56vZ4xY8awePFiQkNDiYmJYdGiRURFRTFs2DCsVis5OTkEBgbi4+PDxx9/zOeff87s2bPp3bs3J0+edFyros3w4cNZs2YNcXFxdOrUiW3btrFmzRrmzZvn6q2Ksxw/VYjVphLg68U1l7Wq9Hi9EEII0RC5nAzFx8ezadMmXn/9dXbt2sXx48cJCQnhnnvu4a677iI4ONil602bNg2LxcJjjz1GaWkpiYmJrF27Fr1eT1paGkOHDmXBggWMGjWKTZs2AbBw4UIWLlzodJ2KNg899BAGg4ElS5aQkZFBixYtmDdvHrfddpurtyrOYDmym4wToGAjLipQEiEhhBCNhqKqqurpIBoCq9VGTk5RrV5Tp9MQEuJPbm5RvZ6PVstKKXxtMqAyL/dWBl8Wz6iBbT0dVrU1lH5u6KSf3Uf62j2kn92jLvs5NNS/bgqoAQoKCvj5558pLi6mqlzqxhtvrMllRT1ly0kDVArxo1D1JS6qfq0jJIQQQlwMl5OhrVu38uCDDzrWCDqboiiSDDUy1vL1hY6VBQMQF1X104RCCCFEQ+RyMrR06VLatGnD3LlziYyMvOhVnUX9Zyvfk+y4JQSDv56QwMrboQghhBANlcvJ0OHDh0lKSjrno++i8bFmHwXghDWEuOZSPC2EEKJxcXlYp3nz5hQWFtZFLKIeUlVbec1QeTIkU2RCCCEaGZeToUmTJrFq1SrS0tLqIh5Rz6gFp6CsFAsaMq1BxEVL8bQQQojGxeVpso0bN5KZmcmwYcMIDQ112lMM7AXUX331Va0FKDxL8TWgHTKF9zfuxIaG1jIyJIQQopFxORmKiooiKiqqLmIR9ZDi5UOa9yX8aCogJNCboAApnhZCCNG4uJwMLViwoC7iEPXYkXQjII/UCyGEaJxqtOgiwPfff8/27dsxGo2EhITQq1cvBgwYUJuxiXrA/OcWzEeK8cJX6oWEEEI0Si4nQ2azmfvvv58ffvgBrVZLSEgIubm5vPLKK/Tt25fVq1ej1+vrIlbhZqq5BNNPbzMI+EK5TeqFhBBCNEouP022YsUKfv31VxYuXMiePXv44Ycf+P3331mwYAG//fYbSUlJdRGn8ABr+WKLeTY/ilUfWkkyJIQQohFyORnatGkTDzzwANdffz1arRYAnU7HjTfeyAMPPODYWV40fLbyxRaPW0JoFuRDoJ+M+AkhhGh8XE6GcnJySEhIqPK1hIQEMjMzLzooUT/YsmWxRSGEEI2fy8lQbGwsO3bsqPK17du3Ex0dfdFBifrBmlM+MmQNobUUTwshhGikXC6gHj16NAsWLMDHx4drr72WZs2acerUKTZu3MiaNWuYOnVqXcQp3Ey1nd6G47gllCtlZEgIIUQj5XIydMcdd7B3716WLl3KsmXLHMdVVeWmm27i3nvvrdUAhWeoxiywmDGrWk7ZAqV4WgghRKPlcjKk0Wh49tlnueeee/jll1/Iz88nKCiI3r1707Zt27qIUXiAYgjnxGUPs/F/uwgP8cfPx8vTIQkhhBB1wuWaIYAdO3bw+eefc8cdd3DffffRpUsXli1bxp49e2o7PuEhikbLoYIA9pa1kMUWhRBCNGouJ0P/93//x913383PP//sOKbT6Thx4gT//Oc/z1lcLRqeIxkFgGzDIYQQonFzORlauXIl119/PW+//bbjWHx8PB9//DHXXnstS5curdUAhWeU/vQOUZk/4KuYJRkSQgjRqLmcDB0+fJgbbrihyteuv/569u/ff9FBCc9STUWU/fk/hmu3owCxkZIMCSGEaLxcToYMBgOHDx+u8rXU1FT8/f0vOijhWdbyR+qzrf4Eh4Xg613j/XyFEEKIes/lZGjEiBG8+OKLfPvtt07Ht27dyvLly7nqqqtqKzbhIRXbcMjK00IIIZoCl3/lnz59Onv27OG+++7Dy8uL4OBg8vLysFgsdOvWjZkzZ9ZFnMKNbNn2DVqPW0MlGRJCCNHouZwM+fn58c4777B161Z27txJfn4+gYGB9OrVi8GDB6PR1OhpfVGPWCtGhiwh9JDH6oUQQjRyNSoGURSFwYMHM3jwYEwmE15eXpIENRKqzYo19zgKkG4LpWVEgKdDEkIIIepUjTKYw4cP8+CDD9K7d2969OjBvn37eOKJJ3jzzTdrOz7hZmphNlgtmFQd+pAovL20ng5JCCGEqFMuJ0P79u3jlltu4a+//uLaa69FVVUAvLy8eO655/jkk09qPUjhPhpDBN+0f4SlxpHENZcpMiGEEI2fy8nQv//9bzp37szmzZt59NFHHcnQvHnzuOWWW3jjjTdqPUjhXoezSsiwBtNaiqeFEEI0AS4nQ7/99ht33303Op0ORVGcXhs5ciRHjhyprdiEB6iqypH08m04pHhaCCFEE+ByMuTt7U1paWmVr+Xl5aHX6y86KOE5+Z+/wNXK9wRpS2kRLsXTQgghGj+Xk6F+/fqxfPlyMjIyHMcURaGoqIh169Zx+eWX12qAwn3U0kK0x3+nv89BIpoF4aWTJwSFEEI0fi4/Wj9r1ixuv/12RowYQXx8PIqi8Pzzz5OSkoKqqrJRawNWsb7QKWsAMbFhHo5GCCGEcA+Xf/WPjo7m008/5a677kJVVWJjYykuLubaa6/l448/pmXLlnURp3CDipWnT1hDpF5ICCFEk1GjRRdDQkKYMWNGbcciPMyaU7ENRwh95UkyIYQQTUSNikJ27NjBrl27ADh+/Dj33nsv1113HatWrarV4IR7mbNSAciwhdG8mb+HoxFCCCHcw+Vk6NNPP+XOO+/kq6++AmD+/Pns2LGDVq1a8fLLL/PKK6+4dD2bzcby5csZMGAA3bp145577iE1NfWc7Q8dOsS9995Lnz59uOyyy5g2bRonTpxwarN582ZGjhxJly5duO666/juu+9cvc0mR7VZIL+8H0NaoNNK8bQQQoimweWfeK+99ho33XQTs2fPJjs7m59++okHHniAlStXMmPGDD766COXrpeUlMT69et55plneO+991AUhYkTJ2I2myu1zc3NZdy4cfj7+/PWW2/x6quvkpuby4QJEzCZTAD8/PPPzJo1i3/84x9s2LCB/v37M2XKFJKTk1291SZFLc7HpPWjVPUiNDrG0+EIIYQQbuNyMnT48GFuuOEGAL777jtUVWXo0KEAdOnShfT09Gpfy2w2s27dOqZOncqgQYOIj49n2bJlZGZmsmXLlkrtv/rqK0pKSnj++ee55JJL6Ny5M4sWLSI5Odkxbffqq68ybNgwxowZQ9u2bZkzZw6dOnXiP//5j6u32qRoAsJ4zXscj+feQuvmQZ4ORwghhHAbl5Mhg8FAUVERAFu3bqV58+bExcUBcPToUUJCQqp9rf3791NUVETfvn2drp+QkMCOHTsqtb/ssstYtWoV3t7elV7Lz8/HZrOxa9cup+sB9OnTh507d1Y7rqbIZlM5klmACS/ipHhaCCFEE+Ly02R9+/Zl5cqVHDp0iC1btnDPPfcA8OWXX/Liiy/Sv3//al+rYuHG6Ohop+MRERFVjjC1aNGCFi1aOB1bvXo13t7eJCYmYjQaKS4uJioqqlrXc5Wulhch1JbX5WjrQX3O8VNFmMxW9F4aWkYGotEoFz6pgahP/dyYST+7j/S1e0g/u0d96GeXk6F58+bx8MMPs2rVKi6//HImTZoEwIIFC2jevDkPPfRQta9VUlICUGkLD29vb/Lz8y94/htvvME777zD3LlzCQsLcyRXVV2voqaopjQahZCQunnCymDwrZPruiLzjUeYHKiyM3QkYWGNcxuO+tDPTYH0s/tIX7uH9LN7eLKfXU6GQkJCWLt2baXj77zzDs2bN3fpWj4+PoC9dqjizwAmkwlf33N3iqqqvPjii7z00ktMmjSJu+++G8AxfXZ28fWFrlcdNpuK0Vh8Udc4m1arwWDwxWgswWq11eq1XWErzkdfeIL2OkgNDyU3t8hjsdSF+tLPjZ30s/tIX7uH9LN71GU/Gwy+1RpxqtGii1VxNRGC09NjWVlZxMbGOo5nZWURHx9f5TllZWXMnTuXTZs2MXv2bMaPH+94LTg4GD8/P7KyspzOycrKqjR1VhMWS938Y7BabXV27eqwlK8vdMoWSEx0mEdjqUue7uemQvrZfaSv3UP62T082c8enQiNj48nICCA7du3O44ZjUb27t1Lr169qjxn9uzZfPHFFyxZssQpEQL7hrE9e/bkl19+cTq+fft2Lr300tq/gUbCcsq+J9lxa6gUTwshhGhyam1kqCb0ej1jxoxh8eLFhIaGEhMTw6JFi4iKimLYsGFYrVZycnIIDAzEx8eHjz/+mM8//5zZs2fTu3dvTp486bhWRZtx48Zx7733kpCQwMCBA/noo4/Yt28fzz77rAfvtH4rOpGCHjhJKP1D/TwdjhBCCOFWHi+RnzZtGrfccguPPfYYd9xxB1qtlrVr16LX60lPT6d///58/vnnAGzatAmAhQsX0r9/f6ePijb9+/fnueee49133+Wmm27i559/5uWXX6Zt27Yeu8f6rmJPMqshBo3SeJ4iE0IIIapDUVVV9XQQDYHVaiMnp3YLi3U6DSEh/uTmFnlsnlS1lmFcOwkNNv4v7gGuv6rq6cmGrD70c1Mg/ew+0tfuIf3sHnXZz6Gh/nVXQJ2SksLWrVspLi7GZnMOXFEUpkyZUpPLCg9QTUUcV6LxteQTddYaTkIIIURT4HIytGHDBubOncu5BpQkGWpYbN4GXsi7EotV5XnZhkMIIUQT5HIy9NJLL3H55ZfzzDPPEBUVhSI1Jg3a8ZNFWKwq/j46woN8LnyCEEII0ci4XEB94sQJJkyYQHR0tCRCjcCRE9kAxEUFyt+nEEKIJsnlZKh169a1ss+X8DxVVUnYtZB/BX1MxzCLp8MRQgghPMLlZOihhx4iKSmJ7du3X/R+X8Kz1JJ8fGzFhGqKiIpxfQVxIYQQojFwuWbo2WefJTs727Ef2NkURWHv3r0XG5dwA3PWEQCybAbiWoR5NhghhBDCQ1xOhq6//vq6iEN4QO7RZAKwrzzdLtDb0+EIIYQQHuFyMvTAAw/URRzCA0qzUgkASv2bS/G0EEKIJqtaydCOHTtISEjA39+fHTt2XLB9YmLiRQcm6p6X8YT9c3ishyMRQgghPKdaydDYsWN5//336dq1K2PHjkVRlEqLLlYcUxSFffv21UmwovaoFjOBFvtj9cEt23k4GiGEEMJzqpUMvfHGG46NTt944406DUi4h6m4hO2mtoRqCmkbG+PpcIQQQgiPqVYy1Lt37yr/LBquY0aV9UWXExygZ6lBVp4WQgjRdLm8zpBoHI6kFwAQF2XwcCRCCCGEZ0ky1ESdSktFi5W46EBPhyKEEEJ4lMuP1ouGT1VVhp58k6tDzGQEPuzpcIQQQgiPkpGhJqgk9yS+2LdSad46zrPBCCGEEB5W42TIZrOxf/9+vvvuOwoLC8nLy6vFsERdyjx8EIBsgjEE+ns4GiGEEMKzajRN9umnn7JkyRKysrLQaDR88MEHrFixAi8vL5YsWYJer6/tOEUtKjqRQjOg0CfS06EIIYQQHufyyNDnn3/OnDlz6Nu3L8uWLcNmswFw1VVX8d1335GUlFTrQYpalptm/xzSwrNxCCGEEPWAyyNDL7/8MqNHj+aJJ57AarU6jo8aNYrs7Gzef/99HnzwwdqMUdQy/9JMUCCgeWtPhyKEEEJ4nMsjQykpKQwbNqzK17p160ZmZuZFByXqTmFhIaHkAxDZpr2HoxFCCCE8z+VkKCwsjOTk5CpfS05OJiws7KKDEnXnaIaRTSU92K3G4x/SzNPhCCGEEB7ncjI0cuRIli9fzhdffIHZbAbsm7T++eefJCUlMWLEiFoPUtSelJNmvi7tzN6oa1EUxdPhCCGEEB7ncs3Qgw8+yMGDB3nwwQfRaOy51NixYykuLqZXr15Mnz691oMUtUe24RBCCCGcuZwM6fV61qxZw48//si2bdvIz88nMDCQ3r17M2jQIBltqO8y9xOu8aJ1lKwvJIQQQsBFbMfRr18/+vXrV5uxiDpmLDRxi/I//ILL0Oq7AVLfJYQQQtQoGfryyy/ZtWsXRqOx0muKovDcc89ddGCi9qUdOUpLTRlWNAREtPR0OEIIIUS94HIytHjxYtasWUNAQAAGQ+W6E5kmq79yjyXTEjDqwgjWyh69QgghBNQgGfrkk0+47bbbeOqpp+oiHlGHLKeO2j8HNvdwJEIIIUT94fKj9SaTSR6fb6C8i07YP0fGeTYQIYQQoh5xORm66qqr+Oabb+oiFlGHcgtMRKjZAIS2aufhaIQQQoj6w+VpskcffZRbb72VsWPH0q1bN3x8fJxeVxSFKVOm1FqAonakpp2ktca+xpB3RCsPRyOEEELUHy4nQ2+++SYpKSmkpKSwY8eOSq9LMlQ/pWYWsbVwEIkxKpf7yoKLQgghRAWXk6G33nqLa665hrlz59Ksmext1VAczirlj7JWdGkvm7MKIYQQZ3K5Zqi4uJjbbrtNEqEGRFVVjmTY14SSbTiEEEIIZy4nQ5dffjnbt2+vtQBsNhvLly9nwIABdOvWjXvuuYfU1NRqnTd+/HhWrFhR6bUhQ4bQoUMHp4+HH3641mJuaHKMJuIt++msP06LEJf/yoUQQohGzeVpshtuuIHHHnuM1NRUevToQUBAQKU2N954Y7Wvl5SUxPr161mwYAGRkZEsWrSIiRMnsmnTJvR6fZXnlJaWMm/ePH744Qe6d+/u9FphYSEnTpxg9erVdOrUyXH87ELvpuRIeh63+G/HR7GgLbkCfCv/nQkhhBBNlcvJ0LRp0wD473//y3//+99KryuKUu1kyGw2s27dOmbNmsWgQYMAWLZsGQMGDGDLli1cc801lc7ZtWsX8+bNo6ysrMoVsA8ePIiqqvTs2bPK15uijKNptFcsWNGiCY7ydDhCCCFEveJyMvT111/X2pvv37+foqIi+vbt6zhmMBhISEhgx44dVSZD33//PcOGDePee+/l+uuvr/T6gQMHCA8Pl0ToDCWZKQCY/CJQNLINhxBCCHEml38yxsTE1NqbZ2RkABAdHe10PCIigvT09CrPmT59+nmvefDgQfz8/Jg6dSq7d+8mNDSUUaNGceedd6LRXFy9jE5Xu/U2Wq3G6XNdUFUVrfE4eIGuWWyt30ND4I5+FtLP7iR97R7Sz+5RH/q5WsnQ3Llzuf/++2nZsiVz5849b1tXdq0vKSkBqFQb5O3tTX5+frWucbZDhw5RUFDAyJEjeeCBB9i5cyeLFy8mPz//gonU+Wg0CiEh/jU+/3wMBt86uS5A+qkix8rTEe061tk9NAR12c/iNOln95G+dg/pZ/fwZD9XKxnavn07d911l+PPtaWiqNlsNjsVOJtMJnx9a9Ypr732GiaTyVHY3aFDB4qKinjppZeYOnVqjUeHbDYVo7G4Rueei1arwWDwxWgswWq11eq1K/y2P4Pm2lwALIFR5OYW1cn71Gfu6Gch/exO0tfuIf3sHnXZzwaDb7VGnKqVDJ25F1lt7ktWMT2WlZVFbGys43hWVhbx8fE1uqaXlxdeXl5Ox9q3b09xcTH5+fmEhITUOF6LpW7+MVittjq79tFjJ+mgLbR/EdSizt6nIajLfhanST+7j/S1e0g/u4cn+9nlYZK5c+dy7NixKl87fPgw9913X7WvFR8fT0BAgNNok9FoZO/evfTq1cvV0LDZbAwZMoSXXnrJ6fgff/xBs2bNLioRaqiSM0v4d/51HLlkNIqPPFIvhBBCnK1aI0MnTpxw/PmTTz7hyiuvRKvVVmr33Xff8dNPP1X7zfV6PWPGjGHx4sWEhoYSExPDokWLiIqKYtiwYVitVnJycggMDKzWOkEajYbhw4ezZs0a4uLi6NSpE9u2bWPNmjXMmzev2nE1FjZVJSWziFJrCCGdens6HCGEEKJeqlYy9NRTT7F161bAXiD9wAMPVNlOVVX69evnUgDTpk3DYrHw2GOPUVpaSmJiImvXrkWv15OWlsbQoUNZsGABo0aNqtb1HnroIQwGA0uWLCEjI4MWLVowb948brvtNpfiagwyc4opNVvR6zREN/PzdDhCCCFEvaSoqqpeqFFmZiY//fQTqqry6KOPMnnyZKcaH7CPyhgMBvr06YOfX+P7wWu12sjJqd3iY51OQ0iIP7m5RXUyT7rtzwxSv1pPQJCBkaNvQdNEd6uv634WdtLP7iN97R7Sz+5Rl/0cGupfewXUkZGR3HTTTYB9ZGjw4MFNsv6moUlJz+Mq3z/xLrOgmkZAE02GhBBCiPNxedHFiqRI1H956Wl4KxZsGh0aQ6SnwxFCCCHqJVlWs5Gy2myQmwaAGtQcRVO54F0IIYQQkgw1WunZxURgX3naO6KVh6MRQggh6i9JhhqpI+kFjpWntWGxF2gthBBCNF2SDDVSRzKMxJQnQxpJhoQQQohzcrmAGmDr1q38/PPPGI1GbDbnx+Bc2ahV1J3jJ7IJ1tiXAtCGtvBwNEIIIUT95XIytG7dOhYuXIiXlxfNmjVDURSn18/+WrifxWoj+aSZR6x38NStLQn0bro71QshhBAX4nIy9OabbzJixAgWLFhQ453lRd06frIIi9WG3tuXZm06ejocIYQQol5zuWYoOzub22+/XRKheuxIhhGAuOhAGakTQgghLsDlZCghIYGUlJS6iEXUkiMZBdzmt40Rmp+wFZz0dDhCCCFEvebyrvV33nknTz75JDqdjksvvbTKEaLmzZvXXoTCZakn8rnW+zD6PCvYbvZ0OEIIIUS9Vq1kaMiQIU7TLaqq8vjjj59zCmbfvn21E51wWZnFiinnBHqDFVXnjWKI8HRIQgghRL1WrWToueeek9qTBiLtZBFRmhzA/ki9oshSUkIIIcT5VCsZGjVqVKVjJ0+eJDw8HIC8vDwyMjKIj4+v3eiEy1LSTy+2qA1r6eFohBBCiPrP5WEDo9HIuHHjGDt2rOPYnj17uPHGG7n//vspKSmp1QCFa46kF8jK00IIIYQLXE6GFi9ezKFDh5g5c6bjWN++fUlKSuLPP/9k+fLltRqgcM2RDCPNdfZpMk2ojAwJIYQQF+JyMvTNN98wZ84crrrqKscxvV7PkCFDmDlzJps3b67VAEX1mcqsnDyVR0V1l2zDIYQQQlyYy8lQUVERBoOhytfCwsLIzc296KBEzRzLLMSkerHE8k8C7lyJopeFMYUQQogLcTkZ6tSpEx999FGVr3388cd06NDhooMSNZNSvvJ06ygDik+Ah6MRQgghGgaX9yabPHkyEydOZNSoUQwbNoywsDBycnL4+uuv+euvv3j55ZfrIk5RDUfSCwCIiwr0cCRCCCFEw+FyMtSvXz9eeuklli9fzvLly1FVFUVR6NixI0lJSQwcOLAu4hTVcCTDyKSAr4nLDMCacyfa0BhPhySEEELUey4nQz/99BOJiYl89NFHmEwm8vLyCAwMxM/Pry7iE9VUYrKQlV1I+5B0dNk2FJ2Xp0MSQgghGgSXa4Zmz57N119/DYC3tzeRkZGSCNUDRzMLiNDmo1Ns4OWDEtjM0yEJIYQQDYLLyZBer8fb27suYhEXISW9gOYVK0+HtpRtOIQQQohqcnmabNKkSTz++OPs37+fSy65hGbNKo9AJCYm1kpwovqOZBgdyZBGtuEQQgghqs3lZGj+/PkAJCUlAVTazV5RFNm13gOOZBTQU7bhEEIIIVzmcjL0xhtv1EUc4iIUlZaRlVtC8+CKaTJZeVoIIYSoLpeTod69e9dFHOIipGYU4IWFfCWIIL0ie5IJIYQQLnA5GQL47bff+OWXXygrK0NVVcA+RVZcXMyvv/7K+++/X6tBivM7klFAGTq+ixzDfTd0cpq6FEIIIcT5uZwMvf322zzzzDOOJOhMGo2G/v3710pgovpS0u3bcMRFB0oiJIQQQrjI5eev33rrLfr378/27dsZP348t912G7/99hsvvvgi3t7eXH/99XURpziPI+kFaLARF1X1BrpCCCGEODeXk6G0tDTGjBlDUFAQXbp04ddff8XHx4fhw4czadIkKbB2M2OxmWxjKQ8Z/kuLnxZgzTrs6ZCEEEKIBsXlZMjLywsfHx8A4uLiSE1NpaysDICePXty5MiRWg1QnF9qRgFarETr8qEgC8VXRoeEEEIIV7icDHXs2JH/+7//A6BVq1bYbDZ+++03ADIyMmo1OHFhR9KNRGrz0WIDvR9KQJinQxJCCCEaFJcLqMeNG8cDDzxAfn4+CxYsYOjQocyePZvhw4ezceNGLr300rqIU5zDkYwCYiq24QhrKQXUQgghhItcHhm68sorefnll2nXrh0ATz31FK1bt2b9+vW0adOGxx9/3KXr2Ww2li9fzoABA+jWrRv33HMPqamp1Tpv/PjxrFixotJrmzdvZuTIkXTp0oXrrruO7777zqWYGpIzkyFZX0gIIYRwXY128xw8eDDjx48HICQkhHXr1vHbb7/x5ptvEh0d7dK1kpKSWL9+Pc888wzvvfceiqIwceJEzGbzOc8pLS1l1qxZ/PDDD5Ve+/nnn5k1axb/+Mc/2LBhA/3792fKlCkkJye7dpMNQF6hidwCE811OYDsSSaEEELURI23Nt+6dSsLFixgxowZHDt2jP/9738cP37cpWuYzWbWrVvH1KlTGTRoEPHx8SxbtozMzEy2bNlS5Tm7du3ipptu4vfff8dgqFws/OqrrzJs2DDGjBlD27ZtmTNnDp06deI///lPje6zPjuSXgCotPTKA+y71QshhBDCNS4nQyUlJdxzzz1MmjSJjz76iC+++AKj0ci7777LqFGjOHToULWvtX//foqKiujbt6/jmMFgICEhgR07dlR5zvfff8+wYcPYsGEDgYGBTq/ZbDZ27drldD2APn36sHPnThfusmE4kmFEh41M30vQhLdGExrj6ZCEEEKIBsflAuqlS5fy119/8frrr9OrVy86d+4MwMKFCxk/fjwvvvgiK1eurNa1Kp4+O3tqLSIigvT09CrPmT59+jmvZzQaKS4uJioqqtrXc4VOV+OBtCpptRqnz65KzSzAgpbszqPpmSijQudysf0sqkf62X2kr91D+tk96kM/u5wMbd68mZkzZ9K3b1+sVqvjeHh4OJMnT+app56q9rVKSkoA0Ov1Tse9vb3Jz893NTRKS0vPeT2TyeTy9c6k0SiEhPhf1DXOxWDwdfkcVVVJzSgEoFuHiDqLrTGpST8L10k/u4/0tXtIP7uHJ/vZ5WTIaDQSE1P1dExQUBDFxcXVvlbF4o1ms9nxZwCTyYSvr+ud4u3t7bjemWp6vTPZbCpGY/XvrTq0Wg0Ggy9GYwlWq82lc7PzS8krNBGqLSbIG3Jzi2o1tsbkYvpZVJ/0s/tIX7uH9LN71GU/Gwy+1RpxcjkZuuSSS9i4cWOVG7J+8803XHLJJdW+VsX0WFZWFrGxsY7jWVlZxMfHuxoawcHB+Pn5kZWV5XQ8Kyur0tRZTVgsdfOPwWq1uXztv9PsI2dTgr6h+LVPUK+ZjS66Q12E12jUpJ+F66Sf3Uf62j2kn93Dk/3s8gTd5MmT+fTTT5k0aRIffPABiqKwY8cOnn76ad59910mTJhQ7WvFx8cTEBDA9u3bHceMRiN79+6lV69eroaGoij07NmTX375xen49u3bG91ikPbiaSuh5ILNisYQ4emQhBBCiAbJ5ZGhK6+8kkWLFrFkyRK2bt0KwPPPP09YWBhPPPEEI0aMqPa19Ho9Y8aMYfHixYSGhhITE8OiRYuIiopi2LBhWK1WcnJyCAwMdJpGO59x48Zx7733kpCQwMCBA/noo4/Yt28fzz77rKu3Wq8dySggSpuHBhW8/VH8gj0dkhBCCNEguZwMAVx33XVcd911HD58mLy8PAwGA23atEGjcb0SfNq0aVgsFh577DFKS0tJTExk7dq16PV60tLSGDp0KAsWLGDUqFHVul7//v157rnnSEpKYtmyZbRr146XX36Ztm3buhxbfaWqKkfSjXR2bMMRK9twCCGEEDWkqKqqXswF8vPzOXr0KHFxcZXW/WlMrFYbOTm1W6Ss02kICfEnN7fIpXnSrLwSHnl5G6P8dzDIex9ena/C5/J/1GpsjUlN+1m4RvrZfaSv3UP62T3qsp9DQ/2rVUBd7aGcPXv2cN9997FhwwbHsTfffJOBAwdy2223MWDAANauXVujYIVrjqQbAWjtY/+slW04hBBCiBqrVjK0b98+xowZw/79+/Hz8wPsydFzzz1HbGwsK1as4P7772fZsmV89dVXdRqwsNcLgUqUkg2AJiz2/CcIIYQQ4pyqVTP0yiuv0LFjR15//XXHej1vvvkmAIsWLXI8Bn/q1CnefPNNrrzyyjoKV4B9ZEiDyqnmA4nV56EJae7pkIQQQogGq1ojQzt27GDs2LFOCxf+8MMPtGzZ0mk9oP79+7N3797aj1I42FSV1MwCbGjw63U9vlfej6L18nRYQgghRINVrWQoLy/PadHC5ORkcnNz6dOnj1M7X1/fSqs/i9qVlVtCicmKl05D82Z+ng5HCCGEaPCqlQwFBwdz6tQpx9c///wziqJw2WWXObVLTk4mNDS0diMUTiqKpxPDi1AKT6Gq8oSDEEIIcTGqlQz17t2b9957D5vNhsVi4aOPPsLb25sBAwY42pjNZt5++2169uxZZ8EKSEkvAGCk7WuK1s/GmvanhyMSQgghGrZqFVBPnjyZ22+/3VEYfeLECaZMmeJYV+ijjz7i7bffJiUlhYULF9ZdtIIjGUa8sBBQZl9wUZ4kE0IIIS5OtZKhSy65hPfff59169aRnZ3NxIkTueOOOxyvv/DCC+h0OlatWkXHjh3rLNimzmazF09Ha/NQUFF8AlF8gzwdlhBCCNGgVXs7jnbt2vHcc89V+dqHH35IeHh4jbbjENWXnl2EucxGKz/7jvUa2YZDCCGEuGg12pvsbJGRkbVxGXEB9sUWoX1AAVhAIytPCyGEEBdNhnIakCPlxdMxuvINWkMlGRJCCCEuliRDDciRDCOgElx2EpCRISGEEKI21Mo0mah7FquNo1mFaFCx9PoHvqYsNMGyDYcQQghxsSQZaiBOnCqizGLD11tPaNcBaKRwWgghhKgVMk3WQFQUT8dFBUoiJIQQQtQiSYYaiIptOHoHnMBy7A9Uc7GHIxJCCCEaB0mGGoiU8pGhzrnfULJ5CdasFA9HJIQQQjQOkgw1AGUWG2lZhegpw6s0B5AnyYQQQojaIslQA5B2shCrTaWtf4F9Gw7fIDS+Bk+HJYQQQjQKkgw1ABXF052D7HVCMiokhBBC1B5JhhqAiuLpVj72Pcm0slO9EEIIUWskGWoAUsq34WhmOwXIyJAQQghRmyQZqudMZVZOnCpCQcWnOAMATaiMDAkhhBC1RVagrueOZRViU1WC/PX4XfcIak4amuBIT4clhBBCNBqSDNVzjnqhKAO68NYQ3trDEQkhhBCNi0yT1XMVT5K1jpZH6YUQQoi6IMlQPVeRDHW17MH851fYCnM8HJEQQgjRuMg0WT1WaraQfqoIgLDj32M6eApNaAyagFAPRyaEEEI0HjIyVI8dzSxEBaICFZQi+2P12lB5rF4IIYSoTZIM1WMp5cXT3cJKAVD8Q1F8AjwZkhBCCNHoSDJUj1XUC7Xzt3+WxRaFEEKI2ifJUD1W8Vh9tMZeNC1TZEIIIUTtk2SoniouLSMztwSAQFMmICNDQgghRF2QZKieSi2fImsW5A15JwBJhoQQQoi6II/W11MV9UJx0UEEjFyGNfsYGkOUh6MSQgghGh+PjwzZbDaWL1/OgAED6NatG/fccw+pqannbJ+bm8tDDz1EYmIiiYmJ/Otf/6K4uNipzZAhQ+jQoYPTx8MPP1zXt1KrUipWno4KRNH7oYvugKLx+F+XEEII0eh4fGQoKSmJ9evXs2DBAiIjI1m0aBETJ05k06ZN6PX6Su2nTZuGyWTi9ddfx2g0Mm/ePJ588kn+/e9/A1BYWMiJEydYvXo1nTp1cpzn4+PjtnuqDRXF03FRgR6ORAghhGjcPDrUYDabWbduHVOnTmXQoEHEx8ezbNkyMjMz2bJlS6X2u3fv5pdffmHBggV06tSJyy67jKeeeopPP/2UzEx7kfHBgwdRVZWePXsSHh7u+AgMbDhJRUGxmVP59rWFWqZ/TelP72DNPeHhqIQQQojGyaPJ0P79+ykqKqJv376OYwaDgYSEBHbs2FGp/c6dOwkPD6dt27aOY71790ZRFH799VcADhw4QHh4OAZDw93YtKJ4OjLEF1J+puzP/6GWFng4KiGEEKJx8ug0WUZGBgDR0dFOxyMiIkhPT6/UPjMzs1JbvV5PcHCwo/3Bgwfx8/Nj6tSp7N69m9DQUEaNGsWdd96J5iJrbnS62s0dtVqN0+cKR7MKAWgfpUfNzAZAHxGLppbfv6k4Vz+L2iX97D7S1+4h/ewe9aGfPZoMlZTY19E5uzbI29ub/Pz8KttXVUfk7e2NyWQC4NChQxQUFDBy5EgeeOABdu7cyeLFi8nPz2f69Ok1jlWjUQgJ8a/x+edjMPg6fZ1WvjlrjwgzZILO0IywqIg6ee+m5Ox+FnVD+tl9pK/dQ/rZPTzZzx5NhiqKms1ms1OBs8lkwte3cqf4+PhgNpsrHTeZTPj5+QHw2muvYTKZCAiw7+HVoUMHioqKeOmll5g6dWqNR4dsNhWjsfjCDV2g1WowGHwxGkuwWm2O4wdTcwGIsJ0EQAltSW5uUa2+d1Nyrn4WtUv62X2kr91D+tk96rKfDQbfao04eTQZqpjyysrKIjY21nE8KyuL+Pj4Su2joqL46quvnI6ZzWby8vKIjIwEwMvLCy8vL6c27du3p7i4mPz8fEJCQmocr8VSN/8YrFab49r5hSZyCkwogMGchQooIS3q7L2bkjP7WdQd6Wf3kb52D+ln9/BkP3t0IjQ+Pp6AgAC2b9/uOGY0Gtm7dy+9evWq1D4xMZGMjAyndYgqzu3Zsyc2m40hQ4bw0ksvOZ33xx9/0KxZs4tKhNylYrHF6Gb+KHnHAdCExZ7vFCGEEEJcBI+ODOn1esaMGcPixYsJDQ0lJiaGRYsWERUVxbBhw7BareTk5BAYGIiPjw/dunWjZ8+ezJgxgyeeeILi4mLmz5/PjTfe6BgZGj58OGvWrCEuLo5OnTqxbds21qxZw7x58zx5q9XmWHk6MgC1wL7WkFa24RBCCCHqjMcXXZw2bRoWi4XHHnuM0tJSEhMTWbt2LXq9nrS0NIYOHcqCBQsYNWoUiqKwcuVKnnzySe666y68vb0ZMWIEc+fOdVzvoYcewmAwsGTJEjIyMmjRogXz5s3jtttu8+BdVl9KxWKL0Qb8r12MWpKP4ttwlwkQQggh6jtFVVXV00E0BFarjZyc2i1i1uk0hIT4k5tbhMViQ1VVZqz8EWORmUfHXkq7mKBafb+m6ux+FnVD+tl9pK/dQ/rZPeqyn0ND/atVQC2LJ9QjuQUmjEVmNIpCy4gAT4cjhBBCNAkenyYTp1XUCzVv5o/60+sUlxjx7nk92oi2FzhTCCGEEDUlI0P1yJGMinqhQCzH/sB69HdUmwzNCiGEEHVJkqF65Ei6fWTokmZa1OI8ALShLTwYkRBCCNH4STJUT6iq6pgma+1rHyFSAsNR9LIMvBBCCFGXJBmqJ7LzSyksKUOrUQizngJAK4stCiGEEHVOkqF6IqV8VKhFRADkHQNAI4stCiGEEHVOkqF64kj5YoutowKxZZcnQ6GSDAkhhBB1TZKhesKxDUdUIIreD3Tesg2HEEII4QayzlA9YDujeDou2oBf90dQVRugeDYwIYQQogmQZKgeyMotocRkwUunoXkzfwAURQbthBBCCHeQn7j1QMoJe71QbEQA1dhCRQghhBC1SEaG6gHHTvVRBkq+eAHVmIV3v7HoWnTycGRCCCFE4yfjEPWAIxmKDsR2KhVbfgaK3sfDUQkhhBBNgyRDHma1qY5tOFqHgFqSDyhoQmQbDiGEEMIdJBnysONZBZjKrOi9NITbsgFQgiJQvLw9HJkQQgjRNEgy5GF/p+UB0CoyEDXXvtiiVhZbFEIIIdxGkiEPO3QsD7AXT1tzKrbhkD3JhBBCCHeRZMjD/q5IhqJPb8MhK08LIYQQ7iOP1nuQ1Wbj8PF8wL4nmfZUa1BkZEgIIYRwJ0mGPOj4ySLMFhu+3loiQv3QDLrH0yEJIYQQTY5Mk3nQmYstahTZh0wIIYTwBEmGPKhiG47WzQ3YSoyoNquHIxJCCCGaHkmGPCilYrHFaAOl37xM4Wv3UZay08NRCSGEEE2LJEMelJVbDECbqPInyaxlaPxDPRyVEEII0bRIAbUHjR56CRovLWHeZvJLC0BR0ITKNhxCCCGEO0ky5EGDesQQEuJP1u/bANAERaHo9B6OSgghhGhaZJqsHrCeOgqARrbhEEIIIdxOkqF6wJJdngzJytNCCCGE20kyVA9YT8k2HEIIIYSnSM1QPaBvfxmWzBQ0Ya08HYoQQgjR5EgyVA/4Xno9FovN02EIIYQQTZJMkwkhhBCiSZNkyMPMWUexGk+iqqqnQxFCCCGaJEmGPOzU/9ZgfOshLId+8nQoQgghRJMkyZAHqaqKOTMVQFaeFkIIITxEkiEPUgtzsJUWgqJBE9Lc0+EIIYQQTZLHkyGbzcby5csZMGAA3bp145577iE1NfWc7XNzc3nooYdITEwkMTGRf/3rXxQXFzu12bx5MyNHjqRLly5cd911fPfdd3V9GzXiWGwxJBpF6+XhaIQQQoimyePJUFJSEuvXr+eZZ57hvffeQ1EUJk6ciNlsrrL9tGnTOHbsGK+//jrLly/nxx9/5Mknn3S8/vPPPzNr1iz+8Y9/sGHDBvr378+UKVNITk521y1VW8Vii7qwWA9HIoQQQjRdHk2GzGYz69atY+rUqQwaNIj4+HiWLVtGZmYmW7ZsqdR+9+7d/PLLLyxYsIBOnTpx2WWX8dRTT/Hpp5+SmZkJwKuvvsqwYcMYM2YMbdu2Zc6cOXTq1In//Oc/7r69C7KWjwxpm0kyJIQQQniKRxdd3L9/P0VFRfTt29dxzGAwkJCQwI4dO7jmmmuc2u/cuZPw8HDatm3rONa7d28UReHXX39lxIgR7Nq1i0ceecTpvD59+lSZXLlKp6vd3NGWbR8Z8gpvhbaWry1O02o1Tp9F3ZB+dh/pa/eQfnaP+tDPHk2GMjIyAIiOjnY6HhERQXp6eqX2mZmZldrq9XqCg4NJT0/HaDRSXFxMVFRUta7nCo1GISTE/6KucTavK+7AlHGY4DbxaP1r99qiMoPB19MhNAnSz+4jfe0e0s/u4cl+9mgyVFJSAtgTmjN5e3uTn59fZfuz21a0N5lMlJaWnvN6JpPpomK12VSMxuILN3SBtkVPwhL6YTSWYM0tqtVri9O0Wg0Gg6+9n62y7UldkX52H+lr95B+do+67GeDwbdaI04eTYZ8fHwAe+1QxZ8BTCYTvr6VM0QfH58qC6tNJhN+fn54e3s7rnf261Vdz1V1tX+Y1WqTvcncQPrZPaSf3Uf62j2kn93Dk/3s0YnQiimvrKwsp+NZWVmVproAoqKiKrU1m83k5eURGRlJcHAwfn5+1b6eEEIIIYRHk6H4+HgCAgLYvn2745jRaGTv3r306tWrUvvExEQyMjKc1iGqOLdnz54oikLPnj355ZdfnM7bvn07l156aR3dhRBCCCEaMo9Ok+n1esaMGcPixYsJDQ0lJiaGRYsWERUVxbBhw7BareTk5BAYGIiPjw/dunWjZ8+ezJgxgyeeeILi4mLmz5/PjTfeSGRkJADjxo3j3nvvJSEhgYEDB/LRRx+xb98+nn32WU/eqhBCCCHqKY8/Lzht2jRuueUWHnvsMe644w60Wi1r165Fr9eTnp5O//79+fzzzwFQFIWVK1fSokUL7rrrLh588EEGDhzIE0884bhe//79ee6553j33Xe56aab+Pnnn3n55ZedHscXQgghhKigqKqqejqIhsBqtZGTU7tPfOl0GkJC/MnNLZLivDok/ewe0s/uI33tHtLP7lGX/Rwa6l+tp8k8PjIkhBBCCOFJkgwJIYQQokmTZEgIIYQQTZokQ0IIIYRo0iQZEkIIIUSTJsmQEEIIIZo0SYaEEEII0aRJMiSEEEKIJk0WXawmVVWx2Wq/q7RaDVarLOZV16Sf3UP62X2kr91D+tk96qqfNRoFRVEu2E6SISGEEEI0aTJNJoQQQogmTZIhIYQQQjRpkgwJIYQQokmTZEgIIYQQTZokQ0IIIYRo0iQZEkIIIUSTJsmQEEIIIZo0SYaEEEII0aRJMiSEEEKIJk2SISGEEEI0aZIMCSGEEKJJk2RICCGEEE2aJENCCCGEaNIkGfIAm83G8uXLGTBgAN26deOee+4hNTXV02E1Onl5eTz++OMMHDiQnj17cscdd7Bz505Ph9WopaSk0KNHDz7++GNPh9JobdiwgZEjR9KlSxeuueYaNm/e7OmQGp2ysjKWLVvG4MGD6dGjB//4xz/YtWuXp8NqVJKSkhg7dqzTsX379jFmzBi6d+/O4MGDWbt2rdvikWTIA5KSkli/fj3PPPMM7733HoqiMHHiRMxms6dDa1RmzpzJ77//ztKlS/nwww/p1KkT48ePJzk52dOhNUplZWU8/PDDFBcXezqURuvTTz/l0Ucf5fbbb2fTpk2MHDmSmTNnsnv3bk+H1qi89NJLfPTRRzzzzDNs2LCBNm3aMHHiRDIzMz0dWqPw+uuvs3z5cqdjubm5jBs3jri4OD766COmTp3Kiy++yEcffeSWmCQZcjOz2cy6deuYOnUqgwYNIj4+nmXLlpGZmcmWLVs8HV6jkZqayo8//sj8+fPp1asXbdq0Yd68eURGRrJp0yZPh9corVixAn9/f0+H0WipqsqLL77IXXfdxV133UWrVq2YMmUKl19+Ob/88ounw2tUvv76a6699lr69+9Pq1ateOSRRygsLOS3337zdGgNWmZmJhMmTODFF1+kdevWTq+9//776PV6nnjiCdq2bcvNN9/M3XffzauvvuqW2CQZcrP9+/dTVFRE3759HccMBgMJCQns2LHDg5E1LiEhIbzyyit07tzZcUxRFFRVJT8/34ORNU47duzgvffe49///renQ2m0Dh8+zPHjx7nuuuucjq9du5ZJkyZ5KKrGKTg4mP/7v/8jLS0Nq9XKe++9h16vp2PHjp4OrUH766+/CAoK4rPPPqNbt25Or+3cuZPExER0Op3jWN++fUlJSSE7O7vOY9NduImoTRkZGQBER0c7HY+IiCA9Pd0TITVKBoOBQYMGOR3bvHkzR48epX///h6KqnEyGo3Mnj2bxx57rNL3tag9R44cAaC4uJjx48ezd+9eWrRoweTJkxkyZIhng2tk5s2bx4wZMxg6dCharRaNRsOLL75IbGysp0Nr0IYMGXLO79WMjAzat2/vdCwiIgKAEydOEBYWVqexyciQm5WUlACg1+udjnt7e2MymTwRUpPw66+/8uijjzJ06FD5wVHLnnjiCbp3715pxELUrsLCQgDmzJnDtddey7p16+jXrx/3338/27Zt83B0jUtycjIGg4FVq1bx3nvvMWrUKObMmcP+/fs9HVqjVVpaWuXPRcAtPxtlZMjNfHx8AHvtUMWfwf6X7evr66mwGrWvvvqKhx9+mG7durF06VJPh9OobNiwgZ07d7Jx40ZPh9LoeXl5ATB+/HhuuukmADp27MjevXt57bXXuOyyyzwZXqNx/PhxZs2axeuvv06vXr0A6NKlC3///TcrVqxg1apVHo6wcfLx8an0EFFFEuTn51fn7y8jQ25WMY2QlZXldDwrK4uoqChPhNSovfXWW0ydOpWBAwfy6quvOiWg4uJ99NFHZGdnOx5B7tGjBwDz58/nmmuu8XB0jUvF/w9nTyW0a9eOtLQ0T4TUKO3Zs4eysjK6dOnidLxbt26OqUpR+6Kioqr8uQgQGRlZ5+8vI0NuFh8fT0BAANu3b3fMPxuNRvbu3cuYMWM8HF3j8s477/D0008zduxYHn30UTQayf1r2+LFiyktLXU6dtVVVzFt2jRGjhzpoagap4SEBPz9/fn9998dIxYABw8elFqWWlTxC+uBAwfo2rWr4/jBgwdp1aqVp8Jq9BITE1m/fj1WqxWtVgvAtm3baN26dZ3XC4EkQ26n1+sZM2YMixcvJjQ0lJiYGBYtWkRUVBTDhg3zdHiNRkpKCs899xzDhg1j0qRJTk8j+Pj4EBgY6MHoGo9z/cYWFhZGTEyMm6Np3Hx8fJgwYQKrVq0iMjKSrl278t///pcff/yR119/3dPhNRpdu3alV69ezJkzh/nz5xMVFcWGDRvYtm0b77zzjqfDa7Ruvvlm1qxZw7x585gwYQJ79uzhP//5D08++aRb3l+SIQ+YNm0aFouFxx57jNLSUhITE1m7dm2l4jFRc19++SVlZWVs2bKl0vpNN910E88//7yHIhOi5u6//358fX0da5O1bduWFStW0KdPH0+H1mhoNBqSkpJ44YUXmDt3Lvn5+bRv357XX3+d7t27ezq8RissLIw1a9bw7LPPctNNNxEeHs7s2bMd9XF1TVFVVXXLOwkhhBBC1ENSRCGEEEKIJk2SISGEEEI0aZIMCSGEEKJJk2RICCGEEE2aJENCCCGEaNIkGRJCCCFEkybJkBBCCCGaNEmGhBBCCNGkSTIkhODgwYPMmDGDfv360blzZ/r378+DDz7I3r17ndqNHTuWsWPHeijK01asWEGHDh1q9Zrp6en06tWL7du3V3rt8OHD3HvvvVx66aX06dOHRx99FKPR6NSmsLCQxx9/nH79+tG9e3fGjRvH33//fcH3zcrKYubMmfTp04eePXsybdo0MjMzndpYLBaWLl3KoEGD6Nq1K7fffju//vprpWt9+umnXHPNNXTt2pXhw4fzwQcfuNgLQjRNsgK1EE3coUOHuO222xw/ZJs1a0ZGRgZvvfUW+/bt480333RsQ1Dxw71du3YejBgyMjLIyMiote0Rjh8/zvjx40lJSeGNN95w2t7CaDRy7bXXEhERweTJk8nOzmbRokV06dKFdevWOdpNmjSJPXv2MGvWLAICAli5ciXZ2dn897//JTg4uMr3tVgs3HzzzRQXFzNz5kwsFgtLlizB39+fDRs24OXlBcCTTz7JJ598wsMPP0zz5s157bXX+PPPP/n4449p3bo1AJs3b2bGjBnceeedDBgwgK+++or169ezaNEirr/++lrpJyEaLVUI0aTNnTtXHTx4sGo2m52OFxUVqQMHDlQnTpzoocjqntVqVT/88EO1d+/eau/evdX27durP//8s1Obl19+We3WrZuanZ3tOPbtt9+q7du3V3fs2KGqqqru2rVLbd++vfrtt9862mRnZ6vdu3dXV61adc7337hxo9q+fXv14MGDjmOHDh1SO3TooG7YsEFVVVU9ceKEmpCQoL711luONiaTSR08eLD66KOPOo5dddVV6rRp05yuP336dPXKK690pUuEaJJkmkyIJu7UqVMAqGcNEvv5+TF37lyuvvpqx7Ezp8kqpqqq+njkkUcc5+zcuZMxY8bQrVs3evfuzZw5c8jJyXG8brPZePHFFxkyZAidO3dmyJAhLF26lLKysnPGfPY02dixY5k3bx6vvPIKgwcPpkuXLowePZrff//9vPd+4MABnnjiCW688UYWLlxYZZsffviBSy+9lNDQUMexAQMG4O/vz3fffedo4+fnR79+/RxtQkNDSUxMdLQ517Vbt27NJZdc4jjWrl072rZt6zhv27ZtWCwWrrrqKkcbvV7P4MGD2bp1KwBpaWkcOXLEqQ3A8OHDOXr0KCkpKQAcO3aMyZMn06dPH7p168btt9/uuIYQTZnsWi9EE1fxQ3X06NHcfPPN9O3blzZt2qAoCiNGjDjnebfeeisDBgxwOvbKK6+wdetWx07TO3bsYNy4cfTt25cXXniB/Px8XnzxRe68804+/PBDfHx8ePXVV3n77beZM2cOLVu25Pfff2fZsmV4eXkxderUat/Hl19+Sdu2bXnsscdQVZV///vfTJs2jW+++QatVlvlOdHR0WzZsoWoqKgqa4UAkpOTGTlypNMxjUZDixYtOHLkiKNNixYt0Omc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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.set()\n", "\n", "X = list(range(11))\n", "\n", "sns.lineplot(x=X, y=times, label='binary search')\n", "sns.lineplot(x=X, y=log2_of_n, label='log2(n)', linestyle='dashed')\n", "\n", "plt.title('Binary Search')\n", "plt.xlabel('Sizes in 100,000s')\n", "plt.ylabel('Search time in seconds')" ] }, { "cell_type": "code", "execution_count": null, "id": "55dfba3b-8081-4efc-a493-baab0905819f", "metadata": {}, "outputs": [], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": null, "id": "9145a358-4ab7-4f70-b8fe-f8ae0c3d9eba", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 }