diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 95a3157..862688a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -3,8 +3,6 @@ name: Auto Testing
on:
pull_request:
push:
- branches:
- - master
jobs:
@@ -39,22 +37,31 @@ jobs:
tests:
runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- - name: Set up Python 3.11
+ - name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
- python-version: "3.11"
+ python-version: ${{ matrix.python-version }}
- name: Install dependencies
run:
- python -m pip install --upgrade pip
- pip install numpy coverage pytest dataclasses iniconfig packaging pluggy
- pip install ./
+ pip install .[tests]
- name: Run Unit Tests with Coverage
- run:
- coverage run -m unittest discover
- coverage report
+ run: |
+ coverage run -m pytest -vv
+ coverage report -m
+ coverage html
+
+ - name: Upload Coverage HTML report to Artifacts
+ uses: actions/upload-artifact@v2
+ if: always()
+ with:
+ name: coverage-report
+ path: htmlcov/
diff --git a/notebooks/BB84.ipynb b/notebooks/BB84.ipynb
index 3bb8085..cce3ddb 100644
--- a/notebooks/BB84.ipynb
+++ b/notebooks/BB84.ipynb
@@ -1,15 +1,5 @@
{
"cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "colab_type": "text",
- "id": "view-in-github"
- },
- "source": [
- ""
- ]
- },
{
"cell_type": "markdown",
"metadata": {
@@ -22,7 +12,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -34,148 +24,148 @@
"import os\n",
"import dataclasses\n",
"import sys\n",
- "from concurrent.futures import ThreadPoolExecutor\n",
- "from qcrypto.simbasics import Qubit, Agent"
+ "from copy import copy\n",
+ "from qcrypto.simbasics import *\n",
+ "import numba"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[0;31mDocstring:\u001b[0m\n",
+ "getattr(object, name[, default]) -> value\n",
+ "\n",
+ "Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n",
+ "When a default argument is given, it is returned when the attribute doesn't\n",
+ "exist; without it, an exception is raised in that case.\n",
+ "\u001b[0;31mType:\u001b[0m builtin_function_or_method"
+ ]
+ }
+ ],
+ "source": [
+ "getattr?"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
- "def BB84(alice: Agent, bob: Agent, numcheckbits=10, eve=None):\n",
- " \"\"\"\n",
- " Simulation of BB84 protocol using the qcrypto library\n",
- " \"\"\"\n",
- " # Initialization.\n",
- " numqubits = len(alice.qubits)\n",
+ "def BB84(numqubits, numcheckbits, eve=False):\n",
+ " # Alice initializations\n",
+ " Alice = Agent(priv_qbittype=\"unentangled\", num_priv_qubits=numqubits)\n",
+ " Alice_base_choice = np.random.choice([1, 0], size=(numqubits))\n",
+ " Alice_key = []\n",
"\n",
- " # Alice sends qubits to Bob\n",
- " if eve is None:\n",
- " alice.send_quantum(bob, np.random.choice([0, np.pi/4], numqubits))\n",
- " else:\n",
- " alice.send_quantum(eve, np.random.choice([0, np.pi/4], numqubits))\n",
- " eve.send_quantum(bob, np.random.choice([0, np.pi/4], numqubits))\n",
- "\n",
- " # Getting bases for Bob and Alice\n",
- " alice_bases = np.array([qubit.base for qubit in alice.qubits])\n",
- " bob_bases = np.array([qubit.base for qubit in bob.qubits])\n",
- "\n",
- " bases_mask = (alice_bases == bob_bases)\n",
- " alice.qubits = np.array(alice.qubits)[bases_mask]\n",
- " bob.qubits = np.array(bob.qubits)[bases_mask]\n",
- "\n",
- " alice_bases = alice_bases[bases_mask]\n",
- " bob_bases = bob_bases[bases_mask]\n",
+ " for qubit_idx in range(numqubits):\n",
+ " if Alice_base_choice[qubit_idx] == 1: # If 1, apply H gate and measure\n",
+ " Alice.priv_qstates.apply_gate(H_gate, qubit_idx=qubit_idx)\n",
+ " Alice_key.append(Alice.measure(\"private\", qubit_idx=qubit_idx))\n",
+ " Alice.priv_qstates.apply_gate(H_gate, qubit_idx=qubit_idx) # Re-apply gate to return to comp basis\n",
+ " else: # If 0 just measure\n",
+ " Alice_key.append(Alice.measure(\"private\", qubit_idx=qubit_idx)) \n",
+ " Alice_key = np.array(Alice_key)\n",
+ " \n",
+ " Bob = Agent(priv_qstates=copy(Alice.priv_qstates))\n",
+ " Bob_base_choice = np.random.choice([1, 0], size=(numqubits))\n",
+ " Bob_key = []\n",
+ "\n",
+ " for qubit_idx in range(numqubits):\n",
+ " if Bob_base_choice[qubit_idx] == 1:\n",
+ " Bob.priv_qstates.apply_gate(H_gate, qubit_idx=qubit_idx)\n",
+ " Bob_key.append(Bob.measure(\"private\", qubit_idx=qubit_idx))\n",
+ " Bob.priv_qstates.apply_gate(H_gate, qubit_idx=qubit_idx)\n",
+ " else:\n",
+ " Bob_key.append(Bob.measure(\"private\", qubit_idx=qubit_idx))\n",
+ " Bob_key = np.array(Bob_key)\n",
"\n",
- " alice_key = alice.get_key(alice_bases)\n",
- " bob_key = bob.get_key(bob_bases)\n",
+ " Alice_Bob_base_check = Alice_base_choice == Bob_base_choice\n",
+ " Alice_key = Alice_key[Alice_Bob_base_check]\n",
+ " Bob_key = Bob_key[Alice_Bob_base_check]\n",
"\n",
- " alice_check_bits = np.array(alice_key[:numcheckbits])\n",
- " bob_check_bits = np.array(bob_key[:numcheckbits])\n",
+ " Alice_check = Alice_key[:numcheckbits]\n",
+ " Bob_check = Bob_key[:numcheckbits]\n",
"\n",
- " alice_key = alice_key[numcheckbits:]\n",
- " bob_key = bob_key[numcheckbits:]\n",
+ " discovered = not (Alice_check == Bob_check).all()\n",
"\n",
- " comparison = alice_check_bits != bob_check_bits\n",
- " comp_result = comparison.sum()\n",
- " intruder_detected = comp_result != 0\n",
+ " Alice_key = Alice_key[numcheckbits:]\n",
+ " Bob_key = Bob_key[numcheckbits:]\n",
"\n",
- " return intruder_detected, (alice_key, bob_key)"
+ " return discovered, (Alice_key, Bob_key)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "False\n",
+ "[0 1 1 ... 0 1 0]\n",
+ "[0 1 1 ... 0 1 0]\n"
+ ]
+ }
+ ],
"source": [
- "numqubits = 100\n",
- "numcheckbits = 0\n",
- "intruder = True\n",
- "alice = Agent(numqubits=numqubits)\n",
- "bob = Agent(numqubits=0)\n",
- "if intruder:\n",
- " eve = Agent(numqubits=0)\n",
- "else:\n",
- " eve = None\n",
- "\n",
- "detected, keys = BB84(alice, bob, numcheckbits=3, eve=eve)\n",
- "print(\n",
- " \"\"\"\n",
- " Alice's key: \n",
- " {}\n",
- " Bob's key: \n",
- " {}\n",
- " Intruder detected?: {}\n",
- " \"\"\".format(keys[0], keys[1], detected)\n",
- ")"
+ "discovered, (Alice_key, Bob_key) = BB84(100_000, 200, eve=False)\n",
+ "print(discovered)\n",
+ "print(Alice_key)\n",
+ "print(Bob_key)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
- "numqubits = 10\n",
+ "numqubits = 50\n",
"nchecks_lst = np.arange(numqubits//2)\n",
"probs = [] \n",
- "numtrials = 10\n",
+ "numtrials = 1000\n",
"\n",
"def run_trial(nchecks, eve_present=True):\n",
" if eve_present:\n",
- " detected, _ = BB84(Agent(numqubits=numqubits), Agent(numqubits=0), numcheckbits=nchecks, eve=Agent(numqubits=0))\n",
+ " detected, _ = BB84(numqubits, nchecks, eve=True)\n",
" else:\n",
- " detected, _ = BB84(Agent(numqubits=numqubits), Agent(numqubits=0), numcheckbits=nchecks)\n",
+ " detected, _ = BB84(numqubits, nchecks, eve=False)\n",
" return detected\n",
"\n",
- "with ThreadPoolExecutor() as executor:\n",
- " for nchecks in nchecks_lst:\n",
- " futures = [executor.submit(run_trial, nchecks) for _ in range(numtrials)]\n",
- " results = [f.result() for f in futures]\n",
- " prob = sum(results) / numtrials\n",
- " probs.append(prob)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "plt.scatter(nchecks_lst, probs, s=0.01)\n",
- "plt.xlabel(r\"Number of checkbits ($n_{\\mathrm{check}}$)\")\n",
- "plt.ylabel(r\"$P_{\\mathrm{detection}}(n_{\\mathrm{check}}\\ |\\ \\mathrm{Eve})$\")\n",
- "plt.title(r\"Probability of Eve being detected\")\n",
- "plt.errorbar(y=probs, x=nchecks_lst, yerr=[1/np.sqrt(numtrials)]*len(probs), fmt=\".\", capsize=3)\n",
- "plt.grid()\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# As a sanity check, we run the same simulation, but without Eve\n",
- "probs = []\n",
- "\n",
- "with ThreadPoolExecutor() as executor:\n",
- " for nchecks in nchecks_lst:\n",
- " futures = [executor.submit(run_trial, nchecks, eve_present=False) for _ in range(numtrials)]\n",
- " results = [f.result() for f in futures]\n",
- " prob = sum(results) / numtrials\n",
- " probs.append(prob)"
+ "for nchecks in nchecks_lst:\n",
+ " temp = 0\n",
+ " for _ in range(numtrials):\n",
+ " detected = run_trial(nchecks, numqubits)\n",
+ " if detected: temp += 1\n",
+ " prob = temp / numtrials\n",
+ " probs.append(prob) "
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHKCAYAAADrWfQVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRkElEQVR4nO3deVxU9f4/8NcIwwDKvmsKiPuGBKKopSWKWaaVijuau+LGdS0Vt8SsTG+ZfjWXMk1cUm9pKhK4krt4zSVFUDMBNxZF1vn8/ujHuY7DzoFBz+v5ePC4dz5z5n3e85lDvjjbqIQQAkREREQKUs3QDRARERFVNgYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiCqclQqFYKDg2Wrt2HDBqhUKpw+fbrYZTt27IiOHTtKjxMSEqBSqbBhwwZpbO7cuVCpVLL1J4ekpCT06tULdnZ2UKlUWLZsmaFbKpHSfDYlVRU/n+e3KyXJ/4wTEhJKtPzYsWPRuXPnim2qimrTpg2mTZtm6DYUgwGISiT/P2L5P6ampmjQoAGCg4ORlJRk6PYMbtGiRdi1a5fB1j958mTs378fM2fOxMaNG9G1a9dCl332c3z+Z/To0ZXYNZVEZWxbGRkZmDt3LqKjoyt0PcWJj4/Ht99+i48++kgay/8jRKVSYceOHXqvyQ+89+/fl6WH6OjoIn9HtmzZIst6CjJ9+nSsWLECiYmJFbYO+h9jQzdAL5b58+fD3d0dmZmZOHr0KFauXIm9e/fi4sWLMDc3N3R75XbgwIFil5k1axZmzJihM7Zo0SL06tULPXv2rKDOivbbb7+hR48emDJlSomW79y5MwYPHqw33qBBA7lbq3QFfT4vssrYtjIyMjBv3jwAMOiequXLl8Pd3R1vvPFGgc/Pnz8f77//fqXs4ZswYQJatWqlN+7n51dh6+zRowcsLS3xzTffYP78+RW2HvoHAxCVyltvvQUfHx8AwPDhw2FnZ4elS5di9+7d6NevX4GvefLkCapXr16ZbZaZiYlJscsYGxvD2Lhq/eokJyfD2tq6xMs3aNAAAwcOrLiGDKgqfj5UvJycHGzatKnQvZAtW7bE+fPnsXPnTrz//vsV3s9rr72GXr16Vfh6nlWtWjX06tUL33//PebNm1flDuW+bHgIjMrlzTffBPDPrmsAGDJkCGrUqIG4uDh069YNFhYWGDBgAIB/gtC//vUv1K5dGxqNBg0bNsTnn38OIUSBtTdt2oSGDRvC1NQU3t7eOHz4sM7zN2/exNixY9GwYUOYmZnBzs4OvXv3LvRcg4yMDIwaNQp2dnawtLTE4MGD8ejRI51lSnKuxvPnmKhUKjx58gTfffedtJt8yJAhiIqKgkqlws6dO/VqbN68GSqVCjExMUWu68aNG+jduzdsbW1hbm6ONm3aYM+ePdLz+YcmhRBYsWKFtP7yCg4ORo0aNZCRkaH3XL9+/eDs7Iy8vDxp7Ndff8Vrr72G6tWrw8LCAm+//Tb++OOPEq+vJJ9NSddT0DlA+eeV7dq1C82aNYNGo0HTpk2xb98+vXVER0fDx8cHpqam8PDwwP/93/+V6ryi1atXw8PDA2ZmZvD19cWRI0cKXC4rKwuhoaGoV68eNBoNateujWnTpiErK0un74K2rXx37tzBhx9+CCcnJ+k9rVu3Tm9dmZmZmDt3Lho0aABTU1O4uLjg/fffR1xcHBISEuDg4AAA0j+6KpUKc+fOlV5/5coV9OrVC7a2tjA1NYWPjw/+85//6K3njz/+wJtvvgkzMzO88sorWLhwIbRabYnm7ejRo7h//z78/f0LfL5v375o0KAB5s+fX+h/M561bds2eHt7w8zMDPb29hg4cCDu3LlTol5KolmzZgXuqdJqtahVq5ZOeNJqtVi2bBmaNm0KU1NTODk5YdSoUQVu4507d8bNmzdx/vx52XqlgvHPJCqXuLg4AICdnZ00lpubi4CAALRv3x6ff/45zM3NIYTAu+++i6ioKAwbNgwtW7bE/v37MXXqVNy5cwdffvmlTt1Dhw4hPDwcEyZMgEajwTfffIOuXbvi5MmTaNasGQDg1KlTOH78OPr27YtXXnkFCQkJWLlyJTp27IhLly7pHZILDg6GtbU15s6di6tXr2LlypW4efOmdMy/rDZu3Ijhw4fD19cXI0eOBAB4eHigTZs2qF27NjZt2oT33ntP5zWbNm2Ch4dHkbvTk5KS0LZtW2RkZGDChAmws7PDd999h3fffRfbt2/He++9h9dffx0bN27EoEGDCj2sVZDMzMwCz5mwtLSEiYkJAgMDsWLFCuzZswe9e/eWns/IyMDPP/+MIUOGwMjISHr/QUFBCAgIwKeffoqMjAysXLkS7du3x7lz5+Dm5lZsPyX5bMq7nqNHj+Knn37C2LFjYWFhgX//+9/44IMPcOvWLWn7PXfuHLp27QoXFxfMmzcPeXl5mD9/vhQQirN27VqMGjUKbdu2xaRJk3Djxg28++67sLW1Re3ataXltFot3n33XRw9ehQjR45E48aN8d///hdffvkl/vzzT+mcn8K2LeCf7aNNmzZSuHNwcMCvv/6KYcOGIS0tDZMmTQIA5OXl4Z133kFkZCT69u2LiRMnIj09HREREbh48SL8/f2xcuVKjBkzBu+99560d6VFixYA/gk17dq1Q61atTBjxgxUr14dW7duRc+ePbFjxw5p205MTMQbb7yB3NxcabnVq1fDzMysRHN3/PhxqFQqeHl5Ffi8kZERZs2ahcGDBxe7F2jDhg0YOnQoWrVqhbCwMCQlJWH58uU4duwYzp07V6K9penp6QX+juRfaBAYGIi5c+ciMTERzs7O0vNHjx7F33//jb59+0pjo0aNknqaMGEC4uPj8fXXX+PcuXM4duwY1Gq1tKy3tzcA4NixY4XOBclEEJXA+vXrBQBx8OBBce/ePXH79m2xZcsWYWdnJ8zMzMRff/0lhBAiKChIABAzZszQef2uXbsEALFw4UKd8V69egmVSiWuX78ujQEQAMTp06elsZs3bwpTU1Px3nvvSWMZGRl6fcbExAgA4vvvv9fr3dvbW2RnZ0vjS5YsEQDE7t27pbEOHTqIDh06SI/j4+MFALF+/XppLDQ0VDz/q1O9enURFBSk18/MmTOFRqMRKSkp0lhycrIwNjYWoaGhess/a9KkSQKAOHLkiDSWnp4u3N3dhZubm8jLy5PGAYhx48YVWe/ZZQv7+fHHH4UQQmi1WlGrVi3xwQcf6Lx269atAoA4fPiw1I+1tbUYMWKEznKJiYnCyspKb/x5Jf1sSrOegj4fAMLExERnO4uNjRUAxFdffSWNde/eXZibm4s7d+5IY9euXRPGxsZ6NZ+XnZ0tHB0dRcuWLUVWVpY0vnr1agFAZ7vauHGjqFatms5nK4QQq1atEgDEsWPHpLHCtq1hw4YJFxcXcf/+fZ3xvn37CisrK+n3Y926dQKAWLp0qV4NrVYrhBDi3r17AkCB22SnTp1E8+bNRWZmps7r2rZtK+rXry+N5W+vJ06ckMaSk5OFlZWVACDi4+P1aj9r4MCBws7OTm88/3fws88+E7m5uaJ+/frC09NT6j3/8753754Q4n+fQ7NmzcTTp0+lOr/88osAIObMmVNkH1FRUUX+jty9e1cIIcTVq1f1th8hhBg7dqyoUaOGNP9HjhwRAMSmTZt0ltu3b1+B40IIYWJiIsaMGVNkn1R+PARGpeLv7w8HBwfUrl0bffv2RY0aNbBz507UqlVLZ7kxY8boPN67dy+MjIwwYcIEnfF//etfEELg119/1Rn38/OT/hICgDp16qBHjx7Yv3+/dOjl2b8sc3Jy8ODBA9SrVw/W1tY4e/asXu8jR47U+UtrzJgxMDY2xt69e0s5CyU3ePBgZGVlYfv27dJYeHg4cnNziz0HZ+/evfD19UX79u2lsRo1amDkyJFISEjApUuXytxXjx49EBERofeTv0tfpVKhd+/e2Lt3Lx4/fqzTe61ataSeIiIikJKSgn79+uH+/fvSj5GREVq3bo2oqKgS9VPcZyPHevz9/aW9J8A/ezgsLS1x48YNAP/sKTl48CB69uyJmjVrSsvVq1cPb731VrH1T58+jeTkZIwePVrnXLIhQ4bAyspKZ9lt27ahcePGaNSokc77yT+kXNz7EUJgx44d6N69O4QQOjUCAgKQmpoq/Q7s2LED9vb2GD9+vF6d4vZ8Pnz4EL/99hv69Okj7RG5f/8+Hjx4gICAAFy7dk06rLR37160adMGvr6+0usdHBykQ+DFefDgAWxsbIpcJn8vUGxsbKFXxuV/DmPHjoWpqak0/vbbb6NRo0Y6h5CLMmfOnAJ/R2xtbQH8cx5dy5YtER4eLr0mLy8P27dvR/fu3aX/Pm3btg1WVlbo3Lmzzufk7e2NGjVqFPhZ29jYyHZVGxWOh8CoVFasWIEGDRrA2NgYTk5OaNiwIapV083RxsbGeOWVV3TGbt68iZo1a8LCwkJnvHHjxtLzz6pfv77euhs0aICMjAzcu3cPzs7OePr0KcLCwrB+/XrcuXNH57yA1NRUvdc/X7NGjRpwcXEp8f1JyqJRo0Zo1aoVNm3ahGHDhgH45/BXmzZtUK9evSJfe/PmTbRu3Vpv/Nk5yz8cWFqvvPJKoeda5AsMDMSyZcvwn//8B/3798fjx4+xd+9ejBo1SvqH89q1awD+dy7Y8ywtLUvUT3GfjRzrqVOnjt6YjY2NdB5GcnIynj59WuDnUtxnBfxvG37+vajVatStW1dn7Nq1a7h8+XKhh9aSk5OLXNe9e/eQkpKC1atXY/Xq1UXWiIuLQ8OGDct0Yvj169chhMDs2bMxe/bsQtdTq1atQrfXhg0blnh9ogTn9gwYMAALFizA/PnzC7wyLv9zKGi9jRo1wtGjR0vUS/PmzUv0O/LRRx/hzp07qFWrFqKjo5GcnIzAwEBpmWvXriE1NRWOjo4F1ijosxZC8AToSsAARKXi6+srXQVWGI1GoxeKKsL48eOxfv16TJo0CX5+frCysoJKpULfvn1LfOJlZRg8eDAmTpyIv/76C1lZWfj999/x9ddfG7qtYrVp0wZubm7YunUr+vfvj59//hlPnz7V+Y97/jxv3LhR5zyIfHJdjSXHevLPWXpeSf7RlZtWq0Xz5s2xdOnSAp9/9nyhwl4PAAMHDkRQUFCBy+Sfw1Me+euZMmUKAgICClymJOGwJOzs7Ao8Kfh5+XuBhgwZgt27d8uy7rIKDAzEzJkzsW3bNkyaNAlbt26FlZWVzn24tFotHB0dsWnTpgJrFBSCU1JSYG9vX2F90z8YgKhSuLq64uDBg0hPT9fZC3TlyhXp+Wfl/8X/rD///BPm5ubSfzC2b9+OoKAgfPHFF9IymZmZSElJKbCHa9eu6Vy18fjxY9y9exfdunUr8/vKV9Rfa3379kVISAh+/PFHPH36FGq1WidEFMbV1RVXr17VGy9szipCnz59sHz5cqSlpSE8PBxubm5o06aN9Hz+ISVHR8di/1ouSnGfjVzrKYqjoyNMTU1x/fp1vecKGnte/udx7do1nT1VOTk5iI+Ph6enpzTm4eGB2NhYdOrUqdi/9At63sHBARYWFsjLyyt2Pjw8PHDixAnk5OToHGYsbh0ApD1XarW62PW4uroW+Htb0DZckEaNGmHTpk1ITU3VO2T4vIEDB2LhwoWYN28e3n33Xb0+8tf7/B7Dq1evyvp74+7uDl9fX4SHhyM4OBg//fQTevbsCY1GIy3j4eGBgwcPol27diU6IfzOnTvIzs6W9vRSxeE5QFQpunXrhry8PL09H19++SVUKpXeORYxMTE65/Hcvn0bu3fvRpcuXaS/5I2MjPT+ev/qq690Ls9+1urVq5GTkyM9XrlyJXJzc0t0fkdxqlevXmjwsre3x1tvvYUffvgBmzZtQteuXUv01123bt1w8uRJnUvlnzx5gtWrV8PNzQ1NmjQpd9/FCQwMRFZWFr777jvs27cPffr00Xk+ICAAlpaWWLRokc7c5rt3716J1lPcZyPXeopiZGQEf39/7Nq1C3///bc0fv36db1z1Ari4+MDBwcHrFq1CtnZ2dL4hg0b9LaNPn364M6dO1izZo1enadPn+LJkyfS44K2LSMjI3zwwQfYsWMHLl68qFfj2fn44IMPcP/+/QL3Oub//uRfMfn8ehwdHdGxY0f83//9H+7evVvkerp164bff/8dJ0+e1Hm+sD0fz/Pz84MQAmfOnCl22fy9QOfPn9e7HN/HxweOjo5YtWqVzi0Ffv31V1y+fBlvv/12ifopqcDAQPz+++9Yt24d7t+/r/fHTZ8+fZCXl4cFCxbovTY3N1dvzvPff9u2bWXtk/RxDxBViu7du+ONN97Axx9/jISEBHh6euLAgQPYvXs3Jk2apHNyKvDPPTYCAgJ0LoMHIN2tFgDeeecdbNy4EVZWVmjSpAliYmJw8OBBnUvyn5WdnY1OnTqhT58+uHr1Kr755hu0b99e7y/IsvD29sbBgwexdOlS1KxZE+7u7jrnQwwePFi6L0hB/yEsyIwZM/Djjz/irbfewoQJE2Bra4vvvvsO8fHx2LFjR7kOM/7555/44Ycf9MadnJx0vofp1VdfRb169fDxxx8jKytL7z/ulpaWWLlyJQYNGoRXX30Vffv2hYODA27duoU9e/agXbt2JTrcV9xnI9d6ijN37lwcOHAA7dq1w5gxY6TQ3qxZs2Lvy6JWq7Fw4UKMGjUKb775JgIDAxEfH4/169frnQM0aNAgbN26FaNHj0ZUVBTatWuHvLw8XLlyBVu3bsX+/fulQ82FbVuLFy9GVFQUWrdujREjRqBJkyZ4+PAhzp49i4MHD+Lhw4cA/tn2vv/+e4SEhODkyZN47bXX8OTJExw8eBBjx45Fjx49YGZmhiZNmiA8PBwNGjSAra0tmjVrhmbNmmHFihVo3749mjdvjhEjRqBu3bpISkpCTEwM/vrrL8TGxgIApk2bJn0Ny8SJE6XL4F1dXXHhwoVi5759+/aws7PDwYMHCz3X61n55wI9/7mo1Wp8+umnGDp0KDp06IB+/fpJl8G7ublh8uTJxdYGgCNHjiAzM1NvvEWLFjqHF/v06YMpU6ZgypQpsLW11dtT1qFDB4waNQphYWE4f/48unTpArVajWvXrmHbtm1Yvny5zj2DIiIiUKdOHV4CXxkMdPUZvWDyL1c+depUkcsFBQWJ6tWrF/hcenq6mDx5sqhZs6ZQq9Wifv364rPPPpMuZ82H/39J9w8//CDq168vNBqN8PLyElFRUTrLPXr0SAwdOlTY29uLGjVqiICAAHHlyhXh6uqqc9lwfu+HDh0SI0eOFDY2NqJGjRpiwIAB4sGDBzo1y3oZ/JUrV8Trr78uzMzMBAC9y5azsrKEjY2NsLKy0rk0tzhxcXGiV69ewtraWpiamgpfX1/xyy+/6C2XP2clgSIu8X32vef7+OOPBQBRr169QmtGRUWJgIAAYWVlJUxNTYWHh4cYMmSIzq0MClKaz6ak6ynsMviC5uf5bUUIISIjI4WXl5cwMTERHh4e4ttvvxX/+te/hKmpaZHvJd8333wj3N3dhUajET4+PuLw4cN625UQ/1yu/emnn4qmTZsKjUYjbGxshLe3t5g3b55ITU2Vlitq20pKShLjxo0TtWvXFmq1Wjg7O4tOnTqJ1atX66wrIyNDfPzxx8Ld3V1arlevXiIuLk5a5vjx48Lb21uYmJjoXRIfFxcnBg8eLJydnYVarRa1atUS77zzjti+fbvOei5cuCA6dOggTE1NRa1atcSCBQvE2rVrS3QZvBBCTJgwQW87e/Yy+Oflbz945jL4fOHh4cLLy0toNBpha2srBgwYIN2uoyjFXQZf0K0C2rVrJwCI4cOHF1p39erVwtvbW5iZmQkLCwvRvHlzMW3aNPH3339Ly+Tl5QkXFxcxa9asYvuk8lMJYYAzAIkUJjc3FzVr1kT37t2xdu1aQ7dDpdSzZ0/88ccfBZ7jQvK5ceMGGjVqhF9//RWdOnUydDuVbteuXejfvz/i4uLg4uJi6HZeejwHiKgS7Nq1C/fu3SvxnZrJcJ4+farz+Nq1a9i7d69BvyRUKerWrYthw4Zh8eLFhm7FID799FMEBwcz/FQS7gEiqkAnTpzAhQsXsGDBAtjb2xd4g0aqWlxcXDBkyBDUrVsXN2/exMqVK5GVlYVz584VeH8qInox8SRoogq0cuVK/PDDD2jZsiU2bNhg6HaoBLp27Yoff/wRiYmJ0Gg08PPzw6JFixh+iF4yVWoP0OHDh/HZZ5/hzJkzuHv3Lnbu3FngnT6fFR0djZCQEPzxxx+oXbu2dIMsIiIiosJUqXOAnjx5Ak9PT6xYsaJEy8fHx+Ptt9/GG2+8gfPnz2PSpEkYPnw49u/fX8GdEhER0YusSu0BepZKpSp2D9D06dOxZ88enRuB9e3bFykpKdi3b18ldElEREQvohf6HKCYmBi9m04FBARg0qRJhb4mKytL5+6gWq0WDx8+hJ2dHb98joiI6AUhhEB6ejpq1qxZphvDvtABKDExEU5OTjpjTk5OSEtLw9OnTwv83pWwsDCduwkTERHRi+v27dt45ZVXSv26FzoAlcXMmTMREhIiPU5NTUWdOnUQHx+v8yWdcsjJyUFUVBTeeOONQr+EkOTHeTcMzrthcN4Ng/NuGM/Oe2ZmJtzd3cv8b/cLHYCcnZ2RlJSkM5aUlARLS8tCv3VXo9HofFNvPltbW1haWsraX05ODszNzWFnZ8dfkErEeTcMzrthcN4Ng/NuGM/Oe/5NS8t6+kqVugqstPz8/BAZGakzFhERAT8/PwN1RERERC+CKhWAHj9+jPPnz0vf7hsfH4/z58/j1q1bAP45fPXsVwmMHj0aN27cwLRp03DlyhV888032Lp1a4m/7ZeIiIiUqUoFoNOnT8PLywteXl4AgJCQEHh5eWHOnDkAgLt370phCADc3d2xZ88eREREwNPTE1988QW+/fZbBAQEGKR/IiIiejFUqXOAOnbsiKJuS1TQVwl07NgR586dq8CuiIiI6GVTpfYAEREREVUGBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUhwGICIiIlIcBiAiIiJSHAYgIiIiUpwqF4BWrFgBNzc3mJqaonXr1jh58mSRyy9btgwNGzaEmZkZateujcmTJyMzM7OSuiUiIqIXUZUKQOHh4QgJCUFoaCjOnj0LT09PBAQEIDk5ucDlN2/ejBkzZiA0NBSXL1/G2rVrER4ejo8++qiSOyciIqIXSZUKQEuXLsWIESMwdOhQNGnSBKtWrYK5uTnWrVtX4PLHjx9Hu3bt0L9/f7i5uaFLly7o169fsXuNiIiISNmMDd1AvuzsbJw5cwYzZ86UxqpVqwZ/f3/ExMQU+Jq2bdvihx9+wMmTJ+Hr64sbN25g7969GDRoUKHrycrKQlZWlvQ4LS0NAJCTk4OcnByZ3g2kms/+L1UOzrthcN4Ng/NuGJx3w3h23ss791UmAN2/fx95eXlwcnLSGXdycsKVK1cKfE3//v1x//59tG/fHkII5ObmYvTo0UUeAgsLC8O8efP0xg8cOABzc/PyvYlCREREVEhdKhrn3TA474bBeTcMzrthREREICMjo1w1qkwAKovo6GgsWrQI33zzDVq3bo3r169j4sSJWLBgAWbPnl3ga2bOnImQkBDpcVpaGmrXro0uXbrA0tJS1v5ycnIQERGBzp07Q61Wy1qbCsd5NwzOu2Fw3g2D824Yz87706dPy1WrygQge3t7GBkZISkpSWc8KSkJzs7OBb5m9uzZGDRoEIYPHw4AaN68OZ48eYKRI0fi448/RrVq+qc4aTQaaDQavXG1Wl1hG3FF1qbCcd4Ng/NuGJx3w+C8G4ZarUZubm65alSZk6BNTEzg7e2NyMhIaUyr1SIyMhJ+fn4FviYjI0Mv5BgZGQEAhBAV1ywRERG90KrMHiAACAkJQVBQEHx8fODr64tly5bhyZMnGDp0KABg8ODBqFWrFsLCwgAA3bt3x9KlS+Hl5SUdAps9eza6d+8uBSEiIiKi51WpABQYGIh79+5hzpw5SExMRMuWLbFv3z7pxOhbt27p7PGZNWsWVCoVZs2ahTt37sDBwQHdu3fHJ598Yqi3QERERC+AKhWAACA4OBjBwcEFPhcdHa3z2NjYGKGhoQgNDa2EzoiIiOhlUWXOASIiIiKqLAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4xuV5cU5ODhITE5GRkQEHBwfY2trK1RcRERFRhSn1HqD09HSsXLkSHTp0gKWlJdzc3NC4cWM4ODjA1dUVI0aMwKlTpyqiVyIiIiJZlCoALV26FG5ubli/fj38/f2xa9cunD9/Hn/++SdiYmIQGhqK3NxcdOnSBV27dsW1a9cqqm8iIiKiMivVIbBTp07h8OHDaNq0aYHP+/r64sMPP8SqVauwfv16HDlyBPXr15elUSIiIiK5lCoA/fjjjyVaTqPRYPTo0WVqiIiIiKiilesqsCNHjmDgwIHw8/PDnTt3AAAbN27E0aNHZWmOiIiIqCKUOQDt2LEDAQEBMDMzw7lz55CVlQUASE1NxaJFi2RrkIiIiEhuZQ5ACxcuxKpVq7BmzRqo1WppvF27djh79qwszRERERFVhDIHoKtXr+L111/XG7eyskJKSkp5eiIiIiKqUGUOQM7Ozrh+/bre+NGjR1G3bt1yNUVERERUkcocgEaMGIGJEyfixIkTUKlU+Pvvv7Fp0yZMmTIFY8aMkbNHIiIiIlmV+aswZsyYAa1Wi06dOiEjIwOvv/46NBoNpkyZgvHjx8vZIxEREZGsyhyAVCoVPv74Y0ydOhXXr1/H48eP0aRJE9SoUUPO/oiIiIhkV+ZDYMOHD0d0dDRMTEzQpEkT+Pr6MvwQERHRC6HMAejevXvo2rUrateujalTpyI2NlbOvoiIiIgqTJkD0O7du3H37l3Mnj0bp06dwquvvoqmTZti0aJFSEhIkLFFIiIiInmV66swbGxsMHLkSERHR+PmzZsYMmQINm7ciHr16snVHxEREZHsyhWA8uXk5OD06dM4ceIEEhIS4OTkJEdZIiIiogpRrgAUFRWFESNGwMnJCUOGDIGlpSV++eUX/PXXX3L1R0RERCS7Ml8GX6tWLTx8+BBdu3bF6tWr0b17d2g0Gjl7IyIiIqoQZQ5Ac+fORe/evWFtbS1jO0REREQVr8wBaMSIEXL2QURERFRpSn0OULdu3ZCamio9Xrx4sc63vz948ABNmjSRpTkiIiKiilDqALR//35kZWVJjxctWoSHDx9Kj3Nzc3H16lV5uiMiIiKqAKUOQEKIIh8TERERVXWy3AeIiIiI6EVS6gCkUqmgUqn0xoiIiIheFKW+CkwIgSFDhkj3/MnMzMTo0aNRvXp1ANA5P4iIiIioKip1AAoKCtJ5PHDgQL1lBg8eXPaOiIiIiCpYqQPQ+vXrK6IPIiIiokrDk6CJiIhIcRiAiIiISHEYgIiIiEhxGICIiIhIccr8ZagAkJKSgrVr1+Ly5csAgKZNm+LDDz+ElZWVLM0RERERVYQy7wE6ffo0PDw88OWXX+Lhw4d4+PAhli5dCg8PD5w9e1bOHomIiIhkVeY9QJMnT8a7776LNWvWwNj4nzK5ubkYPnw4Jk2ahMOHD8vWJBEREZGcyhyATp8+rRN+AMDY2BjTpk2Dj4+PLM0RERERVYQyHwKztLTErVu39MZv374NCwuLcjVFREREVJHKHIACAwMxbNgwhIeH4/bt27h9+za2bNmC4cOHo1+/fmVuaMWKFXBzc4OpqSlat26NkydPFrl8SkoKxo0bBxcXF2g0GjRo0AB79+4t8/qJiIjo5VfmQ2Cff/45VCoVBg8ejNzcXACAWq3GmDFjsHjx4jLVDA8PR0hICFatWoXWrVtj2bJlCAgIwNWrV+Ho6Ki3fHZ2Njp37gxHR0ds374dtWrVws2bN2FtbV3Wt0VEREQKUOYAZGJiguXLlyMsLAxxcXEAAA8PD5ibm5e5maVLl2LEiBEYOnQoAGDVqlXYs2cP1q1bhxkzZugtv27dOjx8+BDHjx+HWq0GALi5uZV5/URERKQM5boPEACYm5ujefPm5W4kOzsbZ86cwcyZM6WxatWqwd/fHzExMQW+5j//+Q/8/Pwwbtw47N69Gw4ODujfvz+mT58OIyOjAl+TlZWFrKws6XFaWhoAICcnBzk5OeV+H8/Kryd3XSoa590wOO+GwXk3DM67YTw77+Wd+3IFoMjISERGRiI5ORlarVbnuXXr1pWq1v3795GXlwcnJyedcScnJ1y5cqXA19y4cQO//fYbBgwYgL179+L69esYO3YscnJyEBoaWuBrwsLCMG/ePL3xAwcOlGvvVVEiIiIqpC4VjfNuGJx3w+C8Gwbn3TAiIiKQkZFRrhplDkDz5s3D/Pnz4ePjAxcXF6hUqnI1UhZarRaOjo5YvXo1jIyM4O3tjTt37uCzzz4rNADNnDkTISEh0uO0tDTUrl0bXbp0gaWlpaz95eTkICIiAp07d5YO0VHF47wbBufdMDjvhsF5N4xn5/3p06flqlXmALRq1Sps2LABgwYNKlcD+ezt7WFkZISkpCSd8aSkJDg7Oxf4GhcXF6jVap3DXY0bN0ZiYiKys7NhYmKi9xqNRgONRqM3rlarK2wjrsjaVDjOu2Fw3g2D824YnHfDUKvV0gVYZVXmy+Czs7PRtm3bcq38WSYmJvD29kZkZKQ0ptVqERkZCT8/vwJf065dO1y/fl3n8Nuff/4JFxeXAsMPEREREVCOADR8+HBs3rxZzl4QEhKCNWvW4LvvvsPly5cxZswYPHnyRLoqbPDgwTonSY8ZMwYPHz7ExIkT8eeff2LPnj1YtGgRxo0bJ2tfRERE9HIp8yGwzMxMrF69GgcPHkSLFi30dgEuXbq01DUDAwNx7949zJkzB4mJiWjZsiX27dsnnRh969YtVKv2v8xWu3Zt7N+/H5MnT0aLFi1Qq1YtTJw4EdOnTy/r2yIiIiIFKHMAunDhAlq2bAkAuHjxos5z5TkhOjg4GMHBwQU+Fx0drTfm5+eH33//vczrIyIiIuUpcwCKioqSsw8iIiKiSlPmc4CIiIiIXlQMQERERKQ4DEBERESkOAxAREREpDgMQERERKQ4DEBERESkOKW6DN7d3b1M9/iZNGkSJkyYUOrXEREREVWEUgWgDRs2lGklbm5uZXodERERUUUoVQDq0KFDRfVBREREVGl4DhAREREpDgMQERERKQ4DEBERESkOAxAREREpDgMQERERKY5sASg+Pl5vLCYmRq7yRERERLKRLQD16dMHCQkJ0uP9+/dj7NixcpUnIiIiko1sAWj9+vXo3bs3EhISEB4ejjlz5mD//v1ylSciIiKSTaluhFiUZs2aYd26dXjnnXfg4OCAgwcPwsLCQq7yRERERLIpdwBq1aqVzveDPXr0CADQqVMnAMDJkyfLuwoiIiIiWZU7AG3fvl2OPoiIiIgqTbnPAXJ1dYWrqytWrFgBKysr6bGlpSVWrlwpR49EREREspLtJOiIiAhYW1tLj21sbHDgwAG5yhMRERHJRrYApNVqkZ6eLj1OS0tDTk6OXOWJiIiIZCPbVWATJ05E+/btERgYCAAIDw/H5MmT5SpPREREJBvZAtCHH34IX19fREVFAQA2b96Mpk2bylWeiIiISDayfhfY7du3AQDjx4+HnZ0dLl++LGd5IiIiIlnIFoCmTJmCLVu2YMWKFQAAIyMjDBkyRK7yRERERLKR7RBYZGQkzp07By8vLwCAg4MDMjMz5SpPREREJBvZ9gCp1WpotVrprtAPHz5EtWqyHmEjIiIikoVsCWXChAkIDAzE/fv3sWDBArz++uuYNm2aXOWJiIiIZCPbIbCBAwfCx8cHkZGR0Gq12Lp1K5o0aSJXeSIiIiLZyHqM6sGDB7C2toaVlRVOnz6N77//Xs7yRERERLKQbQ9Qv379kJiYCC8vLxgZGQGAzrfEExEREVUVsgWg2NhYXLp0Sa5yRERERBVGtkNgvr6+uHr1qlzliIiIiCpMufcAtWrVCiqVCtnZ2WjRogUaNWoEjUYDIQRUKhVOnjwpR59EREREsil3ANq+fbscfRARERFVmnIHIFdXVzn6ICIiIqo0sp0DNG3aNKSkpEiPHz16hBkzZshVnoiIiEg2sgWgiIgIWFtbS49tbGxw4MABucoTERERyUa2AKTVapGeni49TktLQ05OjlzliYiIiGQj232AJk6ciPbt2yMwMBAAEB4ejsmTJ8tVnoiIiEg2sgWgDz/8EL6+voiKigIAbN68GU2bNpWrPBEREZFsyhyATp06hRkzZuDevXuoV68eWrZsiZYtW6JHjx6oU6eOnD0SERERyarM5wANGjQIRkZGGDlyJNzd3XHo0CEMHToUbm5usLOzk7NHIiIiIlmVeQ/Q7du3sWfPHnh4eOiM37x5E+fPny9vX0REREQVpswByM/PD3fu3NELQK6urrw5IhEREVVpZT4ENnnyZMyfPx8PHz6Usx8iIiKiClfmPUDdu3eHSqVCgwYN0KNHD/j5+cHLywvNmzeHiYmJnD0SERERyarMAej69euIjY2VfhYtWoSEhASo1Wo0bNgQFy5ckLNPIiIiItmUOQDVrVsXdevWxXvvvSeNpaWlITY2luGHiIiIqjTZboQIAJaWlnjttdfw2muvyVmWiIiISFalOgn61q1bpSp+586dUi1PREREVBlKFYBatWqFUaNG4dSpU4Uuk5qaijVr1qBZs2bYsWNHuRskIiIiklupDoFdunQJn3zyCTp37gxTU1N4e3ujZs2aMDU1xaNHj3Dp0iX88ccfePXVV7FkyRJ069atovomIiIiKrNS7QGys7PD0qVLcffuXXz99deoX78+7t+/j2vXrgEABgwYgDNnziAmJobhh4iIiKqsMp0EbWZmhl69eqFXr15y90NERERU4WS9CuzYsWNISEhAXl6eNDZ48GA5V0FERERUbrIFoH79+iExMRFeXl4wMjICAKhUKrnKExEREclGtgAUGxuLS5cuyVWOiIiIqMKU+ctQn+fr64urV6/KVY6IiIiowsi2B+j8+fPw9PREw4YNodFoIISASqXCyZMn5VoFERERkSxkC0C7d++WqxRWrFiBzz77DImJifD09MRXX30FX1/fYl+3ZcsW9OvXDz169MCuXbtk64eIiIheLrIdAnN1dYVGo8GFCxdw4cIFmJqawtXVtdR1wsPDERISgtDQUJw9exaenp4ICAhAcnJyka9LSEjAlClT+D1kREREVCzZ9gBt3rwZc+bMgb+/P4QQ+Ne//oX58+ejb9++paqzdOlSjBgxAkOHDgUArFq1Cnv27MG6deswY8aMAl+Tl5eHAQMGYN68eThy5AhSUlIKrZ+VlYWsrCzpcVpaGgAgJycHOTk5peq1OPn15K5LReO8Gwbn3TA474bBeTeMZ+e9vHOvEkIIOZry9PREdHQ0bGxsAACPHj1Cx44dERsbW+Ia2dnZMDc3x/bt29GzZ09pPCgoCCkpKYUeZgsNDcWFCxewc+dODBkyBCkpKYUeAps7dy7mzZunN75582aYm5uXuFciIiIynIyMDPTv3x+pqamwtLQs9etl2wOk1WpRo0YN6XGNGjWg1WpLVeP+/fvIy8uDk5OTzriTkxOuXLlS4GuOHj2KtWvX4vz58yVax8yZMxESEiI9TktLQ+3atdGlS5cyTWBRcnJyEBERgc6dO0OtVstamwrHeTcMzrthcN4Ng/NuGM/O+9OnT8tVS7YANHDgQLRt2xYffPABAOCnn36q8LtAp6enY9CgQVizZg3s7e1L9BqNRgONRqM3rlarK2wjrsjaVDjOu2Fw3g2D824YnHfDUKvVyM3NLVcN2QLQ9OnT8eabb+L48eMAgJUrV8Lb27tUNezt7WFkZISkpCSd8aSkJDg7O+stHxcXh4SEBHTv3l0ay9/rZGxsjKtXr8LDw6O0b4WIiIhecrJ+F1irVq3QqlWrMr/exMQE3t7eiIyMlM4B0mq1iIyMRHBwsN7yjRo1wn//+1+dsVmzZiE9PR3Lly9H7dq1y9wLERERvbzKHYAGDRqEjRs3olWrVjrf/VXWGyGGhIQgKCgIPj4+8PX1xbJly/DkyRPpqrDBgwejVq1aCAsLg6mpKZo1a6bzemtrawDQGyciIiLKV+4AtGTJEgDA9u3by90MAAQGBuLevXuYM2cOEhMT0bJlS+zbt086MfrWrVuoVk222xcRERGRApU7ALm4uAAANm7ciFmzZuk8t3DhQr2xkggODi7wkBcAREdHF/naDRs2lHp9REREpCyy7Ur56aef9Ma2bdsmV3kiIiIi2ZR7D9CaNWuwevVqXL16Vef7utLT0+Hl5VXe8kRERESyK3cA6tOnDzp37oxZs2bhk08+kcYtLCxga2tb3vJEREREsiv3ITArKyu4ubmhZs2asLKygqurK1xdXaFSqQr97i4iIiIiQ5LtHKCIiAjpEnQAsLGxwYEDB+QqT0RERCQb2QKQVqtFenq69DgtLY3fkktERERVkmx3gp44cSLat2+PwMBAAEB4eDgmT54sV3kiIiIi2cgWgD788EP4+voiKioKALB582Y0bdpUrvJEREREspH1lsq3b98GAIwfPx52dna4fPmynOWJiIiIZCFbAJoyZQq2bNmCFStWAACMjIwwZMgQucoTERERyUa2Q2CRkZE4d+6cdPNDBwcHZGZmylWeiIiISDay7QFSq9XQarXSN8I/fPiQX1pKREREVZJsCWXChAkIDAzE/fv3sWDBArz++uuYOnWqXOWJiIiIZCPbIbCBAwfCx8cHkZGR0Gq12Lp1K5o0aSJXeSIiIiLZyBaAFi5ciFmzZqFRo0Z6Y0RERERViWyHwH766Se9sW3btslVnoiIiEg25d4DtGbNGqxevRpXr16Fr6+vNJ6eni5dEUZERERUlZQ7APXp0wedO3fGrFmz8Mknn0jjFhYWsLW1LW95IiIiItmV+xCYlZUV3Nzc8MMPP+DSpUv4z3/+A1dXV2RnZ/NO0ERERFQl8U7QREREpDi8EzQREREpDu8ETURERIpToXeCnjZtmlzliYiIiGTDO0ETERGR4pQ7AO3du1fnsbu7OwAgISEBCQkJ6NatW3lXQURERCSrcgeg/Ls9JyUlISYmBp06dYIQAlFRUfDz82MAIiIioiqn3AFo/fr1AAB/f39cvnwZzs7OAIDExEQMHDiwvOWJiIiIZCfbSdB//fUX7O3tpcd2dnb466+/5CpPREREJBvZToLu27cv2rVrh/feew8qlQq7du1Cv3795CpPREREJJsyBaCbN2/iwoULcHJykr4Ade7cuXjnnXdw7NgxAMDXX38Nb29v+TolIiIikkmpA9CPP/6IIUOGICcnByqVCl5eXvj111/h4OAAHx8f+Pj4VESfRERERLIp9TlA8+bNQ//+/XHlyhUcOHAAADBjxgzZGyMiIiKqKKXeA3Tjxg3s27cPbm5uaNCgAX744Qd4e3tj7dq1FdEfERERkexKvQcoNzcX5ubm0uNGjRpBq9UiMTFR1saIiIiIKkqZLoP/7rvvcPz4cTx+/BgAYGxsjIyMDFkbIyIiIqoopT4E9tprr2HhwoVIT09HtWrV4O7ujszMTKxduxb+/v7w8fGBhYVFRfRKREREJItSB6BDhw4BAK5du4YzZ87g7NmzOHv2LFauXImwsDBUq1YN9evXx+XLl2VvloiIiEgOZb4RYv369VG/fn307dtXGouPj8fp06dx7tw5WZojIiIiqgiy3Qka+Oeb4N3d3dG7d285yxIRERHJSrbvAiMiIiJ6UTAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiVMkAtGLFCri5ucHU1BStW7fGyZMnC112zZo1eO2112BjYwMbGxv4+/sXuTwRERFRlQtA4eHhCAkJQWhoKM6ePQtPT08EBAQgOTm5wOWjo6PRr18/REVFISYmBrVr10aXLl1w586dSu6ciIiIXhTGhm7geUuXLsWIESMwdOhQAMCqVauwZ88erFu3DjNmzNBbftOmTTqPv/32W+zYsQORkZEYPHiw3vJZWVnIysqSHqelpQEAcnJykJOTI+dbkerJXZeKxnk3DM67YXDeDYPzbhjPznt5514lhBByNCWH7OxsmJubY/v27ejZs6c0HhQUhJSUFOzevbvYGunp6XB0dMS2bdvwzjvv6D0/d+5czJs3T2988+bNMDc3L1f/REREVDkyMjLQv39/pKamwtLSstSvr1J7gO7fv4+8vDw4OTnpjDs5OeHKlSslqjF9+nTUrFkT/v7+BT4/c+ZMhISESI/T0tKkw2ZlmcCi5OTkICIiAp07d4ZarZa1NhWO824YnHfD4LwbBufdMJ6d96dPn5arVpUKQOW1ePFibNmyBdHR0TA1NS1wGY1GA41GozeuVqsrbCOuyNpUOM67YXDeDYPzbhicd8NQq9XIzc0tV40qFYDs7e1hZGSEpKQknfGkpCQ4OzsX+drPP/8cixcvxsGDB9GiRYuKbJOIiIhecFXqKjATExN4e3sjMjJSGtNqtYiMjISfn1+hr1uyZAkWLFiAffv2wcfHpzJaJSIiohdYldoDBAAhISEICgqCj48PfH19sWzZMjx58kS6Kmzw4MGoVasWwsLCAACffvop5syZg82bN8PNzQ2JiYkAgBo1aqBGjRoGex9ERERUdVW5ABQYGIh79+5hzpw5SExMRMuWLbFv3z7pxOhbt26hWrX/7bhauXIlsrOz0atXL506oaGhmDt3bmW2TkRERC+IKheAACA4OBjBwcEFPhcdHa3zOCEhoeIbIiIiopdKlToHiIiIiKgyMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIwABEREZHiMAARERGR4jAAERERkeIYG7qBl01yWiaS07MAALm5ubj9GPjj7zQYG/8z1Y4WGjhampa6VkFKWkuuOi9KLc67YWqVZ95fhPdXVWtx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IiJK/J5Kso58mzdvRr9+/bBp0yYMGDCgxPP6rOXLl8PPzw8jRozA3bt3cffuXajVavTr1w8ffvghLl++jOjoaLz//vs6Iep5R44cgbe3t85YbGwsVCoVli5ditmzZyM2NhZ16tTBjBkzCq1TWXx9fXHy5ElkZWUZuhUiXYKIKlRQUJDo0aOHEEKINm3aiA8//FAIIcTOnTvFs7+Crq6u4ssvv9R5raenpwgNDZUed+jQQbRv3156nJubK6pXry4GDRokjd29e1cAEDExMdJrGjduLLRarbTM9OnTRePGjYUQQmRmZgpzc3Nx/PhxnXUPGzZM9OvXT2fdXl5eRb7Xx48fC7VaLTZt2iSNZWdni5o1a4olS5YIIYT48ssvhaura6E10tLShEajEWvWrCl0mefnQQghWrVqJaZPn16i91TSdUycOFF8/fXXwsrKSkRHR+s9X9S8PlujsMdnzpwRAERCQkKhfTyvR48e0jaUb86cOcLGxkYkJydLY//+979F06ZNC60THx8vvL29S7zestaJjY0t9Xskqgwv78F3oiro008/xZtvvokpU6aUuUaLFi2k/29kZAQ7Ozs0b95cGsvfi5GcnCyNtWnTRueEaz8/P3zxxRfIy8vD9evXkZGRgc6dO+usJzs7G15eXjpjz+95eF5cXBxycnLQrl07aUytVsPX1xeXL18u0fu7fPkysrKy0KlTpyKXe3YeAMDFxUV6z8W9p5KuY/v27UhOTsaxY8fQqlUrveeLmlcjI6MiawOAp6cnOnXqhObNmyMgIABdunRBr169YGNjU+hrnj59ClNTU52x2NhY9OjRAw4ODtJYfHw86tWrV2wPFc3MzAwAdPZIElUFPARGVIlef/11BAQEYObMmXrPVatWTe/QR05Ojt5yarVa57FKpdIZy/8HWavVlqinx48fA/jnHJfz589LP5cuXdI7D6h69eolqlke+f9gFqegech/z8W9p5Kuw8vLCw4ODli3bl2Rh6XKysjICBEREfj111/RpEkTfPXVV2jYsCHi4+MLfY29vb3eyfSxsbHw8/PTGTt//jxatmwpPV63bh1atGgBT09PKYDn5OQgKCgIjRs3RmBgoPQeN27ciFatWsHT0xMhISFF1njWxYsX4ePjg7i4OGns4cOHAKATzoiqAgYgokq2ePFi/Pzzz4iJidEZd3BwwN27d6XHaWlpRf5DWBrPnwz7+++/o379+jAyMkKTJk2g0Whw69Yt1KtXT+endu3apVqPh4eHdI5QvpycHJw6dQpNmjQpUY369evDzMwMkZGRpVr3s4p7TyVdh4eHB6KiorB7926MHz9e7/mi5rUgJiYmyMvL0xlTqVRo164d5s2bh3PnzsHExAQ7d+4stCcvLy9cunRJepyamoqEhAS9vXXPBqD//ve/+PLLL3H48GHExsbio48+AvDP3rbp06fj0qVLSEpKwtGjR3H58mXs3r0bMTExiI2Nxf3797Fnz55Ca+S7cOECgoKCEB4eDg8PD2n84sWLeOWVV2Bvb1/oeyIyBB4CI6pkzZs3x4ABA/Dvf/9bZ/zNN9/Ehg0b0L17d1hbW2POnDklOoxSErdu3UJISAhGjRqFs2fP4quvvpJuUGdhYYEpU6Zg8uTJ0Gq1aN++PVJTU3Hs2DFYWloiKCioxOupXr06xowZg6lTp8LW1hZ16tTBkiVLkJGRUeLLtk1NTTF9+nRMmzYNJiYmaNeuHe7du4c//vijxDVK8p5Kuo4GDRogKioKHTt2hLGxsc6VekXNa0Hc3Nxw4sQJJCQkoEaNGoiLi0NkZCS6dOkCR0dHnDhxAvfu3UPjxo0LrZG/B/HRo0ewsbHBhQsXYGxsrHMY9ObNm3j06JEUgKKiohAYGAhra2sA/1yen5aWhoYNG0rB1MvLCwkJCYiNjcXvv/8OHx8fAP8cuvL29kZcXJxejXx///03+vbti19++QV169bV6ffIkSPo0qVLoe+HyFAYgIgMYP78+QgPD9cZmzlzJuLj4/HOO+/AysoKCxYskG0P0ODBg/H06VP4+vrCyMgIEydOxMiRI6XnFyxYAAcHB4SFheHGjRuwtrbGq6++qvdXfkksXrwYWq0WgwYNQnp6Onx8fLB///4iz2t53uzZs2FsbIw5c+bg77//houLC0aPHl2qPop7T6VZR8OGDfHbb7+hY8eOMDIykkJOcfP6vClTpiAoKAhNmjTB06dPcenSJRw+fBjLli1DWloaXF1d8cUXX+Ctt94qtEbz5s3x6quvYuvWrRg1ahRiY2PRsGFDnfOCzp07B2tr62JvlKjRaKT/b2RkhLy8PGi1WowYMQKhoaE6yz4f2J9lY2MjXZn4bADKzMzErl27sG/fviL7IDIElaiIA9tERFRh9uzZg6lTp+LixYuoVq34MxkuXryIfv364ejRo7CyssLDhw+RlpaGXr164fTp0wD+CWfNmjVDq1at0Lt3bxw5cgR2dnZITk5GXl4eHjx4oFfD1tYWCQkJ6NWrFyIjI9G5c2fMnz8fXbt2BQCsXLkSO3fuxIEDByp0PojKgnuAiIheMG+//TauXbuGO3fulOg8rWbNmmHixIlo164djI2N0aVLF4wdO7bAZZs2bYqPP/4YnTp1glarhUajwYYNGwqssWTJEul1VlZW+Pnnn9GlSxdYWFigXbt2UKvV+Oqrr2R730Ry4h4gIiIiUhxeBUZERESKwwBEREREisMARERERIrDAERERESKwwBEREREisMARERERIrDAERERESKwwBEREREisMARERERIrDAERERESKwwBEREREivP/ALc683zbzTdGAAAAAElFTkSuQmCC",
+ "text/plain": [
+ "