diff --git a/docs_nnx/mnist_tutorial.ipynb b/docs_nnx/mnist_tutorial.ipynb index df3b8373d..fb9103467 100644 --- a/docs_nnx/mnist_tutorial.ipynb +++ b/docs_nnx/mnist_tutorial.ipynb @@ -39,7 +39,7 @@ "source": [ "## 2. Load the MNIST dataset\n", "\n", - "First, you need to load the MNIST dataset and then prepare the training and testing sets via Tensorflow Datasets (TFDS). You normalize image values, shuffle the data and divide it into batches, and prefetch samples to enhance performance." + "First, we need to load the MNIST dataset and prepare the training and testing sets using the Hugging Face [`datasets`](https://huggingface.co/docs/datasets) package. We'll normalize the image values and shuffle the training data. The `make_batches` helper converts the dataset into batches of NumPy arrays with a channel dimension added, dropping any incomplete final batch." ] }, { @@ -49,37 +49,29 @@ "metadata": {}, "outputs": [], "source": [ - "import tensorflow_datasets as tfds # TFDS to download MNIST.\n", - "import tensorflow as tf # TensorFlow / `tf.data` operations.\n", - "\n", - "tf.random.set_seed(0) # Set the random seed for reproducibility.\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from datasets import load_dataset\n", "\n", "train_steps = 1200\n", "eval_every = 200\n", "batch_size = 32\n", "\n", - "train_ds: tf.data.Dataset = tfds.load('mnist', split='train')\n", - "test_ds: tf.data.Dataset = tfds.load('mnist', split='test')\n", - "\n", - "train_ds = train_ds.map(\n", - " lambda sample: {\n", - " 'image': tf.cast(sample['image'], tf.float32) / 255,\n", - " 'label': sample['label'],\n", - " }\n", - ") # normalize train set\n", - "test_ds = test_ds.map(\n", - " lambda sample: {\n", - " 'image': tf.cast(sample['image'], tf.float32) / 255,\n", - " 'label': sample['label'],\n", - " }\n", - ") # Normalize the test set.\n", - "\n", - "# Create a shuffled dataset by allocating a buffer size of 1024 to randomly draw elements from.\n", - "train_ds = train_ds.repeat().shuffle(1024)\n", - "# Group into batches of `batch_size` and skip incomplete batches, prefetch the next sample to improve latency.\n", - "train_ds = train_ds.batch(batch_size, drop_remainder=True).take(train_steps).prefetch(1)\n", - "# Group into batches of `batch_size` and skip incomplete batches, prefetch the next sample to improve latency.\n", - "test_ds = test_ds.batch(batch_size, drop_remainder=True).prefetch(1)" + "dataset = load_dataset('mnist')\n", + "train_ds = dataset['train'].shuffle(seed=0)\n", + "test_ds = dataset['test']\n", + "\n", + "def make_batches(ds, batch_size):\n", + " \"\"\"Yield batches of normalized (image, label) numpy arrays.\"\"\"\n", + " for i in range(0, len(ds), batch_size):\n", + " batch = ds[i : i + batch_size]\n", + " if len(batch['label']) < batch_size: # drop incomplete final batch\n", + " break\n", + " images = np.stack([\n", + " np.array(img, dtype=np.float32)[..., None] / 255.0\n", + " for img in batch['image']\n", + " ])\n", + " yield {'image': images, 'label': np.array(batch['label'])}" ] }, { @@ -94,14 +86,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "6", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -113,7 +105,7 @@ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -163,7 +155,7 @@ "source": [ "### Run the model\n", "\n", - "Let's put the CNN model to the test! Here, you’ll perform a forward pass with arbitrary data and print the results." + "Let's put the CNN model to the test! Here, we’ll perform a forward pass with arbitrary data and print the results." ] }, { @@ -175,8 +167,8 @@ { "data": { "text/plain": [ - "Array([[ 0.11409501, 0.4546129 , -0.6421267 , -0.12122799, -0.22859162,\n", - " 0.13616608, 1.0126765 , -0.03625144, 0.6132787 , -0.06018351]], dtype=float32)" + "Array([[ 0.11406855, 0.45456237, -0.6421087 , -0.12120342, -0.22858061,\n", + " 0.13615587, 1.0126833 , -0.036236 , 0.6132397 , -0.0601905 ]], dtype=float32)" ] }, "execution_count": 3, @@ -198,7 +190,7 @@ "source": [ "## 4. Create the optimizer and define some metrics\n", "\n", - "In Flax NNX, you need to create an `nnx.Optimizer` object to manage the model's parameters and apply gradients during training. `nnx.Optimizer` receives the model's reference, so that it can update its parameters, and an [Optax](https://optax.readthedocs.io/) optimizer to define the update rules. Additionally, you will define an `nnx.MultiMetric` object to keep track of the `Accuracy` and the `Average` loss." + "In Flax NNX, you need to create an `nnx.Optimizer` object to manage the model's parameters and apply gradients during training. `nnx.Optimizer` receives the model's reference, so that it can update its parameters, and an [Optax](https://optax.readthedocs.io/) optimizer to define the update rules. Additionally, we'll define an `nnx.MultiMetric` object to keep track of the `Accuracy` and the `Average` loss." ] }, { @@ -210,7 +202,7 @@ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -222,7 +214,7 @@ { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ "" @@ -265,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "14", "metadata": {}, "outputs": [], @@ -300,136 +292,124 @@ "\n", "> **Note:** The code shows how to perform several in-place updates to the model, the optimizer, the RNG streams, and the metrics, but _state updates_ were not explicitly returned. This is because Flax NNX transformations respect _reference semantics_ for Flax NNX objects, and will propagate the state updates of the objects passed as input arguments. This is a key feature of Flax NNX that allows for a more concise and readable code. You can learn more in [Why Flax NNX](https://flax.readthedocs.io/en/latest/why.html).\n", "\n", + "## 6. Define test set inference functions\n", "\n", - "## 6. Train and evaluate the model\n", - "\n", - "Now, you can train the CNN model. Before the training loop, we use [`nnx.view`](https://flax.readthedocs.io/en/latest/guides/view.html) to create a `train_model` (with dropout enabled and batch norm in training mode) and an `eval_model` (with dropout disabled and batch norm using running statistics). These views share the same underlying weights, so updates during training are automatically reflected during evaluation." + "We'll also create a `jit`-compiled model inference function (with `nnx.jit`) - `pred_step` - to generate predictions on the test set using the learned model parameters. Before the training loop, we use [`nnx.view`](https://flax.readthedocs.io/en/latest/guides/view.html) to create a `train_model` (with dropout enabled and batch norm in training mode) and an `eval_model` (with dropout disabled and batch norm using running statistics). These views share the same underlying weights, so updates during training are automatically reflected during evaluation. We can use the `eval_model` for inference. This will enable us to visualize test images alongside their predicted labels for a qualitative assessment of model performance." ] }, { "cell_type": "code", - "execution_count": null, - "id": "22", + "execution_count": 6, + "id": "68c7ed78-bdd6-4d64-b2c6-faa390a2fb51", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABL4AAAHDCAYAAAAqZtO0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAApvxJREFUeJzs3Qd4VFX6BvB3Mukd0hMCoXcSepMmCIrS7QXL2sWy/NUVReyyuitrwYq9NzoqiDRBmhBC7530AOmkzcz/+c7NpEACCSS5U97f81wyc+dm5oRkkjvvfOc7BovFYgEREREREREREZGDcdF7AERERERERERERPWBwRcRERERERERETkkBl9EREREREREROSQGHwREREREREREZFDYvBFREREREREREQOicEXERERERERERE5JAZfRERERERERETkkBh8ERERERERERGRQ2LwRUREREREREREDonBFxEREREREREROSQGX0Skq88//xwGgwGbNm3SeyhEREREVOq9995T52i9e/fWeyhERJeEwRcRERERERFV8s033yAmJgYbN27EgQMH9B4OEdFFY/BFREREREREZQ4fPoy1a9dixowZCAkJUSGYLcrLy9N7CERkBxh8EZHN27JlC6666ir4+/vD19cXQ4cOxfr16ysdU1xcjBdeeAGtW7eGp6cngoKCcNlll2Hp0qVlx6SkpODOO+9EkyZN4OHhgYiICIwZMwZHjhzR4asiIiIisk0SdDVq1AhXX301rr322iqDr8zMTPzzn/9UVWFyXiXnVxMnTkRGRkbZMQUFBXj++efRpk0bdX4m517jx4/HwYMH1e0rV65U0ynlY0Vybib7pSWG1R133KHOA+VzR44cCT8/P9xyyy3qttWrV+O6665D06ZN1Viio6PV2M6cOXPOuPfs2YPrr79eBXpeXl5o27YtnnnmGXXbihUr1OPOnTv3nM/79ttv1W3r1q27pP9bImp4rjo8JhFRje3cuRMDBgxQodeTTz4JNzc3fPjhhxg8eDBWrVpV1ndCTqqmT5+Ou+++G7169UJ2drbqGxYfH48rrrhCHTNhwgR1fw8//LA6SUtLS1PB2LFjx9R1IiIiItKCLwmo3N3dcdNNN+H999/H33//jZ49e6rbc3Nz1fnZ7t27cdddd6Fbt24q8FqwYAFOnDiB4OBgmEwmXHPNNVi2bBluvPFGPProo8jJyVHnXjt27EDLli1rPa6SkhKMGDFCvbn53//+F97e3mr/Tz/9hPz8fDzwwAPqzU+ZnvnOO++oschtVtu2bVPjlvPJe++9V53/SZC2cOFCvPLKK+r8UkIz+frHjRt3zv+JjLlv376X/P9LRA3MQkSko88++8wiv4r+/vvvKm8fO3asxd3d3XLw4MGyfUlJSRY/Pz/LwIEDy/bFxsZarr766mof5/Tp0+px/vOf/9TxV0BERETkODZt2qTOmZYuXaqum81mS5MmTSyPPvpo2THTpk1Tx8yZM+ecz5fjxaeffqqOmTFjRrXHrFixQh0jHys6fPiw2i/niVa333672vfUU0+dc3/5+fnn7Js+fbrFYDBYjh49WrZPzh3lHLLivorjEVOmTLF4eHhYMjMzy/alpaVZXF1dLc8991wV/2NEZOs41ZGIbJa8U/j7779j7NixaNGiRdl+KZO/+eabsWbNGlXZJQIDA1U11/79+6u8Lylll3ctpZT+9OnTDfY1EBEREdkTqWwKCwvDkCFD1HWZ3nfDDTfg+++/V+dmYvbs2YiNjT2nKsp6vPUYqfySSvvqjrkYUtVV1Xlexb5fUn3Wr18/KfJQLTNEeno6/vzzT1WhJlMiqxuPTNcsLCzEzz//XLbvhx9+UNVmt95660WPm4j0w+CLiGyWnKBI2br0Xjhb+/btYTabcfz4cXX9xRdfVL0mpIdE586d8cQTT6hydivp9/Daa6/ht99+UydzAwcOxOuvv676fhERERGR9qajBFwSekmDe1nNUTZpLZGamqqmLQqZHtipU6fz3pccI+dwrq51111H7kt6iZ1N2lZID7DGjRurPmDSv2vQoEHqtqysLPXx0KFD6uOFxt2uXTs1pbNiXzO53KdPH7Rq1arOvhYiajgMvojIIUiQJSdYn376qTqh+fjjj1W/Cflo9dhjj2Hfvn2qF5g0WH322WdVgGZ9J5CIiIjImS1fvhzJyckq/JIFg6ybNIMXdb26Y3WVX9bKsrPJG5kuLi7nHCv9XH/55Rf861//wrx581QfMWtjfHmjtLak6kt6yUqPMDm/lEWVWO1FZL/Y3J6IbJa8WydNS/fu3Vvlijxy4iMNSK3kXT5ZtVE2aboqYZg0vZeG91bSlPT//u//1CbTIuPi4vDGG2/g66+/brCvi4iIiMgWSbAVGhqKd99995zb5syZo1Y7/OCDD9T5lDSoPx85ZsOGDWrlbWkmXxVZOVJI1X5FR48erfGYt2/frt7Y/OKLL1RgZVVxZW9hbZtxoXELacY/efJkfPfdd2plSBm/TPckIvvEii8isllGoxHDhw/H/Pnz1bLWVlJqL0tKy4o+stqjOHnyZKXPlTJ3KUeXHg1CpkzKktpnn5DJUtjWY4iIiIiclQQ8Em7JSozXXnvtOdukSZPUqoyycqOslL1161YVhJ1N+moJOUZ6bc2cObPaY5o1a6bO96T3VkXvvfdejcctn1/xPq2X33rrrXPeUJU3RWV2gEyNrGo8VtKb7KqrrlJvjEoYeOWVV6p9RGSfWPFFRDZBTkIWL158zn6p2JJ37CTkevDBB1Vvhw8//FCFVdKjy6pDhw5qCeru3buryq9NmzappqRykibkncChQ4eqUn05Vu5HTtYkRJN39YiIiIicmQRaEmyNHj26ytulx5WERxIEyRuQcp513XXXqWbxcv516tQpdR9SESaN76X66ssvv1SVUxs3bsSAAQNU4/k//vhDndONGTMGAQEB6j7eeecdNe1R3pRctGgR0tLSajxu6ckln/f4448jMTFRvSkqjfWrWszo7bffVueU0g7j3nvvRfPmzdWbqzJNMiEhodKxMn4J/MRLL71U6/9PIrIhei8rSUTOTZapll9F1W3Hjx+3xMfHW0aMGGHx9fW1eHt7W4YMGWJZu3Ztpft5+eWXLb169bIEBgZavLy8LO3atbO88sorlqKiInV7RkaG5aGHHlL7fXx8LAEBAZbevXtbfvzxR52+ciIiIiLbMWrUKIunp6clLy+v2mPuuOMOi5ubmzqvOnnypGXSpEmWqKgoi7u7u6VJkyaW22+/Xd1mlZ+fb3nmmWcszZs3V58XHh5uufbaay0HDx4sOyY9Pd0yYcIEdY7XqFEjy3333WfZsWOHOg+U80QruW85h6vKrl27LMOGDVPnisHBwZZ77rnHsnXr1nPuQ8h9jxs3Tp0zytfbtm1by7PPPnvOfRYWFqrxyDnjmTNnav3/SUS2wyD/6B2+EREREREREdmKkpISREZGYtSoUfjkk0/0Hg4RXQL2+CIiIiIiIiKqQFaHTE9Pr9Qwn4jsEyu+iIiIiIiIiAC1EuW2bdtUXy9paB8fH6/3kIjoErHii4iIiIiIiAjA+++/jwceeAChoaGqOT8R2T9WfBERERERERERkUNixRcRERERERERETkkBl9EREREREREROSQXGEHzGYzkpKS4OfnB4PBoPdwiIiIyA5IN4ecnBy1HL2LC9/rs1U8zyMiIqL6PM+zi+BLToaio6P1HgYRERHZoePHj6NJkyZ6D4OqwfM8IiIiqs/zPLsIvuQdQOsX5O/vr/dwiIiIyA5kZ2erQMV6HkG2ied5REREVJ/neXYRfFnL3uVkiCdEREREVBucPmfbeJ5HRERE9Xmex4YXRERERERERETkkBh8ERERERERERGRQ2LwRUREREREREREDskuenwRERHVB5PJhOLiYr2HQRfJzc0NRqNR72FQA+HzleoSf38QETkPBl9EROR0LBYLUlJSkJmZqfdQ6BIFBgYiPDycDewdGJ+vVF/4+4OIyDkw+CIiIqdjfREdGhoKb29vvuixQxKG5OfnIy0tTV2PiIjQe0hUT/h8pbrG3x9ERM6FwRcRETnddCnri+igoCC9h0OXwMvLS32UF6/y/eS0JcfD5yvVF/7+ICJyHmxuT0RETsXaI0gqR8j+Wb+P7P3kmPh8pfrE3x9ERM6BwRcRETklTpdyDPw+Ogd+n6k+8OeKiMg5MPgiIiIiIiIiIiKHdFHB17vvvouYmBh4enqid+/e2LhxY7XHfv755+rdlIqbfB4RERHpR/6Ov/nmm3VyXytXrlR/37nqHpHtP1+JiIicTa2b2//www+YPHkyPvjgAxV6yR/hESNGYO/evaoxZFX8/f3V7VYsKyYiIqq9wYMHIy4urk5eAP/999/w8fGpk3ER0bn4fCUiIrLTiq8ZM2bgnnvuwZ133okOHTqoAEwaQ3766afVfo4EXeHh4WVbWFjYpY6biIiIzmKxWFBSUlKjY0NCQtgwnEhHfL6WKyoq0nsIRETkwFxq+0dp8+bNGDZsWPkduLio6+vWrav283Jzc9GsWTNER0djzJgx2Llz53kfp7CwENnZ2ZW2+mI2W7D+0ElsPHyq3h6DiIjoUt1xxx1YtWoV3nrrrbLWAdZ2Ar/99hu6d+8ODw8PrFmzBgcPHlR/b+WNJl9fX/Ts2RN//PHHeadOyf18/PHHGDdunHqB3bp1ayxYsOCixzt79mx07NhRjUke64033qh0+3vvvaceQ9ofyDivvfbastt+/vlndO7cGV5eXggKClLnGXl5eRc9FqKGZsvPV5PJhH/84x9o3ry5eo61bdtWjfNs8qa29TkcERGBSZMmld0m05rvu+8+NWZ5Dnfq1AmLFi1Stz3//POq0q0iGbt8DRX/f8aOHYtXXnkFkZGRagziq6++Qo8ePeDn56feLL/55puRlpZW6b7kdcQ111yjZpTIcQMGDFD/h3/++Sfc3NyQkpJS6fjHHntMHUNERA0sLwPY9BnsLvjKyMhQfyzPrtiS62f/kbGSP2Tyh3P+/Pn4+uuvYTab0a9fP5w4caLax5k+fToCAgLKNgnM6ssX647gxo/WY8bS8qmYRETkfJUX+UUlDb7J49aUvDDt27evqrpOTk5Wm/Xv41NPPYV///vf2L17N7p06aLecBo5ciSWLVuGLVu24Morr8SoUaNw7Nix8z7GCy+8gOuvvx7btm1Tn3/LLbfg1KnavzEkb5LJ/dx4443Yvn27eiH87LPPqhf+YtOmTXjkkUfw4osvqlYIixcvxsCBA9Vt8nXddNNNuOuuu9TXI/3Dxo8fX6v/K3Jcej1XHen5KufiTZo0wU8//YRdu3Zh2rRpePrpp/Hjjz+WHfP+++/joYcewr333quewxKqtWrVquzzr7rqKvz111/q3F7uQ74eo9GI2pCvV57/S5cuLQvNiouL8dJLL2Hr1q2YN28ejhw5okIyq8TERPW7QsK45cuXq9818rtCKudkf4sWLVR4ZiX3980336hjiIiogZQUAn+9BbzdFVj0GHBkDeyux1dtyR992awk9Grfvj0+/PBD9YetKlOmTFF9xKyk4qu+wq/hHcPxwsJd2HD4FFKyChAewMb7RETO5kyxCR2mLWnwx9314gh4u9fsT7G8EeTu7q6qO6QSQuzZs0d9lADpiiuuKDu2cePGiI2NLbsuf2/nzp2rXrxWrNo4m7zAlNBJvPrqq3j77bfVAjbyQry2bRGGDh2qwi7Rpk0b9eL4P//5j3oMeUEv/YqkakMqNqQqvGvXrupYCQjkRayEXbJfSPUX1Q1ZoEi+D/KGpfyMvPPOO+jVq1eVx0poIG9GfvHFFypwkDczX3vttUo/D/KGqASbEoDIfUr1jnyPp06dWi89XfV6rjrS81WqoiQ0s5LKL5m5IcGXBGni5Zdfxv/93//h0UcfLTtOKtGEVKPJ40hwJ89tIYFTbcnvAKlak/8nq4oBldynfE3yuBIOSjWc/PzK/+3333+vvg5hHYOQSrbPPvsMTzzxhLq+cOFCFBQUlH1dRERUj+QNot0LgKXTgNNHtH3hXQBXL9hVxVdwcLB6Nyc1NbXSfrlu/aN+IfJHSk5uDxw4UO0x8i6OlC9X3OpLVKAXesY0Ut+jRduS6u1xiIiI6otMDapIXiQ+/vjj6o2mwMBA9YJRXqReqIJEqk8qviiVv79nTzOqCXms/v37V9on1/fv36+CEnnRL6GWvLC97bbbVEVGfn6+Ok4CAAnNJOy67rrrMGvWLJw+fbrWY6DqFyh67rnnEB8fr/6vZYGi6r7HEl7JG5USjklwef/996updVKVZCVBmFQHzZw5U33f5frrr7+uPods9/kqAZJMt5TeYfJ4H330UdnjyX0kJSWp52FVEhISVMVYxcDpYshzvGLoJaSCS6rdmjZtqkLxQYMGqf3Wscljy7RFa+hVVRgorzHWr1+vrkuVqYReXBiAiKieJSUAn18N/DhRC718w4Ex7wH3rgKadIddVXzJHyf5IymlyTIv31ruLNfP945URXLCKyXTUpJtK0bHRuLvI6exYGsS7h5Q+3esiIjIvnm5GVU1hx6PWxfOflEnL6Jl+tB///tfNT1J+vhID60LNZA++8WkVOzI3/m6Ji9oJXiRaYy///67mmolVUOycp288Jexr127Vt0mAcozzzyDDRs2qMoUungVFygSskDRL7/8olpSyPS7s8mUMfm/t56zPfDAA6raR/q1SYWXkO+T9Ke6+uqr1XXp4/Tdd9+piiBHeq5aH9sRnq9SLSWPKd9HmZUhz0epApTnmJDHP58L3S79f8+eFirVgxf6f5A+fhLEyiZhuIRyEnjJdev/xYUeW1aYl+BMqr7k94X0U5PfM0REVE+yk4HlLwEJ30rJF+DqCfR7BOj/KODhC1tR66mO8k7h7bffrt6tktJ4aVYpf6isJ1ETJ05EVFSUKo23lnP36dNH/SGXRpjyh/Xo0aO4++67YStGdo7A8wt3YduJLBzOyEPzYL4rRETkTOQFY02nMOlJ3oCSN5AuRHrvSOWDVOdYK0qkV05DkcoVGcPZY5IKEWsfIFdXV9W0XjapQJLAS3r2yBRH+X5IhZhsEopJdZhM/arYBoFqx7pAkbSTqOkCRbLYkDQur0iCB2nIXrGFhVQL7du3T31/pTeT3C4hmzM/V235+SqPJ9+3Bx98sGyfNIe3kiBMAkx5Y3vIkCFVVppJr17r9/xsEljJtFcJv6zTXaVS60JkKujJkydVvzBrixPpB3j2Y8vUWwnSqqv6ktcYMgVUqtJatmx5TvUpERHVgaJ8YN1MYM2bQHHpAkSdrwOGPgcE1l+P9otV6zOHG264Aenp6epEVP6oyaot0pTW2vBe3pmREykrmZ4g7y7KsY0aNVIVY/LuYIcOHWArgnw9cFmrYKzal44FCUl4dFhrvYdERER0DnkxKlUZ8qJYpidVV90hK7zNmTNHVT7IC0/ptVUflVvVkd5A0pdHehXJeYMEKzIVTlZyFNLI+tChQ6oZtZwb/Prrr2p80kNKvj55wT18+HBVvSHX5bxDwjS6eOdboMjae+psUmkjAZZ8nyRAkO+L/FxVDHOkUkx6sbZr106FmnKbrNQnjdarI4GabFb1uXq3nmz1+SqP9+WXX2LJkiWqKkoq+6TasmJFpVRgytRWeQ5KI/ucnBwVmD388MNq+qH8TEyYMEH9fMib2/IzJGOX/mKDBw9Wz1mZ8iqVa/I6QSqvLtS6RKY3SlgoVZ7y2Dt27DinH7DMMJHbZeEMCXGl35dMa5Q3460rQ8rPrTyW9CmTN+CJiKgOSUXv9p+BP54HsksXLGzSE7jy30CTylP5bUmtenxV/KMjVVty0iJ/0Hv37l12m5QTW1dtEv/73//KjpXwS0rqrQ1sbcmYuEj1cf7WRK4cRURENkmmJ0m4IG8eWacBVUVejEqgJFUd8mJaXgh269atwcYpjyWNsmVKVadOndSbZfIC1Lo6m1R3yQv9yy+/XAVaMuVOpsd17NhRvWD9888/1fQ6qSaRPlMyJUtefFPDkpUJJSSRUEsCCTn/kwr/im9wyvdZpqV9++23avqqVOPIlD35aAurd+vJVp+v9913n6qslFBazuGlyqpi9ZeQ2R0yq0PCanleykIU0qPPavbs2Srclsoq+fqefPLJskBUntPyedJHTPrIybRX+b+4EPk/ktcQstqk3KdUfsnPUkVBQUGqMlSq4iSAkzfUpQ9gxeov+fmU3zUyHpmJQkREdeT4RuDjYcCcu7XQKyAamPAJ8I+lNh16CYPFDlIeeSdQToyysrLqrdF9bmEJur+0FIUlZix6+DJ0igqol8chIiJ9yQpfhw8fVtUNZ0/jIsf6fjbE+YM9TXWUFQZ//vnnsj6t1oBDWlHMnz//vP/HEo7Iio1S4SUVezt37lS3SWgl+x566KGy46XSRnqAVVdJVlXFl9xPVd8nPl/pYsjqjlJ1Jitjng9/voiIaiDzmFbhtWO2dt3NBxgwGej7EOCm34qNtTnPu6iKL0fk6+GKYe218n9pck9ERETkKCouUGRlXaBIGpyfjwQC0r+1pKREVfpIM3srWY2zYgWYkCqn803Va8jVu8m5yIsf6TEnFYgyLZOIiC5BYQ6w7EVgZs/S0MsAdL0VeCQeGPi4rqFXbTH4qmBUrDbdceHWJJjNNl8IR0RE1CCk3470KKpqk9vIPsjiADItTKYh7t69W63SePYCRRWb30s7C5mSKv3YVq9erfo3SaAl09qsZGqe9PSSVhbSy0oWIZCpe9ZG7dTwnPn5KqGs9AeUr/OKK67QezhERPbJbALivwLe6Q6sfgMoKQBiBgD3rQLGvAv4hcPe2MeyOA1kcNsQ+Hm6IjmrAH8fOYXeLYL0HhIREZHupD9XdT16WK1jP2q7QJFMA5MeaxJ8SWgifdekEbr0aLOSRuPSjF16RKWlpanpkNJDSh6D9OHMz1fpNUxERJfg8GpgyRQgZbt2vVFzYPjLQLurZWll2Cv2+DrLkz9vxY+bTuDm3k3x6rjO9fpYRETU8NjTxbGwx5f9O9/3ic9Xqk/8+SIiKnXyILB0GrBnkXbdIwAY9ATQ617A1QO2iD2+LsHo2Cj18dftySgqabil34mIiIiIiIiIGsyZTGDJM8C7vbXQy2AEet6t9fHq97DNhl61xamOZ+nbMgjBvh7IyC3EmgPpuLydVv5PRERERERERGT3TCXA5s+AldOB/JPavlbDgOGvAKHt4GhY8XUWo4sB13SJUJcXJHB1RyIiIiIiIiJyEPv/AD7oD/z6uBZ6BbcFbpkN3DrbIUMvwYqvKoyJi8Tna4/g912pOFNkgpe7Ue8hERERERERERFdnPS92rTGA0u1616NgSFPA93vBIyOHQ059ld3keKiA9G0sTeOncrHH7tTMSo2Uu8hERERERERkT05dUj72LiF3iMhZ5Z3UpvSuOlTwGICXNyA3vcBAx8HvBrBGTD4qoLBYMDo2EjMXHEA8xOSGHwREREBOHLkiFr9bMuWLYiLi9N7OERERLaluAA4ugbYvxTY/3t58NWkJ9BtItBxPODhq/coyVmUFAEbPwJWvQ4UZmn72l0DXPEiENQSzoTBVzVGx2nB16p9acjKL0aAt5veQyIiIic3ePBgFTi9+eabdXJ/d9xxBzIzMzFv3rw6uT8iKsfnK5GTOH1UmzomYdehVUDJmfLbpLLGYgZO/K1ti6cAncYDXScCTXpIxYWeIydHZbEAe34Blj5bHr6GdQaufBVoPrBeH7rEZMaelBzEHzuNLccy1ccf7+uLMH9P6InBVzXahPmhXbif+qb9tiMZN/ZqqveQiIiIiIjsVlFREdzd3fUeBtGlV9EcX69VdEnYlb6n8u3+UdrqeK2HAy0GAUX5wNbvgPgvgVMHtY+yhbTXqsC63AD4BOn11ZCjSd4GLHkaOLJau+4TCgx9Foi7BXCp+97l6TmFlUKu7SeycKbYVOmYLcdO48pO2gKCeuGqjheo+hILtnJ1RyIi0pdUe6xatQpvvfWWmpIvm0w93LFjB6666ir4+voiLCwMt912GzIyMso+7+eff0bnzp3h5eWFoKAgDBs2DHl5eXj++efxxRdfYP78+WX3t3LlylqPS8bUq1cveHh4ICIiAk899RRKSkou+PhCHk8+18fHB4GBgejfvz+OHj1aR/9jRPqxlefrv/71L7Rp0wbe3t5o0aIFnn32WRQXF1c6ZuHChejZsyc8PT0RHByMcePGld1WWFio7iM6Olo9x1u1aoVPPvlE3fb555+r521FUo0mY7OScUvV28cff6ymSctjiMWLF+Oyyy5Tny9f5zXXXIODBw9Wuq8TJ07gpptuQuPGjdXviB49emDDhg3q/9HFxQWbNm2qdLxU1jVr1gxms7mG3yWiWshO1sKqH24FXm8BfDEKWPuOFnoZjECz/sCw54EH1gL/3AmMfhtofw3g4Qf4hQGXPQY8vBm441egy42AqyeQvhtYMgWY0Q746U7g4AqAP790sXJSgfmTgA8HaqGX0QMY8H/AI/FawFoHoVdRiRlbj2fi878O45HvtuCy15aj5yt/4L6vNuODVQex8fApFXr5ebpiYJsQPDq0Nb64qxf6twqG3ljxdR6jukTi9cV7se7QSaRmF+henkdERPVYEl6c3/CP6+Zd42kO8gJ637596NSpE1588UXt093cVHB0991343//+x/OnDmjXqRef/31WL58OZKTk9ULx9dff129mM3JycHq1athsVjw+OOPY/fu3cjOzsZnn32m7k9eYNZGYmIiRo4cqV7kf/nll9izZw/uuece9eJWXvCe7/ElHBs7dqw6/rvvvlOVIBs3bqz0opnIZp6rdvp89fPzUwFVZGQktm/frp5vsu/JJ59Ut//yyy/qsZ555hn1HJbn4a+//lr2+RMnTsS6devw9ttvIzY2FocPH64U1NXEgQMHMHv2bMyZMwdGo/bCS8K8yZMno0uXLsjNzcW0adPUOBISElSoJfsGDRqEqKgoLFiwAOHh4YiPj1ehVkxMjAoE5f9BwjAruS6/i+TziS6ZqQRI3FRa1fU7kLK98u1SRdP6Cm1rMQTwqhwCV0l+f8T017arXgN2/KyFaclbgZ1ztC2wqTYNMu5mICCq3r48ciDFZ4B17wJr/gcU5Wr7Ok3Qglj5eboEqdkFqlorXqq5jp7G9sQsFJaYz/mxbhPqh65NA9GtaSP1sWWIL1xcbOt8jsHXeUQ39kb3Zo2w+ehpLNqWjH9c1lzvIRERUX2QF9Kv6rCQydNJgLtPjQ4NCAhQU4SkckNeBIqXX34ZXbt2xauvvlp23KeffqqqM+RFt7x4lIBp/PjxqhJCSDWJlVSVSEWH9f5q67333lOPNXPmTBVYtWvXDklJSerFvLyQlRfy1T3+qVOnkJWVpSo9WrbUGqy2b9/+osZBTkSv56qdPl+nTp1adlkCIwnQvv/++7Lg65VXXsGNN96IF154oew4CbiEjOnHH3/E0qVLVdAkpGqstiRMk1AtJCSkbN+ECRMqHSP/D3L7rl27VFj47bffIj09HX///XdZwCfVZlYSHt5///2YMWOGqkSTUEyCPamII7pouenAgT+0oOvgcqAgs8KNBq0nl0xflLArPBa4lJBVgrKed2tbUgKw5Stg209A5jFgxcvAyle16ZJSqdPmSsDIftNUxRtBO2YDf7wAZB3T9kV1B0ZMB5r2rvXdFZaYsCspWwu5jp1GwrFMJGZW6FdXKsDLrSzkkq1LdAD8PW3/55PB1wWMiYtUwdeChEQGX0REZFO2bt2KFStWqGlTZ5NpQ8OHD8fQoUPVi+cRI0ao69deey0aNaqbpaulAqVv376VqrRkuqK8gJdpSvICurrHlxezUp0h+6+44gr1wloqX2S6JJEj0uP5+sMPP6hqLbl/a7Dm7+9fdrtUWEkVWFXkNqnQksqrSyEhXsXQS+zfv1+F4zJ1USrIrNMTjx07poIveWwJCaurapNq0Yceeghz585VwZ1UtQ0ZMkSFe0Q1Jj93SVvKq7rkMizlt3s1Ku/V1XJo/fXhiozTtiteAnYv0KrAjv5VPi6fEK0CTCrBgssDYHJiJzZr02SPbyjvKycVXp2urXEgm5x1BvFHtZBLqrp2JGWrqYwVSdFW23D/StVcLYJ97LI6n8HXBYzsHIEXFu7C1hNZOJKRh5jgmr3TR0REdkSmMEk1hx6PewnkheyoUaPw2muvnXObBEjyolWqNdauXYvff/8d77zzjprSJC82pd9OfbvQ48vUpEceeUT1+5EX6FKdIsf36dOn3sdGdkqv56r1se3o+SpTFG+55RZVzSVBmlShSbXXG2+8UamKrDrnu03IlEKZhlnR2f3DhPTnOpv8P0ggNmvWLDUNU4IvCbykOqwmjy3VdDINU36HSIWcVIjJ9FKiC8o/pVVzSVN6qe7KP2vqbkRsaVXXcK16ph6agVfL3RuIvVHbMg5oVWAJ3wJ5acBfb2mb9BKTKrD2o7XjyblkndAqvLb/WP536bJ/An0nnffnoaDYhJ1JWSro2nL8tPqYkl1wznGNfdzRNToQ3Zo1Uh+7RAfC18MxIiPH+CrqUbCvh2rG9ue+dNXk/pGhrfUeEhER1TV556qGU5j0JC/2TKbylXK6deumeudIlYOra9V/0uVdOanCkk0qLOTFplRJSH+ds++vtmRqojy+vPi1vvv3119/qR5CTZo0ueDjC6nqkG3KlCmqekxewDL4Int/rtrC81UCNPl8Cc+szl48QnpsLVu2DHfeeec5ny+VZxJISZN+61THiqSKS/qQSb8ua7gllVoXcvLkSezdu1eFXgMGDFD71qxZc864pCG+TImurupLpjtKWCZTrq1TRInOIeGs9OeyrsB4YiNgqVDV4uEPtByiBV1S3eV3cVP/65xUdl3xAnD5VGDfEq0K7MBSrRJMtl+fADpfp4VgUi1Gjq0wVws+ZUGFktLph7JK4+XPAv6VK+XlnEymKMqURWt/rl1JWSg2VX6jwuhiQLtwv7JKLvnYLMjbLqu5aoLBVw2Mjo1Uwdf8hEQ8fHkrh/1hICIi2yYvmK2rmsl0KZnqIy8epSG29OyRF4jSSFqqOuRFo6x6Ji9qZcpUaGio+lzpm2PtpSX3t2TJEvUiVFZWk4oQacBdUw8++KBaSe3hhx/GpEmT1P0899xz6kW6VIPI41X3+NIk+6OPPsLo0aNVxYd8rkx/kioOIkeg9/O1devWauqg3L+s2iiN7CVEq0ierzK9UvrsyZRBCZCkub306ZPHu/3223HXXXeVNbeX4CwtLU1NS+7du7fqYfb000+ryk0Zr0w5vBCZuinjl+e/VLrJGGU12Irk/0h6ocmUxunTp6vjtmzZon5XSEAu5P9FQnIZq4zxQlVi5EQKsoFDK8vDrtyUyreHdihtTD8ciO5t2/2zZGyyOqRsWYlaBdiWL7VeYJs+0bbwLloAJkFYTZrsk31Nx936HbDsxfKf46b9gCtfBSK7llVzbTuRVTZlUYKu9JzCc+4q2NcdXSuEXF2aBMDb3YniIIsdyMrKknhSfdRD9pkiS+tnfrU0+9ciy47ETF3GQEREdePMmTOWXbt2qY/2Zu/evZY+ffpYvLy81N/Fw4cPW/bt22cZN26cJTAwUO1v166d5bHHHrOYzWb1dY4YMcISEhJi8fDwsLRp08byzjvvlN1fWlqa5YorrrD4+vqq+1uxYsV5H18eT47bsmVL2b6VK1daevbsaXF3d7eEh4db/vWvf1mKi4vVbed7/JSUFMvYsWMtERER6nObNWtmmTZtmsVkMtXZ91Pv8weqmfN9n/h8vfjnq3jiiScsQUFB6nNuuOEGy//+9z9LQEBApWNmz55tiYuLU8/D4OBgy/jx48tuk//3f/7zn2XP01atWlk+/fTTstvnzp2r9snXcs0111g++ugjNTar5557zhIbG3vOuJYuXWpp3769+jq7dOmifo/I58n9WR05csQyYcIEi7+/v8Xb29vSo0cPy4YNGyrdzyeffKI+b+PGjZaLYc8/X1SB2WyxpO62WNa8ZbF8drXF8kJji+U5//Lt5XCL5dsbLZa/P7FYTh+z2D35O3lwhcXy050Wy4vB5V/nS6EWy+x7LZbDq7X/E7JvR/6yWD4YWP79/V9ni3nHXMvR9FzL3PgTlmnztluueXu1peWUX1ROUXGTfaPeWa2OmbflhOXYyTz1d8bR1OY8zyD/wMbJ0s3yrpas/lSxIWdDeuDrzfhtRwruG9QCU67iqlNERPaqoKBAVRtJzxxPT0+9h0P1+P20hfMHurDzfZ/4fKXzeemll/DTTz9h27ZtF/X5/PmyY0V5wOE/tYou2ayr2lkFtSpfgVH6Yrl6wGF7lm37QZsKmbarfH/jlkC324DYmwG/MD1HSLV16jCwdJq20AGAEjdfbIz+B740X4lNJ/KQkav1QqwoxM8D3awrLTZrhE6RAfByb8D+dDqpzXmeE9W2XfrqjhJ8LUxIwr9GtIOLLHFAREREREQNShYKkCmkM2fOxMsvv6z3cKihnDxYvtLhkb8AU4XpXK6eQMyA0rBrGNC4BZyCd2OgzwNA7/uBxM1aALZjNnDqIPDH88Cyl4C2V2lTIWVlSiNf/tsqy5lMZP3+b/ht/RhGczFMcMH3pssxo2ACTu4KAHBaHedmNKBjZECllRajAr3YjukC+JNfQ4PbhsLPwxVJWQXYdPQ0ejWvutEmERGRvZKeOrJVRZpQ//bbbw0+JiKqmjM/X6Wn4Hfffad6gEl/L3JQxQXA0TWlVV2/A6cOVb49sCnQeoQWdsVc5tyrHEro0aSHto14Fdg5VwvBpJn/nkXa5hehNUTveivQuP5Xdqbzyy0swbbjmdhyNB1+O7/DNac+Q2Nkq9v+NHXGKyW3YK+lKSICPDGyLORqhI6R/vB0c/xqrrrGqY618PhPW/Hz5hO4tU9TvDy2s27jICKii8epLdWTFdRkq4o0jo6KioKt4VRH+8epjs7zfLU1/PmyQdK03dqUXqYyFueX3+biBjTrV1rVNRwIbq0FPlS9tN1A/Fdag/QzFX5fNB+kVYG1uwZw489+fZPI5VBGHuKPnsaW45nq477UHPQzbMdU16/RzuW4Ou6QJRLfBd4LS6vh6BbTWFVzRQRw4Y7qcKpjPa7uKMHXL9uS8dyojnAzuug9JCIiojojq8zJRkS2j89XcgglRcDx9eVhV/qeyrf7RZavwNhiEODhB3sLPKTMRLc2OaHttRUAhz0H7P1VqwI7uAI4vErbvBoBXW7U+oGFddRnjA4ou6AYW6Wa61hm6WqLmcg6U1x2e0tDIma5fouhxi3qeoFbANK7/xNRQx7AMx4MIusDg69a6NcySC0DKg3l1hzIwJC2oXoPiYiIiIiIyH5kJwMHSqcvHlwJFOWU32YwAtG9y8MuCWNsqKpLgiyZonYqr0i9JpSPJ3MLcVJ9LMLJvMLSj9p+ud1kscDf0w0BXm4I9NY++stlL+2ydZPb/Msuu6uPPu7GuundJM39O47TttNHgYRvgC1fA9mJwIb3tS2qu1YF1mmC3QWMejKbLTiYnlsWcMnH/Wm5KvCsyMPVBf0iDXjI8DO6pc2Fi6UEcHEFet0Lz4FPIFr6tVG9YfBVC65GF1zTJRKfrz2CBQlJDL6IiOyYHcz0pxrg99E58PtM9YE/Vw3EVAIkbipvTJ+yvfLtPiFAKwm6rgBaDtGqkBrQmSITMkpDqrODq4qB1qncImTkFaGoxFzrx5BqH9mOVT07uVquLoayYKw8FKscmAWcFZZZj6m2D1SjZsCQp4FB/wIOLgfivwD2/qY1x5dt8dNAp3FAt9uBJj1tKni0BVn5xdhyvDzkSjieiZyCknOOi27spfXlig5Et2hfdDjxE1z/fA0oyNQOaHMVMPwlbcou1TsGX7U0KlYLvn7fmaJ+STrDMqFERI7Ezc1NfczPz1d9cMi+yfex4veVHAufr1Sf+PujHuWmAweXaUHXgWXlL/YVg1ZdpHp1XQFExMlcwDp76MISU2klVuXKK6nQKrtcYX9+kanWj+HtbkRjH3cE+Xog2Me9/LJv+eUg9dEdRhcDskuDL9ky8ytftt6WWeEYCVeKTGaUmC3a15BXVOsxuru6lAdhFUOyCsFZoHd7BMS+gaDYZxF1dAEC93wP19MHtGow2ULaaVVgMh3SJwjOxmS2YH9ajhZyHT2tgq6D6XnnHOflZkSXJrLSYiN0axqIuKaBCPXzlHQd2LcYmD8VOHlAOzi0ozb9tMXghv+CnBiDr1qSH+Qmjbxw4vQZLNuTqirAiIjIfhiNRgQGBiItLU1d9/b25hLQdlqpIS9a5fso30/5vpLj4fOV6gN/f9QDsxlI3lK+AmNivPxPl98uVVwth2phV6uhgE9wje+6xGTGqXwtyNICLK0qy1qhVWnKYW4RcgrPrb6pSUikAixfdwT5eKjAKuisAKt8v0etix9UCFLLn9GCYnOFgKyoPBSrJkSruElgI5Vp6TmFaquZDgBeQA/DXtzitgpXuayDp/RcW/I0SpZMw07/AdgZNganwvshwNvjnGmZqirN01XNkrJXp/OKVAWXBFyybT2epaa2ni0myLss5JKP7cL9zv26U3ao/zvVS81a2Xj5VKDrbYALf+c0NAZftSQnW9Lk/r2VB9V0RwZfRET2Jzw8XH20vpgm+yUvWq3fT3JMfL5SfeHvj0t05rQ2VU6FXUuB/IzKt0fElq/AKBVepS/2pSdSZmlQlXFOgFU61dDaLyuvSIU7tSVTBM+uvDo70JLbrRVavh6uNhWqy1gkXJMtPKD2oZmENZXCsIpVZtXtz9dCw02WdthU1A7TcBtGG9fieuNKxLocQmz2CrWd2BeMH0sG4z3TICTj3CowPw9XrYfZ2VMyK1aaeVWelinHy+c15CIAEqjuS9V6c6kpi8cy1cqLZ5M+a7HREnAFqqmLcdGB6uenWrlpwPKXgS1fARYzYHQH+jwIDPg/wJMrTOvFYLGDye22thz53pQcjHjzT7gbXfD31GHqCUtERPbHZDKhuLj2J9RkG2R60vkqNWzt/IEu7fvE5ys15O8PqoK8bJT+XNYVGE9s1F7YlzK7+yEz4jIkhlyGfX59kFgScG6frDwt6DLX8hWo5CGNvMsDLKnMCj4rwCq77CPVSLYVZNkLqRTLLShB5pnKFWaGlO2IPjIbrVN/hZdJW4zADAM2u3bDXMNQ/FoUh8yaFpad53tsrSKruodZxeulwZm3No1Tpp5e6PstP4sVV1nceiKzymmuLUJ80DW6Ebo1C1Qf24b7qemqF1RcoC0S8Ocb5Qs2dBgLXPEC0Cjmov9fCHVynseKr4sgP/xtw/ywNzUHS3ak4Pqe0XoPiYiILoK86OELHyL7wOcrUcOQuoi8IpMKCk6fPgnDoZXwPbYCYWmr4VuUXunYA2iK5aZYLCuJw+aC1ijJdgX2yi2ppVv1JMiwBlUSaJ3TJ6tChZZMp6tR+ECXRP6PVWWW91mFHWqW0wig+AyweyEQ/yVcjqxGz5LN6InNeNUnGKZ+NyK73U047R1TVlWWfcG+ZlrAJtM6JQyV2y62wq/qyjI3ZBeUqLDr6Emtp19FUuknFVzWKYtyuZGPe+0D4V3zgKXTgMxj2r7IrsCI6UCzvrX+Wqh+MPi6SKPjIvGfJXsxf2sigy8iIiIiIrJZsiiXdcXCsj5ZeVX0zMopQGD+YfS3xGOISwJ6uuyFm6G8Kibf4oG/zJ2wwhyHlaZYJKG8V5dMVTt/gFUeZEm44GbHvaCclpsX0OV6bTt5UJvOl/AtkJsK47qZaCRb075aQ/wOYwB3nxrdbUGxqdoFAM7ta2atRpPpnEUoNllqvAhAq1DfspBLpi3K9UsKVKWXnfTxOrZOu+4XCQx7Duh8fZ0u2ECXjlMdL9LxU/kY8PoKVZK5fspQhPrXbu41EREROd/5A52L3yeiuicv8VbsTcP7Kw9iZ1L2eVcu9EIB+rrsUkHXEGMCmhgq9+pKNEZhp09vHGnUH1mhvRDo51sWcAVLD63Syx6urMh0SqZibepr/JfA/iXl0189/IFOE7QQTCqg6mHqqfycnyk2nRuWVbgsAaussijVXHXWoig7CVj2IrD1O+26qxfQ/1Gg/yM1Dvvo0nGqYwOIbuyt0uL4Y5lYtC0Zd13WXO8hERERERGRE5MgYNnuNLy9fD+2nciqdJv0J1YVV77uaO+egX7mzehyZiOa5W6Bq7m8UsZi9IC52WUwth0BtBqGqKCWiNLhayE7YXQD2o3UNgmEpAJMKsFOHwE2f6ZtYZ21AKzLddoKn3VE+np5u7uqLSLAC/WuKA9Y+w7w11tAcenUyS43AkOnAQF8ltgyBl+XQFZ3lOBrwdYkBl9ERERERKRb4LV0V6oKvHYkZqt9Xm5GTOzbDNf1iEaYtwW+KRthUCsw/g4kH6x8B4FNy1ZgNMQMgNHdW58vhOybfyQw8HHgssnAkdVaALZrAZC6HfjtCeD3qdoUyG63Ac0us5/pgGYzsP1H4I8XgJwkbV90H+DKV7UVS8nmMfi6BFd3icSLi3Yh4Xgmjp7MQ7MgljUSEREREVHDMJst+F0Crz/24WhKGoIM2ejjnotr23nhyuau8C3ZCfzxN3B4VXmFinBxA5r1A1pfoQVewW3qZSoaOSkJtFoM0rarTgHbfwI2fwGk7dQCJNkaNdcCsLhbAL9w2Kxj64HFU4Ck+PKQeNgLQMdxfM7YEfb4ukS3fbIBq/dn4PHhbTDp8tZ6D4eIiIjs4PyByvH7RFQFeYlWmAPkpQP5J4G8DCA/Q7uedxKWvHRkpCUhKyMJ3iWZCEIOPAwXWA1PGm9bgy4JJDz8GuqrIdJ+piU8kl5g22cDRTnafoMRaDNCmwrZ6grAaCO1OaePAn88B+ycq1139wMGTAb6PAi4sb+3LWCPrwae7ijB1/yEJDw0pJWaZ0xERERERFQ5yMrWAqyyECuj2mBLXTZVv0KdvOIIKd3UFSs3b8A7GPAp3eRycGst7ArryAoV0o/87Mm0QNlGvArsnKeFYMfXA3t/1TbfcKDrLUDXW4HGLfQZZ0E2sGYGsO49wFQIGFyArrcBl08FfEP1GRNdMgZfl2hEp3A8M28H9qflYk9KDtpH8J1KIiIiIiKHD7IKskpDq/Sqg6uzQy7zBSqyquLmA/gEweIdjFSTH7aecsXhM144afFHvmsgenRogyt6dIBvUIQWcrE3F9kDWflQBVy3AOl7tQBMVkjMTQFWv6FtMQOAbrcD7Uc1TIWV2aT1JFv+svY8Fs0HaSFdeKf6f3yqVwy+LpG/pxsubxuKxTtTVNUXgy8iIiIiInsMsjK10EpVYZ1dmWW9bL395MUFWe6+gHdQaUVWSGl1VlDpx5DSKq3S272DYXL1wqJtSXhn+QEcSMtVd+Hv6aoW1prUvzkCvNzq/v+CqCGFtAVGvAIMfU6r+pIQ7OByrTm+bJ6BQJcbtKmQ9RVAHVoFLHkaSN2hXW/cEhj+MtD2KlZJOggGX3VgdFykCr4Wbk3CkyPawsWFTw4iIiIiIl1XYZMg65yKrLODrYpBVkntH0f6/pQFVxWmF5Z9DKl8u5tXje62xGTGwtLA61B6ntonIdc/LmuOO/rHqDffiRyKqzvQcay2ZR4HEr4BtnwNZB0HNn6obZHdtACs0wTAsw4KTjIOAEuf1QI34RkADHoK6Hm3Nh5yGAy+6sDl7ULh6+GKxMwziD92Gj1iGus9JCIiIiIixwuyKk0prBBcVVWRZTFdZJBVMbgKqlCZVUWwVcdTsCTwklkkM1ccwOEMLfAK9HbD3Zc1x+39YuDHwIucQWA0MPgpYOATwKEVWhXYnl+15viySXWWrKooIVh079pXZZ05Dax6Hdj4kRZ4S4N9CbvkMb35Wt4RMfiqA55uRgzvGIY58YnqDxWDLyIiIiKiCwRZ8uKzUpP30uDqnGAr4+KDLA//s8Kq0iCrqmBLbtNptTYJvOZuScS7Kw7gyMl8ta+RBF4DWqjAS95kJ3I6Lkag1TBty00Htn0PxH8FZOzVKsJkC26jBWBdbgR81XIP1TMVA5s+BVZO137/iNYjtGmNIW0a5EsifRgsFpnQbtvsYZnrVfvScfunGxHk4471Tw+Fm9FF7yERERE5NXs4fyB+nxyarI627QetefXZqxeqIMtc+/v0CDirCquq/lgVLrt6wJYVS+AVn6gqvI6d0gKvxj7uuGdAC0zs2ww+DLyIKpP44vhGrQps5xygWHvewMUNaDcS6DoRaDlEC80qfs7+pcDvzwAZ+7R9Ie213mKthurzdVCDnj/wN2kd6d8ySIVeJ/OK8NeBDAxuy6VOiYiIiMgJZSUCGz4ANn8OFGaf/1jpqVNVY/eqgi0VZDlG352iEjNmx59QFV4nTp9R++S1xL0DW+DWPgy8iKol0xqb9ta2K6cDO2ZrIZhMgdw1X9v8mwBdb9VWjSzM1QIvaZgv5PfIkGe0FSONfJ45C36n64ir0QVXd4nAl+uOYsHWJAZfRERERORckrcB62ZqL0StjeJlGlK7awDf0PLwyjrN0IGCrNoEXj9tPo73VhxU/YFFsK877hvYErf0aQpvd748I6oxaXDf405tS9kBbPkK2Po9kH0CWPVvYNVrWlAm1aVGd6D3/cDAx7XAnZwKf7PWoTFxkSr4WrIjBQXjTKr3FxERERGRw5IpRAeWAWvfBg6vKt8fMwDoOwloPRxwYQuQwhITftx0Au+vOICkrAK1L8TPA/cPaombezWFlztfNxBdkvBOwFWvAcNeAPYsAuK/AA7/qf2Oaj8auOIFoHELvUdJOmHwVYe6NW2EqEAv9e7N8j1pGNk5Qu8hERERERHVvZJCYPtPwNqZQPpubZ+sjCYrrfWbBER21XuENqGgWAKv43h/5UEklwZeoX4eeGBwS9zUqynfKCeqa7JARedrtS3zmNbQPqil3qMinTH4qkMGgwGj4yLVH7b5CYkMvoiIiIjIseSf0lZF2/gRkJuq7XP3BbrfAfS+DwhsqvcIbSbw+n7jMby/6iBSswvVvnB/TxV43dAzmoEXUUPg7yMqxeCrjo2O1YKvFXvTkXWmGAFebnoPiYiIiIjo0pw6BKx/H9jydfkqan6RQJ/7tSbRXoF6j9BmAq9vNxzDB6sOIi1HC7wiAjzx4OCWuK4HAy8iIj0w+Kpj7cL90CbMF/tSc7FkZwqu7xGt95CIiIiIiC7O8b+1/l3SM0caRIvwzkDfh7VpjU7WnL46Z4pM+GbDUXyw6hAycrXAS1qgSIXXdT2awMOVgRcRkV4YfNXHdMfYSPz3931YuDWJwRcRERER2RezCdj7K7D2HeD4hvL9rYYB/R4Gmg/SVkoj5BeV4Ov1R/HRnxJ4FZUFXg8NaYVruzeBuysb+xMR6Y3BVz0YHRulgq+/DmQgLacAoX6eeg+JiIiIiOj8ivKBhG+A9e9pUxuF0R3ofD3Q9yEgrIPeI7QZeYUl+Gr9Ucz68xBO5mmBV3RjL0wa0grjujLwIiKyJQy+6kHTIG/ERQci4Xgmft2WjDv6N9d7SEREREREVctN05rV//0JcOaUts8zEOj5D6DXvYBfuN4jtBm5hSX4ct0RfLz6ME6VBl7NgrxVhde4rlFwMzLwIiKyNQy+6smYuEgVfM3fmsTgi4iIiIhsT9oeYN1MYNuPgEnrS4XAZkDfSUDXWwB3H71HaDNyCorx5bqjmLX6EDLzi9W+mCBvTLq8NcbGRcKVgRcRkc1i8FVPru4SgZcW7cKWY5k4djJfVYEREREREenKYgGOrAbWzgT2Lynf36Sn1r+r3TWACxuxW2UXFOPzv47gkzWH1YrtokWwDyZd3kr19WXgRURk+xh81RPp69WvZTDWHMjAwm1JqvyZiIiIiEgXpmJg5zxg3TtA8tbSnQag3dVAv0eApr11HqBtkZDrs78O49M1h5FdUKL2tQjxwSOXt8ao2EgYXdjcn4jIXjD4qkfyLpAEXwsSGHwRERERkQ4KsoH4L4H17wPZJ7R9rl7aVMY+DwJBLfUeoU3Jyi/GJ38dVqFXTmng1SrUFw9f3grXdGHgRURkjxh81aMRncIxdd4O7E3NwZ6UbLQL99d7SERERETkDLJOABs+ADZ/ARRma/t8QoBe9wE97gJ8gvQeoU3JzC9S0xllWmNOoRZ4tQmTwKs1RnaOYOBFRGTHGHzVowAvNwxuG4Lfd6Wqqq92VzL4IiIiIqJ6JNMYpX/XzjmAWQtwENwW6DcJ6Hw94Oap9whtyum8Iny85hC+WHtUrdgo2ob54ZGhrXFVp3C4MPAiIrJ7DL7q2Zi4KBV8zU9IwhMj2sJg4B9PIiIiIqrjhvUH/gDWvg0c/rN8f8wArWF9qysAFzZhr+hUXpFaofHLtUeQV2RS+9pH+OPRoa0wvAMDLyIiR8Lgq54NbR8KH3cjEjPPIP7YaXRv1ljvIRERERGRIygpBLb9CKybCaTv0fYZjECn8UDfSUBknN4jtDkncwvx0epD+GrdUeSXBl4dJPAa1hpXtA9j4EVE5ID41k8983QzYkTHcHVZpjsSERER6eXdd99FTEwMPD090bt3b2zcuLHaY4uLi/Hiiy+iZcuW6vjY2FgsXrz4nOMSExNx6623IigoCF5eXujcuTM2bdpUz1+Jk8s/Bfz5H+B/nYAFk7TQy91PC7se3QpM+Jih11nScwrx6q+7cdlrK/DhqkMq9OoU5Y9ZE3vgl0cuU+frDL2IiBwTK74awKi4SMzZkohftifj2Ws6wNXIvJGIiIga1g8//IDJkyfjgw8+UKHXm2++iREjRmDv3r0IDQ095/ipU6fi66+/xqxZs9CuXTssWbIE48aNw9q1a9G1a1d1zOnTp9G/f38MGTIEv/32G0JCQrB//340atRIh6/QCZw6BKx7D0j4BijO1/b5RwG97we63w54Bug9QpuTllOggq5vNhxFQbFZ7evSJACPDm2Ny9uFsg0JEZETMFgs0hTAtmVnZyMgIABZWVnw97e/BvHFJjN6v7pM9RL48q5eGNgmRO8hEREROTx7P3+oaxJ29ezZEzNnzlTXzWYzoqOj8fDDD+Opp5465/jIyEg888wzeOihh8r2TZgwQVV1SSAm5PP++usvrF69+qLHxe9TDRzfqPXv2r1IGnpp+8I7A/0eATqOA4xueo/Q5qRlF+D9VQfx7YZjKCzRAq/Y6EA8NrS1WnyKgRcRkX2rzfkDK74agJvRBSM7h+Pr9cdUk3sGX0RERNSQioqKsHnzZkyZMqVsn4uLC4YNG4Z169ZV+TmFhYVqimNFEnqtWbOm7PqCBQtU1dh1112HVatWISoqCg8++CDuueeeasci9ytbxRNXqoLZBOz5BVj7DnCiwpRUaVQvDeubDwQY3pwjJasAH0jgtfEYikoDr65NA1WF16A2DLyIiJyRS333h6jo+++/V39sxo4dC2dc3VEs2ZmCgmKtkSYRERFRQ8jIyIDJZEJYWFil/XI9JSWlys+RQGvGjBlq6qJUhy1duhRz5sxBcnJy2TGHDh3C+++/j9atW6upkA888AAeeeQRfPHFF9WOZfr06eodWusmVWdUQVEesHEW8E534MfbtNDL6A50vRV4cD1w689Ai0EMvc6SnHUG0+bvwMD/rMDna4+o0KtHs0b46h+9MOeBfhjcltMaiYiclWt994ewOnLkCB5//HEMGDAAzqh700aIDPBEUlYBVuxJw1WdI/QeEhEREVG13nrrLVW5Jf29JDCQJvd33nknPv3007JjJBDr0aMHXn31VXVden/t2LFDnSfefvvtVd6vVJ3JuWTFii+GXwByUoGNHwGbPgHOnNb2eQYCPe8Get0L+FUOLUkjK6e/v/IAfvz7BIpMWoVXr5jGapXGfi2DGHYREVHtK77knT85CZITnw4dOqgTG29v70onQWeTdxhvueUWvPDCC2jRogWckawSI03uxYKtXN2RiIiIGk5wcDCMRiNSU1Mr7Zfr4eHa6tNnk0b18+bNQ15eHo4ePYo9e/bA19e30rlcRESEOh+sqH379jh27Fi1Y/Hw8FC9OCpuTi1tNzD/IeDNTsDq/2qhV6MYYOR/gcm7gKHPMvSqwonT+Xh67nYM/s8K1U5EQq/ezRvj23t644f7+qB/q2CGXkREVPuKr4vpDyFkKWypBvvHP/5Ro+anjtr7YUxslFpVZtmeNGQXFMPfk41IiYiIqP65u7uje/fuWLZsWVnLCanWkuuTJk067+dKawvp3VVcXIzZs2fj+uuvL7tNVnSUqv+K9u3bh2bNmtXTV+IgZG2pw39q/bsOLC3f36SX1r+r3dWAi1HPEdqs46fy8d7KA/h58wkUm7RG/31bBKkKrz4tgvQeHhER2Xvwdb7+EPIuYFWkAeonn3yChISEGj+O9H6Q6jBH0z7CD61CfXEgLRe/70zFtd2b6D0kIiIichIyvVCmH8rUxF69eql2FVLNJVX8YuLEiSrgkvMwsWHDBiQmJiIuLk59fP7551VY9uSTT5bd5z//+U/069dPTXWUQEz6vn700UdqoyqYioGdc7UVGlO2l+40AO2vAfo+DDTtrfMAbdexk/mYuWI/5sQnosSsBV79WwXh0aFt0Kt5Y72HR0RENqxeV3XMycnBbbfdhlmzZqkS+5py1N4PUm49JjYSbyzdh/kJiQy+iIiIqMHccMMNSE9Px7Rp01RDewm0Fi9eXPaGpkxPlEp+q4KCAkydOlU1sJcpjiNHjsRXX32FwMDAsmN69uyJuXPnqnM3qfBv3ry5CtSkxQVVUJAFbP4C2PABkJ2o7XP10hrW93kACGqp9wht1pGMPMxccQBztyTCVBp4DWgdrFZp7BHDwIuIiC7MYLFIrXXNpzpKP6+ff/650sqM8u5hZmYm5s+fX+l4qfKSJqfSU8JK3ikUcmIlpfHSKPVCJPiSVX+ysrLsvg+E/PEe/N+VMLoYsH7KUIT4eeg9JCIiIofkSOcPjsyhv0+Zx7WwS0Kvohxtn08o0PteoMc/AG8GN9U5nJGHd5bvx/yEpLLAa2CbEBV4dW/WSO/hERGRHZ0/uNZnfwhZBWj7dmsZt0beOZRKMFkpyBGquGorJtgHsdGB2Ho8E79uT8bt/WL0HhIRERER1aWkBK1/l0xrtJi0fcFtgX6TgM7XA26eeo/QZh1Mz8XM5QfU7IjSvAuD22qBV9emDLyIiKgBpjrWpj+ENEPt1KlTpc+3lsefvd+ZjI6NVMGXrO7I4IuIiIjIAcisBmlUL4HXkQqLOTUfqPXvajVMpjzoOUKbdiAtB+8sP4CFW5PKAq/L24XikaGtERddPr2WiIio3oOv2vaHoHON6hKBl3/Zhc1HT6uVaaIbe+s9JCIiIiK6GMUFwLYfgHXvAhmlK1wajECn8UDfSUBknN4jtGn7U3Pw9vIDWLQtSS12KYa1D1MVXp2bBOg9PCIicrYeX3pxxN4PN89aj7UHT+LJK9viwcGt9B4OERGRw3HE8wdHZLffp/xTwN+fABs/BPLStX3ufkD324He9wOBztfSozb2puTg7WX78euO5LLAa3iHMFXh1SmKgRcREenU44vqzpi4SBV8LUhIYvBFREREZC9OHgTWvwds+QYoOaPt828C9Lkf6DYR8GRocz67k7NV4PXbjpSyfVd2DMfDQ1uhYyT/74iIqO4x+NLJlR0jMHXeDuxJyVHveLUN99N7SERERERUnWMbgLVvA3t+AVBaohTeBej3CNBxLGB003uENm1nUpYKvJbsTC3bN7JzOB6+vDXaR9hRpR8REdkdBl86CfB2w+C2oVi6KxULtibiifB2eg+JiIiIiCoym4A9i7SG9Sf+Lt/fejjQ72EgZgBgMOg5Qruo8JqxdJ865xXy3zWycwQeubw13/glIqIGweBL59UdteArCY8PbwsDT5yIiIiI9FeUp01lXP8ucPqIts/oDnS5QWtYH8o3LGsiOesMJry/FvlFJhV4XdMlEo9c3gqtwxh4ERFRw2HwpSNZscbb3Yjjp85gy/FMdGvaSO8hERERETmvnBRg40da0/qCTG2fVyOg591Az3sAP20Vc6qZOfGJKvRqF+6HmTd3RatQBl5ERNTwGHzpyMvdqFavmZeQpJrcM/giIiIi0kHabmDtTGD7j4CpSNvXqDnQ9yEg7mbA3UfvEdodWTh+TvwJdfmu/s0ZehERkW4YfOlsTFyUCr4WbUvG1Kvbw9XooveQiIiIiByfxQIcXqX17zrwR/n+6N5a/662IwEXo54jtGvbTmThYHoePN1ccFXncL2HQ0RETozBl84uax2MRt5uyMgtxLpDJzGgdYjeQyIiIiJyXKZiYMccYN07QMr20p0GoP0oLfCK7qXzAB3D7NJqrxEdw+HnyRUviYhIPwy+dOZmdFEr23yz4Zia7sjgi4iIiKgeFGQBmz8HNnwIZCdq+9y8ga63An0eABq30HuEDqOoxKwWbxLjuzXRezhEROTkGHzZyOqOEnwt3pGCl8Z2gqcby+qJiIiI6kTmMWD9B0D8l0BRjrbPJxTofS/Q4x+Ad2O9R+hwVuxNQ2Z+MUL9PHBZq2C9h0NERE6OwZcN6BnTGBEBnkjOKsDKvem4shP7IBARERFdsl3zgZ/uBCwm7XpIO6DvJKDL9YCrh96jc1jWpvbjukbB6GLQezhEROTk2EndBri4GDAqNlJdXrC1tPSeiIiIiC5Ns8sAozvQfBBwy8/Ag+uBbrcx9KpHp/OKsHxPmrrMaY5ERGQLWPFlQ9MdP/rzEJbtTkNOQTGbgBIRERFdKp8g4JEtgH+E3iNxGgu3JaHYZEHHSH+0DffTezhERESs+LIVcnLQIsQHhSVm/L4zVe/hEBERETkGhl4Nana8NnuB1V5ERGQrGHzZCIPBgDGxUeqydRUcIiIiIiJ7cSAtF1uPZ6q+XmPitDYeREREemPwZUNGl54grDmQgZO5hXoPh4iIiIio1k3tB7cJQbAv+6gREZFtYPBlQ5oH+6BLkwCYzBb8uj1Z7+EQEREREdWI2WzB3C2c5khERLaHwZcNNrkX8xM43ZGIiIiI7MP6QyeRnFUAP09XDG0fqvdwiIiIyjD4sjGjYiNhMACbjp7GidP5eg+HiIiIiKjGTe2v6RIJTzej3sMhIiIqw+DLxoT5e6JP8yB1eeFWTnckIiIiItuWX1SC33Zo563XdtcWayIiIrIVDL5suMk9V3ckIiIiIlu3eEcK8otMaBbkjW5NG+k9HCIiokoYfNmgqzqFw81owO7kbOxPzdF7OERERERE1ZpTOs1xfNcmMEjPDiIiIhvC4MsGBXq7Y1CbEHWZVV9EREREZKuSs87gr4MZ6vL4bpzmSEREtofBl40aHRdVtrqjxWLRezhEREREROeYt0XOVYFezRsjurG33sMhIiI6B4MvGzWsfSi83Iw4diofW09k6T0cIiIiIqJK5M3Z2fEn1OUJrPYiIiIbxeDLRnm7u2J4xzB1eX6C1jeBiIiIiMhWbE/MwoG0XHi4uuCqzhF6D4eIiKhKDL5s2OhYbXXHRduSYTJzuiMRERER2V5T++Edw+Hv6ab3cIiIiKrE4MuGDWgdgkBvN6TnFGL9oZN6D4eIiIiISCkqMZctwsRpjkREZMsYfNkwdykb76SVjXO6IxERERHZipV703Aqrwghfh64rFWw3sMhIiKqFoMvGzcmTpvu+NuOFBSWmPQeDhERERFR2TTHsXGRcDXyJQUREdku/pWycb1iGiPc3xM5BSVYuTdd7+EQERERkZPLzC/Csj2p6vL4bk30Hg4REdF5MfiycS4uBoyK1aY7WvsoEBERERHpZeG2ZBSbLOgQ4Y/2Ef56D4eIiOi8GHzZgdGxWsPQP3alIrewRO/hEBEREZETmxN/Qn0cz6b2RERkBxh82YFOUf5oEeyDwhIzlu5K0Xs4REREROSkDqbnYsuxTBhdDBhd2ouWiIjIljH4sgMGg0x31E4s5idwuiMRERER6WNuaVP7ga2DEernqfdwiIiILojBl52wvqO2en8GTuYW6j0cIiIiInIyZrMFc7dowReb2hMRkb1g8GUnWob4onNUAExmC37dwemORERERNSwNhw+hcTMM/DzdMUVHcL0Hg4REVGNMPiyI6NLpzsu5HRHIiIiImpgs0ub2l/TJQKebka9h0NERFQjDL7syDWxETAYgI1HtHfbiIiIiIgaQn5RCX7bnqwuc5ojERHZEwZfdiQiwAu9Yhqry4u2suqLiIiIiBrG7ztTkVdkQtPG3ujRrJHewyEiIqoxBl92ZkxclPrI1R2JiIiIqKGnOY7vFqVWHCciIrIXDL7szFWdwuHqYsCu5GwcSMvRezhERERE5OBSsgrw14EMdXl8V05zJCIi+8Lgy8408nHHoDYh6vICVn0RERERUT2bl5AIswXoGdMITYO89R4OERFRrTD4skOj47TVHRdsTYLFYtF7OERERETkoORcc/Zm6zRHVnsREZH9YfBlh4a1D4OXmxFHTuZj24ksvYdDRERERA5qZ1I29qflwt3VBVd3idB7OERERLXG4MsO+Xi4YliHsLKqLyIiIiKi+mxqP7xDGPw93fQeDhERUa0x+LJTY2K16Y4LtybBJE0XiIiIiIjqULHJXNZTdgKnORIRkZ1i8GWnBrYJQYCXG9JyCrHh0Em9h0NEREREDmbV3nSczCtCsK8HBrQO1ns4REREF4XBl52SPgsjO4ery5zuSERERER1bc4WbZrj2LhIuBr5soGIiOwT/4LZsVGl0x1/3Z6MwhKT3sMhIiIiIgeRlV+MP3alqctczZGIiOwZgy871rt5EML8PZBdUII/92XoPRwiIiIichALtyWhyGRGu3A/dIj013s4REREF43Blx0zuhhwTRet6mt+QqLewyEiIiIiBzGndDVHNrUnIiJ7x+DLzo2J04KvP3anIq+wRO/hEBEREZGdO5yRh/hjmXAxlJ9rEhER2SsGX3auc1QAYoK8UVBsxtJdqXoPh4iIiIjs3NzSai9ZRTzU31Pv4RAREV0SBl92zmAwYHRclLrM1R2JiIjofN59913ExMTA09MTvXv3xsaNG6s9tri4GC+++CJatmypjo+NjcXixYurPf7f//63Oi957LHH6mn01BDMZgtmx2stNNjUnoiIHAGDLwcwunR1xz/3peN0XpHewyEiIiIb9MMPP2Dy5Ml47rnnEB8fr4KsESNGIC1NW7nvbFOnTsWHH36Id955B7t27cL999+PcePGYcuWLecc+/fff6tju3Tp0gBfCdWnjUdOITHzDPw8XDG8Q5jewyEiIrpkDL4cQKtQX3SM9EeJ2YJfdyTrPRwiIiKyQTNmzMA999yDO++8Ex06dMAHH3wAb29vfPrpp1Ue/9VXX+Hpp5/GyJEj0aJFCzzwwAPq8htvvFHpuNzcXNxyyy2YNWsWGjVq1EBfDdV3U/uRnSPg6WbUezhERESXjMGXg1V9zU/gdEciIiKqrKioCJs3b8awYcPK9rm4uKjr69atq/JzCgsL1RTHiry8vLBmzZpK+x566CFcffXVle77fOR+s7OzK21kG84UmfDr9hR1eUJ3TnMkIiLHwODLQYwqDb7+PnIKSZln9B4OERER2ZCMjAyYTCaEhVWeuibXU1K0oONsMg1SqsT2798Ps9mMpUuXYs6cOUhOLq8u//7779W0yenTp9d4LHJsQEBA2RYdHX0JXxnVpd93pSC3sATRjb3Qoxmr94iIyDEw+HIQkYFe6NW8MSwWYNE2Vn0RERHRpXnrrbfQunVrtGvXDu7u7pg0aZKaJimVYuL48eN49NFH8c0335xTGXY+U6ZMQVZWVtkm90O2wdrUflzXJnBxMeg9HCIiojrB4MsBpztydUciIiKqKDg4GEajEampqZX2y/Xw8PAqPyckJATz5s1DXl4ejh49ij179sDX11f1+xIydVIa43fr1g2urq5qW7VqFd5++211WSrMquLh4QF/f/9KG+kvNbsAa/anq8vju2orhhMRETkCBl8ORJqQuroYsCMxGwfTc/UeDhEREdkIqdjq3r07li1bVrZPpi/K9b59+573c6WaKyoqCiUlJZg9ezbGjBmj9g8dOhTbt29HQkJC2dajRw/V6F4uS9BG9mN+QiLMFqgpjjHBPnoPh4iIqM641t1dkd4a+7hjQOtgrNibjgUJSfjnFW30HhIRERHZiMmTJ+P2229X4VSvXr3w5ptvqmoumb4oJk6cqAIua7+uDRs2IDExEXFxcerj888/r8KyJ598Ut3u5+eHTp06VXoMHx8fBAUFnbOfbJvFYsHszdo0x/Hd2NSeiIgcC4MvBzMmLkoLvrYm4bFhrWEwsD8DERERATfccAPS09Mxbdo01dBeAq3FixeXNbw/duxYWf8uUVBQgKlTp+LQoUNqiuPIkSPx1VdfITAwUMevgurDzqRs7E3NgburC67uHKH3cIiIiOoUgy8Hc0WHMHi6ueBwRp6a8ti5SYDeQyIiIiIbIQ3qZavKypUrK10fNGgQdu3aVav7P/s+yD7MKW1qf0X7MAR4u+k9HCIiojrFHl8OxsfDFcPah5X1aiAiIiIiqk6xyYwFW7Vzxgnd2dSeiIgcD4MvB17dceG2JJikSykRERERURVW709HRm4Rgn2lV2yI3sMhIiKqcwy+HNCgtiHw93RFanYhNh4+pfdwiIiIiMhGWZvaj46NgpuRLw2IiMjxXNRft3fffRcxMTFqeevevXtj48aN1R47Z84ctXqQNEKVlX6kkao0RqX64+FqxFWdtMak1tJ1IiIiIqKKsvKLsXR3qro8vhunORIRkWOqdfD1ww8/qOWwn3vuOcTHxyM2NhYjRoxAWlpalcc3btwYzzzzDNatW4dt27apJbNlW7JkSV2Mn6oxJk6b7vjr9hQUlZj1Hg4RERER2Zhftier88S2YX7oGOmv93CIiIhsI/iaMWMG7rnnHhVedejQAR988AG8vb3x6aefVnn84MGDMW7cOLRv3x4tW7bEo48+ii5dumDNmjV1MX6qRu8WQQj180DWmWL8uS9d7+EQERERkY2ZE3+irKm9wWDQezhERET6B19FRUXYvHkzhg0bVn4HLi7qulR0XYjFYsGyZcuwd+9eDBw48OJGTDVidDHgmi5a1deCrUl6D4eIiIiIbMiRjDxsOnoaLgaZKcBpjkRE5Lhca3NwRkYGTCYTwsLCKu2X63v27Kn287KyshAVFYXCwkIYjUa89957uOKKK6o9Xo6TzSo7O7s2w6RSo+Mi8elfh7F0Vyryi0rg7V6rbzcREREROag5W7Q+sJe1DkGYv6fewyEiIqo3DbJ0i5+fHxISEvD333/jlVdeUT3CVq5cWe3x06dPR0BAQNkWHR3dEMN0OLFNAtAsyBtnik0q/CIiIiIiMpst5dMc2dSeiIgcXK2Cr+DgYFWxlZpaOUSR6+Hh4dU/iIsLWrVqpVZ0/L//+z9ce+21KtyqzpQpU1SVmHU7fvx4bYZJpaRXw+jY0umOCZzuSERERERQUxxPnD4DXw9XDO9Q/Tk8ERGR0wVf7u7u6N69u+rTZWU2m9X1vn371vh+5HMqTmU8m4eHB/z9/SttdGmrO67al47TeUV6D4eIiIiIdGat9hrZORxe7ka9h0NERGRbUx1lmuKsWbPwxRdfYPfu3XjggQeQl5enVnkUEydOVBVbVlLZtXTpUhw6dEgd/8Ybb+Crr77CrbfeWrdfCVWpVagf2kf4o8RswW87UvQeDhERERHpqKDYhF+2JavL47s10Xs4RERE9a7W3c5vuOEGpKenY9q0aUhJSVHTFxcvXlzW8P7YsWNqaqOVhGIPPvggTpw4AS8vL7Rr1w5ff/21uh9quKqv3cnZWLA1ETf3bqr3cIiIiIhIJ7/vSkVOYQmiAr3QK6ax3sMhIiKqdwaLxWKBjZNVHaXJvfT74rTH2kvMPIP+/14OgwFY99RQhAdw5R4iInJ8PH+wD/w+Naw7PtuIlXvT8cjlrTB5eFu9h0NERFTv5w8Nsqoj6Uve0esZ0wgScS7axib3RERERM4oLacAf+5LV5fHcZojERE5CQZfTsK6uuN8ru5IRERE5JTmb0mC2QJ0axqI5sE+eg+HiIioQTD4chIjO0fA6GLA9sQsHErP1Xs4RERERNTAZpeu5sim9kRE5EwYfDmJIF8PDGgdrC4v2MqqLyIiIiJnsispG3tScuBudMGoLtpMACIiImfA4MsJpztK8GUHaxoQERERUR2ZU1rtNaxDKAK83fQeDhERUYNh8OVEhncMh4erCw6l52FnUrbewyEiIiKiBlBiMmNeaZ/X8V05zZGIiJwLgy8n4uvhimHtw9RlTnckIiIicg6r92cgI7cQjX3cMahtiN7DISIialAMvpzM6LjS6Y4JSTDLsj5ERERE5BRN7aXthZuRp/9ERORc+JfPyQxuGwI/T1ekZBdg45FTeg+HiIiIiOpR1pli/L4rVV2+tjunORIRkfNh8OVkPFyNuKpTuLrM6Y5EREREju237ckoKjGjTZgvOkb66z0cIiKiBsfgywmNjo1SH38tPREiIiIiIsee5ji+WxMYDAa9h0NERNTgGHw5ob4tgxDs64HM/GKsOZCu93CIiIiIqB4cPZmHv4+chosBGBunvfFJRETkbBh8OSGjiwHXdIlQl+eXLm1NRERERI5l7pZE9bF/q2CEB3jqPRwiIiJdMPhyUmNKV3dcuisV+UUleg+HiIiIiOqQxWLBnHgt+JrQjU3tiYjIeTH4clJx0YFo2tgb+UUm/LE7Te/hEBEREVEd2nT0NI6dyoePuxHDO4bpPRwiIiLdMPhyUtLcdHSsVvW1gNMdiYiIiBzKnNKm9ld1joC3u6vewyEiItINgy8nNrp0uuOqfWnIzC/SezhEREREVAcKik1YtC1ZXeY0RyIicnYMvpxYmzA/tAv3Q7HJgsU7UvQeDhERERHVgT92pyKnoARRgV7o3byx3sMhIiLSFYMvJ2et+uLqjkRERESOYfZmbZrjuK5RcHEx6D0cIiIiXTH4cnKjumjB1/rDJ5GaXaD3cIiIiIjoEqTlFODP/Rnq8rhuUXoPh4iISHcMvpxcdGNvdG/WCBYLsHArq76IiIiI7JksWmQyW9C1aSBahvjqPRwiIiLdMfgijCmd7sjgi4iIiMi+zYlPVB/Hs6k9ERGRwuCLMLJzBIwuBmw9kYXDGXl6D4eIiIiILsLu5GzsSs6Gm9GAUV0i9B4OERGRTWDwRQj29UD/VsHqMqu+iIiIiOzTnHitqf3QdmEI9HbXezhEREQ2gcEXKWNiras7JsIiDb+IiIiIyG6UmMyYV7pK93g2tSciIirD4IuU4R3D4OHqgoPpeapEnoiIiIjsx5oDGUjPKURjH3cMbhuq93CIiIhsBoMvUvw83TC0fWjZakBEREREZH9N7UfHRsLdlaf4REREVvyrSGXkRMna58ts5nRHIiIiInuQXVCMJTtT1GVOcyQiIqqMwReVkbJ4Pw9XJGUVYNPR03oPh4iIiIhq4LftySgsMaNVqC86RwXoPRwiIiKbwuCLyni6GTGiU3hZk3siIiIisn2zS6c5TujWBAaDQe/hEBER2RQGX1TJmDhtuuOv25NRbDLrPRwiIiIiOo/jp/Kx8fApSN41tqt2HkdERETlGHxRJX1bBCHY1x2n84uxZn+G3sMhIiIioho0te/fMhgRAV56D4eIiMjmMPiiSlyNLrimi/Zu4YKtXN2RiIiIyFZZLBbM2XJCXWZTeyIioqox+KJzjCpd3VFWBzpTZNJ7OERERERUhfhjp3H0ZD683Y24srRPKxEREVXG4IvO0a1pIJo08kJ+kQnL9qTqPRwiIiIiOk9T+6s6RcDb3VXv4RAREdkkBl90DlkNaHRp1df8BE53JCIiIrI1BcUmLCptSzGB0xyJiIiqxeCLqjQmTjuBWrU3HVn5xXoPh4iIiIgqWLY7DdkFJYgM8ESfFkF6D4eIiMhmMfiiKrUN90PbMD8UmcxYvDNZ7+EQERERUQVz4rWm9uO6RcHFxaD3cIiIiGwWgy+q1ug4ru5IREREZGsycguxcl+6ujyuaxO9h0NERGTTGHxRtax9vtYePIm07AK9h0NERERE8qZkQhJMZgtiowPRKtRX7+EQERHZNAZfVK3oxt5qhUeLBVi0jdMdiYiIiGzB7NJpjmxqT0REdGEMvui8ylZ35HRHIiIiIt3tScnGzqRsuBkNGNVFO08jIiKi6jH4ovO6ukskpF/q1uOZOHoyT+/hEBERETm1ufGJ6uPl7ULRyMdd7+EQERHZPAZfdF4hfh7o3yq4rJ8EEREREelD+nrN3aIFX+O7sak9ERFRTTD4olpNd7RIwy8iIiKyS++++y5iYmLg6emJ3r17Y+PGjdUeW1xcjBdffBEtW7ZUx8fGxmLx4sWVjpk+fTp69uwJPz8/hIaGYuzYsdi7d28DfCXOac2BDKTlFCLQ2w1D2obqPRwiIiK7wOCLLmhEp3C4u7rgQFoudifn6D0cIiIiugg//PADJk+ejOeeew7x8fEqyBoxYgTS0tKqPH7q1Kn48MMP8c4772DXrl24//77MW7cOGzZsqXsmFWrVuGhhx7C+vXrsXTpUhWWDR8+HHl5bI9QH+aUNrWXNyXl3IyIiIguzGCxgxKe7OxsBAQEICsrC/7+/noPxynd/9VmLN6ZgvsHtcRTV7XTezhEREQXxPOHyqTCS6qzZs6cqa6bzWZER0fj4YcfxlNPPXXO8ZGRkXjmmWdUsGU1YcIEeHl54euvv67yMdLT01XllwRiAwcOrNG4+H2qmZyCYvR85Q8UFJsx/6H+iI0O1HtIREREuqnN+QPfKqIaGROnTXdcuDUJZrPNZ6VERERUQVFRETZv3oxhw4aV7XNxcVHX161bV+XnFBYWqimOFUnotWbNmmofR04+RePGjets7KT5bUeKCr1ahvigS5MAvYdDRERkNxh8UY0MaRcKXw9XJGaeQfyx03oPh4iIiGohIyMDJpMJYWFhlfbL9ZSUlCo/R6ZBzpgxA/v371fVYTKVcc6cOUhOTq7yeDnmscceQ//+/dGpU6dqxyKBmrxLW3GjC5u9+URZU3uDwaD3cIiIiOwGgy+qEU83I0Z0DFeX53N1RyIiIof31ltvoXXr1mjXrh3c3d0xadIk3HnnnapSrCoyJXLHjh34/vvvz3u/0hBfpiZYN5luSed3/FQ+Nhw+Bcm7xnWN0ns4REREdoXBF9XY6NLpjr9sT0axyaz3cIiIiKiGgoODYTQakZqaWmm/XA8P197YOltISAjmzZunGtUfPXoUe/bsga+vL1q0aHHOsRKKLVq0CCtWrECTJk3OO5YpU6aoKZHW7fjx45f41Tm+eVsS1cd+LYMQGeil93CIiIjsCoMvqrH+LYMQ5OOOU3lF+OtAht7DISIiohqSiq3u3btj2bJllaYmyvW+ffue93Olz1dUVBRKSkowe/ZsjBkzpuw2WSNJQq+5c+di+fLlaN68+QXH4uHhoZrQVtyoevJ/PKc0+Brf9fyhIhEREZ2LwRfVmKvRBVd3iVCXF3C6IxERkV2ZPHkyZs2ahS+++AK7d+/GAw88oKq5ZPqimDhxoqrGstqwYYPq6XXo0CGsXr0aV155pQrLnnzyyUrTG2WFx2+//RZ+fn6qX5hsZ86c0eVrdERbjmficEYevNyMuLJT1dV5REREVD3X89xGVOXqjl+uO4olO2VlIZPq/UVERES274YbbkB6ejqmTZumwqm4uDgsXry4rOH9sWPHKvXvKigowNSpU1XwJVMcR44cia+++gqBgYFlx7z//vvq4+DBgys91meffYY77rijwb42Z2hqf1WncPh48NSdiIiotvjXk2qlW9NGiAr0Uqs7LtudVlYBRkRERLZPpiXKVpWVK1dWuj5o0CDs2rXrgtPwqP4UlpiwcKtWZT+hO6c5EhERXQxOdaRakeWzrU3uF2zV+k0QERERUd1bvjsN2QUliAjwRJ8WQXoPh4iIyC4x+KJaGx2rBV8r9qQj60yx3sMhIiIickiz47U3Gcd2jYLRxaD3cIiIiOwSgy+qtXbhfmgT5osik1n1+iIiIiKiunUytxAr96apy+O7Ruk9HCIiIrvF4IsubrpjadUXV3ckIiIiqnsLtiahxGxBlyYBaB3mp/dwiIiI7BaDL7ooo2O1dx7XHsxAWk6B3sMhIiIicihzSqc5TujGpvZERESXgsEXXZSmQd6Iiw6E2QL8si1Z7+EQEREROYx9qTnYnpgFVxcDRpVW2RMREdHFYfAl9i4Gis/oPQq7M6ZsdUdOdyQiIiKqK7PjT6iPQ9qForGPu97DISIismsMvvYtAb67EfjsKiCblUu1cXWXCMgCQ1uOZeLYyXy9h0NERERk90xmC+ZtsU5zZFN7IiKiS8Xgy80b8AoEkrYAs4YAiZv1HpHdCPXzRL+Wwerywm2s+iIiIiK6VNI/NTW7EIHebqrii4iIiC4Ng6/mA4B7VgAh7YCcZOCzkcD2n/Ueld2wru44P0F7Z5KIiIiILr2p/agukfBwNeo9HCIiIrvH4Es0bg78YynQegRQUgDM/gew/GXAbNZ7ZDZvRKdwuBtdsC81F3tSsvUeDhEREZHdyi0sweIdKeryeE5zJCIiqhMMvqw8/YGbvgP6PaJd//M/wI+3AYW5eo/MpgV4uWFw2xB1eX4CpzsSERERXazftifjTLEJLYJ91OrZREREdOkYfFXkYgSGvwSMfR8wugN7FgGfXglkHtN7ZDZtTJz2juSChCRYLBa9h0NERERk19McJ3RvAoPBoPdwiIiInDf4evfddxETEwNPT0/07t0bGzdurPbYWbNmYcCAAWjUqJHahg0bdt7jbULczcDtiwCfECB1OzDrcuDYBr1HZbOGtg+Fj7sRiZlnEH/stN7DISIiIrI7J07nY92hk+ry2K6c5khERKRb8PXDDz9g8uTJeO655xAfH4/Y2FiMGDECaWlpVR6/cuVK3HTTTVixYgXWrVuH6OhoDB8+HImJNt4MvWlvrel9eGcgLx344hpgyzd6j8omeboZMaJjeFnVFxERERHVjrVlRN8WQYgK9NJ7OERERM4bfM2YMQP33HMP7rzzTnTo0AEffPABvL298emnn1Z5/DfffIMHH3wQcXFxaNeuHT7++GOYzWYsW7YMNi8wGrhrCdB+FGAqAuY/CPw+FTCb9B6ZzRkdp63uuGhbMkpMXBSAiIiIqKakVcTszSfUZTa1JyIi0jH4KioqwubNm9V0xbI7cHFR16Waqyby8/NRXFyMxo0bwy64+wDXfQkMfFK7vvYd4LsbgQKuYFhR/1bBaOzjjpN5RfjroFamT0REREQXlnA8E4cy8uDlZsRVnSP0Hg4REZHzBl8ZGRkwmUwICwurtF+up6RoSy9fyL/+9S9ERkZWCs/OVlhYiOzs7EqbrlxcgMufAa79FHD1BPb/DnxyBXDqkL7jsiFuRhdcXXqixumORERERLVvan9lp3D4erjqPRwiIiKH0qCrOv773//G999/j7lz56rG+NWZPn06AgICyjbpC2YTOk0A7vwN8IsA0vdoTe8P/6n3qGxuuuOSnSkoKOZ0UCIiIqILKSwxYeE27U1DTnMkIiLSOfgKDg6G0WhEampqpf1yPTxca25enf/+978q+Pr999/RpUuX8x47ZcoUZGVllW3Hjx+HzYjqpjW9j+wGnDkNfDUO2FR1fzNn071pI9WMNbewBCv2VL3YARERERGVk3OmzPxihPl7oF/LYL2HQ0RE5NzBl7u7O7p3716pMb21UX3fvn2r/bzXX38dL730EhYvXowePXpc8HE8PDzg7+9fabMp/hHAnb8Cna8DzCXAon8Cvz4BmErgzFxcDLgmNqLSykREREREVL3ZpdMcx3aNgtHFoPdwiIiIHE6tpzpOnjwZs2bNwhdffIHdu3fjgQceQF5enlrlUUycOFFVbFm99tprePbZZ9WqjzExMaoXmGy5ubmwa25ewPhZwNBp2vWNHwHfTNCqwJzYmFitRH/53jRkFxTrPRwiIiIim3Uqr6isSn5CtyZ6D4eIiMgh1Tr4uuGGG9S0xWnTpiEuLg4JCQmqksva8P7YsWNITk4uO/79999Xq0Fee+21iIiIKNvkPuyewQAM+D/ghm8ANx/g0Epg1lAgfR+cVfsIP7QK9UVRiRlLdtRswQMiIiIiZ7RwaxJKzBZ0jgpAmzA/vYdDRETkkAwWi8UCGyerOkqTe+n3ZXPTHq1SdgDf3QRkHQM8ArQVIFtXv3KlI3tn2X68sXQfBrQOxlf/6K33cIiIyEnZxfkDOfX3aczMNdh6IgvPjeqAO/s313s4REREDnn+0KCrOjq08E7APcuBpn2Bwizg2+uAde8Btp8r1rlRsdrqjn8dyEB6TqHewyEiIiKyOQfSclTo5epiwOjScyciIiKqewy+6pJvCDBxPhB3K2AxA0umAAsfAUqK4Exign0QGx0IswX4dXv5tFciIiIiqtzUfnDbUAT5eug9HCIiIofF4KuuuXpI3Tow4lXA4ALEfwl8OQbIy4Azsb5zOT9BO6kjIiIiIo3JbMG8Ldo50oRu2sJAREREVD8YfNVX0/u+DwE3/wh4+APH1gKzhgCpO+EsRnWJUP8N8ccycfxUvt7DISIiIrIZ6w+dRHJWAfw9XXF5+1C9h0NEROTQGHzVp9ZXAHf/ATRqDmQeAz4ZDuz5Fc4g1N8TfVsEqcsLtibpPRwiIiIimzF784myvqgerka9h0NEROTQGHzVt5C2WtP75gOBolzg+5uB1TOcoun9mLjIsqW6iYiIiAjIKyzBbztS1OUJ3ZvoPRwiIiKHx+CrIXg3Bm6dA/S8G4AFWPYCMOdeoLgAjuzKjhFwMxqwJyUHe1Ny9B4OERERke4W70jBmWITmgf7oGt0oN7DISIicngMvhqK0Q24+g1g5H8BgxHY/iPw+dVAjvaOnyMK8HZTKxWJBVvZ5J6IiIhozhZtmuP4rlEwSENUIiIiqlcMvhpar3uA2+YCnoFA4iZg1uVAUgIcfXVH6fNlcYLpnURERETVSco8g7UHT6rLY7tyNUciIqKGwOBLDy0GaX2/gtsA2YnAp1cCO+fCEQ1rHwZvdyOOnzqDLccz9R4OERERkW7mbklUbV77tGiM6Mbeeg+HiIjIKTD40ktQS23Fx1ZXACVngJ/uAFZMB8xmOBIvdyOGdwhTlxcksMk9EREROSepfJ8TXzrNsRub2hMRETUUBl968gwAbv4B6DtJu77q38DPdwBFeXAkY+K0Uv5F25JRYnKsYI+IiIioJradyMLB9Dx4urngqk7heg+HiIjIaTD40puLERjxCjDmXcDFDdg1X5v6mKW9I+gILmsdjEbebsjILcS6Q1pfCyIiIiJnYq32GtExHH6ebnoPh4iIyGkw+LIVXW8Fbl8IeAcDKduAj4YAx/+GI3AzumBk5wh1eT6nOxIREZGTKSoxq4V+BKc5EhERNSwGX7akWV/g3hVAWCcgLw34/Gpg6/dwpOmOS3akoKDYpPdwiIiIiBrMir1pOJ1fjFA/D1zWKljv4RARETkVBl+2JrApcNcSoN01gKkQmHsfsPQ5wGzfYVGPZo0QEeCJnMISrNybpvdwiIiIiBp8muO4rlEwuhj0Hg4REZFTYfBlizx8geu/AgY8rl3/603g+1uAwhzYKxcXA0bHRqrL1lJ/IiIiIkd3Oq8Iy/dob/pxmiMREVHDY/Blq1xcgKHPAuM/BowewL7fgE+GA6ePwF6NKg2+/tidhpyCYr2HQ0RERFTvFm5LQrHJgo6R/mgb7qf3cIiIiJwOgy9b1+U64M7fAN9wIG2X1vT+yF+wR3LC1zLERzV4/X1nqt7DISIiIqp3s+MT1ccJrPYiIiLSBYMve9Cku9b0PrIrcOYU8OVoYPMXsDcGg0x31Jrcz+d0RyIiInJwB9JysfV4purrNTpOq3wnIiKihsXgy174RwJ3/Ap0HA+YS4CFjwC/PQWYSmBPrCd9fx3IQEZuod7DISIiIqo3c7doTe0HtwlBsK+H3sMhIiJySgy+7Im7N3Dtp8CQqdr1De8D31wLnDkNe9E82AddmgTAZLbg1+3Jeg+HiIiIqF6YzRbMLZ3myKb2RERE+mHwZW8MBmDQE9qqj27ewKEVwMfDgIwDsBdlqzsmcLojEREROab1h04iKasA/p6uGNo+VO/hEBEROS0GX/aqw2jgriWAfxPg5AHg48uBg8thL6s7Sn636ehpnDidr/dwiIiIiOqtqf01sZHwdDPqPRwiIiKnxeDLnkV00ZreN+kFFGQBX18LbPgIsFhgy8L8PdGneZC6vHArpzsSERGRY8kvKsFvO7RznAndtIV9iIiISB8MvuydbyhwxyIg9mbAYgJ+ewJY9BhQUgR7aHI/P0F7N5SIiIjIUSzekYL8IhNigrzRrWkjvYdDRETk1Bh8OQJXD2Dse8AVL0kTMGDz58BX44C8k7BVV3UKh5vRgD0pOdiXmqP3cIiIiIjqzJwKTe0N0t+BiIiIdMPgy1HISVX/R4CbfwDc/YCja4BZQ4C03bBFgd7uGNQmRF1mk3siIiJyFMlZZ/DXwQx1eVxXTnMkIiLSG4MvR9NmBHD3UqBRDJB5FPj4CmDvYtii0XHayeCCrUmw2HhfMiIiIqKamLdFzmuAXs0bI7qxt97DISIicnoMvhxRaHvg7uVAs8uAohzguxuBv96yuab3w9qHwsvNiGOn8pFwPFPv4RARERFdEnkjb078CXWZTe2JiIhsA4MvR+UTBNw2F+h+p5yGAUunAfMeBEoKYSu83V0xvGOYuvz1+mMoNpn1HhIRERHRRduemIX9abnwcHXBVZ0j9B4OERERMfhycK7uwDX/A0b+FzAYga3fAp9fA+SkwlaMLZ3uODv+BPr9ezlmLN2HlKwCvYdFREREdNFN7Ud0DIe/p5vewyEiIiIGX07S9L7XPcCtswHPAODERmDW5UDyVtiCwW1D8PTIdgj29UB6TiHeXrYf/V9bjge+3oy1BzLY+4uIiIjsQlGJWfUtFeM5zZGIiMhmMPhyFi2HaH2/gloD2SeAT68Eds3Xe1Rqie97B7bE2qcuxzs3dVWNYE1mC37bkYKbP96AYTNW4bO/DiO7oFjvoRIRERFVa9W+dJzKK0KInwcuaxWs93CIiIioFIMvZxLcCrj7D6Dl5UBxPvDjRGDV6zbR9N7d1QWjYiPx4319seSxgbi1T1P4uBtxMD0PLyzchd6vLMOUOduxKylb76ESERERnWP2Zq2p/di4SLgaeYpNRERkK/hX2dl4BQI3/wT0eVC7vuIV4Oe7gKJ82Iq24X54eWxnrH96KF4c0xGtQ31xptiE7zYew8i3V+Pa99difkIiCktMeg+ViIjIrrz77ruIiYmBp6cnevfujY0bN1Z7bHFxMV588UW0bNlSHR8bG4vFixdf0n06qsz8Iizbo/VQndC9id7DISIiogoYfDkjoytw5XRg1NuAixuwcw7w2VVAttaXwlb4ebphYt8Y/P7Pgfj+3j64uksEXF0M2HT0NB79PgH9/70c/1myB4mZZ/QeKhERkc374YcfMHnyZDz33HOIj49XQdaIESOQlpZW5fFTp07Fhx9+iHfeeQe7du3C/fffj3HjxmHLli0XfZ+OauG2ZBSbLOgQ4Y924f56D4eIiIgqMFjsoHt4dnY2AgICkJWVBX9/nkzUqSN/AT/eBuSfBHzDgRu/BZp0h61KzS7A9xuP49uNR5GaXaj2uRiAoe3DcFufZqqnhovsICIip8fzh8qkGqtnz56YOXOmum42mxEdHY2HH34YTz311DnHR0ZG4plnnsFDDz1Utm/ChAnw8vLC119/fVH36ajfp3Hv/YUtxzIx9er2uHtAC72HQ0RE5PCya3H+wIovZxfTH7hnORDaAchN0Sq/tv0EWxXm74lHh7XGmn9djvdv6YZ+LYNgtgBLd6Vi4qcbMXTGKny8+hCy8tkMn4iIyKqoqAibN2/GsGHDyva5uLio6+vWravycwoLC9X0xYok9FqzZs1F36f1fuVkteJmzw6m56rQy+hiwJg4ruZIRERkaxh8EdAoBvjH70CbqwBTITDnbmDZi/K2LWyVm9EFV3WOwLf39MEfkwfijn4x8PNwxeGMPLz8y270nv4Hnvx5K7afyNJ7qERERLrLyMiAyWRCWFhYpf1yPSUlpcrPkSmLM2bMwP79+1Ul19KlSzFnzhwkJydf9H2K6dOnq3dorZtUiNmzufGJ6uOgNiFqRUciIiKyLQy+SOPhB9z4DXDZP7Xrq98AfrgVKMyFrWsV6ofnR3dUzfBfHdcZ7cL9UFBsxo+bTmDUzDUY++5faqWlgmI2wyciIqqpt956C61bt0a7du3g7u6OSZMm4c4771RVXZdiypQpalqCdTt+/DjsldlswdwtWvA1vhurvYiIiGwRgy8q52IEhj0PjPsIMHoAe38BPh0BnD4Ke+Dj4YqbezfFb48OwM/398Xo2Ei4GQ1IOJ6J//tpK/pOX4bpv+3G8VO2s4IlERFRQwgODobRaERqqrbyoJVcDw8Pr/JzQkJCMG/ePOTl5eHo0aPYs2cPfH190aJFi4u+T+Hh4aF6cVTc7NWGw6fUIjt+nq4Y1r5y5RsRERHZBgZfdK7YG4A7fgF8QoHUHcCsIcDR6nt12BqDwYAeMY3x9k1dsfapoXhiRFtEBnjidH4xPlx1CAP/swJ3frYRK/akwSQNwoiIiBycVGx1794dy5YtK9sn0xflet++fc/7udLnKyoqCiUlJZg9ezbGjBlzyffpKObEn1Afr+kSAU83o97DISIioiow+KKqRfcE7l0BhHfRVnz8YhQQ/xXsjfTaeGhIK/z55BB8dFt3DGgdDFnHdMXedNz5+d8Y/N8V+HDVQZzKK9J7qERERPVq8uTJmDVrFr744gvs3r0bDzzwgKrmkumLYuLEiWoaotWGDRtUT69Dhw5h9erVuPLKK1Ww9eSTT9b4Ph1ZflEJft2u9Tub0K2J3sMhIiKiarhWdwMRApoAdy0G5j0A7JoPLJgEpO8BrnhRmxZpR1yNLhjeMVxt0gD/6/VH8dOm4zh+6gym/7YHbyzdp96tva1PM8RFB6qqMSIiIkdyww03ID09HdOmTVPN5+Pi4rB48eKy5vTHjh2r1L+roKAAU6dOVcGXTHEcOXIkvvrqKwQGBtb4Ph3Z7ztTkVdkQtPG3ujerJHewyEiIqJqGCwWqX+xbbLMtaz6Iw1Q7bkPhN2S1R3/fB1YOV273moYcO2ngGcA7NmZIhMWbk3Cl+uPYEdi+VLqnaMCVAA2KjYSXu72FfAREVE5nj/YB3v9Pt32yQas3p+Bx4a1xmPD2ug9HCIiIqeSXYvzB051pAuTd38HPwVc9wXg6gUc+AP4eBhw8iDsmYRa1/eMxsJJl2Hug/3Uakzuri7YnpiFJ2dvQ5/py/Dyol2qQoyIiIjIKiWrAH8dyFCXx3flNEciIiJbxuCLaq7jWG3qo38UkLEPmHU5cGgV7J1Ma+zatBFmXB+H9VOG4qmr2qFJIy9knSnGx2sOY8h/V2LipxuxdFcqm+ETERER5iUkQk4JesY0QtMgb72HQ0REROfB4ItqJzIOuGc5ENUDKMgEvhoHbJwFR9HYxx33D2qJVU8Mwad39MCQtiGQdl9/7kvHPV9uwsDXV+DdFQeQkVuo91CJiIhIB9IlZPZmbTVHNrUnIiKyfQy+qPb8woE7fgG63ABYTMCvjwOLJgOmYjgKo4sBl7cLw2d39sKqx4fgvoEtEOjthsTMM/jPkr3oO30ZHv1+CzYfPaVOgImIiMg57EzKxv60XNUeYWSXCL2HQ0RERBfA4IsujpsnMO5DYNjzMlkQ2PQJ8PV4IP8UHI1MYZgysr2aBvnGdbGIjQ5EscmC+QlJmPD+Oox8ew2+3XAMeYUleg+ViIiI6tnseK3aa3iHMPh7uuk9HCIiIroABl908WQO4GX/BG76DnD3BQ7/qfX9St8LR+TpZsSE7k0w/6H+WDCpP67v0QQeri7YnZyNp+duR59Xl+H5BTtxIC1X76ESERFRPSg2mbEgIUld5jRHIiIi+8Dgiy5d26uAfywFApsCpw9rKz7uXwpH1qVJIF6/NhYbnh6KqVe3R0yQN3IKS/D52iMYNmMVbp61Hot3JKPEZNZ7qERERFRHVu1Nx8m8IgT7emBA62C9h0NEREQ1wOCL6kZYB+CeFUCz/kBhNvDt9cDamdIBFo4s0Nsddw9ogeX/Nxhf3NULw9qHwcUArD14Evd/HY/LXluBt5ftR1p2gd5DJSIioks0Z4s2zXFsXCRcjTyNJiIisgf8i011xycYuG0e0G0iYDEDvz8DzJ8ElDj+CoguLgYMahOCj2/vgT+fHIIHB7dEkI87UrILMGPpPvT793I89G081h86yWb4REREdigrvxh/7EpTl8dzmiMREZHdYPBFdcvVHRj1NnDla4DBBUj4GvhiNJCbDmfRpJE3nryyHdZOuRxv3RiH7s0aocRswS/bknHjR+sx4s0/8dW6I8hlM3wiIiK7sWh7EopMZrQL90OHSH+9h0NEREQ1xOCL6qfpfZ/7gVt+BjwCgOPrgVlDgJQdcCYerkaMiYvC7Af64ZdHLsNNvZrCy82Ifam5eHb+TvR+5Q88O28H9qbk6D1UIiIiuoDZm7Vpjtd2Z7UXERGRPWHwRfWn1VDgnmVA45ZA1nHgk+HA7kVwRh0jAzB9fGesf3oonhvVAS1CfJBXZMJX64+qCrDrP1yHRduSUFTCZvhERES25nBGHuKPZao+nqPjIvUeDhEREdUCgy+qX8GttfCrxWCgOA/44Rbgz/86fNP76gR4ueHO/s2xbPIgfHN3b1zZMRxGFwM2Hj6FSd9uQf/XlmPG73uRnHVG76ESERFRqbnxWrXXwDYhCPXz1Hs4REREVAsMvqj+eTUCbpkN9LpPu778JWD23UCx84Y7BoMB/VsF44PbumPNv4bgkctbqaXR03MK8fbyA2o1yPu/2oy1BzLYDJ+IiEhHZrMFc7Ykqstsak9ERGR/GHxRwzC6AiNfB675H+DiCuz4GfhsJJCdDGcXEeCFycPbYu1Tl+Odm7qiV/PGMJktWLwzBTd/vAHDZqzCZ38dRtaZYr2HSkRE5HQ2HjmFE6fPwM/DFcM7hOk9HCIiIqolBl/UsHrcBdw2T6sCS4rXmt4nxus9Kpvg7uqCUbGR+PG+vljy2EDc1qcZfNyNOJiehxcW7kKfV5dhypzt2JWUrfdQiYiInMac0mmOV3eJgKebUe/hEBERUS0ZLHYwjyo7OxsBAQHIysqCvz+Xj3YIpw4D390IpO8BXD2B7ncCfuGATzDgEwJ4y8cg7aO7j7ZSpBPKKSjGvC2J+HLdUexPyy3b36NZI9zWtxmu7BSuVo8kIqJz8fzBPtjy9+lMkQk9X/kDuYUl6o0pqcomIiIi+zp/cG2wURFV1Lg58I+lWq+v/UuADe9Xf6wEYyoMC9KCMRWKBVe+bA3K5Dh3X4cJyvw83XBb3xjc2qcZNhw+pVaBXLIjBZuOnlZbsK87bugZjZt7N0NUoJfewyUiInIov+9KUaFXdGMv9aYTERER2R8GX6QfT3/gpu+Ard8BabuBvAwgLx3Il48ntY8lBdqWdVzbasLoURqGBVVdQVa2r/R2D3+bD8qkGX6fFkFqS80uwPcbj+PbjUeRml2Id1ccxPsrD+LydmGqCmxAq2C4yHrrREREdElmx2tN7cd1bcK/rURERHaKwRfpy8UIdL216ttkFm5RXmkYdlILxlQollHFPrmcDpScAUyFQHaittWE0f3carKKFWRn7/MM1DUoC/P3xKPDWuPBIS2xbHeqmga59uBJ/LE7VW0xQd6qQuy67tEI8HbTbZxERET2TN5oWrM/XV2e0C1K7+EQERHRRWLwRbZLwiUPX22TqZE1oYKys8Iwa1hmDcoqVpUV5wGmIiAnWdtqwsWtQlBWg6oyCcpc6n4dCTejC67sFKG2A2k5+Hr9MczefAJHTubj5V9247+/78Xo2Ejc1icGnZsE1PnjExERObL5CYkwW7S+ms2CfPQeDhEREV0kBl/kWKQRvmyNmtXs+OIz1VSQWcOyih9PAkU5gLkYyE3RtpowGCsEZDWoKpMVL2sZlLUK9cPzozviiRFtMT8hCV+uO4I9KTn4cdMJtcVGB2Jin2ZckYqIiKgGZO2n2Zu1yvHx3ZroPRwiIiK6BAy+yLm5eQGB0dpWE8UF54Zh1VaVnQQKswGLCchL07aaMLhoQVlZGFaxquzsBv8hpUGZFmb5eLji5t5NcVOvaGw+elo1w/91ezK2Hs/E/x3PxMu/7ML1PaNxa+9miG7sfQn/cUR2rjAXOLYeOLpGq+LscgMQ3ErvURGRjdiVnI29qTlwd3VRbxoRERGRkwVf7777Lv7zn/8gJSUFsbGxeOedd9CrV68qj925cyemTZuGzZs34+jRo/jf//6Hxx577FLHTaQPN08goIm21URJ4blh2PmqygqyAItZO1Y2rbXIBRgA78aVVrs0eAejh08wejQPxkstA7D8uBk/7z6DPTme+HhVAT768xAGtwnBxL4xGNgmBEY27CVHJ9WdxzcCR1YDh/8EEjcD5pLy2/98HWjaD+g2EegwBnBnMEzkzKzVXld0CEOAF/tlEhEROVXw9cMPP2Dy5Mn44IMP0Lt3b7z55psYMWIE9u7di9DQ0HOOz8/PR4sWLXDdddfhn//8Z12Nm8g+uHoA/pHaVhMlRVo4Vm1fsrP2FWTKhIzSzzkJZOw95y79AYwt3eAJmGFAlsUHJw/7q221WyAQ3Bqng7qjMLw7/AJD0NjHHcG+7upjoLc7gzGyP/JcknDLGnRJ6CULX1QU2BSIGag9t/b/Dhxbq22/PQl0vhboehsQ2dXmV30lorpVbDJjwVYt+GJTeyIiIvtnsEgTg1qQsKtnz56YOXOmum42mxEdHY2HH34YTz311Hk/NyYmRlV71bbiKzs7GwEBAcjKyoK/v7yMJyLFVAzknzrPapdnVZWdOa0FZdUwWwzYa4nGRnNbbDK3xd/mtkgzBKGRtxaCBfm6I8jHo8Jl2e9RdjnI1wOBXm5c8p0anqkESN4KHPlTC7pkGmNxfuVj/CKAmAFA84FA8wFAo5jy27KTgIRvgC1fA6ePlO8P66xVgXW5TptWTHaF5w/2wda+T8v3pOKuzzepN4DWTRmqFpMhIiIi+z1/qFXFV1FRkZqyOGXKlLJ9Li4uGDZsGNatW4e6UlhYqLaKXxARVcHoBviFaVtNwwEJv0oryIqy0rD74EEYU7cjPHMLgotOoL3hGNq7HMPtWKo+5YQlGH8XtcWmgrbYmN4OGyyRsKD6FwGSeUlQJmGYCshKgzEtLPMoDcusFWUMyugimc1A6o7yiq6ja7WeehVJT7yyoGsgENSq+uotqcoc+ARw2f9p97nlK2DXAiB1O/DbE8DvU4EOo7UqMLnPeliplYhsw+x4rdprdGwUQy8iIiIHUKvgKyMjAyaTCWFhlV9ky/U9e/bU2aCmT5+OF154oc7uj4hKGV0B3xBtk0UwAcTGVbg9JxU4vl6rljm2DpbkbWiCDDQxZmCc8S91SKGrP074dcF+z07YZmiPLaYYpOYBJ/OKkHWmWC39LpdlqwnJvCQIs27WcExVllkryUorzBiUOTEpTk7fWxp0rQKOrCmtYKzAMwBodll5RVdI+9oHVHJ8i0HadtUpYPtPQPyXWsgml2WTSjEJwOJurvk0ZiKyC1n5xVi6K1VdntCd0xyJiIgcgU2u6igVZdJHrGLFl0ynJKJ6JpVj0thbNpkLLSvfnfi7LAiTyx7F2Wh5eg1aYg2ulIOMHkBUdyCuD0qa9Mbpxl2RYfLCqbwiZOQWqo/aZflYiJPqY1GloExuk60mpN9YI2+3smoyCceCS6dcll8un5YpTYkZlNlp0HXqUHlF1+HV566M6u4LNO1bHnSFdylb4bROyKIRve8Det0LJG3RqsC2/6xNhVz+ErDiFaD1cC0EazNCq8AkIrv2y/ZkFJWY0S7cDx0i9J92SURERA0cfAUHB8NoNCI1VXsnzEquh4eHo654eHiojYh05uELtByibdaeYinbS4MwaQS+Xps2WdoUXH6hhMCAkNAOQLO+WijRqQ8Q0LzaBsKnS0MwCcRO5mlBmXZZPlYMzgqRXVACk9lSISjLrXFQdr7eZBUrzRiU6SjzeOWgK/tE5dtdPYHo3uVTF6XxfEOETTI9Mqqbtg1/Bdg1X6sCk5/7fYu1zSdUqwCTECy4Vf2PiYjqxZx47ffO+G5RMHBhCyIiIucLvtzd3dG9e3csW7YMY8eOLWtuL9cnTZpUX2MkIlshIYM1AOj7YHlVjlSDyXZ0HXDqIJC2U9v+/lj7vIBooGmf0q1v2RQ06Z0S6u+ptpqwBmVa9ZgWlJVXkFWuJjtZZVCGGgZlFadXljfuP/uy9Cnz92RQdtFkaq116qIEXacPV77dxQ1o0rO8oksuy0qpenL3BuJu0raM/VoVWMK3WjXaX29qW7P+WgAmlZNyPBHZhaMn87Dp6Gk1BX9sHKc5EhEROe1UR5mCePvtt6NHjx7o1asX3nzzTeTl5eHOO+9Ut0+cOBFRUVGqT5e1If6uXbvKLicmJiIhIQG+vr5o1YrvihPZNXk3PKiltnW9VduXm1ZaEVY6PVJW2ss6DmyX7afyXkzRFYIwqdxxu3D4VdugTKarnM6vqpqscmXZqXOCskK1oXJx63mDMq1Zv7Vxf/XVZU4dlMkKpCroKq3qythb+XaDUftZsAZd8jNiy8FRcGvgiheBy58F9i3RqsAOLAWO/qVtvz0JdL4O6HYbEBFXfWN9IrKppvYDWofU+O8MERER2T6DxSIlG7Uzc+ZM/Oc//0FKSgri4uLw9ttvo3fv3uq2wYMHIyYmBp9//rm6fuTIETRvfu40p0GDBmHlypV2ucw1EdWC9AlL3FQehB3/GyjOq3yM0V3rE2YNwqJ7AV6NGnyo1qCsqt5k5Ze1kEwCs5yCklo/hgRl1sox6xRLadjv4+EKP09X+Hq4qsu+1s2z8mVvN6P9BGcFWdpqi9agS1ZIrMQAhHcun7oo33tPO/8dn50EJHwDxH8FZB4t3y9fZ9eJQJfrdPnZdlY8f7APtvB9MpstGPifFThx+gzeujEOY1jxRURE5DDnDxcVfDnjCRER1RFTiRaASBB21Non7Kym5UL6hKkgrJ/2MdD2FrgoLDHhdF5xFRVkhedUk11sUHY2KRrycbcGZEb4errBz3rZww2+ap/rOZfldr/Sj7JPLnu6udRtD5uiPC3ctAZdyQmAxVz5GJnmKtVcEnTJlEBpIO+IzGatuk2qwHYvBEyF2n5ZDKLDaKDbRG0FytquOkm1wvMH+2AL36eNh0/h+g/Xqd+tfz8zDF7udbhQBhEREel6/mCTqzoSkQMzumrT2WTr80CFPmGlFWHy8eR+IG2Xtm36VPs8/yblfcKa9SvrE6YnD1cjwgNk86x1UGbtR2Zt2p9bUIK8whLkVtwKKl+XaZjy32W9fqmkcOzsyrKzK8+0UO2syjPrdWMJAk8mwCdpLYxH18CQuBkwF1d+kMYty4OumAGAbyicgvxsthikbTLFU6b5SgiWukO7LFujGK0XWNwtgH+E3iMmcmrWpvYjO4cz9CIiInIwrPgiItuTmw4cP6tPmPmsoMcjAGjau0KfsG416hNmr+RXdWGJWVWNWQOynAuFZXJ70VnHye1FJSpAqy03lKCL4SD6uuxCP5ed6O6yHx6GykFXiiEE29y6YK9XVxzy7YZin4gqp21aw7SyYK00cJPL0svNIcl/etIWLQDb/jNQlKPtN7gArYdrVWDysSFWqnQSPH+wD3p/nwqKTej58h/IKSzB9/f2QZ8WQQ0+BiIiIqodTnUkIsciU+ikmkhWjZQg7MTfQFHuuX3CJPyq2CfMUafRXSL5tZ9fZKockEmQdnZYVlAI/9O7EJX5N5rnxKNVwXZ4Wgoq3VeqJRDrzB2w1txRfTxukYquS5s+6eHqcm4VWun1SlVoVfRAqxSsebiqnmo2+zO9a74WgsnPtJVPKBB3sxaCyaIRdEl4/mAf9P4+LdiahEe+24Imjbzw5xND7KePIhERkRPLZvBFRI7fJ2xHhemR64DcKpZglOmQ1iCsWV8gIJor612oL1XazvIeXdKDrTCr8jHeQUDMZaVTFwfC1LgV8opNWkVZgRaeWS9XqkIrKt+nQrbSgK3icQXFZ/UDqwPe7sYLhmUStBkNBvVi10U+GrRFCKT/mdGACvsNkGI0bb+h9BjtWOvt1s9Vl9VHqGPV55Ret96fth/wyjqIRnt/gP++n+F6JqNs7IVR/9/enUBHWd57HP/NBANhSVjCHpDFAhKRVSOLC0rhAEW91lvFyOZ+3cvVHtQWxI32aC29VqjneIq2RwrUKvQi4lUULVe4LAFEFBBFCIRVLWExJEzmnud5mYQhwQ0yz8z7fj/nvGcW3sk8eWcy8+f//p//c4EOn5Ov0k4/USi9rjfG439uNc97Wnu2+QDxQ2pw/TqNnbFcizfu1d2XnqXxgzsn/PkBAMD3R+ILQLCYj7GvtsT3Cdu3qep+ma0rE2Hm0jTQD6cF+7iZ42SSXGb7fIn09ZdVp5S261/Zo8ses5qZilgWKY+buhlLkMUly46YSrWyY/tEdLDkuOtHyuy/HygpU1kk6b/aqqilo7osvFo/S1usS8JrlBbyfofiaIbmRfprVmSg1kerrpJ8IpMAiyXVKpNjXsKtMglnerzFEmmqklSrTPRVn6w7eXLv2GMr9tdJk3UVicNQSLde3FFNG9Q+7ceU+CE1uHyd9hwo0QVPLFJ5VHrnvkvUPrteQp8fAAD8MDS3BxAs5n/PjTt4m5kmZhzaF58IMysMFu+QPvy7t8WSOmZKZCwZ1tr0CcuQ7xOEsYous+rgiZVyZ9TzquNiia6W3ROWHDS9vRrWTbfbqTILCdgkma1CKzsuYebdd/x1s295NGoL3iLm0l43l95tc34ocuy2d39UJq9Web/3WO/+E/Y7tiBBlZ9r7z9x/zO0tLyv3o/2VXZ0ny6PvqurQ++oTWiPRtV6y27ry8+0CbB5kX4qVv1qf3fzsyNKrcTfyLy2NZL4Ar7NP9YU2b/BXm0bkvQCAMCnSHwB8Kd62dLZP/E2o/Sw1ycsNjWycLk3jW/zm95mhM/wVps0iR/bJywv9fuE7d/uJbo+P5bs2l8Y/++16njJv2NTF23yzwfN1c2Km2ZrXO/Uk2ju5HvTTz9/Tyr4i6If/0O52qpHwy/okYxZinT+icq6X6/SnH6KKlSZnIuekHSLJeeOJdmqS9Z5STxVSfp9e7Ku+uRe1bHoGxOKDTNS/z2H1PTyKm81x5/2znE9FAAAUEOY6ggguH3CTD8rUw1melmZy4O7qu7XtMtx0yP7Sg3bJnefsIN7Kqu5zOWXn8X/e7iWlHOeV81lkl3muo9Xw/SVw19K6/4mrXrRe+/GNGov9bxe6pEvZbZ0OcKkQ/yQGly9Th8VFWvYf/1T6WlhrXhokLLqkoAFACBV0OMLAH7QNMDPT+gTtrHqfg1axfcJa57rtk+YSYaY3lyxRNfeDfH/Hgp7VWyxRJcZczrTeVL+vVpUYKvAtO5lqfRA5Wv9oyFSr1HSjwb7onLvVBE/pAZXr9Nj8z/S80u2aFi3FpqW3zthzwsAAE4diS8AOB1Mn7DC/6tMhBWtlsqPxu9TO/OEPmG9a7ZPWEmxV6FmE13vSrs+NJmQ+H1adPOmLZpEl5m2WSer5sYDt0oPSR/Nkwr+7L1PY+o3l7qPlHqNlpp0VFARP6QGF6/T0Ui5LpjytvYdPKLnR/fRoK7NE/K8AADg9CDxBQA1oaJP2LLKPmGxapsY2yesR+XUSNMnrF6TU3jOQ97zxSq6itZI0UjV6Zixiq52A1K/Lxl+mL2bpNV/kdb+VTq0t/L+M/t7CbCzL5fS6ypIiB9Sg4vX6Z0NezTuhRVqUi9dyx68zC6uAQAAUgeJLwBIhPKItPtYn7Bt70tbl1bfJyy7c/z0yEbtTt4nrKxE2r6iMtG1faVUXha/j1m9siLRdaHUgEoFHCdSJm1a6FWBbX5LipZXrmLa7WovCWaSswFA/JAaXLxOd84s0PwPdmpc/3aaNCI3Ic8JAABOHxJfAOCC+Tj919bKijCTCKu2T1jL+ESYSXaZlftMostUkR0tid8/M8dLctntQimL1cfwHe3fIa2ZKa3+s/SvbfHTYXuN8RJhGY3kV8QPqSHRr9P+r8t03uNvqfRouebfNUDntGY6OAAAqYbEFwAki0NfVNMn7IQKrhOZ/kyxii6T6DKr9iXzSpJIfuXlXnLVVIF9/N9SpNS7v1YdbwqkqQIz02R99j4jfkgNiX6dZi3fpgmvrFOn5vX1xr0XKeSz9z0AAEFQ/D3ih1oJGxUABJHp79VlmLcZZV8f6xN2LBFmKrzMqpAVia6LpOxOvktAwLFwWOpwibeZlUA/mOMlwfasl9bN8TaTYDUrQna/Tsps6XrEQI35e8F2e/nTXjkkvQAACAASXwCQSGbFR1NZYzbDFN3yHy8kkln84ILbpLxbpaICLwG27u/SV1ukRY9Ibz8u/WiwVwVmLtMIFeAfW784pBWff6VwSLqyZ2vXwwEAAAlANAsALpH0gsv3Xuve3jbkCWn9XG9VSFONuOl1bzPTbntcJ/UcJTXp6HrEwCl7dfUOe9n/rGw1z6zjejgAACABWLsZAICgS68n9cyXblgo3bFC6neXVDdbOrhbWvI76Zle0ozh0tpZUulh16MFfhDT1vaVgh0V0xwBAEAwkPgCAACVmnaSBj8mjf9Y+tlfvOmOobC0dYn06q3Sb7tIr/2nVLTG9UiB72XV1q+07cvDqpeepsG5zV0PBwAAJAhTHQEAQFW10qWul3vb/u3SmpneVMh/bZNWPO9tLc71eoF1u1rKaOR6xMB3amo/rFtL1U0nBAYAICio+AIAAN8sK0e6+BfS3WulUXOlc34qpaVLuz6QFtznVYG9cou05Z/egg1Akikpi2j+Bzvt9auY5ggAQKBwugsAAHw34bDUcaC3Hf5S+mCOtyrknvXSB7O9rXEHqef1Uo98qUEL1yMGrLc+3q0DJUfVumGG8to3dj0cAACQQFR8AQCA769uY+mC26T/+F/p5rel3mOl9AbSl59Jix6Rnu4q/XWktGGBFDnqerQIuFhT+3/r2VrhMKvpAgAQJFR8AQCAHy4Uklr39rYhT0jr53pVYIXLpI0LvK1+C6nHSKnnKKlJR9cjRsDsPXBE727aa69f1au16+EAAIAEo+ILAACcHun1pJ750o1vSHeskPrdJdXNlg7ukpb8TnqmlzRjuLR2tlT2tevRBtKzzz6rdu3aqU6dOsrLy9Py5cu/cf+pU6eqc+fOysjIUJs2bfTzn/9cJSUlFf8eiUT0q1/9Su3bt7f7dOzYUY8++qiiSdTrbd6aHYqUR9WzbUN1aFrf9XAAAECCUfEFAABOv6adpMGPSZdOlDYt9KrAPl0kbV3ibQvul879d29VyJbdXY82EGbPnq3x48frj3/8o016maTWkCFDtHHjRjVr1qzK/jNnztSECRP0pz/9Sf369dOmTZs0duxYhUIhPf3003af3/zmN5o+fbpefPFF5ebmauXKlRo3bpyysrJ09913K5mmOdLUHgCAYKLiCwAA1Jxa6VLXy6XrX5buXScNfEjKaisd2S+teF567iJp0/+4HmUgmGTVzTffbBNTXbt2tQmwunXr2sRWdd5//331799f1113na0SGzx4sEaOHBlXJWb2ueKKKzR8+HC7z9VXX233+7ZKskT5eGexPtpZrPS0sEac29L1cAAAgAMkvgAAQGJk5UgX/0K6Z600aq6Ue5XUoKXU4WLXI/O90tJSrVq1SoMGDaq4LxwO29tLly6t9jGmyss8JpbE+uyzz7RgwQINGzYsbp9FixbZajBj7dq1WrJkiYYOHXrSsRw5ckTFxcVxW035uiyi89o10mVnN1PDuuk19jwAACB5MdURAAAkVjgsdRzobUdLvaow1Kh9+/bZflzNmzePu9/c3rBhQ7WPMZVe5nEDBgywPbuOHj2q2267TQ8++GDFPmYqpElcdenSRWlpafY5Hn/8ceXn5590LFOmTNHkyZOVCL3aNtLfbuun0qPlCXk+AACQfKj4AgAA7pD0SlqLFy/WE088oWnTpqmgoECvvPKKXnvtNdu8PmbOnDl66aWXbD8ws4/p9fXUU0/Zy5N54IEHtH///oqtsLCwxn+X9FqEvAAABBUVXwAAAD6XnZ1tK7J2794dd7+53aJFi2ofY1ZrHDVqlG666SZ7u1u3bjp06JBuueUWPfTQQ3aq5P3332+rvq699tqKfbZu3WqrusaMGVPtz61du7bdAAAAEoHTXwAAAD6Xnp6u3r17235cMeXl5fZ23759q33M4cOHbXLreCZ5Zpipj9+0j/nZAAAAyYCKLwAAgAAYP368rcLq06ePzj//fE2dOtVWcJlVHo3Ro0erdevWtlrLGDFihF0JsmfPnsrLy9PmzZttFZi5P5YAM9dNT6+2bdsqNzdXq1evto+54YYbnP6uAAAAMSS+AAAAAuCaa67R3r17NXHiRO3atUs9evTQwoULKxreb9u2La5665e//KVCoZC93LFjh5o2bVqR6Ip55plnbDLs9ttv1549e9SqVSvdeuut9jkAAACSQSgaq1VPYma1oKysLNsANTMz0/VwAABACiB+SA28TgAAoCbjB3p8AQAAAAAAwJdIfAEAAAAAAMCXSHwBAAAAAADAl0h8AQAAAAAAwJdIfAEAAAAAAMCXSHwBAAAAAADAl0h8AQAAAAAAwJdIfAEAAAAAAMCXaikFRKNRe1lcXOx6KAAAIEXE4oZYHIHkRJwHAABqMs5LicTXgQMH7GWbNm1cDwUAAKQYE0dkZWW5HgZOgjgPAADUZJwXiqbAadDy8nIVFRWpQYMGCoVCNZIpNMFWYWGhMjMzT/vPxzfj+LvF8XeL4+8Wx9/fx9+EOCYYatWqlcJhujskK+I8f+P4u8Xxd4vj7xbH363iJIrzUqLiy/wSOTk5Nf485sXgD8Idjr9bHH+3OP5ucfz9e/yp9Ep+xHnBwPF3i+PvFsffLY6/W8kQ53H6EwAAAAAAAL5E4gsAAAAAAAC+ROJLUu3atTVp0iR7icTj+LvF8XeL4+8Wx98tjj8SgfeZWxx/tzj+bnH83eL4u1U7iY5/SjS3BwAAAAAAAL4vKr4AAAAAAADgSyS+AAAAAAAA4EskvgAAAAAAAOBLJL4AAAAAAADgS4FPfD377LNq166d6tSpo7y8PC1fvtz1kALjvffe04gRI9SqVSuFQiHNnTvX9ZACZcqUKTrvvPPUoEEDNWvWTFdeeaU2btzoeliBMX36dJ177rnKzMy0W9++ffX666+7HlYg/frXv7afQffee6/roQTGww8/bI/58VuXLl1cDws+RJznDnGeW8R5bhHnJQ/ivMRLxjgv0Imv2bNna/z48XaJzYKCAnXv3l1DhgzRnj17XA8tEA4dOmSPuQlKkXjvvvuu7rjjDi1btkxvvvmmysrKNHjwYPu6oObl5OTYL+JVq1Zp5cqVuvTSS3XFFVdo/fr1rocWKCtWrNBzzz1ng1MkVm5urnbu3FmxLVmyxPWQ4DPEeW4R57lFnOcWcV5yIM5zJzfJ4rxQNBqNKqDMmT9zJuQPf/iDvV1eXq42bdrorrvu0oQJE1wPL1BMFvjVV1+1Z6Pgxt69e+0ZQRMoXXTRRa6HE0iNGzfWk08+qRtvvNH1UALh4MGD6tWrl6ZNm6bHHntMPXr00NSpU10PKzBnAk31x5o1a1wPBT5GnJc8iPPcI85zjzgvsYjz3Hk4CeO8wFZ8lZaW2gz8oEGDKu4Lh8P29tKlS52ODXBh//79FV/KSKxIJKJZs2bZs7CmFB6JYc6EDx8+PO57AInzySef2ClQHTp0UH5+vrZt2+Z6SPAR4jwgHnGeO8R5bhDnufVJksV5tRRQ+/btsx9CzZs3j7vf3N6wYYOzcQEumLPgZt57//79dc4557geTmCsW7fOBkAlJSWqX7++PRvetWtX18MKBBOAmqlPpgQebipxXnjhBXXu3NmWv0+ePFkXXnihPvzwQ9uPBjhVxHlAJeI8N4jz3CHOcysvCeO8wCa+AMSfETEfRK7nXgeN+TIwJcDmLOzLL7+sMWPG2CkIBEU1q7CwUPfcc4/teWIaXiPxhg4dWnHd9N0wAdKZZ56pOXPmMAUEAE4z4jw3iPPcIM5zb2gSxnmBTXxlZ2crLS1Nu3fvjrvf3G7RooWzcQGJduedd2r+/Pl29SXTiBOJk56errPOOste7927tz0r9fvf/9424UTNMdOfTHNr0/chxlSGmL8B0wvoyJEj9vsBidOwYUN16tRJmzdvdj0U+ARxHuAhznOHOM8N4rzk0zAJ4rxwkD+IzAfQokWL4sqAzW3mXiMIzLoWJhgyZddvv/222rdv73pIgWc+g8yXMWrWZZddZqcfmLOwsa1Pnz62/4C5TjDkpgHtp59+qpYtW7oeCnyCOA9BR5yXfIjzEoM4L/kcTII4L7AVX4ZZ4tqUnJo/hPPPP9+u8mCaDo4bN8710ALzB3B81nfLli32w8g03Wzbtq3TsQWl7H3mzJmaN2+enWu9a9cue39WVpYyMjJcD8/3HnjgAVsGbN7rBw4csK/F4sWL9cYbb7gemu+Z9/uJPU7q1aunJk2a0PskQe677z6NGDHClr0XFRVp0qRJNhAdOXKk66HBR4jz3CLOc4s4zy3iPHeI89y7LwnjvEAnvq655hq7tO/EiRPtl4FZ4nThwoVVGqGiZqxcuVIDBw6MC1ANE6SaZnioWdOnT7eXl1xySdz9M2bM0NixYx2NKjhMCfbo0aNtw0cThJr57yYY+vGPf+x6aECN2759uw1+vvjiCzVt2lQDBgzQsmXL7HXgdCHOc4s4zy3iPLeI8xBk25MwzgtFTR0sAAAAAAAA4DOB7fEFAAAAAAAAfyPxBQAAAAAAAF8i8QUAAAAAAABfIvEFAAAAAAAAXyLxBQAAAAAAAF8i8QUAAAAAAABfIvEFAAAAAAAAXyLxBQAAAAAAAF8i8QUAAAAAAABfIvEFAAAAAAAAXyLxBQAAAAAAAF8i8QUAAAAAAAD50f8DPdpQHPUYsXYAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "from IPython.display import clear_output\n", - "import matplotlib.pyplot as plt\n", - "\n", - "metrics_history = {\n", - " 'train_loss': [],\n", - " 'train_accuracy': [],\n", - " 'test_loss': [],\n", - " 'test_accuracy': [],\n", - "}\n", - "\n", - "rngs = nnx.Rngs(0)\n", "train_model = nnx.view(model, deterministic=False, use_running_average=False)\n", "eval_model = nnx.view(model, deterministic=True, use_running_average=True)\n", "\n", - "for step, batch in enumerate(train_ds.as_numpy_iterator()):\n", - " # Run the optimization for one step and make a stateful update to the following:\n", - " # - The train state's model parameters\n", - " # - The optimizer state\n", - " # - The training loss and accuracy batch metrics\n", - " train_step(train_model, optimizer, metrics, rngs, batch)\n", - "\n", - " if step > 0 and (step % eval_every == 0 or step == train_steps - 1): # One training epoch has passed.\n", - " # Log the training metrics.\n", - " for metric, value in metrics.compute().items(): # Compute the metrics.\n", - " metrics_history[f'train_{metric}'].append(value) # Record the metrics.\n", - " metrics.reset() # Reset the metrics for the test set.\n", - "\n", - " # Compute the metrics on the test set after each training epoch.\n", - " for test_batch in test_ds.as_numpy_iterator():\n", - " eval_step(eval_model, metrics, test_batch)\n", - "\n", - " # Log the test metrics.\n", - " for metric, value in metrics.compute().items():\n", - " metrics_history[f'test_{metric}'].append(value)\n", - " metrics.reset() # Reset the metrics for the next training epoch.\n", - "\n", - " clear_output(wait=True)\n", - " # Plot loss and accuracy in subplots\n", - " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n", - " ax1.set_title('Loss')\n", - " ax2.set_title('Accuracy')\n", - " for dataset in ('train', 'test'):\n", - " ax1.plot(metrics_history[f'{dataset}_loss'], label=f'{dataset}_loss')\n", - " ax2.plot(metrics_history[f'{dataset}_accuracy'], label=f'{dataset}_accuracy')\n", - " ax1.legend()\n", - " ax2.legend()\n", - " plt.show()" + "@nnx.jit\n", + "def pred_step(model: CNN, batch):\n", + " logits = model(batch['image'], None)\n", + " return logits.argmax(axis=1)\n", + "\n", + "def plot_predictions(test_batch, pred):\n", + " fig, axs = plt.subplots(5, 5, figsize=(6, 6))\n", + " for i, ax in enumerate(axs.flatten()):\n", + " ax.imshow(test_batch['image'][i, ..., 0], cmap='binary')\n", + " # ax.set_title(f'label={pred[i]}')\n", + " color = 'green' if test_batch['label'][i] == pred[i] else 'red'\n", + " ax.text(0.05, 0.05, str(pred[i]), transform=ax.transAxes, color=color)\n", + " ax.axis('off')\n", + " return fig" ] }, { "cell_type": "markdown", - "id": "25", + "id": "7c0371b5-f820-4e88-8f96-26efafea72c2", "metadata": {}, "source": [ - "## 7. Perform inference on the test set\n", + "## 7. Train and evaluate the model\n", "\n", - "Create a `jit`-compiled model inference function (with `nnx.jit`) - `pred_step` - to generate predictions on the test set using the learned model parameters. Since we already have `eval_model` (an `nnx.view` with `deterministic=True` and `use_running_average=True`), we can use it directly for inference. This will enable you to visualize test images alongside their predicted labels for a qualitative assessment of model performance." + "Now, we can train the CNN model. We'll also set up [TensorBoard](https://www.tensorflow.org/tensorboard) logging. TensorBoard is a visualization toolkit that displays interactive charts of metrics — like loss and accuracy — as training progresses, letting us monitor convergence and compare runs. We use the `tensorboardX` library, which provides a TensorBoard-compatible `SummaryWriter` interface without requiring TensorFlow as a dependency. Each call to `writer.add_scalar` records a scalar value (e.g. `train_loss`) at a given training step; TensorBoard reads these from the `runs/` directory and plots them in real time. We also use `writer.add_figure` to visualize the plots created with our `plot_predictions` function." ] }, { "cell_type": "code", - "execution_count": null, - "id": "26", + "execution_count": 7, + "id": "7b945a9a-8d5c-45b3-a984-4573863c0c37", "metadata": {}, "outputs": [], "source": [ - "@nnx.jit\n", - "def pred_step(model: CNN, batch):\n", - " logits = model(batch['image'], None)\n", - " return logits.argmax(axis=1)" + "from tensorboardX import SummaryWriter\n", + "import tensorboard\n", + "writer = SummaryWriter()" ] }, { "cell_type": "markdown", - "id": "1d6cb81f", + "id": "b2ad03f3-abf6-4e3d-9f7f-ce973fef83ef", "metadata": {}, "source": [ - "We reuse the `eval_model` view created earlier so that `Dropout` is disabled and `BatchNorm` uses stored running stats during inference." + "You can open tensorboard in a separate browser window at `localhost:6006`, but there's also a Jupyter extension to view its progress from with a notebook" ] }, { "cell_type": "code", - "execution_count": null, - "id": "27", + "execution_count": 8, + "id": "0651b72c-3fe7-403a-b4cf-ad0c42952aad", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7QAAAPGCAYAAADTLdZkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjY5JREFUeJzt/QeYFFX6P27XINnAoqJgxIgBFUXBhCCirjlnFDNiXgOurgqYMfvVNbuIGDDnrIA5KwaUNbvGFSUYQIL0e1X/XvijddrtdmboOd33fV2sy4dD9ZnhnJ5+qqqfrsnlcrkEAAAAItOo3BMAAACAP0NBCwAAQJQUtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAARElBCwAAQJQUtAAAAESpqgra66+/PqmpqUk+/fTTkv5ejx49ko4dO9bpXNq3b5/su+++dXpM+CPWP9XOHqCaWf9UO3ugclVVQVuJXnnlleTwww9PVl111WTeeedNllpqqWTXXXdN3n///XJPDeaKqVOnJieccEKy2GKLJS1atEi6du2aPP744+WeFpTFmWeemX/BVtcvvqCh+uCDD5Ldd989WWKJJZKWLVsmK620UnLaaaclkydPLvfUoN6lRXFNTU3BX19++WVSDRqXewLUzuDBg5Pnnnsu2WWXXZLVV189+eabb5LLLrssWWuttZIXX3zRixqq4sn8jjvuSI4++uhkhRVWyJ+B3XLLLZORI0cmG264YbmnB3PNF198kZx11ln5k5tQDT7//POkS5cuSatWrfIn9xdccMHkhRdeSAYMGJC89tpryb333lvuKUK96tu3b9KrV6/fZLlcLjnkkEPyV4EXX3zxpBooaCN3zDHHJDfffHPStGnT2dluu+2WrLbaask555yT3HjjjWWdH9Snl19+ORk+fHhy3nnnJccdd1w+22efffIncvr37588//zz5Z4izDXpHlh33XWTX3/9Nfnuu+/KPR2od8OGDUsmTpyYPPvss/k71VIHH3xwMnPmzOSGG25IJkyYkLRu3brc04R6s9566+V/zSndD+kdCnvttVdSLar6luP0zN1WW22Vv1WxWbNmyXLLLZecfvrp+RcDIenZvvXXXz9/W+MyyyyTXHnllcHbH9Mzg8svv3z+mEsuuWT+hXWa14d0PnMWs6n0KlX6xP7ee+/Vy2NSGSph/adXZueZZ578C5hZmjdvnhxwwAH5s/Tp2Xuo5D0wy9NPP53fDxdffHG9Pg6VoxLW/w8//JD/76KLLvqbvF27dkmjRo0yr4+g0vZAyM0335y/3XjPPfdMqkVVX6FNb02cb7758lc50/+OGDEiOfXUU/NPkOkVnzmlZ/nS2xjT96fuscceyW233Zb069cv/2S5//7758ekZwS33Xbb/JmR9AX2yiuvnLz99tvJRRddlH9P6z333FNwLunfHT9+fFHzTm+tadKkScE/T281+O9//zv7bCVU6vp/4403khVXXDFZYIEFfjMmvQUtNXr06PwPE6jUPZBKX3wdccQRyYEHHpi/OweqZf2nzXrSt16lJzEHDRqULLTQQvk7c6644orkyCOPdPs9Fb8Hfm/69On5uaWFd3rLcdXIVZEhQ4bk0i/5k08+yf9+8uTJmTF9+/bNtWzZMvfLL7/Mzrp3757/exdccMHsbOrUqblOnTrlFllkkdy0adPy2bBhw3KNGjXKPfPMM7855pVXXpn/+88999zsbOmll8716dNn9u/TOaVjivk1cuTIP/w603mk46677ro/9X2iMlXi+l911VVzPXv2zHwdY8aMyY9NHxsqeQ+kLrvsslyrVq1y33777ez5pnsDqmH9n3766bkWLVr8Zsw//vGPOvmeUVkqdQ/M6f7778+Pufzyy3PVpKqv0Ka3DMzy448/5m8H6NatW3LVVVclY8eOTdZYY43Zf964ceP8G69nSc/IpL9Pz86ktyCk71u6/fbb82dj0g57c75/qWfPnvn/pk1q0jMmIW3bti26M+uc8/q9dN6HHXZY/n76Pn36FHU8qlMlrP8pU6bkb+n5vfS241l/DpW8B77//vv8FYVTTjkladOmTYnfAapZJaz/VHoVaqONNkp22mmn/BXaBx98MN8cLT1m2igKKn0P/P524/TqbXoluZpUdUE7ZsyY5OSTT87fYjDrfRizTJo06Te/T++v//2tK+mtjqn086zShZy2jk/ft1roRcW3335bcC7pC/DfdykrVdrhOH0vQHorwqz3FkIlr//0h1HofSm//PLL7D+HSt4D6fzTzq7pLcdQbes/bQqY3tqZ3s6ZfmxPascdd8zfvpl+nFt6a2ha5EKl7oE5/fTTT/n3BW+++eZVt+6rtqBNu+J17949/9679PPK0jeCp4vp9ddfzz8Jpk+GpUr/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Q50aMWJEJttoo42CY5988slgvtVWW2WyGTNmJHNbkcu03jSU9T9lypRg3rRp03p7zPfffz+Yr7zyyklD1qxZs0y27bbbBscOHz681o8X6oaZWnfddaNf/+XaAxMnTsxkrVq1KukYoc7zp5xyStKQdenSJZi/9NJLtT52t27dgvmzzz6bNGTl3gMN5WdAQ9K+ffuiu99fc801wbxfv3719m8d+lSASy+9NDh26623LrrT+t/+9rfg2F9++SWp1PWfsgfKb8UVVyzp9dhdd92VyRo1Cl/L/PXXX4P5AQcckMmGDh2azG3/aw+4QgsAAECUFLQAAABESUELAABAlBS0AAAARElBCwAAQJQal3sC1F7Xrl2D+SqrrFL0MQp1ICxHR2NK69xb3x0Ql1566WDeu3fvTHbjjTcmDcXUqVOL7ub9/PPPB/P111+/6Mdr3rx5CbNjToMGDQrm8803X9HHKNRd9corr/zT8wIKa9u2bdGdcJ966qmif3Y1bty46I7IqZ49ewbzv/71r5nsww8/DI7deeedg/ndd98dzKEcPvjgg2B+zjnnBPNQR+NCrxePP/74YF6OjsZ/hiu0AAAARElBCwAAQJQUtAAAAERJQQsAAECUNIWKSMeOHYP5gw8+GMz/8pe/ZLKnn346OPaxxx6r5eyotkZUiy++eBKb8ePHB/OJEyfO9bnwvxuPzTPPPEUfo2XLlsF8iSWWyGRffvllCbMDQjp16lT02O+++y6YH3LIIZnssMMOC45dddVVg/mECROC+eDBgzPZpZdeGhz7/fffB3NoSHr06BHMd9hhh6KPceGFFwbziy66KImZK7QAAABESUELAABAlBS0AAAARElBCwAAQJQUtAAAAESp4rsch7ribb/99sGx2267bTBfe+21i368Ro3C5whmzpwZzF955ZWistQee+wRzBdaaKGiO7cOHDgwOPaHH34I5jQszz77bDDfcMMN5/pcampqkkpx+OGHB/NPPvmk6K979dVXD+b9+vUL5ldccUVJc6xk559/ftHPya1btw6ObdeuXTC/5ZZbMtmHH36YNGStWrWqt2Ofdtppwfyvf/1rMJ82bVq9zYW4FXrtEfLAAw8E88aNsy9D33jjjeDY/fbbL5gPHz48mE+dOrXo+UFDcuCBBwbza665ptaf7HDmmWcmlcgVWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAohRdl+Odd945mB966KHBvHv37pksl8uV9JiljC/UzbjQMUIdlEvpqvxHjxn6njz99NMlHZuGJdSxNbXBBhvU+tiFumt//fXXwfy6665LKsWyyy5b9L6tz+ePavXOO+8E8/XXXz+T3XPPPcGxHTp0CObLLLNMUVm12HjjjYP5lVdeGcz333//ep4RDd1mm20WzE844YSij1GoW/Z2222XyR555JESZgdxW2KJJTLZUUcdVSfH7tu3byabMGFCUolcoQUAACBKCloAAACipKAFAAAgSgpaAAAAotSgm0LtsMMOmeyGG24Ijm3atGkwHzduXNFNWoYMGRLMf/nll2A+fPjwot9sfdpppwXzgw46KKkvX331Vb0dm8qzyy67BPPPP/88qXTHHHNMrY9R6Pv0xBNP1PrY1Wrs2LGZbPfddw+O7dWrVzA/77zz6nxeMfvpp59KagpF9TjggAOC+dVXXx3MP/zww0z27bffBsd27tw5mDdp0qSkOUKlufPOOzNZx44dSzrGlQWevws1UaxErtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABClBtHleOeddw7moY7GhboZF+pQXJ9dhENOPfXUojs217e99tork73wwgvBsdOmTZsLM4LyWn755YP5csstV+tjT5w4sehOoPx5o0ePDuZvvfVWML/ssssy2QUXXBAc+/777wfzq666Kph369Ytkx133HFJbfXo0SOYF/r5V8gll1ySyU444YTg2KlTp5Z0bOKw6KKLZrJzzz03OHbLLbcsqfvxzTffnMmWWmqpkl6jhfbnK6+8Ehz7zTffBHOIwYYbbhjM11hjjaKP8fzzzwfzfv36JdXOFVoAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKJUk8vlckUNrKmpt0mMGDEimG+00UZFd8o7/PDD661z4+KLLx7M//GPf2Syvn37BscW+jaHuvmdddZZwbH77bdfMN9uu+2Kfsy//e1vwbGXXnpp0pAVuUzrTX2u/1LMN998wfzll18O5h06dCj62DfeeGMw79OnT1IpHY0feOCB4NgVVlih1o8X6viZ2nvvvaNf/w1pD1SDr7/+Opi3bds2mH/33XdF/2wo1CWzoSv3Hmjo679x4/CHVnz//fdFfy09e/YM5q+++motZ5cku+66azAfPnx40Z8Kce+99ybVqtzrP4Y90FCsvfbawfy5554runv9LbfcEhx76KGHlvQpC9W0B1yhBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSuG2ePVkww03DObdu3cP5v/+978z2UEHHVTrebRv3z6Y9+jRI5ifdNJJwXy55ZbLZNOmTQuOPf/884vu2leoo+D9999fdBfD1F/+8pdMtuOOOwbHDh06NJj/8MMPwZzy+Omnn4L59OnTa33szTbbLJjfcMMNwfyII47IZJMmTUrqS/PmzYP50ksvHczvvvvueulm/MUXXwTzSy65pNbHhj+j0L6LtaMxhTVp0iSYP/3000V/0kOh5/rRo0cn9WWhhRYqemyhrt3Q0DRq1Kjo10yhbsapl156KZNVczfjP8sVWgAAAKKkoAUAACBKCloAAACipKAFAAAgSnO1KdQ//vGPYJ7L5YL58OHDiz728ssvH8w32WSTTHbWWWcFx7Zq1SopxaOPPprJTj311ODYQo2e6sKWW24ZzO+5555M1q1bt+DYf/7zn8F87733ruXsmBtCzcVSHTt2LPoYiyyySDDfa6+9gvkSSyyRyV588cXg2Pvuuy+Yb7vttpmspqam6MdL7bnnnsnctNpqqwVzDdSAurTwwgtnstNPPz04tmvXrsF8/fXXn6vNn5o1a1bSa4lQI83333+/zucF9WHIkCGZbOWVVy7pNcJxxx2XyTR/Kp0rtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAARGmudjnebLPNSupy3L1790z23HPPldTNdb755stkv/zyS3Dsf/7zn5K6qIY6F8+YMSOZ21566aVg/sILL2SybbbZpuhOiKktttgikz388MMlz5H6ddpppwXzH3/8MZOdc845dfKYof0ZylJHHXVUMG/evHkma9QofJ5t5syZSX256667gvkBBxxQ1PcU/qxQZ/xQd1uqz3fffZfJWrZsGRw7fvz4op9jGzcu7aVfp06dgvmSSy6ZyS688MKixxb62TVu3LiS5gf17bDDDgvm++yzT9HH+L//+79g/uyzz/7pefH/cYUWAACAKCloAQAAiJKCFgAAgCgpaAEAAIiSghYAAIAozdUux0OGDAnm++67bzAPdUx99913g2Ovv/76YP7MM89ksi+++CI49sUXX0wqyY477pjJhg4dGhy71157Fd3dUJfjhqdQd+2LLrqoqM7fqRNOOCGYN2nSpJazC3faLKRQ1/NShTplPv7448GxRx55ZDD/4Ycf6mQuUEi7du1q3YX2nnvuqcMZ0ZCFntP/6JMeRowYUW9zCXWef+qpp4Jjt95662A+ZsyYOp8X/FktWrQI5oW6d4c89thjwfy888770/Pif3OFFgAAgCgpaAEAAIiSghYAAIAoKWgBAACIUk2uyA4sNTU1tX6wZs2aBfPllluu6GMUauikeUtx2rRpU1L+0UcfZbKpU6cmc1tdNQr6s+pi/Td0vXv3DuZLLrlkMD/jjDPqZR6NGoXPs73//vslNUl54403MtlLL72UxKjc679a9kA5XHHFFZnskEMOKekYhRoCVVLDnXLvgYa+/tu2bRvMN9lkk1of+7PPPgvmY8eOzWTfffddrR+Phrf+Y9gDdeHMM88M5ieddFIw//DDDzPZ6quvHhw7ZcqUWs6uuuX+xx5whRYAAIAoKWgBAACIkoIWAACAKCloAQAAiJKCFgAAgCjN1S7HEGuHP+ufal7/KXugfuhyHMcesP6p5vVfaXtgoYUWCuaffvppMJ9vvvmC+eabb57JHnvssVrOjhBdjgEAAKhICloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEqNyz0BAKhWoS7Ha621VnDsmWeeGcz/85//1Pm8ACrVNttsU1I340KeeeaZOpoRteUKLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUdLlGADK5K233spkXbt2LctcAKpBqd2MCznuuOMy2emnn14nx6Y0rtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFGqyeVyuaIG1tTU/2yggCKXab2x/qnm9Z+yB6jmPWD9U83rP2UP0JD3gCu0AAAARElBCwAAQJQUtAAAAERJQQsAAECUFLQAAABUdpdjAAAAaEhcoQUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSlVV0F5//fVJTU1N8umnn5b093r06JF07NixTufSvn37ZN99963TY8Ifsf6pdvYA1cz6p9rZA5WrqgraSvb6668n2267bbLgggsmLVu2zG+8//u//yv3tKDeTZ06NTnhhBOSxRZbLGnRokXStWvX5PHHHy/3tGCu8jOAajRmzJhkl112SZZddtn8ul944YWTjTbaKLn//vvLPTWYK3766adkwIAByV//+tf8839asKeFe7VpXO4JUHuPPfZYss022yRrrrlmcsoppyTzzTdf8tFHHyVffPFFuacG9S49w3nHHXckRx99dLLCCivkn8i33HLLZOTIkcmGG25Y7ulBvfMzgGr12WefJT/++GPSp0+f/EnNyZMnJ3feeWf+5M5VV12VHHzwweWeItSr7777LjnttNOSpZZaKlljjTWSUaNGJdVIQRu5H374Idlnn32SrbbaKv+ivlEjF92pHi+//HIyfPjw5LzzzkuOO+64fJbuh/TqVP/+/ZPnn3++3FOEeuVnANUsPXmZ/prT4YcfnnTu3Dm58MILFbRUvHbt2iVff/110rZt2+TVV19N1llnnaQaVfVPvnvvvTf/IiA9q9esWbNkueWWS04//fTk119/DY5/7bXXkvXXXz9/W+MyyyyTXHnllcHbH9NL/8svv3z+mEsuuWT+hXWa14ebb745+e9//5uceeaZ+RcyP//8czJz5sx6eSwqSyWs//QF/DzzzPObFy3NmzdPDjjggOSFF15IPv/883p5XCpDJewBPwOo5vUfkv5MSB934sSJc+0xiVMl7IH0Mdq2bZtUu6q+QpvempjemnXMMcfk/ztixIjk1FNPzZ/xTq/4zGnChAn5s4C77rprssceeyS33XZb0q9fv6Rp06bJ/vvvnx+TvohIb3N59tln8y+wV1555eTtt99OLrroouT9999P7rnnnoJzSf/u+PHji5p3q1atkiZNmuT//xNPPJEssMACyZdffplsv/32+ceZd955k7333jv/uOmLe6jU9f/GG28kK664Yn4PzKlLly75/44ePTr/wwQqdQ/4GUA1r/9Z0hM5U6ZMSSZNmpTcd999ycMPP5zstttuf+r7QvWopD1Q9XJVZMiQIbn0S/7kk0/yv588eXJmTN++fXMtW7bM/fLLL7Oz7t275//eBRdcMDubOnVqrlOnTrlFFlkkN23atHw2bNiwXKNGjXLPPPPMb4555ZVX5v/+c889Nztbeumlc3369Jn9+3RO6Zhifo0cOXL231t99dXz801/HXHEEbk777wz/9903O67715n3zviV4nrf9VVV8317Nkz83WMGTMmPzZ9bKjkPeBnANW8/uec96w/T+ew884758aPH1/r7xmVpZL3QOqVV17J/3n6dVabqr5Cm94yMEvaVCC9HaBbt275RgJjx47Nv7l6lsaNGyd9+/ad/fv0jEz6+/TsTHoLwrrrrpvcfvvt+bMxK620Uv5N2rP07Nkz/9+0SU16q0JIertAsZ1Z55xX2t0sbYJwyCGHzO5oueOOOybTpk3Lfx3pG8XTRjlQies/PSOf3m7ze7OuSqV/DpW8B/wMoJrX/yxpU8Cdd945+eqrr/JXztJbRtM9ANWyB6pd42pv937yySfnbzFIby+YU3rbypzS++vT27jmlN7qmEo/zypdyB988EHy3nvvJW3atAk+3rfffltwLukL8F69ev3pzZje/jCnPffcM78h0/cRejFDJa//0PtSfvnll9l/DpW+B1J+BlCN63+WtIBIf6XSJmmbbbZZvvP3Sy+9lP8YE6j0PVDtqragTZsFdO/ePf/eo/QMdvpG8HQxpZ/ll36m5Z9pqpH+ndVWWy3fWS/kj97Ll55NHDduXFGPk37OVHpmaNYGSzfkoosu+psxiyyyyOx7/qFS13/a3S997+DvpR3/Zu0PqOQ94GcA1bz+C0mv1qZXz9L3LXbo0KGo41JdKn0PVJuqLWjTz2n6/vvvk7vuuiv/IdyzfPLJJ8Hx6W0sadOBOc/OpE+Uqfbt2+f/m26GN998M9lkk01KPiOYdmNNO6YVI71loUePHvn/n7amT29RSF/Uz/mknc43VegsEdWtUtZ/p06d8r9Pz6zO2RgqPSs/68+hkveAnwFU8/ovZNbbTX5/lQ2qZQ9Um6otaNO27qlcLn3/9P+Tvt/i8ssvD46fMWNG/vattBParLHp79MXC+kLilTa+eyhhx5Krrnmmsxnn6VPrumZm9/frlDbe+fTxzznnHOS6667bvY9+qlrr702f7+/BU8lr//0LPz555+fXH311bM/hza9BXnIkCFJ165ddTim4veAnwFU8/pPb+GcdTfCLNOnT09uuOGG/O34q6yySlHHpPpUyh6gygva9E3ZrVu3Tvr06ZMceeSR+TMpw4YN+83CnlN6W9fgwYPz98mn98zfeuut+Y8ESV9Iz2qdnX5MQtqMIG3OkZ492WCDDfK3EKRvLE/zRx99NFl77bXr9N75NddcM98u/F//+ld+s6W3T6RnndI3pp944oluuaSi139atO6yyy75tZ6+sEk/923o0KH5eaYv8KHS94CfAVTz+k9vK07v0EmvsC2++OLJN998k9x00035x7zgggvyH8UClbwHUpdddln+FupZd+bcf//9yRdffJH//0cccUT+Y34qXq6K23Wn7bPXXXfdXIsWLXKLLbZYrn///rlHH3000xI7bdedfjzIq6++mltvvfVyzZs3z7fbvuyyyzKPkbbuHjx4cH58s2bNcq1bt8517tw5N2jQoNykSZMKtuuujfQxBw4cmD9mkyZNcssvv3zuoosuqpNjUzkqdf1PmTIld9xxx+Xatm2bf8x11lkn98gjj9TJsakslboH/AygWtf/LbfckuvVq1du0UUXzTVu3Dj/eOnv77333lofm8pTiXtg1rGSAh/xM+trrXQ16f+Uu6gGAACAUjUq+W8AAABAA6CgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAotS42IE1NTX1OxP4A+X+uGTrn2pe/yl7gGreA9Y/1bz+U/YADXkPuEILAABAlBS0AAAARElBCwAAQJQUtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAARElBCwAAQJQUtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAARElBCwAAQJQal3sCFG/TTTcN5ocddlgw33bbbTPZueeeGxz797//vZazAwAAmLtcoQUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEo1uVwuV9TAmpr6n00VateuXSbbfPPNg2MvvPDCYN6qVauiH2/69OkldUq+7rrrkoagyGVab6x/qnn9p+yBuWe++eYL5tdcc00w33333YP5iy++WPTPlx9++CFpyMq9B6z/4jRt2jSYN2vWrOhj9OrVK5gPGDAgmK+22mpFH7vQMc4444ykISv3+k/ZA+X/9x40aFAwHzhwYFLp/tcecIUWAACAKCloAQAAiJKCFgAAgCgpaAEAAIiSghYAAIAoNS73BKqlO2Xv3r2D+f7775/JOnfunNSXeeaZJ5jPP//89faYNCyNG4e3/YEHHhjMV1hhhaKP/dNPPwXza6+9Nph/++23mWzq1KlFPx7EbqWVVspkDz30UHBs+/btS+r+2LVr10y29957B8f+85///B8zpSEo9DO8Q4cOwbxv377J3LT66qsH827duhXdObfUjr6ljA/tCSinUjoUd+/evV7nEjNXaAEAAIiS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weDY//73vyUdm7g/daJUofVI3XGFFgAAgCgpaAEAAIiSghYAAIAoKWgBAACIkoIWAACAKOlyXMcmTpxY0vjbb789k2266aZJfTn22GOD+UcffVRvj8mf88EHH2Sy5ZdfPql0p556ajDv27dv0d2MS3XEEUcE82uvvbbWx6bh+f777+vkOCNGjEjqQ+PG4R/NQ4cOLek4w4YNy2RTpkz50/Oi/Jo1axbMd9xxx2B+yCGHZLL//Oc/wbGXXHJJMH/11VeThmD11VcP5scff3wwL7WjccgXX3xRdFd84tejR4+S8lLocly/XKEFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKJUMU2hampqkoagTZs2wfyEE04I5o0aZc8pzJw5s6THHDNmTDC/+eabM9njjz9e0rEpnwcffDCTHXXUUUmMtt5662B+8sknZ7I111yzpEY5uVyu6HkceuihwVzzp+ry2GOP1clxFlhggUw2fvz4ko7RpEmTohv8FGpM8uWXX5bU5Id4HXfcccF80KBBRR9jgw02KOl5+uOPPw7mb731ViZ76KGHklKceOKJRT+nL7nkksF8wQUXTOrLnnvumckmTJhQb49HedVF8yfKwxVaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACiVDFdjn/66adgvtFGGxXd+bFQd9X6VEqH1vfffz+Yb7PNNsH8s88++9PzomGu6VK7eYe6sJaqZcuWwXyhhRbKZKecckpw7AEHHFDreRT62qdNmxbMjzjiiEymmzF/1In4qaeeCubdu3cvuuPsSSedVHQ340IdjW+55ZaSfs5ttdVWwXzq1KnBnHgtssgi9Xbs+eefP5ivscYaRed77713rZ/XS3ldVKovvvgimF922WXB/JVXXqm3udDwFHqurwsDBw4sKac0rtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABClmlyR7eRK7a7akC299NLB/P777w/mq666ar3N5Zlnnslkw4cPD4594okngvmHH36YVLr67HrYUNd/qJvlO++8Exy74IILFn3cO++8s6R5LLHEEsG8a9euRX+f6uLfr9D6Hzx4cDAfOXJkUinKvf4r7WdAIaGu+KmHH344mE+ZMqXoPTrvvPMG886dOxfdzXjbbbcN5qNGjUoqXbn3QENZ/4U+peGwww5LYlSfXY7vu+++THbqqacGxxbatw1Fudd/Q9oDsX6fN95446p9/p4b/zau0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUarKplDEp9wNERrK+l9xxRWDeb9+/YL5gQcemMlatmxZb9/jUptCjRgxoujmT+eee25Srcq9/hvSHiiHxRZbLJjfcMMNmaxnz57BsRMnTgzmt99+eya79NJLo2xcU8l7oKGs/2bNmgXzxo0bF32MXXfdNZgvu+yyJc3lkEMOyWStW7cu6RhPP/10JnvuuedK2kNXXnllMJ86dWommzFjRhKjcq//hrQH6lN9vg6idjSFAgAAoCIpaAEAAIiSghYAAIAoKWgBAACIkoIWAACAKOlyTBTK3eEv1vXfrl27oruwdurUqdaP9/PPPwfza6+9Nph/++23mWzatGm1nkelKff6j3kPUBnKvQesf6p5/afsAcpJl2MAAAAqkoIWAACAKCloAQAAiJKCFgAAgCgpaAEAAIiSLsdEodwd/qx/qnn9p+wBqnkPWP9U8/pP2QOUky7HAAAAVCQFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABRqsnlcrlyTwIAAABK5QotAAAAUVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFGqqoL2+uuvT2pqapJPP/20pL/Xo0ePpGPHjnU6l/bt2yf77rtvnR4T/oj1T7WzB6hm1j/Vzh6oXFVV0FaqDz74INl9992TJZZYImnZsmWy0korJaeddloyefLkck8N6t3UqVOTE044IVlsscWSFi1aJF27dk0ef/zxck8L5or0BVH6Aq3Qry+//LLcU4R69dprryV//etfkwUWWCCZf/75k8022ywZPXp0uacFc80H6oCkcbknQO18/vnnSZcuXZJWrVolhx9+eLLgggsmL7zwQjJgwID8k/y9995b7ilCvb+gv+OOO5Kjjz46WWGFFfJnYLfccstk5MiRyYYbblju6UG96tu3b9KrV6/fZLlcLjnkkEPyVwAWX3zxss0N6tvrr7+ef55fcskl8697Zs6cmVx++eVJ9+7dk5dffjnp0KFDuacI9Uod8P8o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7IcffpjUF02hAAAAqEgKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSlXZ5bhQJ9ZzzjknmB9++OHBvHHjxpns2GOPDY697LLLGmznuhiU+/tUSeu/VIU6SK644opJpfj555+L7nD+1ltvJdW2/su1B0KPucIKKwTH7rjjjsF8scUWK/rxdtppp2Derl27oudX6r/ho48+msk++OCD4NgzzjgjmH/77bdJpSv3HqjmnwEbbbRRMD/xxBMz2WabbVbSv1/o+1rK2FLH77PPPsGxN910U9KQlXv9V/seKOSss84qupvxMsssE8ybNWuW1JdHHnmk6G7hhTqUh7z77rvBfLXVVkvqiy7HAAAAVCQFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQpWyb3grTtm3bTDZo0KDg2IMOOiiYf/7558F8wIABmez6668veY7Vqnnz5pnsl19+KctcKOyJJ56o+C7H8847bzDv0aNHg+hyXK2aNGlSdNft+lSou2JddB4NdYUt1Cl2vvnmC+b/+Mc/gvnXX39dy9lRiQo9391www3BfIcddih6/ZfaCbeU8XVx7EJf42OPPRbMx40bV9JjEreVVlopmF955ZVFfxJCqet08uTJmeztt98Ojr3vvvuC+bPPPhvMX3jhhUx25JFH1rrL8ZQpU5KGxhVaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKFdMUatFFFw3mjzzySCZbffXVg2O//PLLYL755psH87Fjx5Y0x2q18847F93IZM0115wLMyJk2WWXDeY77rhjUulCTRlSL7744lyfC//7ubq+FGry9PPPPwfzTz/9NJN16NCh1o2vCunTp08w/89//hPMBw4cWNJcqA5///vfg/l2221Xb03R7rrrrmB+zz33FN2EqpTmVIUUGlvo2FdffXXRxyYe/fv3D+YHH3xwMF9mmWWKPvZPP/0UzE866aRg/u6772aykSNHJnWhVatWmezoo48u6RjTp0/PZIMHD04aGldoAQAAiJKCFgAAgCgpaAEAAIiSghYAAIAoKWgBAACIUsV0OT7rrLOK7pL59ttvB8eus846wXzatGlJtQp14OzcuXNw7GWXXRbMV1lllWDet2/fWs6Ouuw6fckllwTztm3bJg3ZO++8E8w7duxY9DFatmwZzNddd91M9vLLL5cwO2rjjTfeyGS33nprSf/eoQ6NV111VXDsxx9/HMyfeOKJpLZatGgRzO++++5Mtummm5Z07EKd+M8555xM9ssvv5R0bOIW6t578sknB8fOnDkzmNfU1BS9dgv9fClFoS6sheZRSKnjqUzt27evl27GqYceeiiTXXjhhcGxddW5uBS33XZbJltiiSVKOkaoo/Gdd96ZNDSu0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAEKWaXC6Xq4RucTvttFMwv/TSSzPZIossEhz71FNPBfMzzjijwXQsC2nVqlUwb926dSbba6+9gmN32223ojtzFnq8a6+9NpgX6kr65ptvJsUqcpnWm4a+/kvp7vfggw8Gx6600krJ3HbzzTcX1VHvjxTqzPnwww/Xurvfhx9+mMk6dOiQzG3lXv8x74GG7i9/+UvRnbSXW265ko49YMCAon+eNXTl3gOxrv9XXnklk6211lolfY/vueeeYL7PPvtkssmTJyf1Mec/M+/Qv1mhsYW6+X/33XdJQ1Du9R/zHgh9WsFzzz1X0jGefPLJYL7FFltksl9//TWZ2zbeeOOiuzA3bdo0OPbTTz8tuot+6LVRufeAK7QAAABESUELAABAlBS0AAAARElBCwAAQJQUtAAAAESpcVIh7rzzzmD+0UcfZbLLL7+8pC5ha6+9djAfOnRoJjv33HODY7/44otgPu+882aynXfeueiOgqllllmm6A63n3/+eXDsiBEjgvl7772Xyf71r3816G6A/H/uvffeBtHNePz48cH8vPPOy2TvvPNOnTzm008/ncn23HPPko6x7LLLZrK99947OHbYsGElHRtSEydOLLrjfqldjrfaaqtMdvbZZwfHlqMzJ3F0qy00fuWVVy76GNtvv33Rn1BRqJN8Xcx7nXXWCY71+oU/Uug5eW4/b15wwQXB/Igjjgjm88wzT9EdikMdm1Mff/xxEgNXaAEAAIiSghYAAIAoKWgBAACIkoIWAACAKNXkcrlcUQNLfDN+Q9a4cbgX1gknnBDMDz744GC+5JJLFv2YN910UzDfdtttM9n8889fdPOQ1HXXXVd0o6wXX3wxiVGRy7TeNPT1v+uuuxbdqKjQ+q8Lr776ajAfOHBgMH/44Ydr/ZhLL710MH/55Zcz2cILL1zSsSdPnlx0U60vv/wyqdT1H8MeqCT77bdfML/22mtrfezmzZsH8+nTpycNWbn3QKzr/5VXXslka621Vknf40Jfe2h8KWMLja+LeaTuueeeoptrhp7rG5Jyr/+Y90DTpk2LbiS75ZZbBvMff/wxmG+22WZFvfb4I7179y66eV+rVq2KbjBbyKmnnhrMzzzzzCTmPeAKLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUaq/dqcN2HzzzRfMb7/99mC+3HLLBfN999236Mfca6+9ih5baB4XXXRRMI+1czGl23333YP5oEGDgnl9djS++eabM9mhhx5aUofAutChQ4dgXmpH45Bff/11rnYzhrp07733FrWmqVxjx47NZJ07d6637raldsKti2N/9913wXznnXcuaS5UpmnTpmWyt99+u6Qux4U+fST06ShXXnllcOzRRx8dzDfccMOi65RCPv7446JrjzfffDOpRK7QAgAAECUFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQpYrvcty1a9dMdskllwTHdunSJZjPnDkzmE+YMCGT3XrrrcGxbdq0CeY77LBDJuvRo0dw7GmnnRbMqR5LLbVUMF9++eXr7TEPPPDAYH7HHXfM1W7GoU6Aqeuvv77eHvOGG26ot2NDIc2bN6+T43zzzTdF/zyjMu29995Ff2LCyiuvHMzfe++9oh+v0DGGDh1a9DFyuVxSirPOOquk8XDGGWcE844dOwbzrbbaKphvv/32RWWlmj59ejA/++yzg/mNN94YzD/66KOkWrhCCwAAQJQUtAAAAERJQQsAAECUFLQAAABEqeKbQp1//vlFN3/673//G8zPOeecYF6ouVQpTj311Ew2cODA4NgRI0YE88022yyYv/nmm7WcHdVk4sSJwXzkyJHBvL4aQBVq/nTbbbcF80UXXbTWj1noa7n44otrfWwo1UEHHVQnx/n222/r5DhUltdff72kvBShRpepmpqakvKQxx57rN5ei1G5mjZtmslWWGGF4NiVVlopmdtCTc1effXV4Nh77713LswoTq7QAgAAECUFLQAAAFFS0AIAABAlBS0AAABRUtACAAAQpYrpcnzssccG8/XWWy+TzZw5s6TOkg888EBSX84888xMtskmmwTHduvWLZj37t07mOtyTCkefPDBYP7pp5/W+thLL710MO/QoUMmu/766+utm3Eh06ZNC+Yff/xxvT0mpBZZZJFM1rp165KOUahD/zXX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flrS3+vRo0fSsWPHOp1L+/btk3333bdOjwl/xPqn2tkDVDPrn2pnD1Suqipoq8GZZ56Z36x1vfGgIRo1alR+vYd+vfjii+WeHtS7MWPGJLvsskuy7LLLJi1btkwWXnjhZKONNkruv//+ck8N5jqvgahGU6dOTU444YRkscUWS1q0aJF07do1efzxx5Nq0rjcE6DufPHFF8lZZ52VzDvvvOWeCsxVRx55ZLLOOuv8Jlt++eXLNh+YWz777LPkxx9/TPr06ZN/MTN58uTkzjvvTLbddtvkqquuSg4++OByTxHmCq+BqFb77rtvcscddyRHH310ssIKK+SvRG+55ZbJyJEjkw033DCpBgraCnLccccl6667bvLrr78m3333XbmnA3NNt27dkp133rnc04C5Ln3Rkv6a0+GHH5507tw5ufDCCxW0VA2vgahGL7/8cjJ8+PDkvPPOy++B1D777JO/S6F///7J888/n1SDqr7l+N5770222mqr/FntZs2aJcstt1xy+umn558MQ1577bVk/fXXz1/OX2aZZZIrr7wyeNl/wIAB+atD6TGXXHLJ/IJK8/r09NNP58/OXHzxxfX6OFSOSlr/qfQq1YwZM+r9cagclbYHZplnnnnyjztx4sS59pjEp5LWv9dAVOseSNf9PPPM85uTl82bN08OOOCA5IUXXkg+//zzpBpU9RXa9JL8fPPNlxxzzDH5/44YMSI59dRTkx9++CF/pmNOEyZMyJ8F33XXXZM99tgjue2225J+/folTZs2Tfbff//8mJkzZ+Zv83r22WfzC2vllVdO3n777eSiiy5K3n///eSee+4pOJf0744fP76oebdq1Spp0qTJ7N+nG++II45IDjzwwGS11Vb7098PqkulrP/Ufvvtl/z000/5J/X0am06/7XXXvtPfV+oHpW0B37++edkypQpyaRJk5L77rsvefjhh5PddtvtT31fqA6Vsv69BqKa98Abb7yRrLjiiskCCyzwmzFdunTJ/3f06NH5orri5arIkCFDcumX/Mknn+R/P3ny5MyYvn375lq2bJn75ZdfZmfdu3fP/70LLrhgdjZ16tRcp06dcossskhu2rRp+WzYsGG5Ro0a5Z555pnfHPPKK6/M//3nnntudrb00kvn+vTpM/v36ZzSMcX8Gjly5G+Of9lll+VatWqV+/bbb2fPd9VVV62D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0NdSKC/U5KqU5lflbojQ0P9NqGzlXv/Vvge++eabYN6mTZt6+b4++eSTwbGbbrppUq3KvQcqaf2vuuqqwfzvf/97Sc3I7rnnnlrP5dhjj81k5557bknNnzbYYIOk0pV7/VfaHmhIQj9HrrnmmuDYlVdeOZgvX6BJU12sm9C/+0knnRQcO3jw4KS+aAoFAABARVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABRalzuCcQs1NW3lG7GMQh9PSNHjizpGIU6P+uYR12Yf/75g/m8886byaZMmRIc26JFi1rPY8KECcF86tSptT425XXBBRcE83POOadeHq9p06bBvHHj8I/sGTNm1Ms8qEwdO3YM5r179w7m22+/fdEdV7/44ouS5hLqUNyoUfhay7rrrlsnn7AA5XDAAQcE84MPPjiTde7cOWnI7rjjjqShcYUWAACAKCloAQAAiJKCFgAAgCgpaAEAAIiSghYAAIAo6XJcRKe8Qnmh7r2lGDRoUDI3VcPXSPmccMIJwXzjjTeu9bELdcVeYYUVgvnSSy+dyb766qvg2MUXXzyY53K5ouf3+uuvB/N11lmn6GPQMF100UXB/K9//Wu9dLrfcMMNg/lKK60UzN95551aPyYUMt988wXziy++OJPtvPPO9TaPQt2P+/fvH8x1Oaa+tWnTJpP94x//CI494ogjav06g8JcoQUAACBKCloAAACipKAFAAAgSgpaAAAAolSVTaFKbYBUF00+CjVGGjhwYDI31efXWKgBw9z+Gimfs88+O2nICjV/KtRwqhRt27at9TFomDp27BjMV1111Xp5vFdffTWYf/zxx/XyeFSX1VdfvU6OU8rzZqGGTs2bN6/1PH755ZdaHwP+yD777BPMjz/++Ey28sor1/rx7rvvvqIbsaWefvrpoo99wAEHBPOrrroqiZkrtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAARKniuxyHOux27969oroZl9K1uT67GW+88ca1PjYNz/zzzx/Mn3rqqaKPkcvlgvn777+fyaZMmRIc+9xzzwXzTz/9NJi3b9++6LGlePfdd4P5888/X+tjU16FuhY/+uijwXzhhReul3msscYawfy0004L5qeeemownzx5cp3Oi8rQuXPnBtNZeYsttqj1sYcPH17rY1BdCnXoPvPMM4P53/72t2DepEmT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AICKpKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEo1uVwuV+5JAAAAQKlcoQUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSlVV0F5//fVJTU1N8umnn5b093r06JF07NixTufSvn37ZN99963TY8Ifsf6pdvYA1cz6p9rZA5WrqgraSvb6668n2267bbLgggsmLVu2zG+8//u//yv3tGCusP6pVmPGjEl22WWXZNlll82v/YUXXjjZaKONkvvvv7/cU4O5YurUqckJJ5yQLLbYYkmLFi2Srl27Jo8//ni5pwVzxSuvvJIcfvjhyaqrrprMO++8yVJLLZXsuuuuyfvvv59Uk8blngC199hjjyXbbLNNsuaaayannHJKMt988yUfffRR8sUXX5R7alDvrH+q2WeffZb8+OOPSZ8+ffIv6CdPnpzceeed+RM8V111VXLwwQeXe4pQr9KrXHfccUdy9NFHJyussEL+KtyWW26ZjBw5Mtlwww3LPT2oV4MHD06ee+65/InN1VdfPfnmm2+Syy67LFlrrbWSF198sc6vLDdUCtrI/fDDD8k+++yTbLXVVvkn9EaNXHSnelj/VLv0hXv6a07p2frOnTsnF154oYKWivbyyy8nw4cPT84777zkuOOOy2fpz4T0RXz//v2T559/vtxThHp1zDHHJDfffHPStGnT2dluu+2WrLbaask555yT3HjjjUk1qOpXf/fee2/+hXB6VrtZs2bJcsstl5x++unJr7/+Ghz/2muvJeuvv37+lpZlllkmufLKK4O3vgwYMCBZfvnl88dccskl80+qaV4f0kX83//+NznzzDPzL+Z//vnnZObMmfXyWFQW659qVwl7IGSeeebJP+7EiRPn2mMSn0pY/+mJzHS9z3nipnnz5skBBxyQvPDCC8nnn39eL49LZaiEPZDOp+kcxWwqvVMhvQX5vffeS6pFVV+hTW9LSW9PTM9upP8dMWJEcuqpp+av+qRn++Y0YcKE/Fnw9L70PfbYI7ntttuSfv365RfR/vvvnx+TvpBOb/N69tln80+uK6+8cvL2228nF110Uf5e9nvuuafgXNK/O378+KLm3apVq6RJkyb5///EE08kCyywQPLll18m22+/ff5x0nvo99577/zjpk/sEGL9U+0qYQ/Mkp7MmTJlSjJp0qTkvvvuSx5++OH8WXqo5PX/xhtvJCuuuGL+58CcunTpkv/v6NGj8wUFVOoeCMnlcvmT/WlRWzVyVWTIkCG59Ev+5JNP8r+fPHlyZkzfvn1zLVu2zP3yyy+zs+7du+f/3gUXXDA7mzp1aq5Tp065RRZZJDdt2rR8NmzYsFyjRo1yzzzzzG+OeeWVV+b//nPPPTc7W3rppXN9+vSZ/ft0TumYYn6NHDly9t9bffXV8/NNfx1xxBG5O++8M//fdNzuu+9eZ9874mf9U+0qcQ/MOe9Zf57OYeedd86NHz++1t8zKkclrv9VV10117Nnz8zXMWbMmPzY9LGhkvdAyLBhw/Ljrrvuuly1qOortOktA7OkTTXS2wG6deuWb6QxduzYZI011pj9540bN0769u07+/fpGZn09+nZmfQWhHXXXTe5/fbb82djVlpppeS7776bPbZnz575/6YNCtJbA0Latm1bdFe+Oef1008/5ZuAHHLIIbO7uu64447JtGnT8l/Haaedlr/1AH7P+qfaVcIemCVtiLPzzjsnX331Vf7KQXrLXLoPoJLXf3pXQnpb5+/Nujsn/XOo5D3we2PHjk0OO+ywZL311ss3C6wWjav94w5OPvnk/C0G6e0Fc0pv25pTen99eivjnNLbXFLp51mlC/mDDz7I36/epk2b4ON9++23BeeSPvn26tXrT2/G9PaHOe255575DZm+h8QLekKsf6pdJeyBWdIXUOmvWU1xNttss3z375deein/uYtQqT8DQu9N/OWXX2b/OVTyHpjTN998k39PcHpL8qz3l1eLqi1o02YZ3bt3z7/vIr2Kk74RPF1M6edZpp9n9mcay6R/J+0qlnaWDPmj93GkZ9PHjRtX1OOkn7U56w3g6QZLN+Siiy76mzGLLLLI7Hv+4fesf6pdpeyBQtKrtenVg/R9Wx06dCjquFSPSln/7dq1y/dQ+L2vv/569s8IqOQ9MGcBvsUWW+S/rmeeeabq1n7VFrSjRo1Kvv/+++Suu+7Kfwj9LJ988klwfHobV9p0Y86zM7M+tLh9+/b5/6ab4c0330w22WSTks+Ip5340o5pxUhvWejRo0f+/6cfzZDeopA+oc/5oiWdb6rQWSKqm/VPtauUPVDIrFstf3+VASpp/Xfq1Cn/+/Tq2pyNodI7E2b9OVTyHph1R8I222yTn0/aLHOVVVZJqk3VFrSzLsOnncBmSd9vdPnllwfHz5gxI38LY9oJbdbY9PfpC+b0RXUq7Xz20EMPJddcc03ms//SFxfpmZvf365Q23vn08dMP2fquuuum32Pfuraa6/N3+//v170UJ2sf6pdpeyB9Ba2WXckzDJ9+vTkhhtuyN9uWY0vbKie9Z/eiXD++ecnV1999ezPoU1vQR4yZEjStWtXHY6p+D2QXtndbbfd8m+xSj+GKH3vbDWq2oI2fVN269at82+YPvLII/NnUoYNG/abhT2n9NL94MGD8/fJp/fM33rrrfl28OmT6KzW2elHhaTNONIGNenZkw022CC/0NI3aKf5o48+mqy99tp1eu/8mmuumW8X/q9//Su/2dLbJ9KzTukb00888cSqu+WA4lj/VLtK2QPpbcXp1an0CsPiiy+efw/VTTfdlH/MCy64IP9RFFCp6z8tWnfZZZf88316cif97M+hQ4fm55me6IRK3wPHHnts/qPa0iu06cf+3Hjjjb/58969eydVIVfF7brT9tnrrrturkWLFrnFFlss179//9yjjz6aaYmdtutOW8O/+uqrufXWWy/XvHnzfLvtyy67LPMYaevuwYMH58c3a9Ys17p161znzp1zgwYNyk2aNKlgu+7aSB9z4MCB+WM2adIkt/zyy+cuuuiiOjk2lcP6p9pV4h645ZZbcr169cotuuiiucaNG+cfL/39vffeW+tjU1kqcf2npkyZkjvuuONybdu2zT/mOuusk3vkkUfq5NhUlkrcA7M+Uigp8Kta1KT/U+6iGgAAAErVqOS/AQAAAA2AghYAAIAoKWgBAACIkoIWAACAKCloAQAAiJKCFgAAgCgpaAEAAIhS42IH1tTU1O9M4A+U++OSrX+qef2n7AGqeQ9Y/1Tz+k/ZAzTkPeAKLQAAAFFS0AIAABAlBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABRalzuCZC12WabBfPDDz88mG+66abBfIMNNshkr7/+ei1nB6Vr3759ML/lllsy2VlnnRUce//999f5vAAAiJsrtAAAAERJQQsAAECUFLQAAABESUELAABAlBS0AAAAREmX4zLr1atXJrv77ruDYz/66KNgvtpqqwXzDz/8sJazg9I0b948mA8bNiyYv/fee5nswQcfrPN5AQCVa/755w/mxx9/fCbbeuutg2PXXHPNYP7tt98G86uuuiqTffXVV8Gx1113XTCfPn16MKc0rtACAAAQJQUtAAAAUVLQAgAAECUFLQAAAFFS0AIAABClmlwulytqYE1N/c+mgi2xxBLB/J133slkzzzzTHDs/vvvH8zHjRuXVLoil2m9sf6Lc9BBBwXzY445Jpivs846meynn36q83nFrtzrP4Y9sPzyywfzZs2aZbLlllsuOHbbbbcN5vvtt1/R85g4cWIwP+OMM4L5TTfdVHRHzWpW7j3Q0Nd/Ka89br311uDY9dZbr6Rjv/LKK5nsgQceKHqdpz7//PNMputrw1v/DWkPhJ7T/+i1c+fOnZOG4Isvvgjmt9xySya79tprg2Or+dNLcv9jD7hCCwAAQJQUtAAAAERJQQsAAECUFLQAAABESUELAABAlHQ5rmOFuqlddtllwXz06NGZrF+/fnU+r9iVu8Of9V9cV9lXX301OPbss88O5oMHD67zeVWicq//cu2B008/PZNtsMEGwbFrr712MJ933nmL/n5OnTo1mN9///3BfPPNN89kCyywQHBsocd88803G2xXzoak3Hsg1p8Bb731ViZbccUVg2M//fTTYL7ooosG80JrvRQjRozIZAcccEBw7H/+85+kWpV7/TekPdC0adNgfueddwbzVVddNZNdcsklJT3mwgsvHMwPOeSQTDb//PMHxzZp0qToxyu0F0M/c6ql+3FOl2MAAAAqkYIWAACAKCloAQAAiJKCFgAAgChpClXHhg0bFsxXWWWVYK75RxwNEaz/rJtvvjmTLb300sGxG220UTD/9ddf63xelajc67++90CowVjq2WefLbo5RyGff/55JhsyZEhw7OTJk4P5Aw88EMxHjRqVydq0aVPSv+H7779f9M+LalbuPRDrz4Dtt9++6KY1Dz30UDBv1apVML/qqqsyWc+ePZPa+u9//xvM99xzz6L3YaUp9/qPeQ/MbVtttVUw//vf/150Q8NCja8K7dEdd9wxmE+fPj2pFJpCAQAAUJEUtAAAAERJQQsAAECUFLQAAABESUELAABAlHQ5LkLr1q2D+f/93/9lsu222y44dsCAAcH8oosuquXsqkO5O/xV8/rfcMMNg/mTTz5ZdHfWjz76qM7nVU3Kvf7LtQcOOuigTHbFFVcExx533HHB/P777y96PRbq5vrWW28F88UXX7zo79Pzzz8fzHv16pXJpk6dGhxbzcq9B6rhZ8BSSy0VzC+44IKiO6v++OOPwbFjxowJ5qGu5SuuuGJw7JQpU4L5kUceGcyvvfbapFKUe/1Xyx4oh1CX7m7dupV0jNVXX72kfRcjXY4BAACoSApaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKjcs9gYZknnnmCebXXXddMN9iiy0y2b777hsce+utt9ZydlAehx56aDC/5ZZbMpluxtSlIUOGZLLnnnsuOLbQ2iulY3CzZs2K7mZcqkcffTSY62jM3NakSZNgfvzxxxfdzTj11VdfZbLDDjssOPa+++4ren59+/YN5meddVYwP+GEE4L522+/ncleeumloucBc8P48ePLPYWK4AotAAAAUVLQAgAAECUFLQAAAFFS0AIAABAlTaHmcPXVVwfz7bbbLpifeOKJmUzzJ2K1ww47BPNdd901mPfq1aueZ0S1mzFjRiZ799136+3xvv3222B+0EEHBfPLL7+86MZSG2ywQTBfZJFFip4H1IV+/fqV1ACwkFBjzHfeeSeprauuuiqYL7fccsH82GOPDeaPPPJIJuvUqVNw7GeffVbSHKGufPPNN+WeQkVwhRYAAIAoKWgBAACIkoIWAACAKCloAQAAiJKCFgAAgChVZZfjYcOGBfO99tormJ977rkl5RCj5s2bB/NCXWWfeeaZep4RNAxDhgwJ5quuumom+9vf/hYcu+mmmwbzJ598MpMdccQRwbGjRo36HzOF3zr44IMz2aBBg4JjZ86cGcxPOumkYF6fHcdDTj755GC+4IILBvP99tuvqM7Hf9S1/8svvyxpjlBI6OdFaueddy76GBMnTgzmU6ZMSaqdK7QAAABESUELAABAlBS0AAAARElBCwAAQJQUtAAAAESpJpfL5YoaWFOTxGjFFVfMZK+99lpw7D333BPMDzjggGA+bdq0Ws6OYhW5TOtNrOu/FFdccUVJXR7POOOMep4RDWX9V8seqAsHHnhgSV3xF1hggUw2ffr04NhC3Y+vvfbapNKVew/Euv7feuutorutvvTSS8F8/fXXT2IUek23zTbbBMeeeuqpwfzMM89MGoJyr/+Y98DcNv/88wfzK6+8MpjvvvvuRR/7sssuC+ZHHXVUUun+1x5whRYAAIAoKWgBAACIkoIWAACAKCloAQAAiJKCFgAAgChVfJfjjz76KJMtvvjiwbFrrbVWMH/33XeThtqxObXtttsWfYyRI0cG80KdnxuKcnf4i3X9l2L06NHB/I477qi3LsddunTJZKecckpwbI8ePYL5r7/+Gsw333zzort4NnTlXv/Vsgfq0xJLLBHM//Wvf2Wynj17lnTsgw46KJgPGTIkqRTl3gMNff23adMmmL/88suZbKmllgqO/fvf/x7MzzvvvCRGnTt3Lur7kfr222+D+VZbbZXJXn/99aTa1n8Me6ChuPTSS4P5oYceWvQxbr/99pKe63/88cek0ulyDAAAQEVS0AIAABAlBS0AAABRUtACAAAQpcZJhVtmmWUy2WGHHdagmz/tsssuwfyGG24I5k2bNi362GPGjAnmXbt2DeZTpkwp+tjE7bPPPqu3Y6+99tpFNz6Yd955g2MLNfNYf/31g3mfPn0qpikU8fviiy+C+ZZbbpnJzjrrrODYY445JphffvnlRc+jkhpF8f9ZffXVg3moAdTkyZODY5988smk0hsdnn766cGxhZoR7rDDDg2iKRTlNd988wXzCy64IJPttNNOJR17/PjxmWzgwIFV2/zpz3KFFgAAgCgpaAEAAIiSghYAAIAoKWgBAACIkoIWAACAKEXX5bhZs2bBfNiwYUV3Dxs+fHjSUOa933771apjZeqFF14ouhva5ptvHhy7wAILBHNdjqvHIossEsxXXHHFWq/z8847L5j/+9//zmR77rlncOx3330XzM8888xg3rp16z+YKTQMM2bMyGT9+/cPjl133XWDebdu3YL5tddem8nmmWeeoscSv5qamkz2888/B8dWWvfeX3/9NZNdddVVwbH77rtvMO/Ro0edz4uGq9CnLFx99dXBfLfddiv62KF6JLXXXntlsrFjxxZ9XP4fV2gBAACIkoIWAACAKCloAQAAiJKCFgAAgCgpaAEAAIhSdF2OC3Uu3WmnnYL54MGDM9mECROSuW3nnXcO5v/85z8z2X/+85+iv5bUNddcE8znn3/+TPb999//j5lSre65555g/ve//z2YN2nSJJN16tQpOLZQvs466xTdzbiQp59+Ophvt912JR0HGro99tgjmBf6mZHL5TLZ6aefHhyry3FlCq2BUFYtvv7665JeRw0YMCCTbbrppsGxjz/+eC1nx9zSsmXLkp4Hd91113rpZpx67LHHij42hblCCwAAQJQUtAAAAERJQQsAAECUFLQAAABEKbqmUKU677zz6u3YzZo1y2SXX355cOwuu+wSzEMNOi655JLg2ELNrDbbbLNgfvXVV2eyESNGBMdqFsWHH34YzFu1ahXMt95660zWvHnz4NiXX365pMcsxQ477BDMZ86cWetjQ0Py5Zdf1voYLVq0CObLLbdcMP/oo49q/Zg0LAsttFAw32KLLYL5ww8/nFS6jz/+OJjPM888mezEE08MjtUUqmEKPef961//Kum1eiGh1+V77rlncKz1Ub9coQUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIErRdTku1On39ddfD+adO3fOZE888USdzKV79+6ZbN999w2OnTRpUjC/6qqriv4aW7duXXQ349T06dMz2YABA4JjZ8yYEcypHm+//XYwHz9+fDA//vjjM9l1112X1JemTZsG83322afo+UHMFl988Vofo0mTJsG8TZs2wVyX4ziMGjUqmL/77ruZbJVVVgmObdu2bZ3Pq5q6RNMwbbTRRrXuZjxx4sRgvscee2Qy3YzLwxVaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACiFF2X46lTp5bUibU+uxyHuqh+/vnnwbFrrrlmMA91NO7Tp09w7HHHHRfMF1100WC+9957Z7LnnnsuOBbef//9YP7www8H87322iuTNW/ePDh23LhxtZxduJvgHx372muvrfVjQkPqZvzII4/U+tiTJ08uuhsu8fj111+DeS6XK/oYBx10UDAfMmRIUul0eI5foU8Cue2222p97L///e/BXEfjhsMVWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAohRdl+NCrrnmmmB+4403ZrJvv/02OHb48OHBfJVVVgnmm2yySSbbaqutgmPnn3/+YP7kk09msk6dOgXHPvvss8F8tdVWC+YffvhhMIdS/POf/wzm22yzTdFrd+bMmcF80KBBmaxZs2bBsf369Qvmp556akkd0aku7dq1y2SNG4d/9BXqUl+fQnumUFfO5ZZbLpg3atSo6H132mmnBcf+8MMP/2OmxOjss8/OZEOHDg2O7dixYzDfYYcdgvndd9+dVIpdd9216LF10TWXulfoeXC++ear9bG7dOkSzCdNmtSg10eHDh0yWc+ePYNj//a3vwXzm2++OZMNHDgwaWhcoQUAACBKCloAAACipKAFAAAgSgpaAAAAolSTy+VyRQ2sqUliFGo6U+iNz19++WUwb9GiRTBfaqmlMtmYMWOCY//yl78E8+eee67o5lQPPPBAMJ8xY0ZS6YpcpvUm1vVfn/bbb79MduGFFwbHtmrVqujva6F/60J7q1BTtEpS7vUfwx5Yfvnlg/nIkSMz2aeffhoc26tXr1o3GCvUXKZQQ6dQU7MmTZokdfFvE1o3oSZZqXHjxiUNWbn3QENf/6U455xzgvkxxxxT0muMCy64oOjXKa+++mow//XXX5P6EnrdVagpWt++fYP5zz//nMkWX3zx4NgpU6Yklbr+Y9gDhZpCHXjggZnsiiuuqJPHDK3fhtRgr2nTppls3nnnLekYF198cSY79thjk7ntf+0BV2gBAACIkoIWAACAKCloAQAAiJKCFgAAgCgpaAEAAIhSxXc5DunatWsw79evX0nHCXWt/Oijj4JjH3zwwWA+YsSITPb999+XNI9qUO4Of5W0/svRafaAAw4I5gcddFAmmzhxYkn7thr2S7nXfwx74Omnnw7mG2ywQdHfz/PPPz+Yt27dOphvt912maxNmzZz/d8w1Ik1dffdd2ey/fffPzh25syZSUNW7j3Q0Nd/Xdhjjz2C+dVXXx3MW7ZsWfSx//nPfxZ97OnTpwfH/vvf/w7mO+ywQzA/5ZRTMtkaa6wRHDtp0qRgPmDAgEx26aWXJtW2/mPeA6Hux6HOx3XZ/biSXKzLMQAAANQfBS0AAABRUtACAAAQJQUtAAAAUVLQAgAAEKWq7HJMfMrd4c/6p5rXfwx7INR1PjVq1KhM1q5du7n+faqLf8MhQ4YE83POOSeYF+q6H6Ny74GGvv7r09prrx3M+/fvn8l22mmnWj/e1KlTg/nzzz8fzLt06RLM55133qIfc9dddw3md955Z9IQlHv9V9oeKPS1LLroorX+FJTFF188mO+33361fq7/8ssvk9oaPXp0MH/ggQeK7oD/66+/JnObLscAAABUJAUtAAAAUVLQAgAAECUFLQAAAFHSFIoolLshgvVPNa//mPfAKqusksnOP//84NjNNtus1o83ceLEYH7GGWcE88cee6zoYxdq8lSoiU4lKfceiHX916dGjbLXRJZaaqmSmrZtvfXWRT/eNttsE8wnT54czJ988slM9sgjjxTdPK4h7a1yr/+UPUA5aQoFAABARVLQAgAAECUFLQAAAFFS0AIAABAlBS0AAABR0uWYKJS7w5/1TzWv/5Q9QDXvAeufal7/KXuActLlGAAAgIqkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSjW5XC5X7kkAAABAqVyhBQAAIEoKWgAAAKKkoAUAACBKCloAAACipKAFAAAgSgpaAAAAoqSgBQAAIEoKWgAAAKKkoAUAACCJ0f8PVuZNhiYH2eMAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], + "source": [ + "# %load_ext tensorboard\n", + "# %tensorboard --logdir runs" + ] + }, + { + "cell_type": "markdown", + "id": "6bff6756-ac92-41bf-83b4-800a23f3ac6d", + "metadata": {}, + "source": [ + "![](./tensorboard_screenshot.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "22", + "metadata": {}, + "outputs": [], "source": [ - "test_batch = test_ds.as_numpy_iterator().next()\n", - "pred = pred_step(eval_model, test_batch)\n", - "\n", - "fig, axs = plt.subplots(5, 5, figsize=(12, 12))\n", - "for i, ax in enumerate(axs.flatten()):\n", - " ax.imshow(test_batch['image'][i, ..., 0], cmap='gray')\n", - " ax.set_title(f'label={pred[i]}')\n", - " ax.axis('off')" + "rngs = nnx.Rngs(0)\n", + "\n", + "for step, batch in enumerate(make_batches(train_ds, batch_size)):\n", + " if step >= train_steps:\n", + " break\n", + " # Run the optimization for one step and make a stateful update to the following:\n", + " # - The train state's model parameters\n", + " # - The optimizer state\n", + " # - The training loss and accuracy batch metrics\n", + " train_step(train_model, optimizer, metrics, rngs, batch)\n", + "\n", + " if step > 0 and (step % eval_every == 0 or step == train_steps - 1): # Evaluation period passed.\n", + " # Log the training metrics.\n", + " for metric, value in metrics.compute().items(): # Compute the metrics.\n", + " writer.add_scalar(f'train_{metric}', value, step) # Record the metrics.\n", + " metrics.reset() # Reset the metrics for the test set.\n", + "\n", + " # Compute the metrics on the test set after each training epoch.\n", + " for test_batch in make_batches(test_ds, batch_size):\n", + " eval_step(eval_model, metrics, test_batch)\n", + "\n", + " # Show predicted labels on a single test batch\n", + " pred = pred_step(eval_model, test_batch)\n", + " fig = plot_predictions(test_batch, pred)\n", + " writer.add_figure('inference', fig, step)\n", + "\n", + " # Log the test metrics.\n", + " for metric, value in metrics.compute().items():\n", + " writer.add_scalar(f'test_{metric}', value, step) # Record the metrics.\n", + "\n", + " metrics.reset() # Reset the metrics for the next training epoch." ] }, { @@ -444,17 +424,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "49cace09", "metadata": {}, "outputs": [], "source": [ - "from orbax.export import JaxModule, ExportManager, ServingConfig" + "# !pip install -U \"orbax-export[all]\"\n", + "from orbax.export import JaxModule, ExportManager, ServingConfig\n", + "import tensorflow as tf" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "421309d4", "metadata": {}, "outputs": [], @@ -475,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "9f2ad72e", "metadata": {}, "outputs": [], @@ -533,7 +515,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs_nnx/mnist_tutorial.md b/docs_nnx/mnist_tutorial.md index cb04156ad..591810d9f 100644 --- a/docs_nnx/mnist_tutorial.md +++ b/docs_nnx/mnist_tutorial.md @@ -31,40 +31,32 @@ If `flax` is not installed in your Python environment, use `pip` to install the ## 2. Load the MNIST dataset -First, you need to load the MNIST dataset and then prepare the training and testing sets via Tensorflow Datasets (TFDS). You normalize image values, shuffle the data and divide it into batches, and prefetch samples to enhance performance. +First, we need to load the MNIST dataset and prepare the training and testing sets using the Hugging Face [`datasets`](https://huggingface.co/docs/datasets) package. We'll normalize the image values and shuffle the training data. The `make_batches` helper converts the dataset into batches of NumPy arrays with a channel dimension added, dropping any incomplete final batch. ```{code-cell} ipython3 -import tensorflow_datasets as tfds # TFDS to download MNIST. -import tensorflow as tf # TensorFlow / `tf.data` operations. - -tf.random.set_seed(0) # Set the random seed for reproducibility. +import numpy as np +import matplotlib.pyplot as plt +from datasets import load_dataset train_steps = 1200 eval_every = 200 batch_size = 32 -train_ds: tf.data.Dataset = tfds.load('mnist', split='train') -test_ds: tf.data.Dataset = tfds.load('mnist', split='test') - -train_ds = train_ds.map( - lambda sample: { - 'image': tf.cast(sample['image'], tf.float32) / 255, - 'label': sample['label'], - } -) # normalize train set -test_ds = test_ds.map( - lambda sample: { - 'image': tf.cast(sample['image'], tf.float32) / 255, - 'label': sample['label'], - } -) # Normalize the test set. - -# Create a shuffled dataset by allocating a buffer size of 1024 to randomly draw elements from. -train_ds = train_ds.repeat().shuffle(1024) -# Group into batches of `batch_size` and skip incomplete batches, prefetch the next sample to improve latency. -train_ds = train_ds.batch(batch_size, drop_remainder=True).take(train_steps).prefetch(1) -# Group into batches of `batch_size` and skip incomplete batches, prefetch the next sample to improve latency. -test_ds = test_ds.batch(batch_size, drop_remainder=True).prefetch(1) +dataset = load_dataset('mnist') +train_ds = dataset['train'].shuffle(seed=0) +test_ds = dataset['test'] + +def make_batches(ds, batch_size): + """Yield batches of normalized (image, label) numpy arrays.""" + for i in range(0, len(ds), batch_size): + batch = ds[i : i + batch_size] + if len(batch['label']) < batch_size: # drop incomplete final batch + break + images = np.stack([ + np.array(img, dtype=np.float32)[..., None] / 255.0 + for img in batch['image'] + ]) + yield {'image': images, 'label': np.array(batch['label'])} ``` ## 3. Define the model with Flax NNX @@ -106,7 +98,7 @@ nnx.display(model) ### Run the model -Let's put the CNN model to the test! Here, you’ll perform a forward pass with arbitrary data and print the results. +Let's put the CNN model to the test! Here, we’ll perform a forward pass with arbitrary data and print the results. ```{code-cell} ipython3 import jax.numpy as jnp # JAX NumPy @@ -117,7 +109,7 @@ y ## 4. Create the optimizer and define some metrics -In Flax NNX, you need to create an `nnx.Optimizer` object to manage the model's parameters and apply gradients during training. `nnx.Optimizer` receives the model's reference, so that it can update its parameters, and an [Optax](https://optax.readthedocs.io/) optimizer to define the update rules. Additionally, you will define an `nnx.MultiMetric` object to keep track of the `Accuracy` and the `Average` loss. +In Flax NNX, you need to create an `nnx.Optimizer` object to manage the model's parameters and apply gradients during training. `nnx.Optimizer` receives the model's reference, so that it can update its parameters, and an [Optax](https://optax.readthedocs.io/) optimizer to define the update rules. Additionally, we'll define an `nnx.MultiMetric` object to keep track of the `Accuracy` and the `Average` loss. ```{code-cell} ipython3 import optax @@ -170,83 +162,81 @@ In the code above, the [`nnx.jit`](https://flax.readthedocs.io/en/latest/api_ref > **Note:** The code shows how to perform several in-place updates to the model, the optimizer, the RNG streams, and the metrics, but _state updates_ were not explicitly returned. This is because Flax NNX transformations respect _reference semantics_ for Flax NNX objects, and will propagate the state updates of the objects passed as input arguments. This is a key feature of Flax NNX that allows for a more concise and readable code. You can learn more in [Why Flax NNX](https://flax.readthedocs.io/en/latest/why.html). +## 6. Define test set inference functions + +We'll also create a `jit`-compiled model inference function (with `nnx.jit`) - `pred_step` - to generate predictions on the test set using the learned model parameters. Before the training loop, we use [`nnx.view`](https://flax.readthedocs.io/en/latest/guides/view.html) to create a `train_model` (with dropout enabled and batch norm in training mode) and an `eval_model` (with dropout disabled and batch norm using running statistics). These views share the same underlying weights, so updates during training are automatically reflected during evaluation. We can use the `eval_model` for inference. This will enable us to visualize test images alongside their predicted labels for a qualitative assessment of model performance. + +```{code-cell} ipython3 +train_model = nnx.view(model, deterministic=False, use_running_average=False) +eval_model = nnx.view(model, deterministic=True, use_running_average=True) + +@nnx.jit +def pred_step(model: CNN, batch): + logits = model(batch['image'], None) + return logits.argmax(axis=1) + +def plot_predictions(test_batch, pred): + fig, axs = plt.subplots(5, 5, figsize=(6, 6)) + for i, ax in enumerate(axs.flatten()): + ax.imshow(test_batch['image'][i, ..., 0], cmap='binary') + # ax.set_title(f'label={pred[i]}') + color = 'green' if test_batch['label'][i] == pred[i] else 'red' + ax.text(0.05, 0.05, str(pred[i]), transform=ax.transAxes, color=color) + ax.axis('off') + return fig +``` -## 6. Train and evaluate the model +## 7. Train and evaluate the model -Now, you can train the CNN model. Before the training loop, we use [`nnx.view`](https://flax.readthedocs.io/en/latest/guides/view.html) to create a `train_model` (with dropout enabled and batch norm in training mode) and an `eval_model` (with dropout disabled and batch norm using running statistics). These views share the same underlying weights, so updates during training are automatically reflected during evaluation. +Now, we can train the CNN model. We'll also set up [TensorBoard](https://www.tensorflow.org/tensorboard) logging. TensorBoard is a visualization toolkit that displays interactive charts of metrics — like loss and accuracy — as training progresses, letting us monitor convergence and compare runs. We use the `tensorboardX` library, which provides a TensorBoard-compatible `SummaryWriter` interface without requiring TensorFlow as a dependency. Each call to `writer.add_scalar` records a scalar value (e.g. `train_loss`) at a given training step; TensorBoard reads these from the `runs/` directory and plots them in real time. We also use `writer.add_figure` to visualize the plots created with our `plot_predictions` function. ```{code-cell} ipython3 -from IPython.display import clear_output -import matplotlib.pyplot as plt +from tensorboardX import SummaryWriter +import tensorboard +writer = SummaryWriter() +``` + +You can open tensorboard in a separate browser window at `localhost:6006`, but there's also a Jupyter extension to view its progress from with a notebook + +```{code-cell} ipython3 +# %load_ext tensorboard +# %tensorboard --logdir runs +``` -metrics_history = { - 'train_loss': [], - 'train_accuracy': [], - 'test_loss': [], - 'test_accuracy': [], -} +![](./tensorboard_screenshot.png) +```{code-cell} ipython3 rngs = nnx.Rngs(0) -train_model = nnx.view(model, deterministic=False, use_running_average=False) -eval_model = nnx.view(model, deterministic=True, use_running_average=True) -for step, batch in enumerate(train_ds.as_numpy_iterator()): +for step, batch in enumerate(make_batches(train_ds, batch_size)): + if step >= train_steps: + break # Run the optimization for one step and make a stateful update to the following: # - The train state's model parameters # - The optimizer state # - The training loss and accuracy batch metrics train_step(train_model, optimizer, metrics, rngs, batch) - if step > 0 and (step % eval_every == 0 or step == train_steps - 1): # One training epoch has passed. + if step > 0 and (step % eval_every == 0 or step == train_steps - 1): # Evaluation period passed. # Log the training metrics. for metric, value in metrics.compute().items(): # Compute the metrics. - metrics_history[f'train_{metric}'].append(value) # Record the metrics. + writer.add_scalar(f'train_{metric}', value, step) # Record the metrics. metrics.reset() # Reset the metrics for the test set. # Compute the metrics on the test set after each training epoch. - for test_batch in test_ds.as_numpy_iterator(): + for test_batch in make_batches(test_ds, batch_size): eval_step(eval_model, metrics, test_batch) + # Show predicted labels on a single test batch + pred = pred_step(eval_model, test_batch) + fig = plot_predictions(test_batch, pred) + writer.add_figure('inference', fig, step) + # Log the test metrics. for metric, value in metrics.compute().items(): - metrics_history[f'test_{metric}'].append(value) - metrics.reset() # Reset the metrics for the next training epoch. + writer.add_scalar(f'test_{metric}', value, step) # Record the metrics. - clear_output(wait=True) - # Plot loss and accuracy in subplots - fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5)) - ax1.set_title('Loss') - ax2.set_title('Accuracy') - for dataset in ('train', 'test'): - ax1.plot(metrics_history[f'{dataset}_loss'], label=f'{dataset}_loss') - ax2.plot(metrics_history[f'{dataset}_accuracy'], label=f'{dataset}_accuracy') - ax1.legend() - ax2.legend() - plt.show() -``` - -## 7. Perform inference on the test set - -Create a `jit`-compiled model inference function (with `nnx.jit`) - `pred_step` - to generate predictions on the test set using the learned model parameters. Since we already have `eval_model` (an `nnx.view` with `deterministic=True` and `use_running_average=True`), we can use it directly for inference. This will enable you to visualize test images alongside their predicted labels for a qualitative assessment of model performance. - -```{code-cell} ipython3 -@nnx.jit -def pred_step(model: CNN, batch): - logits = model(batch['image'], None) - return logits.argmax(axis=1) -``` - -We reuse the `eval_model` view created earlier so that `Dropout` is disabled and `BatchNorm` uses stored running stats during inference. - -```{code-cell} ipython3 -test_batch = test_ds.as_numpy_iterator().next() -pred = pred_step(eval_model, test_batch) - -fig, axs = plt.subplots(5, 5, figsize=(12, 12)) -for i, ax in enumerate(axs.flatten()): - ax.imshow(test_batch['image'][i, ..., 0], cmap='gray') - ax.set_title(f'label={pred[i]}') - ax.axis('off') + metrics.reset() # Reset the metrics for the next training epoch. ``` # 8. Export the model @@ -254,7 +244,9 @@ for i, ax in enumerate(axs.flatten()): Flax models are great for research, but aren't meant to be deployed directly. Instead, high performance inference runtimes like LiteRT or TensorFlow Serving operate on a special [SavedModel](https://www.tensorflow.org/guide/saved_model) format. The [Orbax](https://orbax.readthedocs.io/en/latest/guides/export/orbax_export_101.html) library makes it easy to export Flax models to this format. First, we must create a `JaxModule` object wrapping a model and its prediction method. ```{code-cell} ipython3 +# !pip install -U "orbax-export[all]" from orbax.export import JaxModule, ExportManager, ServingConfig +import tensorflow as tf ``` ```{code-cell} ipython3 diff --git a/docs_nnx/tensorboard_screenshot.png b/docs_nnx/tensorboard_screenshot.png new file mode 100644 index 000000000..80e363996 Binary files /dev/null and b/docs_nnx/tensorboard_screenshot.png differ