{
"cells": [
{
"cell_type": "markdown",
"id": "1c7a3958-a52b-4446-8506-94f0c98863f6",
"metadata": {},
"source": [
"# Benchmarking spot counting using Vision Language Models\n",
"\n",
"There are some vision language models such as [moondream](https://huggingface.co/vikhyatk/moondream2) which are capable of counting objects in images by pointing at them. The model generates a list of point coordinates corresponding to locations in the image where prompted objects are. While the model is trained for natural images, it can be used to count bright blobs in dark images, too. This indicates that such models might be useful for microscopy image analysis. In this notebook we will benchmark how well it performs, first on an actual microscopy image of nuclei and furthermore on synthetic images the look similar."
]
},
{
"cell_type": "markdown",
"id": "38b84c3f-7a1d-4324-af3b-bb3be13f119f",
"metadata": {},
"source": [
"Installation (Windows):\n",
"* Download vips-dev-w64-all-8.16.1.zip from [here](https://github.com/libvips/build-win64-mxe/releases/tag/v8.16.1), unzip it, and add its subfolder `bin` to the PATH environment variable.\n",
"* `pip install einops pyvips`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ab4408ba-b33f-46d0-89cb-59133378f1ae",
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoModelForCausalLM, AutoTokenizer\n",
"from PIL import Image\n",
"from image_utilities import numpy_to_bytestream, extract_json, generate_spots\n",
"from tqdm import tqdm\n",
"import stackview\n",
"\n",
"model = AutoModelForCausalLM.from_pretrained(\n",
" \"vikhyatk/moondream2\",\n",
" revision=\"2025-01-09\",\n",
" trust_remote_code=True,\n",
" # Comment to run on CPU. To use the GPU, you need about 5 GB of GPU Memory.\n",
" device_map={\"\": \"cuda\"}\n",
")"
]
},