From 0c69b7105d4345adb36c272ebdeca34ba2c349a4 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 14:05:50 -0700 Subject: [PATCH 1/9] support bloch vector in sprse sim --- cirq_sparse_sim/sparse_sim.py | 29 ++++++++++++++++++++ cirq_sparse_sim/sparse_sim_test.py | 43 ++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/cirq_sparse_sim/sparse_sim.py b/cirq_sparse_sim/sparse_sim.py index fd88ff4..f59681d 100644 --- a/cirq_sparse_sim/sparse_sim.py +++ b/cirq_sparse_sim/sparse_sim.py @@ -694,6 +694,35 @@ class SparseSimulatorTrialResult( ): """Final sparse simulation state, materialized as a vector only on request.""" + def bloch_vector_of(self, qubit: cirq.Qid) -> np.ndarray: + """Return the Bloch vector of a qubit in the final state.""" + state = self._get_merged_sim_state() + qubit_index = self.qubit_map[qubit] + sparse_state = state.sparse_state + axis = sparse_state.axis_by_qubit[state.qubits[qubit_index]] + bit = 1 << axis + amplitudes = dict( + zip( + sparse_state.basis_states, + sparse_state.amplitudes, + strict=True, + ) + ) + + z = 0.0 + coherence = 0.0j + for basis, amplitude in amplitudes.items(): + probability = abs(amplitude) ** 2 + if basis & bit: + z -= probability + else: + z += probability + coherence += amplitude * np.conj(amplitudes.get(basis | bit, 0.0j)) + + return np.array( + [2 * coherence.real, -2 * coherence.imag, z], dtype=np.float32 + ) + @property def final_state_vector(self) -> np.ndarray: return self._get_merged_sim_state().state_vector() diff --git a/cirq_sparse_sim/sparse_sim_test.py b/cirq_sparse_sim/sparse_sim_test.py index 613cfa7..b3ae8f8 100644 --- a/cirq_sparse_sim/sparse_sim_test.py +++ b/cirq_sparse_sim/sparse_sim_test.py @@ -1463,6 +1463,49 @@ def test_simulate_random_circuits_matches_dense_simulator(seed: int) -> None: ) +def test_simulation_result_bloch_vectors_match_dense_simulator() -> None: + simulator = SparseSimulator() + qubits = simulator.qubit_manager.qalloc(3) + circuit = cirq.Circuit( + cirq.ry(0.7)(qubits[0]), + cirq.rz(-1.2)(qubits[0]), + cirq.H(qubits[1]), + cirq.CNOT(qubits[1], qubits[2]), + ) + order = [qubits[2], qubits[0], qubits[1]] + + actual = simulator.simulate(circuit, qubit_order=order) + expected = cirq.Simulator(dtype=np.complex128).simulate( + circuit, qubit_order=order + ) + + for qubit in qubits: + assert actual.bloch_vector_of(qubit).dtype == np.float32 + np.testing.assert_allclose( + actual.bloch_vector_of(qubit), + expected.bloch_vector_of(qubit), + rtol=0, + atol=1e-7, + ) + with pytest.raises(KeyError): + actual.bloch_vector_of(cirq.NamedQubit("missing")) + + +def test_simulation_result_bloch_vector_stays_sparse() -> None: + simulator = SparseSimulator() + qubits = simulator.qubit_manager.qalloc(128) + result = simulator.simulate( + cirq.Circuit(cirq.X(qubits[-1])), qubit_order=qubits + ) + + np.testing.assert_array_equal( + result.bloch_vector_of(qubits[0]), np.array([0, 0, 1], dtype=np.float32) + ) + np.testing.assert_array_equal( + result.bloch_vector_of(qubits[-1]), np.array([0, 0, -1], dtype=np.float32) + ) + + def test_simulate_measurements_and_final_state_are_independent_snapshots() -> None: simulator = SparseSimulator(seed=1) qubits = simulator.qubit_manager.qalloc(2) From d989eec5b42bb19ba4e7851efdb734e4e872ca61 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 14:07:56 -0700 Subject: [PATCH 2/9] rewrite old code and split into notebooks --- Quantum error correction with Cirq.ipynb | 797 ------------------ README.md | 2 +- error_correction/01_Intro.ipynb | 104 +++ .../02_ThreeQubitBitFlipCode.ipynb | 147 ++++ .../03_ThreeQubitPhaseFlipCode.ipynb | 114 +++ error_correction/04_ShorCode.ipynb | 114 +++ error_correction/README.md | 6 + error_correction/__init__.py | 0 error_correction/channels.py | 32 + error_correction/protocols.py | 136 +++ error_correction/utils.py | 88 ++ 11 files changed, 742 insertions(+), 798 deletions(-) delete mode 100644 Quantum error correction with Cirq.ipynb create mode 100644 error_correction/01_Intro.ipynb create mode 100644 error_correction/02_ThreeQubitBitFlipCode.ipynb create mode 100644 error_correction/03_ThreeQubitPhaseFlipCode.ipynb create mode 100644 error_correction/04_ShorCode.ipynb create mode 100644 error_correction/README.md create mode 100644 error_correction/__init__.py create mode 100644 error_correction/channels.py create mode 100644 error_correction/protocols.py create mode 100644 error_correction/utils.py diff --git a/Quantum error correction with Cirq.ipynb b/Quantum error correction with Cirq.ipynb deleted file mode 100644 index 95dc37c..0000000 --- a/Quantum error correction with Cirq.ipynb +++ /dev/null @@ -1,797 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Introduction\n", - "\n", - "This notebook is my excercise with to purposes: learn Cirq and learn quantum error correction.\n", - "\n", - "It is based on material in Chapter 10 of \"Quantum Computation and Quantum Informaton\" by Nielsen and Chuang.\n", - "\n", - "**Warning.** Cells with charts will take long time to run.\n", - "\n", - "### The problem\n", - "\n", - "Suppose we have noisy quantum channel, which with probability $p$ changes transmitted qubit in a certain way. We have qubit and we want to pass it through this channel. We can use perfect (not-faulty) gates. We are allowed to encode given qubit into several qubits. Each of them is transmitted throw noisy channel. Then we can decode resulting qubit and we have to present one qubit. State of this qubit should be exactly the same as state of qubit we started with.\n", - "\n", - "For beginning, noisy channel will apply bit-flip (i.e. X gate) with probability p, later we will consider other types of noise." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The framework\n", - "\n", - "There is qubit $| \\psi >$. We allowed to \"encode\" it, by applying certain cirquit which produces one or more qubits.\n", - "Then these qubits are passed (independently) throw faulty channel. Then we allowed to \"decode\" result by applying another circuit to received cubits. It should producr one qubit. Finally, we check whether this is the same qubit as the one we started with. We repeat this many times with different (random) $| \\psi >$ and measure error rate $p_1$. We will change $p_0$ and see how $p_1$ changes.\n", - "\n", - "Let's build this framework and test it with no encoding-decoding. Obviosly, we expect $p_1=p_0$.\n", - "\n", - "\n", - "**How do we generate initial state?**\n", - "\n", - "Any qubit state corresponds to a point on Bloch sphere. Let's generate random $\\theta \\in [0, \\pi]$ and $\\phi \\in [0, 2 \\pi]$. Then state is $ | \\psi\\rangle= \\cos(\\theta/2) |0 \\rangle + e^{i \\phi} \\sin(\\theta/2) |1 \\rangle$. To get it from \n", - "$| 0 \\rangle$, apply gate defined by unitary matrix:\n", - "\n", - "$$\\begin{pmatrix}\n", - " \\cos(\\frac{\\theta}{2}) & -\\sin(\\frac{\\theta}{2}) \\\\\n", - " e^{i \\phi} \\sin(\\frac{\\theta}{2}) & e^{i \\phi} \\cos(\\frac{\\theta}{2})\n", - " \\end{pmatrix} $$\n", - " \n", - "Cartesian coordinates of this state on the bloch sphere are $(\\sin(\\theta) \\cos(\\phi), \\sin(\\theta) \\sin(\\phi), \\cos(\\theta))$." - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import cirq\n", - "\n", - "class BaseQecProtocol:\n", - " def __init__(self):\n", - " self.name = 'No encoding'\n", - " \n", - " def encode(self, circuit, qubit):\n", - " return [qubit]\n", - " \n", - " def decode(self, circuit, qubits):\n", - " return qubits[0]\n", - "\n", - "class BitFlipChannel:\n", - " def __init__(self, flip_prob):\n", - " self.flip_prob = flip_prob\n", - " \n", - " def transmit(self, ct, q):\n", - " if np.random.rand() < self.flip_prob:\n", - " ct.append(cirq.X(q))\n", - " return q\n", - "\n", - "# Transmits random qubit using given channel and protocol and returns if transmission was successful.\n", - "# If output is passed, writes there circuit.\n", - "def test_protocol_once(protocol, channel, output=None):\n", - " # Generate qubit (in Bloch sphere notation).\n", - " theta = np.random.rand() * np.pi\n", - " phi = np.random.rand() * 2*np.pi\n", - "\n", - " # Coordinates on Bloch sphere (for asserion in the end of experiment).\n", - " init_bloch_coords = np.array([np.sin(theta)*np.cos(phi), \n", - " np.sin(theta)*np.sin(phi), \n", - " np.cos(theta)])\n", - "\n", - " # Create cirquit with one qubit and initialize it to generated state.\n", - " ct = cirq.Circuit()\n", - " q_init = cirq.NamedQubit('q_init')\n", - " U0 = np.array([[np.cos(0.5 * theta), -np.sin(0.5*theta)], \n", - " [np.exp(1j * phi) * np.sin(0.5 * theta), np.exp(1j*phi) * np.cos(0.5*theta)]])\n", - " ct.append(cirq.SingleQubitMatrixGate(U0).on(q_init))\n", - "\n", - " # Encode.\n", - " encoded_qubits = protocol.encode(ct, q_init)\n", - "\n", - " # Transmit.\n", - " transmitted_qubits = [channel.transmit(ct, q) for q in encoded_qubits]\n", - "\n", - " # Decode.\n", - " decoded_qubit = protocol.decode(ct, transmitted_qubits)\n", - "\n", - " # Simulate cirquit to get final state of decoded qubit.\n", - " sim = cirq.Simulator()\n", - " sim.simulate(ct)\n", - " result = sim.simulate(ct)\n", - " result_bloch_coords = result.bloch_vector_of(decoded_qubit)\n", - " \n", - " # Protocol should ensurre that decoded_qubit is not entangled with other qubits.\n", - " if not np.allclose(np.linalg.norm(result_bloch_coords), 1.0):\n", - " raise ValueError(\"Not pure state %s\" % result_bloch_coords)\n", - " \n", - " if output != None:\n", - " output['circuit'] = ct\n", - "\n", - " # Return whether qubit state was correctly transmitted.\n", - " return np.linalg.norm(result_bloch_coords - init_bloch_coords) < 1e-5\n", - "\n", - "# Experimentally calculates failure rate of error correcting protocol.\n", - "def test_protocol(protocol, channel, num_experiments=100):\n", - " ok_count = sum([test_protocol_once(protocol, channel) for _ in range(num_experiments)])\n", - " return 1.0 - 1.0 * ok_count / num_experiments\n", - " \n", - "def plot_errors(protocol, \n", - " num_points=21, \n", - " num_experiments=100, \n", - " theoretical=None,\n", - " channel_factory=lambda p:BitFlipChannel(p),\n", - " max_p=1.0):\n", - " channel_error = np.linspace(0, max_p, num_points)\n", - " protocol_error = [test_protocol(protocol, channel_factory(p), num_experiments=num_experiments)\n", - " for p in channel_error]\n", - " plt.plot(channel_error, protocol_error, label='Experiment')\n", - " plt.xlabel('Channel error')\n", - " plt.ylabel('Protocol error')\n", - " plt.title(protocol.name)\n", - " \n", - " if not theoretical is None:\n", - " plt.plot(channel_error, theoretical(channel_error), '--', label='Theory')\n", - " plt.legend()\n", - " plt.grid()\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n1BEAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(BaseQecProtocol(), num_experiments=200, theoretical=lambda x:x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The three qubit bit flip code\n", - "\n", - "This part is based on Chapter 10.1.1 from \"Quantum Computation and Quantum Informaton\" by Nielsen and Chuang.\n", - "\n", - "** Encoding **\n", - "We will map $| 0 \\rangle$ to $| 000 \\rangle$ and $| 1 \\rangle$ to $| 111 \\rangle$, which can be done using 2 CNOT gates.\n", - "\n", - "This way, $\\alpha | 0 \\rangle + \\beta | 1 \\rangle$ is encoded as $\\alpha | 000 \\rangle + \\beta | 111 \\rangle$.\n", - "\n", - "** Decoding **\n", - "Assume that not more than one bit flips occured. Then there are 4 options:\n", - "\n", - "1. No bit flip occured. State after transmission $\\alpha | 000 \\rangle + \\beta | 111 \\rangle$.\n", - "2. First bit flipped. State after transmission $\\alpha | 100 \\rangle + \\beta | 011 \\rangle$.\n", - "3. Second bit flipped. State after transmission $\\alpha | 010 \\rangle + \\beta | 101 \\rangle$.\n", - "4. Third bit flipped. State after transmission $\\alpha | 001 \\rangle + \\beta | 110 \\rangle$.\n", - "\n", - "Book suggests to do a measurement to do a measurement which distingusishes these 4 states and does not changes state. Indeed, these 4 cases correspond to 4 orthonal subspaces, and we could take projectors on these subspaces as measurement opertors.\n", - "\n", - "However, how to implement such measurement. One way to implement measurement not in computational basis is to apply unitary transform, after which measurement in computational basis will give desired result. For example, if we want to meaure in basis $|+ \\rangle, |- \\rangle$, we could apply Hadamard gate and measure in $|0 \\rangle, |1 \\rangle$ basis.\n", - "\n", - "Let's explicitly design such transformation, by saying where should it take one of 4 possible outcomes:\n", - "\n", - "$\\alpha | 000 \\rangle + \\beta | 111 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 00 \\rangle$\n", - "\n", - "$\\alpha | 100 \\rangle + \\beta | 011 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 11 \\rangle$\n", - "\n", - "$\\alpha | 010 \\rangle + \\beta | 101 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 10 \\rangle$\n", - "\n", - "$\\alpha | 001 \\rangle + \\beta | 110 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 01 \\rangle$\n", - "\n", - "Now by doing measurement in computational basis for two rightmost qubits we obtain result of measurement which we initially wanted, and measurement wouldn't change the state.\n", - "\n", - "Then we could apply inverse transformation and use mesurement result to decide which bit was flipped (if any), and flip it.\n", - "\n", - "But we don't need to do all this, as after this transformation we see that regarless of which bit was flipped, leftmost qubit is already equal to qubit we want to restore. So, we just need to apply transformation, and we don't need to do any measurements.\n", - "\n", - "So, how do we build this transformation? It is, in fact, a permutation:\n", - "\n", - "$\\alpha | 000 \\rangle \\to | 000 \\rangle$\n", - "\n", - "$\\alpha | 001 \\rangle \\to | 001 \\rangle$\n", - "\n", - "$\\alpha | 010 \\rangle \\to | 010 \\rangle$\n", - "\n", - "$\\alpha | 011 \\rangle \\to | 111 \\rangle$\n", - "\n", - "$\\alpha | 100 \\rangle \\to | 011 \\rangle$\n", - "\n", - "$\\alpha | 101 \\rangle \\to | 110 \\rangle$\n", - "\n", - "$\\alpha | 110 \\rangle \\to | 101 \\rangle$\n", - "\n", - "$\\alpha | 111 \\rangle \\to | 100 \\rangle$\n", - "\n", - "All is left is to represent it as matrix and decompose it into X and CCNOT gates: " - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import quantum_decomp as qd" - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[X on bit 1,\n", - " X on bit 0, fully controlled,\n", - " X on bit 1,\n", - " X on bit 1, fully controlled,\n", - " X on bit 0, fully controlled,\n", - " X on bit 0,\n", - " X on bit 2, fully controlled,\n", - " X on bit 0,\n", - " X on bit 2,\n", - " X on bit 0, fully controlled,\n", - " X on bit 0,\n", - " X on bit 2,\n", - " X on bit 2, fully controlled,\n", - " X on bit 0,\n", - " X on bit 1,\n", - " X on bit 0, fully controlled,\n", - " X on bit 1,\n", - " X on bit 1, fully controlled,\n", - " X on bit 0, fully controlled]" - ] - }, - "execution_count": 149, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qd.matrix_to_gates(np.array([\n", - " [1,0,0,0,0,0,0,0],\n", - " [0,1,0,0,0,0,0,0],\n", - " [0,0,1,0,0,0,0,0],\n", - " [0,0,0,0,1,0,0,0],\n", - " [0,0,0,0,0,0,0,1],\n", - " [0,0,0,0,0,0,1,0],\n", - " [0,0,0,0,0,1,0,0],\n", - " [0,0,0,1,0,0,0,0]\n", - "]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here I have used my [utility for decomposing unitary matrix](https://github.com/fedimser/quantum_decomp).\n", - "\n", - "Let's implement new protocol:" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class ThreeQubitBitFlipProtocol(BaseQecProtocol):\n", - " def __init__(self):\n", - " self.name = '3 qubit bit flip protocol'\n", - " \n", - " def encode(self, circuit, qubit):\n", - " q0 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits()))\n", - " circuit.append(cirq.CNOT(qubit, q0))\n", - " q1 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits()))\n", - " circuit.append(cirq.CNOT(qubit, q1))\n", - " return [qubit, q0, q1]\n", - " \n", - " def decode(self, circuit, qubits): \n", - " def X(target):\n", - " circuit.append(cirq.X(qubits[target]))\n", - " \n", - " def CCNOT(target):\n", - " i1, i2 = 1, 2\n", - " if target == 1: i1, i2 = 0, 2\n", - " if target == 2: i1, i2 = 0, 1\n", - " circuit.append(cirq.CCNOT(qubits[i1], qubits[i2], qubits[target]))\n", - " \n", - " X(1)\n", - " CCNOT(0)\n", - " X(1)\n", - " CCNOT(1)\n", - " CCNOT(0)\n", - " X(0)\n", - " CCNOT(2)\n", - " X(0)\n", - " X(2)\n", - " CCNOT(0)\n", - " X(0)\n", - " X(2)\n", - " CCNOT(2)\n", - " X(0)\n", - " X(1)\n", - " CCNOT(0)\n", - " X(1)\n", - " CCNOT(1)\n", - " CCNOT(0)\n", - " \n", - " # Measurement is not needed for Bit-Flip, but is needed so we can use it in Shor Code.\n", - " circuit.append(cirq.measure(qubits[0]))\n", - " circuit.append(cirq.measure(qubits[1]))\n", - " \n", - " return qubits[2]\n", - " \n", - "test_protocol_once(ThreeQubitBitFlipProtocol(), BitFlipChannel(0.1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before doing experiment, let's calculate theoretical error rate for protocol. Protocol fails if 2 or 3 qubits were flipped. Each qubit is flipped independently with probability $p$, so probability of such event is $3p^2(1-p) + p^3$." - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3hUZdrH8e+dRhq9hBYIUkSqQACx\nBkVFRFCkCigKYmP1texaV11su9ZVUdeGigWwAAZFUYGgKF060kF6h0ASQsrc7x9z2I0xCUPI5CQz\n9+e6cmXOnOecuZ+U+c2pj6gqxhhjgleI2wUYY4xxlwWBMcYEOQsCY4wJchYExhgT5CwIjDEmyFkQ\nGGNMkLMgMOWCiCSIiIpIWCHzHxKRd05hfY+LyEdFzF8lIkmnsL4zRWSJiBwVkTtF5H0RedKZd4GI\nrPV1XYFARFJEZITbdRjfWBCY0yIiH4nILhE5IiLr3PrnV9WnVXWEU1ORoeHj+lqqaoqzviJDw/E3\nIEVVK6rqK/nW9ZOqnlncWkqSj30xQcaCwJyuZ4AEVa0E9AKeFJEOLtfkhobAKjcLEC/7nzanzP5o\nzGlR1VWqevzEpPPVuKC2IhIqIs+LyH4R2SQid+T95C4iW0SkW572BX16vUlEdjpbIfcW0vZH5/th\nEUkTkS6FlB8pIhOd3Tm/ikjbPOvbIiLdRKQ78BAwwFnXsgL6NRPoCoxx2jTLNz9JRLbnW/eDIrJa\nRA6JyHsiElnIz2yYiPwsIq+KSKqIrBGRS/LMTxGRp0TkZyADOENE6opIsogcFJENInKz07bAvhTW\n3pkX6ux22+j8nBaLSLwz71wRWejUtVBEzi3k52zKOAsCc9pE5HURyQDWALuAaYU0vRnoCbQDEoG+\nxXi5rkBT4DLggbzBkceFzvcqqhqrqnMLWVdv4DOgGvAJMEVEwvM2UNVvgaeBic662uZfiapeDPwE\njHLarPOhH4OBy/GGZjPgkSLadgY2ATWAx4BJIlItz/yhwEigIvA7MB7YDtTF+zN+WkQuKaIvBbZ3\n5t0DDAJ6AJWAm4AM5/W/Bl4BqgMvAl+LSHUf+m7KGAsCc9pU9Xa8b0IXAJOA44U07Q/8W1W3qepB\nvLuVTtU/VDVdVVcA7+F9kyquxar6uapm430jiwTOOY31nYoxeX4OT1F0P/bi/bllq+pEYC1wZZ75\n7ztbZjlAbeB84H5VzVTVpcA7eMPiT5xP90W1HwE8oqpr1WuZqh5wXn+9qn6oqjmqOh7vB4Grivfj\nMG6yIDAlQlVzVXUOUB+4rZBmdYFteaZ/L8ZL5V++bjHW8ad1qaqH/30qLg2n0o8d+se7Q+Zvn3dd\ndYGDqno0X/t6haz7ZO3jgY2FLJf/91fU65gyzILAlLQwCjlGgHe3UXye6Qb55qcD0XmmaxewjvzL\n7yygja+31P3vupyDrPVPc32nwpd+nFBPRKSI9nnr2wlUE5GK+drvKKCtL+23UfDvcyfeA+R55V3O\nlCMWBKbYRKSWiAwUkVjnoOLleHdxzCxkkU+BO0WkvohUBR7IN38pMFBEwkWksGMIfxeRaBFpCdwI\nTCygzT7AA5xxki50EJE+zsHq/8O7S2teAe32AAklfEbOHc7PoRreA7gF9eOEWnh/buEi0g84i0KO\nw6jqNuAX4BkRiRSRNsBw4GOnyR/64kP7d4AnRKSpc1ZSG+c4wDSgmYhcJyJhIjIAaAF8VdwfiHGP\nBYE5HYp3N9B24BDwPPB/qvplIe3fBqYDy4Bf8R5PyOvveD99HgL+gfcAbn6zgQ3ADOB5Vf3uT0Wp\nZuDd7/6ziBwWkcL2+38JDHBebyjQxzlekN9nzvcDIvJrIes6VZ8A3+E9CLwJeLKItvPxHiDfj7df\nfZ399IUZBCTg/dQ+GXhMVb935hXUl6Lav4g3wL8DjgDvAlHO6/cE7gUO4L2Ooqeq7j9Zx03ZIzYw\njXGLiCQAm4Fw50BnUBCRLcAIVf3Bh7bDnLbn+7suE7xsi8AYY4KcBYExxgQ52zVkjDFBzrYIjDEm\nyBX77oxuqVGjhiYkJBRr2fT0dGJiYkq2oDLO+hwcrM/B4XT6vHjx4v2qWrOgeeUuCBISEli0aFGx\nlk1JSSEpKalkCyrjrM/BwfocHE6nzyJS6JX8tmvIGGOCnAWBMcYEOQsCY4wJchYExhgT5CwIjDEm\nyPktCERkrIjsFZGVhcwXEXnFGRpvuYi091ctxhhjCufPLYL3ge5FzL8C7x0Vm+IdZu8NP9ZijDGm\nEH67jkBVf3TuLlmY3sA4Z+SleSJSRUTqqOouf9VkjDFlUWZWDmu272VXupCV6yF23xLCju2DrHQk\nK53Q7HT2R9TjQHQTkvzw+m5eUFaPPw6xt9157k9BICIj8W41EBcXR0pKSrFeMC0trdjLllfW5+Bg\nfS4/PKqwfQHhB9cSnrGLKlm7qePZTYjGcVvWUwBMifg7Z4ds+sNyX+d2Ym2Du/zSZzeDQAp4rsA7\n4KnqW8BbAImJiVrcK+vsSsTgYH0ODmW+z7k5sGcFbFtA1uZfSN21iTuin2XF9lSe5wcuClnITqnF\noQr12VilHRXqteabjhcQERZCzKG3ORiihEbGEh5VkbCoSvSIjCHmx5/80mc3g2A7fxy3tbDxYo0x\npuzLyYLQcBCBeW+gM0Yj2RkAHNRqLPI0I5M0BnSMR+NeYkvDujSqVZX4kAI+E9dMLNXS3QyCZGCU\niEwAOgOpdnzAGFOuZB6BDd/Dmq9h/fdw4zT2Rjdl3o4YsrUrKVmNWBPRgnPatWVAx3iS61V2u+IC\n+S0IRGQ8kATUEJHtwGNAOICq/gfv4Nc98I4/m4F3IHJjjClz0o/n8MvGA6Ss3cu6PUeplbObm4+M\noVXWMsLIITWkMosqdGHSxFV8u2cbuZ7qdG70FwZ2iufZlnWIigh1uwtF8udZQ4NOMl+BO/z1+sYY\nU1yqysZ9aaSs3cestXtZvnkPl+g8CItE6l1GRnhVqnkO8G3s1SyKPJf1Ec1R8b7Z33xBFfon1ueM\nmrEu98J35e421MYY4y97j2by+qyNfL96DzsOH6OlbOaW2Dm8G/kTkblpeJpcRsiQx5zWy2gA9HSz\n4BJiQWCMCXoej/LJgq3869s1HM/2cNGZNXm/5ic03fYZaCS07A3thhLS8Dy3S/ULCwJjTFD7bdcR\nHpq8gv3b1vJctRSa9x9NQsME2DAQDnaG1n0hqqrbZfqVBYExJihlZOXw8oz1zJ0zkzsivuKyCvPg\nWCiS0Q9IgCbd3C6x1FgQGGOCzqw1e3ls8lKezBjNg+Er0PCKSMe/QOfboFIdt8srdRYExpigcTg9\nk7ETP+OVddVoUiuWMxPaQnxfJPFGiCyb5/iXBgsCY0zgU2XlT1MImzWa//Nspvr5XzCo+wVEhF3k\ndmVlggWBMSagHd8yn51fPEiro4vZJbXYmfQCN1yUBCE2LtcJFgTGmIC1ZtPvJIzrSUWN5Ov4/+Pi\n6+4nKjra7bLKHAsCY0xgObITz9IJvKO9eP679XSLfJCB11zDla0auV1ZmWVBYIwJDDnHYd7r5KY8\nS25ONuOPVyLprLN58tpLqBYT4XZ1ZZoFgTGm3MtaM53jU/9GxfQtzMjtwIshw7itT1f6JdZHpKCh\nT0xeFgTGmHJr28EMJvy8lmGLR3LUE8lTMY/R/Pxr+LRDfSpFhrtdXrlhQWCMKXfmrtnOurmTuXl6\nKh4JJ7PxC3Q7vwvPNKtrWwDFYEFgjCk3cnI9TJw4jgvWPEmXkH3UPLsNXboPpnblSLdLK9csCIwx\n5cK+fXtYMfYvDD42nf1R8Sw68wmu6TPc7bICgl1RYYwp8xZtOcjG1/txYcb3rGsyghr3LSStWhu3\nywoYtkVgjCmzNG0fHy/ezePTt5FU6QbiepxJszbnu11WwLEgMMaUPaocX/op2V/9FT3ekaQzH+SF\n/pdSOcrOBPIHCwJjTNmSfoD0L+4gZtM3/OZpTNg5I3mrRwdCQuxsIH+xIDDGlB1b55MzYQjhGQd5\nSYbQcfCjDDozzu2qAp4FgTGmzNieU4mDx6rydMjfGH3LQJrFVXS7pKBgQWCMcdfuFbB0PL8nPsTA\niTvJ5AnGj+xiIVCKLAiMMe7weGDuGJj5BLkVqnDXr205llOVT27uQvPaldyuLqhYEBhjSt/R3TDp\nZtj8I8cad+fa7YPYkR3NxyM606KuhUBpsyAwxpQujwc+uhYObuJQtxfp9XMCh4/n8MmIzrSqF7zj\nBrvJgsAYUzo8ud7vIaHQ43n25UbR94tDHM7I4qMRnWld30LALXaLCWOM/x3dAx9eDbOfBWBbxbb0\nn3SYA2lZfDC8E23jq7hcYHCzIDDG+NfmH+HNC2DbAqgSz/xNB+g1Zg4H07P44KaOtG9Q1e0Kg54F\ngTHGPzwemP0cjOsNFSrBzTOZmHMhQ96dT9WYCKbccR4dGlZzu0qDHSMwxvjL/rUw+1/Qqi+5V77I\n0z9s4905K7igaQ3GXNfe7htUhvh1i0BEuovIWhHZICIPFDC/gYjMEpElIrJcRHr4sx5jTClI2+f9\nXussuPUnjvR4jeHjf+PdOZsZdm4C7w3raCFQxvgtCEQkFHgNuAJoAQwSkRb5mj0CfKqq7YCBwOv+\nqscYU7Iys3P5YfUeFv9+kL1HMlFVWPkFvNwWfpsKwO+hDejzxlzmrN/PU9e04vFeLQkLtT3SZY0/\ndw11Ajao6iYAEZkA9AZW52mjwImrRyoDO/1YjzGmhHg8yu0f/8rMNXsBCMHDQxETGREylXUVWjJl\nVUWid63nnTmbUYVxwztxbuMaLldtCiOq6p8Vi/QFuqvqCGd6KNBZVUflaVMH+A6oCsQA3VR1cQHr\nGgmMBIiLi+swYcKEYtWUlpZGbGxssZYtr6zPwaG0+/zF+iymbsymX7NwmkSlc8nvL9IkcznfRlzK\ns54b2JUZwrEcqBsj3NU+kriYkt8KsN/zqenatetiVU0scKaq+uUL6Ae8k2d6KPBqvjb3APc6j7vg\n3VoIKWq9HTp00OKaNWtWsZctr6zPwaE0+/zNip3a8P6v9G+fLVOPx6O67FPV0TVUF3/wh3aHM7I0\nJ9fjtzrs93xqgEVayPuqP3cNbQfi80zX58+7foYD3QFUda6IRAI1gL1+rMsYU0zr9hzlnk+XcXZ8\nFUZfUh0RgTb9IL4TVG34h7Z2QLj88OdRm4VAUxFpJCIReA8GJ+drsxW4BEBEzgIigX1+rMkYU0yp\nGdmMHLeImIhQPmw8iwqvd4Q9ziG/fCFgyhe/bRGoao6IjAKmA6HAWFVdJSKj8W6iJAP3Am+LyN14\nDxwPczZhjDFlSK5HuXPCEvYfTuXHZp9Rcd5X0HYQVG/sdmmmBPj1gjJVnQZMy/fco3kerwbO82cN\nxpjT98J3a1m9bh0pcW9QbfMq6PYPOO8uEBtHOBDYlcXGmCJ9vXwXr6dsZGyDBdQ4tAkGfARn9XS7\nLFOCLAiMMYVas/sIj342n/YNanLeiOcgdRTUbOZ2WaaEWRAYYwr0285UZo99iKmh0wm/ZiYVIipY\nCAQoCwJjzB+oKp8t2IR8fS+3hsziUONeVK1R0+2yjB9ZEBhj/isjK4cnPp/PFb/dz4WhK0g/5x6q\nXv6oHRQOcBYExhjAe7HY7R//yrBDL3N+6Go8V71KTIfr3S7LlAILAmMMny/eziNTVhBbIYwmA58j\nJHoHNLrQ7bJMKbEgMCaIHcvK5dEvV7J7yTQ+qTiT+rd8Rq1qVQC7UCyYWBAYE6T2px3npvcX0nzX\nl3wQ8S5SpTkSkeV2WcYFFgTGBKFtBzO4/t359D06jjvCJ0Hji6HfBxBZ6eQLm4BjQWBMkPlt1xFu\nGLuAEdkfMzJkErQbAj3/DaF2t9BgZUFgTBCZv+kAI8YtIiYijEsH3gl7W8AF99npoUHOgsCYIDF9\n1W4eGf8Tt8X8Qu9bn6Je1Who3s7tskwZYEFgTBCYsGArYybPYlL0c9TP2YNk3wI0d7ssU0ZYEBgT\nwFSV12ZtIPn7GSRHP0fVsCxk0GSoZSFg/seCwJgApar869u1/PrjV3wZ9RKR0RWRIckQ19Lt0kwZ\n48+hKo0xLlFVnvlmDf+ZvZGezWOJrNEAGf6dhYApkG0RGBNgVJUnv/6N73+ex/VdOjG0Vw/EMwJC\n7d/dFMz+MowJIKrKP6auJnT+a6RUmIC0+RIRsRAwRbK/DmMChKry2JcrqbXoOUaFf4m2uBqJ7+R2\nWaYcsCAwJgB4VPn75GWc9etoBofNQNvfgPR8CUJC3S7NlANFHiwWkRARWVlaxRhjTp3Ho3ywKov9\niyZ7Q+C8u5GrXrYQMD4rcotAVT0iskxEGqjq1tIqyhjjG1XlockrmL09h1FJg9BmXZEzklyuypQ3\nvuwaqgOsEpEFQPqJJ1W1l9+qMsb45N9TF3Dp0vupFD+Eey/vgYhdKGZOnS9B8A+/V2GMOWXjvl/A\n5YtuplnYTmrWOuA9O8iYYjhpEKjqbBGJAzo6Ty1Q1b3+LcsYU5SvflrAeT9dT/3QQ8h1n3Jwh10b\naorvpH89ItIfWAD0A/oD80Wkr78LM8YU7KeFS2j3wyDqhKYi108itOnFbpdkyjlfdg09DHQ8sRUg\nIjWBH4DP/VmYMebP5m86wO1fbuW16BZ0HPw4EQ07uF2SCQC+BEFIvl1BB7B7FBlT6jYt/5l7Ju2m\nVtXqtLr1C6JiItwuyQQIX4LgWxGZDox3pgcA0/xXkjEmvz3LfiBu8mAeD+lAi+FfUM1CwJSgk36y\nV9W/Am8CbYC2wFuqer8vKxeR7iKyVkQ2iMgDhbTpLyKrRWSViHxyKsUbEwxSl31NlcmD2E0Nmgx9\nmXpVotwuyQSYIrcIRCQUmK6q3YBJp7JiZ9nXgEuB7cBCEUlW1dV52jQFHgTOU9VDIlLrVDtgTCDL\nWTmFmMnDWavx5A7+gjaNGrtdkglARW4RqGoukCEilYux7k7ABlXdpKpZwASgd742NwOvqeoh5/Xs\ntFRjTsjJInXqwyz1nMHWqybSppmFgPEPUdWiG4h8CpwDfM8fryy+8yTL9QW6q+oIZ3oo0FlVR+Vp\nMwVYB5wHhAKPq+q3BaxrJDASIC4ursOECRN86lx+aWlpxMbGFmvZ8sr6XE6p8suuXL5avoPE+Cr0\naVn0Z7GA6PMpsj6fmq5duy5W1cSC5vlysPhr5+tUFXSZY/7UCQOaAklAfeAnEWmlqof/sJDqW8Bb\nAImJiZqUlFSMciAlJYXiLlteWZ/LoXlvcGjLMm777SpaN2rGCyM6Ex5a9OG8ct/nYrA+lxxfjhFc\nqqpDirHu7UB8nun6wM4C2sxT1Wxgs4isxRsMC4vxesaUfz+9ADNGszz0HKpGhvLade1PGgLGnC5f\njhHUFJHinKu2EGgqIo2c5QcCyfnaTAG6AohIDaAZsKkYr2VM+aYKM5+EGaOZG3MJt2SO4tUhnalZ\nsYLblZkg4MuuoS3AzyKSzB+PEbxY1EKqmiMio4DpePf/j1XVVSIyGlikqsnOvMtEZDWQC/xVVQ8U\nryvGlGMzRsOcF1kR15vBv/fjH1e3oUPDqm5XZYKEL0Gw0/kKASqeyspVdRr5Lj5T1UfzPFbgHufL\nmODV6AK27kul9/KuXNO+AUM6N3C7IhNEfLn76D8ARCRGVdNP1t4Y4yNPLmydCwnn83uVzly1Npuz\n6kTz1DWt7JbSplSdNAhEpAvwLhALNBCRtsAtqnq7v4szJmDl5pD5+Ugq/DaJj9t+yDsbYhER/jOk\nA5HhNsSkKV2+7Br6N3A5zoFeVV0mIhf6tSpjAszxnFwW/36I5dtTWbVtH9dsepyLPXN5NnsAbywI\noVmtUN4Y0pr4atFul2qCkC9BgKpuy7epmuufcowJPEczsxn8znyWb08lgmzGxozhfM9C5ja5hwvP\nHcXt9SoTW8Gnf0Vj/MKXv75tInIuoM5poHcCv/m3LGMCw7GsXIZ/sIjVO4/wbN829JC5xE5dCFe+\nQJeOI9wuzxjAtyC4FXgZqIf3ArDvgDv8WZQxgSArx8NtHy9m4ZaDvDKwHVe1rQvEQ90zoU5bt8sz\n5r98OWtoPzC4FGoxJmDkepR7Pl1Kytp9PHdVI65adTfUfADqtrMQMGWOXbtuTAlTVR6evIKvlu/i\n8Uvr0W/1X2DDD3B4m9ulGVMgO0JlTAlSVZ6e9hsTFm7jrxfUYNiGO2HPaug/Dppf6XZ5xhTIgsCY\nEvTarA28/dNmbu1Yhdu33g37N8Cg8dD0UrdLM6ZQhQaBiBR524eT3WvImGDz/s+bef67dfRpX4+/\n9ToLmdIMLnsKGnd1uzRjilTUFsEp3VfImGA2c80eHp+6mv7NQni6e11CwitAv/fdLssYnxQaBCfu\nMWSMKdrhjCzu/2IFF9Y6xj+PPEHI53Xhxmlg9wsy5cRJzxoSkfoiMllE9orIHhH5QkTql0ZxxpQH\njyWvIjZ9G+94HiPk2CG47AkLAVOu+HL66Ht47zNUF+9FZVOd54wJet+u3MXyZYtJjn2aiNx0uCEZ\n6hc4LKwxZZYvQVBTVd9T1Rzn632gpp/rMqbMO5B2nIcnr+SVmPeIDfPADV9B3bPdLsuYU+bL6aP7\nRWQIMN6ZHgTYKGImqKkqj0xZydHMHKJvHItUUqjV3O2yjCkWX7YIbgL6A7uBXUBf5zljgtbs2T/Q\nZc0z3N3tDBo3OdNCwJRrvtxraCvQqxRqMaZcOLj2F9qn3ECLiBiqtbOzrE3558tZQx+ISJU801VF\nZKx/yzKmbNLf5xI14VoOawzHBk8lrEpdt0sy5rT5smuojaoePjGhqoeAdv4ryZgyassccsddw87c\nysw5/0MaNrbdQSYw+BIEISJS9cSEiFTD7lFkgtCB9Cx+y6nLP+NeYOAlnd0ux5gS48sb+gvALyLy\nuTPdD3jKfyUZU8Yc3sqx6Hrc8XMUyzxP8e3ACwkJsQvGTODw5WDxOBFZBFzsPNVHVVf7tyxjyojV\nyegXw3k99j7m723F833b0rB6jNtVGVOifN3FEw4IoM5jYwLfis/RSSNZHdKUj/c3Ycyg9lzZpo7b\nVRlT4nw5a+gu4GOgBlAL+EhE/uLvwoxx1dJP0Ek3s5QzuTHnQcbceJGFgAlYvmwRDAc6q2o6gIj8\nC5gLvOrPwoxxzd7f0Cm3M4/W3Bd6P2NHXECrepXdrsoYv/ElCATIzTOd6zxnTECafbgGX+TezerY\nc/h4+Pkk1LBjAiaw+RIE7wHzRWSyM301YBeUmcAz9zVmZyQwfIbQNO5iPrmpI7UqRrpdlTF+58tZ\nQy+KSApwPt4tgRtVdYm/CzOm1KjimfUMIT/+ix05F9Oh4d94+4ZEKkXaeREmOJw0CETkQ1UdCvxa\nwHPGlG+qpH31ILGL32BiThILWz7MB33bERke6nZlxpQaX64sbpl3QkRCgQ6+rFxEuovIWhHZICIP\nFNGur4ioiNiIHqb0eDxs/eh2Yhe/wcd6OaFXv8qLAztYCJigU+gWgYg8CDwERInIEf53gDgLeOtk\nK3YC4zXgUmA7sFBEkvNfjCYiFYE7gfnF6oExxZCZncs/v15Bx3UbWBDThy43vcIZtexOoiY4FTV4\n/TPAMyLyjKo+WIx1dwI2qOomABGZAPQG8l+V/ATwLHBfMV7DmFO2fudBHpnwM/P3hhB+3ovc1/0s\nKoTb7bNM8BJVPXkjkV7Ahc5kiqp+5cMyfYHuqjrCmR6K93qEUXnatAMeUdVrnQPS96nqogLWNRIY\nCRAXF9dhwoQJJ625IGlpacTGxhZr2fLK+vxHc35P55yNL5Agu/m2xfO0iosu5er8w37PweF0+ty1\na9fFqlrg7ndfDhY/g/fT/cfOU3eJyHk+bCUUdK3Bf1NHREKAl4BhJ6tBVd/C2R2VmJioSUlJJ1uk\nQCkpKRR32fLK+vw/3y3dzIUzhnJh6AqOXvxPRl3Yo/SL8xP7PQcHf/XZl+3hK4GzVdUD3oFqgCXA\nyYJgOxCfZ7o+sDPPdEWgFZAiIgC1gWQR6VXQVoExp+PAgX3UnDKQNqHryOk5hoqJdtKbMSf4ctYQ\nQJU8j3291n4h0FREGolIBDAQSD4xU1VTVbWGqiaoagIwD7AQMCVOVVn33q200vXsufQ1wiwEjPkD\nX4LgGWCJiLzvbA0sBp4+2UKqmgOMAqYDvwGfquoqERntHHMwplR8vng7d+7vww/txlD3vOvcLseY\nMqfIXUPi3WczBzgH6Ih3v//9qrrbl5Wr6jRgWr7nHi2kbZIv6zTGZwc3kzb7FZ5ceinNG53B5b3O\ncbsiY8qkIoNAVVVEpqhqB/Ls1jGmzNu7Bv3wajQtjXramuf7JdmoYsYUwpddQ/NEpKPfKzGmhMQe\n3Qjv9+DY8WyuzXyEYVddSny1wDhN1Bh/8OWsoa7ArSKyBUjHGalMVdv4szBjimXrPM5e+gjZ0dXo\ndeQ+Epq3ol9ifberMqZM8yUIrvB7FcaUlJBwMqLqcFfo3zlYIZbxfdrgnJ5sjClEUfcaigRuBZoA\nK4B3nTOBjCl79qyGuBZQvwN/r/QMszbl8MbgVtSsWMHtyowp84o6RvABkIg3BK4AXiiViow5VQve\nhjfOhVVTWLbtMFM359CnXT2uaG1jDBvji6J2DbVQ1dYAIvIusKB0SjLGR6ow+1lIeRptdgUTUlvw\n1KfzqVJBeKxXy5Mvb4wBig6C7BMPVDXH9rOaMsXjgW8fgAVvkta8PyNTb+CX5PWc27g6V9fLoHKU\njS5mjK+KCoK2zjgE4D1TKO+4BKqqlfxenTGF2ToXFrzJ8vjB9F95JeGh6fyzT2sGdIxn9uzZbldn\nTLlS1HgENkyTKXtUQYQ1ka15p/KLfL4+jm5nxfHk1a2oXdkGmjemOGw0DlN+ZBzE8+kNfB57HQ/9\nWpnKUQ14dVBLerapY6eIGnMaLAhM+XB4G56P+pC7fzMzstpzVdtr+HvPFlSLiXC7MmPKPQsCU/bt\nWY1+1IfMtFRuyrqfHlf14/ouCW5XZUzAsCAwZduBjeh73TmUFcbg449yY5+e9E+MP/lyxhifWRCY\nMi01qj7fy2W8nHkB9/XvRu+z67ldkjEBx4LAlE1LPuZwXGcGf76LdUf68Op17eneqrbbVRkTkCwI\nTNmiCinPwOx/kRJxJRsyhvZYsxMAABITSURBVPL29YkknVnL7cqMCVgWBKbsyMmCqXfBsk/4JuwS\nHs28jveGdeTcJjXcrsyYgGZBYMqGzFSYOAQ2/8i74QP5d9Y1vD+8Ex0aVnO7MmMCngWBKRsklOzM\ndF6MvIsPj53HRyM6c3Z8FberMiYoWBAYd+1ZBVUackQrMOT4o6xNO8YHNyVaCBhTiiwIjHvWfQef\nDSOn5bWM2H0dq3dn8Nb1HTjnjOpuV2ZMUPFl8HpjSt6isTB+IJ7qjblv3xUs/P0gLw04m4ubx7ld\nmTFBx7YITOny5MIPj8Mvr6BNLuM+/o8pKw/zTJ/WXNW2rtvVGROULAhM6UrfB8vGox1u4uHjQ5m0\naBcP9WjOoE4N3K7MmKBlQWD8IiMrh6wcDxFhIUSEhhCasReJqQUVa6O3zuHp2Qf4ZNEWRnVtwsgL\nG7tdrjFBzYLAlLil2w4z+O15pGflAtBe1vFWxIt84rmMt0P7Ex4awsH0LG7o0pB7L2vmcrXGGAsC\nU6KO5+Ty18+WUSkqnHsvO5OGO77iojVPc7RCLSKbXsu14fXJzvXQsHo0I84/wwaUMaYMsCAwJeqV\nGetZvzeN94d1IGnH2/Db89DwfKoO+JCR0XaVsDFlkZ0+akrM8u2H+c/sTfRPrE9S1YPw88vQ/noY\nOhksBIwps/waBCLSXUTWisgGEXmggPn3iMhqEVkuIjNEpKE/6zH+490ltJxGMVk8fGULiGsBt86B\nq16BMBtO0piyzG9BICKhwGvAFUALYJCItMjXbAmQqKptgM+BZ/1Vj/GvMTM3UHvfHL6RO6m86Wvv\nk7Wagx0DMKbM8+cWQSdgg6puUtUsYALQO28DVZ2lqhnO5Dygvh/rMX6ycvthPD++wHsRzxJeNR7q\nnu12ScaYUyCq6p8Vi/QFuqvqCGd6KNBZVUcV0n4MsFtVnyxg3khgJEBcXFyHCRMmFKumtLQ0YmNj\ni7VseeXvPmtWBsx9ia66gB01LmDjWaPwhEb67fV8Yb/n4GB9PjVdu3ZdrKqJBc3z51lDBe0TKDB1\nRGQIkAhcVNB8VX0LeAsgMTFRk5KSilVQSkoKxV22vPJ3n6eOf50enoWsO/sBml39APXKwK4g+z0H\nB+tzyfFnEGwH4vNM1wd25m8kIt2Ah4GLVPW4H+sxJenoblYdjeLuFQmsbD6OB6/p5XZFxphi8mcQ\nLASaikgjYAcwELgubwMRaQe8iXcX0l4/1mJKSm4OzHoSnf8mr0Q9R9WY2tzWt5vbVRljToPfgkBV\nc0RkFDAdCAXGquoqERkNLFLVZOA5IBb4zLnCdKuq2kfLsurITvh8OGz9heW1epOyNYYx17emSrSd\nHmpMeebXK4tVdRowLd9zj+Z5bB8ly4sNM2DSSDT7GNOajuaOFU3on1ifS1vY+AHGlHd2iwnjm40z\n0dhajKn+CC8sgQGJ8Tzdp7XbVRljSoAFgSnc0T2QtgfqtCGn66M8fPAqJi45wMgLz+DBK5rbDeOM\nCRAWBKZgG2fCpFsgsjKZI3/hLxNX8P3qA/z18jO5PamxhYAxAcSCwPxRdqZ3KMn5b0DN5mT0focR\n437ll40HGN27Jdd3SXC7QmNMCbMgMP+TthfG9Ya9q6HTLRw+72Fu+GglK3ek8tKAtlzTzu4AYkwg\nsiAwAGTnetiXHUNkxWZsanY3q6I78fHYpWw5kMF/hnSws4OMCWAWBEFq/Z6jvDF7Iwd2bmZo6ps8\nkjmY3VoN6A+rAFZRJTqc92/syLmNa7hcrTHGnywIgszvB9J5+Yf1TF66g6vDF/Ba2LtEkM3f2g0g\ns2Fr4ipVIK5SJLUrR1ItOoKQEDsobEygsyAIErtSj/HKjA18tmgbcSGpfFN7Is0PzYLa7eHad+hT\nvbHbJRpjXGJBEOCOHFdGT13NR/N/R1W5rnMDHvC8TfTKX+CSx+Dcv0BouNtlGmNcZEEQwCYs2Mpj\nP2aQ7dnM8Fbh3HRObeo0bgUZj8H5d0DNZm6XaIwpAywIAtSnC7fxwKQVtKoG73XcQs25T0NWW2g8\nzTuQvA0mb4xxWBAEoC+X7uD+Scvpl5DJQ8deoOrsVXBGkncgeWOMyceCIMB8u3I393y6jGF1tvHo\n3kfIlQjoNQbaDbGB5I0xBbIgCCCz1uzhyfE/0KZ+I+69YSjy8w4WaHvObX+N26UZY8owC4IAsXTR\nz0Qn38ekCvuoMHgRsTExcNkTZKWkuF2aMaaMsyAo744dZk/y47Ra/QEZoTGEXvIYMRUrul2VMaYc\nsSAozw5vI/s/SdQ8doCvwi+ny8iXqFmrrttVGWPKGQuCMi4n18POw5nsOZrJ7tRM9qRmoHtWsyIn\nnt2px7jqWEdSoi7hyduGULNylNvlGmPKIQuCMuyH1Xt4LHkVOw4fA5SLQ5bw17CJNJS9DIp5kwqV\narOk5QM83q0ZdSwEjDHFZEFQBu1KPcbjyauYvmoPZ8ZV5N2kLBI3vkrlfYvJrdKIkEve4MuWvSEk\nxO1SjTEBwIKgDMn1KOPmbuH56WvJVeX+7s0Z0RLCX+sFFWtDz38T2m6I3RvIGFOiLAjKiBXbU3lo\n8gpW7TjE3fXXcn2jNConXeGdOfAT75XBEdFulmiMCVAWBC47nJHFKzM2MP6XtVwf9QsTqn9LzP6t\noE0h+34Ij4LmPdwu0xgTwCwIXLJpXxpjf97MF4t3cHbuchbGvE5sziGo3B6ufBKa94SQULfLNMYE\nAQuCUqSqzN14gHd/2kDu+hkcD4mmZ9uLGdm+MbHzf4Uud0DC+XZPIGNMqbIgKAXHc3JJXrqTr2bP\no/2haTwVNpvaEQc43vRKKvS729uo8QR3izTGBC0LAj9RVVbsSGXSrzuYumwndx9/g/fCZiJh4Dmj\nK3S4gQpn2r5/Y4z7LAhK2I7Dx/hu3lIOL/mS1hnzmOK5i3NbNKBT9cuQCh2RdkMIrRLvdpnGGPNf\nFgQl4EhmNikLV5K+4H2ap87hxpANABytGM9PAxtTsUEboIO7RRpjTCEsCIojN5uMbcvYsOgHvtlf\ni3e31eEMzxa+rfA+uyu14HDr+6nS7hoq1mxuB36NMWWeX4NARLoDLwOhwDuq+s988ysA4/B+XD4A\nDFDVLf6s6ZSpet/MPblk//AkqevmUPHAcqI1kzbA8pCrGdrlfnq27oxW6UXtyvXcrtgYY06J34JA\nREKB14BLge3AQhFJVtXVeZoNBw6pahMRGQj8Cxjgr5ry8uR6SM84SnpGBmkSS9rxXMK2zCZ0/xrC\nU7cQlfY7Menb2BPVmE8aPsmu1Ewe2vgJRzSK1WEXE9awM007duO6s1oSEmKf+o0x5Zc/twg6ARtU\ndROAiEwAegN5g6A38Ljz+HNgjIiIqmpJFzNx4VaiU15kb8qNROkxosmkoig7PfW5POtZAL6IeIIO\nIes5qlFs0TiWaF1+PdqAKYd2UiU6nPfOnkiPtvH0S6hGqL35G2MChPjhPde7YpG+QHdVHeFMDwU6\nq+qoPG1WOm22O9MbnTb7861rJDASIC4ursOECad+zv2SvTlU2TCJRrKLnNBIckOjyA2NIjOiKuuq\nJhEZCnG5uwmJiEIiqxAZFkJkGISHgJTj/fxpaWnExsa6XUapsj4HB+vzqenatetiVU0saJ4/twgK\nevfMnzq+tEFV3wLeAkhMTNSkpKRTLiYJSEkJozjLlmcpKSnW5yBgfQ4O/uqzP29ovx3Ie8J8fWBn\nYW1EJAyoDBz0Y03GGGPy8WcQLASaikgjEYkABgLJ+dokAzc4j/sCM/1xfMAYY0zh/LZrSFVzRGQU\nMB3v6aNjVXWViIwGFqlqMvAu8KGIbMC7JTDQX/UYY4wpmF+vI1DVacC0fM89mudxJtDPnzUYY4wp\nmg16a4wxQc6CwBhjgpwFgTHGBDkLAmOMCXJ+u7LYX0RkH/B7MRevAew/aavAYn0ODtbn4HA6fW6o\nqjULmlHuguB0iMiiwi6xDlTW5+BgfQ4O/uqz7RoyxpggZ0FgjDFBLtiC4C23C3CB9Tk4WJ+Dg1/6\nHFTHCIwxxvxZsG0RGGOMyceCwBhjglxABoGIdBeRtSKyQUQeKGB+BRGZ6MyfLyIJpV9lyfKhz/eI\nyGoRWS4iM0SkoRt1lqST9TlPu74ioiJS7k819KXPItLf+V2vEpFPSrvGkubD33YDEZklIkucv+8e\nbtRZUkRkrIjsdUZwLGi+iMgrzs9juYi0P+0XVdWA+sJ7y+uNwBlABLAMaJGvze3Af5zHA4GJbtdd\nCn3uCkQ7j28Lhj477SoCPwLzgES36y6F33NTYAlQ1Zmu5XbdpdDnt4DbnMctgC1u132afb4QaA+s\nLGR+D+AbvCM8ngPMP93XDMQtgk7ABlXdpKpZwASgd742vYEPnMefA5dIeR6Y2Ic+q+osVc1wJufh\nHTGuPPPl9wzwBPAskFmaxfmJL32+GXhNVQ8BqOreUq6xpPnSZwUqOY8r8+eREMsVVf2Rokdq7A2M\nU695QBURqXM6rxmIQVAP2JZnervzXIFtVDUHSAWql0p1/uFLn/MajvcTRXl20j6LSDsgXlW/Ks3C\n/MiX33MzoJmI/Cwi80Ske6lV5x++9PlxYIiIbMc7/slfSqc015zq//tJ+XVgGpcU9Mk+/zmyvrQp\nT3zuj4gMARKBi/xakf8V2WcRCQFeAoaVVkGlwJffcxje3UNJeLf6fhKRVqp62M+1+YsvfR4EvK+q\nL4hIF7yjHrZSVY//y3NFib9/BeIWwXYgPs90ff68qfjfNiIShndzsqhNsbLOlz4jIt2Ah4Feqnq8\nlGrzl5P1uSLQCkgRkS1496Uml/MDxr7+bX+pqtmquhlYizcYyitf+jwc+BRAVecCkXhvzhaofPp/\nPxWBGAQLgaYi0khEIvAeDE7O1yYZuMF53BeYqc5RmHLqpH12dpO8iTcEyvt+YzhJn1U1VVVrqGqC\nqibgPS7SS1UXuVNuifDlb3sK3hMDEJEaeHcVbSrVKkuWL33eClwCICJn4Q2CfaVaZelKBq53zh46\nB0hV1V2ns8KA2zWkqjkiMgqYjveMg7GqukpERgOLVDUZeBfv5uMGvFsCA92r+PT52OfngFjgM+e4\n+FZV7eVa0afJxz4HFB/7PB24TERWA7nAX1X1gHtVnx4f+3wv8LaI3I13F8mw8vzBTkTG4921V8M5\n7vEYEA6gqv/BexykB7AByABuPO3XLMc/L2OMMSUgEHcNGWOMOQUWBMYYE+QsCIwxJshZEBhjTJCz\nIDDGmCBnQWACgojUFpEJIrLRufPmNBFpJiJJIuLaLSZEJKWcX8RmgkDAXUdggo9zw8DJwAeqOtB5\n7mwgztXCTpOIhDn3wipw2tfljDkZCwITCLoC2c7FNgCo6lIAEUkCYkXkc7y3nFgMDFFVFZFHgauA\nKOAX4Bbn+RRgvrPeKsBwVf1JRIYBvYBooDEwWVX/5rzOZcA/gAp4b5t8o6qmFVawiHQAXsR7kd9+\nvBdB7XJe+xfgPLy3xGiN96LHdsCvIvIUMBbvbZkzgJGqulxEHgfqAgnO+q4r1k/SBCXbNWQCwYk3\n+MK0A/4P773qz8D7JgswRlU7qmorvGHQM88yYarayVnusTzPnw0MAFoDA0Qk3rmVwyNAN1VtDywC\n7imsGBEJB14F+qpqB7xv7E/laVJFVS9S1Rec6WbOuu/FGzZLVLUN8BAwLs9yHYDeqmohYE6JbRGY\nYLBAVbcDiMhSvJ+a5wBdReRveD/hVwNWAVOdZSY53xc77U+YoaqpzrpWAw3xbjW0AH52bt8RAcwt\nop4z8YbX9077UCDvvWIm5mv/marmOo/PB64FUNWZIlJdRCo785JV9VgRr2tMgSwITCBYhffmgYXJ\ne6fVXCBMRCKB1/GOWrbN2bUSWcAyufzx/+RP68J7W+DvVXWQj/UKsEpVuxQyP72I6aJuQZx/OWN8\nYruGTCCYCVQQkZtPPCEiHUWkqDEXTrzp7xeRWIoOkpOZB5wnIk2c144WkWZFtF8L1HTunY+IhItI\nSx9f60dgsLNcErBfVY8Uu3JjsCAwAcC50+Q1wKXO6aOr8I5aVeg92p2BWt4GVuC9dfPC03j9fXgH\nwBkvIsvxBkPzItpn4Q2ef4nIMmApcK6PL/c4kOi8zj/53+3UjSk2u/uoMcYEOdsiMMaYIGdBYIwx\nQc6CwBhjgpwFgTHGBDkLAmOMCXIWBMYYE+QsCIwxJsj9P43a5QgvTwSQAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(ThreeQubitBitFlipProtocol(), \n", - " num_experiments=1000, \n", - " num_points=41, \n", - " theoretical=lambda x:3*x**2*(1-x)+x**3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's look how cirquit for the whole protocol looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "aux_1: ────────────────────────────────────X───X───────@───X───X───@───────@───────@───────@───X───@───X───X───@───\n", - " │ │ │ │ │ │ │ │ │ │\n", - "aux_2: ────────────────────────────────────┼───X───X───@───────@───@───────X───X───@───X───X───────@───────@───@───\n", - " │ │ │ │ │ │ │ │ │ │ │\n", - " ┌ ┐ │ │ │ │ │ │ │ │ │ │ │\n", - "q_init: ───│ 0.793+0.j -0.609+0.j │───@───@───────X───────@───X───X───@───X───X───X───@───X───X───────@───X───\n", - " │-0.458-0.401j -0.597-0.523j│\n", - " └ ┘\n" - ] - } - ], - "source": [ - "data = {}\n", - "test_protocol_once(ThreeQubitBitFlipProtocol(), BitFlipChannel(0.3), output=data)\n", - "print(data['circuit'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Three qubit phase-flip code\n", - "\n", - "Now we have a channel which with probability $p$ changes qubit $a |0>+ b |1>$ to $a|0> - b |1>$ (that is, applies gate Z), and w.p. (1-p) leaves it unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class PhaseFlipChannel:\n", - " def __init__(self, flip_prob):\n", - " self.flip_prob = flip_prob\n", - " \n", - " def transmit(self, ct, q):\n", - " if np.random.rand() < self.flip_prob:\n", - " ct.append(cirq.Z(q))\n", - " return q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see that using three qubit bit flip protocol doesn't give any error correction." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3hUVfrA8e+bQhIgBGmhBAgl9J5I\nR4OCYgF2WRSxLTZERd2fuoquggVXd9e2iq6yqFgQVCygoqBiBEF6DzU0ifROgPT398cMbAgpk3Jn\nksz7eZ48mTv33HvfM5PMO/ece88RVcUYY4z/CvB1AMYYY3zLEoExxvg5SwTGGOPnLBEYY4yfs0Rg\njDF+zhKBMcb4OUsEplwQkWgRUREJymf9YyIyqQj7e1JEPixgfaKIxBdhfy1FZKWInBCR+0RksoiM\nd6/rIyKbPN1XRSAiCSJyu6/jMJ6xRGBKREQ+FJE9InJcRDb76p9fVf+uqre7YyowaXi4v7aqmuDe\nX4FJw+1hIEFVw1X11Vz7mq+qLYsbS2nysC7Gz1giMCX1HBCtqtWAQcB4EYn1cUy+0BhI9GUA4mL/\n06bI7I/GlIiqJqpq2plF90+zvMqKSKCIvCAiB0Vkm4jck/Obu4jsEJF+Ocrn9e31VhHZ7T4LeTCf\nsvPcv4+KSIqI9Mgn/FAR+djdnLNCRDrm2N8OEeknIgOAx4Bh7n2tzqNec4G+wAR3mRa51seLSHKu\nfT8qIutF5IiIvCsiofm8ZiNEZIGIvCYix0Rko4hcmmN9gog8KyILgFNAUxGpLyIzReSwiCSJyB3u\nsnnWJb/y7nWB7ma3re7XabmINHSv6ykiS91xLRWRnvm8zqaMs0RgSkxE3hCRU8BGYA8wK5+idwBX\nA52BOGBoMQ7XF4gBLgPG5EwcOVzk/l1dVauq6q/57Gsw8ClQA/gI+FJEgnMWUNXvgL8DH7v31TH3\nTlT1EmA+MNpdZrMH9bgBuBxX0mwBPF5A2W7ANqAWMA74XERq5Fh/EzASCAd2AlOBZKA+rtf47yJy\naQF1ybO8e90DwHDgSqAacCtwyn38b4BXgZrAS8A3IlLTg7qbMsYSgSkxVb0b14dQH+BzIC2fotcC\nr6jqLlU9jKtZqaieUtWTqroWeBfXh1RxLVfV6aqageuDLBToXoL9FcWEHK/DsxRcj/24XrcMVf0Y\n2ARclWP9ZPeZWSZQF+gNPKKqqaq6CpiEK1mcx/3tvqDytwOPq+omdVmtqofcx9+iqh+oaqaqTsX1\nRWBg8V4O40uWCEypUNUsVf0FiALuyqdYfWBXjuWdxThU7u3rF2Mf5+1LVbP537dibyhKPX7Xc0eH\nzF0+577qA4dV9USu8g3y2Xdh5RsCW/PZLvf7V9BxTBlmicCUtiDy6SPA1WzUMMdyo1zrTwKVcyzX\nzWMfubffnUcZT4fUPbsvdydrVAn3VxSe1OOMBiIiBZTPGd9uoIaIhOcq/3seZT0pv4u838/duDrI\nc8q5nSlHLBGYYhOROiJynYhUdXcqXo6riWNuPpt8AtwnIlEicgEwJtf6VcB1IhIsIvn1ITwhIpVF\npC1wC/BxHmUOANlA00KqECsiQ9yd1X/B1aS1KI9y+4DoUr4i5x7361ADVwduXvU4ow6u1y1YRK4B\nWpNPP4yq7gIWAs+JSKiIdABuA6a4i5xTFw/KTwKeEZEY91VJHdz9ALOAFiJyvYgEicgwoA3wdXFf\nEOM7lghMSSiuZqBk4AjwAvAXVZ2RT/n/ArOB1cAKXP0JOT2B69vnEeApXB24uf0MJAE/Ai+o6pzz\nglI9havdfYGIHBWR/Nr9ZwDD3Me7CRji7i/I7VP370MisiKffRXVR8AcXJ3A24DxBZRdjKuD/CCu\neg11t9PnZzgQjetb+xfAOFX93r0ur7oUVP4lXAl8DnAceBsIcx//auBB4BCu+yiuVtWDhVXclD1i\nE9MYXxGRaGA7EOzu6PQLIrIDuF1Vf/Cg7Ah32d5Ox2X8l50RGGOMn7NEYIwxfs6ahowxxs/ZGYEx\nxvi5Yo/O6Cu1atXS6OjoYm178uRJqlSpUroBlXFWZ/9gdfYPJanz8uXLD6pq7bzWlbtEEB0dzbJl\ny4q1bUJCAvHx8aUbUBlndfYPVmf/UJI6i0i+d/Jb05Axxvg5SwTGGOPnLBEYY4yfK3d9BHnJyMgg\nOTmZ1NTUAstFRESwYcMGL0VVNjhV59DQUKKioggODi68sDGmTKsQiSA5OZnw8HCio6M5d5DGc504\ncYLw8PB811dETtRZVTl06BDJyck0adKkVPdtjPE+x5qGROQdEdkvIuvyWS8i8qp7arw1ItKluMdK\nTU2lZs2aBSYBU3pEhJo1axZ6BmaMKR+c7COYDAwoYP0VuEZUjME1zd5/SnIwSwLeZa+3MRWHY4lA\nVecBhwsoMhh43z393SKguojUcyoeY4wpr7KzlWe/Wc+elGxH9u/LPoIGnDvFXrL7uT25C4rISFxn\nDURGRpKQkHDO+oiICE6cOJF7s/NkZWV5VK44qlevTtu2bc8u/+lPf+KBBx5w5FgAs2bNYuPGjYUe\noyR1nj9/PpUqVaJbt255rk9NTT3vvSgLUlJSymRcTrI6V2y//J7BpLXp3BijjtTZl4kgr7aFPEfA\nU9WJwESAuLg4zX1n3YYNGzzqEHWyszgsLIw1a9Y4su/cMjMzGTZsmEdlS1LnJUuWULVqVfr165fn\n+tDQUDp37lysfTvJ7jj1D/5S5+OpGTz0ws90blSdS5qmO1JnX95HkMy587bmN19suXXs2DFatmzJ\npk2bABg+fDj//e9/AahatSoPPvggXbp04dJLL+XAgQMAbN26lQEDBhAbG0ufPn3YuHEjACNGjOCB\nBx6gb9++PPLII0yePJnRo0efXXfXXXfRt29fmjZtys8//8ytt95K69atGTVq1Nl45syZQ48ePejS\npQvXXHMNKSkpgGvYjnHjxtGlSxfat2/Pxo0b2bFjB2+++SYvv/wynTp1Yv78+V573Ywx//PvH7Zw\n6GQaTw9qR4BDfXO+PCOYCYwWkWlAN+CYqp7XLFRUT32VyPrdx/Ncl5WVRWBgYJH32aZ+NcYNbFtg\nmdOnT9OpU6ezy48++ijDhg1jwoQJjBgxgvvvv58jR45wxx13AK7Bo7p06cKLL77I008/zVNPPcWE\nCRMYOXIkb775JjExMSxevJi7776buXNdUwBv3ryZH374gcDAQCZPnnzO8Y8cOcLcuXOZOXMmAwcO\nZMGCBUyaNInY2FhWrVpFVFQU48eP54cffqBKlSr84x//4KWXXmLs2LEA1KpVixUrVvDGG2/wwgsv\nMGnSJEaNGkXVqlV56KGHivyaGWNKbvO+E0xeuIPrLmxE+6gIEpKcOY5jiUBEpgLxQC0RSQbGAcEA\nqvomrsmvr8Q1/+wpXBORl1thYWGsWrXqvOf79+/Pp59+yj333MPq1avPPh8QEHC2eefGG29kyJAh\npKSksHDhQq655pqz5dLS0s4+vuaaa/JNZAMHDkREaN++PZGRkbRv3x6AVq1asWPHDpKTk1m/fj29\nevUCID09nR49epzdfsiQIQDExsby+ee5pxI2xnibqvLkzESqhgTx18tbOnosxxKBqg4vZL0C95T2\ncQv65u6LG8qys7PZsGEDYWFhHD58mKioqDzLiQjZ2dlUr149z4QCFDj8bEhICOBKMGcen1nOzMwk\nMDCQ/v37M3Xq1AK3DwwMJDPTb6YPNqbMmrV2Lwu3HuKZwW2pUaWSo8eysYYc9vLLL9O6dWumTp3K\nrbfeSkZGBuBKENOnTwfgo48+onfv3lSrVo0mTZrw6aefAq5vBDnPIkqie/fuLFiwgKQk17nlqVOn\n2Lx5c4HbhIeHO3aVlTEmf6fSM3n2m/W0qVeN67s1dvx4lghKyZk+gjM/Y8aMYfPmzUyaNIkXX3yR\nPn36cNFFFzF+/HjA9e0+MTGR2NhY5s6de7atfsqUKbz99tt07NiRtm3bMmPGjFKJr3bt2kyePJnh\nw4fToUMHunfvfrYjOj8DBw7kiy++sM5iY7zsjZ+2svtYKk8NbktggBdu3lTVcvUTGxurua1fv/68\n5/Jy/Phxj8p5Q5UqVbxyHCfr7Onr7m0//fSTr0PwOqtzxbH9QIrGPDZL/zJt5XnrSlJnYJnm87lq\nZwTGGFOGPPP1eoIDhUevaOW1Y1oi8JEz1/AbY8wZczfu48eN+7m/Xwx1qoV67bgVJhG4znyMt9jr\nbUzpSs3I4qmv1tOsdhVG9PTu8O4VIhGEhoZy6NAh+3DyEnXPRxAa6r1vLMZUdG//sp2dh07x5KC2\nVAry7kdzhZiYJioqiuTk5LPDNOQnNTXV7z68nKrzmRnKjDElt/voaSbMTWJA27r0iant9eNXiEQQ\nHBzs0UxZCQkJZXKQNCf5Y52NKW+enbWBbFUev7q1T45fIZqGjDGmvFqYdJBv1uzh7vjmRF1Q2Scx\nWCIwxhgfycjK5smvEmlYI4w7L27qszgsERhjjI+8/+tONu9L4Ymr2hAaXPSRkUuLJQJjjPGBAyfS\neOX7zVzcojb920T6NBZLBMYY4wP/+G4jqZlZjBvYBnFowhlPWSIwxhgvW77zCNOXJ3Nb76Y0rV3V\n1+FYIjDGGG/KynZNOBNZLYR7L2nu63AASwTGGONVHy/dxdrfj/G3q9pQJaRs3MplicAYY7zk6Kl0\n/jV7I92a1GBgh3q+DucsSwTGGOMlL87ZzPHUTJ4c1NbnHcQ5WSIwxhgvWL3rKFMW7+Sm7o1pXa+a\nr8M5hyUCY4xx2NFT6dw9ZQX1IsL4v/4tfB3OecpGT4UxxlRQ2dnK/328iv0nUvl0VE8iwoJ9HdJ5\n7IzAGGMc9EZCEj9tOsDYq9vQqWF1X4eTJ0sExhjjkF+2HOTF7zczuFN9buze2Nfh5MsSgTHGOGDP\nsdPcN20lzWtX5bkh7cvUVUK5WSIwxphSlp6ZzT1TVpCWkcV/boylcqWy3R1btqMzxphy6LlvN7Di\nt6NMuL4zzev4fiyhwtgZgTHGlKKv1+zm3QU7GNEzmqs71Pd1OB6xRGCMMaUkaX8Kj0xfQ5dG1Xns\nSt/MP1wclgiMMaYUnErP5O4pywkJDuT1G7pQKaj8fLxaH4ExxpSQqvLY52vZsj+FD27tRr2IMF+H\nVCSOpiwRGSAim0QkSUTG5LG+kYj8JCIrRWSNiFzpZDzGGOOEDxf/xperdvNAvxb0jqnl63CKzLFE\nICKBwOvAFUAbYLiItMlV7HHgE1XtDFwHvOFUPMYY44RVu47yzFfr6duyNvf0LRsTzRSVk2cEXYEk\nVd2mqunANGBwrjIKnBmGLwLY7WA8xhhTqo6cTOeeKSuoHR7Cy8M6ERBQdm8aK4ioqjM7FhkKDFDV\n293LNwHdVHV0jjL1gDnABUAVoJ+qLs9jXyOBkQCRkZGx06ZNK1ZMKSkpVK1a9q/pLU1WZ/9gdfa+\nbFVeXp7GhkNZ/K17KE0iAh0/Zknq3Ldv3+WqGpfXOic7i/NKjbmzznBgsqq+KCI9gA9EpJ2qZp+z\nkepEYCJAXFycxsfHFyughIQEirtteWV19g9WZ+/79w9bWHtwM+P/0M5r4wg5VWcnm4aSgYY5lqM4\nv+nnNuATAFX9FQgFyl9PizHGr8zbfIBXftzMHzs34IZujXwdTok5mQiWAjEi0kREKuHqDJ6Zq8xv\nwKUAItIaVyI44GBMxhhTIruPnub+aSuJqVOVZ//YrkwPJucpxxKBqmYCo4HZwAZcVwclisjTIjLI\nXexB4A4RWQ1MBUaoU50WxhhTQumZ2dw9ZQUZWVouBpPzlKO1UNVZwKxcz43N8Xg90MvJGIwxprT8\nfdYGVu06yhs3dKFZ7YrTOV9+7oE2xhgfmrl6N5MX7uDWXk24sn09X4dTqiwRGGNMIZL2n2DMZ2uI\nbXwBj17ZytfhlDpLBMYYU4CTaZmM+nAFYcGBvH59F4IDK97HZsXo6TDGGAeoKo9+vpZtB1L48LZu\n1I0I9XVIjqh4qc0YY0rJ+7/uZObq3Tx4WUt6Nq+4tzhZIjDGmDys+O0I479Zz6Wt6nDXxc18HY6j\nLBEYY0wuh0+mM3rKCiKrhfLSteV3MDlPWR+BMcbkkJWt3D9tJQdT0vnsrp5EVA72dUiOs0RgjDE5\nvPrjFuZvOcjf/9ie9lERvg7HK6xpyBhj3BI27efVuVsY0qUBw7s2LHyDCsISgTHGAL8fPc1fPl5F\ny8hwnv1D+woxmJynLBEYY/xeWmYWd09ZQZZ7MLmwSs5PMlOWWB+BMcbvPfvNBlbvOsqbN3ahSa0q\nvg7H6+yMwBjj12as+p33f93JHX2aMKBdxRpMzlOWCIwxfmvLvhOM+WwtF0ZfwMMDKt5gcp6yRGCM\n8UspaZmM+nA5VUKCmFBBB5PzlP/W3Bjjt1SVMZ+tYfvBk7w2vDOR1SrmYHKeskRgjPE77y3cwddr\n9vDQ5S3p0aymr8PxOUsExhi/suK3Izw7awP9Wkcy6qKKPZicpywRGGP8xvHUDO79aCV1I0J58dqO\nFX4wOU/ZfQTGGL/x5IxE9h5PZfqoHkSEVfzB5DxV4BmBiASIyDpvBWOMMU75Zs0ePl/5O6P7Nqdz\nowt8HU6ZUmAiUNVsYLWINPJSPMYYU+r2HkvlsS/W0qlhdUZf0tzX4ZQ5njQN1QMSRWQJcPLMk6o6\nyLGojDGmlGRnKw99upr0zGxeHtbJr+8XyI8nieApx6MwxhiHTF64g1+SXPML+OM4Qp4oNBGo6s8i\nEglc6H5qiarudzYsY4wpuc37TvD8dxu5tFUdv5pfoKgKPUcSkWuBJcA1wLXAYhEZ6nRgxhhTEumZ\n2fxl2irCQ4J4/k8d/Gp+gaLypGnob8CFZ84CRKQ28AMw3cnAjDGmJF76fjPr9xxn0s1x1A4P8XU4\nZZonvSYBuZqCDnm4nTHG+MTibYd4a95WhndtRL82kb4Op8zz5IzgOxGZDUx1Lw8DZjkXkjHGFN/x\n1Awe+GQ1jWtU5vGrWvs6nHKh0G/2qvpX4C2gA9ARmKiqj3iycxEZICKbRCRJRMbkU+ZaEVkvIoki\n8lFRgjfGmNzO3D388rBOVAmxwRM8UeCrJCKBwGxV7Qd8XpQdu7d9HegPJANLRWSmqq7PUSYGeBTo\npapHRKROUStgjDFnnLl7+P5LY+zu4SIo7M7iLOCUiEQUY99dgSRV3aaq6cA0YHCuMncAr6vqEffx\n7LJUY0yxnLl7uKPdPVxknpw3pQJrReR7zr2z+L5CtmsA7MqxnAx0y1WmBYCILAACgSdV9bvcOxKR\nkcBIgMjISBISEjwI+3wpKSnF3ra8sjr7B3+vc7YqLy5L5XR6NsOj01gwf55vg3OIU++zJ4ngG/dP\nUeV10a7mcfwYIB6IAuaLSDtVPXrORqoTgYkAcXFxGh8fX4xwICEhgeJuW15Znf2Dv9f53QXbSTy0\nnmf/2I7rujX2bWAOcup99qSPoL+q3liMfScDOW/liwJ251FmkapmANtFZBOuxLC0GMczxvihzftO\n8Ny3rruHr+9q42MWhyd9BLVFpFIx9r0UiBGRJu7trwNm5irzJdAXQERq4Woq2laMYxlj/JDdPVw6\nPGka2gEsEJGZnNtH8FJBG6lqpoiMBmbjav9/R1UTReRpYJmqznSvu0xE1gNZwF9V9VDxqmKM8Td2\n93Dp8CQR7Hb/BADhRdm5qs4i181nqjo2x2MFHnD/GGOMxzYdzuKtpVsZ3rWh3T1cQp6MPvoUgIhU\nUdWThZU3xhinHU/NYOKaNPfdw218HU6558nooz3cTTcb3MsdReQNxyMzxpg8qCpjv1zHkTTlJbt7\nuFR4MnjcK8DluAabQ1VXAxc5GZQxxuRFVfnHd5v4ctVuBjcLpovdPVwqPEqlqrorV298ljPhGGNM\n/l79MYk3f97KDd0a0a/6QV+HU2F4ckawS0R6AioilUTkIdzNRMYY4y1v/byVl3/YzNDYKJ4Z3M4u\nFS1FniSCUcA9uIaMSAY6uZeNMX5s9a6jTJi7hZNpmY4f672FO3ju241c3aEe//hTBwICLAmUJk+u\nGjoI3OCFWIwx5cCBE2n887uNfLo8GYAvV+3mzRtjaV6nqiPH+3jpb4ybmUj/NpG8PKwTgZYESp11\ntxu/p6ps3pfCwq0HOXAijfiWdYhtfIF94OSSnpnNewt38OqPW0jNzOLOi5pyYXQNHvlsDYMn/MIL\n13Tkivb1SvWYM1b9zpjP13Jxi9pMuL4zwYE2OaITLBEYv/TboVMs3HqQBVsP8evWgxxMSQcgMEB4\nI2ErtcNDuKxNJFe2r0e3JjUI8vMPoIRN+3n66/VsO3CSvi1r88TVbWha23UG8HWD3tz14QrumrKC\nkRc15eHLW5bK6/Xt2j088MlqujepyVs3xRISFFjifZq8WSIwfmH/8VR+3XaIBUkHWbj1EMlHTgNQ\nJzyE3s1r0bN5LXo2q0n1ypX4aeN+vlu3l89X/M6Uxb9xQeVg+reJ5Ip29ejZvKZffSDtOHiS8d+s\n54cN+2lSqwrvjIjjklbn3sVbLyKMj+/szvivNzBx3jbWJB/lteFdSjTkw9yN+7hv2ko6RkUw6c9x\nhAb7z2vuC/kmAhEpcNiHwsYaMsaXjp3KYNH2Qyx0f/Bv2Z8CQLXQIHo0q8nIi5rSs1lNmtWuet7V\nJwM71mdgx/qcTs/i580H+G7dHr5du5dPliUTHhLEpa3rMKBdPS5uUZuwShXzA+pkWiYTfkri7fnb\nCQ4UHr2iFbf0akKloLy/6YcEBfLMH9rRuVF1HvtiLVe/Np83buhCbOMaRT72gqSDjPpwBa3qVmPy\nrV3thjEvKOgVLtK4Qsb4kqqSuPs4sxP38vWy0+ycPYdshbDgQC5sUoOhsVH0bFaLNvWredz2H1Yp\nkAHt6jKgXV3SMrNYmHSIb9ftYc76fXy5ajdhwYH0bVWbAe3qcUmrOlStAB9YqsqMVbt57tsN7Due\nxp+6RPHIgJbUqRbq0fZDukTRul41Rn24nGFvLeKJq9twc4/GHl/quWT7YW5/bxlNa1Xh/Vu7Ui00\nuCTVMR7K9y/3zBhDxpRVqsqqXUf5bt1evl23l98OnyJAoHn1AO69JIZezWvRqWH1fL/FFkVIUCB9\nW9Whb6s6PJuVzeJth/l23R5mJ+5j1tq9VAoKoHvTmoSHFi8ZBIowsGN9+rWu47Pr49cmH+PJrxJZ\nvvMIHaIi+M+NscW6c7d1vWrMHN2bBz9ZxbiZiaz47QjPDWlP5UoFvzardh3l1slLqVc9lA9u68YF\nVYoz+r0pjkL/akUkCngN6IVrhrFfgPtVNdnh2Iw5T1a2smzHYb5dt5fZiXvZcyyV4EChZ7Na3B3f\njP5tIlm77Ffi41s4FkNwYAC9Y2rRO6YWTw9ux/KdR/h23R5+3XqI349kF2ufx1Mzmbl6Nxe1qM3Y\nq9s4dilmXg6lpPHCnE1MW7qLmlUq8c+hHRjaJapE1+pHhAUz8aY4/vPzVl6Ys4mNe07w5k2xNKlV\nJc/yibuPcfPbi6lRpRIf3d7dhpT2Mk++vrwLfARc416+0f1cf6eCMianjFzfwA+mpFEpKICLYmrz\n18tbcmnrSCLCfNOEEBggdG1Sg65Nit4WnlNGVjYfLtrJS99vZsAr8xjRM5r7+sU42jRy7FQGHy7e\nyZs/b+V0eha39WpSqscMCBDu6ducDlER3Dd1JYNe+4UXru3I5W3rnlNuy74T3PT2EqqGBDHl9m7U\njfCsGcqUHk8SQW1VfTfH8mQR+YtTARkDnG2Tn7V2D99v2MfRUxlUrhRI35Z1GNCuLn0rSJv8GcGB\nAdzSqwmDOtbnhTmbeXvBdr5c9TsPX96KobEl+3ae267Dp3hnwXY+XrqLU+lZ9G1Zm79d5dxZSJ+Y\n2nx9Xx/u+nA5d36wnLvim/Fg/xYEBQaw/eBJrp+0mMAAYcod3WlYo7IjMZiCefKfdFBEbgSmupeH\n4x6J1BhPqSqpGdkcT83g2GnXz/Fzfme6HqdmcORkOku2H+ZEWibhoUH0ax3JgHZ1ubhF7Qp/GWHN\nqiE8N6Q9N3RrxLiZiTz82RqmLN7JuEFtSzzS5trkY0ycv41Za/cgwKCO9bnjoqa0rletdIIvQIPq\nYXw6qgdPfbWe/yRsZfWuozwyoBV3fbicrGzl45Hd8202Ms7zJBHcCkwAXsbVR7DQ/ZwxeTpwIo2n\nv15P8pFTZz/oj5/OJD2r4PbzqiFBVAsNolpYMFe0r8sV7evRq1mtUunsLW/aNYhg+qgezFy9m7/P\n2sCQNxYypEsDxgxo5fEVPADZ2crPmw8wcd42ft12iPCQIG7v3YQRvaKpFxHmYA3OFxIUyN//2J7O\nDavz+JfrGPz6AqqFBjF1ZHdiIu0iRV/yZKyh34BBXojFVABHTqZz09uL2XHoJBdG16B+9TAiwoKp\nFhpMRJjrp1pY0HnPhYcG+f3du7mJCIM7NaBf60he/ymJSfO3M3vdXu69NIZbekUXeGNbWmYWM1bu\n5r/zt7Flfwr1IkL525Wtua5rQ8J9fEnmNXENaV2vGv/+cQv39G1O2/oRPo3HeHbV0Hu4rhI66l6+\nAHhRVe2swJzjeGoGN7+zhG0HT/LuiAvp1byWr0OqEKqEBPHwgFZcG9eQ8d9s4PlvN/Lx0l2MvboN\nfVvVOafsmQ7gyQt3cOBEGq3rVePlYR25ukP9MjVOT7sGEfz35jhfh2HcPGka6nAmCQCo6hER6exg\nTKYcOpmWyS3vLmXj3uNMvCnOkoADomtVYdKf486O+3PL5KVnx/05cCqbp75KPNsB3CemFi9f24le\nzWvauP2mUJ4kggARuUBVjwCISA0PtzN+IjUji9veW8qqXUeZMLzzed9STemKb1mHns1q8f6vO3jl\nhy1c/so8srKVANnp1Q5gU3F48oH+IrBQRKa7l68BnnUuJFOepGVmcecHy1m8/TCvDOtU6sMQm7xV\nCgrg9j5NGdypAf9J2Mre3ck8cV0fr3cAm4rBk87i90VkGXCJ+6khqrre2bBMeZCRlc3oj1by8+YD\n/PNPHRjcqYGvQ/I7tcNDGDuwDQkJ+y0JmGLztPcoGJAcj42fy8pW/u/jVXy/fh9PDWrLtRc29HVI\nxphiKjQRiMj9wBSgFlAH+FLGCSgAABUGSURBVFBE7nU6MFN2ZWcrD09fw9dr9vDoFa34c89oX4dk\njCkBT/oIbgO6qepJABH5B/ArroHojJ9RVZ6YsY7PViTzf/1acOfFzXwdkjGmhDxpGhIgK8dyFv9r\nJjJ+RFUZ/80Gpiz+jVEXN+O+S5v7OiRjTCnwdPTRxSLyhXv5D8A7zoVkyqoX52zm7V+2M6JnNI8M\naGnXpxtTQXhy1dBLIpIA9MZ1JnCLqq50OjBTtkyYu4UJPyUxvGtDxg1sY0nAmArEkyEmPlDVm4AV\neTxn/MCk+dt4Yc5m/ti5AeP/0N6SgDEVjCd9BG1zLohIIBDryc5FZICIbBKRJBEZU0C5oSKiImKD\nj5QxHy7ayfhvNnBl+7r8a2gHj+f7NcaUH/kmAhF5VEROAB1E5LiInHAv7wdmFLZjd8J4HbgCaAMM\nF5E2eZQLB+4DFhezDsYh05cn8/iX67i0VR1eGdbZRgc1poLK9z9bVZ9T1XDgX6paTVXD3T81VfVR\nD/bdFUhS1W2qmg5MAwbnUe4Z4J9AanEqYJzx/fp9PDx9NX1iavH6DV38ck4AY/yFqGrhhUQGARe5\nFxNU9WsPthkKDFDV293LN+G6H2F0jjKdgcdV9U/uDumHVHVZHvsaCYwEiIyMjJ02bVqhMeclJSWF\nqlW9Nyl4WVCcOv9+IptnFp2mXtUAxnQNJSSwfDUH2fvsH6zORdO3b9/lqppn87snncXP4fp2P8X9\n1P0i0suDs4K8Pj3OZh0RCcA169mIwmJQ1YnARIC4uDiNj48vbJM8JSQkUNxty6ui1vnoqXTGvb6A\n8MohTL27d7mcSNzeZ/9gdS49ntxHcBXQSVWz4exENSuBwhJBMpBzAJooYHeO5XCgHZDgvgqlLjBT\nRAbldVZgnJeZlc29U1ey++hppo3sXi6TgDGm6Dxt+K2e47Gn88otBWJEpImIVAKuA2aeWamqx1S1\nlqpGq2o0sAiwJOBD/5y9iflbDjL+D+2IbVzD1+EYY7zEkzOC54CVIvITruaeiyj8bABVzRSR0cBs\nIBB4R1UTReRpYJmqzix4D8abvlz5OxPnbePmHo0ZdmEjX4djjPGiAhOBuNpsfgG6AxfiSgSPqOpe\nT3auqrOAWbmeG5tP2XhP9mlK35rkozzy2Rq6NanBE1efd4WvMaaCKzARqKqKyJeqGkuOZh1TcRw4\nkcadHyynVtUQ3rihS5ma4NwY4x2e/NcvEpELHY/EeF16ZjZ3fbicI6fSmXhzLDWrhvg6JGOMD3jS\nR9AXGCUiO4CTuJqHVFU7OBmYcd64mYks23mE14Z3pm19T68BMMZUNJ4kgiscj8J43YeLdjJ1yW/c\nFd+MgR3r+zocY4wP5ZsIRCQUGAU0B9YCb6tqprcCMy6qWuqjfS7ZfpgnZybSt2VtHrqsZanu2xhT\n/hR0RvAekAHM538Dx93vjaCMS1pmFsPeWsTRU+nc1rsJQ2MbElYpsET7/P3oae76cDmNalTm38M7\n22iixpgCO4vbqOqNqvoWMBTo46WYjNvz325k1a6jhAYH8sSMRHo+/yMvfb+Zgylpxdrf6fQs7vxg\nGemZ2Uy8OY5qocGlHLExpjwqKBFknHlgTULe9/36fby7YAe39Irm2/v78MmdPYhtXINXf9xCr+fn\n8tgXa9l2IMXj/akqj3y2hsTdx/n38E40r+Nfg3UZY/JXUNNQRxE57n4sQJh7+cxVQ9Ucj85P7Tl2\nmr9OX03b+tUYc0UrRISuTWrQtUkNkvan8PYv25i+PJmpS36jf+tIRl7UlNjGFxTYlzBx3jZmrt7N\nXy9vySWtIr1YG2NMWZdvIlDVkjVGm2LJylbun7aK9MxsXhvemZCgc9+G5nWq8tyQDjzQvyXv/7qD\nDxbtZM76fXRuVJ2RfZpyWdu657X7J2zaz/PfbeSqDvW4O76ZF2tjjCkP7DbSMua1uVtYsv0w4//Q\njqa182++qR0ewoOXtWThmEt4enBbDqWkc9eUFVzyYgIf/LqD0+lZAOw96RpRtFXdavxraAebb9gY\ncx5P7iMwXrJo2yFe/XELQ7o0YEiXKI+2qVwpiJt7RHNDt8bMTtzLW/O28cSMRF76fjM3dW/M9BWp\nBAUEMfGmWCpXsrfbGHM++2QoI46cTOcv01bRuGYVnhncrsjbBwYIV7avxxXt6rJ0xxEmztvGq3OT\nCBCYcnssDWtUdiBqY0xFYImgDFBV/jp9NYdPpvP5n3tSJaT4b0vOjuWtB1JIWLCYHs1qlmK0xpiK\nxvoIyoDJC3fww4b9PHplK9o1KL0xf5rVrkqz6tbnb4wpmCUCH1v3+zGem7WRfq3rMKJntK/DMcb4\nIUsEPpSSlsm9U1dSo0ol/jW0o13RY4zxCesj8KGxM9ax89BJPrqjOxdUqeTrcIwxfsrOCHzks+XJ\nfL7id+67NIbuTa0z1xjjO5YIfGDbgRSemLGOrk1qcO8lMb4Oxxjj5ywReFlaZhb3Tl1JpaAA/n1d\nJxsG2hjjc9ZH4GXPf7uRxN3HmXRzHPUiwnwdjjHG2BmBN50ZWnpEz2j6tbERQI0xZYMlAi/JObT0\no1e28nU4xhhzliUCLyhsaGljjPEl6yPwgjNDS790bccCh5Y2xhhfsDMCh23Yc9w1tHRnz4eWNsYY\nb7JE4CBVZdyMRCLCghk7sI2vwzHGmDxZInDQzNW7WbLjMA8PaEX1yjaEhDGmbLJE4JCUtEz+PmsD\nHaIiuDauoa/DMcaYfDmaCERkgIhsEpEkERmTx/oHRGS9iKwRkR9FpLGT8XjTa3O3sO94Gk8Namt3\nDxtjyjTHEoGIBAKvA1cAbYDhIpK7oXwlEKeqHYDpwD+disebth5I4Z1ftnNNbBSdG13g63CMMaZA\nTp4RdAWSVHWbqqYD04DBOQuo6k+qesq9uAgo95fVqCpPfbWe0OBAHh5gN44ZY8o+UVVndiwyFBig\nqre7l28Cuqnq6HzKTwD2qur4PNaNBEYCREZGxk6bNq1YMaWkpFC1qrPX8a/Yl8mrK9O4vlUlLosO\ndvRYnvBGncsaq7N/sDoXTd++fZeralxe65y8oSyvhvE8s46I3AjEARfntV5VJwITAeLi4jQ+Pr5Y\nASUkJFDcbT2RmpHF4y/9TMvIcJ6+qTdBgb7vi3e6zmWR1dk/WJ1Lj5OJIBnIeblMFLA7dyER6Qf8\nDbhYVdMcjMdxb/68leQjp5l6R/cykQSMMcYTTn5aLQViRKSJiFQCrgNm5iwgIp2Bt4BBqrrfwVgc\nt+vwKf6TsJWrO9SjRzObccwYU344lghUNRMYDcwGNgCfqGqiiDwtIoPcxf4FVAU+FZFVIjIzn92V\neeO/WU+ACH+7qrWvQzHGmCJxdNA5VZ0FzMr13Ngcj/s5eXxvmbf5ALMT9/HXy1vaZDPGmHLHGrJL\nKD0zmye/SiS6ZmVu79PE1+EYY0yR2TDUJfTugu1sO3CSd0dcaPMMGGPKJTsjKIF9x1N59cct9Gtd\nh76t6vg6HGOMKRZLBCXw3KwNZGQrT1xtQ0wbY8ovSwTFtGT7Yb5ctZs7L2pK45pVfB2OMcYUmyWC\nYsjMymbsjHU0qB7G3fHNfR2OMcaUiCWCYvhoyW9s3HuCx69qTVgl6yA2xpRvlgiK6FBKGi/M3kSv\n5jUZ0K6ur8MxxpgSs0RQRC/M2cSp9CyeHNgWEZtwxhhT/lkiKII1yUeZtnQXI3pGExMZ7utwjDGm\nVFgi8FB2tjJ2RiI1q4Rwf78YX4djjDGlxhKBh6avSGbVrqM8dmUrwkN9P+GMMcaUFksEHjh2KoN/\nfreR2MYX8MfODXwdjjHGlCoba6gQqsqYz9dw9FQGk2+xDmJjTMVjZwSF+GjJb3y7bi8PXd6Sdg0i\nfB2OMcaUOksEBdi09wRPf7WePjG1GNmnqa/DMcYYR1giyMfp9CxGf7SC8NBgXrq2EwEB1iRkjKmY\nrI8gH09/nUjSgRQ+uLUbtcNDfB2OMcY4xs4I8vDV6t1MXbKLURc3o3dMLV+HY4wxjrJEkMuuw6d4\n7PO1dG5UnQf6t/B1OMYY4zhLBDlkZGUzeupKEHj1us4EB9rLY4yp+KyPIIcX5mxi9a6jvHFDFxrW\nqOzrcIwxxivsK6/bvM0HeOvnbVzfrRFXtq/n63CMMcZrLBEA+0+k8sAnq2gZGc5Ym3/YGONn/L5p\nKDtbeeDj1aSkZfLRHd0JDbYZx4wx/sXvzwjenLeVX5IOMm5gW1rYHAPGGD/k14lg+c4jvDhnM1d1\nqMd1Fzb0dTjGGOMTfpsIjp3O4L6pK6kXEcpzQ9rbqKLGGL/ll30Eqsqjn69h3/FUPh3Vg2o20Ywx\nxo/55RnB1CW7mLXWNbR050YX+DocY4zxKb9LBJv2nuCprxJtaGljjHFzNBGIyAAR2SQiSSIyJo/1\nISLysXv9YhGJdjKetCy1oaWNMSYXxxKBiAQCrwNXAG2A4SKS+26t24AjqtoceBn4h1PxAEzdkE7S\ngRReGdbJhpY2xhg3J88IugJJqrpNVdOBacDgXGUGA++5H08HLhWHLt/5es1uEpIzbWhpY4zJxcmr\nhhoAu3IsJwPd8iujqpkicgyoCRzMWUhERgIjASIjI0lISChyMDsPZtGhhhJbaQ8JCXuLvH15lZKS\nUqzXqzyzOvsHq3PpcTIR5PXNXotRBlWdCEwEiIuL0/j4+CIHEw+0TUigONuWZwlWZ79gdfYPTtXZ\nyaahZCDn7bpRwO78yohIEBABHHYwJmOMMbk4mQiWAjEi0kREKgHXATNzlZkJ/Nn9eCgwV1XPOyMw\nxhjjHMeahtxt/qOB2UAg8I6qJorI08AyVZ0JvA18ICJJuM4ErnMqHmOMMXlzdIgJVZ0FzMr13Ngc\nj1OBa5yMwRhjTMH87s5iY4wx57JEYIwxfs4SgTHG+DlLBMYY4+ekvF2tKSIHgJ3F3LwWue5a9gNW\nZ/9gdfYPJalzY1WtndeKcpcISkJElqlqnK/j8Cars3+wOvsHp+psTUPGGOPnLBEYY4yf87dEMNHX\nAfiA1dk/WJ39gyN19qs+AmOMMefztzMCY4wxuVgiMMYYP1chE4GIDBCRTSKSJCJj8lgfIiIfu9cv\nFpFo70dZujyo8wMisl5E1ojIjyLS2BdxlqbC6pyj3FARUREp95caelJnEbnW/V4nishH3o6xtHnw\nt91IRH4SkZXuv+8rfRFnaRGRd0Rkv4isy2e9iMir7tdjjYh0KfFBVbVC/eAa8nor0BSoBKwG2uQq\nczfwpvvxdcDHvo7bC3XuC1R2P77LH+rsLhcOzAMWAXG+jtsL73MMsBK4wL1cx9dxe6HOE4G73I/b\nADt8HXcJ63wR0AVYl8/6K4Fvcc3w2B1YXNJjVsQzgq5AkqpuU9V0YBowOFeZwcB77sfTgUtFJK9p\nM8uLQuusqj+p6in34iJcM8aVZ568zwDPAP8EUr0ZnEM8qfMdwOuqegRAVfd7OcbS5kmdFajmfhzB\n+TMhliuqOo+CZ2ocDLyvLouA6iJSryTHrIiJoAGwK8dysvu5PMuoaiZwDKjpleic4Umdc7oN1zeK\n8qzQOotIZ6Chqn7tzcAc5Mn73AJoISILRGSRiAzwWnTO8KTOTwI3ikgyrvlP7vVOaD5T1P/3Qjk6\nMY2P5PXNPvc1sp6UKU88ro+I3AjEARc7GpHzCqyziAQALwMjvBWQF3jyPgfhah6Kx3XWN19E2qnq\nUYdjc4ondR4OTFbVF0WkB65ZD9uparbz4flEqX9+VcQzgmSgYY7lKM4/VTxbRkSCcJ1OFnQqVtZ5\nUmdEpB/wN2CQqqZ5KTanFFbncKAdkCAiO3C1pc4s5x3Gnv5tz1DVDFXdDmzClRjKK0/qfBvwCYCq\n/gqE4hqcraLy6P+9KCpiIlgKxIhIExGphKszeGauMjOBP7sfDwXmqrsXppwqtM7uZpK3cCWB8t5u\nDIXUWVWPqWotVY1W1Whc/SKDVHWZb8ItFZ78bX+J68IARKQWrqaibV6NsnR5UuffgEsBRKQ1rkRw\nwKtRetdM4Gb31UPdgWOquqckO6xwTUOqmikio4HZuK44eEdVE0XkaWCZqs4E3sZ1+piE60zgOt9F\nXHIe1vlfQFXgU3e/+G+qOshnQZeQh3WuUDys82zgMhFZD2QBf1XVQ76LumQ8rPODwH9F5P9wNZGM\nKM9f7ERkKq6mvVrufo9xQDCAqr6Jqx/kSiAJOAXcUuJjluPXyxhjTCmoiE1DxhhjisASgTHG+DlL\nBMYY4+csERhjjJ+zRGCMMX7OEoGpEESkrohME5Gt7pE3Z4lICxGJFxGfDTEhIgnl/CY24wcq3H0E\nxv+4Bwz8AnhPVa9zP9cJiPRpYCUkIkHusbDyXPZ0O2MKY4nAVAR9gQz3zTYAqOoqABGJB6qKyHRc\nQ04sB25UVRWRscBAIAxYCNzpfj4BWOzeb3XgNlWdLyIjgEFAZaAZ8IWqPuw+zmXAU0AIrmGTb1HV\nlPwCFpFY4CVcN/kdxHUT1B73sRcCvXANidEe102PnYEVIvIs8A6uYZlPASNVdY2IPAnUB6Ld+7u+\nWK+k8UvWNGQqgjMf8PnpDPwF11j1TXF9yAJMUNULVbUdrmRwdY5tglS1q3u7cTme7wQMA9oDw0Sk\noXsoh8eBfqraBVgGPJBfMCISDLwGDFXVWFwf7M/mKFJdVS9W1Rfdyy3c+34QV7JZqaodgMeA93Ns\nFwsMVlVLAqZI7IzA+IMlqpoMICKrcH1r/gXoKyIP4/qGXwNIBL5yb/O5+/dyd/kzflTVY+59rQca\n4zpraAMscA/fUQn4tYB4WuJKXt+7ywcCOceK+ThX+U9VNcv9uDfwJwBVnSsiNUUkwr1upqqeLuC4\nxuTJEoGpCBJxDR6Yn5wjrWYBQSISCryBa9ayXe6mldA8tsni3P+T8/aFa1jg71V1uIfxCpCoqj3y\nWX+ygOWChiDOvZ0xHrGmIVMRzAVCROSOM0+IyIUiUtCcC2c+9A+KSFUKTiSFWQT0EpHm7mNXFpEW\nBZTfBNR2j52PiASLSFsPjzUPuMG9XTxwUFWPFztyY7BEYCoA90iTfwT6uy8fTcQ1a1W+Y7S7J2r5\nL7AW19DNS0tw/AO4JsCZKiJrcCWGVgWUT8eVeP4hIquBVUBPDw/3JBDnPs7z/G84dWOKzUYfNcYY\nP2dnBMYY4+csERhjjJ+zRGCMMX7OEoExxvg5SwTGGOPnLBEYY4yfs0RgjDF+7v8Bl0NDzX6KNvMA\nAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(ThreeQubitBitFlipProtocol(), \n", - " num_points=21, \n", - " num_experiments=200,\n", - " channel_factory=lambda p:PhaseFlipChannel(p))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now recall that Z = HXH, and HZH = X. This means that if we put apply Hadamard gate before and after channel, this channel becomes bit-flip channel.\n", - "\n", - "So, we can use the same error-correcting protocol, except we need to apply H gate after encoding and before decoding." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "class ThreeQubitPhaseFlipProtocol(BaseQecProtocol):\n", - " def __init__(self):\n", - " self.name = '3 qubit phase flip protocol'\n", - " self.bf_protocol = ThreeQubitBitFlipProtocol()\n", - " \n", - " def encode(self, circuit, qubit):\n", - " qubits = self.bf_protocol.encode(circuit, qubit)\n", - " for q in qubits:\n", - " circuit.append(cirq.H(q))\n", - " return qubits\n", - " \n", - " def decode(self, circuit, qubits): \n", - " for q in qubits:\n", - " circuit.append(cirq.H(q))\n", - " return self.bf_protocol.decode(circuit, qubits)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(ThreeQubitPhaseFlipProtocol(), \n", - " num_points=41, \n", - " num_experiments=200,\n", - " channel_factory=lambda p:PhaseFlipChannel(p),\n", - " theoretical=lambda x:3*x**2*(1-x)+x**3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The Shor Code\n", - "\n", - "The Shor code protects from arbitrary errors!\n", - "\n", - "Here we will simulate arbitrary error by applying gates Rx, Ry and Rz with random arguments." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class ArbitraryErrorChannel:\n", - " def __init__(self, flip_prob):\n", - " self.flip_prob = flip_prob\n", - " \n", - " def transmit(self, ct, q):\n", - " if np.random.rand() < self.flip_prob:\n", - " ct.append(cirq.Rx(np.random.rand()*2*np.pi).on(q))\n", - " ct.append(cirq.Ry(np.random.rand()*2*np.pi).on(q))\n", - " ct.append(cirq.Rz(np.random.rand()*2*np.pi).on(q))\n", - " return q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Shor code encodes qubit with 3 qubits using phase shift flip. Then it encodes each of these 3 qubits with bit flip code. Therefore, 9 qubits are transmitted over noisy channel." - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class ShorProtocol(BaseQecProtocol):\n", - " def __init__(self):\n", - " self.name = 'Shor Code'\n", - " self.bf_protocol = ThreeQubitBitFlipProtocol()\n", - " self.pf_protocol = ThreeQubitPhaseFlipProtocol()\n", - " \n", - " \n", - " def encode(self, circuit, qubit):\n", - " result = []\n", - " qubits1 = self.pf_protocol.encode(circuit, qubit)\n", - " for q in qubits1:\n", - " result += self.bf_protocol.encode(circuit, q)\n", - " return result\n", - " \n", - " def decode(self, circuit, qubits): \n", - " return self.pf_protocol.decode(circuit, [\n", - " self.bf_protocol.decode(circuit, qubits[0:3]),\n", - " self.bf_protocol.decode(circuit, qubits[3:6]),\n", - " self.bf_protocol.decode(circuit, qubits[6:9])\n", - " ])\n", - " \n", - "test_protocol_once(ShorProtocol(), ArbitraryErrorChannel(0.05))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What is error probability of such protocol? It corrects up to 1 errors, and there are 9 qubits being transmitted. No error happens with probability $(1-p)^9$, an one error happens with probability $9p(1-p)^8$. So, error probability is\n", - "$1 - (1-p)^9 - 9p(1-p)^8 = 36p^2 + o(p^2)$.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nQqm31wAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(ShorProtocol(), \n", - " num_points=11, \n", - " num_experiments=20,\n", - " channel_factory=lambda p:ArbitraryErrorChannel(p),\n", - " theoretical=lambda p:1-(1-p)**9 - 9*p*(1-p)**8)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's show that for small error rates of channel this code still gives improvement.\n", - "\n", - "Here as 'Theoretical' we will plot linear function, so while 'Experimental' chart is below it, it is the improvement." - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(ShorProtocol(), \n", - " num_points=6, \n", - " max_p = 0.02,\n", - " num_experiments=1000,\n", - " channel_factory=lambda p:ArbitraryErrorChannel(p),\n", - " theoretical=lambda x:x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursive bit-flip protocol.\n", - "\n", - "Let's get back to bit-flip protocol and apply ide of Shor code there. Let's encode qubit using bit-flip protocol, and then encode each resulting qubit again. This way we get 9 qubits.\n", - "\n", - "What is the error rate of such protocol (to leading order of $p$, for $p \\ll 1$ )? Now at least 4 errors should happen to break protocol, and not any 4 errors will do it. \n", - "\n", - "Imagine matrix 3x3, in which we write 1 in each cell w.p $p$. Each 1 represents error at qubit transmission. Protocol fails when in at least 2 rows we have at least 2 ones. How many there are different ways to write 4 ones to make it fail?\n", - "There are 3 ways to choose 2 rows, and 3 ways to choose 2 cells in each of them, total 3*3*3=27 ways.\n", - "\n", - "So, protocol error rate is $27p^4 + o(p^4)$." - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class NineQubitBitFlipProtocol(BaseQecProtocol):\n", - " def __init__(self):\n", - " self.name = '9 qubit bit flip protocol'\n", - " self.bf_protocol_1 = ThreeQubitBitFlipProtocol()\n", - " self.bf_protocol_2 = ThreeQubitBitFlipProtocol()\n", - " \n", - " def encode(self, circuit, qubit):\n", - " result = []\n", - " qubits1 = self.bf_protocol_1.encode(circuit, qubit)\n", - " for q in qubits1:\n", - " result += self.bf_protocol_2.encode(circuit, q)\n", - " return result\n", - " \n", - " def decode(self, circuit, qubits): \n", - " return self.bf_protocol_1.decode(circuit, [\n", - " self.bf_protocol_2.decode(circuit, qubits[0:3]),\n", - " self.bf_protocol_2.decode(circuit, qubits[3:6]),\n", - " self.bf_protocol_2.decode(circuit, qubits[6:9])\n", - " ])\n", - " \n", - " \n", - "test_protocol_once(NineQubitBitFlipProtocol(), BitFlipChannel(0.1))" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nYYwxJqj/B68cOV/kw4w3AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_errors(NineQubitBitFlipProtocol(), \n", - " num_points=21, \n", - " max_p = 0.2,\n", - " num_experiments=100,\n", - " channel_factory=lambda p:BitFlipChannel(p),\n", - " theoretical=lambda x:27*x**4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To be continued:\n", - "* Calderbank-Shor-Steane codes;\n", - "* Stabilizer codes." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/README.md b/README.md index 78ec3e9..6675414 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repository contains my various exercises and research projects in the field List of projects: * Exercises with Cirq: * [Phase estimation](Phase%20estimation.ipynb) (2019) - * [Error correction](Quantum%20error%20correction%20with%20Cirq.ipynb) (2019) + * [Error correction](error_correction/) (2019, upd. in 2026) * Linear algebra: * [Schmidt decomposition of a vector](Schmidt%20decomposition%20of%20a%20vector.ipynb) (2019) * [Schmidt decomposition of a 4x4 matrix](Schmidt%20decomposition%20of%204x4%20matrix.ipynb) (2019) diff --git a/error_correction/01_Intro.ipynb b/error_correction/01_Intro.ipynb new file mode 100644 index 0000000..6619014 --- /dev/null +++ b/error_correction/01_Intro.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d0969e5c-f582-4317-b651-64b3555615ff", + "metadata": {}, + "source": [ + "### Introduction\n", + "\n", + "This notebook is my excercise with to purposes: learn Cirq and learn quantum error correction.\n", + "\n", + "It is based on material in Chapter 10 of \"Quantum Computation and Quantum Informaton\" by Nielsen and Chuang.\n", + "\n", + "**Warning.** Cells with charts will take long time to run.\n", + "\n", + "### The problem\n", + "\n", + "Suppose we have noisy quantum channel, which with probability $p$ changes transmitted qubit in a certain way. We have qubit and we want to pass it through this channel. We can use perfect (not-faulty) gates. We are allowed to encode given qubit into several qubits. Each of them is transmitted throw noisy channel. Then we can decode resulting qubit and we have to present one qubit. State of this qubit should be exactly the same as state of qubit we started with.\n", + "\n", + "For beginning, noisy channel will apply bit-flip (i.e. X gate) with probability p, later we will consider other types of noise." + ] + }, + { + "cell_type": "markdown", + "id": "0d739ad0-4c00-46ba-8903-cd8221a79aea", + "metadata": {}, + "source": [ + "### The framework\n", + "\n", + "There is qubit $| \\psi >$. We allowed to \"encode\" it, by applying certain cirquit which produces one or more qubits.\n", + "Then these qubits are passed (independently) throw faulty channel. Then we allowed to \"decode\" result by applying another circuit to received cubits. It should producr one qubit. Finally, we check whether this is the same qubit as the one we started with. We repeat this many times with different (random) $| \\psi >$ and measure error rate $p_1$. We will change $p_0$ and see how $p_1$ changes.\n", + "\n", + "Let's build this framework and test it with no encoding-decoding. Obviosly, we expect $p_1=p_0$.\n", + "\n", + "\n", + "**How do we generate initial state?**\n", + "\n", + "Any qubit state corresponds to a point on Bloch sphere. Let's generate random $\\theta \\in [0, \\pi]$ and $\\phi \\in [0, 2 \\pi]$. Then state is $ | \\psi\\rangle= \\cos(\\theta/2) |0 \\rangle + e^{i \\phi} \\sin(\\theta/2) |1 \\rangle$. To get it from \n", + "$| 0 \\rangle$, apply gate defined by unitary matrix:\n", + "\n", + "$$\\begin{pmatrix}\n", + " \\cos(\\frac{\\theta}{2}) & -\\sin(\\frac{\\theta}{2}) \\\\\n", + " e^{i \\phi} \\sin(\\frac{\\theta}{2}) & e^{i \\phi} \\cos(\\frac{\\theta}{2})\n", + " \\end{pmatrix} $$\n", + " \n", + "Cartesian coordinates of this state on the bloch sphere are $(\\sin(\\theta) \\cos(\\phi), \\sin(\\theta) \\sin(\\phi), \\cos(\\theta))$.\n", + "\n", + "Code below demonstarted experiment with no error correcion." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cc6cb988-c32f-4d47-bf69-53a458b81ccf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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oEGDHB12sdO1a1csFgtLliyxly1YsACz2UyXLl3sZX/++af98tMnn3zCunXr7P/NmjULsI39+PHjHRp/cdG8eXPKli2b5Zflrl27OHbsGN27d7eX7dy5k4MHDwJQu3ZtqlWrluMvg9xme0o7b29v2rZtm2Wck5KSWL58eZZxPnz4sH2dR9myZTGbzdkur0ZGRmqcb1B0dDTr1q2zH3fv3p1ff/0V4++tLA3DYMGCBVm+NgWu0JYqlzDnz583KleubPTr189YsGCB8fjjjxseHh7Gpk2b7HVmz55tAMbp06fz3EayyszMNNq1a2c0bdrU+PHHH41JkyYZrq6uxpdffmmvs2/fPgMwFi9ebBiGbdxNJpMxbtw44/fff7f/d/m2Q8nZgw8+aISGhhqzZs0yZs6caZQrV84YN25cljoeHh7GxIkTc2yvu6Xy5uOPPzY8PT2NDz/80Pjhhx+MevXqGT169MhSp3nz5sawYcPsx3PnzrXfibJkyRJjzJgxhre3t7Fnzx5Hh19srF692nBzczOef/554+effza6detm1KhRw0hISLDXGTVqlNGgQQP78dixY42goCBj6tSpxm+//WY89dRThslkytNziEqrhIQE+89YX19f48knnzR+//13Y9++ffY677//vvHP9OLYsWNGYGCgMWzYMGPBggXGiBEjDH9/f+PQoUOFFqfW3ORR2bJlWb9+PW+99RYffPABFStW5Pfff6dly5b2OuXLl6ddu3b2Kc68tJGszGYzixcvZtKkSUydOhV/f39+/PHHLJeZvL29adeuHYGBgQAcPXqUtm3bsnHjRjZu3GivFx4ezjfffOPw91BcTJ48mfr16/Ptt99iMpl4/fXXuf/++7PUadeuHWFhYTm29/HxoV27dloYfw0PPfQQ5cuX55tvviE5OZmhQ4cybty4LHWaNGliv4QFcOuttxIQEMD06dNZsGABtWvXZufOnboD8Co6duzIqlWr+Pjjj9m0aRONGjXiq6++wtfX116nVq1aWWbSP/74YyIiIvjtt9/48ccfCQ8P588//6R169bOeAvFQlRUFM8//zxgu8Ny06ZNbNq0ic6dO/Paa68BUKlSJdq1a2dvU7VqVTZs2MCkSZN4//33qVatGhs2bCjUz7PJMP6eJxIREREpAbTmRkREREoUJTciIiJSoii5ERERkRJFyY2IiIiUKEpuREREpERRciMiIiIlipIbERERKVGU3IhIvpw8eZL58+c7O4zrEh0dzZw5c5wdhogUMiU3IpKryMhIFi1axKJFizh06FCWc3/++SdjxoxxUmT5s23bNu6++25nhyEihUzbL4hINqdPn2b06NGsWbOG1q1b4+XlxaFDhyhTpgyfffYZjRo1cnaIIiK5UnIjIlkkJSXRuXNnQkJCOHHiBOXKlbOf27p1K4mJiVnqW61Wdu/ezcmTJ2nYsCFVq1a1n7t48SK//fYbAB4eHtSqVYuGDRtmaX/y5Em2bt3KgAEDcu0nL3Uui46OZsuWLQQEBNCsWbN87X11tT7+GcuGDRuIioqid+/e7N+/n7S0NJo0acKff/5Jamoq/fr1AyAhIYE///yTtLQ0WrVqRWhoaJbX+/nnn2nSpAkuLi5s3bqVsLAwmjVrdt1xi4iNkhsRyeKzzz7j6NGjLFy4MEtiA9C8efMsx2lpaXTr1o20tDS8vb1Zu3Ytn332Gffccw9gS25++uknAFJSUtiwYQMtWrTgp59+ws3NDbhyeatly5a59pOXOgDjx4/nww8/pHXr1iQmJnLw4EFmz55Nly5d8vz+r9XH5ViaN29OWloa4eHhdOjQgenTp9sTmKpVq1KzZk369evHqlWruPXWW6latSoBAQFs3LiRd955h0ceecT+mmPHjuWmm27i4MGDNG3alP79+yu5EbkRhbbfuIgUS7169TJatGhxzXqzZ882AGPatGn2srfeesuoWLFirm3i4+ON2rVrZ2mTl37yUmfevHlGaGioERkZaS+bNm2aUbFiRSMtLc0wDMP45ZdfDA8Pj1zjy0sfl2OZNGlSlrZjx441zGazsXHjRntZamqqUbVqVeOJJ56wl3399deGm5ubcejQIXtZSEiIUa9ePePSpUu5xiYieacFxSKSxZkzZ6hSpUqe6rq5uTF69Gj7cadOnYiOjs5y6cpqtbJ582bmz5/PwoULqVKlCps2bbrufq5VZ+bMmTRs2JANGzYwZ84cfvjhB9zd3YmOjubAgQN5ej957cNkMmWZebksIiKCVq1a2Y83bNjA8ePHefHFF+1lw4YNo1KlSsybNy9L25EjR+Lv75+nOEXk6nRZSkSy8PPz4/z583mq6+/vj4uLi/3Yw8MDgNTUVHx9fTl27Bg9evQgIyOD+vXr4+fnx8mTJ/H09LyufvJS5/jx4xiGwdy5c7P0fccdd2AymfL0fvLaR2BgYLb3AFChQoUsxydOnMDX15fy5ctnKa9RowYnTpy4alsRyT8lNyKSRatWrZg5cyZJSUn4+PjcUF+vvfYatWvXZuHChfay4cOHExcXd4NRZufv70/t2rWZMWNGofeRW7L07/KgoCCSkpJIS0uzJ2MAFy5cICgoKE99isj102UpEcniwQcfJCUlhVdffTXbuYyMDM6cOZPnvs6cOUOdOnXsx/Hx8SxbtqxA4vy3Xr16MW/ePGJjY7OUR0VFObSPf2revDmenp72RdUAhw4dYufOnbRv3z5ffYrItWnmRkSyqFGjBt999x3Dhg3jr7/+ol+/fnh4eHD48GHmz5/PO++8Q//+/fPU18CBA3nqqacoX748/v7+fPLJJ6SnpxdK3OPGjWPhwoW0bNmShx56iDJlyrB161bWr1/Prl27HNbHP4WEhPDSSy8xevRoDh48SEBAAO+//z59+/ale/fu192fiOSNkhsRyaZ///4cPXqU2bNns337dkwmE7Vq1eK3334jPDwcgPDwcAYPHpylXWBgIHfccYf9Esz9999PYGAgS5cuxWw288orr5CYmEhMTIy9TV76yUudy7eHz549m3Xr1uHi4kJERASTJ0+2t6lUqRK33357ru87L33kFAtAy5YtSUhIyFb+4osv0rhxY3755ReOHTvGSy+9lOX2dbAlgTk9s0dE8sdkGIbh7CBERERECorW3IiIiEiJouRGREREShQlNyIiIlKiKLkRERGREkXJjYiIiJQoSm5ERESkRFFyIyIiIiWKkhsREREpUZTciIiISImi5EZERERKFCU3IiIiUqIouREREZES5f8Bk5j4bUVHPwkAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 2.31s\n" + ] + } + ], + "source": [ + "from error_correction.protocols import NoEncodingProtocol\n", + "from error_correction.utils import plot_errors, test_protocol_once\n", + "\n", + "plot_errors(NoEncodingProtocol(), num_experiments=200, theoretical=lambda x: x)" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/02_ThreeQubitBitFlipCode.ipynb b/error_correction/02_ThreeQubitBitFlipCode.ipynb new file mode 100644 index 0000000..7ff71b5 --- /dev/null +++ b/error_correction/02_ThreeQubitBitFlipCode.ipynb @@ -0,0 +1,147 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0f8850bc-769f-41cb-855c-2a66c2c10fd4", + "metadata": {}, + "source": [ + "### The three qubit bit flip code\n", + "\n", + "This part is based on Chapter 10.1.1 from \"Quantum Computation and Quantum Informaton\" by Nielsen and Chuang.\n", + "\n", + "**Encoding**\n", + "We will map $| 0 \\rangle$ to $| 000 \\rangle$ and $| 1 \\rangle$ to $| 111 \\rangle$, which can be done using 2 CNOT gates.\n", + "\n", + "This way, $\\alpha | 0 \\rangle + \\beta | 1 \\rangle$ is encoded as $\\alpha | 000 \\rangle + \\beta | 111 \\rangle$.\n", + "\n", + "**Decoding**\n", + "Assume that not more than one bit flips occured. Then there are 4 options:\n", + "\n", + "1. No bit flip occured. State after transmission $\\alpha | 000 \\rangle + \\beta | 111 \\rangle$.\n", + "2. First bit flipped. State after transmission $\\alpha | 100 \\rangle + \\beta | 011 \\rangle$.\n", + "3. Second bit flipped. State after transmission $\\alpha | 010 \\rangle + \\beta | 101 \\rangle$.\n", + "4. Third bit flipped. State after transmission $\\alpha | 001 \\rangle + \\beta | 110 \\rangle$.\n", + "\n", + "Book suggests to do a measurement to do a measurement which distingusishes these 4 states and does not changes state. Indeed, these 4 cases correspond to 4 orthonal subspaces, and we could take projectors on these subspaces as measurement opertors.\n", + "\n", + "However, how to implement such measurement. One way to implement measurement not in computational basis is to apply unitary transform, after which measurement in computational basis will give desired result. For example, if we want to meaure in basis $|+ \\rangle, |- \\rangle$, we could apply Hadamard gate and measure in $|0 \\rangle, |1 \\rangle$ basis.\n", + "\n", + "Let's explicitly design such transformation, by saying where should it take one of 4 possible outcomes:\n", + "\n", + "$\\alpha | 000 \\rangle + \\beta | 111 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 00 \\rangle$\n", + "\n", + "$\\alpha | 100 \\rangle + \\beta | 011 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 11 \\rangle$\n", + "\n", + "$\\alpha | 010 \\rangle + \\beta | 101 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 10 \\rangle$\n", + "\n", + "$\\alpha | 001 \\rangle + \\beta | 110 \\rangle \\to (\\alpha |0 \\rangle + \\beta |1 \\rangle) | 01 \\rangle$\n", + "\n", + "Now by doing measurement in computational basis for two rightmost qubits we obtain result of measurement which we initially wanted, and measurement wouldn't change the state.\n", + "\n", + "Then we could apply inverse transformation and use mesurement result to decide which bit was flipped (if any), and flip it.\n", + "\n", + "But we don't need to do all this, as after this transformation we see that regarless of which bit was flipped, leftmost qubit is already equal to qubit we want to restore. So, we just need to apply transformation, and we don't need to do any measurements.\n", + "\n", + "So, how do we build this transformation? It is, in fact, a permutation:\n", + "\n", + "$\\alpha | 000 \\rangle \\to | 000 \\rangle$\n", + "\n", + "$\\alpha | 001 \\rangle \\to | 001 \\rangle$\n", + "\n", + "$\\alpha | 010 \\rangle \\to | 010 \\rangle$\n", + "\n", + "$\\alpha | 011 \\rangle \\to | 111 \\rangle$\n", + "\n", + "$\\alpha | 100 \\rangle \\to | 011 \\rangle$\n", + "\n", + "$\\alpha | 101 \\rangle \\to | 110 \\rangle$\n", + "\n", + "$\\alpha | 110 \\rangle \\to | 101 \\rangle$\n", + "\n", + "$\\alpha | 111 \\rangle \\to | 100 \\rangle$\n", + "\n", + "All is left is to represent it as matrix and decompose it into X and CCNOT gates: " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "406d92ce-6804-41bf-b74b-6070b03fc061", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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SpUqnD59mvj4+DTtBw4cSNe3TJkyAERHR9+0742e279/P76+vo75MpLdM2Oc/Xq3K7v15sT4UqVKERgYyP79+9M999dffwGpnw/IfH2yOkepUqUoUaIEu3fvzpF6RPIShRuRHHb06FFiYmLStX/22WekpKTQtWvXG47v168fycnJaa7DYhgGkydPTnPdHIAKFSpQsmRJFixYkKbvlClTMp1/0aJFREVFpan3559/5uGHH8bDwyPTcaVKlcJkMnHp0qUb1u/q17td2a03J8abzWb69evHkiVL0hzLEhMTw8cff0z16tVp2rQpgOOU73+vT1bnMJlMDBs2jJUrV7J8+fI0c1y8eJHo6OhbqkckL9F1bkRyWGRkJB07dqRZs2ZUqVKF5ORkNm7cyJo1axg5ciQDBgy44fgWLVrw2muv8dprr7F7924iIiL47bff6N+/PzNmzEjT19PTk7feeothw4bx4IMPEhERwe+//85TTz3FF198keH8Q4cO5YEHHqBly5YYhsHXX39N1apVef/9929Yl7e3N/fccw+ffvopNpuNgICALF3nxtmvd7uyW29OjR83bhy7d++mVatWDBw4kICAAH766Sfi4+NZunSpY4vNPffcg6+vL4MGDeKee+7Bw8PDcZ2brM7xxhtvcPToUTp37kyvXr2oVasWJ06c4Pfff2fRokW3NJdIXqJPpUgOa9u2LX/++Sddu3bFbrdjtVrp2bMnhw8f5oMPPki39SUjY8eOZcOGDVSvXh2bzca7777LwIEDM+w7dOhQ1q1bR7Vq1QD46KOP6N69O8888wwtW7Z09CtWrBjPPPMMbdu2ZdGiRYSGhmI2mxk/fjxbtmyhWLFijr6Z3Z7g559/5q233iIuLu6m17lx9usBPProo+kuoBgQEMAzzzyT5uDdG91+ISQk5Kb13khWxl9fm4xuKOrv78/atWv54YcfKFq0KCkpKbz66qscPHgwzXsIDQ1l+/bttGvXjrNnz6a5zk1W53B3d2fmzJls2rSJiIgI4uLiaNasGVu2bHHsbsrqXA0bNuSZZ57RTTMlTzAZNzsAQETyDHd3d5599ln++9//urqUAufAgQPUqFGDGTNmZBokc3O8iOQcbbkRERGRAkXhRkRERAoUhRuRfOSZZ57J0k0c5dbd6DgYZ4wXkZyjY25ERESkQNGWGxERESlQFG5ERESk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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 65.71s\n" + ] + } + ], + "source": [ + "from error_correction.channels import BitFlipChannel\n", + "from error_correction.protocols import ThreeQubitBitFlipProtocol\n", + "from error_correction.utils import test_protocol_once, plot_errors\n", + "\n", + "plot_errors(ThreeQubitBitFlipProtocol(), \n", + " num_experiments=1000, \n", + " num_points=41, \n", + " theoretical=lambda x:3*x**2*(1-x)+x**3)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d3b72ad3-0241-41fa-a30e-56ed6c94884c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "aux_1: ─────────────────────────────X───X───────@───X───X───@───────@───────@───────@───X───@───X───X───@───M───\n", + " │ │ │ │ │ │ │ │ │ │\n", + "aux_2: ─────────────────────────────┼───X───X───@───────@───@───────X───X───@───X───X───────@───────@───@───────\n", + " │ │ │ │ │ │ │ │ │ │ │\n", + "q_init: ───Ry(0.354π)───Rz(0.72π)───@───@───X───X───────@───X───X───@───X───X───X───@───X───X───────@───X───M───\n" + ] + } + ], + "source": [ + "data = {}\n", + "test_protocol_once(ThreeQubitBitFlipProtocol(), BitFlipChannel(0.3), output=data)\n", + "print(data['circuit'])" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/03_ThreeQubitPhaseFlipCode.ipynb b/error_correction/03_ThreeQubitPhaseFlipCode.ipynb new file mode 100644 index 0000000..a1f6b7f --- /dev/null +++ b/error_correction/03_ThreeQubitPhaseFlipCode.ipynb @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "179b5ca2-0bf4-4d61-983b-308608b13ce5", + "metadata": {}, + "source": [ + "### Three qubit phase-flip code\n", + "\n", + "Now we have a channel which with probability $p$ changes qubit $a \\ket{0} + b \\ket{1} $ to $a \\ket{0} - b \\ket{1}$ (that is, applies gate Z), and w.p. (1-p) leaves it unchanged.\n", + "\n", + "Let's see that using three qubit bit flip protocol doesn't give any error correction." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7306db06-f6ce-4bc4-89e7-e214b70a93c5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHGCAYAAACIDqqPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbPdJREFUeJzt3XlYVGX/BvB7hh3ZQfZNBAXcUFMU9wXN3DXNXNJSM21xq9T2sl9almlaWpq2uGUupbli7gviihsoyg4CAiI7DDPn9wcxbxOLA87MgeH+XJfX+87DeZ7znYfJuT3nOedIBEEQQERERKQnpGIXQERERKRJDDdERESkVxhuiIiISK8w3BAREZFeYbghIiIivcJwQ0RERHqF4YaIiIj0CsMNERER6RVDsQsgIt14+PAhfv75ZwwYMACBgYE1bltYWIgffvgBffr0Qbt27RrE/ircv38fJ0+eRFpaGv59j9J+/fqhTZs2Gt8flbt8+TJOnjyJmTNnwsTEROxyqJHjkRsiLUlLS8OePXvwww8/YO/evcjOzha1nvT0dMydOxcRERGP3TY3Nxdz587FqVOnVNpWrFiB69ev18v9AUBERARatmyJn376CXFxcYiPj8e1a9cwd+5cnDlzpsb9NTQRERFYsWIFZDKZ2KUAAI4ePYq5c+eiqKhI7FKIGG6INE0ul+O5555Dt27d8PPPP+PChQv44IMP4Onpic8++0zs8tTSpEkTzJ49G0FBQcq27OzsSiGhvu1v2bJl8Pb2xoEDB7BixQqsWLECH3zwgVr7a2gOHz6MuXPnoqSkROxSiOodnpYi0jBBEDBx4kRs27YNEolE2T5r1iy8++676NatG3r16iVihY9naWmJFStWNLj93blzB97e3jrbHxHVTww3RBpmaGiIoUOHVmofM2YM1qxZg8jISLXCTVJSEo4cOQKJRIKBAwfCxcUF33zzDdq3b48ePXoot9m5cydGjx4NDw8Plf4rVqxAp06d0K1bt0pjl5WV4eDBg0hOTkZgYCB69uyp8vP/rklJTk7Ghg0bAJSffiguLgYAtG/fXq33ou393bt3D3v37kVqaioUCoUyuIwfP77Keqpac/PvNUItWrSosd6q1Kb/v7f19/fHkSNHcOfOHQwdOhReXl4AgKioKISHh6O0tBQBAQHo3r07pNLyg+1HjhzBuXPnAADfffcdjI2Nle/X0dFRuZ+axvi39PR0nDx5EllZWWjRogV69uwJQ0PVrwd1xyKqD/jJJNKR8PBwAEBwcPBjt12/fj18fX2xZs0anDx5EoMGDcLBgwcxb948/Pnnn8rtbt++jblz5+L27duVxpg7dy727t1bqf3Ro0cIDQ3Fzz//jLCwMDz99NMYPHiwMkAAldekFBcXIzk5GQCQlZWF+Ph4xMfHq7WOSBf7KywsRHx8PGQymfL/x8fHV3vKpqo1NxVrhMLCwh5bb1Vq079i2yNHjmDAgAH4/vvvsWPHDkRFRUEmk2Hy5Mlo27Ytdu3ahZMnT2LUqFHo1KmTypw8fPgQAJCQkFDp/aozRoX3338fnp6eWL58OS5evIglS5agY8eOSExMrPVYRPWGQERakZiYKHz99dfCkiVLhOeee07w8vIS1q9f/9h+169fFwwNDYWZM2cq24qKioTnn39ekEqlwvz585XtYWFhAgAhLCys0jgAhAULFihfR0VFCQCEZs2aCZGRkcr2s2fPCgYGBsLbb7+tbLt//74AQFi1apWyLS4uTgAgrFmzRq33r+v9CYIgNG/eXBg+fLhKW1XjVLW/2tT7pO+3Yltvb2/h6tWrgiAIgkKhENLS0oQPPvhAACD89ddfyu0TEhIEZ2dnISQkRNm2ePFiAYCQl5dXqRZ1x1i5cqUAQFi3bl2l95KYmFirsZYtWyYAEB4+fFjjPBHpAo/cEGlJUVER4uPjcffuXURHR0MqlUKhUDy2X8XpmMWLFyvbTE1NMWvWLLX6P06vXr3Qtm1b5euuXbtixIgR+OGHHzQyvtj7e1JPWm9t+vfs2VN5WkwikcDJyQlr165Fnz59MHjwYOV2np6emDNnDs6ePYurV68+tgZ1x1i2bBlCQkIwbdo0lf7+/v7K05yaqIdI1xhuiLSkRYsWWLFiBdavX4+rV6/ihRdewMsvv4zffvutxn43btyAm5sb7O3tVdo1dT+WqsZp164dcnJykJKSopF9iLm/J/Wk9dam/79DEAA8ePAAGRkZaN++faUxKtpu3LhR4/7VHSMzMxPJycno3LnzE49FVN8w3BDpyMKFC2FgYIDt27fXuJ1CoYCBgUGl9pra/ntEoKZ7jVQ1TsXiUW0cSdH1/p7Uk9Zbm/7/DbByuVxl+6rGqNimOuqOUdN2mqyHSAwMN0Q6IpFIIJFIVO6aWxU/Pz8kJyejoKBApT06OrrStq6urgCAjIyMx25b08+ioqJgbm6uHK8qdb0yRtf7e1J1rVcT/R0dHWFtbY2oqKhKP7t16xaA8s8HUP38qDuGo6MjHBwcEBkZqZF6iOoThhsiDbt37x5yc3MrtX/33XcoKyvDsGHDauw/ceJElJaWqtyHRRAErFmzRuW+OQDQrFkzNG3aFHv27FHZdu3atdWO/9dffyE1NVWl3t9//x3PP/88jIyMqu3n6OgIiUSCrKysGusXe39Pqq71aqK/VCrFxIkTsX//fpW1LLm5ufjmm2/g7++PLl26AIDyku//zo+6Y0gkEsycORNhYWE4dOiQyhiZmZnIyMioVT1E9Qnvc0OkYfHx8Xj66afRtWtX+Pn5obS0FOfOncOxY8cwb948TJ48ucb+3bp1w3vvvYf33nsPkZGRaNOmDY4fP45JkyZh48aNKtsaGxvjk08+wcyZMzFmzBi0adMGJ06cwGuvvYYffvihyvFfeeUVPPvss+jevTsEQcDPP/+MFi1a4IsvvqixLlNTUwwcOBDffvst5HI5rKys1LrPja7396TqWq+m+i9ZsgSRkZHo2bMnpkyZAisrK2zfvh0FBQU4cOCA8ojNwIEDYW5ujqlTp2LgwIEwMjJS3udG3TE++OAD3Lt3D4MHD8bYsWPRqlUrJCQk4MSJE/jrr79qNRZRfcJPJZGG9evXD9euXcOwYcOgUCggk8kwevRoxMTE4Kuvvqp09KUqixcvxtmzZ+Hv7w+5XI6lS5diypQpVW77yiuv4NSpU2jZsiUAYOXKlRg5ciRmz56N7t27K7ezs7PD7Nmz0a9fP/z111/w8PCAVCrFsmXLEBERATs7O+W21T2e4Pfff8cnn3yC/Pz8x97nRtf7A4AXX3yx0g0UraysMHv2bJXFuzU9fsHFxeWx9dZEnf4Vc1PVA0UtLS1x8uRJbNu2DTY2NigrK8O7776L27dvq7wHDw8PXLp0Cf3798f9+/dV7nOj7hiGhobYvHkzwsPD0aZNG+Tn56Nr166IiIhQnm5Sd6yOHTti9uzZfGgm1QsS4XELAIio3jA0NMScOXPw5Zdfil2K3omOjkZAQAA2btxYbZDUZn8i0hweuSEiIiK9wnBDREREeoXhhqgBmT17tloPcaTaq2kdjC76E5HmcM0NERER6RUeuSEiIiK9wnBDREREeqVR3sRPoVAgNTUVlpaWat1zhIiIiMQnCALy8vLg6upa4w0kG2W4SU1NhYeHh9hlEBERUR0kJSXB3d292p83ynBjaWkJoHxyrKysNDauTCbD4cOHMWDAALWeQUN1w3nWHc61bnCedYPzrBvanOfc3Fx4eHgov8er0yjDTcWpKCsrK42HG3Nzc1hZWfE/HC3iPOsO51o3OM+6wXnWDV3M8+OWlHBBMREREekVhhsiIiLSKww3REREpFca5ZobdSgUCpSWltaqj0wmg6GhIYqLiyGXy7VUGelqno2MjGBgYKC18YmISDsYbqpQWlqKuLg4KBSKWvUTBAHOzs5ISkri/XO0SJfzbGNjA2dnZ/4+iYgaEIab/xAEAffv34eBgQE8PDxqvEnQfykUCuTn58PCwqJW/ah2dDHPgiCgsLAQGRkZAAAXFxet7IeIiDSP4eY/ysrKUFhYCFdXV5ibm9eqb8WpLFNTU4YbLdLVPJuZmQEAMjIy4OjoyFNUREQNBL+B/6NiDYexsbHIlVB9UBFwZTKZyJUQEZG66kW4EQQBxcXFtV7jUtvta4NrLAjg54CIqCESNdw8ePAAS5cuhY+PD8zMzHDy5Em1+i1ZsgROTk4wMjJCmzZtcPToUS1XSprw7bffYsuWLWKXQUREek7UNTdr1qxBQUEBfv75Z/Tq1UutPmvXrsVnn32G3bt3o0uXLli2bBmGDBmCmzdvolmzZlquuP7auHEjzpw5U6ndzc0NH3/8sQgVVRYWFgZ3d3eMHz9e7FIAAKtWrYKjoyOee+45sUshIiINEjXcfPDBBwCA5ORktfssX74cU6dORf/+/QEAH330ETZu3Ii1a9fi888/10qdDcGJEydw7tw5vPXWWyrtdnZ2IlVU2WuvvYYmTZqIXYbSoUOH4Ovry3BDRKRnGtTVUllZWYiJiVE5yiORSNCrVy+cO3dOxMrqBxcXF0ybNq3Knz148ADvvvsupk6diuDgYABAUVER3nrrLQwePBiDBg3C8uXL4e3tDUtLSxw7dgxyuRyTJk1C69atVcZKTk7Gpk2bkJycDB8fH0yaNAlNmzZV/vzf4xw4cACurq548803cfv2bdja2qJr167K7by8vGBubo7Tp0+jtLQUEydORLt27fDXX3/hyJEjsLa2xtSpU+Hp6alSQ0pKCtasWYOUlJQaa7Czs8ORI0cgl8sxZswYdOjQAUD5ka5r164hPj5eOWeffvopnJ2dn/C3QETUuP1xNRUJj8Rdr9igwk16ejoAqHyJAYCjoyMiIiKq7VdSUoKSkhLl69zcXADlV8D89yoYmUwGQRCgUCjqdBO/iv/V5mLnmvZd3X7t7e3RpEkTjBs3DleuXIGVlRXmzp2Lo0ePYsmSJVAoFNi/fz+ioqLg5OSE559/HpGRkXjqqadw9OhRdOnSBQBw7tw5DB8+HCNHjkTr1q1x4cIFLFmyBOfOnYOPjw8AKMfx8vLCmDFj4OvrC4VCgcOHD8Pd3R3jxo1TbhcZGYk2bdpg6NChOHPmDIKDgzFixAhkZWXhmWeewdGjR/HDDz/g9u3bsLCwAACcPXsWw4cPx6hRo2qsITo6Gr6+vhg2bBiioqLQpUsXnD17Fh06dECzZs1ga2uLpk2bonPnzgAAExOTSvOnUCggCAJkMlmjvBS84r8PXi2mXZxn3eA8a19OoQwf/xWF/BIDBEWno5e/k0bHV/d316DCTYWqvoBquqplyZIlVa47OXz4cKV72RgaGsLZ2Rn5+fkoLS0tv5JLVrugUpSVU6vtq2NqJFX7ah2ZTIbo6GhMmTJFpb1r1654/vnnAQALFy7EkSNHMH36dIwcORIbNmzAwYMHIZfLkZubi7KyMpSUlGDPnj3KIFFWVoa33noL+/btAwC89NJLmDdvHmbNmgUAmDx5MmbMmIF3330X33//vbKPiYkJ/vzzT+Xj7ivGLy0tVYbLsrIyODk5YceOHZBKpXjhhRfQqlUrxMTE4MiRI5BIJJgwYQL8/Pywa9cujBgxAgAwdepUzJ8//7E1WFtbY+fOncpQcvv2baxfvx5Lly5FUFAQnJ2d4ePjg7Fjxyrnq6K2CqWlpSgqKsLJkydRVlam1u9CH4WFhYldQqPAedYNzrP2/JUoRX6JFC7mAvLuXcL+WM2OX1hYqNZ2DSrcVNwltuKusRUyMjJqPJ2waNEizJs3T/k6NzcXHh4eGDBgAKysrFS2LS4uRlJSEiwsLGBqaorC0jK0/1yc/xBufBQKc2P1fkVGRkawtrZG9+7dVdr9/f1V3uPWrVvRuXNn7Nu3Dx9++CF69+6t/JmhoSEGDRoEV1dXZduECRMwcuRImJubIyEhAXfu3MGVK1ewYMECCIIAQRCQlJSEvLw85X4MDQ0RGhoKe3t7lVoMDQ1hbGyssl3fvn1hY2Oj3MbHxwfdu3eHtbW1ss3LywvZ2dmwsrLCvXv3cOfOHVy4cOGxNfTr1w+2trbKcQIDA5GRkaGyzb/rqUpxcTHMzMzQs2dPmJqa1vg70EcymQxhYWEIDQ1VBlXSPM6zbnCetSsrvwSLvj4NQI7BHgoMHKD5ef7vP0CrU+/DTVlZGRQKBYyNjWFra4vAwEAcO3YMzz77LIDyozbHjh3Diy++WO0YJiYmMDExqdRuZGRUaeLlcjkkEgmkUqnyj1hqs3+JRAIXFxe8/PLLNW7XokULeHt74/bt2xg3blyl8R0cHFTaHB0dIZfLkZOTg+zsbABAx44d4eDgoNwmODgYlpaWKv1sbW0rjS2RSJRzW8Hc3FzltVQqrbJNoVBAKpUqa2jbti3c3NyU21VVw3/HMTQ0VI5TXT3/JZWWHz2r6rPSmDT2968rnGfd4Dxrx/ozMSgslaONmxVa22ZrZZ7VHU/UcCOXyyGTyZTrYUpLS1FcXAxDQ0MYGpaX9sorryA8PBw3btwAACxYsAAzZsxA37590bVrV3zxxRfIz8/HzJkztVKjmZEBbn0yUK1tFQoF8nLzYGllqZFQZGak+TUe77zzDoqKitCvXz9MnjwZJ06cUFlLkpSUpLJ9QkICTE1N0bRpU+VT0lu3bo0hQ4ZovDZ1uLm5AQACAgIwduzYJ5pn3qCPiEgz0h4V45fwBADA3H6+yIupfh2sLoh6E78tW7bAxsYGrVq1gomJCYYNGwYbGxssXbpUuY2RkZHKUZcXXngBX331FRYtWoSAgABcvHhRef8UbZBIJDA3NlT7j5mxQa22r+mPpr98jx49ipUrV+LXX3/Fr7/+ipiYGHz22Wcq2+zbtw93794FUH4I99tvv8Xw4cMhkUjg7u6OXr164ZNPPlE5NJiVlaWzGylW1LBs2bInrsHOzk55JIiIiOpu9bEYlJYp0MnbFt197R/fQctEPXIzadIkTJo0qcZt1qxZU6lt1qxZysWk9D+3b9+udCm4qakpVq9ejezsbLzwwgtYsGCBcl3Ohg0bMHLkSAwcOFB5xVCrVq3Qp08fdOnSBbdu3UJeXh5+/vln5XibNm3C8OHD0bJlS/To0QMPHz5EbGwsvvrqK529z19++QXDhg1DQEDAE9UwfPhwTJw4EaWlpbCwsOCl4EREdZCUXYjfLpQf9Z8/oGW9OCpe79fckHpeeumlSouJgf+dn0xJScHixYsxceJE5c8GDx6M33//XeUISP/+/TF79mxcuHABZWVlGDBggPLKKaD8yMnFixcRHh6Ou3fvwtXVFcHBwSrbzJ8/X2VNToX/3sSvqu0WLlyosqAZAD788EP4+vqq1HDs2DHcunULsbGxatcwYcIEFBQUKF+PGjUKFy9eRGRkJAoKCpRPASciIvV983cMZHIB3X0d0MXHvl5cas9woyd69uyJnj17VvvzNm3aoE2bNpXahw8fXqnNxcUFw4YNq3YsiUSCrl27Km/G91+DBg2qsr3irtI1bVfVWp6RI0dWW0O3bt3UrqGqegMDAxEYGFjlGEREVLPYB/nYebn8KQPzB7QQuZr/qRdPBSciIqKGZ8WRGCgEoH+AI9p72j6+g47wyA0pVXc6iYiI6L+i03Kx91oqAGBuaP05agMw3NC/VHc6iYiI6L+WH74DQQAGt3FBK1frx3fQIZ6WIiIiolq5lpyDw7fSIZUAc0P9xC6nEoYbIiIiqpWvDt8BAIwIcoOvo6XI1VTGcFONiqdsU+Om66e7ExHVdxfis3HizgMYSiWY3b/+HbUBuOamEiMjI0gkEjx48ABNmzat1c2IFAqF8hESYj6TSt/pYp4FQUBpaSkePHgAqVQKY2NjreyHiKghEQQBXx66DQAY85QHvOybPKaHOBhu/sPAwADu7u5ITk5GfHx8rfoKgoCioiKYmZnVizs06itdzrO5uTk8PT0ZVomIAJy9l4XzcdkwNpDi9b6+j+8gEoabKlhYWMDPz6/Wd1mUyWQ4efIkevbsySfOapGu5tnAwACGhpp/xhcRUUMkCAK+PFx+1GZ8sCdcbervXd0ZbqphYGCg8rRsdfuUlZXB1NSU4UaLOM9ERLp37HYGriTmwNRIill9motdTo14rJ2IiIhqpFAI+PJQ+RVSk0O84WhpKnJFNWO4ISIiohodvJmGW/dzYWFiiFd61u+jNgDDDREREdVArhCwPKz8qM1L3ZvBtkn9v3qU4YaIiIiqtScyBXcz8mFtZoRpPZqJXY5aGG6IiIioSjK5AiuOxAAAZvTygZVpw7iIg+GGiIiIqrTzUjISsgrhYGGMKSHeYpejNoYbIiIiqqSkTI5v/i4/ajOzty/MjRvO3WMYboiIiKiSbRFJSH1UDGcrU0wI9hS7nFphuCEiIiIVRaVyrD52FwDwWl9fmBrV7qa2YmO4ISIiIhW/nIvHg7wSuNuaYexTHmKXU2sMN0RERKSUVyzD2hP3AACz+/nB2LDhRYWGVzERERFpzcYz8XhYKINP0yYY2d5N7HLqhOGGiIiIAAA5haVYdzIWADC3fwsYGjTMmNAwqyYiIiKNW3cqFnklZfB3tsTgNi5il1NnDDdERESEzPwSbDwTDwCYF9oCUqlE3IKeAMMNERERYc3xeygslaOtuzVCA53ELueJMNwQERE1cmmPivFreAIAYP6AlpBIGu5RG4DhhoiIqNFbfSwGpWUKdPK2RU8/B7HLeWIMN0RERI1YUnYhfruQBAB4Uw+O2gAMN0RERI3aN3/HQCYX0MPPAcE+9mKXoxEMN0RERI1U7IN87LycDKD8Cil9wXBDRETUSK04EgOFAPQPcER7T1uxy9EYhhsiIqJGKDotF3uvpQIA5urRURuA4YaIiKhRWn74DgQBGNzGBa1crcUuR6MYboiIiBqZyKQcHL6VDqkEmBvqJ3Y5GsdwQ0RE1IgUlpbhzd8jAQAjgtzg62gpckWax3BDRETUiHz4503EZOSjqaUJFj0TIHY5WsFwQ0RE1EjsupyM3y8lQyoBVo4LQlNLE7FL0gqGGyIiokbgbkY+3vvjBgDgjX5+CGne8B+zUB2GGyIiIj1XLJPjtS2XUVgqR0hze7zeV/8WEf8bww0REZGe+3jvLUSn5cHBwhgrxgXBQNrwnx9VE4YbIiIiPbYnMhVbIxIhkQArnmsPR0tTsUvSOoYbIiIiPRWXWYBFO68BAF7r44vufvq7zubfGG6IiIj0ULFMjlc3X0ZBqRydm9lhdj/9Xmfzbww3REREeuj/9kXh1v1c2DUxxjfj2sPQoPF85Teed0pERNRI7L9+H7+GJwAAlo9tB2dr/V9n828MN0RERHokMasQC3aUr7N5pVdz9G7pKHJFusdwQ0REpCdKyuR4betl5JWUoaOXLeYPaCF2SaJguCEiItITSw9E41ryI9iYG2HV8+1h1IjW2fxb43zXREREeubQzTRsPBMPAPhqTDu42piJW5CIGG6IiIgauKTsQrz1eyQAYHqPZugX4CRyReJiuCEiImrASssUeH3rFeQWlyHIwwZvDfQXuyTRMdwQERE1YMsOReNqUg6sTA2x6vn2MDbkVztngIiIqIH6Oyod607FAQCWjWkHDztzkSuqH0QPNwcPHsTgwYPx1FNP4cUXX0R8fHyN25eWlmLFihUYMGAAOnXqhNGjR+PQoUO6KZaIiKieSM0pwvx/1tlMCfHGwFbOIldUf4gabg4ePIihQ4eiR48e+Oqrr5CTk4Pu3bsjJyen2j5z587F559/junTp+O7775DUFAQnnnmGRw+fFh3hRMREYlIJlfgja1XkFMoQxs3ayx6huts/k3UcPPhhx9i3LhxWLhwIXr16oVt27ahoKAAa9eurbbP/v378fLLL2PMmDHo1KkT3n//fbRq1QoHDx7UYeVERETiWR52BxcTHsLSxBDfju8AE0MDsUuqV0QLN/n5+bhw4QKeeeYZZZuJiQn69++PY8eOVduvW7duOHXqFIqKigAAt2/fRlxcHLp37671momIiMR2/HYG1hy/BwD4/Nm28LTnOpv/MhRrxykpKRAEAS4uLirtLi4uuHnzZrX9fvzxR0yZMgVOTk5wdHREWloaVq5ciVGjRlXbp6SkBCUlJcrXubm5AACZTAaZTPaE7+R/KsbS5JhUGedZdzjXusF51g19mOe03GLM/e0qAGBCZw+E+jvUu/ejzXlWd0zRwk1ZWRkAwNjYWKXdxMSkxuKXLFmCkydP4vvvv0fz5s1x+PBhzJs3DwEBAQgJCam2z8cff1yp/fDhwzA313ziDQsL0/iYVBnnWXc417rBedaNhjrPcgH49qYBHhZK4GYuoL0kDvv3x4ldVrW0Mc+FhYVqbScRBEHQ+N7VkJaWBhcXF+zZswdDhw5Vtr/00kuIiorCuXPnKvXJzc2FnZ0dfvzxR0yePFnZPmLECBQVFVV71VRVR248PDyQmZkJKysrjb0nmUyGsLAwhIaGwsjISGPjkirOs+5wrnWD86wbDX2evz5yF9+diEUTYwP8MasLvO2biF1SlbQ5z7m5uXBwcMCjR49q/P4W7ciNs7MzXF1dcf78eZVwc+7cOfTr16/KPkVFRZDL5XBwcFBpb9q0KW7cuFHtvkxMTGBiYlKp3cjISCsfcG2NS6o4z7rDudYNzrNuNMR5Ph2TiTUnYwEAn41qAz9nG3ELUoM25lnd8US9WmrGjBlYv349YmPLf2G//PIL7ty5g2nTpim3+fDDDzFy5EgAgJOTEwIDA7Fq1SoUFBQAAKKjo7Fr1y707dtX92+AiIhIyzLyijHnt6sQBOD5zh4YHuQmdkn1nmhHbgDgnXfeQXx8PPz9/eHg4IDCwkJs2LABQUFBym1SUlIQExOjfL19+3a89NJLygXFKSkpGD9+PN5//30R3gEREZH2yBUC5my7isz8Evg7W+LDoa3ELqlBEDXcGBoaYsOGDfjqq6+QmZkJT0/PSqePPvnkE5UFRK1atcL58+eRk5ODrKwsuLu7V3nKiYiIqKFbffQuzt7LgrmxAVaP7wBTI97PRh2ihpsKtra2sLW1rfJnrq6uVbbb2NjAxsZGi1URERGJ596DfHxztPzMxacjWsPX0ULkihoO0Z8tRURERJWtOBIDuUJAP39HjOrgLnY5DQrDDRERUT0TdT8XeyNTAQDzB7QUuZqGh+GGiIionvk67A4AYHBbFwS6au5+bI0Fww0REVE9EpmUg8O30iGVAHP7+4ldToPEcENERFSPfPXPUZsR7d3g62gpcjUNE8MNERFRPRERl42Tdx7AUCrBnH4txC6nwWK4ISIiqgcEQcCXh28DAMZ28oCnveYf7NxYMNwQERHVA2fuZiEiLhvGhlK83tdX7HIaNIYbIiIikf37qM2EYE+4WJuJXFHDxnBDREQksqPRGbialAMzIwPM7N1c7HIaPIYbIiIiESkUAr46XH6F1OQQbzhamopcUcPHcENERCSigzfTcOt+LixMDDGjp4/Y5egFhhsiIiKRyBUClv9zX5up3ZvBtomxyBXpB4YbIiIikfx5NQV3M/JhbWaEqT2aiV2O3mC4ISIiEoFMrsCKIzEAgFd6NYeVqZHIFekPhhsiIiIR7LiUjMTsQjhYGGNyiJfY5egVhhsiIiIdK5bJ8c3f5UdtZvX2hbmxocgV6ReGGyIiIh3bFpGI+4+K4WxlivHBnmKXo3cYboiIiHSoqFSO1cfuAQBe7+cLUyMDkSvSPww3REREOvTLuXhk5pfAw84MYzp6iF2OXmK4ISIi0pG8YhnWnCg/ajO7XwsYG/JrWBs4q0RERDqy4XQ8cgpl8GnaBCOCXMUuR28x3BAREelATmEp1p+KBQDMC20BQwN+BWsLZ5aIiEgHfjgZi7ySMvg7W+KZ1i5il6PXGG6IiIi0LDO/BBvPxAMA5g9oCalUIm5Beo7hhoiISMvWHL+HIpkc7dyt0T/AUexy9B7DDRERkRalPSrGr+EJAMqP2kgkPGqjbQw3REREWrT6WAxKyxTo7G2HHn4OYpfTKDDcEBERaUlSdiG2RSQBAOYPaMGjNjrCcENERKQlK/+OQZlCQA8/BwT72ItdTqPBcENERKQF9x7kY9flZADla21IdxhuiIiItGDFkRgoBKB/gBOCPGzELqdRYbghIiLSsKj7udgbmQqg/G7EpFsMN0RERBr2ddgdAMDgti4IdLUSuZrGh+GGiIhIg64l5+DwrXRIJcDc/n5il9MoMdwQERFp0FeHy4/ajGjvBl9HS5GraZwYboiIiDTkQnw2Ttx5AEOpBHP6ca2NWBhuiIiINEAQBCw7dBsAMLaTBzztzUWuqPFiuCEiItKAM3ezEBGXDWNDKV7v6yt2OY0aww0REdETEgQBXx4uP2ozIdgTLtZmIlfUuDHcEBERPaGj0Rm4mpQDMyMDzOzdXOxyGj2GGyIioiegUAjKK6Qmh3jD0dJU5IqI4YaIiOgJHLyZhlv3c2FhYogZPX3ELofAcENERFRncoWA5f/cjfil7s1g28RY5IoIYLghIiKqsz+vpuBuRj6szYwwrUczscuhf9Qp3Hz66aearoOIiKhBkckVWHEkBgDwSq/msDI1ErkiqlCncLN48WKUlZVpuhYiIqIGY8elZCRmF8LBwhiTQ7zELof+pU7hpn379jhz5oymayEiImoQimVyfPN3+VGbWb19YW5sKHJF9G91+m2MGjUK48aNw/z58xEYGAhjY9UFVP3799dIcURERPXRtohE3H9UDGcrU4wP9hS7HPqPOoWbBQsWAADeeuutKn8uCELdKyIiIqrHikrlWH3sHgDg9X6+MDUyELki+q86hRuGFyIiaqx+ORePzPwSeNiZYUxHD7HLoSrwUnAiIiI15RXLsPZE+VGb2f1awNiQX6P1UZ1XQMnlchw4cABRUVEQBAGBgYF45plnIJXyF01ERPppw+l4PCyUoXnTJhjZ3k3scqgadQo3CQkJGDp0KKKiouDl5QWJRIKEhAT4+/tj79698PLiJXFERKRfcgpLsf5ULABgbmgLGEglIldE1anTYZY33ngD7u7uSExMxN27dxETE4OEhAS4u7vjjTfe0HSNREREovvhZCzySsrg72yJZ1q7iF0O1aBOR27+/vtvREdHw8Xlf79cFxcX/PDDD/D396/VWPHx8di4cSPS09PRpk0bTJ06FaamNT9RVRAE7N27F0ePHoW5uTleeOGFWu+XiIhIXZn5Jdh4Jh4AMH9AS0h51KZeq9ORG4lEUuUVUwqFolZrbm7cuIF27drh1q1b8PPzw9q1a9G7d2/IZLJq+8hkMgwfPhyvvfYanJyc4OTkhEmTJuH69et1eStERESPteb4PRTJ5Gjnbo3+AY5il0OPUacjN6GhoZg+fTp+/PFHuLmVL6hKTk7GtGnTEBoaqvY4CxYsQOfOnfH7778DACZOnAgvLy/88ssvmDp1apV9li9fjhMnTuDmzZtwd3cHALzyyisoKCioy1shIiKqUdqjYvwangCg/KiNRMKjNvVdnY7cfPPNN8jMzISnp6fyj5eXF7Kzs7Fy5Uq1xigtLUVYWBiee+45ZZuTkxP69u2LvXv3Vtvv+++/x6RJk5TBBgBMTExgZ2dXl7dCRERUo9XHYlBapkBnbzv08HMQuxxSQ52O3Li7u+PChQv4+++/cfPmTUgkEgQGBqJfv35qJ9rExETIZDJ4e3urtHt7e+PUqVNV9nn06BHi4uIQHByM9evX49KlS3B1dcXzzz8PX1/favdVUlKCkpIS5evc3FwA5ae4ajoFVlsVY2lyTKqM86w7nGvd4DzrRl3mOelhIbZFJAEAZvfz4UOj1aDNz7O6Y0qEOtxuuFOnTrhw4UKti/q369evo23btjh79iy6du2qbF+wYAF27tyJu3fvVuqTnJwMDw8P+Pj4IDg4GN27d8f58+exbds2HDx4EH369KlyXx999BE+/vjjSu1btmyBubn5E70PIiLSX5vvShHxQAp/awVmBirELqfRKywsxPjx4/Ho0SNYWVlVu12djtzcuXMHeXl5sLS0rHOBFUXl5OSotGdnZ8Pa2rrKPhXtLVu2xJYtWwAAs2bNQl5eHj788MNqw82iRYswb9485evc3Fx4eHhgwIABNU5ObclkMoSFhSE0NBRGRkYaG5dUcZ51h3OtG5xn3ajtPMc+KMDF8DMAgE/HdUU796q/m0iVNj/PFWdeHqdO4Wb48OHYuHHjE93TxsPDA9bW1rh58yYGDRqkbL9x4wZat25dZR9LS0t4eXlV+nmrVq2wefPmavdlYmICExOTSu1GRkZa+YtEW+OSKs6z7nCudYPzrBvqzvPqE3FQCED/ACc81YxrbWpLG59ndcerU7hRKBSYPXs2tm/fjsDAQBgbG6v8fPXq1Y8dQyqV4rnnnsOGDRvwyiuvwMLCAufPn8f58+fx0UcfKbfbuHEj7t27h08//RQAMGnSJOzZsweLFy+GiYkJZDIZDh48iE6dOtXlrRAREVUSdT8XeyNTAQDzQluIXA3VVp2ulsrPz8fw4cPh4OCAjIwMJCcnq/xR15IlS2Bqaoo2bdpg2LBhCA0Nxeuvv46BAwcqtzlz5gz++OMP5etFixbB0dERAQEBGDt2LAICAlBSUoLly5fX5a0QERFV8nXYHQDA4LYuCHTV3PIF0o06HbnZtGkTLCwsnnjndnZ2iIiIwMmTJ5Geno7PPvus0imnl156CUOHDlW+Njc3x+HDhxEeHo6EhATMmTMHwcHBMDAweOJ6iIiIriXn4PCtdEglwNz+PGrTENUp3FhZWUGh0MyqcUNDQ/Tt27fan4eEhFRqk0gk6Nq1q8pVVkRERJrw1eHyozYj27vD1/HJ/yFPulen01JOTk5IS0vTdC1ERESiuhCfjRN3HsBQKsHsfn5il0N1VKdw8+qrr+Ktt95Cfn6+pushIiIShSAIWHboNgBgbCcPeNrzPmgNVZ1OS23ZsgVRUVHYsWMHPDw8Kl0tdePGDY0UR0RE9U9mfglmb7sCU0MD9A1wRF9/R7hYm4ld1hM7czcLEXHZMDaU4vW+1d/1nuq/OoWbl19+WdN1EBFRAyAIAt7dfR1n7mYBAP6OzgAABLpYoX+AI/oGOKGtmzWk0ob1cElBEPDl4fKjNhOCPfUirDVmdQo3c+bM0XAZRETUEOyJTMWhm+kwlErwck8fnI/LxuXEh7h1Pxe37ufim6N34WBhgr7+TdHX3wk9/BzQxKROXzU6dTQ6A1eTcmBmZICZvZuLXQ49oSf6xBUVFSE+Ph4BAQGaqoeIiOqpjNxifPDnTQDA6339MLt/+YLbrPwSHL/9AEejM3DizgNk5pdg+8VkbL+YDGMDKYJ97NA/wAl9/R3hYVf/1rEoFILyCqnJId5wtDQVuSJ6UnUKN/n5+XjllVewdetWKBQKVDx7c+zYsViwYAE6duyo0SKJiEhcgiDgnd3X8ahIhlauVpjV539HN+wtTDC6oztGd3RHaZkCF+Kz8XdUBv6OTkdCViFOxWTiVEwmPtxzEy2cLNAvwAn9/B3R3tMWBvXg9NXBm2m4dT8XliaGeKWXj9jlkAbUKdwsWrQIKSkpuHDhgkqQmTJlCj7++GPs2bNHYwUSEZH4dl9JwZGoDBgZSPDV2HYwMqj6YltjQym6+Tqgm68D3h8SgHsPCnA0Oh1/R2XgYsJD3EnPx530fKw5fg+25kbo3dIR/QIc0bNFU1iZ6v65WnKFgOX/3I14ao9msDE3fkwPagjqFG52796NkydPwsdHNeF26dIFzz33nEYKIyKi+iE9txgf7Sk/HTWnfwv4O6v3OAKJRAJfRwv4Olrg5Z7N8ahQhuN3MnA0OgPHbz/Aw0IZdl9Jwe4rKTCUStDJ2w79AhzRP8AJ3g5NtPmWlP68moK7GfmwMTfCS92b6WSfpH11CjeZmZlwdHQEUP7hrVBUVKQ8RUVERA2fIAhYtOs6covL0NbdGjN61v20jbW5EYYHuWF4kBvK5ApcSniIo9EZ+Ds6A3cz8nEuNgvnYrPw6b4odPd1wLQezdCrRVOV7xlNkskVWHEkBgAwo2dzUY4ckXbUKdwEBQVh//79GDt2rMqHbuXKlQgODtZYcUREJK4dl5JxNDoDxgZSfDmmHQyrOR1VW4YGUgT72CPYxx6LnglAQlaBcp3OuXtZOH03E6fvZsLP0QLTejTD8CA3mBpp9hmCOy4lIzG7EA4Wxpgc4qXRsUlcdQo3n376KUaNGoWzZ88CAD7//HMcPHgQZ86cwdGjRzVaIBERieP+oyJ8svcWAGBuaAu0cLLU2r687Jvgpe7N8FL3ZkjKLsRPZ+Px24UkxGTkY8HO61h26DYmdfHGxC6esLcweeL9Fcvk+Obv8qM2s3r7wty4/l+uTuqrUwTv378/Dh06hLi4ODg7O2PFihUwNzfHiRMn0L17d03XSEREOiYIAhbuvI68kjIEedhgeg/drUfxsDPH+0MCcXZRX7z7TABcrU2RmV+Kr4/cQcjSo1i06zruZjzZ43+2RSTi/qNiuFibYnywp4Yqp/qizlG1a9eu+PPPPzVZCxER1RPbLybhxJ0HMDbU7Omo2rAyNcL0nj6Y0s0bB26kYf2pWFxLfoStEYnYGpGIvv6OmNa9Gbo2t6/VupyiUjlWH7sHoPx+PZo+3UXi43E4IiJSkZJThMV/RQEA3hzQAr6OFqLWY2QgxbB2rhja1gUX4h9i/alYhEWl42h0+ZVXgS5WmNajGYa0dYWx4eND2K/nE5GZXwJPO3OMecpdB++AdI3hhoiIlARBwIId15BfUoYOnjaY2r3+3NROIpGgczM7dG5mh7jMAmw8E4ffLybj1v1czNseic8PRmNyiDfGd/as9n41xWXAulPxAIDZ/fyqvV8PNWz8rRIRkdKWiEScvpsJk39OR9WHOwhXpZlDE3wyvDXOLeqLtwa2hKOlCdJzS/DFwdvouuQoPvzzBhKyCir1O35fgpwiGZo3bYIR7d1EqJx0geGGiIgAAEnZhfhsX/npqLef9odPU3FPR6nDxtwYr/bxxekFffHVmHbwd7ZEkUyOn88loPeXxzHj14u4EJ8NQRCQUyjDsfvlX3tzQ1vU2+BGT46npYiICAqFgAU7r6GgVI5O3rZ4McRb7JJqxdhQitEd3TGqgxvO3svC+lOxOHb7AQ7dTMehm+lo52EDRwtjFMsl8HeywDOtXcQumbRI7XDj7e2t9qDx8fF1KIWIiMSy+XwCzt7LgqmRFMuebQdpAz2qIZFIlM+2iknPw4Yzcdh5OQWRSTnKbeb0822w74/Uo3a4ee+997RZBxE1EgqFgEuJDyGVSNDRy1bscghAYlYhPtsfDQBY+LS/zp7rpG1+TpZYMqot5g9oiU3hCdgWkYimBkXo699U7NJIy9QON9OmTdNmHUSk5xKzCrHzcjJ2Xk5G8sMiAMDiEa0xqQtvey8mhULAWzsiUSSTI7iZHV7o6i12SRrnYGGCOf1b4NVezbB//36tPauK6o8nXnNTUlICQRBgamqqiXqISI/kl5Rh/7X72HE5GRFx2cp2Y0MpSssUeP+PGyiRyTGtR/253FjXHhXK8MXBKJRlSjBQIUDXj2785Vw8zsdlw9zYoEGfjiL6tzpfLbVu3Tr4+vrCzMwM5ubm8PX1xbp16zRZGxE1QHKFgNMxmZj721U89WkY3t55DRFx2ZBIgB5+Dlg5LgiRHwzAzN7NAQCf7ovCd8fvily1eD7aexObI5LwW6wBnv3+PC4nPtTZvuMzC7D0YPnpqEWD/OFpb66zfRNpU52O3CxbtgyLFy/GG2+8gS5dukAikeDcuXOYP38+cnJy8NZbb2m6TiKq52If5GPn5WTsvpyC1EfFynafpk3wbEd3jGzvBhdrM2X72wNbwsRQihVHYvDFwdsokSkwp79fozplcOLOA+y+kgKJBDCRCriRmotR353FmI7uWDDIHw4aeEBkdSpORxXLFAhpbo8JwTw9SPqjTuFm9erV2Lp1KwYPHqxsGzx4MLp27YpXX32V4YaokXhUJMNf11Kx81IyLifmKNutTA0xLMgVozu4I8jDpsrAIpFIMKd/CxgbSvHFwdtY+XcMSsoUWPB0y0YRcApKyvDOrusAgMldPNG8NBZXFJ7YdSUVv19KxqGbaZg/oCUmBHtq5blOG8/G40L8QzQxNsDno9vydBTplTqFm/v376NHjx6V2rt3747U1NQnLoqI6q8yuQKn7mZi56VkHL6VjtIyBQDAQCpBrxZNMbqDO/oFOKr9MMJZvX1hYmiAxX/dwtoT91BSJscHQwL1PuAsD7uDlJwiuNmYYU4/X5z4OxafP9MaE7p44YM/b+Jmai4+3HMTWyMSsXhEa3TyttPYvmMf5OOLf05HvTs4EB52PB1F+qVO4aZ58+bYtWsXpkyZotK+Y8cONG/eXBN1EVE9cyc9DzsvJWP3lRRk5JUo21s6WeLZju4Y3t4VjpZ1u7BgavdmMDGU4r0/bmDjmXiUlimweHhrvT2aEJmUg41n4gAA/zeyNZqY/O+v4o5edtjzWndsiUjEl4duIzotD2PWnsPI9m5YNMgfjlZPdvGGXCHgzd8jUVKmQA8/Bzzf2eOJxiOqj+oUbt5//31MnjwZBw8eROfOnQEA58+fx65du/DLL79otEAiEs/DwlKcvC/B+rXhuJ6Sq2y3NTfC8CA3PNvRHa1crTRylGViFy8YG0qxYOc1bD6fiJIyBT4f3VbvbpEvkyuwYOc1KARgRJArerd0hEwmU9nGQCrBpC5eGNzGBcsORWPbhSTsvpKCsFvpmNPfD5NDvOv8wMcfT8ficmIOLEwMsXR0W70/QkaNU53Czfjx4+Hm5oZly5Zh1apVkEgkCAwMxN9//42ePXtqukYi0rFbqblYfzoWeyNTIZMbAMiFoVSCvv6OGN3RHX1aOsLYUPPrQMY+5QETQynmbY/EjkvJKC1TYPnYdlpZcyKWH07GIjotD7bmRnh/SGCN29o1McaSUW0xrpMnPvjzBiKTH+HTfVHYfjEJHw1rhZDmDrXa992MfHx5+A4A4P0hAXCzMXtMD6KGqc73uenVqxd69eqlyVqISEQKhYATdx5g/elYnLmbpWx3byJgSi9/jOzgAXstXr1TYXiQG4wNpHh96xXsiUyFTK7AynHttRKmdC0uswAr/44BALw/JFDt+WznYYPds7ph+8UkfH4wGnfS8zF+3XkMaeuCdwcHqFyFVp0yuQLzf49EaZkCvVo0xdineDqK9Fed/rYQBAGJiYmV2hMTEyEIwhMXRUS6UyyTY2tEIgasOIkXf7qAM3ezYCCVYGg7V+ycEYy32soxuauXToJNhUFtXLB2YkcYG0hx4EYaZm66hGKZXGf71wZBELBo1zWU/rPWZWR7t1r1l0olGNfZE8fe7I1JXbwglQB/XbuPfl+dwJrj95QLu6uz7lQcIpNyYGlqiKWj2/B0FOm1OoWbb775BsuXL6/Uvnz5cqxevfqJiyIi7cvML8HXYXfQbelRLNp1HXcz8mFpYojpPZrh5Nt9sOr59mjrbi1aff0DnbBu8lMwMZTi7+gMTP/lIopKG27A2X4xCeGx2TAzMsBnI+seLmzMjbF4RGvsea07OnjaoLBUjs8PRuPpFSdx8s6DKvvcSc/D12Hlp6M+GBKo1pEeooasTqelVqxYgePHj1dqnzNnDkJDQ/H6668/aV1EpCV3M/Kw/lQcdl1JUf5r383GDC9288ZznTxgaarrBwBUr1eLptj4YidM+/kiTsVk4sWfIvDj5E4qVxc1BBm5xfi/fVEAgPkDWmjk0uvWbtbY8UoIdl1JwdIDUYjNLMALGyLwdCtnvDckAO625fsokyvw5u+RKJUr0NffEc92dH/ifRPVd3X6GyItLQ3m5pX/4zQ3N0dycvITF0VEmiUIAs7ey8K6U7E4fvt//7oP8rDB9B4+GNjKqd4u2g1p7oBfXuqMKRsvIDw2Gy9siMDGFzvBqh6FsMf5aO9N5BaXoY2bNaaEeGtsXKlUgmc7umNAKyd8HXYHv5xLwMGbaTh+JwOv9vbF9J4++PF0HK4lP4KVqSGWjOLpKGoc6vS3WYcOHbB+/fpK7evWrUNQUNCT1kREGlJapsCOS8kYtPIUJqw/j+O3H0AiAZ5u5YydM7ti96wQDG7rUm+DTYWnvO2waVowrEwNcSnhISauP4+cwlKxy1LL4Ztp2H89DQZSCZaObqOVubYyNcKHQ1th3xvd0bmZHYplCnwVdgcDvj6JFUfKT0d9PLwVnJ7wHjlEDUWdjtx8/PHHGDRoEM6dO4eePXtCEAScPHkSBw8exIEDBzRdIxHVUk5hKTafT8TPZ+OVN9wzNzbA2Kc88GI3b3jZNxG5wtoL8rDBluldMOnH87iW/Ajj153Hr1M763Shc23lFcvwwZ83AQAv9/RBK1ftrmHyd7bCby93wZ7IVPzfvigkZhcCAPoHOGFEUO0WMBM1ZHUKN/3798fRo0exdOlSfPXVV5BIJGjfvj2OHTuG7t27a7pGIlJTXGYBNpyOw45LySj65+oiJysTTAlphvGdPWFt3nBO5VSltZs1tr3cFRPWn8et+7kY90M4Nk8PrvOdkbXti4O3kZZbDG97c8zu56eTfUokEgwPckO/ACd8e+wu7mXk4/+eYAEzUUNU51V5PXr0qPL5UkSkW4Ig4EL8Q6w7FYsjUemouBtDoIsVpvdshsFtXPXiHjEVWjpb4rcZXTB+XThiMvIx7vvygFPfrgC6GJ+NX8MTAACfjWqj9rO2NMXCxBALnvbX6T6J6osnvuSgpKQEgiDA1LR+/suJSF/J5AocuJGGH0/FIjL5kbK9n78jpvXwQRcfO73913rzphbYPqMrxq87j9jMAoz9/hy2TOtSbx4AWVImx4Kd1wAAY59yr/WdhInoydT5n3Pr1q2Dr68vzMzMYG5uDl9fX6xbt06TtRFRFXKLZfjh5D30+uIY3th6BZHJj2BiKMX4YE/8Pb8XfpzSCV2b2+ttsKngZd8Ev83oAi97cyRlF+G5788hPrNA7LIAAN8du4d7DwrgYGGCd54JELscokanTkduli1bhsWLF+ONN95Aly5dIJFIcO7cOcyfPx85OTl46623NF0nUaOXlF2IjWfi8duFRBT8czM7BwtjvNDVGxOCPev1wlptcbc1x28vd8X49eGIffDPEZzpXeDraCFaTXfS8/Dd8bsAgI+HtYKNubFotRA1VnUKN6tXr8bWrVsxePBgZdvgwYPRtWtXvPrqqww3RBp0JfEh1p+Kw4Eb96H4Zz1NCycLTOvug2FBrjpfy1HfOFub4reXu2Li+vO4nZ6HcT+cw8YpndFGhLsrKxQCFu68BplcQP8ARzzTxlnnNRBRHcPN/fv3q1xM3L17d6Smpj5xUUSNnVwhIOxWGtadisOlhIfK9h5+DpjWwwc9/Rz0/rRTbTS1NMHWl7tg4j9XUY387gxe6+uLV/v4wkiH9/DZdD4BlxNzYGFiiMUjWvN3RCSSOoWb5s2bY9euXZgyZYpK+44dO9C8eXNN1EXUKBWUlGH7xSRsOBOHpOwiAICxgRTDg1wxtUcz+DtbiVxh/WXXxBhbp3fBgp3XcPBmGlYciUHYrXR8OaYdAly0P2+pOUX4/EA0AODtp1vWu6u3iBqTOoWb999/H5MnT8bBgwfRuXNnAMD58+exa9cu/PLLLxotkKgxuP+oCD+djceW84nIKy4DANiYG2FSFy9M6upVb+/jUt9YmxthzcQO2HvtPj748wZupuZi2OrTmN3PD6/0aq61OzELgoD3/7iBglI5OnjaYGKwl1b2Q0TqqVO4GT9+PNzc3LBs2TKsWrUKEokEgYGB+Pvvv9GzZ09N10ikt26kPML6U7H469p9lP2zoMbHoQle6t4Mozu4w8y4ca+nqQuJRIJh7VzRxccO7+6+UX705vAdHLpZfhSnpbOlxve57/p9/B2dASMDCT4f3RZSKU9HEYmpTuHmyy+/xJtvvolevXpV+zMiqppCIeBodAbWn45FeGy2sj24mR2m9/BBX39HfjlqgKOlKX6Y1BF/XE3BR3tu4XrKIwxddRqz+/thRk8fjR3FySksxUd7yh+xMKu3L/ycNB+eiKh26vRfd01XQ/FKKaKqFZXKsSk8Af2Xn8C0Xy4iPDYbBlIJhge5Yu9r3fHbjK7oH+jEYKNBEokEI9u74/Dcnujn74hSuQLLDt3G6DVncTcjTyP7+Gx/FDLzS+HraIFZfbjmkKg+eOI7FP/bvXv3YG9vr8khiRq8gpIy/HQ2HutPxeJhoQwAYGlqiPGdPTE5xBuuNlx4qm1OVqZYP/kp7Lqcgo/23kRk8iM8881pzA9tgWk9fGBQx0B59m4mtl9MBgAsHdUGJoY8jUhUH9Qq3Pj6+lb5/wFAoVAgNTUVEyZM0ExlRA1csUyOLecT8d3xu8jMLwUAuNua4aVuzTC2kwcsTDT6bwt6DIlEgtEd3dHN1wELd13D8dsPsORANA7eTMOXY9qhedPa3fivWCbHot3XAQCTunjhKW87bZRNRHVQq79dK9bSzJw5s9K6GiMjI3h7e6NPnz6aq46oASqTK7DjUjK++TsGqY+KAQCeduaYG+qHoW1dtXbFDqnH2doUG6d0wu8Xk7H4r1u4kpiDZ1aewlsDW+LFbs3UPoqz4kgMErIK4WxlirefbqnlqomoNmoVbl555RUAgIODA5599lmtFETUUCkUAvZeS8WKIzGI++cZR85Wpnijnx/GPOWu05vJUc0kEgnGdvJAdz8HLNh5DadiMvHpvigcvJGGZWPaoZlDkxr730x9hHWnYgEAi0e0hqWpkS7KJiI11em4+L+DDZ8KTo2dIAj4OyoDXx6+jei08kWqdk2MMat3c0zs4tXoH49Qn7namOGXlzrjtwtJ+HRfFC4mPMSglSfx9kB/TAnxrnJxd5lcgYU7r0OuEDC4jQtCA51EqJyIasKnghM9gbN3MzHyu7OY9stFRKflwdLUEPNDW+Dk230wrYcPg00DIJFIMK6zJw7O6YFuvvYolinwyV+3MG5dOBKyKj9lfOOZeFxPeQQrU0N8OCxQhIqJ6HFEfyp4SUkJDh8+jPT0dLRp0wbBwcFq97137x4OHDiAoKAgdO/evS5vhahOLic+xJeHbuPsvSwAgJmRAaZ088aMnj58CnQD5W5rjk1Tg7H5fCI+2x+FiLhsPL3iFBYO8sekLl6QSiVIzCrEV2G3AQDvDg7gnaOJ6ilRnwqekZGB3r17AwDatWuHt99+G6NGjcL69esf27ekpASjR49GTEwMpk+fznBDOhF1PxdfHb6NI1EZAMqf+zQ+2BOz+jTnF50ekEgkmNjFC71aNMXbO67hXGwWPtxzEwdu3MeyZ9vh3T+uo1imQFcfe4x9ykPscomoGqI+FXzhwoUwMjJCeHg4zMzMcPXqVXTs2BHDhw/H0KFDa+w7b948hISE1Lp2orqIfZCPr4/EYG9k+edbKgGe7eiON/r5wd3WXOTqSNM87MyxeVowNp9PwGf7oxEem41+X51AqVwBY0MpPhvVhk/8JqrH6rTmpuKp4P9Vm6eCKxQK7NixA1OmTIGZWflNzIKCghASEoLffvutxr67d+/G0aNH8eWXX9a+eKJaSMkpwoId1xD69UllsBnS1gVh83rhi2fbMdjoMalUgkldvXFwTg90bmaHUrkCADCnv99jr6YiInGJ9lTwpKQk5OXlISAgQKU9ICAAFy9erLHfzJkzsX//fpibq/fFUlJSgpKSEuXr3NxcAIBMJoNMJlNrDHVUjKXJMakyXcxzZn4J1pyIw9YLSZDJyx9o2aelA+b080Wgi5XW919f8DMNuFoZ49cpHbHzSgrSc0swpYuHxueD86wbnGfd0OY8qzumaE8Fz8srv2TWxsZGpd3W1lYZPv5LLpdj/PjxmDt3Ljp06KB2vUuWLMHHH39cqf3w4cNqB6TaCAsL0/iYVJk25rmwDDiaKsWJ+xKUKspPO/haKTDEU4FmlmmIv5KG+Csa3229x8800ASAD4CwQ7e1tg/Os25wnnVDK39HFxaqtV2dws2mTZswceLEKp8Krq6KU1EVIadCbm5utYFj8+bNuH79OsaMGYPVq1cDADIzMxEZGYnVq1fj1VdfrfI8+KJFizBv3jyVfXh4eGDAgAGwsrKq83v4L5lMhrCwMISGhsLIiDf10pYnnWe5QkDqoyLEZxYiLqsQ8ZkFyv9NeVQMofxADdq6W2Fefz+E+Ng12vUV/EzrBudZNzjPuqHNea7u4Md/1SncvPjiixg/fjyk0rrfcdXT0xPGxsaIi4tTaY+NjYWfn1+Vfby9vTFx4kTcuXNH2VZSUoKHDx8iOjoagiBU+SVkYmICExOTSu1GRkZa+YBra1xSVdM8C4KArIJSxGUWIO5BAWIzCxCXmY+4zALEZxWitExR7bj+zpaYP6Al+gc4NtpQ81/8TOsG51k3OM+6oY15Vne8OoWbli1bIjIyEu3bt69LdwDlBQ4aNAhbtmzB9OnTIZFIkJycjOPHj+OHH35Qbnfs2DGkpaXh+eefR8+ePSud9jp9+jR69+6NFStW1LkWargKSsrKA8y//sRmFiDuQT5yi8uq7WdsIIWXvTmaOTRBs6ZN0NzBAs2aNkEzhyawb2LMUENE1IDVKdy8+uqrGD9+PBYvXozAwEAYG6vetOy/Twyvzueff46QkBAMGTIEwcHB2LRpE0JCQlSeLL5582aEh4fj+eefr0uppIeO3n6A1Tel+OzGCaTnlVS7nUQCuFqbwadpE/g4NPknyFjAx6EJXG3M1H5AIhERNSx1CjezZs0CAIwZM6bKnwsVixYeo2XLlrhx4wZ+/fVXpKen45133sGECRNgaPi/svr27QsfH59qxxg3bly1p7FI//x8Nh4f7b0JQZACKA82dk2M0czhnwCjDDIW8LI35+MPiIgaoTqFm/+uk3kSLi4uePvtt6v9+fjx42vsv3DhQo3VQvWXIAhYdug2vjt+DwDQ1VGBeSO6wM/Zmo87ICIiFbUKN4Ig4JtvvsGePXsgCAKGDx+ON954g+sTSKtkcgUW7LyGXZdTAABz+vnCuyAaQR42XBRIRESV1Opyp2XLluHNN9+EqakpzMzM8Oabb2LZsmXaqo0IBSVlmPrzRey6nAIDqQRfjG6LV3v7gHmaiIiqU6tw8+OPP2Lr1q3Yt28f9u3bh82bN2PDhg3aqo0auQd5JRj3QzhO3nkAMyMDrHuhI8Z24sMKiYioZrUKN/Hx8RgyZIjy9bBhwxAfH6/pmogQn1mAZ9eexfWUR7BrYoytL3dBX38nscsiIqIGoFZrbkpLS2Fqaqp8bWpqqvLMJiJNiEzKwUs/XUBWQSk87Mzw84ud4dPUQuyyiIiogaj11VLTpk17bNv69evrXhE1asduZ2DWpssoksnR2s0KG6Z0gqOl6eM7EhER/aNW4aZbt26Ijo5+bBtRXfx+MQkLd12HXCGgh58D1kzsCAuTOt2tgIiIGrFafXOcPn1aW3VQIyYIAr49dhdfHi5/ZtjI9m74fHRbGBvW/dllRETUePGfxSQquULAR3tu4tfwBADAjF4+WDDQH1I+GoGIiOqI4YZEUyyTY/a2Kzh0Mx0SCfDBkEC82K2Z2GUREVEDx3BDosgpLMW0ny/iYsJDGBtI8fVzQRjc1kXssoiISA8w3JDOpeQUYfKGCNzNyIelqSF+mPQUuja3F7ssIiLSEww3pFPRabmYsuEC0nKL4WRlgp9f6gx/ZyuxyyIiIj3CcEM6c+5eFl7+9SLyisvg52iBn17qDDcbM7HLIiIiPcNwQzqx79p9zP3tKkrlCnTytsW6F56Cjbmx2GUREZEeYrghrdt4Jg6f/HULggAMbOWElePaw9TIQOyyiIhITzHckNYoFAI+PxSN70/EAgAmdfHCR8NawYD3sCEiIi1iuCGtKJMr8NaOa9h9JQUA8NbAlpjVuzkkEgYbIiLSLoYb0oplh29j95UUGEglWDqqDcY85SF2SURE1Egw3JDG7bt2X3kq6uvngjCsnavIFRERUWPCJxOSRsWk5+GtHZEAgJd7+jDYEBGRzjHckMbkFssw49dLKCyVo6uPPd4e2FLskoiIqBFiuCGNUCgEzN8eidjMArham2L1+PYwNODHi4iIdI/fPqQR3x2/i7Bb6TA2lGLtpI6wtzARuyQiImqkGG7oiR2/nYGvwu4AAD4d3hpt3W3ELYiIiBo1hht6IolZhZi97SoEARgf7ImxnXjJNxERiYvhhuqsqFSOGZsu4VGRDEEeNvhwaKDYJRERETHcUN0IgoBFu64h6n4uHCyMsWZiB5gY8nlRREQkPoYbqpOfzsbjj6upMJBKsHp8B7hYm4ldEhEREQCGG6qD87FZ+L99UQCAd54JQBcfe5ErIiIi+h+GG6qVtEfFeHXLFZQpBAwPcsVL3bzFLomIiEgFww2praRMjpmbLyEzvwT+zpZYMqoNn/JNRET1DsMNqW3xX7dwJTEHVqaG+H5SR5gb87mrRERU/zDckFq2X0zCpvBESCTAyufbw8u+idglERERVYnhhh7revIjvPfHDQDA3P4t0Kelo8gVERERVY/hhmqUXVCKVzZdQmmZAv0DHPFaH1+xSyIiIqoRww1Vq0yuwOtbLyMlpwjNHJpg+XNBkEq5gJiIiOo3hhuq1rLDt3HmbhbMjQ2wdmJHWJkaiV0SERHRYzHcUJX2XbuP70/EAgC+eLYtWjpbilwRERGRehhuqJKY9Dy8tSMSADCjpw+GtHUVuSIiIiL1MdyQitxiGWb8egmFpXKENLfHWwNbil0SERFRrTDckJJCIWD+9kjEZhbA1doUq55vD0MDfkSIiKhh4TcXKX13/C7CbqXD2FCKtZM6wt7CROySiIiIao3hhgAAx29n4KuwOwCAT4e3Rlt3G3ELIiIiqiOGG0JiViFmb7sKQQDGB3tibCcPsUsiIiKqM4abRq6oVI4Zmy7hUZEMQR42+HBooNglERERPRGGm0buk79uIep+LhwsjLFmYgeYGBqIXRIREdETYbhpxNIeFeP3i0kAgG/GtYeLtZnIFRERET05hptGbFN4AsoUAjp72yHE10HscoiIiDSC4aaRKpbJsSUiEQAwpZu3uMUQERFpEMNNI7UnMhXZBaVwszHDgEAnscshIiLSGIabRkgQBGw8Ew8AmNTVi3chJiIivcJvtUbofFw2ou7nwtRIinG8pw0REekZhptGaOOZOADAqA7usDE3FrkaIiIizWK4aWSSsgsRdisdADAlxFvcYoiIiLSgXoSbpKQkXLx4Ebm5uWptL5fLERUVhZiYGJSVlWm5Ov3ya3gCFALQ3dcBLZwsxS6HiIhI40QNN8XFxRg9ejRatmyJSZMmwdnZGatWraqxz//93//Bzc0No0ePxoABA+Dt7Y2//vpLRxU3bIWlZdj2z+XfL/LybyIi0lOihpuPP/4YERERuHfvHqKiorBlyxa88cYbOH/+fJXby+VyFBUV4datW7h16xbi4uIwbdo0PPfcc0hLS9Nx9Q3PzsspyC0ug7e9Ofq0dBS7HCIiIq0QNdxs3LgR06ZNg4uLCwBgxIgRaN26NTZu3Fjl9gYGBvj0009hZ2enbJs5cyYKCwtx+fJlndTcUCkUAn76ZyHx5BBvSKUSkSsiIiLSDkOxdpyamor09HR07NhRpb1z5864cuWK2uNcuHABANC8efNqtykpKUFJSYnydcXaHplMBplMVpuya1QxlibH1JRTdzNx70EBmpgYYHhb53pZo7rq8zzrG861bnCedYPzrBvanGd1xxQt3GRnZwMA7O3tVdrt7e2VP3uczMxMvP766xg7dixatmxZ7XZLlizBxx9/XKn98OHDMDc3r0XV6gkLC9P4mE/q+ygpACk62spw6uhhscvRiPo4z/qKc60bnGfd4DzrhjbmubCwUK3tRAs3RkZGAMoXFf9bUVERjI0ff++VR48e4emnn4azszPWr19f47aLFi3CvHnzlK9zc3Ph4eGBAQMGwMrKqg7VV00mkyEsLAyhoaHK91cfxGUW4Na5M5BIgA/G9YSXveYDnS7V13nWR5xr3eA86wbnWTe0Oc/qXlUtWrjx8PCAVCpFSkqKSntKSgo8PT1r7Jubm4sBAwbAwMAABw8ehKVlzZc0m5iYwMTEpFK7kZGRVj7g2hq3rjZHJAMA+rZ0hK+ztcjVaE59m2d9xrnWDc6zbnCedUMb86zueKItKDY3N0dISAj27NmjbCsoKMCRI0cQGhqqbLt7967KGpyKYAOUn1ayttafL2ttyC2WYcel8nDzYrdmIldDRESkfaIduQGATz/9FKGhoVi0aBG6du2KVatWwdHRES+//LJym6VLlyI8PBw3btyATCbDoEGDEBcXhw0bNuD69evK7fz8/ODkxKdb/9fvF5NRUCpHCycLdPO1f3wHIiKiBk7UcNOrVy8cO3YM3377LSIiItCmTRv8+uuvsLCwUG7j5+eH0tJSAOULiSQSCfz8/LBkyRKVsRYuXIghQ4botP76Tq4Q8PPZeADAlJBmkEh4+TcREek/UcMNAHTr1g3dunWr9ucLFixQ/n9ra2ucPn1aF2XphaPRGUjMLoS1mRFGtncTuxwiIiKdqBfPliLtqHj697jOHjAzNhC5GiIiIt1guNFT0Wm5OHsvCwZSCV7o6i12OURERDrDcKOnfjoTDwAY2MoJbjZm4hZDRESkQww3euhhQSl2Xym/fxAv/yYiosaG4UYPbb2QiJIyBVq5WuEpL1uxyyEiItIphhs9I5Mr8Ou5BADlR214+TcRETU2DDd65tDNNNx/VAwHC2MMbecidjlEREQ6x3CjZzb+s5B4fLAXTAx5+TcRETU+DDd65FpyDi4lPISRgQQTu9T88FEiIiJ9xXCjRyou/x7S1hWOlqbiFkNERCQShhs9kZFXjL3XUgEAU0K8xS2GiIhIRAw3emJzeCJkcgEdPG3QzsNG7HKIiIhEw3CjB0rK5Nh8/n+XfxMRETVmDDd6YN+1+8jML4WzlSmebu0sdjlERESiYrhp4ARBUF7+PamrF4wM+CslIqLGjd+EDdylhIe4nvIIJoZSPN+Zl38TEREx3DRwFUdtRgS5wa6JsbjFEBER1QMMNw1Yak4RDt5MAwC82N1b3GKIiIjqCYabBuyXcwmQKwR09bGHv7OV2OUQERHVCww3DVRRqRzbLiQCAF7s5i1uMURERPUIw00D9cfVFOQUyuBhZ4Z+AU5il0NERFRvMNw0QOWXf8cBACZ39YaBVCJyRURERPUHw00DdPZeFu6k58Pc2ABjnvIQuxwiIqJ6heGmAao4avNsR3dYmxmJXA0REVH9wnDTwCRkFeDv6AwAwGQ+/ZuIiKgShpsG5uezCRAEoHfLpmje1ELscoiIiOodhpsGJL+kDL9fTALAp38TERFVh+GmAdlxMQl5JWXwadoEPXwdxC6HiIioXmK4aSAUCgE/n0sAALwY4g0pL/8mIiKqEsNNA3HizgPEZRbA0tQQozq4i10OERFRvcVw00Bs+Ofy73GdPNDExFDkaoiIiOovhpsG4GbqI5yKyYRUArzQ1VvscoiIiOo1hpt67lGRDK9tuQIAGNTaBR525iJXREREVL8x3NRjCoWA+duvIi6zAG42Zlg8orXYJREREdV7DDf12Opjd3EkKgPGhlKsndgRdk2MxS6JiIio3mO4qaeORWfg6yN3AAD/N6I12rhbi1wRERFRw8BwUw8lZBVg9rYrEARgYhdPPvmbiIioFhhu6pnC0jLM+PUScovL0N7TBh8MaSV2SURERA0Kw009IggCFu68jui0PDhYmGDNhI4wNuSviIiIqDb4zVmPbDgTjz2RqTCUSvDdhA5wtjYVuyQiIqIGh+GmngiPzcJn+6MAAO8ODkDnZnYiV0RERNQwMdzUA/cfFeG1LZchVwgYEeSKKSHeYpdERETUYDHciKykTI6Zmy4jM78UAS5WWDKqLSQSPvGbiIiorhhuRPbx3lu4mpQDazMjfD+xI8yMDcQuiYiIqEFjuBHRbxcSseV8IiQSYOW4IHja87lRRERET4rhRiSRSTl4/4+bAID5oS3Qu6WjyBURERHpB4YbEWTml+CVTZdQKlcgNNAJs3r7il0SERGR3mC40bEyuQKvb7mC+4+K4ePQBF+NbQeplAuIiYiINIXhRse+OHQb52KzYG5sgO8ndYSVqZHYJREREekVhhsd+utaKn44GQsA+HJMO/g5WYpcERERkf5huNGR22l5eHvHNQDAjF4+eKaNi8gVERER6SeGGx14VCTDK5suobBUjm6+9nhrQEuxSyIiItJbDDdaplAImL/9KuIyC+BmY4ZvxrWHoQGnnYiISFv4Latlq4/dxZGoDBgbSrFmYgfYW5iIXRIREZFeY7jRomPRGfj6yB0AwKcjWqOtu424BRERETUC9SbcKBQKnfTRlfjMAszedgWCAEzs4omxT3mIXRIREVGjIHq4WbJkCZycnGBkZIQ2bdrg6NGjWumjS4WlZXhl0yXkFpehvacNPhjSSuySiIiIGg1Rw83atWvx2WefYfPmzXj06BFGjRqFIUOGIC4uTqN9dEkQgHf/uIXotDw4WJhgzYSOMDYUPUMSERE1GqJ+6y5fvhxTp05F//79YWFhgY8++ggODg5Yu3atRvvo0ok0Cf66ngZDqQTfTegAZ2tTsUsiIiJqVEQLN1lZWYiJiUGvXr2UbRKJBL169cK5c+c01keXzsdl48/48il9d3AAOjezE7kiIiKixsdQrB2np6cDAJo2barS7ujoiIiICI31AYCSkhKUlJQoX+fm5gIAZDIZZDJZ7YuvQmZ+CWb/FgkFJBjSxgkTOrlpbGxSVTGvnF/t41zrBudZNzjPuqHNeVZ3TNHCTYX/XvGkUCggkdT8lOza9lmyZAk+/vjjSu2HDx+Gubl5LaqtoSYB6GQrxXVBgl5mKThwIEUj41L1wsLCxC6h0eBc6wbnWTc4z7qhjXkuLCxUazvRwo2LS/mzlTIyMlTaMzIy4OzsrLE+ALBo0SLMmzdP+To3NxceHh4YMGAArKys6lR/VQbKZDhwKAyDBobCyIhP+9YWmUyGsLAwhIZynrWNc60bnGfd4DzrhjbnueLMy+OIFm5sbW0RGBiIY8eO4dlnnwVQfgTm2LFjePHFF5XblZWVQaFQwNjYWO0+/2ViYgITk8p3BjYyMtL4xBtKtTMuVcZ51h3OtW5wnnWD86wb2phndccT9WqpBQsWYMOGDdi5cydSU1Mxb9485OfnY+bMmcptXnnlFXTo0KFWfYiIiKjxEnXNzQsvvID8/HwsWrQI6enpaNOmDcLCwuDu7q7cxsjISOWoizp9iIiIqPESfUHxrFmzMGvWrGp/vmbNmlr3ISIiosaLt84lIiIivcJwQ0RERHqF4YaIiIj0CsMNERER6RWGGyIiItIrDDdERESkVxhuiIiISK8w3BAREZFeYbghIiIivSL6HYrFIAgCAPWfLqoumUyGwsJC5Obm8qFsWsR51h3OtW5wnnWD86wb2pzniu/tiu/x6jTKcJOXlwcA8PDwELkSIiIiqq28vDxYW1tX+3OJ8Lj4o4cUCgVSU1NhaWkJiUSisXFzc3Ph4eGBpKQkWFlZaWxcUsV51h3OtW5wnnWD86wb2pxnQRCQl5cHV1dXSKXVr6xplEdupFKpVp8ibmVlxf9wdIDzrDuca93gPOsG51k3tDXPNR2xqcAFxURERKRXGG6IiIhIrzDcaJCJiQk+/PBDmJiYiF2KXuM86w7nWjc4z7rBedaN+jDPjXJBMREREekvHrkhIiIivcJwQ0RERHqF4YaIiIj0CsNNLT18+BAXL15ESkqKVvs0dkVFRbh06RLu3r2rdp/MzExcuXIFDx8+1GJl+kUul+PatWu4fv06FApFrfrGxMTg9OnTyM/P11J1+uX27du4fPkySkpK1O5TVFSEK1euID09XYuV6ZekpCRcvHhR7cfrCIKA2NhYXLp0CRkZGVquTn88evQIZ86cwf3799Xu8+DBA1y4cEE38yyQ2pYuXSqYmpoKAQEBgqmpqTB+/HihtLRU430au127dgnW1taCr6+vYG1tLYSEhAgPHjyodvuIiAihd+/egoODgxAUFCSYmZkJkydPFkpKSnRYdcNz+fJlwcvLS3BzcxOcnZ2F5s2bC9evX1erb2xsrGBraysAEC5cuKDlShu21NRUoWPHjoKtra3g4+Mj2NvbC/v3739svy+++EKwsLAQWrduLfj4+AhTp04VZDKZDipumIqKioRRo0YJZmZmgr+/v2BmZiZ88803NfaJjIwU/P39BScnJ6FDhw6Cubm5MGrUKKGwsFBHVTc8cXFxwvTp0wVnZ2fBwMBAWLVqlVr93nzzTcHExEQIDAwUTExMhNdff11QKBRaq5PhRk1HjhwRpFKpcOTIEUEQyn/BDg4Owv/93/9ptE9jl5SUJJiZmQnLly8XBEEQ8vLyhHbt2gljxoypts/mzZuF48ePK1/fu3dPaNq0qfD+++9rvd6GqrS0VPDx8REmT54sCIIgKBQKYcyYMYK/v78gl8sf2zc4OFhYsGABw40ann76aSEkJEQoKioSBEEQPvzwQ8HKyqrGwL569WrB3NxcOHXqlLLtp59+EvLz87Veb0O1cOFCwd3dXUhNTRUEQRB2794tABDCw8Or7RMSEiIMHDhQGRoTEhIEa2trYdmyZTqpuSE6ePCg8P333wt5eXmCtbW1WuFm06ZNgpmZmXDp0iVBEMpDpbm5ufDjjz9qrU6GGzWNHz9e6N69u0rbnDlzhObNm2u0T2P3xRdfCLa2tir/Qv3pp58EQ0ND4eHDh2qPM3HiRKFPnz5aqFA/HD58WAAg3L17V9l29epVAYDKF2pV3nrrLWHcuHHC9evXGW4eIyUlRZBIJMIff/yhbMvPzxfMzMyENWvWVNlHJpMJjo6Owttvv62rMvWCk5OT8NFHH6m0tW7dWpgxY0a1ffz8/IT33ntPpa1Vq1acezWpG2769u0rPPvssypt48aNE7p166at0gSuuVHTlStX0LFjR5W2zp074969e8qnjGuiT2N35coVtG3bFoaG/3vsWefOnVFWVobr16+rNYZCocDly5fh6+urrTIbvCtXrsDa2hrNmzdXtrVr1w7Gxsa4cuVKtf0OHz6M7du3Y82aNboos8G7evUqBEFQ+XugSZMmCAgIqHaer1+/joyMDAwdOhQZGRm4fPky15E9RmpqKtLT06v8+7amz/Mnn3yCjRs34scff8SRI0fw9ttvo7CwELNmzdJ2yY1Kdd+FNf1unlSjfHBmXWRnZ8Pe3l6lreJ1dnY2LC0tNdKnsXvcnKnjk08+QXx8PHbt2qXx+vRFVfMMlM91dfOcnp6OKVOmYOvWrbCxsUFycrK2y2zwKuayqs90dfOcmpoKANixYwe2bdsGFxcXREdHY+LEiVi7di0MDAy0W3QDVJd5BoC+ffuic+fOWLRoEdzd3REbG4uFCxfC09NTq/U2JoIgICcnp8rfTWFhIUpKSrRyJ2OGGzUZGRmhuLhYpa2oqAgAYGxsrLE+jd2TztnatWuxZMkS/P7772jZsqVWatQHVc0zUD7X1c3z66+/jg4dOsDAwACnT59GXFwcACAyMhKWlpac7yoYGRkBAIqLi2FmZqZsLyoqQtOmTWvsc+PGDcTFxcHMzAxRUVHo3LkzWrdujdmzZ2u/8Abm3/P8bzV9ngVBwKBBg+Dl5YXk5GQYGxsjKSlJeaT4vffe03rdjYFEIoGhoWG1f69X/O40jael1OTl5VXpUu6UlBSYmJjA0dFRY30au+rmDMBj/zW1bt06zJ49G9u2bcOwYcO0VqM+8PLyQmZmJkpLS5VtBQUFePToUbXzbGtri5ycHCxcuBALFy7E119/DQBYtWoVtm7dqpO6GxovLy8AqPIzXd08e3t7AwAmT56sDEQBAQHo2bMnTp06pb1iGzAPDw9IpdJazXNqaiouX76M6dOnKwOQh4cHhg0bhj179mi95sbE09Ozyt+Nu7s7pFLtxBCGGzWFhobi0KFDKl8Gf/75J/r27as8TJyZmYnTp09DJpOp3YdUhYaG4tq1a0hISFC2/fnnn3Bzc0NAQACA8sR/+vRp5OTkKLdZv349XnvtNWzduhUjR47UddkNTr9+/SCTyXDw4EFl2549eyCVStG3b19l29mzZ5Wnn77//nucPn1a+eeXX34BUD73H330kU7rbyg6duwIOzs7lS/L69evIy4uDqGhocq2yMhI3LlzBwDQokULNGvWrMovg+qO9jR25ubmCAkJUZnngoICHDlyRGWe7969q1znYWdnB6lUWun0alJSEuf5CaWmpuL06dPK16Ghofjrr78g/PMoS0EQsGfPHpXfjcZpbamynsnKyhLc3d2FoUOHCnv27BFmz54tmJiYCBEREcpttm7dKgAQ7t+/r3YfUiWXy4Vu3boJ7du3F3bu3CksW7ZMMDQ0FH7++WflNlFRUQIA4cCBA4IglM+7RCIR5s2bJ5w6dUr5p+KyQ6razJkzBWdnZ+GXX34RNm7cKNjb2wvz5s1T2cbExERYsmRJlf15tZR6vv32W8HU1FRYuXKlsH37diEgIEAYMGCAyjYdO3YUJkyYoHy9Y8cO5ZUoBw8eFKZPny6Ym5sLN2/e1HX5Dcbx48cFIyMjYeHChcKff/4p9O/fX2jevLmQl5en3Gbq1KlCq1atlK9nzJghODg4CGvWrBEOHTokzJ8/X5BIJGrdh6ixysvLU/4da2FhIcydO1c4deqUEBUVpdzm66+/Fv4dL+Li4gRbW1thwoQJwp49e4TJkycLVlZWQkxMjNbq5JobNdnZ2eHcuXNYunQpVqxYAVdXV5w6dQqdOnVSbtO0aVN069ZNeYhTnT6kSiqV4sCBA1i2bBnWrFkDKysr7Ny5U+U0k7m5Obp16wZbW1sAQGxsLEJCQnD+/HmcP39euZ2Xlxc2b96s8/fQUKxatQqBgYHYsmULJBIJPv30U7z88ssq23Tr1g0eHh5V9m/SpAm6devGhfGPMWvWLDRt2hSbN29GYWEhxo8fj3nz5qlsExQUpDyFBQCjR4+GtbU11q9fjz179qBFixaIjIzkFYA16NWrF44dO4Zvv/0WERERaNOmDX799VdYWFgot/Hz81M5kv7tt98iODgYhw4dws6dO+Hl5YWzZ8+iS5cuYryFBiElJQULFy4EUH6FZUREBCIiItCnTx8sXrwYAODm5oZu3bop+3h7eyM8PBzLli3D119/jWbNmiE8PFyrn2eJIPxznIiIiIhID3DNDREREekVhhsiIiLSKww3REREpFcYboiIiEivMNwQERGRXmG4ISIiIr3CcENERER6heGGiOokMTERu3fvFruMWklNTcXvv/8udhlEpGUMN0RUraSkJOzfvx/79+9HTEyMys/Onj2L6dOni1RZ3Vy+fBmTJk0Suwwi0jI+foGIKrl//z6mTZuGEydOoEuXLjAzM0NMTAxsbGywbt06tGnTRuwSiYiqxXBDRCoKCgrQp08fODk5ISEhAfb29sqfXbp0Cfn5+SrbKxQK3LhxA4mJiWjdujW8vb2VP3v48CEOHToEADAxMYGfnx9at26t0j8xMRGXLl3C8OHDqx1HnW0qpKam4uLFi7C2tkaHDh3q9Oyrmsb4dy3h4eFISUnBoEGDEB0djZKSEgQFBeHs2bMoLi7G0KFDAQB5eXk4e/YsSkpK0LlzZzg7O6vs788//0RQUBAMDAxw6dIleHh4oEOHDrWum4jKMdwQkYp169YhNjYW+/btUwk2ANCxY0eV1yUlJejfvz9KSkpgbm6OkydPYt26dXjhhRcAlIebP/74AwBQVFSE8PBwPPXUU/jjjz9gZGQE4H+ntzp16lTtOOpsAwAfffQRVq5ciS5duiA/Px937tzB1q1b0bdvX7Xf/+PGqKilY8eOKCkpgZeXF3r27In169crA4y3tzd8fX0xdOhQHDt2DKNHj4a3tzesra1x/vx5fPHFF3jttdeU+5wxYwbatm2LO3fuoH379hg2bBjDDdGT0NrzxomoQXr66aeFp5566rHbbd26VQAgrF27Vtm2dOlSwdXVtdo+ubm5QosWLVT6qDOOOtvs2rVLcHZ2FpKSkpRta9euFVxdXYWSkhJBEARh7969gomJSbX1qTNGRS3Lli1T6TtjxgxBKpUK58+fV7YVFxcL3t7ewpw5c5RtmzZtEoyMjISYmBhlm5OTkxAQECA8evSo2tqISH1cUExEKtLS0uDp6anWtkZGRpg2bZryde/evZGamqpy6kqhUODChQvYvXs39u3bB09PT0RERNR6nMdts3HjRrRu3Rrh4eH4/fffsX37dhgbGyM1NRW3b99W6/2oO4ZEIlE58lIhODgYnTt3Vr4ODw9HfHw83nnnHWXbhAkT4Obmhl27dqn0nTJlCqysrNSqk4hqxtNSRKTC0tISWVlZam1rZWUFAwMD5WsTExMAQHFxMSwsLBAXF4cBAwagrKwMgYGBsLS0RGJiIkxNTWs1jjrbxMfHQxAE7NixQ2Xs5557DhKJRK33o+4Ytra2ld4DALi4uKi8TkhIgIWFBZo2barS3rx5cyQkJNTYl4jqjuGGiFR07twZGzduREFBAZo0afJEYy1evBgtWrTAvn37lG0TJ05ETk7OE1ZZmZWVFVq0aIENGzZofYzqwtJ/2x0cHFBQUICSkhJlGAOA7OxsODg4qDUmEdUeT0sRkYqZM2eiqKgIn3zySaWflZWVIS0tTe2x0tLS0LJlS+Xr3NxchIWFaaTO/3r66aexa9cuZGRkqLSnpKTodIx/69ixI0xNTZWLqgEgJiYGkZGR6N69e53GJKLH45EbIlLRvHlzbNu2DRMmTMC1a9cwdOhQmJiY4O7du9i9eze++OILDBs2TK2xRowYgfnz56Np06awsrLC999/j9LSUq3UPW/ePOzbtw+dOnXCrFmzYGNjg0uXLuHcuXO4fv26zsb4NycnJ7z33nuYNm0a7ty5A2tra3z99dcYMmQIQkNDaz0eEamH4YaIKhk2bBhiY2OxdetWXLlyBRKJBH5+fjh06BC8vLwAAF5eXhg1apRKP1tbWzz33HPKUzAvv/wybG1tcfjwYUilUnz44YfIz89Henq6so8646izTcXl4Vu3bsXp06dhYGCA4OBgrFq1StnHzc0NY8eOrfZ9qzNGVbUAQKdOnZCXl1ep/Z133kG7du2wd+9exMXF4b333lO5fB0oD4FV3bOHiOpGIgiCIHYRRERERJrCNTdERESkVxhuiIiISK8w3BAREZFeYbghIiIivcJwQ0RERHqF4YaIiIj0CsMNERER6RWGGyIiItIrDDdERESkVxhuiIiISK8w3BAREZFeYbghIiIivfL/sc4AYIZG6BMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 6.88s\n" + ] + } + ], + "source": [ + "from error_correction.channels import PhaseFlipChannel\n", + "from error_correction.protocols import ThreeQubitBitFlipProtocol, ThreeQubitPhaseFlipProtocol\n", + "from error_correction.utils import test_protocol_once, plot_errors\n", + "\n", + "plot_errors(ThreeQubitBitFlipProtocol(), \n", + " num_points=21, \n", + " num_experiments=200,\n", + " channel_factory=lambda p:PhaseFlipChannel(p))" + ] + }, + { + "cell_type": "markdown", + "id": "dd91a4fd-eaa1-4b3a-a20c-fd54de08f286", + "metadata": {}, + "source": [ + "Now recall that Z = HXH, and HZH = X. This means that if we put apply Hadamard gate before and after channel, this channel becomes bit-flip channel.\n", + "\n", + "So, we can use the same error-correcting protocol, except we need to apply H gate after encoding and before decoding." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "45f92efd-0901-4eb1-bbde-fc66811c3396", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 106.97s\n" + ] + } + ], + "source": [ + "plot_errors(ThreeQubitPhaseFlipProtocol(), \n", + " num_points=41, \n", + " num_experiments=1000,\n", + " channel_factory=lambda p:PhaseFlipChannel(p),\n", + " theoretical=lambda x:3*x**2*(1-x)+x**3)" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/04_ShorCode.ipynb b/error_correction/04_ShorCode.ipynb new file mode 100644 index 0000000..6327ade --- /dev/null +++ b/error_correction/04_ShorCode.ipynb @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cfd0c042-4870-4702-992c-c8751802dc86", + "metadata": {}, + "outputs": [], + "source": [ + "from error_correction.channels import ArbitraryErrorChannel\n", + "from error_correction.protocols import ShorProtocol\n", + "from error_correction.utils import test_protocol_once, plot_errors\n", + "\n", + "assert test_protocol_once(ShorProtocol(), ArbitraryErrorChannel(0.05))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "16dcef24-557f-4832-bae9-2b57c6e58ee1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 49.11s\n" + ] + } + ], + "source": [ + "plot_errors(ShorProtocol(), \n", + " num_points=11, \n", + " num_experiments=200,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p),\n", + " theoretical=lambda p:1-(1-p)**9 - 9*p*(1-p)**8)" + ] + }, + { + "cell_type": "markdown", + "id": "cbc28d9b-94a9-4319-bbd3-a7a917ff50e6", + "metadata": {}, + "source": [ + "Let's show that for small error rates of channel this code still gives improvement.\n", + "\n", + "Here as 'Theoretical' we will plot linear function, so while 'Experimental' chart is below it, it is the improvement." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1d392d2b-75c3-40c8-8e64-d3e40da1868f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAHGCAYAAACy3hX8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhuxJREFUeJzt3XlcVOX+wPHPAMOwI4KAgLum4i7lkguFS5nmbquapuaS+TO1a7bb7apl2XrTNO3mzbyVa+WKSi65ZLjv5g4oKKiIbDPM8/tjYnQEZBjAgeH7fr14yXnmeZ7z/TIsX895zjkapZRCCCGEEELYzMneAQghhBBClHdSUAkhhBBCFJMUVEIIIYQQxSQFlRBCCCFEMUlBJYQQQghRTFJQCSGEEEIUkxRUQgghhBDFJAWVEEIIIUQxSUElhCjXTpw4wSeffMLly5ftHco9k5yczCeffMKxY8fsHYoQ4m8u9g5ACCEKcvHiRf78808SEhKoWrUqzZs3p3r16hZ99uzZw8svv8xDDz1ElSpV7BTpLRkZGezYsYMzZ86glKJGjRo0a9aMwMDAEtvHxYsXefnllwkICKBBgwYlNq8QwnZyhEoIUebk5OQwfvx4atasyYwZM4iNjWXu3LnUrVuXRx55hEuXLtk7xDyUUnz44YeEhoYyatQotm7dyu7du3njjTcICwvjiSeeICsry95hCiFKiRyhEkKUOZ999hmffvopX3/9NcOGDTO3HzlyhCeeeIK4uDiCg4PtGGFeL774InPnzuXLL79kxIgRaDQa82tbt25l4MCBZGRkoNPp7BilEKK0SEElhChz1q5di06nY8iQIRbt4eHhbNmyhezs7HzHZWRksGrVKpKTk2ndujXNmzfPt19cXBybN28mNTWVmjVrEhUVZVHonDhxgtWrV/Pss8/i5eXFmjVriIuLY/jw4Xh4eOSZLyYmhtmzZ/OPf/yDF154Ic/rHTp0YPPmzbi5uRUpjlyHDh1i+/bt+Pj40L1793xzynX9+nViYmJISEigSpUqdO7cGT8/v7uOEUIUn5zyE0KUOZUrVyY7OzvfheaVK1fO9+jUuXPn6NSpEytXrmTZsmW0aNGC6dOn5+k3depUatWqxbx589i1axejR4+mXr16xMbGmvvkrsvavHkzHTt2ZNmyZcydO5fU1NR84/36668BeOmllwrMqWbNmhYFlTVxAEycOJGmTZuydOlSVq9eTWRkZIGL0RcuXEi1atV499132bNnDx9//DE1a9bkl19+KTAuIUQJUUIIUcb89ttvysnJSTVo0EDNmzdPnTx5UuXk5OTbd/HixQpQkZGRKikpydz+4osvKjc3N3Xx4kVz248//qgA9f7775vbrl+/ru6//35VtWpVlZaWZjFn27ZtzeNTU1PNr9+pXr16Kjg42Or8ihrHV199Ze536dIl9eCDDypA/fe//zW3x8TEKCcnJzVlyhRlNBrN7RMnTlSenp7qwoULVscnhCg6KaiEEGXStm3bVO/evZWPj48ClI+Pj+rTp4/asWOHRb/comP27NkW7bt27VKAWrFihbnt4YcfVlWrVlV6vd6i76+//mpRoOTOOWvWLKtiDQgIUA0aNLA6N2vjePjhh1Xt2rUtCiSllPr888/zFFTdu3dXAQEBeea8ceOGcnJyUjNmzLA6PiFE0ckaKiFEmdSuXTvatWuH0Wjk3LlzxMTE8MEHH/Dggw/y008/0a9fP4v+jRs3ttgOCQkBID4+3tx2+PBhmjdvjouL5a++Fi1aAKa1Srdr2rSpVbF6e3tz48YN6xIrQhyHDh3iwQcftFjgDtCsWbM8c8bGxuLn58ecOXMA01WHuR9eXl5yzyohSpkUVEKIMs3JyYlatWpRq1YtevbsSc2aNfnXv/6Vp6Dy8vKy2M4tVm5fwJ6Tk5OniLm9b05OjkW7v7+/VTE2b96c5cuXc+XKFQICAgrtb20cRqMRZ2fnAvvdTq/Xk5OTw19//ZXntaFDh9KyZctC4xJC2E4KKiFEmRMXF0dYWFie9oCAAEJDQ7lw4YJN89arV4+jR4/maT9y5Ij5dVsMGjSI5cuXs2DBAv7xj3/k2+fq1at4enri6upqdRz16tXj+PHjefrlNzY8PJzExEQ++eQTm3IQQhSPXOUnhChzxowZwyeffILRaLRo37NnD6dOnaJNmzY2zfvcc89x5swZFi9ebG4zGAxMnz4db2/vPEe9rNW7d2969erF1KlT2bhxY57X//rrL6KiokhPTy9SHIMGDeLw4cOsWrXK3C8jI4Nvv/02zz5eeuklTpw4Yb7i8HaXLl2yuQgVQlhHjlAJIcqciIgIXn/9db788kv69OlDpUqVOH78OD/99BP169fn888/t2neF154ge3btzNo0CDWr19PzZo1WbNmDYcOHeJ///uf1af47qTRaPjhhx+YMGEC3bp146GHHqJdu3a4urqyf/9+VqxYQdOmTc33mLI2jpEjR7J+/Xr69evHkCFDCAoKYv369Tz//PNs2bLFIoYBAwYwY8YMRo8ezZIlS2jTpg05OTkcOXKEvXv3smTJEqpVq2ZTfkKIwmmUUsreQQghxJ1u3LhBdHQ0J06cIDk5mcqVK3P//fcTFRVlsa5o7969fPvtt7zyyiuEhoZajH/zzTfp06cPkZGRFnPv2LGDjRs3mm+o2a9fP4KCggqd0xpxcXGsW7eO06dPo9FoqF69Oq1bt853IXlhcYBpcfmvv/5qvrHnk08+iYeHBzNmzGDQoEFERERY9L9w4QK//vorZ8+epVKlSoSHh9OtWzdcXV2LlIcQomikoBJCCCGEKCZZQyWEEEIIUUxSUAkhhBBCFJMUVEIIIYQQxSQFlRBCCCFEMUlBJYQQQghRTFJQCSGEEEIUk9zYs5QZjUYSEhLw9vbO84BTIYQQQpRNSilu3LhBSEgITk6FH3+SgqqUJSQkyN2JhRBCiHLqwoUL+T5b9E5SUJUyb29vwPSG+Pj4lNi8er2e9evX07VrV7RabYnNW5Y4eo6SX/nn6DlKfuWfo+dYmvmlpqZSrVo189/xwkhBVcpyT/P5+PiUeEHl4eGBj4+PQ/6QgOPnKPmVf46eo+RX/jl6jvciP2uX68iidCGEEEKIYpKCSgghhBCimKSgEkIIIYQoJllDVQYYjUays7OLNEav1+Pi4kJmZiY5OTmlFJl9OXqOufllZWXh5OSEs7OzvUMSQghhIymo7Cw7O5szZ85gNBqLNE4pRXBwMBcuXHDY+1s5eo65+Z0/fx6NRkOlSpUIDg52yFyFEMLRSUFlR0opLl68iLOzM9WqVbPqxmG5jEYjaWlpeHl5FWlceeLoOebm5+npSWZmJklJSQBUrVrVzpEJIYQoKimo7MhgMJCenk5ISAgeHh5FGpt7mtDNzc0hiw1w/Bxz83N3d8fT0xOApKQkAgMD5fSfEEKUM473V6ocyV0X5OrqaudIRFmQW1Tr9Xo7RyKEEKKoykxBVdQ1RNaMUUqV2L5tic9asmZGgHwfCCFEeWb3gmr69OkEBQWh1Wpp0qQJmzZtKvaYdevW0aVLF3x9ffH19aV79+4cPXrUpn3bEp+wv3//+998//339g5DCCFEBWHXgmrOnDlMmzaNRYsWcf36dfr27UuPHj04c+aMzWNycnL4+OOPefXVV0lISODUqVN4enrSpUsXUlNTi7RvW+KrCL755huGDx+e5+Ptt9+2d2hm0dHRbN++3d5hmH3++ef88MMP9g5DCCFEKbFrQTVr1iyGDRtG586d8fLy4p133iEgIIA5c+bYPMbZ2Zm1a9fSqVMnvLy8CAgI4KOPPiI+Pp5du3YVad+2xFcRbN68ma1bt9KmTRuLj2bNmtk7NLOxY8fy7LPP2jsMs3Xr1rFjxw57hyGEEKKU2O0qv+TkZE6ePElkZKS5TaPREBkZWeAfHlvGAFy8eBEAPz8/q+exdV8VRdWqVRk+fHi+r12+fJnXX3+dYcOG0bp1awAyMjJ45ZVX6N69O926dWPWrFnUrFkTb29vYmJiyMnJYdCgQTRu3Nhirvj4eGbPnk18fDy1a9dm0KBBVKlSxfz67fOsWbOGkJAQJk2axPHjx/Hz86Nt27bmfjVq1MDDw4Nt27aRnZ3NwIEDadasGb/++isbNmzA19eXYcOGUb16dYsY4uLi+O6774iLi7trDJUrV2bDhg3k5OQwYMAAWrZsCZiO6B04cICzZ8+av2bvvfcegYGBxXwXhBBClBV2K6gSExMBLP4wAQQGBvLHH3+U2Jjs7GzGjx9Pq1atiIiIsHoeW/YFkJWVRVZWlnk79zSjXq/Pc/WWXq9HKYXRaLTpxp65/5bmgvm77bug/fr7++Pp6clTTz3F3r178fHx4eWXX2bTpk1Mnz4do9HI6tWrOXr0KEFBQTz99NPs37+f+++/n02bNtGmTRsAtm/fTq9evejbty+NGzdm9+7dTJ8+nR07dlC7dm0A8zw1atRgwIAB1K1bF6PRyPr16wkLC+Opp54y99u/fz9NmjTh8ccf5/fff6d169b07t2b5ORkHnvsMTZt2sTcuXM5fvw4Xl5eAOzYsYNevXrRp0+fu8Zw7Ngx6tatS8+ePTl69Cht2rRh+/bttGzZklq1auHn50eVKlVo1aoVADqdLs97aDQaUUqh1+sd4rYJud/vjnzVoqPnKPmVf46eY2nmV9Q57X4fqjv/KBuNxkKvdrJ2jNFoZMiQIZw/f55t27bl6WPNPEWNb/r06UydOjVP+/r16/Pca8rFxYXg4GDS0tLIzs5GKUWmvmjFUUbytSL1L4ib1snqq8z0ej3Hjh1jyJAhFu1t27bl6aefBuDVV19lw4YNjBgxgj59+rBgwQLWrl1LTk4OqampGAwGsrKy+Pnnn83Fi8Fg4JVXXmHVqlUADBs2jIkTJzJmzBgAnnvuOUaOHMnrr7/OV199ZR6j0+lYuXIlWq0WwDx/dna2uaA1GAwEBQWxZMkSnJycGDx4MI0aNeLkyZNs2LABjUbDs88+S7169Vi2bBm9e/cG4Pnnn2fChAmFxuDr68vSpUvNhdDx48f5+uuvmTFjBs2bNyc4OJjatWvzxBNPmL9eN27csPg3OzubjIwMtmzZgsFgsOq9KA+io6PtHUKpc/QcJb/yz5Fy1BrSqHLjMAl+rc1tpZFfenp6kfrbraDKvRt07t2hcyUlJREcHFzsMbnF1G+//cbmzZupWbNmkeaxJT6AKVOmMGHCBPN2amoq1apVo2vXrvj4+Fj0zczM5MKFC3h5eeHm5kZ6toEW79vnm/7QO13wcLXu20Gr1eLr60v79u0t2hs0aGCR4+LFi2nVqhWrVq3i7bff5qGHHjK/5uLiQrdu3QgJCTG3Pfvss/Tp0wcPDw/OnTvHiRMn2L17N5MnT0YphVKKCxcucOPGDfN+XFxc6NKlC/7+/haxuLi44OrqatEvKiqKSpUqmfvUrl2b9u3b4+vra26rUaMGKSkp+Pj4cOrUKU6cOMHevXsLjaFTp07mU8oA4eHhJCUlWfS5PR4wHZm6ceMG3t7eaDQaMjMzcXd3p2PHjri5uVn1XpRler2e6OhounTpYi52HY2j5yj5lX+OlqMmbjfOy1+D1Hhy2nUiO7RtqeV3+4Vs1rBbQeXn50d4eDgxMTH0798fMBVBMTExDB061NzPYDBgNBpxdXW1eozRaOT5559nw4YNxMTEUK9evSLv29p93Umn06HT6fK0a7XaPG92Tk4OGo0GJycn84e9FGX/Go2GqlWr8sILL9y133333UfNmjU5fvw4Tz31VJ75AwICLNoCAwPJycnh2rVrpKSkANC0aVNCQ0PN/Vq3bo23t7fFOD8/vzxzazQa89c2l4eHh8W2k5NTvm1GoxEnJydzDBEREQQEBJj75BfDnfO4uLiY5ykontyjn7d/D2g0mny/V8ozR8snP46eo+RX/pX7HI1G2PE5bHwXjAaoXBsXrwDU3zmVRn5Fnc+up/wmT57MyJEjiYqKom3btnzwwQekpaUxevRoc59Ro0axc+dODh06ZNUYpRQjRoxgzZo1REdHU6NGDTIzMwHTFyf3lIw1+7amT0ly1zpz5N1HrOprNBq5kXoDbx/vEinE3LUlv2bntddeIyMjg06dOvHcc8+xefNmi7VBFy5csOh/7tw53NzcqFKlCtnZ2QA0bNiQJ554wi7FZmhoKACNGzemR48exZpLbtophBA2upkMK0bByfWm7cb9oMcn4OYDZWhtmF0LqsGDB5OWlsaUKVNITEykSZMmREdHExYWZu6j1WotjvgUNiYlJYVFixYBmBcA55ozZ4553Y81+7amT0nSaDRWn3YzGo0YXJ3xcHUpk8+527RpE59++qn5CGHTpk2ZNm0ab775prnPqlWr+Ouvv6hbty56vZ5///vf9OrVC41GQ1hYGJGRkcycOZNHH33UfKouOTmZ/fv3ExUVVeo55Mbw7rvv0rFjR/PpOltiqFy5svmIlxBCCCud2wFLnocbCeCsg27vQ8QQKIP/SbX7ovQxY8aYF/zmZ/bs2UUa4+/vbz4iVdx9W9unIjp+/Hie2ya4ubnxxRdfkJKSwuDBg5k8ebJ5ndWCBQvo06cPjzzyiLnQbdSoEQ8//DBt2rThyJEj3Lhxg2+//dY838KFC+nZsycNGzakQ4cOXL16ldOnT/PRRx/dszy/++47evXqRf369YsVQ69evRg4cCDZ2dl4eXnJbROEEMIaV06Yiin/ujDgWwhuXPgYO7F7QSXKn+effz7PgnS4db45Pj6ef/7znwwcOND8Wvfu3fnpp58sFvl17tyZ//u//2P37t0YDAa6du1qvuIPTEeIYmJiOHLkCKdPnyYkJITWrVtb9Jk4caLF+qZcY8eOxdPT8679Xn31VYtF8QBvv/02devWtYjhzz//ZOfOnfz1119Wx/Dss89y8+ZN83bfvn35888/2b9/Pzdv3sTd3T1PzEIIIQClbh2BajkYVA40eQJ0XncfZ2dSUIki69ixIx07dizw9SZNmtCkSZM87b169crTVrVqVXr27FngXBqNhrZt29KuXbt8X+/WrVu+7Z07dy60X37rovr06VNgDLk3CbUmhvz6hoeHEx4ebt6+1/cPE0KIMu/MVtg4FZ75ETwqmwqr+5+3d1RWKXuLb4QQQghRsRhz4LcZsLAnxO2GzR/YO6IikyNUwi4KOlUnhBCigrlxCZaNgDNbTNstBkKnt+wbkw2koBJ2UdCpOiGEEBXIqU2w7AW4eRm0ntDjY2j2pL2jsokUVEIIIYS49w4ugaXDAQWBjWDAf6DKffaOymZSUAkhhBDi3qsTBb5hULcTPDoDtOX76mcpqIQQQghxb1zcD8FNTVfveVSGkVtM/zoAucpPCCGEEKUrRw/Rb8FXHWHPrRs4O0oxBXKESgghhBCl6doFWDoMLuwybSf/Zd94SokUVKJUbN26FT8/Pxo3LruPCRBCCFHKjq+B5aMg8xrofKHX5xCe9ybPjkAKKmG1nJwcli9fftc+derUoUWLFkydOpX777+fGTNm3KPohBBClBmGbNMdz3d8YdoOaQn9F0DlWvaNqxRJQSWsptfr+d///mfePnXqFAcOHLB4XEvXrl1p0aKFPcITQghRVlzcDzu/NH3eZgx0ngourvaNqZRJQSWs5ubmxpIlS8zbX3zxBZMmTbJou1NaWhr79u0jJyeHVq1a5ftQ4H379hEXF0ft2rUtnnWXS6/X8+eff5KSkkLjxo2pVcvyfzi5pxfDwsL4448/cHNzw9/fn4sXL+Z5pt+hQ4e4dOlSnnYhhBAlqNoD0OVdqFwbGnS3dzT3hBRUotT8/vvvNG/enDp16nDq1CkAtm/fTmBgIABJSUn06dOHhIQEGjZsyMGDB2nUqBFLly7F09MTgDNnzvDkk09iMBioVasWO3fu5IUXXuDjjz8272fq1KlkZWURFxdH/fr1ad26NQ899BCPPfYYcXFx5v0BPP/887Rv314KKiGEKEmGLNj4LkQMhYC6prYHX7JvTPeYFFRlUfbNgl/TOIPWzbKvUwF3v9A4Wd4oraB5XT2LHqMVjh07xr59+wgNDSU7O5tmzZrx5Zdf8s477wAwbNgw6tWrx5YtW3B2diYzM5OoqCj+9a9/MW3aNAAmTZpErVq1+PXXX9FqtezevZu2bdvyyCOP8Oijj5r3tX//fvbv328+eqWUokaNGnz33XdMmDABgMOHD7N7924WLFhQKvkKIUSFlHwKlgw1neY7swVe+A2cnO0d1T0nBVVZNC2k4NfqdYVnfzJvaj66D/Tp+fet0R6Grrq1/UkTSE/O2++d6zYGend9+vQhNDQUAFdXV9q3b8+xY8cA09GpX3/9lQ8++IBffvkFpRRKKerVq8fGjRsBuHr1Kps2bSI6OhqtVgvAAw88wKOPPsrixYstCqpevXpZnArUaDQMGzaMBQsWmAuqBQsW8MADD8iVh0IIUVIOLYOfx0H2DXCvDFFvVshiCqSgEqWocmXLG7bpdDouX74MwNmzZwH47bff2LVrl0W/iIgIwHS6D6B27doWr9etW5e9e/datIWE5C1ChwwZwptvvskff/xBixYt+O6773j33XdtT0gIIYSJPgPWToHYb0zb1R+Efl+Db6h947IjKajKotcSCn5NY1n5q4kn0NztlN/txh8sZmAlx9vbG4DXX3+dBx98MN8+/v7+AFy7ds2iPSUlxfxaLo1Gk2d8cHAw3bt3Z8GCBTzyyCPcuHGDp556qgSiF0KICuzGJfiuHyQeAjTQYSI8NAWcK3ZJUbGzL6uKsqbJ1bPgNVTFmbeUNWjQgBo1ajB37tw8BdWlS5cIDg6mWrVqhIWFsWLFClq2bAlAeno6a9euZfLkyVbtZ8SIETz77LOcOnWKfv364evrW+K5CCFEheLhb1qf61kF+s41PeRYSEEl7EOj0fD111/Tq1cvbty4Qffu3bl69SqrVq2ic+fOvPbaazg5OfGvf/2L4cOHk5mZyX333cf8+fPx9/fnxRdftGo/jz76KN7e3mzYsIFNmzaVclZCCOGgstPBWXvrY8B/wMkFvIPtHVmZIQ9HFjarW7cuffv2zfe1jh070qRJE4u2Fi1aWByN6ty5M4cOHaJx48Zs3LiRS5cu8fbbb/Paa6+Z+/Ts2ZNNmzaRnp5OTEwMvXv3ZufOnbi5ud11X7mcnZ3p2bMntWvX5qGHHipGtkIIUUElHYN5UaY7n+fyDZNi6g5yhErY7NFHH7W40u52b731Vp62YcOG5WmrVasWU6dOzdN+uwcffJD27dsX+Hp++8qllCI6Oprhw4fnu85KCCHEXexdBKsnma4mz7gKHSaBeyV7R1UmSUElHNaqVatYs2YNycnJjBo1yt7hCCFE+ZGVZiqk9i82bdd+2LReSoqpAklBJRzWzz//jMFgYP369fj5+dk7HCGEKB8SD8NPQ+DKCdPV4g+/Du0nWH8BVAUlBZVwWF999ZW9QxBCiPIlOx0W9oKbl8E7BPrPhxr539pGWJKCSgghhBAmrh7w6Aw48AP0ngOe/oWPEYAUVEIIIUTFdnG/6chUjbam7Sb9oXE/kAt5ikROiJYBSil7hyDKAPk+EELcU0rBH/Pg687w03OQlnTrNSmmikyOUNmRs7PpMTLZ2dm4u7vbORphb+nppodc5z4IWgghSk3mdfj5JTiy0rQdGmG6UaewWZn56hmNRpyKeAVBYWOUUmRlZeHq6pqnX1ZWVr5HBFxcXHBxMX1ZDAYDBoPB4nUnJydcXV2LFGdBXFxc8PDw4PLly2i12iLlbzQayc7OJjMzs8hft/LC0XPMzS8jI4PMzEySkpKoVKmSudAWQohSEb/HdBXftXPgpIUuU6HNGDkqVUx2L6imT5/OJ598wpUrVwgPD+fTTz8lKuruzwUqbMzly5eZP38+X331FWfPniUmJibPXbJDQ0NJS0uzaMvKymLcuHF8+umnAIwdO5Z58+ZZHDFo1KgRsbGxxczaRKPRULVqVc6cOcO5c+eKNFYpRUZGBu7u7g57w0pHz/HO/CpVqkRwsNx5WAhRSpSCXXNg/Ztg1EOl6tD/PxAWYe/IHIJdC6o5c+Ywbdo0li9fTps2bZg5cyY9evTg8OHD1KpVy+Yxs2fP5ubNm3z77bdERkbmO8+VK1cstqOjo+natStPPPGERXufPn1YsmRJCWSbP1dXV+rVq0d2dnaRxun1erZs2ULHjh0d9hSRo+eYm19kZCTu7u5yZEoIUfri/jQVUw0fh55fyI06S5BdC6pZs2YxbNgwOnfuDMA777zDN998w5w5c3j//fdtHpP7KJK4uDirY5k/fz4NGzakXbt2eV6z5XRkUTg5OVk8m84azs7OGAwG3NzcHLLYAMfPMTc/nU4nxZQQovTkLm/RaODxT6DOw9D8WTnFV8LstjAlOTmZkydPWhxB0mg0REZGsmPHjhIbY42UlBRWrFjBiBEj8ry2evVqdDodlStXpmfPnpw8edLm/QghhBD3jNGI084vuP/sv28VVTpvaDFQiqlSYLcjVImJiQBUqVLFoj0wMJA//vijxMZY47vvvgNg8ODBFu0NGjRg5cqVdOzYkYSEBMaNG0dkZCSHDx8u8FEmWVlZZGVlmbdTU1MB0+kdvV5vc4x3yp2rJOcsaxw9R8mv/HP0HCW/ciw9BedfXsT5r2hCgczja6FBN3tHVeJK8z0s6px2X5RuNBrzbBe2ANmWMXczf/58+vTpg7+/5R1hx48fb/68Vq1aLFq0iODgYH744YcCH7Y7ffp0pk6dmqd9/fr1eHh42BxjQaKjo0t8zrLG0XOU/Mo/R89R8itfKqcd5/6zs9HqU8jRaDkYNpBzp4xwerW9Qys1pfEe5t7Kxlp2K6iqVq0KQFJSkkV7UlJSgVc62TKmMH/++ScHDhzg448/LrSvj48PYWFhnDp1qsA+U6ZMYcKECebt1NRUqlWrRteuXfHx8bEpxvzo9Xqio6Pp0qWLQ64vAsfPUfIr/xw9R8mvnFFGnLZ/htO+GWhUDsq/LtmPf8W5/fGOk+MdSvM9zD3DZC27FVR+fn6Eh4cTExND//79AdORppiYGIYOHWruZzAYMBqNuLq6Wj2mKObPn0/dunV5+OGHC+2bkpLC+fPnCQsLK7CPTqdDp9PladdqtaXyzVxa85Yljp6j5Ff+OXqOkl85sXIs7P2v6fOmT6LpPgsXJx3sj3ecHAtQGvkVdT673i1x8uTJLFiwgKVLl5KQkMCECRNIS0tj9OjR5j6jRo2iZcuWRRqTk5NDZmameS1T7s0h77xJZ0ZGBosXL2b48OF5ThlmZWXx2GOPsWXLFpKTk9m7dy/9+/fHz8+PgQMHlsaXQwghhLBdy8Gg84Fe/4Y+X4HOy94RVSh2XUM1ePBg0tLSmDJlComJiTRp0oTo6GiLI0BardbiiI81Y77//nvzFXs6nY6ePXsC8MYbb/DGG2+Y+61YsQKDwcCQIUPyxKbT6Zg0aRLvvfcee/fuxc/Pjw4dOrBw4cI8a62EEEKIe86YA4mHoGoz03a1VjD+oNxbyk7svih9zJgxjBkzpsDXZ8+eXeQxgwYNYtCgQYXu++mnn+bpp58u8PWoqKhC79ouhBBC3HM3EmHZcLiwG0ZsgqBwU7sUU3bjeA9IE0IIIRzZqRiY0x7ObAGNE1w9Y++IBGXgCJUQQgghrJBjgM0zYMuHgILARjDgP1DlPntHJpCCSgghhCj7UhNg6XA497tpO2IIPDoDtO52DUvcIgWVEEIIUdbtX2wqply94PFPoUl/e0ck7iAFlRBCCFHWtRsPqRehzWjwr2PvaEQ+ZFG6EEIIUdZcj4Ofx4E+07Tt5AzdP5RiqgyTI1RCCCFEWXJ8LawYBRlXQecNj/zL3hEJK0hBJYQQQpQFhmzYOBV2fGHaDmkJDwy3b0zCalJQCSGEEPZ29RwsGQrxsabtNmOg81RwcbVvXMJqUlAJIYQQ9nR6M/w4CDKvg5sv9J4NDbrbOypRRFJQCSGEEPbkV9P0b9gD0H8BVKpu13CEbaSgEkIIIe61jGu3nrvnVwOGrIYq9cFZa8+oRDHIbROEEEKIe+nwcvikKZxYf6stuLEUU+WcFFRCCCHEvaDPhF8nwE9DIOs67PnW3hGJEiSn/IQQQojSduUvUyGVeBDQQIcJ8NBr9o5KlCApqIQQQojSdOAn+HU8ZKeBRwD0nQt1O9k7KlHCpKASQgghSsuF3bDs75tz1uwAfeeBT1X7xiRKhRRUQgghRGmp9gBEDAGvYIj8h+mZfMIhSUElhBBClKQDP0Hth8Crimm7xyeg0dgzInEPyFV+QgghREnIvgnLR5lO8S1/AYxGU7sUUxWCHKESQgghiivxsOkqvisnQOMENR60d0TiHpOCSgghhLCVUrBnIaz5Bxgywbsq9JsPNdvZOzJxj0lBJYQQQtgi6wb8+jIc/Mm0Xbcz9PkKPAPsG5ewCymohBBCCFsoBfGxoHGGTm/Cg/8HTrI0uaKSgkoIIYSwllKmfzUacPOBAd+CPh2qt7FvXMLupJQWQgghrJF53bTw/I+5t9qqNpViSgByhEoIIYQoXPweWDIUrp6FvzZAkwHgUdneUYkyRAoqIYQQoiBKwa6vYP0bYNRDperQ/z9STIk8pKASQggh8pNxFVaOhWO/mrYbPg49vwD3SnYNS5RNUlAJIYQQd9JnwrwoSDkNzq7Q9V/QaoTc9VwUqMwUVEajEaciXm5a2BilFFlZWbi6uubpZzAYMBgMFm1OTk64urqWWHxCCCHKKa0btBwMsd/CgG8gpIW9IxJlnN0rhOnTpxMUFIRWq6VJkyZs2rSp2GMuX77MjBkzqF27Nu7u7mzZsiXPHGPHjsXT05NKlSqZP9q2bVsi8QkhhCiH0lMg+dSt7Qf/D0ZtlWJKWMWuBdWcOXOYNm0aixYt4vr16/Tt25cePXpw5syZYo2ZPXs2V69e5dtvv73r/vv06UNmZqb5IzY2ttjxCSGEKIfO7YA57WHx06aHHIPpJp06b/vGJcoNuxZUs2bNYtiwYXTu3BkvLy/eeecdAgICmDNnTrHGvPXWW7z//vvUrl270BiMuU8DL6H4hBBClCPKiNP2T+E/3SE1HlQOpCXaOypRDtmtoEpOTubkyZNERkaa2zQaDZGRkezYsaPExtzN6tWr0el0VK5cmZ49e3Ly5MlS25cQQogy5uZl2pz6COeYf5oKqSZPwAu/QeXC/zMuxJ3stig9MdH0P4AqVapYtAcGBvLHH3+U2JiCNGjQgJUrV9KxY0cSEhIYN24ckZGRHD58GD8/P5v3lZWVRVZWlnk7NTUVAL1ej16vL1KMd5M7V0nOWdY4eo6SX/nn6Dk6cn6ac7/jvPwFgm4molzcyHlkBqrZs6ar+BwoX0d+D6F08yvqnHa/yu/OU25GoxFNIZel2jLmTuPHjzd/XqtWLRYtWkRwcDA//PADo0aNsnlf06dPZ+rUqXna169fj4eHR5FitEZ0dHSJz1nWOHqOkl/55+g5Olx+SvHgX+9T5WYiN9xC2F1zLDcSKkPCGntHVmoc7j28Q2nkl56eXqT+diuoqlatCkBSUpJFe1JSEsHBwSU2xlo+Pj6EhYVx6tSpYu1rypQpTJgwwbydmppKtWrV6Nq1Kz4+PsWK8XZ6vZ7o6Gi6dOmCVqstsXnLEkfPUfIr/xw9R4fO70ZL9Ns+YbOhDVGP9nC8/P7m0O8hpZtf7hkma9mtoPLz8yM8PJyYmBj69+8PmI7+xMTEMHToUHM/g8GA0WjE1dXV6jG2SElJ4fz584SFhRUpvjvpdDp0Ol2edq1WWyrfzKU1b1ni6DlKfuWfo+foEPmd/g3ObYeHXzNtV66Ovtv75Kxe7Rj5FcLRcyyN/Io6n12v8ps8eTILFixg6dKlJCQkMGHCBNLS0hg9erS5z6hRo2jZsmWRxuTk5JCZmWley5SdnU1mZqb5Rp5ZWVk89thjbNmyheTkZPbu3Uv//v3x8/Nj4MCBRdqXEEKIMizHAJv+BQt7w+b34cR6e0ckHJRd11ANHjyYtLQ0pkyZQmJiIk2aNCE6Otp8lAhMFeLtR3ysGfP9998zYsQIwHTEqGfPngC88cYbvPHGG+h0OiZNmsR7773H3r178fPzo0OHDixcuBB/f/8i7UsIIUQZlXoRlg6Dc7+btls+B7U62Dcm4bDsvih9zJgxjBkzpsDXZ8+eXeQxgwYNYtCgQXfdb1RUFFFRUcWOTwghRBl0cgMsfwHSk8HVCx7/FJr0t3dUwoHZvaASQgghStSWD2HTP02fBzeBAd+Cfx37xiQcnhRUQgghHEuV+qZ/HxgOXf9letCxEKVMCiohhBDlX3oKeFQ2fd7wcRi5Fao2tW9MokKx61V+QgghRLEYsmHd6/DFA5CacKtdiilxj0lBJYQQony6eg6+6QY7voD0K3B8tb0jEhWYnPITQghR/hz9FVaOgczr4OYLvb6Ehj3sHZWowKSgEkIIUX4YsiD6Ldg1x7Qdej8M+AYqVbdvXKLCk4JKCCFE+fH7p7eKqQdfgk5vg7PjPlJFlB9SUAkhhCg/2r5oei5fu/+D+x6xdzRCmMmidCGEEGWXPhN2zQWj0bTt6glDVkkxJcocOUIlhBCibLryF/w0BBIPgv4mtH/Z1K7R2DUsIfIjBZUQQoiy58CP8Mt4UyHlEWB6hIwQZZgUVEIIIcqO7HRY8w/Y+1/Tdo320O9r8Klq37iEKIQUVEIIIcqGyyfgp+cg6Qiggch/QMd/gLP8qRJln3yXCiGEKBv06ZD8F3gGQr95UPshe0ckhNWkoBJCCGE/RiM4/X3BeUhzGPAf0806vYPsGZUQRSa3TRBCCGEfiUdgbkdI2HerrUF3KaZEuSQFlRBCiHtLKYj9FuY9DJcOwrrX7B2REMUmp/yEEELcO1k34NeX4eBPpu06naDvXPvGJEQJkIJKCCHEvXHxACwZalp4rnGGqDeg3fhba6iEKMekoBJCCFH6Lu6Hr7tAThb4hEL/BVC9jb2jEqLESEElhBCi9AU1gVodwMkFes8Gj8r2jkiIEiUFlRBCiNJx8QD41wVXD9NpvQHfmh5uLM/iEw5ITlwLIYQoWUrBzjkwLwrWvHKrXeclxZRwWHKESgghRMnJuAorx8KxX//evgaGbHBxtWtYQpQ2KaiEEEKUjLg/4aehcP08OGmh63vQeqQclRIVghRUQgghikcp2PEFbHgHjAbwqwn9v4HQlvaOTIh7RgoqIYQQxZOeDNs+NhVT4b2h52fg5mvvqIS4p6SgEkIIUTyeAdBnLlw7C/cPk1N8okKy6Sq/9957r6TjEEIIUV4YjaYjUkd/udVWrzM8MFyKKVFh2VRQ/fOf/8RgMJRoIEajscTHKKXIzMy8az+lVIGvGQwGMjMzLT6ys7OLHKcQQjiMm1fg+wGm9VIrX4S0y/aOSIgywaaCqkWLFvz+++8lEsD06dMJCgpCq9XSpEkTNm3aVOwxly9fZsaMGdSuXRt3d3e2bNmSZ45169bRpUsXfH198fX1pXv37hw9etSiz9ixY/H09KRSpUrmj7Zt2xYvYSGEKK/OboM57eGvDeDiZrqKzzPA3lEJUSbYVFD17duXp556ig8//JDVq1ezYcMGiw9rzZkzh2nTprFo0SKuX79O37596dGjB2fOnCnWmNmzZ3P16lW+/fbbfOfIycnh448/5tVXXyUhIYFTp07h6elJly5dSE1Ntejbp08fiyNUsbGxVucnhBAOwZgDmz+Abx+HGxchoD6MiIGWg+UUnxB/s2lR+uTJkwF45ZVX8n39bqfRbjdr1iyGDRtG586dAXjnnXf45ptvmDNnDu+//77NY9566y0A4uLi8p3D2dmZtWvXmre9vLz46KOPqF69Ort27aJLly4W/Y1GI07yNHQhRAWkMRpw/t8TcGazqaHZM9D9Q9MjZIQQZjZVCUqpu35YIzk5mZMnTxIZGWlu02g0REZGsmPHjhIbY62LFy8C4OfnZ9G+evVqdDodlStXpmfPnpw8ebJY+xFCiPJEObmgKtcFrYfpocZ9ZksxJUQ+7HbbhMTERACqVKli0R4YGMgff/xRYmOskZ2dzfjx42nVqhURERHm9gYNGrBy5Uo6duxIQkIC48aNIzIyksOHD+cpvHJlZWWRlZVl3s49hajX69Hr9TbHeKfcuUpyzrLG0XOU/Mo/h83RmANZN9C7mAqnrMg30D4wwvSgYwfK1WHfv9s4eo6lmV9R57S5oMrJyWHNmjUcPXoUpRTh4eE89thjRT41ducVeEajEU0h5+RtGXO3uYYMGcL58+fZtm2bxTzjx483f16rVi0WLVpEcHAwP/zwA6NGjcp3vunTpzN16tQ87evXr8fDw8OmGO8mOjq6xOcsaxw9R8mv/HOkHN30V4k4OxuA7XUng8aZ6Jitf796wn6BlSJHev8K4ug5lkZ+6enpRepvU0F17tw5Hn/8cY4ePUqNGjXQaDScO3eOBg0a8Msvv1CjRo1C56hatSoASUlJFu1JSUkEBweX2Ji7yS2mfvvtNzZv3kzNmjXv2t/Hx4ewsDBOnTpVYJ8pU6YwYcIE83ZqairVqlWja9eu+Pj4FDnGguj1eqKjo+nSpQtarbbE5i1LHD1Hya/8c7QcNac24fzzu2jSk1GunnRpXo31+xMcJr87Odr7lx9Hz7E087vzIrXC2FRQjRs3jrCwMNatW2cuci5evMiwYcMYN24cK1euLHQOPz8/wsPDiYmJoX///oCpwImJiWHo0KHmfgaDAaPRiKurq9VjrGE0Gnn++efZsGEDMTEx1KtXr9AxKSkpnD9/nrCwsAL76HQ6dDpdnnatVlsq38ylNW9Z4ug5Sn7lX7nPMccAMe+ZbtYJENQEzYD/4OJbA/YnlP/8CuHo+YHj51ga+RV1PpsWpW/cuJG5c+eaiykwHT2aO3cuGzdutHqeyZMns2DBApYuXUpCQgITJkwgLS2N0aNHm/uMGjWKli1bFmlMTk4OmZmZ5rVM2dnZZGZmmm9GqpRixIgRrFmzhrVr11KjRg3zbRFycnIA01qoxx57jC1btpCcnMzevXvp378/fn5+DBw40JYvmxBClD3X4+A/3W8VU/cPg+EbIKCufeMSopyx6QiVRqPJ92q+ot5eYPDgwaSlpTFlyhQSExNp0qQJ0dHRFkeAtFqtxREfa8Z8//33jBgxAjAdMerZsycAb7zxBm+88QYpKSksWrQIgFatWlnENGfOHIYMGYJOp2PSpEm899577N27Fz8/Pzp06MDChQvx9/e3OkchhCjTlr0AF3aCzgce/xQa97V3REKUSzYVVF26dGHEiBHMnz+f0NBQwHTPp+HDh+e5h1NhxowZw5gxYwp8ffbs2UUeM2jQIAYNGlTg6/7+/mRmZhYaW1RUFFFRUYX2E0KIcqv7R/DrBOj9b6hc297RCFFu2XTK77PPPuPKlStUr17d/FGjRg1SUlL49NNPSzpGIYQQJeXqOTjw463twIYwdLUUU0IUk01HqMLCwti9ezcbN27k8OHDaDQawsPD6dSpk823LxBCCFHKjv4KK8dAVhpUqgHVW5va5fe2EMVmU0H1wAMPsHv3bjp37mx+BIwQQogyypAF0W/Drr+XUIRGgHfRbzUjhCiYTQXViRMnuHHjBt7e3iUdjxBCiJKUchp+GgoX95m2246FTm+Di6tdwxLC0di0hqpXr1588803JR2LEEKIknR4BXwVaSqm3P3g6f/BI/+SYkqIUmDTESqj0cj//d//8eOPPxIeHo6rq+UP5xdffFEiwQkhhCiGG5cgKxWqtYb+C8C34JsSCyGKx6aCKi0tjV69egF5HwMjhBDCjoxGyL0fYOuR4OYLTfqDs+PeJVuIssCmguq7777Dy8urpGMRQghRHAeXwO+fwpBV4OZjunqv+dP2jkqICsGmNVQl+ZBfIYQQxaTPgJ/HwdJhcOkA7PrK3hEJUeHYVFAFBQVx6dKlko5FCCFEUV0+DvOiYM+3gAY6/gPav2zvqISocGwqqF588UVeeeUV0tLSSjoeIYQQ1tq3GOY+BElHwDMQBi2HqNfB2abVHEKIYrDpp+7777/n6NGjLFmyhGrVquW5yu/QoUMlEpwQQogC7JwDayebPq/VEfp+Dd5B9o1JiArMpoLqhRdeKOk4hBBCFEXjfrD9M4gYAh0mgpOzvSMSokKzqaAaP358CYchhBDirpSC8zugxoOmba8qMHY3uHraNy4hBGDjGqpcGRkZHD16tKRiEUIIkZ+sG7DsBfimGxz46Va7FFNClBk2FVRpaWkMHDgQLy8vwsPDze1PPPEEsbGxJRacEEJUeJcOmhaeH/wRNM5w87K9IxJC5MOmgmrKlCnEx8eze/dui/YhQ4YwderUEglMCCEqNKVg93yY1wmS/wKfUNMNO9uOsXdkQoh82LSGavny5WzZsoXatWtbtLdp04Ynn3yyRAITQogKK/M6/PJ/cHi5abveI9B7Nnj62zcuIUSBbCqorly5QmBgIAAajcbcnpGRgVKqZCITQoiKKj7WVEw5uUCnt6Ht2FvP5xNClEk2/YQ2b96c1atXA5YF1aeffkrr1q1LJjIhhKio6kRBl3/C0LXQbpwUU0KUAzYdoXrvvffo27cv27dvB+D9999n7dq1/P7772zatKlEAxRCCIeXcQ3WToGHXgW/Gqa2duPsGpIQomhs+m9P586dWbduHWfOnCE4OJhPPvkEDw8PNm/eTPv27Us6RiGEcFxxsfBVB9j/PawYbVqMLoQod2x+4FPbtm1ZuXJlScYihBAVh1Kw49+w4W0wGsCvJnR9D25bRiGEKD/kCZpCCHGvpaeYjkadWGvaDu8FPT8HN1/7xiWEsJkUVEIIcS9d+QsW9oLUOHDWwaPT4P5hcmRKiHJOCiohhLiXfMPAww9cdDDgP1C1qb0jEkKUACmohBCitKWnmE7nOTmD1g2eWgzulUDnbe/IhBAlRG5uIoQQpens7zD7Qdj8wa22StWkmBLCwVh9hKpmzZpWT3r27FkbQhFCCAdizIGts+C3aaCMcGQFtH/ZdIRKCOFwrC6o3njjjdKMQwghHEdaEiwbAad/M203exoe+1CKKSEcmNUF1fDhw0szDoxGI05FfLxCYWOUUmRlZeHq6nrXftbs25b4hBAV0OnNsHQ43EwCrYepkGrxrL2jEkKUsmJXCFlZWWRmZto8fvr06QQFBaHVamnSpIlVj64pbMzly5eZMWMGtWvXxt3dnS1btti8b1viE0JUUOkpsPhpUzFVpSGMiJFiSogKwuaCat68edStWxd3d3c8PDyoW7cu8+bNK9Icc+bMYdq0aSxatIjr16/Tt29fevTowZkzZ4o1Zvbs2Vy9epVvv/22WPPYEp8QogLzqAyPTocWA2HEJghsYO+IhBD3iE0F1cyZM5k4cSJPPfUUP//8M7/88gtPPfUUEydOZObMmVbPM2vWLIYNG0bnzp3x8vLinXfeISAggDlz5hRrzFtvvcX7779P7dq1izWPLfEJISqWKqkH0cT/eash4jno9W9w9bBfUEKIe86m+1B98cUXLF68mO7du5vbunfvTtu2bXnxxRd55ZVXCp0jOTmZkydPEhkZaW7TaDRERkayY8eOEhtj6zwltS8hhIPKMeAU8y/anvoELi+GUVtNR6iEEBWSTQXVxYsX6dChQ5729u3bk5CQYNUciYmJAFSpUsWiPTAwkD/++KPExtg6j637ysrKIisry7ydmpoKgF6vR6/XWx1jYXLnKsk5yxpHz1HyK8dSE3Be8QLOF3YCoK8dBRotOFiuDv0e4vj5gePnWJr5FXVOmwqqOnXqsGzZMoYMGWLRvmTJEurUqVOkuYxGY55tTSHPtLJljK3zFHVf06dPZ+rUqXna169fj4dHyZ8CiI6OLvE5yxpHz1HyK1+Cru+jxbm5aHPS0Du5sa/6MBI0rWG9416w4mjv4Z0cPT9w/BxLI7/09PQi9bepoHrzzTd57rnnWLt2La1atQJg165dLFu2jIULF1o1R9WqVQFISkqyaE9KSiI4OLjExtg6j637mjJlChMmTDBvp6amUq1aNbp27YqPj4/VMRZGr9cTHR1Nly5d0Gq1JTZvWeLoOUp+5YzRgFPMP3E+/W8AVHBTDI9/RcKfJx0nxzs43Ht4B0fPDxw/x9LML/cMk7VsKqieeeYZQkNDmTlzJp9//jkajYbw8HA2btxIx44drZrDz8+P8PBwYmJi6N+/P2A6+hMTE8PQoUPN/QwGA0ajEVdXV6vHlMS+bd2XTqdDp9PladdqtaXyzVxa85Yljp6j5FdOKBe4etb0eauRaLr+ExflBJx0nBwLIPmVf46eY2nkV9T5bH44cmRkpMWCbVtMnjyZkSNHEhUVRdu2bfnggw9IS0tj9OjR5j6jRo1i586dHDp0yOoxOTk56PV681qm7OxsMjMzcXFxwcXFxep5rOkjhHBwRiM4OYFGA72+gPMDocFjptccdF2KEKLobCqolFJcuHCB6tWrW7SfP3+eatWqWb2eafDgwaSlpTFlyhQSExNp0qQJ0dHRhIWFmftotVqLIz7WjPn+++8ZMWIEYDpi1LNnT8D0+JzcR+hYM481fYQQDsqQDdFvQfoV6DvPVFB5VL5VTAkhxG1sKqg+++wzzpw5wyeffGLRPmvWLOrUqcNLL71k9VxjxoxhzJgxBb4+e/bsIo8ZNGgQgwYNKva+re0jhHAwKWdgyVBI2GvabjUSqj1g35iEEGWaTTf2/OSTT3j55ZfztI8fP57PPvus2EEJIYTdHF4BX3U0FVNuleDp/0kxJYQolE1HqC5dupTvLQA8PDyIi4srdlBCCHHP6TNh/euw+2vTdrXW0G8+VKpm37iEEOWCTUeoWrZsyddff52nfd68eTRv3ry4MQkhxL334+BbxVS78TBklRRTQgir2XSEaurUqXTr1o0dO3bQsWNHlFJs2bKFtWvXsmbNmpKOUQghSt+DY02n+XrPhnqd7R2NEKKcsekIVefOndm0aRM5OTl89NFHfPzxx+Z7NHXuLL+IhBDlgD4DLuy+tV2rI/zffimmhBA2sfk+VB06dMj3eX5CCFHmXT4BPw2Ba+dg5Bbw//uRWa4l/3goIUTFYNMRqttlZWWRmZlZErEIIUTp27cY5kZC0mHQukNaUuFjhBCiEDYXVPPmzaNu3bq4u7vj4eFB3bp1mTdvXknGJoQQJSf7JqwYAytGgT4danaAUdugRlt7RyaEcAA2nfKbOXMm//znPxk3bhxt2rRBo9GwY8cOJk6cyLVr13jllVdKOk4hhLBd0lHTKb7Lx0DjBJGvQsdJ4ORs78iEEA7CpoLqiy++YPHixXTv3t3c1r17d9q2bcuLL74oBZUQomw58IOpmPIKMt1bqpas/xRClCybCqqLFy/muyC9ffv2JCQkFDsoIYQoUQ+/Djl60/2lvKrYOxohhAOyaQ1VnTp1WLZsWZ72JUuWUKdOnWIHJYQQxXLpICwbaSqiAJy18Mi/pJgSQpQam45Qvfnmmzz33HOsXbuWVq1aAbBr1y6WLVvGwoULSzRAIYSwmlIQ+w2seRVysky3Q4j8h72jEkJUADYVVM888wyhoaHMnDmTzz//HI1GQ3h4OBs3bqRjx44lHaMQQhQuMxV++T84/PfR83qPwP3D7BuTEKLCsKmg+vDDD5k0aRKRkZEFviaEEPdMwj7TVXxXz4CTC3R6G9qOBadi32pPCCGsYtNvm7tdxSdX+Akh7qlDS2F+F1Mx5VsNhq6FduOkmBJC3FM2P3omP6dOncLf378kpxRCiLsLbgbOrlC3C/T6Ajwq2zsiIUQFVKSCqm7duvl+DmA0GklISODZZ58tmciEEKIgaUngFWj6PKAujIiBgHqg0dg3LiFEhVWkgip3bdTo0aPzrJPSarXUrFmThx9+uOSiE0KI2ykFO7+Eje/Cs0tu3aCzyn32jUsIUeEVqaAaNWoUAAEBAfTv379UAhJCiHylp5iexXdijWn7yAq547kQosywaQ3V7cVUVlYWSinc3NxKLCghhLBwfhcseR5S40zrpR6ZBg8Mt3dUQghhZvNlMPPmzaNu3bq4u7vj4eFB3bp1mTdvXknGJoSo6IxG2PYJfNPNVExVrg3DN0CrEbJeSghRpth0hGrmzJn885//ZNy4cbRp0waNRsOOHTuYOHEi165dk1snCCFKxl/RsOFt0+eN+0GPT8DNx64hCSFEfmwqqL744gsWL15M9+7dzW3du3enbdu2vPjii1JQCSFKRr2u0GIghN4PEUPkqJQQosyyqaC6ePEiHTrkXQzavn17EhISih2UEKKCMhph1xxo/jS4+5kKqF7/tndUQghRKJvWUNWpU4dly5blaV+yZAl16tQpdlBCiAooLQm+6wvrpsDKsaZbJAghRDlh0xGqN998k+eee461a9fSqlUrAHbt2sWyZctYuHBhiQYohKgATm+GZSMgLRFc3KH+Y3J6TwhRrthUUD3zzDOEhoYyc+ZMPv/8czQaDeHh4WzcuJGOHTuWdIxCCEdlzIHNH8Dm9wEFVRrCgP9AYAN7RyaEEEViU0H13XffMXDgQCIjI0s6HiFERZGWZLq31Nmtpu0WA6HbTHD1sG9cQghhA5vWUA0dOhSj0VjSsQghKhInF0g5A1pP6DPXtPhciikhRDll0xGq+vXrs3//flq0aFFigRiNRpycilbfWTOmoD65d3i/k4uLCy4upi+LwWDAYDBYvO7k5ISrq2uR4hRC/M2YAxon0/ooj8rw5H9B5216sLEQQpRjNh2hevHFF3nmmWdYsmQJR44c4a+//rL4KIrp06cTFBSEVqulSZMmbNq0qUTGFNYnNDSUSpUqWXy4u7szceJEc5+xY8fi6elp0adt27ZFyk8I8bfr8fCfHrD3v7faQltKMSWEcAg2FVRjxozh2LFjDBgwgEaNGlGvXj2LD2vNmTOHadOmsWjRIq5fv07fvn3p0aMHZ86cKdYYa/pcuXKFzMxM88cvv/wCwBNPPGGxvz59+lj0i42NtTo/IcTfTqyHOe3h/HbY+E/ITrd3REIIUaJsKqjOnDlz1w9rzZo1i2HDhtG5c2e8vLx45513CAgIYM6cOcUaY8u88+fPp2HDhrRr1y7Pa7JeTAjbaJQBp43vwPcDICMFqjaD59fKWikhhMMp0hoqpRSfffYZP//8M0opevXqxbhx49DYcL+Y5ORkTp48aXGloEajITIykh07dtg8xpZ5U1JSWLFiBdOnT8/z2urVq9HpdHh7e9O+fXs++uijIh2FE6LCuh5H+5PTcL759zKAVi9A1/fARWffuIQQohQUqaCaOXMmr7/+Ol27dgVg0qRJZGVl8Y9//KPIO05MTASgSpUqFu2BgYH88ccfNo+xZd7vvvsOgMGDB1u0N2jQgJUrV9KxY0cSEhIYN24ckZGRHD58GD8/v3znysrKIisry7ydmpoKgF6vR6/X5zvGFrlzleScZY2j5+jQ+WVex2V+FJUzUlA6H3J6fIpq8DgowIHydej3EMnPETh6jqWZX1HnLFJBNX/+fBYvXkz//v0B+PHHH3nrrbdsKqhy3Xk6zWg0FnrEy5oxRZl3/vz59OnTB39/f4v28ePHmz+vVasWixYtIjg4mB9++IFRo0blO9f06dOZOnVqnvb169fj4VHypzmio6NLfM6yxtFzdNT86vt2JEhzgD9rvkj6aWc4vdreIZUaR30Pc0l+5Z+j51ga+aWnF22tZ5EKqrNnz9KjRw/zds+ePfMc1bFW1apVAUhKSrJoT0pKIjg42OYxRZ33zz//5MCBA3z88ceFxuzj40NYWBinTp0qsM+UKVOYMGGCeTs1NZVq1arRtWtXfHx8Ct2HtfR6PdHR0XTp0gWtVlti85Yljp6jw+V37RwoI/jVAkCfFcWG6PV0fqSbY+SXD4d7D+8g+ZV/jp5jaeaXe4bJWkUqqLKzs3FzczNvu7m5WZzeKgo/Pz/Cw8OJiYkxH/EyGo3ExMQwdOhQcz+DwYDRaMTV1dWqMdbOm2v+/PnUrVuXhx9+uNCYU1JSOH/+PGFhYQX20el06HR514hotdpS+WYurXnLEkfP0SHyO7ISVr4EfjVgWDRoTb8nlJOLY+RXCEfPUfIr/xw9x9LIr6jzFfnGnsOHDy+07euvv7ZqrsmTJzNy5EiioqJo27YtH3zwAWlpaYwePdrcZ9SoUezcuZNDhw5ZPcaaPgAZGRksXryYKVOm5DkdmJWVRZ8+fXj11Vdp1KgR58+fZ+LEifj5+TFw4ECr8hPC4ekzYf0bsHueadvFDbJSzQWVEEJUFEUqqNq1a8exY8cKbbPW4MGDSUtLY8qUKSQmJtKkSROio6MtjgBptVqLIz7WjLGmD8CKFSswGAwMGTIkT2w6nY5Jkybx3nvvsXfvXvz8/OjQoQMLFy7Ms9ZKiAop+RT8NAQuHTBtt/s/iHoTnB33f8FCCFGQIhVU27ZtK/EAxowZw5gxYwp8ffbs2UUeY22fp59+mqeffrrA16OiooiKirrrHEJUSAeXwC/jIfsGuFeGPl/BfV3tHZUQQtiNTc/yE0JUYMYc2DnbVExVbwv95oNvqL2jEkIIu5KCSghRNE7O0H8B7F8MHSaBs/waEUIImx49I4SoYPb/AL/NuLXtVwMeelWKKSGE+Jv8NhRCFCw7Hda8AntNTxOg9kNQvY1dQxJCiLJICiohRP6SjsFPz8HlY4AGIidD2AP2jkoIIcokKaiEEJaUgn2LYNUkMGSAVxD0nQe1IwsfK4QQFZQUVEIIS6snwe6/b85b+2HoOxe8Au0bkxBClHGyKF0IYalaa9A4m27SOXCZFFNCCGEFOUIlREWnFKQlgvffDw9v+gSEtISAuvaNSwghyhE5QiVERZaZCkuHwVeRcPPKrXYppoQQokikoBKiorq4H+ZGwqGlcPMynPvd3hEJIUS5Jaf8hKholDItOl/3GuRkg08YDPgGqrWyd2RCCFFuSUElREWScQ1+fgmO/mzarv8Y9Po3eFS2a1hCCFHeSUElREXy2wxTMeWkhS5Toc0Y0GjsHZUQQpR7UlAJUZE8/JrpzudRb0JYhL2jEUIIhyGL0oVwZOkp8PunpnVTAG4+MHiFFFNCCFHC5AiVEI7qwh+w5Hm4fgFc3KD1SHtHJIQQDksKKiEcjdEIOz6Hje+C0QB+tUx3PxdCCAeTlmXg5PWysQ5UCiohHMnNZFgxCk6uN2036guPf2o61SeEEA7AaFTsOJ3M0tg41hy6iN7gxJAMPQFarV3jkoJKCEdxfhf8NARuJICzDrq9DxFD5Co+IYRDOHPlJktj41i+N574axnm9kA3iLuaQYCPhx2jk4JKCMeSlgj+9WDAfyC4sb2jEUKIYrmeoWfVgYss3RNH7Lmr5nYfNxcebxZCr2bBJBzYTqMQ+x+Fl4JKiPIsxwDOf/8YV28NTy+GGu1A52XfuIQQwkY5RsXWk5dZuiee9YcvkWUwAuCkgcj7qtAvIozODYNw0zqj1+u5eNDOAf9NCiohyqszW+DncaYiKrChqe2+R+wbkxBC2Ohk4g2W7Iljxd54ElOzzO33BXnRPyKM3s1DCfRxs2OEdycFlRDljTEHtsyEze+DMkLMNHjyv/aOSgghiuzqzWx+OZDA0tg49sddN7f7eWjp1TyUfi3DaBzqg6YcrAWVgkqI8uTGJVg2wnR0CqDFQOg2074xCSFEEehzjGw+fpmle+LYcDQRfY7pxsMuThoebhBIv5ZhRDUIxNWlfN17XAoqIcqLU5tg2Qtw8zJoPaHHx9DsSXtHJYQQVjmSkMrSPXGs3BfPlbRsc3t4VR/6R4TRs3kIAV46O0ZYPFJQCVEenP4N/tsXUBDYyHQVX5X77ByUEELc3ZW0LFbuM53SO3Ix1dwe4OVK7+ah9IsIo2FV+1+hVxKkoBKiPKjR3nT1XkA9eHQ6aN3tHZEQQuQr22Bk07FElsTG89vxJAxG0yk9V2cnOjUMpH9EGB3vq4LWuXyd0iuMFFRClFVnt0HYA+CiM90aYeBS0JbdK1yEEBWXUopD8aksib3Az/sTuJquN7/WLMyX/hFhPN4shEoernaMsnRJQSVEWZOjh03vwe+fQKsX4LG/F51LMSWEKGOSUjNZvjeepXviOJGYZm4P8tHRp0UY/SNCqRvobccI750yU1AZjUacnIp2+M+aMQX1MRgMGAwGizYnJydcXfOvnm2JT4giu3YBlg6DC7tutRmNIN97QogyIlOfQ/SRRJbuiWPLicv8fUYPnYsTjzQKpl9EGO3rBuDsVPZvdVCS7P5bevr06QQFBaHVamnSpAmbNm0qkTGF9Rk7diyenp5UqlTJ/NG2bdsSiU8ImxxbDXPam4opnS88sdB0dEqKKSGEnSmliD13ldeWH6TVvzbw0uK9/HbcVExF1PBjet8m7H6jM5893YLI+6pUuGIK7FxQzZkzh2nTprFo0SKuX79O37596dGjB2fOnCnWGGvn7dOnD5mZmeaP2NjYYscnRJHlZMPa1+B/T0PmNQhpCSM3Q3gve0cmhKjgEq5l8O+Yv+j00Wb6zd7O97vOk5ppIMTXjZei6hIz6SGWjn6Qp1tVx8dNa+9w7cquBdWsWbMYNmwYnTt3xsvLi3feeYeAgADmzJlTrDFFmddoNJZofEIUWVoS7P3O9HmbMfD8Oqhcy74xCSEqrIzsHJbvjWPg17to9/4mZq47zukrN3HXOtO3RSjfD2/NtslRTOxan1oBnvYOt8yw2xqq5ORkTp48SWRkpLlNo9EQGRnJjh07bB5TlHlXr16NTqfD29ub9u3b89FHH1GvXj2b4xPCJr5h0GcOoKBBd3tHI4SogJRS/HEmhaV74lh98BJpWbfWGLeuVZn+EWF0a1IVL12ZWXpd5tjtK5OYmAhAlSpVLNoDAwP5448/bB5j7bwNGjRg5cqVdOzYkYSEBMaNG0dkZCSHDx/Gz8/PpvgAsrKyyMq69VDH1FTTjcz0ej16vb6gYUWWO1dJzlnWOGyOhiycNr5DTs2HgL/zq9OFvzfsF1cJc9j37zaOnqPkV/4VluOFq+ms2HuR5fsSuHA1w9xezc+dPi1C6N28KtX8PP5uVWXua1Wa72FR57R7qXnnKTej0VjoQxCtGVNYn/Hjx5s/r1WrFosWLSI4OJgffviBUaNG2Rzf9OnTmTp1ap729evX4+Hhkc+I4omOji7xOcsaR8rRMyuR+8/8m0oZZzHs+x/O4R85VH75cfT8wPFzlPzKv9tzzMyBfckadl924q/UW3/PdM6K5pUVrQON1Pa+gSbjOAd3HOegPQIuotJ4D9PT04vU324FVdWqVQFISkqyaE9KSiI4ONjmMbbMC+Dj40NYWBinTp0q1jxTpkxhwoQJ5u3U1FSqVatG165d8fEpudvr6/V6oqOj6dKlC1qtYy4EdLQcNUdW4LxqKprsNJR7ZdRjn5Fz2ugw+d3J0d6//Dh6jpJf+ZebY6fOnYm9cIPlexNYdySRDL3pYIFGA21rV6Zvi1C6NgzE3dXZzhEXTWm+h7lnmKxlt4LKz8+P8PBwYmJi6N+/P2A6+hMTE8PQoUPN/QwGA0ajEVdXV6vGWDvvnVJSUjh//jxhYWHFmken06HT5X24o1arLZUf2NKatywp9znqM2Dda/DnAtN29bZo+s3H2SMQTq8u//kVwtHzA8fPUfIrv84m32TVeSfe/2wnCdczze21AzzpFxFGnxahhFQq/4+yKo33sKjz2fWU3+TJkxk5ciRRUVG0bduWDz74gLS0NEaPHm3uM2rUKHbu3MmhQ4esHlNYn6ysLPr06cOrr75Ko0aNOH/+PBMnTsTPz4+BAwcWKT4h7irrBizoBokHAQ10mAAPvWZ6lEwZW4sghHAM1zP0rDpwkaV74og9dxXTBf2ZeLu58HizEPpHhNGiWqVCl9eIorFrQTV48GDS0tKYMmUKiYmJNGnShOjoaPNRIjBViLcf8bFmTGF9dDodkyZN4r333mPv3r34+fnRoUMHFi5ciL+/f5H2JcRd6byhajO4cRH6zoW6newdkRDCAeUYFVtPXmbpnnjWH75ElsF0Ss9JA/V9jYzq2pxHmoTgpi1fp/TKE7svSh8zZgxjxowp8PXZs2cXeYw1faKiooiKiip2fELkkZ0OhkzwqGzafuwD6PQmeBe89k4IIWxxMvEGS/bEsWJvPImpt64wvy/Ii/4RYXRvHMSfWzfyWJNgtFJMlSq7F1RCOJSkY/DTEPANhWd+Mj02xtXT9CGEECXgWno2P+9PYGlsHPvjrpvbK3lo6dUshP4R1Wgc6oNGoylztzlwZFJQCVFS9i6CVRPBkAEZKXD9AvjVsHdUQggHoM8xsvn4ZZbuiWPj0SSyc0yn9FycNDxUP5D+EWFENQjE1UWe/WkvUlAJUVxZabB6EuxfbNqu/bBpvZRXoH3jEkKUe0cSUlm6J46V++K5kpZtbg+v6kO/iDB6NQ8hwCvvleXi3pOCSojiSDxsOsV35QRonODh16H9BNOpPiGEsMGVtCxW7jOd0jty8da9kAK8XOnVPJR+LcMIDym5+xqKkiEFlRC2Mhph6XBTMeUdAv3nQ40H7R2VEKIcyjYY2XQskSWx8fx2PAmDUQHg6uxEp4aB9GsZRmT9Kmid5T9rZZUUVELYyskJen8JWz6Exz8DT//CxwghxN+UUhyKT2VJ7AV+3p/A1fRbC8ibhfnSLyKMx5uG4OfpascohbWkoBKiKC7uh8vHoekTpu2QFvDUIvvGJIQoV5JSM1m+N56le+I4kZhmbg/01tGnZSj9W4ZRL8jbjhEKW0hBJYQ1lILdX5seIQMQcB+ENLdrSEKI8iNTn0P0kUSW7oljy4nL/H1GD1cXJx5pFEy/lqG0rxuAi5zSK7ekoBKiMJnX4eeX4MhK03b9x6BSdfvGJIQo85RS7Dl/jaV74vh1fwKpmQbzaxE1/OjXMozuTavi6+6YzxGsaKSgEuJu4veYruK7dg6ctNBlKrQZY3pEuxBC5CPhWobplF5sHKev3DS3h/i60bdlGH1bhlK7ipcdIxSlQQoqIQqya67pFJ9Rbzoi1f8/EBZh76iEEGVQRnYOaw9fZGlsPL+fuoL6+5Seu9aZbo2D6RcRRtva/jg5yX/GHJUUVEIUJPuGqZhq+Dj0/ALcK9k7IiFEGaKU4o8zKSzdE8fqg5dIy7p1Sq91rcr0iwjjsSZV8dLJn9qKQN5lIW6XYwDnv38s2r1sWnzeoIec4hNCmF1ISWfpnjiW7YnnfEq6ub1aZXf6tQyjX8swqlX2sGOEwh6koBICTDfp3PEFHPwRnl8Prh6m+0w1fNzekQkhyoC0LAOrD15kaWwcu86kmNs9XZ3p3rQq/VqG8UDNynJKrwKTgkqIm8mwYjScXGfaPvAD3D/UvjEJIezOaFTsPJ3Mktg41hy6RIY+BzAdsG5XJ4B+EaE80igYD1f5UyqkoBIV3bkdsHQYpMaDsw66vQ8RQ+wdlRDCjs5cucnS2DiW740n/lqGub12gCf9IsLo0yKUkErudoxQlEVSUImKyWiE3z+GTf8ClQP+dWHAtxDc2N6RCSHsIDVTz6oDF1kSG0fsuavmdm83Fx5vFkK/lmG0rF4JjaynFAWQgkpUTJv+CdtmmT5v+iR0nwU6uS+MEBVJjlFx9JqG9T8eYMPRJLIMRgCcNNDxvir0axlGl/Ag3LTOdo5UlAdSUImKqdUIOPgTRE6GFgPlKj4hKpCTiTdYsieOFXviSbzhDFwCoF6gF/0jwujdIpQgHzf7BinKHSmoRMVgzIFTMVCvs2nbJwReigUXnX3jEkLcE9fSs/l5fwJLY+PYH3fd3O7hougXUZ0BD1SnSaivnNITNpOCSji+G4mwbASc2QxPfnfrVghSTAnh0PQ5RracuMyS2Dg2Hk0iO8d0Ss/ZScPD9avQu1lVss7E0rNHQ7RaeZ6eKB4pqIRjOxUDy16Am0mg9QRDlr0jEkKUsqMXU1kSG8fKffFcScs2tzes6kP/iDB6NQ8hwEuHXq9n9Tk7BiocihRUwjHlGGDzDNjyIaAgsBEM+A9Uuc/ekQkhSkFyWhYr9yWwJDaOIxdTze3+nq70ah5Kv4hQGoX42jFC4eikoBKOJzUBlg6Hc7+btiOGwKMzQCv3jRHCkWQbjGw6lsSS2Dh+O56EwWh6IrHWWUOnBkH0jwgjsn4VtM5Odo5UVARSUAnHEx9rKqZcveDxT6FJf3tHJIQoIUopDsWnsiT2Aj/vT+Bqut78WtMwX/pHhPF40xD8PF3tGKWoiKSgEo6n4ePQ9V9Qvxv417F3NEKIEpCUmsmKffEsiY3jRGKauT3QW0efFqH0iwjjviBvO0YoKjopqET5dz0OVv8Dun8EPlVNbQ+OtW9MQohiy9TnsOFoIkti49hy4jJ/n9HD1cWJRxoF069lKO3rBuAip/REGSAFlSjfjq8xPdg44yqg4OnF9o5ICFEMSin2XrjG0tg4ftmfQGqmwfxay+qV6B9Rje5Nq+LrLrc5EGWLFFSifDJkw8apsOML03ZIC3hkmn1jEkLY7OL1DJbtiWfpnjhOX75pbg/xdaNvyzD6tgyldhV5PJQou6SgEuXP1XOwZKhp8TlAmzHQeSq4yCJUIcqTjOwc1h2+xJLYOH4/dQX19yk9N60T3RpXpX9EGG1r++PkJHcvF2VfmSmojEYjTk5FOw9uzZjC+iilCnzUgMFgwGAwWLQ5OTnh6ip/uO0mPhb+2wcyr4ObL/SeDQ262zsqIYSVlFLsPnuVJbEXWH3wEmlZt37HtqpVmf4RYTzWpCpeujLz50kIq9h9Jd/06dMJCgpCq9XSpEkTNm3aVCJjCuuzbt06unTpgq+vL76+vnTv3p2jR49a9Bk7diyenp5UqlTJ/NG2bdviJSyKp0oD8AqGsAdg1DYppoQoJy6kpPPphpNEzvyNJ77awY9/xpGWZaBaZXf+r1M9trzyMD+ObMsT91eTYkqUS3YtqObMmcO0adNYtGgR169fp2/fvvTo0YMzZ84Ua0xhfXJycvj444959dVXSUhI4NSpU3h6etKlSxdSU1Mt9tenTx8yMzPNH7GxsaXzxRAFS00Ao+kZXLh6wqDlMHQNVKpu37iEEHd1M8vAT39e4MmvdtDhgxg+3nCC8ynpeLo6MyAijB9eaMPmSQ/zcpf7qO7vYe9whSgWuxZUs2bNYtiwYXTu3BkvLy/eeecdAgICmDNnTrHGFNbH2dmZtWvX0qlTJ7y8vAgICOCjjz4iPj6eXbt25dmnMfePubjnQq7uwuWrB2HH57cafUPBWa7wEaIsMhoV2/+6woQf93H/ext4ZckBdp1JQaOBdnX9mfVEM3a/0ZmZA5rRWtZHCQdit+OqycnJnDx5ksjISHObRqMhMjKSHTt22DzGlnkBLl68CICfn59F++rVq9HpdHh7e9O+fXs++ugj6tWrV/SERdHoM3FaM5kHzv7HtH0yGtq+BEVcZyeEuDfOXrnJ0j1xLNsTT/y1DHN7rQBP+rUMpU/LMEIryeOfhOOyW0GVmJgIQJUqVSzaAwMD+eOPP2weY8u82dnZjB8/nlatWhEREWFub9CgAStXrqRjx44kJCQwbtw4IiMjOXz4cJ7CK1dWVhZZWVnm7dxTiHq9Hr1en+8YW+TOVZJzlhnJf+GybDjOSYdQaDC0eQkefg1yckwfDsKh30McPz9w/BwLy+9Gpp7VhxJZvjeB2PPXzO3ebi481jiYvi1CaFHN13zhT1n7Ojn6+weOn2Np5lfUOe2+8u/O02lGo7HAq+6KMsbaeY1GI0OGDOH8+fNs27bNos/48ePNn9eqVYtFixYRHBzMDz/8wKhRo/KNbfr06UydOjVP+/r16/HwKPk1AtHR0SU+pz2FpWyn2YVv0BizyHLxJrbGKC5nNYG16+0dWqlxtPfwTo6eHzh+jrfnZ1Rw/LqGP5I0HEzRoFem35kaFA0qKVpVUTT2M+DqfJZLh86y5pC9oraeo79/4Pg5lkZ+6enpRepvt4KqalXTI0KSkpIs2pOSkggODrZ5TFHmzS2mfvvtNzZv3kzNmjXvGrOPjw9hYWGcOnWqwD5TpkxhwoQJ5u3U1FSqVatG165d8fHxuev8RaHX64mOjqZLly5otQ6ynuj6BVy+HIbGqMdYox3Gx77g8s6DjpXjbRzyPbyNo+cHjp/j7fmdu5rF8n0JrNx3kcQbt47C163iSZ8WIfRqVpUgHzc7Rlt0jv7+gePnWJr53XmRWmHsVlD5+fkRHh5OTEwM/fv3B0wFTkxMDEOHDjX3MxgMGI1GXF1drRpj7bxGo5Hnn3+eDRs2EBMTY9W6qJSUFM6fP09YWFiBfXQ6HTqdLk+7VqstlW/m0prXLgJqm+52np6MU+Q/cMkxAgcdK8d8SH7ln6PmeC1dz9ZLGuYviOVA3K0/Lr7uWno1D6FfyzCahvkWelahrHPU9+92jp5jaeRX1Pnsespv8uTJjBw5kqioKNq2bcsHH3xAWloao0ePNvcZNWoUO3fu5NChQ1aPKayPUooRI0awZs0aoqOjqVGjBpmZmYDpC+js7ExWVhZ9+vTh1VdfpVGjRpw/f56JEyfi5+fHwIED7+FXycHtWwxB4VC1mWm79Qu3XsuRqyuFuNf0OUa2nLjM0j1xRB9JRJ/jDKTi7KTh4fpV6NcyjKiGgehcnO0dqhBlil0LqsGDB5OWlsaUKVNITEykSZMmREdHWxwB0mq1Fkd8rBlTWJ+UlBQWLVoEQKtWrSximjNnDkOGDEGn0zFp0iTee+899u7di5+fHx06dGDhwoX4+/uX5pelYsi+Casmwf7voXJtGLkFdN72jkqICuvoxVSWxsaxYl88V9Kyze0hHoohkQ3o07IaVbzzHn0XQpjYfVH6mDFjGDNmTIGvz549u8hjCuvj7+9vPiJ1N1FRUURFRRXaTxRR4hH46Tm4cgI0TtD8GdDKTf2EuNeS07JYuS+BpXviOJxw65Sev6crvZqH0qtZEGf3buOxB2s49OkiIUqC3QsqUYEoBXsWwpp/gCETvKtCv/lQs529IxOiwsg2GNl0LImle+KIOZaEwWh6IrHWWUOnBkH0iwjjofpV0Do7odfrObvXzgELUU5IQSXuDX0G/PwSHPzJtF23M/T5CjwD7BuXsCujUbHjdDJLYuPYfOIy2YbytW5OoTAYnHltz0Y0lI+F2dk5Rouvc5NQX/pHhPF4sxAqe8qD34WwlRRU4t5w1kF6MmicodNb8OA4uet5BXb6chpL98SxfE88CdcLP/1etmnIKmc3nK3iraNvi1D6RYRxX5CsXRSiJEhBJUqPUmA0mJ675+QEfeZCymmo3trekQk7uJ6h59cDCSyNjWPPbXfV9nFzoWfzEHo3Dy13i571BgObf/uNyIceQutSPn6datAQUskNF2f5D40QJal8/AYQ5U/mdfh5HLj5QM+/H2zsVcX0ISqMHAWbT1xmxf5LrD+SaD7V5OykIfI+0yX4nRoG4qYtn5fg6/V6AtygRmUPWbQtRAUnBZUoefF7YMlQuHoWnFxMp/cC5IHSFcmJxBv8uPs8P8Y6k7rz1qrm+kHe9I8Io1eLEAK9y9ddtYUQ4m6koBIlRynY9RWsfwOMeqhUHfr/R4qpCuLqzWx+3m+6BP9A3PW/WzX4eWjp1TyU/hFhNArxKfd31RZCiPxIQSVKRsZVWDkWjv1q2m7QA3r9G9wr2TUsUbr0OUZ+O36ZpbFxbDyWiD7HdAm+y9931a5uvMiEpzrj6V6+1kYJIURRSUElik8p+G8fSNgLzq7Q9V/QagTIkQiHdSQhlSWxcazcF0/yzVt31W4c6kO/lmH0bBaCj86J1asTcHWRxc9CCMcnBZUoPo0GHnoN1k6G/gsgpIW9IxKl4EpaFiv2xrN0TzxHL966q3aAl44+LULoFxFGg2Afc7ter7dHmEIIYRdSUAnbpKeYHh1TvY1p+76uUPshcJEbAzqSLEMOMceSWBIbx2/HL5vvqu3q7ESX8CD6RYTSsV4VuQRfCFHhSUEliu78TlgyDLJvwKhtpsXnIMWUg1BKcTD+Okti4/h5fwLX0m8daWpWrZLprtpNq1LJQ95vIYTIJQWVsJ7RCL9/ApveA5UD/nUhO93eUYkSkpSayfK98SyJjeNkUpq5PchHR9+WYfRrGUrdQLmrthBC5EcKKmGdtMuwfCSc2mjabvIE9JgFOvkDW55l6nNYfySRpbFxbD15mb/P6KFzceKRRsH0jwijXd0AnJ3kAgMhhLgbKahE4c5uM53iS7sELu7w2ExoMVCu4iunlFLsOX+NJbFx/HoggRuZBvNr99fwo39EGI81rYqPm9z5WwghrCUFlSjc4RWmYiqgPgz4DwSF2zsiYYP4axks3xPH0j3xnLly09weWsmdvi1D6dsyjFoBnnaMUAghyi8pqEThur4HHv7Qbhy4yh/c8iQ928C6w5dYEhvH9lPJqL9P6Xm4OvNoY9MpvTa1/HGSU3pCCFEsUlCJvE7FwJ6F0O9rcHIGrRs8PMXeUQkrGY2K3WdTWBIbx+qDF7mZnWN+rU3tyvSPqEa3xsF46uTHXwghSor8RhW35Bhg8wzY8iGgTPeYaj3S3lEJK11ISWfpnjiW7onjQkqGub16ZQ/6R4TRp0Uo1Sp72DFCIYRwXFJQCZPUi7B0GJz73bTd8jloOdi+MYlCpWUZWH3wIkti4/jjTIq53UvnQvcmVel/fxj31/CTBxILIUQpk4JKwF8bYNkLkJ4Mrl7w+KfQpL+9oxIFMBoVO04nsyQ2jrWHLpGhN53S02igfd0A+keE0TU8GHdXZztHKoQQFYcUVBXdrq9gzT9Mnwc3gQHfgn8d+8Yk8nXmyk2WxsaxbE8cCdczze21q3jSr2UYfVuGUtXX3Y4RCiFExSUFVUVXsz24uJnuK9X1X6YF6KLMuJ6hZ9WBiyyJvcCe89fM7T5uLjzeLIT+EWE0r1ZJTukJIYSdSUFVEV09B341TJ8HNYKxu289j0/YXY5RsfXkZZbExrH+SCLZBiMAThqIvK8K/SLC6NwwCDetnNITQoiyQgqqisSQDRunmk7zDV0D1R4wtUsxVSacSLzB0tg4lu+NJ+lGlrm9fpA3/SJC6d08lEAfOYIohBBlkRRUFcXVc7BkKMTHmrbPbL5VUAm7uamH73adZ/m+ixyIu25u9/PQ0qt5KP0jwmgU4iOn9IQQooyTgqoiOPorrBwDmdfBzRd6fQkNe9g7qgpLn2Nk8/HL/PjneTYedSZHHQPAxUnDww0C6dcyjKgGgbi6ONk5UiGEENaSgsqRGbIg+i3YNce0HXo/DPhGTvHZyZGEVJbuiWPlvniupGX/3aohvKo3/SOq0at5CP5eOrvGKIQQwjZSUDmyw8tvFVMPvgSd3gZnrX1jqmCupGWxcl8CS2LjOHox1dwe4OVKz6ZVCUg7xYgBbdFq5X0RQojyTAoqR9b0STi7FRr2hPsesXc0FUa2wcimY4ksiY3nt+NJGIymJxK7OjvROdx0Sq/jfVXAmMPq1afsHK0QQoiSUGYKKqPRiJNT0daMWDPmXvaxO30mbJtlOhql8zbdOrvXv+0dVYWglOJg/HWWxsaxcn8C19L15teaVatE/5ahPN4shEoeruZ2vTEnv6mEEEKUQ3avEKZPn05QUBBarZYmTZqwadOmEhlzL/uUCVf+gq87w+b34deX7R1NhZGUmslXm0/xyCdb6PnF73y74xzX0vUE+egYFVmHDRM6svLFdgxqW9OimBJCCOFY7FpQzZkzh2nTprFo0SKuX79O37596dGjB2fOnCnWmHvZp0w48BPMjYTEg+ARAM2esndEDi1Tn8Mv+xMY8s0ftJm+kelrjnEiMQ2dixM9m4Xw7fOt2P5qJ17t1oC6gd72DlcIIcQ9YNeCatasWQwbNozOnTvj5eXFO++8Q0BAAHPmzCnWmHvZx56cjNk4rxoPy4ZDdhrUaA+jtkHdzvYOzeEopYg9d5XXlh/kgX9t4KXFe/nt+GWMCu6v4cf0vk3Y/UZnPnu6BZH3VcHZSe4bJYQQFYnd1lAlJydz8uRJIiMjzW0ajYbIyEh27Nhh85h72ceetu/+k1ZH3sFJH4dCw4kGozlRfzTqjAIS7B1eicgxGNh3RYPxwEWcXey33O988k2W7Ynn9JWb5rbQSu70bRlK35Zh1ArwtFtsQgghyga7/ZVKTEwEoEqVKhbtgYGB/PHHHzaPuZd98pOVlUVW1q3HhqSmmi6V1+v16PX6goYV2fsx8fwnO43L+PJ/+hfZvq8x7DtYYvOXHc58e7Js5OWudeLRRkH0aRFC65qVcfr7KJSt72vuuJL8vihLHD0/cPwcJb/yz9FzLM38ijqn3a/yMxqNebYLe8yGNWPuZZ/bTZ8+nalTp+ZpX79+PR4eHgWOKyo3Vx1T1ctc1vhzVVeJehgLHyRsonOGppUVzfwNuDlf4OqxC6w9VnLzR0dHl9xkZZCj5weOn6PkV/45eo6lkV96enqR+tutoKpatSoASUlJFu1JSUkEBwfbPOZe9snPlClTmDBhgnk7NTWVatWq0bVrV3x8fAocV1RduuiJjjbSpUsXh70ppF6vJzo62mFzlPzKP0fPUfIr/xw9x9LML/cMk7XsVlD5+fkRHh5OTEwM/fv3B0xHf2JiYhg6dKi5n8FgwGg04urqatWYe9knPzqdDp0u7+NDtFptqXwzl9a8ZYmj5yj5lX+OnqPkV/45eo6lkV9R57PrVX6TJ09mwYIFLF26lISEBCZMmEBaWhqjR4829xk1ahQtW7Ys0ph72UcIIYQQwq5rqAYPHkxaWhpTpkwhMTGRJk2aEB0dTVhYmLmPVqu1OOJjzZh72UcIIYQQwu6L0seMGcOYMWMKfH327NlFHnOv+wghhBCiYrP7o2eEEEIIIco7KaiEEEIIIYpJCiohhBBCiGKSgkoIIYQQopikoBJCCCGEKCYpqIQQQgghikkKKiGEEEKIYpKCSgghhBCimKSgEkIIIYQoJrvfKd3RKaWAoj+1ujB6vZ709HRSU1Md9oGXjp6j5Ff+OXqOkl/55+g5lmZ+uX+3c/+OF0YKqlJ248YNAKpVq2bnSIQQQghRVDdu3MDX17fQfhplbeklbGI0GklISMDb2xuNRlNi86amplKtWjUuXLiAj49Pic1bljh6jpJf+efoOUp+5Z+j51ia+SmluHHjBiEhITg5Fb5CSo5QlTInJyfCwsJKbX4fHx+H/CG5naPnKPmVf46eo+RX/jl6jqWVnzVHpnLJonQhhBBCiGKSgkoIIYQQopikoCqndDodb7/9Njqdzt6hlBpHz1HyK/8cPUfJr/xz9BzLUn6yKF0IIYQQopjkCJUQQgghRDFJQSWEEEIIUUxSUAkhhBBCFJPch+oeOXr0KJmZmTRu3Njq2+NbM+Ze9rmbpKQkzp07R82aNalSpUqJjSmsj1KK06dPk5WVRZ06dfIsTIyPj+fMmTMWbU5OTjz44INWZmaSlZXF4cOH8fT0pH79+iU25m599Ho9u3btyjOmYcOG+Pv7Fzu+O/31119cv36d8PBw3N3dS2xMQX0Kyg+gZs2a5vu3HTp0iGvXrlm87u/vT8OGDa2KMVdycjKnT5+mWrVqBAcHl9iYtLQ09u/fT40aNQq855w189gS3+0MBgOHDx/GxcWF8PBwq24kbO2YvXv3opSiZcuW+b6emprKqVOnCA0NJTAwMM/r27Zty9NWp04dqlatWmiMtzt79ixXrlyhQYMGeHl5ldiYuLg4zp49S/PmzfP0OXHiBElJSRZtPj4+NG3atETiu93169c5efIkQUFBVj9dw5oxmZmZ7Nmzh6pVq1KrVi2L1/LLD0Cr1dK6dWsArl27xqFDh/L0uf/++3Fzc7MqTjDd6Prw4cMopWjUqBHOzs4lMubmzZucPHmSwMBAQkJCbJ7HlvgsKFGqzp49q5o2baoCAgJUzZo1VVBQkIqJiSn2mHvZ526MRqN66aWXlE6nU+Hh4Uqn06mJEycWe4w1fb7++mtVs2ZNVbt2bdWgQQNVqVIlNXfuXIs+M2fOVJ6enqpdu3bmj6ioKKvzU0qp1atXK39/f1W7dm3l5+enIiIiVEJCQrHHFNbn4sWLClAtWrSwiP/O98eW+G53+fJl9eCDDypfX19Vt25d5evrq5YtW1bsMYX1SU5OtsirXbt2qnHjxgpQ8+fPN/fr1KmTCgsLs+g3ZcoUq/NTSqm33nrL4ntp2LBhKicnp1hjLly4oMaMGaOCg4OVVqtV06dPt3nftsR3u+3bt6vQ0FBVrVo1FRgYqBo0aKCOHz9e7DGfffaZatiwoapUqZKqX79+njlOnjyp+vTpoypVqqRatGihvLy81GOPPaaSk5Mt+gGqcePGFu/h0qVLrc4vLS1NdevWTXl6eqr69esrDw8P9fXXXxd7zPbt21XPnj1VQECAAtTu3bvzzPPss8+qwMBAi9hfeOGFYsd3p88++0y5u7urhg0bKnd3d9W3b1+VmZlZrDFXrlxRkyZNUiEhIcrd3V393//9X5453n333Tw/h15eXqphw4bmPmvWrFFAnn5xcXFW53fgwAFVp04dVbVqVRUaGqpq1Kih9uzZU6wxcXFx6tlnn1W+vr6qefPmytfXV0VGRqoLFy4Ued+2xHcnKahKWfv27VWnTp1Udna2UkqpiRMnKn9/f3X9+vVijbmXfe7m66+/Vl5eXurAgQNKKaV2796tdDqdWrRoUbHGWNPnvffeU+fOnTNv//e//1Uajcbil+LMmTNVs2bNrMolP5cvX1be3t7q3XffVUoplZGRodq0aaO6detWrDHW9MktqA4ePFii8d2pf//+qmXLliotLU0pZfqaubu73/WXpTVjbJn33XffVZ6enhbff506dVKTJ0+2Op87rVixQmm1WvX7778rpZQ6duyY8vX1VZ9++mmxxvz222/qiy++UNevX1ehoaH5FlTWzGNLfLdLT09XISEhasyYMUoppQwGg3rsscdUy5Ytiz3m5ZdfVocPH1avv/56vgXV2rVr1bJly5TRaFRKmf6Ah4eHq6efftqiH6Cio6Otyic/Y8eOVbVr11aXL19WSpl+1p2cnO76s2HNmK+++kotX75cHTp06K4F1XPPPVfi8d1u586dSqPRqJ9//lkppVR8fLwKCQm5638crBmzd+9e9cEHH6jLly+riIiIfAuqO6WkpCg3Nzf1/vvvm9vWrFmjnJ2drcolPzk5OapBgwbqySefNH+vDBw4UNWuXVvp9Xqbx2zbtk0tWrRIGQwGpZRSqampqk2bNqpLly5FmseW+PIjBVUpOnHihALUhg0bzG1XrlxRLi4u6r///a/NY+5ln8I8+OCDauDAgRZtvXv3Vp06dSrWGFvmVUopLy8viz9EM2fOVI0bN1b79+9XR48eNReO1vryyy+Vh4eHunnzprltyZIlSqPRFHgUyJox1vTJLahWrVqlYmNj1bVr10okvtulpKQoZ2dn9d1335nbsrKylK+vr5o5c6bNY2yZ12g0qlq1aqnnn3/eor1Tp05qzJgxavfu3er8+fPmX3jW6tmzp3r00Uct2oYPH37XQruoYwoqqKyZx5b4brds2bI87/e2bdsUoPbu3VsiYwoqqPLzzjvvqGrVqlm0AWrh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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 30.75s\n" + ] + } + ], + "source": [ + "plot_errors(ShorProtocol(), \n", + " num_points=6, \n", + " max_p = 0.02,\n", + " num_experiments=1000,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p),\n", + " theoretical=lambda x:x)" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/README.md b/error_correction/README.md new file mode 100644 index 0000000..ed2ce43 --- /dev/null +++ b/error_correction/README.md @@ -0,0 +1,6 @@ +### Error correction + +This folder contains some very basic exercises with error correction codes. + +Notebooks must be run with path set to repository root, e.g. +`PYTHONPATH="$PWD" jupyter notebook` \ No newline at end of file diff --git a/error_correction/__init__.py b/error_correction/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/error_correction/channels.py b/error_correction/channels.py new file mode 100644 index 0000000..5913051 --- /dev/null +++ b/error_correction/channels.py @@ -0,0 +1,32 @@ +import numpy as np +import cirq + +class BitFlipChannel: + def __init__(self, flip_prob): + self.flip_prob = flip_prob + + def transmit(self, ct, q): + if np.random.rand() < self.flip_prob: + ct.append(cirq.X(q)) + return q + + +class PhaseFlipChannel: + def __init__(self, flip_prob): + self.flip_prob = flip_prob + + def transmit(self, ct, q): + if np.random.rand() < self.flip_prob: + ct.append(cirq.Z(q)) + return q + +class ArbitraryErrorChannel: + def __init__(self, flip_prob): + self.flip_prob = flip_prob + + def transmit(self, ct, q): + if np.random.rand() < self.flip_prob: + ct.append(cirq.Rx(rads=np.random.rand()*2*np.pi).on(q)) + ct.append(cirq.Ry(rads=np.random.rand()*2*np.pi).on(q)) + ct.append(cirq.Rz(rads=np.random.rand()*2*np.pi).on(q)) + return q \ No newline at end of file diff --git a/error_correction/protocols.py b/error_correction/protocols.py new file mode 100644 index 0000000..f4ceb61 --- /dev/null +++ b/error_correction/protocols.py @@ -0,0 +1,136 @@ +import numpy as np +import cirq + +from cirq import Circuit, Qid + +from abc import ABC + + +class QecProtocol(ABC): + def __init__(self): + self.name = "No encoding" + + def encode(self, circuit: Circuit, qubit: Qid): + return [qubit] + + def decode(self, circuit: Circuit, qubits: Qid): + return qubits[0] + +class NoEncodingProtocol(QecProtocol): + def __init__(self): + self.name = "No encoding" + + def encode(self, circuit: Circuit, qubit: Qid): + return [qubit] + + def decode(self, circuit: Circuit, qubits: Qid): + return qubits[0] + + +class ThreeQubitBitFlipProtocol(QecProtocol): + def __init__(self): + self.name = '3 qubit bit flip protocol' + + def encode(self, circuit, qubit): + q0 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits())) + circuit.append(cirq.CNOT(qubit, q0)) + q1 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits())) + circuit.append(cirq.CNOT(qubit, q1)) + return [qubit, q0, q1] + + def decode(self, circuit, qubits): + def X(target): + circuit.append(cirq.X(qubits[target])) + + def CCNOT(target): + i1, i2 = 1, 2 + if target == 1: i1, i2 = 0, 2 + if target == 2: i1, i2 = 0, 1 + circuit.append(cirq.CCNOT(qubits[i1], qubits[i2], qubits[target])) + + X(1) + CCNOT(0) + X(1) + CCNOT(1) + CCNOT(0) + X(0) + CCNOT(2) + X(0) + X(2) + CCNOT(0) + X(0) + X(2) + CCNOT(2) + X(0) + X(1) + CCNOT(0) + X(1) + CCNOT(1) + CCNOT(0) + + # Measurement is not needed for Bit-Flip, but is needed so we can use it in Shor Code. + circuit.append(cirq.measure(qubits[0])) + circuit.append(cirq.measure(qubits[1])) + + return qubits[2] + +class ThreeQubitPhaseFlipProtocol(QecProtocol): + def __init__(self): + self.name = '3 qubit phase flip protocol' + self.bf_protocol = ThreeQubitBitFlipProtocol() + + def encode(self, circuit, qubit): + qubits = self.bf_protocol.encode(circuit, qubit) + for q in qubits: + circuit.append(cirq.H(q)) + return qubits + + def decode(self, circuit, qubits): + for q in qubits: + circuit.append(cirq.H(q)) + return self.bf_protocol.decode(circuit, qubits) + + + +class ShorProtocol(QecProtocol): + def __init__(self): + self.name = 'Shor Code' + self.bf_protocol = ThreeQubitBitFlipProtocol() + self.pf_protocol = ThreeQubitPhaseFlipProtocol() + + + def encode(self, circuit, qubit): + result = [] + qubits1 = self.pf_protocol.encode(circuit, qubit) + for q in qubits1: + result += self.bf_protocol.encode(circuit, q) + return result + + def decode(self, circuit, qubits): + return self.pf_protocol.decode(circuit, [ + self.bf_protocol.decode(circuit, qubits[0:3]), + self.bf_protocol.decode(circuit, qubits[3:6]), + self.bf_protocol.decode(circuit, qubits[6:9]) + ]) + + +class NineQubitBitFlipProtocol(QecProtocol): + def __init__(self): + self.name = '9 qubit bit flip protocol' + self.bf_protocol_1 = ThreeQubitBitFlipProtocol() + self.bf_protocol_2 = ThreeQubitBitFlipProtocol() + + def encode(self, circuit, qubit): + result = [] + qubits1 = self.bf_protocol_1.encode(circuit, qubit) + for q in qubits1: + result += self.bf_protocol_2.encode(circuit, q) + return result + + def decode(self, circuit, qubits): + return self.bf_protocol_1.decode(circuit, [ + self.bf_protocol_2.decode(circuit, qubits[0:3]), + self.bf_protocol_2.decode(circuit, qubits[3:6]), + self.bf_protocol_2.decode(circuit, qubits[6:9]) + ]) + \ No newline at end of file diff --git a/error_correction/utils.py b/error_correction/utils.py new file mode 100644 index 0000000..91eaa49 --- /dev/null +++ b/error_correction/utils.py @@ -0,0 +1,88 @@ +import time + +import numpy as np +import cirq +import matplotlib.pyplot as plt + +from cirq_sparse_sim.sparse_sim import SparseSimulator + +from .channels import BitFlipChannel +from .protocols import QecProtocol + + +# Transmits random qubit using given channel and protocol and returns if transmission was successful. +# If output is passed, writes there circuit. +def test_protocol_once(protocol: QecProtocol, channel: cirq.Gate, output=None): + # Generate qubit (in Bloch sphere notation). + theta = np.random.rand() * np.pi + phi = np.random.rand() * 2 * np.pi + + # Coordinates on Bloch sphere (for asserion in the end of experiment). + init_bloch_coords = np.array( + [np.sin(theta) * np.cos(phi), np.sin(theta) * np.sin(phi), np.cos(theta)] + ) + + # Create circuit with one qubit and initialize it to generated state. + ct = cirq.Circuit() + q_init = cirq.NamedQubit("q_init") + ct.append([cirq.ry(theta).on(q_init), cirq.rz(phi).on(q_init)]) + + # Encode. + encoded_qubits = protocol.encode(ct, q_init) + + # Transmit. + transmitted_qubits = [channel.transmit(ct, q) for q in encoded_qubits] + + # Decode. + decoded_qubit = protocol.decode(ct, transmitted_qubits) + + # Simulate cirquit to get final state of decoded qubit. + sim = SparseSimulator() + sim.simulate(ct) + result = sim.simulate(ct) + result_bloch_coords = result.bloch_vector_of(decoded_qubit) + + # Protocol should ensurre that decoded_qubit is not entangled with other qubits. + if not np.allclose(np.linalg.norm(result_bloch_coords), 1.0): + raise ValueError("Not pure state %s" % result_bloch_coords) + + if output != None: + output["circuit"] = ct + + # Return whether qubit state was correctly transmitted. + return np.linalg.norm(result_bloch_coords - init_bloch_coords) < 1e-5 + + +# Experimentally calculates failure rate of error correcting protocol. +def test_protocol(protocol: QecProtocol, channel: cirq.Gate, num_experiments=100): + ok_count = sum( + [test_protocol_once(protocol, channel) for _ in range(num_experiments)] + ) + return 1.0 - 1.0 * ok_count / num_experiments + + +def plot_errors( + protocol, + num_points=21, + num_experiments=100, + theoretical=None, + channel_factory=lambda p: BitFlipChannel(p), + max_p=1.0, +): + time_start = time.time() + channel_error = np.linspace(0, max_p, num_points) + protocol_error = [ + test_protocol(protocol, channel_factory(p), num_experiments=num_experiments) + for p in channel_error + ] + plt.plot(channel_error, protocol_error, label="Experiment") + plt.xlabel("Channel error") + plt.ylabel("Protocol error") + plt.title(protocol.name) + + if not theoretical is None: + plt.plot(channel_error, theoretical(channel_error), "--", label="Theory") + plt.legend() + plt.grid() + plt.show() + print(f"Time: {time.time() - time_start:.2f}s") From c2d27170b44776197667407d91fa34dfcea0aebf Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 15:50:17 -0700 Subject: [PATCH 3/9] partially implement stabilizer code --- error_correction/protocols.py | 122 ++++++++-------- error_correction/protocols_test.py | 12 ++ error_correction/stabilizer_codes.py | 165 ++++++++++++++++++++++ error_correction/stabilizer_codes_test.py | 6 + error_correction/utils.py | 14 +- 5 files changed, 258 insertions(+), 61 deletions(-) create mode 100644 error_correction/protocols_test.py create mode 100644 error_correction/stabilizer_codes.py create mode 100644 error_correction/stabilizer_codes_test.py diff --git a/error_correction/protocols.py b/error_correction/protocols.py index f4ceb61..2aed1ab 100644 --- a/error_correction/protocols.py +++ b/error_correction/protocols.py @@ -3,51 +3,52 @@ from cirq import Circuit, Qid -from abc import ABC +from abc import ABC, abstractmethod class QecProtocol(ABC): - def __init__(self): - self.name = "No encoding" + @abstractmethod + def encode(self, circuit: Circuit, qubit: list[Qid]) -> list[Qid]: ... - def encode(self, circuit: Circuit, qubit: Qid): - return [qubit] + @abstractmethod + def decode(self, circuit: Circuit, qubits: list[Qid]) -> list[Qid]: ... - def decode(self, circuit: Circuit, qubits: Qid): - return qubits[0] class NoEncodingProtocol(QecProtocol): def __init__(self): self.name = "No encoding" - def encode(self, circuit: Circuit, qubit: Qid): - return [qubit] + def encode(self, circuit: Circuit, qubits: list[Qid]) -> list[Qid]: + return qubits - def decode(self, circuit: Circuit, qubits: Qid): - return qubits[0] + def decode(self, circuit: Circuit, qubits: list[Qid]) -> list[Qid]: + return qubits class ThreeQubitBitFlipProtocol(QecProtocol): def __init__(self): - self.name = '3 qubit bit flip protocol' - - def encode(self, circuit, qubit): - q0 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits())) - circuit.append(cirq.CNOT(qubit, q0)) - q1 = cirq.NamedQubit('aux_%d' % len(circuit.all_qubits())) - circuit.append(cirq.CNOT(qubit, q1)) - return [qubit, q0, q1] - - def decode(self, circuit, qubits): + self.name = "3 qubit bit flip protocol" + + def encode(self, circuit, qubits: list[Qid]) -> list[Qid]: + assert len(qubits) == 1 + q0 = cirq.NamedQubit("aux_%d" % len(circuit.all_qubits())) + circuit.append(cirq.CNOT(qubits[0], q0)) + q1 = cirq.NamedQubit("aux_%d" % len(circuit.all_qubits())) + circuit.append(cirq.CNOT(qubits[0], q1)) + return [qubits[0], q0, q1] + + def decode(self, circuit, qubits: list[Qid]) -> list[Qid]: def X(target): circuit.append(cirq.X(qubits[target])) - + def CCNOT(target): i1, i2 = 1, 2 - if target == 1: i1, i2 = 0, 2 - if target == 2: i1, i2 = 0, 1 + if target == 1: + i1, i2 = 0, 2 + if target == 2: + i1, i2 = 0, 1 circuit.append(cirq.CCNOT(qubits[i1], qubits[i2], qubits[target])) - + X(1) CCNOT(0) X(1) @@ -67,70 +68,75 @@ def CCNOT(target): X(1) CCNOT(1) CCNOT(0) - + # Measurement is not needed for Bit-Flip, but is needed so we can use it in Shor Code. circuit.append(cirq.measure(qubits[0])) circuit.append(cirq.measure(qubits[1])) - - return qubits[2] + + return [qubits[2]] + class ThreeQubitPhaseFlipProtocol(QecProtocol): def __init__(self): - self.name = '3 qubit phase flip protocol' + self.name = "3 qubit phase flip protocol" self.bf_protocol = ThreeQubitBitFlipProtocol() - - def encode(self, circuit, qubit): - qubits = self.bf_protocol.encode(circuit, qubit) + + def encode(self, circuit, qubits: list[Qid]) -> list[Qid]: + qubits = self.bf_protocol.encode(circuit, qubits) for q in qubits: circuit.append(cirq.H(q)) return qubits - - def decode(self, circuit, qubits): + + def decode(self, circuit, qubits: list[Qid]) ->list[Qid]: for q in qubits: circuit.append(cirq.H(q)) return self.bf_protocol.decode(circuit, qubits) - class ShorProtocol(QecProtocol): def __init__(self): - self.name = 'Shor Code' + self.name = "Shor Code" self.bf_protocol = ThreeQubitBitFlipProtocol() self.pf_protocol = ThreeQubitPhaseFlipProtocol() - - - def encode(self, circuit, qubit): + + def encode(self, circuit, qubits: list[Qid]) -> list[Qid]: + assert len(qubits) == 1 result = [] - qubits1 = self.pf_protocol.encode(circuit, qubit) + qubits1 = self.pf_protocol.encode(circuit, qubits) for q in qubits1: - result += self.bf_protocol.encode(circuit, q) + result += self.bf_protocol.encode(circuit, [q]) return result - - def decode(self, circuit, qubits): - return self.pf_protocol.decode(circuit, [ - self.bf_protocol.decode(circuit, qubits[0:3]), - self.bf_protocol.decode(circuit, qubits[3:6]), - self.bf_protocol.decode(circuit, qubits[6:9]) - ]) + + def decode(self, circuit, qubits: list[Qid]) -> list[Qid]: + return self.pf_protocol.decode( + circuit, + [ + self.bf_protocol.decode(circuit, qubits[0:3])[0], + self.bf_protocol.decode(circuit, qubits[3:6])[0], + self.bf_protocol.decode(circuit, qubits[6:9])[0], + ], + ) class NineQubitBitFlipProtocol(QecProtocol): def __init__(self): - self.name = '9 qubit bit flip protocol' + self.name = "9 qubit bit flip protocol" self.bf_protocol_1 = ThreeQubitBitFlipProtocol() self.bf_protocol_2 = ThreeQubitBitFlipProtocol() - + def encode(self, circuit, qubit): result = [] qubits1 = self.bf_protocol_1.encode(circuit, qubit) for q in qubits1: result += self.bf_protocol_2.encode(circuit, q) return result - - def decode(self, circuit, qubits): - return self.bf_protocol_1.decode(circuit, [ - self.bf_protocol_2.decode(circuit, qubits[0:3]), - self.bf_protocol_2.decode(circuit, qubits[3:6]), - self.bf_protocol_2.decode(circuit, qubits[6:9]) - ]) - \ No newline at end of file + + def decode(self, circuit, qubits): + return self.bf_protocol_1.decode( + circuit, + [ + self.bf_protocol_2.decode(circuit, qubits[0:3]), + self.bf_protocol_2.decode(circuit, qubits[3:6]), + self.bf_protocol_2.decode(circuit, qubits[6:9]), + ], + ) diff --git a/error_correction/protocols_test.py b/error_correction/protocols_test.py new file mode 100644 index 0000000..1743530 --- /dev/null +++ b/error_correction/protocols_test.py @@ -0,0 +1,12 @@ + + +from error_correction.channels import ArbitraryErrorChannel +from error_correction.protocols import ShorProtocol +from error_correction.utils import test_protocol + + +def test_shor_code(): + protocol = ShorProtocol() + channel = ArbitraryErrorChannel(0.01) + assert test_protocol(protocol, channel, num_experiments=10) <= 0.1 + \ No newline at end of file diff --git a/error_correction/stabilizer_codes.py b/error_correction/stabilizer_codes.py new file mode 100644 index 0000000..7e18823 --- /dev/null +++ b/error_correction/stabilizer_codes.py @@ -0,0 +1,165 @@ +import cirq +from cirq import Circuit, Gate, Qid, PauliString, Operation + +from sympy import Symbol + +from .protocols import QecProtocol + + +def _verify_clifford_circuit_is_identity(ct: Circuit): + pass + # TODO: implement efficiently. + + +class StabilizerSet: + def __init__(self, stabilizers: list[str]): + self.n_st = len(stabilizers) + self.n = len(stabilizers[0]) + for st in stabilizers: + assert len(st) == self.n + for i in range(self.n): + assert st[i] in ["I", "X", "Z"] + + # Fake qubits on which we'll apply stabilizers before we know real qubits. + self.model_qubits = cirq.LineRange(self.n) + + # Convert stabilizers to Pauli string. + self.stabilizers: list[PauliString] = [] + for st in stabilizers: + ps: list[cirq.Operation] = [] + for i in range(self.n): + if stabilizers[i] == "X": + ps.append(cirq.X(self.model_qubits[i])) + elif stabilizers[i] == "Z": + ps.append(cirq.Z(self.model_qubits[i])) + self.stabilizers.append(PauliString(ps)) + + self.encoding_circuit: list[cirq.Operation] = [] + # TODO: pre-compute the circuit that encodes the state. + # First we need to represent all n-k stabilizers as 2n-bit vectors, + # put them in matrix and append all-X and all-Z operators. + # Then, perform the symplectic Gaussian elimination to decompose this + # into sequence of H, S and CNOT + + # Validate the encoding circuit. + # Must be U Z_i U* = S_i + # Equivalent to S_i U* Z_i U = I + for i in range(self.n_st): + ct = [self.stabilizers[i]] + self.apply_decoding_circuit(ct, self.model_qubits) + ct += cirq.Z() + self.apply_encoding_circuit(ct, self.model_qubits) + _verify_clifford_circuit_is_identity(ct) + + def get_stabilizers(self, qubits: list[Qid]): + assert len(qubits) == self.n + qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} + return [st.transform_qubits(qubit_map) for st in self.stabilizers] + + def apply_encoding_circuit(self, ct: Circuit, qubits: list[Qid]): + """Applies U (decomposed into H/S/CNOT).""" + assert len(qubits) == self.n + qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} + for op in self.encoding_circuit: + ct += op.transform_qubits(qubit_map) + + def apply_decoding_circuit(self, ct: Circuit, qubits: list[Qid]): + """Applies U* (decomposed into H/S*/CNOT).""" + assert len(qubits) == self.n + qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} + for op in self.encoding_circuit[::-1]: + ct += (op**-1).transform_qubits(qubit_map) + + +class StabilizerCode(QecProtocol): + def __init__( + self, + physical_qubits: int, + logical_qubits: int, + distance: int, + stabilizers: list[str], + name: str | None = None, + ): + self.n = physical_qubits + self.k = logical_qubits + self.d = distance + self.n_st = self.n - self.k # Number of stablizers + + self.stabilizers = StabilizerSet(stabilizers) + if self.stabilizers != self.n_st: + raise ValueError("Wrong number of stabilizers") + if self.stabilizers.n != self.n: + raise ValueError(f"Wrong length of the stabilizer, must be {self.n}") + + self.meas_key_counter = 0 + + Operation + self.encoding_circuit: list[tuple[Gate, int]] = [] + + def _prepare_encoding_circuit(self): + pass + + def signature(self): + return f"[[{self.n},{self.k},{self.d}]]" + + def _allocate_qubits(self, circuit, num_qubits): + n0 = len(circuit.all_qubits()) + return [cirq.NamedQubit(f"aux_{n0+i}") for i in range(num_qubits)] + + def encode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: + assert len(qubits) == self.k + + # Create n-k additional qubits. + aux = self._allocate_qubits(ct, self.n_st) + + # Apply the encoding circuit. + self.stabilizers.apply_encoding_circuit(ct, qubits + aux) + + return qubits + aux + + def _measure_stabilizer( + self, ct: Circuit, stabilizer: PauliString, anc: Qid + ) -> Symbol: + """Adds a circuit to measure stabilizer using given ancilla. + + Returns measurment result as symbol. + Resets the ancilla. + """ + + # TODO: apply all controlled gates from qubits to anc so that after + # measurment anc in computational basis we get stabilizer measurment. + + key = f"m{self.meas_key_counter}" + self.meas_key_counter += 1 + ct += cirq.measure(anc, key=key) + ct += cirq.reset(anc) + return Symbol(key) + + def decode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: + assert len(qubits) == self.n + + anc = self._allocate_qubits(ct, 1)[0] + + # Syndrome measurments. + syndrome = [] + for i in range(self.n): + st = self.stabilizers.get_stabilizer_on_qubits(i, qubits) + result = self._measure_stabilizer(ct, st, anc) + syndrome.append(result) + + # TODO: add code to apply error correction based on symbolic syndromes. + # This will use some controlled X and Z gates. + + # Decode. + self.stabilizers.apply_decoding_circuit(ct, qubits) + + return qubits[0 : self.k] + + +# https://errorcorrectionzoo.org/c/stab_5_1_3 +FIVE_QUBIT_PERFECT_CODE = StabilizerCode( + 5, + 1, + 3, + ["XZZXI", "IXZZX", "XIXZZ", "ZXIXZ"], +) diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py new file mode 100644 index 0000000..2e7b2b7 --- /dev/null +++ b/error_correction/stabilizer_codes_test.py @@ -0,0 +1,6 @@ +from error_correction.stabilizer_codes import FIVE_QUBIT_PERFECT_CODE + + +def test_five_qubit_perfect_code(): + code = FIVE_QUBIT_PERFECT_CODE + assert code.signature() == "[[5,1,3]]" diff --git a/error_correction/utils.py b/error_correction/utils.py index 91eaa49..3b247af 100644 --- a/error_correction/utils.py +++ b/error_correction/utils.py @@ -28,13 +28,15 @@ def test_protocol_once(protocol: QecProtocol, channel: cirq.Gate, output=None): ct.append([cirq.ry(theta).on(q_init), cirq.rz(phi).on(q_init)]) # Encode. - encoded_qubits = protocol.encode(ct, q_init) + encoded_qubits = protocol.encode(ct, [q_init]) # Transmit. transmitted_qubits = [channel.transmit(ct, q) for q in encoded_qubits] # Decode. - decoded_qubit = protocol.decode(ct, transmitted_qubits) + decoded_qubits = protocol.decode(ct, transmitted_qubits) + assert len(decoded_qubits) == 1 + decoded_qubit = decoded_qubits[0] # Simulate cirquit to get final state of decoded qubit. sim = SparseSimulator() @@ -54,7 +56,9 @@ def test_protocol_once(protocol: QecProtocol, channel: cirq.Gate, output=None): # Experimentally calculates failure rate of error correcting protocol. -def test_protocol(protocol: QecProtocol, channel: cirq.Gate, num_experiments=100): +def test_protocol( + protocol: QecProtocol, channel: cirq.Gate, num_experiments=100 +) -> float: ok_count = sum( [test_protocol_once(protocol, channel) for _ in range(num_experiments)] ) @@ -86,3 +90,7 @@ def plot_errors( plt.grid() plt.show() print(f"Time: {time.time() - time_start:.2f}s") + + +test_protocol_once.__test__ = False +test_protocol.__test__ = False From 6207a4014b833440435506c8863b7ae817349ca2 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 16:09:37 -0700 Subject: [PATCH 4/9] stabilizer codes --- error_correction/05_StabilizerCodes.ipynb | 266 ++++++++++++++ error_correction/stabilizer_codes.py | 403 ++++++++++++++++------ error_correction/stabilizer_codes_test.py | 46 +++ 3 files changed, 618 insertions(+), 97 deletions(-) create mode 100644 error_correction/05_StabilizerCodes.ipynb diff --git a/error_correction/05_StabilizerCodes.ipynb b/error_correction/05_StabilizerCodes.ipynb new file mode 100644 index 0000000..d1c7f47 --- /dev/null +++ b/error_correction/05_StabilizerCodes.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "cfd0c042-4870-4702-992c-c8751802dc86", + "metadata": {}, + "outputs": [], + "source": [ + "from error_correction.channels import ArbitraryErrorChannel\n", + "from error_correction.stabilizer_codes import SHOR_CODE, FIVE_QUBIT_PERFECT_CODE\n", + "from error_correction.utils import test_protocol_once, plot_errors" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e64cca5a-7b33-448e-ba1d-005c91dee822", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
                                                 ┌──┐                                                                                                                                                                           ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐                                                                                ┌────────┐\n",
+       "aux_1: ────H───────────────────────────────────────@────────@───H───X───────X───────────────────────X───────@───────────────────────────X───────────────────────────────────────────────────────────────────X────────────────────────────────────────────────────────X(conditions=[m4 & ~m5 & ~m6 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m4 & m5 & m7 & ~m6])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m5 & m7 & ~m4 & ~m6])───────────────────────────────────────────────────────────────────────────────────────────────────────────────X^-1──────────────────────────────────────X^-1──────────X^-1───H^-1───@───────@───────────H^-1──────────────────────────────────────\n",
+       "                                                   │        │       │       │                       │       │                           │                                                                   │                                                        ║                                                                                                                                                                                   ║                                                                                                                                                                              ║                                                                                                                                                 │                                         │             │             │       │\n",
+       "aux_2: ────H─────────────────────────────────@────H┼────X───X───────@───X───┼───────────────────X───┼───────┼───@───────────────────────┼───@───────────────────────────────X───────────────────────────────┼────────────────────────────────────────────────────────╫───────────────────────────────────X(conditions=[m4 & m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────Y(conditions=[m4 & m5 & m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────Z(conditions=[m6 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────┼──────X^-1───────────────────────────────┼──────X^-1───@─────────────X^-1────┼───X^-1────H^-1───@──────H^-1────────────────────────\n",
+       "                                             │     │    │               │   │                   │   │       │   │                       │   │                               │                               │                                                        ║                                   ║                                                                                                                                               ║                                 ║                                                                                                                                            ║                                  ║                                                                                                              │      │                                  │      │                            │   │              │\n",
+       "aux_3: ────H────────────@────────────H───X───┼─────┼────@───────────────┼───┼───────────────X───┼───┼───────┼───┼───X───────────────────┼───┼───@───────────────────────────┼───@───────────────────────────┼───X────────────────────────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────X(conditions=[m5 & m6 & ~m4 & ~m7])──────────────────────────────────────────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────Y(conditions=[m4 & m5 & m6 & m7])──────────────────────────────────────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────Z(conditions=[m4 & m7 & ~m5 & ~m6])────────────────────────────────────────┼──────┼──────X^-1────────────────────────┼──────┼────────────────────────────┼───@──────────────┼──────X^-1───H^-1───@──────H^-1───\n",
+       "                        │                │   │     │                    │   │               │   │   │       │   │   │                   │   │   │                           │   │                           │   │                                                    ║                                   ║                                  ║                                                                                                            ║                                 ║                                 ║                                                                                                          ║                                  ║                                   ║                                                                          │      │      │                           │      │                            │                  │      │             │\n",
+       "aux_4: ─────────────────X────────────────@───X─────X────────────────────┼───┼───────@───X───┼───┼───┼───────┼───┼───┼───────────────────┼───┼───┼───X───────────────────────┼───┼───@───────────────────────┼───┼───@────────────────────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────X(conditions=[m6 & m7 & ~m4 & ~m5])───────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────Y(conditions=[m5 & m6 & m7 & ~m4])────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────Z(conditions=[m5 & ~m4 & ~m6 & ~m7])────┼──────┼──────┼──────X^-1───@─────────────┼──────┼────────────────────────────X^-1───────────────X^-1───@─────────────X^-1──────────\n",
+       "                                                                        │   │       │   │   │   │   │       │   │   │                   │   │   │   │                       │   │   │                       │   │   │                                                ║                                   ║                                  ║                                  ║                                                                         ║                                 ║                                 ║                                ║                                                                         ║                                  ║                                   ║                                  ║                                       │      │      │      │      │             │      │\n",
+       "aux_5: ────H────────────────────────────────────────────────────────────┼───┼───────┼───┼───┼───┼───┼───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────╫─────────────────────────────────────────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────╫─────────────────────────────────────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────┼──────┼──────┼──────┼──────┼─────────────┼──────┼──────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                        │   │       │   │   │   │   │   │                   ║                               ║           │                   ║           │                   ║                                        ║                                   ║                                  ║                                  ║                                                                         ║                                 ║                                 ║                                ║                                                                         ║                                  ║                                   ║                                  ║                                       │      │      │      │      │             │      │\n",
+       "q_init: ───Ry(0.661π)───Rz(0.761π)───H──────────────────────────────────@───@───H───X───@───@───@───@───X───────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────@───────────────────╫────X(conditions=[m7 & ~m4 & ~m5 & ~m6])╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────Y(conditions=[m4 & m6 & m7 & ~m5])╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────╫──────────────────────────────────────Z(conditions=[m4 & m6 & ~m5 & ~m7])╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────@──────@──────@──────@──────X^-1───H^-1───@──────@──────H^-1────────────────────────────────────────────────────────────────────────\n",
+       "                                                                                                                            ║                               ║                               ║                               ║    ║                                   ║                                   ║                                  ║                                  ║                                       ║                                 ║                                 ║                                 ║                                ║                                      ║                                  ║                                  ║                                   ║                                  ║\n",
+       "m4: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                            ║                               ║                               ║    ║                                   ║                                   ║                                  ║                                  ║                                       ║                                 ║                                 ║                                 ║                                ║                                      ║                                  ║                                  ║                                   ║                                  ║\n",
+       "m5: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                            ║                               ║    ║                                   ║                                   ║                                  ║                                  ║                                       ║                                 ║                                 ║                                 ║                                ║                                      ║                                  ║                                  ║                                   ║                                  ║\n",
+       "m6: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                            ║    ║                                   ║                                   ║                                  ║                                  ║                                       ║                                 ║                                 ║                                 ║                                ║                                      ║                                  ║                                  ║                                   ║                                  ║\n",
+       "m7: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                 └──┘                                                                                                                                                                           └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘                                                                                └────────┘
" + ], + "text/plain": [ + " ┌──┐ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌────────┐\n", + "aux_1: ────H───────────────────────────────────────@────────@───H───X───────X───────────────────────X───────@───────────────────────────X───────────────────────────────────────────────────────────────────X────────────────────────────────────────────────────────X(conditions=[m4 & ~m5 & ~m6 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m4 & m5 & m7 & ~m6])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m5 & m7 & ~m4 & ~m6])───────────────────────────────────────────────────────────────────────────────────────────────────────────────X^-1──────────────────────────────────────X^-1──────────X^-1───H^-1───@───────@───────────H^-1──────────────────────────────────────\n", + " │ │ │ │ │ │ │ │ ║ ║ ║ │ │ │ │ │\n", + "aux_2: ────H─────────────────────────────────@────H┼────X───X───────@───X───┼───────────────────X───┼───────┼───@───────────────────────┼───@───────────────────────────────X───────────────────────────────┼────────────────────────────────────────────────────────╫───────────────────────────────────X(conditions=[m4 & m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────Y(conditions=[m4 & m5 & m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────Z(conditions=[m6 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────┼──────X^-1───────────────────────────────┼──────X^-1───@─────────────X^-1────┼───X^-1────H^-1───@──────H^-1────────────────────────\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │\n", + "aux_3: ────H────────────@────────────H───X───┼─────┼────@───────────────┼───┼───────────────X───┼───┼───────┼───┼───X───────────────────┼───┼───@───────────────────────────┼───@───────────────────────────┼───X────────────────────────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────X(conditions=[m5 & m6 & ~m4 & ~m7])──────────────────────────────────────────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────Y(conditions=[m4 & m5 & m6 & m7])──────────────────────────────────────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────Z(conditions=[m4 & m7 & ~m5 & ~m6])────────────────────────────────────────┼──────┼──────X^-1────────────────────────┼──────┼────────────────────────────┼───@──────────────┼──────X^-1───H^-1───@──────H^-1───\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │\n", + "aux_4: ─────────────────X────────────────@───X─────X────────────────────┼───┼───────@───X───┼───┼───┼───────┼───┼───┼───────────────────┼───┼───┼───X───────────────────────┼───┼───@───────────────────────┼───┼───@────────────────────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────X(conditions=[m6 & m7 & ~m4 & ~m5])───────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────Y(conditions=[m5 & m6 & m7 & ~m4])────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────Z(conditions=[m5 & ~m4 & ~m6 & ~m7])────┼──────┼──────┼──────X^-1───@─────────────┼──────┼────────────────────────────X^-1───────────────X^-1───@─────────────X^-1──────────\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │\n", + "aux_5: ────H────────────────────────────────────────────────────────────┼───┼───────┼───┼───┼───┼───┼───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────╫─────────────────────────────────────────────────────────────────────────╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────╫─────────────────────────────────────────────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────┼──────┼──────┼──────┼──────┼─────────────┼──────┼──────────────────────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ │ │ │ ║ ║ │ ║ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │\n", + "q_init: ───Ry(0.661π)───Rz(0.761π)───H──────────────────────────────────@───@───H───X───@───@───@───@───X───────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────@───────────────────╫────X(conditions=[m7 & ~m4 & ~m5 & ~m6])╫───────────────────────────────────╫──────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────Y(conditions=[m4 & m6 & m7 & ~m5])╫─────────────────────────────────╫─────────────────────────────────╫────────────────────────────────╫──────────────────────────────────────Z(conditions=[m4 & m6 & ~m5 & ~m7])╫──────────────────────────────────╫───────────────────────────────────╫──────────────────────────────────╫───────────────────────────────────────@──────@──────@──────@──────X^-1───H^-1───@──────@──────H^-1────────────────────────────────────────────────────────────────────────\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m4: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m5: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m6: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m7: ════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════^═════════════════════════════════^═════════════════════════════════^═════════════════════════════════^════════════════════════════════^══════════════════════════════════════^══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════^══════════════════════════════════^═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " └──┘ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └────────┘" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "code = FIVE_QUBIT_PERFECT_CODE\n", + "data={}\n", + "assert test_protocol_once(code, ArbitraryErrorChannel(0.05), output=data)\n", + "data['circuit']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c27a2221-74c8-43e6-8619-52c0ed940293", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHGCAYAAACcmzRuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbCNJREFUeJzt3XlclNX+B/DPDAzDjmwCKqviQu6m4m4GlpmZpVlqamp1zbKrZmq3e8vsl5Vtpt28aVqWWmmae7mW+46KOyogOwqywzDDnN8fyOQIyDDMzMMwn/fr5avmzHPOfJ8DwtfnbDIhhAARERGRDZFLHQARERGRpTEBIiIiIpvDBIiIiIhsDhMgIiIisjlMgIiIiMjmMAEiIiIim8MEiIiIiGwOEyAiIiKyOfZSB0BkS86cOYO9e/fqXr/00ktwdnau8T1rkpqail9++UX3etiwYQgODq7xPSlduXIF27Ztw+jRo+Hr63vfaxMTE7FhwwY888wzaNKkSa3KGrqsrCz88MMPePTRR9G6dWupwyG6LyZARBa0f/9+TJs2DS+++CKcnZ1RVlZm0HsqlQpff/11lW127doVvXr1Mujz1Wo1du/ejUuXLiEiIgIDBw6sVfzXrl3DqVOnkJubi6CgIPTt2xeOjo5616hUKiQkJCA5ORm//vorWrdurUty7veesa5du4bNmzfj2Wefhb+/v1FtnDp1CtOmTUP//v1rTIAuXryIadOm4cEHH9QlNoaWNXRpaWmYNm0afHx8mABRvccEiEgC7733XrW/rKt6r7i4GNOmTUOPHj3QrVs3vfdatGhR4+cJIfDiiy9iy5YtaNu2LXbv3o1x48YZnAClpKRg7NixSEtLQ6dOnaBQKPDXX3+hqKgIixYtwjPPPKO7NjQ0FF988QX+/PNP/Prrr3rt3O89Y8XGxmLatGmIjIw0OgGqjZCQELz++uto2rSpSa4jImkwASKyIo899hjefvvtWtcTQiAyMhIff/wxHBwc4ObmVuv68+fP10u+1Go1oqKiMHbsWPTv3x+NGzeudVzWqHXr1vjiiy9Mdh0RSYMJEJENkMvlmDRpEgCgoKCg1vWbNWuGZs2a6ZUpFAo8+eST2LdvHy5dumS2BKiwsBB79uxBamoqAgICEBkZqfusmJgYbN68GQDw888/48iRIwCAgQMHIiIiAjdv3sSqVasAADKZDI6OjggPD0ffvn1hb1/1j7+CggJs3boVubm56NGjB9q1a6f3vqFze6q67r///S9KS0urvH7o0KEIDQ3Vvc7NzcXevXuRmpoKX19fREVFwdPTU/f+3fOWXF1dsX37diQnJ2PSpEn3nTuWl5eHv/76C8nJyQgKCkK/fv3g6uqqd01ycjL++usv5OXlISQkBAMGDIBSqazU1rlz53Do0CG4u7tj8ODB1X6mIfdDZGlcBUZkRS5duoQlS5Zg6dKlOHToEIQQksZz5MgRuLq64oEHHjBL+/v370ezZs3w3nvv4dSpU/j+++/Ro0cPLFu2DED5L/PMzEwA5fNPEhISkJCQoEvySktLdWXx8fE4cOAARo0ahdatWyMlJaXS5125cgX9+vXD1q1bsX79enTs2BHTp0/Xu6Zibs/169fvG3tV1yUmJuriqfizbNkyTJs2DRcuXNBdt3LlSgQGBuru+/PPP0dISIgu2QP+nrf0119/oW/fvli/fj2++eYb5OXlVRvTd999h8DAQMyZMwfHjx/HkiVL0LlzZxw+fFh3zdy5cxEaGoqlS5fi6NGjmDx5MsLDw3Hy5Em9tmbMmIH27dvj119/xbZt29CvXz9cunSpys815H6ILE4QkcUsWrRIABBpaWm1eu/27dsCgOjWrZuYOHGiGDJkiFAqlaJdu3bi0qVLtYohPz9fABDjxo2rdfwnT54Un3/+uZg3b56Ijo4WERERYvfu3VVeu3fvXgFAbN++vVbv3a1Hjx7i4Ycf1isrKioSf/75p+71hg0bBABx+PBhg+4hPz9fREREiBEjRujK1qxZIwCIHj16iPT0dF35//73PwFArF69Wle2fft2AUDs37+/1mX32rNnj1AoFKJHjx6iuLhYCFHeN3K5XMyZM0dotVrdtTNmzBAuLi4iKSmpUswV3zN5eXmioKCgys/auXOnkMlkYtq0aaKsrExXnp6eLs6cOSOEEOKXX34RAMRHH32kez83N1c8+OCDIiAgQNd2xWf/73//02unZ8+eAoD44YcfdOWG3g+RpfEJEJEVcHR0xJEjR3D06FEsW7YMmzZtQmxsLDIyMjB48GCoVCqLxJGbm4uEhARcuXIFcXFxUCqV0Gg0Zvu827dvQ61W632Gk5MT+vXrZ3AbWq0Whw8fxrfffouFCxdi2bJl8PLywsGDBytdO3LkSPj5+elev/jii2jRogWWLFlStxupwoULF/DUU08hKCgIGzdu1K2m++STT+Dl5YX33nsPMplMd/27776L4uJi3ZBehREjRugmf7u5ucHFxaXKz/v000/h6+uL+fPnQy7/+0e/n58f2rdvDwD4+uuvERAQoPfUy93dHe+++y7S0tKwYcMGAMA333yDsLAwvPjii3rtPPfcc5U+t7b3Q2QpnANEZAUcHR3RvXt3vbLw8HDMmTMH06ZNw65du2qcg2EKDz30EB566CEA5ZOgR40ahcGDB+P06dNmGQabNm0aJk+ejObNm+Pxxx9Hv379EBUVBS8vL4PqJyUlYfDgwUhJScFDDz0Ef39/2Nvbo6ioSDd0drcOHTrovZbJZGjfvj3+/PNPU9yOTkXiKpfLsW3bNr2l9ydPnoSnp6cu6RJC6P64urpWGmaqSF5qEhMTg/bt21c5l6fC+fPn0bFjx0rzozp16gSgfM5PxX979uypl9AAlfvPmPshshQmQERWrE2bNgDK55ZYmkKhwJtvvol169Zh/fr1ZkmAXnrpJfTq1Qvr1q3DgQMHsGLFCgDlTxVeeeWVGuvPnDkT6enpuHDhgt6TnXHjxuHMmTOVrrezs6tUZm9vD61WW4e70FdUVIQhQ4YgLS0NO3fuRMuWLfXeV6vVKCsrw9WrVyvVfeGFF9C5c2e9Mm9vb4M+t6ysrNqJ3zVdU1FWsTeVVquttq/uVdv7IbIUJkBEViwhIQEALLL/TVUqhlKEGSdjP/DAA7rkqqCgAE8//TSmTp2KcePGwcXFRW84514xMTHo3r27XvIDAKdPn67y+kuXLqFPnz56ZRcvXkR4eHjdbuIOrVaL0aNH48SJE1i1alWlzwKAiIgIZGRkmHwJfUREBM6dO4eysrIqkxeg/KnixYsXK5VXTNCu6Ifw8HBcvny50nVV1TXX/RDVFecAEVmB8+fPV1o+ffv2bSxYsAA+Pj6Ijo7We+/bb7/Fd999Z/Tn3Vv/3LlzUKvVetcIIbBo0SLIZDIMGTLE6M+6n2PHjum9dnV1RceOHSGE0M17qlgSn5WVVal+SEgILl26pDeHaM2aNdU+Mfvhhx9QXFyse71t2zbExsZi7Nixdb4XAJg+fTp+++03zJs3r8r5MgDw2muv4cqVK7qVbndLT09HUlKSUZ89ZcoUJCcnY+HChXrlJSUliI+PB1D+ZCw+Ph5r1qzRva/RaDB//ny4ubnh6aefBgA8//zzOH/+PLZu3aq7rri4GN9//73F7oeorvgEiMgKHDx4EMOGDUO/fv0QGhqKjIwM/PTTT5DL5fjtt98qbWz4zjvvwMnJCePHj9eV/fzzz0hLS9MlUhcuXND9q/zes5vurb9//34MHz4cffv2RWhoKHJzc7F9+3bExcVhyZIlujkipvbmm2+iuLgYPXv2hL+/P65cuYIff/wRc+bM0c0D6tixI0JCQvDWW28hNjYWjo6Oun2A/vOf/yAqKgr9+/fHoEGDcPnyZaSmpmLcuHH46quvKn3emDFjMGDAAERHR+PmzZtYsWIFhg4dismTJ9f5Xq5evYqFCxeiWbNmcHFxqfREpGIfoBEjRuDDDz/E5MmTsW7dOkRGRqKsrAwXLlxATEwM1q1bh8DAwFp//jPPPIMLFy5g5syZ2LlzJ3r06IFbt25h586dWLhwIUJDQ/HSSy/h0KFDeP7557Fjxw6EhIRg+/btOHfuHH766SfdcNvLL7+MHTt24Omnn8b48ePh5+eHHTt2YMKECdi3b5/e55rrfojqigkQkRV46aWXMGzYMGzduhVXrlyBh4cHFi9ejMGDB1fa9C4/Px8ZGRmV5shU7JMDAK+//jqAv4fQCgsL71t/8uTJGDFihO7z7ezsMH36dDz22GM1np1VF3/++SdOnjyJAwcOID09He3bt0dsbKzevBlHR0ccOnQIv/zyC5KSkqDRaHT7APXq1QsXLlzA+vXrkZWVhcGDB+Opp57C9u3b9eartGrVCq+//joGDx6M6Oho/Pzzz2jUqBF++eUXDBkyRG+yb1VHXBhS5u7uXqnf73b3k6dZs2Zh1KhR2LJlCxISEtCoUSOMHTsWa9asgYODg17Mten/d999F6NHj8aWLVuQnp6O1q1b480339RtcimXy7Fy5UpMnjwZu3fvRl5eHsaOHYunn35abxjRzs4OGzZswJYtW3Do0CE4Ojpi1apVcHZ2xuuvv66bm1ab+yGyNJkw5+A9EelZvHgxXnvtNbz33ntwc3PTO/H9fu/VxubNm/Hcc8/h+vXrRu3OXNf6FSe+X716FV999RW2b9+ORx99tMb3iIgsiU+AiCyoY8eOeP3115GVlYWsrCy9E9/v915tKBQKfPPNN0YfTVHX+hUnvtvb2+P1119HSEiIQe8REVkSnwARERGRzeEqMCIiIrI5TICIiIjI5jABIiIiIpvDBIiIiIhsDleBVUOr1SI1NRVubm6VDvwjIiKi+kkIgfz8fDRp0uS+R+UwAapGamoqdyclIiKyUklJSbpNPqvCBKgaFUcLJCUlwd3d3WTtqtVq7NixAwMHDoRCoTBZu6SP/Ww57GvLYD9bBvvZMszZz3l5eQgMDKx0RNC9mABVo2LYy93d3eQJkLOzM9zd3fmXy4zYz5bDvrYM9rNlsJ8twxL9XNP0FU6CJiIiIpvDBIiIiIhsDhMgIiIisjmcA1QHWq0WpaWltaqjVqthb2+PkpISow+7pJpZqp8VCgXs7OzM1j4REZkHEyAjlZaWIj4+Hlqttlb1hBDw9/dHUlIS9xcyI0v2c6NGjeDv78+vJxGRFWECZAQhBNLS0mBnZ4fAwMD7brR0L61Wi4KCAri6utaqHtWOJfpZCIGioiJkZmYCAAICAszyOUREZHpMgIyg0WhQVFSEJk2awNnZuVZ1K4bNHB0dmQCZkaX62cnJCQCQmZmJxo0bcziMiMhK8DewESrmlDg4OEgcCdUHFUmwWq2WOBIiIjJUvXkCpNVqa/0v9erqaDQaaDQavTK5XG7yhIVzPgjg9wERkTWS/AnQ/Pnz4efnB4VCgXbt2mHPnj11rvPqq6/CxcUFjRo10v3p0aOHuW6BTOirr77C6tWrpQ6DiIgaOEmfAC1ZsgQffPABNmzYgMjISCxYsACPP/44zp8/j9DQ0DrVGTZsGNatW2epW7EKK1aswMGDByuVN23aFHPnzpUgosp27tyJZs2aYdSoUVKHAgBYtGgRGjdujJEjR0odChERmZCkT4A+++wzTJw4EVFRUXB1dcW7774LHx8fLFmyxCR1artEvaH766+/sH//fkRGRur96dChg9Sh6bz66qsYPXq01GHo/PHHHzh8+LDUYRARkYlJ9gQoKysLcXFx6Nevn65MJpOhX79+1f7CqU2dbdu2QalUws3NDb1798ann36K8PBw89yMFQkICMCkSZOqfO/mzZv417/+hYkTJ6J79+4AgOLiYsycORODBw/GoEGD8NlnnyEkJARubm7Yu3cvysrK8Pzzz6Nt27Z6bSUnJ+PHH39EcnIywsLC8Pzzz8PX11f3/t3tbN++HU2aNMEbb7yBy5cvw9PTUzdk+dlnnyE4OBjOzs44cOAASktLMWbMGHTo0AFbtmzBrl274OHhgYkTJyIoKEgvhpSUFHz99ddISUm5bwxeXl7YtWsXysrKMGLECHTu3BlA+ROzs2fPIiEhQddn77//Pvz9/ev4VSCi+upiWj6yVVJH0fCtj0lBUq4MQgjJYpAsAcrIyAAAvV9IANC4cWMcO3asTnVat26NjRs3om/fvkhNTcXUqVPRr18/nD9/Hp6enlW2rVKpoFL9/V2fl5cHoHxlz72re9RqNYQQ0Gq1Rm2EWPFfSz+hqvjs6j7X29sbLi4uePbZZxETEwN3d3dMmzYNe/bswfz586HVarFt2zZcvHgRfn5+eO6553DmzBk8+OCD2LNnDyIjIwEAhw8fxtChQzFs2DC0bdsWx48fx/z583H48GGEhYUBgK6d4OBgjBgxAi1atIBWq8WOHTvQrFkzPPvss7rrzpw5g3bt2mHIkCE4ePAgunfvjieffBJZWVl47LHHsGfPHnzzzTe4fPkyXF1dAQCHDh3C0KFD8dRTT903hkuXLqFFixZ44okncPHiRURGRuLQoUPo3LkzQkND4enpCV9fX3Tr1g0AoFQqK/WfVquFEAJqtdoml8FX/P3gKjjzYj+b39H4bIxdcQJu9nZ48tESuEodUANVoNLg/a2Xka+yQ6crmejbys+k7Rv6d0TyVWBV/TKpaVVNTXX++c9/6v4/NDQUq1atgr+/P37++Wf84x//qLLN+fPnVzkPZseOHZX2+rG3t4e/vz8KCgpQWloKIQRK1LVLZoqzcmp1fXUcFXKDVyGp1WpcunQJ48eP1yvv0aMHnnvuOQDA7NmzsWvXLrz44osYNmwYli9fjt9//x1lZWXIy8uDRqOBSqXCpk2bdMmGRqPBzJkzsXXrVgDAhAkTMH36dLzyyisAgHHjxuHll1/Gv/71L/zvf//T1VEqldi4cSMUCgUA6NovLS3VJaAajQZ+fn5Yt24d5HI5xo4diwceeABxcXHYtWsXZDIZRo8ejfDwcKxfvx5PPvkkAGDixImYMWNGjTF4eHjg119/1SUuly9fxrJly/Dhhx+iY8eO8Pf3R1hYGJ555hldf1XEVqG0tBTFxcXYt29fpdWHtmTnzp1Sh2AT2M/moSoDPjpjB62QIVctw0c/7UUPP+meTjRkf6bJkK+yQ2NHgbyrJ7HtmmnbLyoqMug6yRKgil1zK3bRrZCZmVntEIMxdQDA3d0dzZo1w7Vr1ffynDlzMH36dN3rvLw8BAYGYuDAgXB3d9e7tqSkBElJSXB1dYWjoyOKSjXo9JE0P5TOvRsNZwfDvowKhQIeHh7o3bu3Xnnr1q317nHNmjXo1q0btm7dinfeeQf9+/fXvWdvb49BgwahSZMmurLRo0dj2LBhcHZ2RmJiIq5cuYKYmBjMmjULQggIIZCUlIT8/Hzd59jb2yM6Ohre3t56sdjb28PBwUHvugEDBqBRo0a6a8LCwtC7d294eHjoyoKDg5GdnQ13d3dcu3YNV65cwfHjx2uM4eGHH9Z7KhgREYHMzEy9a+6OpyolJSVwcnJC37594ejoeN+vQUOkVquxc+dOREdH65JZMj32s3nN3XIRWaokyGWAVgDH8tzw3vhe3ObCxDRlWiz44gCAEvRvosUjA03//XzvP1KrI1kC5OnpiYiICOzduxfDhw8HUP4kZ+/evXjhhRd012k0Gmi1Wjg4OBhc517Z2dm4ceMGmjVrVu01SqUSSqWyUrlCoaj0xSkrK4NMJoNcLtf9kUptPl8mkyEgIAAvvfTSfa9r2bIlQkJCcPnyZTz77LOV2vfx8dEra9y4McrKypCTk4Ps7GwAQJcuXeDj46O7pnv37nBzc9Or5+npWaltmUym69sKzs7Oeq/lcnmVZRX7QlXE0L59ezRt2lR3XVUx3NuOvb293v5SVcVzL7m8/ClcVd8rtsTW799S2M+md+jqLfx4NAkA8OXIDpjxy2lcv1WEg/E5eKhVY4mja1h2XkpDck4JPJ0V6OqjMcv3s6HtSToENmvWLLz88ssYMGAAevTogY8//hgFBQWYPHmy7pp//OMfOHLkCM6dO2dQHZVKhWHDhmH27Nl44IEHcOPGDcyYMQOenp4YM2aMWe7DSWGHC+89YtC1Wq0W+Xn5cHN3M0ni5KQw/ZyTt956C8XFxXj44Ycxbtw4/PXXX3pzW5KSkvSuT0xMhKOjI3x9fVFaWgoAaNu2LR5//HGTx2aIpk2bAgDatGmDZ555pk79zH/9ETVsBSoNZq47CwAYExmERx7ww1o/gb/SZPh2fzwTIBNbuv86AGBUt0A4qK5IGoukCdDYsWNRUFCAOXPmICMjA+3atdPtA1NBoVDoPZmpqY5SqcQbb7yB999/HzExMfD09ESfPn2wcuXKSsMtpiKTyQwehtJqtdA42MHZwb5engW2Z88eLFy4EHv37kV4eDjat2+PDz74AP/+979112zduhVXr15FixYtoFar8dVXX2Ho0KGQyWRo1qwZ+vXrh/feew99+/bVDR1lZWXhzJkzGDBggNnvoSKGBQsW4NFHH9UNnxkTg5eXl+6JEhE1PPO3XURKTjGaeTphzqA2AAT6+WuxP12OA1dv4UJqHiKaVD8EToY7mXgbMTdy4GAnx+hugTi+34YTIAB45ZVXdBNVq/L111/Xus6AAQMs8ovWGl2+fLnSMnhHR0csXrwY2dnZGDt2LGbNmqWbJ7R8+XIMGzYMjzzyiG4l1AMPPICHHnoIkZGRuHDhAvLz8/H999/r2vvxxx8xdOhQtGrVCn369MHt27dx/fp1fPrppxa7z5UrV+KJJ55AmzZt6hTD0KFDMWbMGJSWlsLV1ZXL4IkakP1xN7Hq6A0AwMfD28NFaQ+1Wg1vR+CRCD9sP5+Bbw/E49Nn6s9eadZs2Z2nP092agJft8pTTixN8gSILGfChAmVJkADf4+XpqSkYN68eXpDhYMHD8batWv1JpVFRUXh9ddfx/Hjx6HRaDBw4EDdijCg/AnMiRMncOTIEVy9ehVNmjRB9+7d9a6ZMWOG3hyhChXHmNzvutmzZ+tNwgaAd955By1atNCLYe/evbhw4QKuX79ucAyjR49GYWGh7vVTTz2FEydO4MyZMygsLNSd/k5E1i2/RI1Zd4a+xvUIRs/m+j8LJvQKxvbzGdh0JgVvPtoKfu62t8DBlG5kFeGP8+kAgIm9wySOphwTIBvSt29f9O3bt9r327Vrh3bt2lUqHzp0aKWygIAAPPHEE9W2JZPJ0KNHj2rPYBs0aFCV5VFRUTVeV9XcomHDhlUbQ69evQyOoap4IyIiEBERUWUbRGSd/m/rRaTmliDIyxmzBrWu9H7HwEboEuyJk4m3sfJwAmY+UvkaMtzyg/HQCqBvS1+08nerF/tZ1b9JKERERGb015Wb+Ol4+WKOBcPbVzuH88U+5edL/njkBopKbXePr7rKLVLjlxPl/T2pd9XnfEqBCRDVyowZM/D0009LHQYRkVFyi/8e+nqhVwi6h1W/OCY6wh9BXs7ILVbj15PJlgqxwVlz/AaKSsvQys8NfcIrT32QChMgqpVBgwaha9euUodBRGSU97dcQHpeCUK8nfFmDcNadnIZJvQKAQB8eyAeZVruDF1bpRotvjuYAACY2Ce0Xm0twgSIiIhswp5LGVh7MhkyGfDJiA5wcqh5H7URDwbC3dEeCVlF2H0xwwJRNizbYtOQnlcCXzclhnZsUnMFC2ICREREDV5ukRqzf40FUD4P5cEQL4PquSjtMap7MABg2f54s8XXEAkhdBsfjusRDKV9/TosmglQHVScrk627d7DeYmo/pm75Twy81UI83XBjIGtalV3fM8Q2MtlOJaQjTNJOeYJsAE6cj0b51Pz4KiQY/SdJLI+4TJ4IygUCshkMty8eRO+vr61GtPUarUoLS1FSUlJvdwJuqGwRD8LIVBaWoqbN29CLpfDwcHBLJ9DRHWz80IG1p9KgfzO0JdjLY8Q8vdwxJAOTbAhJgXLDsRj0XOdzBRpw1Kx8eHwLs3g6VL/fj4yATKCnZ0dmjVrhuTkZCQkJNSqrhACxcXFcHJyqleTwRoaS/azs7MzgoKCmNAS1UO3C0vx1obyoa8X+4ahc5CnUe1M7B2KDTEp2BabhtmDWqNpI26Kej/XbhZg96VMyGTAhF71Z+n73ZgAGcnV1RXh4eG13sxJrVZj37596Nu3L090NiNL9bOdnR3s7e2ZzBLVU+9uPo+b+Sq0aOyKaVEtjW6nbVMP9AjzxuHrWfjuYDz+NZibo97PtwfK50s93NoPYb6uNVwtDSZAdWBnZ6d3SrqhdTQaDRwdHZkAmRH7mYh+P5eOjadTjR76uteLfUNx+HoWfjqWhKkPh8PNkT9bqpJdWKrbN2lSn/r59AfgJGgiImqAsgtL8fZv5UNf/+jXHB0DG9W5zf4tGyPM1wX5Kg1+vrOTNFX245FEqDRatGvqge6hhq22kwITICIianD+s/EcbhWUoqWfK16PCjdJm3K5DJPuHOS54mACNGVcAXqvEnUZVh5OAFD+9Kc+Tw9gAkRERA3K1rNp2HI2DXZyGT4d0dGk+8881bkpvFwckJJTjN/vnG5Of9t0OhW3CkoR4OGIx9oFSB3OfTEBIiKiBuNWgQr/3ngOADClf3O0a+Zh0vYdFXYYE1m+p83S/fHcD+4uQggsO1C+9H18zxAo7Op3ilG/oyMiIjKQEAL//u0csgtL0drfDa8OMM3Q172ejwyGg70cZ5JycDLxtlk+wxrti7uFKxkFcHGww7PdgqQOp0ZMgIiIqEHYcjYN28+lw14uwycjOsDB3jy/4nzdlBjWsSkAHo9xt4qND5/pGggPp/q/Qo4JEBERWb3M/BLd0NerA1qgbVPTDn3da+Kd5d1/XEhHYlahWT/LGlxKz8P+uFuQ1+OND+/FBIiIiKyaEAL/2nAOOUVqRAS4Y8pDLcz+mS393NCvpS+EKF8RZuu+vfMk7NG2/gj0cpY4GsMwASIiIqu28XQqdl7IgMJOhk+f6WCxybcVm/z9ciIJuUW1OxWgIcnML8HG06kAgEl9wiSOxnBMgIiIyGpl5pXgnU3nAQBTB4SjTYC7xT67dwsftPZ3Q1FpGVYfu2Gxz61vfjiciNIyLToHNTL6rDUpMAEiIiKrJITAWxtikVusRrumHvhH/+YW/XyZTIaJvcufAn13KB6lGtvbGLG4tAw/HkkEALxoRU9/ACZARERkpdafSsGui5lwsJPjkxGWG/q62xMdm8DXTYmMPBW2xqZa/POl9uupZNwuUiPQywkDH/CXOpxaYQJERERWJz23BO9uLh/6+md0OFr5u0kSh9LeDuN63NkYcZ9tbYyo1Qosv3Pq+4ReobCT199jL6rCBIiIiKyKEAKz159FfokGHQIb4SWJh15Gdw+Go0KOC2l5OHw9S9JYLGnPpUxcv1UIN0d7jHgwUOpwao0JEBERWZW1J5Px5+WbcLCX45Ph7WEv8ZELni4OGN6lGQDb2hhx6Z2ND0d1D4Kr0l7iaGqPCRAREVmN1JxizNt8AQAwI7olwv2kGfq618TeYZDJyp+KXM0skDocs4tNzsXR+GzYy2UY3zNE6nCMwgSIiIisghACs349i3yVBp2CGtWrPWdCfVwQ1cYPAPDtgYb/FKji0NPH2wcgwMNJ4miMwwSIiIiswk/Hk7A/7haU9uWrvurbpNtJd5bErz+VjKwClcTRmE9qTjG2nE0DYF0bH96LCRAREdV7ybeL8P6W8qGvmY+0QnNfV4kjqqxbqBfaN/OASqPFj0ca7saI3x9KQJlWIDLMy+xnrpkTEyAiIqrXKoa+CkvL8GCwJ16op4dt3r0x4g9HElCiLpM4ItMrUGl0u15P6m29T38AJkBERFTPrTp6AwevZsFRIceCejj0dbfH2gWgiYcjbhWUYuPpFKnDMblfjichv0SDMB8XDGjdWOpw6oQJEBER1VtJ2UX4YNtFAMCsR1sj1MdF4ojuT2Enx/heIQDKl8Q3pI0RNWVaLD94Z+PD3qGQ1+NE1BBMgIiIqF7SagVmrjuDotIydAv1wrgeIVKHZJBnuwXBxcEOcZkF+OvKTanDMZkdFzKQfLsYns4KPN25mdTh1BkTICIiqpd+PJqII9ez4aSww4Lh7a3miYO7owIjuwYBaFhL4is2PhwTGQwnBzuJo6k7JkBERFTvJGYVYv62SwCAOY+1RrB3/R76utcLvUIglwH7427hYlqe1OHU2cnE24i5kQMHOzmev3P2mbVjAkRERPWKViswc+1ZFKvL0CPMG2O6W98v3EAvZwxqGwCgYTwFWnbn6c+TnZqgsZujxNGYBhMgIiKqV747lIBjCdlwdrDDx1Y09HWvSX3Kl8RvPJ2CzLwSiaMx3o2sIvxxPh1A+ZEfDQUTICIiqjfibxXi4z/Kh77eeqwNAr2cJY7IeJ2CPNEl2BPqMoGVhxOlDsdoyw/GQyuAvi190cq/fpy9ZgpMgIiIqF4o0wrMXHsGJWoterfwwejuQVKHVGcv3nkK9OPRRBSVaiSOpvZyi9X45UQSgL+P+mgomAAREVG9sOJgPE4k3oar0h4fPt0OMpl1Dn3dLTrCH0FezsgpUuPXU9a3MeKaYzdQVFqGVn5u6BPuI3U4JsUEiIiIJHc1swAL/rgMAPjX4DZo5mm9Q193s5PLMOHOxojLD8RDq7WejRHVZVp8dzABADCxT2iDSEjvxgSIiIgkVaYVeGPtGag0WvQJ98GzXQOlDsmkRjwYCHdHe8TfKsTuS5lSh2OwrWfTkJ5XAh9XJYZ2bCJ1OCbHBIiIiCS1dP91nE7KgZvSHh893b7BPWlwUdpj1J2l/BWbCdZ3QggsO1Ae67gewVDaW//Gh/diAkRERJKJy8jHZzuvAAD+PSQCTRo5SRyReYzrGQx7uQzH4rNxNjlH6nBqdOR6Ns6l5MFRIcfoSOvbh8kQTICIiEgSmjIt3lh7BqUaLR5q5YsRXaz/fKnqBHg4YUiH8mGkZfvr/8aI3955+vN052bwcnGQOBrzYAJERESS+N++6ziTnAs3R3vMf6rhDX3da+KdZeRbY9OQmlMscTTVu3azALsuls9VmtjAlr7fjQkQERFZ3OX0fHyxq3zo690hD8Dfo2Ecr3A/bZt6oEeYN8q0At8dSpA6nGotv3N0R1SbxgjzdZU4GvNhAkRERBalvjP0pS4TiGrTGE91bip1SBZTcTzGmqM3UKCqfxsjZheWYt3JZADApD4N59iLqjABIiIii1ry5zXEpuTCw0mBD4Y1jA0PDfVQq8YI83VBvkqDn48nSR1OJauOJEKl0aJtU3d0D/WSOhyzYgJEREQWcyE1D1/uiQMAzH3iATR2b/hDX3eTy2WYdOdA0eUH4qEp00oc0d9K1GX4/s6ZZS/2CWvwiSkTICIisohSzd9DXwMj/Brk5nqGeKpzU3i5OCAlpxh/nM+QOhydTadTcatAhQAPRzzWLkDqcMyOCRAREVnEV3uv4kJaHjydFfg/Gxv6upujwg5jIv/eGFEI6Y/HuHvjw/E9Q6Cwa/jpQcO/QyIikty5lFx8tfcqAOC9oW3h66aUOCJpPR8ZDAd7OU4n5eDUjdtSh4N9cbdwJaMALg52eLZbkNThWAQTICIiMquKoS+NVuCxdv54vH3DH16pia+bEsM6lq9+W7pP+o0Rl905ouOZroHwcFJIHI1lSJ4A/f777xg8eDAefPBBvPDCC0hISDBpnaVLl6Jt27b46KOPTBc0EREZbNGeOFxKz4eXiwPeG9rWZoe+7jXxzpL4Py6kIzGrULI4LqXnYX/cLchlwIReDXfjw3tJmgD9/vvvGDJkCPr06YNPP/0UOTk56N27N3JyckxSJzY2FvPmzUNeXh7S0tLMdyNERFSls8k5+O+f1wAA84a2hY+rbQ993a2lnxv6tfSFEMCKgwmSxfHtnaM5Hm3rj0AvZ8nisDRJE6B33nkHzz77LGbPno1+/frhp59+QmFhIZYsWVLnOkVFRRg5ciQWL14ML6+GvZcBEVF9pNKU4Y21Z1CmFXi8fQAGc+irkoqNEX85kYTcIrXFPz8zvwQbT6cCACb2btgbH95LsgSooKAAx48fx2OPPaYrUyqViIqKwt69e+tc57XXXkO/fv3wxBNPmOcGiIjovhbuisOVjAL4uJYPfVFlvVv4oLW/G4pKy7D62A2Lf/4PhxNRWqZF56BG6BLsafHPl5K9VB+ckpICIQQCAvT/RRAQEIDz58/Xqc5PP/2EgwcP4tSpUwbHo1KpoFKpdK/z8vIAAGq1Gmq16bLyirZM2SZVxn62HPa1ZVhbP8ffKsSSv8qHvuYOaQM3B5lVxC5FP4/vEYTZG87ju4PxGNu9GRzsLfNsori0DD8eSdTFYMl7Nmc/G9qmZAmQRlN+BoqDg4NeuVKprDZ4Q+pcv34dr776Kv744w84Oxs+ljl//nzMnTu3UvmOHTtq1Y6hdu7cafI2qTL2s+Wwry3DWvp5T6oMWmGHcHctNAknsS1B6ohqx5L9rNAC7go7ZOSrMH/VH+jqa5l9gQ6ky3C7yA7eSoGyxFPYZvkHUGbp56KiIoOukywB8vb2BgBkZWXplWdlZcHHx8foOtu2bUNxcTHGjRune//atWtITk7Grl27cObMGdjZ2VVqe86cOZg+fbrudV5eHgIDAzFw4EC4u7sbcYdVU6vV2LlzJ6Kjo6FQ2MZSQymwny2HfW0Z1tbP674/CSALw3u2xmO9QqQOx2BS9XOy63V8vvsqThU2wn/GRpp9pZxWK/DFlwcBFOEfD7fG4z2Czfp59zJnP1eM4NREsgTI398fTZo0wdGjRzFkyBBd+eHDh/Hwww8bXWfUqFHo37+/Xr3hw4eja9eumDVrVpXJD1D+FEmprLw6QaFQmOUvgbnaJX3sZ8thX1uGNfSzSlOG44nlm/v1a+1X7+OtiqX7eWzPUHy97zoupOXjRFIeejav+kGAqey6kIH4rCK4Odrjue4hUCikSQfM0c+GtifpKrCXX34Zy5Ytw/Xr5RswrVy5EleuXMGkSZN017zzzjsYNmyYwXW8vLzQtm1bvT+Ojo7w9vZG27achEdEZG4nE2+jRK2Fr5sSrfzcpA7HKni6OGB4l2YA/l6Wbk5L72x8OKpbEFyVkj0LkZSkd/3WW28hISEBrVu3ho+PD4qKirB8+XJ07NhRd01KSgri4uJqVYeIiKRzIO4WgPIVTtz00HATeoVi1dEb2H0pE1czC9CisatZPic2ORdH47NhL5dhvBUNT5qapAmQvb09li9fjk8//RS3bt1CUFBQpWGo9957T29CkyF17vXrr7/CxcXFLPdARET6DlwtT4B6tTDvME5DE+briodb+2HXxQwsPxiPD4a1M8vnVBx6Orh9AAI8nMzyGdZA8qMwAMDT0xPh4eFVJjJNmjRBixYtalXnXs2bN4e/v79JYiUiourlFJUiNiUXQPkTIKqdF+9sjPjryWRkFahquLr2UnOKsfVs2p3Psq2ND+9VLxIgIiJqGA5dy4IQQHhjV/h7OEodjtXpFuqFdk09oNJoseqo6delf38oARqtQGSYF9o29TB5+9aECRAREZnM/jgOf9WFTCbTHY+x8nACStRlJmu7QKXR7TY9ycaOvagKEyAiIjKZg3fm//QJZwJkrMfaBSDAwxG3Ckqx6c45Xabwy/Ek5JdoEObjggGtG5usXWvFBIiIiEziRlYRbmQXwV4uQ/cwb6nDsVoKOzleuLM6a9mB6xCi7jtDl2kFlh8sX14/oXco5HKuzmMCREREJrH/6k0AQKegRja7t4ypjOwaBBcHO1zJKMC+O8OKdfHH+XQk3y6Gp7MCT3duZoIIrR8TICIiMomK4a/eLXwljsT6eTgpMLJrEABg2Z1NC+uioo0xkcFwcqj6RARbwwSIiIjqrEwrcPBq+TmNvTn/xyRe6BUCuax8YvmldMPOt6rKycTbOHUjBw52cjxv4TO/6jMmQEREVGfnUnKRW6yGm9IeHZrZ9vJqUwn0csagtgEAgGV1OB7j2zsbHw7t2ASN3bg1QQUmQEREVGcVuz9HNveGvR1/tZhKxZL4jadTkJlXUuv6SdlF+P1c+p22uPT9bvwuJSKiOqs4/4vL302rU5AnugR7Ql0msPJwYq3rLz8YD60o/7q08ufBtHdjAkRERHVSXFqGk4m3AfD4C3OoOB7jx6OJKC41fGPE3GI1fjmedKcNPv25FxMgIiKqk6PxWSgt06KJhyNCfXjwtKlFR/gjyMsZOUVqrDuVbHC9NcduoLC0DK383PhkrgpMgIiIqE50y9/DfSCTcYM9U7OTyzDhzsaIyw/EQ6uteWNEdZkW3x1MAABM7BPKr0sVmAAREVGdVJz/1Tuc+/+Yy4gHA+HuaI/4W4XYfSmzxuu3nk1Del4JfFyVGNqxiQUitD5MgIiIyGg381W4lJ4PAOjVnMdfmIuL0h6jupfv4VPTxohCCCy7s/R9XI9gKO258WFVmAAREZHRKoa/IgLc4e2qlDiahm1cz2DYy2U4Gp+N2OTcaq87cj0b51Ly4KiQY3QkNz6sDhMgIiIy2gGe/m4xAR5OGNKhfDir4glPVSo2Pny6czN4uThYJDZrxASIiIiMIoTQ7f/D4y8sY2Lv8iXxW86mITWnuNL7124WYNfF8jlCE+5cS1VjAkREREa5drMA6XklcLCXo2uIl9Th2IS2TT3QI8wbZVqB7w8lVHp/+YHyIzOi2jRGc19XC0dnXZgAERGRUSqe/nQN8YSjghNtLaXieIzVx26gQKXRlWcXlmLdyfJ9gib25saHNWECRERERqmY/9O7BZe/W9JDrRojzNcF+SUa3U7PALDqSCJUGi3aNnVHZBifyNWECRAREdWaukyLI9ezAXACtKXJ5TLdXKDlB+OhKdOiRF2G7++cFTapdxg3PjQAEyAiIqq1M0k5KFBp4OmsQESAu9Th2JynOzeDp7MCybeLseNCBjadScWtAhX83R0xuH2A1OFZBSZARERUaxW7P/ds4QO5nE8bLM1RYYfn7+zxs3T/dXy7v3zy8/heIVDY8Ve7IdhLRERUa7r9f3j6u2Se7xECBzs5Ym7k4HJGPpwd7PBctyCpw7IaTICIiKhW8krUOJ2UAwDoxQRIMr5uSjzZ6e9zvp55MBAeTgoJI7IuTICIiKhWjl7PRplWIMTbGYFezlKHY9Mm9Slf7i6XARN6cePD2rCXOgAiIrIuB+JuAuDuz/VBSz83LBv7IOztZAjyZjJaG0yAiIioVvZz/596JSrCT+oQrBKHwIiIyGCpOcW4frMQchnQo7m31OEQGY0JEBERGaxi9Vf7Zo044ZasGhMgIiIyWMX5X9z9mawdEyAiIjKIVitw8M4TIC5/J2vHBIiIiAxyKT0fWYWlcHawQ+cgT6nDIaoTJkBERGSQA1fLl793D/WCgz1/fZB143cwEREZpOL8r97hXP5O1o8JEBER1ahEXYbjCdkAgN6c/0MNABMgIiKq0anE2yhRa9HYTYmWfq5Sh0NUZ0yAiIioRn/v/uwDmUwmcTREdccEiIiIalSx/w+Xv1NDwQSIiIju63ZhKc6l5gLgAajUcDABIiKi+zp0LQtCAC39XOHn7ih1OEQmwQSIiIjuq2L/Hw5/UUPCBIiIiO6r4gBUnv9FDQkTICIiqlZiViGSsouhsJOhe6i31OEQmYxRCdD7779v6jiIiKgeqtj9uVOQJ1yU9hJHQ2Q6RiVA8+bNg0ajMXUsRERUzxy8a/8foobEqASoU6dOOHjwoKljISKieqRMK3DoWhYALn+nhseo55lPPfUUnn32WcyYMQMRERFwcHDQez8qKsokwRERkXRiU3KRW6yGm6M92jf1kDocIpMyKgGaNWsWAGDmzJlVvi+EMD4iIiKqFw7ElS9/7xHmDXs7rpmhhsWoBIgJDhFRw8fl79SQMaUnIqJKiko1OJl4GwDQO9xX4miITM/oNY1lZWXYvn07Ll68CCEEIiIi8Nhjj0EuZ05FRGTtjsZnQ10m0LSRE0K8naUOh8jkjEqAEhMTMWTIEFy8eBHBwcGQyWRITExE69atsXnzZgQHB5s6TiIisqCDcX8vf5fJZBJHQ2R6Rj2umTp1Kpo1a4YbN27g6tWriIuLQ2JiIpo1a4apU6eaOkYiIrKwivk/XP5ODZVRT4B2796NS5cuISAgQFcWEBCAb775Bq1bt65VWwkJCVixYgUyMjLQrl07TJw4EY6O9z9t2JA6+/btwx9//IGCggI88MADGD16NFxcXGoVGxGRLcrML8Gl9HwAPACVGi6jngDJZLIqV4JptdpazQE6d+4cOnTogAsXLiA8PBxLlixB//79oVar61Rn8uTJ+OCDD9CoUSOEhIRgyZIl6NSpE7Kzs2t3o0RENqhi9+cHmrjDy8WhhquJrJNRT4Cio6Px4osv4ttvv0XTpk0BAMnJyZg0aRKio6MNbmfWrFno1q0b1q5dCwAYM2YMgoODsXLlSkycONHoOnPmzEFQUJCuzoQJE+Dt7Y1t27ZhzJgxxtwyEZHNOBDH3Z+p4TPqCdCXX36JW7duISgoSPcnODgY2dnZWLhwoUFtlJaWYufOnRg5cqSuzM/PDwMGDMDmzZvrVOfu5AcAMjMzUVZWhiZNmtTmNomIbI4QAgeulm+A2KcFl79Tw2XUE6BmzZrh+PHj2L17N86fPw+ZTIaIiAg8/PDDBq8WuHHjBtRqNUJCQvTKQ0JCsH///jrXiY2Nxaeffoq8vDycOnUK//3vfzFgwIBq41GpVFCpVLrXeXl5AAC1Wn3fIbnaqmjLlG1SZexny2FfW4al+jkuswAZeSoo7eXo2NTV5r6u/H62DHP2s6FtGpUAde3aFcePH0dUVJTR534VFxcDQKWJyW5ubrr36lLHy8sL/fv3x61bt3D9+nWsWrUKzz77LDw9Patse/78+Zg7d26l8h07dsDZ2fR7YOzcudPkbVJl7GfLYV9bhrn7+a80GQA7BLtosHvnH2b9rPqM38+WYY5+LioqMug6oxKgK1euID8/H25ubsZUBwC4u7sDAHJycvTKs7Oz4eFR9aF7tanTtGlTjB8/HkD5pOiWLVviiy++qDLJAcrnDU2fPl33Oi8vD4GBgRg4cKDuc01BrVZj586diI6OhkKhMFm7pI/9bDnsa8uwVD//9uMpALcwtHsrPNYn1GyfU1/x+9kyzNnPFSM4NTEqARo6dChWrFhRpz1/AgMD4eHhgfPnz2PQoEG68nPnzqFt27YmqwOUPzFq3rw5rl27Vu01SqUSSqWyUrlCoTDLXwJztUv62M+Ww762DHP2s7pMi2Px5cdf9GvlZ9NfT34/W4Y5+tnQ9oyaBK3VavH666+jd+/eeOmll/Dqq6/q/THog+VyjBw5EsuXL0dBQQEA4OjRozh69ChGjRqlu27FihV4++23Da6jUqmwdetWvc86f/48Tp48iZ49expzu0RENiHmRg4KS8vg5eKAiADTPfkmqo+MegJUUFCAoUOHAihfYWWs+fPnIyoqCu3atUO7du3w559/4rXXXsMjjzyiu+bgwYM4cuQI3n//fYPq2NnZ4bvvvsPs2bPRpk0b5OTk4MCBAxgzZgxeeuklo2MlImroKnZ/7tncG3I5j7+ghs2oBOjHH3+Eq6trnT/cy8sLx44dw759+5CRkYEPPvig0lDWhAkTMGTIEIPr2NvbY+3atbh27RpOnz4NFxcXrFixQrdfERERVe1A3J3l79z/h2yAUQmQu7s7tFqtaQKwt7/v8vSqhq1qqgMAzZs3R/PmzescHxGRLcgrUeNMci4AoHc49/+hhs+oOUB+fn5IT083dSxERCSRI9eyUKYVCPVxQdNGTlKHQ2R2RiVAU6ZMwcyZM3UTkYmIyLrpTn/n4adkI4waAlu9ejUuXryIdevWITAwEA4O+oflnTt3ziTBERGRZRyIu5MAcf4P2QijEiCupiIiajhScopx/VYh5DIgMsxb6nCILMKoBOif//ynicMgIiKpHLzz9KdDYCN4OHHzP7INRs0BqlBcXIyLFy+aKhYiIpLA/jvzf/pw/g/ZEKMSoIKCAowZMwaurq6IiIjQlT/zzDM4efKkyYIjIiLz0moFDt5JgHoxASIbYlQCNGfOHKSkpOD48eN65ePHj6/2sFEiIqp/LqbnIbuwFM4OdugU5Cl1OEQWY9QcoA0bNmDfvn0ICwvTK4+MjMTIkSNNEhgREZlfxeqvyDBvONjXaVYEkVUx6rv91q1baNy4MQBAJvv7vJji4mIIIUwTGRERmR33/yFbZVQC1LFjR2zbtg2AfgK0cOFCdO/e3TSRERGRWZWoy3AsPhsA9/8h22PUENj777+Pp556CocOHQIAfPTRR/j9999x8OBB7Nmzx6QBEhGReZxMvA2VRgs/dyXCG9f9gGsia2LUE6CoqCj88ccfiI+Ph7+/P7744gs4Ozvjr7/+Qu/evU0dIxERmcH+uL9Xf939NJ/IFhj1BAgAevTogY0bN5oyFiIisqADV28C4Pwfsk2c8k9EZIOyC0txPjUPABMgsk1MgIiIbNCha7cgBNDKzw2N3R2lDofI4pgAERHZIJ7+TraOCRARkY0RQugmQHP4i2wVEyAiIhuTmFWElJxiKOxk6B7mJXU4RJIweBVYSEiIwY0mJCQYEQoREVlCxenvnYM84exg9GJgIqtm8Hf+22+/bc44iIjIQg5y+IvI8ARo0qRJ5oyDiIgsoEwrcOgaJ0AT1XkOkEqlQklJiSliISIiMzubnIO8Eg3cHe3RvlkjqcMhkozRCdDSpUvRokULODk5wdnZGS1atMDSpUtNGRsREZlYxfL3ns19YCfn8Rdku4ya/bZgwQLMmzcPU6dORWRkJGQyGQ4fPowZM2YgJycHM2fONHWcRERkAgfuTIDuxeEvsnFGJUCLFy/GmjVrMHjwYF3Z4MGD0aNHD0yZMoUJEBFRPVSo0uDUjdsAgD6cAE02zqghsLS0NPTp06dSee/evZGamlrnoIiIyPSOxWdDXSbQzNMJwd7OUodDJCmjEqDmzZtj/fr1lcrXrVuH5s2b1zkoIiIyvYrhr94tfCCTcf4P2TajhsD+/e9/Y9y4cfj999/RrVs3AMDRo0exfv16rFy50qQBEhGRafD8L6K/GZUAjRo1Ck2bNsWCBQuwaNEiyGQyREREYPfu3ejbt6+pYyQiojrKzCvB5Yx8yGRAr+ZMgIiM3gO9X79+6NevnyljISIiM6kY/mrbxAOeLg4SR0MkPaPmAAkhcOPGjUrlN27cgBCizkEREZFp6Za/c/UXEQAjE6Avv/wSn332WaXyzz77DIsXL65zUEREZDpCCN38nz6c/0MEwMgE6IsvvsC0adMqlf/zn//El19+WeegiIjIdOIyC5CZr4LSXo4uwZ5Sh0NULxiVAKWnp8PZufIeEs7OzkhOTq5zUEREZDoVT3+6hXrBUWEncTRE9YNRCVDnzp2xbNmySuVLly5Fx44d6xoTERGZ0N37/xBROaNWgc2dOxeDBg3C4cOH0bdvXwghsG/fPvz+++/Yvn27qWMkIiIjlWq0OHI9CwD3/yG6m1FPgKKiorBnzx6UlZXh008/xeeffw6tVou9e/ciKirK1DESEZGRYm7cRlFpGbxdHNDG313qcIjqDaP3AerTp0+V54EREVH9cfDO8FfPFj6Qy3n8BVEFo54A3U2lUqGkpMQUsRARkYntv5MA8fR3In1GJ0BLly5FixYt4OTkBGdnZ7Ro0QJLly41ZWxERFQHucVqnEnKAQD04vwfIj1GDYEtWLAA8+bNw9SpUxEZGQmZTIbDhw9jxowZyMnJwcyZM00dJxER1dKR61nQCiDMxwVNGzlJHQ5RvWJUArR48WKsWbMGgwcP1pUNHjwYPXr0wJQpU5gAERHVAzz9nah6Rg2BpaWlVTkBunfv3khNTa1zUEREVHfc/4eoekYlQM2bN8f69esrla9btw7Nmzevc1BERFQ3ybeLEH+rEHZyGSKbe0sdDlG9Y9QQ2L///W+MGzcOv//+O7p16wYAOHr0KNavX4+VK1eaNEAiIqq9iuXvHZp5wN1RIXE0RPWPUQnQqFGj0LRpUyxYsACLFi2CTCZDREQEdu/ejb59+5o6RiIiqqX9uvk/vhJHQlQ/GZUAffLJJ3jjjTfQr1+/at8jIiJpaLUCh66VH3/RhxOgiapk1Byg+63y4gowIiJpXUjLQ3ZhKVwc7NAxsJHU4RDVS3XeCfpu165dg7c3J9sREUmpYvVXZJg3FHYm/TFP1GDUagisRYsWVf4/AGi1WqSmpmL06NGmiYyIiIzC/X+IalarBKhibs/kyZMrzfNRKBQICQnBQw89ZLroiIioVkrUZTiWkA2A+/8Q3U+tEqB//OMfAAAfHx8MHz7cLAEREZHxTiTcRqlGCz93JVo0dpU6HKJ6y6jB4buTH54GT0RUf+y/ehMA0LuFL2QymcTRENVfPA2eiKgBqZj/w+XvRPcn+WnwKpUKO3bsQEZGBtq1a4fu3bubpE58fDyOHDkCe3t7dO/eHUFBQbW6RyIia5NdWIrzqXkAgJ4tuCKX6H4kPQ0+MzMT/fv3BwB06NABb775Jp566iksW7bM6DpCCDzzzDM4ffo0unbtiqKiIowdOxbz5s3jBo1E1KBVHH/R2t8Njd0cJY6GqH4zKgEy1Wnws2fPhkKhwJEjR+Dk5ITTp0+jS5cuGDp0KIYMGWJUHSEERo4ciV9++UU3/r169WqMGTMGw4YN42GtRNRg6Za/c/UXUY0kOw1eq9Vi3bp1GD9+PJycnAAAHTt2RM+ePfHzzz8bXUcul2P48OF6k/+ioqIghMDly5drdZ9ERNZCCKHbALEX5/8Q1Uiy0+CTkpKQn5+PNm3a6JW3adMGJ06cMFkdANi0aRPs7OzQoUOHaq9RqVRQqVS613l55ePoarUaarW6xvsxVEVbpmyTKmM/Ww772jJq6ueErEKk5BRDYSdD52Zu/HoYid/PlmHOfja0TclOg8/PzwcANGrUSK/c09NTl3yYos758+cxY8YMzJw5E02bNq02nvnz52Pu3LmVynfs2AFnZ+dq6xlr586dJm+TKmM/Ww772jKq6+f96TIAdgh2KcOfu3ZYNqgGiN/PlmGOfi4qKjLoOqMSoB9//BFjxoyp8jR4Q1UMYVUkNRXy8vKqTThqW+fq1asYOHAgnnjiCfzf//3ffeOZM2cOpk+frtdmYGAgBg4cCHd395pvyEBqtRo7d+5EdHQ0FAqFydolfexny2FfW0ZN/bxl9WkAmXiiW0s81i/M4vE1FPx+tgxz9nN1D0TuZVQC9MILL2DUqFGQy40/ZC8oKAgODg6Ij4/XK79+/TrCw8PrXOfatWvo378/+vfvj++++67GWJVKJZRKZaVyhUJhlr8E5mqX9LGfLYd9bRlV9bOmTIsj8eXHX/Rt5cevgwnw+9kyzNHPhrZnVAbTqlUrnDlzxpiqOgqFAoMGDcLq1ashhAAAJCcn488//8QTTzyhu27v3r1Ys2ZNrepcv34d/fv3R79+/bBy5UrY2dnVKVYiovrsbEou8ks08HBSoF1TD6nDIbIKRj0BmjJlCkaNGoV58+YhIiICDg4Oeu/fe1J8dT766CP07NkTjz/+OLp3744ff/wRPXv21DtRftWqVThy5Aiee+45g+oUFxfjoYceQmlpKbp164avv/5a19aAAQMQERFhzC0TEdVbFcvfezb3hp2cx18QGcKoBOiVV14BAIwYMaLK9yueztSkVatWOHfuHH744QdkZGTgrbfewujRo2Fv/3dYAwYMQFhYmMF1tFqtbg+huLg4vc/r0qWL4TdJRGQldMvfuf8PkcGMSoDunYNTFwEBAXjzzTerfX/UqFG1quPi4oLFixebLD4iovqsUKVBzI3bAHj+F1Ft1CoBEkLgyy+/xKZNmyCEwNChQzF16lSeOExEJJGj8VlQlwkEejkh2NtF6nCIrEatJkEvWLAAb7zxBhwdHeHk5IQ33ngDCxYsMFdsRERUgwNxWQB4/AVRbdUqAfr222+xZs0abN26FVu3bsWqVauwfPlyc8VGREQ1OHD1JgCgdwtfiSMhsi61SoASEhLw+OOP614/8cQTSEhIMHVMRERkgIy8ElzJKIBMVr4CjIgMV6sEqLS0FI6OjrrXjo6OeudnERGR5VQsf2/X1AOeLg41XE1Ed6v1KrBJkybVWLZs2TLjIyIiIoMc5PJ3IqPVKgHq1asXLl26VGMZERGZlxBCt/9PHyZARLVWqwTowIED5oqDiIhq4UpGATLzVXBUyNE52FPqcIisjvGnmRIRkWQqnv50DfGCo4LnHRLVFhMgIiIrdCCufPk7d38mMg4TICIiK1Oq0eJofDYA7v9DZCwmQEREVubUjdsoKi2Dj6sDWvu7SR0OkVViAkREZGUqlr/3bO4DuZxnMRIZgwkQEZGV2X9nA8TenP9DZDQmQEREViS3WI2zyTkAeAAqUV0wASIisiJH47OhFUCYrwuaNHKSOhwiq8UEiIjIihy8lgWAuz8T1RUTICIiK3Lw6p3l7+Fc/k5UF0yAiIisRFYJkJhdBDu5DJFhXlKHQ2TVmAAREVmJK7nlS947BjaCm6NC4miIrBsTICIiK3H5TgLE1V9EdccEiIjICmi1QvcEiOd/EdUdEyAiIitwMT0fhRoZXJR26BDYSOpwiKweEyAiIitw4Gr58vfuIV5Q2PFHN1Fd8W8REZEVOHRn/59eLbwljoSoYWACRERUz5Woy3DiRg4AoFdzJkBEpsAEiIioHtOUafH5ziso1Wjh4SAQ5uMsdUhEDYK91AEQEVHVMvJK8NqaGByLL9/9uZ+/FjKZTOKoiBoGJkBERPXQn5czMf2XM8guLIWLgx3mDY2AXXKM1GERNRhMgIiI6hFNmRaf7ryCr/+8BgCICHDHV6M7o5mHA7YxASIyGSZARET1RGpOMaauicGJxNsAgOcjg/GvwW3gqLCDWq2WODqihoUJEBFRPbD7YgZmrD2DnCI13JT2+Gh4ezzWLkDqsIgaLCZAREQSKtVo8fHvl7DsQDwAoH0zDyx+rjOCvLnai8icmAAREUkkKbsIr62JwemkHADAC71CMHtQayjt7aQNjMgGMAEiIpLAH+fTMXPtGeSVaODuaI8FIzrgkQf8pQ6LyGYwASIisiCVpgzzt13Cd4cSAAAdAxth8ahOaObJIS8iS2ICRERkIYlZhXh1dQxiU3IBAC/1DcPMR1rxcFMiCTABIiKygK1n0zD717PIV2nQyFmBz57pgAGt/aQOi8hmMQEiIjKjEnUZ3t96AT8euQEAeDDYE18+1wlNGjlJHBmRbWMCRERkJtdvFmDK6hhcTMsDALzSvzmmR7eEPYe8iCTHBIiIyAw2nk7BW+tjUVhaBm8XB3w2siP6tfSVOiwiuoMJEBGRCRWXlmHu5vP46XgSAKB7qBe+fK4T/NwdJY6MiO7GBIiIyESuZuZjyqoYXM7Ih0wGvDYgHFMHtOCQF1E9xASIiMgE1p1Mxr9/O4didRl8XJVY+GxH9GrhI3VYRFQNJkBERHVQVKrBv387j19PJQMAerXwxucjO6KxG4e8iOozJkBEREa6nJ6PV1adxLWbhZDLgGlRLfHKQy1gJ5dJHRoR1YAJEBFRLQkh8PPxJLyz6TxUGi383JVY+GwnRIZ5Sx0aERmICRARUS0UqDT414ZYbDydCgDo19IXnz3TAd6uSokjI6LaYAJERGSg86m5eHV1DOJvFcJOLsMbA1vh5b5hkHPIi8jqMAEiIqqBEAI/Hr2BeVsuoFSjRYCHIxY91wkPhnhJHRoRGYkJEBHRfeSVqDHn11hsjU0DADzcujE+GdEBni4OEkdGRHXBBIiIqBpnk3Pw6uoY3Mgugr1chtmDWmNi71DIZBzyIrJ2TICIiO4hhMB3hxLwwbaLUJcJNG3khMWjOqFTkKfUoRGRiTABIiK6S26RGm/+egZ/nM8AAAyM8MOC4R3g4ayQODIiMiUmQEREd8TcuI1XV8cgJacYCjsZ3nqsDcb3DOGQF1EDVC8SoKSkJGRkZKBly5Zwd3c3WZ20tDRcu3YN7dq1g4eHhylDJqIGRAiBZfvj8dHvl6DRCgR5OWPxqE5o36yR1KERkZlIekRxSUkJnn76abRq1QrPP/88/P39sWjRojrXOXHiBIYPH44OHTqgT58+iImJMedtEJEVu11Yiknfn8D/bbsIjVZgcLsAbJnam8kPUQMnaQI0d+5cHDt2DNeuXcPFixexevVqTJ06FUePHq1TnXPnzmHkyJH3bYeI6ERCNh77cj92X8qEg70c855si8WjOsHdkfN9iBo6SROgFStWYNKkSQgICAAAPPnkk2jbti1WrFhRpzrjx4/HiBEjoFDwhxgRVabVCvz3z6sY+c0RpOWWINTHBRte6YnnI4M534fIRkg2Byg1NRUZGRno0qWLXnm3bt2qHbIypo6hVCoVVCqV7nVeXh4AQK1WQ61W16ntu1W0Zco2qTL2s+VYW19nFZbizV9jsS8uCwAwpL0/3nsiAq5K+3p9D9bWz9aK/WwZ5uxnQ9uULAHKzs4GAHh765+e7O3trXvPFHUMNX/+fMydO7dS+Y4dO+Ds7Fyntquyc+dOk7dJlbGfLcca+vpqLrAyzg65ahkUMoGnQ7WIdE7Gvt3JUodmMGvo54aA/WwZ5ujnoqIig66TLAGqGJ4qKSnRKy8uLoaDQ9VbzBtTx1Bz5szB9OnTda/z8vIQGBiIgQMHGrwyzRBqtRo7d+5EdHQ0h+jMiP1sOdbQ12Vaga//uo6vjlyDVgBhPi74cmR7tPJ3kzo0g1lDPzcE7GfLMGc/V4zg1ESyBCgwMBByuRwpKSl65SkpKQgKCjJZHUMplUoolcpK5QqFwix/CczVLuljP1tOfe3rzPwSTPv5NA5eLR/yerpzM8x78gE4O9SLXUBqrb72c0PDfrYMc/Szoe1JNgna2dkZPXv2xKZNm3RlhYWF2LVrF6Kjo3VlV69e1c3vMbQOEREAHLx6C48tPICDV7PgpLDDJyM64NNnOlht8kNEpiPpT4H3338f0dHRmDNnDnr06IFFixahcePGeOmll3TXfPjhhzhy5AjOnTtncJ3MzExcuXIFN2/eBADExsbC3t4eQUFBdX5SRET1X5lWYOHuOCzaEwchgFZ+blg8qhPC/axnyIuIzEvSBKhfv37Yu3cvvvrqKxw7dgzt2rXDDz/8AFdXV9014eHhKC0trVWdkydP4v/+7/8AAL169cLPP/+Mn3/+GRMmTMCECRMsd4NEZHEZeSWYuiYGR+PLF0Y82zUQ7wx5AE4OdhJHRkT1ieTPgXv16oVevXpV+/6sWbNqXWfQoEEYNGiQSeIjIuvx15WbmP7zaWQVlsLFwQ4fPNUOQzs2lTosIqqHJE+AiIjqSlOmxac7r+DrP68BANoEuOOrUZ0Q5utaQ00islVMgIjIqqXmFGPqmhicSLwNABgTGYS3B0fAUcEhLyKqHhMgIrJaey5lYPovZ5BTpIar0h4fPt0Oj7dvInVYRGQFmAARkdVRl2nx8e+XsHR/PACgXVMPLB7VCcHeLhJHRkTWggkQEVmVpOwivLYmBqeTcgAA43uGYM5jraG055AXERmOCRARWY0/zqdj5tozyCvRwN3RHh8P74BH2/pLHRYRWSEmQERU76k0Zfhw+yWsOJgAAOgQ2AiLn+uEQC/TH1RMRLaBCRAR1Ws3soowZfUpxKbkAgBe7BOKmY+0hoO9ZCf5EFEDwASIiOqtbbFpmLXuLPJVGjRyVuCT4R0QFeEndVhE1AAwASKieqdEXYb/23oRPxxJBAB0CfbEouc6oUkjJ4kjI6KGggkQEdUr8bcKMWXVKVxIywMATO7fHNOjW0JhxyEvIjIdJkBEVG9sPJ2Ct9bHorC0DF4uDvjsmQ7o36qx1GERUQPEBIiIJFeiLsPczeex5lgSAKBbqBe+fLYT/D0cJY6MiBoqJkBEJKmrmQWYsuoULmfkQyYDXnuoBaY+HA57DnkRkRkxASIiyfx6Mhlv/3YOxeoy+Lgq8cXIjugd7iN1WERkA5gAEZHFFZVq8J+N57HuZDIAoGdzb3zxbEc0duOQFxFZBhMgIrKoKxn5mLLqFOIyCyCXAf+MaokpD7WAnVwmdWhEZEOYABGRRQgh8MuJJLyz6TxK1Fo0dlNi4bOd0KO5t9ShEZENYgJERGZXoNLg7Q2x+O10KgCgT7gPPh/ZET6uSokjIyJbxQSIiMzqQmoeXl19CtdvFcJOLsOMgS3xj77NIeeQFxFJiAkQEZmFEAKrjt7Ae1suoFSjRYCHI758rhO6hnhJHRoRERMgIjK9/BI1Zq+PxdazaQCAAa0b45MRHeDl4iBxZERE5ZgAEZFJxSbn4tU1p5CYVQR7uQyzHm2Nib1DOeRFRPUKEyAiMgkhBL47GI8Ptl1CaZkWTRs5YdGoTugc5Cl1aERElTABIqI6K9IAr/50BjsuZAIABkb4YcHwDvBwVkgcGRFR1ZgAEVGdnEnOxYKzdshWZUJhJ8Nbj7XB+J4hkMk45EVE9RcTIKJ6QFOmxZd7ruLHI4ko1WilDqdWiko10AoZAj2d8NXozmjfrJHUIRER1YgJEJHE0nNLMPWnGByLz5Y6FKN19NZi+T8i4eXmLHUoREQGYQJEJKE/L2di+i9nkF1YChcHO8x7si26BFvXpGE7aHHywB64OXK+DxFZDyZARBJQl2nx6Y4rWPLXNQDAA03csXhUZ4T6uEgcWe2p1WqpQyAiqjUmQEQWlpJTjKlrYnAy8TYAYGyPYLz1WBs4KuwkjoyIyHYwASKyoF0XMvDGujPIKVLDzdEeHz/dHoPaBUgdFhGRzWECRGQBpRotPv79EpYdiAcAdGjmgUXPdUaQNycNExFJgQkQkZklZRfh1TUxOJOUAwCY0CsUswe1hoO9XNrAiIhsGBMgIjP6/Vw6Zq47g/wSDdwd7fHJiA4Y+IC/1GEREdk8JkBEZqDSlGH+tkv47lACAKBTUCMseq4TmnlyyIuIqD5gAkRkYolZhXh1dQxiU3IBAC/3DcMbj7SCwo5DXkRE9QUTICIT2nI2FbN/jUWBSgNPZwU+faYDBrT2kzosIiK6BxMgIhMoUZdh3pYLWHX0BgCga4gnvnyuEwI8nCSOjIiIqsIEiKiOrt8swJTVMbiYlgeZDHilf3NMi2oJew55ERHVW0yAiOrgt5gUvLUhFkWlZfB2ccDnIzuib0tfqcMiIqIaMAEiMkJxaRne3XQeP59IAgBEhnlh4bOd4OfuKHFkRERkCCZARLUUl5GPKatP4UpGAWQyYOqAcEx9OBx2cpnUoRERkYGYABHVwtoTSfjPxvMoVpfB102JhSM7omcLH6nDIiKiWmICRGSAQpUG/954DutPpQAAerfwwecjO8LXTSlxZEREZAwmQEQ1uJSehymrTuHazULIZcD06JZ4pX8LyDnkRURktZgAEVVDCIGfjyfhnU3nodJo4eeuxJfPdkL3MG+pQyMiojpiAkRUhQKVBm+tj8WmM6kAgH4tffHZMx3g7cohLyKihoAJENE9zqfm4tXVMYi/VQg7uQwzH2mFl/qEcciLiKgBYQJEdIcQAj8evYF5Wy6gVKNFEw9HLBrVCV2CvaQOjYiITIwJEBGAvBI15vwai62xaQCAqDaNsWB4B3i6OEgcGRERmQMTILJ5Z5Nz8OrqGNzILoK9XIbZg1pjYu9QyGQc8iIiaqiYAJHNEkLgu0MJ+GDbRajLBJp5OmHxqM7oGNhI6tCIiMjMmACRTcotUmPmujPYcSEDAPDIA374eHgHeDgpJI6MiIgsgQkQ2ZyYG7fx6uoYpOQUw8FOjn8NboOxPYI55EVEZEPqTQKk1Wohl8tNXseYdqlhEkJg2f54fPT7JWi0AsHezlj8XGe0a+YhdWhERGRhkmcG8+fPh5+fHxQKBdq1a4c9e/aYpI4x7VLDdbuwFJO+P4H/23YRGq3A4PYB2PxabyY/REQ2StIEaMmSJfjggw+watUq5Obm4qmnnsLjjz+O+Pj4OtUxpl1quE4kZOOxL/dj96VMONjL8f6TbbH4uU5wd+R8HyIiWyVpAvTZZ59h4sSJiIqKgqurK9599134+PhgyZIldapjTLvU8GgF8L998Rj5zRGk5ZYgzMcFv73SC2MiOd+HiMjWSTYHKCsrC3FxcejXr5+uTCaToV+/fjh8+LDRdYxp15J2X8zEqVsyaM+mwc6+3kzBanA0Gg2WXpLjYk4cAODJjk3w/rB2cFWyz4mISMIEKCOjfPmxr6+vXnnjxo1x7Ngxo+sY0y4AqFQqqFQq3eu8vDwAgFqthlqtrvF+DPXulotIz7PD93GxJmuTqiOHo70c/3m8NYZ3bgqZTJj0a0nlKvqUfWte7GfLYD9bhjn72dA2Jf/nsFarrfS6puEJQ+rUtt358+dj7ty5lcp37NgBZ2fn+8ZTG00Ucri5m6w5ug8Xe+CRQA1cMs5i+/azUofT4O3cuVPqEGwC+9ky2M+WYY5+LioqMug6yRKggIAAAEBmZqZeeWZmJvz9/Y2uY0y7ADBnzhxMnz5d9zovLw+BgYEYOHAg3N1Nl7FER6uxc+dOREdHQ6HgJFxzUavZz5bCvrYM9rNlsJ8tw5z9XDGCUxPJEiBPT09ERERg7969GD58OIDypzR79+7FCy+8oLtOo9FAq9XCwcHBoDqGtnsvpVIJpVJZqVyhUJjlL4G52iV97GfLYV9bBvvZMtjPlmGOfja0PUlXgc2aNQvLly/Hr7/+itTUVEyfPh0FBQWYPHmy7pp//OMf6Ny5c63qGHINERER2S5J5wCNHTsWBQUFmDNnDjIyMtCuXTvs3LkTzZo1012jUCj0nswYUseQa4iIiMh2ST4J+pVXXsErr7xS7ftff/11resYeg0RERHZJsmPwiAiIiKyNCZAREREZHOYABEREZHNYQJERERENocJEBEREdkcJkBERERkc5gAERERkc1hAkREREQ2hwkQERER2RzJd4Kur4QQAAw/VdZQarUaRUVFyMvL40F7ZsR+thz2tWWwny2D/WwZ5uznit/bFb/Hq8MEqBr5+fkAgMDAQIkjISIiotrKz8+Hh4dHte/LRE0pko3SarVITU2Fm5sbZDKZydrNy8tDYGAgkpKS4O7ubrJ2SR/72XLY15bBfrYM9rNlmLOfhRDIz89HkyZNIJdXP9OHT4CqIZfLzXp6vLu7O/9yWQD72XLY15bBfrYM9rNlmKuf7/fkpwInQRMREZHNYQJERERENocJkIUplUq88847UCqVUofSoLGfLYd9bRnsZ8tgP1tGfehnToImIiIim8MnQERERGRzmAARERGRzWECRERERDaHCZAJXLx4ETExMVCr1SatY0y7DVlCQgJOnDiBgoICk9XRaDS4cOECrl27hrKyMlOFatUyMzNx/Phx3Lx50+R1VCoVDhw4gAsXLtQ1TKuXm5uLEydOICkpyeR1EhMTcfbsWWg0mrqGafVUKhVOnTqFy5cvm7RObm4uTp8+jUuXLqG0tNQUoVo1rVaL2NhYnD17tlY/S2NjY3H06FGTt2sQQUZLSEgQ7du3Fz4+PiIkJET4+fmJvXv31rmOMe02ZAUFBWLQoEHCxcVFtGrVSjg7O4tly5bVqY5GoxH/+c9/hK+vr4iIiBCBgYEiJCRE7Ny509y3U29ptVrx2muvCaVSKSIiIoRSqRQzZswwaZ3XXntNyOVyMXjwYFOHb1W+/PJL4eTkJNq0aSOcnJzEU089JUpKSupc5+rVq6JHjx7Cy8tLPPjggyI8PFzs27fPnLdSr23btk14e3uLsLAw4enpKbp06SJSU1PrXOeNN94QTk5OokOHDiIkJET4+/uLjRs3mvNW6rWzZ8+K5s2bi4CAANG0aVMRHBwsTp06dd86y5cvFx07dhSenp7C29vbZO3WBhOgOujdu7d4+OGHRWlpqRBCiBkzZghvb2+Rm5tbpzrGtNuQvfrqqyIsLEzcvHlTCCHEDz/8IORyuYiNjTW6Tn5+vpg7d67IyckRQpT/In/jjTeEu7u7uH37tnlvqJ5atmyZcHV1FWfPnhVCCHH8+HGhVCrFqlWrTFJn48aNom3btmLw4ME2nQAdOXJEyGQysWnTJiGEECkpKaJJkyZizpw5daqTn58vQkNDxYgRI0RxcbEQQojU1FSxfv16M95N/XXz5k3h5uYm3nvvPSGEEMXFxSIyMlIMGjSoTnV27NghAIj9+/fryqZNmybc3d2FRqMx093UX2VlZaJ169Zi5MiRQqvVCiGEGDNmjAgLCxNqtbraerNnzxYnT54Un3/+eZUJkLHt1gYTICNduXJFABC7du3Sld26dUvY29uLH374weg6xrTbkKnVauHu7i4++eQTvfLQ0NBqnzQYU0eI8n89AxB//fVX3QO3Qj179hRjxozRK3vyySfFww8/XOc6SUlJokmTJuLMmTPi6aeftukE6KWXXhIdO3bUK3v77beFn59fneosXLhQODo6iuzsbNMGbKX++9//CmdnZ1FYWKgrW7dunZDJZNU+BTKkzqpVq4RcLhcqlUp3zdq1a4VcLhf5+flmupv6a9++fQKAOHfunK7s8uXLAoBBT9SrS4Dq2q4hOAfISDExMQCALl266Mq8vb0RFhame8+YOsa025Bdv34deXl5ev0BAF27dq22P4ypAwDHjx+HTCZDWFhY3QO3QjExMZX6rFu3bvftM0PqlJWVYfTo0ZgxYwbat29v2qCtUHV9lpGRgbS0NKPr7N69G7169YKHhwfOnDmDuLg4m57XFhMTgzZt2sDZ2VlX1q1bNwghcPr0aaPrPPnkk+jevTvGjh2LP/74A7/88gv+85//4D//+Q9cXV3NeUv1UkxMDJRKJR544AFdWcuWLeHu7l6n31nmavduPAzVSNnZ2bCzs6t04Jq3tzeys7ONrmNMuw1ZxT17e3vrlXt7e+PKlSsmq5Oamorp06fjhRdeMOshuPVVSUkJiouLq+yz27dvQwgBmUxmVJ333nsPDg4OmDZtmtnvwxpkZ2dX2WcV7wUEBBhVJzU1FZ6enujcuTO0Wi2ys7OhUCiwcuVK9OnTx0x3U3/V1GfG1nF2dsbUqVPx+uuv48KFC8jNzUVAQABGjBhh6luwClX1GVD331nmavdufAJkJIVCgbKyskortIqLi+Hg4GB0HWPabcgUCgWA8l+2d6upn2tT59atW3jkkUfQqlUrLF682BRhW5379Zm9vX2l5MfQOrGxsfjoo4/w4osv4uDBgzhw4ACysrJw+/ZtHDhwAMXFxWa6o/pLoVBU2WcA7vs9XVMdhUKBXbt24eOPP8bZs2dx48YNREdHY8SIETa5Sslc/bxx40aMHTsWGzZswNmzZ5GYmIioqCj069cPOTk5Jr6L+q+qPgPq/jvLXO3ejQmQkYKDgwGUPzm4W2pqKoKCgoyuY0y7DVlFf6SkpOiVp6Sk1NjPhtTJyspCVFQUvLy8sGXLFjg5OZkqdKtiZ2eHpk2bVtlnFf1pTJ2ioiI8+OCD+PLLLzF79mzMnj0bsbGxuHjxImbPnl2rpfYNRXBwcJV9JpfLq336aEidkJAQhIaGYuDAgQAAuVyOF198ERkZGdU++WzIquszAPf92VFTnS1btqBTp07o2bOn7popU6bg1q1bOHTokMnitxbBwcG4ffs2ioqKdGUqlQpZWVl1+p1lrnbvxgTISD169ICLiws2bdqkKzt8+DAyMzMRHR2tKzt16hSuXbtmcB1D27UVPj4+6Nixo15/3L59G/v27dPrj8uXL+Ps2bO1qpOdnY2oqCh4eHhg27ZtcHFxscAd1V/R0dHYvHkzxJ3jAbVaLTZv3qzXZ8nJyXo/5Guq0717dxw4cEDvT//+/dGzZ08cOHDAJpP66Oho7Nq1S+8H+8aNG9GrVy9dAl7xhKziX8CG1HnkkUeQlZWl96/m5ORkAICvr6/Z76u+iY6OxrVr1/T2nNq4cSO8vLzQuXNnAEBpaanuqaShdXx9fZGenq43v6piXyZb7OcBAwZALpdjy5YturJt27ZBo9Hg4Ycf1pUdOXIEN27cMHm7dWKSqdQ26qOPPhIuLi7i66+/Fj/99JNo3ry5GDZsmN41rVq1Ei+//HKt6hhyjS3Ztm2bsLOzE++884747bffRJ8+fURERIRuqa8QQowcOVJ0797d4DpFRUWic+fOomnTpuL3338X+/fv1/2pWDpva65cuSLc3d3F+PHjxaZNm8SoUaOEp6enSEhI0F0zf/58oVQqa1XnXra+CiwvL0+EhYWJgQMHio0bN4pZs2YJe3t7vdWHmzdvFgBEXFycwXVKS0tFly5dxODBg8XWrVvF999/LwIDA8W4ceMsfYv1xsCBA0VERIRYu3atWLhwoVAqleK///2v7v2kpCQBQKxdu9bgOnFxccLV1VUMHz5cbNu2TaxevVq0atVK9OzZ0yaXwQtRvg2Aj4+PWLFihVi5cqXw8/MTr7zyit41Hh4e4p133tG9Pn/+vNi/f7+YOnWq8PDw0P38vXsFniHt1gVPg6+jVatW4eeff4ZKpcKAAQPwz3/+E0qlUvf+6NGj0alTJ7zxxhsG1zH0Gluyd+9eLFmyBFlZWejUqRNmzZoFHx8f3fvvvvsu0tLS8L///c+gOunp6Rg+fHiVnzV37lzT/QvDyly4cAGffvop4uPj0bx5c8ycORMtW7bUvb9q1SosX74cu3fvNrjOvf7973+jtLQUH330kVnvpT5LT0/Hhx9+iNjYWPj5+WHKlCno1auX7v1Dhw7hzTffxM8//4ymTZsaVAco3534008/xeHDh9GoUSM88sgjeOGFF2BnZ2fR+6svioqK8Nlnn2Hfvn1wdnbG6NGj9SYr37x5E8OGDcP777+P/v37G1QHAK5du4ZFixbh8uXLcHJyQmRkJKZMmWKzT5G1Wi2++eYbbNq0CUIIDB48GJMnT9b7vhs0aBBGjBiBCRMmAABmzZqFgwcPVmrrhx9+QGhoqMHt1gUTICIiIrI5nANERERENocJEBEREdkcJkBERERkc5gAERERkc1hAkREREQ2hwkQERER2RwmQERERGRzmAARkdncuHEDGzZskDqMWklNTcXatWulDoOIzIwJEBHVSVJSErZt24Zt27YhLi5O771Dhw7hxRdflCgy45w6dQrPP/+81GEQkZnZSx0AEVmntLQ0TJo0CX/99RciIyPh5OSEuLg4NGrUCEuXLkW7du2kDpGIqFpMgIio1goLC/HQQw/Bz88PiYmJ8Pb21r138uRJFBQU6F2v1Wpx7tw53LhxA23btkVISIjuvdu3b+OPP/4AACiVSoSHh6Nt27Z69W/cuIGTJ09i6NCh1bZjyDUVUlNTceLECXh4eKBz585wc3OrdR/cr427Yzly5AhSUlIwaNAgXLp0CSqVCh07dsShQ4dQUlKCIUOGAADy8/Nx6NAhqFQqdOvWDf7+/nqft3HjRnTs2BF2dnY4efIkAgMDdSeUE1HtMQEiolpbunQprl+/jq1bt+olPwDQpUsXvdcqlQpRUVFQqVRwdnbGvn37sHTpUowdOxZAeQL022+/AQCKi4tx5MgRPPjgg/jtt9+gUCgA/D2U1rVr12rbMeQaoPzg3IULFyIyMhIFBQW4cuUK1qxZgwEDBhh8/zW1URFLly5doFKpEBwcjL59+2LZsmW6JCckJAQtWrTAkCFDsHfvXjz99NMICQmBh4cHjh49io8//hivvvqq7jNffvlltG/fHleuXEGnTp3wxBNPMAEiqguTnStPRDbj0UcfFQ8++GCN161Zs0YAEEuWLNGVffjhh6JJkybV1snLyxMtW7bUq2NIO4Zcs379euHv7y+SkpJ0ZUuWLBFNmjQRKpVKCCHE5s2bhVKprDY+Q9qoiGXBggV6dV9++WUhl8vF0aNHdWUlJSUiJCRE/POf/9SV/fjjj0KhUIi4uDhdmZ+fn2jTpo3Izc2tNjYiMhwnQRNRraWnpyMoKMigaxUKBSZNmqR73b9/f6SmpuoNk2m1Whw/fhwbNmzA1q1bERQUhGPHjtW6nZquWbFiBdq2bYsjR45g7dq1+OWXX+Dg4IDU1FRcvnzZoPsxtA2ZTKb3BKdC9+7d0a1bN93rI0eOICEhAW+99ZaubPTo0WjatCnWr1+vV3f8+PFwd3c3KE4iuj8OgRFRrbm5uSErK8uga93d3WFnZ6d7rVQqAQAlJSVwdXVFfHw8Bg4cCI1Gg4iICLi5ueHGjRtwdHSsVTuGXJOQkAAhBNatW6fX9siRIyGTyQy6H0Pb8PT0rHQPABAQEKD3OjExEa6urvD19dUrb968ORITE+9bl4iMxwSIiGqtW7duWLFiBQoLC+Hi4lKntubNm4eWLVti69aturIxY8YgJyenjlFW5u7ujpYtW2L58uVmb6O6hOrech8fHxQWFkKlUukSNgDIzs6Gj4+PQW0SUe1xCIyIam3y5MkoLi7Ge++9V+k9jUaD9PR0g9tKT09Hq1atdK/z8vKwc+dOk8R5r0cffRTr169HZmamXnlKSopF27hbly5d4OjoqJsIDgBxcXE4c+YMevfubVSbRFQzPgEiolpr3rw5fvrpJ4wePRpnz57FkCFDoFQqcfXqVWzYsAEff/wxnnjiCYPaevLJJzFjxgz4+vrC3d0d//vf/1BaWmqWuKdPn46tW7eia9eueOWVV9CoUSOcPHkShw8fRmxsrMXauJufnx/efvttTJo0CVeuXIGHhwc+//xzPP7444iOjq51e0RkGCZARGSUJ554AtevX8eaNWsQExMDmUyG8PBw/PHHHwgODgYABAcH46mnntKr5+npiZEjR+qGe1566SV4enpix44dkMvleOedd1BQUICMjAxdHUPaMeSaiqXxa9aswYEDB2BnZ4fu3btj0aJFujpNmzbFM888U+19G9JGVbEAQNeuXZGfn1+p/K233kKHDh2wefNmxMfH4+2339Zbug+UJ4pV7WlERMaRCSGE1EEQERERWRLnABEREZHNYQJERERENocJEBEREdkcJkBERERkc5gAERERkc1hAkREREQ2hwkQERER2RwmQERERGRzmAARERGRzWECRERERDaHCRARERHZHCZAREREZHP+H4CQgopmW5SaAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 52.11s\n" + ] + } + ], + "source": [ + "plot_errors(FIVE_QUBIT_PERFECT_CODE, \n", + " num_points=11, \n", + " num_experiments=200,\n", + " max_p=0.1,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ef091692-d7a4-439f-ad02-8ec90b54f608", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
                                                     ┌──┐   ┌──┐   ┌──┐   ┌──┐                                                                                                                                                                                                                                                                    ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐                               ┌────────┐   ┌────────┐\n",
+       "aux_1: ──────────────────────────────────────────────────────────────X──────×────Rx(0.698π)───Ry(1.35π)───Rz(1.32π)───────────@───────────────────@───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────X────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────X(conditions=[m0 & m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m0 & m1 & m6 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────X^-1────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                     │      │                                                 │                   │                                                                                                                           │                                                                                                                                ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    │      │\n",
+       "aux_2: ────────────────────────────────────────────────X──────×──────┼──────┼────@────────────────────────────────────────────┼───────────────────┼───@───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───X────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m1 & m6 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────@───────────×────────X^-1────────────────────────────────────────────────────────────────\n",
+       "                                                       │      │      │      │    │                                            │                   │   │                                                                                                                       │   │                                                                                                                            ║                                                          ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ║                                                         ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          │      │      │           │        │\n",
+       "aux_3: ────────────────────────────────────────────────┼──────┼──────┼─────X┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────@───────────────────────────────────────────────────────────────────────────────────────────────────┼───┼───X───────────────────────────X────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m2 & m6 & m7 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m6 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────X^-1───┼──────┼──────┼───────────┼────────┼───────────────────────────────────────────────────────────────────\n",
+       "                                                       │      │      │     ││    │                                            │                   │   │                   │                                                                                                   │   │   │                           │                                                                                            ║                                                          ║                                                           ║                                                                                                                                                                                                                                                                                                                                                                                                                                     ║                                                         ║                                                          ║                                                                                                                                                                                                                                                                                                                                                                                                                             ║                                                                                                                          │      │      │      │           │        │\n",
+       "aux_4: ────────────────────────────────────────────────┼──────┼─────X┼─────@┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────┼───@───────────────────@───────────────────────────────────────────────────────────────────────────┼───┼───┼───X───────────────────────┼───X────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m2 & m3 & ~m0 & ~m1 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m2 & m3 & m6 & m7 & ~m0 & ~m1 & ~m4 & ~m5])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@──────┼──────┼──────┼───────────┼────────┼───X^-1────────────────────────────────────────────────────────────\n",
+       "                                                       │      │     ││      │    │                                            │                   │   │                   │   │                   │                                                                           │   │   │   │                       │   │                                                                                        ║                                                          ║                                                           ║                                                           ║                                                                                                                                                                                                                                                                                                                                                                         ║                                                         ║                                                          ║                                                         ║                                                                                                                                                                                                                                                                                                                                                                   ║                                                                                                                                 │      │      │           │        │   │\n",
+       "aux_5: ───────────────────────────────────────────────@┼─────×┼─────@┼─────@┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────────────────────────────────────────────────────────┼───┼───┼───┼───X───────────────────┼───┼───X────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────Y(conditions=[m3 & m6 & m7 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────┼───────@───┼────────┼───@───────×──────@────────────────────────────────────────────────\n",
+       "                                                      ││     ││      │     ││    │                                            │                   │   │                   │   │                   │   │                                                                       │   │   │   │   │                   │   │   │                                                                                    ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                                                                                                                                                                                                                                                              ║                                                         ║                                                          ║                                                         ║                                                        ║                                                                                                                                                                                                                                                                                                          ║                                                                                                                                 │      │      │       │   │        │           │      │\n",
+       "aux_6: ──────────────────────────────────────────×────┼@─────┼×──────@─────┼×────┼────────────────────────────────────×───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────@───────────────────────────────────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───X────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m4 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Z(conditions=[m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])────×──────×^-1───@──────┼───────┼───×^-1─────@───────────┼──────┼──────×─────────────────────────────────────────\n",
+       "                                                 │    │      │             │     │                                    │       │                   │   │                   │   │                   │   │                   │                                                   │   │   │   │   │                   │   │   │   │                                                                                ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                                                                                                                                                                                                                  ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                                                                                                                                                                                                                ║                                                          ║                                                               │                    │       │                        │      │      │\n",
+       "aux_7: ────H────────────@────────────H───×───────┼────┼──────×─────────────┼─────┼────────────────────────X───────────┼───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────@───────────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───┼───X────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m4 & m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m6 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m4 & m5 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m6])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────X^-1──────────┼───────┼────────────────────────×^-1───┼──────┼─────────────×──────H^-1───@──────H^-1───\n",
+       "                        │                │       │    │                    │     │                        │           │       │                   │   │                   │   │                   │   │                   │   │                   │                           │   │   │   │   │                   │   │   │   │   │                                                                            ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                                                                                                                                                      ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                                                                                                                                                     ║                                                          ║                                                               │      │             │       │                               │      │             │             │\n",
+       "aux_8: ────H────────────X────────────────×───H───×────X──────@─────────────┼─────┼────────────X───────────┼───────────┼───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───┼───┼───X────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6 & ~m7])────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m5 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6])─────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────┼──────X^-1───┼───────┼────────────@──────────────────X^-1───×^-1───H^-1───×^-1──────────X^-1───H^-1───\n",
+       "                                                             │             │     │            │           │           │       │                   │   │                   │   │                   │   │                   │   │                   │   │                       │   │   │   │   │                   │   │   │   │   │   │                                                                        ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                                                                           ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                                                                                           ║                                                          ║                                                               │      │      │      │       │            │\n",
+       "aux_9: ────H─────────────────────────────────────────────────┼─────────────┼─────┼────────────┼───────────┼───────────┼───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───@───@───@───@───H───M───R───H───@───@───@───@───@───@───H───M────R───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────┼──────┼──────┼───────┼────────────┼───────────────────────────────────────────────────────────────────\n",
+       "                                                             │             │     │            │           │           │   │           ║                       ║                       ║                       ║                       ║                       ║           │                           ║                                       ║                                                                ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                                                                           ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                                                                                           ║                                                          ║                                                               │      │      │      │       │            │\n",
+       "q_init: ───Ry(0.499π)───Rz(0.059π)───────────────────────────X─────────────X─────X────────────@───────────@───────────×───@───────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────X───────────────────────────╫───────────────────────────────────────╫────X(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────────────Y(conditions=[m0 & m6 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────Z(conditions=[m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────×^-1───@──────@──────X^-1────X^-1─────────X^-1────────────────────────────────────────────────────────────────\n",
+       "                                                                                                                                      ║                       ║                       ║                       ║                       ║                       ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m0: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                              ║                       ║                       ║                       ║                       ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m1: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                      ║                       ║                       ║                       ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m2: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                              ║                       ║                       ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m3: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                      ║                       ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m4: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                              ║                                       ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m5: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                                                                      ║                                       ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m6: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                                                                                                              ║    ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                           ║                                                           ║                                                          ║                                                                ║                                                          ║                                                         ║                                                          ║                                                         ║                                                        ║                                                         ║                                                          ║                                                         ║                                                               ║                                                           ║                                                          ║\n",
+       "m7: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                     └──┘   └──┘   └──┘   └──┘                                                                                                                                                                                                                                                                    └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘                               └────────┘   └────────┘
" + ], + "text/plain": [ + " ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌────────┐ ┌────────┐\n", + "aux_1: ──────────────────────────────────────────────────────────────X──────×────Rx(0.698π)───Ry(1.35π)───Rz(1.32π)───────────@───────────────────@───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────X────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────X(conditions=[m0 & m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m0 & m1 & m6 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────X^-1────────────────────────────────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ ║ ║ │ │\n", + "aux_2: ────────────────────────────────────────────────X──────×──────┼──────┼────@────────────────────────────────────────────┼───────────────────┼───@───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───X────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m1 & m6 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────@───────────×────────X^-1────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ │ │ │ │ │\n", + "aux_3: ────────────────────────────────────────────────┼──────┼──────┼─────X┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────@───────────────────────────────────────────────────────────────────────────────────────────────────┼───┼───X───────────────────────────X────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m2 & m6 & m7 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m6 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────X^-1───┼──────┼──────┼───────────┼────────┼───────────────────────────────────────────────────────────────────\n", + " │ │ │ ││ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_4: ────────────────────────────────────────────────┼──────┼─────X┼─────@┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────┼───@───────────────────@───────────────────────────────────────────────────────────────────────────┼───┼───┼───X───────────────────────┼───X────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m2 & m3 & ~m0 & ~m1 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m2 & m3 & m6 & m7 & ~m0 & ~m1 & ~m4 & ~m5])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@──────┼──────┼──────┼───────────┼────────┼───X^-1────────────────────────────────────────────────────────────\n", + " │ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_5: ───────────────────────────────────────────────@┼─────×┼─────@┼─────@┼────┼────────────────────────────────────────────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────────────────────────────────────────────────────────┼───┼───┼───┼───X───────────────────┼───┼───X────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────Y(conditions=[m3 & m6 & m7 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────┼───────@───┼────────┼───@───────×──────@────────────────────────────────────────────────\n", + " ││ ││ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │\n", + "aux_6: ──────────────────────────────────────────×────┼@─────┼×──────@─────┼×────┼────────────────────────────────────×───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────@───────────────────────────────────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───X────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m4 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Z(conditions=[m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])────×──────×^-1───@──────┼───────┼───×^-1─────@───────────┼──────┼──────×─────────────────────────────────────────\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_7: ────H────────────@────────────H───×───────┼────┼──────×─────────────┼─────┼────────────────────────X───────────┼───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────@───────────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───┼───X────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m4 & m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m6 & ~m7])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m4 & m5 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m6])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────X^-1──────────┼───────┼────────────────────────×^-1───┼──────┼─────────────×──────H^-1───@──────H^-1───\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │\n", + "aux_8: ────H────────────X────────────────×───H───×────X──────@─────────────┼─────┼────────────X───────────┼───────────┼───────┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───┼───────────────────┼───@───────────────────────┼───┼───┼───┼───┼───────────────────┼───┼───┼───┼───┼───X────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6 & ~m7])────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Y(conditions=[m5 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6])─────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────┼──────X^-1───┼───────┼────────────@──────────────────X^-1───×^-1───H^-1───×^-1──────────X^-1───H^-1───\n", + " │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_9: ────H─────────────────────────────────────────────────┼─────────────┼─────┼────────────┼───────────┼───────────┼───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───@───@───@───@───H───M───R───H───@───@───@───@───@───@───H───M────R───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────┼──────┼──────┼──────┼───────┼────────────┼───────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "q_init: ───Ry(0.499π)───Rz(0.059π)───────────────────────────X─────────────X─────X────────────@───────────@───────────×───@───────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────────────────╫───────────X───────────────────────────╫───────────────────────────────────────╫────X(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────────────Y(conditions=[m0 & m6 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────Z(conditions=[m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])╫──────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────×^-1───@──────@──────X^-1────X^-1─────────X^-1────────────────────────────────────────────────────────────────\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m0: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m1: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m2: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m3: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m4: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m5: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════════════╬═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m6: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════════════╬════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m7: ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " └──┘ └──┘ └──┘ └──┘ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └────────┘ └────────┘" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data={}\n", + "assert test_protocol_once(SHOR_CODE, ArbitraryErrorChannel(0.05), output=data)\n", + "data['circuit']" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "16dcef24-557f-4832-bae9-2b57c6e58ee1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 81.96s\n" + ] + } + ], + "source": [ + "plot_errors(SHOR_CODE, \n", + " num_points=11, \n", + " num_experiments=200,\n", + " max_p=0.1,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p))" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/stabilizer_codes.py b/error_correction/stabilizer_codes.py index 7e18823..d9f2885 100644 --- a/error_correction/stabilizer_codes.py +++ b/error_correction/stabilizer_codes.py @@ -1,74 +1,235 @@ -import cirq -from cirq import Circuit, Gate, Qid, PauliString, Operation +import itertools -from sympy import Symbol +import cirq +import numpy as np +import sympy +from cirq import Circuit, PauliString, Qid from .protocols import QecProtocol def _verify_clifford_circuit_is_identity(ct: Circuit): - pass - # TODO: implement efficiently. + operations = list(ct.all_operations()) + if not operations: + return + + qubits = sorted(ct.all_qubits()) + tableau = cirq.CliffordGate.from_op_list(operations, qubits).clifford_tableau + identity = cirq.CliffordTableau(len(qubits)) + if not ( + np.array_equal(tableau.xs, identity.xs) + and np.array_equal(tableau.zs, identity.zs) + and np.array_equal(tableau.rs, identity.rs) + ): + raise ValueError("Circuit is not the identity Clifford operation") + + +def _gf2_rref(matrix: np.ndarray) -> tuple[np.ndarray, list[int]]: + matrix = matrix.copy().astype(np.uint8) + pivots = [] + row = 0 + for column in range(matrix.shape[1]): + pivot_rows = np.flatnonzero(matrix[row:, column]) + if not len(pivot_rows): + continue + pivot = row + int(pivot_rows[0]) + matrix[[row, pivot]] = matrix[[pivot, row]] + for other in range(matrix.shape[0]): + if other != row and matrix[other, column]: + matrix[other] ^= matrix[row] + pivots.append(column) + row += 1 + if row == matrix.shape[0]: + break + return matrix, pivots + + +def _gf2_solve(matrix: np.ndarray, result: np.ndarray) -> np.ndarray: + augmented = np.column_stack((matrix, result)) + reduced, pivots = _gf2_rref(augmented) + coefficient_columns = matrix.shape[1] + if any( + not reduced[row, :coefficient_columns].any() + and reduced[row, coefficient_columns] + for row in range(reduced.shape[0]) + ): + raise ValueError("Binary linear system has no solution") + + solution = np.zeros(coefficient_columns, dtype=np.uint8) + for row, pivot in enumerate(pivots): + if pivot < coefficient_columns: + solution[pivot] = reduced[row, coefficient_columns] + return solution + + +def _gf2_null_space(matrix: np.ndarray) -> list[np.ndarray]: + reduced, pivots = _gf2_rref(matrix) + free_columns = [i for i in range(matrix.shape[1]) if i not in pivots] + basis = [] + for free in free_columns: + vector = np.zeros(matrix.shape[1], dtype=np.uint8) + vector[free] = 1 + for row, pivot in enumerate(pivots): + vector[pivot] = reduced[row, free] + basis.append(vector) + return basis + + +def _symplectic_product(left: np.ndarray, right: np.ndarray) -> int: + n = len(left) // 2 + return int((left[:n] @ right[n:] + left[n:] @ right[:n]) % 2) class StabilizerSet: def __init__(self, stabilizers: list[str]): + if not stabilizers: + raise ValueError("At least one stabilizer is required") + self.n_st = len(stabilizers) self.n = len(stabilizers[0]) - for st in stabilizers: - assert len(st) == self.n - for i in range(self.n): - assert st[i] in ["I", "X", "Z"] - - # Fake qubits on which we'll apply stabilizers before we know real qubits. - self.model_qubits = cirq.LineRange(self.n) - - # Convert stabilizers to Pauli string. - self.stabilizers: list[PauliString] = [] - for st in stabilizers: - ps: list[cirq.Operation] = [] - for i in range(self.n): - if stabilizers[i] == "X": - ps.append(cirq.X(self.model_qubits[i])) - elif stabilizers[i] == "Z": - ps.append(cirq.Z(self.model_qubits[i])) - self.stabilizers.append(PauliString(ps)) - - self.encoding_circuit: list[cirq.Operation] = [] - # TODO: pre-compute the circuit that encodes the state. - # First we need to represent all n-k stabilizers as 2n-bit vectors, - # put them in matrix and append all-X and all-Z operators. - # Then, perform the symplectic Gaussian elimination to decompose this - # into sequence of H, S and CNOT - - # Validate the encoding circuit. - # Must be U Z_i U* = S_i - # Equivalent to S_i U* Z_i U = I + if self.n_st > self.n: + raise ValueError("There cannot be more stabilizers than qubits") + + normalized = [st.upper() for st in stabilizers] + for stabilizer in normalized: + if len(stabilizer) != self.n: + raise ValueError("All stabilizers must have the same length") + if any(pauli not in "IXYZ" for pauli in stabilizer): + raise ValueError("Stabilizers may contain only I, X, Y, and Z") + + self.model_qubits = list(cirq.LineQubit.range(self.n)) + self.binary_stabilizers = np.array( + [self._to_binary(stabilizer) for stabilizer in normalized], + dtype=np.uint8, + ) + self._validate_generators() + + self.stabilizers = [ + PauliString( + { + self.model_qubits[i]: getattr(cirq, pauli) + for i, pauli in enumerate(stabilizer) + if pauli != "I" + } + ) + for stabilizer in normalized + ] + self.encoding_circuit = self._prepare_encoding_circuit() + self._validate_encoding_circuit() + + def _to_binary(self, stabilizer: str) -> np.ndarray: + vector = np.zeros(2 * self.n, dtype=np.uint8) + for i, pauli in enumerate(stabilizer): + vector[i] = pauli in "XY" + vector[self.n + i] = pauli in "ZY" + return vector + + def _validate_generators(self): + _, pivots = _gf2_rref(self.binary_stabilizers) + if len(pivots) != self.n_st: + raise ValueError("Stabilizer generators must be independent") for i in range(self.n_st): - ct = [self.stabilizers[i]] - self.apply_decoding_circuit(ct, self.model_qubits) - ct += cirq.Z() - self.apply_encoding_circuit(ct, self.model_qubits) - _verify_clifford_circuit_is_identity(ct) - - def get_stabilizers(self, qubits: list[Qid]): - assert len(qubits) == self.n - qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} + for j in range(i): + if _symplectic_product( + self.binary_stabilizers[i], self.binary_stabilizers[j] + ): + raise ValueError("Stabilizer generators must commute") + + def _prepare_encoding_circuit(self) -> list[cirq.Operation]: + stabilizers = self.binary_stabilizers + dual_constraints = np.hstack( + (stabilizers[:, self.n :], stabilizers[:, : self.n]) + ) + duals = [ + _gf2_solve( + dual_constraints, + np.eye(self.n_st, dtype=np.uint8)[i], + ) + for i in range(self.n_st) + ] + + for i in range(self.n_st): + for j in range(i): + if _symplectic_product(duals[i], duals[j]): + duals[i] ^= stabilizers[j] + + complement_constraints = [] + for vector in itertools.chain(stabilizers, duals): + complement_constraints.append( + np.concatenate((vector[self.n :], vector[: self.n])) + ) + complement = _gf2_null_space(np.array(complement_constraints)) + + logical_xs = [] + logical_zs = [] + while complement: + logical_x = complement.pop(0) + partner = next( + ( + i + for i, vector in enumerate(complement) + if _symplectic_product(logical_x, vector) + ), + None, + ) + if partner is None: + raise ValueError("Could not complete the stabilizer symplectic basis") + logical_z = complement.pop(partner) + logical_xs.append(logical_x) + logical_zs.append(logical_z) + complement = [ + vector + ^ (_symplectic_product(vector, logical_z) * logical_x) + ^ (_symplectic_product(vector, logical_x) * logical_z) + for vector in complement + ] + + k = self.n - self.n_st + if len(logical_xs) != k: + raise ValueError("Stabilizers do not define the expected code space") + + x_images = logical_xs + duals + z_images = logical_zs + list(stabilizers) + images = np.array(x_images + z_images, dtype=np.uint8) + tableau = cirq.CliffordTableau( + self.n, + rs=np.zeros(2 * self.n, dtype=bool), + xs=images[:, : self.n].astype(bool), + zs=images[:, self.n :].astype(bool), + ) + return cirq.decompose_clifford_tableau_to_operations(self.model_qubits, tableau) + + def _validate_encoding_circuit(self): + k = self.n - self.n_st + for i, stabilizer in enumerate(self.stabilizers): + circuit = Circuit(stabilizer) + self.apply_decoding_circuit(circuit, self.model_qubits) + circuit.append(cirq.Z(self.model_qubits[k + i])) + self.apply_encoding_circuit(circuit, self.model_qubits) + _verify_clifford_circuit_is_identity(circuit) + + def get_stabilizers(self, qubits: list[Qid]) -> list[PauliString]: + if len(qubits) != self.n: + raise ValueError(f"Expected {self.n} qubits, got {len(qubits)}") + qubit_map = dict(zip(self.model_qubits, qubits)) return [st.transform_qubits(qubit_map) for st in self.stabilizers] def apply_encoding_circuit(self, ct: Circuit, qubits: list[Qid]): - """Applies U (decomposed into H/S/CNOT).""" - assert len(qubits) == self.n - qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} - for op in self.encoding_circuit: - ct += op.transform_qubits(qubit_map) + """Applies the encoding Clifford U.""" + if len(qubits) != self.n: + raise ValueError(f"Expected {self.n} qubits, got {len(qubits)}") + qubit_map = dict(zip(self.model_qubits, qubits)) + ct.append(op.transform_qubits(qubit_map) for op in self.encoding_circuit) def apply_decoding_circuit(self, ct: Circuit, qubits: list[Qid]): - """Applies U* (decomposed into H/S*/CNOT).""" - assert len(qubits) == self.n - qubit_map = {self.model_qubits[i]: qubits[i] for i in range(self.n)} - for op in self.encoding_circuit[::-1]: - ct += (op**-1).transform_qubits(qubit_map) + """Applies the inverse encoding Clifford U*.""" + if len(qubits) != self.n: + raise ValueError(f"Expected {self.n} qubits, got {len(qubits)}") + qubit_map = dict(zip(self.model_qubits, qubits)) + ct.append( + (op**-1).transform_qubits(qubit_map) + for op in reversed(self.encoding_circuit) + ) class StabilizerCode(QecProtocol): @@ -80,80 +241,112 @@ def __init__( stabilizers: list[str], name: str | None = None, ): + if not 0 < logical_qubits < physical_qubits: + raise ValueError("Expected 0 < logical_qubits < physical_qubits") + if distance < 1: + raise ValueError("Distance must be positive") + self.n = physical_qubits self.k = logical_qubits self.d = distance - self.n_st = self.n - self.k # Number of stablizers + self.n_st = self.n - self.k + self.name = name or f"{self.signature()} stabilizer code" self.stabilizers = StabilizerSet(stabilizers) - if self.stabilizers != self.n_st: - raise ValueError("Wrong number of stabilizers") + if self.stabilizers.n_st != self.n_st: + raise ValueError(f"Expected {self.n_st} stabilizers") if self.stabilizers.n != self.n: - raise ValueError(f"Wrong length of the stabilizer, must be {self.n}") + raise ValueError(f"Stabilizers must act on {self.n} qubits") self.meas_key_counter = 0 - - Operation - self.encoding_circuit: list[tuple[Gate, int]] = [] + self.encoding_circuit = self.stabilizers.encoding_circuit + self.syndrome_corrections = self._prepare_syndrome_corrections() def _prepare_encoding_circuit(self): - pass + self.encoding_circuit = self.stabilizers._prepare_encoding_circuit() + + def _prepare_syndrome_corrections(self) -> dict[tuple[int, ...], str]: + corrections = {} + max_weight = (self.d - 1) // 2 + for weight in range(1, max_weight + 1): + for locations in itertools.combinations(range(self.n), weight): + for paulis in itertools.product("XYZ", repeat=weight): + error = ["I"] * self.n + for location, pauli in zip(locations, paulis): + error[location] = pauli + error_string = "".join(error) + error_vector = self.stabilizers._to_binary(error_string) + syndrome = tuple( + _symplectic_product(error_vector, stabilizer) + for stabilizer in self.stabilizers.binary_stabilizers + ) + if any(syndrome): + corrections.setdefault(syndrome, error_string) + return corrections def signature(self): return f"[[{self.n},{self.k},{self.d}]]" - def _allocate_qubits(self, circuit, num_qubits): - n0 = len(circuit.all_qubits()) - return [cirq.NamedQubit(f"aux_{n0+i}") for i in range(num_qubits)] + def _allocate_qubits(self, circuit: Circuit, num_qubits: int) -> list[Qid]: + existing = circuit.all_qubits() + result = [] + index = len(existing) + while len(result) < num_qubits: + qubit = cirq.NamedQubit(f"aux_{index}") + if qubit not in existing: + result.append(qubit) + index += 1 + return result def encode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: - assert len(qubits) == self.k + if len(qubits) != self.k: + raise ValueError(f"Expected {self.k} logical qubits, got {len(qubits)}") - # Create n-k additional qubits. aux = self._allocate_qubits(ct, self.n_st) - - # Apply the encoding circuit. - self.stabilizers.apply_encoding_circuit(ct, qubits + aux) - - return qubits + aux + physical_qubits = qubits + aux + self.stabilizers.apply_encoding_circuit(ct, physical_qubits) + return physical_qubits def _measure_stabilizer( self, ct: Circuit, stabilizer: PauliString, anc: Qid - ) -> Symbol: - """Adds a circuit to measure stabilizer using given ancilla. - - Returns measurment result as symbol. - Resets the ancilla. - """ - - # TODO: apply all controlled gates from qubits to anc so that after - # measurment anc in computational basis we get stabilizer measurment. + ) -> sympy.Symbol: + """Measure a Pauli stabilizer with an ancilla and reset the ancilla.""" + ct.append(cirq.H(anc)) + for qubit, pauli in stabilizer.items(): + ct.append(pauli.on(qubit).controlled_by(anc)) + ct.append(cirq.H(anc)) key = f"m{self.meas_key_counter}" self.meas_key_counter += 1 - ct += cirq.measure(anc, key=key) - ct += cirq.reset(anc) - return Symbol(key) + ct.append(cirq.measure(anc, key=key)) + ct.append(cirq.reset(anc)) + return sympy.Symbol(key) def decode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: - assert len(qubits) == self.n + if len(qubits) != self.n: + raise ValueError(f"Expected {self.n} physical qubits, got {len(qubits)}") anc = self._allocate_qubits(ct, 1)[0] + syndrome_symbols = [ + self._measure_stabilizer(ct, stabilizer, anc) + for stabilizer in self.stabilizers.get_stabilizers(qubits) + ] + + for syndrome, correction in self.syndrome_corrections.items(): + condition = sympy.And( + *( + symbol if bit else sympy.Not(symbol) + for symbol, bit in zip(syndrome_symbols, syndrome) + ) + ) + for qubit, pauli in zip(qubits, correction): + if pauli != "I": + ct.append( + getattr(cirq, pauli)(qubit).with_classical_controls(condition) + ) - # Syndrome measurments. - syndrome = [] - for i in range(self.n): - st = self.stabilizers.get_stabilizer_on_qubits(i, qubits) - result = self._measure_stabilizer(ct, st, anc) - syndrome.append(result) - - # TODO: add code to apply error correction based on symbolic syndromes. - # This will use some controlled X and Z gates. - - # Decode. self.stabilizers.apply_decoding_circuit(ct, qubits) - - return qubits[0 : self.k] + return qubits[: self.k] # https://errorcorrectionzoo.org/c/stab_5_1_3 @@ -163,3 +356,19 @@ def decode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: 3, ["XZZXI", "IXZZX", "XIXZZ", "ZXIXZ"], ) + +SHOR_CODE = StabilizerCode( + 9, + 1, + 3, + [ + "ZZIIIIIII", + "IZZIIIIII", + "IIIZZIIII", + "IIIIZZIII", + "IIIIIIZZI", + "IIIIIIIZZ", + "XXXXXXIII", + "IIIXXXXXX", + ], +) diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py index 2e7b2b7..59a7150 100644 --- a/error_correction/stabilizer_codes_test.py +++ b/error_correction/stabilizer_codes_test.py @@ -1,6 +1,52 @@ +import cirq +import numpy as np + from error_correction.stabilizer_codes import FIVE_QUBIT_PERFECT_CODE def test_five_qubit_perfect_code(): code = FIVE_QUBIT_PERFECT_CODE assert code.signature() == "[[5,1,3]]" + + +def test_five_qubit_perfect_code_corrects_single_qubit_errors(): + theta = 0.731 + phi = -0.294 + expected_bloch_vector = np.array( + [ + np.sin(theta) * np.cos(phi), + np.sin(theta) * np.sin(phi), + np.cos(theta), + ] + ) + + for qubit_index in range(5): + for pauli in (cirq.X, cirq.Y, cirq.Z): + circuit = cirq.Circuit() + logical_qubit = cirq.NamedQubit("logical") + circuit.append( + [cirq.ry(theta)(logical_qubit), cirq.rz(phi)(logical_qubit)] + ) + encoded_qubits = FIVE_QUBIT_PERFECT_CODE.encode( + circuit, [logical_qubit] + ) + circuit.append(pauli(encoded_qubits[qubit_index])) + decoded_qubit = FIVE_QUBIT_PERFECT_CODE.decode( + circuit, encoded_qubits + )[0] + + result = cirq.DensityMatrixSimulator(seed=1).simulate(circuit) + num_qubits = len(result.qubit_map) + density_matrix = cirq.partial_trace( + result.final_density_matrix.reshape([2] * (2 * num_qubits)), + [result.qubit_map[decoded_qubit]], + ) + actual_bloch_vector = np.array( + [ + np.trace(density_matrix @ cirq.unitary(axis)).real + for axis in (cirq.X, cirq.Y, cirq.Z) + ] + ) + np.testing.assert_allclose( + actual_bloch_vector, expected_bloch_vector, atol=1e-5 + ) From a104c66a579b72548d28d436395c0b911837babb Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 16:23:26 -0700 Subject: [PATCH 5/9] add tests for stabilizer validation --- error_correction/stabilizer_codes.py | 9 ++++++--- error_correction/stabilizer_codes_test.py | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/error_correction/stabilizer_codes.py b/error_correction/stabilizer_codes.py index d9f2885..e73a013 100644 --- a/error_correction/stabilizer_codes.py +++ b/error_correction/stabilizer_codes.py @@ -102,7 +102,7 @@ def __init__(self, stabilizers: list[str]): [self._to_binary(stabilizer) for stabilizer in normalized], dtype=np.uint8, ) - self._validate_generators() + self._validate_generators(normalized) self.stabilizers = [ PauliString( @@ -124,7 +124,7 @@ def _to_binary(self, stabilizer: str) -> np.ndarray: vector[self.n + i] = pauli in "ZY" return vector - def _validate_generators(self): + def _validate_generators(self, stabilizers: list[str]) -> None: _, pivots = _gf2_rref(self.binary_stabilizers) if len(pivots) != self.n_st: raise ValueError("Stabilizer generators must be independent") @@ -133,7 +133,10 @@ def _validate_generators(self): if _symplectic_product( self.binary_stabilizers[i], self.binary_stabilizers[j] ): - raise ValueError("Stabilizer generators must commute") + raise ValueError( + f"Stabilizer generators {stabilizers[j]!r} and " + f"{stabilizers[i]!r} must commute" + ) def _prepare_encoding_circuit(self) -> list[cirq.Operation]: stabilizers = self.binary_stabilizers diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py index 59a7150..45d5733 100644 --- a/error_correction/stabilizer_codes_test.py +++ b/error_correction/stabilizer_codes_test.py @@ -1,7 +1,8 @@ import cirq import numpy as np +import pytest -from error_correction.stabilizer_codes import FIVE_QUBIT_PERFECT_CODE +from error_correction.stabilizer_codes import FIVE_QUBIT_PERFECT_CODE, StabilizerSet def test_five_qubit_perfect_code(): @@ -9,6 +10,22 @@ def test_five_qubit_perfect_code(): assert code.signature() == "[[5,1,3]]" +def test_stabilizer_set_rejects_noncommuting_generators(): + with pytest.raises( + ValueError, + match=r"Stabilizer generators 'XI' and 'ZI' must commute", + ): + StabilizerSet(["XI", "ZI"]) + + +def test_stabilizer_set_rejects_dependent_generators(): + with pytest.raises( + ValueError, + match="Stabilizer generators must be independent", + ): + StabilizerSet(["XX", "XX"]) + + def test_five_qubit_perfect_code_corrects_single_qubit_errors(): theta = 0.731 phi = -0.294 From 18dc050f4c4887a219e0bd18d5ccb6d89cc0de05 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 16:58:12 -0700 Subject: [PATCH 6/9] update notebooks --- error_correction/01_Intro.ipynb | 6 +- error_correction/05_StabilizerCodes.ipynb | 36 +++++ error_correction/06_SteaneCode.ipynb | 162 ++++++++++++++++++++ error_correction/07_SurfaceCode.ipynb | 178 ++++++++++++++++++++++ error_correction/stabilizer_codes.py | 33 ++++ error_correction/stabilizer_codes_test.py | 35 +++-- 6 files changed, 437 insertions(+), 13 deletions(-) create mode 100644 error_correction/06_SteaneCode.ipynb create mode 100644 error_correction/07_SurfaceCode.ipynb diff --git a/error_correction/01_Intro.ipynb b/error_correction/01_Intro.ipynb index 6619014..f7d9720 100644 --- a/error_correction/01_Intro.ipynb +++ b/error_correction/01_Intro.ipynb @@ -11,7 +11,7 @@ "\n", "It is based on material in Chapter 10 of \"Quantum Computation and Quantum Informaton\" by Nielsen and Chuang.\n", "\n", - "**Warning.** Cells with charts will take long time to run.\n", + "It was reworked in 2026: I moved error correction codes and helper code in python files, added stabilizer codes and split notebook into multiple notebooks.\n", "\n", "### The problem\n", "\n", @@ -27,8 +27,8 @@ "source": [ "### The framework\n", "\n", - "There is qubit $| \\psi >$. We allowed to \"encode\" it, by applying certain cirquit which produces one or more qubits.\n", - "Then these qubits are passed (independently) throw faulty channel. Then we allowed to \"decode\" result by applying another circuit to received cubits. It should producr one qubit. Finally, we check whether this is the same qubit as the one we started with. We repeat this many times with different (random) $| \\psi >$ and measure error rate $p_1$. We will change $p_0$ and see how $p_1$ changes.\n", + "There is qubit $\\ket{\\psi}$. We allowed to \"encode\" it, by applying certain cirquit which produces one or more qubits.\n", + "Then these qubits are passed (independently) throw faulty channel. Then we allowed to \"decode\" result by applying another circuit to received cubits. It should producr one qubit. Finally, we check whether this is the same qubit as the one we started with. We repeat this many times with different (random) $\\ket{\\psi}$ and measure error rate $p_1$. We will change $p_0$ and see how $p_1$ changes.\n", "\n", "Let's build this framework and test it with no encoding-decoding. Obviosly, we expect $p_1=p_0$.\n", "\n", diff --git a/error_correction/05_StabilizerCodes.ipynb b/error_correction/05_StabilizerCodes.ipynb index d1c7f47..0b33a44 100644 --- a/error_correction/05_StabilizerCodes.ipynb +++ b/error_correction/05_StabilizerCodes.ipynb @@ -79,6 +79,24 @@ "data['circuit']" ] }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cc3d60ae-eaf4-4b23-9c46-72bcb4907098", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[5,1,3]]\n" + ] + } + ], + "source": [ + "print(FIVE_QUBIT_PERFECT_CODE.signature())" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -209,6 +227,24 @@ "data['circuit']" ] }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0cce655f-1ff0-4c78-8553-e4d140cae957", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9,1,3]]\n" + ] + } + ], + "source": [ + "print(SHOR_CODE.signature())" + ] + }, { "cell_type": "code", "execution_count": 11, diff --git a/error_correction/06_SteaneCode.ipynb b/error_correction/06_SteaneCode.ipynb new file mode 100644 index 0000000..ba90e43 --- /dev/null +++ b/error_correction/06_SteaneCode.ipynb @@ -0,0 +1,162 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9621d8bd-7a73-455b-84df-891d375e76fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
                                            ┌──┐   ┌──┐   ┌───┐   ┌──┐   ┌──┐               ┌──┐                                                                                                                                                                                       ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌────────┐                        ┌────────┐   ┌────────────┐   ┌────────┐   ┌────────┐\n",
+       "aux_1: ────H─────────────────────────────────────────────────@──────@──────@────H───×──────────────────────────────────────────X───────────────────────────────────────────────────────────────────────────────────────────────@────────────────────────────────────────────────────────────────────────────────────────────────────────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m1 & m4 & ~m0 & ~m2 & ~m3 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────H^-1───────────@────────────@────────────────@────────────H^-1───────────────────────────────────────────\n",
+       "                                                             │      │      │        │                                          │                                                                                               │                                                                                                        ║                                                                                                                                                                                                                                                                                                                                              ║                                                                                                                                                                                                                                                                                                                                    ║                                                                                                                                                                                                                                                                                                           │                     │            │                │\n",
+       "aux_2: ────H─────────────────────────────────────────@──────@┼─────H┼─────×┼────────┼────────×─────────────────────────────────┼───X───────────────────────────────X───────────────────────────────────────────────────────────┼───@───────────────────────────────@────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────X(conditions=[m4 & m5 & ~m0 & ~m1 & ~m2 & ~m3])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────Y(conditions=[m1 & m2 & m4 & m5 & ~m0 & ~m3])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m1 & m2 & ~m0 & ~m3 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×───────────┼─────────────×───────┼───H^-1─────┼───@────────────┼────────────@───────────H^-1───────────────────────────────\n",
+       "                                                     │      ││      │     ││        │        │                                 │   │                               │                                                           │   │                               │                                                                    ║                                               ║                                                                                                                                                                                                                                                                                              ║                                              ║                                                                                                                                                                                                                                                                                     ║                                               ║                                                                                                                                                                                                                                               │           │             │       │            │   │            │            │\n",
+       "aux_3: ────H──────────────────────────────────@─────@┼─────H┼┼─────H┼─────×┼────H───×───H────┼X────────────────────────────────┼───┼───────────────────────────────┼───────────────────────────@───────────────────────────────┼───┼───────────────────────────────┼────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m3 & ~m1 & ~m2 & ~m4 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───H^-1────×^-1───H^-1───×^-1────┼───H^-1─────┼───┼───H^-1─────┼───@────────┼───────────@──────H^-1────────────────────────\n",
+       "                                              │     ││      ││      │      │                 ││                                │   │                               │                           │                               │   │                               │                                                                    ║                                               ║                                              ║                                                                                                                                                                                                                                               ║                                              ║                                            ║                                                                                                                                                                                                                                        ║                                               ║                                              ║                                                                                                                                                                                                │                                 │            │   │            │   │        │           │\n",
+       "aux_4: ─────────────────X───────────X───@────@┼─────┼┼──────X┼──────┼──────X────@───────X────┼┼────X───────────────────────────┼───┼───────────────────────────────┼───X───────────────────────┼───@───────────────────────────┼───┼───────────────────────────────┼───@────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────X(conditions=[m3 & m5 & ~m0 & ~m1 & ~m2 & ~m4])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────Y(conditions=[m0 & m2 & m3 & m5 & ~m1 & ~m4])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m0 & m2 & ~m1 & ~m3 & ~m4 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────┼───────────X^-1──────────@───────X^-1─────────┼───X^-1─────────┼───┼────────┼───@───────┼──────@──────X^-1───X^-1──────────\n",
+       "                        │           │   │    ││     ││       │      │           │       │    ││    │                           │   │                               │   │                       │   │                           │   │                               │   │                                                                ║                                               ║                                              ║                                               ║                                                                                                                                                                                               ║                                              ║                                            ║                                              ║                                                                                                                                                                                         ║                                               ║                                              ║                                               ║                                                                                                                                                │           │             │                    │                │   │        │   │       │      │      │      │\n",
+       "aux_5: ────X────────────┼───────────@───┼────X┼─────X┼───────┼──────X─────@─────┼───X───┼────┼┼────┼───X───────────────────────┼───┼───X───────────────────────────┼───┼───────────────────────┼───┼───@───────────────────────┼───┼───@───────────────────────────┼───┼────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & m4 & ~m0 & ~m1 & ~m2 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m1 & m3 & m4 & ~m2 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & m1 & ~m2 & ~m3 & ~m4 & ~m5])───────────────────────────────────────────────────┼───────────┼──────X^-1───┼───────@────────────X^-1─────────────┼───X^-1─────┼───X^-1────┼──────┼──────@──────┼──────X^-1───\n",
+       "           │            │               │     │      │       │            │     │   │   │    ││    │   │                       │   │   │                           │   │                       │   │   │                       │   │   │                           │   │                                                                ║                                               ║                                              ║                                               ║                                              ║                                                                                                                                                ║                                              ║                                            ║                                              ║                                            ║                                                                                                                                            ║                                               ║                                              ║                                               ║                                              ║                                                                                                 │           │      │      │       │                             │            │           │      │             │      │\n",
+       "aux_6: ────@────────────@───────────────X─────X──────X───────X────────────┼─────┼───┼───┼────┼┼────┼───┼───X───────────────────┼───┼───┼───X───────────────────────┼───┼───X───────────────────┼───┼───┼───@───────────────────┼───┼───┼───@───────────────────────┼───┼───@────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & m4 & m5 & ~m0 & ~m1 & ~m2])────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m1 & m2 & m3 & m4 & m5])─────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & m1 & m2 & ~m3 & ~m4 & ~m5])─────┼───────────┼──────┼──────┼───────┼─────────────────────────────X^-1─────────X^-1────────X^-1───X^-1──────────@──────@──────\n",
+       "                                                                          │     │   │   │    ││    │   │   │                   │   │   │   │                       │   │   │                   │   │   │   │                   │   │   │   │                       │   │   │                                                            ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                                                                 ║                                              ║                                            ║                                              ║                                            ║                                            ║                                                                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  │           │      │      │       │\n",
+       "aux_7: ────H──────────────────────────────────────────────────────────────┼─────┼───┼───┼────┼@────@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────┼───────────┼──────┼──────┼───────┼─────────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                          │     │   │   │    │                     ║                               ║           │                   ║                               ║                               ║           │                   ║                                                    ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                                                                 ║                                              ║                                            ║                                              ║                                            ║                                            ║                                                                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  │           │      │      │       │\n",
+       "q_init: ───Ry(0.222π)───Rz(1.54π)─────────────────────────────────────────X─────X───@───@────×─────────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────────────────────────╫───────────────────────────────╫───────────@───────────────────╫────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4])╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────Y(conditions=[m2 & m5 & ~m0 & ~m1 & ~m3 & ~m4])╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5])╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────×^-1────────@──────@──────X^-1────X^-1──────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                                                                   ║                               ║                               ║                               ║                               ║                               ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m0: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                   ║                               ║                               ║                               ║                               ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m1: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                   ║                               ║                               ║                               ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m2: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                   ║                               ║                               ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m3: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                   ║                               ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m4: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                                                   ║    ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║                                                  ║                                              ║                                              ║                                            ║                                              ║                                            ║                                            ║                                               ║                                               ║                                               ║                                              ║                                               ║                                              ║                                              ║\n",
+       "m5: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                            └──┘   └──┘   └───┘   └──┘   └──┘               └──┘                                                                                                                                                                                       └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └────────┘                        └────────┘   └────────────┘   └────────┘   └────────┘
" + ], + "text/plain": [ + " ┌──┐ ┌──┐ ┌───┐ ┌──┐ ┌──┐ ┌──┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌────────┐ ┌────────┐ ┌────────────┐ ┌────────┐ ┌────────┐\n", + "aux_1: ────H─────────────────────────────────────────────────@──────@──────@────H───×──────────────────────────────────────────X───────────────────────────────────────────────────────────────────────────────────────────────@────────────────────────────────────────────────────────────────────────────────────────────────────────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m1 & m4 & ~m0 & ~m2 & ~m3 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────H^-1───────────@────────────@────────────────@────────────H^-1───────────────────────────────────────────\n", + " │ │ │ │ │ │ ║ ║ ║ │ │ │ │\n", + "aux_2: ────H─────────────────────────────────────────@──────@┼─────H┼─────×┼────────┼────────×─────────────────────────────────┼───X───────────────────────────────X───────────────────────────────────────────────────────────┼───@───────────────────────────────@────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────X(conditions=[m4 & m5 & ~m0 & ~m1 & ~m2 & ~m3])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────Y(conditions=[m1 & m2 & m4 & m5 & ~m0 & ~m3])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m1 & m2 & ~m0 & ~m3 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×───────────┼─────────────×───────┼───H^-1─────┼───@────────────┼────────────@───────────H^-1───────────────────────────────\n", + " │ ││ │ ││ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │\n", + "aux_3: ────H──────────────────────────────────@─────@┼─────H┼┼─────H┼─────×┼────H───×───H────┼X────────────────────────────────┼───┼───────────────────────────────┼───────────────────────────@───────────────────────────────┼───┼───────────────────────────────┼────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m3 & ~m1 & ~m2 & ~m4 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼───H^-1────×^-1───H^-1───×^-1────┼───H^-1─────┼───┼───H^-1─────┼───@────────┼───────────@──────H^-1────────────────────────\n", + " │ ││ ││ │ │ ││ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │\n", + "aux_4: ─────────────────X───────────X───@────@┼─────┼┼──────X┼──────┼──────X────@───────X────┼┼────X───────────────────────────┼───┼───────────────────────────────┼───X───────────────────────┼───@───────────────────────────┼───┼───────────────────────────────┼───@────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────X(conditions=[m3 & m5 & ~m0 & ~m1 & ~m2 & ~m4])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────Y(conditions=[m0 & m2 & m3 & m5 & ~m1 & ~m4])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m0 & m2 & ~m1 & ~m3 & ~m4 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────┼───────────X^-1──────────@───────X^-1─────────┼───X^-1─────────┼───┼────────┼───@───────┼──────@──────X^-1───X^-1──────────\n", + " │ │ │ ││ ││ │ │ │ │ ││ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │ │ │ │\n", + "aux_5: ────X────────────┼───────────@───┼────X┼─────X┼───────┼──────X─────@─────┼───X───┼────┼┼────┼───X───────────────────────┼───┼───X───────────────────────────┼───┼───────────────────────┼───┼───@───────────────────────┼───┼───@───────────────────────────┼───┼────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & m4 & ~m0 & ~m1 & ~m2 & ~m5])──────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m1 & m3 & m4 & ~m2 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & m1 & ~m2 & ~m3 & ~m4 & ~m5])───────────────────────────────────────────────────┼───────────┼──────X^-1───┼───────@────────────X^-1─────────────┼───X^-1─────┼───X^-1────┼──────┼──────@──────┼──────X^-1───\n", + " │ │ │ │ │ │ │ │ │ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │ │ │\n", + "aux_6: ────@────────────@───────────────X─────X──────X───────X────────────┼─────┼───┼───┼────┼┼────┼───┼───X───────────────────┼───┼───┼───X───────────────────────┼───┼───X───────────────────┼───┼───┼───@───────────────────┼───┼───┼───@───────────────────────┼───┼───@────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────X(conditions=[m3 & m4 & m5 & ~m0 & ~m1 & ~m2])────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────Y(conditions=[m0 & m1 & m2 & m3 & m4 & m5])─────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────Z(conditions=[m0 & m1 & m2 & ~m3 & ~m4 & ~m5])─────┼───────────┼──────┼──────┼───────┼─────────────────────────────X^-1─────────X^-1────────X^-1───X^-1──────────@──────@──────\n", + " │ │ │ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │\n", + "aux_7: ────H──────────────────────────────────────────────────────────────┼─────┼───┼───┼────┼@────@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────╫───────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────┼───────────┼──────┼──────┼───────┼─────────────────────────────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ ║ ║ │ ║ ║ ║ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │\n", + "q_init: ───Ry(0.222π)───Rz(1.54π)─────────────────────────────────────────X─────X───@───@────×─────────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────────────────────────╫───────────────────────────────╫───────────@───────────────────╫────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4])╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────Y(conditions=[m2 & m5 & ~m0 & ~m1 & ~m3 & ~m4])╫──────────────────────────────────────────────╫────────────────────────────────────────────╫──────────────────────────────────────────────╫────────────────────────────────────────────╫────────────────────────────────────────────╫───────────────────────────────────────────────Z(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5])╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫───────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────╫──────────────────────────────────────────────────×^-1────────@──────@──────X^-1────X^-1──────────────────────────────────────────────────────────────────────────────────────\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m0: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m1: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m2: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m3: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m4: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m5: ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^══════════════════════════════════════════════^════════════════════════════════════════════^════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^═══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════^══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " └──┘ └──┘ └───┘ └──┘ └──┘ └──┘ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └────────┘ └────────┘ └────────────┘ └────────┘ └────────┘" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from error_correction.channels import ArbitraryErrorChannel\n", + "from error_correction.stabilizer_codes import STEANE_CODE\n", + "from error_correction.utils import test_protocol_once, plot_errors\n", + "\n", + "code = STEANE_CODE\n", + "data={}\n", + "assert test_protocol_once(code, ArbitraryErrorChannel(0.05), output=data)\n", + "data['circuit']" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "81c01c67-ad02-4e31-82bf-6d54b58411ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[7,1,3]]\n" + ] + } + ], + "source": [ + "print(STEANE_CODE.signature())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f2176219-dd81-4302-a1a4-5a39dbe83988", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHGCAYAAACcmzRuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZ7VJREFUeJzt3Xd0VNXaBvBnJpk00gvplR4BQ2gJJShNEBUF6QiCiIIKAipiuYj4icq1IFhBUARRQBBp0gUhCb23ACmkElJIz2Qms78/QuYyhsBkMjV5fmu57p19zt7nPTvt5ZxdJEIIASIiIqJGRGrqAIiIiIiMjQkQERERNTpMgIiIiKjRYQJEREREjQ4TICIiImp0mAARERFRo8MEiIiIiBodJkBERETU6FibOgCixuT06dPYt2+f+vPkyZPh4OBw32OWJCMjA2vXrlV/fuqppxAcHHzfY6aUkJCAbdu2YcyYMfDy8rrnuSkpKdi4cSOGDx8OPz+/OpU1dLm5ufj5558xYMAAtG7d2tThEN0TEyAiI/rnn38wY8YMPP/883BwcEBlZaVWx+Lj4xEfH19ruz169ECnTp3ue32FQoE9e/bg0qVLCA8PR//+/esU/7Vr13DixAkUFBQgKCgIMTExsLOz0zhHLpcjOTkZaWlp+P3339G6dWt1knOvY7q6du0aNm/ejJEjR8LHx0enNk6cOIEZM2bgoYceum8CdPHiRcyYMQOdOnVSJzbaljV0mZmZmDFjBjw9PZkAkdljAkRkAu+//36tf6zvduzWrVtITk6uce7OnTtx8eJFrFq16p4JkBACzz//PLZs2YK2bdtiz549GD9+vNYJUHp6OsaNG4fMzEx06NABMpkM+/fvR2lpKRYvXozhw4erzw0NDcUXX3yBv//+G7///rtGO/c6pquzZ89ixowZiIqK0jkBqouQkBBMnz4d/v7+ejmPiEyDCRCRBRgwYAAGDBigUVZZWYmgoCC4urpiyJAh96wvhEBUVBQ++eQT2NjYwMnJqU7XF0JgwYIF6NKli7pMoVCgb9++GDduHB566CE0bdq0Tm1aqtatW+OLL77Q23lEZBpMgIgs1F9//YWMjAy88sorsLe3v+e5UqkUkyZNAgAUFxfX+VoBAQEICAjQKJPJZHjyySdx4MABXLp0yWAJUElJCfbu3YuMjAz4+voiKipKfa2TJ09i8+bNAIDffvtN/Zqwf//+CA8Px82bN7F69WoAgEQigZ2dHVq0aIGYmBhYW9/9119xcTG2bt2KgoICREdHo127dhrHtR3bc7fzvv76a1RUVNz1/MGDByM0NFT9uaCgAPv27UNGRga8vLzQt29fuLm5qY/fOW7J0dER27dvR1paGiZNmnTPsWOFhYXYv38/0tLSEBQUhF69esHR0VHjnLS0NOzfvx+FhYUICQlB7969YWtrW6Otc+fOITY2Fs7Ozhg0aFCt19TmfoiMjbPAiCzUDz/8AKBqsLSpxMfHw9HREQ888IBB2v/nn38QEBCA999/HydOnMBPP/2E6OhoLFu2DEDVH/Ps7GwAVeNPkpOTkZycrE7yKioq1GVJSUk4ePAgRo8ejdatWyM9Pb3G9RISEtCrVy9s3boVGzZsQEREBGbOnKlxTvXYnsTExHvGfrfzUlJS1PFU/7ds2TLMmDEDFy5cUJ+3cuVKBAYGqu/7888/R0hIiDrZA/43bmn//v2IiYnBhg0b8P3336OwsLDWmH788UcEBgZizpw5OHr0KL799ltERkYiLi5Ofc68efMQGhqKpUuX4vDhw5gyZQpatGiB48ePa7Q1a9YstG/fHr///ju2bduGXr164dKlS3e9rjb3Q2R0goiMZvHixQKAyMzMrNOxf8vOzhYymUxERUXVOYaioiIBQIwfP77OdY8fPy4+//xzMX/+fNGvXz8RHh4u9uzZc9dz9+3bJwCI7du31+nYnaKjo0WfPn00ykpLS8Xff/+t/rxx40YBQMTFxWl1D0VFRSI8PFwMGzZMXbZmzRoBQERHR4usrCx1+XfffScAiF9++UVdtn37dgFA/PPPP3Uu+7e9e/cKmUwmoqOjRVlZmRCiqm+kUqmYM2eOUKlU6nNnzZolmjRpIlJTU2vEXP09U1hYKIqLi+96rV27dgmJRCJmzJghKisr1eVZWVni9OnTQggh1q5dKwCIjz/+WH28oKBAdOrUSfj6+qrbrr72d999p9FOt27dBADx888/q8u1vR8iY+MTICILtHLlSigUCqM//SkoKEBycjISEhJw5coV2NraQqlUGux6+fn5UCgUGtewt7dHr169tG5DpVIhLi4OP/zwAxYtWoRly5bB3d0dhw4dqnHuiBEj4O3trf78/PPPo3nz5vj222/rdyN3ceHCBQwZMgRBQUHYtGmTejbdf//7X7i7u+P999+HRCJRn//ee++hrKxM/Uqv2rBhw9SDv52cnNCkSZO7Xu/TTz+Fl5cXFixYAKn0f7/6vb290b59ewDAN998A19fX42nXs7OznjvvfeQmZmJjRs3AgC+//57hIWF4fnnn9doZ9SoUTWuW9f7ITIWjgEiskArVqyAi4sLRowYYdTrPvzww3j44YcBVA2CHj16NAYNGoRTp04Z5DXYjBkzMGXKFDRr1gyPPfYYevXqhb59+8Ld3V2r+qmpqRg0aBDS09Px8MMPw8fHB9bW1igtLVW/OrvTgw8+qPFZIpGgffv2+Pvvv/VxO2o3btzAoEGDIJVKsW3bNo2p98ePH4ebm5s66RJCqP9zdHSs8ZqpOnm5n5MnT6J9+/Z3HctT7fz584iIiKgxPqpDhw4Aqsb8VP9vt27dNBIaoGb/6XI/RMbCBIjIwsTHx+P8+fOYOnWqSRdKlMlkeOONN7B+/Xps2LDBIAnQ5MmT0b17d6xfvx4HDx7EihUrAFQ9VZg6dep967/++uvIysrChQsXNJ7sjB8/HqdPn65xvpWVVY0ya2trqFSqetyFptLSUjz++OPIzMzErl270LJlS43jCoUClZWVuHr1ao26EyZMQGRkpEaZh4eHVtetrKysdeD3/c6pLqtem0qlUtXaV/9W1/shMhYmQEQWZvny5QBMO/i5WvWrFCGEwa7xwAMPqJOr4uJiDB06FNOmTcP48ePRpEkTjdc5/3by5El07dpVI/kBgFOnTt31/EuXLqFnz54aZRcvXkSLFi3qdxO3qVQqjBkzBseOHcPq1atrXAsAwsPDcePGDb1PoQ8PD8e5c+dQWVl51+QFAFq0aIGLFy/WKK8eoF3dDy1atMDly5drnHe3uoa6H6L64hggIgtSWlqKX3/9FV26dLnr64ZqP/zwA3788Uedr/Pv+ufOnYNCodA4RwiBxYsXQyKR4PHHH9f5Wvdy5MgRjc+Ojo6IiIiAEAJyuRwA1FPic3Nza9QPCQnBpUuXNMYQrVmzBikpKXe93s8//4yysjL1523btuHs2bMYN25cve8FAGbOnIk//vgD8+fPv+t4GQB45ZVXkJCQoJ7pdqesrCykpqbqdO2XXnoJaWlpWLRokUZ5eXk5kpKSAFQ9GUtKSsKaNWvUx5VKJRYsWAAnJycMHToUAPDMM8/g/Pnz2Lp1q/q8srIy/PTTT0a7H6L64hMgIguydu1aFBUVaQw+vZu5c+fC3t4ezz77rLrst99+Q2ZmpnodmgsXLqj/Vf7vvZv+Xf+ff/7B008/jZiYGISGhqKgoADbt2/HlStX8O2336rHiOjbG2+8gbKyMnTr1g0+Pj5ISEjAqlWrMGfOHPU4oIiICISEhOCtt97C2bNnYWdnp14H6D//+Q/69u2Lhx56CAMHDsTly5eRkZGB8ePH46uvvqpxvbFjx6J3797o168fbt68iRUrVmDw4MGYMmVKve/l6tWrWLRoEQICAtCkSZMaT0Sq1wEaNmwYPvroI0yZMgXr169HVFQUKisrceHCBZw8eRLr169HYGBgna8/fPhwXLhwAa+//jp27dqF6Oho5OTkYNeuXVi0aBFCQ0MxefJkxMbG4plnnsHOnTsREhKC7du349y5c/j111/Vr9teeOEF7Ny5E0OHDsWzzz4Lb29v7Ny5ExMnTsSBAwc0rmuo+yGqLyZARBZECIFXX3211qcHAFBUVIQbN27UGCNTvU4OAEyfPh0A1J9LSkruWX/KlCkYNmwYtm7dioSEBFhZWWHmzJl49NFH77t3Vn38/fffOH78OA4ePIisrCy0b98eZ8+e1Rg3Y2dnh9jYWKxduxapqalQKpXqdYC6d++OCxcuYMOGDcjNzcWgQYMwZMgQbN++XWO8SqtWrTB9+nQMGjQI/fr1w2+//QZXV1esXbsWjz/+uMZg37ttcaFNmbOzc41+v9OdT55mz56N0aNHY8uWLUhOToarqyvGjRuHNWvWwMbGRiPmuvT/e++9hzFjxmDLli3IyspC69at8cYbb6gXuZRKpVi5ciWmTJmCPXv2oLCwEOPGjcPQoUM1XiNaWVlh48aN2LJlC2JjY2FnZ4fVq1fDwcEB06dPR5s2bTSuq839EBmbRBjy5T0RaViyZAleeeUVvP/++3ByctLY8f1ex+pi8+bNGDVqFBITE3Vanbm+9at3fL969Sq++uorbN++Xb2Nx72OEREZE58AERlRREQEpk+fjtzcXOTm5mrs+H6vY3Uhk8nw/fff67w1RX3rV+/4bm1tjenTpyMkJESrY0RExsQnQERERNTocBYYERERNTpMgIiIiKjRYQJEREREjQ4TICIiImp0OAusFiqVChkZGXBycqqx4R8RERGZJyEEioqK4Ofnd8+tcpgA1SIjI4OrkxIREVmo1NRU9SKfd8MEqBZOTk4AqjrQ2dlZb+0qFArs3LkT/fv3h0wm01u7pIn9bDzsa+NgPxsH+9k4DNnPhYWFCAwMVP8drw0ToFpUv/ZydnbWewLk4OAAZ2dn/nAZEPvZeNjXxsF+Ng72s3EYo5/vN3yFg6CJiIio0WECRERERI0OEyAiIiJqdDgGqB5UKhUqKirqVEehUMDa2hrl5eU6b3ZJ92esfpbJZLCysjJY+0REZBhMgHRUUVGBpKQkqFSqOtUTQsDHxwepqalcX8iAjNnPrq6u8PHx4deTiMiCMAHSgRACmZmZsLKyQmBg4D0XWvo3lUqF4uJiODo61qke1Y0x+lkIgdLSUmRnZwMAfH19DXIdIiLSPyZAOlAqlSgtLYWfnx8cHBzqVLf6tZmdnR0TIAMyVj/b29sDALKzs9G0aVO+DiMishD8C6yD6jElNjY2Jo6EzEF1EqxQKEwcCRERaYsJUD1wzAcB/D4gIrJETIDIrHz11Vf45ZdfTB0GERE1cBwD1IisWLEChw4dqlHu7++PefPmmSCimnbt2oWAgACMHj3a1KEAABYvXoymTZtixIgRpg6FiIj0iAlQI7J//37ExcXh9ddf1yh3d3c3UUQ1vfzyy2jSpImpw1DbsWMHmjdvzgSIiKiBYQLUyPj6+mLSpEl3PXbz5k28/fbbeO6559C1a1cAQFlZGV5//XUMGjQIAwcOxGeffYaQkBA4OTlh3759qKysxDPPPIO2bdtqtJWWloZVq1YhLS0NYWFheOaZZ+Dl5aU+fmc727dvh5+fH1577TVcvnwZbm5uiI6OVp8XHBwMBwcHHDx4EBUVFRg7diwefPBBbNmyBbt374aLiwuee+45BAUFacSQnp6Ob775Bunp6feMwd3dHbt370ZlZSWGDRuGyMhIAFVPzM6cOYPk5GR1n33wwQfw8fGp51eBiKhxO59RiP2ZEjxqwhg4BojUvLy84OjoiJEjR6KwsBAAMHPmTOzcuRMxMTEAgG3btuGVV17B7Nmz4e7ujoyMDHTq1Anx8fHqduLi4hAREYHExES0bNkSJ0+eRHh4OBITE9XnVLczd+5cBAUFoU2bNgCqXoHFxsZqnPfiiy9i4cKF8PLyQnJyMrp27YpRo0bhyy+/REhICE6ePImuXbuiuLhYI4aYmJj7xjBt2jS899578PDwQG5uLqKionDixAkAQLNmzeDm5gZfX19ERUUhKipKPe2diIjqplIl8Ne5LAz/Lg5PfhOPjclSXM8rNVk8fAKkB0IIlCm0225BpVKhrKIS1hVKvaxPYy+zqtMspMuXL9d4AtSzZ0+MHz8eALBgwQLs3bsXU6ZMwYgRI/DDDz/g0KFDGq+lKioqcODAATg6OgKomgU1e/Zs7N+/HwAwceJEvP3225gxY4a6zjPPPIO5c+fi559//l/s9vbYv38/ZDLZPWP28/PD7t27IZVK8corryAgIADXrl3D4cOHIZFIMHXqVDRt2hTbt2/HsGHDAACTJk3CrFmz8Oabb6r7+W4xuLu7Y8+ePer1e65evYqffvoJkZGRiImJQWBgIJo3b17rUzMiIrq3wnIF1h5NxY+xyUjLLwMAWEsleNBdBWHCuJgA6UGZohLh/9lhkmtfeP8RONho/2V0dnZGVFSURlmzZs3U/9/W1ha//PILOnXqhI0bN+K9995D586dNc4fOHCgOvkBgBEjRmDw4MFQKpVISUnBpUuXEBcXh8uXL0MIASEErl27hqKiIo12+vbte9/kBwAeeughdRJjZWWF0NBQ9OzZU5342djYICgoCGlpaQCAa9eu4dKlSzh69CimTJkCALXG8PDDD2ssXtiqVSt1O0REpLuU3BL8GJuMdcfSUCxXAgBcHWQY0zUIIzv548TBvQh2r9tiwvrEBKiRudcYoGrNmzdHSEgILl++fNfBvx4eHhqfPT09UVlZiby8POTk5AAAIiMj4enpqT6nS5cucHJy0qjn6uqqVcz/fu0klUrvWla9QGV1DO3bt4e/v786ebpbDP9ux8rKipvUEhHpSAiB+MQ8LD+UhN0Xb0DcfsTTvKkjJnYPxVMd/GFvY2UWC8cyAdIDe5kVLrz/iFbnqlQqFBUWwcnZSW+vwPTtrbfeQllZGfr06YPx48dj//79Gk9JUlNTNc5PSUmBnZ0dvLy8UFFRAQBo27YtHnvsMb3Hpg1/f38AQJs2bTB8+PB69TMXOSQiuj+5shKbT2di+cEkXMgsVJc/1MoLE7uHomcLT7P7fcoESA8kEonWr6FUKhWUNlZwsLE2y73A9u7di0WLFmHfvn1o0aIF2rdvjw8//BDvvvuu+pytW7fi6tWraN68ORQKBb766isMHjwYEokEAQEB6NWrF95//33ExMTA2dkZAJCbm4vTp0+jd+/eBr+H6hgWLlyIAQMGqJ806RKDu7s78vLyDBQpEZFlu1kkx+rDKVgVn4Kc4qp/ANvJpBgaGYAJ3UPQvKnTfVowHSZAjczdBkHb2dlhyZIlyMvLw7hx4zB79mz06NEDALB8+XI89dRTeOSRR9ClSxcAwAMPPICHH34YUVFRuHDhAoqKivDTTz+p21u1ahUGDx6MVq1aoWfPnsjPz0diYiI+/fRTo93nypUr8cQTT6BNmzb1imHw4MEYO3YsKioq4OjoyGnwREQALmQUYsWhJGw6lYGKShUAwMfZDuO7hWBUl0C4Opj/XplMgBqRiRMnqhObO1UPRE5PT8f8+fMxduxY9bFBgwZh3bp16mnxQNXg5enTp+Po0aNQKpXo37+/xqDogIAAHDt2DPHx8bh69Sr8/PzQtWtXjXNmzZqlMUao2r8XQrzbeW+++Sb8/Pw0yubOnYvmzZtrxLBv3z5cuHABiYmJWscwZswYlJSUqD8PGTIEx44dw+nTp1FSUsJp8ETUaFWqBPZeysbyg0mIS8xVlz8Y6IrneoRiYFsfyKzM781GbZgANSIxMTHq9Xzupl27dmjXrl2N8sGDB9co8/X1xRNPPFFrWxKJBNHR0eoFDf9t4MCBdy3v27fvfc+729iip556qtYYunfvrnUMd4s3PDwc4eHhd22DiKihK5Yrsf5YKlbEJiMlt2rdHiupBAPb+mBij1BEBrmZOELdMAEiIiKiGlLzSvFTbDJ+O5qKotvT2J3trDGqaxDGRYfA39Wyn4gzAaI6qe3VFRERWT4hBI4m52P5wSTsvJAF1e1p7GGeTTChRyiGRvrXae05c9Yw7oKMprZXV0REZLkqlCpsPZuB5QeTcTa9QF3es4UnJvYIRa8WXpBKzWsae30xASIiImqkcovl+OXwdayMT8HNIjkAwNZaiiGR/pjQPRQtvc13Gnt9MQEiIiJqZC5nFWHFoSRsPJkOubJqGntTJ9vb09iD4N7E/Kex1xcToHoQwpTbuJG5UKlUpg6BiOi+VCqBvxOysfxgMg5ezVGXt/N3wXM9QvFoO1/YWFvONPb6MosE6MqVK7hx4wZat26t9QDb+9WprKzE5cuXkZ+fj6CgIAQGBuotXplMBolEgps3b8LLy6tOy3urVCpUVFSgvLzcLFeCbiiM0c9CCFRUVODmzZuQSqWwsWn4/2IiIstTIldiw4k0rDiUjMScqnXOpBJgQFsfTOweio7Bbma3TYUxmDQBKi0txdNPP41Dhw4hLCwMly5dwvz58/Haa6/Vq87x48cxfPhwKBQKBAYG4uzZs+jZsyfWrl2rscierqysrBAQEIC0tDQkJyfXqa4QAmVlZbC3t2+U33DGYsx+dnBwQFBQEBNaIjIr6bfKsDI2GWuOXEdhedU0didba4zsEohx0SEINOFO7ObApAnQ3Llzcf78eVy5cgVNmzbFtm3bMGjQIHTr1g3dunXTuc7LL7+M8PBw/PHHH7CyskJmZibCw8OxZMkSzJ49Wy+xOzo6okWLFnXe0VahUODAgQOIiYlRr8BM+mesfraysoK1tTWTWSIyC0IInLh+C8sPJeGvc1movD2PPcTDARO6h2JoxwA42prFyx+TM2kv/PTTT3jllVfQtGlTAMCjjz6KiIgI/Pjjj7UmQNrUycvLQ+/evdU7mPv6+sLPzw/5+fl6jd/Kykpjl3Rt6yiVStjZ2TEBMiD2MxE1JopKFbadzcTyQ8k4nXpLXd6tmQcmdg9F79ZNG9w09voyWQKUnp6OmzdvIjIyUqM8MjISp06dqledBQsWYNq0afDz80NwcDB27tyJyspKvPzyy7XGI5fLIZfL1Z+r975SKBR1fspzL9Vt6bNNqon9bDzsa+NgPxuHJfbzH6cy8N9dV3CjsOpvmI21FE+098X46CC09qmaxl5ZqURlpSmj1GTIfta2TZMlQNVPY9zd3TXKPTw8an1So22dqKgodOzYEQsWLEBQUBASEhIwffp0+Pr61hrPggULMG/evBrlO3fuhIOD/t+T7tq1S+9tUk3sZ+NhXxsH+9k4LKWfb8mB905YQUACJ5lAD28Vuvso4SRLQeKJFCSaOsD7MEQ/l5aWanWeyRKg6hkzZWVlGuWlpaW1zqbRpo4QAgMGDECbNm2QnJwMa2trZGZmolOnTlAqlXdNcgBgzpw5mDlzpvpzYWEhAgMD0b9/fzg7O+t2k3ehUCiwa9cu9OvXj69mDIj9bDzsa+NgPxuHpfXzH6cyIE6cQxsfJ6x7oStsLWQauyH7ufoNzv2YLAEKDAyEVCpFWlqaRnlaWhpCQkJ0rpOeno6zZ8/ik08+gbV11e35+vrisccew7Zt22pNgGxtbWFra1ujXCaTGeSHwFDtkib2s/Gwr42D/WwcltLPR5JvAQBiWnnB0b7m3zBzZ4h+1rY9k6WK9vb26NmzJ/744w91WVFREfbs2YP+/furyy5evIj4+Hit63h6esLKyqrG9PTk5GR4e3sb7H6IiIiMLS4xFwAQHeZh4kgsj0lngX344Yd4+OGHMWPGDERHR+Orr76Cv78/Jk2apD7n008/RXx8PM6dO6dVHTs7O0ydOhVvvfUWysvLERYWhp07d2L37t3YsWOHSe6TiIhI31LzSpGWXwYrqQSdQtzvX4E0mPRlYbdu3XDo0CEUFBTgp59+QnR0NA4ePKixWGF4eDiio6PrVGfRokX46quvcOrUKSxduhQAcOzYMfTt29d4N0dERGRA8bef/rQPcOHaPjoweY916tQJy5cvr/X4nQOTta0jkUgwatQojBo1Si8xEhERmRu+/qofyxguTkRERGpCCMRfu50ANWMCpAsmQERERBbmel4pMgrKIbOSoFMwx//oggkQERGRhYm7/fQnItAV9jZ125KJqjABIiIisjAc/1N/TICIiIgsiBBC/QQoiuN/dMYEiIiIyIIk5pQgu0gOG2spIoPcTB2OxWICREREZEGqn/5EBrnCTsbxP7piAkRERGRBqhdAjOL4n3phAkRERGQhhBCIT8wDwAHQ9cUEiIiIyEJczS5GTrEcttZSRAS5mjoci8YEiIiIyEJUT3/vFOIGW2uO/6kPJkBEREQWonoANF9/1R8TICIiIgugUgn1AGju/1V/TICIiIgswOUbRcgvVcDBxgrtA1xNHY7FYwJERERkAapff3UKcYfMin++64s9SEREZAG4/5d+MQEiIiIycyqVwJGkqvV/osLcTRxNw8AEiIiIyMxdyCxEQZkCjrbWaOfvYupwGgQmQERERGauevZX5xA3WHP8j16wF4mIiMycev0fTn/XGyZAREREZkxZqVKP/4kO8zRxNA0HEyAiIiIzdj6jEEVyJZztrBHu52zqcBoMJkBERERmrHr6e5dQD1hJJSaOpuFgAkRERGTGOP7HMJgAERERmSlFpQpHk6vH/zAB0icmQERERGbqbHoBSisq4eogQ2sfJ1OH06AwASIiIjJT1a+/uoa6Q8rxP3rFBIiIiMhMxXP/L4NhAkRERGSGKpQqHEvOBwBEN+P6P/rGBIiIiMgMnU67hTJFJTya2KClt6Opw2lwmAARERGZoerxP1FhHpBIOP5H35gAERERmSF1AsT1fwyCCRAREZGZKVdU4vj12+N/OADaIJgAERERmZmT12+hQqmCl5Mtmnk1MXU4DRITICIiIjNTPf2d438MhwkQERGRmYnj+j8GxwSIiIjIjJQrKnHq+i0A3ADVkJgAERERmZHjKfmoqFTBx9kOIR4Opg6nwWICREREZEaqp79HN+P4H0NiAkRERGRGOP7HOJgAERERmYkSuRKnU28B4PgfQ2MCREREZCaOpeRDqRLwd7VHoDvH/xgSEyAiIiIzcef4HzIsJkBERERm4s4FEMmwmAARERGZgWK5EmfTCwDwCZAxMAEiIiIyA0eT8lCpEghyd4C/q72pw2nwmAARERGZAU5/Ny4mQERERGaAA6CNiwkQERGRiRWUKXA+g+N/jIkJEBERkYkdScqDSgBhnk3g7Wxn6nAaBSZAREREJlb9+iuKT3+MhgkQERGRiXEAtPExASIiIjKh/JIKXMwsBAB0DXM3cTSNBxMgIiIiEzqclAcAaN7UEU2dOP7HWJgAERERmVA8X3+ZBBMgIiIiE+L6P6bBBIiIiMhEcovluHyjCAA3QDU2JkBEREQmEp9YNf6ntY8T3JvYmDiaxoUJEBERkYnEJeYA4NMfU2ACREREZCIc/2M6TICIiIhMILuwHNdulkAiAbqGcv0fY2MCREREZALVqz+38XGGqwPH/xgbEyAiIiITqB4AzddfpsEEiIiIyAS4AKJpMQEiIiIysqyCciTllEAqAbpw/y+TYAJERERkZNXT39v6u8DZTmbiaBonJkBERERGpp7+ztdfJmMWCVB2djbOnTuH0tJSvdYRQuDq1avIyMjQR5hERER6UT0DLIoDoE3GpAlQRUUFxowZg6CgIDz++ONo2rQpli5dqpc6W7duRUhICHr16oVevXrhscceQ15enqFuhYiISCtp+aVIzSuDlVSCziEc/2MqJk2APvjgA+zbtw9XrlxBUlISfvjhB7zwwgs4fvx4verExsbiySefxOzZs5Geno4rV67glVdeQXp6ujFui4iIqFbVr7/aB7jA0dbaxNE0XiZNgJYtW4ZJkyYhMDAQADBixAi0adMGP/zwQ73qzJ07F7169cLUqVPVZY888gjatWtnoDshIiLSThynv5sFkyVAmZmZyMzMROfOnTXKu3btihMnTuhcp6KiAgcOHMATTzyBsrIynD9/Hvn5+Ya5CSIiojoQQuDw7QUQuQGqaZns2VtublUG7OGh+Q3g6empPqZLnZycHFRUVCAhIQHNmjWDq6srkpOT0bdvX6xcuRKurq53bVsul0Mul6s/FxYWAgAUCgUUCkXdb7AW1W3ps02qif1sPOxr42A/G4eh+/l6XinSb5VBZiXBg/6Ojfbrach+1rZNkyVAMlnVugd3Jh0AUFZWpj6mSx0rKysAwJ9//oljx47Bz88PN27cQLdu3fD666/XOsh6wYIFmDdvXo3ynTt3wsHBoQ53pp1du3bpvU2qif1sPOxr42A/G4eh+jnuhgSAFQIcVPh7906DXMOSGKKftZ1RbrIEKCAgABKJpMYU9YyMDAQFBelcx8vLCw4ODhg2bBj8/PwAAN7e3hgxYgTWrl1bazxz5szBzJkz1Z8LCwsRGBiI/v37w9nZWad7vBuFQoFdu3ahX79+tSZ6VH/sZ+NhXxsH+9k4DN3Pe9adBZCJgZHN8Gjf5npv31IYsp+r3+Dcj8kSoCZNmiAqKgpbt27FmDFjAFQ9ydmzZw/efvtt9XkpKSkoLi7GAw88oFUdqVSKPn36IDMzU+N6WVlZNV6d3cnW1ha2trY1ymUymUF+CAzVLmliPxsP+9o42M/GYYh+FkLgcHLV+J8eLbz4dYRh+lnb9kw6/27+/PkYMGAAWrVqhejoaCxatAiurq544YUXNM6Jj4/HuXPntK4zb948xMTEYMGCBejevTsOHz6Mn3/+GatXrzb6PRIREQFAUk4JbhTKYWMlRWSwm6nDafRMOg2+T58+2LFjB06fPo158+YhMDAQBw8e1HjlFBISgrZt29apTocOHbB//36cO3cOb731Fk6ePIkdO3Zg+PDhRr0/IiKiatXT3zsEucJOZmXiaMjkKzD17t0bvXv3rvX4O++8U+c6ABAZGcknPkREZDbU+39x+wuzYBZ7gRERETVkQgjE317/hwsgmgcmQERERAZ27WYxcorlsLWWIiLI1dThEJgAERERGVz166+OwW6wteb4H3PABIiIiMjAuP+X+WECREREZEAq1R3jfzgA2mwwASIiIjKghOwi5JVUwF5mhfYBrqYOh25jAkRERGRA1eN/OoW4wcaaf3bNBb8SREREBsT1f8wTEyAiIiIDUakEDidx/R9zxASIiIjIQC5kFqKgTIEmNlZo5+9i6nDoDkyAiIiIDCT+9vT3zqHusLbin1xzwq8GERGRgcRz/R+zxQSIiIjIACrvHP/DAdBmhwkQERGRAZzPKEBRuRJOdtZ4wI/jf8yNTgnQBx98oO84iIiIGpTq6e9dQ91hJZWYOBr6N50SoPnz50OpVOo7FiIiogajev+vKI7/MUs6JUAdOnTAoUOH9B0LERFRg6CoVOEox/+YNWtdKg0ZMgQjR47ErFmzEB4eDhsbG43jffv21UtwREREluhsegFKKirh6iBDGx9nU4dDd6FTAjR79mwAwOuvv37X40II3SMiIiKycHeO/5Fy/I9Z0ikBYoJDRERUu3iO/zF7nAZPRESkRxVKFY4l5wPg+B9zptMTIACorKzE9u3bcfHiRQghEB4ejkcffRRSKXMqIiJqvM6k3UKZohLuTWzQsqmTqcOhWuiUAKWkpODxxx/HxYsXERwcDIlEgpSUFLRu3RqbN29GcHCwvuMkIiKyCNXjf6LCOP7HnOn0uGbatGkICAjA9evXcfXqVVy5cgUpKSkICAjAtGnT9B0jERGRxYjj/l8WQacnQHv27MGlS5fg6+urLvP19cX333+P1q1b6y04IiIiSyJXVuJ4Csf/WAKdngBJJJK7zgRTqVQcA0RERI3Wyeu3IFeq4OVki2ZejqYOh+5Bp2ylX79+eP7555Genq4uS0tLw6RJk9CvXz+9BUdERGRJ/jf+xwMSCcf/mDOdEqAvv/wSOTk5CAoKUv8XHByMvLw8LFq0SN8xEhERWQSO/7EcOo0BCggIwNGjR7Fnzx6cP38eEokE4eHh6NOnDzNeIiJqlMoVlTh1/RaAqhlgZN50SoA6d+6Mo0ePom/fvtz3i4iICMCJlHxUVKrg7WyLUM8mpg6H7kOnV2AJCQkoKirSdyxEREQW687XX3wbYv50SoAGDx6MFStW6DsWIiIii1U9AJrT3y2DTq/AVCoVpk+fjrVr1yI8PBw2NjYax5csWaKX4IiIiCxBaYUSp9NuAQCiwzxNGwxpRacEqLi4GIMHDwYAZGdn6zUgIiIiS3MsOR+KSgF/V3sEutubOhzSgk4J0KpVq+DoyAWeiIiIgP+N/+H6P5ZDpzFAzs7O+o6DiIjIYnH8j+XRKQHy9vZGVlaWvmMhIiKyOMVyJc6mFwDg+j+WRKcE6KWXXsLrr7+O4uJifcdDRERkUY4m5aFSJRDobo8ANwdTh0Na0mkM0C+//IKLFy9i/fr1CAwMrDEL7Ny5c3oJjoiIyNzFc/sLi6RTAjR58mR9x0FERGSR1AsgcvyPRdEpAXr11Vf1HAYREZHlKSxX4Nzt8T9c/8ey6DQGqFpZWRkuXryor1iIiIgsypHEPKgEEOrZBD4udqYOh+pApwSouLgYY8eOhaOjI8LDw9Xlw4cPx/Hjx/UWHBERkTm7c/0fsiw6JUBz5sxBeno6jh49qlH+7LPPYt68eXoJjIiIyNxx/R/LpdMYoI0bN+LAgQMICwvTKI+KisKIESP0EhgREZE5u1VagYtZhQC4/o8l0ukJUE5ODpo2bQoAGkt+l5WVQQihn8iIiIjMWHxiHoQAmjd1RFMnjv+xNDolQBEREdi2bRsAzQRo0aJF6Nq1q34iIyIiMmPx6vE/fPpjiXR6BfbBBx9gyJAhiI2NBQB8/PHH+Ouvv3Do0CHs3btXrwESERGZo/8tgMjp75ZIpydAffv2xY4dO5CUlAQfHx988cUXcHBwwP79+9GjRw99x0hERGRWcovluJRVBIBPgCyVTk+AACA6OhqbNm3SZyxEREQW4XBSHgCglbcTPBxtTRwN6aJeCyESERE1Rpz+bvmYABERkUGk5JagtEJp6jAMggsgWj6dX4ERERH9W6VKYNeFLCw/mIwjyXkIdLfHjxO6oJmXo6lD05vsonJczS6GRMLxP5aMCRAREdVbYbkCa4+m4sfYZKTll6nLU/PKMPSbWCwd1wmdQxpGshCfWDX+p42PM1wdbEwcDemKCRAREeksOacEP8YmY92xVJRUVAIAXB1kGNM1CIPa+eGtjWdxKvUWxiw7jM+HR2BQe18TR1x/HP/TMGidAIWEhGjdaHJysg6hEBGRJRBCIC4xF8sPJmPPpRuo3gCgRVNHTOwRiicj/GFvYwUAWPN8FKb9ehK7LtzAS7+cQMatNpjUM1RjEV1L87/1f5gAWTKtE6B33nnHkHEQEZGZK1dUYvPpDCw/lIyLmYXq8odaeWFi91D0bOFZI7Gxt7HCt2M74v3N5/FTXAr+b9tFpN8qw7uPhcNKanlJUFZBOZJySiCVAJ1DG8YrvcZK6wRo0qRJhoyDiIjM1M0iOVbFp2D14RTkFFcAAOxkUjzdMQDPdgtF86b3HuBsJZXgvSceQICbA/5v20X8GJuMjFtlWDSyg/pJkaWofvrzgJ8LXOxlJo6G6qPeY4DkcjmEELCz40ZwREQNyfmMAqw4lIw/T2WgolIFAPB1scO46BCM6hJYpwHAEokEz8eEwc/VHjPWnsLOCzcwamk8fhjfyaIWEuT4n4ZD53WAli5diubNm8Pe3h4ODg5o3rw5li5dqs/YiIjIyCpVAjvPZ2Hk93EY9OVBrD+ehopKFSICXbF4VAcceONhTHmomc6znwa198XqSV3h6iDDqdRbGPJNLJJySvR8F4YTx/E/DYZOT4AWLlyI+fPnY9q0aYiKioJEIkFcXBxmzZqFW7du4fXXX9d3nEREZEDFciXWHauaxp6SWwqg6tXVwLY+mNgjFJFBbnq7VucQd/w+pRueXXEEKbmlGPL1ISwb3xkdg/V3DUNIv1WG63mlsJJKOP6nAdApAVqyZAnWrFmDQYMGqcsGDRqE6OhovPTSS0yAiIgsRGpeKX6MTcbao6koklet2uxiL8OoLkEYFx0MP1d7g1y3mZcjNkzpjud+OoozaQUYvTQei0ZGYEBb850mX/36q52/CxxtuYqMpdPpK5iZmYmePXvWKO/RowcyMjLqHRQRERmOEAJHk/Ox/GASdl7Igur2NPYwryaY0D0UQyP94WBj+D/wXk62+HVyFF755ST2XMrGlNUn8O6gcEzsEWrwa+uC438aFp2+w5s1a4YNGzbg2Wef1Shfv349mjVrpo+4iIhIzyqUKmw5k4Hlh5JwLv1/09h7tvDExB6h6NXCC1IjT013sLHGd890xHubz2NV/HW8v+UC0vLL8M6gNkaP5V6EEFz/p4HRKQF69913MX78ePz111/o0qULAODw4cPYsGEDVq5cqdcAiYiofnKL5fjl8HWsjE/BzSI5AMDWWoohkf6Y0D0ULb2dTBqftZUU8we3RYCbAz7afgnLDyUhs6AMn4+IgJ3MPKbJp+aVIf1WGaylEnQKMe+xSqQdnRKg0aNHw9/fHwsXLsTixYshkUgQHh6OPXv2ICYmRt8xEhGRDi5lFWLFwWRsPJWOCmXVNPamTrYY3y0Eo7oEwb2J+exjJZFI8GKvZvB1scPr685g+7ksZBcdxtJxncwizuqnPw8Guhrl9SAZns5fxV69eqFXr176jIWIiOpJpRL4OyEbyw8m4+DVHHV5+wAXPNcjFAPb+sLGWucVUAxucIQ/vJ3tMHnlMRxPycfQb2Lx44TOCPZoYtK4OP294dEpARJCIDU1FUFBQRrl169fR2BgYJ33eCkpKUF+fj58fX1hZaXd405t65SXlyMtLQ2urq7w9PSsU1xERJaiRK7E7yfSsOJQsnpdHakEGNDWBxO7h6JjsJvF7L8VFeaBDVO7Yfzyo0jKKcGQr2OxbHwndNDjVPy6EEJwAHQDpNM/A7788kt89tlnNco/++wzLFmyROt2Kisr8dJLL8Hd3R3t27eHj48Pfv31V73WmTRpElq0aIEPPvhA67iIiCxF+q0yLNh2EdEL9uA/m84jKacETnbWmBwThgNvPIyvx3REpxB3i0l+qjVv6oSNU7uhrb8zcksqMGppPHaezzJJLMm5pcgqLIeNldTs1yoi7emUAH3xxReYMWNGjfJXX30VX375pdbtfPLJJ1i7di1OnTqFvLw8/N///R/Gjh2Lc+fO6aXOjz/+iMTERLRt21brmIiIzJ0QAsdT8vDS6hOI+WQfvjuQiMJyJUI8HDDviQcQN6cP3nq0DQLcHEwdar00dbbDb5Oj8XArL5QrVHhh1XH8FJts9Diqn/5EBLmazaBsqj+dEqCsrCw4ONT8wXJwcEBaWprW7XzzzTeYNGkS2rRpAwCYPHkywsLC8P3339e7zuXLl/HWW29h1apVWr9WIyIyZ5UqYPOZTDz5dSyGfhOHrWczUakS6NbMAz+M74S9sx7C+G4hDWqRvia21lg6rhNGdQmEEMDcP8/jw20XoapevMgIOP6nYdLppyQyMhLLli3DnDlzNMqXLl2KiIgIrdq4ceMGUlNTER0drVHevXt3HDt2rF515HI5Ro4ciQULFiAsLEyreIiIzJWyUoWlB5Pw3UkrFBw+CwCwsZbiyQg/TOgeija+ziaO0LCsraT48Kl2CHBzwMIdl/H9gUSk3yrDp8MeNPgTGY7/abh0SoDmzZuHgQMHIi4uDjExMRBC4MCBA/jrr7+wfft2rdrIyamaneDhofkN5enpiUOHDtWrzmuvvYYWLVpg/PjxWt+TXC6HXC5Xfy4srFokTKFQQKFQaN3O/VS3pc82qSb2s/Gwrw3vo78u44dDKQAk8Ghig7FdAzGqc4B6F/XG0veTewTD21GGOX+cx9YzmbhRUIavR0fATceNWe/m39/PV7OLkVMsh621FG19HRtNXxuaIX9vaNumTglQ3759sXfvXnz00Uf49NNPIZFI0KFDB+zbtw89evTQqg2pVHrXQCsqKmp9ZaVNnd27d2PVqlXYuXMnrl69qj5eUFCAq1evonnz5ndte8GCBZg3b16N8p07d971dV997dq1S+9tUk3sZ+NhXxvGmTwJfrhc9fttSEglunuXwrrsMg4fuGziyExDBuCFVhL8cFmKYym38Njn+/BCm0p42un3OtXfz/9kSQBYIchBiT07/9LvRcggvzdKS0u1Ok/nF8U9e/a8635g2goICABQNZ7oTllZWepjutTJysqCh4cHRo0apT6empqKjIwM/PPPP7h8+fJdE6w5c+Zg5syZ6s+FhYUIDAxE//794eysv8fLCoUCu3btQr9+/SCTyfTWLmliPxsP+9pwrueV4p1v4gEoMb5rACKlyezn2wbeKMKkn08is6AcXyc44PuxHdA+wKXe7f77+/mvX08DuIFHO7XAow9zqyd9MeTvjeo3OPdT75FycrkcQgjY2dUt/XZyckLHjh2xY8cOjBw5EkDVk5rdu3drJCI3b95EeXk5AgMDtaozduxYjB07VuNaEREReOihh/DFF1/UGo+trS1sbW1rlMtkMoP8sjFUu6SJ/Ww87Gv9KldUYvraMygqVyIyyBWzB7bGrh3J7OfbHghwxx8vdceEFUdxIbMQY5cfw+JRHdA33Fsv7ctkMlhbW+NIcj4AoEfLpux3AzDE97O27em8HOjSpUvRvHlz2Nvbw8HBAc2bN8fSpUvr1MbcuXOxatUqLFq0CEeOHMG4ceNgY2ODF198UX3OnDlzMHDgwDrVISKydPO3XMC59EK4OciwZHQkZFbmu3qzqXg722Hti9GIaemFMkUlJv98DD/Hp+it/YQbxcgtqYC9zAoPBrjqrV0yDzr9RC1cuBCzZs3CyJEj8eeff2Lz5s0YOXIkZs2ahYULF2rdzuOPP45169Zh06ZNmDBhAgDgwIEDGoOcmzZtqrHitDZ1/i0oKAheXl51vU0iIpPYdCodqw9fh0QCfD4iAn6u9qYOyWw52lrjh/GdMLxTAFQCePePc1iwXT/T5OOuVU286RTiZtbbh5BudHoFtmTJEqxZswaDBg1Slw0aNAjR0dF46aWX8Prrr2vd1pNPPoknn3yy1uMffvhhnev8259//qn1uUREpnQ1uwhzNlRNdX/54eZ4qFVTE0dk/mRWUnw8tD0C3Bzw2a4EfLc/ERm3yvHfYe1ha637NPnq9X+iuP5Pg6RTSpuZmXnXAdA9evRARkZGvYMiImqMSiuUmLLqBEorKhEd5oFX+7Y0dUgWQyKRYFqfFvjvsAdhLZVg8+kMPPPDERSU6jbNWqUSOJyUB4Dr/zRUOiVAzZo1w4YNG2qUr1+/Hs2acZQ8EVFdCSHwzsZzuJJdDC8nWywaFQErqWXt32UOnu4YgB8ndIGjrTWOJOVh6LexSM3Tblr0nS7dKMKtUgWa2FihnX/9Z5eR+dHpFdi7776L8ePH46+//kKXLl0AAIcPH8aGDRuwcuVKvQZIRNQY/HY0FRtOpkMqARaP6oCmTnpe2KYR6dHCE+tejMaEFUdxNbsYQ76JxfLxndGuDtPkDydVzf7qHOrOAegNlE5f1dGjR2P37t0oLi7G4sWLsWTJEpSUlGDPnj0a6+8QEdH9nc8owH/+PA8AeO2RVhxzogdtfJ2x8aVuaO3jhJtFcoz4Pg77LmVrXT8+8fbrL34tGiydEqD//ve/6NWrF7Zs2YKkpCQkJiZiy5YtiImJwX//+199x0hE1GAVliswdfUJVChVeLiVF16M4TACffF1scfaF6PRo7knSisqMWnlMfxy+Pp966kEcDSl6gkQk9GGS6cE6F6zvOoyA4yIqDETQmD2+jNIyS2Fv6s9PhseASnH/eiVs50My5/tjKGRAahUCby18SwW7rgEIWqfJp9eAhSVK+Fka40H/Br2RrONmV5fbF67du2e6/EQEdH/rDiUjO3nsiCzkmDJ6A5wa6K/TT3pf2yspfjvsPaY1qcFAOCrfdcw47dTqFCq7nr+lcKqJLRLqDusOf6nwarTIOg7NxL996aiKpUKGRkZGDNmjH4iIyJqwE5cz8eH2y4CAN56tA06BLmZOKKGTSKRYGa/lghwtcecjWfxx6kM3CiU49tnOsLFXnPrhCsFVQkQp783bHVKgF577TUAwJQpU9T/v5pMJkNISAgefvhh/UVHRNQA5ZdU4OXVJ6BUCQxq54tnu4WYOqRGY3jnQHi72GHqquOIS8zFsG9jsWJCF/jfXm1bWanCtaKqBIjjfxq2OiVA1ftteXp64umnnzZIQEREDZlKJTBj7SlkFJQjxMMBHw1tB4mE436MqVdLL6y9PU0+4UYxnvrqEFZM6IwH/FxwLqMQ8koJXOytEe7L8T8NmU4vN+9MfuRyOcrLy/UWEBFRQ/bN/mv4+/JN2FpL8fWYjnCy4w7jpvCAnws2vtQdLb0dkV0kx/Bv47A/4aZ6/Z8uIe4ckN7AmXQ3eCKixiTuWi4+3XkZAPD+4AcQzhlGJuXvao91L3ZDdJgHSioqMfHHo1h1e5p811COyWrodFoJeuHChZg/fz6mTZuGqKgoSCQSxMXFYdasWbh16xanwhMR/Ut2UTleWXMSKgEMjQzA8E6Bpg6JALjYy/DTxC6Y/fsZbDyZjqxCOQAgKtTdxJGRoZl8N3giooZOWanCtDUnkVMsR0tvR8x/8gGO+zEjNtZSfDb8Qfi72mPJvqtwtRFo0dTR1GGRgemUAHE3eCIi7X2x+wriE/PQxMYKX4/pCAcbnX71kgFJJBK89kgr9GjmhrPH4jj+pxHgbvBERAa073I2luy7CgD4cEg7NOeTBbPWMdgNTe1NHQUZA3eDJyIykPRbZZjx2ykAwNioIAyO8DdtQESkplMCNHr0aPj7+2PhwoVYvHgxJBIJwsPDsWfPHsTExOg7RiIii1OhVOHlX07gVqkC7fxd8O5j4aYOiYjuoFMCtGrVKowdOxa9evXSdzxERA3CR9sv4eT1W3Cys8bXYyJha21l6pCI6A46jQGaMGECVKq7byJHRNTYbT+bieWHkgAAnw57EIHuDiaOiIj+TacEqFWrVjh9+rS+YyEisnjJOSV4Y/0ZAMDkmDD0f8DHxBER0d3o9ArspZdewujRozF//nyEh4fDxsZG4/i/d4onImoMyhWVmLr6BIrkSnQKdsPrj7QydUhEVAudEqCpU6cCAIYNG3bX40II3SMiIrJQ8zafx4XMQrg3scHi0R0gs9J5tyEiMjCdEqCkpCR9x0FEZNE2nEjDmiOpkEiARSMj4OvCxWSIzFmdEiAhBL788kv8+eefEEJg8ODBmDZtGpd0J6JGLeFGEd7eeA4AMK13C/Rs4WXiiIjofur0fHbhwoV47bXXYGdnB3t7e7z22mtYuHChoWIjIjJ7JXIlpq4+gTJFJXo098S0Pi1MHRIRaaFOCdAPP/yANWvWYOvWrdi6dStWr16N5cuXGyo2IiKzJoTAWxvP4mp2MbydbfHFyAhYcQ8pIotQpwQoOTkZjz32mPrzE088geTkZH3HRERkEX45ch2bTmXASirBktGR8HS0NXVIRKSlOiVAFRUVsLOzU3+2s7ODXC7Xe1BERObuXHoB5v15AQDwxiOt0DnE3cQREVFd1HkW2KRJk+5btmzZMt0jIiIycwVlCkxdfQIVlSr0bdMUz/cMM3VIRFRHdUqAunfvjkuXLt23jIiooRJC4PV1p3E9rxQBbvb4dFgEpBz3Q2Rx6pQAHTx40FBxEBFZhB8OJmHnhRuwsZLi6zGRcHGQmTokItKBTgshEhEBQNy1XLy98Qy8pVK0uFGM8AA3U4dkUMdT8vDR9qon3u881gbtA1xNGxAR6YzrtBORToQQ+GDrBSTmlCIuW4pHl8TimR8OY9/lbKhUDW87nLySCrz8y0koVQKPP+iHZ6KCTR0SEdUDnwARkU5ir+XifEYh7GRStHRS4ly+FP9cycE/V3IQ5tUEE7qHYmikPxxsLP/XjEol8Opvp5BZUI4wzyZYMKQdV8AnsnB8AkREOvnuQCIA4OlIfzzXSoU9M3ri+Z6hcLK1RuLNErz7xzlEL9iLj7ZfQsatMhNHWz9L9l3FgYSbsJNJ8fXYSDjaWn5SR9TYMQEiojq7mFmIAwk3IZUAE7pVvQoKcLPH24PCEfdWH7z3eDiCPRxQUKbAt/uvoecn+/DyLydw4nq+iSOvu0NXc/D57gQAwPzBbdHax9nEERGRPvCfMURUZ0v/qXr6M7CtL4LcHXDujmOOttZ4tnsonokOwb5L2Vh+KAmx13Kx5UwmtpzJRESgK57rEYoBbX0gszLvf4PdKCzH9F9PQghgeKcADOsUaOqQiEhPmAARUZ1kFpThz1MZAIDJMbUvAGgllaBvuDf6hnvjQkYhVhxKwqZTGTiVeguvrDkJXxc7jIsOwagugXB1sDFW+FpTVqrwypqTyCmuQGsfJ8x7oq2pQyIiPTLvf34RkdlZcSgZSpVAl1B3PBjoqlWdcD9nLBz2IA692Rsz+raEp6MtMgvK8fFflxC1YA/evr2hqDn5dFcCjiTlwdHWGl+PiYS9jZWpQyIiPWICRERaKyxX4JfD1wEAL9zj6U9tvJxsMb1vCxx682H8d9iDCPd1RrlChdWHr6PvZ/vx7IojOJBwE0KYdhr9nos38M3f1wAAHw1thzAvR5PGQ0T6x1dgRKS1NYevo1iuRPOmjni4VVOd27G1tsLTHQMwNNIfh5PysPxgEnZdvIG/L9/E35dvokVTR0zsEYqnOvjDTmbcJy+peaWYufY0AGB8dDAea+9n1OsTkXEwASIirVQoVVhxKBkAMLlnmF72v5JIJIgK80BUmAdSckvwY2wy1h5NxZXsYszZcBaf/HUJo7sG4ZmoEPi42NX7evdToVTh5V9OoKBMgQcDXPDWoDYGvyYRmQZfgRGRVjafzkBWYTm8nGwxuIP+n4oEezTB3McfQNxbffDuY+EIdLdHfqkCX+27hh4f78X0X0/iTNotvV/3Th9uu4jTaQVwsZdhyehI2Fpz3A9RQ8UnQER0X0II9dT3Z7uFGDQxcLaT4bkeoXi2Wwh2XbiB5YeScCQpD5tOZWDTqQx0CnbDxB6h6B/uDWs9TqPfeiYTP8YmAwA+G/4gAt0d9NY2EZkfJkBEdF/7E27iUlYRHGysMLarcfbAspJKMKCtDwa09cG59AIsP5SEzaczcCwlH8dS8uHvao/x3YIxonMQXOzrtyN74s1izP79DADgxV7N0KeNtz5ugYjMGF+BEdF9fX9724uRnYPg4lC/ZEMXbf1d8NnwCBya3RvTejeHexMbpN8qw4fbLiF6wR7M3XQOSTklOrVdrqjE1NUnUCxXokuIO17r31LP0ROROWICRET3dC69ALHXcmEllWBijxCTxtLU2Q4z+7dC7Ju98fHQdmjl7YTSikr8FJeC3p/+jed+PIpDV3PqNI3+P5vO4VJWETwdbbB4dAe9vlYjIvPFV2BEdE/VT38ea++LADfzGBdjJ7PCiM5BGN4pELHXcrH8YBL2XMpW/9faxwkTu4fiiQi/e06jX3csFWuPpUEiARaN7ABvZ8PPNCMi88AEiIhqlZZfiq1nMwEAz/es+8KHhiaRSNC9uSe6N/dE4s1i/BibjHXH0nApqwhv/H4GH/91CWO6BmFsVDCa/iu5uZRViHc3Ve1iNqNvS3Rv7mmKWyAiE+GzXiKq1Q8Hk1CpEuje3ANt/V1MHc49hXk54v3BbRE/pw/eerQ1/F3tkVtSgS/3XkX3j/di5tpTOJdeAAAolisxdfUJlCtU6NnCEy8/3NzE0RORsfEJEBHdVUGpAr8dTQUATI5pZuJotOfiIMPkmGaY2D0UO85XTaM/npKPDSfSseFEOrqEusPWWorEmyXwcbbDFyMi9LKoIxFZFiZARHRXqw6noLSiEq19nBDTwvJeD1lbSTGovS8GtffFqdRbWHEoCVvPZOJIUl7VcakEX43pAA9HWxNHSkSmwASIiGqQKyvViwJOjgmDRGLZT0giAl2xaGQHzBnYBivjkrHjfBYmx4ShY7C7qUMjIhNhAkRENfxxMh03i+TwcbbD4w82nM1AfVzs8MaA1nhjQGtTh0JEJsZB0ESkQaUS6qnvE3uEQMZ1cYioAeJvNiLSsPdSNq7dLIGTrTVGdQkydThERAbBBIiINHx/e9PT0V2D4GRn/G0viIiMgQkQEamdSr2FI0l5kFlJMKF7qKnDISIyGCZARKT2/YFrAIAnHvSHjwu3hSCihosJEBEBAFJyS/DXuSwAwPMxfPpDRA0bEyAiAgAs+ycJKgH0aumF1j7Opg6HiMigmAAREfJKKrDueNW2Fy/EmN+mp0RE+sYEiIjwc1wKyhUqtPV3RnQzD1OHQ0RkcEyAiBq5ckUlVsYlA6ja9NTSt70gItIGEyCiRm798TTkllTA39Uej7b1MXU4RERGwQSIqBGrVAksu73w4XM9QmHNbS+IqJEwi992KpUKxcXFeq9TUVGBysrK+oRG1KDtupCF5NxSuNjLMKJzoKnDISIyGpMmQEIIvP3223B1dYW7uztCQ0OxdevWetf5/fffER0dDXd3dzg6OqJXr144deqUAe+EyDJVb3o6NioITWytTRwNEZHxmDQBWrRoEb766ivs3LkTpaWlmDJlCoYMGYKEhASd61RWVmLNmjX44osvkJ+fj5ycHISEhOCRRx7BrVu3jHRnRObvWHIeTly/BRsrKcZ3CzF1OERERmXSBGjx4sWYNGkSoqKiYG1tjTfeeAN+fn747rvvdK5jZWWF9evXo2vXrpDJZGjSpAk+/PBDZGdn48iRI8a6NSKz993tpz9DIv3R1InbXhBR42KyBOjmzZtITExEjx49NMpjYmJw+PBhvdUBgJSUFACAl5dXPaMmahiu3SzG7os3AACTenLbCyJqfEz20v/mzZsAaiYlXl5eiI+P11ud8vJyTJs2DT179kSHDh1qjUcul0Mul6s/FxYWAgAUCgUUCsV97kZ71W3ps02qif18b9/vvwohgN6tvBDsZlevfmJfGwf72TjYz8ZhyH7Wtk2TJUDVi639e5aWUqmEVHr3B1N1raNUKjFy5Ejk5uZi06ZN94xnwYIFmDdvXo3ynTt3wsHB4Z51dbFr1y69t0k1sZ9rKqwAfj9hBUCCttaZ2LYtUy/tsq+Ng/1sHOxn4zBEP5eWlmp1nskSID8/PwDAjRs3NMpv3LgBX1/fetdRKpUYNWoUTp06hf3798Pf3/+e8cyZMwczZ85Ufy4sLERgYCD69+8PZ2f9bQypUCiwa9cu9OvXDzKZTG/tkib2c+0+330VSpGIBwNc8PKILvVe+Zl9bRzsZ+NgPxuHIfu5+g3O/ZgsAXJxcUH79u2xe/duDBs2DEDVk529e/fixRdfVJ9XXFwMpVIJV1dXresolUqMHj0aR48exd9//43g4OD7xmNrawtbW9sa5TKZzCA/BIZqlzSxnzWVVijxy9GqTU9f7NUMNjY2emubfW0c7GfjYD8bhyH6Wdv2TDoL7O2338aKFSvw008/ISEhAS+++CKUSiWmTJmiPufVV1/VGPR8vzoqlQrPPPMM9u/fj/Xr18PR0RE5OTnIycnRGOND1BitPZqKW6UKBHs4oP8D3PaCiBovk658Nnz4cJSXl+OLL77AW2+9hXbt2mHv3r3w8fnfL2YnJye4ublpXefWrVvqd4oDBgzQuN4XX3yBsWPHGuHOiMyPslKFZQeTAACTeoTCSspNT4mo8TL50q/jxo3DuHHjaj3++eef16mOu7s7cnJy9BYfUUPx1/kspOWXwb2JDZ7uyG0viKhxM4u9wIjIsIQQ6m0vnokKhr2NlYkjIiIyLSZARI1AfGIezqQVwNZainHR958UQETU0DEBImoEvj9wDQAwrFMAPBxrznYkImpsmAARNXAJN4qw7/JNSCTAcz3CTB0OEZFZYAJE1MAtvT3255FwH4R6NjFxNERE5oEJEFEDdqOwHH+cSgcATO7Fpz9ERNWYABE1YCsOJUNRKdA5xA2RQW73r0BE1EgwASJqoIrlSqw+nAIAmBzTzMTREBGZFyZARA3Ur0euo6hciTCvJujTuqmpwyEiMitMgIgaIEWlCstvb3vxfM8wSLntBRGRBiZARA3Q1jOZyCgoh6ejLZ7q4G/qcIiIzA4TIKIGRgiB725PfX+2WzDsZNz2gojo35gAETUwB6/m4GJmIRxsrDA2itteEBHdDRMgogametPT4Z0C4epgY+JoiIjMExMgogbkQkYh/rmSA6kEeK5HqKnDISIyW0yAiBqQpf9UPf15tJ0vAt0dTBwNEZH5YgJE1EBk3CrD5tMZAIAXuPAhEdE9MQEiaiCWH0yCUiUQHeaBdgEupg6HiMisMQEiagAKyhRYc+Q6AG56SkSkDSZARA3AL4evo6SiEi29HfFQSy9Th0NEZPaYABFZuAqlCisO/W/bC4mE214QEd0PEyAiC7fpVDqyi+TwdrbF4Ahue0FEpA0mQEQWTAihnvo+oXsobKz5I01EpA3+tiSyYH9fvomEG8VwtLXG6K5Bpg6HiMhiMAEismDfHbgGABjZORDOdjITR0NEZDmYABFZqDNptxCfmAdrqQQTue0FEVGdMAEislDVm54+/qAf/FztTRwNEZFlYQJEZIFS80qx7WwmgKqp70REVDdMgIgs0A8Hk6ASQM8Wngj3czZ1OEREFocJEJGFyS+pwG9HUwFw01MiIl0xASKyMKsPp6BMUYlwX2d0b+5h6nCIiCwSEyAiC1KuqMSPsSkAgMkx3PaCiEhXTICILMjGk+nIKZbDz8UOg9r7mjocIiKLxQSIyEKoVP/b9mJij1DIrPjjS0SkK/4GJbIQuy/eQOLNEjjZWWNkF257QURUH0yAiCxE9dOfMV2D4WhrbeJoiIgsGxMgIgtw4no+jibnQ2YlwYTuIaYOh4jI4jEBIrIA3++vevrzZIQ/vJ3tTBwNEZHlYwJEZOaSckqw40IWgKqp70REVH9MgIjM3LJ/EiEE0Lt1U7TwdjJ1OEREDQITICIzllssx/rjaQC46SkRkT4xASIyYyvjUiBXqtA+wAVRYe6mDoeIqMFgAkRkpsoqKrEyLhkAt70gItI3JkBEZmr98VTklyoQ6G6PAQ/4mDocIqIGhQkQkRmqVAksO5gEAJjUIwzW3PaCiEiv+FuVyAztPJ+FlNxSuDrIMKxTgKnDISJqcJgAEZkZIQS+O1C18OEzUcFwsOG2F0RE+sYEiMjMHE3Ox6nUW7CxlmJcdIipwyEiapCYABGZme8PXAMADI0MgJeTrYmjISJqmJgAEZmRq9lF2H0xGxIJ8HzPUFOHQ0TUYDEBIjIjy/6pmvnVr403wrwcTRwNEVHDxdGVdF8qlUB2kRwCwtShaE2hUOKWHMgsKIdMpjR1OFopLFNiw4l0ANz0lIjI0JgAUa0KyxVYezQVP8YmIy2/zNTh6MAac08cMHUQdRYZ5IpOIdz2gojIkJgAUQ0puSVYcSgZ646loqSiEgAglQDWUst5YyogoFKpIJVKIYHlbCFhb2OF1x5pZeowiIgaPCZABKBq7Zn4xDwsP5SE3RdvQNx+29WiqSMm9gjFkxH+sLexMm2QdaBQKLBt2zY8+ugjkMlkpg6HiIjMDBOgRk6urMSfpzKw/FAyLmYWqssfauWFid1D0bOFJzfhJCKiBocJUCN1s0iO1YdTsCo+BTnFFQAAO5kUT3cMwLPdQtG8KWcgERFRw8UEqJG5kFGI5YeS8OepDFRUqgAAvi52GBcdglFdAuHqYGPiCImIiAyPCVAjUKkS2HspG8sPJiEuMVddHhHoiud6hGJAWx/IuNs4ERE1IkyAGrBiuRLrjlVNY0/JLQUAWEklGNjWBxN7hCIyyM3EERIREZkGE6AGKDWvFD/FJuO3o6koklctAuhiL8OoLkEYFx0MP1d7E0dIRERkWkyAGgghBI4m52P5wSTsvJAF1e1p7GFeTTCheyiGRvrDwYZfbiIiIoAJkMWrUKqw9WwGlh9Mxtn0AnV5zxaemNgjFL1aeEEq5TR2IiKiOzEBslC5xXL8cvg6Vsan4GaRHABgay3FkEh/TOgeipbeTiaOkIiIyHwxAbIwl7OKsOJQEjaeTIdcWTWNvamTLcZ3C8GoLkFwb8Jp7ERERPfDBMgCqFQCfydkY/nBZBy8mqMub+fvgud6hOLRdr6wseY0diIiIm0xATJjJXIlNpxIw4pDyUjMKQFQtSnpgLY+mNg9FB2D3bhNBRERkQ7MJgGq3rlb33V0adfU0m+VYWVsMtYcuY7C8qpp7E621hjZJRDjokMQ6O5g4giJiIgsm8kzgwULFsDb2xsymQzt2rXD3r179VJHl3ZNSQiB4yn5eOmXE4j5ZB++O5CIwnIlQjwcMO+JBxD3Vh+8PSicyQ8REZEemDQB+vbbb/Hhhx9i9erVKCgowJAhQ/DYY48hKSmpXnV0addUFJUqbDqVjie/jsXQb2Kx9UwmKlUC3Zp5YNm4Ttg76yGM7xYCR1uzeVhHRERk8UyaAH322Wd47rnn0LdvXzg6OuK9996Dp6cnvv3223rV0aVdY8svrcDXf19Fz4/3Yfqvp3A69RZsrKUY3ikA26f3xC/PR6FvuDfX8CEiIjIAkz1WyM3NxZUrV9CrVy91mUQiQa9evRAXF6dzHV3aNaar2cX4LVGK2ccOoFxRNY3d09EWz0QFY0xUEDwdbU0cIRERUcNnsgToxo0bAAAvLy+N8qZNm+LIkSM619GlXQCQy+WQy+Xqz4WFhQAAhUIBhUJx3/vRRmGZAoO/jkdFpRSACm18nPBstyAMaucL29vT2PV1rcauuh/Zn4bHvjYO9rNxsJ+Nw5D9rG2bJh9YolKpany+39RuberUtd0FCxZg3rx5Ncp37twJBwf9DTzu4C5FqRJ4yFeFZs75kGTmY0/mab21T5p27dpl6hAaDfa1cbCfjYP9bByG6OfS0lKtzjNZAuTr6wsAyM7O1ijPzs6Gj4+PznV0aRcA5syZg5kzZ6o/FxYWIjAwEP3794ezs7M2t6SVPhUV2LN7N/r16weZTKa3dkmTQqHArl272M9GwL42DvazcbCfjcOQ/Vz9Bud+TJYAubm5ITw8HPv27cPTTz8NoOopzb59+zBhwgT1eUqlEiqVCjY2NlrV0bbdf7O1tYWtbc3xNzKZzCA/BIZqlzSxn42HfW0c7GfjYD8bhyH6Wdv2TDoLbPbs2Vi+fDl+//13ZGRkYObMmSguLsaUKVPU57z44ouIjIysUx1tziEiIqLGy6RjgMaNG4fi4mLMmTMHN27cQLt27bBr1y4EBASoz5HJZBpPZrSpo805RERE1HiZfBD01KlTMXXq1FqPf/PNN3Wuo+05RERE1DiZfCsMIiIiImNjAkRERESNDhMgIiIianSYABEREVGjwwSIiIiIGh0mQERERNToMAEiIiKiRocJEBERETU6TICIiIio0TH5StDmSggBQPtdZbWlUChQWlqKwsJCbrRnQOxn42FfGwf72TjYz8ZhyH6u/rtd/Xe8NkyAalFUVAQACAwMNHEkREREVFdFRUVwcXGp9bhE3C9FaqRUKhUyMjLg5OQEiUSit3YLCwsRGBiI1NRUODs7661d0sR+Nh72tXGwn42D/WwchuxnIQSKiorg5+cHqbT2kT58AlQLqVRq0N3jnZ2d+cNlBOxn42FfGwf72TjYz8ZhqH6+15OfahwETURERI0OEyAiIiJqdJgAGZmtrS3mzp0LW1tbU4fSoLGfjYd9bRzsZ+NgPxuHOfQzB0ETERFRo8MnQERERNToMAEiIiKiRocJEBERETU6TID04OLFizh58iQUCoVe6+jSbkOWnJyMY8eOobi4WG91lEolLly4gGvXrqGyslJfoVq07OxsHD16FDdv3tR7HblcjoMHD+LChQv1DdPiFRQU4NixY0hNTdV7nZSUFJw5cwZKpbK+YVo8uVyOEydO4PLly3qtU1BQgFOnTuHSpUuoqKjQR6gWTaVS4ezZszhz5kydfpeePXsWhw8f1nu7WhGks+TkZNG+fXvh6ekpQkJChLe3t9i3b1+96+jSbkNWXFwsBg4cKJo0aSJatWolHBwcxLJly+pVR6lUiv/85z/Cy8tLhIeHi8DAQBESEiJ27dpl6NsxWyqVSrzyyivC1tZWhIeHC1tbWzFr1iy91nnllVeEVCoVgwYN0nf4FuXLL78U9vb2ok2bNsLe3l4MGTJElJeX17vO1atXRXR0tHB3dxedOnUSLVq0EAcOHDDkrZi1bdu2CQ8PDxEWFibc3NxEx44dRUZGRr3rvPbaa8Le3l48+OCDIiQkRPj4+IhNmzYZ8lbM2pkzZ0SzZs2Er6+v8Pf3F8HBweLEiRP3rLN8+XIREREh3NzchIeHh97arQsmQPXQo0cP0adPH1FRUSGEEGLWrFnCw8NDFBQU1KuOLu02ZC+//LIICwsTN2/eFEII8fPPPwupVCrOnj2rc52ioiIxb948cevWLSFE1R/y1157TTg7O4v8/HzD3pCZWrZsmXB0dBRnzpwRQghx9OhRYWtrK1avXq2XOps2bRJt27YVgwYNatQJUHx8vJBIJOLPP/8UQgiRnp4u/Pz8xJw5c+pVp6ioSISGhophw4aJsrIyIYQQGRkZYsOGDQa8G/N18+ZN4eTkJN5//30hhBBlZWUiKipKDBw4sF51du7cKQCIf/75R102Y8YM4ezsLJRKpYHuxnxVVlaK1q1bixEjRgiVSiWEEGLs2LEiLCxMKBSKWuu9+eab4vjx4+Lzzz+/awKka7t1wQRIRwkJCQKA2L17t7osJydHWFtbi59//lnnOrq025ApFArh7Ows/vvf/2qUh4aG1vqkQZc6QlT96xmA2L9/f/0Dt0DdunUTY8eO1Sh78sknRZ8+fepdJzU1Vfj5+YnTp0+LoUOHNuoEaPLkySIiIkKj7J133hHe3t71qrNo0SJhZ2cn8vLy9Buwhfr666+Fg4ODKCkpUZetX79eSCSSWp8CaVNn9erVQiqVCrlcrj5n3bp1QiqViqKiIgPdjfk6cOCAACDOnTunLrt8+bIAoNUT9doSoPq2qw2OAdLRyZMnAQAdO3ZUl3l4eCAsLEx9TJc6urTbkCUmJqKwsFCjPwCgc+fOtfaHLnUA4OjRo5BIJAgLC6t/4Bbo5MmTNfqsS5cu9+wzbepUVlZizJgxmDVrFtq3b6/foC1QbX1248YNZGZm6lxnz5496N69O1xcXHD69GlcuXKlUY9rO3nyJNq0aQMHBwd1WZcuXSCEwKlTp3Su8+STT6Jr164YN24cduzYgbVr1+I///kP/vOf/8DR0dGQt2SWTp48CVtbWzzwwAPqspYtW8LZ2blef7MM1e6duBmqjvLy8mBlZVVjwzUPDw/k5eXpXEeXdhuy6nv28PDQKPfw8EBCQoLe6mRkZGDmzJmYMGGCQTfBNVfl5eUoKyu7a5/l5+dDCAGJRKJTnffffx82NjaYMWOGwe/DEuTl5d21z6qP+fr66lQnIyMDbm5uiIyMhEqlQl5eHmQyGVauXImePXsa6G7M1/36TNc6Dg4OmDZtGqZPn44LFy6goKAAvr6+GDZsmL5vwSLcrc+A+v/NMlS7d+ITIB3JZDJUVlbWmKFVVlYGGxsbnevo0m5DJpPJAFT9sb3T/fq5LnVycnLwyCOPoFWrVliyZIk+wrY49+oza2vrGsmPtnXOnj2Ljz/+GM8//zwOHTqEgwcPIjc3F/n5+Th48CDKysoMdEfmSyaT3bXPANzze/p+dWQyGXbv3o1PPvkEZ86cwfXr19GvXz8MGzasUc5SMlQ/b9q0CePGjcPGjRtx5swZpKSkoG/fvujVqxdu3bql57swf3frM6D+f7MM1e6dmADpKDg4GEDVk4M7ZWRkICgoSOc6urTbkFX3R3p6ukZ5enr6fftZmzq5ubno27cv3N3dsWXLFtjb2+srdItiZWUFf3//u/ZZdX/qUqe0tBSdOnXCl19+iTfffBNvvvkmzp49i4sXL+LNN9+s01T7hiI4OPiufSaVSmt9+qhNnZCQEISGhqJ///4AAKlUiueffx43btyo9clnQ1ZbnwG45++O+9XZsmULOnTogG7duqnPeemll5CTk4PY2Fi9xW8pgoODkZ+fj9LSUnWZXC5Hbm5uvf5mGardOzEB0lF0dDSaNGmCP//8U10WFxeH7Oxs9OvXT1124sQJXLt2Tes62rbbWHh6eiIiIkKjP/Lz83HgwAGN/rh8+TLOnDlTpzp5eXno27cvXFxcsG3bNjRp0sQId2S++vXrh82bN0Pc3h5QpVJh8+bNGn2Wlpam8Uv+fnW6du2KgwcPavz30EMPoVu3bjh48GCjTOr79euH3bt3a/xi37RpE7p3765OwKufkFX/C1ibOo888ghyc3M1/tWclpYGAPDy8jL4fZmbfv364dq1axprTm3atAnu7u6IjIwEAFRUVKifSmpbx8vLC1lZWRrjq6rXZWqM/dy7d29IpVJs2bJFXbZt2zYolUr06dNHXRYfH4/r16/rvd160ctQ6kbq448/Fk2aNBHffPON+PXXX0WzZs3EU089pXFOq1atxAsvvFCnOtqc05hs27ZNWFlZiblz54o//vhD9OzZU4SHh6un+gohxIgRI0TXrl21rlNaWioiIyOFv7+/+Ouvv8Q///yj/q966nxjk5CQIJydncWzzz4r/vzzTzF69Gjh5uYmkpOT1ecsWLBA2Nra1qnOvzX2WWCFhYUiLCxM9O/fX2zatEnMnj1bWFtba8w+3Lx5swAgrly5onWdiooK0bFjRzFo0CCxdetW8dNPP4nAwEAxfvx4Y9+i2ejfv78IDw8X69atE4sWLRK2trbi66+/Vh9PTU0VAMS6deu0rnPlyhXh6Ogonn76abFt2zbxyy+/iFatWolu3bo1ymnwQlQtA+Dp6SlWrFghVq5cKby9vcXUqVM1znFxcRFz585Vfz5//rz4559/xLRp04SLi4v69++dM/C0abc+uBt8Pa1evRq//fYb5HI5evfujVdffRW2trbq42PGjEGHDh3w2muvaV1H23Mak3379uHbb79Fbm4uOnTogNmzZ8PT01N9/L333kNmZia+++47repkZWXh6aefvuu15s2bp79/YViYCxcu4NNPP0VSUhKaNWuG119/HS1btlQfX716NZYvX449e/ZoXeff3n33XVRUVODjjz826L2Ys6ysLHz00Uc4e/YsvL298dJLL6F79+7q47GxsXjjjTfw22+/wd/fX6s6QNXqxJ9++ini4uLg6uqKRx55BBMmTICVlZVR789clJaW4rPPPsOBAwfg4OCAMWPGaAxWvnnzJp566il88MEHeOihh7SqAwDXrl3D4sWLcfnyZdjb2yMqKgovvfRSo32KrFKp8P333+PPP/+EEAKDBg3ClClTNL7vBg4ciGHDhmHixIkAgNmzZ+PQoUM12vr5558RGhqqdbv1wQSIiIiIGh2OASIiIqJGhwkQERERNTpMgIiIiKjRYQJEREREjQ4TICIiImp0mAARERFRo8MEiIiIiBodJkBEZDDXr1/Hxo0bTR1GnWRkZGDdunWmDoOIDIwJEBHVS2pqKrZt24Zt27bhypUrGsdiY2Px/PPPmygy3Zw4cQLPPPOMqcMgIgOzNnUARGSZMjMzMWnSJOzfvx9RUVGwt7fHlStX4OrqiqVLl6Jdu3amDpGIqFZMgIiozkpKSvDwww/D29sbKSkp8PDwUB87fvw4iouLNc5XqVQ4d+4crl+/jrZt2yIkJER9LD8/Hzt27AAA2NraokWLFmjbtq1G/evXr+P48eMYPHhwre1oc061jIwMHDt2DC4uLoiMjISTk1Od++BebdwZS3x8PNLT0zFw4EBcunQJcrkcERERiI2NRXl5OR5//HEAQFFREWJjYyGXy9GlSxf4+PhoXG/Tpk2IiIiAlZUVjh8/jsDAQPUO5URUd0yAiKjOli5disTERGzdulUj+QGAjh07anyWy+Xo27cv5HI5HBwccODAASxduhTjxo0DUJUA/fHHHwCAsrIyxMfHo1OnTvjjjz8gk8kA/O9VWufOnWttR5tzgKqNcxctWoSoqCgUFxcjISEBa9asQe/evbW+//u1UR1Lx44dIZfLERwcjJiYGCxbtkyd5ISEhKB58+Z4/PHHsW/fPgwdOhQhISFwcXHB4cOH8cknn+Dll19WX/OFF15A+/btkZCQgA4dOuCJJ55gAkRUH3rbV56IGo0BAwaITp063fe8NWvWCADi22+/VZd99NFHws/Pr9Y6hYWFomXLlhp1tGlHm3M2bNggfHx8RGpqqrrs22+/FX5+fkIulwshhNi8ebOwtbWtNT5t2qiOZeHChRp1X3jhBSGVSsXhw4fVZeXl5SIkJES8+uqr6rJVq1YJmUwmrly5oi7z9vYWbdq0EQUFBbXGRkTa4yBoIqqzrKwsBAUFaXWuTCbDpEmT1J8feughZGRkaLwmU6lUOHr0KDZu3IitW7ciKCgIR44cqXM79ztnxYoVaNu2LeLj47Fu3TqsXbsWNjY2yMjIwOXLl7W6H23bkEgkGk9wqnXt2hVdunRRf46Pj0dycjLeeustddmYMWPg7++PDRs2aNR99tln4ezsrFWcRHRvfAVGRHXm5OSE3Nxcrc51dnaGlZWV+rOtrS0AoLy8HI6OjkhKSkL//v2hVCoRHh4OJycnXL9+HXZ2dnVqR5tzkpOTIYTA+vXrNdoeMWIEJBKJVvejbRtubm417gEAfH19NT6npKTA0dERXl5eGuXNmjVDSkrKPesSke6YABFRnXXp0gUrVqxASUkJmjRpUq+25s+fj5YtW2Lr1q3qsrFjx+LWrVv1jLImZ2dntGzZEsuXLzd4G7UlVP8u9/T0RElJCeRyuTphA4C8vDx4enpq1SYR1R1fgRFRnU2ZMgVlZWV4//33axxTKpXIysrSuq2srCy0atVK/bmwsBC7du3SS5z/NmDAAGzYsAHZ2dka5enp6UZt404dO3aEnZ2deiA4AFy5cgWnT59Gjx49dGqTiO6PT4CIqM6aNWuGX3/9FWPGjMGZM2fw+OOPw9bWFlevXsXGjRvxySef4IknntCqrSeffBKzZs2Cl5cXnJ2d8d1336GiosIgcc+cORNbt25F586dMXXqVLi6uuL48eOIi4vD2bNnjdbGnby9vfHOO+9g0qRJSEhIgIuLCz7//HM89thj6NevX53bIyLtMAEiIp088cQTSExMxJo1a3Dy5ElIJBK0aNECO3bsQHBwMAAgODgYQ4YM0ajn5uaGESNGqF/3TJ48GW5ubti5cyekUinmzp2L4uJi3LhxQ11Hm3a0Oad6avyaNWtw8OBBWFlZoWvXrli8eLG6jr+/P4YPH17rfWvTxt1iAYDOnTujqKioRvlbb72FBx98EJs3b0ZSUhLeeecdjan7QFWieLc1jYhINxIhhDB1EERERETGxDFARERE1OgwASIiIqJGhwkQERERNTpMgIiIiKjRYQJEREREjQ4TICIiImp0mAARERFRo8MEiIiIiBodJkBERETU6DABIiIiokaHCRARERE1OkyAiIiIqNH5f4Jk3TN9M8leAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 83.53s\n" + ] + } + ], + "source": [ + "plot_errors(STEANE_CODE, \n", + " num_points=11, \n", + " num_experiments=200,\n", + " max_p=0.1,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p))" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/07_SurfaceCode.ipynb b/error_correction/07_SurfaceCode.ipynb new file mode 100644 index 0000000..27fe217 --- /dev/null +++ b/error_correction/07_SurfaceCode.ipynb @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9621d8bd-7a73-455b-84df-891d375e76fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
                                        ┌──┐       ┌──┐   ┌──┐   ┌───┐   ┌───┐   ┌──┐       ┌──┐   ┌──┐       ┌──┐                                                                                                                                                                                                           ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐   ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐                        ┌────────────┐                        ┌────────┐   ┌────────┐   ┌────────┐   ┌────────┐          ┌────────┐\n",
+       "aux_1: ────H────────────────────────────────────────────────────────────────@─────H─────H─────X──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@────────────────────────────────────────────────────────────────────────────────────X(conditions=[m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m0 & m7 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────H^-1───H^-1───────────────@───────────H^-1─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                            │                 │                                                                                                                                                                                                      │                                                                                    ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ║                                                                                                                                                                                                                                                                           │\n",
+       "aux_2: ────Z────────────H───────────────────────────────────────────@───────┼──────@────H────X┼─────S─────X────S─────×───────────────────────────────X───────────────────────────────────────────────────────────────────────────────────────@───────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m2 & m5 & ~m0 & ~m1 & ~m3 & ~m4 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Z(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────S^-1────X^-1┼───────────S^-1───X^-1───H^-1────@────────────@────────────H^-1─────────Z^-1────────────────────────────────────────────────────────\n",
+       "                                                                    │       │      │         ││           │          │                               │                                                                                       │                                                       │                                                                                    ║                                                           ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ║                                                          ║                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ║                                                           ║                                                                                                                                                                                            │              │   │                  │              │            │\n",
+       "aux_3: ────H────────────────────────────────────────────────@──────@┼──────@┼─────H┼────H────┼┼───────────┼──────────×───H───X───────────────────────┼───────────────────────────────────X───────────────────────────────────────────────────┼───────────────────────@───────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m1 & m3 & m6 & ~m0 & ~m2 & ~m4 & ~m5 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Z(conditions=[m1 & m3 & ~m0 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────H^-1───×^-1───H^-1────┼───┼───H^-1───────────┼──────────────┼────────────┼───@────────@────────────@───────────H^-1────────────────────────────────────────────\n",
+       "                                                            │      ││      ││      │         ││           │                  │                       │                                   │                                                   │                       │                               │                                                                                    ║                                                           ║                                                           ║                                                                                                                                                                                                                                                                                                                                                                                                                                 ║                                                          ║                                                          ║                                                                                                                                                                                                                                                                                                                                                                                                                              ║                                                           ║                                                           ║                                                                                                                                               │   │                  │              │            │   │        │            │\n",
+       "aux_4: ────X────────────H───────────S────────────────@─────@┼─────H┼┼─────H┼┼──────┼─────────@┼───────────@────×─────────────┼───X───────────────────┼───────────────────────────────────┼───────────────────────────────────────────────────┼───────────────────────┼───@───────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Y(conditions=[m1 & m6 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Z(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×─────────────────────@───┼──────────────────@──────H^-1────┼───H^-1─────┼───┼────────┼───@────────┼───@───────S^-1────H^-1────────X^-1────────────────────────\n",
+       "                                                     │     ││      ││      ││      │          │                │             │   │                   │                                   │                                                   │                       │   │                           │                                                                                    ║                                                           ║                                                           ║                                                           ║                                                                                                                                                                                                                                                                                                                                                                     ║                                                          ║                                                          ║                                                         ║                                                                                                                                                                                                                                                                                                                                                                    ║                                                           ║                                                           ║                                                                                                                         │                         │                                 │            │   │        │   │        │   │\n",
+       "aux_5: ───────────────────────────────────X────@────×┼─────X┼──────┼┼──────X┼──────X────@─────┼─────X──────────┼─────────────┼───┼───────────────────┼───X───────────────────────────────┼───X───────────────────────────────────────────────┼───────────────────────┼───┼───@───────────────────────┼───@────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m6 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Y(conditions=[m2 & m3 & m6 & m7 & ~m0 & ~m1 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Z(conditions=[m2 & m3 & ~m0 & ~m1 & ~m4 & ~m5 & ~m6 & ~m7])────┼──────X^-1───────────@───┼─────────────────────────────────X^-1─────────┼───X^-1─────┼───X^-1─────┼───┼───────×───────@───────────X^-1────────────────────────\n",
+       "                                          │    │    ││      │      ││       │           │     │     │          │             │   │                   │   │                               │   │                                               │                       │   │   │                       │   │                                                                                ║                                                           ║                                                           ║                                                           ║                                                          ║                                                                                                                                                                                                                                                                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                                                                                                                                                                                                                                                                        ║                                                           ║                                                           ║                                                          ║                                                              │      │              │   │                                              │            │            │   │       │       │           │\n",
+       "aux_6: ─────────────────────────────@────@┼────┼────┼┼──────┼──────X┼─────@─┼───────────┼─────┼─────┼──────────┼─────────────┼───┼───────────────────┼───┼───X───────────────────────────┼───┼───────────────────────────────────────────────┼───@───────────────────┼───┼───┼───@───────────────────┼───┼────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m5 & m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────Y(conditions=[m2 & m5 & m6 & ~m0 & ~m1 & ~m3 & ~m4 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────────────┼───┼───────────@──────────────────────────────────┼────────────X^-1─────────┼───┼───────┼───────┼───@───────┼──────@────────────────────\n",
+       "                                    │    ││    │    ││      │       │     │ │           │     │     │          │             │   │                   │   │   │                           │   │                                               │   │                   │   │   │   │                   │   │                                                                                ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                                                                                                                                                                                                               ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                                                                                                                                                                                                               ║                                                           ║                                                           ║                                                          ║                                                              │      │              │   │           │                                  │                         │   │       │       │   │       │      │\n",
+       "aux_7: ────X────────────@───────────┼────X┼────┼────×┼──────X───────X─────┼─X───────────┼────X┼─────┼X─────────┼─────────────┼───┼───────────────────┼───┼───┼───X───────────────────────┼───┼───────────────────────────────────────────────┼───┼───────────────────┼───┼───┼───┼───────────────────┼───┼───@────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m0 & m2 & m7 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Z(conditions=[m0 & m2 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────X^-1────┼───X^-1────────┼──────────────────────────────────X^-1──────────────────────X^-1┼───────×^-1────┼───X^-1────┼──────┼──────@──────X^-1───\n",
+       "                        │           │     │    │     │                    │             │    ││     ││         │             │   │                   │   │   │   │                       │   │                                               │   │                   │   │   │   │                   │   │   │                                                                            ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                                                                                                                                                    ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                                                                                                                                                     ║                                                           ║                                                           ║                                                          ║                                                              │      │      │       │               │                                                                │               │           │      │      │\n",
+       "aux_8: ─────────────────X───────────X─────@────X─────X─────@──────────────┼─────────────┼────┼┼─────┼┼─────────┼─────────────┼───┼───────────────────┼───┼───┼───┼───────────────────────┼───┼───X───────────────────────@───────────────────┼───┼───────────────────┼───┼───┼───┼───────────────────┼───┼───┼───@────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────X(conditions=[m4 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6])────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m3 & m4 & m7 & ~m0 & ~m1 & ~m2 & ~m5 & ~m6])─────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────┼───────┼───────────────┼──────@─────────────────────────────────────────────────────────X^-1────────────X^-1────────@──────X^-1───X^-1──────────\n",
+       "                                                           │              │             │    ││     ││         │             │   │                   │   │   │   │                       │   │   │                       │                   │   │                   │   │   │   │                   │   │   │   │                                                                        ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                                                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                                                                                          ║                                                           ║                                                           ║                                                          ║                                                              │      │      │       │               │      │\n",
+       "aux_9: ────H───────────────────────────────────────────────┼──────────────┼─────────────┼────┼@─────┼@────H────┼M────R───H───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────┼───────┼───────────────┼──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                           │              │             │    │      │          │║                        ║                               ║           │                   ║           │           ║                       ║                               ║                               ║                                                                ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                                                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                                                                                          ║                                                           ║                                                           ║                                                          ║                                                              │      │      │       │               │      │\n",
+       "q_init: ───Ry(0.703π)───Rz(1.21π)──────────────────────────X──────────────X─────────────X────@──────@──────────×╫────────────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────@───────────╫───────────────────────╫───────────────────────────────╫───────────────────────────────╫────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6 & ~m7])╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────Y(conditions=[m3 & m4 & ~m0 & ~m1 & ~m2 & ~m5 & ~m6 & ~m7])╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────Z(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────×^-1───@──────@───────X^-1────────────X^-1───X^-1──────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "                                                                                                                ║                        ║                               ║                               ║                       ║                       ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m0: ════════════════════════════════════════════════════════════════════════════════════════════════════════════@════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                         ║                               ║                               ║                       ║                       ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m1: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                         ║                               ║                       ║                       ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m2: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                         ║                       ║                       ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m3: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                 ║                       ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m4: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                         ║                               ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m5: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                                                         ║                               ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m6: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                                                                                                                                                                                                                                                                                                         ║    ║                                                           ║                                                           ║                                                           ║                                                           ║                                                          ║                                                          ║                                                          ║                                                         ║                                                               ║                                                          ║                                                          ║                                                          ║                                                         ║                                                           ║                                                        ║                                                         ║                                                          ║                                                              ║                                                           ║                                                           ║                                                           ║                                                          ║\n",
+       "m7: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n",
+       "                                        └──┘       └──┘   └──┘   └───┘   └───┘   └──┘       └──┘   └──┘       └──┘                                                                                                                                                                                                           └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘   └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘                        └────────────┘                        └────────┘   └────────┘   └────────┘   └────────┘          └────────┘
" + ], + "text/plain": [ + " ┌──┐ ┌──┐ ┌──┐ ┌───┐ ┌───┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌────────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐\n", + "aux_1: ────H────────────────────────────────────────────────────────────────@─────H─────H─────X──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@────────────────────────────────────────────────────────────────────────────────────X(conditions=[m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Y(conditions=[m0 & m7 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Z(conditions=[m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────H^-1───H^-1───────────────@───────────H^-1─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " │ │ │ ║ ║ ║ │\n", + "aux_2: ────Z────────────H───────────────────────────────────────────@───────┼──────@────H────X┼─────S─────X────S─────×───────────────────────────────X───────────────────────────────────────────────────────────────────────────────────────@───────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m5 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m6 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m2 & m5 & ~m0 & ~m1 & ~m3 & ~m4 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Z(conditions=[m2 & ~m0 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×──────S^-1────X^-1┼───────────S^-1───X^-1───H^-1────@────────────@────────────H^-1─────────Z^-1────────────────────────────────────────────────────────\n", + " │ │ │ ││ │ │ │ │ │ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_3: ────H────────────────────────────────────────────────@──────@┼──────@┼─────H┼────H────┼┼───────────┼──────────×───H───X───────────────────────┼───────────────────────────────────X───────────────────────────────────────────────────┼───────────────────────@───────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────X(conditions=[m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m1 & m3 & m6 & ~m0 & ~m2 & ~m4 & ~m5 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Z(conditions=[m1 & m3 & ~m0 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────H^-1───×^-1───H^-1────┼───┼───H^-1───────────┼──────────────┼────────────┼───@────────@────────────@───────────H^-1────────────────────────────────────────────\n", + " │ ││ ││ │ ││ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │\n", + "aux_4: ────X────────────H───────────S────────────────@─────@┼─────H┼┼─────H┼┼──────┼─────────@┼───────────@────×─────────────┼───X───────────────────┼───────────────────────────────────┼───────────────────────────────────────────────────┼───────────────────────┼───@───────────────────────────┼────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Y(conditions=[m1 & m6 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Z(conditions=[m1 & ~m0 & ~m2 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────×─────────────────────@───┼──────────────────@──────H^-1────┼───H^-1─────┼───┼────────┼───@────────┼───@───────S^-1────H^-1────────X^-1────────────────────────\n", + " │ ││ ││ ││ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │\n", + "aux_5: ───────────────────────────────────X────@────×┼─────X┼──────┼┼──────X┼──────X────@─────┼─────X──────────┼─────────────┼───┼───────────────────┼───X───────────────────────────────┼───X───────────────────────────────────────────────┼───────────────────────┼───┼───@───────────────────────┼───@────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m6 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────Y(conditions=[m2 & m3 & m6 & m7 & ~m0 & ~m1 & ~m4 & ~m5])────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Z(conditions=[m2 & m3 & ~m0 & ~m1 & ~m4 & ~m5 & ~m6 & ~m7])────┼──────X^-1───────────@───┼─────────────────────────────────X^-1─────────┼───X^-1─────┼───X^-1─────┼───┼───────×───────@───────────X^-1────────────────────────\n", + " │ │ ││ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │ │ │\n", + "aux_6: ─────────────────────────────@────@┼────┼────┼┼──────┼──────X┼─────@─┼───────────┼─────┼─────┼──────────┼─────────────┼───┼───────────────────┼───┼───X───────────────────────────┼───┼───────────────────────────────────────────────┼───@───────────────────┼───┼───┼───@───────────────────┼───┼────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────X(conditions=[m5 & m6 & ~m0 & ~m1 & ~m2 & ~m3 & ~m4 & ~m7])─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────Y(conditions=[m2 & m5 & m6 & ~m0 & ~m1 & ~m3 & ~m4 & ~m7])──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────────────┼───┼───────────@──────────────────────────────────┼────────────X^-1─────────┼───┼───────┼───────┼───@───────┼──────@────────────────────\n", + " │ ││ │ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │ │ │ │ │\n", + "aux_7: ────X────────────@───────────┼────X┼────┼────×┼──────X───────X─────┼─X───────────┼────X┼─────┼X─────────┼─────────────┼───┼───────────────────┼───┼───┼───X───────────────────────┼───┼───────────────────────────────────────────────┼───┼───────────────────┼───┼───┼───┼───────────────────┼───┼───@────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m0 & m2 & m7 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────Z(conditions=[m0 & m2 & ~m1 & ~m3 & ~m4 & ~m5 & ~m6 & ~m7])───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────X^-1────┼───X^-1────────┼──────────────────────────────────X^-1──────────────────────X^-1┼───────×^-1────┼───X^-1────┼──────┼──────@──────X^-1───\n", + " │ │ │ │ │ │ │ ││ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │ │ │ │ │\n", + "aux_8: ─────────────────X───────────X─────@────X─────X─────@──────────────┼─────────────┼────┼┼─────┼┼─────────┼─────────────┼───┼───────────────────┼───┼───┼───┼───────────────────────┼───┼───X───────────────────────@───────────────────┼───┼───────────────────┼───┼───┼───┼───────────────────┼───┼───┼───@────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────X(conditions=[m4 & m7 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6])────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────Y(conditions=[m3 & m4 & m7 & ~m0 & ~m1 & ~m2 & ~m5 & ~m6])─────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────┼───────┼───────────────┼──────@─────────────────────────────────────────────────────────X^-1────────────X^-1────────@──────X^-1───X^-1──────────\n", + " │ │ │ ││ ││ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "aux_9: ────H───────────────────────────────────────────────┼──────────────┼─────────────┼────┼@─────┼@────H────┼M────R───H───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───H───M───R───H───@───@───H───M───R───H───@───@───@───@───H───M───R───H───@───@───@───@───H───M────R───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────┼──────┼──────┼───────┼───────────────┼──────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " │ │ │ │ │ │║ ║ ║ │ ║ │ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ │ │ │ │ │ │\n", + "q_init: ───Ry(0.703π)───Rz(1.21π)──────────────────────────X──────────────X─────────────X────@──────@──────────×╫────────────────────────╫───────────────────────────────╫───────────X───────────────────╫───────────@───────────╫───────────────────────╫───────────────────────────────╫───────────────────────────────╫────X(conditions=[m4 & ~m0 & ~m1 & ~m2 & ~m3 & ~m5 & ~m6 & ~m7])╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────────Y(conditions=[m3 & m4 & ~m0 & ~m1 & ~m2 & ~m5 & ~m6 & ~m7])╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫────────────────────────────────────────────────────────╫─────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────Z(conditions=[m3 & ~m0 & ~m1 & ~m2 & ~m4 & ~m5 & ~m6 & ~m7])╫───────────────────────────────────────────────────────────╫───────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────╫──────────────────────────────────────────────────────────────×^-1───@──────@───────X^-1────────────X^-1───X^-1──────────────────────────────────────────────────────────────────────────────────────────────────────────────\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m0: ════════════════════════════════════════════════════════════════════════════════════════════════════════════@════════════════════════╬═══════════════════════════════╬═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m1: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m2: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m3: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m4: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════╬═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m5: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m6: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@═══════════════════════════════╬════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║\n", + "m7: ═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════@════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^═══════════════════════════════════════════════════════════^══════════════════════════════════════════════════════════^═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════\n", + " └──┘ └──┘ └──┘ └───┘ └───┘ └──┘ └──┘ └──┘ └──┘ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ └────────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from error_correction.channels import ArbitraryErrorChannel\n", + "from error_correction.stabilizer_codes import SURFACE_17_CODE\n", + "from error_correction.utils import test_protocol_once, plot_errors\n", + "\n", + "code = SURFACE_17_CODE\n", + "data={}\n", + "assert test_protocol_once(code, ArbitraryErrorChannel(0.01), output=data)\n", + "data['circuit']" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "81c01c67-ad02-4e31-82bf-6d54b58411ba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9,1,3]]\n" + ] + } + ], + "source": [ + "print(SURFACE_17_CODE.signature())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "47a27c8a-1068-4058-b67d-c8cdceccbba2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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oMblq969e2P06NE1avPmm2/i4MGDcHFxQVxcHPr27YsbN26gc+fORj0/IiKi+qqkVIXo5BwAQNcGGIBMvhSGv78/5s+fX+X3U6dOrXEbAAgLC0NYWFit6yMiIjJHsWl5kJeq4GonQ6C7vanL0buG80YjIiIi0pt/z/+RSCQmrkb/GICIiIiogsiEsifAGuL8H4ABiIiIiP5DCPHPFSB/BiAiIiIyAyk5RcjIk8PSQoIOvi6mLscgGICIiIhIQ/nVn7beTrC1kpq4GsNgACIiIiINUeoJ0I1MXInhMAARERGRhsjEhvsG6HIMQERERKR2X16KK2lli453bupi2mIMiAGIiIiI1KKTcqBUCfi42MLL2dbU5RgMAxARERGpRTbg9b/+jQGIiIiI1NTzf/xdTFuIgTEAEREREQBApRJm8QQYwABEREREf7t5pwB5xaWwlUnRxsvR1OUYFAMQERERAfhn/k+InwsspQ07IjTssyMiIiKt/XsF+IaOAYiIiIgAMAARERGRmcm+X4Jbd+8DADo18CfAAAYgIiIiwj/rfzVv7AAXOysTV2N4DEBERET0r/f/NPzbXwADEBEREeFf838CGICIiIjIDCiUKkQn5QAwjwnQgI4B6L333tN3HURERGQisal5kJeq4GInQzN3e1OXYxQ6BaAlS5agtLRU37UQERGRCahvf/m7QiKRmLga49ApAHXq1AknTpzQdy1ERERkAuayAvy/WerSaNSoUXjiiScwe/ZsBAcHw8pK83G5gQMH6qU4IiIiMiwhBM4lZAMwn/k/gI4BaO7cuQCAOXPmVPq9EEL3ioiIiMhoUnOLkZEnh9RCgo6+LqYux2h0CkAMOERERA1D+e2vtt5OsLWSmrga4+Fj8ERERGYsyozW//o3na4AAYBSqcTu3btx5coVCCEQHByMRx99FBYWzFRERET1hTktgPpvOgWghIQEDB8+HFeuXEHTpk0hkUiQkJCA1q1bY/v27WjatKm+6yQiIiI9KywpRWxaHgDzC0A6Xa559dVX4evri8TERNy4cQNxcXFISEiAr68vXn31VX3XSERERAZwISkHSpWAt7MNvJxtTV2OUel0BejAgQO4evUqvLy81Nu8vLzw7bffonXr1norjoiIiAwnygzf/1NOpytAEomk0ifBVCoV5wARERHVE+Y6/wfQMQANGjQIzz33HFJS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time: 150.18s\n" + ] + } + ], + "source": [ + "plot_errors(SURFACE_17_CODE, \n", + " num_points=11, \n", + " num_experiments=200,\n", + " max_p=0.1,\n", + " channel_factory=lambda p:ArbitraryErrorChannel(p))" + ] + } + ], + "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.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/error_correction/stabilizer_codes.py b/error_correction/stabilizer_codes.py index e73a013..220163a 100644 --- a/error_correction/stabilizer_codes.py +++ b/error_correction/stabilizer_codes.py @@ -360,6 +360,7 @@ def decode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: ["XZZXI", "IXZZX", "XIXZZ", "ZXIXZ"], ) +# https://errorcorrectionzoo.org/c/shor_nine SHOR_CODE = StabilizerCode( 9, 1, @@ -375,3 +376,35 @@ def decode(self, ct: Circuit, qubits: list[Qid]) -> list[Qid]: "IIIXXXXXX", ], ) + +# https://errorcorrectionzoo.org/c/steane +STEANE_CODE = StabilizerCode( + 7, + 1, + 3, + [ + "IIIXXXX", + "IXXIIXX", + "XIXIXIX", + "IIIZZZZ", + "IZZIIZZ", + "ZIZIZIZ", + ], +) + +# https://errorcorrectionzoo.org/c/surface-17?utm_source=chatgpt.com +SURFACE_17_CODE = StabilizerCode( + 9, + 1, + 3, + [ + "IXIIIIIXI", + "IIIXXIIII", + "IIXIIXXXI", + "XIIXIXIIX", + "ZIIIIIIIZ", + "IIZIIIZII", + "IIIZZZZII", + "IZIIIZIZZ", + ], +) diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py index 45d5733..fdd3eaf 100644 --- a/error_correction/stabilizer_codes_test.py +++ b/error_correction/stabilizer_codes_test.py @@ -2,7 +2,13 @@ import numpy as np import pytest -from error_correction.stabilizer_codes import FIVE_QUBIT_PERFECT_CODE, StabilizerSet +from error_correction.stabilizer_codes import ( + FIVE_QUBIT_PERFECT_CODE, + SHOR_CODE, + STEANE_CODE, + SURFACE_17_CODE, + StabilizerSet, +) def test_five_qubit_perfect_code(): @@ -10,6 +16,21 @@ def test_five_qubit_perfect_code(): assert code.signature() == "[[5,1,3]]" +def test_shor_code(): + code = SHOR_CODE + assert code.signature() == "[[9,1,3]]" + + +def test_steane_code(): + code = STEANE_CODE + assert code.signature() == "[[7,1,3]]" + + +def test_surface_17_code(): + code = SURFACE_17_CODE + assert code.signature() == "[[9,1,3]]" + + def test_stabilizer_set_rejects_noncommuting_generators(): with pytest.raises( ValueError, @@ -41,16 +62,10 @@ def test_five_qubit_perfect_code_corrects_single_qubit_errors(): for pauli in (cirq.X, cirq.Y, cirq.Z): circuit = cirq.Circuit() logical_qubit = cirq.NamedQubit("logical") - circuit.append( - [cirq.ry(theta)(logical_qubit), cirq.rz(phi)(logical_qubit)] - ) - encoded_qubits = FIVE_QUBIT_PERFECT_CODE.encode( - circuit, [logical_qubit] - ) + circuit.append([cirq.ry(theta)(logical_qubit), cirq.rz(phi)(logical_qubit)]) + encoded_qubits = FIVE_QUBIT_PERFECT_CODE.encode(circuit, [logical_qubit]) circuit.append(pauli(encoded_qubits[qubit_index])) - decoded_qubit = FIVE_QUBIT_PERFECT_CODE.decode( - circuit, encoded_qubits - )[0] + decoded_qubit = FIVE_QUBIT_PERFECT_CODE.decode(circuit, encoded_qubits)[0] result = cirq.DensityMatrixSimulator(seed=1).simulate(circuit) num_qubits = len(result.qubit_map) From e61fa08568e057aaded8fca5125a511096b54d28 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 17:00:36 -0700 Subject: [PATCH 7/9] format --- error_correction/channels.py | 12 +++++++----- error_correction/protocols.py | 3 +-- error_correction/protocols_test.py | 5 +---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/error_correction/channels.py b/error_correction/channels.py index 5913051..63a13c5 100644 --- a/error_correction/channels.py +++ b/error_correction/channels.py @@ -1,6 +1,7 @@ import numpy as np import cirq + class BitFlipChannel: def __init__(self, flip_prob): self.flip_prob = flip_prob @@ -20,13 +21,14 @@ def transmit(self, ct, q): ct.append(cirq.Z(q)) return q + class ArbitraryErrorChannel: def __init__(self, flip_prob): self.flip_prob = flip_prob - + def transmit(self, ct, q): if np.random.rand() < self.flip_prob: - ct.append(cirq.Rx(rads=np.random.rand()*2*np.pi).on(q)) - ct.append(cirq.Ry(rads=np.random.rand()*2*np.pi).on(q)) - ct.append(cirq.Rz(rads=np.random.rand()*2*np.pi).on(q)) - return q \ No newline at end of file + ct.append(cirq.Rx(rads=np.random.rand() * 2 * np.pi).on(q)) + ct.append(cirq.Ry(rads=np.random.rand() * 2 * np.pi).on(q)) + ct.append(cirq.Rz(rads=np.random.rand() * 2 * np.pi).on(q)) + return q diff --git a/error_correction/protocols.py b/error_correction/protocols.py index 2aed1ab..42bc30d 100644 --- a/error_correction/protocols.py +++ b/error_correction/protocols.py @@ -1,4 +1,3 @@ -import numpy as np import cirq from cirq import Circuit, Qid @@ -87,7 +86,7 @@ def encode(self, circuit, qubits: list[Qid]) -> list[Qid]: circuit.append(cirq.H(q)) return qubits - def decode(self, circuit, qubits: list[Qid]) ->list[Qid]: + def decode(self, circuit, qubits: list[Qid]) -> list[Qid]: for q in qubits: circuit.append(cirq.H(q)) return self.bf_protocol.decode(circuit, qubits) diff --git a/error_correction/protocols_test.py b/error_correction/protocols_test.py index 1743530..c774b57 100644 --- a/error_correction/protocols_test.py +++ b/error_correction/protocols_test.py @@ -1,5 +1,3 @@ - - from error_correction.channels import ArbitraryErrorChannel from error_correction.protocols import ShorProtocol from error_correction.utils import test_protocol @@ -8,5 +6,4 @@ def test_shor_code(): protocol = ShorProtocol() channel = ArbitraryErrorChannel(0.01) - assert test_protocol(protocol, channel, num_experiments=10) <= 0.1 - \ No newline at end of file + assert test_protocol(protocol, channel, num_experiments=10) <= 0.1 From 918ffeaf59d94c8fd6bf59aa722dab92aa639819 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 17:06:30 -0700 Subject: [PATCH 8/9] add tests --- error_correction/stabilizer_codes_test.py | 73 ++++++++++++----------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py index fdd3eaf..105dde3 100644 --- a/error_correction/stabilizer_codes_test.py +++ b/error_correction/stabilizer_codes_test.py @@ -3,6 +3,7 @@ import pytest from error_correction.stabilizer_codes import ( + StabilizerCode, FIVE_QUBIT_PERFECT_CODE, SHOR_CODE, STEANE_CODE, @@ -11,26 +12,6 @@ ) -def test_five_qubit_perfect_code(): - code = FIVE_QUBIT_PERFECT_CODE - assert code.signature() == "[[5,1,3]]" - - -def test_shor_code(): - code = SHOR_CODE - assert code.signature() == "[[9,1,3]]" - - -def test_steane_code(): - code = STEANE_CODE - assert code.signature() == "[[7,1,3]]" - - -def test_surface_17_code(): - code = SURFACE_17_CODE - assert code.signature() == "[[9,1,3]]" - - def test_stabilizer_set_rejects_noncommuting_generators(): with pytest.raises( ValueError, @@ -47,25 +28,25 @@ def test_stabilizer_set_rejects_dependent_generators(): StabilizerSet(["XX", "XX"]) -def test_five_qubit_perfect_code_corrects_single_qubit_errors(): - theta = 0.731 - phi = -0.294 - expected_bloch_vector = np.array( - [ - np.sin(theta) * np.cos(phi), - np.sin(theta) * np.sin(phi), - np.cos(theta), - ] - ) - - for qubit_index in range(5): +def assert_code_corrects_single_qubit_errors(code: StabilizerCode): + for qubit_index in range(code.n): for pauli in (cirq.X, cirq.Y, cirq.Z): + theta = np.random.rand() * np.pi + phi = np.random.rand() * 2 * np.pi + expected_bloch_vector = np.array( + [ + np.sin(theta) * np.cos(phi), + np.sin(theta) * np.sin(phi), + np.cos(theta), + ] + ) + circuit = cirq.Circuit() logical_qubit = cirq.NamedQubit("logical") circuit.append([cirq.ry(theta)(logical_qubit), cirq.rz(phi)(logical_qubit)]) - encoded_qubits = FIVE_QUBIT_PERFECT_CODE.encode(circuit, [logical_qubit]) + encoded_qubits = code.encode(circuit, [logical_qubit]) circuit.append(pauli(encoded_qubits[qubit_index])) - decoded_qubit = FIVE_QUBIT_PERFECT_CODE.decode(circuit, encoded_qubits)[0] + decoded_qubit = code.decode(circuit, encoded_qubits)[0] result = cirq.DensityMatrixSimulator(seed=1).simulate(circuit) num_qubits = len(result.qubit_map) @@ -80,5 +61,27 @@ def test_five_qubit_perfect_code_corrects_single_qubit_errors(): ] ) np.testing.assert_allclose( - actual_bloch_vector, expected_bloch_vector, atol=1e-5 + actual_bloch_vector, expected_bloch_vector, atol=2e-5 ) + + +def test_five_qubit_perfect_code(): + code = FIVE_QUBIT_PERFECT_CODE + assert code.signature() == "[[5,1,3]]" + assert_code_corrects_single_qubit_errors(code) + + +def test_shor_code(): + code = SHOR_CODE + assert code.signature() == "[[9,1,3]]" + + +def test_steane_code(): + code = STEANE_CODE + assert code.signature() == "[[7,1,3]]" + assert_code_corrects_single_qubit_errors(code) + + +def test_surface_17_code(): + code = SURFACE_17_CODE + assert code.signature() == "[[9,1,3]]" From d2495ac3c38335eb79d6d924ec1d61ad0814c865 Mon Sep 17 00:00:00 2001 From: Dmytro Fedoriaka Date: Sun, 4 Oct 2026 17:06:47 -0700 Subject: [PATCH 9/9] add tests --- error_correction/stabilizer_codes_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/error_correction/stabilizer_codes_test.py b/error_correction/stabilizer_codes_test.py index 105dde3..a9306fe 100644 --- a/error_correction/stabilizer_codes_test.py +++ b/error_correction/stabilizer_codes_test.py @@ -84,4 +84,4 @@ def test_steane_code(): def test_surface_17_code(): code = SURFACE_17_CODE - assert code.signature() == "[[9,1,3]]" + assert code.signature() == "[[9,1,3]]"