From 416012c77ec35c3ed1638c3a68a976736b6be5f2 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Fri, 10 May 2024 21:21:25 +0530 Subject: [PATCH 01/18] uploading notebook --- PennylaneTutorial.ipynb | 521 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 521 insertions(+) create mode 100644 PennylaneTutorial.ipynb diff --git a/PennylaneTutorial.ipynb b/PennylaneTutorial.ipynb new file mode 100644 index 0000000000..6ae77bb4cd --- /dev/null +++ b/PennylaneTutorial.ipynb @@ -0,0 +1,521 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Classification with GPU-quantum embedding kernels on Covalent Cloud" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Quantum support-vector machines (QSVMs) are essentially [traditional SVMs](https://en.wikipedia.org/wiki/Support_vector_machine) that rely on [embedding kernels](https://en.wikipedia.org/wiki/Kernel_method#Mathematics:_the_kernel_trick) evaluated on a quantum computer—a.k.a. [*quantum embedding kernel*](https://pennylane.ai/qml/demos/tutorial_kernels_module/#training-and-evaluating-quantum-kernels). These kernels provide a unique (and perhaps classically-intractable) means of measuring pairwise similarity.\n", + "\n", + "Using GPUs to simulate quantum computers is worthwhile when qubit capacity and/or fidelity requirements are not met by the available quantum hardware. While QSVMs are relatively tolerant to noise (an important reason for their current popularity), evaluating kernels on *real* quantum hardware is not always practical nor necessary.\n", + "\n", + "In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on Covalent Cloud." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let’s start by importing the required packages. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import covalent as ct\n", + "import covalent_cloud as cc\n", + "import matplotlib.pyplot as plt\n", + "import pennylane as qml\n", + "from matplotlib.colors import ListedColormap\n", + "from pennylane import numpy as np\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.inspection import DecisionBoundaryDisplay\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "\n", + "# cc.save_api_key(\"YOUR_API_KEY\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Covalent Cloud allows us to create [re-usable execution environments](https://docs.covalent.xyz/docs/cloud/guides/cloud_custom_environments/), as shown below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Waiting for environment pennylane-gpu to be ready............................................................................................................................................................................\n", + "Name: pennylane-gpu\n", + "Status: READY\n", + "Estimated Time: 1002 seconds\n", + "Notes:\n", + "\tpip was added to the dependencies.\n", + "\tPython version 3.10 was added to the dependencies.\n", + "Environment file contains:\n", + "==========================\n", + "channels:\n", + "- conda-forge\n", + "dependencies:\n", + "- python=3.10\n", + "- pip\n", + "- cudatoolkit>=11.8\n", + "- pip:\n", + " - cuquantum==23.10.0\n", + " - matplotlib==3.8.2\n", + " - Pennylane==0.34.0\n", + " - PennyLane-Lightning[GPU]==0.34.0\n", + " - scikit-learn==1.3.1\n", + " - torch==2.1.2\n", + " - covalent-cloud\n", + "name: pennylane-gpu\n", + "\n" + ] + } + ], + "source": [ + "cc.create_env(\n", + " name=\"pennylane-gpu\", # identifier for referring to this environment\n", + " conda={\n", + " \"channels\": [\"conda-forge\"],\n", + " \"dependencies\": [\"cudatoolkit>=11.8\"],\n", + " }, pip=[\n", + " \"cuquantum==23.10.0\",\n", + " \"matplotlib==3.8.2\",\n", + " \"Pennylane==0.34.0\",\n", + " \"PennyLane-Lightning[GPU]==0.34.0\",\n", + " \"scikit-learn==1.3.1\",\n", + " \"torch==2.1.2\",\n", + " ],\n", + " wait=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we'll define our resource specifications by creating some [executors](https://docs.covalent.xyz/docs/user-documentation/api-reference/executors/cloud_executor) for this workflow. Both executors will run tasks in our new environment, named `”pennylane-gpu”`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks\n", + " env=\"pennylane-gpu\",\n", + " num_cpus=2,\n", + " memory=\"2GB\",\n", + ")\n", + "gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations\n", + " env=\"pennylane-gpu\",\n", + " num_cpus=4,\n", + " memory=\"12GB\",\n", + " num_gpus=1,\n", + " gpu_type=\"v100\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On to the algorithm!\n", + "\n", + "Here's a function returns a simple quantum kernel based on Pennylane's [IQP Embedding](https://docs.pennylane.ai/en/stable/code/api/pennylane.IQPEmbedding.html) template. We'll use it as-is inside our workflow." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "QML_DEVICE = \"lightning.qubit\"\n", + "\n", + "def get_kernel_circuit(n_wires):\n", + "\n", + " @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None))\n", + " def circuit(x1, x2):\n", + " qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4)\n", + " qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4)\n", + " return qml.probs(wires=range(n_wires))\n", + "\n", + " return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, each function destined for remote execution is decorated with `@ct.electron`, with an [executor](https://docs.covalent.xyz/docs/user-documentation/api-reference/executors/cloud_executor) specified therein. Only tasks that evaluate the simulated quantum kernel should require `gpu_executor`. For example, we don't need GPUs to generate our input data:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "@ct.electron(executor=cpu_executor) # lightweight non-quantum task\n", + "def get_split_data(n_samples=18, test_size=0.2):\n", + " centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]\n", + " X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False)\n", + " # rescale labels to be -1, 1\n", + " mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1}\n", + " y = np.array([mapping[i] for i in y])\n", + " X = X.astype(np.float32)\n", + " y = y.astype(int)\n", + "\n", + " # X_train, X_test, y_train, y_test\n", + " return train_test_split(X, y, test_size=test_size, random_state=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Classifying with the SVM, on the other hand, requires $O(n^2)$ kernel evaluations, where $n$ is the dataset size. Accordingly, we'll use GPUs (i.e. `gpu_executor`) to speed up this process." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "DISP_SETTINGS = {\"grid_resolution\": 50, \"response_method\": \"predict\", \"alpha\": 0.5, \"cmap\": plt.cm.RdBu}\n", + "\n", + "@ct.electron(executor=gpu_executor)\n", + "def classify_with_qsvm(Xtr, Xte, ytr, yte):\n", + " kernel = get_kernel_circuit(n_wires=Xtr.shape[1])\n", + "\n", + " kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel)\n", + " svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr)\n", + "\n", + " # train/test accuracy\n", + " accuracy_tr = svc.score(Xtr, ytr)\n", + " accuracy_te = svc.score(Xte, yte)\n", + "\n", + " # decision boundary\n", + " cm_bright = ListedColormap([\"#FF0000\", \"#0000FF\"])\n", + " disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS)\n", + " disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright)\n", + " disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker=\"$\\u25EF$\")\n", + "\n", + " return accuracy_tr, accuracy_te, disp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Putting it all together, we can define a QSVM training and testing workflow. This special function gets decorated with `@ct.lattice`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "@ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor)\n", + "def run_qsvm(n_samples, test_size):\n", + " Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size)\n", + " return classify_with_qsvm(Xtr, Xte, ytr, yte)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, to dispatch `run_qsvm` to Covalent Cloud, we call it after wrapping with `ct.dispatch`, as usual." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/rich/live.py:231: UserWarning: install \"ipywidgets\" \n",
+       "for Jupyter support\n",
+       "  warnings.warn('install \"ipywidgets\" for Jupyter support')\n",
+       "
\n" + ], + "text/plain": [ + "/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/rich/live.py:231: UserWarning: install \"ipywidgets\" \n", + "for Jupyter support\n", + " warnings.warn('install \"ipywidgets\" for Jupyter support')\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n",
+       "
\n" + ], + "text/plain": [ + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663\n" + ] + } + ], + "source": [ + "dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2)\n", + "print(\"Dispatch ID:\", dispatch_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what we get when we query and display the results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/covalent/_workflow/transportable_object.py:205: UserWarning: This figure was saved with matplotlib version 3.8.2 and is unlikely to function correctly.\n", + " return cloudpickle.loads(base64.b64decode(self._object.encode(\"utf-8\")))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train accuracy: 64.7%\n", + "Test accuracy: 76.9%\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGeCAYAAABGlgGHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACMP0lEQVR4nO3deXiU5dX48e8zM5nsC0lIAiEJCUvYIayyCSIBd+lirbXF/e2ifbV0xZ99rdoW+/a1aqt1aWu1tajVFmzdIEJZIii7AkJYEgiELCQh22SZzDzP749hhkkyk8wkk1mS87muXJCZZ+a5k8xy5j73fY6iaZqGEEIIIUSA6AI9ACGEEEIMbhKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQhkAPwBOqqnLu3DliY2NRFCXQwxFCCCGEBzRNo7GxkeHDh6PTdTP/ofXBmjVrNEC7//77uz3u73//u5abm6uFh4drkyZN0t59912vznPmzBkNkC/5ki/5ki/5kq8Q/Dpz5ky37/O9nhnZvXs3L7zwAlOmTOn2uB07dnDLLbewZs0arrvuOtauXcuKFSvYt28fkyZN8uhcsbGxALz3k0eIDo/o7ZCFEP3MWF9KxuIZRI4ejzV6CKctUeh1egqKqtj/2WkmpsX5fUyHKxpobbcCEBGmB+hxHIcrGsibkkV+bgpW1UqWoRm96QItJ45wZstezPGZ/TpmY30pAImjhxM793IMiUM5ZVL4z2kTKApoGkvGJpM9JKrLbdXGaiy151HPHOfMlr0A/TJeY30piaOHEz1iGLqMMZwNT0EJj2TzsWpQFJaMSUJra2FktIb50x2YzpZTe+Jcv//uhO/0+Dj0QGtzEw9/eaHjfdydXgUjTU1N3HrrrfzhD3/g5z//ebfHPv3001x11VX88Ic/BOCxxx6joKCAZ555hueff96j89lTM9HhEcRERPZmyEIIPzC2hhMXHUVkbAzW6FhiLNHodXoio1swRkQTERXjt7EcPFcPwLy5k9A0FQBF0bFnfwnH66xMHh7v9rbGCCuR0bHExMZhVa3EGfTode2ERUcREx6Oub9fhyJyATCfOQWRu4jITGdK3kJiYmNRwm0ByKjEroEIAHFxqLGxWGJiiIuOoqm0jJpjZZgTRvp8jOYzpzCfqSErOooJmTEYhsQQMyMHgGyDCUtNM+qJIip3HgLAmJqL0bejEP3Jg8dhT5oaG3gYelxi0atg5N577+Xaa69l6dKlPQYjO3fuZNWqVR0uW758OevXr3d7m7a2Ntra2hzfNzQ09GaYQohB6uC5elrarSycPZr83GS0tmYAxwvo9l0nOHiuvtuAJBiYE0ZSc+wUNcfKyAIyM3MxRKegixva7e10cUNtL+5JKcSwHYCaY6d8HpDY7+/0h7tIGltGTGY62XkLAbDUVKGWFnH6w10djhWhx93j0BMNhmaPjvM6GHn99dfZt28fu3fv9uj4iooKUlNTO1yWmppKRUWF29usWbOGRx55xNuhCSEGOftsSOdAJCdaA6DY1Gy7TFMp3F3sOD6YgxJzwkiMdaccb/hxC5Y4XrjdBSUna5uBaACy8xYSl1lFTGb/BQb2NyvAEfz024yMCIjOj8OYzHTPbmfqh2DkzJkz3H///RQUFBAR0X9rN1avXt1hNqWhoYGMjIx+O58QIvTZA4uZedlomkp+brItVVBfhflYEXDpE92ycbZPdfa0TbDPktjf0G1v+JuJyUzHmLcQteF8l4DkZG0zG49WoSg6NE1l2bgUtIhUMjMha6k9SOifWRL7p+fO4xYDg/PjsOZYGcMWzO7xNu1tPR4CeBmM7N27l6qqKqZPn+64zGq1sm3bNp555hna2trQ6/UdbpOWlkZlZWWHyyorK0lLS3N7nvDwcMLDw70ZmhBiEHOVlrGtWaiioXCz4w3SOZWQnx0T8mkbXWYuBi7NkDgHInv2l9DSbkVRdOTnJlNKKjl5/knbGOt8f98ieNhnScoLd/V4bFObZ9GIV8HIlVdeycGDBztcdscddzBu3Dh+/OMfdwlEAObOncumTZt44IEHHJcVFBQwd+5cb04thBAu2WdE7IEIQE60hnm//U23rNPMgi2VkJmZSympLtM2LRd331hVq+M81uhEAJLGpvfLG7mnXE2XG/MWUmxSUMKjUBQd23edIDJMT+TF3UMbj1ZdnA0yocvMJQbb76W/ggYJRAY+T//G5tYWj47zKhiJjY3tsh03OjqapKQkx+UrV64kPT2dNWvWAHD//fezaNEinnjiCa699lpef/119uzZw4svvujNqYUQwq3l83OpaTYDtl0maoMJAHNrx+M6zCwshcxMuqRtAEeax35/EIXacB7jxfUXsNkR2ATijddVcJWTt7DDmhjnn2XZuBTHTJEsKhXByOcVWEtLSztUWZs3bx5r167loYce4sEHH2TMmDGsX7/e4xojQgjhS+52gNjTNvZZhM5bZ+2pEAMQt2CJY0FoIFMS7nY5LBuX4vg57Ckr8/7tsqhUBK0+ByNbtmzp9nuAm266iZtuuqmvpxJCCJ/pvAPEnrZxFYg4c942m0X/LQj1lKu0jT24cl7AK4GICGYh0ZtGCCH6g7u0DXRf0EkXN5QT5dXkBHnaRtIyIlRIMCKEGNRcpW2MFwt3uarjYavhAQUlTba1GEkpQZu2kdkQESokGBFCCLqmbTpvm4WOW2cVRUdBUbVtwWiEbdtssKRtAJkNESFFghEhhLioc9rGAo6ApHMND7i0BTg/N5liUzM5eQv7tY6HNyQIEaFE1/MhQggxeJgTRmJOGMnpD3fRULgZ8/7tqA3n0dqaHVuA7UHIwtmjHU34cqI1LDVVAB2qkAoheiYzI0II4YK73TbOdTw0Tb20a6VTtVeZmRDCcxKMCCGEGz0VSbM34ZMaHkL0jQQjQgjRDXdF0gBHDQ9ZLCpE30gwIoQQHuictoFLW2ft1wshekeCESGE8JBz2sb5MiFE38huGiGE8IJ9t439/0KIvpNgRAjhcy3HDjv+b1Wtjv8fPFffL+fb8FERABuPVjkqpBrzFmKMsF1vrDvl83NKICKE70gwIoTwGXt9jqbSMsz7t5NtMKG12draz8zLpqXd6vOAZPLweAD27C+hcHcxG49WUWKJptikYMxbSNbS2SSNTe+XgGQwMdadkt+h6DeyZkQI4VOe1OewVzC1BxJ9Zb+fg+fqKdxdjKLo3FZFtY9ReM5Yd4qksemA/A5F/5CZESGEz9kCkjJOf7gLtbSIzNZKsg0mlo1LQdNUZuZlA75P20weHk9kmJ49+0soKKqmoKSJEks0xryFxC1YQtbS2UD/pG0GIvtsSNbS2cQtWCK/Q9FvZGZECNEv3NXnyM+OQQmPAmD7rhMcPFfvsxkSsAUkB8/Vs2d/CS3tVscsSTA1swsF9tkQexfjYpMCIL9D0S8kGBFC9CtXaRtDdIrf0jbbd50AOjazi8usAjZLysEF+4xH50DEHkBK6kv0B0nTCCH6Xee0jaWmqkvapr8Wt7pK2xiSUiTl4IL992BPyxjzFlJiiaagpMn2+5PUl+gnMjMihPCLQKZtAEnb9KBzWgawBSJF1R1mr2bmZVNQVE1+bjLZSSmQJL9D0XcyMyKE8Cv7LAmA3lRLTrQGwFXjU1k4e3S/ndc+SwKg1+kdAVDk2InEZKb323lDif3vYqmpclymaWqX45wvsx/rXJVWCG/JzIgQQgiPZq7AtvZGa2sm22CSbsXCZyQYEUII4dBdnRgAra2ZzNZKzMeKJBARPiPBiBBCiA6cGwJmLYXMTDBEpwBgqa9CLS3i9Ie7HMcK0VcSjAghhOjCVdoGkNkQ0S8kGBFCCOGWc9oGkEBE9AsJRoQQQnTLOSCRQET0B9naK4QImJZjhx3/t6pWx/99XfxM9J05YaQEIqLfSDAihPA7c8JITn+4i6bSMsz7t5NtMKG1NZOfm9xv1ViFEMFL0jRCiIDobgtpf/WsEUIEJ5kZEUIETOeeNZmtlV161oCkbYQY6GRmRAgRUIHqWSOECB4SjAghgoKrtI0hOkXSNkIMApKmEUIEjc5pG0tNVZe0jSxuFWLg8SoYee6555gyZQpxcXHExcUxd+5c3n//fbfHv/zyyyiK0uErIiKiz4MWQgxc9i2kpz/cRUPhZsdum/zsGPJzk1k4e7QEJEIMMF4FIyNGjODxxx9n79697NmzhyVLlnDjjTdy+PBht7eJi4ujvLzc8XX69Ok+D1oIMfDZZ0kA9KZacqI1AK4an8rC2aN7fb/bd53ggyOVABSbFKzRiQAkjU3HWHeqb4MWQvSKV2tGrr/++g7f/+IXv+C5557j448/ZuLEiS5voygKaWlpXg2qra2NtrY2x/cNDQ1e3V4IIVyZPDyeg+fqHWtPNE1l2bgUsvMWEpdZRUymNIATIhB6vWbEarXy+uuvYzKZmDt3rtvjmpqayMrKIiMjo8dZFLs1a9YQHx/v+MrIyOjtMIUQogP74tc9+0so3F3MxqNVlFiiKY1IRZeZS9bS2TJLIoSfeR2MHDx4kJiYGMLDw/nWt77FunXrmDBhgstjc3Nzeemll3j77bd59dVXUVWVefPmcfbs2W7PsXr1aurr6x1fZ86c8XaYQgjh1uTh8UweHk9kmJ7C3cUUFFWjhEdRGpGKMW8hMZnpEpAI4Udeb+3Nzc3lwIED1NfX89Zbb3HbbbexdetWlwHJ3LlzO8yazJs3j/Hjx/PCCy/w2GOPuT1HeHg44eHh3g5NCCG8ImkbIYKD18GI0Whk9Gjb4rEZM2awe/dunn76aV544YUebxsWFkZeXh4nTpzwfqRCCNEPnAOSlnZbs75l41LQIlLJyUshC2gqLaPm2CkJSIToJ32uM6KqaofFpt2xWq0cPHiQYcOG9fW0QgjhM+7SNsUmpUvaRlI3QvieV8HI6tWr2bZtG6dOneLgwYOsXr2aLVu2cOuttwKwcuVKVq9e7Tj+0UcfZePGjRQXF7Nv3z6+/vWvc/r0ae6++27f/hRCiAGt5dilhe9W1er4v69rjdgDkj37SxwBSYkl2hGQZC2d7dPzCSFsvErTVFVVsXLlSsrLy4mPj2fKlCls2LCB/Px8AEpLS9HpLsU3Fy5c4J577qGiooIhQ4YwY8YMduzY4XbBqxBCOLMXP0sam04M28nOW0ixSSE/Nxnon5419rQNgF6ndwQ/kWMndgiKhBC+41Uw8qc//anb67ds2dLh+yeffJInn3zS60EJIYSd9KwRYuCT3jRCiKAnPWuEGNika68QIiTYd7LY0jZlxGSmk523kPzsGJTwKKB/0jaiFzQNndmMptehGcICPRoRAiQYEUKEFEnbBDGrlZSd2xi6YyvhF2rRgMZRY6lcnE/j6NxAj04EMUnTCCFCjqRtgpDVyqi/vEj6u+sxXqgFQAFii08w5k/PkrR7R2DHJ4KazIwIIUKSpG2CS/Kuj4g7dgSl0+WKpqIBmev+TsPYCbTHJwRgdCLYycyIECKk2WdJAPSmWnKiNQCuGp/KwtmjWT4/t1czJNt3neCDI5UAFJsUrNGJANKzxo2UHdvcXmcLUDSS9uz013BEiJGZESECwPnNTEqMBx/pWeMlq5WI6qruj9E0IivO+Wc8IuRIMCKEn9kDEXs1T3lTC07d9azJzISspdKzxkGnQ9Xp0Kmq+2MUHarsrBFuSDAihB8Z607ZqolmpmPMW4ilpkre1IKYfa3JwXP1FO4uRlF05OcmU4qtiV4M2wHkb6co1I+fTMKRgyhuAhJFU6mfMNnPAxOhQoIRMaiF1dcRcb4Sq9FIc3om6PXdHh9+vhKDqYn2+ATMQ5I8Po/zbIguMxdDUgrFJgUi5E0tFEjapmeVi5aS8PlnaNBlEaum09E2JIm6CVMCMTQRAiQYEYNSWF0tGW+/RXzRYRTNtuCxPSaW8iXLqb5sISgdX05jTxSR/v7bRJ0767isceQozl73BVrSM7s9l6tApMQSTUGJLccub2qhobu0TU5eClkM7hmu5owsSr52ByPf+AtYrKAoaAroVJW2xGRO3PmdHoN9MXhJMCIGnbCGesY9+xsMzU2OQAQgrKmRzH+9RVhTE+X51zgujztyiFF//UOX+4k5XUzu809x7L/upzkjy+W5Oqdlik0KiiWKgqJqCncXO46TN7XQ4C5tU2xqJidvYYcZLhh8AWXdpGkczBlD0r5dRJ47i2YwUD9uEvW5EyQQEd2SYEQMOmmbN9gCETe57bT/bKB61mW0JySCqpK57g3QNBf1EzSwWsn415sU3fuDLvdjrDvlWKTqCETCbYHI9l0niAyzvTjLm5rvtBw7jDFvIYCj225/8DRtY6wbfAGlNSqaqgVXBHoYIsRInRExqCgWC0n7PnEbiNgl7dsN2NIzxsb6LoGI4/40jeizpURUVbi9r8ixE23Hhkeh19kCkMgwPZOHxzN5eDyRYXr27C+hoKiagpImSizRGPMWErdgyaVgRupadMucMJLTH+6iqbQM8/7tZBtMaG3N5OcmU9Ns7pdqrPZZkj37SyjcXUxBUTUllmhKI1Ix5i0ka+lsqUkihIdkZkQMKvqWZnTt7d0eoykKxjpbOevwCzUuF+R1ZqytoTUlrVdj6rwWwT5LImkb7wSiZ41z2mb7rhMAHWa44jKrgM0ywyVED2RmRAwq1ogINF33D3sFsERFw8V/ewpE7Mf1hfMsyfZdJygoqkYJj6LYpDhmSeyfsuWTtnuB6lnjbobLkJQiM1xCeEBmRsSgooUZuTBpKkMOfeq+HoKqUjttJgANuROwGo3ozWbX9weYE4bQPKL7HTWecrsW4eKb2mBei+CpQPWskRkuIXpPghEx6FQsuYqEI4dsi1KddtOALUVTO3UGrWnDAVCN4ZRfeTUj3n+7y/3Y0zfnrroBepht8cZgelNTVdh6JId/fDKJU+eHEBfVyjXTirhx5ufERroOAD0laRshQoekacSg05o6jGN330fbxaJlmqKgYSvMVD17PqVf+lqH46sWLqFs+fWoBoPtOMX2tFHDIzj9pVu4MHWGz8c4GNI2FqvCj9ZezQ9evZZPTmRQXhfHsXNDeeq9BXzlqVs5WxvX53NI2kaI0CAzI2JQskZG0TgmF8OnJhRLO+aERKoWLqFm1twuBc9QFCoX53P+sgUkHP6MsKZGzPFDqJswGc1o7NdxDuS0zZ+3zGTL4VEAqJotwLNvoK5pimLVX67ljftf6/Ln8JY/0zb1tWFUno3EEKYyfoyCwaANihkuIfpKghEx6MQeP8qoV15E0VTHupGImvNkrXud6NPFtpkRF2kXNSKS2hlz/D3cDltIZ+Zlo9fpKbFEk52Ugj7CQBaXmu2FinaLjtd2TKVr9RYbq6rjZGUy+0qGMyPHN51e7WkbY0o67N9OTt5CdHFRkJsMQFKUkQ0fFfUqIKmvDWP9S5kc3j0ETbP9TFExFhbfUM6iG+BwhW3mRa/TYw2PAkyOLd81x8p88vMJEcokTSMGFV1rCzmv/glFtXZYwGpfO5K0bxdJez8J1PAGjdKaBOqbI7s9Rq9T2VeS7qcR9V5Tg4FnHhrP53suBSIAzU0G3lubwb9e6X5x87AFs/t7iEIEPQlGxKCSuH83OnNbl4WrzlIK/+PHEYlQt+VfadTXGlFV17M8H72fSl1FlJ9HJURokWBEDCrRpadAcf+wV4DIqgqU9r7t5PAXTYM9RxN5dvtyfvvBPAoOjqbdEvxP68ykOuKjWro9xqrqmJET3CkMTYNdm4aiuQlEAHQ6jROfDPfjqIQIPbJmRAwuOh2aAor7iRGbbgKWYHG+Wsct38imcPck9IoVRQGLqmdIdDP/e+v7TM/2zVqL/hBmULll3qe88OEcl+tG9DqV7KG15I0M3p8BwNKu0GLq/mVU08B0IQIw+WdQQoSg4H/FFcKHGkbnouumL42mKDRl5aAZgjtOt1rh+q8ksnOfbfrfqumxqLa+N/XNEdz30o2UVA0J5BB7dMfiPVwx8SQAesX+N9FQ0EiKNfHEynf7vJOmvxnCNMKM3TfkU3QaETHdtyAQYrCTYEQMKnWTp2GOi3dbEl7RNCoXXennUXlv2yYDBz4zYrV2fbdWNR0WVcer2/MCMDLPGfQav/ra+zzxjXeYM6aU9CH1jE+vYtW12/n7A2sZkdgQ6CH2SFFg+uU16HTup9pUq46cmeV+HFUvqKptCkeIAAnuj39C+JhmCOPEHd9mzB+fxWBqBGzrRDSdDkVVKbvqeurHTw7sID3w/r/CMOg1LC6CEbCtt9jw2Vh++qXNfh6Zd3Q6WDyhhMUTSgI9lF674sYKPt2RSFurvsvaEUXRmDCzjuSsBiCJD45Ukn9xK7E1OtFxXEDqxGgaift2MfKtvzkuasrKpvSLt/S66aMQvSXBiBh0WtOGc/gHD5G0bzfxhz9FZ2mnZfgIzs9Z4CgDH6zsxc9KzqVisYZ1e2yLOQxN61rDbaCyqgofFWXx7v5x1DRGkZbQyA0zjzAr56zjd2BOGEl54S6SxqYTw3aMeQvR2hTyc5MpKKp2VGP1ptZIUmob337kKGufHkXl2UjsjQIUncbMxdV84c7THK3GUfwMbCXitTZbiXj2bydpbLp/i59pGmP++Ayxxcc7XBxzuoQJT/6S43d+h8Yx4/wzFtEn/VHFNxBF+CQYEYOSGhHJ+XmXc37e5YEeisecq7Gaw3To9NGobpcraKQnNgyaQKS5LYwHXrmOvSUjUNDQUFDQeP/AOK6YeII1X91AmMG2LqU/etYMz2rh+08c4vSxGM6diiTMqJE7rZ64Ie0d7idYetbEHznkCESO33UvjaPGojO3MazgPVI/2sKYl37P/kefQAvrPuAVgWMPQuytBXzFXhUY/BuUSDAiRAixv6k1zC/n2NZst8cpisZXp2zz17AC7hfrFjsKpNl359j//c/hUTz53gJ+dMOl34c9IKk5VkbWUrAA2UkpLBuXwsajVczMy/a6RLyiwMjcJkbmNrk9JljK+4/66x8AOPmNu2kcnQvYei2VXfsFEg5/SnjdBZL2fkz1ZQu9ul+duY0hn+4l9uRx0DRMmdnUTp+FNVLqrPiSse6UbXYv0/aYt1fz9ZWYzHS/t5mQYESIEDR/WhglV53k0w9G2fYpO1X+1Os08sZe4KvTCzHWWQZ835PK+mg2fJrrtrQ8KLz58WTuXb6T6PBLu1r82bPGmXN5/4D0rHHaTdZlfZSiUHb1jeS89jIxp4q9CkYiy0oZ/dJzGJpNjtzgkM/2MXzjvyn+xj2OoEf0jXMgYsyz/X2638/l5f1fvE9/907yajfNc889x5QpU4iLiyMuLo65c+fy/vvvd3ubN998k3HjxhEREcHkyZN57733+jRgIYTN1++s5eZ7i4kb2uy4LCZW4/b/MrFhg5ncq6c7OvsOZLtOZHQTiNiomo4PDoxxeZ1zZ1/z/u1ktlaSbTCRn5vMglk5zMzL5uC5+n7r7GvvylxQ0uSfrsxOuTulveuWY4PJVg/F4sVsht7UZFsU3tKMgm1XmqLZ/iq69nZGvfICxprzfR35oGZ/LGQtnU3cgiUY8xZSYonul69AdAf3amZkxIgRPP7444wZMwZN03jllVe48cYb2b9/PxMndp0m2rFjB7fccgtr1qzhuuuuY+3ataxYsYJ9+/YxadIkn/0QQgxWMxfVMOPyGj4+1EZzq0b+suEYwlQqiQnIWoRAqKyP8ei4z0qH8aU5n7u8zpwwEmPdKU5/uKtD2iY/O4aCkqZepW084Zy2mZmXTUFJU/+nbRSF5mHpRJWXMfzD9yi7ZsWlq8xmMv/1JgD1EzzfVZa852P0ba0u2ywomgaqytCd2ym77ot9Hv5g1Hk2pNikoFii2Hi0CqUfCjQGIn3oVTBy/fXXd/j+F7/4Bc899xwff/yxy2Dk6aef5qqrruKHP/whAI899hgFBQU888wzPP/8830YthCDR1RdNZM3/5uhp49jMYZzYtYiTs5YgKa3PX0VBeZODufguXo+PezHN7UgMXLoBQ+O0kiIau32CFdpm5xQTduoKmEN9YBGe1xCly7UJV+7k4lPPEbq9s0YL9RSPWsuYaYmRv79rwC0Jg/1ajdN/OefdVunRFFVEg59KsGIl+yzEV0CkfAoCoqqKdxdTGSY3ufnDUT6sNdrRqxWK2+++SYmk4m5c+e6PGbnzp2sWrWqw2XLly9n/fr13d53W1sbbW1tju8bGoK/+JEQrjSV2nqr2LaQNl9sH4/HW0gn/effLHvhl44Xek1RmLT1XWqGj+Sth35HY3Kq41jnN7WZednodXpKLNFkJ6WgjzCQhe2NdqCZN7YUBRWt26yz4nF5/A6LW8Enu208YZ8lse+20TSV/GwvZ7hUlaEfbydl+2bC62xBmjk+gar5i6mav9gRlLQlD6X4ltvJee1lhhw6wJBDBy7dhSGM4/f8t1dj17W395AoA51FqtD2VkxmOrpM25obJfzSjIg9EPHl4xACs+vL6/mdgwcPEhMTQ3h4ON/61rdYt24dEyZMcHlsRUUFqampHS5LTU2loqKi23OsWbOG+Ph4x1dGRoa3wxQCAKXdTMJn+0gp/A9DDuxB5xTk9re+rkXIOLSH5c89hqJa0WkqOk1Ff3Ev75CKM3z5F99Fcb+3d9CICm/nmrwibPU9XNFIimlifu4pj+/TeZZELS3CUlNl+9tlx6BpKjPzsh0BpS/Z15Hs2V+CougoKGmixBKN4eIMl30bp8v8vaaR+c/XGfHvf2CsuzRbFFZfR/p7622zHk6LV+umTOezB3/OuWXXYhqRRd3EKZz8+l0ceOTXtMd5/uambzbROjTVbVVjAE3R0Zwur+Pecvc4XDYuxW+PQ/t6JnePwx6/6ks9OqfXMyO5ubkcOHCA+vp63nrrLW677Ta2bt3qNiDpjdWrV3eYUWloaJCARHgtcc/HjHjnnxjaWtEUBUXTsIYZObfsWs4vuMIvY+jLWoQ5619B0+lc9tLRqVaSyk6RvX8HxTO82345EP3whm0cKRtKSVXixcWsts/piqJi1Fv59dffx6D3rtx5qKVtYo8fJXnvx13uzz5jkfjpXi5Mmd5hLYglNo6KK5ZTccVyr8cZXXKSYZveJ+7ksR6PVTSV8/MWeX0OEdy7vjzRYGqGp3o+zutgxGg0Mnr0aABmzJjB7t27efrpp3nhhRe6HJuWlkZlZWWHyyorK0lL677UcHh4OOHh4d4OTQiHIQf2MPIfax2fle0L6/TtZjLeXYem11M91z8Fz3rzpqZvN5P12S4Ut5/2warXM2rPdglGgNgIM6985y1e2zGVNz+ezPmGGMINFq6aVsTKy/cxcmhdr+87VNI2yZ985Ghr4Iqm6Ej+pNCrhanuxB/+jJy//cn1ebgUANk/BFTNvZyGseP7fN7BLBgfh54wNjZ6dFyfl+GqqtphfYezuXPnsmnTpg6XFRQUuF1jIoRPqCrp77/d4UWxs+Eb33W5rbE/eZO20Vkt3QYiAGhgaPdf2inYRYW3c9cVe/hg9Z/55OfP8NGjz/E/X9rcp0DEzjmgbCjcHJRpm8iqcreBCNhmJyIru0+Re0JpN5P11qtwcfuuK/ZLm4ePoOTmlZy9/kuDpy9BPwq29KEnX6ctnm0R92pmZPXq1Vx99dVkZmbS2NjI2rVr2bJlCxs2bABg5cqVpKens2bNGgDuv/9+Fi1axBNPPMG1117L66+/zp49e3jxxRe9/FUI4bno0yUYG7p/MhpaW4g7ftQnnxK94Zy2SRpbRtyCJS7TNvtqNBqSU4mtrnQbUOk0laqRY/06/lDhbUrGE/Y3AttsxOagS9uoBl23AbgGWCP6PuM85NCnGFrd70xSAFWn59P/93PUqOg+n090FEzpQ0+0mDybGfEqGKmqqmLlypWUl5cTHx/PlClT2LBhA/n5+QCUlpaic1rENG/ePNauXctDDz3Egw8+yJgxY1i/fr3UGBH9ytBs8vA492W7+5Onb2rvzbuRm//9B5dbJjUUrHoDhxdd67+BCyA4p8vjMqvQ3bAfXnzV/R0oChemzujzOCKqKlF1enTdLJ7WqVaMDfW0SjDSbwL9OLTfd4/jbPXw9dibQfzpT65zhHZbtmzpctlNN93ETTfd5M1phOgT85AhHh3XNiSpn0fSvc4vJrYcrMnRYr4m7wEOFe1l4rF9KBqOtI2q04Om8f59P6M1NsHr8w7EWiP+5ukMlz+LpFnuvgftzX9DXUOX9Imm02GJiKR61rw+j8EabkTR3KeD7NTwiD6fS3QvkI9DT7U2e1YHxfel24QIsJZhI2hOG47mJketYau90JQ92r8Dc8E5KNCbagEYlRjFVeNTUcOMHP7zG7x247eoTxkOgKrTcXLGAl577EWK5uW7vd89+0v44EglG49WUWKJxhqdiC4zt/utocIr5oSRjnVADYWbMe/fTk60Rn52DPm5ySycPbrf8vcASVFGx1S5Lm4ohpzRND/xMGpqCmB7rKg62xuBOS6e4/d8F0tMbJ/PXzdxqtu1ImBbtNo8LB3zkMQ+n0v0LFCPQ1+TRnli4FEUztz4Fcb88Xegqh1eOO0BSukXvtqlKmWPNI3Yk8dI3vUR4dXnsURFUzttJhemTkcLM/ryJ3BQw4xsXPxFyr92B/p2M1a9ocdxO396DkgjtkEmUNPlrmgZw6l7/kkaX/07kZW2YpFN2aOoz53o/ePdjbahqVyYnEfCoQNdZ2Cw7VwrX3q1T84lPBdMj8PekGBEDEimkTkcv+e/SX/3n8ScOe24vCV1GGXXfsH7DqKqStabr5J0YI9j+6SmKMSePEba1g85ds93sXhRKKo3rF4EPPYXm0BUUhyMupsu789FhS7pdTSNyqF2xsh+O8Wpm25lpKoy5PCnaDodGortOaHXU3rjl6mfMKXfzi3cC1TaxhckGBEDlikrm2Pf+T7h56sIa6jDEhNLa0par7YYpm0tIPHAHgDH9kn7p8Lw2mpy1r7EsW99z3eD95HOi80C0QBrsHC3MLnY1OxYB2R/I4Dg/HTqKS3MSMnX76K84hxDDu5H39pKW9JQavNmYvWi26/wvUDt+uorCUbEgNc2NIW2oSm9vr1isZBSuMXtlklFVYk5XUJkWSkt6Zm9Pk9/6ZdGbH7W1q6nsGgkNY1RJMc2Mz/3FOFhgS+Fr2nQ2m4g3GBxZEE8nS4PtjeD3mhNG0552vBAD0O4EGppGwlGhOhBRFVFj9uFNUUh7sSxoAxG7HzSiC0A1u+ewJPvLaCpNRwFDQ2FmIg2vn/tdm6YeSQgYzrfEMVftk1n/Z6JNLcZiQhr59rpR7lj0V6GDWkMrrSNGLRCKW0ju2mE6IkH2xhB8fC4wOpTI7YA+NfecTz2zytparWtl9Euzk81tRp55B9LeWef523ufaX8Qixff+Zm3tg5leY227ha28NYv3siX/vdVympsm0td7fLQWtr7rLLIdh3OojQFSq7bSQYEaIHrUPTsBq7r1ypaCqmrBw/jahvJg+PZ/LweEdAotfpHQFJ5NiJjoAk0NqtOn77/nxwWVdUATR++/48LFb/lhn/xboruGCKwqp2fPm0qjpMbUZ++veOW67tbwTmVhxvBKMSoxxvBMvne7mY+qINHxUBsPFoFSdrmwHQZeZivFjeI1gCShEc+tpFvL9JMCJEDzSjkeo5893XLdHpaElJo2nkKD+PbGDbW5zOBVMU7gucK9Q0RbOvJN1vYyqrjWPn8awugYidVdVxpCyVI2VD+3UczuuAFEXnqCdjSErxTT0ZTSO65CRDP9pC0u4dGGtrfDRyEUjd9VjKz03ut942npA1I0J44Fz+tUSWnSGu+LijE6kGoChYoqIp/vrd0gjMxy6YIn16nC8cr/Csau/xiiTGp5/v17H018Lk8POVTPzNL7pcfmHiVE7d/I1+q6kj/CNYd31JMCKEB7SwME7c+R0SD+xh6CeFGGuqsUZGUps3m+o5831S2VJ0lJbgWYMtT4/zhXCDxcPj/LfTx5cLk3VtbR0CkfIrryKsvo7kPR8z5PCnKGstFN/2zX76SYQ/BduuLwlGhPCUXk/tjDnUzpgT6JEMClMzyxk+pJ7yulg0rWtaRFFURiQ2MCWzwm9jmjaynCijmWaz+9kBg87KnNFn/DYm6L5njTf1ZIZv+DcAzWnpHL3vB6C3lZMvX3o1kx9/mISjh4N2C7vwXufdNjGZ6WQHqCaJrBkRQgQlnQ5Wr7DVd1GUjjuVFEVFAX5y4xa/ZscijRa+sXA/4Lo3i6JofGnOIRKiW/03qIucFyYX7i6moKiaEks0pRGpGPMWkrV0Nklj07tdR5KycxsAxSvvdgQiAO3xQyi76noAknft6NefQ/iX826bptKyLru+FszK8cuuL5kZEUIErXljS3nmzn/xxDsLOFmZ7Lh8VGot379uO7NHnfX7mO5aspuapkje+mQKep2KptmWC1lVHfmTj/O9awr9PiZnPaVt7LMk4D5tY3bR0bolzbZQOKK6qn8GLgLKXdpm2Thbwcj+TttIMCJEkGg5dhhj3kIArGrgq4sGizmjz/DG/a9xoiKJ843RDI0zMTq1JmDrhfU6jdUrtnLTZQd5Z994qupjSIxp5trpR7tdtFpeuMuxy0VtOA9EA1DTbPb5GLtL21iArKV0m7aJPl3cZat6wsH9AJhGZPl8vCI4BDJtI8GIEEHg9Ie2NypLTdXFJ2U0mqY63qiCoUJiICkKjBlWw5hhwbPFdHRaLQ9c85FHx9pf5JtKy4hhO8a8hY5p8IKiasc0uC//xr3ZbXP6CzeTte4Ncp9/ioOrH6P9YvPH2ONHSd77CQDn5y3y2RhF8Om42wZi2N5ht42mqRTuLvY4ZWNu7b56tZ0EI0IEmPPe/0AvIhP9J1C9QlylbZaNSyHbRdqmZuZcMv79T3SWdiav+SmWyCgMLc2O+zqXfy3t8Qk+G5sIXp6kbTzRYmrkdQ+Ok2BEiCBhf/KD7dNIsDe2Et4LVM+azmmbjUeruqRtbLMkpXz201+Ssf7vJO3f3SEQOfXlW2Un2SDjyQelnjQ1elaXRoIRIYJIh08jS8ECZCfZPo1sPFoVVI2tRO8EquiUq7TNlWOSaSOVCXkpxLD94rjKOP2Vb3Dmxq8QXl2JGhZOW/JQHG2JxaDj7oOSJxoMzT0fhAQjQgQdSdsMDoEqOjV5eDxbd1v56c2p/HdFDGC77ycfX85dN57qkLZpSR/ps/OK0Nb5g5K5tIjIsRN7vJ3e1OTR/UswIkSQCtQaA+E/gdi9cGRfPO/8emyXy7/3kwRe+OtEdv/DOW3jXSl5MbB1/KDkWU+oFpPMjAgR8pzfrJzTNvnZMRSUNEnaZgDwdvdCX/7O7WaFlx63BSJXfvEcV37xHEer6zh7PIbNz17G0cNh/GFzFt/5inPaRgIS0ZHzB6WeNLW1eXSfEowIEeScP43Yp0dz8hY6VrUDvZ7Ot++wyM9NptikkBOdCEDS2HR5E/IzfxSd2v0f25qUocNbuOqrtjcS233V8+PfnudX/z2UVd8Zwn13x2DMW2jbhpySTnnhLnksiA48fTyYW1s8Ok5WJAnhLVVF32xCMfu+WFVPzE5VxkclXlrNvnx+rtf3NXl4PJFherbvOkFBUTVKeBTFJsX2JpSZ3mPpcOF7nVu8m/dv92mL99PHYgBY9pVzXa6bMvfSg8sqNfeEn8nMiBAeUtrbSS3czNAd2whrsnWKbcgZQ+UVy2gc7X0wEAyct3xC9zUo5JOxf/Rn2iYq1tZ1uLEurMt1rc2XStrqdO667wjRPyQYEcIDSns7o1/6PTGni0G79DIdW3KC2OLjnA7hGgzOAUlLu+0j8bJxKd1W6hT9rz/SNpNnX6DwvTT+9XImsxafJyLqUgPCN5613cekaRYURYIR4V8SjAjhgZQdW4g5XYyidXyJVjQNDcj852s0jB2PJTYuMAPsI/ub2cFz9RTuLnaUDi82NZNzce0AXPq0LkGJf/h6m3fOhCbSc0yUFUfz09tn8MV7ThEb307Bv3IoPxYLwFMvNgOR/fUjCeGSrBkRoieaxtCd2zvMiDhTsAUlSfs+8e+4+oF9Hcme/SUUFFVTUNJEiSUaY95C4hYscTR6k7Uk/tW5xXtma2WvW7zf/eAx4obY1jv98w8jeeX/xlB+zNal955flpOeKXMiwv9kZkSIHujMZoz1dT0eF1FR3v+D8YPOaRtPGqyJ/te56FRmJr1K28TEWXjo+U85fjCOz3YOob7WSOzISu65L5pWQxvgWZlvIXxJghEheqAaDGiK0iVF04GioBo968EQCpzTNh23/3ZN20hA4j++StsoCoyd0sDYKQ2A7e8cHZdLq2f1qYTwOUnTCNETvZ6GsRPQuunNoagq9ROm9PtQygttO1ssNVWoDecB2w6YmmZzn7Z8umNP2wDodXrHG17k2InEZKYzbMFsSdkEgC/TNkIEA5kZEcIDFYvziTv2ORq2NSLONJ2OltRhNIwZ169jkJ41wpmv0jZC2Dl/sPD3jKcEI0J4wDQyh5Kv3sbIN18FixVNZwtJdKpKS+owTtzxbb91NXXXQVN61gw+EqAKX7AHIUlj04nJTHesCQP/BSVeBSNr1qzhn//8J0ePHiUyMpJ58+bxq1/9itxc9wWfXn75Ze64444Ol4WHh9Pa2urmFkIEp7op0zk4OpfE/buJrDiHZjBQN2EKjaPG+r29eudPxfaeNcvGpbDxaJX0rBlkXAWopaRKgCp6ZA9EspbORpeZiyEppUPBQ2Odf9aFeRWMbN26lXvvvZdZs2ZhsVh48MEHWbZsGZ9//jnR0dFubxcXF0dRUZHje0XpPNEtRGiwRkVzfv7iQA8DkE/FoqPu0jb2AFXSNsKZse6UYzbEmLeQYpOCYokKyM45r4KRDz74oMP3L7/8MikpKezdu5fLL7/c7e0URSEtLc3j87S1tdHm1OmvoaHBm2EKMai4q9Qpn4oHn34JUNstRJadw1jbTkvqMKzRMf00euEvzmmZuAVLMCSlUGxSKChpQlGaA1LwsE9rRurrbSu1ExMTuz2uqamJrKwsVFVl+vTp/PKXv2TixIluj1+zZg2PPPJIX4YmxKBiThiJse6Uo7OvPW2Tnx1DQUmTpG28EFFZTuzJY6BpmDKzac7ICvSQvOaTtI2qYnzjX0S/8S+SGpsA22Lt2inTOXvdFyUoCVGu0jIllmgKSqo6PC7c9anqr7SNomndFU9wT1VVbrjhBurq6igsLHR73M6dOzl+/DhTpkyhvr6e//u//2Pbtm0cPnyYESNGuLyNq5mRjIwMtj78K2IipEyxEN0x1p26VCk1byElFlsKtaCoulczJAfP1dPSbmXh7NG2N7O2ZnKiNcz7bZ+YTn84MNrLG5oaGfnGK8SdOIZ2MZWsaBqm9ExKvnYH5sSkAI/Qe+7eeDYe7fjGAzAzLxuw1ZMZlRiF7lv3oHvpFZe7x9oSkyn6ziqskVIgLZS4ezxAx9cHsD0e8nOTAcg2mAAw799+MW1T5vFzvqm1hUWP/Jj6+nri4ty3y+j1qrt7772XQ4cO8frrr3d73Ny5c1m5ciXTpk1j0aJF/POf/2To0KG88MILbm8THh5OXFxchy8hhOfMTuvDRyVeesNYPt/77sL2WiPbd52goKgaJTyKYpOCMW8hYJvqDfVaI0p7O2P++AyxxbYCb4qmOYrcRZWfZewLT6FvNgVyiL1iThiJOWEkpz/cRUPhZsz7t5NtMJGfHUN+bjIz87JpabfS0m5F01THmw+fforeRSACtpo64TXnGfrRVr/+LKLvnNN4amkRlpoqR6ChaaojIJ2Zl42m2ZoojkqMQhc3FMDRFsL+nPfl875XaZr77ruPd955h23btrmd3XAnLCyMvLw8Tpw40ZtTCyECwLlEPLifwoXQbKI35OB+Iitdl/NXVJWwxgaSd+2gcnG+n0fmGz1tBwdbp2Z74Kr7+StoBgOKxeLy/hRNI3nXR1Qsvdov4xe+48m6IntQ6vxBxh6QGIC4BUt8nrbxKhjRNI3vfve7rFu3ji1btpCdne31Ca1WKwcPHuSaa67x+rZCiMDp3LMGbG9gA6FnTeL+3d2X/L/YCDFUgxHofjs4dHzjUU6dAjeBiJ2xsQFU1e/b2oVvdLeuyPmx0JkubqgtcEjy7XPeq2Dk3nvvZe3atbz99tvExsZSUVEBQHx8PJGRtrUcK1euJD09nTVr1gDw6KOPctlllzF69Gjq6ur49a9/zenTp7n77rv7NHAhhP8596wp3F3saKLn75X3vmYwNXXbe0gBDKbQS9N05u5TsY3TG1ByMhgM3QYkVqMRY0Npj3/jxhYjZ2vjiTS2k5Vch1R2CB7utoP31CxRFzcUteG8LW2TWQVs7vNz3qtg5LnnngNg8eLFHS7/85//zO233w5AaWkpOqdI+cKFC9xzzz1UVFQwZMgQZsyYwY4dO5gwYUKvBiyECDxP0zb+KpjUV22JyURWlqOoqsvrNUWhLQQXsLrTeTu4LjMXA5em4tVbbsHw8stub6/p9Vivsa0dcPepuKYxkt99MI8PPs2l3Wrrb5SZfIH/unIXV0875vsfSvSKqwDVvh7M/njo7GRtM2Bb+JqdlOKTtI3XaZqebNmypcP3Tz75JE8++aRXgxJCBL/OaRv7LEkopm1qZs1lyOFP3R+gaVTPnu+/AfmBq+3g9jcE3eLFqFdcgbJtG4rV2uF2qk6PFh2D9j8/Iy463OV6oQumCG5/7iYq62Oxqpc+nJZWJ/DQG8upbYri1gUH+v+HFB7rnLbpHKCCPQjBsRsL8NlzXnrTCCF6zTlts32XbVG6c9rGV1O4/a1hzDguTJxCwucHu6RrNEXBlDGS2ryZARpd/3H3qVhtrIZ//IPmO+4m7u11AGgK6DSNuhFZvP+zp5kxfBzZBhMWIGtpxzehl/4zs0sgYmPL0Tz13nyWTz1Gcmyz/35Y0SNX64rsAYk9ECkoqqZwdzGRYXrH2jFNU8nPjnH5nCci1aNzSzAixABUXriLrKWzsdRUXXySR6NpKjXNZkd7eV8WP7PPkiRFGSkoqiY/NxldXBQGsL3BpaRTXrjLZ+fzOZ2OklvuYNim90nZsQ19m21vtGoIo3rWXM5ddT2aISzAg+w/9jehmMx09KZarNGJnDTr0P/hFdbd8t/wj3+SGW2gMjuXD+KyaalRqb34d7Z/KravF6o4Usr63RNdBCIdvbNvHLcv2uePH094wV2AqrUpjt02/UGCESEGGOlZ00t6PeXLrqPiimVEnSsDTaMlbRjqIC+02DhsBHvmX+94rEym40xY5/VCzbGnaDYbu71PRdE4WyOPvWDmSXdwoEshxC5F0VpbPDqfBCNCDFDSs6Z3tDAjpizvyxYMJs7rhWbmZbPxaJUtIElKIW6sgqJoaFp322YUYiPburleBIOetoODrTqrpb4K87G+1RqSDeJCDGDuKi7mZ8c4Ki7a0zZCeGPy8HgmD49nz/4SCncXU1BUTYklmuohKVy7vBW9zvXOJACrqmPZlON+HK3oLXdVfO1flpoqGgo397noocyMCDHAuUrb5EjaRviIq23etz0Qy4ZNCpqmoXaaIdEpKgvGnWJ8+vlADFf0kqvdNmppkde9atyRmREhBgnbi0mZrbHd/u1ktlbaZklyk1kwK4eZedkcPFcvsyTCa/Ygds/+EhRFx7mIcp57tZmERNvsiEGvolNs/1866QS//OqGgI1V9J7za4haakvL+CIQAZkZEWJQcVVbIjsphfzsGApKmpiZlx2ysyQ6cxvhNdWoBgNtSUOlTLmfOQckti7POrYcSGbzOyq1p/WE1xazeOQ+4uoPYzaODOxgRa85z7Q6f99XEowIMcg4v5hkLQVzaRE5eQs7LErbs78kZAISXWsLwze+S9Kenejb2wFoG5JExRXLqJl5GVJ/3Dstxw47KnBaVVsdieXzc9nwUZFHj4fOaRtlvMotX0gh25CCpWY6aml0SDdVFDa+/tsNymDE27bH8oQRA5W5FYwRtv+PSoxyFDayv/kEO11bG2Nf/C2RFec6FCszXqgh65+vYay7QHm+NOV0pd2qY9uRbHafHIGmQd7IMVz1wWaGTUgjhu1k5y2k2KSQn5tMQVG1V/VpumuqmJnZtUiaEIMuGDHWnSJpbDoxmekeHS9PGCGCV8qOLV0CEbDX+YRhmz+gdtpM2oamdL3xIHayMpHv/vkGKutjMehswcJbn0zhiZjLefaLL7JoUZnb2hKebgd311SxlI5F0uT1VcAgCkbssyFJY9OJW7AEQ5JnL06hUs5aiMEo+eNC6KZnlqbTkbxnJ2VX3+jHUQW3hpZwvvmHL1DfYpsSs6h6x3V1pgjueePbrI95nNRju7rUlth4tMrrdUWeNlUE719fqxuj+PT0MDQNpmRWkBIf+p2VB6tBEYzYA5GspbNtzX+SUtx2I+zMAD7pSCiE8DGrFWNDDzt/VBVjTbV/xhMi3t4zgbrmSJdFyVRNR7M5jNeOXM13ln3isyq+vk7bNLWG8fjbi9nw6VhUzbZQWaeoXDnpBA9+YQtxUlAt5Az4YMQ5LWO8mANVLFFQ62mDpuiQ7EIqxICn06EawtBZ2rs9xhoR4b8xhYAPPxvd3WQSqqaj4LMxfGfZJz6t4uurtE27Rcd9L93I4bOpjkDEPu5Nh0ZzunoIf/72m0SEWd3ehwg+AzYYcZWWKTYpFJQ0oSjedYrs3JGwL9OKQggfURRqp04naf9uFNV1tU9FVbkwZbqfBxbcms1hXFpV41pL+6WmgL7eDt7XtE3BwTEcPDPM5X2rmo5j5cm8fyCXL8z6vMexiOAxIIMRV2mZEks0BSVVHSJ5T83My6agpMnRe8HeMlvSNkIEVuXlS0n8bB9oWpdFrJqiw5SRSePo3ACNLjiNGVbN6eohbrvq6hWV0ak1HS7zdRXfvqRt3t4zHp2idpgVcaYoGut3T5BgJMQMuGDEXVqmoKiawt3FRIbpva6dYG8GpdfpKbFEk52Ugj7CQBaXCr8IEYrKC3eRtXQ2lpqqiy8G0WiaSk2z2autnIHSlpLK8bvuJftvL2FsbEDV6VAuBiYNo8dy6pbbpfhZJzfNOcSGT90HaFZNx1fmfubyumBI21Q1xLgNRAA0TUdVfUy35xbBZ8AEIz2lZbbvOtGrQESIgcrVp92+LFIMFFNWDod+/AjxRYeJOncW1WCgftwkWtOGB3poQSkv+xy3zN/Pax/loaChXUzZKKhoKFw3/SgLx51ye3vntE3S2DLiFizxW9oGIDWyhrNKvPuZEVRS4gbHrhpva2ZB8C4tGBDBiCdpGQlERLDQNNhdPIJ3942juiGKlHgT100/wvTscwEpFurLT7sBo9dTP2EK9ROmBHokIeH71xYyNq2Gv27Po7gqCYD0xAZuXXCAL8852OPj0P6GZit5sLlf0zb2zQN2d2vV7P7f0W7vS0PhSxO39XjOUOb84dvTmlkQ3BswQj4Y6Y+0jOiqqTWMT05kUtsUSdbQOmZkl6HXdbMkX7jU1q7nx2uvZvvRbPQ6FauqQ69T+dfeCVwx8QRrvrqBMIP71uv9ZSD3rBFdKQrcMPMI1884Qn1zBBqQENXqdTDsKpBt1VKp/WQ4n/09jbZmPR8nVDNmXhmLZ3efLnOXtik2NZNzsTw9wC0T4Q8fmtn/aRhWa8cB6/Ua40e3snJFBc2nTjvGOJC4+vDtqWAuNBeywYirP4ikZXxP0+BvhdN48r2FXa770zffYtrI8gCMKnQ98c4CPiqyfc6zLyC0/7vl81H89oN5fP+6woCMzdeLFEXwUxRIiG7t0304B7L18SZu/u3XKasIQ1FA0xR0+nSO7RjBmWXFfOPumh7vz13axkEHv3+9hUd+DO//Kwz1YkCiKBpLr27n5afqiLVe7ugqO5A2GbgtVeEhXxSa6y8hGYxIWsZ/3vpkkiMQmZRRwaxRZ3ll63RUTcddL3yZdd//C5nJ0nLeExdMEby9Z6LbXLemKbz1yWT+68pdxEaa/Ty6SwZE2kb4lTlhJFZV4Zb/vYGKBgOgOGqZ2IOFzzbm8K9UEzdc33Pw0zltoyhdnzPLH4DLvq6n+GAEmgbZk1oZkmKlLiaZC20DqzaUL0pV2IO6YK2bFXLBiKRl/Kexxcjjb18BwHN3r2P2qLMA3LtsJ//7r0X8/eMprPrLdby16m+BHGbI2Fuc3qH0titmi4F9JeksmuDd9nNf8/UiRTHwFR4dyZm6ZLfXK4pG8c6xHJxhSxV4s9um23IMCbZ/TpZByynbepOBVBvKV6Uq7EGdc+rLOW0Dgf3dhFQwYqwvJevahQFLy3xwpJL8XNuTzRqdeGlcA2ga0Nn2o9kA5I0scwQiYJva/e+rP+LvH0+h5Hwi9c3hxEdJ+eWetFu7D0QuHRccW1GdFynGZBZhLi0iJ29hhynzPftLJCARAHx8PBODzuo24NY0hbIT4UwYPYq9R455tbjVU/bAZaDUhnIORIwX182UWKIpKKp2BCKe/n6cg7r83GRKLF3TNoH83YRUMJKxeEbA0jL2B/jGo1W2B7jBhC4zNyQf4J66YIoEYF7u6S7XRRotHY4L5WDEm+1xffkbj0+v8uAojfHp53t9jv5ibgXjxarqoxKjOFnbzFXjUwG8LiIoBiari143riwcmURU7Oh+mVmz35dzeic/NzloUxM9sc9QNpXauigb8xaitTWTn5tMQVG1oxaQp2bmZaNptgXyoxKjgChbEJDU8XfjS8Y2z94bQioYMU6dR6kuzu9pmYH2APdUSnwTAH/fOYU7Fu3tsNL+gulSv4+hIbqnvzfb4/oy1TtyaB0zc86w/1S6y+qXep3KZaNLSU9s8Pq+hQi0yRkV/OOTyd0coZE53Mz01CYSk/t3/ZF9zcn2XSdsZ/Zhp2B/82QNl6fsM/u2QMRGFzcUteE8RqffjS81mJrhqZ6PC6lg5LQlih1lgdst4+oB7pyXhM1BkXvzlUXjiwE43xDDW59M4stzDqEoF7en/u1qABZPOEl0eDeNyoKU8/QnQOTYiT3epuXYYbKWzu5T4PnITR9yx3M3Ud0Y1WEhq05RSYlr4qdf2uz1fQoRDPKnHOfJ9xbQ2BLucpG2Atx1+Q6stUMc64/6c5eW8yLYDrPaTmmbUPkQ2d0aLvvv0FPOgYidvYu9fZZEb6r1waht2hubPDoupIKRzceqiYyJC+humc4PcOe8ZNyCJUGRe/MVo0HlyZX/5nt/uZ7H376Cx9++gpyUGkeRJICHvhB6b56dF0EDeNLf035sX/bqpyU0sfa7r/Hajqm8vWcCF0xRJMY084VZh7l57md93mYp+o+hqZGhO7eTuG8XqtFI9ex51My8DDVcugIDRIRZeeIb73LfSzfSbr20Zd3eR2bJpJPcmPEuDYXDHdvGi03Njk/r9oAEfDdL0tOsdjDX3ejMXaE58Hxm2h50dHe92nC+w5rIvrKqYT0fRIgFIzv3lRAXGxfwxXKDKW1z+fhTPHPHeu778woARyCSkXSB5+56myExofPm6W57nLefLPo61TskppXvLPuE7yz7xKvzCj/SNJzzknFFnzP65ec7HJLxzj/JeOefHPnuD2kZnuHvEQalvJHlvPHAWt7YMYUNn42l1WxgVGoNX5l7kGVTjmPVZXm0bbw/Z0lgYKVtPKXLzMVA9wHJydpmILqvQ+ygyeLJRz1QNK1Tq8sg1NDQQHx8PF99fD0zcoKr38TBc/W0tFtZOHv0pbRNtIalpspRdAeC/wHeE02DU+eHUNMURVZyXcitE3G3PW7j0Sqvcq6OvfptzWS2VqKWFl0MPMtC/m/sjrHuFMMWzMYYYZsd0sUN5WRtM3qdng+OVDpW9B88V8/y+bnUNJvJz01mVGIUasN5zPu3Y261NeUL5t9RWN0FUgr/Q9K+XehbmmmPS6B6znxqps1g8q8fBaBu/CQqF16JztLOiH//g8jzlQDs+/mToPdst5Toul7LUaYh3LYesL/S8PaZF/tCzlB+LjsvvB+2YHbPx1+cwLPP8HYOSk7WNnv9euiJFlMjP74mj/r6euLi4tweF1IzIxPT3P8ggdJd2iZUt5O5oiiQnXKB7JQLgR6K1zypTeMp55mwnrqLitARUVnO2BeeRt/WiqLadhuENdQx7MP3SN36IQB1E6ZQ/I27Hbc58r0HmfLoTzC0tjB05zbOL7giIGMPRR1TDrbUp3PaRtNUCncX+y1tE4rPZfv4jHWnKC/0rHt80th0YtjeYZbENhtCr14PPRpnq2cfXEMqGAlWzg/wmXnZ6HV6SizRZCeloI8wkAUduk4K/7F/enBeH6KER6HX2Z5w3n76GihTvcKJppH92svoW1tRtEt9gZSL1+nNtq2JZ67/YsfbKQolt97JmD89y9BPCiUY6QV3O0XstWwkbdMzb8bn+F1f7D9lCwAupWXsgYgvf9etzZ4FN17Nx6xZs4ZZs2YRGxtLSkoKK1asoKio521Ab775JuPGjSMiIoLJkyfz3nvveXNaIfrEeQqzpwVcPXEOPAt3F7PxaBUllmhKI1Iv1p2ZTdLY9F619haBEV1aQmRleYdAxBXFRe7bagwHQNcWuPL9oc65J1JD4WbM+7eTbTCRnx1Dfm4yM/Oyva6n4Qnn57Ki6AbFc9mcMBJzwsguv2t77ZL++l17wqtgZOvWrdx77718/PHHFBQU0N7ezrJlyzCZ3E/D7Nixg1tuuYW77rqL/fv3s2LFClasWMGhQ4f6PHghAmHy8HgmD48nMkxP4e5iWzXE8ChKI1Ix5i0kJjN9wL2IDWRRZWfQPGhXm/afDV0uG7bpfQAuTMnz+bgGE/ubZM2xMppKyzDv305OtOZ4k1wwK8fxJunLN0r7c9n+4WKwPJc7/64zWys7/K5n5mX7/HfdE6/SNB988EGH719++WVSUlLYu3cvl19+ucvbPP3001x11VX88Ic/BOCxxx6joKCAZ555hueff97lbYQIBQNpqjfoaBoxxcdJ3f4fYk6dpDFnNFULrqApZ4zvT6U3gAfr+JP37cKUlU3t9NkoFgup2zcTf+wIABVXXuXzcQ1Gkrbxnw6/66WQmYnjd73xaBUz87L92u6hT2tG6uttUVNiovs9yTt37mTVqlUdLlu+fDnr1693e5u2tjbanErINjRIRUoRnDp3FwWCujNmKFAsFka/9HtiS044Lks4coiEI4eoHzOOk7d906c7VxrGjuvxGFVvQGe1kLXuDbLWvdHhupKv3oY10rvt4cI957RN0tgyYjLTyc5b6NciaZ2fy5mZoVUkzVOB+l270utgRFVVHnjgAebPn8+kSZPcHldRUUFqamqHy1JTU6moqHB7mzVr1vDII4/0dmhC9IqmQXVFOE31YQwd1kpMvKXnG9Gxu2jh7mKvO2OWVA2htDqBmIg2pmRVEKbvfu3CQJeyfbMjEDn9xa/SnJ5B1NlSsta9Qfzxo6Ts2ErVwiU+O595SBJ1k/NIOHQAxcUMiQaUX3kVpqxssv6xlvDaGgAas3I4s+IrtKYFV7mBgcL+yR1su20yM3MpJdUvu206P5dDcbeNN1z9rl3VfwHfLm511utg5N577+XQoUMUFhb6cjwArF69usNsSkNDAxkZUlRI9J/jB2N58bGOn5CHZTZz5+pjJCR5Vu7e06le+zbv4+VJ/GL9FRwsHea4j8ToZr6Z/wlfnjM411TpTSbSN74DwOf3/8TxRt8yPIPmEZmM/92vGfHeempmXubT2YjTX/oaBlMTscXHUXU6dKqKptOhqCrVs+ZRuWgp6HQc/uHDPjun6Fl3qQSQtI0vdf5dW4DspI5pm/6cJelVMHLffffxzjvvsG3bNkaMGNHtsWlpaVRWVna4rLKykrS0NLe3CQ8PJzw8vDdDE8IjHxy59JjcX5jI2t+Ocnw/ZGgbF86HU14axS++PY2f/Wkf0bGeVRHsPNXrrjrvrh0t3PnXL9Pa3vEpWGuKYs36K2huC2Pl5ft98rOGkqhzZwBoThveZcahZXgGbUOSCL9QQ2TFOZqyR/vsvGp4OMfvupfYk8dIPLAHg6kJ85BEqmdeRkt6ps/OI7wnaRv/CWTaxqtgRNM0vvvd77Ju3Tq2bNlCdnZ2j7eZO3cumzZt4oEHHnBcVlBQwNy5c70erBDesBc7s1cOtRU7s1UZLNxdTHNFAvvfmcq5oovbfRWNybMvcPUtZ4lPaueFR3MpPR7Duj9l8fUHij0+r/NUr72ponPaJi6ziud+F0Nbu95lQzGAZzdcxpfHbCAhstlx2UB5weuOYrW96FuiY1xeb4mOIfxCjeM4n9LpaBwzjsYxPa8hEf7nTdrGUz29oXqTtvH2ZwlmnnQKts8a9Xhf/VH07N5772Xt2rW8/fbbxMbGOtZ9xMfHExkZCcDKlStJT09nzZo1ANx///0sWrSIJ554gmuvvZbXX3+dPXv28OKLL3pzaiE81lOp6cLdxTScSWTT72dgsTpt6dQUDu8ewvGDcdz38yPc/sPjPPpfeXy6I4mvfOsUxgjv1nK4m+qNU1LZ+GkamuZ+O6lV0/OJuoL/Wnpx7UQoVvHVNJSTxeiOFaMkeFbfpSXNlrKKO3kMQ2MDlthLVZfD6i8QffY0AK0p7mdWxcDlSdrGU958wvckbeOpUHkuO3cKdk7b5GfHUFDSxMy8nicjwFYO/nUPjvMqGHnuuecAWLx4cYfL//znP3P77bcDUFpaik536QExb9481q5dy0MPPcSDDz7ImDFjWL9+fbeLXoXoLXc9aApKqlCUZvbsLyHCoGfzG5OxWhXoFBCoqkJbq55//GEk33nkqOPy+gthDB3WhrdcpW1GaindBiIABoNGlZpJ5FhbujLUduXEvPsvDE88jvL55xiBKJ0OXe4YztzwNdoThri9XXtCIrXTZpB4YC8T/+9Rjn3re7SkDiOyvIxxv38CgOpZc2mPC2yzTBE4nqQSPNXbgMTVzjm9qdajc4bSc9nV7zrHy991U6PRo+O8TtP0ZMuWLV0uu+mmm7jpppu8OZUQXvO0B010/QhqKt23fddUhZIjsZw7femY6FjPdta40jlt0zhGD8R2exurVSF5mNHRytsYQgvnJrz7d0b874MdCokpqkr80WNEn3mCo/d9n/Z49wHJmRtuIvHAXvRmM+N/+6su15+9ZkV/DFuEGHc7QDzVm50i3e6ci3Zf4sKZ/bkMm93usAs27tI2nmgwNPd8ENKbRgwAzmmZuAVLMCSldNsB9JPPw7Ft2Ox+dmLD67bF2UOHtxAV0/c1CvZPVkWnTjBuZgpF+yLRVDdjUGDODQollkt9I5ybLwbrJ6uwpgYWPfWI7bfb6cOLomkYmpsYvvFdTt/0dbf3YY2MYv+j/0fKR1tI3/CO4/Kyq26gav4iNENYfw1fhJjOaRtzqWfpEl1mbpeUgy/SNp7KTkohbsGSLjvsgplz2sY+S+LR7UwSjIhBwJO0TOdmeOGRKj0FIgCf77V9er/zJ8d9Nl77OKovP8ix/bNAh8uA5Mqv1vFpXS3UXbrMeVdOsNY7yNrwNvp2s9vfrqKqDPl0L2du+DJqeDezU2FGKhcvo3Lxsv4ZqBgwnFMJ0LEXlTvG0iLMpUVdUg59Sdt4s17F1Q67YHsuu+LcbbnmWJlHv+t2D7PbEoyIkOVJWsbVi0puXj2GMBVLe88vHt9+5AjJad6vFenJFZfpsLbvY8drE2isvpR71YdZmbz0FGkzStjjYmdvsNc7iDlbiqo3oLe4r82is1oJa2igbaj7YEQIb9k/uZcXet4hvaedIt6kbTzdXWJfb6JpKvnZMY4ddsH2XO6ON7/rpjbPXj8lGBEhyT4jYg9EAEdaBnAbiABERllZdH0Fm/45DHczJPOvquD62874sup4F0sXaly54DAlR2KoroggPNJK7rR6IiJVoOPY7S92M/Oy2Xi0yu/1DoxOccPJWtu06wdHKru8AB++YGac2vOuI2uEBCIDQXldDH/cNJv1eyYCsGh8Mfcu38moVM8Wc/qaN49/55RD3IIlfU7beMr5uVxQ0mT7cOGUgg2ltI1Hx7W2eHScBCMiZDlPEerihsLFN8mkqEurtzUNWpv1GMJUwoyX1jAs+0oZ7WYd299NBQV0ioaqKig6jatuLmPxjRV40Mi1zxQFciY0kTOhqdvjnNudOxdT62u9A090ToFtPFrl8tPj5OHx7J52OTe9+2e396UpCqYR6R227IrQtPNYBvf9eUWHy7YeyWHrkRz+3xc288XZhwMzMA85pxxgs8udIv1VTA26PpddpW28/VlCmQQjYkCyWhQ2r0/jow9Saai1BSdjJtez5AvljJ7UiE4H1688w8JrKzjwURJN9Qbik9rJW1BDTFzvd870N1/WO/CUcwrMXjDOvjOp84t0ytSJHFp0LRO2vYeu0wJW++6atltuCIlPfsK95rYwRyBybd4R7lmyG2OYhX98Mok//Wc2v1i3hLljTzMsofsgOxh4U+CrPyq82gsj9rV2if1nCVUSjIgBp90MHz6XR1XxkA6d4U8cjuP4wThu/k4JMxfbmp0lJLWz+Ab3TRuDkXNA0jltk5Pn+Yp+T3UuGNddCgxg4zcfRNXrmfSffwOg6fTorRbUuHjU3/2GiDl5JBWGzrZG0dXLW6cDMCG9kke/8qHj8u8s+4SG5gje/GQKj/3jSn5/19uBGqJXOu8UcU7b+KvkvPNzOTspBZI8ey5baqqCeoedpyQYEQPOB6/HUlkc36WgmW3XisabL4xkXF69x115g5G7qd6SfviRutuZ5IpqCGPjtx5i55fvJrrgfSJbm4mePZ2T86/kyikjyDaYQm5bo+jo33vHA/CD67d1ue6eK3fx5idT+OREaPX0cZe2KTY1k5+bDFwKSMD3nYI7P5c9Few77DwlwYgYUDQNNr4RYysj4pKCpsLu/yRzxYrQmhFxpXPapj90l5bpTmNyGo233AHYFu21fHoWNTwiZLc1ikt0iu0JprqoJKx5sG0+mHmatumvWRJ72sZTwb7DzlMSjIgBxdyiUFvVw8NagYozkf4ZkB90DkiWz8/12X1v+KjIo9mQnrjKjztvawylapQCbph5hBc3zWHN+sX8/YHXOlz33MbLAJifeyoAI/ONYEjbePo8rmk2d0nVhmKQL8GIGFD0YRqKonXb+0VRIMzoXdO7YOdc72DDR75dxOrL6Wh32xolbRNaVl6+jxc3zeFkZTI/ePVqvrX0E8INVt78eLJjm+9DX9gc4FH2TaDTNt48j53TO/bu4J132AX7c0qCER+wPxhn5mWjaSpW1Uq2wYSlpgpz6aUpM9H/DGEwZV4rn+0MR1NdFzVTrQoTZ9X5d2B+4stPaf3Bm22Nwf7iOZhFGi28cM8/+eYfvsh/Do/mP4dHd7j+0Zs2khLvWev4YOdN2sZT/VW7BNynbYI9yJdgpI8Onqunpd3KwtmjHVPP9kCkoXAzNcfKgOCPSgeSG29v4NMdKbjqP6PTaaSMaCF3mucvHP5QXxvGZzsTaW7Sk5hiZvJltReLnw1MkrYJfTNzyvhg9Z94ZesMXtsxDYCrpx3lv67cRWZycD2/+spVXxZ/dAr2lKvS9KEW5CuaJ614A6yhoYH4+Hgee3kzEVExgR6Og3Mgkp+bjNbWTE60hnn/9ot/+LKg/cOHOmPdKYYtmI0xwlYHQxc3lJO1zRQUVZMUZeT539Wx87WJWCyKbbGdAqpVx7CsZu5+8BhxQ9yXK/cnVYV//yWDj95PBUDRaahWhbBwlRV3lDJ7SXWAR9i/Os8qLhuX4gjm1dLQXIgnBjaXbSi8CEjcFQ30FXfvS4H6gNzU2sKiR35MfX09cXHuix3KzEgvdH4Bzc9Ntr2A1ldhPiYvoMEge3olSxe3s2dLMuWlkRjCNCbNusCYKQ3oPO9n1e/efTWDwvdSsc/gaFbbv+1tOt58PpuIKCtTLrsQwBH2L0nbiFDjLm3jqWXjUth4tMrrkvOeclsYMcjXZkkw4iVXUaekZYJTVIyVy6+rDPQw3GqqN3QIRDqy1UT54PV0Js+54JfS9IHUU9omVLcrioHJuVOwPW0TOXaiR7fNjsavu3JCJciXYMRD9tkQScsIXzm0ewjd95RTOH8uksozkaRletZsKpR1t9sm1JqIicHBPkviLX+UnHfeYWcP8p132wTb2iwJRjwgaRnRH1pMenQ6eghIoKW5H1sHBxlJ24hQ45y28VTWUrAA2Ukpkra5SIIRD83My+aq8amObbuALLATfZKc1oaq9pR/0UhMafPLeIKJ/QUUoKComvzcZHRxURgv1k8wpqRTXrhLnnciKHj7OOxuV06gOwUH6jklwUgv6U21jv/LC6LojfEz6oiKbae50YCrdSM6nUbutHriE4Nj508gJEUZqWk2B3oYQviUN52CPeVp7RJPt9T7irHNsw9TEowIESAGg8ZXvn2KV349GuhYNVan0wiPtHL9baWBG6AQot841y5xTtvkZ8dQUNLEzLxsj+/Lm9kUTyoh+1KDqRme6vk4CUaECKCJM+v4r58W8cHr6Zw+FguAomhMnHWBa249S3La4EvRCDFYuNqVk9OLYmqaplK4u9jj0vQ9pW18ydjY6NFxEowIEWCjJzVy38+PcqHaSHOTnoTEdqLjLIEelhDCT3xRuwTwuqOwq7SN/b58pcli9eg4CUaECBJDks0MSQ70KIQQgeCq5Lyn+rIItkvapsi3VZ9bTDIzIoQQQoQM507Bnm4VThqbTgzbO3QU7kvaBmD5/Nxe/gRdNatGj46TYEQIMTCpKpHlZzG0tNCWmIQ5UaadRGjwZoemq/ROX9M2Gz7y3SJWc6tn3ZslGBFCBKXJw+PZ8FERLe0Xc865yWhtCjl5C2H/dpLGpruti5Dw2T7SP/g34RdqHJc1Zo/mzA1fpjVtuJ9+goHj8JkU3tg5hU9PD8OgV7l8fAlfnnOI9MSGQA9t0HO1CNZd2sZTvqxx0uph0UYJRoQQQas3PWuS9uwk6x+v0bkdecypk+Q+9yRF3/6eBCRe+Mu2PJ5+fwF6nYpVtXWZLK1O4LWPpvKble8yb6xsPw8GzqXpY9hOZmYupaR2qF3iqf7qKNwdCUaEEEHNm541lqhhjPj3P9DoWkZO0TR0lnbS33+bk3d8OwA/SejZdXIET7+/AMARiAComg7NqvCDv17LOz9+mcSYgd87KRR02JWzFDIz6ZC28UR/lqbvjgQjQoig52k5a+s/C9CZzS77IAMoqkrcsSOENdTTHue/T32ham3htA4zIs40FMxWHev3TODOxXsDMDrhiru0DYAubmiPt3cOXPwZkEgwIkRPNI3kM8VE1dXQlDiU2hGeV0YUvtVT2saw/RN66j6oAGH1dRKMeGBPcbrLQMRO0xT2nkyXYCQIdU7b6DJzPXrDz754UH92FHZFghEhupF5cBeLX3mKlNITjssqssex5bYHODthegBHNnh1l7Zh5GjQOq8W6coSHe2HkQoRWJ3TNuZSz3bJ6DJzu5Sm7+9ZEglGhHBj5IGdfHHN96DTUsiUU8f4yqP38uZDv+PMpJmBGdwg5y5to7vhFsb8/H/B4rqCraYoNKdnyDZfD83ILmPn8Sy3syOKojEj55yfRyW84Zy28ZS70vT9GZB4vrz2om3btnH99dczfPhwFEVh/fr13R6/ZcsWFEXp8lVRUdHbMfvVwXP1jq2FVtWK1tYMQMuxw4EclgCMEZf+f7K22fF/n+yRV1Xy//A4oKHr9Elbp6mgqSz90/969Clc9J/Jw+OJDNOzfdcJCoqq+aAhnJrvPuDyWPtfquyqG/w2vlB364ID7gMRNIx6lRtnymthKDAnjPT4q+ZYGac/3IV5/3YyWyvJNpjIz01mwawcZuZlc/BcvVdbhT3h9cyIyWRi6tSp3HnnnXzxi1/0+HZFRUXExcU5vk9J8W39+/5gD0QWzh5ty5+1NZMTrWHev52m0jJqjpV5VZxG9J2x7hQAWUtn23KgSSmUWKLZeLQKRdGxfdcJIsP0fY7cRxw9QPz5crfX6zSNpLJTpJ08QsXoCX06l+ibzmmbtTfcwy16A8m/exKlrQ1NUVA0DUt0FKe/9HWaRo0N9JBDxuzRZ7n/6sIuW3v1iopOp/J/33iXpFjZSTPQdC5NH7dgidu0TY/31V9Fz66++mquvvpqb29GSkoKCQkJXt8uEOy/4Jl52bYFcrnJZBtMWOqrMB/rWtdA+Iex7pSt9HFmustAZM/+Ep8EIgBx1Z7N3MWdPyfBSBDokra5/m6W/9e3iX73X6S01tFubaQ+JZnWk6ExIxtMVl6+n+nZ5/j7zsl8enoYYXqVhVL0bMBzLk0Pm3vdUbjF1MjrHhzntzUj06ZNo62tjUmTJvGzn/2M+fPnuz22ra2NtrZLrdMbGvz3gHeeDbGv1M82mLDUVNFQuNnRL0ACEf9yDkSMeQspNikoligKiqop3F3ssyDEriU2wbPj4ob47Jyi7zrstpk9Gi1vuW1xq8FEXE0VMdnyYaI3JmVUMimjMtDDEAHgrqNwfq5n666aGoOkN82wYcN4/vnnmTlzJm1tbfzxj39k8eLFfPLJJ0yf7no3wpo1a3jkkUf6e2hdSFom+LhLyxSUVKEozT6dDXF2evIsWmLiiGxyHQhrQNOQZM6On+bT84q+65y22Xi0qkuRNNvz2XUpeSFER+7SNp5oMDT3fBCgaFrvV+ApisK6detYsWKFV7dbtGgRmZmZ/PWvf3V5vauZkYyMDB57eTMRUTG9Ha5bndMy9k9Slpoq1FL5JBUondMypRGpKOFRHdIy0H973yd/uJ7lL/6yy+X26p7v3fczPr/8mn45t/AN+YAhhG85vy57osHUzIgVd1JfX99h3WhnAdnaO3v2bAoLC91eHx4eTnh4uF/GImmZ4OQyLRPef2kZVw4uXYFOtXD5q88Q3tqMqijoNI22qBi2rHxAApEQ4DxLAlz6sNFNbxshhHvOaRtPNDlNLHQnIMHIgQMHGDZsWCBO3YF8ago+gUrLuPPpsi9zeNF1jNq7nai6WpoSh1I8fT5Wo3+C5WBz4byRDW+ks3ebLV+cPb6BG247w4gcz6ZiA8Fd2kaLSCUzU9I2QnjLm+eJudWz3VZeByNNTU2cOHGpGmVJSQkHDhwgMTGRzMxMVq9eTVlZGX/5y18AeOqpp8jOzmbixIm0trbyxz/+kc2bN7Nx40ZvT+1TB8/Vs3x+LjXNZq4an4pVtZITraE31QJIIBJAwxbMBsCQlGLrpVDbjKLoSIqyLYTyZydJAEt4BEXz8v16zmB07LM4/vDz3A6XlRyJ4+mfTOS6b5Sy6PrgXeDovNtmZl42ep0ea3gUhugU9BG2l0FPP+kJIXzP62Bkz549XHHFFY7vV61aBcBtt93Gyy+/THl5OaWll1pKm81mvv/971NWVkZUVBRTpkzhww8/7HAfQojgZm7VOQKRmYvPs+ymcxjDVXZvSebdVzN456+ZTJhZx9Bhnk3JCiGEM6+DkcWLF9PdmteXX365w/c/+tGP+NGPfuT1wIQQwWPrO2kADMtq5ubvnHJcvviGClpMejavG87ap0dx/+OfB2iEQohQ5nU5eCHE4HPgo0QAbry9tMt1V9xoq1R7tliazwkhekeCESFEj3R622yo1ap0uc7VZUII4Q0JRoQQPZq5uBqA15/N7tIb8IPXRwAwZrJvG2cJIQYPCUaEED2av7wKgMYLRp5/JJczJ6KpPBvB+pcy+bjAVonxK98+FcARCiFC2aAORmqazQBYVStam61OQssxaYcdaOWFuxz/VxvOO/5v/3sJ/zOEadz3c9vi1OLP4/jtgxP4v1WT+eiDVAC+el8xCcmh8/f54MilbcjW6ETH/+11boQQ/jUogxF7sTPAZbGz0x/ukhojAWL/vTeVlmHevx1LTRXZBpPt76SpzMzL5uC5eo9aVwvfyhpr4md/2sfSL5cRZlQBmL3kPD/53WfMuLwmwKPznL0a68ajVZRYbItudZm5ZC2dTdLYdAlIhAiAgFRgDZTOPWjyc5Ntpd/rqzAfk7LQwaJDl8ilYAGyk1JYNi6FjUermJmXzfZdJzh4rt7vBdAGu+hYK8u/co7lXzkX6KH0inPxs5Z2K4qiswW6Eank5KUQw3YAqcbqociyUuJOHANNw5SVTdPIUaDIgmbhvUETjEgPmtBi/zvYu0TGZKaTnbeQ/OwYlPAoAAlIhEuWdoXa8+EYDCpDhppdvjdKz5q+MTTUk7P2JWJOl6ApCqCgaCotqcMovvUu2oZ61tFVCLtBEYxID5rQ1WGWBMjMzMUQneJI2/ije68IDe1mhQ/fGs6OjSm0Ntte2pJSW7liRTmzl1R3CUoGWs8a44UaUrb/h8T9u9G3tWJOGEL1nAWcn7sQ1Ye9lJR2M7nP/QZj3QXb95qGrZc1RFRVMPbFpzly/0+wxMT67Jxi4BvQwYikZQYGc8JIjHWnOP3hrg5pm/zsGApKmiRtI7C0K/zhF7mcOhqDpl2KOmoqw3nrhWxqKiO45mtnu9zOXdqmlNBK20SeO8OYF3+Hvt2MotrW8xgv1DJ8w78Z8ulejv3Xf6NGRPrkXOnvrsNYdwFXyRhF0zA0NZK8ewcVVyz3yfnE4DBgF7DaZ0McgUintIwEIqHFnDASc8JITn+4i4bCzZj3bycnWiM/O4b83GQWzh5NS7tVFrYOUp9sGkrJkY6BiI3t+/+sH8a50+7fjCcPjycyTM+e/SUUFFVTUNJEiSUaY95C4hYsIWvpbIx1p4JzcauqkvO3l9CbLwUiYPvJFU0jsuIc6R/8yyenCmuoZ+gnH/V4XOLeXT0eI4SzARmMdE7L5GfHONIy9vUh9jc3EVpsaZuLO572byeztdKx22bBrBzZbTNI7djQ/RoFnU5j16ah3R7jPEuiKDrHbpvSiNSg3m0Te/IY4bU1KJrq8npF00jauwudh63cu5O0e4ftPrs5RgH0Lc19PpcYXAZcMHLwXD3L5+c6ApFRiVGOQMTciqwPGQDsfz9zK6ilRQCMSoxi2TjbG9Ly+bnubioGqJqKcLp7i1RVhaqyiB7vZ/LweCYPj2fP/hIKdxdTUFSNEh5FaUQqxryFxGSmB11AElVWiqbr/qVcZ2kn4nxVn88VfeZ0j8dogDkpuc/nEoPLgF4zIoQYHMIjVZqb3L8hK4pGRJTV4/sLpd02mt5Alxr9ro4z9P3lXtPpezxGAc7PWdDnc4nBZcDNjAghBp9p82vQ6dy/IWuawtR5tV7dp3PapnB3cdCmbRpyJ1zc0eKaBphj42hJHdb3c40d1+31GtAeFU3ttJl9PpcYXCQYEUKEvMuvq8QQpqK4CEh0Oo3UjGYmzarz+n7taZvIMH3Qpm1aU9KoHzseTXH9cq4AlYuWQg+pHE/U5s3CGhV9sbZIR/bffMktd4C+5xkUIZxJMCJEHxnMrUzd+A/u+u8v8sCt87nq94+SWHYq0MMaVJJS2/jm/xQRE98OgE6vOmZKRow28c2fFqE39JzKcCfYd9uc+uptmEZkAjjWj9j/rZq3iPPzFvnkPGp4BMfv/A7WyEguVRfBFpwoCqVfuoWm0WN9ci4xuMiaESH6IL6qjHvu+0KHyyZteYdJW95hyzfuZ8/1twZoZINP5hgT/+/3n/L5niGcORmN3qAyblo9mWNMPqlQ7ryOxN7bKliKpFkjozj2rQeIO3aExE/3om820ZaYTM2subQMH+HTc7WkZ3Dohw+TtG8XcUcPo7NYMGVkUT1nPuZEWbgqekeCESF6S9O49cE7AWiJieOd+39Oc3wiuTs+5LL1L7P4r09zevIszo+UT4r+otfD5DkXmDznQr/cv30dycFz9RTuLg6uImk6HQ3jJtIwbmK/n0qNiOS8D2dchJBgRISs8sJdZC2dDYDacB6wdWCtafZPK/ucfYVENdje9J578X1UQxgA50eOpTUmjsWv/pabHruP3/9po1/GI/wnlHbbCBEKJBgRIcleIr6ptIwYtqPLzLWViM9NdnT27e+eNVmf2d5sNt7zE0cgYrfvmq+y+NXfEtVYB6rqk8WDIrh0l7bJyUshi9DqbSMGNm/WMwXi8SrBiAhZHZroOfWsWTYuxRGQ9GfPGkO7bQbG4qIJmeq0m0DRVDRZKz4guUvbFJuayclb2CFtAzJLIvzPHoTYZ5F7Yg+gwb+PVwlGREizP1lOf7iLpLFlxGSmk523kPzsGJTwKIB+C0jOjpvG1A/XcdXvH+PzhVd3mP0Y99Gl1Iyml6eZP1itYG7TEx5h9ftElKdpG2OdzJII/zHWnSJpbDoxmenoMnMxJHXfNgEI2ONVXiXFgNBhlgTIzMzFEG1L22iaiqLofJ62ObpgGdc+8zA6TWXFr3/A5jt/iCk+kdG7t3Ldb38KwN9/+oxPziXcO38unM3rhrH/oySsFh3hEVZmLTnPkhXlxCZY/DYOSduIYOIciBjzFgKgi+u+PxNcDAqS/P94lWBEDBj2dSSnP9zVIW2Tnx1DQUmTz9M2mk7Pq798ma8/eDuj9xYyem9hh+s/X7Cc0smeTY2K3ikrieL3D4/DYtahqrb9u22tenZ8kMrBjxO57xefk5DU7rfxSNpGBJpzWsY+G1JisS3up9aTBobRaG22x2tcZhWw2S+PVwlGxIDiKm2T049pm4rRE3juhfeY9/cXmLrpbQAaE4ey8b8epGT6/D7fv3BP0+BvT+fQbtahqR0LiaiqQmNdGOtfyuL2H57w+9gkbSMCoXNapjQiFcUSxcajVShuKvS64ni8JqUQt2CJXx6vEoyIAcmfaRvTkGQKvvn/KPjm//PByIWnThXFcP5cpNvrVVXh8z0J1NeGEZ/ov9kRu85pG/ssiaRtRH/onJYpNiko4VEUFFVTuLuYyDDPS/QH4vE6oIKRg+fqAVudCU1TAVv9CUuNrXV2eeGugI1N+J9z2iZpbBlxC5b4Lm2jqmQd2k3Gob0oaJSNm0rJtLkedTUVvlF+OhJbQXL35VU1TaHybGRAghHomLYB0Ov0WMOjABORY23FyWqOlQVkbGLgsKdm7DMiAEr4pRkReyDi6evcwXP1bN9lm1HUNJX87BhH2qa/augMmGDk4Ll6WtqtLJw9+tIUk8GEpaYKtVQKEA1W9r+3Lee52Sdpm/iKs3zx8VUknTuF9eIW3jnrX6EuZTjrfvwENRmj+uEnEZ2FGbsPRC4dp/b/YPpg2ILZnD5UFehhiBDm612FzrN6M/OyKShpcqRtLNhaH9jTNj0xtrV59DMMiGDEORDJz01Ga2sm22DCvH/7xWmlMglCBjlfpW2MzU189WffJLrO1o5eb7U6rourruTmn32bl3/zOs3xif368wjIzatD0Wld1os4i45tJ2O0yY+jEn2ha2tDsbRjjYySQoG9YH+dA4hhO5mZuZSS6nidK9xd7Jil6ykosV/fXZrREw2mZniq5+NCOhix/1Jn5mXbppJyk22zIfVVmI/JbIjoyBdpm4lb3iXmQjWK5qJVvWoloqmBKR+u4+Mv3dXfP86gF5dgYfaS8+zaNBRNcx2QXPGFcgx96NYr/CP2RBFp/9lAbLEtNdAeHcP5uQupvPxKtDBjgEcXWjoXg8zMBEO0rRgk4Pjg5e0siau0jSeMjY0eHReywUjntEx+doykZUSP+pq2Gbdjo20bhxuKpjK+cIMEI36y4o5SWpoMfPZxIjq9iqYpKNgWry66vpzLr60M9BBFDxL3fEzWP9bi3Fo5zNTEsE0fEHfsKMfvvlcCEi/5K23jiSaLteeD6EUwsm3bNn7961+zd+9eysvLWbduHStWrOj2Nlu2bGHVqlUcPnyYjIwMHnroIW6//XZvT+3gKi2TE61JWkZ4rLdpmwhTY7erFBQgvLmpX8cuLjGEaXxj1UnOFpezb3sSpgYDCclmZl1RTXKaZ7nqUHL6fAJv7JzCfw7n0G7VM3FEJTfP+4y5Y0qd38tDhqGpkcx1rwN0mW1UNI3oM6dIKdxC5RXLAjG8kNffaRtPtJj6aWbEZDIxdepU7rzzTr74xS/2eHxJSQnXXnst3/rWt/jb3/7Gpk2buPvuuxk2bBjLly/36tyHKxowRlglLSN8oru0jbtPD9UjchhSfgad6jraV3U6akZk++1nEDYjcpoZkeNJQafQ9VFRFt//67WomoJVtb0R7DyeRWFRNl9fuI8Hrv4o5AKSpL2foGia+wBf0xi6cxuVi/MJuR8uSPRX2sb+Ya3H87d6tmbL62Dk6quv5uqrr/b4+Oeff57s7GyeeOIJAMaPH09hYSFPPvmk18EIXFofIrtlhC+4S9sUm5rJz00GOgYkn+Z/kdxPNru9P52qciD/S/0/cDGo1Jki+NHfrsZi1eH81m0PSl7dPp0pmRVcOelkoIbYKxGV5bYgw03qUwGMjQ3ozG2o4RH+HdwA0h9pG0+1NntW7qDf14zs3LmTpUuXdrhs+fLlPPDAA25v09bWRpvTdqCGhgYArpwzhhZs/R5GJUahNphQS4swt9qOk0BE9JanaZuDSWNJm72chbs2AJc2lmoXv9szdQHrRuShXZz69KX+6DwsQsO/9o6nzWLA3RyCTlF5dfu0kAtG1DBjD5ViQFMUaTbpI96kbTzlq9elfv8LV1RUkJqa2uGy1NRUGhoaaGlpITKyawXFNWvW8Mgjj/T30ITowJO0DcCn034H/3iFvDf+ROz5CgCaE4fy6ZdvY9/NdzPD4Punlf1TC0hQMhh9Vjqsu3XTqJqOQ2fS0LTQymbUTZzC0F0fub1e0+loGDMerR+eU4OVJ2kbT/mytUZQ/oVXr17NqlWrHN83NDSQkZERwBGJwcKTtA0AD/2QstWrCDt7BjSN9hEZJBoMLHV1pz7QYXbGR09+ETp0ioaiaG63MENoBSF2jaNzaR4+gsiKcyhqx+J0GoCmUbE4PyBjG8g8Sdt4ylcBSb8HI2lpaVRWdtxeV1lZSVxcnMtZEYDw8HDCw8P7e2hCuOUubdOBARhlb8nddvGrf9hfJBSrlZo31hO7p5YhIzM4M3G6TGEPAjNzzrL5kPvKvnqdyqycM6EXkOh0nLj9W4x65QWiy86gXix0pqgqmsHAqZu+jmlkToAHOXC5Stt0eZ3rhi97ffX7q9jcuXN57733OlxWUFDA3Llz+/vUQvRJ57RNTGZ6wMaSk7eQqn/+g28+/FPCys85Lq+LHULhHas4usD7xeAidFyTd5TfF1yGqdWIqnWdRreqOr5x+f4AjKzvLLFxFN37A2KKj5Nw+DN0lnZa0oZTmzfLVolV9KvOaRtzaZFHt9Nl5vqu1xe9CEaampo4ceJSS+6SkhIOHDhAYmIimZmZrF69mrKyMv7yl78A8K1vfYtnnnmGH/3oR9x5551s3ryZv//977z77rteD1YIf3NO29QcK2PYgtkBGYfh2ScZ8bMnulwe33iB6377UwAJSPqopVmPxawQE28JuhmGmIh2fnf7v7jvzzfS3BaGqimAgl6nYlV1fO+a7Vw25kygh9l7ikLTqLE0jRob6JEMSs5pG8Cj1zljaRHm0qI+9/qy8zoY2bNnD1dccYXje/vajttuu42XX36Z8vJySktLHddnZ2fz7rvv8r3vfY+nn36aESNG8Mc//rFX23qFCBT7LElAOj9rGmNf+BO4qMegYMutL3zpCYrmXikpGy+1mPS8++oIPtnUcWr6upWlLLymMqjao0zOrGT99//C+j0T2XokG3O7nkmZldw05yBjhtUEenhiAOjN61xPRSPHJHi2tVfRtO7WaAeHhoYG4uPj+dV7+4mIipYaI2JQiT5VTO4LT/V43OvX38P7V37F5+cfqItly0sjeeb/jcfc5vrFMntcI9959KhPznXwXD0z87K5anwqVtVKtsGE3lRLy7HDmFuRrr0iJNm79iaNTSduwRIMSSkUmxQKSppQFB3bd51Ab23l9Z+soL6+nri4OLf3FVofozRNetCIQSesqcGj477y7p9IvPFqqqfO9Nm5N3xUNCB371jaFV58bKzbQASg5GgsRQfiyJ3m2e9fBAFNI/bkMWKPH0XX3k5T9ijqJkwBvWefzoV3POn11WJq5HUP7iukgpErsqKlB40YdNpj3X+acKZoMOmpX/CPZ9/w2bmdF6XBwJklOfjJEJrqu2u+ZivF9dKvxvKr1/b4a1iiD8Lq65jw5C/Rt7U6LkvZuQ2AI9/9ES3DRwRqaANed0Uj/7XXs2A+pIKREW1VmPfvl9kQMaiYMkbSlpiEsbam+yZ9msrwQ3u5JtJEe2aWz84/EGucHP8sDrqt/Wm7XLUG2UpW4ZqmMeE3v0Bvtm2vP3Pdl1CNRka8tw59ayvjf/e/HHjk16hGKRnRX9wVjbwiK9qj24dUMKKeOc7pnYcACUTEIKLTceb6LzPqlRd6LJ0NkFF7Gi0nuYejPOeLlfLBRlUlyOiR1UrCkYMMObAXg6mJtuSh1MyciylzZNBVWEs4uN8RiOx/9P/QwmyzXjUz5jD+t78isrKcYQXvUXbtFwI5zAHPVdpm5OhpHt02pIKRM1v2YkzNDfQwhPC7hnETqZq3iJQdW3s81lx9Gm2/7zrYOleg9bbteLAaOa6JvduSujnCFvbNXVbZzTEDl95kYsxLzxJ17iyaoqBoGjGlJSTv+ZjqmZdR+oWvEkxbjVK3/weA4lvvdAQiAOh0FN96JxN/8wtSC/8jwYifOKdthpg8ey0KqWDEHJ9Jd1leIQay8mXXMnT3DpT2dpfXa4qCaUQ6pw6WwEHP2nt7wjkH3Nu248Emb0EN7/x1BG0telzPNdkuGzu1nj//72jOnIhmzJQGFl5TyYgc3wV6wSr7jVeIrLAV11Mubri0l2tP2vMxbclDqVwUPGXaw+rrADDHD+lynavLRP+zp23ObNnr0fEhFYwIMZip4RGULb+BjHf+0eU6TVHQdDrOXn8z5gTfrRcB37UdDybhESp3/OgEf/zlGCztOlwFJCkjmnnl15eKcO3blsy+bcnMXHyer3z7lM8yFeWFuyCI0s4RleXEHXe/pVkBUrb/h8oFS4Jml0pD7niS93xM0p6dNGd0fPwPOWirTGuRaq5+Z04Yibm1xaNjJRgRIoScn78INczA8I3vEmZqclzempJG6Yqbu7wQ+0J/tB33td4EQ6MmNvKD3xym8L0U9n+URFurjuhYC9Pm1WK1KhS+lwbATd8qIS2jheIjsbz7agZ7tgwlYkQlOTMrPD7XzLxsNE3FqlrR2pqx1FdhLi2iqbTM63H3t7jjRx2pGXfCTE1EVpTRkp7px5G5V37l1STv+Zihu3bQNGosFybngaIQfaqYkW/9DYDib9wd4FGK7kgwIkSIqZk9n5oZlxFbcgJ9s4m2pGRahmf066JCX7Yd97W+zM4kpbZx4x1nuPGOS6XU62vD+Pm3pgHw499+RnKabWFk5hgTI3JMvPDoOApfncQXVkYRFu5ZzUhNUy8Va6wP8hpJqsql2r7uKVa12+v9qT1hCGXLryd9w7/Jfu1lsl97ucP19bkTaMoeHZjBCY9IMCKEDyhmM0MOf0p4zXkskVHUTZpKe3/mqvV6Gkf7dzG3L9uO+5KvF9WeKooBYPz0OkcgYteSeBYYB8Aow1Bycz17Q9bamsk2mEKiRlLziEwUrfufSw0LozU1zU8j8kzl4nxaU9MY9Zc/dLi89IabqL5sQYBGJTwlwYgQfTTk071krnsDXVsrmk6HommMeHcd52fP5+z1XwqavLqv9LXtuK/5elGt1WKbYYpNuLRQ2B7ozMzLZt0QC40XDCRbWsk2uF5M3JmlvgrzsaKgD0QAmrJH0zI0lYjq8y6DEk1RqJ5xGWp4RABG17368ZPZt+a36FpbUKwq1qiooNuGLFyTYESIPogr+pyRr78C2Ca27TsOAIZ+UgjA2RW+7xcTaK7ajkeOnRiQsWRH+7YWyrAs24K7XZuHcv3KUo7XXaCl3crC2aOpPKOn8YLtZXP0KAt6U22P99dy7DBA8KZlOlMUSm69k7EvPo2+pdURkNiTNs3DMzh31fWBG58H1IjIQA9BeEmCESH6YPjGd8DNYj8FGLrrIyqvyO/flE2AdEzbpAd0LJ0X1Tp3DfU2KBmW2UL2uAZKjsbxvz8Yz/w793L1NcMZ3prCf389FoBVX/2cqOKDeLJPIBRmQzprTR3GkftXM3THVhL37cLQ0kLbkESq5yygevbcjrU8hPCBkOrau/XhXxEjEa8IEsbaaib9+tFuj9EUhbPXfoHz8xf7Z1ABYu/eGShZS2ejy8zFkJRCiSWajUer+hSQfPJ5K2/9bKHL68KNVrbf9/+IDPMsRQMhMBsiRD9pam1h0SM/HmBde4UIIvqWnj8Xa4ri0XGhLtBvtr6shXLwXD1KtJVfvVdM0TvpvPT7S/1MfnrTVr6Q9S5hemvAf2YhBhIJRoToJXPCkB7rMSiqijnJd31ihGvuFtW6Stv0xL4+JD83CW1iLb9/tGuncHM//ixCDEYSjAjRS9boGOomTiHh84MdFq7aaYAaHs6FiVP9P7hBqPOiWguQnWSrhbLxaBUz87I9uh9NU8nPTXbUBDEfC+KaIEIMEBKMCNEHZVevIKb4BIbWlg4BiaYooGmUrvgqmlEW+/mLL2qhuKoJ4nzfou8Us5mwxnqsEZFYo2MCPRwRBCQYEYOX1WqrQdCH7qPmxCSK7v0B6e+vJ+HwZ46UTfOwdMqXXUdD7gRfjVZ4ocMsCXhXC8VASBQnC0WGxgaGffg+Sft2obPYFgA3Zo+mfOnVNOWMCfDoRCBJMCIGF1Ulae8npHy0hcjKcjRFoWF0LpWLltI0amzPt3fBnJhEya13oTc1Yay/gDUiCnNid+3phT/Yu4ae/nCXoxaKpyQt43uGxgbG/f4JwhrqO8wixpw6yZg/PkPJ1+6kbpKkNAcrCUbE4KGqZP39ryR+eqmltaJpxJ04Rvzxo5SuuJnqOfN7fffW6BhaBvGUs95kImnvx8SUlqApCo05Y6nNmxnQAlTOaZve3lb4xvAN/+4SiIDtOagBmf/4G/W546WGySAlwYgYNBI/3UuSUyBiZ68wmfH232kYk4s5UXa/eCuu6HOy//YndBYLaBooCgmHPmV4wTucuP3bNGeODOj4JLAILF1rC4kH9rhc6A22AoGG1laGHPqU2rxZ/h2cCAqBa7UphJ8N3bHVtrC0G8m7dvhpNANHeHUVOX/9A7r2dhRNs5XFv/ivvrWV0X/+PYamxkAPUwSQsb4OndXa7TGqTk9EVaWfRiSCjQQjYtCILD/XfU0QTSOq7Izb64VrQ3dscwQfnSmahr6tjaQ9H/t9XCJ4WMPDezxG0VSPjhMDkwQjYtDQeuieqykKaliYn0YzcCR8/pnb6XcANI34Iwf9NyARdNoTEmkelt7tzKSiabKAdRCTYEQMGnUTJqN1t41X06gfP9l/AxogFIul++sBXbvnfVzEwFS+9BrHYtXONEWhdsp02pI93H4tBhwJRsSgUbVwCYDrF0Odjva4eC5Mne7fQQ0AzSMyuw3yNJ0OU8ZI/w1IBKX6CZM59aWvoRkMturEer3jcXNh0jROf/lrgR2gCCjZTSMGjZbhIyj+2h1kv/6KreDZRYqm0R4bx/E770U1Ss7aW1XzFhFf9Lnb6xVVpfqyBX4ckQhWtTMvo37iFIYc2Et4zXmsEZHUTZ5Ga+qwQA9NBJgEI2JQqZ84lYM/eZSkvZ8QffY0mt5A/djx1E2ehmaQ9SK90ThmHJULl5C6fXOHxoGaokPRVM5es4KWYekBHqUIFtbIKKrnLgz0MESQkWBEDDrW6BiqLr8y0MMYOBSFsqtvxJSRRUrhFqLPnAJFoTFnDJULl9A4dnygRyiECHISjAgh+k5RqJucR93kPFvRs4uXCSGEJyQYEUL4lgQhQggvyW4aIYQQQgRUr4KRZ599lpEjRxIREcGcOXPYtct9E6qXX34ZRVE6fEVERPR6wEIIIYQYWLwORt544w1WrVrFww8/zL59+5g6dSrLly+nqqrK7W3i4uIoLy93fJ0+fbpPgxZCCCHEwOF1MPKb3/yGe+65hzvuuIMJEybw/PPPExUVxUsvveT2NoqikJaW5vhKTU3t06CFEEIIMXB4FYyYzWb27t3L0qVLL92BTsfSpUvZuXOn29s1NTWRlZVFRkYGN954I4cPH+72PG1tbTQ0NHT4EkIIIcTA5FUwUl1djdVq7TKzkZqaSkVFhcvb5Obm8tJLL/H222/z6quvoqoq8+bN4+zZs27Ps2bNGuLj4x1fGRkZ3gxTCCGEECGk33fTzJ07l5UrVzJt2jQWLVrEP//5T4YOHcoLL7zg9jarV6+mvr7e8XXmjLR1F0IIIQYqr+qMJCcno9frqays7HB5ZWUlaWlpHt1HWFgYeXl5nDhxwu0x4eHhhIdLjxAhhBBiMPBqZsRoNDJjxgw2bdrkuExVVTZt2sTcuXM9ug+r1crBgwcZNkwaIwkhhBCiFxVYV61axW233cbMmTOZPXs2Tz31FCaTiTvuuAOAlStXkp6ezpo1awB49NFHueyyyxg9ejR1dXX8+te/5vTp09x9992+/UmEEEIIEZK8DkZuvvlmzp8/z//8z/9QUVHBtGnT+OCDDxyLWktLS9HpLk24XLhwgXvuuYeKigqGDBnCjBkz2LFjBxMmTPDdTyGEEEKIkKVomr2rVfBqaGggPj6erQ//ipiIyEAPRwghhBAeaGptYdEjP6a+vp64uDi3x0lvGiGEEEIElAQjQgghhAgoCUaEEEIIEVASjAghhBAioCQYEUIIIURASTAihBBCiICSYEQIIYQQASXBiBBCCCECSoIRIYQQQgSUBCNCCCGECCgJRoQQQggRUBKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQEowIIYQQIqAkGBFCCCFEQEkwIoQQQoiAkmBECCGEEAElwYgQQgghAsoQ6AEIIYQQYuAx1p3C2Nbm0bEyMyKEEEIInzLWnSJpbDoZi2d4dLzMjAghhBDCZ+yBSExmOq2jp3l0GwlGhBBCCNFnxrpTAGQtnY0uMxdDUgpFF6we3VaCESGEEEL0ifNsiC4zl9KIVBRLFJuPFXt0ewlGhBBCCNFrzoGIMW8hxSYFJTyKgqJqdu4r8eg+JBgRQgghRK8Y606RtXS27f95CymxRKOEQ0FRNXv2lxARpvfofmQ3jRBCCCF67fSHuwCw1FSRbTABoGkqM/OyPb4PmRkRQgghRK+YE0YCtoAkaWwZMZnpZOctJD87BiU8ihZTFq97cD+9mhl59tlnGTlyJBEREcyZM4ddu3Z1e/ybb77JuHHjiIiIYPLkybz33nu9Oa0QQgghgpA5YSQ1x8poKi3DvH87ma2VaG3NLBmT5NHtvQ5G3njjDVatWsXDDz/Mvn37mDp1KsuXL6eqqsrl8Tt27OCWW27hrrvuYv/+/axYsYIVK1Zw6NAhb08thBBCiCBlD0hOf7gLtbSIzNZKsgzNHt1W0TRN8+Zkc+bMYdasWTzzzDMAqKpKRkYG3/3ud/nJT37S5fibb74Zk8nEO++847jssssuY9q0aTz//PMuz9HW1kabUwnZhoYGMjIy2Prwr4iJiPRmuEIIIYTwM/sOGzVpCCNW3El9fT1xcXFuj/dqZsRsNrN3716WLl166Q50OpYuXcrOnTtd3mbnzp0djgdYvny52+MB1qxZQ3x8vOMrIyPDm2EKIYQQIoDssyRntuz16HivgpHq6mqsViupqakdLk9NTaWiosLlbSoqKrw6HmD16tXU19c7vs6cOePNMIUQQggRYOaEkZjjMz06Nih304SHhxMeHh7oYQghhBDCD7yaGUlOTkav11NZWdnh8srKStLS0lzeJi0tzavjhRBCCDG4eBWMGI1GZsyYwaZNmxyXqarKpk2bmDt3rsvbzJ07t8PxAAUFBW6PF0IIIcTg4nWaZtWqVdx2223MnDmT2bNn89RTT2EymbjjjjsAWLlyJenp6axZswaA+++/n0WLFvHEE09w7bXX8vrrr7Nnzx5efPFF3/4kQgghhAhJXgcjN998M+fPn+d//ud/qKioYNq0aXzwwQeORaqlpaXodJcmXObNm8fatWt56KGHePDBBxkzZgzr169n0qRJvvsphBBCCBGyvK4zEggNDQ3Ex8dLnREhhBAihDS1trDokR/7ts6IEEIIIYSvSTAihBBCiICSYEQIIYQQASXBiBBCCCECSoIRIYQQQgSUBCNCCCGECCgJRoQQQggRUBKMCCGEECKggrJrb2f2umymttYAj0QIIYQQnrK/b/dUXzUkKrCePXuWjIyMQA9DCCGEEL1w5swZRowY4fb6kAhGVFXl3LlzxMbGoihKoIcTtBoaGsjIyODMmTPdlt0V/U/+FsFB/g7BQ/4WwcOffwtN02hsbGT48OEd+tZ1FhJpGp1O121EJTqKi4uTJ3uQkL9FcJC/Q/CQv0Xw8NffIj4+vsdjZAGrEEIIIQJKghEhhBBCBJQEIwNIeHg4Dz/8MOHh4YEeyqAnf4vgIH+H4CF/i+ARjH+LkFjAKoQQQoiBS2ZGhBBCCBFQEowIIYQQIqAkGBFCCCFEQEkwIoQQQoiAkmBECCGEEAElwcgA8uyzzzJy5EgiIiKYM2cOu3btCvSQBp1t27Zx/fXXM3z4cBRFYf369YEe0qC0Zs0aZs2aRWxsLCkpKaxYsYKioqJAD2tQeu6555gyZYqj2ufcuXN5//33Az2sQe/xxx9HURQeeOCBQA8FkGBkwHjjjTdYtWoVDz/8MPv27WPq1KksX76cqqqqQA9tUDGZTEydOpVnn3020EMZ1LZu3cq9997Lxx9/TEFBAe3t7SxbtgyTyRTooQ06I0aM4PHHH2fv3r3s2bOHJUuWcOONN3L48OFAD23Q2r17Ny+88AJTpkwJ9FAcpM7IADFnzhxmzZrFM888A9iaC2ZkZPDd736Xn/zkJwEe3eCkKArr1q1jxYoVgR7KoHf+/HlSUlLYunUrl19+eaCHM+glJiby61//mrvuuivQQxl0mpqamD59Or///e/5+c9/zrRp03jqqacCPSyZGRkIzGYze/fuZenSpY7LdDodS5cuZefOnQEcmRDBob6+HrC9CYrAsVqtvP7665hMJubOnRvo4QxK9957L9dee22H94tgEBJde0X3qqursVqtpKamdrg8NTWVo0ePBmhUQgQHVVV54IEHmD9/PpMmTQr0cAalgwcPMnfuXFpbW4mJiWHdunVMmDAh0MMadF5//XX27dvH7t27Az2ULiQYEUIMaPfeey+HDh2isLAw0EMZtHJzczlw4AD19fW89dZb3HbbbWzdulUCEj86c+YM999/PwUFBURERAR6OF1IMDIAJCcno9frqays7HB5ZWUlaWlpARqVEIF333338c4777Bt2zZGjBgR6OEMWkajkdGjRwMwY8YMdu/ezdNPP80LL7wQ4JENHnv37qWqqorp06c7LrNarWzbto1nnnmGtrY29Hp9wMYna0YGAKPRyIwZM9i0aZPjMlVV2bRpk+RlxaCkaRr33Xcf69atY/PmzWRnZwd6SMKJqqq0tbUFehiDypVXXsnBgwc5cOCA42vmzJnceuutHDhwIKCBCMjMyICxatUqbrvtNmbOnMns2bN56qmnMJlM3HHHHYEe2qDS1NTEiRMnHN+XlJRw4MABEhMTyczMDODIBpd7772XtWvX8vbbbxMbG0tFRQUA8fHxREZGBnh0g8vq1au5+uqryczMpLGxkbVr17JlyxY2bNgQ6KENKrGxsV3WTEVHR5OUlBQUa6kkGBkgbr75Zs6fP8///M//UFFRwbRp0/jggw+6LGoV/WvPnj1cccUVju9XrVoFwG233cbLL78coFENPs899xwAixcv7nD5n//8Z26//Xb/D2gQq6qqYuXKlZSXlxMfH8+UKVPYsGED+fn5gR6aCCJSZ0QIIYQQASVrRoQQQggRUBKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQEowIIYQQIqAkGBFCCCFEQP1/pYn82dx6vUcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result = cc.get_result(dispatch_id, wait=True)\n", + "result.result.load()\n", + "\n", + "train_acc, test_acc, decision_boundary_figure = result.result.value\n", + "print(f\"Train accuracy: {train_acc * 100:.1f}%\")\n", + "print(f\"Test accuracy: {test_acc * 100:.1f}%\")\n", + "\n", + "decision_boundary_figure" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion\n", + "\n", + "In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a 2-dimensional dataset. To make the most of this tutorial, try experimenting with different datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU acceleration.\n", + "\n", + "The cost of running this workflow is approximately $0.27. The full code is available below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Full Code" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "import covalent as ct\n", + "import covalent_cloud as cc\n", + "import matplotlib.pyplot as plt\n", + "import pennylane as qml\n", + "from matplotlib.colors import ListedColormap\n", + "from pennylane import numpy as np\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.inspection import DecisionBoundaryDisplay\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "\n", + "cc.save_api_key(\"API_KEY\")\n", + "\n", + "cc.create_env(\n", + " name=\"pennylane-gpu\", # identifier for referring to this environment\n", + " conda={\n", + " \"channels\": [\"conda-forge\"],\n", + " \"dependencies\": [\"cudatoolkit>=11.8\"],\n", + " }, pip=[\n", + " \"cuquantum==23.10.0\",\n", + " \"matplotlib==3.8.2\",\n", + " \"Pennylane==0.34.0\",\n", + " \"PennyLane-Lightning[GPU]==0.34.0\",\n", + " \"scikit-learn==1.3.1\",\n", + " \"torch==2.1.2\",\n", + " ],\n", + " wait=True\n", + ")\n", + "\n", + "cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks\n", + " env=\"pennylane-gpu\",\n", + " num_cpus=2,\n", + " memory=\"2GB\",\n", + ")\n", + "gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations\n", + " env=\"pennylane-gpu\",\n", + " num_cpus=4,\n", + " memory=\"12GB\",\n", + " num_gpus=1,\n", + " gpu_type=\"v100\"\n", + ")\n", + "\n", + "QML_DEVICE = \"lightning.gpu\"\n", + "\n", + "def get_kernel_circuit(n_wires):\n", + "\n", + " @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None))\n", + " def circuit(x1, x2):\n", + " qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4)\n", + " qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4)\n", + " return qml.probs(wires=range(n_wires))\n", + "\n", + " return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability\n", + "\n", + "@ct.electron(executor=cpu_executor) # lightweight non-quantum task\n", + "def get_split_data(n_samples=18, test_size=0.2):\n", + " centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]\n", + " X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False)\n", + " # rescale labels to be -1, 1\n", + " mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1}\n", + " y = np.array([mapping[i] for i in y])\n", + " X = X.astype(np.float32)\n", + " y = y.astype(int)\n", + "\n", + " # X_train, X_test, y_train, y_test\n", + " return train_test_split(X, y, test_size=test_size, random_state=3)\n", + "\n", + "DISP_SETTINGS = {\"grid_resolution\": 50, \"response_method\": \"predict\", \"alpha\": 0.5, \"cmap\": plt.cm.RdBu}\n", + "\n", + "@ct.electron(executor=gpu_executor)\n", + "def classify_with_qsvm(Xtr, Xte, ytr, yte):\n", + " kernel = get_kernel_circuit(n_wires=Xtr.shape[1])\n", + "\n", + " kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel)\n", + " svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr)\n", + "\n", + " # train/test accuracy\n", + " accuracy_tr = svc.score(Xtr, ytr)\n", + " accuracy_te = svc.score(Xte, yte)\n", + "\n", + " # decision boundary\n", + " cm_bright = ListedColormap([\"#FF0000\", \"#0000FF\"])\n", + " disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS)\n", + " disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright)\n", + " disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker=\"$\\u25EF$\")\n", + "\n", + " return accuracy_tr, accuracy_te, disp\n", + "\n", + "@ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor)\n", + "def run_qsvm(n_samples, test_size):\n", + " Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size)\n", + " return classify_with_qsvm(Xtr, Xte, ytr, yte)\n", + "\n", + "dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2)\n", + "print(\"Dispatch ID:\", dispatch_id)\n", + "\n", + "result = cc.get_result(dispatch_id, wait=True)\n", + "result.result.load()\n", + "\n", + "train_acc, test_acc, decision_boundary_figure = result.result.value\n", + "print(f\"Train accuracy: {train_acc * 100:.1f}%\")\n", + "print(f\"Test accuracy: {test_acc * 100:.1f}%\")\n", + "```" + ] + } + ], + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From b6b1038a4e8d639d974ff8b5f7862d9f36852871 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Mon, 13 May 2024 17:30:39 +0530 Subject: [PATCH 02/18] renamed and improved slightly --- ...Tutorial.ipynb => covalent_cloud_gpu.ipynb | 48 ------------------- 1 file changed, 48 deletions(-) rename PennylaneTutorial.ipynb => covalent_cloud_gpu.ipynb (97%) diff --git a/PennylaneTutorial.ipynb b/covalent_cloud_gpu.ipynb similarity index 97% rename from PennylaneTutorial.ipynb rename to covalent_cloud_gpu.ipynb index 6ae77bb4cd..16739350ed 100644 --- a/PennylaneTutorial.ipynb +++ b/covalent_cloud_gpu.ipynb @@ -255,46 +255,6 @@ "execution_count": 8, "metadata": {}, "outputs": [ - { - "data": { - "text/html": [ - "
/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/rich/live.py:231: UserWarning: install \"ipywidgets\" \n",
-       "for Jupyter support\n",
-       "  warnings.warn('install \"ipywidgets\" for Jupyter support')\n",
-       "
\n" - ], - "text/plain": [ - "/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/rich/live.py:231: UserWarning: install \"ipywidgets\" \n", - "for Jupyter support\n", - " warnings.warn('install \"ipywidgets\" for Jupyter support')\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n"
-      ],
-      "text/plain": []
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "text/html": [
-       "
\n",
-       "
\n" - ], - "text/plain": [ - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "name": "stdout", "output_type": "stream", @@ -320,14 +280,6 @@ "execution_count": 10, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/neptune/anaconda3/envs/qml/lib/python3.10/site-packages/covalent/_workflow/transportable_object.py:205: UserWarning: This figure was saved with matplotlib version 3.8.2 and is unlikely to function correctly.\n", - " return cloudpickle.loads(base64.b64decode(self._object.encode(\"utf-8\")))\n" - ] - }, { "name": "stdout", "output_type": "stream", From 33c464c799133c82f3012684a7550e1a216ccb92 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 14 May 2024 18:08:53 +0530 Subject: [PATCH 03/18] adding .py file --- covalent_cloud_gpu.ipynb | 473 ------------------ demonstrations/covalent_cloud_gpu.py | 355 +++++++++++++ .../covalent_cloud_gpu_19_1.png | Bin 0 -> 36050 bytes 3 files changed, 355 insertions(+), 473 deletions(-) delete mode 100644 covalent_cloud_gpu.ipynb create mode 100644 demonstrations/covalent_cloud_gpu.py create mode 100644 demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png diff --git a/covalent_cloud_gpu.ipynb b/covalent_cloud_gpu.ipynb deleted file mode 100644 index 16739350ed..0000000000 --- a/covalent_cloud_gpu.ipynb +++ /dev/null @@ -1,473 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Classification with GPU-quantum embedding kernels on Covalent Cloud" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Quantum support-vector machines (QSVMs) are essentially [traditional SVMs](https://en.wikipedia.org/wiki/Support_vector_machine) that rely on [embedding kernels](https://en.wikipedia.org/wiki/Kernel_method#Mathematics:_the_kernel_trick) evaluated on a quantum computer—a.k.a. [*quantum embedding kernel*](https://pennylane.ai/qml/demos/tutorial_kernels_module/#training-and-evaluating-quantum-kernels). These kernels provide a unique (and perhaps classically-intractable) means of measuring pairwise similarity.\n", - "\n", - "Using GPUs to simulate quantum computers is worthwhile when qubit capacity and/or fidelity requirements are not met by the available quantum hardware. While QSVMs are relatively tolerant to noise (an important reason for their current popularity), evaluating kernels on *real* quantum hardware is not always practical nor necessary.\n", - "\n", - "In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on Covalent Cloud." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let’s start by importing the required packages. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import covalent as ct\n", - "import covalent_cloud as cc\n", - "import matplotlib.pyplot as plt\n", - "import pennylane as qml\n", - "from matplotlib.colors import ListedColormap\n", - "from pennylane import numpy as np\n", - "from sklearn.datasets import make_blobs\n", - "from sklearn.inspection import DecisionBoundaryDisplay\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.svm import SVC\n", - "\n", - "# cc.save_api_key(\"YOUR_API_KEY\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Covalent Cloud allows us to create [re-usable execution environments](https://docs.covalent.xyz/docs/cloud/guides/cloud_custom_environments/), as shown below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Waiting for environment pennylane-gpu to be ready............................................................................................................................................................................\n", - "Name: pennylane-gpu\n", - "Status: READY\n", - "Estimated Time: 1002 seconds\n", - "Notes:\n", - "\tpip was added to the dependencies.\n", - "\tPython version 3.10 was added to the dependencies.\n", - "Environment file contains:\n", - "==========================\n", - "channels:\n", - "- conda-forge\n", - "dependencies:\n", - "- python=3.10\n", - "- pip\n", - "- cudatoolkit>=11.8\n", - "- pip:\n", - " - cuquantum==23.10.0\n", - " - matplotlib==3.8.2\n", - " - Pennylane==0.34.0\n", - " - PennyLane-Lightning[GPU]==0.34.0\n", - " - scikit-learn==1.3.1\n", - " - torch==2.1.2\n", - " - covalent-cloud\n", - "name: pennylane-gpu\n", - "\n" - ] - } - ], - "source": [ - "cc.create_env(\n", - " name=\"pennylane-gpu\", # identifier for referring to this environment\n", - " conda={\n", - " \"channels\": [\"conda-forge\"],\n", - " \"dependencies\": [\"cudatoolkit>=11.8\"],\n", - " }, pip=[\n", - " \"cuquantum==23.10.0\",\n", - " \"matplotlib==3.8.2\",\n", - " \"Pennylane==0.34.0\",\n", - " \"PennyLane-Lightning[GPU]==0.34.0\",\n", - " \"scikit-learn==1.3.1\",\n", - " \"torch==2.1.2\",\n", - " ],\n", - " wait=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we'll define our resource specifications by creating some [executors](https://docs.covalent.xyz/docs/user-documentation/api-reference/executors/cloud_executor) for this workflow. Both executors will run tasks in our new environment, named `”pennylane-gpu”`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks\n", - " env=\"pennylane-gpu\",\n", - " num_cpus=2,\n", - " memory=\"2GB\",\n", - ")\n", - "gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations\n", - " env=\"pennylane-gpu\",\n", - " num_cpus=4,\n", - " memory=\"12GB\",\n", - " num_gpus=1,\n", - " gpu_type=\"v100\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "On to the algorithm!\n", - "\n", - "Here's a function returns a simple quantum kernel based on Pennylane's [IQP Embedding](https://docs.pennylane.ai/en/stable/code/api/pennylane.IQPEmbedding.html) template. We'll use it as-is inside our workflow." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "QML_DEVICE = \"lightning.qubit\"\n", - "\n", - "def get_kernel_circuit(n_wires):\n", - "\n", - " @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None))\n", - " def circuit(x1, x2):\n", - " qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4)\n", - " qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4)\n", - " return qml.probs(wires=range(n_wires))\n", - "\n", - " return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, each function destined for remote execution is decorated with `@ct.electron`, with an [executor](https://docs.covalent.xyz/docs/user-documentation/api-reference/executors/cloud_executor) specified therein. Only tasks that evaluate the simulated quantum kernel should require `gpu_executor`. For example, we don't need GPUs to generate our input data:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "@ct.electron(executor=cpu_executor) # lightweight non-quantum task\n", - "def get_split_data(n_samples=18, test_size=0.2):\n", - " centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]\n", - " X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False)\n", - " # rescale labels to be -1, 1\n", - " mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1}\n", - " y = np.array([mapping[i] for i in y])\n", - " X = X.astype(np.float32)\n", - " y = y.astype(int)\n", - "\n", - " # X_train, X_test, y_train, y_test\n", - " return train_test_split(X, y, test_size=test_size, random_state=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Classifying with the SVM, on the other hand, requires $O(n^2)$ kernel evaluations, where $n$ is the dataset size. Accordingly, we'll use GPUs (i.e. `gpu_executor`) to speed up this process." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "DISP_SETTINGS = {\"grid_resolution\": 50, \"response_method\": \"predict\", \"alpha\": 0.5, \"cmap\": plt.cm.RdBu}\n", - "\n", - "@ct.electron(executor=gpu_executor)\n", - "def classify_with_qsvm(Xtr, Xte, ytr, yte):\n", - " kernel = get_kernel_circuit(n_wires=Xtr.shape[1])\n", - "\n", - " kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel)\n", - " svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr)\n", - "\n", - " # train/test accuracy\n", - " accuracy_tr = svc.score(Xtr, ytr)\n", - " accuracy_te = svc.score(Xte, yte)\n", - "\n", - " # decision boundary\n", - " cm_bright = ListedColormap([\"#FF0000\", \"#0000FF\"])\n", - " disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS)\n", - " disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright)\n", - " disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker=\"$\\u25EF$\")\n", - "\n", - " return accuracy_tr, accuracy_te, disp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Putting it all together, we can define a QSVM training and testing workflow. This special function gets decorated with `@ct.lattice`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "@ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor)\n", - "def run_qsvm(n_samples, test_size):\n", - " Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size)\n", - " return classify_with_qsvm(Xtr, Xte, ytr, yte)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, to dispatch `run_qsvm` to Covalent Cloud, we call it after wrapping with `ct.dispatch`, as usual." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663\n" - ] - } - ], - "source": [ - "dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2)\n", - "print(\"Dispatch ID:\", dispatch_id)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what we get when we query and display the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train accuracy: 64.7%\n", - "Test accuracy: 76.9%\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGeCAYAAABGlgGHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACMP0lEQVR4nO3deXiU5dX48e8zM5nsC0lIAiEJCUvYIayyCSIBd+lirbXF/e2ifbV0xZ99rdoW+/a1aqt1aWu1tajVFmzdIEJZIii7AkJYEgiELCQh22SZzDzP749hhkkyk8wkk1mS87muXJCZZ+a5k8xy5j73fY6iaZqGEEIIIUSA6AI9ACGEEEIMbhKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQhkAPwBOqqnLu3DliY2NRFCXQwxFCCCGEBzRNo7GxkeHDh6PTdTP/ofXBmjVrNEC7//77uz3u73//u5abm6uFh4drkyZN0t59912vznPmzBkNkC/5ki/5ki/5kq8Q/Dpz5ky37/O9nhnZvXs3L7zwAlOmTOn2uB07dnDLLbewZs0arrvuOtauXcuKFSvYt28fkyZN8uhcsbGxALz3k0eIDo/o7ZCFEP3MWF9KxuIZRI4ejzV6CKctUeh1egqKqtj/2WkmpsX5fUyHKxpobbcCEBGmB+hxHIcrGsibkkV+bgpW1UqWoRm96QItJ45wZstezPGZ/TpmY30pAImjhxM793IMiUM5ZVL4z2kTKApoGkvGJpM9JKrLbdXGaiy151HPHOfMlr0A/TJeY30piaOHEz1iGLqMMZwNT0EJj2TzsWpQFJaMSUJra2FktIb50x2YzpZTe+Jcv//uhO/0+Dj0QGtzEw9/eaHjfdydXgUjTU1N3HrrrfzhD3/g5z//ebfHPv3001x11VX88Ic/BOCxxx6joKCAZ555hueff96j89lTM9HhEcRERPZmyEIIPzC2hhMXHUVkbAzW6FhiLNHodXoio1swRkQTERXjt7EcPFcPwLy5k9A0FQBF0bFnfwnH66xMHh7v9rbGCCuR0bHExMZhVa3EGfTode2ERUcREx6Oub9fhyJyATCfOQWRu4jITGdK3kJiYmNRwm0ByKjEroEIAHFxqLGxWGJiiIuOoqm0jJpjZZgTRvp8jOYzpzCfqSErOooJmTEYhsQQMyMHgGyDCUtNM+qJIip3HgLAmJqL0bejEP3Jg8dhT5oaG3gYelxi0atg5N577+Xaa69l6dKlPQYjO3fuZNWqVR0uW758OevXr3d7m7a2Ntra2hzfNzQ09GaYQohB6uC5elrarSycPZr83GS0tmYAxwvo9l0nOHiuvtuAJBiYE0ZSc+wUNcfKyAIyM3MxRKegixva7e10cUNtL+5JKcSwHYCaY6d8HpDY7+/0h7tIGltGTGY62XkLAbDUVKGWFnH6w10djhWhx93j0BMNhmaPjvM6GHn99dfZt28fu3fv9uj4iooKUlNTO1yWmppKRUWF29usWbOGRx55xNuhCSEGOftsSOdAJCdaA6DY1Gy7TFMp3F3sOD6YgxJzwkiMdaccb/hxC5Y4XrjdBSUna5uBaACy8xYSl1lFTGb/BQb2NyvAEfz024yMCIjOj8OYzHTPbmfqh2DkzJkz3H///RQUFBAR0X9rN1avXt1hNqWhoYGMjIx+O58QIvTZA4uZedlomkp+brItVVBfhflYEXDpE92ycbZPdfa0TbDPktjf0G1v+JuJyUzHmLcQteF8l4DkZG0zG49WoSg6NE1l2bgUtIhUMjMha6k9SOifWRL7p+fO4xYDg/PjsOZYGcMWzO7xNu1tPR4CeBmM7N27l6qqKqZPn+64zGq1sm3bNp555hna2trQ6/UdbpOWlkZlZWWHyyorK0lLS3N7nvDwcMLDw70ZmhBiEHOVlrGtWaiioXCz4w3SOZWQnx0T8mkbXWYuBi7NkDgHInv2l9DSbkVRdOTnJlNKKjl5/knbGOt8f98ieNhnScoLd/V4bFObZ9GIV8HIlVdeycGDBztcdscddzBu3Dh+/OMfdwlEAObOncumTZt44IEHHJcVFBQwd+5cb04thBAu2WdE7IEIQE60hnm//U23rNPMgi2VkJmZSympLtM2LRd331hVq+M81uhEAJLGpvfLG7mnXE2XG/MWUmxSUMKjUBQd23edIDJMT+TF3UMbj1ZdnA0yocvMJQbb76W/ggYJRAY+T//G5tYWj47zKhiJjY3tsh03OjqapKQkx+UrV64kPT2dNWvWAHD//fezaNEinnjiCa699lpef/119uzZw4svvujNqYUQwq3l83OpaTYDtl0maoMJAHNrx+M6zCwshcxMuqRtAEeax35/EIXacB7jxfUXsNkR2ATijddVcJWTt7DDmhjnn2XZuBTHTJEsKhXByOcVWEtLSztUWZs3bx5r167loYce4sEHH2TMmDGsX7/e4xojQgjhS+52gNjTNvZZhM5bZ+2pEAMQt2CJY0FoIFMS7nY5LBuX4vg57Ckr8/7tsqhUBK0+ByNbtmzp9nuAm266iZtuuqmvpxJCCJ/pvAPEnrZxFYg4c942m0X/LQj1lKu0jT24cl7AK4GICGYh0ZtGCCH6g7u0DXRf0EkXN5QT5dXkBHnaRtIyIlRIMCKEGNRcpW2MFwt3uarjYavhAQUlTba1GEkpQZu2kdkQESokGBFCCLqmbTpvm4WOW2cVRUdBUbVtwWiEbdtssKRtAJkNESFFghEhhLioc9rGAo6ApHMND7i0BTg/N5liUzM5eQv7tY6HNyQIEaFE1/MhQggxeJgTRmJOGMnpD3fRULgZ8/7tqA3n0dqaHVuA7UHIwtmjHU34cqI1LDVVAB2qkAoheiYzI0II4YK73TbOdTw0Tb20a6VTtVeZmRDCcxKMCCGEGz0VSbM34ZMaHkL0jQQjQgjRDXdF0gBHDQ9ZLCpE30gwIoQQHuictoFLW2ft1wshekeCESGE8JBz2sb5MiFE38huGiGE8IJ9t439/0KIvpNgRAjhcy3HDjv+b1Wtjv8fPFffL+fb8FERABuPVjkqpBrzFmKMsF1vrDvl83NKICKE70gwIoTwGXt9jqbSMsz7t5NtMKG12draz8zLpqXd6vOAZPLweAD27C+hcHcxG49WUWKJptikYMxbSNbS2SSNTe+XgGQwMdadkt+h6DeyZkQI4VOe1OewVzC1BxJ9Zb+fg+fqKdxdjKLo3FZFtY9ReM5Yd4qksemA/A5F/5CZESGEz9kCkjJOf7gLtbSIzNZKsg0mlo1LQdNUZuZlA75P20weHk9kmJ49+0soKKqmoKSJEks0xryFxC1YQtbS2UD/pG0GIvtsSNbS2cQtWCK/Q9FvZGZECNEv3NXnyM+OQQmPAmD7rhMcPFfvsxkSsAUkB8/Vs2d/CS3tVscsSTA1swsF9tkQexfjYpMCIL9D0S8kGBFC9CtXaRtDdIrf0jbbd50AOjazi8usAjZLysEF+4xH50DEHkBK6kv0B0nTCCH6Xee0jaWmqkvapr8Wt7pK2xiSUiTl4IL992BPyxjzFlJiiaagpMn2+5PUl+gnMjMihPCLQKZtAEnb9KBzWgawBSJF1R1mr2bmZVNQVE1+bjLZSSmQJL9D0XcyMyKE8Cv7LAmA3lRLTrQGwFXjU1k4e3S/ndc+SwKg1+kdAVDk2InEZKb323lDif3vYqmpclymaWqX45wvsx/rXJVWCG/JzIgQQgiPZq7AtvZGa2sm22CSbsXCZyQYEUII4dBdnRgAra2ZzNZKzMeKJBARPiPBiBBCiA6cGwJmLYXMTDBEpwBgqa9CLS3i9Ie7HMcK0VcSjAghhOjCVdoGkNkQ0S8kGBFCCOGWc9oGkEBE9AsJRoQQQnTLOSCRQET0B9naK4QImJZjhx3/t6pWx/99XfxM9J05YaQEIqLfSDAihPA7c8JITn+4i6bSMsz7t5NtMKG1NZOfm9xv1ViFEMFL0jRCiIDobgtpf/WsEUIEJ5kZEUIETOeeNZmtlV161oCkbYQY6GRmRAgRUIHqWSOECB4SjAghgoKrtI0hOkXSNkIMApKmEUIEjc5pG0tNVZe0jSxuFWLg8SoYee6555gyZQpxcXHExcUxd+5c3n//fbfHv/zyyyiK0uErIiKiz4MWQgxc9i2kpz/cRUPhZsdum/zsGPJzk1k4e7QEJEIMMF4FIyNGjODxxx9n79697NmzhyVLlnDjjTdy+PBht7eJi4ujvLzc8XX69Ok+D1oIMfDZZ0kA9KZacqI1AK4an8rC2aN7fb/bd53ggyOVABSbFKzRiQAkjU3HWHeqb4MWQvSKV2tGrr/++g7f/+IXv+C5557j448/ZuLEiS5voygKaWlpXg2qra2NtrY2x/cNDQ1e3V4IIVyZPDyeg+fqHWtPNE1l2bgUsvMWEpdZRUymNIATIhB6vWbEarXy+uuvYzKZmDt3rtvjmpqayMrKIiMjo8dZFLs1a9YQHx/v+MrIyOjtMIUQogP74tc9+0so3F3MxqNVlFiiKY1IRZeZS9bS2TJLIoSfeR2MHDx4kJiYGMLDw/nWt77FunXrmDBhgstjc3Nzeemll3j77bd59dVXUVWVefPmcfbs2W7PsXr1aurr6x1fZ86c8XaYQgjh1uTh8UweHk9kmJ7C3cUUFFWjhEdRGpGKMW8hMZnpEpAI4Udeb+3Nzc3lwIED1NfX89Zbb3HbbbexdetWlwHJ3LlzO8yazJs3j/Hjx/PCCy/w2GOPuT1HeHg44eHh3g5NCCG8ImkbIYKD18GI0Whk9Gjb4rEZM2awe/dunn76aV544YUebxsWFkZeXh4nTpzwfqRCCNEPnAOSlnZbs75l41LQIlLJyUshC2gqLaPm2CkJSIToJ32uM6KqaofFpt2xWq0cPHiQYcOG9fW0QgjhM+7SNsUmpUvaRlI3QvieV8HI6tWr2bZtG6dOneLgwYOsXr2aLVu2cOuttwKwcuVKVq9e7Tj+0UcfZePGjRQXF7Nv3z6+/vWvc/r0ae6++27f/hRCiAGt5dilhe9W1er4v69rjdgDkj37SxwBSYkl2hGQZC2d7dPzCSFsvErTVFVVsXLlSsrLy4mPj2fKlCls2LCB/Px8AEpLS9HpLsU3Fy5c4J577qGiooIhQ4YwY8YMduzY4XbBqxBCOLMXP0sam04M28nOW0ixSSE/Nxnon5419rQNgF6ndwQ/kWMndgiKhBC+41Uw8qc//anb67ds2dLh+yeffJInn3zS60EJIYSd9KwRYuCT3jRCiKAnPWuEGNika68QIiTYd7LY0jZlxGSmk523kPzsGJTwKKB/0jaiFzQNndmMptehGcICPRoRAiQYEUKEFEnbBDGrlZSd2xi6YyvhF2rRgMZRY6lcnE/j6NxAj04EMUnTCCFCjqRtgpDVyqi/vEj6u+sxXqgFQAFii08w5k/PkrR7R2DHJ4KazIwIIUKSpG2CS/Kuj4g7dgSl0+WKpqIBmev+TsPYCbTHJwRgdCLYycyIECKk2WdJAPSmWnKiNQCuGp/KwtmjWT4/t1czJNt3neCDI5UAFJsUrNGJANKzxo2UHdvcXmcLUDSS9uz013BEiJGZESECwPnNTEqMBx/pWeMlq5WI6qruj9E0IivO+Wc8IuRIMCKEn9kDEXs1T3lTC07d9azJzISspdKzxkGnQ9Xp0Kmq+2MUHarsrBFuSDAihB8Z607ZqolmpmPMW4ilpkre1IKYfa3JwXP1FO4uRlF05OcmU4qtiV4M2wHkb6co1I+fTMKRgyhuAhJFU6mfMNnPAxOhQoIRMaiF1dcRcb4Sq9FIc3om6PXdHh9+vhKDqYn2+ATMQ5I8Po/zbIguMxdDUgrFJgUi5E0tFEjapmeVi5aS8PlnaNBlEaum09E2JIm6CVMCMTQRAiQYEYNSWF0tGW+/RXzRYRTNtuCxPSaW8iXLqb5sISgdX05jTxSR/v7bRJ0767isceQozl73BVrSM7s9l6tApMQSTUGJLccub2qhobu0TU5eClkM7hmu5owsSr52ByPf+AtYrKAoaAroVJW2xGRO3PmdHoN9MXhJMCIGnbCGesY9+xsMzU2OQAQgrKmRzH+9RVhTE+X51zgujztyiFF//UOX+4k5XUzu809x7L/upzkjy+W5Oqdlik0KiiWKgqJqCncXO46TN7XQ4C5tU2xqJidvYYcZLhh8AWXdpGkczBlD0r5dRJ47i2YwUD9uEvW5EyQQEd2SYEQMOmmbN9gCETe57bT/bKB61mW0JySCqpK57g3QNBf1EzSwWsn415sU3fuDLvdjrDvlWKTqCETCbYHI9l0niAyzvTjLm5rvtBw7jDFvIYCj225/8DRtY6wbfAGlNSqaqgVXBHoYIsRInRExqCgWC0n7PnEbiNgl7dsN2NIzxsb6LoGI4/40jeizpURUVbi9r8ixE23Hhkeh19kCkMgwPZOHxzN5eDyRYXr27C+hoKiagpImSizRGPMWErdgyaVgRupadMucMJLTH+6iqbQM8/7tZBtMaG3N5OcmU9Ns7pdqrPZZkj37SyjcXUxBUTUllmhKI1Ix5i0ka+lsqUkihIdkZkQMKvqWZnTt7d0eoykKxjpbOevwCzUuF+R1ZqytoTUlrVdj6rwWwT5LImkb7wSiZ41z2mb7rhMAHWa44jKrgM0ywyVED2RmRAwq1ogINF33D3sFsERFw8V/ewpE7Mf1hfMsyfZdJygoqkYJj6LYpDhmSeyfsuWTtnuB6lnjbobLkJQiM1xCeEBmRsSgooUZuTBpKkMOfeq+HoKqUjttJgANuROwGo3ozWbX9weYE4bQPKL7HTWecrsW4eKb2mBei+CpQPWskRkuIXpPghEx6FQsuYqEI4dsi1KddtOALUVTO3UGrWnDAVCN4ZRfeTUj3n+7y/3Y0zfnrroBepht8cZgelNTVdh6JId/fDKJU+eHEBfVyjXTirhx5ufERroOAD0laRshQoekacSg05o6jGN330fbxaJlmqKgYSvMVD17PqVf+lqH46sWLqFs+fWoBoPtOMX2tFHDIzj9pVu4MHWGz8c4GNI2FqvCj9ZezQ9evZZPTmRQXhfHsXNDeeq9BXzlqVs5WxvX53NI2kaI0CAzI2JQskZG0TgmF8OnJhRLO+aERKoWLqFm1twuBc9QFCoX53P+sgUkHP6MsKZGzPFDqJswGc1o7NdxDuS0zZ+3zGTL4VEAqJotwLNvoK5pimLVX67ljftf6/Ln8JY/0zb1tWFUno3EEKYyfoyCwaANihkuIfpKghEx6MQeP8qoV15E0VTHupGImvNkrXud6NPFtpkRF2kXNSKS2hlz/D3cDltIZ+Zlo9fpKbFEk52Ugj7CQBaXmu2FinaLjtd2TKVr9RYbq6rjZGUy+0qGMyPHN51e7WkbY0o67N9OTt5CdHFRkJsMQFKUkQ0fFfUqIKmvDWP9S5kc3j0ETbP9TFExFhbfUM6iG+BwhW3mRa/TYw2PAkyOLd81x8p88vMJEcokTSMGFV1rCzmv/glFtXZYwGpfO5K0bxdJez8J1PAGjdKaBOqbI7s9Rq9T2VeS7qcR9V5Tg4FnHhrP53suBSIAzU0G3lubwb9e6X5x87AFs/t7iEIEPQlGxKCSuH83OnNbl4WrzlIK/+PHEYlQt+VfadTXGlFV17M8H72fSl1FlJ9HJURokWBEDCrRpadAcf+wV4DIqgqU9r7t5PAXTYM9RxN5dvtyfvvBPAoOjqbdEvxP68ykOuKjWro9xqrqmJET3CkMTYNdm4aiuQlEAHQ6jROfDPfjqIQIPbJmRAwuOh2aAor7iRGbbgKWYHG+Wsct38imcPck9IoVRQGLqmdIdDP/e+v7TM/2zVqL/hBmULll3qe88OEcl+tG9DqV7KG15I0M3p8BwNKu0GLq/mVU08B0IQIw+WdQQoSg4H/FFcKHGkbnouumL42mKDRl5aAZgjtOt1rh+q8ksnOfbfrfqumxqLa+N/XNEdz30o2UVA0J5BB7dMfiPVwx8SQAesX+N9FQ0EiKNfHEynf7vJOmvxnCNMKM3TfkU3QaETHdtyAQYrCTYEQMKnWTp2GOi3dbEl7RNCoXXennUXlv2yYDBz4zYrV2fbdWNR0WVcer2/MCMDLPGfQav/ra+zzxjXeYM6aU9CH1jE+vYtW12/n7A2sZkdgQ6CH2SFFg+uU16HTup9pUq46cmeV+HFUvqKptCkeIAAnuj39C+JhmCOPEHd9mzB+fxWBqBGzrRDSdDkVVKbvqeurHTw7sID3w/r/CMOg1LC6CEbCtt9jw2Vh++qXNfh6Zd3Q6WDyhhMUTSgI9lF674sYKPt2RSFurvsvaEUXRmDCzjuSsBiCJD45Ukn9xK7E1OtFxXEDqxGgaift2MfKtvzkuasrKpvSLt/S66aMQvSXBiBh0WtOGc/gHD5G0bzfxhz9FZ2mnZfgIzs9Z4CgDH6zsxc9KzqVisYZ1e2yLOQxN61rDbaCyqgofFWXx7v5x1DRGkZbQyA0zjzAr56zjd2BOGEl54S6SxqYTw3aMeQvR2hTyc5MpKKp2VGP1ptZIUmob337kKGufHkXl2UjsjQIUncbMxdV84c7THK3GUfwMbCXitTZbiXj2bydpbLp/i59pGmP++Ayxxcc7XBxzuoQJT/6S43d+h8Yx4/wzFtEn/VHFNxBF+CQYEYOSGhHJ+XmXc37e5YEeisecq7Gaw3To9NGobpcraKQnNgyaQKS5LYwHXrmOvSUjUNDQUFDQeP/AOK6YeII1X91AmMG2LqU/etYMz2rh+08c4vSxGM6diiTMqJE7rZ64Ie0d7idYetbEHznkCESO33UvjaPGojO3MazgPVI/2sKYl37P/kefQAvrPuAVgWMPQuytBXzFXhUY/BuUSDAiRAixv6k1zC/n2NZst8cpisZXp2zz17AC7hfrFjsKpNl359j//c/hUTz53gJ+dMOl34c9IKk5VkbWUrAA2UkpLBuXwsajVczMy/a6RLyiwMjcJkbmNrk9JljK+4/66x8AOPmNu2kcnQvYei2VXfsFEg5/SnjdBZL2fkz1ZQu9ul+duY0hn+4l9uRx0DRMmdnUTp+FNVLqrPiSse6UbXYv0/aYt1fz9ZWYzHS/t5mQYESIEDR/WhglV53k0w9G2fYpO1X+1Os08sZe4KvTCzHWWQZ835PK+mg2fJrrtrQ8KLz58WTuXb6T6PBLu1r82bPGmXN5/4D0rHHaTdZlfZSiUHb1jeS89jIxp4q9CkYiy0oZ/dJzGJpNjtzgkM/2MXzjvyn+xj2OoEf0jXMgYsyz/X2638/l5f1fvE9/907yajfNc889x5QpU4iLiyMuLo65c+fy/vvvd3ubN998k3HjxhEREcHkyZN57733+jRgIYTN1++s5eZ7i4kb2uy4LCZW4/b/MrFhg5ncq6c7OvsOZLtOZHQTiNiomo4PDoxxeZ1zZ1/z/u1ktlaSbTCRn5vMglk5zMzL5uC5+n7r7GvvylxQ0uSfrsxOuTulveuWY4PJVg/F4sVsht7UZFsU3tKMgm1XmqLZ/iq69nZGvfICxprzfR35oGZ/LGQtnU3cgiUY8xZSYonul69AdAf3amZkxIgRPP7444wZMwZN03jllVe48cYb2b9/PxMndp0m2rFjB7fccgtr1qzhuuuuY+3ataxYsYJ9+/YxadIkn/0QQgxWMxfVMOPyGj4+1EZzq0b+suEYwlQqiQnIWoRAqKyP8ei4z0qH8aU5n7u8zpwwEmPdKU5/uKtD2iY/O4aCkqZepW084Zy2mZmXTUFJU/+nbRSF5mHpRJWXMfzD9yi7ZsWlq8xmMv/1JgD1EzzfVZa852P0ba0u2ywomgaqytCd2ym77ot9Hv5g1Hk2pNikoFii2Hi0CqUfCjQGIn3oVTBy/fXXd/j+F7/4Bc899xwff/yxy2Dk6aef5qqrruKHP/whAI899hgFBQU888wzPP/8830YthCDR1RdNZM3/5uhp49jMYZzYtYiTs5YgKa3PX0VBeZODufguXo+PezHN7UgMXLoBQ+O0kiIau32CFdpm5xQTduoKmEN9YBGe1xCly7UJV+7k4lPPEbq9s0YL9RSPWsuYaYmRv79rwC0Jg/1ajdN/OefdVunRFFVEg59KsGIl+yzEV0CkfAoCoqqKdxdTGSY3ufnDUT6sNdrRqxWK2+++SYmk4m5c+e6PGbnzp2sWrWqw2XLly9n/fr13d53W1sbbW1tju8bGoK/+JEQrjSV2nqr2LaQNl9sH4/HW0gn/effLHvhl44Xek1RmLT1XWqGj+Sth35HY3Kq41jnN7WZednodXpKLNFkJ6WgjzCQhe2NdqCZN7YUBRWt26yz4nF5/A6LW8Enu208YZ8lse+20TSV/GwvZ7hUlaEfbydl+2bC62xBmjk+gar5i6mav9gRlLQlD6X4ltvJee1lhhw6wJBDBy7dhSGM4/f8t1dj17W395AoA51FqtD2VkxmOrpM25obJfzSjIg9EPHl4xACs+vL6/mdgwcPEhMTQ3h4ON/61rdYt24dEyZMcHlsRUUFqampHS5LTU2loqKi23OsWbOG+Ph4x1dGRoa3wxQCAKXdTMJn+0gp/A9DDuxB5xTk9re+rkXIOLSH5c89hqJa0WkqOk1Ff3Ev75CKM3z5F99Fcb+3d9CICm/nmrwibPU9XNFIimlifu4pj+/TeZZELS3CUlNl+9tlx6BpKjPzsh0BpS/Z15Hs2V+CougoKGmixBKN4eIMl30bp8v8vaaR+c/XGfHvf2CsuzRbFFZfR/p7622zHk6LV+umTOezB3/OuWXXYhqRRd3EKZz8+l0ceOTXtMd5/uambzbROjTVbVVjAE3R0Zwur+Pecvc4XDYuxW+PQ/t6JnePwx6/6ks9OqfXMyO5ubkcOHCA+vp63nrrLW677Ta2bt3qNiDpjdWrV3eYUWloaJCARHgtcc/HjHjnnxjaWtEUBUXTsIYZObfsWs4vuMIvY+jLWoQ5619B0+lc9tLRqVaSyk6RvX8HxTO82345EP3whm0cKRtKSVXixcWsts/piqJi1Fv59dffx6D3rtx5qKVtYo8fJXnvx13uzz5jkfjpXi5Mmd5hLYglNo6KK5ZTccVyr8cZXXKSYZveJ+7ksR6PVTSV8/MWeX0OEdy7vjzRYGqGp3o+zutgxGg0Mnr0aABmzJjB7t27efrpp3nhhRe6HJuWlkZlZWWHyyorK0lL677UcHh4OOHh4d4OTQiHIQf2MPIfax2fle0L6/TtZjLeXYem11M91z8Fz3rzpqZvN5P12S4Ut5/2warXM2rPdglGgNgIM6985y1e2zGVNz+ezPmGGMINFq6aVsTKy/cxcmhdr+87VNI2yZ985Ghr4Iqm6Ej+pNCrhanuxB/+jJy//cn1ebgUANk/BFTNvZyGseP7fN7BLBgfh54wNjZ6dFyfl+GqqtphfYezuXPnsmnTpg6XFRQUuF1jIoRPqCrp77/d4UWxs+Eb33W5rbE/eZO20Vkt3QYiAGhgaPdf2inYRYW3c9cVe/hg9Z/55OfP8NGjz/E/X9rcp0DEzjmgbCjcHJRpm8iqcreBCNhmJyIru0+Re0JpN5P11qtwcfuuK/ZLm4ePoOTmlZy9/kuDpy9BPwq29KEnX6ctnm0R92pmZPXq1Vx99dVkZmbS2NjI2rVr2bJlCxs2bABg5cqVpKens2bNGgDuv/9+Fi1axBNPPMG1117L66+/zp49e3jxxRe9/FUI4bno0yUYG7p/MhpaW4g7ftQnnxK94Zy2SRpbRtyCJS7TNvtqNBqSU4mtrnQbUOk0laqRY/06/lDhbUrGE/Y3AttsxOagS9uoBl23AbgGWCP6PuM85NCnGFrd70xSAFWn59P/93PUqOg+n090FEzpQ0+0mDybGfEqGKmqqmLlypWUl5cTHx/PlClT2LBhA/n5+QCUlpaic1rENG/ePNauXctDDz3Egw8+yJgxY1i/fr3UGBH9ytBs8vA492W7+5Onb2rvzbuRm//9B5dbJjUUrHoDhxdd67+BCyA4p8vjMqvQ3bAfXnzV/R0oChemzujzOCKqKlF1enTdLJ7WqVaMDfW0SjDSbwL9OLTfd4/jbPXw9dibQfzpT65zhHZbtmzpctlNN93ETTfd5M1phOgT85AhHh3XNiSpn0fSvc4vJrYcrMnRYr4m7wEOFe1l4rF9KBqOtI2q04Om8f59P6M1NsHr8w7EWiP+5ukMlz+LpFnuvgftzX9DXUOX9Imm02GJiKR61rw+j8EabkTR3KeD7NTwiD6fS3QvkI9DT7U2e1YHxfel24QIsJZhI2hOG47mJketYau90JQ92r8Dc8E5KNCbagEYlRjFVeNTUcOMHP7zG7x247eoTxkOgKrTcXLGAl577EWK5uW7vd89+0v44EglG49WUWKJxhqdiC4zt/utocIr5oSRjnVADYWbMe/fTk60Rn52DPm5ySycPbrf8vcASVFGx1S5Lm4ohpzRND/xMGpqCmB7rKg62xuBOS6e4/d8F0tMbJ/PXzdxqtu1ImBbtNo8LB3zkMQ+n0v0LFCPQ1+TRnli4FEUztz4Fcb88Xegqh1eOO0BSukXvtqlKmWPNI3Yk8dI3vUR4dXnsURFUzttJhemTkcLM/ryJ3BQw4xsXPxFyr92B/p2M1a9ocdxO396DkgjtkEmUNPlrmgZw6l7/kkaX/07kZW2YpFN2aOoz53o/ePdjbahqVyYnEfCoQNdZ2Cw7VwrX3q1T84lPBdMj8PekGBEDEimkTkcv+e/SX/3n8ScOe24vCV1GGXXfsH7DqKqStabr5J0YI9j+6SmKMSePEba1g85ds93sXhRKKo3rF4EPPYXm0BUUhyMupsu789FhS7pdTSNyqF2xsh+O8Wpm25lpKoy5PCnaDodGortOaHXU3rjl6mfMKXfzi3cC1TaxhckGBEDlikrm2Pf+T7h56sIa6jDEhNLa0par7YYpm0tIPHAHgDH9kn7p8Lw2mpy1r7EsW99z3eD95HOi80C0QBrsHC3MLnY1OxYB2R/I4Dg/HTqKS3MSMnX76K84hxDDu5H39pKW9JQavNmYvWi26/wvUDt+uorCUbEgNc2NIW2oSm9vr1isZBSuMXtlklFVYk5XUJkWSkt6Zm9Pk9/6ZdGbH7W1q6nsGgkNY1RJMc2Mz/3FOFhgS+Fr2nQ2m4g3GBxZEE8nS4PtjeD3mhNG0552vBAD0O4EGppGwlGhOhBRFVFj9uFNUUh7sSxoAxG7HzSiC0A1u+ewJPvLaCpNRwFDQ2FmIg2vn/tdm6YeSQgYzrfEMVftk1n/Z6JNLcZiQhr59rpR7lj0V6GDWkMrrSNGLRCKW0ju2mE6IkH2xhB8fC4wOpTI7YA+NfecTz2zytparWtl9Euzk81tRp55B9LeWef523ufaX8Qixff+Zm3tg5leY227ha28NYv3siX/vdVympsm0td7fLQWtr7rLLIdh3OojQFSq7bSQYEaIHrUPTsBq7r1ypaCqmrBw/jahvJg+PZ/LweEdAotfpHQFJ5NiJjoAk0NqtOn77/nxwWVdUATR++/48LFb/lhn/xboruGCKwqp2fPm0qjpMbUZ++veOW67tbwTmVhxvBKMSoxxvBMvne7mY+qINHxUBsPFoFSdrmwHQZeZivFjeI1gCShEc+tpFvL9JMCJEDzSjkeo5893XLdHpaElJo2nkKD+PbGDbW5zOBVMU7gucK9Q0RbOvJN1vYyqrjWPn8awugYidVdVxpCyVI2VD+3UczuuAFEXnqCdjSErxTT0ZTSO65CRDP9pC0u4dGGtrfDRyEUjd9VjKz03ut942npA1I0J44Fz+tUSWnSGu+LijE6kGoChYoqIp/vrd0gjMxy6YIn16nC8cr/Csau/xiiTGp5/v17H018Lk8POVTPzNL7pcfmHiVE7d/I1+q6kj/CNYd31JMCKEB7SwME7c+R0SD+xh6CeFGGuqsUZGUps3m+o5831S2VJ0lJbgWYMtT4/zhXCDxcPj/LfTx5cLk3VtbR0CkfIrryKsvo7kPR8z5PCnKGstFN/2zX76SYQ/BduuLwlGhPCUXk/tjDnUzpgT6JEMClMzyxk+pJ7yulg0rWtaRFFURiQ2MCWzwm9jmjaynCijmWaz+9kBg87KnNFn/DYm6L5njTf1ZIZv+DcAzWnpHL3vB6C3lZMvX3o1kx9/mISjh4N2C7vwXufdNjGZ6WQHqCaJrBkRQgQlnQ5Wr7DVd1GUjjuVFEVFAX5y4xa/ZscijRa+sXA/4Lo3i6JofGnOIRKiW/03qIucFyYX7i6moKiaEks0pRGpGPMWkrV0Nklj07tdR5KycxsAxSvvdgQiAO3xQyi76noAknft6NefQ/iX826bptKyLru+FszK8cuuL5kZEUIErXljS3nmzn/xxDsLOFmZ7Lh8VGot379uO7NHnfX7mO5aspuapkje+mQKep2KptmWC1lVHfmTj/O9awr9PiZnPaVt7LMk4D5tY3bR0bolzbZQOKK6qn8GLgLKXdpm2Thbwcj+TttIMCJEkGg5dhhj3kIArGrgq4sGizmjz/DG/a9xoiKJ843RDI0zMTq1JmDrhfU6jdUrtnLTZQd5Z994qupjSIxp5trpR7tdtFpeuMuxy0VtOA9EA1DTbPb5GLtL21iArKV0m7aJPl3cZat6wsH9AJhGZPl8vCI4BDJtI8GIEEHg9Ie2NypLTdXFJ2U0mqY63qiCoUJiICkKjBlWw5hhwbPFdHRaLQ9c85FHx9pf5JtKy4hhO8a8hY5p8IKiasc0uC//xr3ZbXP6CzeTte4Ncp9/ioOrH6P9YvPH2ONHSd77CQDn5y3y2RhF8Om42wZi2N5ht42mqRTuLvY4ZWNu7b56tZ0EI0IEmPPe/0AvIhP9J1C9QlylbZaNSyHbRdqmZuZcMv79T3SWdiav+SmWyCgMLc2O+zqXfy3t8Qk+G5sIXp6kbTzRYmrkdQ+Ok2BEiCBhf/KD7dNIsDe2Et4LVM+azmmbjUeruqRtbLMkpXz201+Ssf7vJO3f3SEQOfXlW2Un2SDjyQelnjQ1elaXRoIRIYJIh08jS8ECZCfZPo1sPFoVVI2tRO8EquiUq7TNlWOSaSOVCXkpxLD94rjKOP2Vb3Dmxq8QXl2JGhZOW/JQHG2JxaDj7oOSJxoMzT0fhAQjQgQdSdsMDoEqOjV5eDxbd1v56c2p/HdFDGC77ycfX85dN57qkLZpSR/ps/OK0Nb5g5K5tIjIsRN7vJ3e1OTR/UswIkSQCtQaA+E/gdi9cGRfPO/8emyXy7/3kwRe+OtEdv/DOW3jXSl5MbB1/KDkWU+oFpPMjAgR8pzfrJzTNvnZMRSUNEnaZgDwdvdCX/7O7WaFlx63BSJXfvEcV37xHEer6zh7PIbNz17G0cNh/GFzFt/5inPaRgIS0ZHzB6WeNLW1eXSfEowIEeScP43Yp0dz8hY6VrUDvZ7Ot++wyM9NptikkBOdCEDS2HR5E/IzfxSd2v0f25qUocNbuOqrtjcS233V8+PfnudX/z2UVd8Zwn13x2DMW2jbhpySTnnhLnksiA48fTyYW1s8Ok5WJAnhLVVF32xCMfu+WFVPzE5VxkclXlrNvnx+rtf3NXl4PJFherbvOkFBUTVKeBTFJsX2JpSZ3mPpcOF7nVu8m/dv92mL99PHYgBY9pVzXa6bMvfSg8sqNfeEn8nMiBAeUtrbSS3czNAd2whrsnWKbcgZQ+UVy2gc7X0wEAyct3xC9zUo5JOxf/Rn2iYq1tZ1uLEurMt1rc2XStrqdO667wjRPyQYEcIDSns7o1/6PTGni0G79DIdW3KC2OLjnA7hGgzOAUlLu+0j8bJxKd1W6hT9rz/SNpNnX6DwvTT+9XImsxafJyLqUgPCN5613cekaRYURYIR4V8SjAjhgZQdW4g5XYyidXyJVjQNDcj852s0jB2PJTYuMAPsI/ub2cFz9RTuLnaUDi82NZNzce0AXPq0LkGJf/h6m3fOhCbSc0yUFUfz09tn8MV7ThEb307Bv3IoPxYLwFMvNgOR/fUjCeGSrBkRoieaxtCd2zvMiDhTsAUlSfs+8e+4+oF9Hcme/SUUFFVTUNJEiSUaY95C4hYscTR6k7Uk/tW5xXtma2WvW7zf/eAx4obY1jv98w8jeeX/xlB+zNal955flpOeKXMiwv9kZkSIHujMZoz1dT0eF1FR3v+D8YPOaRtPGqyJ/te56FRmJr1K28TEWXjo+U85fjCOz3YOob7WSOzISu65L5pWQxvgWZlvIXxJghEheqAaDGiK0iVF04GioBo968EQCpzTNh23/3ZN20hA4j++StsoCoyd0sDYKQ2A7e8cHZdLq2f1qYTwOUnTCNETvZ6GsRPQuunNoagq9ROm9PtQygttO1ssNVWoDecB2w6YmmZzn7Z8umNP2wDodXrHG17k2InEZKYzbMFsSdkEgC/TNkIEA5kZEcIDFYvziTv2ORq2NSLONJ2OltRhNIwZ169jkJ41wpmv0jZC2Dl/sPD3jKcEI0J4wDQyh5Kv3sbIN18FixVNZwtJdKpKS+owTtzxbb91NXXXQVN61gw+EqAKX7AHIUlj04nJTHesCQP/BSVeBSNr1qzhn//8J0ePHiUyMpJ58+bxq1/9itxc9wWfXn75Ze64444Ol4WHh9Pa2urmFkIEp7op0zk4OpfE/buJrDiHZjBQN2EKjaPG+r29eudPxfaeNcvGpbDxaJX0rBlkXAWopaRKgCp6ZA9EspbORpeZiyEppUPBQ2Odf9aFeRWMbN26lXvvvZdZs2ZhsVh48MEHWbZsGZ9//jnR0dFubxcXF0dRUZHje0XpPNEtRGiwRkVzfv7iQA8DkE/FoqPu0jb2AFXSNsKZse6UYzbEmLeQYpOCYokKyM45r4KRDz74oMP3L7/8MikpKezdu5fLL7/c7e0URSEtLc3j87S1tdHm1OmvoaHBm2EKMai4q9Qpn4oHn34JUNstRJadw1jbTkvqMKzRMf00euEvzmmZuAVLMCSlUGxSKChpQlGaA1LwsE9rRurrbSu1ExMTuz2uqamJrKwsVFVl+vTp/PKXv2TixIluj1+zZg2PPPJIX4YmxKBiThiJse6Uo7OvPW2Tnx1DQUmTpG28EFFZTuzJY6BpmDKzac7ICvSQvOaTtI2qYnzjX0S/8S+SGpsA22Lt2inTOXvdFyUoCVGu0jIllmgKSqo6PC7c9anqr7SNomndFU9wT1VVbrjhBurq6igsLHR73M6dOzl+/DhTpkyhvr6e//u//2Pbtm0cPnyYESNGuLyNq5mRjIwMtj78K2IipEyxEN0x1p26VCk1byElFlsKtaCoulczJAfP1dPSbmXh7NG2N7O2ZnKiNcz7bZ+YTn84MNrLG5oaGfnGK8SdOIZ2MZWsaBqm9ExKvnYH5sSkAI/Qe+7eeDYe7fjGAzAzLxuw1ZMZlRiF7lv3oHvpFZe7x9oSkyn6ziqskVIgLZS4ezxAx9cHsD0e8nOTAcg2mAAw799+MW1T5vFzvqm1hUWP/Jj6+nri4ty3y+j1qrt7772XQ4cO8frrr3d73Ny5c1m5ciXTpk1j0aJF/POf/2To0KG88MILbm8THh5OXFxchy8hhOfMTuvDRyVeesNYPt/77sL2WiPbd52goKgaJTyKYpOCMW8hYJvqDfVaI0p7O2P++AyxxbYCb4qmOYrcRZWfZewLT6FvNgVyiL1iThiJOWEkpz/cRUPhZsz7t5NtMJGfHUN+bjIz87JpabfS0m5F01THmw+fforeRSACtpo64TXnGfrRVr/+LKLvnNN4amkRlpoqR6ChaaojIJ2Zl42m2ZoojkqMQhc3FMDRFsL+nPfl875XaZr77ruPd955h23btrmd3XAnLCyMvLw8Tpw40ZtTCyECwLlEPLifwoXQbKI35OB+Iitdl/NXVJWwxgaSd+2gcnG+n0fmGz1tBwdbp2Z74Kr7+StoBgOKxeLy/hRNI3nXR1Qsvdov4xe+48m6IntQ6vxBxh6QGIC4BUt8nrbxKhjRNI3vfve7rFu3ji1btpCdne31Ca1WKwcPHuSaa67x+rZCiMDp3LMGbG9gA6FnTeL+3d2X/L/YCDFUgxHofjs4dHzjUU6dAjeBiJ2xsQFU1e/b2oVvdLeuyPmx0JkubqgtcEjy7XPeq2Dk3nvvZe3atbz99tvExsZSUVEBQHx8PJGRtrUcK1euJD09nTVr1gDw6KOPctlllzF69Gjq6ur49a9/zenTp7n77rv7NHAhhP8596wp3F3saKLn75X3vmYwNXXbe0gBDKbQS9N05u5TsY3TG1ByMhgM3QYkVqMRY0Npj3/jxhYjZ2vjiTS2k5Vch1R2CB7utoP31CxRFzcUteG8LW2TWQVs7vNz3qtg5LnnngNg8eLFHS7/85//zO233w5AaWkpOqdI+cKFC9xzzz1UVFQwZMgQZsyYwY4dO5gwYUKvBiyECDxP0zb+KpjUV22JyURWlqOoqsvrNUWhLQQXsLrTeTu4LjMXA5em4tVbbsHw8stub6/p9Vivsa0dcPepuKYxkt99MI8PPs2l3Wrrb5SZfIH/unIXV0875vsfSvSKqwDVvh7M/njo7GRtM2Bb+JqdlOKTtI3XaZqebNmypcP3Tz75JE8++aRXgxJCBL/OaRv7LEkopm1qZs1lyOFP3R+gaVTPnu+/AfmBq+3g9jcE3eLFqFdcgbJtG4rV2uF2qk6PFh2D9j8/Iy463OV6oQumCG5/7iYq62Oxqpc+nJZWJ/DQG8upbYri1gUH+v+HFB7rnLbpHKCCPQjBsRsL8NlzXnrTCCF6zTlts32XbVG6c9rGV1O4/a1hzDguTJxCwucHu6RrNEXBlDGS2ryZARpd/3H3qVhtrIZ//IPmO+4m7u11AGgK6DSNuhFZvP+zp5kxfBzZBhMWIGtpxzehl/4zs0sgYmPL0Tz13nyWTz1Gcmyz/35Y0SNX64rsAYk9ECkoqqZwdzGRYXrH2jFNU8nPjnH5nCci1aNzSzAixABUXriLrKWzsdRUXXySR6NpKjXNZkd7eV8WP7PPkiRFGSkoqiY/NxldXBQGsL3BpaRTXrjLZ+fzOZ2OklvuYNim90nZsQ19m21vtGoIo3rWXM5ddT2aISzAg+w/9jehmMx09KZarNGJnDTr0P/hFdbd8t/wj3+SGW2gMjuXD+KyaalRqb34d7Z/KravF6o4Usr63RNdBCIdvbNvHLcv2uePH094wV2AqrUpjt02/UGCESEGGOlZ00t6PeXLrqPiimVEnSsDTaMlbRjqIC+02DhsBHvmX+94rEym40xY5/VCzbGnaDYbu71PRdE4WyOPvWDmSXdwoEshxC5F0VpbPDqfBCNCDFDSs6Z3tDAjpizvyxYMJs7rhWbmZbPxaJUtIElKIW6sgqJoaFp322YUYiPburleBIOetoODrTqrpb4K87G+1RqSDeJCDGDuKi7mZ8c4Ki7a0zZCeGPy8HgmD49nz/4SCncXU1BUTYklmuohKVy7vBW9zvXOJACrqmPZlON+HK3oLXdVfO1flpoqGgo397noocyMCDHAuUrb5EjaRviIq23etz0Qy4ZNCpqmoXaaIdEpKgvGnWJ8+vlADFf0kqvdNmppkde9atyRmREhBgnbi0mZrbHd/u1ktlbaZklyk1kwK4eZedkcPFcvsyTCa/Ygds/+EhRFx7mIcp57tZmERNvsiEGvolNs/1866QS//OqGgI1V9J7za4haakvL+CIQAZkZEWJQcVVbIjsphfzsGApKmpiZlx2ysyQ6cxvhNdWoBgNtSUOlTLmfOQckti7POrYcSGbzOyq1p/WE1xazeOQ+4uoPYzaODOxgRa85z7Q6f99XEowIMcg4v5hkLQVzaRE5eQs7LErbs78kZAISXWsLwze+S9Kenejb2wFoG5JExRXLqJl5GVJ/3Dstxw47KnBaVVsdieXzc9nwUZFHj4fOaRtlvMotX0gh25CCpWY6aml0SDdVFDa+/tsNymDE27bH8oQRA5W5FYwRtv+PSoxyFDayv/kEO11bG2Nf/C2RFec6FCszXqgh65+vYay7QHm+NOV0pd2qY9uRbHafHIGmQd7IMVz1wWaGTUgjhu1k5y2k2KSQn5tMQVG1V/VpumuqmJnZtUiaEIMuGDHWnSJpbDoxmekeHS9PGCGCV8qOLV0CEbDX+YRhmz+gdtpM2oamdL3xIHayMpHv/vkGKutjMehswcJbn0zhiZjLefaLL7JoUZnb2hKebgd311SxlI5F0uT1VcAgCkbssyFJY9OJW7AEQ5JnL06hUs5aiMEo+eNC6KZnlqbTkbxnJ2VX3+jHUQW3hpZwvvmHL1DfYpsSs6h6x3V1pgjueePbrI95nNRju7rUlth4tMrrdUWeNlUE719fqxuj+PT0MDQNpmRWkBIf+p2VB6tBEYzYA5GspbNtzX+SUtx2I+zMAD7pSCiE8DGrFWNDDzt/VBVjTbV/xhMi3t4zgbrmSJdFyVRNR7M5jNeOXM13ln3isyq+vk7bNLWG8fjbi9nw6VhUzbZQWaeoXDnpBA9+YQtxUlAt5Az4YMQ5LWO8mANVLFFQ62mDpuiQ7EIqxICn06EawtBZ2rs9xhoR4b8xhYAPPxvd3WQSqqaj4LMxfGfZJz6t4uurtE27Rcd9L93I4bOpjkDEPu5Nh0ZzunoIf/72m0SEWd3ehwg+AzYYcZWWKTYpFJQ0oSjedYrs3JGwL9OKQggfURRqp04naf9uFNV1tU9FVbkwZbqfBxbcms1hXFpV41pL+6WmgL7eDt7XtE3BwTEcPDPM5X2rmo5j5cm8fyCXL8z6vMexiOAxIIMRV2mZEks0BSVVHSJ5T83My6agpMnRe8HeMlvSNkIEVuXlS0n8bB9oWpdFrJqiw5SRSePo3ACNLjiNGVbN6eohbrvq6hWV0ak1HS7zdRXfvqRt3t4zHp2idpgVcaYoGut3T5BgJMQMuGDEXVqmoKiawt3FRIbpva6dYG8GpdfpKbFEk52Ugj7CQBaXCr8IEYrKC3eRtXQ2lpqqiy8G0WiaSk2z2autnIHSlpLK8bvuJftvL2FsbEDV6VAuBiYNo8dy6pbbpfhZJzfNOcSGT90HaFZNx1fmfubyumBI21Q1xLgNRAA0TUdVfUy35xbBZ8AEIz2lZbbvOtGrQESIgcrVp92+LFIMFFNWDod+/AjxRYeJOncW1WCgftwkWtOGB3poQSkv+xy3zN/Pax/loaChXUzZKKhoKFw3/SgLx51ye3vntE3S2DLiFizxW9oGIDWyhrNKvPuZEVRS4gbHrhpva2ZB8C4tGBDBiCdpGQlERLDQNNhdPIJ3942juiGKlHgT100/wvTscwEpFurLT7sBo9dTP2EK9ROmBHokIeH71xYyNq2Gv27Po7gqCYD0xAZuXXCAL8852OPj0P6GZit5sLlf0zb2zQN2d2vV7P7f0W7vS0PhSxO39XjOUOb84dvTmlkQ3BswQj4Y6Y+0jOiqqTWMT05kUtsUSdbQOmZkl6HXdbMkX7jU1q7nx2uvZvvRbPQ6FauqQ69T+dfeCVwx8QRrvrqBMIP71uv9ZSD3rBFdKQrcMPMI1884Qn1zBBqQENXqdTDsKpBt1VKp/WQ4n/09jbZmPR8nVDNmXhmLZ3efLnOXtik2NZNzsTw9wC0T4Q8fmtn/aRhWa8cB6/Ua40e3snJFBc2nTjvGOJC4+vDtqWAuNBeywYirP4ikZXxP0+BvhdN48r2FXa770zffYtrI8gCMKnQ98c4CPiqyfc6zLyC0/7vl81H89oN5fP+6woCMzdeLFEXwUxRIiG7t0304B7L18SZu/u3XKasIQ1FA0xR0+nSO7RjBmWXFfOPumh7vz13axkEHv3+9hUd+DO//Kwz1YkCiKBpLr27n5afqiLVe7ugqO5A2GbgtVeEhXxSa6y8hGYxIWsZ/3vpkkiMQmZRRwaxRZ3ll63RUTcddL3yZdd//C5nJ0nLeExdMEby9Z6LbXLemKbz1yWT+68pdxEaa/Ty6SwZE2kb4lTlhJFZV4Zb/vYGKBgOgOGqZ2IOFzzbm8K9UEzdc33Pw0zltoyhdnzPLH4DLvq6n+GAEmgbZk1oZkmKlLiaZC20DqzaUL0pV2IO6YK2bFXLBiKRl/Kexxcjjb18BwHN3r2P2qLMA3LtsJ//7r0X8/eMprPrLdby16m+BHGbI2Fuc3qH0titmi4F9JeksmuDd9nNf8/UiRTHwFR4dyZm6ZLfXK4pG8c6xHJxhSxV4s9um23IMCbZ/TpZByynbepOBVBvKV6Uq7EGdc+rLOW0Dgf3dhFQwYqwvJevahQFLy3xwpJL8XNuTzRqdeGlcA2ga0Nn2o9kA5I0scwQiYJva/e+rP+LvH0+h5Hwi9c3hxEdJ+eWetFu7D0QuHRccW1GdFynGZBZhLi0iJ29hhynzPftLJCARAHx8PBODzuo24NY0hbIT4UwYPYq9R455tbjVU/bAZaDUhnIORIwX182UWKIpKKp2BCKe/n6cg7r83GRKLF3TNoH83YRUMJKxeEbA0jL2B/jGo1W2B7jBhC4zNyQf4J66YIoEYF7u6S7XRRotHY4L5WDEm+1xffkbj0+v8uAojfHp53t9jv5ibgXjxarqoxKjOFnbzFXjUwG8LiIoBiari143riwcmURU7Oh+mVmz35dzeic/NzloUxM9sc9QNpXauigb8xaitTWTn5tMQVG1oxaQp2bmZaNptgXyoxKjgChbEJDU8XfjS8Y2z94bQioYMU6dR6kuzu9pmYH2APdUSnwTAH/fOYU7Fu3tsNL+gulSv4+hIbqnvzfb4/oy1TtyaB0zc86w/1S6y+qXep3KZaNLSU9s8Pq+hQi0yRkV/OOTyd0coZE53Mz01CYSk/t3/ZF9zcn2XSdsZ/Zhp2B/82QNl6fsM/u2QMRGFzcUteE8RqffjS81mJrhqZ6PC6lg5LQlih1lgdst4+oB7pyXhM1BkXvzlUXjiwE43xDDW59M4stzDqEoF7en/u1qABZPOEl0eDeNyoKU8/QnQOTYiT3epuXYYbKWzu5T4PnITR9yx3M3Ud0Y1WEhq05RSYlr4qdf2uz1fQoRDPKnHOfJ9xbQ2BLucpG2Atx1+Q6stUMc64/6c5eW8yLYDrPaTmmbUPkQ2d0aLvvv0FPOgYidvYu9fZZEb6r1waht2hubPDoupIKRzceqiYyJC+humc4PcOe8ZNyCJUGRe/MVo0HlyZX/5nt/uZ7H376Cx9++gpyUGkeRJICHvhB6b56dF0EDeNLf035sX/bqpyU0sfa7r/Hajqm8vWcCF0xRJMY084VZh7l57md93mYp+o+hqZGhO7eTuG8XqtFI9ex51My8DDVcugIDRIRZeeIb73LfSzfSbr20Zd3eR2bJpJPcmPEuDYXDHdvGi03Njk/r9oAEfDdL0tOsdjDX3ejMXaE58Hxm2h50dHe92nC+w5rIvrKqYT0fRIgFIzv3lRAXGxfwxXKDKW1z+fhTPHPHeu778woARyCSkXSB5+56myExofPm6W57nLefLPo61TskppXvLPuE7yz7xKvzCj/SNJzzknFFnzP65ec7HJLxzj/JeOefHPnuD2kZnuHvEQalvJHlvPHAWt7YMYUNn42l1WxgVGoNX5l7kGVTjmPVZXm0bbw/Z0lgYKVtPKXLzMVA9wHJydpmILqvQ+ygyeLJRz1QNK1Tq8sg1NDQQHx8PF99fD0zcoKr38TBc/W0tFtZOHv0pbRNtIalpspRdAeC/wHeE02DU+eHUNMURVZyXcitE3G3PW7j0Sqvcq6OvfptzWS2VqKWFl0MPMtC/m/sjrHuFMMWzMYYYZsd0sUN5WRtM3qdng+OVDpW9B88V8/y+bnUNJvJz01mVGIUasN5zPu3Y261NeUL5t9RWN0FUgr/Q9K+XehbmmmPS6B6znxqps1g8q8fBaBu/CQqF16JztLOiH//g8jzlQDs+/mToPdst5Toul7LUaYh3LYesL/S8PaZF/tCzlB+LjsvvB+2YHbPx1+cwLPP8HYOSk7WNnv9euiJFlMjP74mj/r6euLi4tweF1IzIxPT3P8ggdJd2iZUt5O5oiiQnXKB7JQLgR6K1zypTeMp55mwnrqLitARUVnO2BeeRt/WiqLadhuENdQx7MP3SN36IQB1E6ZQ/I27Hbc58r0HmfLoTzC0tjB05zbOL7giIGMPRR1TDrbUp3PaRtNUCncX+y1tE4rPZfv4jHWnKC/0rHt80th0YtjeYZbENhtCr14PPRpnq2cfXEMqGAlWzg/wmXnZ6HV6SizRZCeloI8wkAUduk4K/7F/enBeH6KER6HX2Z5w3n76GihTvcKJppH92svoW1tRtEt9gZSL1+nNtq2JZ67/YsfbKQolt97JmD89y9BPCiUY6QV3O0XstWwkbdMzb8bn+F1f7D9lCwAupWXsgYgvf9etzZ4FN17Nx6xZs4ZZs2YRGxtLSkoKK1asoKio521Ab775JuPGjSMiIoLJkyfz3nvveXNaIfrEeQqzpwVcPXEOPAt3F7PxaBUllmhKI1Iv1p2ZTdLY9F619haBEV1aQmRleYdAxBXFRe7bagwHQNcWuPL9oc65J1JD4WbM+7eTbTCRnx1Dfm4yM/Oyva6n4Qnn57Ki6AbFc9mcMBJzwsguv2t77ZL++l17wqtgZOvWrdx77718/PHHFBQU0N7ezrJlyzCZ3E/D7Nixg1tuuYW77rqL/fv3s2LFClasWMGhQ4f6PHghAmHy8HgmD48nMkxP4e5iWzXE8ChKI1Ix5i0kJjN9wL2IDWRRZWfQPGhXm/afDV0uG7bpfQAuTMnz+bgGE/ubZM2xMppKyzDv305OtOZ4k1wwK8fxJunLN0r7c9n+4WKwPJc7/64zWys7/K5n5mX7/HfdE6/SNB988EGH719++WVSUlLYu3cvl19+ucvbPP3001x11VX88Ic/BOCxxx6joKCAZ555hueff97lbYQIBQNpqjfoaBoxxcdJ3f4fYk6dpDFnNFULrqApZ4zvT6U3gAfr+JP37cKUlU3t9NkoFgup2zcTf+wIABVXXuXzcQ1Gkrbxnw6/66WQmYnjd73xaBUz87L92u6hT2tG6uttUVNiovs9yTt37mTVqlUdLlu+fDnr1693e5u2tjbanErINjRIRUoRnDp3FwWCujNmKFAsFka/9HtiS044Lks4coiEI4eoHzOOk7d906c7VxrGjuvxGFVvQGe1kLXuDbLWvdHhupKv3oY10rvt4cI957RN0tgyYjLTyc5b6NciaZ2fy5mZoVUkzVOB+l270utgRFVVHnjgAebPn8+kSZPcHldRUUFqamqHy1JTU6moqHB7mzVr1vDII4/0dmhC9IqmQXVFOE31YQwd1kpMvKXnG9Gxu2jh7mKvO2OWVA2htDqBmIg2pmRVEKbvfu3CQJeyfbMjEDn9xa/SnJ5B1NlSsta9Qfzxo6Ts2ErVwiU+O595SBJ1k/NIOHQAxcUMiQaUX3kVpqxssv6xlvDaGgAas3I4s+IrtKYFV7mBgcL+yR1su20yM3MpJdUvu206P5dDcbeNN1z9rl3VfwHfLm511utg5N577+XQoUMUFhb6cjwArF69usNsSkNDAxkZUlRI9J/jB2N58bGOn5CHZTZz5+pjJCR5Vu7e06le+zbv4+VJ/GL9FRwsHea4j8ToZr6Z/wlfnjM411TpTSbSN74DwOf3/8TxRt8yPIPmEZmM/92vGfHeempmXubT2YjTX/oaBlMTscXHUXU6dKqKptOhqCrVs+ZRuWgp6HQc/uHDPjun6Fl3qQSQtI0vdf5dW4DspI5pm/6cJelVMHLffffxzjvvsG3bNkaMGNHtsWlpaVRWVna4rLKykrS0NLe3CQ8PJzw8vDdDE8IjHxy59JjcX5jI2t+Ocnw/ZGgbF86HU14axS++PY2f/Wkf0bGeVRHsPNXrrjrvrh0t3PnXL9Pa3vEpWGuKYs36K2huC2Pl5ft98rOGkqhzZwBoThveZcahZXgGbUOSCL9QQ2TFOZqyR/vsvGp4OMfvupfYk8dIPLAHg6kJ85BEqmdeRkt6ps/OI7wnaRv/CWTaxqtgRNM0vvvd77Ju3Tq2bNlCdnZ2j7eZO3cumzZt4oEHHnBcVlBQwNy5c70erBDesBc7s1cOtRU7s1UZLNxdTHNFAvvfmcq5oovbfRWNybMvcPUtZ4lPaueFR3MpPR7Duj9l8fUHij0+r/NUr72ponPaJi6ziud+F0Nbu95lQzGAZzdcxpfHbCAhstlx2UB5weuOYrW96FuiY1xeb4mOIfxCjeM4n9LpaBwzjsYxPa8hEf7nTdrGUz29oXqTtvH2ZwlmnnQKts8a9Xhf/VH07N5772Xt2rW8/fbbxMbGOtZ9xMfHExkZCcDKlStJT09nzZo1ANx///0sWrSIJ554gmuvvZbXX3+dPXv28OKLL3pzaiE81lOp6cLdxTScSWTT72dgsTpt6dQUDu8ewvGDcdz38yPc/sPjPPpfeXy6I4mvfOsUxgjv1nK4m+qNU1LZ+GkamuZ+O6lV0/OJuoL/Wnpx7UQoVvHVNJSTxeiOFaMkeFbfpSXNlrKKO3kMQ2MDlthLVZfD6i8QffY0AK0p7mdWxcDlSdrGU958wvckbeOpUHkuO3cKdk7b5GfHUFDSxMy8nicjwFYO/nUPjvMqGHnuuecAWLx4cYfL//znP3P77bcDUFpaik536QExb9481q5dy0MPPcSDDz7ImDFjWL9+fbeLXoXoLXc9aApKqlCUZvbsLyHCoGfzG5OxWhXoFBCoqkJbq55//GEk33nkqOPy+gthDB3WhrdcpW1GaindBiIABoNGlZpJ5FhbujLUduXEvPsvDE88jvL55xiBKJ0OXe4YztzwNdoThri9XXtCIrXTZpB4YC8T/+9Rjn3re7SkDiOyvIxxv38CgOpZc2mPC2yzTBE4nqQSPNXbgMTVzjm9qdajc4bSc9nV7zrHy991U6PRo+O8TtP0ZMuWLV0uu+mmm7jpppu8OZUQXvO0B010/QhqKt23fddUhZIjsZw7femY6FjPdta40jlt0zhGD8R2exurVSF5mNHRytsYQgvnJrz7d0b874MdCokpqkr80WNEn3mCo/d9n/Z49wHJmRtuIvHAXvRmM+N/+6su15+9ZkV/DFuEGHc7QDzVm50i3e6ci3Zf4sKZ/bkMm93usAs27tI2nmgwNPd8ENKbRgwAzmmZuAVLMCSldNsB9JPPw7Ft2Ox+dmLD67bF2UOHtxAV0/c1CvZPVkWnTjBuZgpF+yLRVDdjUGDODQollkt9I5ybLwbrJ6uwpgYWPfWI7bfb6cOLomkYmpsYvvFdTt/0dbf3YY2MYv+j/0fKR1tI3/CO4/Kyq26gav4iNENYfw1fhJjOaRtzqWfpEl1mbpeUgy/SNp7KTkohbsGSLjvsgplz2sY+S+LR7UwSjIhBwJO0TOdmeOGRKj0FIgCf77V9er/zJ8d9Nl77OKovP8ix/bNAh8uA5Mqv1vFpXS3UXbrMeVdOsNY7yNrwNvp2s9vfrqKqDPl0L2du+DJqeDezU2FGKhcvo3Lxsv4ZqBgwnFMJ0LEXlTvG0iLMpUVdUg59Sdt4s17F1Q67YHsuu+LcbbnmWJlHv+t2D7PbEoyIkOVJWsbVi0puXj2GMBVLe88vHt9+5AjJad6vFenJFZfpsLbvY8drE2isvpR71YdZmbz0FGkzStjjYmdvsNc7iDlbiqo3oLe4r82is1oJa2igbaj7YEQIb9k/uZcXet4hvaedIt6kbTzdXWJfb6JpKvnZMY4ddsH2XO6ON7/rpjbPXj8lGBEhyT4jYg9EAEdaBnAbiABERllZdH0Fm/45DHczJPOvquD62874sup4F0sXaly54DAlR2KoroggPNJK7rR6IiJVoOPY7S92M/Oy2Xi0yu/1DoxOccPJWtu06wdHKru8AB++YGac2vOuI2uEBCIDQXldDH/cNJv1eyYCsGh8Mfcu38moVM8Wc/qaN49/55RD3IIlfU7beMr5uVxQ0mT7cOGUgg2ltI1Hx7W2eHScBCMiZDlPEerihsLFN8mkqEurtzUNWpv1GMJUwoyX1jAs+0oZ7WYd299NBQV0ioaqKig6jatuLmPxjRV40Mi1zxQFciY0kTOhqdvjnNudOxdT62u9A090ToFtPFrl8tPj5OHx7J52OTe9+2e396UpCqYR6R227IrQtPNYBvf9eUWHy7YeyWHrkRz+3xc288XZhwMzMA85pxxgs8udIv1VTA26PpddpW28/VlCmQQjYkCyWhQ2r0/jow9Saai1BSdjJtez5AvljJ7UiE4H1688w8JrKzjwURJN9Qbik9rJW1BDTFzvd870N1/WO/CUcwrMXjDOvjOp84t0ytSJHFp0LRO2vYeu0wJW++6atltuCIlPfsK95rYwRyBybd4R7lmyG2OYhX98Mok//Wc2v1i3hLljTzMsofsgOxh4U+CrPyq82gsj9rV2if1nCVUSjIgBp90MHz6XR1XxkA6d4U8cjuP4wThu/k4JMxfbmp0lJLWz+Ab3TRuDkXNA0jltk5Pn+Yp+T3UuGNddCgxg4zcfRNXrmfSffwOg6fTorRbUuHjU3/2GiDl5JBWGzrZG0dXLW6cDMCG9kke/8qHj8u8s+4SG5gje/GQKj/3jSn5/19uBGqJXOu8UcU7b+KvkvPNzOTspBZI8ey5baqqCeoedpyQYEQPOB6/HUlkc36WgmW3XisabL4xkXF69x115g5G7qd6SfviRutuZ5IpqCGPjtx5i55fvJrrgfSJbm4mePZ2T86/kyikjyDaYQm5bo+jo33vHA/CD67d1ue6eK3fx5idT+OREaPX0cZe2KTY1k5+bDFwKSMD3nYI7P5c9Few77DwlwYgYUDQNNr4RYysj4pKCpsLu/yRzxYrQmhFxpXPapj90l5bpTmNyGo233AHYFu21fHoWNTwiZLc1ikt0iu0JprqoJKx5sG0+mHmatumvWRJ72sZTwb7DzlMSjIgBxdyiUFvVw8NagYozkf4ZkB90DkiWz8/12X1v+KjIo9mQnrjKjztvawylapQCbph5hBc3zWHN+sX8/YHXOlz33MbLAJifeyoAI/ONYEjbePo8rmk2d0nVhmKQL8GIGFD0YRqKonXb+0VRIMzoXdO7YOdc72DDR75dxOrL6Wh32xolbRNaVl6+jxc3zeFkZTI/ePVqvrX0E8INVt78eLJjm+9DX9gc4FH2TaDTNt48j53TO/bu4J132AX7c0qCER+wPxhn5mWjaSpW1Uq2wYSlpgpz6aUpM9H/DGEwZV4rn+0MR1NdFzVTrQoTZ9X5d2B+4stPaf3Bm22Nwf7iOZhFGi28cM8/+eYfvsh/Do/mP4dHd7j+0Zs2khLvWev4YOdN2sZT/VW7BNynbYI9yJdgpI8Onqunpd3KwtmjHVPP9kCkoXAzNcfKgOCPSgeSG29v4NMdKbjqP6PTaaSMaCF3mucvHP5QXxvGZzsTaW7Sk5hiZvJltReLnw1MkrYJfTNzyvhg9Z94ZesMXtsxDYCrpx3lv67cRWZycD2/+spVXxZ/dAr2lKvS9KEW5CuaJ614A6yhoYH4+Hgee3kzEVExgR6Og3Mgkp+bjNbWTE60hnn/9ot/+LKg/cOHOmPdKYYtmI0xwlYHQxc3lJO1zRQUVZMUZeT539Wx87WJWCyKbbGdAqpVx7CsZu5+8BhxQ9yXK/cnVYV//yWDj95PBUDRaahWhbBwlRV3lDJ7SXWAR9i/Os8qLhuX4gjm1dLQXIgnBjaXbSi8CEjcFQ30FXfvS4H6gNzU2sKiR35MfX09cXHuix3KzEgvdH4Bzc9Ntr2A1ldhPiYvoMEge3olSxe3s2dLMuWlkRjCNCbNusCYKQ3oPO9n1e/efTWDwvdSsc/gaFbbv+1tOt58PpuIKCtTLrsQwBH2L0nbiFDjLm3jqWXjUth4tMrrkvOeclsYMcjXZkkw4iVXUaekZYJTVIyVy6+rDPQw3GqqN3QIRDqy1UT54PV0Js+54JfS9IHUU9omVLcrioHJuVOwPW0TOXaiR7fNjsavu3JCJciXYMRD9tkQScsIXzm0ewjd95RTOH8uksozkaRletZsKpR1t9sm1JqIicHBPkviLX+UnHfeYWcP8p132wTb2iwJRjwgaRnRH1pMenQ6eghIoKW5H1sHBxlJ24hQ45y28VTWUrAA2Ukpkra5SIIRD83My+aq8amObbuALLATfZKc1oaq9pR/0UhMafPLeIKJ/QUUoKComvzcZHRxURgv1k8wpqRTXrhLnnciKHj7OOxuV06gOwUH6jklwUgv6U21jv/LC6LojfEz6oiKbae50YCrdSM6nUbutHriE4Nj508gJEUZqWk2B3oYQviUN52CPeVp7RJPt9T7irHNsw9TEowIESAGg8ZXvn2KV349GuhYNVan0wiPtHL9baWBG6AQot841y5xTtvkZ8dQUNLEzLxsj+/Lm9kUTyoh+1KDqRme6vk4CUaECKCJM+v4r58W8cHr6Zw+FguAomhMnHWBa249S3La4EvRCDFYuNqVk9OLYmqaplK4u9jj0vQ9pW18ydjY6NFxEowIEWCjJzVy38+PcqHaSHOTnoTEdqLjLIEelhDCT3xRuwTwuqOwq7SN/b58pcli9eg4CUaECBJDks0MSQ70KIQQgeCq5Lyn+rIItkvapsi3VZ9bTDIzIoQQQoQM507Bnm4VThqbTgzbO3QU7kvaBmD5/Nxe/gRdNatGj46TYEQIMTCpKpHlZzG0tNCWmIQ5UaadRGjwZoemq/ROX9M2Gz7y3SJWc6tn3ZslGBFCBKXJw+PZ8FERLe0Xc865yWhtCjl5C2H/dpLGpruti5Dw2T7SP/g34RdqHJc1Zo/mzA1fpjVtuJ9+goHj8JkU3tg5hU9PD8OgV7l8fAlfnnOI9MSGQA9t0HO1CNZd2sZTvqxx0uph0UYJRoQQQas3PWuS9uwk6x+v0bkdecypk+Q+9yRF3/6eBCRe+Mu2PJ5+fwF6nYpVtXWZLK1O4LWPpvKble8yb6xsPw8GzqXpY9hOZmYupaR2qF3iqf7qKNwdCUaEEEHNm541lqhhjPj3P9DoWkZO0TR0lnbS33+bk3d8OwA/SejZdXIET7+/AMARiAComg7NqvCDv17LOz9+mcSYgd87KRR02JWzFDIz6ZC28UR/lqbvjgQjQoig52k5a+s/C9CZzS77IAMoqkrcsSOENdTTHue/T32ham3htA4zIs40FMxWHev3TODOxXsDMDrhiru0DYAubmiPt3cOXPwZkEgwIkRPNI3kM8VE1dXQlDiU2hGeV0YUvtVT2saw/RN66j6oAGH1dRKMeGBPcbrLQMRO0xT2nkyXYCQIdU7b6DJzPXrDz754UH92FHZFghEhupF5cBeLX3mKlNITjssqssex5bYHODthegBHNnh1l7Zh5GjQOq8W6coSHe2HkQoRWJ3TNuZSz3bJ6DJzu5Sm7+9ZEglGhHBj5IGdfHHN96DTUsiUU8f4yqP38uZDv+PMpJmBGdwg5y5to7vhFsb8/H/B4rqCraYoNKdnyDZfD83ILmPn8Sy3syOKojEj55yfRyW84Zy28ZS70vT9GZB4vrz2om3btnH99dczfPhwFEVh/fr13R6/ZcsWFEXp8lVRUdHbMfvVwXP1jq2FVtWK1tYMQMuxw4EclgCMEZf+f7K22fF/n+yRV1Xy//A4oKHr9Elbp6mgqSz90/969Clc9J/Jw+OJDNOzfdcJCoqq+aAhnJrvPuDyWPtfquyqG/w2vlB364ID7gMRNIx6lRtnymthKDAnjPT4q+ZYGac/3IV5/3YyWyvJNpjIz01mwawcZuZlc/BcvVdbhT3h9cyIyWRi6tSp3HnnnXzxi1/0+HZFRUXExcU5vk9J8W39+/5gD0QWzh5ty5+1NZMTrWHev52m0jJqjpV5VZxG9J2x7hQAWUtn23KgSSmUWKLZeLQKRdGxfdcJIsP0fY7cRxw9QPz5crfX6zSNpLJTpJ08QsXoCX06l+ibzmmbtTfcwy16A8m/exKlrQ1NUVA0DUt0FKe/9HWaRo0N9JBDxuzRZ7n/6sIuW3v1iopOp/J/33iXpFjZSTPQdC5NH7dgidu0TY/31V9Fz66++mquvvpqb29GSkoKCQkJXt8uEOy/4Jl52bYFcrnJZBtMWOqrMB/rWtdA+Iex7pSt9HFmustAZM/+Ep8EIgBx1Z7N3MWdPyfBSBDokra5/m6W/9e3iX73X6S01tFubaQ+JZnWk6ExIxtMVl6+n+nZ5/j7zsl8enoYYXqVhVL0bMBzLk0Pm3vdUbjF1MjrHhzntzUj06ZNo62tjUmTJvGzn/2M+fPnuz22ra2NtrZLrdMbGvz3gHeeDbGv1M82mLDUVNFQuNnRL0ACEf9yDkSMeQspNikoligKiqop3F3ssyDEriU2wbPj4ob47Jyi7zrstpk9Gi1vuW1xq8FEXE0VMdnyYaI3JmVUMimjMtDDEAHgrqNwfq5n666aGoOkN82wYcN4/vnnmTlzJm1tbfzxj39k8eLFfPLJJ0yf7no3wpo1a3jkkUf6e2hdSFom+LhLyxSUVKEozT6dDXF2evIsWmLiiGxyHQhrQNOQZM6On+bT84q+65y22Xi0qkuRNNvz2XUpeSFER+7SNp5oMDT3fBCgaFrvV+ApisK6detYsWKFV7dbtGgRmZmZ/PWvf3V5vauZkYyMDB57eTMRUTG9Ha5bndMy9k9Slpoq1FL5JBUondMypRGpKOFRHdIy0H973yd/uJ7lL/6yy+X26p7v3fczPr/8mn45t/AN+YAhhG85vy57osHUzIgVd1JfX99h3WhnAdnaO3v2bAoLC91eHx4eTnh4uF/GImmZ4OQyLRPef2kZVw4uXYFOtXD5q88Q3tqMqijoNI22qBi2rHxAApEQ4DxLAlz6sNFNbxshhHvOaRtPNDlNLHQnIMHIgQMHGDZsWCBO3YF8ago+gUrLuPPpsi9zeNF1jNq7nai6WpoSh1I8fT5Wo3+C5WBz4byRDW+ks3ebLV+cPb6BG247w4gcz6ZiA8Fd2kaLSCUzU9I2QnjLm+eJudWz3VZeByNNTU2cOHGpGmVJSQkHDhwgMTGRzMxMVq9eTVlZGX/5y18AeOqpp8jOzmbixIm0trbyxz/+kc2bN7Nx40ZvT+1TB8/Vs3x+LjXNZq4an4pVtZITraE31QJIIBJAwxbMBsCQlGLrpVDbjKLoSIqyLYTyZydJAEt4BEXz8v16zmB07LM4/vDz3A6XlRyJ4+mfTOS6b5Sy6PrgXeDovNtmZl42ep0ea3gUhugU9BG2l0FPP+kJIXzP62Bkz549XHHFFY7vV61aBcBtt93Gyy+/THl5OaWll1pKm81mvv/971NWVkZUVBRTpkzhww8/7HAfQojgZm7VOQKRmYvPs+ymcxjDVXZvSebdVzN456+ZTJhZx9Bhnk3JCiGEM6+DkcWLF9PdmteXX365w/c/+tGP+NGPfuT1wIQQwWPrO2kADMtq5ubvnHJcvviGClpMejavG87ap0dx/+OfB2iEQohQ5nU5eCHE4HPgo0QAbry9tMt1V9xoq1R7tliazwkhekeCESFEj3R622yo1ap0uc7VZUII4Q0JRoQQPZq5uBqA15/N7tIb8IPXRwAwZrJvG2cJIQYPCUaEED2av7wKgMYLRp5/JJczJ6KpPBvB+pcy+bjAVonxK98+FcARCiFC2aAORmqazQBYVStam61OQssxaYcdaOWFuxz/VxvOO/5v/3sJ/zOEadz3c9vi1OLP4/jtgxP4v1WT+eiDVAC+el8xCcmh8/f54MilbcjW6ETH/+11boQQ/jUogxF7sTPAZbGz0x/ukhojAWL/vTeVlmHevx1LTRXZBpPt76SpzMzL5uC5eo9aVwvfyhpr4md/2sfSL5cRZlQBmL3kPD/53WfMuLwmwKPznL0a68ajVZRYbItudZm5ZC2dTdLYdAlIhAiAgFRgDZTOPWjyc5Ntpd/rqzAfk7LQwaJDl8ilYAGyk1JYNi6FjUermJmXzfZdJzh4rt7vBdAGu+hYK8u/co7lXzkX6KH0inPxs5Z2K4qiswW6Eank5KUQw3YAqcbqociyUuJOHANNw5SVTdPIUaDIgmbhvUETjEgPmtBi/zvYu0TGZKaTnbeQ/OwYlPAoAAlIhEuWdoXa8+EYDCpDhppdvjdKz5q+MTTUk7P2JWJOl6ApCqCgaCotqcMovvUu2oZ61tFVCLtBEYxID5rQ1WGWBMjMzMUQneJI2/ije68IDe1mhQ/fGs6OjSm0Ntte2pJSW7liRTmzl1R3CUoGWs8a44UaUrb/h8T9u9G3tWJOGEL1nAWcn7sQ1Ye9lJR2M7nP/QZj3QXb95qGrZc1RFRVMPbFpzly/0+wxMT67Jxi4BvQwYikZQYGc8JIjHWnOP3hrg5pm/zsGApKmiRtI7C0K/zhF7mcOhqDpl2KOmoqw3nrhWxqKiO45mtnu9zOXdqmlNBK20SeO8OYF3+Hvt2MotrW8xgv1DJ8w78Z8ulejv3Xf6NGRPrkXOnvrsNYdwFXyRhF0zA0NZK8ewcVVyz3yfnE4DBgF7DaZ0McgUintIwEIqHFnDASc8JITn+4i4bCzZj3bycnWiM/O4b83GQWzh5NS7tVFrYOUp9sGkrJkY6BiI3t+/+sH8a50+7fjCcPjycyTM+e/SUUFFVTUNJEiSUaY95C4hYsIWvpbIx1p4JzcauqkvO3l9CbLwUiYPvJFU0jsuIc6R/8yyenCmuoZ+gnH/V4XOLeXT0eI4SzARmMdE7L5GfHONIy9vUh9jc3EVpsaZuLO572byeztdKx22bBrBzZbTNI7djQ/RoFnU5j16ah3R7jPEuiKDrHbpvSiNSg3m0Te/IY4bU1KJrq8npF00jauwudh63cu5O0e4ftPrs5RgH0Lc19PpcYXAZcMHLwXD3L5+c6ApFRiVGOQMTciqwPGQDsfz9zK6ilRQCMSoxi2TjbG9Ly+bnubioGqJqKcLp7i1RVhaqyiB7vZ/LweCYPj2fP/hIKdxdTUFSNEh5FaUQqxryFxGSmB11AElVWiqbr/qVcZ2kn4nxVn88VfeZ0j8dogDkpuc/nEoPLgF4zIoQYHMIjVZqb3L8hK4pGRJTV4/sLpd02mt5Alxr9ro4z9P3lXtPpezxGAc7PWdDnc4nBZcDNjAghBp9p82vQ6dy/IWuawtR5tV7dp3PapnB3cdCmbRpyJ1zc0eKaBphj42hJHdb3c40d1+31GtAeFU3ttJl9PpcYXCQYEUKEvMuvq8QQpqK4CEh0Oo3UjGYmzarz+n7taZvIMH3Qpm1aU9KoHzseTXH9cq4AlYuWQg+pHE/U5s3CGhV9sbZIR/bffMktd4C+5xkUIZxJMCJEHxnMrUzd+A/u+u8v8sCt87nq94+SWHYq0MMaVJJS2/jm/xQRE98OgE6vOmZKRow28c2fFqE39JzKcCfYd9uc+uptmEZkAjjWj9j/rZq3iPPzFvnkPGp4BMfv/A7WyEguVRfBFpwoCqVfuoWm0WN9ci4xuMiaESH6IL6qjHvu+0KHyyZteYdJW95hyzfuZ8/1twZoZINP5hgT/+/3n/L5niGcORmN3qAyblo9mWNMPqlQ7ryOxN7bKliKpFkjozj2rQeIO3aExE/3om820ZaYTM2subQMH+HTc7WkZ3Dohw+TtG8XcUcPo7NYMGVkUT1nPuZEWbgqekeCESF6S9O49cE7AWiJieOd+39Oc3wiuTs+5LL1L7P4r09zevIszo+UT4r+otfD5DkXmDznQr/cv30dycFz9RTuLg6uImk6HQ3jJtIwbmK/n0qNiOS8D2dchJBgRISs8sJdZC2dDYDacB6wdWCtafZPK/ucfYVENdje9J578X1UQxgA50eOpTUmjsWv/pabHruP3/9po1/GI/wnlHbbCBEKJBgRIcleIr6ptIwYtqPLzLWViM9NdnT27e+eNVmf2d5sNt7zE0cgYrfvmq+y+NXfEtVYB6rqk8WDIrh0l7bJyUshi9DqbSMGNm/WMwXi8SrBiAhZHZroOfWsWTYuxRGQ9GfPGkO7bQbG4qIJmeq0m0DRVDRZKz4guUvbFJuayclb2CFtAzJLIvzPHoTYZ5F7Yg+gwb+PVwlGREizP1lOf7iLpLFlxGSmk523kPzsGJTwKIB+C0jOjpvG1A/XcdXvH+PzhVd3mP0Y99Gl1Iyml6eZP1itYG7TEx5h9ftElKdpG2OdzJII/zHWnSJpbDoxmenoMnMxJHXfNgEI2ONVXiXFgNBhlgTIzMzFEG1L22iaiqLofJ62ObpgGdc+8zA6TWXFr3/A5jt/iCk+kdG7t3Ldb38KwN9/+oxPziXcO38unM3rhrH/oySsFh3hEVZmLTnPkhXlxCZY/DYOSduIYOIciBjzFgKgi+u+PxNcDAqS/P94lWBEDBj2dSSnP9zVIW2Tnx1DQUmTz9M2mk7Pq798ma8/eDuj9xYyem9hh+s/X7Cc0smeTY2K3ikrieL3D4/DYtahqrb9u22tenZ8kMrBjxO57xefk5DU7rfxSNpGBJpzWsY+G1JisS3up9aTBobRaG22x2tcZhWw2S+PVwlGxIDiKm2T049pm4rRE3juhfeY9/cXmLrpbQAaE4ey8b8epGT6/D7fv3BP0+BvT+fQbtahqR0LiaiqQmNdGOtfyuL2H57w+9gkbSMCoXNapjQiFcUSxcajVShuKvS64ni8JqUQt2CJXx6vEoyIAcmfaRvTkGQKvvn/KPjm//PByIWnThXFcP5cpNvrVVXh8z0J1NeGEZ/ov9kRu85pG/ssiaRtRH/onJYpNiko4VEUFFVTuLuYyDDPS/QH4vE6oIKRg+fqAVudCU1TAVv9CUuNrXV2eeGugI1N+J9z2iZpbBlxC5b4Lm2jqmQd2k3Gob0oaJSNm0rJtLkedTUVvlF+OhJbQXL35VU1TaHybGRAghHomLYB0Ov0WMOjABORY23FyWqOlQVkbGLgsKdm7DMiAEr4pRkReyDi6evcwXP1bN9lm1HUNJX87BhH2qa/augMmGDk4Ll6WtqtLJw9+tIUk8GEpaYKtVQKEA1W9r+3Lee52Sdpm/iKs3zx8VUknTuF9eIW3jnrX6EuZTjrfvwENRmj+uEnEZ2FGbsPRC4dp/b/YPpg2ILZnD5UFehhiBDm612FzrN6M/OyKShpcqRtLNhaH9jTNj0xtrV59DMMiGDEORDJz01Ga2sm22DCvH/7xWmlMglCBjlfpW2MzU189WffJLrO1o5eb7U6rourruTmn32bl3/zOs3xif368wjIzatD0Wld1os4i45tJ2O0yY+jEn2ha2tDsbRjjYySQoG9YH+dA4hhO5mZuZSS6nidK9xd7Jil6ykosV/fXZrREw2mZniq5+NCOhix/1Jn5mXbppJyk22zIfVVmI/JbIjoyBdpm4lb3iXmQjWK5qJVvWoloqmBKR+u4+Mv3dXfP86gF5dgYfaS8+zaNBRNcx2QXPGFcgx96NYr/CP2RBFp/9lAbLEtNdAeHcP5uQupvPxKtDBjgEcXWjoXg8zMBEO0rRgk4Pjg5e0siau0jSeMjY0eHReywUjntEx+doykZUSP+pq2Gbdjo20bhxuKpjK+cIMEI36y4o5SWpoMfPZxIjq9iqYpKNgWry66vpzLr60M9BBFDxL3fEzWP9bi3Fo5zNTEsE0fEHfsKMfvvlcCEi/5K23jiSaLteeD6EUwsm3bNn7961+zd+9eysvLWbduHStWrOj2Nlu2bGHVqlUcPnyYjIwMHnroIW6//XZvT+3gKi2TE61JWkZ4rLdpmwhTY7erFBQgvLmpX8cuLjGEaXxj1UnOFpezb3sSpgYDCclmZl1RTXKaZ7nqUHL6fAJv7JzCfw7n0G7VM3FEJTfP+4y5Y0qd38tDhqGpkcx1rwN0mW1UNI3oM6dIKdxC5RXLAjG8kNffaRtPtJj6aWbEZDIxdepU7rzzTr74xS/2eHxJSQnXXnst3/rWt/jb3/7Gpk2buPvuuxk2bBjLly/36tyHKxowRlglLSN8oru0jbtPD9UjchhSfgad6jraV3U6akZk++1nEDYjcpoZkeNJQafQ9VFRFt//67WomoJVtb0R7DyeRWFRNl9fuI8Hrv4o5AKSpL2foGia+wBf0xi6cxuVi/MJuR8uSPRX2sb+Ya3H87d6tmbL62Dk6quv5uqrr/b4+Oeff57s7GyeeOIJAMaPH09hYSFPPvmk18EIXFofIrtlhC+4S9sUm5rJz00GOgYkn+Z/kdxPNru9P52qciD/S/0/cDGo1Jki+NHfrsZi1eH81m0PSl7dPp0pmRVcOelkoIbYKxGV5bYgw03qUwGMjQ3ozG2o4RH+HdwA0h9pG0+1NntW7qDf14zs3LmTpUuXdrhs+fLlPPDAA25v09bWRpvTdqCGhgYArpwzhhZs/R5GJUahNphQS4swt9qOk0BE9JanaZuDSWNJm72chbs2AJc2lmoXv9szdQHrRuShXZz69KX+6DwsQsO/9o6nzWLA3RyCTlF5dfu0kAtG1DBjD5ViQFMUaTbpI96kbTzlq9elfv8LV1RUkJqa2uGy1NRUGhoaaGlpITKyawXFNWvW8Mgjj/T30ITowJO0DcCn034H/3iFvDf+ROz5CgCaE4fy6ZdvY9/NdzPD4Punlf1TC0hQMhh9Vjqsu3XTqJqOQ2fS0LTQymbUTZzC0F0fub1e0+loGDMerR+eU4OVJ2kbT/mytUZQ/oVXr17NqlWrHN83NDSQkZERwBGJwcKTtA0AD/2QstWrCDt7BjSN9hEZJBoMLHV1pz7QYXbGR09+ETp0ioaiaG63MENoBSF2jaNzaR4+gsiKcyhqx+J0GoCmUbE4PyBjG8g8Sdt4ylcBSb8HI2lpaVRWdtxeV1lZSVxcnMtZEYDw8HDCw8P7e2hCuOUubdOBARhlb8nddvGrf9hfJBSrlZo31hO7p5YhIzM4M3G6TGEPAjNzzrL5kPvKvnqdyqycM6EXkOh0nLj9W4x65QWiy86gXix0pqgqmsHAqZu+jmlkToAHOXC5Stt0eZ3rhi97ffX7q9jcuXN57733OlxWUFDA3Llz+/vUQvRJ57RNTGZ6wMaSk7eQqn/+g28+/FPCys85Lq+LHULhHas4usD7xeAidFyTd5TfF1yGqdWIqnWdRreqOr5x+f4AjKzvLLFxFN37A2KKj5Nw+DN0lnZa0oZTmzfLVolV9KvOaRtzaZFHt9Nl5vqu1xe9CEaampo4ceJSS+6SkhIOHDhAYmIimZmZrF69mrKyMv7yl78A8K1vfYtnnnmGH/3oR9x5551s3ryZv//977z77rteD1YIf3NO29QcK2PYgtkBGYfh2ScZ8bMnulwe33iB6377UwAJSPqopVmPxawQE28JuhmGmIh2fnf7v7jvzzfS3BaGqimAgl6nYlV1fO+a7Vw25kygh9l7ikLTqLE0jRob6JEMSs5pG8Cj1zljaRHm0qI+9/qy8zoY2bNnD1dccYXje/vajttuu42XX36Z8vJySktLHddnZ2fz7rvv8r3vfY+nn36aESNG8Mc//rFX23qFCBT7LElAOj9rGmNf+BO4qMegYMutL3zpCYrmXikpGy+1mPS8++oIPtnUcWr6upWlLLymMqjao0zOrGT99//C+j0T2XokG3O7nkmZldw05yBjhtUEenhiAOjN61xPRSPHJHi2tVfRtO7WaAeHhoYG4uPj+dV7+4mIipYaI2JQiT5VTO4LT/V43OvX38P7V37F5+cfqItly0sjeeb/jcfc5vrFMntcI9959KhPznXwXD0z87K5anwqVtVKtsGE3lRLy7HDmFuRrr0iJNm79iaNTSduwRIMSSkUmxQKSppQFB3bd51Ab23l9Z+soL6+nri4OLf3FVofozRNetCIQSesqcGj477y7p9IvPFqqqfO9Nm5N3xUNCB371jaFV58bKzbQASg5GgsRQfiyJ3m2e9fBAFNI/bkMWKPH0XX3k5T9ijqJkwBvWefzoV3POn11WJq5HUP7iukgpErsqKlB40YdNpj3X+acKZoMOmpX/CPZ9/w2bmdF6XBwJklOfjJEJrqu2u+ZivF9dKvxvKr1/b4a1iiD8Lq65jw5C/Rt7U6LkvZuQ2AI9/9ES3DRwRqaANed0Uj/7XXs2A+pIKREW1VmPfvl9kQMaiYMkbSlpiEsbam+yZ9msrwQ3u5JtJEe2aWz84/EGucHP8sDrqt/Wm7XLUG2UpW4ZqmMeE3v0Bvtm2vP3Pdl1CNRka8tw59ayvjf/e/HHjk16hGKRnRX9wVjbwiK9qj24dUMKKeOc7pnYcACUTEIKLTceb6LzPqlRd6LJ0NkFF7Gi0nuYejPOeLlfLBRlUlyOiR1UrCkYMMObAXg6mJtuSh1MyciylzZNBVWEs4uN8RiOx/9P/QwmyzXjUz5jD+t78isrKcYQXvUXbtFwI5zAHPVdpm5OhpHt02pIKRM1v2YkzNDfQwhPC7hnETqZq3iJQdW3s81lx9Gm2/7zrYOleg9bbteLAaOa6JvduSujnCFvbNXVbZzTEDl95kYsxLzxJ17iyaoqBoGjGlJSTv+ZjqmZdR+oWvEkxbjVK3/weA4lvvdAQiAOh0FN96JxN/8wtSC/8jwYifOKdthpg8ey0KqWDEHJ9Jd1leIQay8mXXMnT3DpT2dpfXa4qCaUQ6pw6WwEHP2nt7wjkH3Nu248Emb0EN7/x1BG0telzPNdkuGzu1nj//72jOnIhmzJQGFl5TyYgc3wV6wSr7jVeIrLAV11Mubri0l2tP2vMxbclDqVwUPGXaw+rrADDHD+lynavLRP+zp23ObNnr0fEhFYwIMZip4RGULb+BjHf+0eU6TVHQdDrOXn8z5gTfrRcB37UdDybhESp3/OgEf/zlGCztOlwFJCkjmnnl15eKcO3blsy+bcnMXHyer3z7lM8yFeWFuyCI0s4RleXEHXe/pVkBUrb/h8oFS4Jml0pD7niS93xM0p6dNGd0fPwPOWirTGuRaq5+Z04Yibm1xaNjJRgRIoScn78INczA8I3vEmZqclzempJG6Yqbu7wQ+0J/tB33td4EQ6MmNvKD3xym8L0U9n+URFurjuhYC9Pm1WK1KhS+lwbATd8qIS2jheIjsbz7agZ7tgwlYkQlOTMrPD7XzLxsNE3FqlrR2pqx1FdhLi2iqbTM63H3t7jjRx2pGXfCTE1EVpTRkp7px5G5V37l1STv+Zihu3bQNGosFybngaIQfaqYkW/9DYDib9wd4FGK7kgwIkSIqZk9n5oZlxFbcgJ9s4m2pGRahmf066JCX7Yd97W+zM4kpbZx4x1nuPGOS6XU62vD+Pm3pgHw499+RnKabWFk5hgTI3JMvPDoOApfncQXVkYRFu5ZzUhNUy8Va6wP8hpJqsql2r7uKVa12+v9qT1hCGXLryd9w7/Jfu1lsl97ucP19bkTaMoeHZjBCY9IMCKEDyhmM0MOf0p4zXkskVHUTZpKe3/mqvV6Gkf7dzG3L9uO+5KvF9WeKooBYPz0OkcgYteSeBYYB8Aow1Bycz17Q9bamsk2mEKiRlLziEwUrfufSw0LozU1zU8j8kzl4nxaU9MY9Zc/dLi89IabqL5sQYBGJTwlwYgQfTTk071krnsDXVsrmk6HommMeHcd52fP5+z1XwqavLqv9LXtuK/5elGt1WKbYYpNuLRQ2B7ozMzLZt0QC40XDCRbWsk2uF5M3JmlvgrzsaKgD0QAmrJH0zI0lYjq8y6DEk1RqJ5xGWp4RABG17368ZPZt+a36FpbUKwq1qiooNuGLFyTYESIPogr+pyRr78C2Ca27TsOAIZ+UgjA2RW+7xcTaK7ajkeOnRiQsWRH+7YWyrAs24K7XZuHcv3KUo7XXaCl3crC2aOpPKOn8YLtZXP0KAt6U22P99dy7DBA8KZlOlMUSm69k7EvPo2+pdURkNiTNs3DMzh31fWBG58H1IjIQA9BeEmCESH6YPjGd8DNYj8FGLrrIyqvyO/flE2AdEzbpAd0LJ0X1Tp3DfU2KBmW2UL2uAZKjsbxvz8Yz/w793L1NcMZ3prCf389FoBVX/2cqOKDeLJPIBRmQzprTR3GkftXM3THVhL37cLQ0kLbkESq5yygevbcjrU8hPCBkOrau/XhXxEjEa8IEsbaaib9+tFuj9EUhbPXfoHz8xf7Z1ABYu/eGShZS2ejy8zFkJRCiSWajUer+hSQfPJ5K2/9bKHL68KNVrbf9/+IDPMsRQMhMBsiRD9pam1h0SM/HmBde4UIIvqWnj8Xa4ri0XGhLtBvtr6shXLwXD1KtJVfvVdM0TvpvPT7S/1MfnrTVr6Q9S5hemvAf2YhBhIJRoToJXPCkB7rMSiqijnJd31ihGvuFtW6Stv0xL4+JD83CW1iLb9/tGuncHM//ixCDEYSjAjRS9boGOomTiHh84MdFq7aaYAaHs6FiVP9P7hBqPOiWguQnWSrhbLxaBUz87I9uh9NU8nPTXbUBDEfC+KaIEIMEBKMCNEHZVevIKb4BIbWlg4BiaYooGmUrvgqmlEW+/mLL2qhuKoJ4nzfou8Us5mwxnqsEZFYo2MCPRwRBCQYEYOX1WqrQdCH7qPmxCSK7v0B6e+vJ+HwZ46UTfOwdMqXXUdD7gRfjVZ4ocMsCXhXC8VASBQnC0WGxgaGffg+Sft2obPYFgA3Zo+mfOnVNOWMCfDoRCBJMCIGF1Ulae8npHy0hcjKcjRFoWF0LpWLltI0amzPt3fBnJhEya13oTc1Yay/gDUiCnNid+3phT/Yu4ae/nCXoxaKpyQt43uGxgbG/f4JwhrqO8wixpw6yZg/PkPJ1+6kbpKkNAcrCUbE4KGqZP39ryR+eqmltaJpxJ04Rvzxo5SuuJnqOfN7fffW6BhaBvGUs95kImnvx8SUlqApCo05Y6nNmxnQAlTOaZve3lb4xvAN/+4SiIDtOagBmf/4G/W546WGySAlwYgYNBI/3UuSUyBiZ68wmfH232kYk4s5UXa/eCuu6HOy//YndBYLaBooCgmHPmV4wTucuP3bNGeODOj4JLAILF1rC4kH9rhc6A22AoGG1laGHPqU2rxZ/h2cCAqBa7UphJ8N3bHVtrC0G8m7dvhpNANHeHUVOX/9A7r2dhRNs5XFv/ivvrWV0X/+PYamxkAPUwSQsb4OndXa7TGqTk9EVaWfRiSCjQQjYtCILD/XfU0QTSOq7Izb64VrQ3dscwQfnSmahr6tjaQ9H/t9XCJ4WMPDezxG0VSPjhMDkwQjYtDQeuieqykKaliYn0YzcCR8/pnb6XcANI34Iwf9NyARdNoTEmkelt7tzKSiabKAdRCTYEQMGnUTJqN1t41X06gfP9l/AxogFIul++sBXbvnfVzEwFS+9BrHYtXONEWhdsp02pI93H4tBhwJRsSgUbVwCYDrF0Odjva4eC5Mne7fQQ0AzSMyuw3yNJ0OU8ZI/w1IBKX6CZM59aWvoRkMturEer3jcXNh0jROf/lrgR2gCCjZTSMGjZbhIyj+2h1kv/6KreDZRYqm0R4bx/E770U1Ss7aW1XzFhFf9Lnb6xVVpfqyBX4ckQhWtTMvo37iFIYc2Et4zXmsEZHUTZ5Ga+qwQA9NBJgEI2JQqZ84lYM/eZSkvZ8QffY0mt5A/djx1E2ehmaQ9SK90ThmHJULl5C6fXOHxoGaokPRVM5es4KWYekBHqUIFtbIKKrnLgz0MESQkWBEDDrW6BiqLr8y0MMYOBSFsqtvxJSRRUrhFqLPnAJFoTFnDJULl9A4dnygRyiECHISjAgh+k5RqJucR93kPFvRs4uXCSGEJyQYEUL4lgQhQggvyW4aIYQQQgRUr4KRZ599lpEjRxIREcGcOXPYtct9E6qXX34ZRVE6fEVERPR6wEIIIYQYWLwORt544w1WrVrFww8/zL59+5g6dSrLly+nqqrK7W3i4uIoLy93fJ0+fbpPgxZCCCHEwOF1MPKb3/yGe+65hzvuuIMJEybw/PPPExUVxUsvveT2NoqikJaW5vhKTU3t06CFEEIIMXB4FYyYzWb27t3L0qVLL92BTsfSpUvZuXOn29s1NTWRlZVFRkYGN954I4cPH+72PG1tbTQ0NHT4EkIIIcTA5FUwUl1djdVq7TKzkZqaSkVFhcvb5Obm8tJLL/H222/z6quvoqoq8+bN4+zZs27Ps2bNGuLj4x1fGRkZ3gxTCCGEECGk33fTzJ07l5UrVzJt2jQWLVrEP//5T4YOHcoLL7zg9jarV6+mvr7e8XXmjLR1F0IIIQYqr+qMJCcno9frqays7HB5ZWUlaWlpHt1HWFgYeXl5nDhxwu0x4eHhhIdLjxAhhBBiMPBqZsRoNDJjxgw2bdrkuExVVTZt2sTcuXM9ug+r1crBgwcZNkwaIwkhhBCiFxVYV61axW233cbMmTOZPXs2Tz31FCaTiTvuuAOAlStXkp6ezpo1awB49NFHueyyyxg9ejR1dXX8+te/5vTp09x9992+/UmEEEIIEZK8DkZuvvlmzp8/z//8z/9QUVHBtGnT+OCDDxyLWktLS9HpLk24XLhwgXvuuYeKigqGDBnCjBkz2LFjBxMmTPDdTyGEEEKIkKVomr2rVfBqaGggPj6erQ//ipiIyEAPRwghhBAeaGptYdEjP6a+vp64uDi3x0lvGiGEEEIElAQjQgghhAgoCUaEEEIIEVASjAghhBAioCQYEUIIIURASTAihBBCiICSYEQIIYQQASXBiBBCCCECSoIRIYQQQgSUBCNCCCGECCgJRoQQQggRUBKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQEowIIYQQIqAkGBFCCCFEQEkwIoQQQoiAkmBECCGEEAElwYgQQgghAsoQ6AEIIYQQYuAx1p3C2Nbm0bEyMyKEEEIInzLWnSJpbDoZi2d4dLzMjAghhBDCZ+yBSExmOq2jp3l0GwlGhBBCCNFnxrpTAGQtnY0uMxdDUgpFF6we3VaCESGEEEL0ifNsiC4zl9KIVBRLFJuPFXt0ewlGhBBCCNFrzoGIMW8hxSYFJTyKgqJqdu4r8eg+JBgRQgghRK8Y606RtXS27f95CymxRKOEQ0FRNXv2lxARpvfofmQ3jRBCCCF67fSHuwCw1FSRbTABoGkqM/OyPb4PmRkRQgghRK+YE0YCtoAkaWwZMZnpZOctJD87BiU8ihZTFq97cD+9mhl59tlnGTlyJBEREcyZM4ddu3Z1e/ybb77JuHHjiIiIYPLkybz33nu9Oa0QQgghgpA5YSQ1x8poKi3DvH87ma2VaG3NLBmT5NHtvQ5G3njjDVatWsXDDz/Mvn37mDp1KsuXL6eqqsrl8Tt27OCWW27hrrvuYv/+/axYsYIVK1Zw6NAhb08thBBCiCBlD0hOf7gLtbSIzNZKsgzNHt1W0TRN8+Zkc+bMYdasWTzzzDMAqKpKRkYG3/3ud/nJT37S5fibb74Zk8nEO++847jssssuY9q0aTz//PMuz9HW1kabUwnZhoYGMjIy2Prwr4iJiPRmuEIIIYTwM/sOGzVpCCNW3El9fT1xcXFuj/dqZsRsNrN3716WLl166Q50OpYuXcrOnTtd3mbnzp0djgdYvny52+MB1qxZQ3x8vOMrIyPDm2EKIYQQIoDssyRntuz16HivgpHq6mqsViupqakdLk9NTaWiosLlbSoqKrw6HmD16tXU19c7vs6cOePNMIUQQggRYOaEkZjjMz06Nih304SHhxMeHh7oYQghhBDCD7yaGUlOTkav11NZWdnh8srKStLS0lzeJi0tzavjhRBCCDG4eBWMGI1GZsyYwaZNmxyXqarKpk2bmDt3rsvbzJ07t8PxAAUFBW6PF0IIIcTg4nWaZtWqVdx2223MnDmT2bNn89RTT2EymbjjjjsAWLlyJenp6axZswaA+++/n0WLFvHEE09w7bXX8vrrr7Nnzx5efPFF3/4kQgghhAhJXgcjN998M+fPn+d//ud/qKioYNq0aXzwwQeORaqlpaXodJcmXObNm8fatWt56KGHePDBBxkzZgzr169n0qRJvvsphBBCCBGyvK4zEggNDQ3Ex8dLnREhhBAihDS1trDokR/7ts6IEEIIIYSvSTAihBBCiICSYEQIIYQQASXBiBBCCCECSoIRIYQQQgSUBCNCCCGECCgJRoQQQggRUBKMCCGEECKggrJrb2f2umymttYAj0QIIYQQnrK/b/dUXzUkKrCePXuWjIyMQA9DCCGEEL1w5swZRowY4fb6kAhGVFXl3LlzxMbGoihKoIcTtBoaGsjIyODMmTPdlt0V/U/+FsFB/g7BQ/4WwcOffwtN02hsbGT48OEd+tZ1FhJpGp1O121EJTqKi4uTJ3uQkL9FcJC/Q/CQv0Xw8NffIj4+vsdjZAGrEEIIIQJKghEhhBBCBJQEIwNIeHg4Dz/8MOHh4YEeyqAnf4vgIH+H4CF/i+ARjH+LkFjAKoQQQoiBS2ZGhBBCCBFQEowIIYQQIqAkGBFCCCFEQEkwIoQQQoiAkmBECCGEEAElwcgA8uyzzzJy5EgiIiKYM2cOu3btCvSQBp1t27Zx/fXXM3z4cBRFYf369YEe0qC0Zs0aZs2aRWxsLCkpKaxYsYKioqJAD2tQeu6555gyZYqj2ufcuXN5//33Az2sQe/xxx9HURQeeOCBQA8FkGBkwHjjjTdYtWoVDz/8MPv27WPq1KksX76cqqqqQA9tUDGZTEydOpVnn3020EMZ1LZu3cq9997Lxx9/TEFBAe3t7SxbtgyTyRTooQ06I0aM4PHHH2fv3r3s2bOHJUuWcOONN3L48OFAD23Q2r17Ny+88AJTpkwJ9FAcpM7IADFnzhxmzZrFM888A9iaC2ZkZPDd736Xn/zkJwEe3eCkKArr1q1jxYoVgR7KoHf+/HlSUlLYunUrl19+eaCHM+glJiby61//mrvuuivQQxl0mpqamD59Or///e/5+c9/zrRp03jqqacCPSyZGRkIzGYze/fuZenSpY7LdDodS5cuZefOnQEcmRDBob6+HrC9CYrAsVqtvP7665hMJubOnRvo4QxK9957L9dee22H94tgEBJde0X3qqursVqtpKamdrg8NTWVo0ePBmhUQgQHVVV54IEHmD9/PpMmTQr0cAalgwcPMnfuXFpbW4mJiWHdunVMmDAh0MMadF5//XX27dvH7t27Az2ULiQYEUIMaPfeey+HDh2isLAw0EMZtHJzczlw4AD19fW89dZb3HbbbWzdulUCEj86c+YM999/PwUFBURERAR6OF1IMDIAJCcno9frqays7HB5ZWUlaWlpARqVEIF333338c4777Bt2zZGjBgR6OEMWkajkdGjRwMwY8YMdu/ezdNPP80LL7wQ4JENHnv37qWqqorp06c7LrNarWzbto1nnnmGtrY29Hp9wMYna0YGAKPRyIwZM9i0aZPjMlVV2bRpk+RlxaCkaRr33Xcf69atY/PmzWRnZwd6SMKJqqq0tbUFehiDypVXXsnBgwc5cOCA42vmzJnceuutHDhwIKCBCMjMyICxatUqbrvtNmbOnMns2bN56qmnMJlM3HHHHYEe2qDS1NTEiRMnHN+XlJRw4MABEhMTyczMDODIBpd7772XtWvX8vbbbxMbG0tFRQUA8fHxREZGBnh0g8vq1au5+uqryczMpLGxkbVr17JlyxY2bNgQ6KENKrGxsV3WTEVHR5OUlBQUa6kkGBkgbr75Zs6fP8///M//UFFRwbRp0/jggw+6LGoV/WvPnj1cccUVju9XrVoFwG233cbLL78coFENPs899xwAixcv7nD5n//8Z26//Xb/D2gQq6qqYuXKlZSXlxMfH8+UKVPYsGED+fn5gR6aCCJSZ0QIIYQQASVrRoQQQggRUBKMCCGEECKgJBgRQgghREBJMCKEEEKIgJJgRAghhBABJcGIEEIIIQJKghEhhBBCBJQEI0IIIYQIKAlGhBBCCBFQEowIIYQQIqAkGBFCCCFEQP1/pYn82dx6vUcAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "result = cc.get_result(dispatch_id, wait=True)\n", - "result.result.load()\n", - "\n", - "train_acc, test_acc, decision_boundary_figure = result.result.value\n", - "print(f\"Train accuracy: {train_acc * 100:.1f}%\")\n", - "print(f\"Test accuracy: {test_acc * 100:.1f}%\")\n", - "\n", - "decision_boundary_figure" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a 2-dimensional dataset. To make the most of this tutorial, try experimenting with different datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU acceleration.\n", - "\n", - "The cost of running this workflow is approximately $0.27. The full code is available below." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Full Code" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "import covalent as ct\n", - "import covalent_cloud as cc\n", - "import matplotlib.pyplot as plt\n", - "import pennylane as qml\n", - "from matplotlib.colors import ListedColormap\n", - "from pennylane import numpy as np\n", - "from sklearn.datasets import make_blobs\n", - "from sklearn.inspection import DecisionBoundaryDisplay\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.svm import SVC\n", - "\n", - "cc.save_api_key(\"API_KEY\")\n", - "\n", - "cc.create_env(\n", - " name=\"pennylane-gpu\", # identifier for referring to this environment\n", - " conda={\n", - " \"channels\": [\"conda-forge\"],\n", - " \"dependencies\": [\"cudatoolkit>=11.8\"],\n", - " }, pip=[\n", - " \"cuquantum==23.10.0\",\n", - " \"matplotlib==3.8.2\",\n", - " \"Pennylane==0.34.0\",\n", - " \"PennyLane-Lightning[GPU]==0.34.0\",\n", - " \"scikit-learn==1.3.1\",\n", - " \"torch==2.1.2\",\n", - " ],\n", - " wait=True\n", - ")\n", - "\n", - "cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks\n", - " env=\"pennylane-gpu\",\n", - " num_cpus=2,\n", - " memory=\"2GB\",\n", - ")\n", - "gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations\n", - " env=\"pennylane-gpu\",\n", - " num_cpus=4,\n", - " memory=\"12GB\",\n", - " num_gpus=1,\n", - " gpu_type=\"v100\"\n", - ")\n", - "\n", - "QML_DEVICE = \"lightning.gpu\"\n", - "\n", - "def get_kernel_circuit(n_wires):\n", - "\n", - " @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None))\n", - " def circuit(x1, x2):\n", - " qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4)\n", - " qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4)\n", - " return qml.probs(wires=range(n_wires))\n", - "\n", - " return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability\n", - "\n", - "@ct.electron(executor=cpu_executor) # lightweight non-quantum task\n", - "def get_split_data(n_samples=18, test_size=0.2):\n", - " centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]\n", - " X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False)\n", - " # rescale labels to be -1, 1\n", - " mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1}\n", - " y = np.array([mapping[i] for i in y])\n", - " X = X.astype(np.float32)\n", - " y = y.astype(int)\n", - "\n", - " # X_train, X_test, y_train, y_test\n", - " return train_test_split(X, y, test_size=test_size, random_state=3)\n", - "\n", - "DISP_SETTINGS = {\"grid_resolution\": 50, \"response_method\": \"predict\", \"alpha\": 0.5, \"cmap\": plt.cm.RdBu}\n", - "\n", - "@ct.electron(executor=gpu_executor)\n", - "def classify_with_qsvm(Xtr, Xte, ytr, yte):\n", - " kernel = get_kernel_circuit(n_wires=Xtr.shape[1])\n", - "\n", - " kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel)\n", - " svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr)\n", - "\n", - " # train/test accuracy\n", - " accuracy_tr = svc.score(Xtr, ytr)\n", - " accuracy_te = svc.score(Xte, yte)\n", - "\n", - " # decision boundary\n", - " cm_bright = ListedColormap([\"#FF0000\", \"#0000FF\"])\n", - " disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS)\n", - " disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright)\n", - " disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker=\"$\\u25EF$\")\n", - "\n", - " return accuracy_tr, accuracy_te, disp\n", - "\n", - "@ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor)\n", - "def run_qsvm(n_samples, test_size):\n", - " Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size)\n", - " return classify_with_qsvm(Xtr, Xte, ytr, yte)\n", - "\n", - "dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2)\n", - "print(\"Dispatch ID:\", dispatch_id)\n", - "\n", - "result = cc.get_result(dispatch_id, wait=True)\n", - "result.result.load()\n", - "\n", - "train_acc, test_acc, decision_boundary_figure = result.result.value\n", - "print(f\"Train accuracy: {train_acc * 100:.1f}%\")\n", - "print(f\"Test accuracy: {test_acc * 100:.1f}%\")\n", - "```" - ] - } - ], - "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.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py new file mode 100644 index 0000000000..d3036ff7c6 --- /dev/null +++ b/demonstrations/covalent_cloud_gpu.py @@ -0,0 +1,355 @@ +r"""Classification with GPU-quantum embedding kernels on Covalent Cloud +=================================================================== +""" + +###################################################################### +# Quantum support-vector machines (QSVMs) are essentially `traditional +# SVMs `__ that rely on `embedding +# kernels `__ evaluated on +# a quantum computer—a.k.a. `quantum embedding +# kernel `__. +# These kernels provide a unique (and perhaps classically-intractable) means of measuring pairwise +# similarity. +# +# Using GPUs to simulate quantum computers is worthwhile when qubit capacity and/or fidelity +# requirements are not met by the available quantum hardware. While QSVMs are relatively tolerant to +# noise (an important reason for their current popularity), evaluating kernels on *real* quantum +# hardware is not always practical nor necessary. +# +# In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on +# Covalent Cloud. +# + +###################################################################### +# Let’s start by importing the required packages. +# + +import covalent as ct +import covalent_cloud as cc +import matplotlib.pyplot as plt +import pennylane as qml +from matplotlib.colors import ListedColormap +from pennylane import numpy as np +from sklearn.datasets import make_blobs +from sklearn.inspection import DecisionBoundaryDisplay +from sklearn.model_selection import train_test_split +from sklearn.svm import SVC + +# cc.save_api_key("YOUR_API_KEY") + +###################################################################### +# Covalent Cloud allows us to create `re-usable execution +# environments `__, as shown +# below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs. +# + +cc.create_env( + name="pennylane-gpu", # identifier for referring to this environment + conda={ + "channels": ["conda-forge"], + "dependencies": ["cudatoolkit>=11.8"], + }, pip=[ + "cuquantum==23.10.0", + "matplotlib==3.8.2", + "Pennylane==0.34.0", + "PennyLane-Lightning[GPU]==0.34.0", + "scikit-learn==1.3.1", + "torch==2.1.2", + ], + wait=True +) + +###################################################################### +# .. rst-class :: sphx-glr-script-out +# +# .. code-block: none +# +# Waiting for environment pennylane-gpu to be ready............................................................................................................................................................................ +# Name: pennylane-gpu +# Status: READY +# Estimated Time: 1002 seconds +# Notes: +# pip was added to the dependencies. +# Python version 3.10 was added to the dependencies. +# Environment file contains: +# ========================== +# channels: +# - conda-forge +# dependencies: +# - python=3.10 +# - pip +# - cudatoolkit>=11.8 +# - pip: +# - cuquantum==23.10.0 +# - matplotlib==3.8.2 +# - Pennylane==0.34.0 +# - PennyLane-Lightning[GPU]==0.34.0 +# - scikit-learn==1.3.1 +# - torch==2.1.2 +# - covalent-cloud +# name: pennylane-gpu +# + +###################################################################### +# Next, we’ll define our resource specifications by creating some +# `executors `__ +# for this workflow. Both executors will run tasks in our new environment, named ``”pennylane-gpu”``. +# + +cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks + env="pennylane-gpu", + num_cpus=2, + memory="2GB", +) +gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations + env="pennylane-gpu", + num_cpus=4, + memory="12GB", + num_gpus=1, + gpu_type="v100" +) + +###################################################################### +# On to the algorithm! +# +# Here’s a function returns a simple quantum kernel based on Pennylane’s `IQP +# Embedding `__ template. +# We’ll use it as-is inside our workflow. +# + +QML_DEVICE = "lightning.qubit" + +def get_kernel_circuit(n_wires): + + @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None)) + def circuit(x1, x2): + qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4) + qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4) + return qml.probs(wires=range(n_wires)) + + return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability + +###################################################################### +# Next, each function destined for remote execution is decorated with ``@ct.electron``, with an +# `executor `__ +# specified therein. Only tasks that evaluate the simulated quantum kernel should require +# ``gpu_executor``. For example, we don’t need GPUs to generate our input data: +# + +@ct.electron(executor=cpu_executor) # lightweight non-quantum task +def get_split_data(n_samples=18, test_size=0.2): + centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] + X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False) + # rescale labels to be -1, 1 + mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1} + y = np.array([mapping[i] for i in y]) + X = X.astype(np.float32) + y = y.astype(int) + + # X_train, X_test, y_train, y_test + return train_test_split(X, y, test_size=test_size, random_state=3) + +###################################################################### +# Classifying with the SVM, on the other hand, requires :math:`O(n^2)` kernel evaluations, where +# :math:`n` is the dataset size. Accordingly, we’ll use GPUs (i.e. ``gpu_executor``) to speed up this +# process. +# + +DISP_SETTINGS = {"grid_resolution": 50, "response_method": "predict", "alpha": 0.5, "cmap": plt.cm.RdBu} + +@ct.electron(executor=gpu_executor) +def classify_with_qsvm(Xtr, Xte, ytr, yte): + kernel = get_kernel_circuit(n_wires=Xtr.shape[1]) + + kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel) + svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr) + + # train/test accuracy + accuracy_tr = svc.score(Xtr, ytr) + accuracy_te = svc.score(Xte, yte) + + # decision boundary + cm_bright = ListedColormap(["#FF0000", "#0000FF"]) + disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS) + disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright) + disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker="$\u25EF$") + + return accuracy_tr, accuracy_te, disp + +###################################################################### +# Putting it all together, we can define a QSVM training and testing workflow. This special function +# gets decorated with ``@ct.lattice``. +# + +@ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor) +def run_qsvm(n_samples, test_size): + Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size) + return classify_with_qsvm(Xtr, Xte, ytr, yte) + +###################################################################### +# Now, to dispatch ``run_qsvm`` to Covalent Cloud, we call it after wrapping with ``ct.dispatch``, as +# usual. +# + +dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2) +print("Dispatch ID:", dispatch_id) + +###################################################################### +# .. rst-class :: sphx-glr-script-out +# +# .. code-block: none +# +# Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663 + +###################################################################### +# Here’s what we get when we query and display the results. +# + +result = cc.get_result(dispatch_id, wait=True) +result.result.load() + +train_acc, test_acc, decision_boundary_figure = result.result.value +print(f"Train accuracy: {train_acc * 100:.1f}%") +print(f"Test accuracy: {test_acc * 100:.1f}%") + +decision_boundary_figure + +###################################################################### +# .. rst-class :: sphx-glr-script-out +# +# .. code-block: none +# +# Train accuracy: 64.7% +# Test accuracy: 76.9%# .. rst-class :: sphx-glr-script-out +# +# .. code-block: none +# +# +# .. figure:: ../demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png +# :align: center +# :width: 80% + +###################################################################### +# Conclusion +# ========== +# +# In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. +# We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a +# 2-dimensional dataset. To make the most of this tutorial, try experimenting with different +# datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU +# acceleration. +# +# The cost of running this workflow is approximately $0.27. The full code is available below. +# + +###################################################################### +# Full Code +# --------- +# + +###################################################################### +# .. code:: python +# +# import covalent as ct +# import covalent_cloud as cc +# import matplotlib.pyplot as plt +# import pennylane as qml +# from matplotlib.colors import ListedColormap +# from pennylane import numpy as np +# from sklearn.datasets import make_blobs +# from sklearn.inspection import DecisionBoundaryDisplay +# from sklearn.model_selection import train_test_split +# from sklearn.svm import SVC +# +# cc.save_api_key("API_KEY") +# +# cc.create_env( +# name="pennylane-gpu", # identifier for referring to this environment +# conda={ +# "channels": ["conda-forge"], +# "dependencies": ["cudatoolkit>=11.8"], +# }, pip=[ +# "cuquantum==23.10.0", +# "matplotlib==3.8.2", +# "Pennylane==0.34.0", +# "PennyLane-Lightning[GPU]==0.34.0", +# "scikit-learn==1.3.1", +# "torch==2.1.2", +# ], +# wait=True +# ) +# +# cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks +# env="pennylane-gpu", +# num_cpus=2, +# memory="2GB", +# ) +# gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations +# env="pennylane-gpu", +# num_cpus=4, +# memory="12GB", +# num_gpus=1, +# gpu_type="v100" +# ) +# +# QML_DEVICE = "lightning.gpu" +# +# def get_kernel_circuit(n_wires): +# +# @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None)) +# def circuit(x1, x2): +# qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4) +# qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4) +# return qml.probs(wires=range(n_wires)) +# +# return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability +# +# @ct.electron(executor=cpu_executor) # lightweight non-quantum task +# def get_split_data(n_samples=18, test_size=0.2): +# centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] +# X, y = make_blobs(n_samples, centers=centers, cluster_std=0.25, shuffle=False) +# # rescale labels to be -1, 1 +# mapping = {0: -1, 1: 1, 2: -1, 3: 1, 4: -1, 5: 1, 6: -1, 7: 1, 8: -1} +# y = np.array([mapping[i] for i in y]) +# X = X.astype(np.float32) +# y = y.astype(int) +# +# # X_train, X_test, y_train, y_test +# return train_test_split(X, y, test_size=test_size, random_state=3) +# +# DISP_SETTINGS = {"grid_resolution": 50, "response_method": "predict", "alpha": 0.5, "cmap": plt.cm.RdBu} +# +# @ct.electron(executor=gpu_executor) +# def classify_with_qsvm(Xtr, Xte, ytr, yte): +# kernel = get_kernel_circuit(n_wires=Xtr.shape[1]) +# +# kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel) +# svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr) +# +# # train/test accuracy +# accuracy_tr = svc.score(Xtr, ytr) +# accuracy_te = svc.score(Xte, yte) +# +# # decision boundary +# cm_bright = ListedColormap(["#FF0000", "#0000FF"]) +# disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS) +# disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright) +# disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker="$\u25EF$") +# +# return accuracy_tr, accuracy_te, disp +# +# @ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor) +# def run_qsvm(n_samples, test_size): +# Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size) +# return classify_with_qsvm(Xtr, Xte, ytr, yte) +# +# dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2) +# print("Dispatch ID:", dispatch_id) +# +# result = cc.get_result(dispatch_id, wait=True) +# result.result.load() +# +# train_acc, test_acc, decision_boundary_figure = result.result.value +# print(f"Train accuracy: {train_acc * 100:.1f}%") +# print(f"Test accuracy: {test_acc * 100:.1f}%") +# \ No newline at end of file diff --git a/demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png b/demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png new file mode 100644 index 0000000000000000000000000000000000000000..008e4e38968c225cc7f9fc100e6c7551979b2440 GIT binary patch literal 36050 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 Date: Tue, 14 May 2024 18:20:52 +0530 Subject: [PATCH 04/18] added metadata file --- .../covalent_cloud_gpu.metadata.json | 75 +++++++++++ demonstrations/covalent_cloud_gpu.py | 120 ++++++++++-------- 2 files changed, 140 insertions(+), 55 deletions(-) create mode 100644 demonstrations/covalent_cloud_gpu.metadata.json diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json new file mode 100644 index 0000000000..e3b1bbe45e --- /dev/null +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -0,0 +1,75 @@ +{ + "title": "Classification with GPU-quantum embedding kernels on Covalent Cloud", + "authors": [ + { + "id": "", + "affiliation": "" + }, + { + "id": "", + "affiliation": "" + } + ], + "dateOfPublication": "", + "dateOfLastModification": "", + "categories": [], + "tags": [], + "previewImages": [ + { + "type": "thumbnail", + "uri": "" + } + ], + "seoDescription": "", + "doi": "", + "canonicalURL": "", + "references": [ + { + "id": "", + "type": "", + "title": "", + "authors": "", + "year": "", + "journal": "", + "url": "" + }, + { + "id": "", + "type": "", + "title": "", + "authors": "", + "year": "", + "journal": "", + "url": "" + }, + { + "id": "", + "type": "", + "title": "", + "authors": "", + "year": "", + "journal": "", + "url": "" + } + ], + "basedOnPapers": [], + "referencedByPapers": [ + { + "type": "demonstration", + "id": "", + "weight": 1.0 + }, + { + "type": "demonstration", + "id": "", + "weight": 1.0 + }, + { + "type": "demonstration", + "id": "", + "weight": 1.0 + } + ], + "relatedContent": [], + "hardware": [] +} diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index d3036ff7c6..fe93ab14b0 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -10,19 +10,19 @@ # kernel `__. # These kernels provide a unique (and perhaps classically-intractable) means of measuring pairwise # similarity. -# +# # Using GPUs to simulate quantum computers is worthwhile when qubit capacity and/or fidelity # requirements are not met by the available quantum hardware. While QSVMs are relatively tolerant to # noise (an important reason for their current popularity), evaluating kernels on *real* quantum # hardware is not always practical nor necessary. -# +# # In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on # Covalent Cloud. -# +# ###################################################################### # Let’s start by importing the required packages. -# +# import covalent as ct import covalent_cloud as cc @@ -41,14 +41,15 @@ # Covalent Cloud allows us to create `re-usable execution # environments `__, as shown # below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs. -# +# cc.create_env( name="pennylane-gpu", # identifier for referring to this environment conda={ "channels": ["conda-forge"], "dependencies": ["cudatoolkit>=11.8"], - }, pip=[ + }, + pip=[ "cuquantum==23.10.0", "matplotlib==3.8.2", "Pennylane==0.34.0", @@ -56,14 +57,14 @@ "scikit-learn==1.3.1", "torch==2.1.2", ], - wait=True + wait=True, ) ###################################################################### # .. rst-class :: sphx-glr-script-out -# +# # .. code-block: none -# +# # Waiting for environment pennylane-gpu to be ready............................................................................................................................................................................ # Name: pennylane-gpu # Status: READY @@ -88,13 +89,13 @@ # - torch==2.1.2 # - covalent-cloud # name: pennylane-gpu -# +# ###################################################################### # Next, we’ll define our resource specifications by creating some # `executors `__ # for this workflow. Both executors will run tasks in our new environment, named ``”pennylane-gpu”``. -# +# cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks env="pennylane-gpu", @@ -102,23 +103,20 @@ memory="2GB", ) gpu_executor = cc.CloudExecutor( # for GPU-powered circuit simulations - env="pennylane-gpu", - num_cpus=4, - memory="12GB", - num_gpus=1, - gpu_type="v100" + env="pennylane-gpu", num_cpus=4, memory="12GB", num_gpus=1, gpu_type="v100" ) ###################################################################### # On to the algorithm! -# +# # Here’s a function returns a simple quantum kernel based on Pennylane’s `IQP # Embedding `__ template. # We’ll use it as-is inside our workflow. -# +# QML_DEVICE = "lightning.qubit" + def get_kernel_circuit(n_wires): @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None)) @@ -129,12 +127,14 @@ def circuit(x1, x2): return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability + ###################################################################### # Next, each function destined for remote execution is decorated with ``@ct.electron``, with an # `executor `__ # specified therein. Only tasks that evaluate the simulated quantum kernel should require # ``gpu_executor``. For example, we don’t need GPUs to generate our input data: -# +# + @ct.electron(executor=cpu_executor) # lightweight non-quantum task def get_split_data(n_samples=18, test_size=0.2): @@ -149,13 +149,20 @@ def get_split_data(n_samples=18, test_size=0.2): # X_train, X_test, y_train, y_test return train_test_split(X, y, test_size=test_size, random_state=3) + ###################################################################### # Classifying with the SVM, on the other hand, requires :math:`O(n^2)` kernel evaluations, where # :math:`n` is the dataset size. Accordingly, we’ll use GPUs (i.e. ``gpu_executor``) to speed up this # process. -# +# + +DISP_SETTINGS = { + "grid_resolution": 50, + "response_method": "predict", + "alpha": 0.5, + "cmap": plt.cm.RdBu, +} -DISP_SETTINGS = {"grid_resolution": 50, "response_method": "predict", "alpha": 0.5, "cmap": plt.cm.RdBu} @ct.electron(executor=gpu_executor) def classify_with_qsvm(Xtr, Xte, ytr, yte): @@ -176,34 +183,37 @@ def classify_with_qsvm(Xtr, Xte, ytr, yte): return accuracy_tr, accuracy_te, disp + ###################################################################### # Putting it all together, we can define a QSVM training and testing workflow. This special function # gets decorated with ``@ct.lattice``. -# +# + @ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor) def run_qsvm(n_samples, test_size): Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size) return classify_with_qsvm(Xtr, Xte, ytr, yte) + ###################################################################### # Now, to dispatch ``run_qsvm`` to Covalent Cloud, we call it after wrapping with ``ct.dispatch``, as # usual. -# +# dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2) print("Dispatch ID:", dispatch_id) ###################################################################### # .. rst-class :: sphx-glr-script-out -# +# # .. code-block: none -# +# # Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663 ###################################################################### # Here’s what we get when we query and display the results. -# +# result = cc.get_result(dispatch_id, wait=True) result.result.load() @@ -216,14 +226,14 @@ def run_qsvm(n_samples, test_size): ###################################################################### # .. rst-class :: sphx-glr-script-out -# +# # .. code-block: none -# +# # Train accuracy: 64.7% # Test accuracy: 76.9%# .. rst-class :: sphx-glr-script-out -# +# # .. code-block: none -# +# # # .. figure:: ../demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png # :align: center @@ -232,24 +242,24 @@ def run_qsvm(n_samples, test_size): ###################################################################### # Conclusion # ========== -# +# # In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. # We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a # 2-dimensional dataset. To make the most of this tutorial, try experimenting with different # datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU # acceleration. -# +# # The cost of running this workflow is approximately $0.27. The full code is available below. -# +# ###################################################################### # Full Code # --------- -# +# ###################################################################### # .. code:: python -# +# # import covalent as ct # import covalent_cloud as cc # import matplotlib.pyplot as plt @@ -260,9 +270,9 @@ def run_qsvm(n_samples, test_size): # from sklearn.inspection import DecisionBoundaryDisplay # from sklearn.model_selection import train_test_split # from sklearn.svm import SVC -# +# # cc.save_api_key("API_KEY") -# +# # cc.create_env( # name="pennylane-gpu", # identifier for referring to this environment # conda={ @@ -278,7 +288,7 @@ def run_qsvm(n_samples, test_size): # ], # wait=True # ) -# +# # cpu_executor = cc.CloudExecutor( # for lightweight non-quantum tasks # env="pennylane-gpu", # num_cpus=2, @@ -291,19 +301,19 @@ def run_qsvm(n_samples, test_size): # num_gpus=1, # gpu_type="v100" # ) -# +# # QML_DEVICE = "lightning.gpu" -# +# # def get_kernel_circuit(n_wires): -# +# # @qml.qnode(qml.device(QML_DEVICE, wires=n_wires, shots=None)) # def circuit(x1, x2): # qml.IQPEmbedding(x1, wires=range(n_wires), n_repeats=4) # qml.adjoint(qml.IQPEmbedding)(x2, wires=range(n_wires), n_repeats=4) # return qml.probs(wires=range(n_wires)) -# +# # return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability -# +# # @ct.electron(executor=cpu_executor) # lightweight non-quantum task # def get_split_data(n_samples=18, test_size=0.2): # centers = [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] @@ -313,43 +323,43 @@ def run_qsvm(n_samples, test_size): # y = np.array([mapping[i] for i in y]) # X = X.astype(np.float32) # y = y.astype(int) -# +# # # X_train, X_test, y_train, y_test # return train_test_split(X, y, test_size=test_size, random_state=3) -# +# # DISP_SETTINGS = {"grid_resolution": 50, "response_method": "predict", "alpha": 0.5, "cmap": plt.cm.RdBu} -# +# # @ct.electron(executor=gpu_executor) # def classify_with_qsvm(Xtr, Xte, ytr, yte): # kernel = get_kernel_circuit(n_wires=Xtr.shape[1]) -# +# # kernel_matrix_fn = lambda X, Z: qml.kernels.kernel_matrix(X, Z, kernel) # svc = SVC(kernel=kernel_matrix_fn).fit(Xtr, ytr) -# +# # # train/test accuracy # accuracy_tr = svc.score(Xtr, ytr) # accuracy_te = svc.score(Xte, yte) -# +# # # decision boundary # cm_bright = ListedColormap(["#FF0000", "#0000FF"]) # disp = DecisionBoundaryDisplay.from_estimator(svc, Xte, **DISP_SETTINGS) # disp.ax_.scatter(Xtr[:, 0], Xtr[:, 1], c=ytr, cmap=cm_bright) # disp.ax_.scatter(Xte[:, 0], Xte[:, 1], c=yte, cmap=cm_bright, marker="$\u25EF$") -# +# # return accuracy_tr, accuracy_te, disp -# +# # @ct.lattice(workflow_executor=cpu_executor, executor=cpu_executor) # def run_qsvm(n_samples, test_size): # Xtr, Xte, ytr, yte = get_split_data(n_samples, test_size) # return classify_with_qsvm(Xtr, Xte, ytr, yte) -# +# # dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2) # print("Dispatch ID:", dispatch_id) -# +# # result = cc.get_result(dispatch_id, wait=True) # result.result.load() -# +# # train_acc, test_acc, decision_boundary_figure = result.result.value # print(f"Train accuracy: {train_acc * 100:.1f}%") # print(f"Test accuracy: {test_acc * 100:.1f}%") -# \ No newline at end of file +# From 53da22726d88d9c064da625310dcd0dee47e1ac2 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 14 May 2024 18:50:26 +0530 Subject: [PATCH 05/18] title update and link addition --- demonstrations/covalent_cloud_gpu.metadata.json | 2 +- demonstrations/covalent_cloud_gpu.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index e3b1bbe45e..bdab9dd9cf 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -1,5 +1,5 @@ { - "title": "Classification with GPU-quantum embedding kernels on Covalent Cloud", + "title": "Running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane", "authors": [ { "id": "", diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index fe93ab14b0..ac49772298 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -1,8 +1,12 @@ -r"""Classification with GPU-quantum embedding kernels on Covalent Cloud +r"""Running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane =================================================================== """ ###################################################################### + +# In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on +# `Covalent Cloud `__. + # Quantum support-vector machines (QSVMs) are essentially `traditional # SVMs `__ that rely on `embedding # kernels `__ evaluated on @@ -16,9 +20,6 @@ # noise (an important reason for their current popularity), evaluating kernels on *real* quantum # hardware is not always practical nor necessary. # -# In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on -# Covalent Cloud. -# ###################################################################### # Let’s start by importing the required packages. @@ -65,7 +66,7 @@ # # .. code-block: none # -# Waiting for environment pennylane-gpu to be ready............................................................................................................................................................................ +# Waiting for environment pennylane-gpu to be ready.................. # Name: pennylane-gpu # Status: READY # Estimated Time: 1002 seconds From 55c0ab0815e53126b3c02bd75cf4304a51cda778 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 14 May 2024 18:56:20 +0530 Subject: [PATCH 06/18] updated more text --- demonstrations/covalent_cloud_gpu.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index ac49772298..64b73dad90 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -4,8 +4,9 @@ ###################################################################### -# In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations on -# `Covalent Cloud `__. +# In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations +# on `Covalent Cloud `__ using PennyLane. We will focus on a specific example around +# quantum SVM to demonstrate how easy it is to run GPU accelerated quantum circuit simulation on Covalent Cloud. # Quantum support-vector machines (QSVMs) are essentially `traditional # SVMs `__ that rely on `embedding From 94c6291617fe3e916939d086d9a38f5a6d96a5ae Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Fri, 17 May 2024 17:09:59 +0530 Subject: [PATCH 07/18] added bio and image --- _static/authors/ara_ghukasyan.jpeg | Bin 0 -> 63812 bytes _static/authors/ara_ghukasyan.txt | 6 ++++++ demonstrations/covalent_cloud_gpu.metadata.json | 6 ++---- demonstrations/covalent_cloud_gpu.py | 5 +++++ 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 _static/authors/ara_ghukasyan.jpeg create mode 100644 _static/authors/ara_ghukasyan.txt diff --git a/_static/authors/ara_ghukasyan.jpeg b/_static/authors/ara_ghukasyan.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..da3f8aae14c71dbf3583328b1f4000ce153de1bd GIT binary patch literal 63812 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

^fLh7u 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

pud5}3iq~RfGFY1l`$#L~8`dTm%?v+h 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 literal 0 HcmV?d00001 diff --git a/_static/authors/ara_ghukasyan.txt b/_static/authors/ara_ghukasyan.txt new file mode 100644 index 0000000000..f7295c4a64 --- /dev/null +++ b/_static/authors/ara_ghukasyan.txt @@ -0,0 +1,6 @@ +.. bio:: Ara Ghukasyan + :photo: ../_static/authors/ara_ghukasyan.jpeg + + Ara is a Research Software Engineer at Agnostiq Inc. He has a B.Sc. in Math & Physics and a Ph.D. in Engineering Physics from McMaster University in Hamilton, Ontario. Ara’s interests include Machine Learning, Physics, and Quantum Computing. + + diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index bdab9dd9cf..78578f6784 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -2,12 +2,10 @@ "title": "Running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane", "authors": [ { - "id": "", - "affiliation": "" + "id": "ara_ghukasyan" }, { - "id": "", - "affiliation": "" + "id": "santosh_kumar_radha" } ], "dateOfPublication": "", diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index 64b73dad90..342b65975f 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -365,3 +365,8 @@ def run_qsvm(n_samples, test_size): # print(f"Train accuracy: {train_acc * 100:.1f}%") # print(f"Test accuracy: {test_acc * 100:.1f}%") # + +############################################################################## +# About the author +# ---------------- +# From 4d09dc115967bcd29f26aa28f28d988d7009740c Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Fri, 17 May 2024 17:56:26 +0530 Subject: [PATCH 08/18] updated json metadata --- .../covalent_cloud_gpu.metadata.json | 54 ++++--------------- 1 file changed, 9 insertions(+), 45 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index 78578f6784..39ffc00502 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -10,7 +10,9 @@ ], "dateOfPublication": "", "dateOfLastModification": "", - "categories": [], + "categories": [ + "Quantum Machine Learning" + ], "tags": [], "previewImages": [ { @@ -18,56 +20,18 @@ "uri": "" } ], - "seoDescription": "", + "seoDescription": "Explore the process of running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane.", "doi": "", - "canonicalURL": "", - "references": [ - { - "id": "", - "type": "", - "title": "", - "authors": "", - "year": "", - "journal": "", - "url": "" - }, - { - "id": "", - "type": "", - "title": "", - "authors": "", - "year": "", - "journal": "", - "url": "" - }, - { - "id": "", - "type": "", - "title": "", - "authors": "", - "year": "", - "journal": "", - "url": "" - } - ], + "canonicalURL": "/qml/demos/covalent_cloud_gpu", + "references": [], "basedOnPapers": [], - "referencedByPapers": [ - { - "type": "demonstration", - "id": "", - "weight": 1.0 - }, - { - "type": "demonstration", - "id": "", - "weight": 1.0 - }, + "referencedByPapers": [], + "relatedContent": [ { "type": "demonstration", - "id": "", + "id": "tutorial_univariate_qvr", "weight": 1.0 } ], - "relatedContent": [], "hardware": [] } From 9e08ee5afb816deb3832fad1c3f41a74abc658db Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Fri, 17 May 2024 18:01:40 +0530 Subject: [PATCH 09/18] commit to start the build --- demonstrations/covalent_cloud_gpu.metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index 39ffc00502..81293b38f1 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -16,7 +16,7 @@ "tags": [], "previewImages": [ { - "type": "thumbnail", + "type": "", "uri": "" } ], From d1380c2bdf0766d25fdb99ca4cc173957d5f1fe7 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Sat, 18 May 2024 12:38:31 +0530 Subject: [PATCH 10/18] implemented suggestions --- .../covalent_cloud_gpu_19_1.png | Bin .../thumbnail_covalent_cloud_gpu.png | Bin 0 -> 20147 bytes .../thumbnail_large_covalent_cloud_gpu.png | Bin 0 -> 82619 bytes demonstrations/covalent_cloud_gpu.metadata.json | 12 ++++++++---- demonstrations/covalent_cloud_gpu.py | 4 ++-- 5 files changed, 10 insertions(+), 6 deletions(-) rename {demonstrations => _static/demonstration_assets}/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png (100%) create mode 100644 _static/demonstration_assets/covalent_cloud_gpu/thumbnail_covalent_cloud_gpu.png create mode 100644 _static/large_demo_thumbnails/thumbnail_large_covalent_cloud_gpu.png diff --git a/demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png b/_static/demonstration_assets/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png similarity index 100% rename from demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png rename to _static/demonstration_assets/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png diff --git a/_static/demonstration_assets/covalent_cloud_gpu/thumbnail_covalent_cloud_gpu.png b/_static/demonstration_assets/covalent_cloud_gpu/thumbnail_covalent_cloud_gpu.png new file mode 100644 index 0000000000000000000000000000000000000000..58a7d1ea6bfe93ad21ab955177518d4afc9f66f9 GIT binary patch literal 20147 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 z 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 OY;zN9++$-x#D4&bfhKhT literal 0 HcmV?d00001 diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index 81293b38f1..dad273e414 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -8,16 +8,20 @@ "id": "santosh_kumar_radha" } ], - "dateOfPublication": "", - "dateOfLastModification": "", + "dateOfPublication": "2024-03-18T00:00:00+00:00", + "dateOfLastModification": "2024-03-18T00:00:00+00:00", "categories": [ "Quantum Machine Learning" ], "tags": [], "previewImages": [ { - "type": "", - "uri": "" + "type": "thumbnail", + "uri": "/_static/demonstration_assets/covalent_cloud_gpu/thumbnail_covalent_cloud_gpu.png" + }, + { + "type": "large_thumbnail", + "uri": "/_static/large_demo_thumbnails/thumbnail_large_covalent_cloud_gpu.png" } ], "seoDescription": "Explore the process of running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane.", diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index 342b65975f..c35c0a7e1a 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -237,9 +237,9 @@ def run_qsvm(n_samples, test_size): # .. code-block: none # # -# .. figure:: ../demonstrations/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png +# .. figure:: ../_static/demonstration_assets/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png # :align: center -# :width: 80% +# :width: 90% ###################################################################### # Conclusion From cd5e1039a64803e3cbfc0d83a79431fce262f23e Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Sat, 18 May 2024 14:20:18 +0530 Subject: [PATCH 11/18] updating to 79 hashes --- demonstrations/covalent_cloud_gpu.py | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index c35c0a7e1a..14726c6717 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -2,7 +2,7 @@ =================================================================== """ -###################################################################### +############################################################################## # In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations # on `Covalent Cloud `__ using PennyLane. We will focus on a specific example around @@ -22,7 +22,7 @@ # hardware is not always practical nor necessary. # -###################################################################### +############################################################################## # Let’s start by importing the required packages. # @@ -39,7 +39,7 @@ # cc.save_api_key("YOUR_API_KEY") -###################################################################### +############################################################################## # Covalent Cloud allows us to create `re-usable execution # environments `__, as shown # below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs. @@ -62,7 +62,7 @@ wait=True, ) -###################################################################### +############################################################################## # .. rst-class :: sphx-glr-script-out # # .. code-block: none @@ -93,7 +93,7 @@ # name: pennylane-gpu # -###################################################################### +############################################################################## # Next, we’ll define our resource specifications by creating some # `executors `__ # for this workflow. Both executors will run tasks in our new environment, named ``”pennylane-gpu”``. @@ -108,7 +108,7 @@ env="pennylane-gpu", num_cpus=4, memory="12GB", num_gpus=1, gpu_type="v100" ) -###################################################################### +############################################################################## # On to the algorithm! # # Here’s a function returns a simple quantum kernel based on Pennylane’s `IQP @@ -130,7 +130,7 @@ def circuit(x1, x2): return lambda x1, x2: circuit(x1, x2)[0] # |0..0> state probability -###################################################################### +############################################################################## # Next, each function destined for remote execution is decorated with ``@ct.electron``, with an # `executor `__ # specified therein. Only tasks that evaluate the simulated quantum kernel should require @@ -152,7 +152,7 @@ def get_split_data(n_samples=18, test_size=0.2): return train_test_split(X, y, test_size=test_size, random_state=3) -###################################################################### +############################################################################## # Classifying with the SVM, on the other hand, requires :math:`O(n^2)` kernel evaluations, where # :math:`n` is the dataset size. Accordingly, we’ll use GPUs (i.e. ``gpu_executor``) to speed up this # process. @@ -186,7 +186,7 @@ def classify_with_qsvm(Xtr, Xte, ytr, yte): return accuracy_tr, accuracy_te, disp -###################################################################### +############################################################################## # Putting it all together, we can define a QSVM training and testing workflow. This special function # gets decorated with ``@ct.lattice``. # @@ -198,7 +198,7 @@ def run_qsvm(n_samples, test_size): return classify_with_qsvm(Xtr, Xte, ytr, yte) -###################################################################### +############################################################################## # Now, to dispatch ``run_qsvm`` to Covalent Cloud, we call it after wrapping with ``ct.dispatch``, as # usual. # @@ -206,14 +206,14 @@ def run_qsvm(n_samples, test_size): dispatch_id = cc.dispatch(run_qsvm)(n_samples=64, test_size=0.2) print("Dispatch ID:", dispatch_id) -###################################################################### +############################################################################## # .. rst-class :: sphx-glr-script-out # # .. code-block: none # # Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663 -###################################################################### +############################################################################## # Here’s what we get when we query and display the results. # @@ -226,7 +226,7 @@ def run_qsvm(n_samples, test_size): decision_boundary_figure -###################################################################### +############################################################################## # .. rst-class :: sphx-glr-script-out # # .. code-block: none @@ -241,7 +241,7 @@ def run_qsvm(n_samples, test_size): # :align: center # :width: 90% -###################################################################### +############################################################################## # Conclusion # ========== # @@ -254,12 +254,12 @@ def run_qsvm(n_samples, test_size): # The cost of running this workflow is approximately $0.27. The full code is available below. # -###################################################################### +############################################################################## # Full Code # --------- # -###################################################################### +############################################################################## # .. code:: python # # import covalent as ct From 756b5814a463ff14aec45fa8f14a255e32ec5744 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 21 May 2024 07:14:59 -0400 Subject: [PATCH 12/18] Apply suggestions from code review Co-authored-by: Josh Izaac --- demonstrations/covalent_cloud_gpu.py | 71 +++++++++++++--------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index 14726c6717..da2e80bb55 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -3,11 +3,11 @@ """ ############################################################################## - +# # In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations # on `Covalent Cloud `__ using PennyLane. We will focus on a specific example around # quantum SVM to demonstrate how easy it is to run GPU accelerated quantum circuit simulation on Covalent Cloud. - +# # Quantum support-vector machines (QSVMs) are essentially `traditional # SVMs `__ that rely on `embedding # kernels `__ evaluated on @@ -65,32 +65,32 @@ ############################################################################## # .. rst-class :: sphx-glr-script-out # -# .. code-block: none -# -# Waiting for environment pennylane-gpu to be ready.................. -# Name: pennylane-gpu -# Status: READY -# Estimated Time: 1002 seconds -# Notes: -# pip was added to the dependencies. -# Python version 3.10 was added to the dependencies. -# Environment file contains: -# ========================== -# channels: -# - conda-forge -# dependencies: -# - python=3.10 -# - pip -# - cudatoolkit>=11.8 -# - pip: -# - cuquantum==23.10.0 -# - matplotlib==3.8.2 -# - Pennylane==0.34.0 -# - PennyLane-Lightning[GPU]==0.34.0 -# - scikit-learn==1.3.1 -# - torch==2.1.2 -# - covalent-cloud -# name: pennylane-gpu +# .. code-block: none +# +# Waiting for environment pennylane-gpu to be ready.................. +# Name: pennylane-gpu +# Status: READY +# Estimated Time: 1002 seconds +# Notes: +# pip was added to the dependencies. +# Python version 3.10 was added to the dependencies. +# Environment file contains: +# ========================== +# channels: +# - conda-forge +# dependencies: +# - python=3.10 +# - pip +# - cudatoolkit>=11.8 +# - pip: +# - cuquantum==23.10.0 +# - matplotlib==3.8.2 +# - Pennylane==0.34.0 +# - PennyLane-Lightning[GPU]==0.34.0 +# - scikit-learn==1.3.1 +# - torch==2.1.2 +# - covalent-cloud +# name: pennylane-gpu # ############################################################################## @@ -209,9 +209,9 @@ def run_qsvm(n_samples, test_size): ############################################################################## # .. rst-class :: sphx-glr-script-out # -# .. code-block: none +# .. code-block: none # -# Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663 +# Dispatch ID: 0b5d3a08-fe9c-4dc2-910b-0be6eb925663 ############################################################################## # Here’s what we get when we query and display the results. @@ -229,13 +229,10 @@ def run_qsvm(n_samples, test_size): ############################################################################## # .. rst-class :: sphx-glr-script-out # -# .. code-block: none -# -# Train accuracy: 64.7% -# Test accuracy: 76.9%# .. rst-class :: sphx-glr-script-out -# -# .. code-block: none +# .. code-block: none # +# Train accuracy: 64.7% +# Test accuracy: 76.9% # # .. figure:: ../_static/demonstration_assets/covalent_cloud_gpu/covalent_cloud_gpu_19_1.png # :align: center @@ -251,7 +248,7 @@ def run_qsvm(n_samples, test_size): # datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU # acceleration. # -# The cost of running this workflow is approximately $0.27. The full code is available below. +# The cost of running this workflow is approximately $0.27$. The full code is available below. # ############################################################################## From fe130847ec6f0cfb8eedfdfbc583ab55b50256b2 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 21 May 2024 19:26:13 +0530 Subject: [PATCH 13/18] updated dollar sign rendering --- demonstrations/covalent_cloud_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index da2e80bb55..d1f63c37b1 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -248,7 +248,7 @@ def run_qsvm(n_samples, test_size): # datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU # acceleration. # -# The cost of running this workflow is approximately $0.27$. The full code is available below. +# The cost of running this workflow is approximately \$0.27. The full code is available below. # ############################################################################## From 2f72c10f07c2a8f65e2c3ed1614c589321be7cd3 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Tue, 21 May 2024 11:44:26 -0400 Subject: [PATCH 14/18] Update demonstrations/covalent_cloud_gpu.py Co-authored-by: Josh Izaac --- demonstrations/covalent_cloud_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index d1f63c37b1..f7a1efede1 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -240,7 +240,7 @@ def run_qsvm(n_samples, test_size): ############################################################################## # Conclusion -# ========== +# ---------- # # In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. # We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a From fd904ea1dc1c5154106e8ac3a2ac72ee55e8058c Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Thu, 23 May 2024 17:25:34 +0530 Subject: [PATCH 15/18] Updated date --- demonstrations/covalent_cloud_gpu.metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index dad273e414..04a85d06f7 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -8,8 +8,8 @@ "id": "santosh_kumar_radha" } ], - "dateOfPublication": "2024-03-18T00:00:00+00:00", - "dateOfLastModification": "2024-03-18T00:00:00+00:00", + "dateOfPublication": "2024-05-23T00:00:00+00:00", + "dateOfLastModification": "2024-05-23T00:00:00+00:00", "categories": [ "Quantum Machine Learning" ], From 92d0eaff8a19c4bba525a00aff1db9351650acab Mon Sep 17 00:00:00 2001 From: Josh Izaac Date: Thu, 23 May 2024 18:09:39 -0400 Subject: [PATCH 16/18] Update demonstrations/covalent_cloud_gpu.metadata.json --- demonstrations/covalent_cloud_gpu.metadata.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index 04a85d06f7..2c9dc490d3 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -37,5 +37,11 @@ "weight": 1.0 } ], - "hardware": [] + "hardware": [ + { + "id": "covalent", + "link": "https://docs.covalent.xyz/docs/cloud/tutorials-cloud/pennylane_tutorial/", + "logo": "/_static/hardware_logos/covalent.png" + } + ] } From f8ba616fb92a3ddc007e5a2347b1feddc8a27751 Mon Sep 17 00:00:00 2001 From: Sankalp Sanand Date: Fri, 24 May 2024 13:54:54 -0400 Subject: [PATCH 17/18] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivana Kurečić --- _static/authors/ara_ghukasyan.txt | 2 +- .../covalent_cloud_gpu.metadata.json | 18 ++++++++++++++---- demonstrations/covalent_cloud_gpu.py | 15 +++++++++------ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/_static/authors/ara_ghukasyan.txt b/_static/authors/ara_ghukasyan.txt index f7295c4a64..751deefe4d 100644 --- a/_static/authors/ara_ghukasyan.txt +++ b/_static/authors/ara_ghukasyan.txt @@ -1,6 +1,6 @@ .. bio:: Ara Ghukasyan :photo: ../_static/authors/ara_ghukasyan.jpeg - Ara is a Research Software Engineer at Agnostiq Inc. He has a B.Sc. in Math & Physics and a Ph.D. in Engineering Physics from McMaster University in Hamilton, Ontario. Ara’s interests include Machine Learning, Physics, and Quantum Computing. + Ara is a Research Software Engineer at Agnostiq Inc. He has a B.Sc. in Math & Physics and a Ph.D. in Engineering Physics from McMaster University in Hamilton, Ontario. Ara’s interests include machine learning, physics, and quantum computing. diff --git a/demonstrations/covalent_cloud_gpu.metadata.json b/demonstrations/covalent_cloud_gpu.metadata.json index 2c9dc490d3..53d65d671e 100644 --- a/demonstrations/covalent_cloud_gpu.metadata.json +++ b/demonstrations/covalent_cloud_gpu.metadata.json @@ -2,14 +2,14 @@ "title": "Running GPU-accelerated quantum circuit simulations on Covalent Cloud using PennyLane", "authors": [ { - "id": "ara_ghukasyan" + "id": "santosh_kumar_radha" }, { - "id": "santosh_kumar_radha" + "id": "ara_ghukasyan" } ], - "dateOfPublication": "2024-05-23T00:00:00+00:00", - "dateOfLastModification": "2024-05-23T00:00:00+00:00", + "dateOfPublication": "2024-05-24T00:00:00+00:00", + "dateOfLastModification": "2024-05-24T00:00:00+00:00", "categories": [ "Quantum Machine Learning" ], @@ -31,6 +31,16 @@ "basedOnPapers": [], "referencedByPapers": [], "relatedContent": [ + { + "type": "demonstration", + "id": "tutorial_kernels_module", + "weight": 1.0 + }, + { + "type": "demonstration", + "id": "tutorial_kernel_based_training", + "weight": 1.0 + }, { "type": "demonstration", "id": "tutorial_univariate_qvr", diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index f7a1efede1..c8dcbef82f 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -6,14 +6,14 @@ # # In this tutorial, we’ll demonstrate how to run GPU-accelerated quantum circuit simulations # on `Covalent Cloud `__ using PennyLane. We will focus on a specific example around -# quantum SVM to demonstrate how easy it is to run GPU accelerated quantum circuit simulation on Covalent Cloud. +# quantum support vector machines (QSVMs) to demonstrate how easy it is to run GPU-accelerated quantum circuit simulations on Covalent Cloud. # -# Quantum support-vector machines (QSVMs) are essentially `traditional +# QSVMs are essentially `traditional # SVMs `__ that rely on `embedding # kernels `__ evaluated on # a quantum computer—a.k.a. `quantum embedding # kernel `__. -# These kernels provide a unique (and perhaps classically-intractable) means of measuring pairwise +# These kernels provide a unique (and perhaps classically intractable) means of measuring pairwise # similarity. # # Using GPUs to simulate quantum computers is worthwhile when qubit capacity and/or fidelity @@ -23,6 +23,9 @@ # ############################################################################## +# Implementation +# -------------- +# # Let’s start by importing the required packages. # @@ -40,7 +43,7 @@ # cc.save_api_key("YOUR_API_KEY") ############################################################################## -# Covalent Cloud allows us to create `re-usable execution +# Covalent Cloud allows us to create `reusable execution # environments `__, as shown # below. This environment represents a typical setup for running Pennylane on NVIDIA GPUs. # @@ -243,12 +246,12 @@ def run_qsvm(n_samples, test_size): # ---------- # # In this tutorial, we demonstrated how to run quantum circuit simulations on GPUs via Covalent Cloud. -# We used Pennylane to define a simple quantum kernel, and then trained and tested a QSVM on a +# We used PennyLane to define a simple quantum kernel, and then trained and tested a QSVM on a # 2-dimensional dataset. To make the most of this tutorial, try experimenting with different # datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU # acceleration. # -# The cost of running this workflow is approximately \$0.27. The full code is available below. +# The cost of running this workflow is approximately \$0.27. The full code is available below, and you can try it yourself with the _Run on Covalent Cloud_ button in the side menu on the right. # ############################################################################## From cb7b92d25fd4b249993a14f2e99c8e37da4fd8b9 Mon Sep 17 00:00:00 2001 From: Josh Izaac Date: Mon, 27 May 2024 20:12:40 -0400 Subject: [PATCH 18/18] Update demonstrations/covalent_cloud_gpu.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ivana Kurečić --- demonstrations/covalent_cloud_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations/covalent_cloud_gpu.py b/demonstrations/covalent_cloud_gpu.py index c8dcbef82f..2dbcf02894 100644 --- a/demonstrations/covalent_cloud_gpu.py +++ b/demonstrations/covalent_cloud_gpu.py @@ -251,7 +251,7 @@ def run_qsvm(n_samples, test_size): # datasets/kernels or increasing the dataset dimension, to gain a greater advantage from GPU # acceleration. # -# The cost of running this workflow is approximately \$0.27. The full code is available below, and you can try it yourself with the _Run on Covalent Cloud_ button in the side menu on the right. +# The cost of running this workflow is approximately \$0.27. The full code is available below, and you can try it yourself with the *Run on Covalent Cloud* button in the side menu on the right. # ##############################################################################