{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "execution": {}, "id": "view-in-github" }, "source": [ "\"Open   \"Open" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "# Using RL to Model Cognitive Tasks\n", "\n", "**By Neurmatch Academy**\n", "\n", "__Content creators:__ Morteza Ansarinia, Yamil Vidal\n", "\n", "__Production editor:__ Spiros Chavlis\n" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "---\n", "# Objective\n", "\n", "- This project aims to use behavioral data to train an agent and then use the agent to investigate data produced by human subjects. Having a computational agent that mimics humans in such tests, we will be able to compare its mechanics with human data.\n", "\n", "- In another conception, we could fit an agent that learns many cognitive tasks that require abstract-level constructs such as executive functions. This is a multi-task control problem.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "---\n", "# Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Install dependencies\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "cellView": "form", "execution": {}, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "\u001b[33mWARNING: Skipping seaborn as it is not installed.\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "# @title Install dependencies\n", "!pip install jedi --quiet --root-user-action=ignore\n", "!pip install --upgrade pip setuptools wheel --quiet --root-user-action=ignore\n", "!pip install 'dm-acme[jax]' --quiet --root-user-action=ignore\n", "!pip install dm-sonnet --quiet --root-user-action=ignore\n", "!pip install trfl --quiet --root-user-action=ignore\n", "!pip install numpy==1.24.1 --quiet --ignore-installed --root-user-action=ignore\n", "!pip uninstall seaborn -y --quiet --root-user-action=ignore\n", "!pip install seaborn --quiet --root-user-action=ignore" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-07-16 14:41:51.924400: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/local/cuda-11.0/lib64/:/usr/local/cuda-11.0/lib64/:/usr/local/cuda-11.0/lib64/\n", "2024-07-16 14:41:51.924418: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] } ], "source": [ "# Imports\n", "import time\n", "import numpy as np\n", "import pandas as pd\n", "import sonnet as snt\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "import dm_env\n", "\n", "import acme\n", "from acme import specs\n", "from acme import wrappers\n", "from acme import EnvironmentLoop\n", "from acme.agents.tf import dqn\n", "from acme.utils import loggers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Figure settings\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "cellView": "form", "execution": {}, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "# @title Figure settings\n", "from IPython.display import clear_output, display, HTML\n", "%matplotlib inline\n", "sns.set()" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "---\n", "# Background\n", "\n", "- Cognitive scientists use standard lab tests to tap into specific processes in the brain and behavior. Some examples of those tests are Stroop, N-back, Digit Span, TMT (Trail making tests), and WCST (Wisconsin Card Sorting Tests).\n", "\n", "- Despite an extensive body of research that explains human performance using descriptive what-models, we still need a more sophisticated approach to gain a better understanding of the underlying processes (i.e., a how-model).\n", "\n", "- Interestingly, many of such tests can be thought of as a continuous stream of stimuli and corresponding actions, that is in consonant with the RL formulation. In fact, RL itself is in part motivated by how the brain enables goal-directed behaviors using reward systems, making it a good choice to explain human performance.\n", "\n", "- One behavioral test example would be the N-back task.\n", "\n", " - In the N-back, participants view a sequence of stimuli, one by one, and are asked to categorize each stimulus as being either match or non-match. Stimuli are usually numbers, and feedback is given at both timestep and trajectory levels.\n", "\n", " - The agent is rewarded when its response matches the stimulus that was shown N steps back in the episode. A simpler version of the N-back uses two-choice action schema, that is match vs non-match. Once the present stimulus matches the one presented N step back, then the agent is expected to respond to it as being a `match`.\n", "\n", "\n", "- Given a trained RL agent, we then find correlates of its fitted parameters with the brain mechanisms. The most straightforward composition could be the correlation of model parameters with the brain activities." ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "## Datasets\n", "\n", "- HCP WM task ([NMA-CN HCP notebooks](https://github.com/NeuromatchAcademy/course-content/tree/master/projects/fMRI))\n", "\n", "Any dataset that used cognitive tests would work.\n", "Question: limit to behavioral data vs fMRI?\n", "Question: Which stimuli and actions to use?\n", "classic tests can be modeled using 1) bounded symbolic stimuli/actions (e.g., A, B, C), but more sophisticated one would require texts or images (e.g., face vs neutral images in social stroop dataset)\n", "The HCP dataset from NMA-CN contains behavioral and imaging data for 7 cognitive tests including various versions of N-back." ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "## N-back task\n", "\n", "In the N-back task, participants view a sequence of stimuli, one per time, and are asked to categorize each stimulus as being either match or non-match. Stimuli are usually numbers, and feedbacks are given at both timestep and trajectory levels.\n", "\n", "In a typical neuro setup, both accuracy and response time are measured, but here, for the sake of brevity, we focus only on accuracy of responses." ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "---\n", "# Cognitive Tests Environment\n", "\n", "First we develop an environment in that agents perform a cognitive test, here the N-back." ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "## Human dataset\n", "\n", "We need a dataset of human perfoming a N-back test, with the following features:\n", "\n", "- `participant_id`: following the BIDS format, it contains a unique identifier for each participant.\n", "- `trial_index`: same as `time_step`.\n", "- `stimulus`: same as `observation`.\n", "- `response`: same as `action`, recorded response by the human subject.\n", "- `expected_response`: correct response.\n", "- `is_correct`: same as `reward`, whether the human subject responded correctly.\n", "- `response_time`: won't be used here.\n", "\n", "Here we generate a mock dataset with those features, but remember to **replace this with real human data.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "data": { "image/png": "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yIkTJ1BWVobWrVvD1tYWgYGB+Pnnn/XapKSkwN3dvVoDjImIiKhyvERlhujoaHh5ecHDwwMNGzbEuXPn8PXXX8PDwwN9+vQBAEyZMgWjR4/Ge++9h/DwcBw6dAjJycn47LPPrFw9ERGR+DHgmMHHxwcpKSlYunQpBEFAq1atEBkZiQkTJsDW1hYA0LVrV8TFxeHzzz/HDz/8gJYtW2L+/PkIDw+3cvVERETix4BjhkmTJmHSpEmVtuvduzd69+5dCxURERFReRyDQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKIjt3YBRNUllUqq1F4QBAiChYohIqKHAgMO1VmNGsih1ghwcbGr0nIqtQY52QUMOUREIsaAQ3WWrY0MMqkESzYcR05+iUnLONs3wNRIX0gkEghMOEREosWAQ3VeTn4JspXF1i6DiIgeIhxkTERERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4BDREREosOAQ0RERKLDgENERESiw4Bjhm3btmHKlCno2bMnfH19MXDgQPzwww8QBEGv3YYNGxAWFgZvb28MGDAAO3futFLFRERE9QsDjhm+/fZbNGrUCLNmzUJiYiJ69uyJ2NhYJCQk6Nps3boVsbGxCA8PR1JSEnx9fREdHY3jx49br3AiIqJ6Qm7tAuqixMRENGnSRPd7cHAwcnJysHz5ckydOhVSqRSLFy9GREQEpk+fDgAICgrC+fPnkZCQgKSkJCtVTkREVD/wDI4ZyocbLU9PT+Tn56OwsBCZmZm4fPkywsPD9dr07dsXBw4cQGlpaW2VSkREVC/xDE4NSU9PR/PmzWFvb4/09HQAgJubm14bd3d3lJWVITMzE+7u7mZvSy6vfi6VSv9dhwSQSCSVttc2kUgkJrU3ZxlLt9e2Be71oUYjVNK66mQyqd5PqhnsV8th31oG+9X6GHBqwO+//46UlBS89dZbAIDc3FwAgKOjo1477e/a+eaQSiVwcbEz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7t69q9f21KlTmDBhAgIDA+Hj44PQ0FDMnj1br41Go8G3336LiIgIeHt748knn8ScOXOQm5tbpX78+OOPAQC9e/eGh4cHPDw8cO3aNQCGY3C0r+H333/H/PnzERQUhK5du2LOnDkoLS2FUqnEm2++iYCAAAQEBODjjz/G/X8LuSbqJqoveImKqJ567bXX8PjjjyMmJgaCICAxMRFffPEFwsPDMWzYMNy9exerVq3CCy+8gP/+979wdHREaWkpJkyYgNLSUrz44ot45JFHcOvWLezatQtKpRIODg669R85cgQpKSmIioqCra0t1qxZg4kTJ2LDhg1QKBQAgAsXLuCFF16AnZ0dJk6cCLlcjnXr1iEqKgqrVq1C586d9WqeP38+HB0dER0djaysLKxYsQLz5s3D559/DgC4c+cOJkyYABcXF0yaNAmOjo64du0atm/frreeOXPmYNOmTRgyZAiioqJw7do1rF69GmfOnMGaNWtMOvPyzDPP4PLly0hOTsbs2bPh4uICAGjSpMkDl5s/fz4eeeQRTJs2DSdOnMC6devg4OCAY8eO4bHHHkNMTAx2796Nr7/+GgqFAoMGDarRuonqDYGI6pXFixcLCoVCeP3113XTrl27Jnh6egqJiYl6bf/880+hY8eOuulnzpwRFAqFsG3btgduQ6FQCAqFQjh16pRuWlZWluDt7S288sorumlTp04VOnXqJFy9elU37datW4Kfn5/wwgsv6Kb9+OOPgkKhEMaOHStoNBrd9A8++EDw9PQUlEqlIAiCsH37dkGhUAgnT56ssLYjR44ICoVC2LJli9703bt3G53+IMuWLRMUCoWQmZlpMK9Xr17CW2+9ZfAaxo8fr/cann/+ecHDw0OYM2eObppKpRJ69uwpvPjiixapm6g+4CUqonpqxIgRuv/fvn07NBoNwsPDcffuXd1/jzzyCB5//HEcOnQIAGBvbw8A2Lt3L4qKih64fj8/P3h5eel+b9myJXr37o29e/dCrVZDrVZj37596NOnD1xdXXXtHn30UfTr1w/p6enIz8/XW+fw4cP1Bu527doVarUaWVlZAKA7g7Rr1y6UlZUZrSs1NRUODg4ICQnRe62dOnVC48aNda/VUoYNG6b3Gnx8fCAIAoYNG6abJpPJ4OXlhczMzIembqK6hpeoiOqp1q1b6/7/8uXLEAQBzz77rNG2cvm9jwpXV1eMGzcOy5cvx08//YSuXbsiNDQUAwYM0Ls8BQCPP/64wXratm2LoqIi3biZoqIiuLm5GbRzd3eHRqPBjRs38MQTT+imt2zZUq+d9s4l7W3a3bp1Q1hYGOLj4/Htt9+iW7du6NOnD/r37w9bW1sAwJUrV5CXl4fg4GCjr/XOnTtGp9eU+1+Dtt8ee+wxg+nlx9ZYu26iuoYBh6ieatCgge7/NRoNJBIJkpKSIJPJDNo2btxY9/+zZs3C4MGDkZaWhn379mH+/Pn46quvsH79erRo0cKiNUulxk86C/8OxpVIJFi8eDGOHz+OnTt3Ys+ePXj77bexfPlyrFu3DnZ2dtBoNGjatCk+/fRTo+uqbAxNdVX0GiqarmXtuonqGgYcIkKbNm0gCAJat25t9IzK/bR3DE2dOhVHjx7FyJEjsWbNGsTExOjaXLlyxWC5y5cvo1GjRrp/jBs1aoS//vrLoF1GRgakUqnBWQ1T+fr6wtfXFzExMfjpp58wc+ZMpKSkIDIyEm3atMGBAwfg7++Phg0bmrV+rdp8zk1N1k1UH3AMDhHh2WefhUwmQ3x8vMGtyYIgIDs7GwCQn58PlUqlN1+hUEAqlaK0tFRv+rFjx3D69Gnd7zdu3EBaWhpCQkIgk8kgk8kQEhKCtLQ03a3VAPDPP/8gOTkZXbp00Y35MVVubq5B/Z6engCgqy88PBxqtRpLliwxWF6lUlXpqcSNGjUCAL1b5C2lJusmqg94BoeI0KZNG0yfPh0LFy5EVlYW+vTpAzs7O1y7dg2//vorhg8fjgkTJuDgwYOYN28ennvuObRt2xZqtRqbN2+GTCZDWFiY3joVCgUmTJigd5s4AEybNk3XZvr06di/fz9GjRqFUaNGQSaTYd26dSgtLcUbb7xR5dexadMmrFmzBn369EGbNm1QUFCA9evXw97eHj179gRwb5zO888/j6+++gpnz55FSEgIbGxscPnyZaSmpuKdd97Bc889Z9L2OnXqBAD47LPP0LdvX9jY2KBXr156l/RqSk3WTVQfMOAQEQBg0qRJaNu2Lb799lskJCQAAFq0aIGQkBCEhoYCuHdpqnv37ti5cydu3bqFRo0awcPDA0lJSfD19dVbX0BAAHx9fZGQkIDr16+jffv2WLBgATp06KBr88QTT2D16tVYuHAhvvrqKwiCAB8fH3zyyScGz8AxRbdu3XDq1CmkpKTgn3/+gYODA3x8fPDpp5/q3ak1b948eHl5Ye3atfjss88gk8nQqlUrDBgwAP7+/iZvz8fHB6+99hrWrl2LPXv2QKPRIC0tzSIBpybrJqoPJML953OJiKrJw8MDL7zwAubMmWPtUoionuIYHCIiIhIdXqIiIrpPQUFBpX+AtEmTJkZvqSeihwMDDhHRfb755hvEx8c/sE1aWprewxKJ6OHCMThERPfJzMzU+zMJxnTp0kXvYYlE9HBhwCEiIiLR4SBjIiIiEh0GHCIiIhIdBhwiIiISHQYcIiIiEh0GHCIiIhIdBhwiIiISHQYcIiIiEp3/BzaJAvNZB1iAAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgUAAAITCAYAAACXE2+LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVlklEQVR4nO3deZyNdf/H8fc5M4YZYwYxKkuGmiGMGRr7OrZstxRZQiRxl103SolK/NytliRbqGyhxZZ9l0FStNHYJbLMgjHLuX5/OOfcTmf27Rzm9Xw8PMz5XtvnfM4517zPdV3njMkwDEMAACDfM7u6AAAA4B4IBQAAQBKhAAAAWBEKAACAJEIBAACwIhQAAABJhAIAAGBFKAAAAJIIBQAAwIpQcBeKiIhQRESEw9iKFSsUHBysFStWuKSmvXv3Kjg4WFOnTnUY79mzp4KDg11Sk42re5NTEhMTNWXKFLVs2VJVq1ZVcHCwNm7cmK11pvRcgrOpU6cqODhYe/fudXUpKUrt9ecqZ86cUXBwsEaPHp2r2+H5m3nZCgUzZsxQcHCwgoODFRUVlVM1wQ25+04vLe62Q8wt8+bN0/Tp0xUQEKC+fftq4MCBCgwMTHMZdwhl+B9bQA0ODtbkyZNTnMf2fH7xxRfzuLr8Kzg4WD179nR1GRmS3Vo9s7qgYRhatmyZTCaT/edRo0ZluRDkrhYtWqh69eoKCAhwyfZDQkK0Zs0aFStWzCXbT4ure5NTtmzZIh8fH82dO1deXl6uLgfZtHDhQj311FMqXbq0q0tBPpLlIwU7d+7U2bNn1bFjR5UsWVIrV65UQkJCTtaGHFSkSBFVrFhRRYoUccn2vb29VbFiRRUvXtwl20+Lq3uTUy5cuKBixYoRCO4CDzzwgBISEvTuu++6uhTkM1kOBcuWLZMkde7cWe3bt9eVK1fSPH95/vx5vfnmm2rZsqVCQkJUq1YtderUSdOnT8/yvGkdJhk9erSCg4N15swZ+9jt57GOHz+uoUOHqm7duqpUqZL9sPjhw4f15ptv6l//+pdq1aqlatWqqWXLlpo0aZKio6NTvX9r1qzR008/bV8mIiJCw4cP108//SRJWrx4sYKDgzVt2rQUl7948aKqVKmi9u3bp7qN2xmGoU8//VRt27ZVtWrV1LBhQ73++uuKjY1Ncf7Uzpv/+uuvGj58uCIiIlS1alXVqVNHHTt21IQJE5SYmCjp1nk5W929evWyH968/bCzrd+nT5/WwoUL1b59e4WEhNgfn/QO4SckJOi9996z19G8eXNNmzbNKWimdy7yn4fDR48erV69ekmSpk2b5lC77TFP65qCw4cPa9CgQapbt66qVq2qpk2baty4cbpw4YLTvLc/5xYvXqz27durWrVqqlevnl599dVUH5vUxMbG6p133lGrVq1UrVo1hYeHq2/fvtq9e3eq2z179qz9/qV1LtXWx8jISEly6EtKr6nr16/r//7v/9SkSRNVrVpVLVq00Mcff6zU/sjqoUOHNHjwYNWvX19Vq1ZV48aNNXbsWP31118Zvv+3Py67du1S9+7dFRYWpjp16uill15STEyMJOnnn39W//79FR4errCwMA0YMMDhdX+7EydOaOTIkWrYsKGqVq2qBg0aaOTIkTpx4kSK8ycnJ2vRokXq2rWratasqZCQELVo0UJjxoxJdZnbnTt3Tm3btlXVqlX15ZdfZvi+t27dWg8//LBWr15t34fklIMHD6p3796qWbOmwsLC1Ldv3xS38ddff2natGnq2rWr/XFs0KCBRowYoWPHjqW6/h9//FFDhw516PEzzzyjNWvWpFubxWLRm2++qeDgYA0cOFDx8fHpLpPZfWFsbKxmz56tXr16qVGjRvb93oABA3Tw4EGHeW3PQUmKjIx0eJ3cvi9bsWKFBg0apGbNmikkJEQ1atRQ165d9dVXX6VYw+nTp/Xqq6+qRYsW9t9x7du319ixY3XlyhWn+VetWqWePXvqkUceUbVq1dS6dWt9+OGHDvvHjNaaniydPvj777+1efNmlS9fXjVq1JCvr6/mzp2rJUuWqE2bNk7z//TTT3r22Wd19epVhYeHq0WLFoqPj9exY8c0bdo0vfDCC1maN6tOnTqlJ598UuXLl1f79u0VHx8vX19fSdLSpUu1ceNGhYeHq169erJYLDpy5IjmzZun7du3a+nSpfZ5pVtPyJdeekkrV65UsWLF1KJFCxUvXlznz5/X3r17FRgYqGrVqql9+/b673//qy+++EL//ve/5eHh4VDT8uXLlZSUpC5dumToPkyYMEELFy5UyZIl1aVLF3l6emrTpk06dOiQEhISMvRu8ddff9WTTz4pk8mkiIgIlSlTRnFxcTp16pQWLVqkoUOHqkCBAurVq5c2bdqkyMhI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niTpmWeeUenSpbVr1y6dO3fOadkXXnjB4Z2wp6enHn/8cUm33q2mJyEhQV9//bV8fHw0fPhwh6Mk5cuXV8+ePZWYmJipw9HZ9corrzg8T+655x41a9ZMsbGxOn78uH180aJFSkxM1JgxY1SqVCmHddStW1cRERHasmWL4uLiMrzttm3bOrzTMZvN6tChgyTpoYce0r/+9S+H+W37pV9//dU+9v333ysqKkphYWFO87dp00Y1a9bU8ePHdeDAAUm3Tht8/vnnKlSokMaPH+/0btPLyyvV62O++uorPffccypVqpSWLl3q9G46M/7zn//Iw8NDb7/9tpKSkrK8HpsHHnhA3bt3dxhr3ry5atWqpZMnT2r//v328XvuucfhqKhNpUqVVLt2be3du9d+ilG69dgnJSXp+eef10MPPeS0XGr777Nnz6pbt2766aefNHnyZD333HMZvj9Z2RcWKVIkxcfu3nvv1aOPPqqoqKgUX9dpKVeunNOYl5eXnnrqKSUlJWnPnj1O01Pa7/r4+DiML1iwQJ6ennrrrbec5n/++edVtGhRffPNN5mqNT2ZPn3w3Xff6dSpU2rQoIHDi75du3aaNGmSVq5caT/sLEk//PCDJNkPx6QlM/NmR6VKlVI9vJ6YmKglS5Zo9erV+uOPPxQbGyuLxWKffvs50evXr+v3339XiRIl9PDDD6e73Yceekjh4eHavn27/vzzT913332SZA9SttCQnp9//llSyoeEatasmeFD9m3atNGCBQv0wgsvqFWrVqpXr55q1KiR4hM8o24//JoZad2XX375Jcv1ZJWtx3Xq1HGa5unpqfDwcJ09e1Y///yz06HwqlWrOi1je6zTui7F5vjx47px44Zq1KjhsKOzqVOnjmbMmJFnfSlSpIgeeOABp3HbTt52bl/632s4MjIyxfPUly5dUnJysk6cOJFin1KS0ny2sF2lShWnabb90vnz5+1jtsezdu3aKW6jTp06OnDggH7++WeFh4crKipKsbGxql69ulO4ScuCBQu0adMm1ahRQzNmzHAIulnx4IMPqlOnTlqyZImWLFmip556KsX5fvnlF6druooUKaLevXs7jNWsWTPFsF+rVi1FRkbq559/dngtbt26VYsXL9bhw4d15coVp2By5coV+2Nhe+wbNmyY4ft3/PhxdenSRTdu3NCsWbNUt27dDC8r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rVtXc+bM0Ztvvpnt+r29vTVkyBDFx8en+N0uGXXixAl9/vnnDmMbN25UZGSkHnjgAftFtffcc4+8vb115MgRXbt2zT5vYmKiJkyYkOJn6bt16yZPT099+OGHKX6PQVphpnfv3ho3bpyOHj2qHj16ZDiIZWVfWLp0aZ04ccJhG4ZhaOrUqal+/0LRokVTrT+13xs7duyw/x683eHDh1M87WgLQ7fvd3v37q3ExES9/PLLKb5BiI6OdgpoadWaERk+fbB3716dOHFCQUFBaZ777tSpkz766CMtX75cgwYNkpeXlz744AP17dtXI0aM0JIlS1S9enXdvHlTUVFR2rNnj/1ddmbmlW6l5507d+r5559XmzZt5O/vr4MHD+rMmTP2C2cyo1q1aqpRo4bWr1+vrl27qkaNGrp06ZK2b9+uwMDAFM9Hdu7cWfv379dXX32lli1bqlmzZipevLguXLig7777Tk888YT9s+42999/vxo3bqzNmzdLUqZOHUi3dnA9e/bUwoUL1a5dO4fP9vv5+aV6LvqfZs+ere+++06PPPKIypQpIx8fHx07dkzbt2+Xv7+/Q1116tSR2WzWu+++q6NHj9rfsT///POZqj01FSpUUNu2bR3uy6lTp9SkSROnX359+/bVmDFj1K1bNz366KMqWLCg/UroSpUqOR0lCgwMVKlSpbR69Wp5enrq/vvvl8lkUocOHVL9roLChQtrwoQJGjp0qHr06KFHH33U/j0FO3fuVMmSJVMNijlhxIgR2r9/vz799FP99NNPql27tv17Cq5du6ZXX301S5/y+Ke6detq3bp1GjRokBo3bqyCBQvq/vvvd/hkUWZUrFhREyZM0JgxY9SuXTs1bNhQ5cuXV1JSks6dO6cDBw6oWLFiTr+Yc5vJZNL//d//qU+fPho2bJhWrVqlChUq6Pjx49q4caMKFy6syZMnO1yE98ILL+jQoUPasmWLWrVqpSZNmqhw4cL6888/tWvXLo0cOTLVQ/be3t6aOXOmBg0apIULFyohIUHjx4/P8uk16dYpgvnz5+v333/P8joaNmyoSZMmafv27apUqZL9ewoKFiyot956y37/zWazevbsqY8//ljt27dXs2bNlJiYqL179yo6Otr+6YPbPfjgg3rttdf02muv6bHHHlOzZs1Uvnx5XblyRYcPH1bhwoXT/L6Fbt26qWDBghozZox69Oih+fPnpxu6s7Iv7N27t1577TV17NhRLVu2lKenp77//nv98ccfatq0qbZs2eK0TN26dbV69WoNGDBADz/8sP1i4/DwcHXv3l0rVqzQkCFD1KpVKwUEBOjo0aPasWOHWrdu7fSlTV999ZWWLFmimjVrqmzZsvL399epU6e0ZcsWeXl52b9nRLr1+/TIkSP6/PPP1aJFCzVo0ED33XefoqOjdebMGe3bt0+PP/64w74orVozIsOhwHaUoHPnzmnOV6ZMGdWrV0+7du3Sli1b1KJFC1WrVk1ffvmlPv74Y23fvl0HDx5U4cKFVa5cOQ0ePNhh+czMW7duXU2fPl3Tp0/X6tWr5ePjo3r16um9997L0h+/8fDw0IwZM/T+++9r+/btWrhwoUqVKqXOnTvr3//+t9q2beu0jMlk0uTJk9WgQQMtXbpUa9euVUJCgkqWLKmaNWum+q1yTzzxhDZv3qyqVaumeAV1esaMGaPy5cvrs88+0+LFi1W0aFG1aNFCw4cPz/A7yO7du8vf31+HDh2yH2orVaqUunfvrj59+jj8wqxYsaImTZqkuXPn6vPPP9fNmzcl5Vwo+OCDDzR9+nR98803unDhgkqVKqVBgwbpueeec9qRdurUSYZh6JNPPtHKlSvl7++vZs2aadiwYU7PEenW4zpt2jS98847Wrduna5duybDMFSzZs00v8CoefPm+vzzzzVz5kzt3LlTcXFxKlGihLp27arnn38+Vy+ILVq0qJYsWaKZM2dqw4YNmjdvngoVKqSQkBD17dtXDRo0yJHtdO7cWefOndPq1as1e/ZsJSUlqVatWlkOBZLUoUMHVapUSfPmzdPevXu1c+dO+fj4KCAgQK1atVLr1q1zpPbMql69ur744gvNmDFDe/bs0ZYtW1SsWDG1bdtWzz//vCpUqOAwv5eXl2bPnq3Fixfryy+/1JdffinDMBQQEKAWLVrYjyqkpmDBgpo2bZqGDx+uJUuWKCEhweEXb2aZzWaNHDlSzz77bJaWl2714IUXXtAHH3ygTz/9VIZhqE6dOho6dKjTm70hQ4aoePHiWrZsmZYsWaIiRYqoXr16Gjp0aKr71yeffFIPPfSQ5s6dq8jISG3atElFixZVcHBwur87pFvBx8vLS6NGjbIHg/TCb2b3hV27dpWXl5fmz5+vL7/8UgULFtQjjzyiiRMnav369SmGgjFjxshkMmnPnj3atm2bLBaLBg4cqPDwcFWqVEkLFizQ+++/r23btikpKUmVKlXStGnTVKRIEadQ0K5dOyUkJOjgwYM6cuSI4uPjVapUKbVt21Z9+vRRUFCQw/yvvfaaGjVqpMWLF2v37t2KjY2Vv7+/7rvvPvXt29fpI7Zp1ZoRJsNI5XtKkaumTp2qadOm6c0338zQiwUAgNxGKHCBuLg4tWrVSklJSdq6dau8vb1dXRIAAFn/08nIvK1bt+rIkSPasmWL/v77b40aNYpAAABwG4SCPLRu3TqtXLlSJUqUUP/+/Z2+WAQAAFfi9AEAAJCUye8pAAAAdy9CAQAAkEQoAAAAVoQCAAAgiVAAAACsCAUAAEASoQAAAFgRCgAAgCRCAQAAsCIUAAAASYQCAABgRSgAAACSCAUAAMCKUAAAACQRCgAAgBWhAAAASCIUAAAAK0IBAACQRCgAAABWhAIAACCJUAAAAKwIBQAAQBKhAAAAWBEKAACAJEIBAACwIhQAAABJhAIAAGDl6eoC8pvkZIsuX76WrXWYzSYVL15Yly9fk8Vi5FBldxd6lDb6kz56lDb6k7ac7k/JkkVyoKr0caTgDmQ2m2QymWQ2m1xdituiR2mjP+mjR2mjP2m7U/tDKAAAAJIIBQAAwIpQAAAAJBEKAACAFaEAAABIIhQAAAArQgEAAJBEKAAAAFaEAgAAIIlQAAAArAgFAABAEqEAAABYEQoAAIAkQgEAALAiFAAAAEmEAgAAYEUoAAAAkiRPVxcAAEBOMJtNMptNri5DkuThcWe+5yYUAADueGazSUWL+cjD7D6/jC0WQyaTe4SUjCIUAADueGazSR5msz5f94suXL7u6nJU6p7C6taqktscucgoQgEA4K5x4fJ1nb0Y5+oy7rgjBDZ3XSg4efKk5syZo0OHDuno0aOqUKGCVq1aZZ9+5swZNWvWLMVlvby89NNPP6U5X/Xq1bV06dLcKR4AABe660LB0aNHtW3bNlWvXl0Wi0WGYThMDwgI0JIlSxzGDMPQs88+qzp16jitb/jw4apdu7b9duHChXOncAAAXOyuCwURERFq3ry5JGn06NE6fPiww3QvLy+FhoY6jO3du1dxcXFq166d0/oeeOABp/kBALgbuc9lmjnEnIUrT1etWiVfX19FRETkQkUAANwZ7rojBZmVmJio9evXq0WLFipYsKDT9HHjxmnYsGEqWrSomjVrphdffFFFixbN1jY9PbOXxWyff71TPwebF+hR2uhP+uhR2tytP7Y6TCaTe1zkZy3BbDZle5+fl/J9KNi+fbuuXr3qdOrAy8tL3bp1U4MGDeTn56dDhw7po48+0uHDh7Vs2TIVKFAgS9szm00qVixnrkvw8/POkfXczehR2uhP+uhR2tytPx4eZnl6eri6DPv3Jfj6FnJxJZmT70PBN998oxIlSqhu3boO4wEBARo3bpz9dq1atfTQQw+pf//+2rBhg9q0aZOl7VkshmJisvcZWg8Ps/z8vBUTc0PJyZZsretuRY/SRn/SR4/S5m79sdWTnGxRUlKyq8tRsuVWT+Li4pWYmP16curNZHrydSi4du2atmzZos6dO8vDI/1k2bhxY/n4+OjIkSNZDgWSlJSUMy+gW09+178Y3Rk9Shv9SR89Spu79ccwDKdPnbmmkFv/WSyGW/UnPXfOiY5csGHDBsXHx6t9+/auLgUAAJfL16Fg1apVKleunKpXr56h+bds2aLr16+rWrVquVwZAAB57647fXDjxg1t27ZNknT27FnFxcVp3bp1km5dF1C8eHFJ0uXLl7Vnzx7169cvxfVMmjRJJpNJoaGh8vPz048//qiZM2eqatWq9u9BAADgbnLXhYJLly5pyJAhDmO22wsWLLB/O+HatWuVlJSU6qmDihUratGiRVq6dKni4+NVqlQpderUSYMHD5an513XNgAA7r5QUKZMGf3222/pzvfUU0/pqaeeSnV6586d1blz55wsDQAAt5avrykAAAD/QygAAACSCAUAAMCKUAAAACQRCgAAgBWhAAAASCIUAAAAK0IBAACQRCgAAABWhAIAACCJUAAAAKwIBQAAQBKhAAAAWBEKAACAJEIBAACwIhQAAABJhAIAAGBFKAAAAJIIBQAAwIpQAAAAJBEKAACAFaEAAABIIhQAAAArQgEAAJBEKAAAAFaEAgAAIIlQAAAArAgFAABAEqEAAABYEQoAAIAkQgEAALAiFAAAAEmEAgAAYEUoAAAAkggFAADAilAAAAAkEQoAAIAVoQAAAEgiFAAAACtCAQAAkEQoAAAAVoQCAAAgSfJ0dQE57eTJk5ozZ44OHTqko0ePqkKFClq1apXDPD179lRkZKTTsmvWrFHFihXtt2NjYzVx4kRt3LhRiYmJatiwoV555RUFBATk+v0AACCv3XWh4OjRo9q2bZuqV68ui8UiwzBSnK9GjRoaNWqUw1iZMmUcbg8dOlTHjh3TuHHjVLBgQb3//vvq16+fli9fLk/Pu651AIB87q77zRYREaHmzZtLkkaPHq3Dhw+nOJ+fn59CQ0NTXc/Bgwe1c+dOzZkzRw0aNJAkBQYGqk2bNlq/fr3atGmT47UDAOBKd901BWZzztyl7du3y8/PT/Xr17ePVahQQZUrV9b27dtzZBsAALiTu+5IQUZFRkYqNDRUycnJql69uoYMGaLw8HD79KioKAUGBspkMjksV6FCBUVFRWVr256e2QsuHh5mh//hjB6ljf6kjx6lzd36Y6vDZDI57bddwlqC2WzK9j4/L+XLUBAeHq4OHTqofPnyunDhgubMmaM+ffpo4cKFCgsLkyTFxMSoSJEiTsv6+/unekoiI8xmk4oVK5zl5W/n5+edI+u5m9GjtNGf9NGjtLlbfzw8zPL09HB1GfKwHrX29S3k4koyJ1+GgsGDBzvcbtKkidq1a6cPP/xQs2bNytVtWyyGYmKuZ2sdHh5m+fl5KybmhpKTLTlU2d2FHqWN/qSPHqXN3fpjqyc52aKkpGRXl6Nky62exMXFKzEx+/Xk1JvJ9OTLUPBPPj4+aty4sb799lv7mJ+fn86fP+80b3R0tPz9/bO1vaSknHkB3Xryu/7F6M7oUdroT/roUdrcrT+GYaT6qbO8LeTWfxaL4Vb9Sc+dc6Ijj1WoUEHHjx93enIdP35cFSpUcFFVAADkHkKBpOvXr2vr1q2qVq2afaxRo0aKjo7Wnj177GPHjx/Xzz//rEaNGrmiTAAActVdd/rgxo0b2rZtmyTp7NmziouL07p16yRJtWrVUlRUlGbPnq0WLVqodOnSunDhgubNm6eLFy/qgw8+sK8nLCxMDRo00Msvv6xRo0apYMGCeu+99xQcHKyWLVu65L4BAJCb7rpQcOnSJQ0ZMsRhzHZ7wYIFuvfee5WYmKj33ntPV69elbe3t8LCwjR+/HiFhIQ4LPf+++9r4sSJGjt2rJKSktSgQQO98sorfJshAOCudNf9ditTpox+++23NOeZM2dOhtZVpEgRvfXWW3rrrbdyojQAANwa1xQAAABJhAIAAGBFKAAAAJIIBQAAwIpQAAAAJBEKAACAFaEAAABIIhQAAAArQgEAAJBEKAAAAFaEAgAAIOku/NsH+YmHh/tkOovFkMViuLoMAEA2EAruQCaTSRaLIT8/b1eXYpdssejqlesEAwC4gxEK7kBms0lms0mLvv1Vf1265upyFFDcR90frSyz2UQoAIA7GKHgDnbh8nWdvRjn6jIAAHcJ9zkpDQAAXIpQAAAAJBEKAACAFaEAAABIIhQAAAArQgEAAJBEKAAAAFaEAgAAIIlQAAAArAgFAABAEqEAAABYEQoAAIAkQgEAALAiFAAAAEmEAgAAYEUoAAAAkggFAADAilAAAAAkEQoAAIAVoQAAAEgiFAAAACtCAQAAkEQoAAAAVoQCAAAgiVAAAACsCAUAAEASoQAAAFh5urqAnHby5EnNmTNHhw4d0tGjR1WhQgWtWrXKPj0uLk7z5s3Ttm3bdOLECXl5eSkkJETDhg1TcHCwfb4zZ86oWbNmTuuvXr26li5dmif3BQCAvHTXhYKjR49q27Ztql69uiwWiwzDcJh+7tw5LVmyRE888YSGDh2qmzdvau7cuerSpYuWL1+uihUrOsw/fPhw1a5d2367cOHCeXI/AADIa3ddKIiIiFDz5s0lSaNHj9bhw4cdppcpU0YbNmyQt7e3faxOnTqKiIjQ559/rldffdVh/gceeEChoaG5XjcAAK5214UCszntyyR8fHycxgoXLqxy5crpwoULuVUWAABu764LBVkRExOjo0ePql69ek7Txo0bp2HDhqlo0aJq1qyZXnzxRRUtWjRb2/P0zN71nWaz6dYPJslkMmVrXTnBVoOHh/tct2qrxZ1qcif0J330KG3u1h9bHSaTyS32i7KWYDabsr3Pz0uEAkn//e9/ZTKZ1K1bN/uYl5eXunXrpgYNGsjPz0+HDh3SRx99pMOHD2vZsmUqUKBAlrZlNptUrFjOXJfgYTbL09MjR9aVrTqsL0Y/P+905sx77liTO6E/6aNHaXO3/nh4uMl+0XrU2te3kIsryZx8HwqWL1+upUuXatKkSbr33nvt4wEBARo3bpz9dq1atfTQQw+pf//+2rBhg9q0aZOl7VkshmJirmer5gIFPOTrW0jJFouSkpKzta6ckJxskSTFxNyw/+xqHh5m+fl5u1VN7oT+pI8epc3d+mOrJznZTfaLlls9iYuLV2Ji9uvJqTeT6cnXoWDbtm0aO3asnn/+eXXs2DHd+Rs3biwfHx8dOXIky6FAkpKSsvcCsh+uM+T06QpXsNVw68Xo+p3D7dyxJndCf9JHj9Lmbv0xDMMt9ouylmCxGG7Vn/TcOSc6ctgPP/ygIUOG6LHHHtOQIUNcXQ4AAC6XL0PBsWPH1L9/f9WpU0fjx4/P8HJbtmzR9evXVa1atVysDgAA17jrTh/cuHFD27ZtkySdPXtWcXFxWrdunaRb1wUYhqG+ffuqYMGCevrppx2+x8DX11cPPvigJGnSpEkymUwKDQ2Vn5+ffvzxR82cOVNVq1a1fw8CAAB3k7suFFy6dMnpdIDt9oIFCyRJ58+flyT17t3bYb5atWpp4cKFkqSKFStq0aJFWrp0qeLj41WqVCl16tRJgwcPlqfnXdc2AADuvlBQpkwZ/fbbb2nOk950SercubM6d+6cU2UBAOD28uU1BQAAwBmhAAAASCIUAAAAK0IBAACQRCgAAABWhAIAACCJUAAAAKwIBQAAQBKhAAAAWBEKAACAJEIBAACwIhQAAABJhAIAAGBFKAAAAJIIBQAAwIpQAAAAJBEKAACAFaEAAABIIhQAAAArQgEAAJBEKAAAAFaEAgAAIIlQAAAArAgFAABAEqEAAABYEQoAAIAkQgEAALAiFAAAAEmEAgAAYEUoAAAAkggFAADAilAAAAAkEQoAAIAVoQAAAEgiFAAAACtCAQAAkEQoAAAAVoQCAAAgiVAAAACsXBYKevXqpT179qQ6/bvvvlOvXr3ysCIAAPI3l4WCyMhI/f3336lOv3z5svbt25eHFQEAkL+59PSByWRKddrJkydVuHDhPKwGAID8zTMvN7Zy5UqtXLnSfnvGjBlaunSp03yxsbH67bff1KhRo0xv4+TJk5ozZ44OHTqko0ePqkKFClq1apXTfMuWLdPs2bN17tw5BQYGatiwYWratKlTHRMnTtTGjRuVmJiohg0b6pVXXlFAQECm6wIAwN3l6ZGCGzdu6MqVK7py5Yok6dq1a/bbt//z8vJS165dNWHChExv4+jRo9q2bZseeOABVaxYMcV5Vq9erVdffVWtW7fWrFmzFBoaqoEDB+qHH35wmG/o0KHatWuXxo0bp7ffflvHjx9Xv379lJSUlOm6AABwd3l6pKB79+7q3r27JCkiIkJjxoxRs2bNcnQbERERat68uSRp9OjROnz4sNM8U6ZMUdu2bTV06FBJUp06dfT7779r+vTpmjVrliTp4MGD2rlzp+bMmaMGDRpIkgIDA9WmTRutX79ebdq0ydG6AQBwNZddU7B58+YcDwSSZDanfZdOnz6tEydOqHXr1g7jbdq00Z49e5SQkCBJ2r59u/z8/FS/fn37PBUqVFDlypW1ffv2HK8bAABXy9MjBSmJi4vTuXPnFBMTI8MwnKaHh4fn6PaioqIk3XrXf7uKFSsqMTFRp0+fVsWKFRUVFaXAwECniyErVKhgX0dWeXpmL4uZzdaaTGlfrJlXbDV4eLjP117YanGnmtwJ/UkfPUqbu/XHVofJZHKL/aKsJZjNpmzv8/OSy0LB5cuX9eabb2r9+vVKTk52mm4Yhkwmk3755Zcc3W50dLQkyc/Pz2Hcdts2PSYmRkWKFHFa3t/fP8VTEhllNptUrFjOfKrCw2yWp6dHjqwrW3VYX4x+ft4ursSZO9bkTuhP+uhR2tytPx4ebrJftB619vUt5OJKMsdloWDs2LHasmWLevbsqUceecTpl/TdymIxFBNzPVvrKFDAQ76+hZRssSgpyTlQ5bXkZIskKSbmhv1nV/PwMMvPz9utanIn9Cd99Cht7tYfWz3JyW6yX7Tc6klcXLwSE7NfT069mUyPy0LBrl279PTTT2vkyJF5ul1/f39Jtz5uWLJkSft4TEyMw3Q/Pz+dP3/eafno6Gj7PFmVlJS9F5D9cJ2hFE+55DVbDbdejK7fOdzOHWtyJ/QnffQobe7WH8Mw3GK/KGsJFovhVv1Jj8tOdBQqVEilS5fO8+1WqFBBkpyuC4iKilKBAgVUtmxZ+3zHjx93enIdP37cvg4AAO4mLgsF//rXv7Rx48Y8327ZsmVVvnx5rVu3zmF8zZo1qlu3rry8vCRJjRo1UnR0tMPfZzh+/Lh+/vnnLH2pEgAA7s5lpw9atWqlffv2qW/fvurSpYvuvfdeeXg4XxxSpUqVTK33xo0b2rZtmyTp7NmziouLsweAWrVqqXjx4ho0aJBefPFFlStXTrVr19aaNWv0448/6tNPP7WvJywsTA0aNNDLL7+sUaNGqWDBgnrvvfcUHBysli1bZuOeAwDgnlwWCmxfYiRJu3fvdpqe1U8fXLp0SUOGDHEYs91esGCBateurXbt2unGjRuaNWuWPv74YwUGBmratGkKCwtzWO7999/XxIkTNXbsWCUlJalBgwZ65ZVX5Onp8k9yAgCQ41z2223ixIm5st4yZcrot99+S3e+zp07q3PnzmnOU6RIEb311lt66623cqo8AADclstCQceOHV21aQAAkII752uWAABArnLZkYKXXnop3XlMJhOH7gEAyCMuCwV79+51GrNYLLp48aKSk5NVvHhxeXu719dnAgBwN3NZKNi8eXOK44mJiVqyZInmz5+vuXPn5nFVAADkX253TUGBAgXUo0cP1a9fX2+88YarywEAIN9wu1BgU6lSJe3bt8/VZQAAkG+4bSjYvXs31xQAAJCHXHZNwbRp01Icj42N1b59+/Tzzz/rueeey+OqAADIv9wuFPj7+6ts2bIaP368nnzyyTyuCgCA/MtloeDXX3911aYBAEAK3PaaAgAAkLdc/uf+IiMjtXXrVp07d06SdP/996tJkyaqVauWiysDACB/cVkoSEhI0IgRI7Rx40YZhiE/Pz9JUkxMjObNm6cWLVronXfeUYECBVxVIgAA+YrLTh9Mnz5dGzZsUJ8+fbRz505FRkYqMjJSu3bt0jPPPKP169dr+vTprioPAIB8x2Wh4JtvvlHHjh01cuRIlShRwj5+zz336D//+Y8ee+wxff31164qDwCAfMdloeDixYsKCQlJdXpISIguXryYhxUBAJC/uSwU3HvvvYqMjEx1+r59+3TvvffmYUUAAORvLgsFjz32mNauXauxY8cqKipKycnJslgsioqK0muvvaZ169apY8eOrioPAIB8x2WfPhgwYIBOnz6tpUuXatmyZTKbb+UTi8UiwzDUsWNHDRgwwFXlAQCQ77gsFHh4eGjSpEnq3bu3tm/frrNnz0qSSpcurUaNGqlSpUquKg0AgHwpT0PBzZs3NWHCBD300EPq2bOnpFt/IvmfAWDBggVavHixxowZw/cUAACQR/L0moIlS5Zo5cqVatKkSZrzNWnSRMuXL9eyZcvypjAAAJC3oWDt2rVq2bKlypYtm+Z85cqV06OPPqrVq1fnUWUAACBPQ8Hvv/+umjVrZmjesLAw/fbbb7lcEQAAsMnTUJCYmJjhawQKFCighISEXK4IAADY5GkoCAgI0NGjRzM079GjRxUQEJDLFQEAAJs8DQX16tXTV199pUuXLqU536VLl/TVV1+pXr16eVQZAADI01DQr18/3bx5U08//bQOHTqU4jyHDh1S7969dfPmTT37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16effqpu3bppxYoVKlOmjMM6hwwZogceeEDDhg3T7Wc5jx8/rhEjRqhLly568sknFRgYqBs3bqhHjx7666+/1LVrV9133306ePCg3n33XV28eFFjxoyxLz9mzBitWLFCjRo1UqdOnZScnKz9+/fr0KFDqlatmiZPnqxXXnlFISEhevLJJyVJ5cqVy2qLgTuLASBfWb58uREUFGScPn3a2LBhgxEUFGT8+OOPWV5fUlKSERERYTRt2tSIjo52mGaxWOw/d+jQwahbt65x5coV+9gvv/xiVKpUyRg5cqR9bMqUKUZQUJAxfPhwp201bdrUCAoKMrZv3+4wPn36dCM0NNQ4fvy4w/jbb79tVK5c2Th37pxhGIaxZ88eIygoyHjjjTec1n17raGhocaoUaPSv/PAXYbTB0A+VqRIEUnS1q1blZiYmKV1/Pzzzzpz5ox69eolPz8/h2m26xYuXLigX375RR07dlTRokXt0ytVqqR69epp27ZtTuvt2rVritsrU6aMGjZs6DC2bt061axZU35+frp8+bL9X7169ZScnKx9+/ZJktavXy+TyaSBAwc6rfdOusYCyC2cPgDysVq1aqlVq1aaNm2aPvnkE9WqVUvNmzdX+/bt5eXllaF1nD59WpIUFBSU6jznzp2TJAUGBjpNq1ixonbu3Knr16/Lx8fHPv7P0wlpjZ88eVK//fab6tatm+Iyly9fliSdOnVKAQEBDsEEwP8QCoB8zGQyacqUKfrhhx+0ZcsW7dixQy+//LLmzZunJUuWqHDhwi6rrWDBgimOFypUyGnMYrGofv36evbZZ1Ncpnz58jlZGnDXIhQAUGhoqEJDQzVs2DB98803evHFF7VmzRp17tw53WXLli0rSfr9999Vr169FOe5//77Jd26SPCfoqKiVKxYMYejBJlVrlw5Xb9+PdXt3z7fzp07dfXqVY4WACngmgIgH4uOjna4sl+SKleuLElKSEjI0DqqVKmiMmXKaMGCBYqJiXGYZlt3QECAKleurC+//NJhnt9//127du1S48aNs3M31Lp1ax08eFA7duxwmhYTE6OkpCRJUsuWLWUYhqZNm+Y03+198PHxcbovQH7AkQIgH1u5cqUWLVqk5s2bq1y5crp27ZqWLl0qX19fNWrUKEPrMJvNGjdunP7973/rscce0+OPP66SJUsqKipKx44d05w5cyRJI0eOVL9+/dSlSxd16tTJ/pHEIkWKpHjhX2b07dtXmzdv1oABA9SxY0dVqVJFN27c0O+//65vv/1WmzZtUvHixVWnTh116NBBCxcu1MmTJ9WwYUNZLBYdOHBAtWvXVo8ePSTdCjp79uzRvHnzFBAQoDJlyqh69erZqhG4ExAKgHysVq1a+umnn7RmzRr9/fffKlKkiEJCQvT222/bTwtkRMOGDTV//nxNnz5dc+fOlWEYKlu2rP1z/pJUr149zZ49W1OmTNGUKVPk6emp8PBw/ec//8nUtlLi7e2thQsXaubMmVq3bp2+/PJL+fr6qnz58ho0aJD9UxaSNHHiRAUHB+uLL77Q5MmTVaRIEVWtWlVhYWH2eUaPHq2xY8fq/fffV3x8vDp27EgoQL7A3z4AAACSuKYAAABYcfoAQKquXr2a5pcaeXh4qHjx4nlYEYDcxOkDAKnq2bOnIiMjU51eunRpbd68OQ8rApCbCAUAUnX48OE0P5pXsGBB1axZMw8rApCbCAUAAEASFxoCAAArQgEAAJBEKAAAAFaEAgAAIIlQAAAArAgFAABAEqEAAABY/T+fwOyqJx0ThQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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PhyIiIhKE0MQFYmUlBR069YNCoUCv/76KywsLEq7JCIiojyJ+nAY6e/XX3/FtWvXcOLECTx//hyff/45AxAREZUJDEGkl0OHDiEyMhKVKlVCQECA1onMiIiIDBUPhxEREZEoif48QURERCRODEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEqmpV2AIRMEAUqlUNplEBERkY6kUgkkEolO8zIE5UGpFBAfn1raZRAREZGOHBysYGKiWwji4TAiIiISJYYgIiIiEiWGICIiIhIlhiAiIiISJYYgIiIiEiWGICIiIhIlhiAiIiISJYYgIiIiEiWGICIiIhIlhiAiIiISJYYgIiIiEiWGICIiIhIlhiAiIiISJYYgIiIiEiWGICIiIhIlhiAiIiIqEaGhazB4cD+Ehq4p7VIAMAQRERFRCUhPT8ehQwegVCrxyy8HkJ6eXtolMQQRERFR8VMoMiEISgCAUqmEQpFZyhUxBBEREZFIMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoMQQRERGRKDEEERERkSgxBBEREZEoGVwIunPnDj744AM0a9YMnp6eCAoKQkZGRr7LvXz5ErNnz0bHjh3RrFkz9O7dG1u3bi2BiomIiKgsMi3tArJLTEzEiBEjULt2bQQHB+PJkydYtGgR0tLSMHv27DyX/eSTTxATE4PJkyejWrVqiIqKwpw5c2BiYoIBAwaUUAdERERUVhhUCAoPD0dqaipCQkJgb28PAMjKysLcuXMREBCAKlWq5Ljcs2fPcPbsWSxcuBD9+vUDAHh4eODq1avYv38/QxARERFpMajDYVFRUfDw8FAHIADo0aMHlEoloqOjc11OoVAAAGxsbDSmW1tbQxCEYqmViIiIyjaDCkExMTFwdnbWmGZrawtHR0fExMTkuly1atXg5eWFFStW4Pbt20hJScGBAwcQHR2NIUOGFHfZREREVAYZ1OGwpKQk2Nraak23s7NDYmJinssGBwdj0qRJ6NWrFwDAxMQEs2bNQrdu3fSqydTUoHIiERFRmfT231NTU2mp/401qBBUWIIgYPr06bh37x6WLFkCR0dHnD59Gl9//TXs7OzUwaigpFIJKlSwKuJqiYiIxKdcOc3hKfb2VrC2Lt2/sQYVgmxtbZGcnKw1PTExEXZ2drku9+uvv+LQoUP4+eefIZfLAQCtW7fGixcvsGjRokKHIKVSQFLSq0ItS0RERP9JTU3VuJ2QkIrMTEmRb8fW1gImJrrtYTKoEOTs7Kw19ic5ORnPnj3TGiuU3e3bt2FiYgKZTKYx3cXFBdu3b8fr169hYWFRqJoUCmWhliMiIqL/vP33VKFQlvrfWIMa8NK+fXucPn0aSUlJ6mmHDh2CVCqFp6dnrss5OTkhKysLf//9t8b0a9euoWLFioUOQERERGS8DCoE+fn5wcrKCoGBgTh16hR27tyJoKAg+Pn5aZwjaMSIEfDx8VHfbt++PapXr44JEyZgz549OHPmDBYvXozIyEgMHTq0NFohIiIiA2dQh8Ps7OwQGhqKefPmITAwEFZWVvD19cWkSZM05lMqlcjKylLftra2xoYNG/D999/j22+/RXJyMmrUqIFp06YxBBEREVGOJALPJpirrCwl4uNT85+RiIiI8pSamgJ///92TKxduwlWVtZFvh0HByudB0Yb1OEwotISGroGgwf3Q2jomtIuhYiISghDEIleeno6Dh06AKVSiV9+OYD09PTSLomIiEoAQxCJnkKRCUF48zNNpVIJhSKzlCsiIqKSwBBEREREosQQRERERKLEEERERESixBBEREREosQQRERERKLEEERERESixBBEREREosQQRERERKLEEERERESixBBUini9KipqfE0REemOIaiU8HpVVNT4miIiKhiGoFLC61VRUeNrioioYBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIigEvZms4+FzoTyqVwNRUqve/7IpifaamUkilkkL3ZarvA0NERJpUF7MVhDcXs/XzGwZzc/PSLkuU+FzoTyqVwN7eEiYm+u03KVdO0Lhtb28Fa2srvdYJAFlZSiQkvIJSKeQ/81sYgoiIilhOF7PlH97SwedCf1KpBCYmUizbGo1HTxMLvR5FZprG7a9WHIZpufJ61eZU2Q6BgzwhlUoYgoiIiKh4PHqaiHuPXhZ6eaUiXeN2bFwCpKalG0g5JoiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIgMCq/zRJQzvjeKHkMQERkM1XWelMo313lKT0/PfyEiEeB7o3gwBBGRwcjpOk9ExPdGcWEIIiIiIlFiCCIiIiJRYggiIiIiUWIIIiIiIlFiCCIiIiJRYggiIiIiUWIIIiIiIlFiCCIiIiJRYggiIiIiUWIIIiIiIlFiCCK98aJ+RERUFjEEkV54UT8iIiqrGIJIL7yoHxERlVUMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKpqVdAFFhSaUSSKUSvddjairVuv32tMJQKgUolYLe6yEiouLBEERlklQqgb29JUxM9A8r5cppBhV7eytYW1vpvd6sLCUSEl4xCBERGSiGICqTpFIJTEykWLY1Go+eJuq1LkVmmsbtr1Ychmm58nqt06myHQIHeUIqlTAEEREZKIYgKtMePU3EvUcv9VqHUpGucTs2LgFSU3O91klERIaPA6OJiIhIlAwuBN25cwcffPABmjVrBk9PTwQFBSEjI0OnZZ88eYLPP/8cbdq0gaurK3r06IGff/65mCsmIiKissigDoclJiZixIgRqF27NoKDg/HkyRMsWrQIaWlpmD17dp7LPn36FAMHDkSdOnUwb948WFtb49atWzoHKCIiIhIXgwpB4eHhSE1NRUhICOzt7QEAWVlZmDt3LgICAlClSpVcl128eDGqVq2KNWvWwMTEBADg4eFREmUTERFRGWRQh8OioqLg4eGhDkAA0KNHDyiVSkRHR+e6XEpKCg4ePIjBgwerAxARERFRXgwqBMXExMDZ2Vljmq2tLRwdHRETE5PrcteuXUNmZiZMTU0xdOhQNGrUCJ6enli8eDEyMzOLu2wiIiIqgwzqcFhSUhJsbW21ptvZ2SExMfdzwTx//hwAMGvWLAwYMADjxo3Dn3/+iaVLl0IqlWLKlCmFrqkozhysy3qL6izFJa20+iiKkySWhJKs0xheU8bQA2A8fRgDY3kuSrOPsvB5W9gaDSoEFZZSqQQAtG3bFtOmTQMAtGnTBqmpqVi3bh0CAwNRvnzBT34nlUpQoYL+Zw7OSXGdpbikGUsfxcXW1qLEtmUMz4Ux9AAYTx/GwFieC2Ppo7gU9rPWoEKQra0tkpOTtaYnJibCzs4uz+WAN8EnOw8PD6xYsQL379+HXC4vcD1KpYCkpFca0ySSorleVWrqa43bycmvoVTqP55JqRQgCCV3huLU1FSN2wkJqcjM1P/xyY+JibREA0ZhJSW9RlaWMs95+Jr6T2m9noqasfRhDIzluSjNPsrC5232z1pbWwud9wwZVAhydnbWGvuTnJyMZ8+eaY0Vyq5evXp5rjc9PT3P+/OiUPz3B+zN9ap0f3DzIpVmady2sbGAtbX+L7KSvl5V9sdHdfvtaWKWlZX348HXlCZjeT0ZSx/GwFieC2Ppo7jk91mbG4MKQe3bt8eKFSs0xgYdOnQIUqkUnp6euS7n5OQEmUyG06dPY+jQoerpp0+fRvny5fMNSbri9aqoqPE1RURUegwqBPn5+SEsLAyBgYEICAjAkydPEBQUBD8/P41zBI0YMQJxcXE4cuSIetqkSZMwduxYLFiwAB07dsTVq1exbt06+Pv7w9LSskjr5PWqqKjxNUVEVPIMKgTZ2dkhNDQU8+bNQ2BgIKysrODr64tJkyZpzKdUKpGVpbnr39vbG9999x1++uknbN26FZUrV8b48ePx0UcflWQLREREVEYYVAgCgLp162LDhg15zhMWFpbj9J49e6Jnz57FUBUREREZG8P/8T8RERFRMWAIIiIiIlFiCCIiIiJRYggiIiIiUWIIIiIiIlFiCCIiIiJRYggiIiIiUTK48wQREZUWqbRoLmZrairVuv32tMJQKoUSv3xJaOga/PLLAXTr1hMjRowu0W0TFTeGICIiqC5ma1kkF7MtV04zqNjbW8Ha2krv9Zb0BZLT09Nx6NABCIISv/xyAH5+w2BuzkuxUOFIpCYAJAAEAJL/v126GIKIiMCL2eZEociEILy5MrdSqYRCkckQRIUmkZrCsrILXj29AcvKLpBISz+ClH4FREQGhBezJSo+NjXbwKZmm9IuQ40Do4mIiEiU9ApB06dPx5UrV3K9/88//8T06dP12QQRERFRsdArBEVGRiI2NjbX+x8+fIjdu3frswkiIiKiYlGsh8OePn2K8uX1GwxIREREVBwKPDD66NGjOHbsmPp2REQETp8+rTVfcnIyTp8+jcaNG+tXIREREVExKHAIunPnDg4dOgQAkEgkuHLlCv766y+NeSQSCSwtLeHu7o5p06YVTaVERERERajAISggIAABAQEAgAYNGmDBggXo06dPkRdGREREVJz0Ok/QzZs3i6oOIiIiohKlVwi6du0aLl++jCFDhuR4/+bNm+Hm5gYXFxd9NkNEZUBRXHfLmK65Rfoxluu4GUsfxkqvEPT999+jfPnyuYags2fPIioqCitXrtRnM0Rk4IrqulvGcs0t0o+xXMfNWPowZnrvCVKND8pJixYtsGrVKn02QURlQFFdd8tYrrlF+jGW67gZSx/GTK8QlJqaChOT3K8CK5VKkZycrM8miKgM0fe6W7zmFmVnLNdxM5Y+jJFe++jeeecdREdH53r/yZMnUbNmTX02QURERFQs9ApBvr6++PXXX7Fw4UIkJSWppyclJeHrr7/GyZMn4evrq3eRREREREVNr8Nhw4cPx82bNxEaGoqwsDBUrlwZwJvLZSiVSvTt2xcjR44sijqJiIiIipReIUgikWDhwoXo27cvDh8+jAcPHgAAOnfujK5du6J169ZFUiQRERFRUdMrBKm0adMGbdq0KYpVEREREZWIIglBT548wR9//IEXL16gW7duqFq1KrKyspCcnAwbG5s8f0FGREREVBr0CkGCIGDRokXYvHkzFAoFJBIJZDIZqlatilevXsHb2xsTJkzguCAiIiIyOHr9OmzNmjXYuHEjRo0ahfXr10MQ/jvZko2NDbp27YrDhw/rXSQRERFRUdMrBG3fvh3vvvsuJk+ejAYNGmjdL5fLce/ePX02QURERFQs9Doc9vjxYzRv3jzX+y0sLJCSkqLPJqiY8KJ+REQkdnqFoIoVK+Lx48e53n/t2jVUq1ZNn01QMeBF/YiIiPQMQT4+PggPD0e/fv1gbW0N4M25gwDg1KlTiIyMhL+/v/5VUpHiRf2IiIj0DEETJkzA2bNn0bdvX7Rs2RISiQSrV6/Gjz/+iMuXL8PFxQVjxowpqlqpiPGifkREJGZ6HQ+xsbFBREQERo8ejSdPnsDc3Bx//PEHkpOTERgYiC1btsDCwqKoaiUiIiIqMoXeE5Seno5t27bBxcUFY8eOxdixY4uyLiIiIqJiVeg9Qebm5vj2229x9+7doqyHiIiIqETodTisfv36ePToUVHVQkRERFRi9ApBkyZNQnh4OE6fPl1U9RARERGVCL1+HbZp0ybY29vD398fNWrUQI0aNWBurvnLIIlEguXLl+tVJBEREVFR0ysE/fPPPwCAatWqISsrC/fv39eaR3XeICIiIiJDolcIOn78eFHVQURERFSiCj0m6PXr1+jXrx+2bt1alPUQERERlYhChyALCws8fPiQh7uIiIioTNLr12Ht2rXDqVOniqoWIiIiohKjVwgaO3Ys7t27h88++wznz5/HkydPkJCQoPWPiIiIyNDoNTC6V69eAIDbt29j3759uc5348YNfTZDREREVOT0CkGBgYEcE0RERERlkl4haPz48UVVBxEREVGJ0mtM0NvS0tKQlpZWlKskIiIiKhZ67QkCgLi4OAQHB+O3337Dy5cvAQAVKlRAhw4dMG7cODg5OeldJBEREVFR0ysE3blzB4MHD0ZycjLatm2LunXrAgBiYmKwZ88enDhxAlu2bIGzs3ORFEtERERUVPQKQUuWLIFUKkVkZCTkcrnGff/88w9GjhyJJUuWYNmyZXoVSURERFTU9BoT9Mcff2DYsGFaAQgAZDIZhgwZgnPnzumzCSIiIqJioVcIUigUKF++fK73W1hYQKFQ6LMJIiIiomKhVwhycXHB9u3bkZycrHVfSkoKduzYgYYNG+qzCSIiIqJiofd5gj788EP06NED/fr1Q+3atQEAd+/eRWRkJBISEjB79uyiqNPoSKQmACQABACS/79NpYHPBRGROOkVgjw8PLBq1SoEBQVh1apVGve5uLhg8eLFaNOmjV4FGiuJ1BSWlV3w6ukNWFZ2gUSq99kKqJD4XBARiZPen/Zt27bF7t278ezZM8TFxQEAqlevDkdHR72LM3Y2NdvApiZDoiHgc0FEJD5F9pXX0dGRwYeIiIjKDL0GRm/cuBH+/v653j969Ghs2bJFn00QERERFQu9QtCOHTvUZ4nOSb169RAREaHPJoiIiIiKhV4h6MGDB3mGIGdnZ8TGxuqzCSIiIqJioVcIKleuHJ49e5br/U+fPoVUWqQXqiciIiIqEnollKZNmyIyMhIpKSla9yUnJ2PXrl1o2rSpPpsgIiIiKhZ6haBx48bh6dOnePfddxEWFoYzZ87gzJkz2LhxI9599108e/YM48aNK9A679y5gw8++ADNmjWDp6cngoKCkJGRUaB1bNiwAXK5HAEBAQVajoiIiMRDr5/IN23aFCtWrMDs2bOxYMECSCQSAIAgCKhRowaWL1+O5s2b67y+xMREjBgxArVr10ZwcDCePHmCRYsWIS0tTeczTz979gzLli1DxYoVC9UTERERiYPe5wny9PTEkSNHcP36dfUg6Fq1aqFRo0bqUKSr8PBwpKamIiQkBPb29gCArKwszJ07FwEBAahSpUq+61i8eDG8vb3VJ24kIiIiykmRjFqWSqVo3LgxevbsiZ49e6Jx48Y5BqD4+Hh07twZly5dynE9UVFR8PDwUAcgAOjRoweUSiWio6PzreP8+fM4evQopkyZUuheiIjKOqlUAlNTaZH8y66o1imVFuwLMlFxKdGLJCmVSjx69AhpaWk53h8TE4P3339fY5qtrS0cHR0RExOT57qzsrIwb948jBkzBpUrVy6ymonKCl4I1nCU5nMhlUpgb28JExP9v+OWKydo3La3t4K1tZXe683KUiIh4RWUSiH/mYmKkUFdKTIpKQm2trZa0+3s7JCYmJjnslu2bMHr168xcuTIIq0p+zehovhQKQn51WkMfRhDD7rcXxDFeSFYY3hNiem5MDGRYtnWaDx6mvfnZn4UmZpfWL9acRim5crrtU6nynYIHOSJcuVMkJWlzHGesvB6AozjfQEYRx+FrdGgQlBhvXjxAkuXLsU333wDMzOzIluvVCpBhQr6f+spaba2FqVdQpEwhj5KuofiuhAsn4uCK+3n4tHTRNx79FKvbSkV6Rq3Y+MSIDU112udKnxNGQ5j6KOwPRhUCLK1tUVycrLW9MTERNjZ2eW63I8//gi5XI6WLVsiKSkJAKBQKKBQKJCUlARLS0uYmha8VaVSQFLSK/VtExNpmXixJCW9zvUbFmAcfRhDDwD7KEnG0AMgjj6MoQeAfZSk7D3Y2lrovGfIoEKQs7Oz1tif5ORkPHv2DM7Ozrkud/fuXfzxxx9wd3fXus/d3R2rV69G+/btC1WTQpH7C8NQZWUpy2TdbzOGPoyhB8A4+jCGHgD2YUiMoQfAOPoobA8GFYLat2+PFStWaIwNOnToEKRSKTw9PXNdbsaMGeo9QCpff/01ypcvj8mTJ0Mulxdr3URERFT2GFQI8vPzQ1hYGAIDAxEQEIAnT54gKCgIfn5+GucIGjFiBOLi4nDkyBEAgIuLi9a6bG1tYWlpidatW5dY/URERFR2lOiQ73LlysHd3T3X8T12dnYIDQ2FiYkJAgMDsWTJEvj6+mLatGka8ymVSmRlZZVEyURERGSkinxP0OvXr7F//35kZGSgQ4cOcHJyUt9nZ2eHsLCwPJevW7cuNmzYkOc8+a1D13mIiIhIvPQKQTNmzMCff/6Jffv2AQAyMjIwYMAA3Lp1CwBgY2OD0NBQNGzYUP9KiYiIiIqQXofDzp49Cx8fH/Xtffv24datW/j222+xb98+VKpUCSEhIXoXSURERFTU9ApBz58/1zjcdfToUTRu3Bi9e/dGvXr1MGDAAPz55596F0lERERU1PQKQRYWFuqTGyoUCpw7dw5eXl7q+62srHI8+SERERFRadNrTFCjRo0QERGB1q1b4/jx40hNTYW3t7f6/tjYWFSsWFHvIomIiIiKml4haOLEiRg9ejTef/99CIKArl27wtXVVX3/kSNH4ObmpneRREREREVNrxDUpEkTHDx4EBcvXoStrS1atWqlvi8pKQmDBw/WmEZERERkKAoUguLi4gAA1atX17it+gm86rZK9l+OERERERmSAoUgb29vSCQSXLlyBWZmZurb+blx40ahCyQiIiIqDgUKQV9//TUkEgnKlSuncZuIiIiorClQCOrXr1+et4mIiIjKihK9gCoRERGRoWAIIiIiIlFiCCIiIiJRYggiIiIiUWIIIiIiIlFiCCIigyGRmgBQnXZD8v+3iQrPWF5TxtKHoWEIIiKDIZGawrKyCwAJLCu7QCLV68o+REbzmjKWPgwNH0UiMig2NdvApmab0i6DjIixvKaMpQ9Dwj1BREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBpBdez4aIiMoqhiDSC69nQ0REZRX/YpHeeD0bIiIqi7gniIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIhyJJGaAJCobv3/bSLjwRBEREQ5kkhNYVnZBYAElpVdIJGalnZJREXK4F7Rd+7cwfz583Hp0iVYWVmhb9++mDhxIszMzHJd5unTp9iwYQOio6MRGxsLGxsbuLu7Y/LkyXBycirB6omIjItNzTawqdmmtMsgKhYGFYISExMxYsQI1K5dG8HBwXjy5AkWLVqEtLQ0zJ49O9flrl27hiNHjuD9999H06ZN8fLlSyxfvhz9+/fHvn374ODgUIJdEBERUVlgUCEoPDwcqampCAkJgb29PQAgKysLc+fORUBAAKpUqZLjci1atMDBgwdhavpfO25ubujYsSN2796NUaNGlUT5REREVIYY1JigqKgoeHh4qAMQAPTo0QNKpRLR0dG5Lmdra6sRgACgatWqcHBwwNOnT4urXCIiIirDDCoExcTEwNnZWWOara0tHB0dERMTU6B13b17Fy9evEDdunWLskQiIiIyEgZ1OCwpKQm2trZa0+3s7JCYmKjzegRBwPz581G5cmX06tVLr5pMTf/LiSYmBpUZc5VfncbQhzH0oMv9hsIY+jCGHgBx9GEMPehyv6Ewhj4KW6NBhaCiEhwcjN9//x1r1qyBpaVlodcjlUpQoYJVEVZWMmxtLUq7hCJhDH0YQw+AcfRhDD0A7MOQGEMPgHH0UdgeDCoE2draIjk5WWt6YmIi7OzsdFpHREQEli1bhgULFsDDw0OvepRKAUlJr9S3TUykZeLFkpT0GllZylzvN4Y+jKEHgH2UJGPoARBHH8bQA8A+SlL2HmxtLXTeM2RQIcjZ2Vlr7E9ycjKePXumNVYoJ0eOHMGcOXMwYcIE+Pr6FklNCkXuLwxDlZWlLJN1v80Y+jCGHgDj6MMYegDYhyExhh4A4+ijsD0Y1IG+9u3b4/Tp00hKSlJPO3ToEKRSKTw9PfNc9uzZs5g8eTL69++PwMDA4i6ViIiIyjiDCkF+fn6wsrJCYGAgTp06hZ07dyIoKAh+fn4a5wgaMWIEfHx81Lfv3LmDwMBA1K5dG3379sXly5fV/2JjY0ujFSIiIjJwBnU4zM7ODqGhoZg3bx4CAwNhZWUFX19fTJo0SWM+pVKJrKws9e0rV64gOTkZycnJGDRokMa87733HhYtWlQi9RMREVHZYVAhCADq1q2LDRs25DlPWFiYxu1+/fqhX79+xVgVERERGRuDOhxGREREVFIYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQYgoiIiEiUGIKIiIhIlBiCiIiISJQMLgTduXMHH3zwAZo1awZPT08EBQUhIyMj3+UEQcCqVavQsWNHuLq6YuDAgbh8+XLxF0xERERlkkGFoMTERIwYMQKZmZkIDg7GpEmTEBERgUWLFuW77OrVq7F06VKMHDkSK1euhKOjI0aNGoUHDx6UQOVERERU1piWdgHZhYeHIzU1FSEhIbC3twcAZGVlYe7cuQgICECVKlVyXC49PR0rV67EqFGjMHLkSABAixYt0L17d6xduxZz5swpmQaIiIiozDCoPUFRUVHw8PBQByAA6NGjB5RKJaKjo3Nd7uLFi0hJSUGPHj3U08zMzODj44OoqKjiLJmIiIjKKIMKQTExMXB2dtaYZmtrC0dHR8TExOS5HACtZevWrYu4uDikpaUVfbFERERUphnU4bCkpCTY2tpqTbezs0NiYmKey5mZmcHc3Fxjuq2tLQRBQGJiIsqXL1/geqRSCRwcrNS3JZI3//3c3xtZWcoCr6+4mZi8ybR2dhYQhNznM4Y+jKEHgH2UBGPoARBXH8bQA8A+SkJOPUilEp2XN6gQZGgkEglMTLQfTDvrggeqkiSV6raDzxj6MIYeAPZREoyhB0BcfRhDDwD7KAm69qC1XBHXoRdbW1skJydrTU9MTISdnV2ey2VkZCA9PV1jelJSEiQSSZ7LEhERkTgZVAhydnbWGvuTnJyMZ8+eaY33eXs5ALh7967G9JiYGFSvXr1Qh8KIiIjIuBlUCGrfvj1Onz6NpKQk9bRDhw5BKpXC09Mz1+Xc3NxgbW2NgwcPqqdlZmbi8OHDaN++fbHWTERERGWTQY0J8vPzQ1hYGAIDAxEQEIAnT54gKCgIfn5+GucIGjFiBOLi4nDkyBEAgLm5OQICAhAcHAwHBwfIZDJs3boVCQkJ8Pf3L612iIiIyIAZVAiys7NDaGgo5s2bh8DAQFhZWcHX1xeTJk3SmE+pVCIrK0tj2ocffghBELBu3TrEx8fDxcUFa9euRc2aNUuyBSIiIiojJIKQ1w/jiIiIiIyTQY0JIiIiIiopDEFEREQkSgxBREREJEoMQURERCRKDEFEREQkSgxBREREJEoMQaVELpdj7dq1hVr26tWrmD59Onr06IEGDRogICCgiKvTVhL1CoKAVatWoWPHjnB1dcXAgQNx+fJlParWjT69hYeHY9SoUfD09ISbmxsGDBiAo0ePFnGF+dOnh8jISAwYMACtWrVCkyZN0K1bNyxbtgwZGRlFXGX+9Okju3///RfNmzeHXC5HfHx8EVRWMPr0ERwcDLlcrvVv69atRVxl3vR9LpRKJTZs2IDu3bujcePG8PT0xJQpU4qwQt3o04e3t3eOz4VcLi+RzyYVfZ+L7du3o0+fPmjWrBk6dOiAWbNm4cWLF0VYoW707WPnzp3q15OPjw/CwsL0rsmgTpZIurl48SLOnz8PV1dXrYvGGiJd6129ejWWLl2KTz/9FHK5HJs3b8aoUaOwZ88egz3p5YoVK+Dl5YVBgwbB0tIShw4dQmBgIBYtWoT33nuvtMvTSWJiItq1a4ePPvoI1tbW+PPPPxESEoJ///0X8+bNK+3yCmXRokWwtLTEq1evSruUQilfvjxCQ0M1phnqeyA3s2fPxokTJzB27FjUr18fz549w4ULF0q7rAIJCQnR+jLw7bff4s6dO2jcuHEpVVUwu3fvxqxZs+Dv74927dohLi4O33//PW7fvo3w8PDSLk9nBw4cwIwZMzB8+HB07NgR58+fx8KFCyGRSDB06NBCr5chqAwaNmwYRowYof5/Q6dLvenp6Vi5ciVGjRqFkSNHAgBatGiB7t27Y+3atZgzZ04JVVswu3btgoODg/q2p6cnHj16hHXr1pWZEKR6vFXatGmD1NRUbNiwAXPmzIGJiUnpFFZIZ86cwZkzZxAQEIBvvvmmtMspFKlUimbNmpV2GYV25swZREZGYteuXZDL5erpvXr1KsWqCq5hw4Yat1+9eoVr167h3Xffhalp2fjzuXfvXrRq1QpTp07VmD5jxgw8fvwY1apVK6XKCmbp0qXo2rUrZs6cCeDNZ21SUhKCg4MxcOBAlCtXrlDr5eGwQrh16xY+/PBDtG7dGk2bNkW3bt2wevVqAG/+yL99uOfGjRuQy+U4e/asxvSsrCwEBQWhTZs2aN68OaZNm4aUlJR8ty+VFuxpKwv1Xrx4ESkpKejRo4d6mpmZGXx8fBAVFWWwvWUPQCouLi54+vRpvssaSg85sbe3h0KhgFKpLFN9ZGZmYt68eRg/fjzs7e11rt3Q+tBXafcQERGBVq1aaQSgstjH244dO4ZXr16hT58+ZaYHhUIBa2trjWk2NjYA3gxBKAt9vH79Gvfu3dO6kLqXlxcSEhL0OjRZNqKsgRkzZgwqVaqEBQsWwNraGrGxsfj3338LvJ6wsDA0atQI33zzDR4+fIhvv/0W6enp+P7770VXb0xMDADA2dlZY3rdunURGhqKtLQ0lC9fXms5Q+ztwoULWn3kxVB6UCgUyMzMxLVr1xAaGopBgwYV6NuVIfSxceNGmJiYYNCgQdizZ0+Btw0YRh9paWlo06YNkpKSULt2bYwcORIDBgwoMz1cuXIFnTp1woIFCxAZGYmMjAy4u7tj1qxZqFOnTpnp42379u2Dk5MT3NzcdF6mtHvw9fXF9OnTcejQIXh5eeHx48dYsWIFOnXqhOrVq5eJPjIyMiAIAszMzDSmq27fuXMH7u7uBa4FYAgqsPj4eDx8+BAzZ86Et7c3gDeHDwrDzMwMy5YtUx9uMDc3x6xZszBu3DjUrVtXVPUmJSXBzMwM5ubmGtNtbW0hCAISExO1QpAh9rZ3715cunQJy5Yt02l+Q+lBoVCgUaNG6tvvvfceZsyYofO2DaGPJ0+eYNmyZRrLFpQh9FGrVi18+umnaNiwIdLT07F371588cUXSE5Ohr+/f5no4dmzZ9i1axfq1auHb7/9FpmZmfj+++/h7++PgwcPar3PDbWP7F6+fIno6GiMGjVK5+0aQg99+vTB69ev8emnnyIzMxMA0LZt2wIFwNLuw87ODvb29vjzzz/Rr18/9XTVHqDExMRC1QLwcFiBVahQAU5OTvjuu+8QGRlZqCSs0qlTJ40P6+7du0MQBFy9ehXAm92GCoVC/U8M9RaEofV28+ZNfPnll+jXrx+6dOlSpnowNTXFjh07sHnzZkyfPh0nTpzA9OnTdd62IfQRFBQET09PeHh4FHrbhtBH37594e/vDw8PD3Ts2BFLlixBt27dsHz5cvUfMUPvQRAEZGVlYfny5ejYsSN8fHwQEhKCx48fY+/evTpt2xD6yO7gwYPIzMxE7969dd6uIfRw+PBhLFq0CB9//DHCwsLwzTff4P79+5g4caLOh8MMoY/Bgwdj165d2Lt3LxITE3HixAls3LgRACCRSApdD0NQAUkkEqxduxbOzs746quv0KFDB/Tr1w9//PFHgddVsWJFjdvW1tYwNzdXjyfx8fFBo0aN1P8ePnxotPXa2toiIyND69djSUlJkEgksLOzM+jeHj16hA8//BCurq746quvdN6uIfXQpEkTtGzZEiNHjsSCBQuwe/du9QeTofdx6dIl/PLLL/j444+RlJSEpKQkvH79GgCQmpqq/n9D7yM3PXr0QHJyMmJjY8tED7a2tqhXrx4qVaqkXtbZ2RlVq1bF7du3ddq2IfSR3b59+yCXyyGTyXTebmn3IAgCvvzySwwYMACBgYFo1aoV3n33XSxevBi//voroqOjy0QfABAQEAAfHx989tlnaNWqFSZPnowJEyYAABwdHQtchwoPhxVCnTp1sHTpUmRmZuLSpUv47rvvMGbMGERFRcHMzEzr21puu+rePk9DSkoK0tPTUblyZQDA8uXLNX6eqZpujPWqxtDcvXsXDRo0UE+PiYlB9erVcxwPZCi9xcfHw9/fHxUrVkRISEiBf6VgCD28TfXz39jYWDRp0sTg+zh37hwyMzNz/EVely5d0LNnT513/xvi81FQpd1DvXr1ch3sWpDTepR2HypxcXG4ePEiJk+erHPthtBDfHw84uPjNT5Tgf9+9aZLqDaEPoA3p41YsmQJZs6ciWfPnqFmzZrqQN20aVOd+3gb9wTpoVy5cmjVqhU++ugjpKSk4OnTp6hatSru3r2rsZsxt7R94sQJZGVlqW8fOnQIEolE/UdHLpejSZMm6n9vDwozpnrd3NxgbW2NgwcPqqdlZmbi8OHDaN++vcH2lpqaig8//BCZmZlYtWqV1q8wCsKQnh/V+VwKc26a0uijXbt22Lhxo8a/Dz/8EACwbNkyBAYGlok+cnPgwAHY2tqiVq1aZaKHTp064fbt23j27Jl62Tt37uDff//VGHtm6H2o7Nu3DwAKdCjMEHpwcHCAhYUFrl+/rrGua9euAQCcnJzKRB/ZOTg4QC6Xw9LSEps3b0bLli0L9EOUt3FPUAHdvHkT33zzDXr27ImaNWsiJSUFK1euhJOTE2rVqoVu3bphx44dmDdvHrp06YKLFy/il19+yXFdGRkZCAwMxKBBg9Sj5Lt165bvQL34+HicO3dO/f+pqak4dOgQAKBDhw6wsLAoc/Wam5sjICAAwcHBcHBwgEwmw9atW5GQkJDrYFBD6G38+PG4efMmFixYgLi4OMTFxanv0+U8L4bQw5AhQ+Dj4wNnZ2dIpVJcuXIF69atQ7t27eDq6ppvD4bQh6Ojo9Yu8UePHgF4E7BzOpWBIfYBAP369cO7774LZ2dnpKWlYe/evTh8+DBmzJih015GQ+ihf//+CAsLQ0BAAMaOHYvMzEz8+OOPqFWrls7nCjKEPlT27dsHNze3Av2ayhB6kEgkGDBgALZs2QJra2u4u7sjLi4OISEhqF+/vs7j50q7DwD47bffEBsbi3r16iExMRF79+7F2bNn9T6TOkNQATk6OqJSpUpYuXIlnjx5AhsbG7Rs2RKLFy+GiYkJ2rdvj88++wybNm1CZGQk2rdvj7lz52qdkA54c26F+Ph4TJ06FRkZGfDx8cHs2bPzreHWrVv45JNPNKapbh87dgw1atQok/V++OGHEAQB69atQ3x8PFxcXLB27dpc90YYQm+qbzuff/651n1///13vssbQg+NGzdGREQE4uLiYGpqiho1amD8+PEYPHhwvssaUh9FwRD6qFWrFjZs2IDnz59DIpFAJpNh8eLF+N///ldmerC2tkZoaCgWLFiAzz77DBKJBF5eXpgxY4bGlzRD7wMAbt++jb///htffvmlTvMbWg+ffvopHBwcsGfPHqxduxYVKlRA69atMWnSJJ331htCH6ofb9y/fx+mpqZo1aoVtm3bpvcvkyVCQc6WRERERGQkOCaIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIiIhEiSGIiIiIRIkhiIiIiESJIYiIDNquXbsgl8vzvMp6TqZNmwZvb+9iqqpkyeVyBAcH5ztfcHAw5HJ5CVREZBwYgojIIKxYsQJHjx4t7TKKjbH3R1QW8bIZRGQQmjdvjm7dumHRokUa07OysqBQKGBmZgaJRKLz+jIzMyEIgs7XRypuufWni/T0dJiYmMDUNO/LPQYHByMkJESn69YRES+gSkSlSBAEpKeno3z58rnOY2JiAhMTkwKvW5crrpcV5ubmpV0CkVHi4TAiypVqjMmdO3fwySefwM3NDa1bt8b8+fORnp6unm/nzp0YPnw4PDw80LhxY/Ts2RNbtmzRWp+3tzcCAgJw8uRJ9OvXD66urggPD4dcLserV68QGRkJuVwOuVyOadOmAch9TNBvv/2GoUOHonnz5nBzc8P777+PvXv3qu9/e0zQw4cPIZfLsXbtWmzYsAGdOnWCq6srhg4din/++Udj3Tdv3sS0adPQuXNnNGnSBJ6enpg+fTpevnyZ4+Nz//59TJs2DS1btkSLFi0wffp0vH79Wj1fXv3pIqcxQefPn8f777+PJk2aoEuXLggPD9d5fUT0BvcEEVG+Jk6cCCcnJ0yZMgWXL19GWFgYkpKSEBQUBADYunUr6tevD29vb5iamuLEiROYO3cuBEHAkCFDNNZ19+5dTJkyBQMHDsSAAQNQp04dBAUFYdasWXB1dcWAAQMAALVq1cq1nl27dmHGjBmoX78+AgICYGNjgxs3buDkyZPo06dPnr3s3r0bqampGDx4MNLT0xEWFoYRI0Zg7969qFSpEgDg9OnTePDgAfr16wdHR0fcunULERERuH37NiIiIrQOy02cOBE1atTA5MmTcf36dWzfvh0ODg747LPPAKDA/eXn77//hr+/PxwcHDB+/HgoFAoEBwejYsWKhV4nkRgxBBFRvmrUqIHly5cDAIYMGQJra2ts2bIFo0aNQoMGDbBp0yaNQ1pDhw6Fv78/1q9frxWC7t+/jzVr1qBdu3Ya0+fMmYOaNWuib9++edaSnJyM+fPnw9XVFWFhYRqHinQZ4hgbG4vDhw+jSpUqAID27dujf//+WL16NaZPnw4AGDx4MEaNGqWxXLNmzTB58mRcuHABLVu21LjPxcUFX3/9tfp2QkICduzYoQ5Bffv21bk/XSxduhSCIGDz5s2oXr06AKBbt275BkAi0sTDYUSUr7eDzNChQwEAUVFRAKARgJKTkxEfH49WrVrhwYMHSE5O1li2Ro0aWgGoIKKjo5GamoqPPvpIa6yMLgOnu3Tpog5AAODq6oqmTZvit99+U0/L3k96ejri4+PRtGlTAMC1a9e01unn56dxu2XLlkhISEBKSopuTRVAVlYWTp06hS5duqgDEADUrVsXXl5eRb49ImPGPUFElK933nlH43atWrUglUrV43QuXLiA4OBgXL58WWMsDPAmFNnY2Khv16hRQ69aYmNjAQD169cv1PJv9wIAtWvXxsGDB9W3ExISEBISggMHDuDFixca874d6gBohBEAsLW1BQAkJibC2tq6UHXmJj4+HmlpaTn2UadOHY0wR0R5YwgiogLLvsclNjYWI0eOhLOzM6ZNm4Zq1aqhXLly+O2337BhwwYolUqNZfP6JZihmDhxIi5dugR/f3+4uLjA0tISSqUSo0ePzvGQm1Sa8051noGEyLAxBBFRvu7fv4+aNWtq3FYqlahRowaOHz+OjIwMLF++XGOPyNmzZ4ulFtWA4lu3buW4NyQ/9+/f15p27949ODk5AXiz9+bMmTMYP348xo0bpzGPIXBwcED58uVz7OPu3bulUBFR2cUxQUSUr82bN2vc3rRpE4A3g4pV5/DJvtcjOTkZO3fuLNA2LC0tkZSUlO98Xl5esLKywsqVKzV+pv92Dbk5evQonjx5or79559/4sqVK2jfvj0A5HpOotDQ0HzXnRdd+8uPiYkJvLy8cPToUcTFxamn37lzB6dOndJ7/URiwj1BRJSvhw8fYsyYMWjXrh0uX76Mn3/+Gb1790aDBg1gZmaGcuXKYcyYMfDz80Nqaiq2b9+OihUr4tmzZzpvo1GjRjhz5gzWr1+PypUro0aNGurByNlZW1tj+vTpmDVrFnx9fdG7d2/Y2tri5s2bSEtLwzfffJPndmrVqoVBgwZh0KBByMjIwMaNG2Fvb4/Ro0er1+/u7o41a9YgMzMTVapUQXR0dIGvXVbY/nQxfvx4nDx5EkOGDMGgQYOQlZWFTZs2oV69ejxbNFEBcE8QEeXrhx9+gJmZGZYsWaI+SaHqJ+HOzs5YunQpJBIJvvnmG4SHh2PAgAEYPnx4gbYxbdo0NGrUCD/88AMmT56MrVu35jpv//79sXz5clhZWeGnn37Ct99+i+vXr6v35uTl3XffxbBhw7B582asWLEC9erVQ2hoKCpXrqyeZ8mSJfDy8sKWLVvw3XffwdTUFKtXry5QP/r0l58GDRpg7dq1qFChApYuXYqdO3di/Pjx8PHx0atGIrHhtcOIKFeqa1GdOXMGDg4OpV2OXh4+fIjOnTtj6tSp8Pf3L+1yiMgAcE8QERERiRLHBBERlYKsrCzEx8fnOY+lpSWsrKxKqCIi8WEIIiIqBY8fP0bnzp3znGfcuHEYP358CVVEJD4cE0REVArS09Nx4cKFPOepWbOmxvmZiKhoMQQRERGRKHFgNBEREYkSQxARERGJEkMQERERiRJDEBEREYkSQxARERGJEkMQERERiRJDEBEREYkSQxARERGJ0v8BY34cRlUBQRkAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant_idtrial_indexstimulusresponseresponse_timeexpected_responseis_correct
0sub-11ANoneNaNNone1
1sub-12CNoneNaNNone1
2sub-13Cnon-match0.317768non-match1
3sub-14Cnon-match1.096391match0
4sub-15Fnon-match0.843995non-match1
\n", "
" ], "text/plain": [ " participant_id trial_index stimulus response response_time \\\n", "0 sub-1 1 A None NaN \n", "1 sub-1 2 C None NaN \n", "2 sub-1 3 C non-match 0.317768 \n", "3 sub-1 4 C non-match 1.096391 \n", "4 sub-1 5 F non-match 0.843995 \n", "\n", " expected_response is_correct \n", "0 None 1 \n", "1 None 1 \n", "2 non-match 1 \n", "3 match 0 \n", "4 non-match 1 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def generate_mock_nback_dataset(N=2,\n", " n_participants=10,\n", " n_trials=32,\n", " stimulus_choices=list('ABCDEF'),\n", " response_choices=['match', 'non-match']):\n", " \"\"\"Generate a mock dataset for the N-back task.\"\"\"\n", "\n", " n_rows = n_participants * n_trials\n", "\n", " participant_ids = sorted([f'sub-{pid}' for pid in range(1, n_participants + 1)] * n_trials)\n", " trial_indices = list(range(1, n_trials + 1)) * n_participants\n", " stimulus_sequence = np.random.choice(stimulus_choices, n_rows)\n", "\n", " responses = np.random.choice(response_choices, n_rows)\n", " response_times = np.random.exponential(size=n_rows)\n", "\n", " df = pd.DataFrame({\n", " 'participant_id': participant_ids,\n", " 'trial_index': trial_indices,\n", " 'stimulus': stimulus_sequence,\n", " 'response': responses,\n", " 'response_time': response_times\n", " })\n", "\n", " # mark matchig stimuli\n", " _nback_stim = df['stimulus'].shift(N)\n", " df['expected_response'] = (df['stimulus'] == _nback_stim).map({True: 'match', False: 'non-match'})\n", "\n", " df['is_correct'] = (df['response'] == df['expected_response'])\n", "\n", " # we don't care about burn-in trials (trial < N)\n", " df.loc[df['trial_index'] <= N, 'is_correct'] = True\n", " df.loc[df['trial_index'] <= N, ['response', 'response_time', 'expected_response']] = None\n", "\n", " return df\n", "\n", "\n", "# ========\n", "# now generate the actual data with the provided function and plot some of its features\n", "mock_nback_data = generate_mock_nback_dataset()\n", "mock_nback_data['is_correct'] = mock_nback_data['is_correct'].astype(int)\n", "\n", "sns.displot(data=mock_nback_data, x='response_time')\n", "plt.suptitle('response time distribution of the mock N-back dataset', y=1.01)\n", "plt.show()\n", "\n", "sns.displot(data=mock_nback_data, x='is_correct')\n", "plt.suptitle('Accuracy distribution of the mock N-back dataset', y=1.06)\n", "plt.show()\n", "\n", "sns.barplot(data=mock_nback_data, y='is_correct', x='participant_id')\n", "plt.suptitle('Accuracy distribution of the mock N-back dataset', y=1.06)\n", "plt.show()\n", "\n", "mock_nback_data.head()" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "## Implementation scheme\n" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "### Environment\n", "\n", "The following cell implments N-back envinronment, that we later use to train a RL agent on human data. It is capable of performing two kinds of simulation:\n", "- rewards the agent once the action was correct (i.e., a normative model of the environment).\n", "- receives human data (or mock data if you prefer), and returns what participants performed as the observation. This is more useful for preference-based RL." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [], "source": [ "class NBack(dm_env.Environment):\n", "\n", " ACTIONS = ['match', 'non-match']\n", "\n", " def __init__(self,\n", " N=2,\n", " episode_steps=32,\n", " stimuli_choices=list('ABCDEF'),\n", " human_data=None,\n", " seed=1,\n", " ):\n", " \"\"\"\n", " Args:\n", " N: Number of steps to look back for the matched stimuli. Defaults to 2 (as in 2-back).\n", " episode_steps\n", " stimuli_choices\n", " human_data\n", " seed\n", "\n", " \"\"\"\n", " self.N = N\n", " self.episode_steps = episode_steps\n", " self.stimuli_choices = stimuli_choices\n", " self.stimuli = np.empty(shape=episode_steps) # will be filled in the `reset()`\n", "\n", " self._reset_next_step = True\n", "\n", " # whether mimic humans or reward the agent once it responds optimally.\n", " if human_data is None:\n", " self._imitate_human = False\n", " self.human_data = None\n", " self.human_subject_data = None\n", " else:\n", " self._imitate_human = True\n", " self.human_data = human_data\n", " self.human_subject_data = None\n", "\n", " self._action_history = []\n", "\n", " def reset(self):\n", " self._reset_next_step = False\n", " self._current_step = 0\n", " self._action_history.clear()\n", "\n", " # generate a random sequence instead of relying on human data\n", " if self.human_data is None:\n", " # self.stimuli = np.random.choice(self.stimuli_choices, self.episode_steps)\n", " # FIXME This is a fix for acme & reverb issue with string observation. Agent should be able to handle strings\n", " self.stimuli = np.random.choice(len(self.stimuli_choices), self.episode_steps).astype(np.float32)\n", " else:\n", " # randomly choose a subject from the human data and follow her trials and responses.\n", " # FIXME should we always use one specific human subject or randomly select one in each episode?\n", " self.human_subject_data = self.human_data.query('participant_id == participant_id.sample().iloc[0]',\n", " engine='python').sort_values('trial_index')\n", " self.stimuli = self.human_subject_data['stimulus'].to_list()\n", " self.stimuli = np.array([ord(s) - ord('A') + 1 for s in self.stimuli]).astype(np.float32)\n", "\n", " return dm_env.restart(self._observation())\n", "\n", "\n", " def _episode_return(self):\n", " if self._imitate_human:\n", " return np.mean(self.human_subject_data['response'] == self._action_history)\n", " else:\n", " return 0.0\n", "\n", " def step(self, action: int):\n", " if self._reset_next_step:\n", " return self.reset()\n", "\n", " agent_action = NBack.ACTIONS[action]\n", "\n", " if self._imitate_human:\n", " # if it was the same action as the human subject, then reward the agent\n", " human_action = self.human_subject_data['response'].iloc[self._current_step]\n", " step_reward = 0. if (agent_action == human_action) else -1.\n", " else:\n", " # assume the agent is rationale and doesn't want to reproduce human, reward once the response it correct\n", " expected_action = 'match' if (self.stimuli[self._current_step] == self.stimuli[self._current_step - self.N]) else 'non-match'\n", " step_reward = 0. if (agent_action == expected_action) else -1.\n", "\n", " self._action_history.append(agent_action)\n", "\n", " self._current_step += 1\n", "\n", " # Check for termination.\n", " if self._current_step == self.stimuli.shape[0]:\n", " self._reset_next_step = True\n", " # we are using the mean of total time step rewards as the episode return\n", " return dm_env.termination(reward=self._episode_return(),\n", " observation=self._observation())\n", " else:\n", " return dm_env.transition(reward=step_reward,\n", " observation=self._observation())\n", "\n", " def observation_spec(self):\n", " return dm_env.specs.BoundedArray(\n", " shape=self.stimuli.shape,\n", " dtype=self.stimuli.dtype,\n", " name='nback_stimuli', minimum=0, maximum=len(self.stimuli_choices) + 1)\n", "\n", " def action_spec(self):\n", " return dm_env.specs.DiscreteArray(\n", " num_values=len(NBack.ACTIONS),\n", " dtype=np.int32,\n", " name='action')\n", "\n", " def _observation(self):\n", "\n", " # agent observes only the current trial\n", " # obs = self.stimuli[self._current_step - 1]\n", "\n", " # agents observe stimuli up to the current trial\n", " obs = self.stimuli[:self._current_step+1].copy()\n", " obs = np.pad(obs,(0, len(self.stimuli) - len(obs)))\n", "\n", " return obs\n", "\n", " def plot_state(self):\n", " \"\"\"Display current state of the environment.\n", "\n", " Note: `M` mean `match`, and `.` is a `non-match`.\n", " \"\"\"\n", " stimuli = self.stimuli[:self._current_step - 1]\n", " actions = ['M' if a=='match' else '.' for a in self._action_history[:self._current_step - 1]]\n", " return HTML(\n", " f'Environment ({self.N}-back):
'\n", " f'
Stimuli: {\"\".join(map(str,map(int,stimuli)))}
'\n", " f'
Actions: {\"\".join(actions)}
'\n", " )\n", "\n", " @staticmethod\n", " def create_environment():\n", " \"\"\"Utility function to create a N-back environment and its spec.\"\"\"\n", "\n", " # Make sure the environment outputs single-precision floats.\n", " environment = wrappers.SinglePrecisionWrapper(NBack())\n", "\n", " # Grab the spec of the environment.\n", " environment_spec = specs.make_environment_spec(environment)\n", "\n", " return environment, environment_spec" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "### Define a random agent\n", "\n", "For more information you can refer to NMA-DL W3D2 Basic Reinforcement learning." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [], "source": [ "class RandomAgent(acme.Actor):\n", "\n", " def __init__(self, environment_spec):\n", " \"\"\"Gets the number of available actions from the environment spec.\"\"\"\n", " self._num_actions = environment_spec.actions.num_values\n", "\n", " def select_action(self, observation):\n", " \"\"\"Selects an action uniformly at random.\"\"\"\n", " action = np.random.randint(self._num_actions)\n", " return action\n", "\n", " def observe_first(self, timestep):\n", " \"\"\"Does not record as the RandomAgent has no use for data.\"\"\"\n", " pass\n", "\n", " def observe(self, action, next_timestep):\n", " \"\"\"Does not record as the RandomAgent has no use for data.\"\"\"\n", " pass\n", "\n", " def update(self):\n", " \"\"\"Does not update as the RandomAgent does not learn from data.\"\"\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "### Initialize the environment and the agent" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "actions:\n", " DiscreteArray(shape=(), dtype=int32, name=action, minimum=0, maximum=1, num_values=2)\n", "observations:\n", " BoundedArray(shape=(32,), dtype=dtype('float32'), name='nback_stimuli', minimum=0.0, maximum=7.0)\n", "rewards:\n", " Array(shape=(), dtype=dtype('float32'), name='reward')\n" ] } ], "source": [ "env, env_spec = NBack.create_environment()\n", "agent = RandomAgent(env_spec)\n", "\n", "print('actions:\\n', env_spec.actions)\n", "print('observations:\\n', env_spec.observations)\n", "print('rewards:\\n', env_spec.rewards)" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "### Run the loop" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkoAAAG5CAYAAABxzRuzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2QElEQVR4nO3deXwTdf4/8NckbdIzvSlHC/SAUspRrkKt3CKHt6Ki+1MQxO5adcVjd3V1lcXdZVl1F+G7CyIIsiiyiiDI6Vk55L7kpgfQlt5tkl5Jmszvj9BI6d0knUnzej4ePrCTmcl73kkm73zmM5+PIIqiCCIiIiJqQCF1AERERERyxUKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIia4CF1AJ2BKIqwWNxvgHOFQnDL474Z8/AL5sKKebBiHn7BXFjJKQ8KhQBBEFpcj4WSA1gsIkpLK6UOo0N5eCgQFOQLna4KtbUWqcORDPPwC+bCinmwYh5+wVxYyS0PwcG+UCpbLpR46Y2IiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCbIrlDIyMvDEE08gMTERKSkpWLRoEYxGY4vbrVu3DqmpqRg1ahTi4uKwY8eOJtf9/vvvMWPGDCQmJmLEiBF47LHHkJ+f78jDICIiok7AQ+oAbqTVajFz5kz07t0bS5YsQUFBARYuXIiamhr86U9/anbbzZs3AwDGjh2LTZs2NbveH//4R8yePRvPP/88KisrcfjwYRgMBkceChGR0ygUAhQKQeowGrBYRFgsotRhEDmUrAql9evXo7KyEkuXLkVgYCAAwGw2Y/78+UhNTUV4eHiz2yoUCuTk5DRZKJWXl+PPf/4zXn31VTz66KO25RMnTnTkYRAROY1CISAoyFe2hVJZWSWLJepUZFUopaenIzk52VYkAcDUqVPxxhtvYO/evbj//vub3FahaPkq4vbt22GxWDB9+nRHhEtE1OHqWpO+PXQZ5Xr5tIQH+qsxYUQvKBQCCyXqVGRVKGVmZuKBBx6ot0yj0SAsLAyZmZl27//EiROIiorCpk2b8J///AcFBQXo06cPXnjhBYwdO9bu/RMRdZRyvQEl5dVSh0HU6cmqUNLpdNBoNA2WBwQEQKvV2r3/oqIiZGVlYfHixXj55ZcRFhaGdevW4emnn8amTZvQp0+fdu/bw0N2/eKdSqlU1PvXXTEPv2AurJydh7r9KgR59VNSCNZYbj5+d38/AMxFHVfNg6wKJWcTRRFVVVV4++23bf2SkpKSMHnyZKxYsQKLFi1q137r+gy4I43GW+oQZIF5+AVzYeXsPKjVHvD2Vjn1OdpCrbZ+ndx83Hw//IK5sHK1PMiqUNJoNNDr9Q2Wa7VaBAQEOGT/ADBq1CjbMk9PT4wYMQIXL15s934tFhE6XZXd8bkSpVIBjcYbOl01zGaL1OFIhnn4BXNh5ew81O3fYKhFdXXLQ6d0FB+VEgBsx833wy+YCyu55UGj8W5V65asCqXo6OgGfZH0ej2KiooQHR1t9/5jY2ObfMze4QFqa6V/0aVgNlvc9thvxDz8grmwcnYeLKK8bsW3iNZYbj5uvh9+wVxYuVoeZHWhcMyYMdi3bx90Op1t2Y4dO6BQKJCSkmL3/sePHw8A2L9/v22Z0WjEoUOHkJCQYPf+iYiIqHORVYvSjBkzsHbtWqSlpSE1NRUFBQVYtGgRZsyYUW8MpZkzZyIvLw+7d++2LTt16hRyc3NRWloKwHqHGwAEBwcjKSkJAJCQkIDJkyfj9ddfR3l5OcLCwvDxxx+juLgYc+bM6cAjJSIiIlcgq0IpICAAa9aswYIFC5CWlgZfX19Mnz4d8+bNq7eexWKB2Wyut2zdunX44osvbH+vWrUKgLWz9tq1a23LFy5ciHfffRfvvPMOKioqkJCQgA8//BBxcXFOPDIiIiJyRYIoivK5yO2izGYLSksrpQ6jQ3l4KBAU5IuyskqXutbsaMzDL5gLK2fnoW7/G7+9IKtxlEICvXH/hL624+b74RfMhZXc8hAc7Nuqztyy6qNEREREJCcslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkslIiIiIiawEKJiIiIqAkeUgdARB1LoRCgUAgO369Sqaj3b1tZLCIsFtGRIRER2Y2FEpEbUSgEBAX5OqVQqqPReLdrO4tFRFlZJYslIpIVFkpEbqSuNenbQ5dRrjc4dt+CALXaAwZDLSxi24qdQH81JozoBYVCYKFERLLCQonIDZXrDSgpr3boPhUKAd7eKlRXG1nsEFGnwc7cRERERE1goURERETUBBZKRERERE1goURERETUBBZKRERERE1goURERETUBNkVShkZGXjiiSeQmJiIlJQULFq0CEajscXt1q1bh9TUVIwaNQpxcXHYsWNHs+tbLBbcf//9rVqXiIiI3JOsCiWtVouZM2fCZDJhyZIlmDdvHjZs2ICFCxe2uO3mzZtRVlaGsWPHtuq51q9fj4KCAntDJiIiok5MVgNOrl+/HpWVlVi6dCkCAwMBAGazGfPnz0dqairCw8Ob3VahUCAnJwebNm1q9nlKS0uxePFi/O53v8Orr77qwCMgIiKizkRWLUrp6elITk62FUkAMHXqVFgsFuzdu7fZbRWK1h/Ku+++i5EjR2LkyJHtDZWIiIjcgKxalDIzM/HAAw/UW6bRaBAWFobMzEyHPMfJkyexdetWbN261SH7q+PhIaua0+nsnSm+s3C1PNTFqRAEh0+MW7e/9uxXIVi3cZU8NsfZ7wlnvob2uPk1dLXPhjMxF1aumgdZFUo6nQ4ajabB8oCAAGi1Wrv3b7FYMH/+fDzxxBOIiIhATk6O3fsEfpmR3R21d6b4zsbV8qBWe8DbW+WkfXu2YxvrqcjV8tgcZx+LM1/D9mjqNexMr6m9mAsrV8uDrAolZ/vf//6H4uJiPPXUUw7dr8UiQqercug+5U6pVECj8YZOVw2z2SJ1OJJxtTzUxWsw1KK6uuW7SdtCoRCgVnvCYDC1eVJcH5USAFwmj81x9nvCma+hPW5+DV3ts+FMzIWV3PKg0Xi3qnVLVoWSRqOBXq9vsFyr1SIgIMCufVdWVuLdd9/FvHnzYDKZYDKZUFFRAQCoqalBRUUF/Pz82r3/2lrpX3QpmM0Wtz32G7laHiyi2OZiptX7trR93xbRur6r5bE5zj4WZ76G7dHUa9iZXlN7MRdWrpYHWRVK0dHRDfoi6fV6FBUVITo62q59l5WVoby8HG+88QbeeOONeo/9/ve/R2hoaIsdxomITLUWXCuphK7KiKqaWgT6qREW6I1APxUEQT59hojIMWRVKI0ZMwbLli2r11dpx44dUCgUSElJsWvfYWFh+Oijj+otKy4uxgsvvIBnn30Wt9xyi137J6LOq9ZswcGzBTh8rghnLpfCaGr4azhE44VRCeEYPbi72/ZZJOqMZFUozZgxA2vXrkVaWhpSU1NRUFCARYsWYcaMGfXGUJo5cyby8vKwe/du27JTp04hNzcXpaWlAIATJ04AAIKDg5GUlAS1Wt1gOIC6ztyxsbEYOnSosw+PiFyM2WJB+vE8bPvpMkp0BttyXy8PBPmr4a32QHmFASVaA0p0Nfhq/2Vs238Zt4/qhTtH9YSvV9s7thORvMiqUAoICMCaNWuwYMECpKWlwdfXF9OnT8e8efPqrWexWGA2m+stW7duHb744gvb36tWrQIAJCUlYe3atc4Pnog6lZyiCny47Syyrln7TWp8VRg/pAeG9AlFZBe/epfZjCYzTmSUYO+paziZUYKdP11G+rEczJzSD0nxTQ+US0TyJ4iiKJ/egC7KbLagtLRS6jA6lIeHAkFBvigrq3SpTnmO5mp5qIt347cXUFJe7dB9KxQCvL1VqK42trmTcUigN+6f0FcWeRRFEV8fycGGby/BbBHho/bAvaOjMGZwd6g8lS1un3lNh/XfXMSlHOuQJrePiMT0cTHwcNDYMc58De1x82voap8NZ2IurOSWh+BgX9e7642ISEqmWgv+u+s8fjx5DQCQGBuKxybHIchf3ep99I0MxNvPjcEHm05h675s7Dp0FddKqvDM/QPg6dFyoUVE8uJaw2MSETlJtaEW/9xwHD+evAZBAB6eEItnHxjYpiKpjlKpwEMTYpF230CoPBQ4lVmCxZ+dhMFkbnljIpIVFkpE5Paqakx499PjOHelHN5qJeY9OBiTk3rafbv/sLgwzHtoMNSeSpzJLsN7n52ESQaXHIio9VgoEZFbq6qpxT/WH0dGng6+Xh54acYQDIgOcdj+43oG4cWHE+GlUuLs5TJ8uO0s2DWUyHWwUCIit2WqNWPJ5ydxOV8Pfx9P/O7RoYjq1nC+SXvFRgTg6fsGQKkQ8NOZAmxMd8wk30TkfCyUiMgtWSwiln95BuevlsNLpcQLDyUiskv7pzFqyYCoEMyc0g8A8NX+y/jpdL7TnouIHIeFEhG5pQ3fXcLRC0XwUAp47oFB6NXV3+nPeeugbrgjuRcAYPWOc8gprHD6cxKRfVgoEZHb+fFEHnYdugoAmHtXAvr1Cuqw575vdDQSegfBaLJg6RenUFVT22HPTURtx0KJiNzKpRwtPtp5HgBwd0pvjOjXpUOfX6EQ8NTdCQjRqFFYVo21u8536PMTUduwUCIit6GrMuLfm07BbBExLC4Md98aJUkc/j4q/PqeAVAIAg6cKWB/JSIZY6FERG7BIopYseUMyiuM6Brsg9nT4qGwc5wke8T0CMBdKb0BAGt3XUCxVj7TkRDRL1goEZFb+Gr/ZZzOKoXKQ4Gn7xsAb7X0MzjdeUsvxHTXoNpQi5Vbz7Z5jjwicj4WSkTU6WVd02Hzj1kAgF/d3hcRYc4bBqAtlAoF5t7VH2pPJc5fLcfOg1ekDomIbsJCiYg6NaPJjBVbzsAiikiK74LRg7pLHVI9XYJ88OhtfQAAG9MzcTlfL3FERHQjFkpE1Kl99kMG8kurEOCnwv+7PU7qcBp166BuGNo3DGaLiPe3nIaplpPnEskFCyUi6rTOZpfi68M5AIDZ0+Lh5+0pcUSNEwQBM6fEIcBXhWslVfji+mVCIpIeCyUi6pSqamqxcttZAMC4IT0w0IET3TqDv48Kj0+xtnjtPHgFl3K1EkdERAALJSLqpD75+gJKdQZ0CfTGQ+NjpA6nVYb0CUNyQleIIrDyq7MwmngJjkhqLJSIqNM5drEIe3/OhyAAc+6Mh5dK+qEAWuvRSX0Q4KdCQWkVvvgxU+pwiNweCyUi6lSqDbX4764LAIDJST3RJyJQ2oDayNfLE7Om9AMA7Dp4FRdzyqUNiMjNsVAiok5l854slOkNCA3wwj0STVFir8GxoUgZ2BUirJfgDLwERyQZFkpE1Glcztdj9+GrAID/d3sc1J5KiSNqv0cm9kGQv3Xi3I0/8BIckVRYKBFRp2CxiPho5zmIIjCiXxcMipH3XW4t8fHyxMzrl+C+PnwVF66WSxsQkZtioUREncJ3x3KRdU0Pb7USj1wf6drVDYoJwehB3SACWPXVWRiMvARH1NFYKBGRyyvTG/D5DxkAgAfGxiDQTy1xRI7z8IQ+CNaoUVhejc+uHyMRdRwWSkTk8j755iJqjGZEddNgXGIPqcNxKB8vD8yaar0E982RHJzNLpU4IiL3wkKJiFzayYxiHD5XCMX1aUAUCkHqkBxuQFQIxiZaJ/P9YOtZVBtqJY6IyH2wUCIil2UwmW1jJk0aEYGe4f4SR+Q8D42PRYhGjaLyaqzeelrqcIjcBgslInJZX+7NQrG2BsEatcuOmdRa3moPzJoWDwDYti8becWVEkdE5B5YKBGRS8oprMCug9Yxk341qa9LTVPSXgm9gzFhWAQAYO/Ja6ittUgcEVHnJ7tCKSMjA0888QQSExORkpKCRYsWwWg0trjdunXrkJqailGjRiEuLg47duxosM6+ffswb948TJgwAYMHD8a0adPwwQcfwGQyOeNQiMhJLKKINTvPwWwRMbRvGIb0CZM6pA4zY2IsugT7oKLahNPs2E3kdLIqlLRaLWbOnAmTyYQlS5Zg3rx52LBhAxYuXNjitps3b0ZZWRnGjh3b5Drr169HZWUlnnvuObz//vu49957sWTJEvzpT39y5GEQkZOln8hDRq4OapUSj3aSMZNay0vlgd8+nAgAuFxQgcKyKmkDIurkZNVWXVfILF26FIGBgQAAs9mM+fPnIzU1FeHh4c1uq1AokJOTg02bNjW6zptvvong4GDb3yNHjoTFYsG//vUvvPzyy/UeIyJ50lYa8dl31vGE7hsdjWCNl8QRdbxBsWGI7x2Es9llOHaxGOMSe0Ctct3pWojkTFYtSunp6UhOTrYVSQAwdepUWCwW7N27t9ltFYqWD6WxQig+Ph6iKKKoqKjN8RJRx/v0m4uoMtSiV7g/Jg7rXGMmtcXwfl3g7+MJg8mC45eKIYqi1CERdUqyKpQyMzMRHR1db5lGo0FYWBgyM50zKeTRo0ehUqkQERHhlP0TkeOczirFT2cKIAjA41PioGzFD6TOykOpwNC+YVAIQEFZNbLz9VKHRNQpyerSm06ng0ajabA8ICAAWq3W4c+XnZ2Njz76CDNmzICvr69d+/LwcK8TtlKpqPevu3K1PNTFqRAEhw/MWLe/9uxXIVi3aS6PRpMZ/911HgBw2/BI9IkMbHuQHcDZ74kbX8MgfzUSooJxKrMUp7PLEBboDY2vyinP25KbX0NX+2w4E3Nh5ap5kFWh1JEqKirw7LPPIiIiAvPmzbNrXwqFgKAg+wotV6XReEsdgiy4Wh7Uag94ezvnC1Wt9mzHNtZTUXN5/O/2sygoq0awxgtP3jsQPl5tf56O5Oz3RN1rmBATimKtAddKKnH0QjFuH9lTki+ipl5DV/tsOBNzYeVqeZBVoaTRaKDXN2w+1mq1CAgIcNjzGI1GpKWlQavV4tNPP4WPj49d+7NYROh07nXniVKpgEbjDZ2uGmaz+47l4mp5qIvXYKhFdXXLw260hUIhQK32hMFggsXStv4yPtc7IjeVx5yiCnz27UUAwK8m9YGh2giDg+N3FGe/Jxp7DQfHBqNEV43yCgOOnC3AwJgQhz9vS25+DV3ts+FMzIWV3PKg0Xi36keFrAql6OjoBn2R9Ho9ioqKGvRdai+LxYKXXnoJp0+fxrp169CtWzeH7NddB34zmy1ue+w3crU8WESxzcVMq/dtafu+Ldc7IjeWR4soYtXWszBbRCTGhiIxNtQlcu3s98SNr6HKQ4nE2FAcPFuIjDwdQgO8EB5s3w/A9sQDNDxuV/tsOBNzYeVqeZDVhcIxY8Zg37590Ol0tmU7duyAQqFASkqKQ55j/vz5+O677/Dvf/8bcXFxDtknETnPD8dycSlXC7VKif93e18IQueb9NYRugb7IKqbda67YxeLUWPkxLlEjiCrFqUZM2Zg7dq1SEtLQ2pqKgoKCrBo0SLMmDGj3hhKM2fORF5eHnbv3m1bdurUKeTm5qK01DpS7YkTJwBYhwRISkoCACxbtgzr16/HnDlzoFKpcPz4cdv2sbGx8PPz64CjJKLWKtMb8NkP1jGTHhjjnmMmtUX/3kEo0dVAV2nC0QvFSE4IZ2FJZCdZFUoBAQFYs2YNFixYgLS0NPj6+mL69OkNOltbLBaYzeZ6y9atW4cvvvjC9veqVasAAElJSVi7di0A2MZiWrlyJVauXFlv+48++ggjR450+DERUft9vPsCqg1mRHfXYMJQDuHREqVCgeF9u+CHE3ko1tbgUq4WfSICpQ6LyKXJqlACgJiYGKxevbrZdeoKnxstXLiwxalOGtuOiOTp6IUiHLlQBKVCwMwp/Rw+nEFn5efjiYHRwTh+qQTnLpcjJMALwf5siSNqL1n1USIiAoBqQy3W7b4AAJgysiciu/CyeFtEdvFDj1BfiACOni+Gqdbc4jZE1DgWSkQkO59+exFlegO6BHrjrlt6Sx2OyxEEAYNiQuCj9kCVoRYnMko4xQlRO7FQIiJZOZVZgvQT1wAAT0zrB5UnJ3ttD08PBYbFhUEQgLziKlwprJA6JCKXxEKJiGSjssaE1dvPAQBuGx6BuJ5BEkfk2oL81eh3PYc/Z5ZCXyXPQTqJ5IyFEhHJxse7LlgvuQV544GxMVKH0ynE9tAgLNALZouII+eLYLa4zkB/RHLAQomIZOHgmXz8ePIaBABz7oiHmpfcHEIQBAzpEwqVpwK6KhPOZJdJHRKRS2GhRESSMxjN+L//HQcA3J4UybF/HMxL5YGhfUIBAFnX9Mgvca+5KYnswUKJiCT30+l8lOoM6Bbig/tGO2ZeR6qvS5APYrprAADHL3GKE6LWYqFERJK6WliBzDwdFAIw964E3uXmRPG9gqDxVcFYa8FJDhlA1CoslIhIMpU1JpzKLAEAzLi9H2IjAiSOqHNTKAQM7RMKhQDkl1bjKocMIGoRCyUikoTFIuLo+SLUmkWEB3njoYl9pA7JLWh8VbZhF37OKkW1gZfgiJrDQomIJHH+ajnKKozwUAoYk9gDSiVPRx0ltocGQf5q1JpFXoIjagHPTETU4Yq1NbiYowUADI4NhZ+Pp8QRuRdBEDA4NgSCABSUVSOPd8ERNYmFEhF1KKPJjKMXigAAPa9P3kodT+OjQt/rwzCcyiyB0cSJc4kaw0KJiDqMKIo4cqEINUYzfL08MCA6WOqQ3FpsRAD8vT1hNFlw9jIHoiRqDAslIuow566Uo6i8BkqFgOH9usCD/ZIkpVQIGBQbAgC4XFCBcr1B4oiI5IdnKSLqEHkllTf0SwpBgK9K4ogIAEI0XogIs17+PJnJjt1EN2OhREROp68y4tiFYgBAdHcNIsL8JI6IbtS/dxA8lALKK4y4wrGViOphoURETmWqteDQuUKYLSJCNF7o3ztI6pDoJl4qD8RFBgIAzl0uQ22tRdqAiGSEhRIROY0oijh2sQgV1bXwUikxPC4MCkGQOixqRFQ3DXy9PGAwWXApTyt1OESywUKJiJzmYo4W+aXVUAjAiH5doFZxHje5UigExPeytvZl5OpQwxG7iQCwUCIiJykoq8K5K+UAgIExIQjyV0sbELWoW4gPgvzVMFtEnLtaLnU4RLLAQomIHK6y2oSj562dt3uF+6FXuL/EEVFrCIJg60N2paACFdUmiSMikh4LJSJyqFqztfO2yWxBkJ8KA6JDpA6J2iBE44XwIG8AwAW2KhGxUCIixxFFEccvFkNXZYLKU4Hh/bpAqWDnbVdTdwdcTlElKqrYqkTujYUSETnM+StlyCmqhCAAI+K6wFvtIXVI1A6B/mpbq9L5nHJpgyGSGAslInKIovJqHL8+2W1C72CEBHhJHBHZI65nIAAgl61K5Ob4c4+I7FZtqMWhc4UQRSAizBdR3TpP522FQoCiDZcPldfnr1M6aR47Z+33ZoF+1lalgrJqXMrVIrFPaIc8L5HcsFAiIruYLSIOnSuE0WRBoL8aiX1CIXSSQSUVCgFBQb5tKpTqaDTeTojoFwKcn+M+EQEoKKtGTlEF+vUMhBcvpZIb4rueiOxyKrME5RVGeHooMHpwdygFwGLpHBOr1rUmfXvoMsr1htZtIwhQqz1gMNTC4oQJZiPC/ZGU0A0dUYsGa7wQ7K9Gqd6AzGs69O8d7PwnJZIZFkpE1G6X8/W4UmCdRHV4vzD4+ahQXW2UOCrHK9cbUFJe3ap1FQoB3t7WPDijYAz069iBO2MjAnDwbCGy8/XoExEITw92bSX3Irt3fEZGBp544gkkJiYiJSUFixYtgtHY8ol33bp1SE1NxahRoxAXF4cdO3Y0ul5BQQGeffZZDBkyBElJSfjjH/+IigrOlk3UVuV6A05llgAA4nsFIjzIR+KIyBnCg7zh7+2JWrOIy/l6qcMh6nCyKpS0Wi1mzpwJk8mEJUuWYN68ediwYQMWLlzY4rabN29GWVkZxo4d2+Q6JpMJTz75JLKzs/HOO+/gzTffxJ49e/Diiy868jCIOj1jrRmHzxfBIgJdg70R2yNA6pDISQRBQEwPDQAgK18H0QmXE4nkTFaX3tavX4/KykosXboUgYGBAACz2Yz58+cjNTUV4eHhzW6rUCiQk5ODTZs2NbrOzp07cfHiRWzbtg3R0dEAAI1Ggzlz5uDkyZMYNGiQow+JqNMRRRHHLhSjylALH7UHhnSiztvUuB6hvjiTXYZqgxn5pVXoFuIrdUhEHUZWLUrp6elITk62FUkAMHXqVFgsFuzdu7fZbRWKlg8lPT0dcXFxtiIJAFJSUhAYGIgffvih3XETuZNLuToUlFVDIVj7JXl6KKUOiZxMqVSgV1frkA9Z13j5jdyLrFqUMjMz8cADD9RbptFoEBYWhszMTIfs/8YiCbA2K0dFRdm9fw836+Do7LFiXIWr5aEuToXQtrGB6hRrq3HuchkAYFBMCII1vwwqWbe/9uxXcb1FSm55bE++7MlDa9S13ikUznuOxkR11+BSjhbF2hroq00I8FXVe/zm19DVPhvOxFxYuWoeZFUo6XQ6aDSaBssDAgKg1Wodsn9//4YD4dm7/7qxVtyRs8eKcRWulge12gPe3qqWV7xBtaEWR84XQQTQu5sG/aJCGr3kplZ7tiseQL55bE++2pOH1lCprC14np5tj8ke3t4qRIT742qB9U7HpISu9R5v6jWU62sqBebCytXyIKtCyVVZLCJ0uiqpw+hQSqUCGo03dLpqmM0WqcORjKvloS5eg6G2Tbfxi6KIn04XoNpghr+PJwZEBaGmpv60FgqFALXaEwaDqc23xftc//KXWx7bky978tAaRqMZAGAyte01dIRe4X64WqBH9jUd+vWsP1TAza+hq302nIm5sJJbHjQa71a1bsmqUNJoNNDrG17/1mq1CAiw/64ajUbT6FAAWq0W3bp1s2vftbXSv+hSMJstbnvsN3K1PFhEsU1f4tn5elu/pGF9w6AQhCa3t1jatu+6eAD55rGt+QLal4fWqLvrzGLp+IE9g/xU8PP2REW1CVcL9Ojd7ZcrAE29hnJ9TaXAXFi5Wh5kdaEwOjq6QV8hvV6PoqKiBn2LHLV/URSRlZXlkP0TdUYV1SaczioFAMT3CoLGt+Mu95C8CIKAXl39AADZBRUcKoDcgqwKpTFjxmDfvn3Q6XS2ZTt27IBCoUBKSopD9n/u3DlkZ2fblu3fvx/l5eXNjr9E5K4soohjF4thtogIDfBCdPeGfQjJvUSG+UEhALpKI7QVnW8UdqKb2VUoPfnkk9iyZQtqamocEsyMGTPg6+uLtLQ07NmzB59//jkWLVqEGTNm1BtDaebMmZg0aVK9bU+dOoUdO3YgPT0dAHDixAns2LEDBw8etK0zefJk9OnTB88++yy+++47bNu2Da+++irGjRvHMZSIGnEpR4syvQEeSqFTTXZL7afyVKJbqPXmlcsFHCqAOj+7+ihdvXoVL7/8Mnx8fDBp0iTcc889SE5ObvfJNCAgAGvWrMGCBQuQlpYGX19fTJ8+HfPmzau3nsVigdlsrrds3bp1+OKLL2x/r1q1CgCQlJSEtWvXAgA8PT3xwQcf4K233sILL7wADw8PTJo0Ca+++mq74iXqzMr1Bpy/Wg4AGBQdAh/OHE/X9Q73R25RJXKKKpEQFQwPF7vdm6gt7Drz7dy5EydPnsSXX36JHTt24Msvv0RoaCjuvPNO3H333YiPj2/zPmNiYrB69epm16krfG60cOHCVk11Eh4ejiVLlrQ5LiJ3YraIOHqxGKIIdA/xQY8w9xz+ghoXrFHD18sDlTW1uFZShcguflKHROQ0dv8MGDRoEF577TWkp6fj/fffx6hRo/Dpp5/i/vvvx5133okVK1YgPz/fEbESUQe5lKtFRbUJak8lBsU0Pl4SuS9BEGzF0dVCTipOnZvD2ksVCgVGjx6Nf/zjH/j+++8xefJkXLp0Ce+88w4mTJiAWbNm4fvvv3fU0xGRk1RUm3Dx+iW3AVHBUHlyihJqKOJ6K2OxtgbVhlqJoyFyHod2Ojh8+DC+/PJL7Ny5E1qtFn369MG9994LDw8PfP755/jNb36DX//61/jtb3/ryKclIgcRRRGnMktgEYGwQC90D/WROiSSKR8vT4Ro1CjRGZBTVIGI8IazHhB1BnYXSpcuXcKXX36JrVu34tq1awgJCcF9992He+65p14fpZkzZ+L111/Hxx9/zEKJSKbyiitRVF4DhQAMjOYlN2peZBc/lOgMuFpYiZEcU4k6KbsKpXvuuQcXLlyASqXCxIkT8cYbb2D06NFQKBq/ojdy5Ej873//s+cpichJTLVm/JxlnfC2T2Qg/LydM1cZdR7dQnxxMrMUFdUmlGgdM0wMkdzYVShpNBr8+c9/xtSpU+Hn1/JdDxMnTsQ333xjz1MSkZOcvVwOg8kMP28PxPawf8qg9pDbrOJyi0duPD0U6Bbsg9ziSlzKtX/iciI5sqtQ+vvf/47g4GB4eXk1+nhNTQ1KS0vRvXt3AIC3tzd69Ohhz1MSkROU6Q3IzrcOHjgoOgRKRcdecvNWe0AURdnOKi6AlyCbEtHFF7nFlcjM06FWBhOdEjmaXYXSxIkTsWjRItx1112NPv7tt9/ixRdfxNmzZ+15GiJyIlEU8fP1udwiwnwRGtjxxYraUwlBEPD94Sso1cnnEk5EuD+SErqBXbWaFhboDbWnAgajGUfPFaJPd3bqps7FrkKppQkRTSZTk/2ViEgerpVUoUxvgFIhoH+vIEljKdcbUFJeLWkMNwr0U0sdguwpBAE9wvyQmafDt4evos/d/aUOicih2lwoVVRU1Ju0try8HHl5eQ3W0+l02LZtG8LCwuyLkIicxmIRceaytQN3TA8NvDhNCbVDZBdroXTgdD7+36Q+UHPsLepE2nxWXL16Nf7v//4PgHV01r/+9a/461//2ui6oiji+eeftytAInKe7Hw9qmpqofZUStaBm1xfgK8KQf5qlOkNOHCmAGMGd5c6JCKHaXOhlJKSAh8fH4iiiH/84x+44447kJCQUG8dQRDg7e2NhIQEDBw40GHBEpHjGGvNtklv+/UM5MSmZJeYHgE4fK4Q+0/ns1CiTqXNhdKQIUMwZMgQAEB1dTUmTZqEuLg4hwdGRM518aoWploL/H08ERnOSU3JPlHdNTh8rhAXrpSjTG9AWJA872Akaiu7fkI+88wzLJKIXJC+yoisa9a+hv17B0HB27rITn7enojvHQwRwKFzhVKHQ+QwbWpRWrp0KQRBwG9+8xsoFAosXbq0xW0EQUBaWlq7AyQixztyvggWEQgN8EIXCYYDoM5pdGIPnM0uxaGzBZiW3EvqcIgcol2F0ty5c6FSqVgoEbmgjJxyZOVZW5MSegdxPjdymJTB3bFi0ylk5OlQVF6NoCBfqUMislubCqVz5841+zcRyd8nu84DAHqE+iKA4wSRAwVrvNCvVxDOXi7DwTMF6BsVKnVIRHbjbS5EbqRurBsBQN9IDgdAjjeyfzgA4MCZAokjIXIMhxdK1dXV+Oyzz/Dxxx8jNzfX0bsnIjt8kZ4BAIjuEQB/H5XE0VBnNCK+CxSCgOx8PfKKKqQOh8hudg3D++qrr+LkyZPYunUrAMBoNOKhhx7CxYsXAQD+/v5Ys2YN+vfnkPZEUsvI1eLEpRIoFAIG9wlFrcksdUjUCfn7qNC/dxB+zirFj8dzcfvwCKlDIrKLXS1KBw4cwKRJk2x/b926FRcvXsTbb7+NrVu3IjQ0tFUdvonI+TbtyQIATBgWiQBftiaR84yI7wIA+PE4ryqQ67OrUCouLkaPHj1sf3/99dcYMGAA7rzzTsTGxuKhhx7CyZMn7Q6SiOxz4Wo5TmeVQqkQ8PCkvlKHQ53c0L5hUCoEXM7XI4eX38jF2VUoeXt7Q6/XAwBqa2tx8OBB3HrrrbbHfX19bY8TkXQ2X29NGj24O7qG8JZtci5fL08MigkBABw4zU7d5NrsKpQSEhKwYcMGnDlzBsuWLUNlZSUmTJhge/zKlSsICQmxO0giar/zV8pw9nIZlAoBd6f0ljocchN1d7/9dKYAoihKHA1R+9nVmfv555/Hk08+iQceeACiKGLy5MkYNGiQ7fHdu3dj6NChdgdJRO23ZV82AGtrUihH4aYOMqRvGFQeChSUVuFKQQV6dfWXOiSidrGrUBo4cCC2b9+Oo0ePQqPRICkpyfaYTqfDo48+Wm8ZEXWs7HwdzmSXQSEImDayp9ThkBvxVntgWHw49p+6hsPnC1kokcuyexyl4OBg3HbbbQ0KIo1Gg5kzZyI+Pt7epyCidtpx4AoAIKl/F7YmUYcbPdh6s8+hs4W8/EYuy64WpToVFRXIy8uDTqdr9MMwYsQIRzwNEbVBYVmVbRb3KUlsTaKON6J/OFQeChSWV/PyG7ksuwqlsrIyLFiwALt27YLZ3HDwOlEUIQgCzp49a8/TEFE77Dx0FaIIDIgORs9wfkFRx/NSeyCxTygOni3EwbMFLJTIJdlVKL3++uv47rvv8Nhjj2H48OHQaDSOiouI7KCrNGLPyWsAgKkje0kcDbmzpP7hOHi2EIfOFWL6uBgIgiB1SERtYlehtHfvXsycORO/+93vHBUPMjIy8NZbb+HYsWPw9fXFPffcg+effx4qVfMjCYuiiBUrVuDjjz9GaWkp4uPj8corryAxMbHeeocPH8bixYtx7tw5KBQKDBw4EC+++CL7UlGn8vWRHJhqLYjq5o9+PQOlDofc2ODYUKg8FSjW1iA7X4+obvxBTa7Frs7cXl5e9UbmtpdWq8XMmTNhMpmwZMkSzJs3Dxs2bMDChQtb3HbFihV47733MGvWLCxfvhxhYWGYPXs2rl69alsnMzMTc+bMgY+PD9555x385S9/gVarxaxZs1BUVOSw4yCSUo2xFt8dzQFgbU3iL3iSktpTicTYUADWTt1ErsauQunuu+/G119/7ahYsH79elRWVmLp0qUYPXo0pk+fjpdffhnr169HQUHTo7saDAYsX74cs2fPxqxZs5CcnIx3330XgYGBWLlypW29r7/+GqIoYvHixRgzZgxuu+02vPvuuygvL8fevXsddhxEUko/cQ2VNbUID/LG0L5hUodDhBH9rHO/HTrHwSfJ9dhVKE2ePBlarRZz5szBrl27cPLkSZw+fbrBf62Vnp6O5ORkBAYG2pZNnToVFoul2ULm6NGjqKiowNSpU23LVCoVJk2ahPT0dNsyk8kElUoFtVptW+bvz86F1HnUmi3Ydcg6JMDkkT2hULA1iaQ3MDoEak8lSnQGZF7TSR0OUZvY1Ufp0Ucftf3/vn37Gjze1rveMjMz8cADD9RbptFoEBYWhszMzGa3A4Do6Oh6y2NiYrBmzRrU1NTAy8sLd9xxBz744AP861//wqxZs2A0GvHuu++iW7dumDhxYqtiJJKzg2cLUKozQOOrQsqArlKHQwQAUHkqkdgnFAfOFODQ2ULEdA+QOiSiVrOrUPrb3/7mqDgAWEfzbuzOuYCAAGi12ma3u7mlCLAWWaIoQqvVwsvLC71798bq1avx9NNPY9myZQCAHj164MMPP7S7ZcnDw+6xO12KUqmo96+7klMeRFG0DTA5OSkS3l6eDdapi1MhCA5vbarbX3v2W9ePSqFo3/bO0p647MmDs2LqCIrrcd38maj7d1RCOA6cKcDh84V49Pa+tvXdgZzOE1Jy1TzYVSjdd999joqjQ2RlZeHZZ59FSkoK7r33XhgMBqxatQpz587F+vXrERoa2q79KhQCgoLcc0Z2jYajPQPyyMOhM/nIKaqEt1qJ+yfGwc+7YaFUR632gLd383eStpda3fTzNkWlUgIAPD2dF1d72BNXe/LQGnLNlVpt/Tq5+bNQ9/eYYT3x/penUaozoEhnRL/ewR0eo9TkcJ6QA1fLg0NG5gaAwsJClJaWomfPnvDx8WnXPjQaDfR6fYPlWq0WAQFNN9VqNBoYjUYYDIZ6rUo6nQ6CINi2/ec//4nQ0FAsWrTItk5SUhLGjx+Pjz76CC+88EK74rZYROh0Ve3a1lUplQpoNN7Q6aphNlukDkcycsrDp7vPAwDGDekBU40RZTXGBuvUxWsw1KK6uuHj9lAoBKjVnjAYTLBY2tZh12i0DlhrMjk+Lnu0Jy578uCsmDqCz/UCru6z0NhnY0ifMOz7OR9fH8hGeIC6ud11KnI6T0hJbnnQaLxb1bpld6H09ddf4+2338bly5cBAKtWrUJycjJKS0sxe/ZspKWlYdKkSa3aV3R0dIO+SHq9HkVFRQ36H928HWBtMerXr59teWZmJrp37w4vLy8AwKVLlxqMq+Tr64uePXviypUrrYqxKbW10r/oUjCbLW577DeSOg8ZuVqcv1IOpULAbcMiW4zFIopO+RIHrD8c2rrvujuhLBY4La72sCeu9uTB2TE5k+V6XDd/Fm78e1ictVA6eLYQD46PdavLb4D05wm5cLU82HWh8Ntvv8Wzzz6LoKAgpKWl1bvtMzg4GOHh4di4cWOr9zdmzBjs27cPOt0vd0Xs2LEDCoUCKSkpTW43dOhQ+Pn5Yfv27bZlJpMJu3btwpgxY2zLunfvjrNnz9aLs6KiApcvX3boeFBEHW379b5JyQldEeTvPr/UybUMiAqBt1qJMr0Bl3Ka7ndKJCd2FUr/93//h+HDh+OTTz7Br371qwaPJyYmtmmetxkzZsDX1xdpaWnYs2cPPv/8cyxatAgzZsxAeHi4bb2ZM2fWa6VSq9VITU3FqlWrsGbNGuzfvx8vvvgiysvLMWfOnHr7P3PmDF566SWkp6fj66+/xlNPPQWj0YgHH3ywnVkgkta1kkocu2AdMHXKSE5+S/Ll6aHAkD7Wsb3qJmwmkju7Lr1dvHgRf/jDH5p8PDQ0FCUlJa3eX0BAANasWYMFCxYgLS0Nvr6+mD59OubNm1dvPYvF0mAS3rlz50IURaxatco2hcnKlSsRGRlpW+e2227Dv/71L6xcuRLz5s2Dp6cn+vfvj48++gi9e/dudZxEcrLjwBWIABJjQ9E91D1vKiDXMaJfF+z7OR+HzxfikYl9ZHXnHlFj7CqUvL29UV1d3eTjV69erTd4ZGvExMRg9erVza6zdu3aBssEQUBqaipSU1Ob3Xbq1Kn1BqYkcmVlegP2n84HAEwbxclvSf4SooLhrfaAtsKIiznliOsZJHVIRM2y69LbyJEjsWnTJtTW1jZ4rKioCBs2bMCtt95qz1MQUTO+PnwVtWYRsREBiI3gIH4kfx5KBYb2vT73Gy+/kQuwq1B6/vnnkZ+fj+nTp+PTTz+FIAjYs2cP/vnPf+Kuu+6CKIpIS0tzVKxEdIOqmlp8fzwXADBtJFuTyHWM6Gftc3r4fJGs7twjaoxdhVJ0dDQ+/vhjBAYGYvHixRBFEStXrsTy5cvRt29ffPzxx4iIiHBUrER0gx+O56LaYEb3UF8Mig2ROhyiVuvfOwi+Xh7QVRpx4Wq51OEQNcvucZT69OmD1atXQ6vV4vLlyxBFEZGRkQgOdr9RV4k6iqnWgl2HrwIApiT1dLvxaMi1eSgVGNI3DHtOXsOhc4Xo14v9lEi+2l0oGY1GbN68GXv37sWVK1dQWVkJX19f9OrVC6NHj8add94JlUo+w+sTdSb7T+dDW2FEkL8aoxLCW96ASGaS+nXBnpPXcOR8IR6d1AdKhWvN/0Xuo12F0vnz5/H0008jLy8PoijC398fPj4+KC0txZkzZ7Bjxw4sW7YM//nPfxATE+PomIncmuWGyW8nDY+Eh4tNMEkEAP16Xb/8VmXChSvliHfDud/INbT5DFtZWYnf/OY3KCkpwbx58/DDDz/g0KFD9f59/vnnUVhYiF//+teoqnKvOdCInO3YhWLkl1bBR+2BsYndpQ6HqF08lAoMi+PgkyR/bS6UNm7ciGvXrmH58uV46qmn6o2YDQDh4eFITU3Ff/7zH+Tk5OCLL75wWLBE7k4URWw/YJ1XcfzQHvBWO2xea6IONyL+l7vfzBbXmfuL3EubC6Xvv/8eKSkpGDlyZLPrJScn45ZbbsG3337b7uCIqL4LV8uRmaeDh1KB24ZHtrwBkYz16xkIP29PVFSbcCa7TOpwiBrV5kLpwoULSEpKatW6o0aNwoULF9ocFBE1rm7y21sHdkWAL2+WINemVCgwIr4LAOCn6yPME8lNmwslrVaLsLCwVq0bGhoKrZYzRBM5Qk5hBU5mlEAAMJmT31InkZzQFQBw9EIxDEZzC2sTdbw2F0pGoxEeHq3rF6FUKmEymdocFBE1VNeaNCwuDOFBPhJHQ+QYMd01CAv0gsFkxrFLRVKHQ9RAu3qC5ubm4vTp0y2ul5OT057dE9FNSrQ1OHi2AAAwlZPfUiciCAJG9u+Krfuy8dPpAozq31XqkIjqaVehtHjxYixevLjF9URRhMARg4nstuvQVZgtIvr1DERUN43U4RA5VHJCOLbuy8bPmaXQVRmh8WH/O5KPNhdKf/vb35wRBxE1oaLahPQTeQCAaWxNok6oW4gvenX1x+V8PQ6dLcTEYZwjlOSjzYXSfffd54w4iKgJ3x3NgcFkRmQXPyREcfRi6pyS+4fjcr4eP53JZ6FEssK5D4hkzGgy4+sj1r5+U0f25KVs6rSS+odDEICMXB0Ky6ulDofIhoUSkYztOXUN+ioTQgO8bOPNEHVGgX5q9O8VBAA4wDGVSEZYKBHJlNliwc6D1iEBJif15Ozq1OmNuj6m0v7TBRBFUeJoiKx45iWSqSPni1BUXgM/b0/cOrCb1OEQOd3QvmHw9FAgv7QKlwv0UodDBICFEpEsiaKIbT9ZJ7+dOCwCapVS4oiInM9b7YHE2FAAwP6fCySOhsiKhRKRDJ25XIYrBRVQeSgwYWgPqcMh6jDJA6yX3346k49as0XiaIhYKBHJ0vbrrUmjB3eHPwffIzcyMDoYAb4q6KtMOJlRInU4RCyUiOTmcr4eZ7LLoBAETB4RKXU4RB1KqVDgluutSntOXpM4GiIWSkSys/2AtTUpKb4LQgO9JY6GqOPdOsh688LJjBKUVxgkjobcHQslIhkpLKvCoXOFAIApI3tKHA2RNLqF+CK2RwAsooj9P3NMJZIWCyUiGdl56CpEERgQHYye4f5Sh0MkmbpWpR9PXuOYSiQpFkpEMqGrNNr6ZEwdyclvyb2N6NcFKk/rmEoZuTqpwyE3xkKJSCa+PpIDU60FUd380a9noNThEEnKW+2BEf2s0/b8eDJP4mjInbFQIpKBGmMtvjtaN/ltL05+SwRg9KDuAICD5wpRY6yVOBpyVyyUiGQg/cQ1VNbUIjzIG0P7hkkdDpEs9IkIQJcgbxiMZhw+VyR1OOSmZFcoZWRk4IknnkBiYiJSUlKwaNEiGI3GFrcTRRHvv/8+xo0bh0GDBuHhhx/G8ePHG133+++/x4wZM5CYmIgRI0bgscceQ34+76wgadSaLdh16PrktyN7QqFgaxIRAAiCgNHXO3Xv4eU3koisCiWtVouZM2fCZDJhyZIlmDdvHjZs2ICFCxe2uO2KFSvw3nvvYdasWVi+fDnCwsIwe/ZsXL16td56mzdvxjPPPIOkpCQsW7YMCxcuxIABA2AwcKwOksbBswUo1Rmg8VUh5fpAe0RkdcuAbhAE4EKOFtdKKqUOh9yQh9QB3Gj9+vWorKzE0qVLERgYCAAwm82YP38+UlNTER4e3uh2BoMBy5cvx+zZszFr1iwAwLBhwzBlyhSsXLkSb775JgCgvLwcf/7zn/Hqq6/i0UcftW0/ceJEZx4WUZNEUcT2A9bWpEnDI+DpwclviW4U5K/GoOgQnMgowQ/H8zBjYh+pQyI3I6sWpfT0dCQnJ9uKJACYOnUqLBYL9u7d2+R2R48eRUVFBaZOnWpbplKpMGnSJKSnp9uWbd++HRaLBdOnT3dK/ERtdTKjBLlFlVCrlBg/hJPfEjVm/NAIANYpTQwms8TRkLuRVaGUmZmJ6Ojoess0Gg3CwsKQmZnZ7HYAGmwbExODvLw81NTUAABOnDiBqKgobNq0CePHj0f//v1xzz334IcffnDwkRC1Tt3kt+MSu8PHy1PiaIjkaUB0MMICvVBlqMWBMwVSh0NuRlaX3nQ6HTQaTYPlAQEB0Gq1zW6nUqmgVqvrLddoNBBFEVqtFl5eXigqKkJWVhYWL16Ml19+GWFhYVi3bh2efvppbNq0CX36tL9J18NDVjWn0ymVinr/uit78nDhajku5GihVAiYOqpXh7yH6uJUCILDO43X7a89+60bDkGhaN/2ztKeuOzJg7Ni6giK63Hd/Jlw1Dli4rBIrP/mIr47lovxQ3u41BAaPF9auWoeZFUoOZsoiqiqqsLbb79t65eUlJSEyZMnY8WKFVi0aFG79qtQCAgK8nVkqC5Do+GkrUD78rBr488AgAnDIxHTK8TRITVLrfaAt7fKSftue8uYSmXtm+Xp6by42sOeuNqTh9aQa67UauvXyc2fBUedI+4aG4uNP2Tgcr4ehXoj+vUKdsh+OxLPl1aulgdZFUoajQZ6vb7Bcq1Wi4CAgGa3MxqNMBgM9VqVdDodBEGwbVvXWjVq1CjbOp6enhgxYgQuXrzY7rgtFhE6XVW7t3dFSqUCGo03dLpqmM0WqcORTHvzkFNUgYNn8iEAuG1YD5SVdczdPHXxGgy1qK5uediNtlAoBKjVnjAYTLBY2jY3l9Fo7XdiMjk+Lnu0Jy578uCsmDqCz/UCru6z4IxzxMj+4fjx5DV88e1F/PreAQ7ZZ0fg+dJKbnnQaLxb1bolq0IpOjq6QV8kvV6PoqKiBv2Pbt4OALKystCvXz/b8szMTHTv3h1eXl4AgNjY2Cb3Ye/wALW10r/oUjCbLW577Ddqax627s0GAAyNC0NYgHeH59Aiik75EgesPxzauu+6SU8tFjgtrvawJ6725MHZMTmT5XpcN38WHHmOGDekB348eQ0HzxbgoQmx0PjIp0WtNXi+tHK1PMjqQuGYMWOwb98+6HS/TIC4Y8cOKBQKpKSkNLnd0KFD4efnh+3bt9uWmUwm7Nq1C2PGjLEtGz9+PABg//79tmVGoxGHDh1CQkKCIw+FqEnF2mpbh9Rpozj5LVFrRXXTIKqbP2rNIn48wQEoqWPIqkVpxowZWLt2LdLS0pCamoqCggIsWrQIM2bMqDeG0syZM5GXl4fdu3cDANRqNVJTU7FkyRIEBwejb9+++OSTT1BeXo45c+bYtktISMDkyZPx+uuvo7y8HGFhYfj4449RXFxcbz0iZ9p18CrMFhHxvYIQ1a3hzQtE1LTxQyKQde0svj+Wh6kje8mqQzt1TrIqlAICArBmzRosWLAAaWlp8PX1xfTp0zFv3rx661ksFpjN9cfSmDt3LkRRxKpVq1BaWor4+HisXLkSkZGR9dZbuHAh3n33XbzzzjuoqKhAQkICPvzwQ8TFxTn9+Ij0VUakX/8lPC2ZrUlEbZUU3wWffnsRJboanMwoQWKfUKlDok5OVoUSYB37aPXq1c2us3bt2gbLBEFAamoqUlNTm93Wx8cHr732Gl577TV7wiRql2+O5MBYa0Gvrv7o3ytI6nCIXI7KU4nRg7pjx8Er+ObIVRZK5HSy6qNE1JnVGGvxzZEcAMAdo3q51DgwRHJiHUcJOJ1dhpzCCqnDoU6OhRJRB0k/nofKmlqEB3ljaN8wqcMhcllhgd4Ydv0ztPPQFYmjoc6OhRJRB6g1W7Dz0FUAwJSRPdkBlchOk0f2BAD8dLoAZXr7hnchag4LJaIOsP90Psr0BgT4qXDLgG5Sh0Pk8mK6B6BPRADMFtF2SZvIGVgoETmZRRSx/Sfr5YHbR0TC083mBSRylilJ1lal74/losZYK3E01FnxjE3kZMcuFCO/tAreag+MS+whdThEncbgPqEID/JGlaEWP568JnU41EmxUCJyIlEUse2nywCACUN7wFstuxE5iFyWQhBw+/VWpd2HrsJscZ1pMch1sFAicqLzV8qRdU0HTw8Fbhse2fIGRNQmtwzoCj9vTxRra3D0QrHU4VAnxEKJyInqWpNuHdQNAb6uNYEnkStQeyoxYaj1kvaOA5dtkwYTOQoLJSInuZyvx89ZpVAIgq3TKRE53oShEfD0UCDrmh4XrpZLHQ51MiyUiJxk+wFra1JSfBeEBXpLHA1R56XxVeHWgdZhN7bsy5Y2GOp0WCgROUFBWRUOnSsEAEwdxclviZxt6qieUCoEnMkuQ0auVupwqBNhoUTkBDsPXIEoAoNiQhDZxU/qcIg6vdAAbyQP6AqArUrkWCyUiBysvMKAPaesY7pMHcm+SUQd5Y7kXhAE4GRGCbLzdVKHQ50ECyUiB9t9+CpqzSJiemjQNzJQ6nCI3EZ4kA9G9Q8HAGzZmy1tMNRpcPQ7IgeqqjHhu6O5AIBpI3tBqVTIagJcpZK/jahzu/OW3vjpdAGOXSzG1cIKXvomu7FQInKgb47koMZoRo8wXwyJC0NQkK+sCqU6AuQXE5EjdAvxxYj4Ljh4thBb9mXj6XsHSB0SuTgWSkQOUmOsxe7D1lnM7xjVCx7XW5O+PXQZ5XqDxNFZRYT7IymhGwTWSdSJ3ZncGwfPFuLIuULkFVeie6iv1CGRC2OhROQg6cfzUFFtQpdAb4yI72JbXq43oKS8WsLIfhHop5Y6BCKni+jih6F9w3D0QhG27svGU3cnSB0SuTB2WCByAFOtBTsOXgEATEvuBaWCHy0iKd11S28AwIEzBcgtqpA2GHJpPJsTOcCPJ/JQXmFEkL8ayQldpQ6HyO316uqPYXFhEAF88WOW1OGQC2OhRGQns9mCr/ZbpyuZktQTnh78WBHJwb2joyEAOHqhCFnXOK4StQ/P6ER2Sj+ei6Lyavh5e2JMYnepwyGi63qE+tpG696YnilxNOSqWCgR2cEiivjfNxcBALePiITaUylxRER0o3tujYJSIeB0VinOXymTOhxyQSyUiOxw9HwRrhbo4aP2wIShEVKHQ0Q3CQv0xpjB1pbez9MzIYqixBGRq+HwANQpKBRChw/sKIqibZqESUmR0Pip6j3OUbDJHdW972/+VyoWi4g7b+mNPaeu4VKOFqcySzAoJlTSmMi1sFAil6dQCJKMgH30fCGyrumgVinx4G1xCGhijCKOgk3uwFvtAVEUodF411t+898dzWKxtiBNHBqBHQevYGN6JgZEh0DBUVeplVgokcura03q6BGwt12/0y2uZxC+O3QFlpua9DkKNrkTtacSgiDg+8NXUKqrgUIQoFZ7wGCobfDZ6CiB/mpMGNELCoWAqaN64vvjubhSUIHD5wqRFB8uSUzkelgoUafRkSNgl+hqUFBaBUEAorprUKKttv1yrcNRsMkd1X0OFQoB3t4qVFcbG3w2OppSqUCQxgvTRvXCxvRMbPwhEyPiwztsKI/GLkNaLKLkeaHWYaFE1A4Xc7QAgJ7h/vDx8kR1tVHiiIjoZjdfDpwxJR7fHctFYXk19p8txD1jYjo0nhsvQ1osIsrKKlksuQDZFUoZGRl46623cOzYMfj6+uKee+7B888/D5VK1ex2oihixYoV+Pjjj1FaWor4+Hi88sorSExMbHR9i8WC6dOn4/Tp01i8eDGmTJnihKOhzqi8woDCMmvLVd+IAImjIaKm3Hw5EADiewdh36l8rN12FlXVxg4Z0uPmy5A3XhJkoSR/siqUtFotZs6cid69e2PJkiUoKCjAwoULUVNTgz/96U/NbrtixQq89957eOmllxAXF4d169Zh9uzZ2Lx5MyIjIxusv379ehQUFDjrUKgTq2tN6hHmC19vT4mjIaKW3HhZPthfDX9vT+irTThwOh8JvYOd/vxyugxJbSer+5fXr1+PyspKLF26FKNHj8b06dPx8ssvt1jUGAwGLF++HLNnz8asWbOQnJyMd999F4GBgVi5cmWD9UtLS7F48WK88MILzjwc6oT0VUZcK6kCAPTpwdYkIlejEAT07x0EAMjK06GqplbiiEjuZFUopaenIzk5GYGBgbZlU6dOhcViwd69e5vc7ujRo6ioqMDUqVNty1QqFSZNmoT09PQG67/77rsYOXIkRo4c6dD4qfOra03qGuwDjW/zl4OJSJ66BHkjNMALFhE4x9G6qQWyKpQyMzMRHR1db5lGo0FYWBgyM5uep6fusZu3jYmJQV5eHmpqamzLTp48ia1bt+J3v/udAyMnd1BZbUJuUSUAoA/7JhG5LOGGVqWcokqUV3TcsCLkemTVR0mn00Gj0TRYHhAQAK1W2+x2KpUKanX927E1Gg1EUYRWq4WXlxcsFgvmz5+PJ554AhEREcjJyXFY7B5uNmO8XEbdvTEGheDc0bkv5WohwvprNCTAy/qc15+vsecVhLrHGn9cCs6MqblcSBmXPdoTlz15cFZMHeHmuJydh/bEdKNgjRciwnyRU1SJM9llSBnY1ba+o92ci7rBLuVw/uxIcvreaAtZFUrO9r///Q/FxcV46qmnHLrfupGh3ZHUo+7eSK32gLe3cy6HVVSbcKWwAgAwuE9Yg+dRqxt26laprHfTeHo6L6626oiYGstFS+SYK8C+uNqTh9ZwtVw5Kw+t0VKuhvQLR15JFoq1NSitMCKii79T46nLhVpt/eqV0/mzI7naccuqUNJoNNDr9Q2Wa7VaBAQ0falDo9HAaDTCYDDUa1XS6XQQBAEBAQGorKzEu+++i3nz5sFkMsFkMqGiwvrFV1NTg4qKCvj5+bUrbotFhE5X1a5tXZVSqYBG4w2drhpms0UWsRgMtU4bz+jUxWKIIhAW6AVftdL2PAqFALXaEwaDqcHdLEajGQBgMjkvrrZyZkzN5ULKuOzRnrjsyYOzYuoIN8fl7Dy0J6abKQHE9tDgwlUtjp4rRKCvCkontIDdnAuf6wWcHM6fHUlO3xuAtWBrTeuWrAql6OjoBn2R9Ho9ioqKGvQ/unk7AMjKykK/fv1syzMzM9G9e3d4eXkhJycH5eXleOONN/DGG2/U2/73v/89QkNDm+0w3pLaWulfdCmYzRbZHLtFdM5It1WGWlwusBbwfSMDG32OxkbZrZul3GKBbG4J7oiY2jPisBxzBdgXl7NGXna1XEk5AnVrchXbPQCX8ytQWVOLSzlap/Y/rMtF3ZQucjp/diRXO25ZFUpjxozBsmXL6vVV2rFjBxQKBVJSUprcbujQofDz88P27dtthZLJZMKuXbswZswYAEBYWBg++uijetsVFxfjhRdewLPPPotbbrnFSUdFru5ijhaiCIQGeCFE4yV1OETkQB4eCsT3CsTxSyW4mFOOyC5+8FI5fxBKch2yKpRmzJiBtWvXIi0tDampqSgoKMCiRYswY8YMhIf/MoHhzJkzkZeXh927dwMA1Go1UlNTsWTJEgQHB6Nv37745JNPUF5ejjlz5tjWuXk4gLrO3LGxsRg6dGgHHSW5kmpDLa5cb02KiwyUNhgicorILn7IztejvMKIc5fLkNgnVOqQSEZkVSgFBARgzZo1WLBgAdLS0uDr64vp06dj3rx59dazWCwwm831ls2dOxeiKGLVqlW2KUxWrlzZ6KjcRK1V15oUolHb7nQjos5FEAQkRAVj76l8XCmsQFQ3fwRwUmu6TlaFEmAd+2j16tXNrrN27doGywRBQGpqKlJTU1v9XBERETh//nxbQyQ3wdYkIvcRovFCj1Bf5BZX4lRWKVIGOG+4AHItrjWYAVEHupSrhUUEgtmaROQW4nsHQakQUKozIK/Eve5kpqaxUCJqRI2xFpcLrMNHxEUG8pclkRvwUXsgpof1RqLTWaWolcEt7CQ9FkpEjbiUq4PFIiLIX41QtiYRuY0+PQLgo/ZAjdGMC1fLpQ6HZICFEtFNaoxmXM7/pW8SW5OI3IdSqcCAqGAAQEaeDhVVJokjIqmxUCK6SUauFmaLiEA/FcIC2ZpE5G7Cg73RJcgbogicyiqxDVxJ7omFEtENagy1yGJrEpFbEwQBA6KCoRCAovIaXGPHbrfGQonoBhdytLa+SV2CXGviRiJyHD9vT8T2sE5nwo7d7o2FEtF1VTUm25xu8b3YmkTk7mIjAuCtVqLaaMbFHK3U4ZBEWCgRXXf+6i9zuoUGsDWJyN153NCx+1KuFvoqo8QRkRRYKBEB0FcZcbXQOm5SfK8giaMhIrnoGuyD8Osdu09ksGO3O2KhRATg/JVyAEDXYG8E+XOOJyKyEgQBA2NCbCN2X7k+EC25DxZK5Pa0Fb9MVxDXk61JRFSfj9oD/XoGAgDOZJehxlgrbUDUoVgokds7d701qUeoLwJ8VdIGQ0SyFNVdgwBfFUxmC37OKpU6HOpALJTIrZXoalBQVg0BQNz1X4xERDdTCAIGx4YAAPKKq1BQxrGV3AULJXJboiji9PVfhj3D/eDn7SlxREQkZ4F+akR3t06aezKjhGMruQkWSuS2cosrUV5hhFIhsDWJiFqlX89A69hKBjPOXS6XOhzqACyUyC2ZLRacvVwGAOgTEQAvlYfEERGRK/BQKjA4xnoJLvOaDiXaGokjImdjoURuKTNPj2qDGV4qpa0pnYioNboE+aBnFz8AwLFLxbwE18mxUCK3YzCZcTGnHIB1cEkPJT8GRNQ2CVHB8FIpUVVTa2udps6J3xDkds5fKUetWUSArwoRYb5Sh0NELsjTQ4HE2FAAQNY1PYq11RJHRM7CQoncSkWVCZfzrRPfJvQO4sS3RNRuXYK80Svcegnu+EXeBddZsVAityGKIk5nl0IEEB7kjdBATnxLRPZJ6B0Mb7USVYZanMnmJbjOiIUSuY380irr4JKC9eRGRGQvjxsuwWXn65FfyoEoOxsWSuQWas0W/JxpHVwytkcA/Hw4uCQROUZYoDeiu/kDAI5fLEaNgXPBdSYslMgtnL9ajmqjGT5qD/SJCJA6HCLqZOJ7B0Pjq4Kx1oKjF4shiqLUIZGDsFCiTk9XaURmng4AMCA6mMMBEJHDKRUChvUNhVIhoFhbg0u5OqlDIgfhNwZ1aqIo4mRmCUQR6Brsg67BPlKHRESdlL+PCgOirf0fz10pQ5neIHFE5AgslKhTu1pYgVKdAUqFYDuBERE5S88ufuge4gNRBI6cL4KplkMGuDoWStRpGUxm2+26cZGB8FFzPjcici5BEDA4NsQ2ZMDxS+yv5OpYKFGn9XNmKYy1Fvj7eHI+NyLqMJ4eSgzrGwZBAK6VVOFSjlbqkMgOLJSoU8orqURucSUAIDE2FAoFR+Amoo4TrPHCgCjr5f7T2WXIL6mUOCJqL9kVShkZGXjiiSeQmJiIlJQULFq0CEajscXtRFHE+++/j3HjxmHQoEF4+OGHcfz48Xrr7Nu3D/PmzcOECRMwePBgTJs2DR988AFMJpOTjoakYDCZcTKjBADQJyIAQf5qiSMiInfUu6s/IrtYpzjZe/IaKmv4XeOKZFUoabVazJw5EyaTCUuWLMG8efOwYcMGLFy4sMVtV6xYgffeew+zZs3C8uXLERYWhtmzZ+Pq1au2ddavX4/Kyko899xzeP/993HvvfdiyZIl+NOf/uTMw6IOJIoiTmaUwGiyXnLrGxkodUhE5KYEQcCgmGAE+qlgNJlx8GwhzJwPzuXIqndrXSGzdOlSBAYGAgDMZjPmz5+P1NRUhIeHN7qdwWDA8uXLMXv2bMyaNQsAMGzYMEyZMgUrV67Em2++CQB48803ERz8y51PI0eOhMViwb/+9S+8/PLL9R4j13S1sALXSqogCMCQPtYxTYiIpKJUKJAUH44fjudBW2HEycwSTOQwJS5FVi1K6enpSE5OthVJADB16lRYLBbs3bu3ye2OHj2KiooKTJ061bZMpVJh0qRJSE9Pty1rrBCKj4+HKIooKipyzEGQZLSVRpy6Pk1Jv55BCPTjJTcikp6PlwduGdQNAHC1sBKnrncNINcgq0IpMzMT0dHR9ZZpNBqEhYUhMzOz2e0ANNg2JiYGeXl5qKmpaXLbo0ePQqVSISIiwo7ISWqmWjN+OJYLs0VEiMYLsT14lxsRyUfXEF8MigkBYB1f6YejORJHRK0lq0tvOp0OGk3DL7iAgABotU3fXqnT6aBSqaBW129B0Gg0EEURWq0WXl5eDbbLzs7GRx99hBkzZsDX19eu2D08ZFVzOp3y+jQgShlMB6JUKrDyy9Mo0dbA00OBYf3COiyuurvpGrurThDqHmv8cSk4M6bmciFlXPZoT1z25MFZMXWEm+Nydh7aE5NU6p47NiIAlTUmZOTq8K/1x/CHx4aib0SgZHF1NDl9b7SFrAqljlRRUYFnn30WERERmDdvnl37UigEBAXZV2i5Ko3GW+oQ8OOxXHy1NwsAcMvAbggJ7Pjr/2q1Z4NlKpUSAODp6QFvb1VHh9SojoipsVy0RI65AuyLqz15aA1Xy5Wz8tAacsuVWu2JEf27QoSAzFwt/vXpCfzjudGI6OIvdWgdSg7fG20hq0JJo9FAr9c3WK7VahEQ0PSM7xqNBkajEQaDoV6rkk6ngyAIDbY1Go1IS0uDVqvFp59+Ch8f+75YLRYROl2VXftwNUqlAhqNN3S6aknv4sgpqsB7G44BAAbHhiLIT4Xq6paHk3AUhUKAWu0Jg8EEi6X+6LtGoxkAYDLVdmhMzXFmTM3lQsq47NGeuOzJg7Ni6gg3x+XsPLQnJqncnIvRg7rB00OB85fL8Kfl+/HGEyOg8ZW+kHM2uXxv1NFovFvVuiWrQik6OrpBXyS9Xo+ioqIG/Y9u3g4AsrKy0K9fP9vyzMxMdO/evd5lN4vFgpdeegmnT5/GunXr0K1bN4fEXuum8/mYzRbJjr2i2oR/fnocNUYzBsWGIrFPKMp0TfdHcyaLRWzwZVA3bYHFAsm+KG7WETE1louWyDFXgH1xtScPzo7JmZqKy1l5sCcmqdTlQqEQ8NoTI/Hiv35AYXk1Fn18FL97ZAh8vKRrfetIUn5vtIesLhSOGTMG+/btg06nsy3bsWMHFAoFUlJSmtxu6NCh8PPzw/bt223LTCYTdu3ahTFjxtRbd/78+fjuu+/w73//G3FxcY4/COoQZosFyzb/jKLyGoQFeuP3j4+QVX8NIqLmBPqr8eIjidD4eOJKQQX++b8TqDHWSh0WNUJWhVJdp+q0tDTs2bMHn3/+ORYtWoQZM2bUG0Np5syZmDRpku1vtVqN1NRUrFq1CmvWrMH+/fvx4osvory8HHPmzLGtt2zZMqxfvx6PPfYYVCoVjh8/bvuvoqKiQ4+V2k8URazbfRFnssug9lTi+YcGu0WzNRF1Lt1CfPHijCHw9fJARq4O7312EkaTWeqw6CayuvQWEBCANWvWYMGCBUhLS4Ovry+mT5/eoLO1xWKB2Vz/zTR37lyIoohVq1ahtLQU8fHxWLlyJSIjI23r1I3FtHLlSqxcubLe9h999BFGjhzppCMjR9p+4Aq+P5YLAcDcu/rbpgggInI1kV38MO+hRPxj/TGcu1KOf2/6Gc/cPxAeLnZnWGcmq0IJsI59tHr16mbXWbt2bYNlgiAgNTUVqampbdqOXMv+0/n47PsMAMAjt/XB0L5hEkdERGSf6O4aPD99EP654QROZpTg/S9P46m7E1gsyQRfBXIZxy8WY+XWswCA20dE4rbhkS1sQUTkGuJ6BuGZ+wdCqRBw+HwRlm0+DZMLdXjuzFgokUs4d7kM/970MyyiiOSEcDw0IVbqkIiIHGpAdAjSrl92O3qhCEs3nmKfJRlgoUSydya7FP/67ARqzRYM6ROK2XfEQyHwDjci6nwSY0Px2wcHQeWhwKnMEvyLd8NJjoUSydrJjGL8638nYTRZMCAqGL++JwFKBd+2RNR5JfQOxgsPJ8JLpcS5K+V499MTqKphsSQVfuOQbB05X4gln5+ytSQ9+8AgeHoopQ6LiMjp+kYG4qUZQ+Cj9sClXC0WrjuKMr1B6rDcEgslkqWfTufjP5tOw2wRkRTfBb+5dwA83WziYSJyb9HdNfjdo0Og8VUhp6gCf117GLnFlVKH5Xb4zUOyIooidh++ihVbzsAiikgZ2BVP3cXbZInIPfUM98cfHxuG8GAflOgM+NvaI7hwtVzqsNwKv31INmrNFvx31wV88vVFiADGD+2BJ6bFc2oSInJrYYHeePX/DUVMDw2qDLV4e/1xHD5XKHVYboOFEslCVY0Ji/93At9dH3H7ofGx+H+T+vLuNiIiAP4+Krw8YwiG9AlFrdmC/2z6GV/tz7ZN/EvOw0KJJFdYVoW/rD2C09llUHkq8Mz9AzFlZE8ILJKIiGxUnkqk3TcQE4dGQATw+Q+ZWLHlDMdacjLZTWFC7uX4xWKs/OoMKmtqEeSvxnMPDEKvrv5Sh0VEJEsKhYBf3d4X3cN88fHuC/jpTAEKyqrwzP2DEOSvljq8ToktSiSJWrMF67+5iPc+P4nKmlpEddPgtceHs0giImqF8UN64IWHE+Hr5YGsa3osWHMIWdd0UofVKbFQog5XrK3GwnVHsevQVQDWedte+X9D+WuIiKgN4nsF4fWZw9EtxAflFUb87b9H8P2xXPZbcjAWStShDp0rxPwPDyEzTwcftQeeuX8gZkzsw9v/iYjaoUuQD157fPj1Tt4iPtp5Hiu/OgsD+y05DPsoUYfQVxnx310XcOj6La1R3TT4zT0JCA30ljgyIiLX5n39R+eOA1fw2Q8Z2PdzPq4UVCDtvgEID/aROjyXx0KJnO7I+SKs3XkOuioTFIKAO2/phTtv6c1WJCIiBxEEAVNH9UJUNw2Wbf4ZOUUV+POaQ5g5pR+S4sOlDs+lsVAip9FWGLD+20s4cKYAANAj1Bdz7oxH764aiSMjIuqc+vUKwhtPJOE/m3/GpRwtlm0+jZ+zSvGr2/pCreJcme3BQokczmyx4Lujufjix0xUG8wQBGDaqF64OyWK87URETlZkL8av390CDbvycZX+7Kx5+Q1XMzR4td3J/DO4nZgoUQOlZGrxdqd53GlsAIA0LurPx6bHIeobmxFIiLqKEqFAvePiUZ8ryCs2HIaBaVV+Mvaw7h/TAxuHxHJqaHagIUSOUSxthpfpGdi/2nrZTYftQceGBeDsYO78wNJRCSR+F5BmD87CR9uO4fjl4qx4btLOHqxCHOmxbOjdyuxUCK7VFSbsCk9E98ezUGt2Tp2R8qArnhwfCw0viqJoyMiki9lB93QEqTxwryHB+P7Y7n45OuLuJSjxRurDuLBCbGYNCKy3pyaFosIi4XjMN2IhRK1mUIhwFBrwf++uYDPvr2IqppaAED/3kF4aEIfRHfv2MtsHXWyISJyBG+1B0RRhEbTscOj3D8xDrcOicR7G47hxMVirNt1AccvlSBt+mBEhlv7LlksIsrKKlks3YCFErVJRbUJe34uwFf7slBZbQIA9O6mwaw7+2NoXBdJJ7IVwEt8RCR/ak8lBEHA94evoFRX0+HPP6RPKHzUHjh0tgCnM0vwzD++RUJ0CMYO6Y7JydFQKAQWSjdgoUStUlhWha8P5yD9RB6MtRYAQKC/GoNiQhDVXYPLeVpcztNKEltEuD+SErpBwhqNiKjNyvUGlJRXS/LcYQFeGJfYHacyS1FQVo1TGSXIzNXC39cL/SJ4882NWChRk2rNFhy9UIT0E3k4k11mWx4bGYheXfwQFuyDmhoTyrQd/4voRoF+nCOOiKitfLw8MbJ/OPJLqnAqqwSVNbX425pD6N87GA+MjebdytexUKJ6LKKIzFwdDp8vxP7T+dBXWS+vCQASooIxLbkXbh0aic3fX0KVkXMJERG5uq4hPggN9EJucSVOZ5XhTHYpzmSXYmjfMNw3Ogo9wvykDlFSLJQIplozzl8px9ELRTh2sRjaSqPtsUA/FW4d1B1jBnVDaKA3PDwUkvZDIiIix/NQKjA0rgueeWgI1mw9jb2nrlm/Ey4UYVRCOKaO6oUINy2YWCi5oaoaEy7lanHhqhYXcsqRfU1nu7UfALzVSgyOCcWI+C4YFBMCpYJ3lRERuYOuIb546u4ETE7qiU0/ZuLI+SLsP12A/acLEN8rCJOGR2JQbEi9IQU6OxZKMqZQCO0arFEURVTV1KK80git3oBibQ1yiyuQU1iJ3KIKlOoNDbYJ9FNhSJ8wDOsXhv69g5ucsJa34hMRdX49Qn2Rdt9AZF3TYftPl3HkQhHOXi7D2ctl6BLkjXGJPZAU3wXBGi+pQ3U6FkoypVAICAryrVcomWrNKNMbUKarsf574//ralCuN6BUX4MynQG1Zkuz++8W4ov+0cFIiApBQkwIuoX4tumSmhv9mCAicltR3TR4+r6BKNZW49ujuUg/nofCsmps+O4SNnx3CX0iApAUH47h/bogoJMOMsxCSabOXi7DT9vPIzO3HLoqI6oNtTCami9+bqbyUMDbywM+ag8E+qsR5K9GoJ8agf5qqD2ts0jrKw346WReq/fJW/GJiNxPaIA3Hhofi3tSorD/TD4OnC7AhavluJijxcUcLT7efQE9w/0R3ysI/XoFoW9kALxUnaPEkN1RZGRk4K233sKxY8fg6+uLe+65B88//zxUquYrVVEUsWLFCnz88ccoLS1FfHw8XnnlFSQmJtZbr6CgAG+99Rb27NkDT09PTJo0Ca+88gr8/OTVSW3jDxm4mNNwXCKFAKhVSqg9lfC6/q9apYRX3b8qj+vLFE32LaqoNKKinXHxVnwiIvelVikxLrEHxiX2QJnegEPnCnHwbAEy83S4XKDH5QI9dhy8AqVCQGQXP9t/PcP90bubBkFSH0A7yKpQ0mq1mDlzJnr37o0lS5agoKAACxcuRE1NDf70pz81u+2KFSvw3nvv4aWXXkJcXBzWrVuH2bNnY/PmzYiMjAQAmEwmPPnkkwCAd955BzU1Nfj73/+OF198EcuXL3f68bXFE9PikVlQgQuXS2EymW1FkSfvOiMiIidqbV/UsCBvTEvuhWnJvVCuN+DM5TKczS7FmewyFJVXIztfj+x8fb1tNL4qhAV6ITTAG2GB3gjWqBHgq4LGVw2NrycCfNXwVivrfc9JPf+crAql9evXo7KyEkuXLkVgYCAAwGw2Y/78+UhNTUV4eHij2xkMBixfvhyzZ8/GrFmzAADDhg3DlClTsHLlSrz55psAgJ07d+LixYvYtm0boqOjAQAajQZz5szByZMnMWjQIGcfYqtFdPHDwLhwbPzWLNnIrURE5D7smYMuKMgXUT2DccfoGABAQWkVLuWUIytXi6w8HTLztCgur4au0ghdpREZubom9+XpoUCAnxoaXxX8fTyREBWC24dHSFYsyapQSk9PR3Jysq1IAoCpU6fijTfewN69e3H//fc3ut3Ro0dRUVGBqVOn2papVCpMmjQJu3fvrrf/uLg4W5EEACkpKQgMDMQPP/wgq0KJiIioIzljDjoftRIJUUFIiApCba0FhloLSsqroasyQl9lQlWNCdUGM2qMtag2mFFrtsBUa0FxeTWKrzcSnM4sxYQh3SUbkkBWhVJmZiYeeOCBess0Gg3CwsKQmZnZ7HYA6hVAABATE4M1a9agpqYGXl5eyMzMbLCOIAiIiopqdv8tUSgEBAf7tnv7xtS9H6amRMtqckIPpTWwSaOiIIoiRBmEVhfT5FuiJMmVIKDRPEgdV2OcHVNTuWiJHHMFtD+u9ubBmTE5W2NxOTMP7Y1JKjfmQk5x3agurpEDuzstrpbeE6IoQqz7V7TOCuHl5QEPheDw91Jrh9+RVaGk0+mg0TScWyYgIABabdMTrup0OqhUKqjV9TsaazQaiKIIrVYLLy8v6HQ6+Pv7t3n/LREEAUqlcypdb7WsXiIbOcYlx5gAecYlx5gAxtUWcowJkGdccowJYFyugqMHEhERETVBVoWSRqOBXq9vsFyr1SIgIKDZ7YxGIwyG+iNO63Q6CIJg21aj0aCiouGN8S3tn4iIiNyTrAql6OjoBn2F9Ho9ioqKGvQtunk7AMjKyqq3PDMzE927d4eXl1eT+xdFEVlZWc3un4iIiNyTrAqlMWPGYN++fdDpfrltcMeOHVAoFEhJSWlyu6FDh8LPzw/bt2+3LTOZTNi1axfGjBlTb//nzp1Ddna2bdn+/ftRXl6OsWPHOvZgiIiIyOUJoiiH+5astFot7rjjDkRFRSE1NdU24ORdd91Vb8DJmTNnIi8vr96t/++//z6WLFmCl156CX379sUnn3yCPXv2NBhwsm6IgRdeeAHV1dVYtGgR4uLiZDfgJBEREUlPVoUSYJ3CZMGCBfWmMJk3b169KUwee+wx5Obm4ttvv7UtE0UR77//foMpTIYMGVJv/zdOYeLh4YFJkybh1Vdfld0UJkRERCQ92RVKRERERHIhqz5KRERERHLCQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCZwimOoxm81YtWoVvv/+e1y6dAmiKCIuLg6//e1vMXz4cNt6mZmZ+O9//4uffvoJubm5CAkJwejRo/Hb3/4WwcHBzT7HkiVLsHTp0gbL33zzTTzyyCMOP6b2am0uAMBoNOKf//wnvvzyS1RWVmLIkCF4/fXXWzU1ztGjR/H3v/8dZ8+eRUhICB555BHMnTsXgiA469DabO/evdi4cSNOnDiBq1ev4le/+lW9QWABYOPGjXjllVca3f7WW2/FypUrm9y/q7wnWpMHAIiLi2uwLDQ0FHv37m3xOVzh/QC0LhfucJ5o7Xuis58jGtPY56DOjz/+iC5dujT6WE5ODiZOnNhg+eDBg7FhwwaHxddaLJSonpqaGrz//vu47777MHfuXCgUCmzYsAGPP/44Vq5cieTkZADAvn37cPjwYTz88MPo168f8vLy8N577+HgwYPYvHlzvQFCG+Pl5YU1a9bUW1Y3grpctDYXAPDWW29h27Zt+MMf/oDw8HAsW7YMs2bNwldffQV/f/8mn+Py5cuYM2cOUlJS8Pzzz+P8+fN4++23oVQqMWfOnI44zFb58ccfce7cOYwYMQJarbbRdcaNG4dPP/203rLs7Gz8/ve/rzeVUFNc4T3RmjzUeeyxx3DnnXfa/vb09Gxx/67yfgBalwt3OE+09j3R2c8Rjbn5fAAAv//97+Ht7d1kkXSjF154ASNHjrT97evr69D4Wk0kukFtba1YXl7eYNmUKVPE1NRU27LS0lLRYrHUW+/IkSNi3759xR07djT7HO+9956YmJjouKCdpLW5uHbtmhgfHy+uX7/etqysrExMTEwU33///Waf4/XXXxfHjx8vGgwG27J33nlHHD58eL1lUjObzbb/Hz9+vDh//vxWbffee++J8fHxYmFhYYvrucJ7orV56Nu3r/jBBx+0ef+u8n4Qxdblwh3OE63JgzucI1rj6tWrYt++fcUVK1a0ar3t27d3UGTNYx8lqkepVCIgIKDBsri4OBQWFtqWBQUFNWj27d+/PwDUW8+VtTYXe/bsgcViwZQpU2zLAgMDkZKSgvT09GafIz09HRMnTqz3y3ratGnQ6XQ4duyYg47EfgpF+04VW7duxahRoxAWFubgiKTR3jy0lqu8H4DW5cIdzhOtyYM7nCNaY+vWrRAEoV5LqytgoUQtqq2txYkTJ1q8ln7kyBEAQExMTIv7rKmpwahRo9C/f39MmzZNkuvO7dFYLjIzMxESEtKgqIqJiUFmZmaT+6qqqsK1a9ca5DU6OhqCIDS7rSs4deoUsrOzW31SdNX3RFPef/99JCQkYPjw4Xj++eeRl5fX7Pqd/f1Qxx3OEzfjOcLqq6++wogRI9C1a9dWrf/mm28iPj4eycnJeO2111BeXu7cAJvAPkrUog8++AAFBQWYNWtWk+sYDAb8/e9/R//+/ev13WlMz5498dJLL6F///4wGAzYsmULXn/9dej1etlfc28sFzqdrtE+BhqNptk+C3q93rbejVQqFby9vVvsAyN3W7duhVqtxu23397iuq78nmjMvffei3HjxiE0NBQXLlzAf/7zHzz66KPYvHlzgy/LOp39/QC4z3niZjxHAOfOncOFCxfw5z//ucV1VSoVHnnkEdx6663QaDQ4ceIEli1bhp9//hn/+9//WtXfz5FYKLkBvV7fqmbuyMjIBp0r9+7diyVLluDpp5/GgAEDmtz2jTfeQE5ODtavX9/inRj33HNPvb/HjRsHk8mE//znP3j88ced+iHoiFy4Anvy0BoWiwVfffUVxo0bBz8/vxbXl+o94aw8/P3vf7f9/4gRIzBs2DDcf//92LBhA+bOnduuWJ3N2e8JwDXOEx2RB1dlT262bNkCT09PTJ48ucXtu3TpgjfffNP2d1JSEvr06YPU1FTs3r0b06ZNa3Ps9mCh5AZ27NiB1157rcX1tm3bVq85/PTp03j22Wdx55134plnnmlyu3/+85/YsmULli1bhr59+7YrxqlTp2Lnzp24cuVKq5rk28sZudBoNKioqGiwD51O12TrAQDbL8y6X411jEYjqqurm93WXu3NQ2sdOHAARUVFuOuuu9oTHoCOeU84Ow91+vXrh6ioKJw+fbrJdaR8PwDOz4WrnCeckQdXPEc0pr25EUUR27Ztw+jRoxEYGNiu5x47dix8fHxw+vRpFkrkeA8++CAefPDBNm1z+fJlzJ07F0OGDMFbb73V5Hpr167F8uXLsXDhQowePdreUJ3OGbmIjo5GcXExtFptvRNXZmZms/26fHx80K1btwb9DLKysiCKYqvGV2mv9uShLbZs2QKNRoOxY8c67Tkcwdl5aAsp3w+Ac3PhSucJZ+TBFc8RjWlvbo4cOYK8vDy8/PLLTojK+diZmxooLCzE7Nmz0a1bN7z33ntNNnFv3boVf/nLX/DCCy/g3nvvtes5t23bBo1Gg549e9q1H0drTS5uvfVWKBQK7Nq1y7ZMq9Viz549LY4fNGbMGHzzzTcwmUy2ZXW5GDJkiOMOpAMZjUbs3r0bkyZNsuvShFzfE+1x9uxZZGVlYeDAgc2u1xnfD+5wnmiJu58jtmzZAh8fH0yYMKHd+/juu+9QVVXV4mfIGdiiRPXU1NRg7ty5KCsrwx//+EdcvHjR9phKpbLd2nvw4EH84Q9/wKhRo5CUlITjx4/b1uvatavtroZNmzbh1VdfxerVq5GUlAQAuP/++3HvvfciOjoaNTU12LJlC3bt2oVXX321wzvpNae1uejatSumT5+ORYsWQaFQIDw8HMuXL4e/vz9mzJhh26axXMyZMwdbtmzBiy++iEceeQQXLlzAypUrMW/ePFn1f8jNzcWpU6cAANXV1bhy5Qp27NgBAPVueQaAH374ATqdrsnLbq78nmhNHlauXIkrV65g5MiRCA4OxsWLF7Fs2TJ07dq13q9xV34/AK3LhTucJ1qTB3c4RzSltrYWO3fuxG233QYvL69G1+nfvz/uvfde/PWvfwUALFy4EIIgIDExERqNBidPnsTy5csxYMAA3HbbbR0ZPgAWSnST4uJinDt3DgDwm9/8pt5jPXr0wLfffgvA2gfFZDJh//792L9/f731nnnmGTz77LMArJ16zWYzRFG0Pd6zZ0+sXr0axcXFEAQBffv2xT/+8Q/cfffdzjy0NmttLgDgtddeg6+vL9555x1UVlZi6NCh+PDDD+vd6dJYLnr16oWVK1di4cKFeOqppxAcHIznnnsOs2fPdvLRtc2BAwfqTU/y448/4scffwQAnD9/vt66W7ZsQVhYWL0RdW/kyu+J1uQhKioKu3btwvbt21FZWYmgoCCMHTsWzz//fL27l1z5/QC0LhfucJ5o7Wejs58jmrJnzx6UlZU1O0yI2WyGxWKx/R0TE4NPPvkEGzZsQE1NDcLDwzF9+nQ899xz8PDo+LJFEG98RYiIiIjIhn2UiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIiIiJrAQomIiIioCSyUiIjskJOTg7i4ONt/ddNXSO3rr7+uF1fdNBtE1DYslIjIoTZu3FjvC7p///4YPXo0/vCHP6CgoKBd+7x06RKWLFmCnJwcB0frOA8//DAWLVqEQYMGSR0KAGDAgAFYtGgRHn74YalDIXJpnOuNiJziueeeQ0REBIxGI44fP44vvvgCR44cwdatW6FWq9u0r0uXLmHp0qVISkpCRESEkyK2T2JiIu655x6pw7Dp2rUr7rnnHpjNZnz66adSh0PkslgoEZFTjBkzBgMHDgQAPPjggwgKCsKKFSvwzTffYNq0aRJHZ1VVVQUfHx+pwyAiGeOlNyLqEMOHDwcAXL16td7yjIwMPPfcc0hKSsLAgQNx//3345tvvrE9vnHjRvz2t78FADz++OO2S3oHDhwAAMTFxWHJkiUNnm/ChAn4wx/+UG8/cXFxOHjwIN58800kJydj7NixAIDHHnsMd955Jy5duoTHHnsMgwcPxujRo7FixQq7jjk3NxdvvvkmJk+ejEGDBmHkyJF47rnnWnUJ8cCBA/WOs05dn6iNGzfaFRsRtQ5blIioQ+Tm5gIANBqNbdnFixfxyCOPIDw8HHPnzoWPjw+2b9+OtLQ0LFmyBJMmTcKIESPw2GOPYe3atfj1r3+N6OhoAEBMTEy74pg/fz6Cg4ORlpaGqqoq23KtVosnn3wSkyZNwtSpU7Fz5068/fbb6Nu3r62gaqtTp07h2LFjuOOOO9C1a1fk5ubik08+weOPP46vvvoK3t7e7dovEXUcFkpE5BQVFRUoLS2F0WjEiRMnsHTpUqhUKowfP962zl/+8hd069YNn3/+OVQqFQDg0UcfxSOPPIK3334bkyZNQmRkJIYPH461a9filltuwciRI+2KKyAgAKtXr4ZSqay3vLCwEH//+99x7733AgCmT5+OCRMm4PPPP293oTRu3DhMmTKl3rLx48fj4Ycfxs6dO23PRUTyxUKJiJxi1qxZ9f7u0aMH/vGPf6Br164AgPLycvz000947rnnUFFRUW/dW2+9FUuWLEFBQQHCw8MdGtdDDz3UoEgCAB8fn3qdsVUqFQYOHNjgUmFbeHl52f7fZDKhoqICPXv2hEajwZkzZ1goEbkAFkpE5BR/+tOfEBUVBb1ej88//xyHDh2ytRoBwJUrVyCKIhYvXozFixc3uo+SkhKHF0pN3TXXtWtXCIJQb1lAQADOnz/f7ueqqanB8uXLsXHjRhQUFEAURdtjer2+3fsloo7DQomInGLQoEG2u95uu+02PProo3jxxRexY8cO+Pr6wmKxAABmz56N0aNHN7qPnj17tvv5zWZzo8ubGpqgsVYmey1YsAAbN27EzJkzkZiYCH9/fwiCgHnz5tUrmhpzc9FWpy5vRNQxWCgRkdMplUq88MILePzxx7Fu3To89dRTiIyMBAB4enrilltuaXb7pooGwNrqo9Pp6i0zGo0oKiqyP3A71fVDuvHuO4PB0KrWpLpO7zevW9cpnog6BocHIKIOMXLkSAwaNAhr1qyBwWBASEgIkpKS8Omnn6KwsLDB+qWlpbb/r7s7rLECIzIyEocPH663bMOGDU22KHWkxlqp1q5d2yA2k8mEjIyMenno0aMHlEolDh06VG/dTz75pME+9Xo9MjIyeDmPyAnYokREHWbOnDn47W9/i40bN+KRRx7BG2+8gUcffRR33XUXHnroIURGRqK4uBjHjx9Hfn4+vvzySwBAfHw8lEolVqxYAb1eD5VKhVGjRiEkJAQPPvgg3njjDTz77LO45ZZbcO7cOezZswdBQUESH631rrfNmzfDz88PsbGxOH78OPbt24fAwMB66xUUFGDatGm47777sHDhQgCAv78/pkyZgv/+978QBAGRkZH4/vvvUVJS0uB5du/ejVdeeQV/+9vfcP/993fEoRG5DRZKRNRhbr/9dvTs2ROrVq3CQw89hNjYWHz++edYunQpvvjiC5SXlyM4OBj9+/dHWlqabbuwsDDMnz8fy5cvxx//+EeYzWZ89NFHCAkJwUMPPYScnBx89tln+PHHHzFs2DB8+OGHDe66k8If//hHKBQKbNmyBQaDAUOHDsWHH36IJ598slXbv/baa6itrcX69euhUqkwZcoU/O53v8Odd97p5MiJqI4gttSjkIiImpSTk4OJEyfi9ddfx7Rp0+Dn51fv7j6pGI1GVFRUYNu2bViwYAE+++wzW+d6Imo99lEiInKABQsWIDk5Gd9++63UoQAA0tPTkZycjAULFkgdCpFLY4sSEZEdDAYDjhw5Yvs7Li4OISEhEkZkVVpainPnztn+HjRoEPz8/CSMiMg1sVAiIiIiagIvvRERERE1gYUSERERURNYKBERERE1gYUSERERURNYKBERERE1gYUSERERURNYKBERERE1gYUSERERURNYKBERERE14f8DLsoYpl91TpAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# fitting parameters\n", "n_episodes = 1_000\n", "n_total_steps = 0\n", "log_loss = False\n", "n_steps = n_episodes * 32\n", "all_returns = []\n", "\n", "# main loop\n", "for episode in range(n_episodes):\n", " episode_steps = 0\n", " episode_return = 0\n", " episode_loss = 0\n", "\n", " start_time = time.time()\n", "\n", " timestep = env.reset()\n", "\n", " # Make the first observation.\n", " agent.observe_first(timestep)\n", "\n", " # Run an episode\n", " while not timestep.last():\n", "\n", " # DEBUG\n", " # print(timestep)\n", "\n", " # Generate an action from the agent's policy and step the environment.\n", " action = agent.select_action(timestep.observation)\n", " timestep = env.step(action)\n", "\n", " # Have the agent observe the timestep and let the agent update itself.\n", " agent.observe(action, next_timestep=timestep)\n", " agent.update()\n", "\n", " # Book-keeping.\n", " episode_steps += 1\n", " n_total_steps += 1\n", " episode_return += timestep.reward\n", "\n", " if log_loss:\n", " episode_loss += agent.last_loss\n", "\n", " if n_steps is not None and n_total_steps >= n_steps:\n", " break\n", "\n", " # Collect the results and combine with counts.\n", " steps_per_second = episode_steps / (time.time() - start_time)\n", " result = {\n", " 'episode': episode,\n", " 'episode_length': episode_steps,\n", " 'episode_return': episode_return,\n", " }\n", " if log_loss:\n", " result['loss_avg'] = episode_loss/episode_steps\n", "\n", " all_returns.append(episode_return)\n", "\n", " display(env.plot_state())\n", " # Log the given results.\n", " print(result)\n", "\n", " if n_steps is not None and n_total_steps >= n_steps:\n", " break\n", "\n", "clear_output()\n", "\n", "# Histogram of all returns\n", "plt.figure()\n", "sns.histplot(all_returns, stat=\"density\", kde=True, bins=12)\n", "plt.xlabel('Return [a.u.]')\n", "plt.ylabel('Density')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "**Note:** You can simplify the environment loop using [DeepMind Acme](https://github.com/deepmind/acme)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [], "source": [ "# init a new N-back environment\n", "env, env_spec = NBack.create_environment()\n", "\n", "# DEBUG fake testing environment.\n", "# Uncomment this to debug your agent without using the N-back environment.\n", "# env = fakes.DiscreteEnvironment(\n", "# num_actions=2,\n", "# num_observations=1000,\n", "# obs_dtype=np.float32,\n", "# episode_length=32)\n", "# env_spec = specs.make_environment_spec(env)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[reverb/cc/platform/tfrecord_checkpointer.cc:150] Initializing TFRecordCheckpointer in /tmp/tmp7sxxomp9.\n", "[reverb/cc/platform/tfrecord_checkpointer.cc:386] Loading latest checkpoint from /tmp/tmp7sxxomp9\n", "[reverb/cc/platform/default/server.cc:71] Started replay server on port 42739\n", "2024-07-16 14:42:04.610076: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected\n", "2024-07-16 14:42:04.610155: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (TinasMacBookPro): /proc/driver/nvidia/version does not exist\n", "2024-07-16 14:42:04.611714: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2024-07-16 14:42:05.261603: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1658] (One-time warning): Not using XLA:CPU for cluster.\n", "\n", "If you want XLA:CPU, do one of the following:\n", "\n", " - set the TF_XLA_FLAGS to include \"--tf_xla_cpu_global_jit\", or\n", " - set cpu_global_jit to true on this session's OptimizerOptions, or\n", " - use experimental_jit_scope, or\n", " - use tf.function(jit_compile=True).\n", "\n", "To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a\n", "proper command-line flag, not via TF_XLA_FLAGS).\n", "2024-07-16 14:42:05.267531: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.\n" ] } ], "source": [ "def dqn_make_network(action_spec: specs.DiscreteArray) -> snt.Module:\n", " return snt.Sequential([\n", " snt.Flatten(),\n", " snt.nets.MLP([50, 50, action_spec.num_values]),\n", " ])\n", "\n", "# construct a DQN agent\n", "agent = dqn.DQN(\n", " environment_spec=env_spec,\n", " network=dqn_make_network(env_spec.actions),\n", " epsilon=[0.5],\n", " logger=loggers.InMemoryLogger(),\n", " checkpoint=False,\n", ")" ] }, { "cell_type": "markdown", "metadata": { "execution": {} }, "source": [ "Now, we run the environment loop with the DQN agent and print the training log." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "execution": {} }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[reverb/cc/client.cc:165] Sampler and server are owned by the same process (248687) so Table priority_table is accessed directly without gRPC.\n", "[reverb/cc/client.cc:165] Sampler and server are owned by the same process (248687) so Table priority_table is accessed directly without gRPC.\n", "[reverb/cc/client.cc:165] Sampler and server are owned by the same process (248687) so Table priority_table is accessed directly without gRPC.\n", "[reverb/cc/client.cc:165] Sampler and server are owned by the same process (248687) so Table priority_table is accessed directly without gRPC.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
episode_lengthepisode_returnsteps_per_secondepisodessteps
99532-13.01049.24817599631872
99632-13.01113.22109799731904
99732-14.01053.15888799831936
99832-19.01213.91501999931968
99932-11.01209.724540100032000
\n", "
" ], "text/plain": [ " episode_length episode_return steps_per_second episodes steps\n", "995 32 -13.0 1049.248175 996 31872\n", "996 32 -13.0 1113.221097 997 31904\n", "997 32 -14.0 1053.158887 998 31936\n", "998 32 -19.0 1213.915019 999 31968\n", "999 32 -11.0 1209.724540 1000 32000" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# training loop\n", "loop = EnvironmentLoop(env, agent, logger=loggers.InMemoryLogger())\n", "loop.run(n_episodes)\n", "\n", "# print logs\n", "logs = pd.DataFrame(loop._logger._data)\n", "logs.tail()" ] } ], "metadata": { "colab": { "collapsed_sections": [], "include_colab_link": true, "name": "human_rl", "provenance": [], "toc_visible": true }, "kernel": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.9.16" } }, "nbformat": 4, "nbformat_minor": 4 }