diff --git a/main.ipynb b/main.ipynb index 2eca493..23f9933 100644 --- a/main.ipynb +++ b/main.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "66fe9a58", + "id": "49367614", "metadata": {}, "outputs": [], "source": [ @@ -56,29 +56,17 @@ { "cell_type": "code", "execution_count": 8, - "id": "f20dbf18", + "id": "944acee9", "metadata": {}, "outputs": [], "source": [ - "class MessagePrinter(object):\n", - " def __init__(self, enabled):\n", - " self._enabled = enabled\n", - "\n", - " def enable(self):\n", - " self._enabled = True\n", - "\n", - " def disable(self):\n", - " self._enabled = False\n", - "\n", - " def print(self, string):\n", - " if self._enabled:\n", - " print(string)\n" + "\n" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "e7fed2c0", + "execution_count": 21, + "id": "5d76103d", "metadata": {}, "outputs": [], "source": [ @@ -249,7 +237,7 @@ "\n", "def run_mcl(matrix, expansion=2, inflation=2, loop_value=1,\n", " iterations=100, pruning_threshold=0.001, pruning_frequency=1,\n", - " convergence_check_frequency=1, verbose=False):\n", + " convergence_check_frequency=1):\n", " \"\"\"\n", " Perform MCL on the given similarity matrix\n", " \n", @@ -276,22 +264,21 @@ " assert pruning_frequency > 0, \"Invalid pruning_frequency\"\n", " assert convergence_check_frequency > 0, \"Invalid convergence_check_frequency\"\n", "\n", - " printer = MessagePrinter(verbose)\n", "\n", - " printer.print(\"-\" * 50)\n", - " printer.print(\"MCL Parameters\")\n", - " printer.print(\"Expansion: {}\".format(expansion))\n", - " printer.print(\"Inflation: {}\".format(inflation))\n", + " print(\"-\" * 50)\n", + " print(\"MCL Parameters\")\n", + " print(\"Expansion: {}\".format(expansion))\n", + " print(\"Inflation: {}\".format(inflation))\n", " if pruning_threshold > 0:\n", - " printer.print(\"Pruning threshold: {}, frequency: {} iteration{}\".format(\n", + " print(\"Pruning threshold: {}, frequency: {} iteration{}\".format(\n", " pruning_threshold, pruning_frequency, \"s\" if pruning_frequency > 1 else \"\"))\n", " else:\n", - " printer.print(\"No pruning\")\n", - " printer.print(\"Convergence check: {} iteration{}\".format(\n", + " print(\"No pruning\")\n", + " print(\"Convergence check: {} iteration{}\".format(\n", " convergence_check_frequency, \"s\" if convergence_check_frequency > 1 else \"\"))\n", - " printer.print(\"Maximum iterations: {}\".format(iterations))\n", - " printer.print(\"{} matrix mode\".format(\"Sparse\" if isspmatrix(matrix) else \"Dense\"))\n", - " printer.print(\"-\" * 50)\n", + " print(\"Maximum iterations: {}\".format(iterations))\n", + " print(\"{} matrix mode\".format(\"Sparse\" if isspmatrix(matrix) else \"Dense\"))\n", + " print(\"-\" * 50)\n", "\n", " # Initialize self-loops\n", " if loop_value > 0:\n", @@ -302,7 +289,7 @@ "\n", " # iterations\n", " for i in range(iterations):\n", - " printer.print(\"Iteration {}\".format(i + 1))\n", + " print(\"Iteration {}\".format(i + 1))\n", "\n", " # store current matrix for convergence checking\n", " last_mat = matrix.copy()\n", @@ -312,43 +299,55 @@ "\n", " # prune\n", " if pruning_threshold > 0 and i % pruning_frequency == pruning_frequency - 1:\n", - " printer.print(\"Pruning\")\n", + " print(\"Pruning\")\n", " matrix = prune(matrix, pruning_threshold)\n", "\n", " # Check for convergence\n", " if i % convergence_check_frequency == convergence_check_frequency - 1:\n", - " printer.print(\"Checking for convergence\")\n", + " print(\"Checking for convergence\")\n", " if converged(matrix, last_mat):\n", " printer.print(\"Converged after {} iteration{}\".format(i + 1, \"s\" if i > 0 else \"\"))\n", " break\n", "\n", - " printer.print(\"-\" * 50)\n", + " print(\"-\" * 50)\n", "\n", " return matrix\n" ] }, { "cell_type": "code", - "execution_count": 15, - "id": "37b8c366", + "execution_count": 20, + "id": "fa29f711", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[(0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, 19, 21), (2, 8, 9, 14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33)]\n" + "--------------------------------------------------\n", + "MCL Parameters\n", + "Expansion: 2\n", + "Inflation: 2\n", + "Pruning threshold: 0.001, frequency: 1 iteration\n", + "Convergence check: 1 iteration\n", + "Maximum iterations: 100\n", + "Dense matrix mode\n", + "--------------------------------------------------\n", + "Iteration 1\n", + "Pruning\n" ] }, { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABucklEQVR4nO2dd3gUVReH39nNptF7r1IUpSmI6KeXoiCCWBGsFLsiFkSwASoqiIoFEEHBhmKhWBCQekRsYKFL70iv6W2+P84sWUMSUjYN5n2eeTaZnZl7d5P97ZlzT7Fs28bFxcXFJX/wFPQEXFxcXM4kXNF1cXFxyUdc0XVxcXHJR1zRdXFxcclHXNF1cXFxyUdc0XVxcXHJR1zRdXFxcclHXNF1cXFxyUdc0XVxcXHJR1zRdXFxcclHXNF1cXFxyUdc0Q0ClmX1tSxrmWVZ8ZZlfTBpw+7LJm3Y/fXLc3/aYFmW7fF6YyzLinK2Zwt6vi4uLgVHSEFP4DRhNzAM6Fi3SfMWwCwgIiTEZwGMX7XF9oaEPNu7ftVRBTlJFxeXgse1dIOAbdvTbNueUbpipaRKdeo2ByIBK+CQSOClSRt2VyuYGbq4uBQWXEs3iNQ+r0kjy7KstPsHtGkFFuFlKlWe3mfF31fZtn2gIObn4uJS8LiWbhAJCQ2LsCzrxHtavExZnp36PSMX/caQ6bNJSU4uDkwO9rjp+JTrT9qw+4VJG3aPb39b79Eej+cfy7KOW5a1xrKsa4M9vouLS9ZxRTeIHN7z786U5ORE/+/hxYpRp3FTvCEhlCpf4Xi3AU+/CHSwLKtkkIf2+5Qn1m3a/DxgOTDw8J5/75bPJz/Yd+z7Fd9dtbk5MAD41LKsikEe38XFJYu4ohtEtqz8e0NSUmIckJTmqUTg3/cGPrLA+f0kF0Ru8PuUqzU4O6JS7bpNgQjAd2jvv0SWLEnz9h1L+ULDZti2PROIBs4K5vguLi5ZxxXdIGBZVohlWeEpycmelbLwh/jYmKXJSUmxG/9cFr9n0wZSkpKWzZow9toje/e8ASyybftoXsyjTuOmLS2Px3vi9/OaUuWs+vw1/wdPSnJy7aZt2j8KxAMr8mJ8FxeXU5PrhTTLssKAscDlQNniZcocvH3o8KSWnbqUANbu37H9tYHtW3cCbgJ8wHLbti/L7biFjGeAIQBx0VHc37Q+5apWf/v8/13mW/HjgnsP7N9/fnJy8gJgLnBzXk0iLLJYmbio4yesaI/Xy8XX3sj4/g+SGB9fzLbt4cD1tm1H59UcXFxcMicYlm4IsCPEF2reW7v9q94vvVZp4lOPnXVg546KgJk2avj0GmefexFwDlAWeDQIYxYqbNseatu2Fbgd2LWj39MP3PPg51OmxM2fP3+ubdtVbNu+w7btPXk1j9jjx/bbNic6ja5e8iNfjhzGEx9/xfjVW2MvvuaGW4H3LMtqlldzcHFxyZxci65t29G2bQ8dv3pLJY/X2615+47hFarXZOvqFfy7eSPLF873Dpo89ZyJ63fZtm0n27b9RzAmbllWmGVZ71uWtc1Zmf+rdMVK107asLvjpA27O5atXKWzZVn/WJYVY1nWQsuyagVj3OxgjEkBlgHtRCQir8fb+Ncfv9l2Sor/9x3/rKFBi4uo07hposfj+funaV98BfyG3pW4uLgUAMH06d4GRBw9sJ89WzZTrV5DNi//i3LVqjPtjRHee8+ru8WyrJWWZd0QpPFCgB2AAUpd+/CAZXHR0dP379j25bGDB7+IjY76rtPdD/yCWtfLgM+DNG52+RXYA3TIqwH8PuV927Yc3PnPmmVJcTEkJyYm1D6vSdL6Zb/Zm/7+cwdwvWVZzYFLcX26Li4FRjCTI0omJSZ6xvfvyyXX3UiVs+rxxw/fs2v9P1zQoZPv00WLEzYvXhjx7LPPfv7222/PaNKkyRpgFxrutMvZ9jvW4Slx/JJDASZt2H0LcMuy2d+xbc2qElGHD1OtfkO6DXj6pm4Dnp7Tp0G1ocABy7LOtm37nyC+5qywDOgIXAd8nUdjnPAp71i3lnua1Oe8S9vMeez9yUtqnnNutRdvuvoqYAOwH3jJtu0f8mgeLi4upyBoopuUmDBnfP++t4T4QkNuHfwiAKHh4Xh9Prre3y8lNObIk61atfqpVKlS46ZPn57UpEkTG2gBVAOqOo+lRGQPqUKc0eNxY4wdMPywowf2R/ot7IWffUSNsxuBpt8Os217imVZm4BzgYIQ3QpAFxEJMcakDSfLNbZtDwWGikhtYCPQyxjzCUDvnxcD9Av2mC4uLjkjKKJrWZbl8Xo71m3SPOnxD6fYIT6fD6B6w3PABispaU2p6KP9gQ5xcXGxCxcu/GXBggVvpr2OiIQBVUgVYf9j44CfqwG2iOwCdqdg/ZtUvmbtQAs7LiaaEmXK+S9bd9KG3SHAUaBEEF7rf6I1fGFhO24aOPif9rf18gB/PtGudfSBndvvByoDP4WGhvb54YcfwlBXyKXAwtzOIRM+Ql0ZQc96c3FxCQ7BsnTfSUlObtju1p6NQsMjxqF+1vgGLS8KLVa6dOL9rZpM7//oI8Pj4uJeSkxM7Dd69OijIvKNMWZL4EWMMfHAVmdLFxGxgJI4IpyclFh9woB+PUJ8ofgt7PDIYsRFH9cT7BTq/Lvp6woVKpzTpUuXTiISSqo7YzdwIKsuDYcTvuTxq7d2WvnjwlHj+/c9p2mb9hzYuaNTXHSUr8dTQ++c8tLQycCbCQkJn6HW7l7UxZAnoisiFwAXAzekuQtwcXEpRFi2nbvPpxMVsBUNuk/y723QstULgyZPHdenQbVqwHtAE2Bb2bJlX5g2bVpD4CHUInvRGLM3h2NbwMRq9Rte+ezUmeVCwyN8AIumfMLPM77kqc+mUywuer93w6qh3bt3f2PEiBETWrRoEc5/LekSqHWYmTtjtzHmeODYkzbsPgtYCUQMvvpyuvZ9lE1//UFCXBy3D33pGFCpT4NqZYFdb7/99tjGjRsDXA3UCrYoOl9EK9FMtHqu6Lq4FF5ybenatr2NTNJae9v2EaB12v0iMhZ4ClgjIqOB14wxx7I5/DvAOZff0adVaHjEIqASEHl+h0588coLLJ35TdTVjRuETvr889fLlSu3p0WLFo851nTgPMJRl0agO6Mq0DRwn4gkEbDoV6xM5XrR4cV9Rw8eOBGtsfHPZaBhshbQFVgCMG/evGONVXVjgQtQyzeYXAU0ALq4guviUrjJtaWbW5zFn+eAK4GXgXHGmLhTnZeehe0NCfHd/PRz29vd2mv/9+PHLJv62ssdLcuqc+6551oDBgxYVbNmzQjgfmNMtm7xHUuyFAEivLN8jUdiLG/TUXfdRsWatej5wius+Xkx4x65nwEffk7DciX3jx/8FAsXLqzw4IMP/nHjjTc2Av5Ghfcz4LCzHQn4+Vg2XR2ISIjzPhwBGueX6Kb1bQMbi5UqPeTtpasPzhz3do2po0YMwLbrOof/AfSzbXtNfsytMJD2/fF4vJs73//QguseHrB/2ZyZe8Y+dM/7aB0MPyNs236hQCbrkq8UuOj6EZHzgJdQC3MI8LExJjlI174QmA78ALQDfgQez6lbA+C9tdseffexviPjY2K8D70zkRBdO2T+Jx/wwwfj7SN790TVrlnzk82bN/fs06fPyFtvvfVR4BugExo6VsbZSgf8XAw4RqoIB25HMtjfEQ0Z62yM8RfUyXMsyyqGVi37ANjete9jY+ZMfPe+57+dezyyZCk7+uhRu3y16g/edU7NKcCDwF22bTfJr/kVNIHvz/hVW5qtXLxwyvj+D4U9/928ZGw7dmD7i4u/Kkvr9b+sxaaCnqtL/lJoRNePiFwCDEetp6eAb4JhvYlITVT0/gYOAHcAg4Hx2bUuLcuyQsPDP6l9XtPuj02c7A0ND0g2s20by9oMNOjToFo94C+g+qJFiz4GJgKjgbbGmHXpzDEEtajLpNlKp7OvDFAO9ZX7359o0hfmU4n3EWPMiZKU2WXSht23A+MGX315ZNe+j9KiY2f/UzGxUcdvfPD8s+sCI23bjszpGEWVSRt21wFWAZF+33/tc5vwRLuLmLB663qvz3d27/pVC9eH0CVPKXSiCydu569C3Q1RwCBjzI9BuG5x4FN08ewZYARahOc+Y8xfWb2OZVnjgGZDv/5hUM1zzv0SCAO8ibEx4Qe2bKJRpXLXXte65XI0hOtn27afEpGhzlhlgO3GmOFBeD1DgcdR63kJGtWRnjifSsBLo26PU1nVJ4l3ojfk8I5KdTYcPbC/xoA2rXju6x+oclY9AB684BzioqOwU1JsYLBt28Ny+5qLGpM27B4J9Dt6YH+o//3xhYXxRLuLKFWhkh195PCBpMSEmcAAt6PImUGhFF0/IuJFq3K9AKwFnjLG/B2Ea45AF7quBi5Bxf0zYPCpFvPS8yV7vF5vmx63T+7eo8eeYQ/e8/i+vXtD4+Pj9wGTgGds204WkS5oxMarwAvGmIty+Toqo4kQfxljLs3ltSz0i+hUlvVJ4p1secpsKlfDN+ru20/4tgOJj45m6dvD11epUiX+iiuuOIQuMgZupLMvWPsL/Nq7y1aLjPL6vIG+/7joaP7dvJGa55wbtX3NqqdfuLHzZUAJ27Y74nLaU6hF148TW3sP8DQa5/qsMSZXvjARuQt4ERX1FagQd0SroH2VE5eGI+gbgHXAJmNM34DnKgOr0aSJveii165czH880B3oZIz5OafXyS2vfPVt5FcTJ0TFRUdbgb7tE9h2bPVta67u1KnTtBEjRvRq0aLFYdQdEriRzr7s7g/GNYI+5sYKtV959/GH7k73/bHtKCyra58G1dYC/wKlbNvObgSPSxGjSIiuH8c98CjwMFrA5gVjTI5LJYpIW2AK8IwxZoKI/A8YB+wEHsyJsIvII2jmWUvgHmPM7IDn/AV6ngN+McaMzeG8zwF+B343xrTPyTVyi4iUS0lJufOll156bteRY2EPvz/ZCo1I47K17RSw3+/TsMYDwHHgYtu2s+zGKepYlmWVLFd+auW69a557P1PPGl8/3hTklNq7t1yU9s2bX5CY8VL51WBe5fCQ5HqHGGMiTLGvACcjd7erxaRYSJSKofXWwj8DxggIq8BvwDNgfnAbyLyrJOanB0mAm2AJ4D3RKRcwHPL0HoT09HstJwyEkhGFxrzFRFpJiLvA5tfeeWVIdu2bfMMfObZB0LDI/YBcaB1fLeuWh5HYkJMmY0rWpUoUWIc6gdem9/zLWDeOXbwQNUhI19bGxoWnoz+z7Lxr2UxuzdtOBJ5ZH+vI4cPv9ysWbOlPp9viSu4ZwZFytJNixORMBTogroHxmQlxjed65QFvkJX/28xxhx3rv0WWnz9AWPM/GxcbxTaFy0EqA50N8bYIvI0Gp3wHJpoUdsYczibc23jzHWpMaZTds7NKSLiA65HfdJ1gJ27d++ud8stt5QlME7a5/PdNnjYfm+IL/mLV16IiDp8ODI8PNxq1KiRVbdu3du+/PLLafkx38KA3/fv9XqTvV4viYmJ8Z6QkJCuDz7y49H9+zYt+PSjK7HtCsCxxo0bHxwyZEjF8uXL9wM+dxNcTm+KtOj6EZFz0W64LVAR/jC71bwcYRkDtAKuNsZsd/Z3RcV3CdA/K+4MEakDLAUaojHBLxljJotIRzQSo62IzACmGmM+zsYcPc516wAdjTFLs/Mas4vjh74HuBddtNuGRpV8jLp2DmXxOrcCo4DbjDFnTFlJEbkF/b+80BiTaWSCiLREF143ogk8/+bDFF0KgNNCdP2ISGs0xrciuug2PTtWg7OK/ygahnWdMeY3Z38x4FngTjRx491TJW6IyFR00W8JMAf9QogGNqOr/3cAXY0x12djfregkRbLjTFds3pednDeg1aoVXsV8AW6MNgXre8wwBizPgfXvQz4EnjaGPNe8GZcOBGRFsAsoJ0xZmUWzwlDQxnvQRMrPnat3tOPfBFdy7L6Ar3QEo2fTVy/6wGgB1oVaw/wYZ8G1W5BrdQrbNuel9OxHNHoiIpvPGpZLszmNa5GfbMPGWOmBOw/F633EI5aIxm2HnIW5Sah1u5A4Ao0JXQjGld7ABXgKsaYmCzMKRwVv2LAFdmJK84KzvW7o2JbBrX6/0ZdISWAx3Kb8SYiDYCZqHvk6ewmpRQVnDuE34GHjTHTc3B+c/R/ZxdwrzFmZ5Cn6FKA5NdC2m70Nmti8TJlS6Jxrm+iluMTe7dtWVGyXPn70LCZXGGMsZ2IgfOBN9DFrDkicn42rvEtKpAjRGSII+QYY1aj0Qdjge9F5K1MFvGWoAkEnYFX0ASKh3EW04wxB9GaBFdkcVp90RThxcEUXBGpISIvAdvR8LkhQFugGfAJmuZ7QTBSjB0LuTUa3TElP/rG5TeOtToNeD8nggvg/H1boq2e/hKRu/z/gy5Fn3wRXdu2p9m2PQM4eM5Fl7RH01eLO0/7Jj//bHivF18tExIaGrQxjTEpxpjP0IWwr4HvRGSKiNTP4vnL0dvsq4DJjiXoF/UPgEZoKcU1ItI97YfCuS18A3jUcUXcjkYb7EA/UJDFKAYnAmIgWkVtaFbmf4rrWSLSxnGBLEet5/8BNwAXoqnLO4CGxpj3g1UDA8DxbV6ORl/MF5EKwbp2QeP8D7yDGhm5Kl5jjEl0InXaoT71H5ziUC5FnHwNGatSt16VkNDQyMBxl876lpBQH83aXeGLKF6iZLDHNMYkOPGw9dEkiF9E5B0RqZqFc/eg4V8eYKGIVAp47qAx5m7gJtR/PDsdQf8SaCAizYwxm4FBwDWkiu4MnDY+p5jKM2jSxY/Ol0GOEJFiInIv+j6MRUPjaqF+7ItR90V94HxjzNNpawgHCyfC5FbU5/2riJydF+MUAP3Q0p29guU6cfzBrYF5wFIRecBZUHUpouTrH69Y6dIlCXAix0VHM/X14dz81HMAHl9oaHjPnj3biUjLnMbeZoQxJtoY8xLqY40CVorIyyJS+hTnxQK3oBXKfhORxmmeX4J+0H5ABX1IgFWcgPpGH3EOn4gKW0vRfmk7gC3AZRmNLyJnoYtu9cmhlSsi9UTkddSF0MmZz7nOl1FzNCLiXuBGY8wtxphtORknOzh3Ik+jWYEiIiavx8xLRORynC9VY0xUMK9tjEkyxoxA3TK3AwtEpF4wx3DJP/I1eqFizdrj6p3f4s67R74VAjDl5eeILFGSrn0fBdtmYJsLefyRhw+1atUqFl3MiQLWp7Ntykk8biAiUgP1X16DJhu87QhsZufcgroMehtjZmZwzTeB89DY3nlODPAm4BxjzB4RqYjefvY2xnwsIk+hi2kPZTDm52idgyPGmO7ZeH0etO37Q6jLYCLwjjFmq/P8Waiv+QJULAosPlRE2qO1L/pnJ4SusOAI4BLgJmOM5PFYXqBfQkLC0w8//PDGtWvXVsGpZ1y6YuXnX//pj+NojPgvvetXTbAsawhBWKB2CR75KrqWZQ07/4pO9/Yd815pIGRI1ys4vOdfPCEhYNscO3ggJSQkJOaqq65a89hjj/lv//9E03KT0PjUBkBtdNEtPUHenh0fpJNSOwz13z4HTMosxtcJS5uKCtab6QmVU9zmbXQh5DG0hOR+Y8xg5/lFqE/4LKAGGlJWM+21RKQVuijjA9oYY05ZBNy5Q+iF1rCNdubxmf8LxbHsn3GOeQ1441RfNvmBiDRCIxs+BJ4rKqFSIlIS/Tu/bYx5J7/GfeuttxqLyLfXXHPNgfIVKtw+acHiJ78d+9btz38793iFGrVsgL/n//D8W/f37oWuodzhim7hIL9CxkLQ7Kwh4cWK1Xvj5+XneX2+6rHHj4UlJSYmAtb+Hdseefnm655FRWrWokWLolFh6uRsrdAwnFnorXw0KsBptwpoKFZ6grwvow+zaKHz4Wh3iGfIpOiNs6DxLWrdPGTSqUUrIpHOde5G6zncg/ZHixORR539PzuP/6CJA0sDzrfQxIp9QLwx5pZM3mK/aPVFIxDmoGL7s/81OH7je9EvgG/QokE5rluRFzg+829RF8xdJk1rpcKGczcxA9hljLm/gMa//0ixUsMPlawQNrjrFb7Aesav9bkluXy1GkPk80/uRovIu6JbCMgv0R2K3sqfoHbjph8Nnvr9KuAgMLV3/apHLcvaSgb/HKLFbtqhbX06oSI+29nmGWOOOsdFAvU4WYwbOuekJ8YbjDHHHKG7AhXfFDTGN91/VMfC+QwNBeuWUTqvI4bvoB0x3jLGDHZieEeht4WPoQslyY6P03/etagFXgm41BjzTzrXDkFToB9Cv6DGo4kbu9Mc1wm1av9F421zvBiX1zh/v09Q6+y6rGa9FQQi8iIa9XGF47/PdyZt2O3BtvcdPXigXGA946WzvuWXb6bR751JS/s0qFYRV3QLDUUyI80Rxwao+F6J1sT9C7WCZ6EZW+nd9pcjfeu4PnAUFeB1aKRAeTRZYCMqvic1k3T8a6868+hijNmYyXxHoFEC76JtiTag4WhTgN7A68aYRs7xPrTbwG+AZYy5Pc31yqMxzg+g/uG3Ucs8Ic1x5znzq4Nm2X1XFG7bJbXm8dXAVSaXZTzzAhHpjn45X2iM2V8A44cD1WNCI5rsLFlxyqi7b/cF1usdem0H+k/8jAo1aib0aVDtX1zRLTQUSdFNi2MdGVJFuASpVvDcU1lLzm1aNdIX5NpoQer9OBEMpFrIO40xKSJyH7pY0T2jhRRHeFejro/mQ4YMKf3TTz/FeDyekqVKlUrs0bNXcqs+D4yeO/XL0PkTxlx3+OCBWiEhId6UlJQ5UVFRfWzb/tdJ8OiLxvZ+DYzO4MugAvA8Gnf7IrqAViCWWG4QkftRd8gNpgBrBqfF+TvMAS7Pi7sG50unElAT9fnXTPNzDXRxdXeSzc6nRr72v9ioaPz1ev+zQA0H+zSoFoUruoWG00J00+KszPsF+DLUapyFivAf2YmhFC2gfg5qpd6Ihl0dRsW4DGoJrwcS0Oyz0ajr4GA6C2N3okL4wqZNm2ZXr159tyeyWI+/Dxxb/MLdPUs88u4HSUcPHEhOiI0Ja3F+8+UVjx1YcU3Xrinly5dv9sUXX0SjH7Z3gPfSs66cbKh+aFnJycDzhfn2PCuIyFVoVlxfY8wXBTwdv9/5dzTS4qscnG+hghkooGkfq6L/YzvQ/7f0Hg8kJydf+9xzz43ZFx1b5pGJn1qhEZEegBML1F4vCXFx0XHRURHondwI27ZH5OLluwSB01J0A3Fuwy4lVYTLoxbrLOCH7NwaOuFfT6CLX++hMbiBLosWaN0HgBhO9h1vRReK2qC+45sPlCzfdN3e/b5X7ugecvPTz3HhVVrHxkpJoXTU4dl7li5p8cgjj5SZM2fOTWiTzpMiK5wP8g1oRMVK4AmTTuPLooqINEXft7HAiAIMbQtDE0rmG2OGZHBMOCqcmYmqTcZiuh29g0p3EVG0+FJv4LHnn38+8o8//jjaa8Qb1zRt12ER2iMvIurwIZISE2NTkpN3fPHKsM6/z/x6Ic4CtW3bQY0hdsk+p73opsWJPOiIinBb1Ifrt4J/z0q4mYhUw7ntRReo3jRO0RrHbzwNja54Hf2QBbor/AXY/3ll5Mhz582fH54QF0fNRucxaPI0wosVOzGONznp8HOd247fvHlzG9u20+2pJlrNahT6gXvMZKPub1Fi3LhxdT7//PNlf/75Z+ixY8cANra+5oZP7h75VsyExx+q/8s30+4JONyDpmi3sG07w6JE2cH5YpuAWqHD0DrJ6YlqKbRQTYai6l/0zeb4FdEF0/uAxbNmzfp4xIgR0wisZxzi893y7PO72958x1409O7D3vWrxmS2QO2S/5xxohuI4zq4hFQruCowFxXgOacKqRKRhmiO/SXO4/voB6AUGibWFE08SERvKUujH87HgMVJnpC228pXtzb8/Ze17vef6XT3g//pobV9zaq4odd2jAWusW17cZqxq6MLcpejXwCTglkjobBhWVaxiIiIp8eOHXtR1Tp1vTP+XlN34lOPV3/+23mxFWrUTEJrOVzbu35VsSyrF1qKs56dxX/wgNv+9IS0JhodUgYN4dtOxqK6N1gpwM68GgD90XTzz9EF12yX1nQpPORadC3LCkNv+y4HyvrCwnd0f3Lwhna39PT9+u30vR88PeCshLjY89APxSKgn23bhbJAsyNkHdFV8zZoZMAydAFsD2pNliJVQP1bVdTH66/Yk4BWGPM6zy9DP5RHnK0DsD3FsppvrXxWNSwr5KPBA6lSrwFX3HEnAHu3bWHErTdwa7cbV3br1u0jNPd+BWrBDUCtnnHA8LyqkVAY+eHnX0P2lK2yN9njLTO4awcrMC4Vvbuo36dBtU+BRbZtP+d/QrSiWUbWqf8xmfTFtDxarCjd0L28QEQuRv/Ol6B/59HGmH35MbZL3nKqQitZvcYOwExYvfWqFT8ufH18/77nNLmsHRElSib2fvm1lOr1G97ybJf2s9FFpkmoVZknOJEIJfmvKKYnlBntL4n2+jqC1s1ti6YKhzuv8x80PG0dqSJ61Hlsglq2HuBJ1Hd8DXpbOsq/8CIiU4DvPbY9OzQx/tyE0PBmyUnJYfu3a8mDA7t28mrP7nazNpfP6Nat28eo//cLtJNwCOq37WKM+SW371dRY1eFmi2x7dCjBw9Ye7Zsplq9hqlP2rZv/+rlEyzLMu+88842EZlOqqiW5OTb/mWoK2gHsCO9234RqYv2zuue14LrRC10RcW2Euqeus0YE52X47rkL0FzL0zasLsuGiUQMfjqy0ljgUQBlfs0qNYQENu2S2R0HSfg3y+G2RFL//4SznhH+K8gpt0y2n8sgwyzyqgVfCVqqe4i1Re8xB+SFbCo9aJzzJOo5fsNarG81KZNmwqPPPLIgrZt2y4LK1HS9+3qja0nPNGvzr2vjaH2uY3t4bfdYLW/vlt8r+7dynds3SpKtOvC62jo2mw0fbg9cAi1gOcCC3PiKyxMOF+YpdCkkTLOVjbw8VCJshcdCC3eetQ9d3j9camBfPPqi8f/mPXt0Y8//vg1/mux7svubb+IlEAF9x1jzJhcvrzMxolAixr1R/8HRwLTTmd30ZlMMEX3BeCJowf2hwZmxgBg23ElY45OHj/w0QorVqy4YMqUKTPIWEQjUUHMrlj69x/L639WxyJpSWqKckO0TOEsYLYxZpvz5dEbzcT7HXjj6aefnr58+fKIqKioZI/HExoSEuLzeDy2DbtLlipdPSYmmrjY2OTkpCSvLzTUtjQrDsuyPHPmzLkVmBKQ1utBfcaXo5Zwa/RLby4qxL8WRGyu86VTjEyEM5N9pdBW7Yed7VCax8P7I0tVHTH42QfjY2K8/rjUAJIebt00+vjBA4/atj0pl6/Dg1rB+9DuDUFf/HAWXR9A62QsRcV2cVFIYHHJOcEU3Q+SEhN7jrrrNk6yQOwUjv7xS/Kz9/TxvvDCC0ebN29+DLVGo0gV2ENoSvAh9IN33Hk+3cfMitLkN04yQgfUCu6ItuI5ERGB1l14Yvny5UsaNmwYGh4eXvLNDz5+ef43M759dMJHVoWatUk4fNCuU6r4rOtand+1XLlyA0uUKPHCBx98APA9Wr3qVBXQwlH/n78tUANgMakivDo7H2YnPCqrghn4XBl04fA/YpnBz2n3Hc3s72pZlmV5PJPqnd/ilv4TP/WFhv+38cT6Zb/Fj7j1hhTbtivZtp0rP7eIPI+6ltoH+8vLcVk8htYUnga8lpViRi6nB0ET3ffWbnvo3cf6vh4fExOS1gLZs2VT9JCuV8RXqVTpuY8++mgu2jWiRC4fE0gV7kwFOouPscGwMBwL6XxSIyIao4VrFgF1ge7JHs+mpceTzn+5Zw/vzc+kxuZi27FhRw5M//mjCVePHz++2Ny5czeh1t+NxpjF6QyX2TzKoy6Iq9CaFRFol4h16O22l8zFNISsi+V/9uVVoRrLssYBzcbPmjfFV6fh67ZlxWNZ4WjESOKL3bsu3/TXHxts274jN+OISDc0fbplMBevRDv+DkD/HhPQWhyFclHZJe8IiuhalmX5wsI+rtO4WffHJk4OCbRADuzakfxyj+vsI/v39ktJTg5K6TvnFjaCrIlzVoU8lNyL+H/2GWOSnISKK1ABvnL48OGRCxYuLJkQH39SbO6DF5xDfEw0KcnJNjB40aJFHdA+at2Ba1EL8lSWZuC+YmhftUNosoYXXVCq4MxzLboo+CtaDCdQTKML022uZVm10OSS+PDw8NCExMR4y/J4bnz8yRUd+9z7064N6z54tnM7AW6wbTvHscoi0gy9O+hggtCLzvkSvgoV29poTPX7Z1LEict/CZbojgOaDZ72ff/a5zX9Cv2wew79u5uXelwTalnWyAO7dj59issUKI4PNjsinZXHRE4WZraVrd587aqV4enF5iZERSX9/v7o/bUqlreNMZGonzsBzWJah7pgsmp5Hktv8cjxSZ9PqivC3xfN74r4vTC5b/w4hYDmo1Xlns+D61dE3UEDjTGf5/JaYaj74HE0gWEk8GV6i7QuZxbBiNM9YYHgZMZ4PF7vZd1v+XjTX394dvyz5k40fvIEtm0XP+lCpxkZWOPFgRJbK9d9N8XjrZk2NhfASkmm4oFdMd2vvCJswoQJX1epUqUSGp9bHc1m6psHc/U3pvSLcG3UHeKPjFhfGKxeERmJduXoHMwEBOfaoejr/dEY80wurlMGrVvcD/27jQQWFIb3z6VwkOs4Xdu2t6GhTBlxV27HKIo4H7IYZ/uPX3Dnms3fJ2Ddm5yUbPljc/3YlifaGxv1elxc3NNHjhy5pEqVKuXRBbIUwBbtxfUNGmO6FhXEXPlQnTjQOc7mL+rSDhXhgc6481BRmlcQQfoicj3QDW0HH1TBdXgLvUMYnJOTRaQW2nuuJ/AdcKUxZkXQZudy2nBGpwHnJ5ZlVSxbtmzniRMnXhRZslTX7zdsLzH2kfuK3fvaGEIjIihepiw16zfk0J5/Bwxo37omWtGs7qJFixJQQTgfLS/ZGc2c8m/hwF7UqvobWONs64IRVB9Qu9hvBbcBtqEW8Fw0xCkmt+OcYg710S4dnQO7awTx+vejJTNbG2OOZfPc5qgL4Uo08edNow1HXVzSxRXdfGLMmDG3jR079r1NmzZZ8fHx8eUrVEi87t6+JVvffidLZ33rnf7GKxzes8fyhXiToqKi5gKDbNteASe6ZqwDrkdbpg9Hrb6z0HjhS9AoCRv1HYegvuC9aPbaGtQqXgOszU0SheP7bkmqCPu7CftdEX8GM07aqZX8K5qgEPQeZCLSBq1pcHFWi6U7X0Qd0MWxs9FmpOOLenKKS/7gim4eIyJV0M4OTYB7jDGLnJjaPcCevWUqN4qMiy5fIvb4JrQQ+29oUZOBaa7TG3XV/A/1E/p9m8nO8xYqyBcEbC1R189edDEuEq0TcYhUET4hyMaYAzl4fSXQmsV+Ea6CJorMQwvI57jrg/OaPkDTqu8Itl9UROqgGWe3ZdSWKc3xPqAHatl60LCyz4pigXiXgsMV3TzCCRW6Cy0DOB4YZpy28SJyG5rWO8gYM9HZ9yPwMtrfbRTapuaHgOt5UT/uy2hA/Vw0/TjDRR9HtKqjAnw+qWLsA7agGXz+6lpnocIcaBX7tz1ZFTwRqYqKr3+LI9UKXmCMOZiV6zjXugddkGoV7PoDzt3Dz2hB+LdOcWxJtIbyI2hd5JFoFTr3w+OSbVzRzQNE5GxUaEOBu40xK9M8/yeaKFE5QIifBioYYx4RkVmo1VsvsMmkiLQFJqKdLEqiIvyQMebrbMzNQq3RtEIcgaYR70YX/8JQwW6EinSgCPtFeUebNm18BFSZ83i9W7r2ffTHrg8+ehjbXj361utqbFy/rn9cXFz5SpUqWbfffvuWDh06fEXql0ZcBvNsgWbjXRrsguzOF+KX6JfOXRmJp1M3+WG0H90PwKvGmKDU53U5c3FFN4g4sZmD0LKLQ1E/ZHKaY5oCP6ELLs8E7G8BfGyMOcfxY25B/bONAm9fRWQG2lr9FRFphXZU+F9ua6w6BX3OJ1WIz0ez4f5CBfYgunBXFhXiRkCp6Ojo9WPGjPF26tRpdoWLTNKSpcseH//4Q6EvfDcfj9cbNbB96+KNLr703pU/LpwQGRnZNTY29vMPP/xwdM2aNS9G/dC/kBofvNzpOVcWTQoZkJOWOFl4rUNQn2y79CI/RBt6Po5W/PoYrRC3NdjzcDkzcUU3SIjIJWhq5wa0n1e6K9giMhG4GTgrjRXrQf28LZ2COecCfwJTjTG3BBzXAL0tbmSM2efcgj+M3oIHtRWLU1MirRCXR6Mk/kDLXB4FisX7wi7cVb76XVgej7/KXJnKVXjr3l689fPfB2vt3Ww8tr2hTZs2u4Cutm3/IiKl0PoG/qI9ZdHkh0ZowZ57CDJO6NkbaBffPQH7LWcuA4BmqB9+nCniPeZcCh+u6OYSRziGo1bRw6hIZnS7WhIV1pnGmG7pPD8ZEGPMeOf3vuhizUPGmAkBx40Cwo0x9we0kSmJ1nzN0z+oY4U257/uiSr7S1U4fDyyVJWjBw94/VXmKtWuwyt33ETHXnclX9H0vD1/L/ih4qhRo6yPP/54ZvHixVeS6qZYZ4yJFZGaqD/7Ume4I6RawQuNMUdyOfcmqKhf6XcTONEYN6JiG4m+35Mzcnu4uOSWYBQxP2MRketQi2gmcG4WRKEnGtY1PIPn56BFz8c7v49B4z/fEpE/A/yJLwD/iMhoY8xqR5wXo5WrXsvp68kKjuU339kAEJHSMeHFv01KSqo+vn9fLrnuxhNlPS++9kbGD+jnHR0XV9VjWUm9evX6oHjx4lvRhp7XoR0Z6onITjQO+TzgGdTt4EXD4e4DPhKR1aSK8C9powYsy/oELfJTLCQ09FCnux/Yed3DA0olxMXtHtKlfamU2OgL9u/fHwKUWLRoUXGgD9rleQfqDpqZR4kXLi4ncC3dHOAssIxGF7TuMcb8mIVzLDSp4IgxpkkGx1RGrb+K/hx9xzr+B/2CbOQP6xKRh1GLrZPze020bsDNxpiFuXyJ2ea9tdtfGt+/78C46GiPv8rc6iU/Mu7R+3l0wifxzWtU+WTN3O+Lv/LKK9e8/PLLm84777yyqKtiH1rsPRa4CK2ElogW5amJCvEaUtvcV0SFuR7qG/cnaaxu06ZNI2DjxPW7Ou3euP7TV+64KeKR8R9RvcHZLJg8KaV2zVobRjxwV5n+/fv/0KVLlyvRVOdXjTG/5d875XKm4ynoCRQlRMQjIg+gPs0VQNOsCK7DpajIZFioxfExbgVaBew7hvZsKw587dwOA7wDnCUiVzrHbUcLrHwqIjWy8bJyjWVZ1iOtm9Y/emA/D44ef6KAz45/1tCgxUXUbdr84NGyle995plnehw/fnxO3759PzDGVEULI/l7gVVFLdglaATFQVRwK6Pvx3VoQkgH1Odro4kJ96PieWDRokVD5/24+HZs+xPL44mwLIt927cSEhpKh973ehq063BW2XLlKoSGhhYHLjLGdHMF1yW/cS3dLOIsbPlv++/ObtFpEZmDJitUzKyCl4gMBxKNMc+m2f8oegs83hgzwNnXFY3bbeq/pog8gfooL8svv6S/ytyI+b+MrlC9xgTLtsNsj8da++uS2LEP3RN+Udfrus37aOJUy7Kao8J6s23bgTHIb6JFdq5Le3vvxCdXQsPXArf6aGxxVbSUZQrgeeWttz3zvp9Jum3tbdt+6MLz4qKPHrnKtu1FefmeuLhkhCu6p8DJHnsKtagGA+9m1+/nFJDZDrxgjBl2imPbAiOMMRem2W+hcasXo7GlXzr75gNfGGPGBRz3JXAoL1b/05K2ylxISEiox+v1drzr/u+ve3jA5/c1qVc+IS62Lyqc+4Extm2f8DuLSHe0lfwFOV0ocyI/ygPV95Wu9MCx0Ig7Nv79ly+90pn9WjWOizp8qJMrui4FhSu6mSDaEHI86lN8yBizK4fXeRldsKlijDl8imND0XY/ddOm5Yr21FqFrrJf7CyiNUdbAzX05/47qbm/o21g3svJnHOKiCwDnjDGLMjCseegXTWCUjAcYNKG3Y3RVOqIdEpnxjzQvEFiXHT0ta7ouhQUrk83HUSktIiMBz4FnjTGXJ8LwfWiVvLXpxJcAGdFfhEat5r2uYPATag/81sRKeWI1feoNe4/7jjqA31ZtEVMviDa+6smKqSnOrY4MBUtGB4UwQXoXb/qSrRATnxyUjIBpTNtID4+JsZtZ+5SoLiiG4CIWCJyI7AaLch+rjFmei4vey26YJSdOq1z0AaXJ2G0V9qraJruR86t9TPAXU4BF/9x/6ANMb9ykhzygxuB6Zn5rOGEC2QCGvY1MRgDW5ZV0bKsHpZlFd+xbu31v3wz7a/fZs7gnAsvsrHtmIS4uA27N65vZ+utXahlWeGWZWVWB9rFJU9wRdfBWfGfgUYX3GSMeSBIpfqGoJ14s1M/YA7QwRGn9HgZLfXYHHjayWx7gzTxv84XxqfAlICoh7ykG+pPPhUPopEHweyCYaN3FDuHXH359gmPP1S8TKXKAztd0DQqPCGu431Nzgp75qq2fwHV0Pc3Fq3K5uKSr5zxoisiXie54E80tbW5MWZJkK5dFw1vylZ/OGPMRrToTOMMnk9Gw8PCgH4ichWaFNHaSUcO5Bl0Zf/F7M0+ezhWdm3UNZLZcRcBzwI3mFO0lc8Otm3vt23b2LZd2rbtkrZtN96zZfMrkfExVD24c4Vt27Vt27bSbFuDNb6LS1Y5o0VXRBqjAfbd0RCr59MrgJILXkRTWb/Pwblz0Gy0dDHauvsO1ML7AK0c9hTwuuNy8B+XjNZ6uEm0tXhecQOncC04bo4v0JC7zXk4l0BC0EI9Li6FgjNSdEUkXESGAQvQFivGGLM2yGOEoZ0eRuWwHkKGfl0/xpg56Pz3AdNR94gHLbQdeNwBVBTHikijHMwlK3QDMqwI5iwoTkbrGnyTR3NIDy9Ow1QXl8LAGSe6ou1ZVgANgSbGmPF5lG//IFogfFQOz18IXCjaqTcznkFLQMaj4W2PoVELEYEHGWP+RDO/pjtFeoKGaFPGs5w5Z8QQ1Op8NpNj8oIQXNF1KUScMaIrImVF5D20PurjTgrov3k45OPANyaHTRudsK9laCPIzI5LRN0HtUit/rUUFd+0x36AWvcfBLoggsCNwAx/vYi0iEgntLjMzaeKbAgmzkKkB/Vpu7gUCk570XXCwLqjSQWxaBhYnt7eisjFaAZW/1xeKlO/rh+nwPZ9aGjak2g7n8ecAjppeQStZzAwnedySoZRCyJSG3WB9DDG7A3imFnBCyTndblLF5fsUORFd9KG3Z47nnv5zsp1ztriCw2L9fp8Wy3Lug5OVN76ltTV8odMNlts55CRwCpjzLZTHpk5p/Tr+jHGTENf61o0jvcLtARk2uPiUcv0IRHpkMv5+d/j+qgFnfa5MFSMRxhjfsrtWDnAdS24FDqKtOhO2rC7XHJi4vI5E8dPaNPjtlrjVmy0HnvvkyrekJDPR4wYMQwNA/sFON8Y80t+zElESqMlCgcF4XLLgVKBSQ+noD/aZPIXtLhOV9H2QP/Bya67GU2uqJ3LOd6AZtul51p4A63L8EYux8gpbuSCS6GjSIsu8Mm/mzc2PHpgn9Wh9z2Wx+sNa3TxpaFnX9ja9/Nfy+9G6xO8mLbYdTCwLOsTy7L+tSzrmGVZ65u2ufy1SRt294oOLzbp999/j2rTps0oy7JiLMta6BSFyTbOAl92rN04nPA3tDTiBuC19JIsjDECjACmpV10yybpuhZE5HagHXBnAd7eu5ELLoWOIiu6kzbsroouMvnSPmcD67ZstUwumzWegpeB2hPX7zIvfLeg9NZVyx/dsvyvMZvs0GsHP/d8iRpnN3oD7fm1DPg8F+Nkya/rx8l8exxdWCsLNJLFi+8sWa78L94Q33HL49lrWdZoy7JCUAt0HfBOJtlvGeJk8Z1NQBcJZ39jtMX8DfnkzskI173gUugosqKLikp85br1KFG2PLPfe4ekxERW/SSsW/orXo+njIjcICJNRLvrBhXbtldPXL8rHFjoCfFWsDwea/+uHZHL5s6mWv2G1nPfzH1s4vpdCWgN3KaWZZ2dw6HmAm1E5KQvl4wwxnyIVhlbExVevNRXP8yfcN7/zAVj/1qX/PriP0qUqlCxG5b1gGOB3oVGPNyXg7ldj0ZoBHYrLokWsnnUGLMqB9cMJq57waXQUZR7pG0HwkJ8Ph4a+z6TX3iW7yeMofZ5TWnZ6Wo8KcnxaMZWfaCuiBwANqK33IHbppymo77U45pvt61ZVSrRKZjdxLRn2qgR1DinEWiEQFvbtudblrUJOBdtu5MtjHb83QS0JgvVuwJ4IDY0YvW+MpVDD+zaSfvb+/hCw8NLhYaH06rLNSGbl/99M/CWMSba6ZC7RET+zqbvuxtq8QMnQrQmAfOMMZ9k4zp5hWvpuhQ6iqzo9q5fddekDbsXA21qnN3IN2jy1BPPDevWJaV4mbITjTH94EQ2VA1UgOs5j5c6j7VFZD+pIhwozJsy677w1JSvt6UkJ1+68a8/WPf7z4SEhhIXE02JMuXAtouXjjo8TmTDptq1a1e5/PLLB4rINWgSQ0ZbXAb71wB9RORYJucmBvpOjTFRH67bsRuoeXnPO/lt5tc0bHUxMUePsPqnH31d+z7WeNKG3b7e9asmGmM2iEgf4AsRaWkCWpNnhNMnrhFqift51Hmfb0n3pPzH9em6FDqKrOg63Ar8uH3NqhpVzqpXLCUlJWH+J5OsPVs3R8cs/2uA/yCn/sBWZwsUCb8g+8Oe/JtxHmuJyF5OtpA3ApuoWn+7x+tNbNDiQt+v30xl4WcfER5ZjLjo4wCxCSGhnwNL9u/fP27//v2L0Uy4sHS2MkB4Bs+Foc0Y66HJDxkd4xWR/wixXfmsalgWDVu25scvPuXB8xuSkpzMJdd1o8WVnXFe9ybnPfrOqb37hYi0zyjRIYAbgG/9rgURuRSN/b0wyPUrcoNr6boUOoq06PauX3X/pA27z5v09ONf7N64oXNKcrIVEhr6c3xM9F22bWfpg+8I8hZn+yHwOaccYi1SreP6aIvv+kDN6nu37t9ZsaYXy4O/YHbVeg34ecaXYFkpMRHFX2rTtI0FVPj6668nzJgxI9vuBWcePrTVzRXGmH0ZHOMljRDblvVrSkpK5dfvvAXT4zae+vxr4qOjmfhUf74Y8UJ490GD05aufA5oAbyCWq2Z0Q2NfvB3Mf4M6BmE2ORg4vp0XQodbrueHGBZVsXQ0NArhg8fvrKC6Xjfn3/+efeYfveE3PvaGM5qfr795BWXWv0GDopq0+L830aMGFF21apVZb/66qsHUQt5S05C2ERkOvCVMWZyVs+ZtGH3s8cPHXzy4YuaRIz+Yy2RJUoC8OfcWUx/fbg9+f33ugHTAt0SIlIGjbh4xhjzWQZzqYoWeq+Mitpc4EdjzJDsvq68xGkHNM0Yc05Bz8XFxU+RtnQLEDshIeGexx57rCng8YWFb7mi1127ml/eMQ74+5qbbkr5ZNzYgSP//feyihUrbnvxxRcF6IdazNVFZCcn+483AFszua33h45lWXSB10uULXd9+Wo1mi789CPryjvvIy46Kn7J1C98dapXi0ELtj8kIo/6W+YYYw47C2vzRGS1MWZFOte9HvjOGBPvdC9OIJPW8gWI615wKXS4lm4e4bRCvx6t0xsYUhUK1OG/i3r+rSqwg5P9xxuc05egzS2zXMBl0obd4Uumf/nU/E8mPbJ3y+biHo9lJyUlfT9h3Lj1NWvWvBqYCDwMzESt2z3OPG/FcTek7dIrIoIWTbeAt9BOvv9polkYcJp2TjLGNCvoubi4+HFFN49wwqemATuNMQ9l8ZwwUgXZv/mFuTIaV/0bmt4cKMzbs1K9y6ksNgtYaox5RkQeQhe/bgKuAe5E6za8YYyJE5E30ZKNXf1CLyJV0PoOrQEBrjbG/JaV15ffiEgLYJwxpkVBz8XFxY8runmIU4dhGTDYGPNpLq8VDryH+lBX8F9hrghsI30LebuzWOi/TiVUtHsaY+aJSA/UWr0B2I0W62kGPAF8DSw4Gp/w62ODnmxzYMf2xrHRUb4KFSvF3t271942bdq8bowZk5vXlZc4rYHeMMZcVNBzcXHx44puHuMUnJkHtDHGrM7ltToDA4wxbdLsjwDqcrJ1XB+ogEZmBPqPi6PFcZobY/4VkSvQBpZ3GmO+EZG2aPH1o8cjSry/O6TYpO/eH2dfemMPb9mq1Vi5cG7KuMf6WqUqVGi4d9vWDRRSROR/aIWztH3jXFwKDFd08wER6YnWuW3pFCfP6XWKAXuAqlm9jpMCfRYn+4/PR+vvrkOF+DhwNdp94m3U6u21q3z1sfG+8BDStCt/tnM7u2nbKybNfPftO3P6evIaETHA88YYU9BzcXHx40Yv5APGmA+dwubvi0j3nFbdclJ2fwfaAlkqxO50rljpbCdwYpAF7TKxGBXiMLQt+r2AL8kTsj3eF+5NK7hHD+xn77atVqurr22Xk9eRj7jRCy6FjqJc8Kao8TDqAng4l9eZTRZLPWaGs/DWA62r+68xZrgxphtqEW8D3j9WrOSTaHbbCZISExnfvy+XXHcjNRqeUzy388hj3OQIl0KHK7r5hFPD4UbgSRHJjY8xW6UeTzGnHcDdwKdOUoS/wPllQLPSUYf/07I9JSWF9wb0I8QXyq3PDrOBP4IxjzzErb3gUuhwRTcfcXqZ9QamOFEEOWElECEi9YI0p2/QKIX3/TV1jTGHgWs8tt2iVNThUGw7wbZtJj3Vn2MH9/Pg6PH4QkKsyLio94MxhzzEdS+4FDpc0c1njDHfo+UPP3P8qtk930ZrROTaxRDAE2iNiQcAnGiG34E/yx4/OLVEzLHkjwYPtHdvWJ/y8NhJyaFh4cfLHd33b+VD/37gFCwvrLjuBZdChyu6BcNzqAV2UuPILBIUv64fpypYD+A5EfkWjQfuZ4zpbsHwpH+W2/L5ZGvbmpUpj1zSzNOnYXVP11YXlPzuu++OAr85i4SFEde94FLocEW3AHCSFW4BbnFq7GYXfzeJ0GDMx3ErXIRahpeg5RlnOvvfqlKlyiOLFi3qv2D+/H/nzJ6dtGjRojK2bRfv0qXLOcBOtE5Dp2DMJci47gWXQocrugWEU6vgJmCCiJyVzXMPol0och3074z9A/AYcDkwHc1KA7V+iwETjTGvA0+j1uPVzjyOounAu4EvReTm3M4nyLjuBZdChyu6BYhTs+A5YGoOOvJmuUtweoiIzynK8xsquhe2adPmonbt2jW//PLLb6tfv/6SmER75KRVcZN6zopqZXl997Rp02ZIx44d6d+//+cjR468zXkNB1Hx34c2uOyb0znlAa6l61LocEW34BmL1qYdm82OvDn26zodIpaiBdlbGmNGOiUld6ekpDxfunTpL73la1/00Pzoyot2JL0Qt235D56wyHFlr3zoza+//vpT27ZXfPjhhxOdNusYY/ai7Y+OAoNFZGhOugvnAa5P16XQ4YpuAeNEI9wDtESrfGWV39D+bpWzeoKIlBCRN4BvURfClcaYLf7nbdueZtv2jOSKDavvjrY9STZeoFTspmXFIs++1CrRtOPwZQe9CQ888MCi1atX+7Zv3z5CRPo7r2MX2uYoHg2Le9upalaQuJauS6GjoD8ULmh6L1rl6yURuSCL5yQBC4AOWTneKZazCigFnGuMmZxeOnLtQTN9VulqF6UEPGNjAzZAxLT1Ca18Pl9NgGHDhj0L3CUir4iI5cQhtwd8zuPkYC325RDXp+tS6HBFt5BgjFmHxsl+KSJls3jaKV0MIlJZRD4H3gT6GGN6O37YdLm3SdjNdpr/i4i6LYj55ycS9m2xDkbF1Zk0adIlgL1+/foY4H9oBttEEQkxxqxHvwjKoGnP3ziFegoC173gUuhwRbcQYYz5CpgBfJTerbllWX0ty1pmWVa8ZVkfAHOSUuwOpRq3bWt5PH9alnXY2eaFh4efKyJ3o7V3NwGNjTHzMxtfRHznlvc+k5LCfzpTRNRuRun/3cL+GS+xY2zv8Fq1akWgVcl2OgLeHi2yPl1EIo0xq4CrgNqo8M3LxhdJMHHdCy6FDld0Cx8DgdJoKci07AaGARPBsnrOirrzgXnRZUu1v+/7avdMOLfmE9/8UPXe9xrWrl371/Lly/8G3AVcbox5yhgTm4Wx+5YK82xOjo/aieNP8FPi/C7UuneCfdkzUz5s3759MVTQVsEJ90hXdCHtBxEpY4z5E+1G0RTYDvwoItVy8H7kBte94FLocEW3kOFEEdwEPOik457Av9AFHAyv1bQ18Hh8Mh5PePHwkNKVQy3Lc22psuXXXnlV50f27NkTClycQWPJkxCRSklJSU9t2bLlifjNS2d7SIakhCQ7JRk7KYGEfVtiQzz21l41j3QZOXKkp0KFCh/atn04zbzvQNOHF4tINWPMr2ir9rZoGcmfRKRBEN6mrOK6F1wKHW4R80KKiLQBPkOzw3YEPhdSvOxb4bWbPVC+S39v4P7tb3THTogFO8UGBtu2PSwb4703bNiwRvPmzWsduL9ky+v2lbzoxp2737u/UkrssTKWZUXfdNNNJe655551Xq/36rRzc0LFngDuBzoaY9aJSEfgY+Bd1Pru7FjCeYqIDAZCjDGD83osF5es4opuIUZEBgLXAiawo3BE7abfeIuX61S+S/+TCuakJMRx7Levlh/9ecrTtm3PzOI4LdGi6GcDFwCfAOf7OwOnc/xHQDi6gHavMebrdI7pA7yINrVcKiJd0a4UI1DXyU3GmEVZmV9OEZHngWRjzHN5OY6LS3Zw3QuFm1eAvWiH3hPYKXYKaXyufjyh4ZS/9ObNwEeWZVU81QDOgt1bwFOokH4M3JGR4DpsBdagXwijRGS00zjzBMaYiWgHiu9FpINTQvJhYICzfSki155qfrnEdS+4FDpc0S3EOHG0vYCrAusaJOzbvJEM/nY+D8n3Ng3rEBISUqp79+6XZ2GYW1Fx+sjZPjDGzDvFOVuB2o7P9ny0+eXvInJOmvl/A1wPfCIiNxtjPkfFfRjqZnhHRHpnYY45xY1ecCl0uKJbyDHGHEETJ96aMWNGE8uywu346MTEgzuXpyQlxNgpycRu+YuEvZsgJTm+elhsysfDn/jD5/PF9OnT52UR+U1EeqZX20FESgDDgX7A42hxmyFZmNZWNBzMP78eaBzwjyJyV2AKsDFmMRpSNlJE+hljPgBeAt5wzhsqIgNy8t5kATd6waXQ4YpuEcAYsxx4fMqUKQuAWGBQwp4N5+947frIw4sm7U2JO55w8NtX2P76DZ4fn+8e5QsJafnMM89MDgsLq4vW7O0ObBeRV9N0nHgGLRPpQauM3exkup2KrTii68zPNsa8j/p4H0ILtJcKeH4lmkTRV0SGAePQjsMTUBdFb39WW07en0xw3QsuhQ53Ia0IISLj0TTeHmlTeEXkTWCvMeYlpxXQt8Ba4G5jTIKI1EV9rL2BP9EkjGFooZpZaNHyLHUYdlJ7jwPF0oq049t9FU2OuMVxQfifqwh874z/ADAItXavQ33Jq9GFuaAIpYiMBv4xxowOxvVcXIKBa+kWLfqh3Xr7pfPc96jQ+at+tUUFepaIlDbGbDbGDARqApOBl1FL8Cvgh6wKrnP9BHSBr3o6z8UZY/qilvPXIjLIn11njNnnzKsO8CUqzt8An6MulBroAlt42uvmENe94FLocEW3CBHQUfipdDoKC9DEn24bUERnFZqUUCvgGofQ+rfvARWBbiLymYhcmo1b/K0EuBjSmesMoAXQCc1Sq+LsPw50QauRzUZDyH5Exf9mIAH9oiiZxXlkhutecCl0uKJbxHBKMfo7ClcM2B+HCm+HgH3JxpiHUXFdIiLnO66BUcBoNDKiNWp5/oL6WFeIyP3OIltmbCUT0XXG3wG0AxYDf/pb+jg92W5BOxsLKrwrUeG9E+2KsTDw9eUQN3rBpdDhim4RJKCj8JQ0HYVPuBjSHP8G6pKYDbyDFsB5CHjIGLPRGHPEGPMWcA4aS9sO2CYiYzPp9ruVU4iuM7Y/OaE78K6IvCYiocaYFGdOXwE/oa6Gnc7vjwAzCbDQc4jrXnApdLiiW3TxdxR+PmDfLODK9CqUGWOmoRZyb6AqIMaYKWmOsY0xC4wx3YDGqN92toj8KCI90tTG3UoWRDfg2j8CzYGzgJ9FpL4z3jDU0l2EJmlEoT7eF4AxqPCea1lWlOUNibNCfAmWNyTesqxky7LePsWwrnvBpdDhim4RxekofCtwm5Nii1NEfD/qS02Pm9Db+bOBY5l1djDG7HIs1NpoDO7daNjZMBGpCWwjG6LrXPMgGqkwERVef7uf8UBf1Lodj1qoH6MukCe3H0uWOoO+S6o14OvEWo/P8NV4eEqK5Qv3lL6s55FTDOm6F1wKHa7oFmGMMftRIX0voKNwui4GEbkIuBK1YNsCrYBPTxUpYIxJNMZMNca0B9oAxYG/0HCvs7PbksexbseiCRNPishHIlLCscRvQus+TAbKAe9N3xD/2fO/xNopNqWcsYlZ93O4N7IUJS+6sX/tQTPrZTQWrnvBpRDiim4Rx4mDDewofJLoOsI4Bo0MGGiM+Rltt+4B5opIuSyO9Y8x5hE07OwrNPJhvYg8ntVrBFxrBdoXLh74Q0QucArgdED9u98C9cpHeKYlphAWeG7UqvkUO68dlmV50WpmGeFaui6FDld0Tw/8HYVHA0uABk6ChJ9eQDU0NGsinIh26IFGLfzsJE9kCWNMtDHmXWAX0B+1njeKyAcicmFWw86c69wNPIuGiT2PFt0Z5uzzJKbQLtSjFi5A0rF9xO9YRbHz2gOEoot/GeH6dF0KHSeVBnQpehhjbBG5By0gfvuECRO2fvv9nD+OHT5QMTQsfOoPc2ZfiWaQ3ReYyeZEEDwhIlvQBavrjDG/ZWPorcARY0xPESmPE8oGHBKRd9B6wMloK5+qQJUMHqsCJdGuGf2An1H/boey4dZWy+Jc/4BRqxYQVr0RvtKVQS33zIq0u5auS6HDtXRPE/zJEH/vS3ptYUz1+hFt76lcvGlHwupffNPcrQnFgGudxIT0zn0HbQP/nYhcl5XxRCQMXbRrLyI3oFZzGXShDjQWOAqIAX5FC9zcDjRC60f8hC7Q3eHsC0d9tmOBJqh4v9m0grdBcZ+V4jedo1ctoPh57fzTSEbrOGSE69N1KXS4lu5pRM9ZUaU8EO5rcGmYD4j9d5M3+fgBPvsnIfmTtQlNtxoy7NZgjPlORK5Eu/c2R2N6M7NMiwNxqF92Gdq/7V80EeIL5/cQNCvuTuAYWjry20xqK6SIyBAgAvgO2GxZlul3fvjQkUtj2x7bvsaXHHXQimz4vxifh/DLa/k+fOfeDlszeUtc94JLocMV3dOLF1LUz/kfkm18wMuz5i2SSJ+V0a2+/+fiaGTC3ai/919UQH8kVVh3AwdRd8L/jDGZ1cT9Q0SeQ8X3MeAtEZkATDDG/Os/SES8aAjcEDR5ozOaqDGqdinvraPaFhs0cOjcm8ObtQ5rWafktAsqh7x9QaWQmSLyljFmbQZju+4Fl0KHK7qnFxcD6S5i+TxUikmyf4z0WTv4r3iuT/P7IdS/Os251gBjTEx61xSRrcBtp5qUk/b7KRqi1gSNOFgjInPRDLnyaJLHAaCPMUac689Fs9N+DfVaD4564el/UXfE5cAc4Gnnmhc5Y6TFdS+4FDpcn+7pRYZt1lNsCPdaFVCBC3WO3QdsAP4wxqwwxhwwxqQ4hcn9i28LMqmBsJXsJ0isMMbcD9RCreXvUbfDAqCLX3CdY1OMMa+jRXNeQq3xN9Evg1HoF8Q2NHstPVz3gkuhwxXd04uP0LjXtNhlwq1txUOtf4DS6N+9BFpL91U03OuAiCwRkfedTg4d0dCtucAvItIwnevuAKqmqf+QKSJiiUh71FL9H1pZrCOaDLFVRN4VkWaB5xhj/kDbAoWhC36vooI6Hk0ZvsW5Zlpc94JLocN1L5xeDAOu99rJtZKSky3sZEhJtlOSEo7tPRDdxZirVolIfaAbmv1VCZiKtkzfADRAU4QbollrZ6PW5SFguYh8CcxDq4CtM8YcEZF9aAzwtlNNzilHOcw5fgjwhZPODNrqpzLaO+1bEdmOuh6+cmr0HgfucFKHX0fThG93jnkR+FBEmjqpxn5c94JLocPtHHGa8cX3Cx986Y13hi2f+2XpNE89Z9v20MAdAQLcDY2lnYpGHizxi6GT5VYPFelH0RTgCFSQjzs/C7AQWIcK8vYAMUVELkBdAI1Q3+1HmXWHcCznzmh3ieZoQse7TllL/7ynAEeBZoAPjXYIA27wxyKLyBrgRmPMmlO/cy4u+YMruqcRTuzsOuA2Y8xPItIKjRJokoVzsyLATVBxGwO8clWXq6djeTonxMd7IooVj+1x43Xbbr311pKoq2ADujhXC7WoxwOvGGMOZfM11QfuA3qi8b7voOFsIaif92bURx2OZsiNNMa855y7HvUTr8/OmC4ueYkruqcRIvIgKjKdnN9D0IiABk6rnKxeJz0B/hJNaKgMzPxxZ+LOdxasaxtRtmpIijfUG39ge9zeTweFh9dscu337w7bgbYDugTNkjsK1He2g6g1/A+plvE/wK60fd/SzCkCrcn7ANryfRxqAbdEawv7hTcWuKjrwNGJtZJ2rFn15+/Ytr0PeNK27U+z+h64uOQVruieJohIJGpddnUWnvz7vwE+McZ8kcPrniTAf+9L+nX0X3EfJKbg9R+XeHAnez57kmod7or9qN9VMZZlvQG8GZgF58Ti1kR9xmcHbA3R+OD1pIqwX5Q3GGP+E5UhIi3RsLPrUMv7c7SFfMu4JNv37vK4mDkTXirutWxv6Ssfjo/bvnLF/qkvnA12a9u2V+fkfXBxCRau6J4miMjjQGtjzA1p9j8CnG2MuS8IY9QHun26Nv6h+dsSKyfZcPCHsUSvnI+dFE9opbOoduvwhGpli12/+OlOM7N57dKkinGgKNdF44fTWsb/AIloMZ/7gWhg28u/xVy9YV+MtXlUD6reOQZf2WoAiftnvBwfs+HXd+zkpCdy+z64uOQGN3rhNMBp4jgAbbOTlgXAg8EYxxizAXip56yZFwFXA5Tr8ABlL7+X+N3/ELd9JZ4Qn++SaiGjRWQQeqsf52yxaR4z2ncIXZT73vk9EfUR10D9w63RqIVz0LCxf9DKaknrDiVfuPlIihV7cBeWx+MXXABfaOX6KfF7NqYXVubikq+4ont68DAw1xiT3q3zKqC0iNQ0xmwP0ngbUTH0AVgeL+HVzyV69UIOLfsucUuVG0cBf6M+1og0j4E/l0tnX3rHpd0X5owfj/qJ6wHWpiPJkSk2pCTEYoVF/mfCnvDiYd7Q8JNaxru45Deu6BZxnJbrDwMXpfe8MSZFRBaicbcfBmnYd9GIAt9/9qakkHhod/Jve5LGfp5JSFhucer1hpEqxKWAi2OT7Lsti4s8oRGWHf/f5Dw7IYZKlSpVEJGdaOfhtcAa/6Mx5nBezdfFJRBXdIs+jwPTjTEbMzlmAep6CIrobh3eeV3V3m89k3hwx8sR9VphhYSGxm/7OzF6rfiK1T1/8NbhnfM0C8ypH1wVTVW+EjDA+nY1ffasLYlWSJlq2CnJJB7adcLFkLR/C+fWq52MCnQdNFOtBlrY5xwRiSaNEDvbvsyiKlxcsosrukUYpzvEvWgCQWbMB54WEStYAvLvBw9/bIWEdcd+symWlWj5wg/06tUrtuetN0cH4/ppcaIzDCqyndCiPLPRtkErgXvLhHs+L+azvk1KCX8qskHr8CM/Tabclf1I2LsxNuqfJSHXPPjmcjSdOALNVDNo2/cRaDhcKJrA0QQNT2sEeJwki0AxXgvscMXYJSe40QtFGBF5A/AYY/qd4jgL2A60z8tEARE5F22l3iSwbGMOr2WhUQx+kb0Y+BNtMz8bFb870bY+PwLP+K39kVPmLf34j/0lN88YVTd224oQGw7aiQn9bDvlU6dW8CdoyvPfaNJGE+B64AgakzwVWOFY1BVQ8W2ELt75fy6Bim9a63hLYDaei0taXNEtoohIDWA50MgYsycLx38I/GKMyazTQjDm9TJQxxjTIwfnlkDdIJ1QsfWQKrILjDFHnSab3dAaDluAJ9PEJV8AfA2chRb0ecYY0yadsa5GfdPl0OiHR4FItO7vjehC3TRUgJemtWqdEDe/CAc+VkLjpdO6KTYaYxKy+564nH64oltEEZF3gcPGmEFZPL4n0NkYc1MezysSjZh4wBgz+xTHWmhTS7/ItkALp892trWBYicilwPDnV8HGWPmpXPNL9Evl9dFpBaaxpxu1IKTsXcfmk7sQ4v5DETF8nxUgG9AF+v8Avyz01suo9dUDI0vTivItdAviUAhXosWDkq3XrHL6YkrukUQETkL+A1omKaqVmbn1EBvzytlJhpBmt+VaK+z89IKioiUAa4gdREshlRrdpHT6y3t9c5HxbYOWrj8q/Reg1N+8ifU0o5yMuCigHKZCZsT5/wsmmJso00xBxtj1jlfDOeSKsAVgOmoAEtmhXvSjBGGhreldVXUQ2tUnOQ3NsYcy8q1XYoWrugWQUTkI2CTMea5bJ63Hq26lVkH3aAgIlOAzcAzwAWkimxjtI/aLGB2ZlEXIlIPdSNchlYpe88Yk5jJ8e+jC1xDA/atAXpk5TWLSE3gFeAqtFD6NOB5Y8ymgGMaoP7fG9AC7t+gAjwvJ+4Dx9quy8luinOAw5zsplhrjDmQ3XFcCg+u6BYxRKQRulhVL7uWkIiMQ29nR+XF3ALGqYiWgnwVTc/dS6o1u9gYE3eK8yujlmd3tIvwG8aYqFOc4/dx1w+0/kXka+BDY8y0bMz/Qmfcumikw5fAMGPM1jTH1SZVgBuhFvJXwJy09SKyi+O7rsl/F+/8PydwsptiDfCvG1FR+HFFt4jh+CyXGmNeycG5NwG3G2OuDvKcQoBWpFqz9dHY4Fg0SqBVVlwazm3+42ja8ofAS1m16pxIjmRjTP80+19DY21HZPkFccLffD0wEg0vqwB85sxpRzrHV0UL8NyAWvZzUAv4+8CiP7nFmVcVTvYZN0ITRtILb9uWE5eSZVl90doWjYHPbNvuVXvQzEZApX8/fKRswp6NL6JfDL8BvWzbPmUhexdXdIsUTrjTTNTKzfbii2OBbkB9nLlKYBCRamibnSvRRpHbSF0A+8UYk+D4VJegboH3MrlWGFq05knn/MHGmCx/gEWkPFqhrLExZlea5+4DWhhj7srO60sztweBp9CwuzpoyNnLxpjdGZxTAbgGFeBL0FoSU9H283mW+ea8D37XRKB1XBatUZE2vG1TZv8HlmVdD6QAHT2RpSrXeGhyfaBOcszRpF3v3l2y9KW3/WynJHU5snDiU8Cltm2nmxXp8l9c0S1CiMh36K3r27m4xgrgbmPMb9k8LxQVEL81Wx3tnzbbmVO6cbki0tQ57ry0NX0dUb4F9deuQsO/VmbvFYGIPA9UMcbcnc5z7YFn0wsby+YY5VCXx+3AauA84ANghDFmbybnlUaLA92AhsP9jArwDGPM/tzMKas4dxBnc7Kboira7j6tdbzeBHRX9oQVezWy3oV9y1/9eChgHf97NtEr51H59lfjgHnbRnTpgdZtbm7b9j/58ZqKMm5GWhFBRFqjt3k3nOrYUzAf/fCfUnQdn6VfZNui1tJsNMzq96wkARhjljsxwq+hguW/Re6ERiREoS6PxTl5MU5s7wNo9bH02IC6O3KF4yd+RETGohls0ah4rRWR99CuGCe5Qox2Vv4Y+FhEiqOLdDcAI0XkL9QHPD0jqzkYOL7/353tBE54XwNSxfgm57GOaI+6NcDa6k0uufJQbFIIurhI4oFt+CrWAQ2la19r4HfVto3osgmN8nBF9xS4olt0GAa8EGiB5JAFQD+0s8N/cLozXEaq0JZFfZNfAHflYtV8KLDaibONQkWrAnrL/nUuF3/uBeY7ZSfTYydQVkSKpReOll2cjL7rRMSgDTK3omFf65yFytcyaknkLAZ+AXzhvNcd0ESMF0RkLWoBT0u7YJdXOC6qv53tBM5dTT0cq9iOKFmLuCMnCtanJMThjSzl/zUZ9ecfRbP0XE6B614oAohIOzR7qlFmIVNZvFYpVIgqkFoa0S+y/0MjAGaj0QZ/Byum1/GtjkRTbYdwiuaUWbxmGBqW1sUY81cmx60GbjHGLM/NeOlc1wPciiZXLEe/UC4HRqMRF0eyeJ1QoD1qAV+D+senAlMLQ3+34o0vXwmcV77zowAcmvcudkoy5To8AHAMuH3biC4vAkNt255acDMtGriWbiHHuRV/ERiSW8F1SEY7MXwGNEWLvMwG3keF6UgQxjiBs+A2FLgWzcj61hgzMUiX7wksz0xwHTaglltQRdf5QvpYRKYCj6GpxFPRW/YNTkTFW6eKXnDie2cBs5wvp8tQAV4kIgdJrQexKr9DwkTEWzMyOWZn7AlDF1/5WkSvmu//1To4Z8xPaNq12wopC7iiW/i5Cr1t+zwnJwdkVPkLx1yINocsDnQFVufFB9nJPBsE3AVMQIWoGPC3iHxsjMmV788JU3sC6J2FwzcSBL9uRji36cOc5IznUat1LPq+b3LC1kZnxb3hWP8LgAUi8hDqq74B7QUX7wj8VOCPvBbgr7/++vzw8PB36lUqUXXHml07U5ISylgeb7HIBq05vHAi8euX0Lx58xdn/T1rILDCXUTLGq57oRDj3L7+gWZFTc/GeaXRD76/pkEijiWFhi+1Ri3n/+XBnCOAh9D2QdOB5wLDuESkHxr/2jY3oiEiNwMPZuU1iMi9wIXGmDtzOl52EG1V/yoaw/o2arkaNNttXA7D/Sy0NoU/HdlHqgX8azBTu536EUMmTJjw4OTJk//TgqPEBVdvK3v5vfFRqxfuiFk0oXFSfGwF4JfExMRbbdveGqw5nM64oluAWJYVhlpEl6OLVhvxeJ+uNeDr9YmHdoUw87lJ8fHx5x88eDAUaGvb9qL0ruOIczNSRbYZWoPAnwW2IU3hmEhgH1D5VJleWcWxPHuiroTfgafTs2adMLHfUMvvgxyOZaGLP08ZY07ZANPxiQ8xxpicjJcTnDleiUZt7EFbxvdAO3wMB8afKjPvFNf2R7LcAJQhtR7E4tz4ykXkKmAMGl/dP7NwOOf4l9DX1CG3PvozBVd0CxDLsoqhFuEHwPYSF1z9QtSKuU9W6TM6NqREOZJWzAyrU77EpCWfjuoC3Bwouk4gfAf0g90RzdP3i+yPp0pDFZFFaIzprNy8BkcArkUXk/YCA08VAyxafvF74NycRESISGdnvGZZsZadmgq/GmOqZnes3OJ8Gd2FfhnNAqagyRbN0dcwMbcRKU6hH78A10BLW05Fy2FmqR6EiFQB3kSrq91vjJmbxfO8aMLO6rTZgC7p44puIaH2oJlXAV/untg3stQlN1Os4SX+p2K2vXpdTKjX6v7DDz/EkhppcDbqKvAnJ2zJzngiMhgoYYwZkNM5i8hlaPhXJOq/nZ1Vl4GzyFTSGNMnB+P+BIwxxnyWxeM9aGRBxWBZ9tnFSVB4ErgHjW5YgL5n56DhgB8GY6FUROqQWg/ibNQXPBX4Ib0vYue9uRf1RY9Ha0xkq26EaJ++pWgSyqe5ewWnP67oFhJqD5q5Ojn6cKOd7/Shau+38JWrceK53WPvSBk+9OmoCy64YCupqbZLclLVyo+I/A940xhzQQ7ObYLG+TZCs7Q+za5P0UlqWAPcZoyRbJx3KTAJODs7t7Misgq4NdhhY9lFtMbvy6iP91k0fXkoWlzneeCTYN2mO5Ej/noQzdH/m6nALKOlL5ugoYgpwD0m/W7SWR2rCZp40yEL0SRnNK7oFgJqD5oZYScnHd/35RBvSOkqlLuy73+e3zmmJ+fUqdpt5YoVXwVrTCc29ABQO6Ng/nTOqY0KQ0c0jO3d3Nwai8h1pLoJsnQdEfkeTaEdn82xZqCCFrT3MDeISCvU31sc6I82ynweLWbzHDAlKxl/2RivIuoGugH1we5Fu1w8i/rXc70QJyLdUX91y1wk0pz2eAp6Ai4Qu2lZ8oHvXvPgDaHsFfele8yqVauD+k/sWMlLUIsrU0SkvIiMQiMptqDlE98KQnbcDDSG9omsHCwizdDY4px0NQ5KOnCwcPzel6KuhfFodbV70cI/DwIrReQm5/Y/GOPtc76o3kATVA4AvzrjfycidzrrBLkZ43O0DOYUx5ftkg6u6BYwlmVZ+74a+m7S4V2HKlz7VIrlPel/NdlOSojFzn1EkGVZfS3LWmZZVrxlWR8AC5Jtu70nNKKnZVlRAVuMZVl2jRo1LhGRZ9B8eh+aETfEBKmjgeP/7Qs8LCJZEcQngVE5FHt/gkShwRhjO5a3v0byYtQdcA2aaPE4sFxErncWLHOMiFQRLSw/GnUlXGyM6QhUAz5C1wk2ich8EblftKZxTngSdVe8lJv5ns647oUCxrKscUCzij1evCeiVlNBEwh8AHZSQqJt20d3jOqWhJ3SE+16G2/n8I8WWKrPCo0s23jgl6WjEu0rkm1stNrUk1uHd54aFhZ2p8/nG/7dd98lWpa1CF0g2ZTZtXODiPRHP/QdMlqIc0T5Z6DuqTK8Mji/LRozfFmuJpuHOJXMBqOV115BY3wvR90OoOnT32X0HlmWVR9tR/+Vbdu3Odf0oIt3L6BJKsMyihN2Qgk7oi6IzmjlN389iO3ZfB1L0apxOUrqOZ1xRbcAsSyrFlowJR5IAsvCGxJarsMD0cWbXBG7482bi6XEHU9bRKROboPQveHFXwuv2+L+Cl0H+PhvVmLMhZW9H6957/E7GjRosPvhhx++yRjzZ27GygrOregyYKQxZnIGx0xAOyMMzuEYNdDKaFVyPtP8QbQl0CuoK2UQWiTnWtTXG4cK8xxjjF170MySwCNArz2fPVktJfrIkeSYo78lxxztKiKN0YUyG7jXGLMqG3MI47/1IDaTWg8iwxZLAec3Q0t6tjf50B6qKOGK7hlIZIOLxRMafkn5Lv29aZ/zRO1N3jLmTguoZ9t2tsLQcoOzsDQDjd09lOa5aqgF1yCnCzSFIWwsuzjW+Wuo0PZHk0puQMX3yI5jycOfWRI7EqgZvUbCY9b/gq98DTvx0K7kIYOf/bRVFd9VaCPP93KzUCYiPtT3fwPq/thLajbcmkzuTvy1kltmdbH2TMD16Z6BhJSq2AjLc5LgAhz6e16SJ7z48vwUXDixsDSN1BbrgTyGxrHmeDHREZ1NFDK/bmYYYxaiqb/vogtUn6J3BI2B0T/vTprotaiXEh8TfuSnyZRpdyeAZVmekCn/JFyDdtIYn9vIBGNMojFmnjHmftQH3BfNoJyF1hMeJiLN0/qdnZjdGcCnHl/Yz5bHm2h5fQmWxxtrWda63MypKOOuMJ6RZHx3E716oS+0Yt1TptYGk8BeXO3bt08CPuw5K+rXXRPuNRzfNzg8LOyy6Ojow7ZtVwf62badbpeKLOAvfPN3UCaeDziC+aGIfIVau8uA94CXvt+S+BJQ7sjijynepAMhJSucOO9QnB3ac1ZU+NYgJz47YWyLgcUi8ijQErWAvwQ8AQV5fnfmPvCbjfGrwqo0aBDZqE1SiWZX+lDL3Vd70MzqW4d33hncGRZ+XEv3DCTp6L7V2CknxYDG7VxDctRhD5bn9Xye0m40dGnihk1b/piwIu4b4FjZdnfNKXfVo627PDvpL1+VhrWA42hiRE4pdBEMWcUYE22MeR61cssD60I9lE3Yu5m4rcsp2fKatKckoZmCeTkn2xjzuzFmIPpldh3ajPR9YLuIvDVjQ0KvqRsSa9pgYVk+59QSpKYrn3G4lu4ZhGVZIUCIFRb5V0Sd8y+0kxJ8eLwhfk9D9Mq5SSFlKv8Wu/WvPGuemB62bU8DsDyelvtDK53zy+6k0oAn4qyWAPxyiHOq3P7q29tGdHkbyHL2WjpsIOO2PkUCo2197hSRpg3Leucs+W1liaRje9n5jla4tBPiwE5h96SHilXt/XZG3TTyYl42Wq94OTBYRM4Bbth2LPkVS9vYc0Q+5Ih8iK9sNUpfdntIeM0mZ9ceNPO8rcM7Z3mB73TAFd0zi2eAIXZ8DDH//MT2f36i1MU9kktfepsnJTH+n6hVC2qSkjykoCYXWrn+WR5feOlk+6Q7sAigR0iZqjuTDu/OTaHsjcAduTi/0GCMWd5n9sy2JZt1/LPYOZeF+/cf+30aSUf3pPR+4JHYbs2K9xKR9/K78Lkzv7XAsJ6zZl4LXFCmTW985WpgeX1Er/2RfVNfoErPN5J9ZaudhYamnTG47oUzCNu2h9q2bQVupS+9zQf4tr92fSM7Oam4bdvzT3mhPMJXttrZWJ50DYGEvZtJOrb/MbQqW04psu6F9Nj0cue1+MLbeYuXWe8rUSYxslQZOyQ0LJnogyuva1LxQrRh53TRlvAFxTogJaxqQzxhkVghPoo3bk9YtXOI3bzM327pjMIV3TOcrcM721uHdw5ajn8uSdciSzy8m31fDQ0r0bTDl7Zt56hrsMNuoJRTbOe0YOvwzr9sHd65YYpNwxolPK2nPH/v699PHl8jxGN1Q7s+r0Oz2jrl99xEpOaAluE1fB5OyqazsCgViufDTsXD8nteBY0rui6FhsSDO9Zgp/ynwlbS0X3snfIMpVp3Typ7xf05SozwUxTDxrLK1uGdt8wb1Om3K9q1eQK4AC3ruBJYizbPHCcio52sszxFRLwi8jDw53nlQ+YmHt7zVOzmZQl2UkK8nZJM1Kr5sXE7Vtodm9R8GfheRAafSbUa3OQIlwLHv8AH1pCIs1r0Ln/tkyUtjzciOfowez8dRPGmHRNKXdRt3NbhnR/O7VgiMg34zBjzZe5nXrgRkYvQNvERaBZbD7TE4215lWkoIs3RAj7RaBbcOsuyKuANmYvN2ZbHg+UL324nJfZLSYiZLSLVgYlAKeB2Uwi6H+c1rui6FDiWZQ1F6wqcoGTrm2ItT0j40SWfWni88aQkn7CAbdsuntOxRGQEcNQYc0YUZHESFrqhSSer0OiPgWim26vBKh/p76uGtmx6EpiUjYL2HtT/PNS5xtiCWPzLL1zRdSm01B4009o6vHNQ/0FF5C7gEmNMVroInzY4tRQeQgV3JhpXmwTcYYzZlstrX4n2+vsFeNQYsy+H12kIfIy2nupjAhqank64Pl2XQkuwBddhI6ehT/dUGGPijTGvou2BjgMNnMelInJrTq4pIpVE5FNUcO83xtyaU8F15rgOuAStJveXUxT9tMO1dF3OKJziOX8YY3JaL/a0QETORiuZNXd2LUZb2p9IjLEsqwd6u18T7Wjcy7btxY7Log/admgSWjIz223lTzG/lqjV+2faeRV1XNF1OaNwBCMKqBKsYuxFGac9/etARcACbu45K+qXY0u/Hnts6bSeFa4ZlBRapeHauG1/v73vi8FzFi1aVBwtwBOJFkP/Ow/nFok2Pr0WdTdkqUNxYccVXZczDhFZAfR0GygqThv124GRKbZd7OnFMYf/GPdY5eJNOnpKNO3gPyzmf9VCFt/dJLwFWlR9TDB7uJ1iflegEQ4zgIHBtqrzG9en63ImUqj6pRU0xphkY8wHQO3ZWxJnHYhJqpqwZ5MnJfYou969m51jenJo7juRS7ZFX/HTzkTj9MfLt4Qax8JtApQD/nRcD0UWV3RdzkRc0U0HY0z05+sSUmKOHYGUJGLWLaHSrSOo0vstEvZu5tBPnyZNWBnfuIDmdtgYcwvqY54pIkOd4upFDld0Xc5EzsgIhiwSZvk0M7fE+VcTUrws3shSlGh5LXFb/vS1rhrSWkRKF9TknJ5rzdFqcUucMLMihSu6LmcirqWbMdO94cWjvSXKc3LFBKxr64U2AXaIyK8i8oKIXCYiofk5QSd+90rgA1R4+warVX1+UGQm6uISRFzRzZgpwN7i57VPOf7HdyRHHyE5LorjS2ek+CrU/qv7VW3bAhWAp9DSsK8D+0XkOxF5WEQa5bZdfFZwCqiPReN6bwdmO+GAhR43esHljMMNG8uc2oNmVrCTEt45NH/CtdFrxWt5fXZoxbpLsVPaxm79+6TIAREpj1Y0u8LZQoB5aDfgecaYvXk5X6dYzlNo77aHjTGf5eV4ucUVXZczEhFZDvTOjxbzRZXag2YWA0oD+7YO75yYlXOcL7R6pApwG2AbqSK8OK9CvkSkBZpQsRx4oLB2IHZF1+W0J7DxJfCZbdu9ROSr48ePT7v66quvRzvu1gLa2ra9qOBmevrhWKEtUQHuADQDfkUFeC7wd267FacZLwIt7nMDcKcxZk6wrh0sXNF1Oe2xLOt6IAXoCETUGvidlAy1Xo2KSyhx+Ndph6yQ0PcPL3y/D3CzK7p5i4iURK1fvyVcDpiPI8LGmO1BGudyNKHiG+CJwpRQ4YquyxmDZVnDwms17Vapx4vVgGIBT0XveKMHKfFRXVzRzV9EpAapAtwerTDmt4IX5sbnLiJlgNFoUffbjTFLcz/j3OOKrssZg69M1XfDqp19Z/ku/b1pn9s55g47tErDXjHrf/6oIObmcqKublNSRfgiYAWpIvy7MSZLvuU0170JeBt4B3gxJ9cIJq7oupwxRDZoLZ6wyEvLd37spJCmnWN6Uurim947OGfs3QUxN5eTcfyz/yNVhOugRdj9Irw+G4XSqwHvo+6M240x/+TJpLPAGdOXyMXFsjwesDKOIbW8RTKt9HTFGBNLqsAiIhVRF8QVaDF2W0T8z883xuzP5Fq7nOac9wM/ichzaNGeoC3iZRXX0nU5YwitVPej0Aq1by7fpf9JxsbOMXfYEfVa9Tv+1/ejC2JuLtnDCU1rSKoVbNCmo34R/skYE5fBuQ3Q0LJjaNjgznyZtIMrui6nPamNLxkSUe/CO8tfM6iE5fGGWx4vdlIiNnbcrnd6e1Jij12Nbf8IxNvuB6NI4RS/aUWqCDdG2wf5RXhFoFXrhLI9+cUXXzwxefLk/UePHq2GE05Ye9BMD1Dp+F/f24d+GDsYuAnwActt274st3N1RdfltCe9xpelLu6RVPrS2+J3vtM7MvnY/rQuhzq2bW/Nr/m5BB8RKQW0JVWES6GhaT+goWm7AC6++OIB7du377do0aK4pUuXLq38yFRB6wWX3P/tyNCU2OP7Ixv+r+uh2W/9ATSzbfuP3M7NFV2XM5Lag2ZGojUE9m0d3jm2oOfjkreISC3+G5q2j1Qr+Lfnn39+5r8xNIs1jyXbEJ54cCf/fvQo1R/4MMUTFnkEOHfr8M57gjEXV3RdXFzOKJzQtOakivCFr74+6vCizcerl3MiW6JWzefYb9MIr92M6NULsLy+/clRh+63bXtqbsd3oxdcXFzOKBzf7h/ONlxEIldu3j3DokQ1nIKWyccPknhgG5ENL6b6gx8Rt21F7L4vh3xoWdYa27bX5mZ8t7Sji4vLGY0xJmb3v3t2pNj2iRZEVkgoeEIodXEPLK+PiLoXHAMWovUjcoUrui4uLmc8iYd27rHtlBOi66tQO/DpWLRgelBwRdfFxeWMxbKsEMuywrFtT8Kejb+lJCXE2CnJhNc4j5CSFTj68+dJdnLSzl3j71mBFurJddUydyHNxcXljCW9cMISF1y9rezl91ZI2Lclfv/0F+OSjuwphdYEftq27em5HtMVXRcXF5f8w3UvuLi4uOQjrui6uLi45COu6Lq4uLjkI67ouri4uOQjrui6uLi45COu6Lq4uLjkI67ouri4uOQjrui6uLi45COu6Lq4uLjkI67ouri4uOQjrui6uLi45COu6Lq4uLjkI/8HdlACcSQ3hkUAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "NameError", + "evalue": "name 'printer' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;31m# Run MCL algorithm\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrun_mcl\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mA\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 9\u001b[0m \u001b[0mclusters\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mget_clusters\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mclusters\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mrun_mcl\u001b[1;34m(matrix, expansion, inflation, loop_value, iterations, pruning_threshold, pruning_frequency, convergence_check_frequency)\u001b[0m\n\u001b[0;32m 233\u001b[0m \u001b[1;31m# Check for convergence\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 234\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mconvergence_check_frequency\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mconvergence_check_frequency\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 235\u001b[1;33m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Checking for convergence\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 236\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mconverged\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmatrix\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlast_mat\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 237\u001b[0m \u001b[0mprinter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Converged after {} iteration{}\"\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mi\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"s\"\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mi\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;34m\"\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'printer' is not defined" + ] } ], "source": [