QC-Project / Archive / QuantumPhaseEstimator.ipynb
QuantumPhaseEstimator.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "37f3a36c-f7a3-47fb-8870-936d2b51bb43",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ibmqfactory.load_account:WARNING:2021-10-05 17:18:20,634: Credentials are already in use. The existing account in the session will be replaced.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import scipy\n",
    "# Importing standard Qiskit libraries\n",
    "from qiskit import *\n",
    "from qiskit.tools.jupyter import *\n",
    "from qiskit.visualization import *\n",
    "from ibm_quantum_widgets import *\n",
    "from qiskit.providers.aer import QasmSimulator\n",
    "from qiskit.aqua.utils.controlled_circuit import get_controlled_circuit\n",
    "# Loading your IBM Quantum account(s)\n",
    "provider = IBMQ.load_account()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29b9186d-14e0-4c01-a452-1691380c17ad",
   "metadata": {},
   "source": [
    "# Some more imports  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "761bac87-c11b-4c05-8f19-12fa0ee0dc12",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit.quantum_info.operators import Operator, Pauli\n",
    "from qiskit.aqua.algorithms import QPE\n",
    "from qiskit.circuit.library import QFT\n",
    "from qiskit.quantum_info import random_statevector\n",
    "from qiskit.opflow import X,Y,Z,I,CX\n",
    "pi = np.pi\n",
    "sin = np.sin\n",
    "cos = np.cos\n",
    "exp = np.exp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "df0f7077-7b2f-421f-8808-5c243d6ab3a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit.algorithms import NumPyEigensolver\n",
    "from qiskit.aqua.operators import WeightedPauliOperator, MatrixOperator, op_converter"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8942aab-2e93-468a-9651-7f290da81f62",
   "metadata": {},
   "source": [
    "# Three Quantum Phase estimators are defined to compare on the same evolution matrix : 1st in-built QPE, 2nd my_qpe, 3rd QPE by DavidKach(Github)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25fda5e3-356f-49e7-9687-a72ae0dd1b23",
   "metadata": {},
   "source": [
    "# 2nd QPE : Defining matrix to control gate convertor, Quantum Phase Estimator and result.count to eigen value convertor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "fef4557d-4eb2-4fa9-84ab-133ab7e06fde",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Operator to gate convertor\n",
    "def qc(operator):\n",
    "    qubit_list = list(range(int(len(operator)/2)))\n",
    "    qc = QuantumCircuit(len(qubit_list))\n",
    "    qc.unitary(operator,qubit_list)\n",
    "    qc = transpile(qc)\n",
    "    #gate = qc.to_gate().control(1)\n",
    "    return qc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "8e946f24-815d-4bd8-9c76-c8a40500c503",
   "metadata": {},
   "outputs": [],
   "source": [
    "#s_qubits is number available of energy levels\n",
    "def evoloperator(s_qubits):\n",
    "    evoloperator2 = QuantumCircuit(s_qubits)\n",
    "    for p in range(s_qubits):\n",
    "        for q in range(s_qubits):\n",
    "            if (q > p):\n",
    "                evoloperator2 = evoloperator2.compose(qc(operator),[p,q])\n",
    "    evol_gate = evoloperator2#.to_gate().control(1)\n",
    "    return evol_gate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "9139e0f6-2473-4f86-9866-8b80d15830c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# my_qpe takes in work qubits, simulation qubits, initialization condition and number of repetitions gate and applies QFT inverse\n",
    "# Please convert/make sure the initial_state to a list before passing in argugement\n",
    "def my_qpe(w_qubits,s_qubits, gate, initial_state = None, repetitions=1):  \n",
    "    qpe_0 = QuantumCircuit(w_qubits+s_qubits,w_qubits)\n",
    "    if (initial_state != None):\n",
    "        qpe_0.initialize(initial_state,list(range(w_qubits,w_qubits+s_qubits)))\n",
    "    for i in range(w_qubits):\n",
    "        qpe_0.h(i)\n",
    "    for counting_qubit in range(w_qubits):\n",
    "        for j in range(trotter_number):\n",
    "            for i in range(repetitions):\n",
    "                qubit_list = [counting_qubit]+list(range(w_qubits,w_qubits+s_qubits))\n",
    "                qpe_0.append(gate,qubit_list)\n",
    "            repetitions *= 2\n",
    "    qpe_1 = QFT(w_qubits, 0, True , True)\n",
    "    l = [*range(w_qubits)]\n",
    "    qpe = qpe_0.compose(qpe_1, l)\n",
    "    qpe.measure(l,l)\n",
    "    return qpe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "df095435-d4e2-4ec0-bb96-415f62c174db",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Eigen values of Hamiltonian operator H, n is to choose how many data points from the plot are we selecting\n",
    "def plot_to_eigenval2(count,w_qubits,n):\n",
    "    if t == 0:\n",
    "        display(0)\n",
    "    else:\n",
    "        lists = sorted(count, key=count.get, reverse=True)[:n]\n",
    "        #k=Counter(count).most_common(w_qubits) # Method to pick out the most probable outcomes based on number of expected eigen values\n",
    "        for j in range(len(lists)):\n",
    "            temp = str(lists[j])\n",
    "            temp = temp[::-1]\n",
    "            lists[j] =  int(temp, 2) #Convert them to decimal values\n",
    "        for j in range(len(lists)):\n",
    "            if (lists[j]>pow(2,w_qubits-1)):\n",
    "                lists[j] = -2*pi*(lists[j])/((2**w_qubits)*t)\n",
    "            else :\n",
    "                lists[j] = 2*pi*lists[j]/((2**w_qubits)*t)\n",
    "        return lists"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a00f53ff-d154-4038-9f73-6c0d9f894940",
   "metadata": {},
   "source": [
    "# 3rd QPE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "65ab34d4-7ac1-44d8-8846-b2c9cd11fc3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def exp_all_z(circuit, quantum_register, \n",
    "              pauli_idexes, control_qubit=None, t=1):\n",
    "    \"\"\"\n",
    "    The implementation of exp(iZZ..Z t), where Z is \n",
    "    the Pauli Z operator, t is a parameter.\n",
    "    :param circuit: QuantumCircuit.\n",
    "    :param quantum_register: QuantumRegister.\n",
    "    :param pauli_idexes: the indexes from quantum_register that \n",
    "                         correspond to entries not equal to I: \n",
    "                         e.g. if we have XIYZI then the \n",
    "                         pauli_idexes = [0,2,3].\n",
    "    :param control_qubit: the control Qubit from QuantumRegister \n",
    "                          other than quantum_register.\n",
    "    :param t: the parameter t in exp(iZZ..Z t).\n",
    "    \"\"\"\n",
    "    # the controlled_exp(iIt) special case\n",
    "    if len(pauli_idexes) == 0 and control_qubit is not None:\n",
    "        circuit.add_register(control_qubit.register)\n",
    "        circuit.u1(t, control_qubit)\n",
    "        return\n",
    "        \n",
    "    # the first CNOTs\n",
    "    for i in range(len(pauli_idexes) - 1):\n",
    "        circuit.cx(quantum_register[pauli_idexes[i]],\n",
    "                   quantum_register[pauli_idexes[i + 1]])\n",
    "    \n",
    "    # Rz gate\n",
    "    if control_qubit is None:\n",
    "        circuit.rz(-2 * t, quantum_register[pauli_idexes[-1]])\n",
    "    else:\n",
    "        circuit.add_register(control_qubit.register)\n",
    "        circuit.crz(-2 * t, \n",
    "                    control_qubit, quantum_register[pauli_idexes[-1]])\n",
    "    \n",
    "    # the second CNOTs\n",
    "    for i in reversed(range(len(pauli_idexes) - 1)):\n",
    "        circuit.cx(quantum_register[pauli_idexes[i]],\n",
    "                   quantum_register[pauli_idexes[i + 1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "94ede247-e072-4a30-88f5-35ce5affbec6",
   "metadata": {},
   "outputs": [],
   "source": [
    "def exp_pauli(pauli, quantum_register, control_qubit=None, t=1):\n",
    "    \"\"\"\n",
    "    The circuit for the exp(i P t), where P is the Pauli term, \n",
    "    t is the parameter.\n",
    "    :param pauli: the string for the Pauli term: e.g. \"XIXY\".\n",
    "    :param quantum_register: QuantumRegister.\n",
    "    :param control_qubit: the control Qubit from QuantumRegister \n",
    "                          other than quantum_register.\n",
    "    :param t: the parameter t in exp(i P t).\n",
    "    :return: QuantumCircuit that implements exp(i P t) or \n",
    "             control version of it.\n",
    "    \"\"\"\n",
    "    if len(pauli) != len(quantum_register):\n",
    "        raise Exception(\"Pauli string doesn't match to the quantum register\")\n",
    "\n",
    "    pauli_circuit = QuantumCircuit(quantum_register)\n",
    "    circuit_bracket = QuantumCircuit(quantum_register)\n",
    "    pauli_idexes = []\n",
    "\n",
    "    for i in range(len(quantum_register)):\n",
    "        if pauli[i] == 'I':\n",
    "            continue\n",
    "        elif pauli[i] == 'Z':\n",
    "            pauli_idexes.append(i)\n",
    "        elif pauli[i] == 'X':\n",
    "            circuit_bracket.h(quantum_register[i])\n",
    "            pauli_idexes.append(i)\n",
    "        elif pauli[i] == 'Y':\n",
    "            circuit_bracket.u2(np.pi / 2, np.pi / 2, quantum_register[i])\n",
    "            pauli_idexes.append(i)\n",
    "    pauli_circuit += circuit_bracket\n",
    "    exp_all_z(pauli_circuit, quantum_register, pauli_idexes, control_qubit, t)\n",
    "    pauli_circuit += circuit_bracket\n",
    "\n",
    "    return pauli_circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "fa81a87d-1397-490a-9758-4848a8e36a1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def hamiltonian_simulation(hamiltonian, quantum_register=None, \n",
    "                           control_qubit=None, t=1, trotter_number=1):\n",
    "    \"\"\"\n",
    "    The implementation of exp(iHt), where H is the Hamiltonian \n",
    "    operator, t is the parameter.\n",
    "    :param hamiltonian: dictionary of Pauli terms with their weights: \n",
    "                        e.g. {\"XZX\": 2, \"ZYI\": 5, \"IYZ\": 7}.\n",
    "    :param quantum_register: QuantumRegister.\n",
    "    :param control_qubit: the control Qubit from QuantumRegister \n",
    "                          other than quantum_register.\n",
    "    :param t: the parameter t in exp(iHt).\n",
    "    :param trotter_number: the Trotter number.\n",
    "    :return: QuantumCircuit that corresponds to exp(iHt) \n",
    "             or control version of it.\n",
    "    \"\"\"\n",
    "    if quantum_register is None:\n",
    "        quantum_register = QuantumRegister(len(list(hamiltonian.keys())[0]))\n",
    "    if control_qubit in quantum_register:\n",
    "        raise Exception(\"the control qubit is in the target register\")\n",
    "\n",
    "    delta_t = t / trotter_number\n",
    "    exp_hamiltonian = QuantumCircuit(quantum_register)\n",
    "    exp_delta_t = QuantumCircuit(quantum_register)\n",
    "    for pauli in hamiltonian:\n",
    "        weight = hamiltonian[pauli]\n",
    "        exp_delta_t += exp_pauli(pauli, quantum_register, \n",
    "                                 control_qubit, weight * delta_t)\n",
    "\n",
    "    for i in range(trotter_number):\n",
    "        exp_hamiltonian += exp_delta_t\n",
    "\n",
    "    return exp_hamiltonian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "44490f6d-9a5c-4285-85a7-2e9d79d68aa2",
   "metadata": {},
   "outputs": [],
   "source": [
    "simulator = Aer.get_backend('qasm_simulator')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ce5e7a3-403a-4078-a26d-202a7788437b",
   "metadata": {},
   "source": [
    "## Test 1 : Ising Dimer Hamiltonian(Ref : \"Optimizing quantum phase estimation for the simulation of Hamiltonian eigenstates\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "356362a8-0588-4c40-9848-0d924a75248b",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Same hamiltonian but defined differently for different algorithms\n",
    "from qiskit.aqua.operators import WeightedPauliOperator\n",
    "pauli_dict = {\n",
    "        'paulis': [{\"coeff\": {\"imag\": 0.0, \"real\": 0.33}, \"label\": \"ZI\"},\n",
    "                   {\"coeff\": {\"imag\": 0.0, \"real\": 3.24}, \"label\": \"IZ\"},\n",
    "                   {\"coeff\": {\"imag\": 0.0, \"real\": 1.17}, \"label\": \"ZZ\"}\n",
    "                   ]\n",
    "}\n",
    "hamiltonian1 = WeightedPauliOperator.from_dict(pauli_dict)\n",
    "hamiltonian3 = {\"ZI\" : 0.33, \"IZ\" : 3.24, \"ZZ\" : 1.17}\n",
    "H2_op = (0.33/trotter_number *  Z ^ I) + \\\n",
    "        (3.24/trotter_number * I ^ Z) + \\\n",
    "        (1.17/trotter_number * I ^ Z)\n",
    "H2 = H2_op.exp_i()\n",
    "hamiltonian2 = H2.to_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "2dac9a0d-7759-4f2b-95d9-7c8021b7a209",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#QPE 1 : In-built QPE\n",
    "initial_state = random_statevector(2**s_qubits).data\n",
    "qft = QFT(num_qubits = 7,do_swaps =  True , inverse = True)\n",
    "qpe = QPE(hamiltonian1,initial_state, qft,  num_time_slices=2, num_ancillae=7)\n",
    "qpe1 = qpe.construct_circuit(measurement = True)\n",
    "result = execute(qpe1, backend = simulator, shots = 3000).result()\n",
    "count = result.get_counts(qpe1)\n",
    "display(plot_histogram(count))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "bd54857e-ddf0-4f57-9326-806a913ff8dc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFkCAYAAABCVmA7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACAmElEQVR4nO2dd3yURfrAv5OEhI50JKGHIh0EEUWKBwe2eHoI2D1Rf3Y5G+epqKgnnooVy9nLHUVRQZGmNFEEQxOI0hESqvRmQpL5/fHMbjbL7maT7CYRnu/n836SfZ+ZeWfmnXeemWeasdaiKIqiKErBxJR2BBRFURTlj4IqTUVRFEUJE1WaiqIoihImqjQVRVEUJUxUaSqKoihKmKjSVBRFUZQwiSvtCJQmtWrVso0bNy7taCiKoihliMWLF/9mra0dSHZSK83GjRuTmppa2tFQFEVRyhDGmF+DydQ8qyiKoihhokpTURRFUcJElaaiKIqihIkqTUVRFEUJE1WaiqIoihImqjQVRVEUJUxUaSqKoihKmKjSVBRFUZQwUaWpKIqiKGGiSlNRFEVRwkSVpqIoiqKEiSpNRVEURQkTVZqKoiiKEiaqNBVFURQlTFRpKoqiKEqYqNJUFEVRlDBRpakoiqIoYaJKU1EURVHCRJWmoiiKooSJKk1FURRFCRNVmoqiKIoSJqo0FUVRFCVMVGkqJz3Tpk2jZcuWJCcnM2rUqOPkr7/+Ou3ataNjx4706NGDtLQ0AHbv3k2fPn2oXLkyt99+ez4/48ePp3379rRp04bhw4eXSDoURYk+qjSVk5qcnBxuu+02pk6dSlpaGmPHjvUqRQ9XXHEFK1asYNmyZdx///3cfffdAJQvX57HH3+cZ599Np/73bt3c9999/HNN9+watUqtm/fzjfffFNiaVIUJXqo0lROahYtWkRycjJNmzYlPj6eIUOGMGnSpHxuqlat6v3/8OHDGGMAqFSpEj169KB8+fL53G/YsIHmzZtTu3ZtAPr27cvEiROjnBJFUUqCuNKOgKKUJhkZGTRo0MD7OykpiYULFx7nbsyYMYwePZqsrCxmzZoVMszk5GRWr17Npk2bSEpK4vPPPycrKyvicVcUpeTRnqaihMFtt93G+vXrefrpp3niiSdCuq1evTqvvfYagwcP5pxzzqFx48bExsaWUEwVRYkmqjSVk5rExES2bNni/Z2enk5iYmJQ90OGDOHzzz8vMNyLLrqIhQsXsmDBAlq2bEmLFi0iEV1FUUoZVZrKSU3Xrl1Zu3YtGzduJCsri3HjxpGSkpLPzdq1a73/T5kyhebNmxcY7s6dOwHYu3cvr776KjfccENkI64oSqmgY5rKSU1cXByvvPIK/fv3Jycnh+uvv542bdowYsQIunTpQkpKCq+88gpff/015cqVo3r16rz//vte/40bN+bAgQNkZWXx+eefM2PGDFq3bs1dd93F8uXLARgxYoT2NBXlBMFYa0s7DqVGly5dbGpqamlHQ1EURSlDGGMWW2u7BJKpeVZRFEVRwkSVpqIoiqKEiSpNRVEURQkTVZqKoiiKEiaqNBVFURQlTFRpKoqiKEqYqNJUFEVRlDBRpakoiqIoYVLiStMYc6sxZqMx5ndjzGJjzDkh3PYyxnxvjNltjDlqjPnFGHOvn5sbjTHfGmP2GmP2GWNmG2N6RD8liqIoyslGiSpNY8xg4EXgX0An4HtgqjGmYRAvh4CXgJ5Aa+AJ4DFjzK0+bnoD44FzgW7AamC6MabgDUIVRVEUpRCU6DZ6xpiFwE/W2ht97q0FPrHWPhBmGJ8Cmdbay4PIDbANeNJa+3KosHQbPUVRFMWfMrGNnjEmHjgdmOEnmgGcFWYYnZzbuSGcxQPlgb1FiKaiKIqiBKUkTzmpBcQCO/zu7wD6hvJojEkHaiPxfcxa+3oI508gZt3JQcK6CbgJoH79+syZMweApk2bUqVKFe/JFDVr1qRNmzbMmzcPkNMwevTowZIlSzhw4AAAXbp0YceOHd7zGJs3b05CQgIrV64EoE6dOrRo0YL58+cDkJCQQPfu3UlNTeXQoUMAdOvWjfT0dDIyMgBo2bIlsbGxpKWlAVCvXj2aNGnCggULAKhQoQLdunVj4cKFHD16FIDu3buzceNGtm/fDkDr1q3Jyclh9erVgJwZmZSUxMKFCwGoXLkyXbp0YcGCBWRmZgLQo0cP1qxZ4z3Sqm3btmRmZnqPxWrQoAF169bF0zOvWrUqnTt3Zv78+WRnZwPQs2dPVq1axe7duwHo0KEDBw8eZMOGDYCcCFKjRg2WLFkCyGHNHTp0YO7cuVhrMcbQq1cvli9fzt690ubp3Lkze/bsYdOmTaX+nu58o0K+svTkFTv1PZXB96Tfk76n4r6nUJSYedYYUx/IAHpZa+f53B8BXGmtbRnCbxOgMnAm8DRwl7X2wwDu7gIeB/paaxcVFCc1zyqF4cYX8v9+c1hpxEJRlGgTyjxbkj3N34AcoK7f/brA9lAerbUb3b8rjDF1gUeBfErTGDMMUZjnhaMwFUVRFKWwlNiYprU2C1gM9PMT9UNm0YZLDJDge8MYczeiMC+w1s4vTjwVRVEUJRgl2dMEGA18aIxZBHwH3AzUB14HMMZ8AGCtvcb9vgPYiCwjAVl6ci/wqidAY8x9wJPAVcAaY0w9Jzpqrd0f7QQpiqIoJw8lqjStteONMTWBh4BTgZXA+dbaX50T//WascgYZmMgG1gP/AOnZB23AeWQtZq+vA9cF8HoK4qiKCc5Jd3TxFr7Kj49RT9Zb7/fLwAvFBBe48jETFEURVFCo3vPKoqiKEqYqNJUFEVRlDBRpakoiqIoYaJKU1EURVHCRJWmoiiKooSJKk1FURRFCRNVmoqiKIoSJqo0FUVRFCVMVGkqiqIoSpio0lQURVGUMFGlqSiKoihhokpTURRFUcJElaaiKIqihIkqTUVRFEUJE1WaiqIoihImqjQVRVEUJUxUaSqKoihKmKjSVBRFUZQwUaWpKIqiKGGiSlNRFEVRwkSVpqIoiqKEiSpNRVEURQkTVZqKoiiKEiaqNBVFURQlTFRpKoqiKEqYqNJUFEVRlDBRpakoiqIoYaJKU1EURVHCRJWmoiiKooSJKk1FURRFCRNVmoqiKIoSJqo0FUVRFCVMVGkqiqIoSpio0lQURVGUMFGlqSiKoihhokpTURRFUcJElaaiKIqihIkqTUVRFEUJE1WaiqIoihImqjQVRVEUJUxUaSqKoihKmKjSVBRFUZQwUaWpKIqiKGGiSlNRFEVRwqRQStMYE2OMifH5Xc8Yc4Mx5uzIR01RFEVRyhaF7WlOAe4AMMZUBlKBZ4A5xphrwgnAGHOrMWajMeZ3Y8xiY8w5IdxeaoyZYYzZZYw5aIxZaIxJCeH+cmOMNcZ8WbhkKYqiKErBFFZpdgFmuf8vBQ4AdYAbgXsL8myMGQy8CPwL6AR8D0w1xjQM4qWXe94Fzv1XwGeBFK0xpimiwL8tRHoURVEUJWwKqzQrA/vc/38GPrPWHkMUW7Mw/N8NvGetfdNa+7O19g5gG3BLIMfW2rustaOstYusteustY8Bi4G/+LozxpQDxgIPAhsKmSZFURRFCYvCKs3NwNnGmEpAf2Cmu18DOBLKozEmHjgdmOEnmgGcVYg4VAH2+t17EthkrX2/EOEoiqIoSqGIK6T70cCHwCHgV2Ceu98TWFGA31pALLDD7/4OoG84DzfG3AYkuTh47v0ZGAR0DCcMRVEURSkqhVKa1to3jDGLgQbATGttrhOtBx6OdOR8Mcb8FRmzHGyt/dXdqw28B1xurd0XZjg3ATcB1K9fnzlz5gDQtGlTqlSpwvLlywGoWbMmbdq0Yd48aRfExcXRo0cPlixZwoEDBwDo0qULO3bsYMuWLQA0b96chIQEVq5cCUCdOnVo0aIF8+fPByAhIYHu3buTmprKoUOHAOjWrRvp6elkZGQA0LJlS2JjY0lLSwOgXr16NGnShAULFgBQoUIFunXrxsKFCzl69CgA3bt3Z+PGjWzfvh2A1q1bk5OTw+rVqwFITEwkKSmJhQsXAlC5cmW6dOnCggULyMzMBKBHjx6sWbOGnTt3AtC2bVsyMzNZu3YtAA0aNKBu3bqkpqYCULVqVTp37sz8+fPJzs4GoGfPnqxatYrdu3cD0KFDBw4ePMiGDWIxb9y4MTVq1GDJkiUAVK9enQ4dOjB37lystRhj6NWrF8uXL2fvXjEmdO7cmT179rBp06ZSf09QIV9Z2rlzp76nMvie9HvS91Tc9xQKY60N6SBSOPPsEUTBfexzfwzQ1lrbK4TfgcAHwDXW2k987vcGZgM5Ps49JudcoI21dnWwcLt06WI9hVZRCuLGF/L/fnNYacRCUZRoY4xZbK3tEkhW6M0N3JKRVcaYI27GKsaY4caYQaH8WWuzkEk8/fxE/ZBZtMGeNwgxx17nqzAdPwLtENOs55qMzKDtCGwMK1GKoiiKEgaFMs8aY4YB9wNPA6N8RFuB24EJBQQxGvjQGLMI+A64GagPvO7C/wDAWnuN+z0EUZj3AvOMMfVcOFnW2j3W2sPASr847gPirLX57iuKoihKcSlsT/Nm4EZr7YtAts/9JUCbgjxba8cDw4CHgGVAD+B8zxgl0NBdvs+LA15AlqZ4rk8LGW9FURRFKTaFnT3bCL+eneMY/rMkgmCtfRV4NYisd6jfYYZ/XWH9KIqiKEo4FLanuQHoHOD++UBa8aOjKIqiKGWXwvY0nwVeMcZUBAzQ3RhzNTLOeX2kI6coiqIoZYnCrtN81xgTh+wdWxGZpLMVuNONVyqKoijKCUuhl5y4fWMbIRu117PWJllr34581BQlMkybNo2WLVuSnJzMqFGjjpOPHj2a1q1b0759e/70pz/x66+/emXvv/8+zZs3p3nz5qxZlLdL47Q3BtChQwfatGnDzTffTE5OznHhKopy4lHkQ6ittb9Za3dGMjKKEmlycnK47bbbmDp1KmlpaYwdO9a764iHTp06kZqayk8//cTAgQO5//77AdizZw+PPfYYCxcuZNGiRSyd/hiZR2RnlXOvncDy5ctZuXIlu3bt4uOPPz7u2YqinHgUqDSNMT8ZY6q7/1e43wGv6EdXUQrHokWLSE5OpmnTpsTHxzNkyBAmTZqUz02fPn2oWLEiAGeeeSbp6ekATJ8+nX79+lGjRg2qV69OYst+pP8yDYD48lUByM7OJisrC2NMCaZKUZTSIpwxzYlAps//JbPvnqJEgIyMDBo0aOD97bsXZSDefvttzjvvvIB+K52SxOH9Gd7f/fv3Z9GiRZx33nkMHDgwCrFXFKWsUaDSdGdYev5/NKqxUZRS5KOPPiI1NZW5c+eG5X769On8/vvvXHnllcyaNYt+/fx3iFQU5USjUGOaxphZxphTAtyvaoyZFbFYKUqESExM9J7GAJCenk5iYuJx7r7++muefPJJJk+eTEJCQkC/h/elU6lafr/ly5fn4osvPs7kqyjKiUlhJwL1BuID3C8PnFPs2ChKhOnatStr165l48aNZGVlMW7cOFJSUvK5Wbp0Kf/3f//H5MmTqVOnjvd+//79mTFjBnv37mXv3r2kr55BYsv+HMs8xJH92wAZ05wyZQqtWrUq0XQpilI6hLVO0xjjuwtQe2PMHp/fsUB/IANFKWPExcXxyiuv0L9/f3Jycrj++utp06YNI0aMoEuXLqSkpHDfffdx6NAhLrvsMgAaNmzI5MmTqVGjBg8//DBdu3YFoPOfR1C+Ug2OHNzBjLdTaD8xk9zcXPr06cPNN99cmslUFKWECOs8TWNMLnkTgAJNEzwK3GGtfSeCcYs6ep6mUhj0PE1FOTkIdZ5muDsCNUGU5QbgDGCXjywL2Gmt1dXdiqIoyglNWErT5+iuIm+GoCiKoih/dApUmsaYS4EvrLXH3P9BsdbqOZeKoijKCUs4Pc1PgHrATvd/MCwyKUhRFEVRTkjC2dwgJtD/iqIoinKyoUpQURRFUcIk3DHNsNAxTUVRFOVEJtwxzXDQMU1FURTlhKZQY5qKciKjmxcoilIQqhAVRVEUJUx0naaiKIqihImu01QURVGUMNF1moqiKIoSJqoEFUVRFCVMCq00jTGdjTEfGGNS3fWh33mbiqIoinJCUiilaYy5EvgROBX4yl11gUXGmKsiHz1FURRFKTuEe56mhyeBh621//K9aYx5AHgC+ChSEVMURVGUskZhzbO1gQkB7n8M1Cl+dBRFURSl7FJYpTkb6B3gfm9gbnEjoyiKoihlmcJu2D4VeMoY0wX4wd07E7gUeDTisVMURVGUMkRRN2y/yV2+vAy8WuwYKYqiKEoZRTdsVxRFUZQwUYWoKIqiKGFS2CUnGGOqA+cBDYF4X5m1dmSE4qUoiqIoZY5CKU1jzJnAFCATWX6SgWx0kAlsAlRpKoqiKCcshTXPPgP8F0gEfgfORXqcqcDTkY2aoiiKopQtCqs02wOvWGstkAMkWGt3AMPRJSeKoijKCU5hlWaWz/87gEbu/0NA/YjESFEURVHKKIWdCLQE6AqsAeYATxhj6gJXAT9FNmqKoiiKUrYobE/zQWCr+/8hYBeyqUF1jt/sQFEURVFOKArV07TWpvr8vwtZeqIoiqIoJwWFXqcJYIxpBpzmfqZZazdELkqKoiiKUjYp7DrNmsDbQAqQm3fbfAlcb63dHeH4KYqiKEqZobBjmm8BycA5QHl39QSaAG9GNmqKoiiKUrYorNLsD9xorf3OWpvtru+A/3OyAjHG3GqM2WiM+d0Ys9gYc04It6caY/5njPnFGJNjjHkviLuqxpiXjDFbjTGZxph1xphBhUyboiiKooSksEpzF3A4wP0jQIGmWWPMYOBF4F9AJ+B7YKoxpmEQLwnAb8AoYGGQMMsBM4HmwCCgJXAdsLGg+CiKoihKYSjsRKCRwAvGmKuttRkAxphE4DnC23f2buA9a63HlHuHMWYAcAvwgL9ja+0m4E73nIFBwvwbsg/uOdZaz+YLm8JKjaIoiqIUggKVpjFmBWB9bjUBNhljMtxvzz60dZAxz2DhxAOnA8/6iWYAZxUizv78BfgOeNkYczGwB5gAPGmtPVaMcBVFURQlH+H0ND+J0LNqAbHI9nu+7AD6FiPcpsjG8f8DLgAaA2OAysC9/o6NMTfhNmKoX78+c+bMkUCaNqVKlSosX74cgJo1a9KmTRvmzZsHQFxcHD169GDJkiUcOHAAgC5durBjxw62bNkCQPPmzUlISGDlypUA1KlThxYtWjB//nwAEhIS6N69O6mpqRw6dAiAbt26kZ6eTkaGtEFatmxJbGwsaWlpANSrV48mTZqwYMECACpUqEC3bt1YuHAhR48eBaB79+5s3LiR7du3A9C6dWtycnJYvXo1AImJiSQlJbFwoVi4K1euTJcuXViwYAGZmZkA9OjRgzVr1rBz504A2rZtS2ZmJmvXrgWgQYMG1K1bl9RUWapbtWpVOnfuzPz588nOzgagZ8+erFq1it27xVLfoUMHDh48yIYNsiKpcePG1KhRgyVLlgBQvXp1OnTowNy5c7HWYoyhV69eLF++nL179wLQuXNn9uzZw6ZNm6L+nvw/B//3BBXyyXfu3KnvqRTek35P+p6i/Z5CYWTv9ehjjKmPHCXWy1o7z+f+COBKa23LAvx/Cfxmrb3O7/4aZBZvE2ttjrt3E/A8UNmGSGCXLl2sp9Aqyo0v5P/95rDCyRVFOTEwxiy21nYJJCvq5gbnAq0Rs+0qa+2cMLz9hpyMUtfvfl1ge1Hi4dgGHPMoTMfPQEWkd7urGGEriqIoipdCzZ41xiQaYxYhs1WHA/8AvjHGLHQ9yaC4STqLgX5+on7ILNqi8h2QbIzxTUsLZEbvb8UIV1EURVHyUdglJy8hvcVka20Da20DZKlHjpMVxGjgOmPMDcaY04wxLyJHir0OYIz5wBjzga8HY0xHY0xHoCpQw/1u7ePkNaAG8KIxpqUxpj/wGPBqKNOsoiiKohSWwppn+wG9rbXeNZDW2g3GmDuBbwrybK0d77biewg4FVgJnG+t/dU5CbRec6nf74uAX5EJP1hrtxhj/owo5GWIqfcd4Inwk6UoiqIoBVOUMc1Avbewe3TW2leBV4PIege4Z8II8weKt2xFURRFUQqksObZb5D1kA08N9xuPi8QRk9TURRFUf7IFFZp3glUAjYYY341xvwKrHf37ox05BRFURSlLFFY8+xu4AygN9DK3fvZWvt1JCOlKIqiKGWRsJWmMSYW2A90sNbORJadKIqiKMpJQ9jmWbd5wK9AfPSioyiKoihll8KOaT4OjDLG1IpGZBRFURSlLFPYMc17kVNOMowx6fidrWmtbR+piCmKoihKWaOwSvMTZE1mgWsnFUVRFOVEIyylaYypCDyDnF1ZDlmTeYe1Vvd2VRRFUU4awh3TfAy4DpgCjEXOv3wtSnFSFEVRlDJJuObZS4Gh1tpxAMaY/wLfGWNi/Y7kUhRFUZQTlnB7mg2Abz0/rLWLgGzkhBJFURRFOSkIV2nGAll+97Ip4iHWiqIoivJHJFylZ4CPjDGZPvfKA28aY454blhrUyIZOUVRFEUpS4SrNN8PcO+jSEZEURRFUco6YSlNa+3foh0RRVEURSnrFHYbPUVRFEU5aVGlqSiKUkaYNm0aLVu2JDk5mVGjRh0nnzdvHp07dyYuLo5PPvkkn+z999+nefPmNG/enPffzxtRGzt2LO3ataN9+/YMGDCA337TPWmKgypNRVGUMkBOTg633XYbU6dOJS0tjbFjx5KWlpbPTcOGDXnvvfe44oor8t3fs2cPjz32GAsXLmTRokU89thj7N27l+zsbO666y5mz57NTz/9RPv27XnllVdKMlknHKo0FUVRygCLFi0iOTmZpk2bEh8fz5AhQ5g0aVI+N40bN6Z9+/bExOSvuqdPn06/fv2oUaMG1atXp1+/fkybNg1rLdZaDh8+jLWWAwcOUL++Lq8vDqo0FUVRygAZGRk0aNDA+zspKYmMjIxi+S1XrhyvvfYa7dq1o379+qSlpTF06NCIx/1kQpWmoijKCcqxY8d47bXXWLp0KVu3bqV9+/Y89dRTpR2tPzSqNBVFUcoAiYmJbNmyxfs7PT2dxMTEYvldtmwZAM2aNcMYw6BBg/j+++8jGu+TDVWaiqIoZYCuXbuydu1aNm7cSFZWFuPGjSMlJbxN1vr378+MGTPYu3cve/fuZcaMGfTv35/ExETS0tLYtWsXADNnzuS0006LZjJOeHTvWEVRlDJAXFwcr7zyCv379ycnJ4frr7+eNm3aMGLECLp06UJKSgo//vgjl1xyCXv37uWLL77gkUceYdWqVdSoUYOHH36Yrl27AjBixAhq1KgBwCOPPELPnj0pV64cjRo14r333ivFVP7xMdba0o5DqdGlSxebmppa2tFQygg3vpD/95vDCidXFOXEwBiz2FrbJZBMzbOKoiiKEiaqNBVFURQlTFRpKoqiKEqYqNJUFEVRlDBRpakoiqIoYaJLThRFUf6A6Gzu0kF7moqiKIoSJqo0FUVRFCVMVGkqiqIoSpio0lQURVGUMFGlqSiKoihhokpTURRFUcJElaaiKIqihIkqTUVRFEUJE1WaiqIoihImqjQVRVEUJUxUaSpKAUybNo2WLVsy4clkln896jh5ZmYmgwcPJjk5mW7durFp0yYA/vvf/9KxY0fvFRMTw7Jly/L5TUlJoW3btiWQCkVRIoEqTUUJQU5ODrfddhtTp07lr8PTWL90LHu3p+Vz8/bbb1O9enXWrVvH3//+d4YPHw7AlVdeybJly1i2bBkffvghTZo0oWPHjl5/n376KZUrVy7J5CiKUkxUaSpKCBYtWkRycjJNmzYlNi6epp2G8OvKSfncTJo0iWuvvRaAgQMH8s0332Ctzedm7NixDBkyxPv70KFDjB49moceeij6iVAUJWKo0lSUEGRkZNCgQQPv70rVkjiyPyOom7i4OKpVq8bu3bvzuRk/fjyXX3659/fDDz/MPffcQ8WKFaMYe0VRIk2JK01jzK3GmI3GmN+NMYuNMecU4L6Xc/e7MWaDMeZmP3msMeZxnzA3GmOeMMbosWdKmWDhwoVUrFjRO3a5bNky1q9fzyWXXFLKMVMUpbCUqNI0xgwGXgT+BXQCvgemGmMaBnHfBPjKuesEPAW8bIz5q4+z4cBtwJ1AK+Au9/uBKCVDOYlITExky5Yt3t+H96dTsVpiUDfZ2dns37+fmjVreuXjxo3L18tcsGABqampNG7cmB49erBmzRp69+4d3YQoihIRSrqneTfwnrX2TWvtz9baO4BtwC1B3N8MbLXW3uHcvwm8D9zr4+Ys4Atr7RfW2k3W2snAZKBbFNOhnCR07dqVtWvXsnHjRnKys9iwdByN2qTkc5OSksL7778PwCeffMK5556LMQaA3NxcJkyYkG8885ZbbmHr1q1s2rSJ+fPn06JFC+bMmVNiaVIUpeiUmNI0xsQDpwMz/EQzEMUXiO4B3E8Huhhjyrnf84E+xphW7jmtgXORHqqiFIu4uDheeeUV+vfvzyejTqNJx0FUP7UNi6eOYPLkyQAMHTqU3bt3k5yczOjRoxk1Km9Zyrx582jQoAFNmzYtrSQoihJBSnLcrxYQC+zwu78D6BvETz3g6wDu41x424CngSpAmjEmx8metNa+GihAY8xNwE0A9evX97bwmzZtSpUqVVi+fDkANWvWpE2bNsybNw+QyrNHjx4sWbKEAwcOANClSxd27NjhNc01b96chIQEVq5cCUCdOnVo0aIF8+fPByAhIYHu3buTmprKoUOHAOjWrRvp6elkZMjkkpYtWxIbG0tamixrqFevHk2aNGHBggUAVKhQgW7durFw4UKOHj0KQPfu3dm4cSPbt28HoHXr1uTk5LB69WpAzIdJSUksXLgQgMqVK9OlSxcWLFhAZmYmgNdMuHPnTgDatm1LZmYma9euBaBBgwbUrVuX1NRUAKpWrUrnzp2ZP38+2dnZAPTs2ZNVq1Z5J8F06NCBgwcPsmHDBgAaN25MjRo1WLJkCQDVq1enQ4cOzJ07F2stxhh69erF8uXL2bt3LwCdO3dmz5493rWP0XxP/p+D5z1VrFiR5cuXc+cbFbyy088byZln7vSWn8cff9z7njZv3syuXbvo1q0bFSpUYNSoUcyZMyfge0pISOCVV15hzpw5+p70eyrUe4Le+crr8uXL9T1F6D2FwvhPjY8Wxpj6QAbQy1o7z+f+COBKa23LAH7WAB9Za0f63OsJzAXqW2u3GWOGAM8A9wGrgI7IuOl91tq3Q8WpS5cu1lNoFeXGF/L/fnNY4eSKUpJoeYwexpjF1tougWQl2dP8DcgB6vrdrwtsD+JnexD32S48EIX5rLV2nPu9whjTCJkIFFJpKoqiKEphKLExTWttFrAY6Ocn6ofMjg3EgiDuU621x9zviogy9iUHXYOqKIqiRJiSXss4GvjQGLMI+A6ZHVsfeB3AGPMBgLX2Guf+deB2Y8wLwBvA2cB1wOU+YX4B/MMYsxExz3ZCZul+EOW0KMpxqMlMUU5sSlRpWmvHG2NqAg8BpwIrgfOttb86Jw393G80xpwPPI8sS9kK3Gmtnejj7A7gceBVoA4yOehNYCSKoiiKEkFKfNccN6s14MxWa23vAPfmAp1DhHcQGOYuRVEURYkaOu6nKIqiKGGiSlNRFKWE8JzNmpycnG8TDA/BzmbdtGkTFSpU8J7NevPNeVtwT3tjAJ8+04E2bdpw8803k5PjPy9SiSSqNBVFUUoA37NZ09LSGDt2rHcxv4dgZ7MCNGvWzHs+6+uvv+69f+61E7j0vuWsXLmSXbt28fHHH5dYmk5GVGkqiqKUAL5ns8bHxzNkyBAmTSr82az+xJevCshhAVlZWd59j5XooEpTURSlBPA/mzUpKcm7jVwgN/5ns27cuJFOnTrRq1cvvv3223z+pr7enzp16lClShUGDhwY5ZSc3KjSVBRFKeOceuqpbN68maVLlzJ69GiuuOIKsn4/4JWfd/N0tm3bRmZmJrNmzSrFmJ74qNJUFEUpAfzPZk1PTycxMbyzWRMSErxntJ5++uk0a9aM/TvX5PNbvnx5Lr744uNMvkpkUaWpKIpSAviezZqVlcW4ceNISQnvbNZdu3Z5Z8Vu2LCBtWvXUqVmU45lHuLI/m2AKNkpU6bQqlWrkk3YSUaJb26gKIpyMuJ7NmtOTg7XX389bdq0YcSIEXTp0oWUlBSGDh3K1VdfTXJyMjVq1GDcODmHYt68eYwYMYJy5coRExPD66+/zuT1NThycAcz3k4hJzuTBW/l0qdPn3zLUZTIU2JHg5VF9GgwxZdIHA2me88qJYWWtegR6mgwNc8qUaWoi7k9bN68mcqVK/Pss8+GHaaiKEq0UKWpRI3iLuYGuPvuuznvvPMKFaaiKEq00DFNJWr4LuYGvIu5W7du7XUzadIkHn30UUAWc99+++1YazHG8Pnnn9OkSRMqVapUqDAV5Y+Ov+kV1PxaVtCephI1irOY+9ChQzz99NM88sgjhQ5TURQlWqjSVMokjz76KH//+9+pXLlyaUdFURTFi5pnlahRmMXcSUlJ+RZzL1y4kE8++YT777+fffv2ERMTQ/ny5Tn99NMLDFNRFCVaqNJUoobvYu7ExETGjRvH//73v3xuPIu5u3fvnm8xt+/emo8++iiVK1fm9ttvJzs7u8AwFUVRooUqTSVqFGcxd2HDVBRFKQlUaSpR5fzzz+f888/Pd2/kyJHe/8uXL1/g+X+e2bWhwlQURSkJdCKQoijKHwTfjT2Wfx3+ZiEzZ87k9NNPp127dpx++un5TkIZP3487du3p02bNsetk1aOR5WmoijKHwD/jT3WLx3L3u3hbRZSq1YtvvjiC1asWMH777/P1VdfDcDu3bu57777+Oabb1i1ahXbt2/nm2++KfG0/ZFQ86xSZtC9NBUlOP4bezTtNIRfV06ier2CNwvp1KmT102bNm04evQomZmZbNiwgebNm1O7dm0A+vbty8SJE/nTn/5Ucgn7g6E9TUVRlD8A/ht7VKqWxJH94W0W4svEiRPp3LkzCQkJJCcns3r1ajZt2kR2djaff/55viVdyvGo0lRCUtQN10ONoQwYMIAOHTrQpk0bbr75Zu85gYqiRJdVq1YxfPhw3njjDQCqV6/Oa6+9xuDBgznnnHNo3LgxsbGxpRzLso0qzZOcUEoxJyeHW2+9leTkZKy1jBw5kpkzZwJ5SrFJkybMmjWL//znP/z973/n3nvv5YILLuDGG2/k4MGDXHDBBfnGUAAmTJjA8uXLWblyJbt27Spw9qyiKMdvFnJ4fzoVqwXeLATIt1kIyEYgl1xyCR988AHNmjXz+rnoootYuHAhCxYsoGXLlrRo0aIEUvPHRZXmSUxBJ4YsWrSI8uXL06BBA9avX09KSgr33HMPkDexoF27djz//PNcffXVDBw4kDlz5nDPPfewadMmVq5cyXfffcfmzZu9YygAVatWBeSjzsrKwhhT8olXlD8YvpuFZGVlsWHpOBq1ScnnxrNZCJBvs5B9+/ZxwQUXMGrUKM4+++x8fnbu3AnA3r17efXVV7nhhhtKJkF/UFRpnsT4TiyIj4/3nhjiISMjgwMHDnDttdcCYlZds2aNd2JB/fr1ycjIoFevXhw9epScnByqVatG+/btAYiPj6dz585MnjzZO4bioX///tSpU4cqVaowcODAkk24ovwB8d3Y47TTTqNJx0FUP7UNi6eO4NeVkwEYOnQou3fvJjk5mdGjR3utR6+88grr1q1j5MiRdOzYkY4dO3qV5V133UXr1q05++yz+cc//qE9zQJQpVkMijret3v3bvr06ePdGs6XsWPH0q5dO9q3b8+AAQP47bffohb/cE4MOXz4sNdNbGwsCQkJx00s+Oqrr45TigD79u1j4sSJTJ061TuG4mH69Ols27aNzMzMfOOdiqIE5/zzz2fNmjWsX7+eTv0eBOD080bSqK30OD2bhaxbt45FixZ5Z9o+9NBDHD58mGXLlnmvOnXqAHgtTGlpaQwZMqR0EvYHQpVmESnOAcvly5fn8ccf59lnn83nPjs7m7vuuovZs2fz008/0b59e1555ZUSS5M/iYmJHDt2zPs7PT39uEkC1apVY+TIkbzxxhv5xlCys7O55JJLyMrK4n//+1++MRQP5cuX5+KLL87Xuz0RiUbjKisri5tuuokWLVrQqlUrJk6cWBJJUZSTHlWaRaQg0ybImimPaXPgwIF88803WGupVKkSPXr0oHz58vncW2ux1nL48GGstRw4cID69etHLQ0FnULStWtXcnNzWbhwIVlZWYwdO5bc3Nx8EwvWrl1L165dadasWb4xlGuvvZYVK1bw+uuv5xtDOXToENu2bQOkkTBlyhRatWoVtTSWNtFoXAE8+eST1KlThzVr1pCWlkavXr1KJD2KcrKjmxsUkUCmzYULFwZ147tmqlatWgHDLFeuHK+99hrt2rWjUqVKNG/enDFjxkQtDQWdQhIXF8d1113H0KFDqVmzJl26dKFVq1Y88sgjtGrViqeffpqXXnqJiRMn5ttw/aGHHmLZsmUcPXqUkSNHeveanTFjBtZaUlJSyMzMJDc3lz59+nDzzTdHLY2ljf+CdE/jqnXrghekexpX69atOy7cd955h19++QWAmJiYoGVKOXnRzUKig/Y0yxDHjh3jtddeY+nSpWzdupX27dvz1FNPRe15/hMLBg0a5D2FZPJkmVgwevRo+vXrhzGGjRs3MmrUKEaOHMmGDRtYt24do0aNYu3atVSuXJkvv/yS+Ph4nnzySXJzc2nevDkAt99+u3cMpW7duvz444/89NNPrFy5kpdffpm4uBO37RbOuHE4C9J92bdvHwAPP/wwnTt35rLLLmPHjh2Rj7xyQhLp4YIjR45wwQUX0KpVK9q0acM//vGPkkpKqaBKs4gU5oBlOH7NVCCWLVsGQLNmzTDG0KhRI0aNGhXRsbDFixfTrl07kpOTufPOOznvvPO8EwsefFAmFowcOZKUlKJNLEhKSsJay88//+y9r1PYI0t2djbp6emcddZZLFmyhO7du3PvvfeWdrSUPwDRGi649957+eWXX1i6dCnfffcdU6dOLZH0lAaqNIuI/5qpcePGeRWNh2BrpoKRmJhIWloau3btIicnh3/9618MHjw4ooX7lltu4c0332Tt2rWsXbuWadOmFTcrADEF+V6KEI3GVc2aNalYsSKXXnopAJdddhlLliyJQuyVE41ozMWoWLEiffr0AfKWmaWnp5dMgkoBVZpFJBzTZoMGDfjvf/9LuXLluO+++/L1Fhs3bszf//53Xn/9deLi4mjfvj1ZWVk88sgj9OzZk9q1a3PgwAHmzp3L7NmzvYX7+eefp02bNrRt25bHH3/cO0U8nMK9bds2Dhw4wJlnnokxhmuuuYbPP/88rPSWllIsqikJ4KmnniI5OZmWLVsyffp07/0XX3yRtm3b0qZNG1544YWoxj8ajStjDBdddBFz5swB4Jtvvsk3RqoowYjGcIEv+/bt44svvjihN3w/cQeTSoBQByzn5OTw97//neXLl5OUlETXrl35/fffve42bdrEq6++yk8//cTrr7/OuHHjGD58OOPHj6dnz56cd955XHzxxYwYMYK+ffsyYsQIZs+ezdy5c0lLS6NChQpUq1aNJUuW0Lt377AmGmVkZJCUlOT9HeiDKUt4TEkzZ8705mFKSko+BeHb2/bNw7S0NMaNG8eqVavYunUrffv2Zc2aNfz888+8+eabLFq0iPj4eAYMGMCFF15IcnJyVNLg27jKycnh+uuv9zauunTpQkpKCkOHDuXqq6/ON5nKQ+PGjTlw4ABZWVl8/vnnzJgxg9atW/P0009z9dVXM2zYMGrXrs27774blfgrSrhkZ2dz+eWXc+edd3qHcU5EVGlGieLMmpw0aRJnn302sbGxNGnShOTkZNavXw9IwTx69CjlypUjNzeXunXrlnjaIsm0adO46667yMnJoUarG+jQN28SgWcM9YEHHmDx4sVkZmby3nvv8e9//xuQnuTjjz9OpUqV+PLLLylfvjzbtm2jUaNGZGZmYozh7LPP5rvvvuPw4cM0atSIChUq0KlTJypWrAhIr+3MM8+kZs2aNO3zEkmt+gOQeXQfAwfewMqVKzHG8M477wDdi5TGUI0ryBs3DoRvz9mXRo0aMW/evCLFRzl5KcxwQVJSUsDhghUrVvDf//6XadOmccMNN3gn/tx00000b96cW265hcGDB7N48WJq1qzJ+PHjady4MSDf7Ntvv01sbCwvvfQS/fvL99a4cWOqVKlCbGwscXFxpKamRjknio6aZ6OEr4njxhdg+sokPvoqI59pM5gZJCMjg+bNm3sLd1JSEuvXr6dly5bce++9NGzYkFNPPZXKlSt7lXI4Y2GJiYn5xhoCfTCFxWM+nfBk4U6SB1lreNFFF5GVlcULL7yQ71Dd3NwcrrjiClJTU709yZSUFD777DMAb0+ycePGxMfHExMTw4oVK8jOziYzM5MLLriAZ555htTUVN5++21OOeUUXnjhBW6++WamTp3K7t27Wbx4Md9//z2DBg1i2rRpfPfJreTmyokrP3x6FwMGDOCXX35h+fLlnHbaacXKJ+WPQTSGA0CsJp06deLCCy+MdhJCUtzhgpycHD788EMuvPDCfHMtHnroIfbv388LL7zA3Xff7U1/06ZNvXMtPN/skiVLaN68ORdeeCFnnHGGNw9nz57N4MGD2bdv33F52LhxY9q1a0fHjh3p0qVLtLMpJKo0g1Dcj+f222/n448/9r743JxjbFj2MZ8+I0diPfLIIyGf37RpU2/hzsnJ4bvvvqNXr15MmjSJjRs3snXrVmrXrs1DDz0EhDcWduqpp1K1alV++OEHrLV88MEHXHzxxUXIHcF3Jt5fhxfuJPm0tDTeffddevfuzaxZs7jrrrto0nEQv66USQmr5r1IYmIiR48e9U5K6Nq1K1u2bPH2xocMGcLvv/9OcnIyp512GsuWLaNSpUocPXo0XxwmTZrkXf5y1113AdCvXz8GDhxI27ZtiY+Pp0mTJlStlcyuzYvIOrqfbRvmMXToUEAmN5xyyilB88G3rBS24RCoov39998544wzvMenFVRW/OMQicp+y5Yt9OnTh9atW9OmTRtefPHFAuPwR6c4M0t9hwOmTZvGrbfemu/IuxdffLHEGl6hGrJxcXE8//zztG/fnkqVKrFnzx4qVarknYvx1FNP8dxzz/Hf//6X+vXrM3r0aB577DFvefRso/nZZ5/RtGlTzj33XD744AOefPJJ0tLS6NSpE6+99hqXX345aWlprFq1iunTp+f7Zj/66COSkpI499xzufDCC715uHr1am8ePvDAA1x00UX5yvPs2bNZtmwZqampJfJNBUOVZgAi8fGMHz+eDh06cOut0ns5enA7rc++hUvvW86yZcuYNm0alStXDjhrMjExka1bt3rHwiZMmED//v3JyMhg7969LFiwgHLlynHnnXeyadOm4zZnBmmZ3X333bz33nskJSV54+85xSA5OZlmzZpx3nnnFTmffE3QsXHx3pPkfQk2E2/SpEmcccYZNGrUyGuCzsnO5Mj+DA7vS2dL2hQGDx5Mdna2tze+bds2Klas6O2NN2jQgCpVqlCtWjWSkpLYvHkzx44dw1rL1KlTGT58OP/5z3+8G88nJiYSFxdHnTp1mDFjBhdccAF169b1blBd6ZQkjuzL4OCejVSoXJu//e1vdOrUiRtuuIHDhw+HVVYK23DwrySq1krmnIHP0/qvszjjb3llZd68eWH32D3l9frrr6dOnTq0bdu2wNb/v//9bzIyMhgwYAANGjRg27ZtPPfcc6SlpXHZZZdx7733UqlSJerXr+99vif8unXrkpycTFJSEklJSd6Kzvf5UPYVd3FmlnoUwuzZsxkwYADbtm3zLvdKT09nypQp3HDDDeTk5ISVB+m/5PWy5o29no8ezsvHUITTkM3IyODKK6/k2LFjPPPMMwwfPpyRI0eSnJzMuHHjePHFF6lduza7du3iL3/5C61atWLWrFksX76cjz76iBo1anDmmWdSvnx5Jk+ezNatW73LzM466yxA9paePXs2l19+OTExMVx55ZWMHDmSMWPGePMwKSmJli1b8s033wAyC/y3337j3Xff5fHHH6dbt2688847jB07lqysrHxpKGzjJSEhwZsGzzf1ww8/hFMsjkOVZgAi8fGcffbZpKenU79+fXZs/I4Ny8bTpMNlgGxicOzYMc4555yAZpCUlBTGjRvHn/70J6ZPn069evVISUnh3nvvZdWqVSxbtgxrLd9++y3Dhg07bg0lyFjYnj17OHToEOnp6WzevJmWLVsyZMgQrrrqKtavX88rr7zi7ZkW1FMJRHFOks/IyMg3YSkpKYmsI3sBWPDZMM646N+0bt2a3NxcNm/e7DUlVapUKV/4HnMTwA8//EDr1q259NJLmTlzJqeccgovv/wy+/fvZ+PGjZxxxhkA3h7AwYMH+fHHH7niiivyhZmbk81v6Uu45ZZbWLp0KZUqVQqaJ/5lpbANhyFDhhAXF+etJHpe/g4blo7j0N7NQF5Z+eKLL8LusXfs2JFevXoxY8YMBg8ejLWWd999l7feeitg63/QoEH83//9HykpKfTt25djx44xYsQIOnfuTFpaGp999hktW7akW7duVKhQgbvuuovhw4dz3XXX8eqrr7J//35++uknYmNjiYmJ4dlnn+WRRx5hyhRp+HgoTEU3ZcoUevfuzbp167jmmmv44YcfGDNmjLfxV1B5LYrct6xOmzaNl156iVGjRuXzH6o8JyYmehXWoEGD+PTTT2ncuDGtWrWidevWxMTEsGXLlrDywHeooPkZ1zHgpvCWhhW3ITto0CCGDRvG119/Te/evXn33Xf5+eefqVy5MiDfzpEjR6hatSrr1q1jwIABLFiwwJuGr776imrVqvHRRx9x6623Ur9+fXJychgyZIjXDOybh7GxsVSrVo0vvviCSy+9lAcffJBnn32WmjVr0qJFC6ZPn87WrVvZsWMH7du35/TTT+c///lPgd9UQkKCtzG+aNEijDHeNHi+qaIeSahKMwDFmZbtue+ZNfnTTz8x671BNOk4iGp1W/HRw/WoUaMG/fr14/HHHw94jE+bNm0YNGgQrVu3ZsCAAbz00kvceeedzJ49m/vvv59//etfNG/enNzcXG666aYC01NQzzmcnnU0qF69er5JCZlH9pD1+0EqVKlDrQanExsbS5UqVRgyZAinnXYaAwcO5OjRo7z44oscOHCALVu2cNVVV7F3717Gjh3L9OnT6dmzJy1btqRNmzZcccUVZGRksGPHDoYNG0ZsbCzZ2dlkZGRwzjnnMGPGDM4//3yv6fXwvnQqnpJIpVOSqFQtiW7dugHyUQZbB1nchkODBg28FV2LFi34/eBOmnYawqYVn/HpMx2pU6cO/fr146effgqrx96sWTMmT57Meeedx4YNG/j666/Zv38/MTExnHnmmcTHx3tb/544ZGVlYa3ljjvuoGHDhvTp04dvv/3WG37//v1Zv349//znP0lOTqZBgwZ88803nHPOOSxatIhq1aqxfPlyWrVqRatWrbjtttu48847ueOOO/j666+9s8bDreiaNWvGTTfdxMyZM1m/fj1jx45ly5YtnHbaaWRkZBS7PIcrv/fee7niiivC/h7Wr1/vVVjGGI4cOULnzp258sormTdvHps2bWLHjh1h5YFnqADg1GY9SahUo8DnR6I8ZmVledOw+WBDbNUzuPb+SQwdnUPHjh254YYbyM3N5b777gOgfv363p6mZwJjpUqVMMaQnJzM2rVryczM5KKLLqJRo0bHHQDhmVNx6qmnAnLWbufOnTHGkJuby9tvv80//vEPrrzySmrXrs0LL7zAmDFjWLt2bchvyoNv3Z2TI2nwfFOe77uwqNKMIueffz4DBw7krL++Qqd+DxITE8tVj29n+/btLFq0iHXr1gXcbQfgwQcfZP369axevZqaNWt6C/ITTzzBI488wtChQ/nwww+PO44rEAX1nMPpWQeiOCfJJyYmUq5cOe+47ebNm9m1eRGxseX4deVkxo1szJAhQzh69CgJCQmsX7+e5s2bc+655/L4448zfPhwxo0bR9euXYmPj6dmzZosXryYadOmedeIDRs2jFatWnHjjTeyZs0aQHr0l1xyCT///DNff/21d3xk48aNHNi1ltoNz6Bi1XpUOqUBq1evBqK/DjJQRXf0wDYuvW8Z6enpLFq0iA0bNoTVY09ISKBKlSpUrVqV+Ph4LrroIg4ePEi5cuW8bpKSkvKNt+3du5ecnBxv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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#QPE 2 : My QPE\n",
    "w_qubits = 7\n",
    "s_qubits = 2\n",
    "trotter_number = 2\n",
    "gate = qc(hamiltonian2).to_gate().control(1)\n",
    "initial_state2 = [0,0,0,1]\n",
    "qpe2 = my_qpe(w_qubits,s_qubits, gate, initial_state = initial_state2)\n",
    "result = execute(qpe2, backend = simulator, shots = 3000).result()\n",
    "count = result.get_counts(qpe2)\n",
    "display(plot_histogram(count))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "30480153-6929-4a0a-9a59-ee09ea2c76c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.803805932852076, -3.9453985864418692]"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = \n",
    "plot_to_eigenval2(count,w_qubits,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "aa1d8151-dff0-4a9c-af25-a65f2a3c8d8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 327.252x144.48 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#QPE 3 : The QPE from Github\n",
    "\n",
    "q = QuantumRegister(s_qubits, name=\"q\")\n",
    "a = QuantumRegister(w_qubits, name=\"a\") \n",
    "c = ClassicalRegister(w_qubits, name=\"c\") \n",
    "\n",
    "# Create a quantum circuit\n",
    "circuit = QuantumCircuit(q, a, c)\n",
    "circuit.initialize(initial_state,[q[0],q[1]])\n",
    "circuit = hamiltonian_simulation(hamiltonian3, \n",
    "                                 q, t=1/(2*np.pi),trotter_number = 7)\n",
    "display(circuit.draw())\n",
    "#apply the controlled version of hamiltonian \n",
    "qpe3 = QuantumCircuit(a,c)\n",
    "for ancillary in range(w_qubits):\n",
    "    qpe3.h(ancillary)\n",
    "\n",
    "for n in range(w_qubits):\n",
    "    for m in range(2**n):\n",
    "        get_controlled_circuit(circuit, a[n], qpe3)\n",
    "# inverse QFT without SWAP gates\n",
    "for n in reversed(range(a.size)):\n",
    "    qpe3.h(a[n])\n",
    "    if n != 0:\n",
    "        for m in reversed(range(n)):\n",
    "            angle = -2*np.pi / (2**(n - m + 1))\n",
    "            qpe3.cu1(angle, a[n], a[m])\n",
    "\n",
    "# measurements on the ancillary qubits stored in c classical register\n",
    "for n in reversed(range(a.size)):\n",
    "    qpe3.measure(a[n],c[n])\n",
    "result = execute(qpe3, backend = simulator, shots = 3000).result()\n",
    "count = result.get_counts(qpe3)\n",
    "display(plot_histogram(count))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a55823d-8b75-41f3-a2d3-c0154ac26c4d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Qiskit v0.30.1 (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.8.10"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "17ee2380db744c448448fad160c6a52c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "70px"
      }
     },
     "24578673881a41d5b4de599cd36d2a47": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "29ba0bbcf38340a8ac293641ca9752f4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_36029ab2743b4721bd10cff99d60877e",
       "style": "IPY_MODEL_e1c497296cd442ba845a91ff415b4c4c",
       "value": "<h5>Backend</h5>"
      }
     },
     "2cd01edeea8f4422b36b6d4304d0dfcf": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2d06fae57ab04b7192a515e44f58270e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "32d2517c4fe54a929a1dd82ba2a7e916": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "95px"
      }
     },
     "36029ab2743b4721bd10cff99d60877e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "145px"
      }
     },
     "54b4fc1898c34e018e4834df9c5368b0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 10px 0px"
      }
     },
     "588d3c151d0b447b85dafc5c97d28136": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_17ee2380db744c448448fad160c6a52c",
       "style": "IPY_MODEL_24578673881a41d5b4de599cd36d2a47",
       "value": "<h5>Queue</h5>"
      }
     },
     "59d8cbdf9aae4b118224a99c597e7577": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_32d2517c4fe54a929a1dd82ba2a7e916",
       "style": "IPY_MODEL_2d06fae57ab04b7192a515e44f58270e",
       "value": "<h5>Status</h5>"
      }
     },
     "59efd198fadf48689db9ef528b0960eb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_5ac7752ea5ba421b8ce4b7ac177e2b32",
       "style": "IPY_MODEL_da9d48aead9c40d8b883f8c123aa9cc7",
       "value": "<h5>Job ID</h5>"
      }
     },
     "5ac7752ea5ba421b8ce4b7ac177e2b32": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "190px"
      }
     },
     "5dc7cbac692345b3ab72bc7b0b899a09": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "GridBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_fa09b6521bb7426ab811b3c51285110c"
       ],
       "layout": "IPY_MODEL_6f2ef4ffe0a946a383e46c7a5482fae4"
      }
     },
     "6abfa5b280844a1d92f2993399dbae32": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_59efd198fadf48689db9ef528b0960eb",
        "IPY_MODEL_29ba0bbcf38340a8ac293641ca9752f4",
        "IPY_MODEL_59d8cbdf9aae4b118224a99c597e7577",
        "IPY_MODEL_588d3c151d0b447b85dafc5c97d28136",
        "IPY_MODEL_9862138fedaa486785ed347a06000190"
       ],
       "layout": "IPY_MODEL_87f422f96d65471d8912359100f6bc60"
      }
     },
     "6f2ef4ffe0a946a383e46c7a5482fae4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
       "grid_template_columns": "20% 20% 20% 20% 20%",
       "width": "100%"
      }
     },
     "87f422f96d65471d8912359100f6bc60": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 0px 37px",
       "width": "600px"
      }
     },
     "9862138fedaa486785ed347a06000190": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_2cd01edeea8f4422b36b6d4304d0dfcf",
       "style": "IPY_MODEL_f844cfae1b51453ba6b27578af59cef2",
       "value": "<h5>Message</h5>"
      }
     },
     "99bd340e523d4340aa4224d5d3457f83": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_54b4fc1898c34e018e4834df9c5368b0",
       "style": "IPY_MODEL_fece3cf138604647840e2cf6dd67d46d",
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
      }
     },
     "bdf43e16c9e443609115ea1145cc06ca": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_area": "right",
       "padding": "0px 0px 0px 0px",
       "width": "70px"
      }
     },
     "da9d48aead9c40d8b883f8c123aa9cc7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "e1c497296cd442ba845a91ff415b4c4c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ed77e1bbfaf8472ea7a9413f0ff1ca13": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ButtonStyleModel",
      "state": {}
     },
     "f844cfae1b51453ba6b27578af59cef2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "fa09b6521bb7426ab811b3c51285110c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "primary",
       "description": "Clear",
       "layout": "IPY_MODEL_bdf43e16c9e443609115ea1145cc06ca",
       "style": "IPY_MODEL_ed77e1bbfaf8472ea7a9413f0ff1ca13"
      }
     },
     "fece3cf138604647840e2cf6dd67d46d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}