
{
"cell_type": "markdown",
"id": "18c7adae-d56b-452b-bba9-aed363bc831d",
"metadata": {},
"source": [
"## Human mitosis\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "22263f34-6be6-4a8f-9bbb-a5e138dacee4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"\n",
" \n",
" \n",
"\n",
"\n",
"\n",
"shape (100, 100) \n",
"dtype uint8 \n",
"size 9.8 kB \n",
"min 7 max 88 \n",
"
\n",
" \n",
" \n",
" \n",
"
"
],
"text/plain": [
"StackViewNDArray([[ 8, 8, 8, ..., 10, 9, 9],\n",
" [ 8, 8, 7, ..., 10, 11, 10],\n",
" [ 9, 8, 8, ..., 9, 10, 9],\n",
" ...,\n",
" [ 9, 8, 9, ..., 9, 9, 8],\n",
" [ 9, 8, 8, ..., 9, 9, 9],\n",
" [ 8, 8, 9, ..., 10, 9, 9]], dtype=uint8)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import stackview\n",
"from skimage import data\n",
"import numpy as np\n",
"\n",
"# Load the human mitosis dataset\n",
"image = data.human_mitosis()[:100, :100]\n",
"\n",
"# Display the image\n",
"stackview.insight(image)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2479e515-c803-4577-a9b0-ef2a2b54a8d2",
"metadata": {},
"outputs": [],
"source": [
"pil_image = Image.fromarray(image)\n",
"\n",
"encoded_image = model.encode_image(pil_image)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "dee1257a-b0f0-41b9-933f-cc40af031b47",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Pointing: 'bright spot'\n",
"Found 14 bright spot(s)\n"
]
}
],
"source": [
"# Pointing\n",
"print(\"\\nPointing: 'bright spot'\")\n",
"points = model.point(encoded_image, \"Mark the bright dots\")[\"points\"]\n",
"print(f\"Found {len(points)} bright spot(s)\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2d3e02ac-fc6e-493b-a6b5-c36654a0cc93",
"metadata": {},
"outputs": [],
"source": [
"\n",
"box_half_size = 5 / image.shape[0]\n",
"bb = [{'x':p['x']-box_half_size, 'y':p['y']-box_half_size, 'width':2*box_half_size, 'height':2*box_half_size } for p in points]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "602ecc12-4c6f-4b36-8542-a04ba10df765",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
" \n",
" \n",
"\n",
"\n",
"\n",
"shape (100, 100, 3) \n",
"dtype uint8 \n",
"size 29.3 kB \n",
"min 0 max 255 \n",
"
\n",
" \n",
" \n",
" \n",
"
"
],
"text/plain": [
"StackViewNDArray([[[ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" ...,\n",
" [ 9, 9, 9],\n",
" [ 6, 6, 6],\n",
" [ 6, 6, 6]],\n",
"\n",
" [[ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" [ 0, 0, 0],\n",
" ...,\n",
" [ 9, 9, 9],\n",
" [12, 12, 12],\n",
" [ 9, 9, 9]],\n",
"\n",
" [[ 6, 6, 6],\n",
" [ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" ...,\n",
" [ 6, 6, 6],\n",
" [ 9, 9, 9],\n",
" [ 6, 6, 6]],\n",
"\n",
" ...,\n",
"\n",
" [[ 6, 6, 6],\n",
" [ 3, 3, 3],\n",
" [ 6, 6, 6],\n",
" ...,\n",
" [ 6, 6, 6],\n",
" [ 6, 6, 6],\n",
" [ 3, 3, 3]],\n",
"\n",
" [[ 6, 6, 6],\n",
" [ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" ...,\n",
" [ 6, 6, 6],\n",
" [ 6, 6, 6],\n",
" [ 6, 6, 6]],\n",
"\n",
" [[ 3, 3, 3],\n",
" [ 3, 3, 3],\n",
" [ 6, 6, 6],\n",
" ...,\n",
" [ 9, 9, 9],\n",
" [ 6, 6, 6],\n",
" [ 6, 6, 6]]], dtype=uint8)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stackview.add_bounding_boxes(image, bb)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0f6ac651-0bb3-4a32-9f06-a1dad92018ba",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████████████████████████████████████████████████████████████████████████████| 71/71 [38:58<00:00, 32.93s/it]\n"
]
}
],
"source": [
"counts_mean = []\n",
"counts_std = []\n",
"counts_gt = []\n",
"images = []\n",
"\n",
"for n in tqdm(range(1, 72, 1)):\n",
" counts_gt.append(n)\n",
"\n",
" coords, image = generate_spots(n=n, sigma=5)\n",
" pil_image = Image.fromarray(image)\n",
" encoded_image = model.encode_image(pil_image)\n",
" \n",
" # Run model.point 10 times and collect results\n",
" run_counts = []\n",
" first_run_points = None\n",
" \n",
" for _ in range(10):\n",
" points = model.point(encoded_image, \"Mark the bright dots\")[\"points\"]\n",
" run_counts.append(len(points))\n",
" \n",
" # Store points from first run for visualization\n",
" if first_run_points is None:\n",
" first_run_points = points\n",
" \n",
" # Calculate mean and standard deviation\n",
" counts_mean.append(np.mean(run_counts))\n",
" counts_std.append(np.std(run_counts))\n",
" \n",
" # Use points from first run for visualization\n",
" box_half_size = 5 / image.shape[0]\n",
" bb = [{'x':p['x']-box_half_size, 'y':p['y']-box_half_size, 'width':2*box_half_size, 'height':2*box_half_size } for p in first_run_points]\n",
" images.append(stackview.add_bounding_boxes(image, bb))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d0e2d8b6-890c-4353-a83f-df677b76a53e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAGGCAYAAAC0bb/qAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd0tJREFUeJztnQeY1NTXxg996X1ZepPeuxQp0qRJE1RAsaBSBVEpglKkCCqKiiCIiCKICKIiIkhVQUABlSIILqC0pS6953ve8/8yzszO7E5mZ3ba+3ue7M4kmeTm5CZ5c+6556YyDMMQQgghhBDiMak9X5UQQgghhAAKKEIIIYQQi1BAEUIIIYRYhAKKEEIIIcQiFFCEEEIIIRahgCKEEEIIsQgFFCGEEEKIRSigCCGEEEIsQgFFCCGEEGIRCqgwZ926dZIqVSoZPXp0oIsSsRQrVkwn8j/eeOMNKVeunGTMmFHr5ocffhjoIhGLPPLII3ruDh486NffEN8Am8P2OAfEd1BABVHltp/Sp08vhQsXlm7dusnvv/8e6CJ6ffNr3Lixw3GlS5dOcufOLVWrVpXHH39cVqxYIbdv3/ZJGbF97C+lCbUHg3NdS5s2reTPn186dOggGzZs8Ou+58+fL4MHD5ZMmTLJM888I6NGjdK6QEKflHpZM/eTmBjwZJ1gx7x3BhM4tygT7EtE0ga6AOQ/SpYsKT169NDPFy9elJ9//lkWLFggS5YskTVr1ki9evUsb7N27dqyZ88eyZMnjwSSZ599VrJkyaJi6dy5c1qmTz75RD744AM9LhxnkSJFJBxZvXq1BBsQsf3799fPV65ckd9++02+/PJL+eqrr+Szzz6T++67zy/7Xb58uf7/5ptvJCYmxi/7IP5n4sSJMmzYMClYsGCgi0I8AOcJ99zs2bMHuihhBQVUEHHHHXckeHsbOXKkjB8/XkaMGCFr1661vE286ZctW1YCzXPPPZfggXny5El5+umn5dNPP5WWLVvKL7/8IpkzZ5ZwFMbBBgS1c117//335YknnpDnn3/ebwLq6NGj+p/iKbSBxxITCQ3g+Q+G50DYYZCAExsba+BUtGzZMsGy48eP67LMmTPb5t24ccOYMmWKUblyZSMqKsrIli2b0bhxY2PZsmUJfr927Vr9/ahRoxzmFy1aVKeLFy8azzzzjFGgQAEjffr0RqVKlYxFixYlWBfbcJ4aNWqU5LFhHax77Ngxl8tv3bplNG3aVNeZNGlSguV///238fjjjxuFCxfW8sXExBg9e/Y0Dh48mOAYXU1z5sxx2N7SpUuNu+++28iRI4eRIUMGo0KFCsarr75q3Lx502X5vvzyS6NFixZGrly5dH3YokePHsYff/zhsW1MWztz6dIlPS9lypTRbefMmdNo3bq18dNPPyVYF+thuzjWhQsXGtWqVdNzD3sMGDDAuHz5suEp2A726epcoJ5h+cmTJ23z169fb7Rt29bInTu3noM77rjDGDFihJbfXV3buHGj2i179uy28+DKTs52+fDDD406depoOTDhM+Y5k9i+nO31wQcfGBUrVlR7FStWzJg6daquc/v2bePNN9+02b9UqVLGRx99lGBfe/fuNZ5//nm1uVkPsO7QoUONCxcuuK3zuE7Hjh2r+4Td8Jtp06a5PCcoC47zrrvu0uPImDGj2vmpp54yDh065LDu+fPnjZdeeskoX768HhPWx73jhx9+MDzhjTfe0PJ98cUXDvP79u2r83E92rN7926d37t3b9s8XIOYh3uXvb1dTeY69r+BHcqWLau2LFKkiDF69Gitf55gnntsz+o6Vu57JteuXdN6UqtWLSNLlixaL8uVK6e/P3PmjMO6J06cMAYNGmSULFlSt4trplOnTrb7hauynD17Vq/hQoUKGWnSpHF7rTgfz+zZs417771Xt2HeP3AdrFmzxu0zxtkeVuqqua6ra/jWrVv6W1wfV69edWlH2C9dunRqo3CBHqggx7kNHM+/+++/X5v1SpcuLf369ZNLly5ps0vbtm1l6tSp6tXxhBs3bkiLFi3kzJkz0qlTJ7l8+bJ6g7p27aqxSVgGBg0apIG+aOYZOHCg5MiRQ+f7IjA6derU6l1DM9fChQtlyJAhtmWbN29WzxSOr127duqhQ5wRmv6+/fZb2bRpk5QoUULLgViaMWPGSNGiRR3iHuzja1544QVteihUqJB07txZsmXLpjE/8LhgX4sWLXIoG8ry6quvSq5cuTQ+KDo6Wv755x/5/vvvpUaNGlKxYkWvbXPt2jVp2rSpNtNWr15dtxMXF6c2WLlypf7HOXFm2rRpeuzt27fXGAmcp7fffltOnz6tdkku/9NX/zFjxgzp27ev5MyZU89B3rx5ZevWreoVhUcUE+L17Nm4caNMmDBBmjRpIk8++aQcPnxYzwPOEWx16NAh/QxMewHERL355pva3ID4ONT9xYsX6/mEfadMmZKgvK72ZQ+2h3gN2Ovuu+/W7eE8wTOLbeKc47rBMtT9hx9+WIoXLy4NGjSwbQPX2uzZs3UfsDmaoXHeJk2aJOvXr9c6hDd8Zx588EGtV61atZI0adLoNYrrFevC02dvc6yLc45jx2fUTdR1zLvnnntszdu4Vhs2bCi7du2Su+66S6+P+Ph4bX5F+XA8qKuJgfUAzp39umZcC2x6/fp123k155u/cwXsgvLOnTtXGjVq5BCLaH+OAa43bBN2xz1m6dKl6g3FPlGv/I2n9z1w9epVtTHOcalSpeTRRx+VDBkyyF9//aXXBuoLrg1w4MABPe4jR47oNmBbXNOoc999953e4+rUqZPgPoC6d+HCBb2+YPN8+fK5vFac72eoS1WqVJFmzZrpdYn9wpb4jjqLOu8pntRV876KOt+zZ0/bPQ7nF/dxrId7OY4Xsbv2/PHHH3rfwH0X99GwIdAKjiTugcKbPpbBwwTwhmx6OPBmZPLPP/8Y0dHRqvDhtfHEA4X57du3d9jO999/77Iszm+cnpKUBwrgjQXlTp06tb4JgevXr+sbTdasWY0dO3Y4rI83bbypwStiT2JesZUrV+ryVq1aOXhO8OaPN2ss+/zzz23zv/nmG52HN9NTp045bAtlhGfQU9u48kDhbQ+/6d69u5bB5LfffrO9TcLTYGK+4cPb8Oeff9rmw/NUunRpI1WqVMaRI0eM5HigZs2apctgd7Br1y4jbdq06nk5ffq0w7oTJ07UdV977TWXnkC8HSdWH5zZsGGDzseb/blz52zz8RmeCiyz97AktS/TXngjPnDggG3+4cOH9Q0bdoTd4uLibMs2b96sv8FbvT3//vuvwzViMmbMGF1/3rx5Lo8R3rP4+HjbfJw32NPZ9njTNz0/zp5EfLe3fbdu3XRdeNXsQX2ElzZv3rzGlStXjMRAfYNnBHXb/vdmGfAfXkeTLl266Dx7z4GrOu/uXuP8m+LFixtHjx61zYe3Ex5hXOuu7OxrD5SV+x48j5j/0EMPJfBSo27aeyDr1aun5xf3GmcPJo7N3t72ZYHXyJUH2d21YmJ/nzeBXeFVgwfJigfK07pq79l1Bvd4/KZJkyYJlj399NP6u2+//dYIJyigggCzcsPtiwqK6dlnnzXq16+v8+GmRzMFQPMT5uFm74z5UHv55Zc9FlCuLkIsw4MnpQQUyJcvn8NNesmSJQmOxR64xSG47C/6xAQUHopYjgeoM7gRQoB07tzZNg9NaVjflTvcGW8EVIkSJVQ0Qvg6g2YbbO/jjz9OcONC040z5rKvvvrK8ASsiweoWdfQFIUHB+bDpqaQNG96rpqG4LLHw7pGjRoJ6hoElzvcPRQee+wxnY/mSWcWLFigy9CU6+m+TJugacgZ8xqaO3dugmU4L66aW10BYYPtPPLIIy6P0VXdMZfZi2M0xeGFYN++fYnuD0ID6zk3sZm89dZbuu2vv/46ybJ37NhR67wpID/99FP9LYQsHoLm/QJiC+cZZbQnOQLKWfzZL/v9999TREB5ct+DYEJ4BMS2c1OdM9u2bUtQR+0ZPHiwLrdvyjPLgpcmVyQloNyB5kD8zj7MISkB5WldTUxAmfdl1Kv9+/cb9i/IsCuaaj1tpg0V2IQXRMAFjGYoANcpXLlwhaK3S6VKlXT+9u3bNX8Oetc5Y7rNd+zY4dH+4HpFc4UzaOJC81hK4tx0hCYS8Oeff7rsFn38+HFtStm3b5/UrFkzye1jewhQR1OMK2BT7Mtky5Yt6qpHc4SvOX/+vPz999+aCwm2dnUe33vvPT2PZq9MEzT3OWNuA70bPQVNfmZdg8seQeVockCKATQN2Z8DNGug2dIZ1FF7m5m4qptJgXoNXKWhSKxeJ7WvatWqJZhnBj+7Sp+AZWjKcK6bc+bM0SaVnTt3apOZfeoNMzDemaTOVdasWbV5evfu3do8jSaixEATyK1bt7RZydU1gWYlgHOC5rHEQHPcF198oU1pXbp00eY8NFXXr19fm6fxHftAUyE6e6B5y1f4qg57i6f3PdgR1yqaxMxmOneY1wruS67OjXmd4D+a/k2ioqJs93ar4B6CkAT00EbzHZoD7UG9REiDJ3hSVz3hqaeesjV5o2kdoJ6huRShJWjqCycooIIItLXjYZUYuKCRH8oVZs8m3OA9wV2XVuQF8lVuJk/AhY8LDA9y3MQBvoOk4nrwAPIEbO/mzZs20ZDUtnDTQDyKPy54nEMAgWz1PLo6ZzhfAA9XTylTpoxL8WOPeQ6sxqW4O66kbAJbI5bD1fawzJU9ktoXYonc2cvdMtQTe3Djf+edd/S6u/fee1VkQVwD1CfnB5eVc2UKBk/SAZjn46efftIpOdeEfRyUKaDwsgA7YxnizZDewuz5m1j8k1WSW4fNazKxe5S5zNX16+l9z5tzg/QcmDw9N4gH8ibX0/79+/XlAdcNzg3ip1CfcbwQxYhTclcvXeGr+0rz5s1VnOJl4+WXX9Z7Onr3olyPPfaYhBsUUCEGLpITJ064XGbOd/VgCGbwMMBDC2++zg+3r7/+Osm3aU/A9nCjOnXqlMdvqaaXy9ciyjy2YD+P5v5xk/b0DRR480DAvmBreDucg0wRiItlruzh70SD2DcC9ytXrqzeCQSfm6B+JCbIrTy44EFICvP4kVPttddeS9Z+K1SooGIVAunYsWPqyTXzguGB/Morr2gwuZmQ0h+e2OTaDF5Ud5jXeXLyHpnB71bODTp0mHb0BG/rL7L5nz17VubNmyfdu3d3WNa7d28VUIEgVapUGkyODjsQkvCuwUOG4HR3L/6hTHj50yIANEngzRBNTM6YF40/MjvjTcLq24gn4MFounrRE8TE7K1ipSkRQsdd+bA93HDNZo6kwNsd3uA8uRFZtQ1utug9iLdIVzdnf55HK5jnwGye8CdmU5urDMeBtAeaSdCEh2Yce/EEfvjhh2RvH8lly5cvL7GxsUnWzVq1aukDyhfN66YoghfS9PKiNxhAD0T0BkOvMdgeTU6eJOL11z3ClfcU5UOTprO30MS0EYRvcvaDaxX7gVhJDG/uV8mxJ8I9ADyizvfTxLyT/iyTCTxNaN6H5wmJknH99OrVS8IRCqgQA91HwfDhw7U7rgkexHC7w4Pj/EbiC8ymtX///ddn24S3ATE+uFHjIdKnTx/bMnTBRddtHJOr4UVw7D/++GOCMrorn5naARe3qzdXeBOQqdcEXXgBuryb7nkT3LTtvUfe2AbnEceA82gf/4UYG8Tb4M05qe7o/gbpC1CfBgwYoOkbnEEThxm75Kt6DY+O2cQJ8Nn08pjrpCRmDAm8MfbNOzjXiE30BahreCDB3ng5sgfxTmb9Q9MuYpFQFqTXcI4bBIjfQrd8TzCb5SZPnqxeP3ilAIQiXiDwAMS14mnznT/uEa5A3BDsgPvHuHHjEixHl3mUHV7Tjh07er0f1H3E9KDpGPcBZ9GA+RgxAsBeEFEYUQGpJ5xB3bHqFUrMnma9dL4HIrUG7iH+wpNznC9fPhV2GHVg5syZWm/RxBiOsAkvxHjooYc0SA95X/B2heYtMw8Ubnavv/66ejd8Dd5O0WyAGwpiJhCQDYHjnO/DHfitOZQLHooInIUwgpcHgavIw2L/ho8Yk88//1xdv3hTRs4kM/gSuX7w9o/hSOzjeFBGcxgSeDTwttSmTRt1IyOXzosvvqjt8gjYxXfchGAzeIKwPdyMEdgNWrdurdnTUW4E9+JGjIcMhCoEH5Yhd5O3tkGOKbi4P/74YxVuOD48EHDzhbD66KOPLDWb+QPY+91331Vhi7dx2ARZ1c0geDwQkBsG+XCSC3IbQaihCQT7Rb4YCATUdYg3CGCsk9Ig3gllQW4bdFbAeYJ4XrZsmZ532CG5wL6wJeou6hoePvB8oJ4jfxACck0xjfOxd+9erT+oO3Xr1lWxDRv9+uuv6sVCk5yzt8wVpjByFSSOZebD2VMBhUzXBQoUsF3LCEKGpwvH5+shRHCfg1iEuMa5wD0CwgpNkRiOCHUHnjXnHFRWGTt2rHpgYWv8x/0I9yacd8SrwkamZxTiCbZ64IEHNP8YQhJQJpxHeKZgZwhiT0H9wj0Q9xRce2bAOe5paKbDixbyWCEvIO6FKN+2bdt0eWJxWMkBx4dzinxPf/75p55XTPYvvwD3QlwzaAIfOnSoLTQj7Ah0N0CSeB4oVyAPEfLvIK8IcgYhxwi6nCJrttVM5Fa6z06ePFnzi6D7fWIpA1xty5zQRRo5jqpUqaJd11esWJFo11bk4Bk4cKDuF8eKbsXIFdSrVy9j9erVDusiVULXrl2NPHnyaHd8V5nIV61aZbRr1067ZuM4kMm7bt26mi7BVYqDxYsXa14TdGXG/pEjCTlhdu7c6bFt3Nka2ZBffPFFzUeE3ETIhYM8Va7SBiTWfdjMXOx8rFbzQLljy5YtxgMPPKD5ZXB8sG/16tWNYcOGGXv27PG4G7snXbPRxR0ZizNlyqQTPrvq9p7UvhKzV2JpJ1yVD7l+kFYE597MQo76glxlrq6DxI7R3b6RLuD999837rzzTs10jWPHfpCjzLleImcQ6htSSGBdZC1HbqUOHTponjgzl5onoP6jPNOnT3eYj27tmI8u6c45wBI7jp9//lmPH/ekxDKRO5NU93hXIP0Ifod7CeyAuolcWMiVhbQCrvDmvodu+LjfVq1aVW2NbORI64A6gSzi9iDdwciRIzXzvbkuziPKhNQsnpYF4DwOGTJEu//jvumchgC2Qqob2Br3DqRe+fXXX13aMqk0Bq5wd76QMd989oiL0QTM+lywYEGtP3/99ZcRrqTCn0CLOEIIIYSEB0f/P4UCUqIgiDxcYQwUIYQQQnzGm2++qbGiaGoMZ+iBIoQQQkiyiI+Pl+nTp+v4fbNmzdKYOIw3afbcC0cooAghhBCSLA4ePKhJNDGqA3okonMJOp+EMxRQhBBCCCEWYQwUIYQQQohFKKAIIYQQQiwSptmtHEHyRnSrRGJCf4+dRQghhJDQAtFMFy5c0GSwno5/GhECCuIpHAcyJIQQQojvQFZ/ZNH3hIgQUOaQGDBMoEe4t4I5Oj1GTfdUERPazRtoM+vQZt5Bu1mHNvO/3TBEFRwtVobQiggBZTbbQTyFmoDC2EkoMy8az6HdrEObWYc28w7azTq0WcrZzUqYD88EIYQQQohFKKAIIYQQQixCAUUIIYQQYhEKKEIIIYQQi1BAEUIIIYRYJCJ64VlNpnXr1i25efNmUPQguHHjhvYiYM8Lz6HdrEObhYfN0qVLJ2nSpAl0MQiJCCig7ITTuXPnNGcEBFSwlAk3aWRHZQZ1z6HdrEObhY/NcuTIITExMUFVJkLCEQqo/+f48eMqoMxcUWnTpg34DQg3aHjCgqEsoQTtZh3aLPRthvJcvnxZ4uLi9Hv+/PkDXSRCwhoKKBH1OMXHx2u20jx58kiwEGw36FCBdrMObRYeNsuYMaP+h4iKjo5mcx4hfiQ4Gu4DDOIYcDPMnDlzoItCCCHJIlOmTLb7GiEkjAVUsWLF9O3NeerXr58uh7AZPXq0jpCMt6vGjRvLrl27/FKWYHmLJIQQb+F9zDd8/PHHcvr06UAXgwQxARdQW7dulWPHjtmmVatW6fwuXbro/8mTJ8uUKVPknXfe0XURHNm8eXMN3CSEEEJ8zZtvvikPP/ywNG3aVC5duhTo4pAgJeACCnFHEEXmtGzZMilZsqQ0atRIvU+oyCNGjJBOnTpJxYoVZe7cuRooOX/+/EAXPWT48MMPHbx7iNkoVKiQPProo3LkyBGf7uv69evSu3dvDWBF/EXVqlXF1yxfvly9kp7yyCOPOBw/mmrh+bz33ntlzpw5cu3atRQriz/2g2PBMRJCfEPWrFn1f7t27WxNooQEnYByfvjOmzdPHnvsMX3QxcbGau+4Fi1a2NbJkCGDiquNGzcGtKyhCMTCpk2b1Mv3xBNPyIIFC+Suu+7y6RvW9OnT5b333lPR++OPP6ob3B9iYsyYMZZ+g+ZfHDsmiPSxY8eqkIIdatSoIf/++2+KlcXX+/niiy/kxRdf9HsZCIkUHn/8cfnll1/0PsEmURISvfCWLl2qqQTMt2mIJ5AvXz6H9fD90KFDbrcDj4K9V+H8+fP6HzlbMDmDefB2mVMwYZYnOeUyf1uhQgWpWbOmfkYsGXoQjRs3Th/A3bt3T1Y54RXEm9off/yhYsWMYUtu2b21ifM6SHRYp04dh3UeeughrWt4y7zvvvtUXPmjLL4gsf2YXr7kliGljiWcCEabmfcxd/e7QGPeb4OtbB999JHcc8892nsRVKtWLWieCcFqs2DHit28sW1QCajZs2dLq1atNGDcHuc3ABgksbeCiRMnunxbR5JMZA12Br1VYDwIimDIQO6cFR0k5y3IrBjOGdZr1aql/+Hpw3zsD96j999/X/bt2ydRUVHSpEkTtWeJEiVsv2vWrJmcOnVK3n77bfU0/fbbb9K2bVtZtGiRbR0zMzO2hVgCT7cNvvvuO417+/XXX/XcFClSRHr06CFDhw7VN0PTq2Wf/RnbRFOWK7uZx+/q3N599926zRkzZsjatWvVI2fy2Wef6TFCFGI79erVU8GJGytIqiwpdcylSpWShg0b6vVjcvjwYfVKff/995qio3jx4urZHThwoG0bBw8elNKlS8srr7yix/fuu+/qeUVT+WuvvZZAcBL/XJ++BvUcdR4B0MhMHmygbKiTsF+wZHCfNWuWvPTSS1K2bFn1UAdbj+xgtFkoYMVu3sRVB42AgkcJN/slS5bY5iEmyvRE2SeFQ44TZ6+UPcOHD5fBgwc7eKAKFy6s8VZIkukMRBWMh9ggTM4k1sSFOB88GD1ZFyfQzNNiZd3k3gTNioOy2h8fhBOALTH/ySef1BizAQMGyKRJk+TMmTPy8ssva5Ppjh07bDbHwwLnBN6b559/XiZMmKD7eOaZZ1RgQIisXr1a10U8m5VtQwRgXcxHcyDeBiEUdu7cqdvBTe7KlSvy+eefOzTj4vw6nzvTbubxuzq3oH379iqgfvrpJxU4AMcEAYJjHDlypDYvQ1RAcG3evFnKly+fZFlS8phxjOZnvChgWygzmiAgsvBQgBjDOYdQsrcHjh0PDhyfuT/Eh/3999+SPXt2r+pcJBFsIgXnEPUhd+7cDvemYHqo4R6C+3EwiIG33npL6zxArK3ZMzyYCDabhQq3LdjNq2vFCBJGjRplxMTEGDdu3LDNu337ts6bNGmSbd61a9eM7NmzGzNmzPB42/Hx8fDB6n9XXLlyxdi9e7f+dwV+625q3bq1w7qZMmVyu26jRo0c1s2TJ4/bdWvWrKnHf/36df2fHObMmaPb/Pnnn9W+Fy5cMJYtW2bkzZvXyJo1q3H8+HFj06ZNus7rr7/u8Nt//vnHyJgxozFkyBDbPBwH1l29enWCffXs2dPInDmzwzxPt41yZcuWzWjQoEGix9yvXz/dnjuc7eaqTPbs2bNHt9enTx/9fvjwYSNt2rTGgAEDHNZD+VAfu3btmmRZUvKYixYtqsdoMmzYMF138+bNDuvh+FKlSmXs3btXv8fGxup6lSpV0nph2mzLli06f8GCBW7LQxLWs2AhqftZoLl165Zx7Ngx/R9o3nzzTds9d8SIEUF3LoPRZqHELQt2S0onuCJ1sKhEBDj37NnTwUsA5Tho0CD1BiBOB2/k8Agg1qZbt24BLXMocuedd+rbMnqYoMkNHr5vv/1WPSHwUMDeaDYymzIxYZ0qVarIunXrHLaVM2dO9cZ4gqfbhncF3sK+ffum6Bugc4wDmtNQPjQ92pcXbyjw7DjbItiOec2aNeohq127tsN8XDs4Viy3p02bNg4ZqytXrqz/E4szJCTUmTp1qj5fAEIR4B0ONs8TCW6CogkPTXeI2UCMhjNDhgzR5gs8YM6ePatxGStXrrR1M00JLl686HaZ81AJ5jhUrnB2ISIGxdN1fRUkWa5cORWpEE32zaInTpzQh6u7plHnmB0r42x5um00PQGkWEhJTKFgxt6hvPYxYt6cm0AeM2JfzHgwe8zjc04OiKYee9DTFeC6IyQcQbM5xRMJCwGFNAXuejqgUiP/TUrk2nGHlYBCX67r694fEE9mLzxnMAYgbP3DDz/YHqD2OM+zcrPxdNtopwbephTwlq+++srWM9EsL0DMUdGiRb3aZiCPGYIISWmdOXr0qK1shEQySJCJlwz0PqZ4IiEtoEjgQZMeemMhsWbXrl0Dsm30ckPQMoKaH3jgAbc3NXsPiX1QvjcgJxZ6yWHfDRo00HktW7ZUL92BAwekc+fOif7eXVkCecx4OKCn37Zt26R69eoOHkhs3wyUJyRSgXjC9ZEjRw6KJ+I1FFBEqV+/vvYEQ3ZyJJBDt3h4yODJQELMSpUqSZ8+ffy67SxZssjrr78uvXr10lQJSHKJJrD9+/drqgQM5wOwPkDPNqS9QDMq4nbSp0+faJzdzz//rJ+RIwxNxoj/QqoCeObw3/7mit5rcO2jJxpywyDmC81yW7Zs0bKbaTLclSWQx4zekBBLiG3CccCL9s0332jvO+wTqQsIicSYJ6QH6dixo37HNU1IsjAigOT2wgsUvu6Ft3Xr1iTX/eCDD4w6deporzX0FitZsqTx8MMPG7/88otDL7wKFSq4/H1iPd482TZYvny57gProVdj+fLlE/TE7NWrl/YiRK8yHBt6lCXWC8++hyP2XaRIEaNdu3ZaJmzPFUuXLjWaNGmiveQyZMigvd3uu+8+4/vvv/e4LClxzM698MChQ4eMbt26Gblz5zbSpUtnlClTxnj11VcdeqOYvfAw39lmmI+escQ97IUXOj3K3njjDa3T6F27a9cuI9RgL7zg7IWXCn8kzEEvJzSTIKGWuzxQyI+DZIPBlDcFpwY9t9CcRDez59Bu1qHNwsdmwXo/s/cGo7MN8p2lRE4jjKcKryxATrdQHJ4lpW0WLty2YLekdIIreCYIIYSEJeEgnkjwQgFFCCEk7KB4Iv6GAooQQkhYgdyCFE/E37AXHiGEkLACoySgZysy/1M8EX9BAUUIISRsAvshlhAwPHPmTJ1H8UT8BZvwCCGEhEXME5LRomekKZwonog/oQeKEEJI2ASMI1EmhBQh/oYCyofEnb8qcReuWf5ddNYMEp0t+PK1EEJIKIknjB5w//33B7pIJEKggPIhn2w+LFNX/2X5dwOblpJnmnN4DUIISY544sDAJCWhgPIh3esUkebl8znMu3rjltw3Y5N+/rx3XYlKl8alB4oQQojnUDyRQEMB5UPQDOfcFHf5+v8CGkH5AtkkU3qanBBCksO///4rL7zwgn6meCKBgr3wIoAPP/zQ1iMFE8bHQn6UJk2ayMSJE3WsIG/ZvXu3jB49Wg4ePOjTMqfkfrBdT26+jzzyiIMdM2TIIGXKlJFRo0bp+GNWwTawb29499139bz6mh9++EGP69ChQz7fdqSyceNGPc/nzp3z+DfFihXT+mayevVqyZIlixw5csRPpQwtChUqJF999ZXaleKJBAoKKD9z6/Z/YzVviT3j8D2lmTNnjmzatElWrVol06ZNk6pVq8qkSZOkXLlymrnXW2EzZsyYFBFQKbGfpMiYMaPaENPSpUulTp06mqivZ8+elreFbSDZX7AIKOTQQZPIE088IUWLFvXptiNdQKHuWhFQzjRt2lRq165t87pEKvY2bNasmb68UDyRQEEB5UdW7Dwmzaast31/ZM5WaTBpjc4PBBUrVpQ777xT7rrrLuncubO88cYb8vvvv0vmzJmlU6dOcuLEiYCUK5RAgj7YEFOrVq3ko48+Unt+9tlnlr0D2AbepIOF7777TrZt2yYDBgyQSAPensaNG0sw069fP/nkk0/kn3/+kUiNecLL3p49ewJdFEIUCig/AZHUZ942OXHeMa3B8firOj9QIsqZIkWKyOuvvy4XLlyQ9957z2HZL7/8Ivfee6/kypVLm/2qVaumQsEEHpAuXbroZzQHmk1b9p4ReLbw9pwtWzbJlCmT1K9fX5sjnPnzzz/lwQcflHz58mkTEsr18MMPy7Vr1yzvB4KwUaNGLvfzzTffqOcN+yhevLi89tprybYhhBAwm70OHz4sPXr0kOjoaN0Pbvqw8e3btxNtwjObWteuXSt9+vSRPHnySO7cuVXcHj161KF5Z9euXbJ+/XqbLTAPYB/jxo3TpkV4y3LkyCGVK1eWqVOnJnkcOP+1atXS39qDbbdt21aWLVumdQDbxTHhu1lufIfd4SVBvXEmqboETp48KX379pXy5ctrcxXshyE50KxoD7yQOGacuylTpuh5xPp169aVn3/+WVKSpOyN8/v888/rZ5TTPF/r1q3TeTdu3JAhQ4ZokzqujwYNGsiWLVtc7qtdu3Z6nLNmzZJIDRg/fvy4Nt0REgxQQPkBNNON+Xq3uGqsM+dheSCb8+xp3bq1pEmTRjZs2GCbh4c4xA5c5jNmzJAvv/xShQdyrJjCpU2bNjJhwgT9jCZBs2kL88G8efOkRYsWKmrmzp2rD0w8QFu2bOkgbn777Td9cOPhh+awb7/9VmOzIJ6uX79ueT8LFy6UnDlzyj333OOwH3xu3769ZM2aVT799FN59dVXtUxo2kwO+/fv1/958+ZVEVCvXj1ZuXKlxmbgZo+mhueee0769+/v0fbQrJcuXTqZP3++TJ48WR+2EGQmX3zxhZQoUUJFiGkLzANYHw9tiFGIRdji8ccfT7L5CHZes2aNWy8MztHw4cNl6NChsmTJEsmePbsKOzShvP/++3p+4B2Jj49XsXXlyhVLdQmcOXNG/2ObKDvOC44TZTIFhz2oC2iOxsMV+7506ZLWZZQhKZCt2n5C8yUmV/MTAyIOzXPu7I1zaXr0YDfzfFWvXl3nobkU28DLAuwCzzDsevbs2QT7Sp8+vdYt7CdSe9thYGAITkKCAiMCiI+Px11Q/7viypUrxu7du/W/L9i4/5RRdOiyJCeslxi3b982rl+/rv+Tw5w5c/T4t27d6nadfPnyGeXKlbN9L1u2rFGtWjXjxo0bDuu1bdvWyJ8/v3Hr1i39vmjRIt322rVrHda7dOmSkStXLqNdu3YO8/G7KlWqGLVr17bNu/vuu40cOXIYcXFxbstnZT+w19WrVxPsp06dOkaBAgUczvP58+f1955cCj179jQyZ86sNsF08uRJY+rUqUaqVKmMWrVq6TrDhg3TbW3evNnht3369NH19u7da5uH9UaNGpXgPPXt29fht5MnT9b5x44ds82rUKGC0ahRowRlxPmpWrWqYZWff/5Z97FgwYIEy4oWLWpkzJjR+Pfff23zduzYoeujLuAcmCxdulTnf/XVV5brkjM3b97U3zRt2tTo2LGjbX5sbKzuo1KlSrqOyZYtW9wegz3m7z2ZnOubPahnrVu3TtLer776qm4L+7Vnz549Ov+ZZ55xmP/JJ5/ofNQ3Z0aMGGGkTp3auHjxotv9+fp+5mtwvlGX3Z13e9544w3buRg5cmSy74WhihWbEe/slpROcAU9UH4g7sJVn66XEti/acOjgia17t2763f7N3K84R87dkz27t2bZOAsPAoIrrb/PZo84BnaunWregwuX76sTVFdu3ZVD45VEtsPPF3mfjDhM97u0YRkAm8UmkY8BduBdwgTyjto0CCNhTI9QPDioAkKTVnOMTawMZYnBZq67EGTEPCkZxz2C28RmsIQ03T+/HmPjstsIkSzmSvgMSpYsKDtO5rsALxDaHpynm+W1WpdgocK3hmco7Rp06qd4Tl0FfcCDyQ8p1btVKBAAa0L9hO8Ztiv8/waNWokui14Tr2xt+mZA6ZtTHAt4NhdgfODuo2mrEjzPME7zYBxEkwwKZEfiM4a5dP1/A1EwenTp6VSpUr63QwmR7MTJlecOnUq0W2a27jvvvvcrgPhg6DsW7dueR1M7el+cOPFgwexJs64mucOxLmYTZ2Ib0JvNTQdmsCOZjyS80PbXJ4UiHuyB/sB9s1i7kAzG2KR0KwJMQKB0bBhQ+1tWbNmTbe/M7dtLy7tQdOrc3NSYvPNtA5W6hLimZ599lnp3bu3Nn8iBgzlf/HFF10KKG/thDI62wLbQhxgYjZyBZo0IcLRhGjF3vZ1wbn+QTw5H5uJeX48qQuhDGLD0MwOKJ5IsEIB5QdqF88l+bNHacC4qwgK3AZiskfpesEAYiogYsz4Fzy4zIcxPDaucA40dsbcxttvv20LsnYGAePYLx46SIznDa72A0+PuV3cdLEf3JDx2dWbu5W3eQi+xB6MePDBq+LOw2OW11/g4Tt48GCdEIeD4Hp0fYc3Dr237L1F9pjlMuOQfIWVugTRhzo4ffp0h+UQNsGKaW8IPyv2BqZIQv2z9+7BO+dOaJvnx9/1KNDA8wiPHkTUk08+SfFEghIKKD+QJnUqGdWuvPa2w2VvL6LM2wCWY71Agx5j8AwgKPipp56yPdBKlSqlTRNm8LY73L31I2gYPZKQvymp4Gn0mFu0aJGMHz/e7YPByn7MYGA83MwbL7wOaN5CIC+Cx803eTycv/76a/EV6AmIAHikAzADhQHSHaAs6EXoC2CPpLwQsAs8c0ivgKZG9F5D86IrzKa3AwcOiC+xUpfM5KT2IM0Ggq4LFy4s/sQXObXc2dtd3TVfWOC9sm8qRMcG1F9X/P333yq88FIQjmzfvl07RwD7exIhwQgFlJ+4p2J+md6juoz6apdDKgN4niCesDyl2blzpy3+BNnH0T0cPZ3gqUEMj30MErq0I7YHb9KI38EbMt5+0ZQCcQDBY+aWAjNnztSmDAgTdNfGTR5eIcQm4Xd4sCB+A73U8DDFf9PTgKYbdN9GUsphw4bJHXfcoU0/6MGGcmC7VvaD48BbPY4XzUPmftAshPir5s2bq8cAXio0taDJy1eeF8RsQCwhPgfNDmjig4cPiS+RmqB0ad8MGo3mVrydo9cXeqrBHpiHeC7YCl4y2AHxQIglQTkgZNyBJlRsZ/PmzeJrPK1LiEPCOUIvPIhqxEbBhjjP7gSFN6B3Jx7UngABZN9E60yHDh3U7oiFcmdvs2kcqQ1QT+FdgbCEaEXvSqyPeeitiTqLXnnu9omeqrBNOHpkYB8ITxw/rk9Cgh4jAkjpXnj2nL9y3dbrbu2fJ4ybtzzvReLrXnjmlD59eiM6Olp7cU2YMMFt77fffvvN6Nq1q66bLl06IyYmRnvMzZgxw2G9N9980yhevLiRJk0a3T72Z7J+/XqjTZs22tMN2yhYsKB+R686e2D/Ll26GLlz59byFSlSxHjkkUe0N50v94PeYZUrV7bt45VXXtGecFZ64SXFoUOHjG7duumxoCxlypTRnljOPUHc9cJz7i2JnmDOPcIOHjxotGjRwsiaNasuQ0858Prrrxv16tUz8uTJYzvGxx9/XNdPDNSxF154wciZM6eDzQG2DVs6g/3269fPZQ83HK/VunTt2jXjueee03MXFRVlVK9eXXv1we7m8SW2D1c29XcvPPSQ9MTew4cP1x6g6EFnv10c87PPPqt2wTHfeeedxqZNm/R4nXvh7d+/X3+7ePHiRI8vFHvh4do2bY6ehsQR9sILzl54qfBHwhz0jIE7GPlhXL3ZIeA1NjZW33TdBdF6CwYTLv/Sd/p599iWlgYTdtUURZKGdvPOZmjOhYcMHjTkaCLBVc8QTI9zg2ZWd730/H0/8wXozAEPODzSiCk0PU+AAwN7ZjPie7slpRNcERRnAjEDcGWjOQZBl+gy/euvvzrcqJAcED2Z0AsKsQPIxBxsxJ2/KjuPxDtMu4/+160Zn52XY8LvCAk0uL4GDhyosWjOWdNJYEGAOhKHIo4sMfEUalA8kVAm4FciMu4iEBjBtchADaWINywEZJoguzLiZBDoiTdkDJ2AOBbESCAeJlj4ZPNhmbr6L7fL75uxyeX8gU1LyTPNfRMbQ0hyQJdxxIThpcbfgdvEc+BRQk/Gbt26Sbjw1ltv2fI8UTyRUCTgAgpBvLhR2w+nYZ9HB94nBFniAjO7QWO4DvRCwVAXwdRLo3udItK8vPXeMdFZHXseERIo8EKCIG4SXKBnmtk7LVzA8EGA4omEKgEXUOhphd45GCwWGanRQwdZfTFGlPnmhR5VGOvMBN2C0RMFWaiDSUBFZ4vSiRBCSOIgfQoGgEYPXIonEooEXEAhrwm6mSMZHRLQYSTyp59+WkUSBtg0kxw65z3Bd3dDNqCbMiYTc3gFxHW4iu3APHMw0WCLqTfLE2zlCnZoN+vQZuFhM/M+5u5+F0gWLFigqUTM8iF8Ixjvu8GG+YwKtvMZTnbzxrYBF1AoNHLWmEn24KZGgDhEFQSUifMbCozi7q0FiQwxQrozyD1kDjFhD7JUoxxmjqRgwcyoDfiG5jm0m3Vos/CxmXk/QzZz5JcKFpDDDc3DSDA7e/ZstR97lHkGzid6h9Fm/rObNyMeBFxA5c+fP0F2ZCSYW7x4scM4UfBEYV0TdE10l40XwZbwaNl7oBBnhUR3rron4iZ48eJF9VplyZJFgo1gugmGErSbdWiz0LcZYovwsMC9036w5UD3tjNj6+CBQmchdsm3JgQg0vEMo838YzdvUn4EXEDBhWs/GjvYt2+fZvIFyGWCG8GqVatsQZS4QSBeCgHorkDzn/OQEAAGdGVEzEOvP3ioIKIgsoIhh5CZZwYCL9BlCSVoN+vQZqFvM5Tn8uXLeh/LmTNn0Ag7dAIyX2jRyxMpaVBGd/dj4hrUMdrMf3bzxq4BF1DoxlqvXj1twuvatavGQMHVi8k8eOQJwXIMjYAJn5EvypddeiHSkGMKni0zZirQmG23OLHBcIMOFWg369Bm4WMzvAyanvtgEE9mqgKIJwzNw3gnEi4EXEBhDCmMw4ZmN3PcK1x03bt3t60zZMgQHYgTvfOQNwpjpq1cudKnOaBwA8SNB5lI8UYZDLFQZhwDEozyrcNzaDfr0GbhYTN4nYKl2Q5jIDqLJ9xnKaBIuMChXIIYpu/3DtrNOrSZdWizxNm9e7cmSH7yySdt4gnQbtahzYJzKJeAe6AIIYSEH+gc9Mcff2gAbzA1cRLiKyhlCSGE+IS3335b1qxZY/uON3+KJxKu0ANFCCHEZwHj6IwDz1PJkiUDXSRC/Ao9UIQQQnzW2w4pC0qUKBHoIhHidyigCCGE+EQ8cWBgEklQQBFCCPEKiicSyVBAEUIIscyyZcsonkhEwyByQgghlmnZsqV07txZypYtS/FEIhIKKEIIIR6D3MsQS8h6vnDhwqAbyoaQlIJNeIQQQjyOeerdu7dmeAYYNobiiUQq9EARQgixFDDeunVrad++faCLREhAoQeKEEKIx+IJAwPfe++9gS4SIQGHAooQQojH4sl+YGBCIhkKKEIIIS6heCLEPRRQhBBCEnDgwAF5/vnn9TPFEyEJYRA5IYSQBGAw4E8//VR+//13GT16NMUTIU5QQBFCCLFx6dIlyZw5s35GokxMhJCEsAmPEEKIMnXqVKlUqZIcOnQo0EUhJOihgCKEEKLiadCgQRIbGyuLFy8OdHEICXoooAghJMIxxZM5MLDZ844Q4h4KKEIIiWCcxRMHBibEMyigCCEkQqF4IsR7KKAIISQCuXr1qsyaNUs/UzwRYh2mMSCEkAgkKipK1qxZIwsXLpT+/ftTPBESCA8U3mT+/PNPuXXrli82RwghxE/s3r3b9jk6OloGDBhA8URISgiot99+W129Jr/++qsULlxYKlSoIKVLl5Z//vnHm3IQQghJgbHtKlasKHPmzAl0UQiJPAH1/vvvS44cOWzfhw4dKrly5ZI33nhDDMOQcePG+bqMhBBCfDQwMO7Tf//9d6CLQ0jkxUAdPnxYypYtq58vXLggGzZs0PGSOnXqJDlz5pSXXnrJH+UkxDK3bhuyOfa0xF24KtFZo6R28VySJnWqiDjuLbFn3B638/IaRXPKLwdPy/5/z8gdF9NIzWK55ddDZz3+vf1yq/v2pGz2ZbH/nidzBpFUIqcuXvP7vlzt2zBuy99HvbOZlX0lddye/Hb467NkxtwvJEPhSjKox73S+pGB8uWOIymyb+fvidU1X+/LVzaOlHsH8bOAunbtmqRLl04/b9q0SW7fvi3NmjXT78WKFZPjx49b2h4GqRwzZozDvHz58tm2g7clLJ85c6acPXtW6tSpI9OmTdMmQ0LcsXb/WZn6wS45fv6qbV7+7FEyql15uadifglXVuw8JmO+3i3H4l0ft6vleC7cNsxvsU7fk/69uRxY3be1siX8bo+/9+V+39ZtZnVfiR13UuumEkMMKSR57x2i3z8zRD6dtTlF9p3499gU3FfyjjMS7h3EOqkMKBQLwPvUvXt3efHFF6Vfv36yefNm+eWXX3TZkiVLpE+fPnLixAlLAurzzz+X77//3jYvTZo0kjdvXv08adIkGT9+vHz44YcaY4UmQni99u7dK1mzZvVoH+fPn5fs2bNLfHy8ZMuWTUIFiNO4uDgN9EydmhknPGX570el7/ztCeab74/Te1QPyxshHtR95m0Tw81xP9mwuMzcEJtgeVIk9XssN5Lx2+SULVD7Sm5ZUhLc4hkknjwCfe/gs8D/dvNGJ1g+Ez169JCxY8dKjRo15L333tPvJhBSEDlWSZs2rcTExNgmUzzhwke7PXKUoIkQwY9z586Vy5cvy/z58y3vh4Q/aCoZu2yPy2XmQwzeAKwXTuB4cFyujsr4/2nWD949yJP6vZHM3yanbIHaV3LLkpJQPCWfcL53kBRswoOYgeDZuHGjdOzYUZ5++mnbsp07d6rQscpff/0lBQoUkAwZMmgT3YQJE6REiRI6qCWa8lq0aGFbF+s0atRI9//UU0+5bWbEZK8sTTWKKVRAWSEiQ6nMgWL30Xj5K+6i7I+76NBs5wxufWhKmbLyT7kjOouUis4i5Qtkl3A4bvsmIlck976fnN8n9VtfPpNScl9JwWdt+BDIewefBf63mze2tdyE52u+/fZb9SjBc4WmPzTRIafUrl27tJmufv36cuTIERVYJk8++aQcOnRIvvvuO4/jqsC+ffs8bvYLBnBC4U6EW5Fu28Tps2ivbD9y0fLvqhXMItO7lJFIO25CSPJIyXsHnwX+txs6xUGHWGnCsyyg4Bn64osvpEqVKgmWwQN17733JquL7KVLl6RkyZIyZMgQufPOO1VAHT16VPLn/6/d+YknntB8UytWrPDYA4VcVQhCD7UYqJMnT2qTJi8azz0x09YlXf/6NS4Rdh4oT46bEJI8AnHv4LPA/3aDTkAmASsCynIT3sGDBx3EiXNGcniGkkPmzJmlUqVK2qzXoUMHnYdmPHsBhaAw9NRzB5r5MDkDA4Za5UP8QiiWO6WpWCinTohPWLztqNtmPESDxGSPksEtyoZFt2T7416y/agcj7/qNuYGh4vXJW9dzsn5fVK/TW7ZArWv5JaFhA6BvnfwWeBfu3lj19S+DEqE5ym5TWQQZ3v27FHBVLx4cQ0qX7VqlW359evXZf369VKvXr1k7YeEJ7ixvdS2nH52rqXmd3RHDgfxZA+Ox0wl4Oq4MT1xV3GXy5Miqd/bf7e67+SWLVD7Sm5Z/Avlmq8J53sH8R6PPFDo+YbJBKkKnF1cV65ckd9++00DvK3w3HPPSbt27aRIkSLqWUIMFFxpPXv2VKE2aNAgDSovVaqUTvicKVMm6datm6X9kMjhnooxMrFtCZm6wdETFRPmuVxwXOhm7ZxzyP64qxXJaTknUVK/N5cDq/tObtns8fe+rOQo8vW+Etv3//I8/fdQT50qVYrlR0rJXEyBzAMV7vcO4h0exUBNnz5d3n33XdtAlPAMZcyY0WEdNJmh6Q3B2xBDnvLAAw9oXqdTp05pOyXinjDWXvny5R0SaSJlgn0iTaQ08BTmgYosTLvlzpNXfjl0jpnIPc5EflLuKJSXmcgtZSI/5ZXNfJUle+PqFTJ5SG/JULCcdO7xqPR//CGpUTRXimXo9j4Tueu6xkzkruGzIDjzQFkOIod4Wrp0qcsg8mCFAiqyoN2sQ5uFps22bNkizZs3lwEDBuiLZyjkfAoGu4UatFlwCijLQeTIzUQIISTw1K5dW3s/FypUKCTEEyHhhGUBZQJVhx53iH1ypmHDhsktFyGEEBcgnKJWrVo6AaRoIYSEgIA6duyYPPTQQ7J27Vq3Yy7dunXLV+UjhBDy/2Boq2eeeUabGkzPEyEkRARU//79Zfv27TrIb+XKlV3mWyKEEOIf8QQQ81SwYMFAF4mQiMaygEIOptdee00effRR/5SIEEJCnKR6ACZHPI0cOVIHdGfMEyEhJqBw0bLNnRBCXLNi57EEeZ/yJyOPEMUTIcGJ5f6QXbp0kWXLlvmnNIQQEuLiqc+8bQ7iCWCIHczHcissXryY4omQcPFAde3aVQfzRX4FZBDPnTt3gnWqV6/uq/IRQkjINNvB8+QqsR7mQfZgefPyMR4357Vu3VqaNWumCYYpnggJcQF199136/933nlHM4Lbw154hJBIY/fReNl/8rL8FXchgefJWURh+ZRVe6VUdFYpnS+LlC+QPdFtY8SH5cuXS9q0aSmeCAl1ATVnzhz/lIQQQkKQscv2yJaDZz1ef9raA/q/TvFcsvCpugmWT506VU6cOCHjx49X0ZQuXTqflpcQEiABhUF+CSGE/I+X2pazeaBMcZQY/ZqUtHmgXIknDKAOmjRposO0EELCLBM5IYQQ0Wa4ioVyagzUkm1HNGDcVRwUGuBiskfJ4OZlXMZA2YunESNGaOwTISTEBRSCF3v16iUFChTQz4kBl/OLL77oq/IRQkhIAFGEVAXobQd5ZC+iTLmE5Z6Ip1AZGJiQSMYjATV69Gi55557VEDhc2JQQBFCIhXkeZreo3qCPFAxieSBongiJIwFFFIWuPpMCCHEEYgkpCrwJBP57t27bXmeKJ4ICS0YA0UIIT4GYqluyYQ58pwpX768vP/++xIbG8s8T4REioDav3+/rFmzRk6fPi158uTRHiN33HGHb0tHCCFhyNWrVyUqKko/P/bYY4EuDiEkJQQUkmViJPAZM2Y4NOelTp1a+vbtK2+99ZY35SCEkIgAY9vNnj1bVq9eLdHR0YEuDiEkpcbCe+ONN+Tdd9+Vp556SjZv3iz//POP/u/du7fOx3JCCCHuBwbeuXOnLFy4MNDFIYSkpAcK7fXwQKHniEnBggWlVq1akiZNGpk1a5YtKJIQQoijeDIDxvv37x/oIhFCUtID9ffff0vbtm1dLsN8LCeEEOJePLG3HSERKKCyZ88uhw4dcrkM87Nly+aLchFCSFhA8URIeGJZQGFsppEjR8qvv/7qMH/Hjh0yatQoadmypS/LRwghIcvFixdt4Q4UT4REeAzUxIkTZd26dVK7dm3NYZI/f345duyYJoRDpnIsJ4QQIpIlSxZZu3atLF68WAYPHkzxREgke6AKFy6s3qYhQ4ZI5syZNQEc/g8bNky2b98uhQoV8k9JCSEkRLCPBS1WrJg8++yzFE+ERLIHCp4mxDnlzZuXniZCCHET84QXTKQp6NixY6CLQwgJpAfq2rVr8uCDD6p3qX79+lK6dGmpW7euCipCCCGOAeM3btxQTz0hJMIFFLxNeJtq0KCBPPfcc9K+fXvZsmWLJtMkhBCSsLfd6NGjA10kQkigBdSnn34qDz/8sKxfv14mTZokS5Ys0Yzjy5cv114mvgJCDXECgwYNchg6BjciBKhnzJhRGjduLLt27fLZPgkhJLkwVQEhkYdHAurgwYPahGdP9+7ddSw8dzmhrLJ161aZOXOmVK5c2WH+5MmTZcqUKfLOO+/oOjExMZpK4cKFCz7ZLyGEJAekKaB4IiTy8EhAXb9+XXLmzOkwL0eOHLb4qOQCLxYEGYaBsd8PvE94s8NNqVOnTlKxYkWZO3euXL58WebPn5/s/RJCSHLAPQopXADFEyGRhce98NzdFHxxs+jXr5+0adNGmjVrJuPGjbPNR4qE48ePS4sWLWzzMmTIII0aNZKNGze6jcGCqLMXdufPn9f/8JhhChVQVtygQ6nMwQDtZh3azDqmraZNmyatWrXS2FDYEBNxD+uadWgz/9vNG9t6LKCaNGkiqVMndFjdddddDvMhqOLj4z0uAOKrtm3bps1zzkA8gXz58jnMx/fEmg4RSzVmzJgE80+ePClXr16VUAEnFLZEBXBle+Ia2s06tJk1vv/+e733wRsOm9WrV0/vLyRpWNesQ5v5327ehAV5JKB69uwp/uCff/6RgQMHysqVKyUqKsrtes5eLhgjMc/X8OHDNeuvvQcKCUCRvyqUxurDycdxoty8aDyHdrMObWYt5gn3l/vuu08700RHR9NmFmBdsw5t5n+7JaZBkiWg5syZI/4A4+nFxcVJjRo1bPNu3bolGzZs0KDxvXv32jxRGDLGBL9x9krZg2Y+TM7AgKFW+XDyQ7HcgYZ2sw5tljSIyTRfzsqUKSNp0qShzbyAdc06tJl/7eaNXQN6Jpo2bSp//PGHJpwzp5o1a2pAOT6XKFFCe92tWrXKIaAd6RTgMieEkECkKsCA6ggTYMA4IZGL5cGEfUnWrFm1Z509GFcvd+7ctvnICTVhwgQpVaqUTvicKVMm6datW4BKTQiJdPE0duxYBosTEuEEVEB5AsaUunLlivTt21fOnj0rderU0ZgpiC9CCPE3b7/9dgLxBM8TBRQhkU3QCah169Y5fMeNCpnIOSwCISQQlC9fXgNMMYyVKZ4IISToBBQhhAQTiNXcuXOnxmRSPBFCTBjOTwghTrz33nuyZ88e2/eSJUtSPBFCHKCAIoQQpzxPvXv31uTBSJlCCCFeN+EhP4KVty/kciKEkFAUT+j5C3r16qUJ+AghxGsB9dJLLzkIKCTWxADA7dq10zxNx44dk2XLlmkKgscee8yTTRJCSNCKJw4MTAjxiYCy7wH3+uuvq2jCWFBZsmRxGEcGgwEjRxMhhIQSFE+EEL/HQL377ruam8lePAHkZcJ8LCeEkFBhwYIFFE+EEP+nMThy5IikTev6Z5iPcesIISRUaN26tSbohQed4okQ4jcBVa5cOZkyZYq0atVK0qVL5zBGHZr3ypYta3WThBASMLJnz64JfDEAOcUTIcRvAmrcuHHSoUMHTSrXqVMnjYeC12nJkiX6f+nSpVY3SQghKT62HXoLP/vss/odmcYJIcSvAqpNmzayYsUKjRWYNm2a3L59W9/aateurb3z4AYnhJBQGBgYTXcNGjQIdJEIIZEylAuGNsB0+fJlHeA3Z86c7H1HCAkp8YSXwPr16we6SISQSMxEbsYLpE+f3lflIYSQFBFPDBgnhKS4gFq7dq3UrVtXUxcULVpUfv/9d53fr18/jYUihJBgguKJEBJwAbVmzRpp0aKFXL16VZ577jmNgTLJkyePfPjhh74uIyGEeM2vv/5K8UQICXwMFIZ1Qd6UL7/8Um7evCmTJ0+2LatSpYoGkhNCSLBQo0YNvU/Fx8dTPBFCAiegtm/fLosWLdLPzjciDLzJ0csJIcHAjRs3bLnqnn/++UAXhxAS6U14yDaOG5MrIJ4QF0UIIYGOeWrYsKF6nQghJCgEVK1ateTjjz92uezzzz/X4HJCCAl0wPjPP/8sCxcuDHRxCCFhiuUmvGHDhknLli2lY8eO8vDDD2sz3ubNm+WDDz5QAYUeeoQQEujediNHjpQnnngi0EUihIQplgUUMo3PnTtXRy9HILmZviBHjhzaA49ZfQkhwSCexo4dy4BxQkhwZSLv0aOHdO7cWTZu3CgnTpzQ9AXI6Js5c2bfl5AQQpKA4okQEvQC6qOPPtLx8HLnzq3Dudhz5swZWbZsmTbtEUJISoDhpF555RX9TPFECAnaIPJHH31UDhw44HJZbGysLieEkJQCY3EiwS9EFMUTISRoPVCGYbhdhuzkadKkSW6ZCCEkSf79918pVKiQfi5fvrxOhBASVALq8OHDcvDgQYdkmhBL9ly5ckVmzpwpRYoU8X0pCSHEKebphRdekK+//jpBKAEhhASNgMLwLGPGjFHXOKa+ffu69UxNnTrV96UkhBAXAeM//fQTBRQhJHgFVNeuXaVixYoqkvB5woQJUqpUKYd1MmTIoOsUK1bMUgGmT5+uk+nhqlChgo6316pVK/2OfUK8wbuFYNE6derItGnTdD1CSGT3tnvxxRcDXSRCSITikYAqV66cTqY3qm3bttoLzxcghgHBn3fccYd+R46p9u3bazMhRBIGAZ0yZYrmmCpdurSMGzdOmjdvLnv37uWwMYREEExVQAgJ6V543bp1k6ioKJfLLl265HacPHe0a9dOWrdureII0/jx4yVLliw6DAO8T7hpjhgxQjp16qQeLgisy5cvy/z5860WnRASolA8EUJCXkBhaIRevXq5XPbkk09Knz59vC7MrVu35NNPP1UhhjH1kBbh+PHj0qJFC4emwkaNGmkST0JI+IMXKcQ6AYonQkjIpjHAWHdm0jpX3qThw4dbLsQff/yhggk9++B9+uKLL7RLsimS8uXL57A+vh86dMjt9q5du6aTyfnz5/X/7du3dQoVUFY8PEKpzMEA7RZ+Nps3b56Ov3n//fdrORNLp5JSBLvNghXazTq0mf/t5o1tLQsoDN2SP39+l8tiYmLUY2SVMmXKyI4dO+TcuXOyePFi6dmzp6xfv9623PltEwZJ7A104sSJGnjuzMmTJxOkXwhmcELj4+P1eFOntuwsjFhot/Cw2Q8//KBDRJnlufvuu/UaDhaC0WahAO1mHdrM/3a7cOGC/wUUBg3ev3+/NG7cOMEyzPcmsDt9+vS2IPKaNWvK1q1bNR3C0KFDdR5Emb1oi4uLS+CVsgdesMGDBzt4oAoXLix58+aVbNmySSidfAhFlJsXjefQbqFvM1z/uIYRMoBeusHYZBdsNgsVaDfr0Gb+t5u72G6fCqgmTZqohwdB3bly5XIYBw9Ne3hLTC5Qi2iCK168uHq1Vq1aJdWqVdNl169fV+/UpEmT3P4ecVKYnIEBQ63y4eSHYrkDDe0WujZDwLj5AhQdHa3lCUYBFUw2CzVoN+vQZv61mzd2tSygRo8eLbVq1dI8UIhHKFiwoA6psGjRIu2B56rpLDGQTRg5n+AhggsNQeTr1q2TFStW6IEPGjTIlncKEz5nypRJewMSQsK3tx1637788stBK54IIZFNWm/ilRCbgDfEWbNmac85jH+HnnHI14TlVmOqHnroITl27Jhkz55dKleurOIJuZ7AkCFDdJgYZD83E2muXLmSOaAICTMongghoUQqIxndWSBsIGrQlOdN+2FKgRgoiDMEk4VaDBTivcxmDOIZtFvo2QwxT/A2h5J4CrTNQhXazTq0mf/t5o1OsOyBcgb6K23aZG+GEBKB3LptyJbYMxKXsYhkKlZVBnZr47V4sm3rwlWJzholtYvnkjSpg1uEEUJCF6+UD3JBIXYJveXAli1bpHr16tKvXz8d2BMB5oQQkhgrdh6TMV/vlmPxSC2SXvLeP07WZImS73Ydl3sq5k/Gtv5H/uxRMqpdecvbIoQQT7DsC1yzZo1mBkc+peeee84h+VSePHl0zDpCCElK8PSe96uD4AEn4q9Kn3nbdLmVbeE3zts67sW2CCHEbwLqpZde0rHrMNgvBva1p0qVKpoQkxBCEmtqe27+ZnEVfWnOgjcJ63myLazrak2r2yKEEL824UE4IWUBcI5TQLIqBGwRQogzu4/Gy74TF+Wj+QvlYpoy4i7MCVIH3qQpq/ZKqeisUjpfFilfILvLbf0VdyGB58nqtgghJEUEFALGke/JFRBPTC9ACHEFPEGrPpsj147tlbz3Dkly/WlrD+j/OsVzycKn6ibY1ubYMx7vO7FtEUJIiggoJNH8+OOPpX379gmWff755zooMCGEOFP8+Do5u2aWZChcyaP1+zUpafMaOYPgcNMDZYojb7dFCCEpIqCGDRsmLVu21JHRH374YW3G27x5s3zwwQcqoNBDjxBC7Pnoo49k0ugX9PPgh+7V3nYIGHcVmYSWvZjsUTK4eRm3aQjQDIcJsU1Lth3RgHFvt0UIISkSRN6sWTOZO3euZiPv3Lmz5oFC+oL58+drD7wGDRp4VRBCSPhyzz33SPny5TVJ5vhxL8voduV1vrOkSWXnYfJE8GCdUT7aFiGE+D0PVI8ePVQ8bdy4UYdiQfqC+vXrS+bMmb3ZHCEkzEEmYHiqcY+A1xq5mab3qJ4gd1OMF7mbfLktQgjxm4CCK75NmzaSO3duTZppz5kzZ2TZsmXatEcIiWwwth2GRHjsscf0e5YsjvFHEDbNy8f4JHu4L7dFCCF+EVCPPvqobNq0SQWUM7GxsbqcAoqQyMYcGBjepqpVq+pIBa6AwKlbMuG9xBt8uS1CCPF5DFRiYw8jO3maNGmsbpIQEobiCSDmqVq1aoEuEiGEBMYDdfjwYTl48KBDMk2IJXuuXLkiM2fOlCJFivi+lISQkBNPI0eOlLFjx3o1MDAhhISFgJozZ46MGTNGb4SY+vbt69YzNXXqVN+XkhAS9FA8EUIiCY8EVNeuXaVixYoqkvB5woQJUqpUKYd1MmTIoOsUK1bMX2UlhAQpP/74I8UTISSi8EhAlStXTifTG9W2bVuXQeSEkMgEaUyGDh0q6dKlC1rxhKSb7KVHCAlYL7yePXvaPu/du1dOnTqlvWyYA4qQyOPWrVvacQSCaeLEiTovGMXTip3HEuSJys88UYSQlOyFZ+aCKlSokGYWbtiwoQopgOa9WbNmJac8hJAQinlq3bq1diABZoxkMIqnPvO2OYgngOFfMB/LCSHE7wJq0aJF8sgjj2hel3feecchrQHmffbZZ5YLQQgJzYDxlStXBvU1j2Y7eJ5cJV8x52E51iOEEL8KKLjpkSzzq6++kieffNJhGeKkdu/ebXWThJAQ7m0XjIlzdx+Nl6Xbj8iUVXsTeJ7sgWzCcqyH9fE7QgjxSwzUnj17ZNKkSS6X5cqVS06fPm11k4SQECFUUhXAq7Q59ozH609be0D/1ymeSxY+VdePJSOERKyAypQpk8THu35LO3LkiOTMmdMX5SKEBBmhIp4AgsP3nbgof8VdsImjxOjXpKSUis4qpfM5jtdHCCE+E1DorozYp86dOydY9uGHH0rjxo2tbpIQEuTExcXJ6NGjQ0I8gfIFsuuE2KYl245owLirKCccQUz2KBncvAxTGhBC/CugXnrpJWnQoIHUrl1bunXrpjfRJUuWyKhRo2TDhg2yZcsWq5skhAQ50dHRGjC+atUqeeGFF4JaPNkDUQRvFHrbocT2Iso8AiyneCKE+D2IvGbNmvLtt9/KxYsX5dlnn9VeeMhMvm/fPlm+fLlmIyeEhAcnT560fcZLEwYHDhXxZII8T9N7VFdPkz34jvnMA0UISREPFGjSpIkGkx84cEBOnDghefLkkdKlS3tVAEJI8MY8YQxMeJ5q1aoloQxEUvPyMcxETggJrIAyKVmypE6EkPANGA8HAQUgluqW5BBUhJAANOHBnT9u3Dhp0aKFNtVhwmfkhvI2fQF+i5tz1qxZNc6iQ4cOtszmJmgmRABrgQIFJGPGjBqovmvXLq/2RwjxXDyhyQ4xT4QQQrwUUKtXr5ZSpUppEPnatWtVMGEcPHzGTRZNeAgit8r69eulX79+8vPPP2uA6s2bN1WUXbp0ybbO5MmTZcqUKdr7b+vWrRITEyPNmzeXCxcuWN4fIcQ9U6dOdRBPL7/8csjFPBFCSIpgeEBcXJyRO3duo0iRIsaiRYuMS5cu2Zbh88KFC43ChQsbefPmNU6dOuXJJhPdF4q1fv16/X779m0jJibGeOWVV2zrXL161ciePbsxY8YMj7YZHx+v28T/UOLWrVvGsWPH9D/xHNrNOrDVmDFj9DrBNGLECL32iHtYz7yDdrMObeZ/u3mjEzzyQM2ePVtHXf/pp5/kvvvu02SaJviMQYR//PFHuXHjhq6bHMwknchqDmJjY+X48ePqlTLJkCGDNGrUSDZu3JisfRFC/geub3iZfe15Qh6mTQdOy5c7juh/jjlHCImoIHIEkT722GNSqFAht+sUKVJEx8hbsWKFDBkyxKvCINZp8ODBmmfKTIcA8QTy5cvnsC6+Hzp0yOV2rl27ppPJ+fPn9f/t27d1ChVQVtgklMocDNBu1oFYmjNnjjbJY7Bw2M9+oHBvWLHzuIxdtkeOn/9vLLqYbFHyUttyck/FGAl1WM+8g3azDm3mf7t5Y1uPBBRSFgwYMCDJ9e666y5ZsGCBeEv//v3l999/V2+WM85vwzCKuzdkBKaj+7WrIPirV90PLBps4ITCI4djTZ3acsquiIV285zNmzdrfifYCi8drVq1csj95C1r95+V4cv+TjAfYqrv/O0ysW0JaXJHaA/7xHrmHbSbdWgz/9vNm5hqjwTUuXPntIdcUmAdrOsNEGhfffWVBqLbe7oQMG56ovLnz+8wtISzV8pk+PDh6smy90AVLlxY8ubNK9myZZNQOvkQiSg3LxrPod08DxjHdTJs2DDb0Cy+sBma6aZ+4L6XLF573vrhqNx3Z+mQzsPEeuYdtJt1aDP/2y0qyjHRrs8EFN5M06VLl/TG0qaV69evWyoAlCHE0xdffCHr1q2T4sWLOyzHd4go9NCrVq2azsM+0Htv0qRJLreJGClMzsCAoVb5cPJDsdyBhnZLOlWB+ZKRJk0atVNybbb7aLxtAF/7Zjtn0DB4LP6qvLn6L9sAvhi3LhRhPfMO2s06tJl/7eaNXT1OpIncTBBIifHnn39aLgBSGMyfP1++/PJLzQVlxjxlz55dcz7h4AcNGqTDxSCNAiZ8RvA6xuIjhCQvzxMCxpMb7wTGfL1bNsee8Xj9aWsP6P86xXPJwqfqJnv/hBCSkngsoBBYmhSJxSW5Y/r06fofyTHtQUCruU8EpV+5ckX69u0rZ8+elTp16mhgOwQXISR54gnXrC8EFAblNT1QpjhKjH5NSto8UIQQEpYCCmLGX3hy48YNHpnIMRFCgjNJJprhMCEGasm2I3I8/qo21zmT6v8H8h3cvExIx0ARQiIbjwRUz549/V8SQohfgccWgglDs/gyz5OrAXrhjeozb5uKJXsRZe4RyymeCCERO5gwISR0QC63KlWqSPXq1X0inlbsPKZxTwgIN8mfPUrF0T0V88v0HtUTLI+xW04IIaEMBRQhYczcuXM1t5OZhqRGjRo+2S7EEzxMzk10aLbDfIgniKTm5WNceqgIISTUYX9IQsI4YBwdMe6++265ePGiz7aLZjt4llzFN5nzsBzrQSzVLZlb2lctqP8pnggh4QI9UISEeW+7jh07SubMmZO9Tfs8T/bNcu7yPE1ZtTfk8zwRQog7KKAICWPxNHLkSFuW8eTCPE+EEPIfFFCEhBH+Ek+AeZ4IIeQ/KKAICRNmz57tN/EEmOeJEEL+g0HkhIQJTZs2lWLFivlcPEEwbTpwWr7ccUT/m94o4LwH5nkihEQK9EAREiZAPG3btk1y5MjhM/GUWK4n5nkihEQyFFCEhDBvvfWWFCpUSDp16qTfc+bM6bNte5Lr6cehdzPPEyEkIqGAIiTEA8bTpk0rO3bskAoVKqRYridIJCxHokzkdyKEkEiDAoqQEO9tN2zYMClf/n8xSb7I9bT/5GXmeiKEkCSggCIkxPBnqoKxy/bIloNnPV6fuZ4IIZEKBRQhIYQ/xRN4qW05mweKuZ4IIcQ9FFCEhAjff/+9X8UTQDNcxUI5meuJEEKSgAKKkBABgwI/8cQTki9fvgTiCYLHl73h8FukI0BvO2zFXkQx1xMhhFBAERL0GIahYil16tTy3nvv6Tx78ZRYrqbk5GPCb5nriRBCXEMBRUiQxzxt3LhRPvnkE0mXLl2CJjtPcjUlV0QhVQFzPRFCiCMUUISEQMA4EmU+8MADXudqSm5zHnM9EUKIIxRQhAQBzjFMP335sYx88wPJVK6hPNihjdzXpatDrqY/j12QDX+dZK4mQggJEBRQhAQYVzFMxu0SEtNton7+/rbIXZPX2uKOBn66Q/6Ku+jx9pmriRBCfA8FFCEBxF0Mk6RK7TKm6cmGxS2JJ8BcTYQQ4nsc79KEkBRrsvvpr1MybPEfrvMsOQWLG/8/zfoh1uN9pPr/3ngDm5aWfNmiVHhtOnBa900IISR50ANFSAoza8MBbVY7d+WG5d9a0T5Y9d4q+aXRq2t9nuKAEEIiHXqgCEnhJrvxy//0SjxZJX+2KJm5ITZBoLnZHIiyEEII8Q4KKEJSCDPtgL/pULWAvHZfZblx+7bbFAcAZWFzHiGEeAeb8AjxM56mHfAE52FVnJflzpJeGpbKKwdOXZRTF697nOLgjryZJA/vBoQQEjoeqA0bNki7du2kQIECGji7dOnSBMNYjB49WpdnzJhRGjduLLt27QpYeQmxCtIODF70myzdcTTZ20pMPIGcmdLrvszUBUmB9QYt3CFjl+1JdtkIISSSCPg756VLl6RKlSry6KOPSufOnRMsnzx5skyZMkU+/PBDKV26tIwbN06aN28ue/fulaxZswakzIR4CuKMrKYdSMrT5ApzfLoiuTLJvhMX5a+4Cx6JKDPFATxQItcsl5MQQiKVgAuoVq1a6eQKeJ8wnMWIESN0KAswd+5cHY1+/vz58tRTT6VwaQnxb8xTjozpZFr36lKrWC7ZGntG+s3flmjAubn+nSVy24ZrQbZx7HvJtiMaMO4yTcL/i67Bzcvo727fvi1xcXGWj5EQQiKVgAuoxIiNjZXjx49LixYtbPMyZMggjRo10gFW3Qmoa9eu6WRy/vx5/Y+HBKZQAWWFiAylMgcDgbYbYp72Hr8gP/x1ynLM04SOFSV7VBr55vcjsj/uYpK99bB84/6TEnf+ipSK/m+oFgikF9uUk37ztyfwZpnNfVieSmCn/9mKdc0atJl30G7Woc38bzdvbBvUAgriCcDjZA++Hzp0yO3vJk6cKGPGjEkw/+TJk3L1avKCeFMSnND4+HitAKlTBzxcLWQItN0GzN8lsWes17PiuaKkenRq6bPod9l+xMJQLev+1v/VCmaR6V3K2OZjWxPalpA31v0jcRf/E2LRWdLJoMaFdbnpdQq0zUIR2sw7aDfr0Gb+t9uFCxfCS0C5zcpsGAnm2TN8+HAZPHiwgweqcOHCkjdvXsmWLZuE0snHcaLcvGhCw24rdh63LJ46VMkvd5XKI2Viskp0dHZ5uWMGjZuCB8oUR4nRr3EJuSM6i3qg8Ht77o+OlvvuLC1bD2Kg4msSnTWDNg+azX0mrGvWoc28g3azDm3mf7tFRUWFl4CKiYmxeaLy5/8vazLemp29UvagmQ+TMzBgqFU+nPxQLHck2g1xRy9/43lvNjMO6fX7qzkImoqFcuqkcUzbjyYdx9SibAJBZA9MUO+OvEmXh3XNMrSZd9Bu1qHN/Gs3b+wa1GeiePHiKqJWrVplm3f9+nVZv3691KtXL6BlI8Q+5mnp9iPy+nd7LcU8QRSh55w78YP5WA6c1zC/J/Z7Qggh/iPgHqiLFy/K/v37HQLHd+zYIbly5ZIiRYrIoEGDZMKECVKqVCmd8DlTpkzSrVu3gJabEBP0tNsce8by79DkltR4dFg+vUd13Ye9ODPTFnA8O0IIiVAB9csvv0iTJk1s383YpZ49e2rupyFDhsiVK1ekb9++cvbsWalTp46sXLmSOaBI0NCsXLQlAYWhVpAtvGx+z+owRFLz8jGyJRZxTFclOmuU1C6eMI6JEEJIBAkoZBZHUHhi7ZfIRI6JkGADcUof/HTQWsxT16qWxQ/Wr1syt5elJIQQEnYCipBIGd8OrwmP1S9GzxEhhIQBFFCEeDm+nTdDtHy/J06eaFjSL2UihBCSclBAEZIC49v1aVxCyuTLJqXzZfFbuQghhKQcFFCE+HF8OzPu6bkkcjURQggJLSigCPFTzJMnuZ4IIYSEJhRQhPgx5smTXE+EEEJCDwooQvwQ82Q11xMhhJDQggKKED/EPHmT64kQQkjoQAFFiAsY80QIISQxKKAIcQFjngghhCQGBRQhTjDmiRBCSFJQQBFiF+/084HTMmzxHx7/hjFPhBASmVBAESIiszYckGlrD8i5Kzcs/Y4xT4QQEplQQJGIB01245f/6dVvGfNECCGRCQUUiWispikwYcwTIYRENhRQJCLxNk0ByM+YJ0IIiXgooEhE4m2aAsCYJ0IIIRRQJOLwJk0ByJExnfRrUpIxT4QQQiigSGThTcwThNO07tXlzhK56XkihBCiUECRiCA5MU+vdK4k9e/I47eyEUIICT0ooEhEwKFZCCGE+BIKKBL2cGgWQgghvoYCioQ1VmOeODQLIYQQT6CAImHJvpOXZdPRI7L/5CVLMU8cmoUQQognUECRsOSNdf/I9iOMeSKEEOIfKKBIWPJM48Jy+kY69UBhkOCkYMwTIYQQK1BAkbCkdN5MEh0dLYakkrnr/5SLt9KKpErYLMeYJ0IIId6QWkKEd999V4oXLy5RUVFSo0YN+eGHHwJdJBICvP3WVPl78WSNbfpfhNN/mHKJMU+EEELCUkAtXLhQBg0aJCNGjJDt27fLXXfdJa1atZLDhw8HumgkiJk6dao888wzcmXfJmmcdp/EZM/osByep+k9qjPmiRBCSHg24U2ZMkUef/xx6dWrl35/88035bvvvpPp06fLxIkTA108EoTMnDlTRo0apZ9HjhwpY8c+I7cNkS2xZyTuwlWJzholtYvnoueJEEJIeAqo69evy6+//irDhg1zmN+iRQvZuHFjwMpFgtvz5CiexkqqVKkkTSqRuiVzB7p4hBBCwoCgF1CnTp2SW7duSb58+Rzm4/vx48dd/ubatWs6mZw/f17/3759W6dQAWU1DCOkyhxorl69KrNnz9bPL7zwgowePVptiIm4h3XNOrSZd9Bu1qHN/G83b2wb9ALKBB4Ee2AU53kmaNYbM2ZMgvknT57UB2yogBMaHx+vx5o6dUiEqwUF8+fP17i5vn376jknScO6Zh3azDtoN+vQZv6324ULF8JPQOXJk0fSpEmTwNsUFxeXwCtlMnz4cBk8eLCDB6pw4cKSN29eyZYtm4TSyYdIRLl50VirM/3796fdLMC6Zh3azDtoN+vQZv63G3r4h52ASp8+vaYtWLVqlXTs2NE2H9/bt2/v8jcZMmTQyRkYMNQqH05+KJY70NBu1qHNrEObeQftZh3azL9288auQS+gALxJDz30kNSsWVPq1q2rPayQwqB3796BLhohhBBCIpCQEFD333+/nD59WntTHTt2TCpWrCjLly+XokWLBrpohBBCCIlAQkJAAQQEYyKEEEIICTRsTCWEEEIIsQgFFCGEEEKIRSigCCGEEEIsQgFFCCGEEGIRCihCCCGEEItQQBFCCCGEWIQCihBCCCEkXPNAJQcMJGiOiRdq4/hggEOM0cP0/Z5Du1mHNrMObeYdtJt1aDP/283UB6Ze8ISIEFDmKMsYUJgQQgghxJ1eyJ49u3hCKsOK3AphFXr06FHJmjWrDiwYKkARQ/T9888/ki1btkAXJ2Sg3axDm1mHNvMO2s06tJn/7QYpBPFUoEABj718EeGBgjEKFSokoQpOPC8a69Bu1qHNrEObeQftZh3azL9289TzZMLGVEIIIYQQi1BAEUIIIYRYhAIqiMmQIYOMGjVK/xPPod2sQ5tZhzbzDtrNOrRZcNotIoLICSGEEEJ8CT1QhBBCCCEWoYAihBBCCLEIBRQhhBBCiEUooIKQgwcPyuOPPy7FixeXjBkzSsmSJTUQ7vr16w7rHT58WNq1ayeZM2eWPHnyyNNPP51gnUjj3XffVbshdX+NGjXkhx9+CHSRgoaJEydKrVq1NKFsdHS0dOjQQfbu3euwDkIiR48ercnkUPcaN24su3btCliZg9GGSMY7aNAg2zzazDVHjhyRHj16SO7cuSVTpkxStWpV+fXXX23LaTdHbt68KSNHjrTd90uUKCFjx47VRNAmtJnIhg0b9LkHG+BaXLp0qcNyT2x07do1GTBggD438fy899575d9//7VeGASRk+Di22+/NR555BHju+++Mw4cOGB8+eWXRnR0tPHss8/a1rl586ZRsWJFo0mTJsa2bduMVatWGQUKFDD69+9vRCqffvqpkS5dOmPWrFnG7t27jYEDBxqZM2c2Dh06FOiiBQUtW7Y05syZY+zcudPYsWOH0aZNG6NIkSLGxYsXbeu88sorRtasWY3Fixcbf/zxh3H//fcb+fPnN86fP29EOlu2bDGKFStmVK5cWeuWCW2WkDNnzhhFixbV+9jmzZuN2NhY4/vvvzf2799vW4d2c2TcuHFG7ty5jWXLlqm9Fi1aZGTJksV48803bevQZoaxfPlyY8SIEWoDSJgvvvjCYbknNurdu7dRsGBBfW7i+YnnaJUqVfS5agUKqBBh8uTJRvHixR0qUerUqY0jR47Y5i1YsMDIkCGDER8fb0QitWvX1gvDnrJlyxrDhg0LWJmCmbi4OL0BrV+/Xr/fvn3biImJ0RuQydWrV43s2bMbM2bMMCKZCxcuGKVKldIbbqNGjWwCijZzzdChQ40GDRq4XU67JQQvNI899pjDvE6dOhk9evTQz7RZQpwFlCc2OnfunL5o44XbBM9RPE9XrFhhWIFNeCFCfHy85MqVy/Z906ZNUrFiRXVTmrRs2VJdk/Zu8kgBTZc47hYtWjjMx/eNGzcGrFzBXqeAWa9iY2Pl+PHjDjZE/pRGjRpFvA379esnbdq0kWbNmjnMp81c89VXX0nNmjWlS5cu2lxcrVo1mTVrlm057ZaQBg0ayOrVq2Xfvn36/bfffpMff/xRWrdurd9ps6TxxEZ4Tty4ccNhHTxH8Ty1aseIGAsv1Dlw4IC8/fbb8vrrr9vmoZLky5fPYb2cOXNK+vTpdVmkcerUKbl161YCm+B7JNojKfDyNnjwYL1p48YBTDu5suGhQ4ckUvn0009l27ZtsnXr1gTLaDPX/P333zJ9+nStYy+88IJs2bJFYzTxMHv44YdpNxcMHTpUX2rKli0radKk0fvZ+PHj5cEHH9TltFnSeGIjrIPnJJ6XyX1W0AOVgiCwDUFviU2//PKLw2+OHj0q99xzj77J9erVy2EZ1nf1YHQ1P1JwPvZIt4c7+vfvL7///rssWLAgwTLa8D8wivvAgQNl3rx52jHBHbSZIwh8rl69ukyYMEG9T0899ZQ88cQTKqrsod3+Y+HChVrP5s+fr4J97ty58tprr+l/e2izpPHGRt7YkR6oFH5oPfDAA4muU6xYMQfx1KRJE6lbt67MnDnTYb2YmBjZvHmzw7yzZ8+qa9JZfUcC6E2BtzbnN4i4uLiItEdioPcJmljQm6VQoUIOdQrAhvnz57fNj2Qbwt2P40ePThN4BmC7d955x9aLkTZzBLYoX768w7xy5crJ4sWL9TPrWkKef/55GTZsmO0ZUalSJfWaoOdnz549aTMP8MRGWAchH3he2nuhsE69evXECvRApfBDHu7ZxCbzLRddgNH9Em9xc+bMkdSpHU8VRNXOnTvl2LFjtnkrV65UF7n9zT5SgEsWx71q1SqH+fhu9aIIV/CGBRG/ZMkSWbNmjXaXtgffcXOxtyFuNOvXr49YGzZt2lT++OMP2bFjh21CbE/37t31M7qa02YJqV+/foIUGYjtKVq0qH5mXUvI5cuXE9zn8VJopjGgzZLGExvhOZEuXTqHdfAcxfPUsh0thZyTFAE9Au644w7j7rvvNv7991/j2LFjtsk5jUHTpk21Gya6CBcqVIhpDNKlM2bPnq1pDAYNGqRpDA4ePBjoogUFffr00d4o69atc6hTly9ftq2D3itYZ8mSJdoF+MEHH4y4btJJYd8LD9BmrlM+pE2b1hg/frzx119/GZ988omRKVMmY968ebZ1aDdHevbsqV3rzTQGsEuePHmMIUOG2NahzQztEbt9+3adIGGmTJmin810NZ7YCL218bzEcxPPTzxrmcYgTECuHlQMV5M9qDDo+poxY0YjV65cKp7QZTOSmTZtmuafSZ8+vVG9enVbF33yvy6/ribUN/tuwKNGjdKuwEiJ0bBhQ70JEfcCijZzzddff60vebAJ0onMnDnTYTnt5gge8KhXyM0WFRVllChRQvMdXbt2zbYObWYYa9eudXkfgwD11EZXrlzR5yWem3h+tm3b1jh8+LDlsqTCH2s+K0IIIYSQyIYxUIQQQgghFqGAIoQQQgixCAUUIYQQQohFKKAIIYQQQixCAUUIIYQQYhEKKEIIIYQQi1BAEUIIIYRYhAKKEEIIIcQiFFCEEEIIIRahgCIRw++//y6PP/64lCxZUjJmzKhTqVKl5KmnnpJffvlFQplUqVLJ6NGj3S7HwNRYJ6kpsW14OiAqtrFu3boEyzAf+zh16lSyB/jt3bu37Tv2ZZZ/06ZNCdZ/5JFHJEuWLBIIDh48qOV67bXXJBQ4c+aMPPDAAxIdHa3l7tChg8d1CtdTlSpV5M0337QNgGvVTh9++KFX5Z4wYYIsXbrUq9+++OKLOmi71TITkjbQBSAkJXjvvfekf//+UqZMGRk4cKBUqFBBb9h79uyRBQsWSK1atWT//v0qrsKRd999V86fP2/7/s0338i4ceNkzpw5UrZsWdv8QoUKJVtAjRkzxvaA9TVffvml/PTTT/LRRx+5XD5kyBD54YcffL7fSOHll1+WL774Qj744AO9FnLlypXo+iVKlJBPPvlEP8fFxcmMGTPkmWee0dHtJ02a5PF+8+fPr+LX2+sPAuq+++5LVPC547nnnpN33nlH5s6dK48++qhX+yeRCQUUCXvwwO3bt6+0adNGPv/8c0mfPr1t2d133y39+vWTRYsW6Rt0UuIgU6ZMEoqUL1/e4fuff/6p/ytWrCg1a9YMmWPGg7Jjx45SsGDBBMvuueceWbFihXz99dfSrl07iSRu3LihLwRp0ybvlr5z504VMd27d/dofVwzd955p+17q1atVJBDkECgp0uXzqPtZMiQwWE7KUn27NmlR48e8sorr6i3EnYkxBPYhEfCHjx006RJo14oe/FkT5cuXaRAgQIJmn3++OMPadGihWTNmlWbjsxmDggyPMSxPbyFjxgxQq5du+ZRk4RzU5nZtLVr1y558MEH9YaeL18+eeyxxyQ+Pt7ht/AiPfHEE5I7d24tH0TDvn37fGInsxzbtm3Tt/mcOXPaPALwJrnyKMFOxYoVsx1z3rx59TO8UGbTDtax58SJE0kepyu2b98uW7ZskYceesjlcuwHQnH48OFy69atRLflrrkSx2JfXpw/rLtmzRqb3bNlyyYPP/ywXLp0SY4fPy5du3aVHDlyqBcF3gyIGWfQPDR+/HgpUqSIREVFqWhdvXp1gvX++usv6datmzahQVSUK1dOpk2b5rCO2WT58ccfy7PPPqv1EOvCg+qOpOqsWV+///579cqa585VU2xiQDDVqFFDhffJkydtoqx9+/Zan3DsVatWVW+PPa6uF0+vC6yDc4FtmuU26yrKgXNSvHhx3Tc8arA9vM72oE7hOlq7dq2l4yWRDT1QJKzBgxQ3Rdw08YCzwvXr1+Xee+/VGKlhw4bJzZs35erVq9KkSRM5cOCAioTKlStrk9HEiRNlx44d2jTmLZ07d5b7779f47Qg3CAEAJpTgGEY2kSxceNGeemll7TZEd41vPX7kk6dOmkcDOKM8GDyFNgXHiCIOhxDr169dL4pqjw9TncsW7ZMhXDDhg1dLscynAc8rPEwxYPWV+BYYJdPP/1UhdwLL7yg9WHv3r06/8knn1TxgWYrCPHBgwc7/B4emaJFi9rigyZPnqznbf369VK3bl1dZ/fu3VKvXj0VWa+//rrExMTId999J08//bTGjY0aNcphm7Abfotms9SpU6vocoUnddZsQoPIgjgxm+WcPZeegP3AEwbBBPvgmFC2t956SwXovHnzVKRCSKPJNSmSqi8oNzzJOEbEMwGIXIDzAKEJb1i1atW0PkPQnT592mEfEH14IYEtsC1CPMIgJIw5fvy4gWr+wAMPJFh28+ZN48aNG7bp9u3btmU9e/bU333wwQcOv5kxY4bO/+yzzxzmT5o0SeevXLlSv8fGxur3OXPmJNgv5o8aNcr2HZ8xb/LkyQ7r9e3b14iKirKV69tvv9X1pk6d6rDe+PHjE2wzKVAu/Gbr1q0JyvHSSy8lWL9Ro0Y6OQM7FS1a1Pb95MmTbsvi6XG6o1WrVkbZsmUTzF+7dq1ud9GiRfq9QYMGRqFChYwrV67Yypg5c2aH37grI44F6zvbacCAAQ7rdejQQedPmTLFYX7VqlWN6tWr276b9aBAgQK28oDz588buXLlMpo1a2ab17JlSy13fHy8wzb79++v9jlz5ozD8TZs2NDwBE/rLMA5rlChgkfbNdc1r5+jR48aw4YN02126dJF18F1lyFDBuPw4cMJzmWmTJmMc+fOub1erNQXnF/782ZSsWJFPVeeUL9+faNOnToerUsIYBMeiVjw1okmB3PCW7+rt1970JSTOXNmbeKyx2z2cdUs4ynwdtkDTwG8BwjOBWbzgnN8Cpp8fInzMfuapI7THUePHnXrZbEHXqB///1Xpk6dKr6ibdu2Dt/RtAYQV+c8/9ChQwl+Dy8VmpBM0CSMOK0NGzaolxTHj7qD+C7EnMG7ZU6tW7fW5T///LNX58mfdRbNa+b1A88briHUz1mzZtn2jabvwoULJ9g3mtdc9Zr0VX0BtWvXlm+//VY9yGiOvHLlitt1UbeOHDmS5DYJMaGAImFNnjx5NNDV1UNt/vz5snXrVvnqq69c/hYPMrMpwASufzStOAea4uaLZgvnpgEroHnDHsS1APOmj21jH87roTy+xGpTp6+P0x1Ybi9C3IEmIzR1Iij47Nmz4guce6OZsXSu5uPh7oyrc4R5aCa+ePGinluIpbfffttB1GOCgALO6R88PU/+rLOIkcM1hDQgaBo7d+6cNtEhXsnct6tymvGGnuzb2/oC0Gw4dOhQTXGAJj6cL9QNxJo5g7rlyTYJMWEMFAlrEBeDmIaVK1dq12r7m7kZ34EAVle46o2Dm/nmzZs1Hsl+Od6G8QCEYAPmg94+sBwkV2BhH9iG/UMFgcy+xNVx43hcBXonN6eTFWBbBEN7AuJ70MMQHQhcgYew87lJ7vlJDFfnCPMguBB7A6GEuopgZvQKdQUCoe3xtLeYp3XWG8yA+MT2jevOlTcRJGffngDPG+K+MCHmyvRGwftn9kQ1Qd3yd3lIeEEPFAl7zF5ZCIp21UPKCmiOgMfAOWmfmZfI7KmH3kJ4uCB5p3MeI2/BGzQwA3ztPWn+Br3T0EvJXnRAbCCg3VvvgFXQPf7vv//2eF0EkcOjc/jwYZfH43xu0NyEc+sPlixZ4uCZunDhgqZbuOuuu1Q4wduJ84sAdTRRQZQ4T86eGF/XWX+AbcOupmCy3zeO2VepC1DvkqpzuCbRdIgefQhuRxOiPahb3gTNk8iFHigS9tSvX1+7gg8YMEAzDqPHFBJpoucS3o4XL16s6zk317kC3dexrZ49e6rnqlKlSvLjjz+qpwNNLc2aNdP18KaP3DJmQkJkaEYX/OSIHaRTQA809FxCbyI8VNELD72M/A08I0gDgWNCd36IJ/Qkc7YZYnvQ2wxCEQ9PNJngrd5MdZAc0DUd9oSQK126dJLroxs8xCZix+CJcD4e9NhCb8ZGjRppDzj0lDObnnwNRFLz5s21Vxh64SFOCykpzKSjADFbDRo0UFHVp08ftRmEFtITQGxBiHiDp3XWH6DnIHpPQhzC1qgPOCfo7Yb64yt745gQ4wQ7wcuMeoikuXXq1NH4NYhS9ApEigZcL+i9aJ/fDPUZzXq4RxDiKRRQJCKA9wk3TTyk3njjDX0jhshB5m3EzCCQ1pPuy/Aq4YGMHDqvvvqq5rpBbh3kmnHuZm4GpeNBAQ8Ato+HibdiAoIP8Vp4CGObiJ+BOFy+fLlDNnF/gP0gNQDiipAmAHmEcLzYt3OuoNmzZ8vzzz+vwb/wWOHB7e0QHfZgv2jugjjD9pMCcTaDBg1y2YyH30PAoFwYZgXBxp999pnuwx8gCz48UEhJgKYzCHiICNjVBN4P5OBCNvCRI0fqesgvheGGzDgob7BSZ30NRAy8lEj7gKZJeIkQaI8M+M75wZIDrmtsH+k34FmCKEa9xDWHawbXPObjuCEoYQt7UKfQjIqcXoR4Sip0xfN4bUIICSDwEEDsovcXM0YTXwGvH/JvOTePE5IYFFCEkJABgcBovoOXy7lbPiHegFQSaB5HMy48q4R4CoPICSEhAwKB4SVgd3PiKxD/hKB2iidiFXqgCCGEEEIsQg8UIYQQQohFKKAIIYQQQixCAUUIIYQQYhEKKEIIIYQQi1BAEUIIIYRYhAKKEEIIIcQiFFCEEEIIIRahgCKEEEIIEWv8H/P70PEMGl6FAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Create a figure\n",
"plt.figure(figsize=(6, 4))\n",
"\n",
"# Create x values for plotting (use counts_gt)\n",
"x = np.array(counts_gt)\n",
"\n",
"# Plot counts_mean vs counts_gt with error bars from counts_std\n",
"plt.errorbar(x, counts_mean, yerr=counts_std, fmt='o', capsize=5, \n",
" markersize=6, label='Detected Points (mean ± std)')\n",
"\n",
"# Add diagonal line (y=x) representing perfect detection\n",
"max_val = max(max(x), max(counts_mean) + max(counts_std))\n",
"plt.plot([0, max_val], [0, max_val], 'k--', label='Perfect Detection')\n",
"\n",
"# Add labels and title\n",
"plt.xlabel('Ground Truth (Number of Points)', fontsize=12)\n",
"plt.ylabel('Detected Points', fontsize=12)\n",
"plt.title('Point Detection Performance with Uncertainty', fontsize=14)\n",
"\n",
"# Add grid and legend\n",
"plt.grid(True, alpha=0.3)\n",
"plt.legend(fontsize=12)\n",
"\n",
"# Set equal aspect ratio to make the plot square\n",
"plt.axis('equal')\n",
"plt.tight_layout()\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "dc83ffb7-3123-4070-92d2-6cdb0fad44e1",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" "
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stackview.animate(images, frame_delay_ms=500, filename=\"moondream_detecting_spots.gif\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "20fbdf05-221e-4ec0-8da3-0e6fba6e9451",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}