{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ae497630",
   "metadata": {},
   "source": [
    "# Gradient metasurface reflector"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0b7cf70",
   "metadata": {},
   "source": [
    "Electromagnetic metamaterials and metasurfaces are artificially engineered structures made of subwavelength resonating unit cells. By utilizing various design principles, they have enabled fascinating electromagnetic phenomena and capabilities such as negative refraction, cloaking, perfect absorption, high-NA focusing, and so on. In Tidy3D's example library, we have demonstrated a [dielectric metasurface absorber](https://www.flexcompute.com/tidy3d/examples/notebooks/DielectricMetasurfaceAbsorber/), a [metalens at the visible frequency](https://www.flexcompute.com/tidy3d/examples/notebooks/Metalens/), and a [graphene metamaterial absorber](https://www.flexcompute.com/tidy3d/examples/notebooks/GrapheneMetamaterial/). \n",
    "\n",
    "This notebook demonstrates a near-infrared metasurface reflector consisting of plasmonic antennas. First, we model the unit cell and extract the relationship between a geometric parameter and the corresponding complex reflection coefficient. Then, a super cell consisting of ten antennas is designed to exhibit a linear reflection phase such that the incident light can be diffracted to a particular angle efficiently. By a similar procedure, other beam shaping devices and metalenses can be designed according to different phase profiles. \n",
    "\n",
    "This example is based on the landmark work [Sun, S.; Yang, K.-Y.; Wang, C.-M.; Juan, T.-K.; Chen, W.T.; Liao, C.Y.; He, Q.; Xiao, S.; Kung, W.-T.; Guo, G.-Y.; et al. High-Efficiency Broadband Anomalous Reflection by Gradient Meta-Surfaces. Nano Lett. 2012, 12, 6223–6229](https://pubs.acs.org/doi/abs/10.1021/nl3032668).\n",
    "\n",
    "<img src=\"img/gradient_metasurface_reflector_schematic.png\" width=\"600\" alt=\"Schematic of the gradient metasurface reflector\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9cdbacb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tidy3d as td\n",
    "import tidy3d.web as web"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d2281a3f",
   "metadata": {},
   "source": [
    "## Unit Cell Simulation "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76f5caab",
   "metadata": {},
   "source": [
    "### Simulation Setup "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2736c0b1",
   "metadata": {},
   "source": [
    "In the first part of the notebook, we simulate a unit cell that consists of a rectangular gold antenna, a dielectric spacer, and a gold film on glass substrate. The thickness of the gold film is $d_3$=130 nm. The thickness of the spacer is $d_2$ = 50 nm. The thickness and width of the antenna are $d_1$=30 nm and $w$=90 nm. The only parameter we can vary is the length of the antenna $L$. The periodicities in x and y directions are $L_x$=120 nm and $L_y$=300 nm, respectively.\n",
    "\n",
    "First, define the simulation frequency and wavelength ranges."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fdde66c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "lda0 = 0.85  # central wavelength\n",
    "freq0 = td.C_0 / lda0  # central frequency"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76c9939e",
   "metadata": {},
   "source": [
    "Define geometric parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "21eecc0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "Lx = 0.12  # unit cell size in x direction\n",
    "Ly = 0.3  # unit cell size in y direction\n",
    "d1 = 0.03  # antenna thickness\n",
    "d2 = 0.05  # spacer thickness\n",
    "d3 = 0.13  # gold layer thickness\n",
    "w = 0.09  # antenna width\n",
    "inf_eff = 1e2  # effective infinity"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7683ef7c",
   "metadata": {},
   "source": [
    "Three materials will be defined in this model: gold for the antennas and the back plate, magnesium fluoride for the spacer, and silica for the substrate. Magnesium fluoride and silica will be modeled as lossless and non-dispersive dielectrics while gold will be modeled as a dispersive medium. \n",
    "\n",
    "More specifically, magnesium fluoride has a permittivity of 1.892 and silica has a permittivity of 2.25. For gold, we use one option from the Tidy3D's built-in [material library](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/material_library.html). More specifically, we use the evaporated gold data from [Olmon et al](https://journals.aps.org/prb/abstract/10.1103/PhysRevB.86.235147). There are other options for gold, as well as other common materials, in the [material library](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/material_library.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "bc841987",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define MgF2 material for the spacer layer\n",
    "mgf2 = td.Medium(permittivity=1.892)\n",
    "\n",
    "# using material library gold refractive index\n",
    "au = td.material_library[\"Au\"][\"Olmon2012evaporated\"]\n",
    "\n",
    "# define SiO2 material for the substrate\n",
    "sio2 = td.Medium(permittivity=2.25)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8fc4946",
   "metadata": {},
   "source": [
    "Construct the substrate, gold film, spacer, and antenna structures.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3a0ec4b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define SiO2 substrate\n",
    "sub = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, -inf_eff), rmax=(inf_eff, inf_eff, -d3)),\n",
    "    medium=sio2,\n",
    ")\n",
    "\n",
    "# define gold layer\n",
    "gold_layer = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, -d3), rmax=(inf_eff, inf_eff, 0)),\n",
    "    medium=au,\n",
    ")\n",
    "\n",
    "# define MgF2 spacer layer\n",
    "spacer = td.Structure(\n",
    "    geometry=td.Box.from_bounds(rmin=(-inf_eff, -inf_eff, 0), rmax=(inf_eff, inf_eff, d2)),\n",
    "    medium=mgf2,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "499e1fd9",
   "metadata": {},
   "source": [
    "Define a linearly polarized [PlaneWave](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.PlaneWave.html) as the excitation source. The polarization is chosen to be in the y direction. Also define a [DiffractionMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.DiffractionMonitor.html) on the reflection side to extract the complex reflection coefficient."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2e992653",
   "metadata": {},
   "outputs": [],
   "source": [
    "fwidth = freq0 / 10  # width of the gaussian pulse\n",
    "\n",
    "# define a plane wave excitation source\n",
    "plane_wave = td.PlaneWave(\n",
    "    source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),\n",
    "    size=(td.inf, td.inf, 0),\n",
    "    center=(0, 0, 0.3 * lda0),\n",
    "    direction=\"-\",\n",
    "    pol_angle=np.pi / 2,  # polarization is set to y direction\n",
    ")\n",
    "\n",
    "# define a diffraction monitor to calculate the reflection coefficient\n",
    "monitor_r = td.DiffractionMonitor(\n",
    "    center=[0, 0, 0.6 * lda0], size=[td.inf, td.inf, 0], freqs=[freq0], name=\"R\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a4fc1d4",
   "metadata": {},
   "source": [
    "To perform a parameter sweep over antenna length, it is convenient to define a function that builds the simulation with a given antenna length $L$. Later, this function will be called repeatedly to construct a simulation batch for parameter sweep."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b5dd0601",
   "metadata": {},
   "outputs": [],
   "source": [
    "Lz = 1.5 * lda0  # simulation domain size in z direction\n",
    "sim_size = [Lx, Ly, Lz]\n",
    "\n",
    "run_time = 3e-13  # simulation run time\n",
    "\n",
    "boundary_spec = td.BoundarySpec(\n",
    "    x=td.Boundary.periodic(),\n",
    "    y=td.Boundary.periodic(),\n",
    "    z=td.Boundary(minus=td.PML(), plus=td.PML()),\n",
    ")\n",
    "\n",
    "\n",
    "# define a function to build simulation given antenna length L\n",
    "def make_sim(L):\n",
    "    # define the gold antenna\n",
    "    antenna = td.Structure(\n",
    "        geometry=td.Box.from_bounds(rmin=(-w / 2, -L / 2, d2), rmax=(w / 2, L / 2, d2 + d1)),\n",
    "        medium=au,\n",
    "    )\n",
    "    unit_cell = [sub, gold_layer, spacer, antenna]\n",
    "\n",
    "    # set up simulation\n",
    "    sim = td.Simulation(\n",
    "        size=sim_size,\n",
    "        grid_spec=td.GridSpec.auto(min_steps_per_wvl=20, wavelength=lda0),\n",
    "        structures=unit_cell,\n",
    "        sources=[plane_wave],\n",
    "        monitors=[monitor_r],\n",
    "        run_time=run_time,\n",
    "        boundary_spec=boundary_spec,  # pml is applied to z direction. x and y directions are periodic\n",
    "    )\n",
    "    return sim"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a757a540",
   "metadata": {},
   "source": [
    "To ensure the simulation setup is correct, let's test a specific case where the antenna length is 150 nm and visualize the simulation. From the plot, the geometry, source, and monitor all seem to be correctly defined. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "ff6989af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# test a case where the antenna length is 150 nm\n",
    "sim = make_sim(0.15)\n",
    "# visualize the simulation\n",
    "sim.plot(x=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81c032c0",
   "metadata": {},
   "source": [
    "To have a better visualization, we can also plot the simulation in 3D."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0fc6495c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"H4sIABIghmgC/+1ZS2/cNhDedRLACFAgvaU9GbrGFijq3VPdxHHcxrFhB2gD11BpibtLRBJVSrK9DgL02N567E/oT+m/SoekpH15nVfRJo2FwJJmhpz3p+Hmt0cPHn52+8vbPXmtrvZu9u70pq9XzfX72ux7y/+pufeb+6/N/c+Vlt5XvLsN/fNm/3m5pwdbW1L61dzV6kE39X21d319itejrc19ef+heW/r6a+VWblvD/eeRIdPD3aebM/U5dfvqLffu6X36LfvqzP73gBL5PMX/b6q7DsdT8vdgrt8X1nR5NXG8hvtRnP91uv98UHn4fDJ3oN+F4Veb+3GdW1eX9fXx3o9Azi6szr5hm/f33ss77/cnf2uP2veXxikqkRpfLX24uX6mlGNCwrPxiHL6pRUjOcGUGOaV1QA/QiZaH2t/XMMrJJdUM2wsCTa62uWiX1X8jKasDqTW88qyUkm1+R1msLbQNCfa5rH40iQfDjFIGnKz6IhYTnQBiQtqVzL85TllIioLGg8Ec540hg8xzhlF3OUESXVHKl1e1dbDJSCioxVFTtl1Rg4lnTZiHme1HFHhBBId8pKALEWVDp4NOfrkPKMVmK8GIVW5zf8fFmMN1y4ee50nDFSnOYWhmbgHy/G9ITEz4eC13kSzTmyKNBlqWEVgnExI9wVReuo8f9KLjaxe3l2waF/NJ+vSSc0kf1BZtPYrKO9NOM5Rhamp6TgglQ0MS7N8JGFEXZtL7Td0HE8E4eyUEMbBVZo+14YBp4ZHP83NbDPU3pAS5bUym1alBHLB8BxTc/Glo0934MUuYEnYwfCqqehqQUlKTxuYBT4CPu2jWwXIYAFKcgyMtRMFweuh8B57EHvWqp+2qUu9gMMq0PbsnzHDxWkNEutwPfDENsODjDyA9d0X0KEpvS6AcK27dsBSAQmDpwptZ7vItfzHMsJQmx6Hp5W69ihZSHsIASaYfNprZ5peY7tBLBxEAROgOk9K5hX7Lmh7/nICwPXQaY/7W+AAmRZDmzgWMiEZE8rDkIIkAPOgGIfBaY7WeiatuMhB8LsgEvYbvQe/9P9Bn/wle2G3GvwfO8vIxTdv4KeC+AJhFCBpquY19B5DZ2fMHSqzhhnbX8dyY6Bf4rMaxFfOp7OdkuX6pTk9HtySpe3InZnWtHYyQcsl80CxKnn9pSgDIgqprTN2UCyImVVndBuzi5GpKQaRKas2iZ1WTKS79dQ7m3/IODYLvZCH6HQgerwHNOXvDOWVKMFpulIJh8MSlqpaEoFgmb8lEZJHMU8K3gODgMPepyqENVZJDVJe+F0YyRM0FidjMCmDWkHNG8Kzo1oRTqjNa0YsY4CLREpqnLThcyGnmyaEErP8/QSaNOueZcA5EN2TpOdXKXou0MpqlN/IjGMiPGS5eeLpCKty9d9grqKoACGCQNlEk9Y/o4rJyivjVXE8Ydr2sV7mrb72GgqKCVjqsTlMdkoiIAFlabMbVWyYUYiLhLVdHZHyRTW61pqKORc19Ksyn25eSkVPydFMbuVpuitdK81FLWVrUs3hf7rVlkdZdqAhqJWNZ/6t4z9JxWaS4trnqibWX2vAT25uAyv2zUP2GAgiIKhXS29HKpd6y2Qup1aDiSbye1OSQqYQmI9n6xLr9WGMU95DKPM1ADSwuTRAiKrmaWAZrsgDXTOp7YiopqUCc2TyUsL5XMltDnZrwtdzkUG9gJGS4l7hoLGoWDJElhUrPPlaLtZV3wbZNSgR86jMiYNgDtq9CtHKt5LVm8LktBkV0tJRpLOlAo8R2UlJykYTqOzU/ntx5exSpZFTQKt5lcnZfn4o7X84mO0/AxGopTmQ1WNyAwkusDkIMBYGs3+DKhaLgcAYfkwKjh0UkdWeBcJCq1HM+hYVZodd+IHS7qyBh1lM3FgE6ZfdQ5LeRVpa6IamljuYPxYI/skVue0zp6oPchEcBBQe8OxA+ZMaUqdFTSJwClpyMTw+qSAMSNdjHLCQDauBLtiQoGDAhEQuGQTzCZDCIBGNRiP0uWrDivCREzKVvzKIWh/6/59ng9Us0s/5GApMwdRVYdQrvMtYZ0mQ8gN07OVDELMxWSAU8il1GXxm9uW8rKEaL7GoVoMADV3ZIRJHtMr7ERvbudkd52irkTK7hf7qJWpWDK2VRsVvKwiiY1TP2XXcOislPowVKddGrO2yEbjk6YBNaBCNuGwl1D1TZPKRtCjA3n4s+gGkm0g6rwd7226Ydkvm/9n+Bv5ta1wkCAAAA==\" ></div>\n",
       "    <script>\n",
       "        \n",
       "        /**\n",
       "        * Simulation Viewer Injector\n",
       "        *\n",
       "        * Monitors the document for elements being added in the form:\n",
       "        *\n",
       "        *    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"{...}\" />\n",
       "        *\n",
       "        * This script will then inject an iframe to the viewer application, and pass it the simulation data\n",
       "        * via the postMessage API on request. The script may be safely included multiple times, with only the\n",
       "        * configuration of the first started script (e.g. viewer URL) applying.\n",
       "        *\n",
       "        */\n",
       "        (function() {\n",
       "            const TARGET_CLASS = \"simulation-viewer\";\n",
       "            const ACTIVE_CLASS = \"simulation-viewer-active\";\n",
       "            const VIEWER_URL = \"https://tidy3d.simulation.cloud/simulation-viewer\";\n",
       "\n",
       "            class SimulationViewerInjector {\n",
       "                constructor() {\n",
       "                    for (var node of document.getElementsByClassName(TARGET_CLASS)) {\n",
       "                        this.injectViewer(node);\n",
       "                    }\n",
       "\n",
       "                    // Monitor for newly added nodes to the DOM\n",
       "                    this.observer = new MutationObserver(this.onMutations.bind(this));\n",
       "                    this.observer.observe(document.body, {childList: true, subtree: true});\n",
       "                }\n",
       "\n",
       "                onMutations(mutations) {\n",
       "                    for (var mutation of mutations) {\n",
       "                        if (mutation.type === 'childList') {\n",
       "                            /**\n",
       "                            * Have found that adding the element does not reliably trigger the mutation observer.\n",
       "                            * It may be the case that setting content with innerHTML does not trigger.\n",
       "                            *\n",
       "                            * It seems to be sufficient to re-scan the document for un-activated viewers\n",
       "                            * whenever an event occurs, as Jupyter triggers multiple events on cell evaluation.\n",
       "                            */\n",
       "                            var viewers = document.getElementsByClassName(TARGET_CLASS);\n",
       "                            for (var node of viewers) {\n",
       "                                this.injectViewer(node);\n",
       "                            }\n",
       "                        }\n",
       "                    }\n",
       "                }\n",
       "\n",
       "                injectViewer(node) {\n",
       "                    // (re-)check that this is a valid simulation container and has not already been injected\n",
       "                    if (node.classList.contains(TARGET_CLASS) && !node.classList.contains(ACTIVE_CLASS)) {\n",
       "                        // Mark node as injected, to prevent re-runs\n",
       "                        node.classList.add(ACTIVE_CLASS);\n",
       "\n",
       "                        var uuid;\n",
       "                        if (window.crypto && window.crypto.randomUUID) {\n",
       "                            uuid = window.crypto.randomUUID();\n",
       "                        } else {\n",
       "                            uuid = \"\" + Math.random();\n",
       "                        }\n",
       "\n",
       "                        var frame = document.createElement(\"iframe\");\n",
       "                        frame.width = node.dataset.width || 800;\n",
       "                        frame.height = node.dataset.height || 800;\n",
       "                        frame.style.cssText = `width:${frame.width}px;height:${frame.height}px;max-width:none;border:0;display:block`\n",
       "                        frame.src = VIEWER_URL + \"?uuid=\" + uuid;\n",
       "\n",
       "                        var postMessageToViewer;\n",
       "                        postMessageToViewer = event => {\n",
       "                            if(event.data.type === 'viewer' && event.data.uuid===uuid){\n",
       "                                frame.contentWindow.postMessage({ type: 'jupyter', uuid, value: node.dataset.simulation, fileType: 'hdf5'}, '*');\n",
       "\n",
       "                                // Run once only\n",
       "                                window.removeEventListener('message', postMessageToViewer);\n",
       "                            }\n",
       "                        };\n",
       "                        window.addEventListener(\n",
       "                            'message',\n",
       "                            postMessageToViewer,\n",
       "                            false\n",
       "                        );\n",
       "\n",
       "                        node.appendChild(frame);\n",
       "                    }\n",
       "                }\n",
       "            }\n",
       "\n",
       "            if (!window.simulationViewerInjector) {\n",
       "                window.simulationViewerInjector = new SimulationViewerInjector();\n",
       "            }\n",
       "        })();\n",
       "    \n",
       "    </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim.plot_3d()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd8a0057",
   "metadata": {},
   "source": [
    "Now we are ready to perform the parameter sweep. In this particular case, we investigate antenna length from 40 nm to 280 nm. This is broken down into 14 simulations. A simulation batch is constructed by calling the `make_sim` function with different antenna lengths. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f6bce9b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "Ls = np.linspace(0.04, 0.28, 14)  # antenna lengths for parameter sweep\n",
    "\n",
    "sims = {f\"L={L:.2f}\": make_sim(L) for L in Ls}  # construct simulation batch"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53ad88b1",
   "metadata": {},
   "source": [
    "Submit the simulation batch to the server."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ab77c5c3",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d025d542adb54ea7b77d2d10767978b7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:24 UTC </span>Started working on Batch containing <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">14</span> tasks.                      \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:24 UTC\u001b[0m\u001b[2;36m \u001b[0mStarted working on Batch containing \u001b[1;36m14\u001b[0m tasks.                      \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:48:44 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.350</span> for the whole batch.                \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:48:44 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.350\u001b[0m for the whole batch.                \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Use <span style=\"color: #008000; text-decoration-color: #008000\">'Batch.real_cost()'</span> to get the billed FlexCredit cost after the\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Batch has completed.                                               \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mUse \u001b[32m'Batch.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed FlexCredit cost after the\n",
       "\u001b[2;36m             \u001b[0mBatch has completed.                                               \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fd83431b37764e45a5bf261f842f54b7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:52:15 UTC </span>Batch complete.                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:52:15 UTC\u001b[0m\u001b[2;36m \u001b[0mBatch complete.                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "563aa7bee1b64fb8959728040ed95bd3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# submit simulation batch to the server\n",
    "batch = web.Batch(simulations=sims, verbose=True)\n",
    "batch_results = batch.run(path_dir=\"data\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d99785f",
   "metadata": {},
   "source": [
    "### Result Analysis "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed45c1ae",
   "metadata": {},
   "source": [
    "After the simulations are complete, we are ready to extract the reflection coefficients. The reflection coefficient is simply the amplitude of the zero-th diffraction order. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cc934a6d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# extract the reflection coefficient at each antenna length\n",
    "r = np.zeros(len(Ls), dtype=\"complex\")\n",
    "for i, L in enumerate(Ls):\n",
    "    sim_data = batch_results[f\"L={L:.2f}\"]\n",
    "    r[i] = np.array(sim_data[\"R\"].amps.sel(f=freq0, polarization=\"s\"))[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2c6046f",
   "metadata": {},
   "source": [
    "To visualize the results, we plot the phase of the reflection coefficient and the reflectivity as a function of antenna length. Since the absolute value of the phase does not carry physical significance, we define 0 phase as the phase when the antenna is 40 nm long. The reflectivity decreases slightly when the antenna is 100 nm to 200 nm long but overall the reflectivity is above 80%."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5479ab80",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAHECAYAAAAzhhtwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAk+5JREFUeJzs3XlYlFUbBvB72BdZRFkEAQEXBFEUFHctSRT3XdM0NE1zJysxtcyU6ivSzLQsdy031HJXXFFBWUURUEFBkcUNBGSbme8PZIpEY5DhHWbu33XNdTnvvPNyD9HAM+ec54ikUqkUREREREREVGUaQgcgIiIiIiKqa1hIERERERERyYmFFBERERERkZxYSBEREREREcmJhRQREREREZGcWEgRERERERHJiYUUERERERGRnFhIERERERERyUlL6ADKQCKRID09HUZGRhCJRELHISJSG1KpFE+fPoW1tTU0NPjZXjn+XiIiEk5VfzexkAKQnp4OW1tboWMQEamttLQ0NG7cWOgYSoO/l4iIhPdfv5tYSAEwMjICUPbNMjY2FjgNEZH6yM3Nha2trex9mMrw9xIRkXCq+ruJhRQgmzZhbGzMX1hERALg9LWK+HuJiEh4//W7iRPSiYiIiIiI5MRCioiIiIiISE4spIiIiIiIiOTEQoqIiIiIiEhOLKSIiIiIiIjkxEKKiIiIiIhITiykiIiIiIiI5MRCioiIiIiISE4spIiIiIiIiOTEQoqIiIiIiEhOLKSIiIiIiIjkxEKKiIiIiIhITiykiIjotUilUqEj0L9IJBLkFz0TOgYRkUrTEjoAERHVLfcfZyHq9jVEJl9FVMo1FItLcOiT34SORf+w/fyfCDq0Hp8Pn40B7d6ESCQSOhIRkcrhiBQREb3Us+JCXLoZizXHt+G9XxagXcBAtA0YiEk/B+Cn49sQdjMG0bfjkVeYL3TU17J69Wo0adIEenp68PLywqVLl156bklJCb744gs4OTlBT08Pbdq0wZEjRyqcIxaLsWjRIjg4OEBfXx9OTk5YunRprYzeSaVSbA39E+mPszBl3acYuXImku6nKPzrEhGpG45IERERgLI/wO88uIfI5KuITLmKyJRruJaWhFKJuMJ5GiINtLRxQjsHV7RzaAUPB1cY6OgLlPr17dixA/7+/li7di28vLywYsUK+Pj4IDExERYWFi+cv3DhQmzduhXr1q2Ds7Mzjh49iiFDhuDChQto27YtAODrr7/GmjVrsGnTJri6uiIiIgJ+fn4wMTHBrFmzFPp6RCIR9n74E348ugU/Ht2CcwkReHPpOEzuNRof9puIenqGCv36RETqQiTl5Hbk5ubCxMQEOTk5MDY2FjoOEVGtyH2Wh5jb8bKiKSrlGh7lPXnhPHNjM3g4tIKHQyu0c3CFu31LGOoZ1EwGJXj/9fLyQvv27fHjjz8CKFtfZGtri5kzZ2L+/PkvnG9tbY1PP/0U06dPlx0bNmwY9PX1sXXrVgBA//79YWlpid9+++2l57xKTX1f7mTfw+JdK3D0yjkAgKVJQ3w2bCaGtO/N6X5ERC9R1fdgjkgREakBsUSMpPu3EZXy92hT0v2UF6aa6Whpw822haxoaufgCtsGjVT2j+7i4mJERkYiICBAdkxDQwPe3t64ePFipc8pKiqCnp5ehWP6+voIDQ2V3e/cuTN++eUXJCUloXnz5oiNjUVoaCiCgoJees2ioiLZ/dzc3Nd5WTL25jbY9MH/cCLuAhbtDEJK9l18sP4zbD63D4GjP0RLm6Y18nWIiNQRCykiIhX04OljRKVckxVOZeuYCl44z7ZBI9lok4ejK1wbN4euto4AiYXx4MEDiMViWFpaVjhuaWmJhISESp/j4+ODoKAgdO/eHU5OTggJCUFwcDDE4r+nQM6fPx+5ublwdnaGpqYmxGIxli1bhrFjx1Z6zcDAQCxZsqTmXti/eLt1RldnD/x84nesOLQBYTei4b1sAib2HI55/d+DiYGRwr42EZGqYiFFRFTHlYhLcf3eTUQkX0VUylVEJF/F7ey7L5xnoKuPtk1cnhdOZaNN5sYNBEhct61cuRKTJ0+Gs7MzRCIRnJyc4Ofnh/Xr18vO2blzJ7Zt24bt27fD1dUVMTExmDNnDqytrTFhwoQXrhkQEAB/f3/Z/dzcXNja2tZobj1tXczu+y6GefXBZ7tW4mD0Kaw7uQN7Lx/DoqEzMMKrLzQ02IOKiKiqWEgREdUxWTkPEZEcJ5uiF3s7Hs9Kil44r5lVE3g4tpIVTi2sHaGpoSlAYuXVsGFDaGpqIjMzs8LxzMxMWFlZVfocc3Nz7Nu3D4WFhXj48CGsra0xf/58ODo6ys756KOPMH/+fIwePRoA4Obmhjt37iAwMLDSQkpXVxe6uro1+MperrGZFX57PxBn4sPx6Y4g3My8g9mblmLruX1YPnoe3Oxa1EoOIqK6joUUEZESKy4twdW0JFknvYjkONx9lPHCeSYGRmjXxFVWOLVzcOV0rSrQ0dGBh4cHQkJCMHjwYABlzSZCQkIwY8aMVz5XT08PNjY2KCkpwZ49ezBy5EjZYwUFBS+M7mhqakIikdT4a6iuHi5eOLloK34J+QNBh9bjcnIcfAL9ML77EHwycArqG5oIHZGISKmxkCIiUiLpj7Nko01RyVdxJTURRaXFFc4RiURwtnZ8vq7JDR4Ormhqac9pWdXk7++PCRMmwNPTEx06dMCKFSuQn58PPz8/AMD48eNhY2ODwMBAAEB4eDju3bsHd3d33Lt3D59//jkkEgk+/vhj2TUHDBiAZcuWwc7ODq6uroiOjkZQUBAmTpwoyGt8GR0tbczweQfDOvhgyZ5V2BdxHBvP7MGfkSH4dPA0jOk8gD9XREQvwUKKiEgghSVFiEtNfF44XUNkchzuP8l+4TwzQxO0c2wFT4dW8HBsBXd7Fxjpcy+gmjJq1ChkZ2dj8eLFyMjIgLu7O44cOSJrQJGamlqhmCgsLMTChQuRnJyMevXqwdfXF1u2bIGpqansnFWrVmHRokX44IMPkJWVBWtra7z//vtYvHhxbb+8KmlU3wJr31uKd7oNxoId3yExPRkfbg3ElnP7EThmHto2cRE6IhGR0uE+UlCOfUyISPVJJBLE37uJU/FhOBN/CZduxaK4tKTCOZoamnCxcUI7h1bwfD7a5GBhq7Ltx/n+Wzkhvy8l4lKsP7UL/zuwDnmFBRCJRBjbZSACBk9Dg3qmtZqFiEgIVX0PZiEF/iInIsXJynmI09fDcSY+HGeuX8KDp48rPN7QqH5ZwfR8bVMb+5Yw1NUXKG3t4/tv5ZTh+5KV8xBfBP+I3eGHAQCmBsaYP+h9vNNtMJuWEJFKYyElB2X4hUVEquFZcSEu3YzF6euXcCY+HPH3blZ43EBXH12at0MPFy/0bOkFJ0s7lR1tqgq+/1ZOmb4v4TdjEPD7t7KfZTfb5ggc8xE8Hd0EzUVEpCgspOSgTL+wiKhukUqlSEhPxpnr4TgTfwkXb0Sj8B+tyEUiEdxsW6Cnixd6unjB09ENOlraAiZWLnz/rZyyfV9KxaXYdHYvvv7zZ+Q+ywMAjOrUDwuHTIe5sZnA6YiIahYLKTko2y8sIlJuD54+xrmEyzgdX1Y8ZeRUbBBhZWKOnq5lI05dnT3R0Ki+QEmVH99/K6es35fs3EdYvm8Nfr/wFwDA3NgMh+evR2OzyvfcIiKqbTkFT7Hy8Eb0adMdHZq2qdY1WEjJQVl/YRGRciguLcHlW1fKCqfr4biSmljhcX1tXXRs3hY9W3qhh4sXWjRyUOvpevLg+2/llP37EpVyFbM3fYkbGbfhbu+CffPWQE+7djYUJiKqTKm4FFvO7cP/DvyKR3lP4G7vgkOf/FqtLRyq+h7M9udERJW48yAdx+NCcTo+HBeSolBQ9KzC466Nm6FHyw7o6eKFDk3b8I9IUivtHFph24wg+AS+i5g78Vi4IwjfjgsQOhYRqamQqxfw+e4fcCPjNgCgmVUTfDTgPYV/qMlCiojouWfFhTgYfQrbz/+FC0lRFR5raFQfPV280KOlF3q07AALkwYCpSRSDnYNrbFm0lKMWTUHW0P3o52DK97uMlDoWESkRq7fu4Uv9qzCqfgwAGX7Ln40YDLe6TYYWpqKL3NYSBGR2ruSmoDt5/9C8KWjsoX0IpEInZu3wxsuHfGGa0e0tHaq1vQAIlXW08ULnwyYgq/+/BkBv38Ll8bN4G7fUuhYRKTisnMf4X9/rcPW0P2QSCXQ1tTCe2+Owpy+78LEwKjWcrCQIiK19CQ/F3suHcXvF/7C1bQk2fHGZlYY02UARnXqxwX0RFUwq88ERN+Ox9Er5zDp5wAcW7CRG/cSkUIUlhRh3ckdWHl4I/IKCwAA/dq+gUVDp6OJeeNazyPox6uBgYFo3749jIyMYGFhgcGDByMxseIi7p49e0IkElW4TZ06tcI5qamp6NevHwwMDGBhYYGPPvoIpaWltflSiKgOkEgkCE2IwAe/LUabT/rj0x3f4WpaEnS0tDHY8y3snP0DLn0ZjA/7TWIRRVRFGhoaWOX3GRwtbHHvUQam/boIYolY6FhEpEKkUin2R5xAt89HY9nen5BXWIA29i2x78O1+O39QEGKKEDgEakzZ85g+vTpaN++PUpLS7FgwQL07t0b8fHxMDQ0lJ03efJkfPHFF7L7BgYGsn+LxWL069cPVlZWuHDhAu7fv4/x48dDW1sby5cvr9XXQ0TKKf1xFnZcPIA/LhzEnQf3ZMddbJri7S4DMLRDH5jVMxEwIVHdZqxfD7+9/xV8v56EswmX8dX+n/HpkA+EjkVEKiAq5Ro+27UCl5PjAACNTM2xYPAHGNbBR/Ap94IWUkeOHKlwf+PGjbCwsEBkZCS6d+8uO25gYAArq8o/HT527Bji4+Nx4sQJWFpawt3dHUuXLsUnn3yCzz//HDo6Ogp9DUSknIpLS3A8LhTbz/+FU9fCIJFKAABGeoYY0qE33u4yEG3snNmmnKiGtLRxwvfjP8XUXxdh1dHNaNvEBb5tewodi4jqqLuPMrB8708IvnwMAKCvo4cZPu9g2ltjYaCjJ3C6Mkq1RionJwcAYGZWcZf0bdu2YevWrbCyssKAAQOwaNEi2ajUxYsX4ebmBktLS9n5Pj4+mDZtGq5du4a2bdu+8HWKiopQVFQku5+bm6uIl0NEAki6n4Lt5//CrvDDePj0sex4x2Zt8XaXAejf7k2leQMmUjWDPd9CdMo1/BzyB2Zt+gLNGjVBM6smQsciojokrzAfPx7dgrUnfkdhSRFEIhFGdvRFwKCpsDI1FzpeBUpTSEkkEsyZMwddunRBq1atZMfffvtt2Nvbw9raGleuXMEnn3yCxMREBAcHAwAyMjIqFFEAZPczMjIq/VqBgYFYsmSJgl4JEdW2/MIC7I88ge3n/0LE86F/ALAwboBRnfphTOf+cLS0EzAhkfpYOHQGYlMTEXYjGhPXzseR+ethqGfw308kIrUmloix4+JBfLX/Z2TlPgQAdGrWFktGzEZrO2eB01VOaQqp6dOn4+rVqwgNDa1wfMqUKbJ/u7m5oVGjRujVqxdu3boFJyenan2tgIAA+Pv7y+7n5ubC1ta2esGJSBBSqRSRKVex/fyf2B8Rgvyisu49mhqa8G7VGW93GYBerTrXyj4SRPQ3bU0t/PLel+i9/F3cyLiNOZuX4ZfJX3IaLRG91LmEy/hs10rE37sJAHAwb4zFw2aiT5vuSv3eoRR/YcyYMQMHDhzA2bNn0bjxq7tueHl5AQBu3rwJJycnWFlZ4dKlSxXOyczMBICXrqvS1dWFrq5uDSQnotomlUoRfOkoVh7ZhKT7KbLjjha2GNNlAEZ29IWlSUMBExKRhUkDrJuyDEODPsBfUSFYe8IF094aK3QsIlIyNzPu4IvgVTh2pWwgxcTACB/2m4R3ewyDjpa2wOn+m6CFlFQqxcyZM7F3716cPn0aDg4O//mcmJgYAECjRo0AAJ06dcKyZcuQlZUFCwsLAMDx48dhbGwMFxcXhWUnotqXdD8F83//Hy4kRQEA9LV10d+jF97uMgAdm7or9adWROqmvVNrLBkxBwv++BZf7v0Jre2c0aWFh9CxiEgJPMrLwXcHf8WmM8EolYihqaGJd3sMxYf93qtTXXQFLaSmT5+O7du3Y//+/TAyMpKtaTIxMYG+vj5u3bqF7du3w9fXFw0aNMCVK1cwd+5cdO/eHa1btwYA9O7dGy4uLnjnnXfwzTffICMjAwsXLsT06dM56kSkIvKLnmHFoQ1Ye2I7SsSl0NPWxey+EzDpjZEw1q8ndDwiegm/HsMQlXINu8MPY8qvC3F8wSZY17cQOhYRCUQsEWPD6d349sBveFJQ1uytd+uuWDR0Rp1sTCOSSqVSwb74Sz493rBhA959912kpaVh3LhxuHr1KvLz82Fra4shQ4Zg4cKFMDY2lp1/584dTJs2DadPn4ahoSEmTJiAr776ClpaVasTc3NzYWJigpycnArXJSLhHYk5i093BuHeo7IPWrzdumDZqA9h39Ba4GRUE/j+WzlV+r4UFBdiwDeTce3uDbRzcMVe/zXQ1ebWJETqJv7uDfhvCUTMnXgAZXs5fj58Frq37CBwshdV9T1Y0EJKWajSLywiVZH6IB0LdwbJ5k3bmFlh2Uh/+LTpxil8KoTvv5VTte/Lnex78An0w5OCXIzvPgTfvP2J0JGIqJYUlhRh5eGNWHVkM0olYhjr18PCIdMxtutAaGpoCh2vUlV9D1aKZhNEROWKSoqx9sR2rDi0Ac9KiqCloYlpb43FHF8/GOrqCx2PiKrB3twGqyd+jnGrP8Tms3vRrokrRnfuL3QsIlKw8JsxmLc1EDcy7gAAfN17YPnoeUq3H1R1sZAiIqVxLuEyAn7/Fjczy95wOzdvh8DRH6GF9X83oiEi5darVWfM6/8e/vfXOnyy/Ru4NG6qtHvDENHrefosH1/uXY1NZ8v2fbUwboDAMfPQr+0bAierWSykiEhwmTkP8PnuH7D38jEAQEOj+lgyfDaGdvDhND4iFTK3rx9ibsfjeNx5TFw7H8cWbKpTHbqI6L8du3IOn2z/BvefZAMAxnYZiEVDZ8DUsO5PU/43FlJEJJhScSk2ng3G1/t/xtPCfIhEIrzbfRjmD3ofJgZGQscjohqmoaGBH/0+h0+gH25n38UH6xdj24wgpV0nQURVl537EAt3fo/9EScAAE3MG+PbsfPR1dlT4GSKw0KKiAQRlXIVn2z/BnFpSQAAd3sXfP32x2hjz6k+RKrMxMAI698PRL+v38Pp+HD87691mD9oqtCxiKiapFIpdoYdwme7VuJJQS40NTQx1XsM5vV/D/o6ekLHUygWUkRUqx7n52D5vjXYGrofUqkUJgZGWDB4GsZ1HcRPpYnUhEvjZvjunQX4YP1nWHF4I9ztXdDHvbvQsYhITncepOPjbV/hzPVLAIBWts0R9M4CtVn/yEKKiGqFRCLBjrBDWBr8Ix7lPQEAjOzoi0VDZ8Dc2EzYcERU64Z28EFUyjX8emonZm5cgiMBG+BkaSd0LCKqArFEjF9P7sRXf/6MZ8WF0NPWxbz+7+F97zHQ1lSf8kJ9XikRCeb6vZv4ZPs3uHTrCgCghbUjvhrzETo1aytwMiIS0uJhM3ElNQGXbl3BxJ/n49DHv8JQz0DoWET0Cv/eWLdz83b4dux8OKrhByEspIhIYfIK8/Htgd+w7uQOiCVi6OvoYV7/9zCl12i1+sSKiCqno6WNdVOW461lE5CYngz/rcuxdtJSduskUkKFJUVYcWgDfjy6Rbax7mfDZuLtLgPV9v9Z/iVDRDVOKpXiQNQpLN71vaz9ab+2PfHFiLmwMbMUNhwRKRVLk4ZYN2UZhgVNx/6IE/BwaIUpvUYLHYuI/iHsRtnGuuX7PKraxrrVxUKKiGrU4/wcfLD+M5y6FgYAsG9og2WjPoS3W2eBkxGRsvJq6o7Ph8/Cwp3fY8meVXCza8Gpv0RKQF021q0uFlJEVGMe5+dg5IqZiEtLgo6WNmb4jMdMn3dUvv0pEb2+SW+MRFTKNQRfPoYp6z7F8QWb1P7TbiIhVbax7uJhM7nP4z+wkCKiGvHPIqqhUX3smrMKLW2aCh2LiOoIkUiE/40LwPX0W7h+7xbe+2UBgv1/go6WttDRiNRKdu5DfLojCH9GhgB4vrHuuAB0beEhcDLloyF0ACKq+/5ZRDUwqo/dc1eziCIiuRnq6mP9+1/BWL8eIpLj8NmulUJHIlIrB6JOotvnY/BnZAg0NTQxw+cdnFq0lUXUS7CQIqLX8jg/B6NWzpIVUXvmroaztaPQsYiojnKwsMWPfp8DADac2Y3gS0eFDUSkBiQSCb75ax3e+2UBnhTkws22OQ7P/w0Lh0zn9PxXYCFFRNVWXkRdSU1kEUVENaZ3666Y6+sHAPju4G+QSqUCJyJSXfmFBXjvlwAEHfwNAPC+9xgcnr8ere2cBU6m/FhIEVG1PMnPrVBE7Z7zI4soIqox03uPg762Lm5lpiL6drzQcYhUUuqDdPT/32QcijkDHS1trJywCEuGz4YW93qsEhZSRCS3J/m5GPmvIqqljZPQsYhIhdTTM0Rf9x4AgF1hhwVOQ6R6LiRFoc9XE3H93i2YG5thr/8ajOrUT+hYdQoLKSKSy99FVALM6pmyiCIihRnR0RcAsC/iGIpLSwROQ6Q6tpzbh5ErZuJR3hO0tnPG0YCN8HBsJXSsOoeFFBFVWU7BU4z6YbasiNozl0UUESlON2dPWJo0xOP8XJy8elHoOER1Xom4FAG/f4uPtn2FUokYgz3fwr55a2Fd30LoaHUSCykiqpKcgqcYuXIWYu9c/0cRxRbnRKQ4WppaGNK+NwBgV/ghgdMQ1W2P8nIw+ofZ2HBmN0QiERYMnoY1k76AAbvyVRsLKSL6TxWKKEMT7OZmu0RUS0Z27AsAOHYlFI/zcwROQ1Q3Xb93C32+8sP5xEgY6hpg49SvMavPBIhEIqGj1WkspIjolXIKnmLUytl/F1Fzf4RL42ZCxyIiNeHSuBlcGzdDibgU+yNOCB2HqM45GnsW/b+ZjNQH6bBvaIODn/wKnzbdhY6lElhIEdFL5RQ8xegfZiPmTjyLKCISzHCvPgCA3eFHBE5CVHdIpVKsPLwR7679BPlFBejSwgOH56/nViU1iIUUEVUq91keRv8wG9G3y4qoXSyiiEggQzv4QEOkgYjkOCRnpgodh0jpFRQXYtpvixG4fy2kUin8egzHH7NWwqyeidDRVAoLKSJ6Qe6zPIxaOatCEeXKIoqIBGJp0hA9XDoAAHZxVIroldIfZ2Hwt1OxL+I4tDQ08c3bnyBwzDxoc5PdGsdCiogq+GcRVd/QmEUUESmFkc/3lNodfhgSiUTgNETKKSI5Dj6B75ZtU2Jogp1zVmF89yFCx1JZLKSISOaf0/nqGxpj1xwWUUSkHHzadEc9PQOkPbyPS7euCB2HSOnsuHgQQ4M+QHbuI7S0ccLhgA3o3Lyd0LFUGgspIgJQVkSN+WEOolKuyYqoVrbNhY5FRAQAMNDRQ/92bwIAdoVxTymicmKJGJ/tXonZm5aiuLQEvu49cOCjdbBvaC10NJXHQoqI8PRZPsb8MAeRKVdR39AYO2evYhFFREpnhFfZnlJ/RZ3Es+JCgdMQCS+n4CnGrf4QP5/4HQDg328Sfp0SCEM9A4GTqQcWUkRq7umzfIz+YTYiU67C1KCsiHKzayF0LCKiF3Rq1hY2ZlbIfZaHY1dChY5DJKibGXfg+/UknLoWBn1tXfwyeRk+HjAZGhr887628DtNpMaePsvHmFVzZEXUrjksoohIeWloaGB4Bx8AwK7wwwKnIRLOqWth8P16Em5lpsKmviX+/OgXDPToJXQstcNCikhNlRdREclxZSNRc35gEUVESm94x7LpfaeuhSE795HAaYhql1QqxdoT2zH2R3/kPstDe0c3HAlYz9/fAmEhRaSG8grz8fa/iqjWds5CxyIi+k/NrJrA3d4FYokY+y4fFzoOUa0pEZdizuYv8fnuHyCRSjCm8wDsnrsa5sYNhI6mtlhIEamZvMKyxhKXWUQRyaxevRpNmjSBnp4evLy8cOnSpZeeW1JSgi+++AJOTk7Q09NDmzZtcOTIi5vE3rt3D+PGjUODBg2gr68PNzc3REREKPJlqI0Rz0eldoWzex+pB6lUio+3fY0dFw9CQ6SBL0fORdA7C6CrrSN0NLXGQopIjUilUry75hNcTo6DiYERiygiADt27IC/vz8+++wzREVFoU2bNvDx8UFWVlal5y9cuBA///wzVq1ahfj4eEydOhVDhgxBdHS07JzHjx+jS5cu0NbWxuHDhxEfH4/vvvsO9evXr62XpdIGt38LWhqauJKaiIT0ZKHjECncD0c24fcLf0FDpIH173+F994cBZFIJHQstcdCikiNBF86itDECBjo6mPn7FUsoogABAUFYfLkyfDz84OLiwvWrl0LAwMDrF+/vtLzt2zZggULFsDX1xeOjo6YNm0afH198d1338nO+frrr2Fra4sNGzagQ4cOcHBwQO/eveHk5FRbL0ulNahnCm+3LgCA3Ww6QSpu7+VjCNy/FgDw5Sh/9HHvLnAiKsdCikhN5Bc9w5d7VwMAZveZgDb2LKKIiouLERkZCW9vb9kxDQ0NeHt74+LFi5U+p6ioCHp6ehWO6evrIzT073bcf/75Jzw9PTFixAhYWFigbdu2WLdu3UtzFBUVITc3t8KNXm24Vx8AwJ7wIxBLxAKnIVKM8JsxmL1pKQDg/V6jMbHncIET0T+xkCJSEz8e3YL7T7Jh26AR3vceI3QcIqXw4MEDiMViWFpaVjhuaWmJjIyMSp/j4+ODoKAg3LhxAxKJBMePH0dwcDDu378vOyc5ORlr1qxBs2bNcPToUUybNg2zZs3Cpk2bKr1mYGAgTExMZDdbW9uae5Eq6i23rjAxMML9J9k4nxgpdByiGpeSlQa/NZ+guLQEvu49sHjYTKEj0b+wkCJSA2kP72PN8W0AgM+GzYSetq7AiYjqrpUrV6JZs2ZwdnaGjo4OZsyYAT8/vwqbYEokErRr1w7Lly9H27ZtMWXKFEyePBlr166t9JoBAQHIycmR3dLS0mrr5dRZuto6GORZNpK4K/zFZh9EddmjvByM/dEfj/Jz4G7vgh8nLoGmhqbQsehfWEgRqYEv965GYUkROjVri35t3xA6DpHSaNiwITQ1NZGZmVnheGZmJqysrCp9jrm5Ofbt24f8/HzcuXMHCQkJqFevHhwdHWXnNGrUCC4uLhWe17JlS6SmplZ6TV1dXRgbG1e40X8b4VXWve9g9CnkFxYInIaoZhSWFMFv7cdIzkpDYzMrbP7gfzDQ0fvvJ1KtYyFFpOLCbsRgf8QJaIg0sHTkXHb5IfoHHR0deHh4ICQkRHZMIpEgJCQEnTp1euVz9fT0YGNjg9LSUuzZsweDBg2SPdalSxckJiZWOD8pKQn29vY1+wLUnKejG5qYN0ZB0TMcijkjdByi1yaRSDB38zKE34yFsX49bJ0RBAsT7hOlrFhIEakwiUSCxbu+BwCM7ToQrWybC5yISPn4+/tj3bp12LRpE65fv45p06YhPz8ffn5+AIDx48cjICBAdn54eDiCg4ORnJyMc+fOoU+fPpBIJPj4449l58ydOxdhYWFYvnw5bt68ie3bt+OXX37B9OnTa/31qTKRSCTbU4rd+0gV/O/AOuy9fAxaGpr47f1AOFs7/veTSDAspIhU2B8XD+JKaiKM9Azx8YApQschUkqjRo3Ct99+i8WLF8Pd3R0xMTE4cuSIrAFFampqhUYShYWFWLhwIVxcXDBkyBDY2NggNDQUpqamsnPat2+PvXv34vfff0erVq2wdOlSrFixAmPHjq3tl6fyhnco6953NuEy7j+ufO8vorrg9wsH8P2hDQCA/40LQDfn9gInov8ikkqlUqFDCC03NxcmJibIycnhvHRSGU+f5aPT4uF48PQxPh8+C1O93xY6EtEL+P5bOX5f5DPo2/cRfjMWC4dMxwyfd4SOQyS3cwmXMeaHOSiViDGn77uYP2iq0JHUWlXfgzkiRaSiVhzegAdPH8PJ0g4Te44QOg4RkcKUN53YFX4Y/HyY6prE9BRM+jkApRIxBnu+xRkkdQgLKSIVlJKVhnUndwAAPhs2Czpa2gInIiJSnAEevaCrpYPE9GRcTUsSOg5RlWXnPsTYH+ci91keOji1xooJCytspUDKjf+liFTQkj2rUFxagjdcOuItty5CxyEiUigTAyP0bt0NALArjE0nqG4oKC7EO6s/wt1HGXAwb4wN077hPo91DAspIhVzLuEyjsSehaaGJj4fPpvtzolILZR37wu+fBSl4lKB0xC9mlgixoz1nyHmTjzMDE2wbUYQGtQzFToWyYmFFJEKKRWXYtHOFQAAvx7D0MLaQdhARES15A3XjmhgVB8Pnj7G6fhLQscheqUvgn/EoZgz0NHSxoZpX8PR0k7oSFQNLKSIVMiWc/uQkH4L9Q2N8WH/SULHISKqNdqaWhji+RYAYFf4IYHTEL3chtO78fOJ3wEAKycsgldTd2EDUbWxkCJSEU/yc/G/v9YBAD4aMAX1DU0ETkREVLtGdPQFAByNPYfcZ3kCpyF60Ym4C/h0RxAAYP7A9zGkfW+BE9HrYCFFpCK+O/gbHuXnoIW1I8Z3Gyx0HCKiWtfargWaN3JAYUkRDkSdFDoOUQVX05Lw/q8LIZFKMKbzAMzu+67Qkeg1sZAiUgFJ91Ow/vRuAMDSEXOgpaklcCIiotonEolke0rtZPc+UiLpj7Mw7scPkV9UgG7Onvhm7CdsBqUCBC2kAgMD0b59exgZGcHCwgKDBw9GYmJihXMKCwsxffp0NGjQAPXq1cOwYcOQmZlZ4ZzU1FT069cPBgYGsLCwwEcffYTSUnbsIfXx2e6VEEvE8GndDd1bdhA6DhGRYIZ28IFIJELYjWikPkgXOg4R8grz8c7qD5GRk43mjRzw65RAaPMDT5UgaCF15swZTJ8+HWFhYTh+/DhKSkrQu3dv5Ofny86ZO3cu/vrrL+zatQtnzpxBeno6hg4dKntcLBajX79+KC4uxoULF7Bp0yZs3LgRixcvFuIlEdW6E3EXcOpaGLQ1tfD58FlCxyEiEpSNmSW6tvAAAOy5dETgNKTuSsWlmLzuU1y7ewPmxmbYOv07mBgYCR2LaohIKpVK5X1SSUkJMjIyUFBQAHNzc5iZmdVImOzsbFhYWODMmTPo3r07cnJyYG5uju3bt2P48OEAgISEBLRs2RIXL15Ex44dcfjwYfTv3x/p6emwtLQEAKxduxaffPIJsrOzoaOj859fNzc3FyYmJsjJyYGxsXGNvBai2lBcWoI3lo7FrcxUfPDWWCweNlPoSERy4ftv5fh9eT07ww5h1sYv4Ghhi/NLdnIKFQlCKpXik9+/weaze6GvrYvgD9egbRMXoWNRFVT1PbjKI1JPnz7FmjVr0KNHDxgbG6NJkyZo2bIlzM3NYW9vj8mTJ+Py5cuvFTonJwcAZIVZZGQkSkpK4O3tLTvH2dkZdnZ2uHjxIgDg4sWLcHNzkxVRAODj44Pc3Fxcu3at0q9TVFSE3NzcCjeiumjD6d24lZmKhkb1Mdd3otBxiIiUQj/3ntDX0UNyVhqiUir/W4BI0dae2I7NZ/dCJBLhp0lfsIhSQVUqpIKCgtCkSRNs2LAB3t7e2LdvH2JiYpCUlISLFy/is88+Q2lpKXr37o0+ffrgxo0bcgeRSCSYM2cOunTpglatWgEAMjIyoKOjA1NT0wrnWlpaIiMjQ3bOP4uo8sfLH6tMYGAgTExMZDdbW1u58xIJ7cHTx/ju4G8AgAWDp8FI31DgREREysFQzwD92vYEAOwKZ9MJqn0Hok7ii+AfAQCfD5uFvu49BE5EilCllW6XL1/G2bNn4erqWunjHTp0wMSJE7F27Vps2LAB586dQ7NmzeQKMn36dFy9ehWhoaFyPa86AgIC4O/vL7ufm5vLYorqnG/+/AW5z/LgZtscozr1EzoOEZFSGeHVF7vDj2B/xHEsGT4butr/PdWfqCZEpVzFjA1LIJVK4ddjOKb0Gi10JFKQKhVSv//+e5Uupquri6lTp8odYsaMGThw4ADOnj2Lxo0by45bWVmhuLgYT548qTAqlZmZCSsrK9k5ly5dqnC98q5+5edUllNXV1funETKIv7uDWwN3Q8AWDrSH5oamgInIiJSLl2dPWFlYo6MnGyEXL0A37Y9hY5EauDOg3SM/+kjFJYUwdutC5aOnMM1eiqs2l37bt68iaNHj+LZs2cAyhbUyUsqlWLGjBnYu3cvTp48CQcHhwqPe3h4QFtbGyEhIbJjiYmJSE1NRadOnQAAnTp1QlxcHLKysmTnHD9+HMbGxnBx4VxUUj1SqRSLdq2ARCrBQI9e6NjMXehIRERKR1NDE0M79AYA7Ob0PqoFT/JzMe5Hfzx4+hitbJvj50lLua+jipO7kHr48CG8vb3RvHlz+Pr64v79+wCASZMm4cMPP5TrWtOnT8fWrVuxfft2GBkZISMjAxkZGbLizMTEBJMmTYK/vz9OnTqFyMhI+Pn5oVOnTujYsSMAoHfv3nBxccE777yD2NhYHD16FAsXLsT06dM56kQq6VDMaZxPjISeti4WDZ0hdBwiIqU1oqMvAOB43Hk8yssROA2pMqlUimm/LcaNjNtoZGqOLR98C0M9A6FjkYLJXUjNnTsXWlpaSE1NhYHB3z8go0aNwpEj8u3XsGbNGuTk5KBnz55o1KiR7LZjxw7ZOd9//z369++PYcOGoXv37rCyskJwcLDscU1NTRw4cACampro1KkTxo0bh/Hjx+OLL76Q96URKb3CkiIs2bMKADDtrbdh26CRwImIiJRXSxsnuNk2R4m4FPsjjgsdh1TYoZjTOBUfBj1tXWydEYRG9S2EjkS1QO7xxmPHjuHo0aMV1jIBQLNmzXDnzh25rlWV6YB6enpYvXo1Vq9e/dJz7O3tcejQIbm+NlFdtC5kB1IfpKORqTlm+IwXOg4RkdIb7tUXcWlJ2B1+BH49hwsdh1RQcWkJlgaX/Z067a234dpYvoZrVHfJPSKVn59fYSSq3KNHjziVjkiBMnMe4PvDGwAAnw75AIa6+gInIiJSfkPa94amhiYiU67iVmaq0HFIBW04vRu3s+/CwrgBZvR+R+g4VIvkLqS6deuGzZs3y+6LRCJIJBJ88803eOONN2o0HBH9bfm+NSgoegYPh1YY2t5H6DhERHWChUkD9HTxAsCmE1TzHufn4PtDZR9yfjJwCtdFqRm5p/Z988036NWrFyIiIlBcXIyPP/4Y165dw6NHj3D+/HlFZCRSe9G347Hj4kEAwNKRc6GhUe2Gm0REameEV1+EXL2A3eFH8FH/yXwPpRrz/cENeFKQi5Y2Thjdub/QcaiWyf1O0qpVKyQlJaFLly4YNGgQ8vPzMXToUERHR8PJyUkRGYnUmlQqxeKd3wMom+vfzqHyjbGJiKhyPm26wUjPEGkP7yP8VqzQcUhFJGemYv3pXQCAz4fN4p6Oaqhaze1NTEywcOHCms5CRJXYF3Ecl5PjYKCrj08HTxM6DhFRnaOvo4cBHm9i+/m/sCvsEDo1ayt0JFIBX+5djVKJGG+6dkKP59NHSb1Ua2z73LlzGDduHDp37ox79+4BALZs2YLQ0NAaDUek7gqKC7E0+EcAwCyf8WynSkRUTcO9+gIA/oo8iWfFhQKnobru4o1oHIo5Aw2RBhYPmyl0HBKI3IXUnj174OPjA319fURFRaGoqAgAkJOTg+XLl9d4QCJ1tvroFqQ/zkJjMyu87z1G6DhERHVWx6buaGxmhaeF+Th65ZzQcagOk0gk+GzXSgDAuG6D4GztKHAiEorchdSXX36JtWvXYt26ddDW1pYd79KlC6Kiomo0HJE6u/coEz8d2woA+GzYLOjr6AmciIio7tLQ0MCIjmWjUrvC2L2Pqi/48lFcSU1APT0DfNR/stBxSEByF1KJiYno3r37C8dNTEzw5MmTmshERCibe/2spAgdm7VF/3bcWoCI6HWVT+87HR+O7NyHAqehuqiguBDL960BAMzqMwHmxmYCJyIhyV1IWVlZ4ebNmy8cDw0NhaMjhzaJasKlm7HYe/kYRCIRlo6YA5FIJHQkIqI6z8nSDu0cXCGWiLH38nGh41Ad9MuJ35H+OAs2ZlaY/OYooeOQwOQupCZPnozZs2cjPDwcIpEI6enp2LZtG+bNm4dp09hRjOh1SSQSLHze7nxsl4Fws2shcCIiItUxwqt8et8hgZNQXZOV8xCrjm4BAHw6eBqn3JP87c/nz58PiUSCXr16oaCgAN27d4euri7mzZuHmTPZtYTode0MO4QrqQkw0jPEJwPfFzoOEZFKGeT5FhbvWoG4tCRcv3cLLW24ByZVzf8OrEN+UQHc7V0w2PMtoeOQEpBrREosFuPcuXOYPn06Hj16hKtXryIsLAzZ2dlYunSpojISqY28wnzZ3Ou5vhM595qIqIaZ1TOBd6suAIDd4Ww6QVVz/d4tbAv9EwCwZMQsaGhUawchUjFy/RRoamqid+/eePz4MXR0dODi4oIOHTqgXr16ispHpFZ+CdmBrNyHcLSwxXtvjhQ6DhGRSirv3rcn/CjEErHAaagu+GLPKkikEvRr+wa8mroLHYeUhNzldKtWrZCcnKyILERqTSKR4PcLfwEA5vV/Dzpa2v/xDCIiqo5erTqjvqExMnKyEZoQIXQcUnInr13EqfgwaGtqYdHQ6ULHISVSrX2k5s2bhwMHDuD+/fvIzc2tcCOi6gm/FYu0h/dhpGeIvu49hI5DRKSydLV1MNDDGwCwK/yIwGlImZWKS7FkzyoAwMQ3RqCJeWOBE5EykbuQ8vX1RWxsLAYOHIjGjRujfv36qF+/PkxNTVG/fn1FZCRSCzsvlnWQGujRi52AiIgUbGRHXwDAwehTyC8sEDgNKavfLxxAYnoy6hsaY25fP6HjkJKRu2vfqVOnFJGDSK0VFBfir6gQAMCI57/ciYhIcdo5uMLRwhbJWWk4eS0MAzzeFDoSKZm8wnx8/efPAAB/30kwNTQWOBEpG7kLqR49OOWIqKYdjT2LvMIC2DW0Rgen1kLHISJSeSKRCF2dPZGclYbY1OsspOgFq45sxoOnj+FoYYsJPYYKHYeUkNyF1JUrVyo9LhKJoKenBzs7O+jq6r52MCJ1svP5xpAjvPqypSoRUS1pbVu24XlcaqLASUjZ3HuUiZ9D/gAALBo6gw2gqFJyF1Lu7u4QiUQvfVxbWxujRo3Czz//DD09rvMg+i8ZT7JxJv4SgL9b8hIRkeK52TkDKCukpFLpK/++IfUSuH8NCkuK0LFZW/Rp013oOKSk5P7oe+/evWjWrBl++eUXxMTEICYmBr/88gtatGiB7du347fffsPJkyexcOFCReQlUjnBl45BIpWgg1NrdgMiIqpFztaO0NLQxKP8HNx7nCl0HFIS0bfjsft5N8clw2ezwKaXkntEatmyZVi5ciV8fHxkx9zc3NC4cWMsWrQIly5dgqGhIT788EN8++23NRqWSNVIpdK/p/WxyQQRUa3S1daBs40TrqYlIS41EY3NrISORAKTSqVYsvsHAMBwr75oY+8scCJSZnKPSMXFxcHe3v6F4/b29oiLiwNQNv3v/v37r5+OSMVdu3sDCem3oKulg4EevYSOQ0Skdtyer5O6wnVSBOBwzBmE3YyBnrYuAgZNFToOKTm5CylnZ2d89dVXKC4ulh0rKSnBV199BWfnsqr93r17sLS0rLmURCqqfO8onzbdYGJgJHAaIiL142b3vOFEGgspdVdcWoKlwT8CAKZ6j4GNGf+WpVeTe2rf6tWrZZvxtm5d1qY5Li4OYrEYBw4cAAAkJyfjgw8+qNmkRCqmRFyK4MtHAXBaHxGRUFrbsXMfldl4Zg9Ssu/C3NgMM3zeEToO1QFyF1KdO3dGSkoKtm3bhqSkJADAiBEj8Pbbb8PIqOwT9Xfe4Q8f0X85HR+OB08fo6FRffR08RI6DhGRWmpp0xQaIg1k5jxAZs4DWJo0FDoSCeBxfg6CDq4HAHwyYArq6RkKnIjqArkLKQAwMjLC1KmcN0r0OnY9bzIxtL0PtDWr9b8iERG9JkNdfTS1skfS/RTEpSbB0o2FlDr6/uAGPCnIhbO1E8Z0GSB0HKojqrXz55YtW9C1a1dYW1vjzp07AIDvv/8e+/fvr9FwRKrqSX4ujsaeAwCM7MRpfUREQpJN70tLEDgJCSElKw0bzuwGAHw+fBY0NTQFTkR1hdyF1Jo1a+Dv74++ffvi8ePHEIvFAID69etjxYoVNZ2PSCX9FXUSRaXFaGnjBNfGzYSOQ0Sk1so793GdlHr6cu9qlIhL8YZrR061J7nIXUitWrUK69atw6effgotrb+nI3l6esranxPRq5VP6xvh5cuN/oiIBFbeuY8t0NXPxRvROBh9GhoiDXw2bJbQcaiOkbuQSklJQdu2bV84rquri/z8/BoJRaTKbmffxaVbV6Ah0sDQDr2FjkNEpPZa2TYHANx9lIFHeTkCp6HaIpFI8PnzzXfHdR0EZ2tHgRNRXSN3IeXg4ICYmJgXjh85cgQtW7asiUxEKm1X2GEAQI+WHWBlai5wGiIiMtavBwfzxgCAq9xPSm3svXwMsXeuw1DXAB8NeE/oOFQHyd0qzN/fH9OnT0dhYSGkUikuXbqE33//HYGBgfj1118VkZFIZUgkEuwKLyuk2GSCiEh5uNm1QEr2XVxJTUT3lh2EjkMK9qy4EMv3rQEAzOozHubGDQRORHWR3CNS7733Hr7++mssXLgQBQUFePvtt7FmzRqsXLkSo0ePVkRGIpVx6dYVpD5IRz09A/i06S50HCJ6bvXq1WjSpAn09PTg5eWFS5cuvfTckpISfPHFF3BycoKenh7atGmDI0eOvPT8r776CiKRCHPmzFFAcqopbrLOfRyRUge/hPyBe48zYVPfElN68e9Xqp5qtT8fO3Ysbty4gby8PGRkZODu3buYNGlSTWcjUjnlTSYGtOsFAx09gdMQEQDs2LED/v7++OyzzxAVFYU2bdrAx8cHWVlZlZ6/cOFC/Pzzz1i1ahXi4+MxdepUDBkyBNHR0S+ce/nyZfz8889o3bq1ol8GvabW7NynNrJzH+KHI5sBAAsGT4M+fx9TNVWrkCpnYGAACwuLmspCpNKeFRfiz8gQAMCIjn0FTkNE5YKCgjB58mT4+fnBxcUFa9euhYGBAdavX1/p+Vu2bMGCBQvg6+sLR0dHTJs2Db6+vvjuu+8qnJeXl4exY8di3bp1qF+/fm28FHoNrZ6PSCVnpeHpMzbPUmXf/LUO+UUFaGPfEkPas+kTVV+V1ki1bdu2yi2ao6KiXisQkao6GnsOTwvz0djMCh2bugsdh4gAFBcXIzIyEgEBAbJjGhoa8Pb2xsWLFyt9TlFREfT0Kn6Cra+vj9DQ0ArHpk+fjn79+sHb2xtffvnlK3MUFRWhqKhIdj83N1fel0KvqUE9U9iYWeHeowxcvZuETs1e7FBMdd/1e7ewLfRPAMCS4bOhofFaYwqk5qr00zN48GAMGjQIgwYNgo+PD27dugVdXV307NkTPXv2hJ6eHm7dugUfHx9F5yWqs3aW7x3V0Zdv3ERK4sGDBxCLxbC0tKxw3NLSEhkZGZU+x8fHB0FBQbhx4wYkEgmOHz+O4OBg3L9/X3bOH3/8gaioKAQGBlYpR2BgIExMTGQ3W1vb6r8oqjZO71N9XwSvgkQqQb+2PdGxmbvQcaiOq9KI1GeffSb793vvvYdZs2Zh6dKlL5yTlpZWs+mIVERWzkOcjg8HAIzw6iNwGiJ6HStXrsTkyZPh7OwMkUgEJycn+Pn5yaYCpqWlYfbs2Th+/PgLI1cvExAQAH9/f9n93NxcFlMCcLNrgcOxZ7gxr4o6dS0Mp66FQVtTCwuHTBc6DqkAuT8W37VrF8aPH//C8XHjxmHPnj01EopI1QRfPgqJVAJPRzc4WtoJHYeInmvYsCE0NTWRmZlZ4XhmZiasrKwqfY65uTn27duH/Px83LlzBwkJCahXrx4cHcs284yMjERWVhbatWsHLS0taGlp4cyZM/jhhx+gpaUFsVj8wjV1dXVhbGxc4Ua1r7xz35XUBIGTUE0rFZfi8z1lm+9O7DkcDhb8oIJen9yFlL6+Ps6fP//C8fPnz1f5kzcidbPzYvm0PjaZIFImOjo68PDwQEhIiOyYRCJBSEgIOnXq9Mrn6unpwcbGBqWlpdizZw8GDRoEAOjVqxfi4uIQExMju3l6emLs2LGIiYmBpqamQl8TVV/r54XUzYw7yC96JnAaqkk7ww4jMT0ZpgbGmOPrJ3QcUhFyb8g7Z84cTJs2DVFRUejQoWzDuvDwcKxfvx6LFi2q8YBEdd21uzcQf+8mdLS0McjDW+g4RPQv/v7+mDBhAjw9PdGhQwesWLEC+fn58PMr+2Nr/PjxsLGxka13Cg8Px7179+Du7o579+7h888/h0QiwccffwwAMDIyQqtWrSp8DUNDQzRo0OCF46RcLE0awsK4AbJyH+L6vZvwdHQTOhLVkC3n9gIAZvi8g/qGJgKnIVUhdyE1f/58ODo6YuXKldi6dSsAoGXLltiwYQNGjhxZ4wGJ6rryJhO9W3eDqSGn6xDVlOTkZNl0utcxatQoZGdnY/HixcjIyIC7uzuOHDkia0CRmppaoUFMYWEhFi5ciOTkZNSrVw++vr7YsmULTE1NXzsLCa+1vTNOxJ3HldREFlIqIiUrDdG346Eh0sDIjr5CxyEVInchBQAjR45k0URUBaXiUgRfOgoAGMlpfUQ1qmnTpujRowcmTZqE4cOHv9b08hkzZmDGjBmVPnb69OkK93v06IH4+Hi5rv/va5DycrNtgRNx59m5T4UEXz4GAOjesj0sTBoInIZUSZXWSEmlUkXnIFJJp+MvITv3EczqmeIN11evtyAi+URFRaF169bw9/eHlZUV3n//fVy6dEnoWFTHla+TiktjIaUKpFIp9l4qK6S4+S7VtCoVUq6urvjjjz9QXFz8yvNu3LiBadOm4auvvqqRcER13a7wsml9Q9v3hrZmtQaAiegl3N3dsXLlSqSnp2P9+vW4f/8+unbtilatWiEoKAjZ2dlCR6Q6qLxzX8K9WygqefXfPaT8rqQm4mbmHehp68LXvafQcUjFVKmQWrVqFb799ltYWVlh1KhR+N///odt27Zhz549+PXXX+Hv748OHTrA3d0dxsbGmDZtmqJzEym9nIKnOBJzFgAwshPnZBMpipaWFoYOHYpdu3bh66+/xs2bNzFv3jzY2tpi/PjxFTbKJfovNvUtYWZoglKJGAnpyULHodcUfLlsev1bbl1hpG8ocBpSNVX6iLxXr16IiIhAaGgoduzYgW3btuHOnTt49uwZGjZsiLZt22L8+PEYO3Ys6tevr+jMRHXCgaiTKCotRgtrR7jZthA6DpHKioiIwPr16/HHH3/A0NAQ8+bNw6RJk3D37l0sWbIEgwYN4pQ/qjKRSAQ3uxY4c/0S4lIT0MbeWehIVE1iiRj7Lh8HAAzr4CNwGlJFcs016tq1K7p27aqoLEQqpbxb3wivvhCJRAKnIVI9QUFB2LBhAxITE+Hr64vNmzfD19dX1mHPwcEBGzduRJMmTYQNSnVOeSF1heuk6rSLSdHIzHkAEwMjvOHaUeg4pIK4aINIAW5n30X4zVhoiDT4KRiRgqxZswYTJ07Eu+++i0aNGlV6joWFBX777bdaTkZ1XfksAnbuq9v2PO+aO6Ddm9DV1hE4DakiFlJECrA7/AiAslarjepbCJyGSDUdP34cdnZ2FfZ4Asq6dKWlpcHOzg46OjqYMGGCQAmprirv3Bd/9yZKxKVsFlQHFZYU4WD0KQDs1keKU6VmE0RUdVKpFLvCDgMom9ZHRIrh5OSEBw8evHD80aNHcHBwECARqQr7hjYw0jNEUWkxbmbcFjoOVUPI1QvIfZaHRqbm6NSsrdBxSEWxkCKqYZdvXcGdB/dgqGuAPu49hI5DpLJetsdhXl7ea23OS6ShoYFWts0BlLXPpron+PneUYPb935h1Jqopgj6k3X27FkMGDAA1tbWEIlE2LdvX4XH3333XYhEogq3Pn36VDjn0aNHGDt2LIyNjWFqaopJkyYhLy+vFl8FUUXlTSb6t3sDhrr6AqchUj3+/v7w9/eHSCTC4sWLZff9/f0xe/ZsjBo1Cu7u7kLHpDpOtjEvC6k6J/dZHk7EnQfAbn2kWNWa9Hvr1i1s2LABt27dwsqVK2FhYYHDhw/Dzs4Orq6uVb5Ofn4+2rRpg4kTJ2Lo0KGVntOnTx9s2LBBdl9XV7fC42PHjsX9+/dx/PhxlJSUwM/PD1OmTMH27dur89KIXsuz4kL8GRkCABjRkXtHESlCdHQ0gLIRqbi4OOjo/L2IXEdHB23atMG8efOEikcqonxj3jh27qtzDkafRlFpMZpZNYFr42ZCxyEVJnchdebMGfTt2xddunTB2bNnsWzZMlhYWCA2Nha//fYbdu/eXeVr9e3bF337vnoNia6uLqysrCp97Pr16zhy5AguX74MT09PAGWbB/v6+uLbb7+FtbV11V8YUQ04diUUuc/yYGNmhc6ck02kEKdOlS0g9/Pzw8qVK2FsbCxwIlJFbrZl+0fFpSVBIpFwelgdEnyprOHTsA4+3H6EFErud4X58+fjyy+/xPHjxyt8Cvjmm28iLCysRsMBwOnTp2FhYYEWLVpg2rRpePjwoeyxixcvwtTUVFZEAYC3tzc0NDQQHh5e41mI/suu8PImE334S5dIwTZs2MAiihSmqZUd9LV1UVD0DMlZaULHoSrKzHmA0MRIAOzWR4on94hUXFxcpdPmLCwsKu2e9Dr69OmDoUOHwsHBAbdu3cKCBQvQt29fXLx4EZqamsjIyICFRcXW0lpaWjAzM0NGRsZLr1tUVISioiLZ/dzc3BrNTeopO/chTl0r+zBhOLv1ESnE0KFDsXHjRhgbG790Sni54ODgWkpFqkhTQxOuts0RkRyHuLRENLWyFzoSVcG+y8chlUrh6egGe3MboeOQipO7kDI1NcX9+/dfaC0bHR0NG5ua/YEdPXq07N9ubm5o3bo1nJyccPr0afTq1ava1w0MDMSSJUtqIiKRTPClYxBLxGjn4MpfuEQKYmJiIpuqY2xszGk7pFButi0QkRyHK6mJHN2oI4Ivl3Xr438vqg1yF1KjR4/GJ598gl27dkEkEkEikeD8+fOYN28exo8fr4iMMo6OjmjYsCFu3ryJXr16wcrKCllZWRXOKS0txaNHj166rgoAAgIC4O/vL7ufm5sLW1tbheUm9fD3tD6ORhEpyj+bD23cuFG4IKQW3Ni5r065lZmK2DvXoamhiYEe1f/Anaiq5F7EsXz5cjg7O8PW1hZ5eXlwcXFB9+7d0blzZyxcuFARGWXu3r2Lhw8folGjRgCATp064cmTJ4iMjJSdc/LkSUgkEnh5eb30Orq6ujA2Nq5wI3od8Xdv4GpaErQ1tTC4/VtCxyFSC19++SVSUlKEjkEqrPU/Ove9bN8yUh7Bl44CALq3bA9zYzOB05A6kLuQ0tHRwbp165CcnIwDBw5g69atSEhIwJYtW6CpqSnXtfLy8hATE4OYmBgAQEpKCmJiYpCamoq8vDx89NFHCAsLw+3btxESEoJBgwahadOm8PEp2xOgZcuW6NOnDyZPnoxLly7h/PnzmDFjBkaPHs2OfVSrdoaVjUb1bt0V9Q1NBE5DpB527dqFpk2bonPnzvjpp59qfJ0uUfNGDtDR0kZOwVOkPrwvdBx6BalUKiukuHcU1ZZqtxWztbWFr68vhg0bhvz8fDx+/Fjua0RERKBt27Zo27asTbS/vz/atm2LxYsXQ1NTE1euXMHAgQPRvHlzTJo0CR4eHjh37lyFvaS2bdsGZ2dn9OrVC76+vujatSt++eWX6r4sIrmViktlb94jvLh3FFFtiY2NxZUrV9CzZ0/Zlhf9+vXD9u3bUVBQIHQ8UgE6WtpwtnYCAMSlJgichl4l5s51pGTfhb62Lvq06S50HFITchdSc+bMwW+//QYAEIvF6NGjB9q1awdbW1ucPn1armv17NkTUqn0hdvGjRuhr6+Po0ePIisrC8XFxbh9+zZ++eUXWFpaVriGmZkZtm/fjqdPnyInJwfr169HvXr15H1ZRNV2NuEysnIfwszQBG+26iR0HCK14urqiuXLlyM5ORmnTp1CkyZNMGfOnFeukyWSR2uuk6oTyj/Q9GnTHfX0DAVOQ+pC7kJq9+7daNOmDQDgr7/+QnJyMhISEjB37lx8+umnNR6QSNntej6tb0iH3tDR0hY4DZH6MjQ0hL6+PnR0dFBSUiJ0HFIR5Q0nrrCQUlpiiRj7Io4DAIZ2YLc+qj1yF1IPHjyQfdJ36NAhjBw5Es2bN8fEiRMRFxdX4wGJlFnuszwcjjkDABjRkdP6iGpbSkoKli1bBldXV3h6eiI6OhpLlix55V6CRPJws31eSLHhhNIKTYhAdu4j1Dc0Rk+XjkLHITUid/tzS0tLxMfHo1GjRjhy5AjWrFkDACgoKJC72QRRXXcg6iQKS4rQzKoJ2tg5Cx2HSK107NgRly9fRuvWreHn54cxY8bU+H6GRC1tnKCpoYmHTx/j/pNsWNe3EDoS/Uv53lED2vXizBCqVXIXUn5+fhg5ciQaNWoEkUgEb29vAEB4eDicnfmHJKmX8m59Izv6cmNQolrWq1cvrF+/Hi4uLkJHIRWmr6OH5o2a4Pq9W4hLTWAhpWSeFRfiYPQpAMBQduujWiZ3IfX555+jVatWSEtLw4gRI2Qd9DQ1NTF//vwaD0ikrO48SEfYjWiIRCIM8+ojdBwitbNs2TKhI5CacLNtgev3buFKaiJ82BFOqZyIu4C8wgLYmFmhg1NroeOQmpG7kAKA4cOHv3BswoQJrx2GqC7ZHV42GtWthSc/oSSqJf7+/li6dCkMDQ3h7+//ynODgoJqKRWputb2ztgZdghxaWw4oWzKu/UNaf8WNDSqvasPUbVUq5DKz8/HmTNnkJqaiuLi4gqPzZo1q0aCESkzqVQq69bHJhNEtSc6OlrWkS86OlrgNKQuWtuyBboyepKfi5BrFwBwE14ShtyFVHR0NHx9fVFQUID8/HyYmZnhwYMHMDAwgIWFBQspUgsRyXG4nX0XBrr68HXvIXQcIrVx6tSpSv9NpEiujZtBJBLh/pNsZOc+hLlxA6EjEYCD0adQXFoCZ2sntLRpKnQcUkNyj4HOnTsXAwYMwOPHj6Gvr4+wsDDcuXMHHh4e+PbbbxWRkUjplI9G9Wv7Bgz1DAROQ6SeJk6ciKdPn75wPD8/HxMnThQgEakqQz0DNLW0AwDEpSUJnIbKlXfr42gUCUXuQiomJgYffvghNDQ0oKmpiaKiItja2uKbb77BggULFJGRSKkUlhRhf+QJAMDIjn0FTkOkvjZt2oRnz569cPzZs2fYvHmzAIlIlblxep9Suf84CxeSogAAg9u/JXAaUldyF1La2tqyxXwWFhZITU0FAJiYmCAtLa1m0xEpoWNXQpFT8BQ29S3RpbmH0HGI1E5ubi5ycnIglUrx9OlT5Obmym6PHz/GoUOHYGHBBjBUs9zsnm/My0JKKeyLOA6pVAqvpm1g26CR0HFITcm9Rqpt27a4fPkymjVrhh49emDx4sV48OABtmzZglatWikiI5FS2RV2CAAwzKsPOwQRCcDU1BQikQgikQjNmzd/4XGRSIQlS5YIkIxUmdvzTdfZuU85/N2tr7fASUidyV1ILV++XDYnfdmyZRg/fjymTZuGZs2aYf369TUekEiZZOc+wslrYQCA4dw7ikgQp06dglQqxZtvvok9e/bAzMxM9piOjg7s7e1hbW0tYEJSRW62ZUV76oN0PMnPhamhscCJ1FfS/RTEpSVBS0MTAzx6CR2H1JjchZSnp6fs3xYWFjhy5EiNBiJSZvsuH4dYIoa7vQuaN3IQOg6RWurRo6xTZkpKCuzs7CASiQROROrAxMAI9g1tcOfBPVxNS0JXZ8//fhIpxN7nTSZ6unZEg3qmwoYhtcZ5SURy2Bl2EAAwshP3jiIS2smTJ7F79+4Xju/atQubNm0SIBGpOq6TEp5UKkXwJXbrI+UgdyGVmZmJd955B9bW1tDS0oKmpmaFG5GqSkhPRlxaErQ1tTDI01voOERqLzAwEA0bNnzhuIWFBZYvXy5AIlJ1rZ8XUlwnJZyolGu48+AeDHT10bt1N6HjkJqTe2rfu+++i9TUVCxatAiNGjXilApSG/ueTyV4g1MJiJRCamoqHBxenGJrb28v6yhLVJPYAl14wZfLmkz0bdMdhrr6AqchdSd3IRUaGopz587B3d1dAXGIlJNUKsW+iLK9o9ghiEg5WFhY4MqVK2jSpEmF47GxsWjQoIEwoUiltXrecOJWViryCvNRT89Q4ETqpVRciv2y38Wc1kfCk3tqn62tLaRSqSKyECmt2NQE3M6+C31tXfR26yp0HCICMGbMGMyaNQunTp2CWCyGWCzGyZMnMXv2bIwePVroeKSCzI3NYF3fAlKpFNfu3hA6jto5lxCBB08fw6yeKXq4dBA6DpH8hdSKFSswf/583L59WwFxiJTTvsvHAQBvte4KQz0DgdMQEQAsXboUXl5e6NWrF/T19aGvr4/evXvjzTff5BopUhhO7xPOnud7Rw306AVtTbknVRHVuCr9FNavX7/CWqj8/Hw4OTnBwMAA2traFc599OhRzSYkEphEIsGfkZzWR6RsdHR0sGPHDixduhSxsbHQ19eHm5sb7O3thY5GKszNrgWOXjnHzn21rKC4EIdjzgBgtz5SHlUqpFasWKHgGETK63LyFaQ/zoKRniHecO0odBwi+pcmTZpAKpXCyckJWlr8lJoUi537hHHsyjnkFxXAtkEjeDq6CR2HCEAVC6kJEyYoOgeR0tr7fFpfX/ce0NPWFTgNEZUrKCjAzJkzZXtGJSUlwdHRETNnzoSNjQ3mz58vcEJSReVT+5Lu38az4kLo6+gJnEg97H2+d9TQ9r3ZMZqURrU25BWLxdi9ezeWLl2KpUuXYs+ePSgtLa3pbESCKxWX4q+okwCAwe3fEjgNEf1TQEAAYmNjcfr0aejp/f3HrLe3N3bs2CFgMlJlVqbmaGhUH2KJGNfv3RI6jlp4nJ+Dk9cuAgCGcFofKRG5C6lr166hefPmmDBhAvbu3Yu9e/diwoQJaNasGa5evaqIjESCOZ8YiYdPH8PM0ATdnNsLHYeI/mHfvn348ccf0bVr1wqfULu6uuLWLf6BS4ohEongxul9tepA1CmUiEvh2rgZnK0dhY5DJCN3IfXee+/B1dUVd+/eRVRUFKKiopCWlobWrVtjypQpishIJJjyvaP6t3uTHYKIlEx2djYsLCxeOJ6fn8+pP6RQrZ9P77tyJ0HgJOqhvFsfGz6RspG7kIqJiUFgYCDq168vO1a/fn0sW7YM0dHRNRqOSEhFJcU4FHMaAKf1ESkjT09PHDx4UHa/vHj69ddf0alTJ6FikRrgiFTtufcoE2E3yv6+ZCFFykbuj9ibN2+OzMxMuLq6VjielZWFpk2b1lgwIqGduR6OnIKnsDIxh1fTNkLHIaJ/Wb58Ofr27Yv4+HiUlpZi5cqViI+Px4ULF3DmzBmh45EKc7NzBgBcv3cLxaUl0NHS/o9nUHXtvVzWZKJjs7awMbMUOA1RRXKPSAUGBmLWrFnYvXs37t69i7t372L37t2YM2cOvv76a+Tm5spuRHVZebe+gR69oKmhKXAaIvq3rl27IiYmBqWlpXBzc8OxY8dgYWGBixcvwsPDQ+h4pMLsGjSCiYERSsSlSExPFjqOSisvpLh3FCkjuUek+vfvDwAYOXKkbBqFVCoFAAwYMEB2XyQSQSwW11ROolqVX/QMR2LPAgAGt/cWOA0RvYyTkxPWrVsndAxSMyKRCG62LRCaGIG4tETZVD+qWQnpybh29wa0NbXQv90bQscheoHchdSpU6cUkYNIqZyIO49nxYWwa2iNtk1c//sJRFQr5JntYGxsrMAkpO7c7MoKqSupiXi7i9BpVNPe500m3nTthPqGJgKnIXqR3IVUjx49FJGDSKnsjyib1jfY8y12/yJSIqampv/5/yRnRVBtaPN8nVRcKhtOKIJUKkXw82l9QzqwyQQpJ/ZzJvqX3Gd5CLlatvHfYE9O6yNSJpwVQcqifDpf/N0bKBWXQotbZNSoiOQ4pD28D0NdA/Ru3U3oOESV4v/1RP9yJPYsikqL0cyqCVrasBMlkTJZuXIlNm7cCGNjY2zevBmjRo2Crq6u0LFIDTmYN4ahrgHyiwpwMzOVG8XWsOBLZaNRfd17wEBHT+A0RJWTu2sfkaor7xA0uD2n9REpmwMHDiA/Px8A4Ofnh5ycnBq57urVq9GkSRPo6enBy8sLly5deum5JSUl+OKLL+Dk5AQ9PT20adMGR44cqXBOYGAg2rdvDyMjI1hYWGDw4MFITOQUMFWioaEBN9vmADi9r6aViEuxP/IEAHbrI+XGESmif3iY9wRnr18GAAzy4LQ+ImXj7OyMgIAAvPHGG5BKpdi5c+dLm0qMHz++StfcsWMH/P39sXbtWnh5eWHFihXw8fFBYmIiLCwsXjh/4cKF2Lp1K9atWwdnZ2ccPXoUQ4YMwYULF9C2bVsAwJkzZzB9+nS0b98epaWlWLBgAXr37o34+HgYGhpW/xtASsXNrgXCbsYgLjURIzr2FTqOyjh7/RIe5T1BQ6P66ObsKXQcopdiIUX0DwejTkEsEcPNtjmaWtkLHYeI/mXt2rXw9/fHwYMHIRKJsHDhwkpHjkUiUZULqaCgIEyePBl+fn6yr3Hw4EGsX78e8+fPf+H8LVu24NNPP4Wvry8AYNq0aThx4gS+++47bN26FQBeGKHauHEjLCwsEBkZie7du8v1mkl5la+TupLGEamaFPy8W98gT2+uPSOlJvdPZ2ZmJubNm4eQkBBkZWXJ9pAqxy5JVJftK+/W154dgoiUUefOnREWFgagbGpVUlJSpaNGVVVcXIzIyEgEBATIjmloaMDb2xsXL16s9DlFRUXQ06u4ZkNfXx+hoaEv/TrlUxDNzMxees2ioiLZfW5qXze42ZYVUlfTEiGRSKChwRUTryu/6BkOP9/HcWh7Tusj5SZ3IfXuu+8iNTUVixYtQqNGjbiGhFRGxpNsXLwRDQAY6NFL4DRE9F9SUlJgbm7+Wtd48OABxGIxLC0tKxy3tLREQkJCpc/x8fFBUFAQunfvDicnJ4SEhCA4OPilHyRKJBLMmTMHXbp0QatWrSo9JzAwEEuWLHmt10K1r5mVPfS0dZFXWIDb2XfhaGkndKQ679iVcygoegb7hjZo58B9HEm5yV1IhYaG4ty5c3B3d1dAHCLh/BV5ElKpFO0d3WDboJHQcYjoP9jb2+PcuXP4+eefcevWLezevRs2NjbYsmULHBwc0LVrV4V83ZUrV2Ly5MlwdnaGSCSCk5MT/Pz8sH79+krPnz59Oq5evfrKEauAgAD4+/vL7ufm5sLW1rbGs1PN0tLUgkvjpohKuYYraYkspGpA+bS+oR1688N6Unpyj0Hb2tq+MJ2PSBXsjSjr1jeo/VsCJyGiqtizZw98fHygr6+P6Oho2dS4nJwcLF++vErXaNiwITQ1NZGZmVnheGZmJqysrCp9jrm5Ofbt24f8/HzcuXMHCQkJqFevHhwdX2x/PWPGDBw4cACnTp1C48aNX5pDV1cXxsbGFW5UN5RP72Pnvtf3MO8JTl0rm7o7hFPsqQ6Qu5BasWIF5s+fj9u3bysgDpEw7jxIR1TKNWiINDCwHaf1EdUFX375JdauXYt169ZBW1tbdrxLly6Iioqq0jV0dHTg4eGBkJAQ2TGJRIKQkBB06tTplc/V09ODjY0NSktLsWfPHgwaNEj2mFQqxYwZM7B3716cPHkSDg4Ocr46qita27GQqikHok6i9HnDp+aN+P8MKT+5p/aNGjUKBQUFcHJygoGBQYVfXgDw6NGjGgtHVFv+jCjbr6JLi3awMGkgcBoiqorExMRKO+CZmJjgyZMnVb6Ov78/JkyYAE9PT3To0AErVqxAfn6+rIvf+PHjYWNjg8DAQABAeHg47t27B3d3d9y7dw+ff/45JBIJPv74Y9k1p0+fju3bt2P//v0wMjJCRkaGLJu+vv5rvGpSNuWd++LSEiGVSjkd7TX8Pa2PTSaobpC7kFqxYoUCYhAJS9atz5PT+ojqCisrK9y8eRNNmjSpcDw0NLTSaXYvM2rUKGRnZ2Px4sXIyMiAu7s7jhw5ImtAkZqaWqEbW2FhIRYuXIjk5GTUq1cPvr6+2LJlC0xNTWXnrFmzBgDQs2fPCl9rw4YNePfdd+V6naTcWjRyhLamFh7n5+Luowyusa2mtIf3EX4zFiKRiL+Lqc6Qu5CaMGGCInIQCSbpfgqu3b0BLQ1N+LbtKXQcIqqiyZMnY/bs2Vi/fj1EIhHS09Nx8eJFfPjhh1i8eLFc15oxYwZmzJhR6WOnT5+ucL9Hjx6Ij49/5fW4llh96GrrwNnaEXFpSYhLTWQhVU37Lpd9oNm5eTs0ql/9LQ2IalO1djkTi8XYt28frl+/DgBwdXXFwIEDoampWaPhiGrD/ufT+nq6dkR9QxOB0xBRVc2fPx8SiQS9evVCQUEBunfvDl1dXXz00Ud47733hI5HasTNrkVZIZWWyA/kqin48vNpfWwyQXWI3M0mbt68iZYtW2L8+PEIDg5GcHAwxo0bB1dXV9y6dUsRGYkURiqV/mNan7fAaYhIHiKRCJ9++ikePXqEq1evIiwsDNnZ2TAxMWFzB6pV5Z37rrDhRLUkpqfg+r1b0NHSRr+2bwgdh6jK5C6kZs2aBScnJ6SlpSEqKgpRUVFITU2Fg4MDZs2apYiMRApzNS0JtzJToaetiz5tXly0TkTKp6ioCAEBAfD09ESXLl1w6NAhuLi44Nq1a2jRogVWrlyJuXPnCh2T1EhrO2cA7NxXXWeuhwMom9ZnasjW/1R3yD2178yZMwgLC4OZmZnsWIMGDfDVV1+hS5cuNRqOSNHKR6O83bqgnp6hwGmIqCoWL16Mn3/+Gd7e3rhw4QJGjBgBPz8/hIWF4bvvvsOIESM41ZxqVcvGTaEh0kBW7kNk5jyApUlDoSPVKecSLgMAujm3FzgJkXzkLqR0dXXx9OnTF47n5eVBR0enRkIR1YayaX1l66M4rY+o7ti1axc2b96MgQMH4urVq2jdujVKS0sRGxvL1tMkCAMdPTRr1ASJ6cm4kpqIt9xYSFVVibgUF5KiAQDdWUhRHSP31L7+/ftjypQpCA8Ph1QqhVQqRVhYGKZOnYqBAwcqIiORQkSmXMW9Rxkw1DVAr1adhY5DRFV09+5deHh4AABatWoFXV1dzJ07l0UUCervdVIJAiepW2JuxyO/qABmhiZwbdxM6DhEcpG7kPrhhx/g5OSETp06QU9PD3p6eujSpQuaNm2KlStXKiIjkUKUt1rt694d+jp6AqchoqoSi8UVZkBoaWmhXr16AiYiAlqXb8zLdVJyOft8Wl+XFp4V9msjqgvkntpnamqK/fv348aNG0hIKPvUpWXLlmjatGmNhyNSFLFEjD8jQwAAg7jxH1GdIpVK8e6770JXVxdA2Qa5U6dOhaFhxXWOwcHBQsQjNeXGQqpaziVEAAC6t+S0Pqp7qrWPFAA0a9YMzZpxCJbqpotJ0cjKfQhTA2P0aNlB6DhEJId/bww/btw4gZIQ/a1V4+YAgHuPM/Hg6WM0NKovcCLll19YgMjkOABAN2dPgdMQya9KhZS/vz+WLl0KQ0ND+Pv7v/LcoKCgGglGpEjl3fr6t3sDOlraAqchInls2LBB6AhELzDSN4SjhS2Ss9JwNS0JPV28hI6k9MJuxqBEXArbBo1g39BG6DhEcqvSZNTo6GiUlJTI/v2qmzzOnj2LAQMGwNraGiKRCPv27avwuFQqxeLFi9GoUSPo6+vD29sbN27cqHDOo0ePMHbsWBgbG8PU1BSTJk1CXl6eXDlIvRSXluBg9CkAwGBO6yMiohrC6X3yKZ/W183Zk81iqE6q0ojUqVOnKv3368rPz0ebNm0wceJEDB069IXHv/nmG/zwww/YtGkTHBwcsGjRIvj4+CA+Ph56emXNAcaOHYv79+/j+PHjKCkpgZ+fH6ZMmYLt27fXWE5SLWevX8bj/FyYG5uhU/O2QschIiIV4WbbAvsjTuAKC6kqKd8/qrszp9hT3SR3e5SJEydWuo9Ufn4+Jk6cKNe1+vbtiy+//BJDhgx54TGpVIoVK1Zg4cKFGDRoEFq3bo3NmzcjPT1dNnJ1/fp1HDlyBL/++iu8vLzQtWtXrFq1Cn/88QfS09PlfWmkJsqn9Q306AVNDW7aSURENUPWuS+NhdR/efD0Ma7dLZtl1KWFh8BpiKpH7kJq06ZNePbs2QvHnz17hs2bN9dIKABISUlBRkYGvL3/3ijVxMQEXl5euHjxIgDg4sWLMDU1hafn3wsUvb29oaGhgfDw8Jdeu6ioCLm5uRVupB6eFRficMwZAJzWR0RENat8at/t7LvIKXjxQ2f6W2hi2bQ+F5umMDc2EzgNUfVUuZDKzc1FTk4OpFIpnj59WqEIefz4MQ4dOgQLC4saC5aRkQEAsLS0rHDc0tJS9lhGRsYLX1NLSwtmZmaycyoTGBgIExMT2c3W1rbGcpNyC7l6AflFBWhsZgVPRzeh4xARkQqpb2gC2waNAABX05IETqPcQv+xPoqorqpy+3NTU1OIRCKIRCI0b978hcdFIhGWLFlSo+EUJSAgoEL3wdzcXBZTamJfxAkAwCBPby5sJSKiGtfargXSHt5HXFoip6y9QvlGvN24PorqsCoXUqdOnYJUKsWbb76JPXv2wMzs72FYHR0d2Nvbw9rausaCWVlZAQAyMzPRqFEj2fHMzEy4u7vLzsnKyqrwvNLSUjx69Ej2/Mro6urKNnIk9ZFXmI8TcecBcFofEREphpttCxyMPs3Ofa9wJ/seUh+kQ0tDE52auQsdh6jaqlxI9ejRA0DZ2iU7OzuFf5rv4OAAKysrhISEyAqn3NxchIeHY9q0aQCATp064cmTJ4iMjISHR9mnPidPnoREIoGXF/dvoIqOxp5DYUkRnCzt0Mr2xVFVIiKi11W+Toqd+16uvFufh2MrGOoZCJyGqPqqXEiVO3nyJOrVq4cRI0ZUOL5r1y4UFBS8sOP8q+Tl5eHmzZuy+ykpKYiJiYGZmRns7OwwZ84cfPnll2jWrJms/bm1tTUGDx4MAGjZsiX69OmDyZMnY+3atSgpKcGMGTMwevToGh0dI9VQ3q1vkOdbnNZHREQKUd6572bmHeQXPYOhrr7AiZTPueeNJrq24Pooqtvk7toXGBiIhg0bvnDcwsICy5cvl+taERERaNu2Ldq2LdvLx9/fH23btsXixYsBAB9//DFmzpyJKVOmoH379sjLy8ORI0dke0gBwLZt2+Ds7IxevXrB19cXXbt2xS+//CLvyyIV9zg/B6fjyzo5Dvb0/o+ziYiIqsfcuAGsTMwhlUoR/7y9N/1NIpHINuLt3rK9wGmIXo/cI1KpqalwcHB44bi9vT1SU1PlulbPnj0hlUpf+rhIJMIXX3yBL7744qXnmJmZcfNd+k+Hok+jRFwK18bN0LzRiz+/RERENcXNrjky4rJxJTUR7Z1aCx1HqVxPv4VHeU9goKuPtk1chY5D9FrkHpGysLDAlStXXjgeGxuLBg0a1EgooppWPq2PTSaIiEjR3OycAXBj3sqcvX4JANCpWVvoaGkLnIbo9chdSI0ZMwazZs3CqVOnIBaLIRaLcfLkScyePRujR49WREai15KV8xDnE6MAAAM5rY+IiBSstW3ZOil27nvROe4fRSpE7ql9S5cuxe3bt9GrVy9oaZU9XSKRYPz48XKvkSKqDX9FnYREKkE7B1fYN2QTEiIiUqzyzn2J6ckoLCmCnja3XAGA4tISXLwRDQDo7sz1UVT3yV1I6ejoYMeOHVi6dCliY2Ohr68PNzc32NvbKyIf0Wvbz2l9RERUi6zrW8Csnike5T1BQnoy3O1bCh1JKUSlXMOz4kI0MKoPZ2snoeMQvTa5C6lyTZo0gVQqhZOTk2xkikjZ3H2UgUu3rkAkEmGgRy+h4xARkRoQiURobdcCp+PDEZeayELqubPP94/q1sITGhpyry4hUjpy/xQXFBRg0qRJMDAwgKurq6xT38yZM/HVV1/VeECi17E/4gSAskWtVqbmAqchIiJ14cZ1Ui8ILS+kuD6KVITchVRAQABiY2Nx+vTpCvs5eXt7Y8eOHTUajuh1cVofEREJoXyd1BUWUgCAvMJ8RKVcAwB04/ooUhFyz8nbt28fduzYgY4dO0IkEsmOu7q64tatWzUajuh13MpMxZXURGhqaKJfuzeEjkNERGqk9fNC6vq9mygRl0JbU72XQVy8EYNSiRj2DW1gx8ZPpCLkHpHKzs6GhYXFC8fz8/MrFFZEQiuf1te9ZXs0qGcqbBgiIlIr9g1tYKxfD0WlxbhxP0XoOII7d71sWl/3lhyNItUhdyHl6emJgwcPyu6XF0+//vorOnXqVHPJiF6DVCrF3svHAHBaHxER1T6RSIRWts0BALGc3odziWWFVNcWXB9FqkPucebly5ejb9++iI+PR2lpKVauXIn4+HhcuHABZ86cUURGIrklpN/CjYzb0NXSQV/3HkLHISIiNeRm1wIXkqIQl5qAMZ37Cx1HMFk5D3H9Xtnyj65sNEEqRO4Rqa5duyImJgalpaVwc3PDsWPHYGFhgYsXL8LDw0MRGYnktvdyWZOJXq06wVi/nsBpiIhIHbVm5z4AQGhiBACglW1zTrUnlVKtlY9OTk5Yt25dTWchqhFSqRT7nnfrG8RpfUREJJDyzn1X795AqbgUWmracOJcQlkhxW59pGqq9H90bm5ulS9obGxc7TBENSH6djxSH6TDQFcf3m5dhI5DRERqqqmlPYz0DPG0MB/X792SFVbqRCqV/r0RL6f1kYqpUiFlamr6nx35pFIpRCIRxGJxjQQjqq7yvaN8WneDoa6+wGmIiEhdaWhooJ2DK85cv4SI5Di1LKRuZ9/FvUcZ0NbUgldTd6HjENWoKhVSp06dUnQOohohkUiwPyIEADCkPaf1ERGRsDwc3XDm+iVEplyFX8/hQsepdeWjUR6Obvxwk1ROlQqplStXYuPGjTA2NsbmzZsxatQo6OrqKjobkdzCb8UiIycbJgZG6NHSS+g4RESk5jwdWwEAIpKvCpxEGOXro7pzfRSpoCp17Ttw4ADy8/MBAH5+fsjJyVFoKKLqKt87yte9J3S1dQROQ0RE6s7DoayQup19F9m5jwROU7skEgnOP+/Yx414SRVVaUTK2dkZAQEBeOONNyCVSrFz586XNpUYP358jQYkqqoScSkORJVNQx3s6S1wGiIiIsDEwAjNGzkg6X4KolKuwqdNd6Ej1Zqrd5PwOD8X9fQM4G7fUug4RDWuSoXU2rVr4e/vj4MHD0IkEmHhwoWVNp8QiUQspEgwoQkReJT3BA2M6qNLC+5pRkREysHTsRWS7qcgIlm9Cqmz18vWR3Vu3k5tW7+TaqvST3Xnzp0RFhYGoKwDTVJSEiwsLBQajEhe5XtHDWj3Jt+wiYhIaXg6umH7+b8QkRwndJRaVb4Rb7cWnNZHqqlKa6T+KSUlBebm5orIQlRtmTkPsD/iBABgaPveAqchIiL6m4eDGwAg5s51lIpLBU5TO4pKihF+IwYA0I3ro0hFyV1I2dvbIzQ0FOPGjUOnTp1w7949AMCWLVsQGhpa4wGJqmL10a0oLClCe0c3tHdqLXQcIiIimWZW9jAxMMKz4kLE37spdJxaEZEch2clRbAwboAWjRyEjkOkEHIXUnv27IGPjw/09fURHR2NoqIiAEBOTg6WL19e4wGJ/ktmzgNsPrcXADCv/3v/uXk0ERFRbdLQ0EC7Jq4A1KcN+rnn+0d1c/bk72VSWXIXUl9++SXWrl2LdevWQVtbW3a8S5cuiIqKqtFwRFXxz9Go7i07CB2HiIjoBR7P95OKVJN1UuX7R3Xl/lGkwuQupBITE9G9+4sdZ0xMTPDkyZOayERUZRyNIiKiusDTsWydlDqMSOU+y0P07XgAZSNSRKpK7kLKysoKN2++OL83NDQUjo6ONRKKqKo4GkVERHVBOwdXiEQi3HlwT+U35r2YFAWJVAJHC1s0NrMSOg6RwshdSE2ePBmzZ89GeHg4RCIR0tPTsW3bNsybNw/Tpk1TREaiSmXlPJSNRn3I0SgiIlJixvr10Px504VIFR+VOitbH8VpfaTa5N5sZ/78+ZBIJOjVqxcKCgrQvXt36OrqYt68eZg5c6YiMhJVavWxLSgsKYKnoxt6cDSKiIiUnKdDKySmJyMiJQ593FV3Y97y9VGc1keqTu4RKZFIhE8//RSPHj3C1atXERYWhuzsbCxduhTPnj1TREaiF2TlPMSms1wbRUREdYeHGqyTyniSjaT7KRCJROjSwkPoOEQKJXchVU5HRwcuLi7o0KEDtLW1ERQUBAcH7hNAtYOjUUREVNd4Pu/cF3s7HiUqujFvaGLZaJSbbQvUNzQROA2RYlW5kCoqKkJAQAA8PT3RuXNn7Nu3DwCwYcMGODg44Pvvv8fcuXMVlZNIhqNRRERUFzW1fL4xb0kR4u+q5sa8Z6+XrY/q3pLro0j1VbmQWrx4MdasWYMmTZrg9u3bGDFiBKZMmYLvv/8eQUFBuH37Nj755BNFZiUCwNEoIiKqmzQ0NNDOoXxjXtXbT0oqlcpGpLq14PooUn1VLqR27dqFzZs3Y/fu3Th27BjEYjFKS0sRGxuL0aNHQ1NTU5E5iQBwNIqIFGP16tVo0qQJ9PT04OXlhUuXLr303JKSEnzxxRdwcnKCnp4e2rRpgyNHjrzWNUl9lO8npYob897KTEX64yzoaumgQ9M2QschUrgqF1J3796Fh0fZosFWrVpBV1cXc+fO5R+yVKs4GkVENW3Hjh3w9/fHZ599hqioKLRp0wY+Pj7Iysqq9PyFCxfi559/xqpVqxAfH4+pU6diyJAhiI6OrvY1SX14OpStk4pIUb2GE+Vtzz2d3KCvoydwGiLFq3IhJRaLoaOjI7uvpaWFevXqKSQUUWU4GkVEihAUFITJkyfDz88PLi4uWLt2LQwMDLB+/fpKz9+yZQsWLFgAX19fODo6Ytq0afD19cV3331X7WuS+mjn0AoikQipD9KRnftQ6Dg1KvR5IdWd+0eRmqjyPlJSqRTvvvsudHV1AQCFhYWYOnUqDA0NK5wXHBxcswmJnuNoFBHVtOLiYkRGRiIgIEB2TENDA97e3rh48WKlzykqKoKeXsVP2/X19REaGvpa1ywqKpLdz83NrfZrIuVmpG+IFo0ckZB+CxHJV9HXvYfQkWqEWCLG+aQoANw/itRHlUekJkyYAAsLC5iYmMDExATjxo2DtbW17H75jUgROBpFRIrw4MEDiMViWFpaVjhuaWmJjIyMSp/j4+ODoKAg3LhxAxKJBMePH0dwcDDu379f7WsGBgZW+F1qa2tbA6+OlFV5G3RVajhxJTUROQVPYaxfD63tnIWOQ1QrqjwitWHDBkXmIHql1ce3orCkCB4OrTgaRUSCWrlyJSZPngxnZ2eIRCI4OTnBz8/vtabtBQQEwN/fX3Y/NzeXxZQK83B0w9bQ/YhUoY15zz2f1te5eTtoaVb5z0uiOq3aG/IS1ZasnIfYfKZsyihHo4ioJjVs2BCamprIzMyscDwzMxNWVlaVPsfc3Bz79u1Dfn4+7ty5g4SEBNSrVw+Ojo7Vvqauri6MjY0r3Eh1yTbmvXNdZTbmLS+kunF9FKkRFlKk9FYf34pnz0ejerp4CR2HiFSIjo4OPDw8EBISIjsmkUgQEhKCTp06vfK5enp6sLGxQWlpKfbs2YNBgwa99jVJPThZ2MHUwBjPSopw7e4NoeO8tmfFhbh08woAro8i9cJCipQaR6OISNH8/f2xbt06bNq0CdevX8e0adOQn58PPz8/AMD48eMrNI4IDw9HcHAwkpOTce7cOfTp0wcSiQQff/xxla9J6k3VNuaNSI5DUWkxrEzM0cyqidBxiGoNJ7GSUuNoFBEp2qhRo5CdnY3FixcjIyMD7u7uOHLkiKxZRGpqKjQ0/v7csbCwEAsXLkRycjLq1asHX19fbNmyBaamplW+JpGnoxtOXruIyOSreO+NkULHeS1nr5dN6+vq7MkPPEmtsJAipcXRKCKqLTNmzMCMGTMqfez06dMV7vfo0QPx8fGvdU0iVercdy4hAgDQvSXXR5F64dQ+UlocjSIiIlXVtokrRCIR0h7eR2bOA6HjVNuT/FzEpl4HAHRrwfVRpF5YSJFS4mgUERGpMiN9Qzhbl3V6rMujUheSoiCVStHMyh6N6lsIHYeoVrGQIqXE0SgiIlJ1no5uAICIOryf1Nnnbc+7tuC0PlI/LKRI6XA0ioiI1IGHQ9k6qcg6PCIVyvVRpMZYSJHS4WgUERGpg/IRqdg7CSguLRE4jfzSH2fhZuYdaIg00Ll5O6HjENU6FlKkVLJz/x6N+rD/JI5GERGRynKytEN9Q2MUlRbjalqS0HHkdu75tL429s4wMTASOA1R7WMhRUpl9bFteFZShHYOrnjDpaPQcYiIiBRGJBKhnWx6X91bJ1VeSHV35rQ+Uk8spEhpZOc+xKYzewBwbRQREakH2X5SKXVrnZRUKpXtH9WNhRSpKRZSpDQ4GkVEROqmrnbuS7p/G5k5D6CnrQtPJzeh4xAJgoUUKQWORhERkTpq28QFGiIN3HuUgYwn2ULHqbJziWXT+jo4tYaetq7AaYiEodSF1Oeffw6RSFTh5uzsLHu8sLAQ06dPR4MGDVCvXj0MGzYMmZmZAiam6uJoFBERqaN6enVzY95z18sKqW5se05qTKkLKQBwdXXF/fv3ZbfQ0FDZY3PnzsVff/2FXbt24cyZM0hPT8fQoUMFTEvVwdEoIiJSZ3Vtel+puBQXkqIAcH0UqTctoQP8Fy0tLVhZWb1wPCcnB7/99hu2b9+ON998EwCwYcMGtGzZEmFhYejYkaMadQVHo4iISJ15OLbC5nN768zGvLF3EvC0MB+mBsZws20udBwiwSj9iNSNGzdgbW0NR0dHjB07FqmpqQCAyMhIlJSUwNvbW3aus7Mz7OzscPHixVdes6ioCLm5uRVuJAyORhERkborH5G6kppYJzbmPZtwCQDQpUU7aGpoCpyGSDhKXUh5eXlh48aNOHLkCNasWYOUlBR069YNT58+RUZGBnR0dGBqalrhOZaWlsjIyHjldQMDA2FiYiK72draKvBV0KtwNIqIiNSdo4UtzAxNnm/Mmyh0nP/EtudEZZS6kOrbty9GjBiB1q1bw8fHB4cOHcKTJ0+wc+fO17puQEAAcnJyZLe0tLQaSkzy4GgUERHR8415y/eTUvJ1UgXFhbKmGCykSN0pdSH1b6ampmjevDlu3rwJKysrFBcX48mTJxXOyczMrHRN1T/p6urC2Ni4wo1q30/Ht+NZSRHaNnHhaBQREak1T4fyQkq510lduhmL4tIS2NS3hKMFZ/SQeqtThVReXh5u3bqFRo0awcPDA9ra2ggJCZE9npiYiNTUVHTq1EnAlFQV2bmPsPH0bgAcjSIiIvJ0ag0AiFTyEamz18vWR3V19uTvblJ7St21b968eRgwYADs7e2Rnp6Ozz77DJqamhgzZgxMTEwwadIk+Pv7w8zMDMbGxpg5cyY6derEjn11wE/Ht8lGo950ZeFLRETqra19y7KNeR9n4v7jLDSqbyF0pEqFJpatj+rOaX1Eyl1I3b17F2PGjMHDhw9hbm6Orl27IiwsDObm5gCA77//HhoaGhg2bBiKiorg4+ODn376SeDU9F84GkVERFSRoZ4BXBo3xdW0JEQkX8UAjzeFjvSCR3k5iEtLAlA2IkWk7pS6kPrjjz9e+bienh5Wr16N1atX11IiqgkcjSIiInqRh0OrskIqJU4pC6nziZGQSqVoYe0IS5OGQschElydWiNFdR9Ho4iIiCpXvp+Usq6TOpdwGQDQrQVHo4gAFlJUyzgaRUREVDnP5y3Qr6QmoKikWOA0LyovpLq35PooIoCFFNUijkYRERG9XBPzxjCrZ4ri0hJcfb4WSVmkPbyPlOy70NTQRKdm7YSOQ6QUWEhRreFoFBER0cuJRCLZqJSy7Sd1LqGsW1/bJi4w0jcUOA2RcmAhRbWCo1FERET/rXydVISSrZOSrY9itz4iGRZSpHAl4lLM3rSUo1FERET/wcOhbEQqMkV5RqSkUuk/CimujyIqx0KKFEoqleLjbV/j5LWL0NfWReCYjzgaRURE9BLuTVygqaGJ9MdZSH+cJXQcAEBC+i08ePoY+tq6skKPiFhIkYJ9e+BX/H7hL2iINPDz5GVwt28pdCQiIiKlZairDxcbJwDKs06qfH1Ux2ZtoautI3AaIuXBQooUZuu5ffju4G8AgK/f/hi9W3cVOBEREZHy85DtJ6UchdSZ65cAAF25PoqoAhZSpBDH487jk9//BwCY6zsR73QbLGwgIiKiOuLvzn3CN5y4lZmKU9fCAIBrnIn+hYUU1bjo2/GYsu5TiCVijO7cHx8PmCx0JCIiojqjvHNfXFqi4Bvzfn9oAyRSCd5y64KWz6ccElEZFlJUo1Ky0jBu9Yd4VlyIN1w74n9j57O5BBERkRzsG9qggVF9FJeWIC4tUbAcNzPuIPjSUQDAvP78UJTo31hIUY158PQx3l41Fw+fPkZruxb4dfJyaGtqCR2LiIioThGJRPB0EH5j3hWHy0ajerfuijb2zoLlIFJWLKSoRuQXPcM7qz9ESvZd2DZohK3Tg2CoZyB0LCIiojpJ6I15y0ajjgEA5vV/T5AMRMqOhRS9tlJxKab+uhDRt+NhZmiC32eugIVJA6FjERER1VkezxtOCNW5L+jgb5BIJfBp3Q2t7TgaRVQZFlL0WqRSKQL++BbH485DT1sXm6d/i6ZW9kLHIiIiqtPa2LeEpoYm7j/Jxr1HmbX6tW9k3MbeiOMAOBpF9CospOi1rDi8AVvO7YOGSANrJn0hm4pARERE1Weoqw/Xxk0B1P46qaCD6yGVStG3TQ+42bWo1a9NVJewkKJq+/3CAXz95y8AgGWj/NHXvYfAiYiIiFSHh0P5xry1t04q6X4K9j0fjfqw/6Ra+7pEdRELKaqWk9cuYt7WQADATJ/x8Os5XOBEREREqqV8Y97LyVdq7WuWj0b5uvdAK9vmtfZ1ieoiFlIkt9g7CXjvlwUQS8QY7tUHCwZPEzoSERGRyimfLn81LQmFJUUK/3oJ6cnYH3kCAPAh10YR/ScWUiSXOw/SMW61PwqKnqG7c3sEvfMpN9wlIiJSALuG1mhoVB8l4lJcuZOg8K/3/aGy0ah+bXvCtXEzhX89orqOhRRV2cO8J3h71Rxk5z6Ca+Nm+O39r6CjpS10LCIiIpUkEolqbT+phPRk/BkZAgD4sB/XRhFVBQspqpKC4kJM+Okj3MpMhY2ZFbbNCIKRvqHQsYiIiFSabD+pFMV27gs6+Nvz0ag34MLRKKIqYSFF/0ksEWP6b58hIjkOpgbG+H3m97AyNRc6FhERkcr754iUVCpVyNe4fu8W/oo6CQCYx059RFXGQopeSSqV4tMdQTgcewa6WjrY9ME3aN7IQehYREREaqGNfUtoaWgiM+cB7j7KUMjX+O75aFT/dm+ipU1ThXwNIlXEQope6cejW7DxzB6IRCKsnvg5vJq6Cx2JiIhIbRjo6Mmm2iliP6nr927iwPPRKK6NIpIPCyl6qV1hh7Fs308AgKUj5qB/uzcFTkRERKR+yveTikiu+XVS3x74DQAwoF0vtLRxqvHrE6kyFlJUqTPx4Zi7+UsAwLS3xuK9N0cJnIiIiEg9KapzX/zdGzgYfQoikQj+/SbW6LWJ1AELKXrB1bQkTPolAKUSMQZ7voVFQ6YLHYmIiEhtecg25k3Es+LCGrvudwfLR6Pe5GgUUTWwkKIK0h7ex9ur5iKvsABdWnhg5YRF0NDgjwkREZFQ7Bo0grmxGUolYlxJrZmNea+mJeFg9GmIRCJ82O+9GrkmkbrhX8gk8zg/B2+vmoOs3IdwtnbC+ve/gq62jtCxiIiI1JpIJIKnQ81O7wt6Pho1yMMbLazZjZeoOlhIEQCgsKQI7675GDcy7sC6vgW2z/weJgZGQsciIiIi/GNj3hpoOHE1LQmHYs5AJBJhri/XRhFVFwspwtNn+Zj66yKE34yFsX49bJvxPazrWwgdi4iIiJ6ryY15v3veqW+w51scjSJ6DSyk1NzR2LPovmQ0jsSehY6WNjZM/ZoLTolI7axevRpNmjSBnp4evLy8cOnSpVeev2LFCrRo0QL6+vqwtbXF3LlzUVj4dxMAsViMRYsWwcHBAfr6+nBycsLSpUtf+w9gUl9t7J2hpaGJrNyHSHt4v9rXiUtNxOHY8tEovxpMSKR+tIQOQMLIynmIT3cE4a+oEABAE/PGCHpnATo3bydwMiKi2rVjxw74+/tj7dq18PLywooVK+Dj44PExERYWLw4Or99+3bMnz8f69evR+fOnZGUlIR3330XIpEIQUFBAICvv/4aa9aswaZNm+Dq6oqIiAj4+fnBxMQEs2bNqu2XSCpAX0cPrrbNEXvnOiJTrsKuoXW1rvPtgV8BAEM830LzRhyNInodHJFSM1KpFNvP/4VuS0bjr6gQaGpoYnrvcTi5aCuLKCJSS0FBQZg8eTL8/Pzg4uKCtWvXwsDAAOvXr6/0/AsXLqBLly54++230aRJE/Tu3RtjxoypMIp14cIFDBo0CP369UOTJk0wfPhw9O7d+z9Huohe5XU35r2SmoCjV85BQ6SBudw3iui1sZBSIylZaRixYib8tyxDTsFTtLZrgSPz12PR0Bkw0NETOh4RUa0rLi5GZGQkvL29Zcc0NDTg7e2NixcvVvqczp07IzIyUlYUJScn49ChQ/D19a1wTkhICJKSkgAAsbGxCA0NRd++fSu9ZlFREXJzcyvciP7tdTfmlY1GtX8Lzaya1FQsIrXFqX1qoFRcirUnfse3B35FYUkR9LV18fHAKZj85ihoafJHgIjU14MHDyAWi2FpaVnhuKWlJRISKt+v5+2338aDBw/QtWtXSKVSlJaWYurUqViwYIHsnPnz5yM3NxfOzs7Q1NSEWCzGsmXLMHbs2EqvGRgYiCVLltTcCyOV5OFQNiJ1LS0Jz4oLoS/Hh6CxdxJw7Epo2WgUO/UR1QiOSKm4K6kJ6PvVRHy5dzUKS4rQ3bk9Ti/ejmlvjWURRURUDadPn8by5cvx008/ISoqCsHBwTh48CCWLl0qO2fnzp3Ytm0btm/fjqioKGzatAnffvstNm3aVOk1AwICkJOTI7ulpaXV1suhOsS2QSNYGDdAqUSM2Dvybcz77YF1AIChHXqjqZW9IuIRqR3+Ja2iCooL8e1f6/BzyB8QS8QwNTDGkhGzMbKjL0QikdDxiIiUQsOGDaGpqYnMzMwKxzMzM2FlZVXpcxYtWoR33nkH7733HgDAzc0N+fn5mDJlCj799FNoaGjgo48+wvz58zF69GjZOXfu3EFgYCAmTJjwwjV1dXWhq6tbw6+OVI1IJIKnYyscijmDiOQ4dGzmXqXnRd+Ox/G48xyNIqphHJFSQecSLuONL8bip+PbIJaIMdjzLZz7/HeM6tSPRRQR0T/o6OjAw8MDISEhsmMSiQQhISHo1KlTpc8pKCiAhkbFX5+ampoAIGtv/rJzJBJJTcYnNeTp2BoAECnHOqnvDpbtGzW0gw+cLO0UkotIHXFESoU8zs/B57t/wI6LBwEANvUt8dXbH+Mtty4CJyMiUl7+/v6YMGECPD090aFDB6xYsQL5+fnw8yvbY2f8+PGwsbFBYGAgAGDAgAEICgpC27Zt4eXlhZs3b2LRokUYMGCArKAaMGAAli1bBjs7O7i6uiI6OhpBQUGYOJGjAfR6ZJ37UuIglUr/8wPSqJRrOPF8NMqf+0YR1SgWUipAKpVif+QJLNwRhAdPH0MkEmFiz+EIGDQV9fQMhY5HRKTURo0ahezsbCxevBgZGRlwd3fHkSNHZA0oUlNTK4wuLVy4ECKRCAsXLsS9e/dgbm4uK5zKrVq1CosWLcIHH3yArKwsWFtb4/3338fixYtr/fWRamlt7wxtTS1k5z5C6sP7sP+P/aTKR6OGefWBI0ejiGqUSMpt1pGbmwsTExPk5OTA2NhY6DhyufcoE/N//wbH484DAJo3ckDQOwtkLVKJiJRZXX7/VSR+X+hV+n41EdG34/HTxCUY2sHnpedFpVyF79fvQVNDE6Gf/wEHC9taTElUd1X1PZhrpOooiUSC9ad3o/uSMTgedx46Wtr4aMBknPh0M4soIiIiFfb3flKv3pj32wNlo1HDvfqwiCJSAE7tq4MS0pMxb2ug7A20g1NrfDsuAM0bOQicjIiIiBTNw7EV1p3c8cqNeSOTr+LktYvQ1NDEXK6NIlIIFlJ1SFFJMX44sgk/HNmEEnEp6ukZYOGQ6RjfbcgL3aGIiIhINZWPSMXfvYGC4kIYVLIx77cHfgUAjOjYF03MG9dqPiJ1wUKqjrh86wr8tyzHjYzbAIDerbviqzEfw7q+hbDBiIiIqFbZ1LeElYk5MnKyEXvnOjo1a1vh8YjkOJyKD4Omhibm9H1XmJBEaoCFlBIrEZfi1LWL2HHxEA7FnIZUKoW5sRmWjfoQA9q9yT2hiIiI1JBIJIKHYyscjD6FiOS4Fwqp8tGokR19ORpFpEAspJSMVCpFXFoidl48hL0Rx/Hw6WPZY293GYDFQ2fC1JAdnIiIiNSZ5/NC6t8b816+dQWn48OhxdEoIoVjIaUkMp5kY3f4EewKP4zE9GTZcXNjMwzt4INRHX3h0riZgAmJiIhIWfyzc98/N+aVjUZ18oW9uY1g+YjUAQspAeUXPcORmDPYFX4YZ69fhkQqAQDoaumgj3t3jOzoix4tO0BLk/+ZiIiI6G9udi2gramFB08fI/VBOuzNbXDpZizOXL8ELQ1NzO7LTn1Eisa/0GuZRCLBxRvR2BV+GH9FnkR+UYHsMa+mbTCyoy/6t3sTJgZGAqYkIiIiZaanrQs3uxaISrmGiOQ42JvbyEajRnXqB/uG1gInJFJ9LKRqya3MVOwOP4xdYYdx91GG7Lh9QxuM6NgXw736cEEoERERVZmng9vzQuoqGjewwtmEy89Ho94VOhqRWlCZQmr16tX43//+h4yMDLRp0warVq1Chw4dBM30OD8H+yNOYFfYYUSm/L0Y1EjPEIM8vTGiY190cGrD7ntEREQkNw/HVsBJIDIlDjczbwMARnfuDzuORhHVCpUopHbs2AF/f3+sXbsWXl5eWLFiBXx8fJCYmAgLi9rdZ6lEXIqTVy9gZ9hhHI8LRXFpCQBAU0MTPV28MKJjX/i07gb9SjbPIyIiIqqq8oYTV1ITAYCjUUS1TCUKqaCgIEyePBl+fmULK9euXYuDBw9i/fr1mD9/vsK/vlQqxZXUROwKO4Tgy8fwKO+J7DHXxs0wsqMvhrTvDQuTBgrPQkREROrBxswSjUzNcf9JNgBgTJcBsG3QSOBURP9v595joyj3P45/Wmi3Rbla6EVqoURAoS1QaCE5wB80tA0xYDxaiBc4EjRG/qoYJUYq0UhFjAQ0mPAzojHhokZMBAlaqeFSIYF2pUVJ0eUiskVQ6Gppq+1z/tiwc/ZHVaadvbXvV7JJ9+mzM898mcyH7852+46Yb6Ta29t19OhRrVy5MjAWHx+voqIi1dTUdPmatrY2tbW1BZ43Nzd3e/+fHvtSr376fzd8Zfl9BSW6f3qpJvCV5QAAIETys3P06bEvldCvP3ejgDCL+Ubq0qVL6ujoUGpqatB4amqqvvvuuy5fs2bNGq1evdqR/f/Z0aGTP/2gpASXSvJm6f7ppXxlOQAACIu5uf/Sp8e+1H9m/1sjh6VFejlAn9In/7e/cuVKlZeXB543NzcrMzOzW9sqzpup1x5aqXvy52hQ8q1OLREAAOAf3V9Yqtw7xmts2qhILwXoc2K+kUpJSVG/fv3U1NQUNN7U1KS0tK7fmXG5XHK5XI7sPzkxSQ/+a74j2wIAALAjLi5O4zOyI70MoE+Kj/QCeioxMVH5+fmqqqoKjHV2dqqqqkozZsyI4MoAAAAA9FYxf0dKksrLy7V48WJNnTpVBQUFWr9+vX7//ffAt/gBAAAAgJN6RSNVVlamn3/+WatWrZLX69WkSZO0Z8+eG76AAgAAAACc0CsaKUlavny5li9fHullAAAAAOgDYv5vpAAAAAAg3GikAAAAAMAmGikAAAAAsIlGCgAAAABsopECAAAAAJtopAAAAADAJhopAAAAALCJRgoAAAAAbKKRAgAAAACbaKQAAAAAwKb+kV5ANDDGSJKam5sjvBIA6FuuX3evX4fhRy4BQOTcbDbRSEny+XySpMzMzAivBAD6Jp/Pp8GDB0d6GVGDXAKAyPunbIozvA2ozs5O/fTTTxo4cKDi4uLCss/m5mZlZmbq3LlzGjRoUFj2Ga2ohR91sFALS2+vhTFGPp9PGRkZio/n0+bXRSKXpN5/vt0s6mChFhZqYenttbjZbOKOlKT4+HiNHDkyIvseNGhQrzwBu4Na+FEHC7Ww9OZacCfqRpHMJal3n292UAcLtbBQC0tvrsXNZBNv/wEAAACATTRSAAAAAGATjVSEuFwuVVRUyOVyRXopEUct/KiDhVpYqAXCifPNjzpYqIWFWliohR9fNgEAAAAANnFHCgAAAABsopECAAAAAJtopAAAAADAJhopAAAAALCJRspBb775pkaNGqWkpCQVFhbqyJEjfzv/gw8+0Pjx45WUlKScnBzt3r076PdLlixRXFxc0KOkpCSUh+AIO3VoaGjQfffdp1GjRikuLk7r16/v8TajidO1eOGFF244J8aPHx/CI3COnVps3rxZM2fO1NChQzV06FAVFRXdMN8Yo1WrVik9PV3JyckqKipSY2NjqA+jx5yuQ6xeJxAe5JKFbLKQTX7kkoVs6h4aKYds375d5eXlqqio0LFjx5SXl6fi4mJdvHixy/mHDh3SokWLtHTpUtXW1mrBggVasGCB6uvrg+aVlJTowoULgcfWrVvDcTjdZrcOLS0tys7OVmVlpdLS0hzZZrQIRS0kacKECUHnxIEDB0J1CI6xW4vq6motWrRI+/btU01NjTIzMzV37lydP38+MGft2rXasGGD3nrrLR0+fFi33HKLiouL1draGq7Dsi0UdZBi7zqB8CCXLGSThWzyI5csZFMPGDiioKDAPPnkk4HnHR0dJiMjw6xZs6bL+Q888ICZN29e0FhhYaF5/PHHA88XL15s5s+fH5L1hordOvyvrKws8/rrrzu6zUgKRS0qKipMXl6eg6sMj57+G/75559m4MCB5t133zXGGNPZ2WnS0tLMq6++Gphz5coV43K5zNatW51dvIOcroMxsXmdQHiQSxayyUI2+ZFLFrKp+7gj5YD29nYdPXpURUVFgbH4+HgVFRWppqamy9fU1NQEzZek4uLiG+ZXV1drxIgRGjdunJ544gldvnzZ+QNwSHfqEIlthkMo193Y2KiMjAxlZ2frwQcf1NmzZ3u63JByohYtLS36448/NGzYMEmSx+OR1+sN2ubgwYNVWFgYtedFKOpwXSxdJxAe5JKFbLKQTX7kkoVs6hkaKQdcunRJHR0dSk1NDRpPTU2V1+vt8jVer/cf55eUlOi9995TVVWVXnnlFX311VcqLS1VR0eH8wfhgO7UIRLbDIdQrbuwsFBbtmzRnj17tGnTJnk8Hs2cOVM+n6+nSw4ZJ2rxzDPPKCMjI3Chv/66WDovQlEHKfauEwgPcslCNlnIJj9yyUI29Uz/SC8Af23hwoWBn3NycpSbm6sxY8aourpac+bMieDKECmlpaWBn3Nzc1VYWKisrCzt2LFDS5cujeDKQqeyslLbtm1TdXW1kpKSIr2ciPmrOnCdQDhxvqErfS2byCVLX88m7kg5ICUlRf369VNTU1PQeFNT01/+YWZaWpqt+ZKUnZ2tlJQUnTp1queLDoHu1CES2wyHcK17yJAhGjt2bNSeE1LParFu3TpVVlZq7969ys3NDYxff10snRehqENXov06gfAglyxkk4Vs8iOXLGRTz9BIOSAxMVH5+fmqqqoKjHV2dqqqqkozZszo8jUzZswImi9Jn3/++V/Ol6Qff/xRly9fVnp6ujMLd1h36hCJbYZDuNb922+/6fvvv4/ac0Lqfi3Wrl2rF198UXv27NHUqVODfjd69GilpaUFbbO5uVmHDx+O2vMiFHXoSrRfJxAe5JKFbLKQTX7kkoVs6qFIf9tFb7Ft2zbjcrnMli1bzIkTJ8xjjz1mhgwZYrxerzHGmIcfftg8++yzgfkHDx40/fv3N+vWrTPffvutqaioMAkJCeb48ePGGGN8Pp9ZsWKFqampMR6Px3zxxRdmypQp5s477zStra0ROcabYbcObW1tpra21tTW1pr09HSzYsUKU1tbaxobG296m9EqFLV46qmnTHV1tfF4PObgwYOmqKjIpKSkmIsXL4b9+OywW4vKykqTmJhoPvzwQ3PhwoXAw+fzBc0ZMmSI+eSTT8w333xj5s+fb0aPHm2uXbsW9uO7WU7XIVavEwgPcslCNlnIJj9yyUI2dR+NlIM2btxo7rjjDpOYmGgKCgrM119/Hfjd7NmzzeLFi4Pm79ixw4wdO9YkJiaaCRMmmF27dgV+19LSYubOnWuGDx9uEhISTFZWllm2bFnUX6CNsVcHj8djJN3wmD179k1vM5o5XYuysjKTnp5uEhMTze23327KysrMqVOnwnhE3WenFllZWV3WoqKiIjCns7PTPP/88yY1NdW4XC4zZ84cc/LkyTAeUfc4WYdYvk4gPMglC9lkIZv8yCUL2dQ9ccYYE7r7XQAAAADQ+/A3UgAAAABgE40UAAAAANhEIwUAAAAANtFIAQAAAIBNNFIAAAAAYBONFAAAAADYRCMFAAAAADbRSAEAAACATTRSAAAAAGATjRQQAy5fvqwRI0bo9OnTId3PwoUL9dprr4V0HwCA2EcuAVKcMcZEehFAX7JkyRJduXJFO3fuvOnXlJeXy+fzafPmzaFbmKT6+nrNmjVLHo9HgwcPDum+AADRgVwCuoc7UkCUa2lp0dtvv62lS5eGfF8TJ07UmDFj9P7774d8XwCA2EQuAX40UkCU2717t1wul6ZPnx4YO3DggBISEtTa2hoYO336tOLi4nTmzJmg5x999JFmzZql5ORkTZs2TWfPntX+/fs1ffp0DRgwQHPmzNGVK1cC27nnnnu0bdu2sB0fACC2kEuAH40UEOX279+v/Pz8oLG6ujrdddddSkpKCozV1tZq6NChysrKkiS53W5J0qZNm/Tyyy/r0KFDampq0kMPPaTKykq98cYb2rdvn9xut955553AdgoKCnTkyBG1tbWF4egAALGGXAL8+kd6AQD+3pkzZ5SRkRE05na7NXny5KCxuro65eXlBT0fNmyYtm/frttuu02SNHv2bB04cEANDQ0aMGCAJGnatGnyer2B12VkZKi9vV1erzcQfgAAXEcuAX7ckQKi3LVr14Le4ZP8YTRp0qSgsdra2qAxt9ute++9NxBWknT27FmVlZUFwur62OjRowPPk5OTJfk/Aw8AwP9HLgF+NFJAlEtJSdGvv/4aeN7R0aH6+vob3vk7duxYUGDV1dWpsLAwaI7b7Q76THtra6tOnjwZ9I7hL7/8IkkaPny4k4cBAOglyCXAj0YKiHKTJ0/WiRMnAs9Pnjyp1tbWoI9V1NTU6Pz584HAam5u1unTp4NCzePx6OrVq0Fjx48flzFGOTk5gbH6+nqNHDlSKSkpITwqAECsIpcAPxopIAKuXr2qurq6oMe5c+e6nFtcXKyGhobAu391dXWSpI0bN6qxsVGfffaZHnnkEUlSe3u7JP87fP369dPEiRMD27n+2fT//Xx5XV2dxowZo1tvvTUwtn//fs2dO9fR4wUARDdyCbCPRgqIgOrqak2ePDnosXr16i7n5uTkaMqUKdqxY4ckf8gUFxfrhx9+UE5Ojp577jmtXr1agwYN0oYNGyT5A2vcuHFBn2Hv6g+B3W530McnWltbtXPnTi1btszpQwYARDFyCbAvzhhjIr0IAH9v165devrpp1VfX6/S0lJNmzZNL730kuP72bRpkz7++GPt3bvX8W0DAHoPcgng68+BmDBv3jw1Njbq/PnzcrvdevTRR0Oyn4SEBG3cuDEk2wYA9B7kEsAdKSCmeL1epaenq6GhQXfffXeklwMA6OPIJfRlNFIAAAAAYBNfNgEAAAAANtFIAQAAAIBNNFIAAAAAYBONFAAAAADYRCMFAAAAADbRSAEAAACATTRSAAAAAGATjRQAAAAA2EQjBQAAAAA20UgBAAAAgE00UgAAAABg038B8PnjpDC0NJ0AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the reflection phase\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))\n",
    "theta = np.unwrap(np.angle(r)) * 180 / np.pi\n",
    "theta = theta - theta[0]\n",
    "ax1.plot(Ls, theta)\n",
    "ax1.set_xlabel(r\"L ($\\mu m$)\")\n",
    "ax1.set_ylabel(\"Reflection phase (degree)\")\n",
    "\n",
    "# plot the reflectivity\n",
    "ax2.plot(Ls, np.abs(r) ** 2)\n",
    "ax2.set_xlabel(r\"L ($\\mu m$)\")\n",
    "ax2.set_ylabel(\"Reflectivity\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de37db62",
   "metadata": {},
   "source": [
    "## Super Cell Simulation "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bfba8371",
   "metadata": {},
   "source": [
    "### Simulation Setup "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f384cd09",
   "metadata": {},
   "source": [
    "The above phase relation provides a look-up table such that a gradient metasurface with an arbitrary phase profile can be designed. For example, when designing a metalens, a parabolic phase profile can be used. In this example, we aim to construct a beam steering reflector. Therefore, a linear phase profile is used. \n",
    "\n",
    "Here we adapt the idea from the referenced paper and design a super cell that consists of 10 antennas of 5 different lengths. The lengths are 40 nm, 106 nm, 128 nm, 150 nm, and 260 nm. The plot below confirms that this design indeed yields a nearly linearly varying phase across the super cell."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "964c621c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAN1xJREFUeJzt3Xt8FPW9//H3JiEhgVwA2VxKwIAIhLugEFEQSQkXRZQjoKiogEqDCIgVLBct1CC1ArZWqFRQqy1KBY9QsZRLEEiQS6IBKQZEEoUkyCVLAgTYzO8Pf+xxSYDdZDebHV/Px2Meh/3Odyef75k+uu/OfOc7FsMwDAEAAJhUgK8LAAAA8CbCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMLUgXxdQG5SXl+vw4cMKDw+XxWLxdTkAAMAFhmHo1KlTiouLU0DA5a/fEHYkHT58WPHx8b4uAwAAVEF+fr6aNGly2f2EHUnh4eGSfvx/VkREhI+rAQAArrDZbIqPj3f8jl8OYUdy3LqKiIgg7AAA4GeuNgWFCcoAAMDUCDsAAMDUCDsAAMDUCDsAAMDUCDsAAMDUCDsAAMDUCDsAAMDUCDsAAMDUCDsAAMDUWEEZAAB4hb3crszcbBXZjska0UjdW3ZSYEBgjddB2AEAAB63OmuDpi2bpyMnixxtsVFWzR42UQM7967RWriNBQAAPGp11gaNXjTVKehIUsHJIo1eNFWrszbUaD2EHQAA4DH2crumLZsno5J9F9umvz9f9nJ7jdVE2AEAAB6TmZtd4YrOTxmSDp8oVGZudo3VRNgBAAAeU2Q75tF+nkDYAQAAHmONaOTRfp5A2AEAAB7TvWUnxUZZZbnMfoukuAbR6t6yU43VRNgBAAAeExgQqNnDJkpShcBz8fOsoRNqdL0dwg4AAPCogZ17a/HjaYqJsjq1xzaI1uLH02p8nR2LYRiVPR32s2Kz2RQZGani4mJFRET4uhwAAEzB2ysou/r7zQrKAADAKwIDAtWjVRdfl8FtLAAAYG6EHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGo+DTtpaWm68cYbFR4eLqvVqsGDB2vfvn1OfW677TZZLBan7YknnnDqk5eXp4EDByosLExWq1XPPPOMLly4UJNDAQAAtZRPFxVMT09XamqqbrzxRl24cEHPPfec+vbtq6+++kr16tVz9BszZox++9vfOj6HhYU5/m232zVw4EDFxMRo69atOnLkiB566CHVqVNHL774Yo2OBwAA1D616nURR48eldVqVXp6unr27Cnpxys7nTp10vz58yv9zieffKI77rhDhw8fVnR0tCRp4cKFevbZZ3X06FEFBwdf9e/yuggAAPyPq7/ftWrOTnFxsSSpYcOGTu3vvvuurrnmGrVr105Tp07V6dOnHfsyMjLUvn17R9CRpJSUFNlsNu3Zs6fSv1NWViabzea0AQAAc6o178YqLy/XhAkT1KNHD7Vr187Rfv/996tZs2aKi4vTl19+qWeffVb79u3Thx9+KEkqKChwCjqSHJ8LCgoq/VtpaWl64YUXvDQSAABQm9SasJOamqrdu3dr8+bNTu2PPfaY49/t27dXbGys+vTpowMHDqhFixZV+ltTp07VpEmTHJ9tNpvi4+OrVjgAAKjVasVtrHHjxmnVqlXasGGDmjRpcsW+3bp1kyTt379fkhQTE6PCwkKnPhc/x8TEVHqMkJAQRUREOG0AAMCcfBp2DMPQuHHjtGLFCq1fv14JCQlX/U52drYkKTY2VpKUlJSknJwcFRUVOfqsXbtWERERSkxM9ErdAADAf/j0NlZqaqree+89ffTRRwoPD3fMsYmMjFRoaKgOHDig9957TwMGDFCjRo305ZdfauLEierZs6c6dOggSerbt68SExP14IMPau7cuSooKNC0adOUmpqqkJAQXw4PAADUAj599NxisVTavmTJEj388MPKz8/XAw88oN27d6u0tFTx8fG6++67NW3aNKdbT4cOHdLYsWO1ceNG1atXTyNHjtScOXMUFORaluPRcwAA/I+rv9+1ap0dXyHsAADgf/xynR0AAABPI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wAAABTI+wA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lZWVOT7bbDbPFw4AAGqFWn9lJzc3V3FxcWrevLlGjBihvLw8SdLOnTt1/vx5JScnO/q2bt1aTZs2VUZGxhWPmZaWpsjISMcWHx/v1TEAAADfqdVhp1u3blq6dKnWrFmj119/XQcPHtStt96qU6dOqaCgQMHBwYqKinL6TnR0tAoKCq543KlTp6q4uNix5efne3EUAADAl2r1baz+/fs7/t2hQwd169ZNzZo10/vvv6/Q0NAqHzckJEQhISGeKBEAANRytfrKzqWioqJ0/fXXa//+/YqJidG5c+d08uRJpz6FhYWVzvEBAAA/T34VdkpKSnTgwAHFxsaqS5cuqlOnjtatW+fYv2/fPuXl5SkpKcmHVQIAgNqkVt/Gmjx5su688041a9ZMhw8f1syZMxUYGKj77rtPkZGRGjVqlCZNmqSGDRsqIiJCTz75pJKSkq74JBYAAPh5qdVh57vvvtN9992nY8eOqXHjxrrllluUmZmpxo0bS5LmzZungIAADRkyRGVlZUpJSdGf//xnH1cNAABqE4thGIavi/A1m82myMhIFRcXKyIiwtflAAAAF7j6++1Xc3YAAADcRdgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmFuTrAszKXm5XZm62imzHZI1opO4tOykwINDXZQEA8LNjmrDz2muv6fe//70KCgrUsWNH/fGPf9RNN93kk1pWZ23QtGXzdORkkaMtNsqq2cMmamDn3j6pCQCAnytT3MZatmyZJk2apJkzZ2rXrl3q2LGjUlJSVFRUdPUve9jqrA0avWiqU9CRpIKTRRq9aKpWZ22o8ZoAAPg5M0XYeeWV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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N_sample = 5  # number of antenna lengths in a super cell\n",
    "N_repeat = 2  # number of repeated antenna lengths\n",
    "\n",
    "Ls_design = np.array([0.04, 0.106, 0.128, 0.15, 0.26])  # designed antenna lengths\n",
    "\n",
    "theta_design = np.interp(\n",
    "    Ls_design, Ls, theta\n",
    ")  # extract the reflection phase by interpolation the above simulation result\n",
    "\n",
    "# plot phase across the super cell\n",
    "plt.scatter(np.linspace(1, N_sample, N_sample), theta_design)\n",
    "plt.xlabel(\"Site\")\n",
    "plt.ylabel(\"Reflection phase (degree)\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dc0bb49",
   "metadata": {},
   "source": [
    "To define the geometry of the super cell, we first generate the antennas systematically."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "4306e3c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# construct ten antennas given the designed antenna lengths\n",
    "antennas = []\n",
    "xs = np.linspace(\n",
    "    Lx / 2, (N_sample * N_repeat - 0.5) * Lx, N_sample * N_repeat\n",
    ")  # x coordinates of each antenna\n",
    "\n",
    "# systematically generate antennas in the super cell\n",
    "for i in range(N_sample):\n",
    "    for j in range(N_repeat):\n",
    "        antennas.append(\n",
    "            td.Structure(\n",
    "                geometry=td.Box.from_bounds(\n",
    "                    rmin=(-w / 2 + xs[2 * i + j], -Ls_design[i] / 2, d2),\n",
    "                    rmax=(w / 2 + xs[2 * i + j], Ls_design[i] / 2, d2 + d1),\n",
    "                ),\n",
    "                medium=au,\n",
    "            )\n",
    "        )\n",
    "\n",
    "super_cell = antennas + [spacer, sub, gold_layer]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16cf2850",
   "metadata": {},
   "source": [
    "To visualize the reflected field, we add a [FieldMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.FieldMonitor.html) in the xz plane. The simulation domain is lengthened in the z direction such that we can better visualize the reflected field."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "881a0dfa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define a field monitor to visualize the reflected field\n",
    "field_monitor = td.FieldMonitor(\n",
    "    center=(0, 0, 0),\n",
    "    size=(td.inf, 0, td.inf),\n",
    "    freqs=[freq0],\n",
    "    name=\"field\",\n",
    ")\n",
    "\n",
    "\n",
    "# define the super cell simulation\n",
    "sim = td.Simulation(\n",
    "    size=(Lx * N_sample * N_repeat, Ly, 3 * Lz),\n",
    "    center=(Lx * N_sample * N_repeat / 2, 0, 0),\n",
    "    grid_spec=td.GridSpec.auto(min_steps_per_wvl=20, wavelength=lda0),\n",
    "    structures=super_cell,\n",
    "    sources=[plane_wave],\n",
    "    monitors=[monitor_r, field_monitor],\n",
    "    run_time=run_time,\n",
    "    boundary_spec=boundary_spec,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8497002",
   "metadata": {},
   "source": [
    "Visualize the generated antenna structures."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f7d19e4a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/HD9+nWYmLw8g9yhQwf89NNPmDlzJr766is0atQIERERaNGihdRnypQpePz4McaMGYMHDx6gU6dOiIqKglqtLtG1EBEREZUmvQu70jBx4sQCT73md4OGn58f/Pz8CpxPoVAgODgYwcHBxRUiERERkdHR6eaJ999/H3/99VeR/R4+fIhFixZh9erVbxwYEREREelHpyN2fn5+6Nu3L6ytrdGzZ0+4u7vDwcEBarUa9+/fR1xcHI4cOYJdu3bBx8cHS5YsKem4iYiIiOg1OhV2I0eOxODBgxEeHo6tW7di3bp1SE9PB/DiNKeLiwu8vb3x999/o1mzZiUasLFaM6JbWYdQrOS2HiIioopA52vsVCoVBg8ejMGDBwMA0tPT8eTJE9SoUQNmZmYlFiARERER6cbgmydyv5GBiIiIiIxDsX3zBBERERGVLRZ2RERERDLBwo6IiIhIJljYEREREcmE3oWdv78/Dh06VBKxEBEREdEb0LuwS09Ph5eXFxo1aoQFCxYgKSmpJOIiIiIiIj3pXdhFREQgKSkJ48aNw9atW1G/fn188MEH2L59O549e1YSMRIRERGRDgy6xs7GxgYBAQE4c+YMYmJi0LBhQwwZMgQODg6YPHkyLl26VNxxEhEREVER3ujmidu3b2Pv3r3Yu3cvTE1N0b17d5w9exYuLi5YsWJFccVIRERERDrQu7B79uwZfv75Z/To0QP16tVDeHg4Jk2ahFu3buGHH37Avn37sG3bNgQHB5dEvERERERUAL2/Usze3h4ajQYDBw7E8ePH4erqmqdP165dUbVq1WIIj4iIiIh0pXdht2LFCvj5+UGtVhfYp2rVqkhMTHyjwIiIiIhIP3oXdkOGDCmJOIhK3JoR3co6hGInxzUREZHh+M0TRERERDLBwo6IiIhIJljYEREREckECzsiIiIimdD75gkiopIkxxtC5LgmIjJOPGJHREREJBMs7IiIiIhkgoUdERERkUywsCMiIiKSCd48QUREepPjDSFyXBNVPDxiR0RERCQTLOyIiIiIZIKFHREREZFMsLAjIiIikgkWdkREREQyYVSFnRACgYGBsLe3h7m5Oby8vHDp0qVCxxw6dAg9e/aEg4MDFAoFIiIiimVeIiIiovLGqAq7xYsXY9WqVVi7di1iYmJQuXJleHt74+nTpwWOefz4Md566y2sXr26WOcl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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize the antennas in the super cell\n",
    "sim.plot(z=d2 + d1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fe024e8",
   "metadata": {},
   "source": [
    "Visualize the simulation setup from the xz plane."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "77af7a8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQQAAAHWCAYAAACR/vcuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOtpJREFUeJzt3Xl4E9XCBvA3SZuka8pSukCBiiAISBFKLaAo9FKvVexVEBApKoogoFiVRaAIF62CCpddcOE+CIJ4tSogCsgmFBQo3xVBREFAsIUqTaBb2uR8f5Sc27Rpmz0tvL/niZgzZ2bOZHlzZubMVCGEECAiAqD0dQOIqP5gIBCRxEAgIomBQEQSA4GIJAYCEUkMBCKSGAhEJDEQiEhiIPjIjh07oFAosGPHDl83hTzgu+++g1qtxunTp72+7j///BNBQUHYtGmTw/MyEDxsyZIlWLlypa+b4ZQ1a9Zg/vz5vm6GlXfffRcdOnSAVqtF27ZtsXDhQrvnLS0txaRJkxAdHY2AgAAkJCRgy5YtNuvu3bsXvXv3RmBgICIjI/HMM8/gypUrdq9r6tSpGDp0KFq1amX3PO7SpEkTPPHEE5g+fbrjMwvyqI4dO4o+ffpUKzeZTKK4uFiYTCbvN8pOKSkpolWrVr5uhrRs2TIBQDz44INi+fLlYvjw4QKAeO211+yaf8iQIcLPz0+88MIL4u233xaJiYnCz89P7N6926peTk6O0Gq1omvXrmLp0qVi6tSpQqPRiLvvvtuu9eTk5AgAYu/evQ5vo7scPXpUABDbtm1zaD6vBMKVK1e8sZp6qaZAaAjqUyAUFRWJJk2aiJSUFKvyYcOGiaCgIPHXX3/VOv/+/fsFADF37lxZVlxcLNq0aSMSExOt6v79738XUVFRQq/Xy7IVK1YIAOKrr76qs63PPPOMaNmypTCbzfZsmsd06tRJDB8+3KF5HA6E33//XTz++OMiKipKqNVq0bp1azF69GhRWloqhBDi/fffFwDEjh07xJgxY0R4eLgICwuT8y9evFjcfPPNQq1Wi6ioKPH000+LS5cuWa3j559/Fg888ICIiIgQGo1GNG/eXAwePFgUFBTIOl9//bXo1auX0Ol0IigoSLRr105MmTKlzvbbM19JSYnIyMgQbdq0EWq1WrRo0UK8+OKLoqSkpNryVq1aJeLj40VAQIAICwsTt99+u/zQtGrVSgCweljCYfv27QKA2L59u9XyPvroI3HrrbcKrVYrmjRpIoYNGyZ+//13qzojRowQQUFB4vfffxf333+/CAoKEk2bNhXPP/+8KC8vr/M1yMrKEvfcc498D2+44QYxa9Ysq3n79OlTre21hcMdd9whbrnlFpvT2rVrJ/r3719nu2qzceNGAUBs3LjRqnzv3r0CgFi1alWt87/44otCpVJZfcmFEOLVV18VAMSZM2eEEELo9Xrh5+cnXnzxRat6paWlIjg4WIwcObLOtrZs2VI8+uij1coBiBkzZlQrb9WqlRgxYoR8bvkO7d69W4wfP140bdpU6HQ6MWrUKFFaWiouXbokhg8fLsLCwkRYWJh48cUXbYbPc889J8LCwhwKJj9Hdi/Onz+PHj16oKCgAKNGjUL79u1x7tw5fPzxxygqKoJarZZ1n376aYSHhyMjIwOFhYUAgJdffhkzZ85EUlISxowZg+PHj2Pp0qX4/vvvsWfPHvj7+8NoNCI5ORmlpaUYP348IiMjce7cOWzYsAEFBQXQ6XT48ccfce+99+KWW27BrFmzoNFo8Msvv2DPnj21tt+e+cxmMwYMGIBvv/0Wo0aNQocOHfDDDz9g3rx5+Pnnn5GVlSXrzpw5Ey+//DJ69uyJWbNmQa1WY//+/fjmm2/Qv39/zJ8/H+PHj0dwcDCmTp0KAIiIiKixfStXrsRjjz2G+Ph4ZGZmIi8vD//617+wZ88e5OTkICwsTNY1mUxITk5GQkIC3njjDWzduhVvvvkm2rRpgzFjxtT6OqxcuRLBwcFIT09HcHAwvvnmG2RkZMBgMGDu3LkAKvaB9Xo9fv/9d8ybNw8AEBwcXOMyhw8fjieffBJHjhxBp06dZPn333+Pn3/+GdOmTZNlly5dgslkqrWNABAYGIjAwEAAQE5ODgCge/fuVnW6desGpVKJnJwcPPLIIzUuKycnB+3atUNoaKhVeY8ePQAAhw8fRkxMDH744QeUl5dXW49arUZcXJxsR03OnTuHM2fO4NZbb61z++pi+fzPnDkT+/btw/LlyxEWFoa9e/eiZcuWePXVV7Fp0ybMnTsXnTp1QlpamtX83bp1w7x58/Djjz9avSe1sjs6hBBpaWlCqVSK77//vto0SwpZ0q13795WvzgXLlwQarVa9O/f32q/edGiRQKAeO+994QQ/9v/Wr9+fY3tmDdvngAgLl686Ejz7Zpv1apVQqlUVtuvtOy/7tmzRwghxIkTJ4RSqRT/+Mc/qh0HqJzINe0yVO0hGI1G0axZM9GpUydRXFws623YsEEAEBkZGbJsxIgRAoCYNWuW1TK7du0qunXrVvuLICq631U99dRTIjAw0KoX5MguQ0FBgdBqtWLSpElW5c8884wICgqy2m201XOy9aj8azp27FihUqlsrjs8PFwMGTKk1vZ17NhR9O3bt1r5jz/+KACIZcuWCSGEWL9+vQAgdu3aVa3uoEGDRGRkZK3r2bp1qwAgvvjii2rTqm6TRU09hOTkZKvPUmJiolAoFGL06NGyrLy8XLRo0cLmZ8zSe1q3bl2tba7M7rMMZrMZWVlZuO+++6qlJwAoFAqr508++SRUKpV8vnXrVhiNRkyYMAFKpdKqXmhoKDZu3AgA0Ol0AICvvvoKRUVFNtti+aX87LPPYDab7d0Eu+Zbv349OnTogPbt2yM/P18++vbtCwDYvn07ACArKwtmsxkZGRlW2wNUfy3sceDAAVy4cAFPP/00tFqtLE9JSUH79u3l61PZ6NGjrZ7ffvvtOHnyZJ3rCggIkP9/+fJl5Ofn4/bbb0dRURF++uknh9sOVLxv999/Pz788EOIq/fcMZlMWLduHVJTUxEUFCTrrl69Glu2bKnzUfkXr7i42KoHWplWq0VxcXGt7SsuLoZGo7E5r2V65X9rqlvXev78808AQKNGjWqtZ4+RI0dafZYSEhIghMDIkSNlmUqlQvfu3W2+75Y25Ofn271Ou3cZLl68CIPBYHfXIzY21uq55XzsTTfdZFWuVqtxww03yOmxsbFIT0/HW2+9hdWrV+P222/HgAED8Mgjj8iwGDx4MN555x088cQTmDx5Mvr164cHHngAAwcOrPblrMye+U6cOIFjx44hPDzc5jIuXLgAAPj111+hVCpx88032/V61KWm1wcA2rdvj2+//daqTKvVVmtjo0aNcOnSpTrX9eOPP2LatGn45ptvYDAYrKbp9XpHmy6lpaVh3bp12L17N+644w5s3boVeXl5GD58uFW9Xr16ObzsgIAAGI1Gm9NKSkqsQq6m+UtLS23Oa5le+d+a6ta1HgvhhhuRtWzZ0uq55fMfExNTrdzW+25pgyM/UA4dQ3CEvS+cLW+++SYeffRRfPbZZ/j666/xzDPPIDMzE/v27UOLFi0QEBCAXbt2Yfv27di4cSM2b96MdevWoW/fvvj666+teiZV21TXfGazGZ07d8Zbb71lcxlV3wxfqWkb61JQUIA+ffogNDQUs2bNQps2baDVanHo0CFMmjTJoR5XVcnJyYiIiMAHH3yAO+64Ax988AEiIyORlJRkVe/ixYt2HUMIDg6Wxy2ioqJgMplw4cIFNGvWTNYxGo34888/ER0dXeuyoqKicO7cuWrlf/zxBwDI+aOioqzKq9ataz1NmjQBALuC2aKm8KjpPbZVbmsZljY0bdrU7rbYvcsQHh6O0NBQHDlyxO6FV2YZoHH8+HGrcqPRiFOnTlUbwNG5c2dMmzYNu3btwu7du3Hu3DksW7bsfw1XKtGvXz+89dZbOHr0KF555RV88803sktfk7rma9OmDf766y/069cPSUlJ1R6WX/A2bdrAbDbj6NGjta7P3nSu6fWxlLlrgMuOHTvw559/YuXKlXj22Wdx7733IikpyWYX19FdH5VKhYcffhgff/wxLl26hKysLAwdOrTaBzg+Ph5RUVF1Pt544w05T1xcHICKXavKDhw4ALPZLKfXJC4uDj///HO1HtH+/futlt+pUyf4+flVW4/RaMThw4frXE/79u0BAKdOnbI5/fLly9XKLL1Od7O0oUOHDnbPY3cgKJVKpKam4osvvqj2YgF1d5GSkpKgVquxYMECq7rvvvsu9Ho9UlJSAAAGgwHl5eVW83bu3BlKpVJ24/76669qy7e8Uba6ehb2zPfQQw/h3LlzWLFiRbW6xcXF8oxJamoqlEolZs2aVe1XtfL2BQUFoaCgoMY2WXTv3h3NmjXDsmXLrLbhyy+/xLFjx+Tr4yrLl7NyG41GI5YsWVKtblBQkMO7EMOHD8elS5fw1FNP4cqVKzaP/DtzDKFv375o3Lgxli5darWspUuXIjAw0Or1yc/Px08//WR1DGrgwIEwmUxYvny5LCstLcX777+PhIQE2fPT6XRISkrCBx98YPXlXbVqFa5cuYJBgwbVuv3NmzdHTEyMze8IgGpD1b/88kuUlJS4ZRejqoMHD0Kn06Fjx472z2T34UdRMQYhMjJSBAYGigkTJoi3335bvPzyy6Jjx45yLIHlCKmtMxEzZswQAET//v3FokWLxPjx44VKpRLx8fHCaDQKIYT49NNPRfPmzcWECRPEkiVLxIIFC0R8fLzw9/cX2dnZQgghnn32WdG1a1cxbdo0sWLFCvHKK6+I5s2bixYtWliNVajKnvlMJpO45557hEKhEEOGDBELFy4U8+fPF6NHjxaNGze22q7p06cLAKJnz57ijTfeEAsXLhRpaWli8uTJss7TTz8tFAqF+Oc//yk+/PBDOXLM1jgEy2uXkJAg5s+fL6ZMmSICAwNF69atrcZqWMYh1PT61iY/P180atRItGrVSrz55pvirbfeEl27dhVdunSp1p45c+YIAOK5554Ta9asEZ9//nmty7bo1KmTACA6dOhgV317LV68WAAQAwcOFCtWrBBpaWkCgHjllVes6lleh6pjPAYNGiTHGLz99tuiZ8+ews/PT+zcudOq3sGDB4VGo7EaqajVau0eSzFu3DjRvHnzauf/AYiAgADx97//XSxdulRMnz5dhIaGCp1OJ2688UaxZs0aIUTN3yHLdlU9S1bT56FTp07ikUcesavNso0O1RZCnD59WqSlpYnw8HCh0WjEDTfcIMaOHVttYJKtQBCi4jRj+/bthb+/v4iIiBBjxoyx+rCfPHlSPP7446JNmzZCq9WKxo0bi7vuukts3bpV1tm2bZu4//77RXR0tFCr1SI6OloMHTpU/Pzzz7W23d75jEajeP3110XHjh2FRqMRjRo1Et26dRMzZ86sNrDlvffeE127dpX1+vTpI7Zs2SKn5+bmipSUFBESEmLXwKR169bJ5TVu3LjWgUlV2RMIQgixZ88ecdttt4mAgAARHR0tJk6cKL766qtq7bly5Yp4+OGHRVhYWJ0DkyqzBMmrr75qV31HLF++XNx0001CrVaLNm3aiHnz5lX74tUUCMXFxeKFF14QkZGRQqPRiPj4eLF582ab69m9e7fo2bOn0Gq1Ijw8XIwdO1YYDAa72njo0CE5sKgyACI9PV0MGjRIBAQEiKioKLFo0SKxbNkyERgYKJ544gkhhHsC4dixYwKA1ffGHryWgdxu/vz5QqFQiNOnT/u6KT7Tt2/far/OqGEcgidYesOODp/m1Y7kVkIIvPvuu+jTp0+102bXk1dffRXr1q3z2eXP77zzDmbPnu3wgWGPnXak60thYSE+//xzbN++HT/88AM+++wzXzfJpxISEmocN+FpTZo0cehS7coYCOQWFy9exMMPP4ywsDC89NJLGDBggK+bRE5QCMG/7UhE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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize the xz plane\n",
    "sim.plot(y=0)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "838c1c84",
   "metadata": {},
   "source": [
    "To have a better visualization, we can also plot the simulation in 3D."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "071d1429",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"H4sIACIhhmgC/+1bS2/cRhIe2Q4gGFgguWX3JPBqi2g2X809rdZWJCd+CFaAXUArcFtkz6gRvrZJyhoFvieXnPMTctyfsMf8q6S6+RhyRiNZtrCR4W4IQ7L6UdVV9VVVjzg/7j/96k8P//JwItvm5uTB5PPJsP3Wtv/tjJ+7/n+31432+kN7/eVeR99QfV+29C/a9ZfHfft6d1eO/m2pdXzQg+a6OdHtU2z7uzsH8vrP9rnzp1/vjcd9ffjqZXj47etnL/dGfvm39+S7MfmsWWOje94crXsfJJH3f97YUJ79ed/XjPsMrvL53r2GvNlKfr9baAlvk8nPd9oOhy9fPd3otTCZbN3Xvqmbbh9r+ymACLS5yOF7T149l9f/BuO8/lP7/L1Bq0qUxl+3vn/7eMuo5gWDe+OQp3VCK55nBlAjllVMAP0Imd7jLWQi9XEMXSW/kBOOLBNLmv14yzYJdoJB8+W4lMW8TiWbMcOMpnJ+VicJPE0F+0/NsmgeCprNBh00SfI34YzyDGhTmpRMzs2zhGeMirAsWLQYnOZxK/xSxxm/WKKcMlotkToVvGgkBkrBRMqrip/xag49lty+EeVZXEc9EdQht1NWAoi1YHKDR0t7nbE8ZZWYr2qh4/n3/HxZ32igcM8dqhwIgSI76tM+XtXnCY2+m4m8zuJwaROrA3oLtV2F4LkYDe6do9ukcb1hjZ06fJWkeYaRhdkZLXJBKxYblxr7yMIIu7YX2G7gOJ6JYX/gQDYiVmD7XhAQzyTHf4w7HOQJe81KHtdq26woQ55Nocc1PRtbNvZ8DwzkEk/qDgYrDwAXEIwmcLuNEfER9m0b2S5CljKswVM6azpdTFwPweax5yLTAhUuprrYJxhmB7Zl+Y4fKAdsp1rE94MA2w4mGPnENd23oKEBX5cgbNu+TWAEMTFxBmw930Wu5zmWQwJseh4esnXswLIQdhACzrD4kKtnWp5jOwQWJoQ4BLNHFllm7LmB7/nIC4jrINMf7pcggizLgQUcC5lg7CFjEoCCHNgMMPYRMd3FRNe0HQ85oGYHtoTtlu/xWzX/w9FmkSvQRoJR8zX4NPg0+G4PfHiMr8C+IRatNldqMGowajB+IBgdS4NRg1GD8U6A0bXHCLvqSIhGTZ3KLUw0FjUWNRZvA4sg8ntikWgsaixqLN4iFqUuB43cFIuuhqKGoobibUBx6QwYaChqKGoo/gFQBKNY75wVL/vmBusvbjQUNRRvBYqW887gI54GnwafBt/tlaRogT08wh5Git5e4MO9k3D7uF6KAqe7/LWoW7bmtrsSS8f2DAKT+NqgH2hQbGL3/2PPa8wJ8VNnQ50NP+FsqLAxTzuIHUlQwJ8i57WILn3ZdIyW3tQJzdg/6BlbnyuxOwKj8Syb8kyCBYiD++79XyVAWHHFbUkGmhYJr+qY9W/NFqe0ZE0cGUi1R+uy5DQ7qMHdO/wg6LFd7AU+QoED3uE5pi/73vC4Ol3pNB3ZmU+nJauUNiUDwdL8jIVxFEZ5WuQZbBj6AONMqahOQ8lJymvDc8wFi9Q7zyDTtpQDwJvA5k5ZRXuhG1pxynsKQCJUVLVNFywbeBI0Abie5zVTAKY9eNfEyK/4OYufZcpE3xzKoY3pT2QMo2K+Zvr5KqlI6vK6JNR7BINgGHNgJuMJz95z5iLQN8Iq4vzuinbxgaK9eG60HpTQOVPDLVn/FFTAhKqhLC1V8llKw1zECnR2T0lVrG98qaXQ88aXxiwP5OKlZPwdLYrxUg2lWarBWktRS9mN6yaAv36W1VOGArQUNavN9jfU/Selmkuda5nYgFnla4ieubgsXndznvLpVFAVhl40o9eHate6QaTuqpbXspvL5c5oAjGFRk198ljuWi0Y5UkeQSkzKEC6MHm0EpFVzVIA2C5oGzqXTVtRUS3chGXx4qEL5UsutLNYr1ddlosU5IUYLUc8Mlar0EUcZUl8re7QOtU1tu4JQ9VN5co3UZ/MNHdCe0pyJYKxqyrxXeUluxfyc19R9hVl/8I4VllnJni8JuOorvP1iWynrvI9GKNqaHoelhFtc6OjquryVJljzew9QWMWv2hGyY44GaEQ7sOykkUq1P3hmzNZVuHLukqehq2BrfbnOUry+Ucr+cXHKPkbqDYTls2UqyKTyMANRZkAYVk4/r2UgmQGsZlns7DIAWU9WaWSUDBAJUsB0Mo1+97FPnjc+zzwKNtiDptwsFCH3CSvwkaasAZ8yxWMf9XIPonUIbiXJ+zOiCGcsdTacKKDEl6KUqcFi0PYlBRkIXh9UkAFl6xqOQbwQWEp+BXFH5zBqADFxTsgNp2BApqEAZVnsn7WYUW5iGjZDb+yvjzYffIkz6Yqjsp9yJpdWg60qo74eWNvmTFZPAPb8KZslUqIcrGojVVSUOzS6N1lS/KyBG1es6FaTCGiPpMaplnErpATvbuci9UbE/UuUvY/cwy7MRWP57aCUZGXVSjTzuA3fzWc5yvFXv6H2yiAGe+c7HR+0gKwyVVgTThHx0yVC5LZKWB0Ks/VFttGEgaizrqTk822LfvtZPI7/7G2u8BBAAA=\" ></div>\n",
       "    <script>\n",
       "        \n",
       "        /**\n",
       "        * Simulation Viewer Injector\n",
       "        *\n",
       "        * Monitors the document for elements being added in the form:\n",
       "        *\n",
       "        *    <div class=\"simulation-viewer\" data-width=\"800\" data-height=\"800\" data-simulation=\"{...}\" />\n",
       "        *\n",
       "        * This script will then inject an iframe to the viewer application, and pass it the simulation data\n",
       "        * via the postMessage API on request. The script may be safely included multiple times, with only the\n",
       "        * configuration of the first started script (e.g. viewer URL) applying.\n",
       "        *\n",
       "        */\n",
       "        (function() {\n",
       "            const TARGET_CLASS = \"simulation-viewer\";\n",
       "            const ACTIVE_CLASS = \"simulation-viewer-active\";\n",
       "            const VIEWER_URL = \"https://tidy3d.simulation.cloud/simulation-viewer\";\n",
       "\n",
       "            class SimulationViewerInjector {\n",
       "                constructor() {\n",
       "                    for (var node of document.getElementsByClassName(TARGET_CLASS)) {\n",
       "                        this.injectViewer(node);\n",
       "                    }\n",
       "\n",
       "                    // Monitor for newly added nodes to the DOM\n",
       "                    this.observer = new MutationObserver(this.onMutations.bind(this));\n",
       "                    this.observer.observe(document.body, {childList: true, subtree: true});\n",
       "                }\n",
       "\n",
       "                onMutations(mutations) {\n",
       "                    for (var mutation of mutations) {\n",
       "                        if (mutation.type === 'childList') {\n",
       "                            /**\n",
       "                            * Have found that adding the element does not reliably trigger the mutation observer.\n",
       "                            * It may be the case that setting content with innerHTML does not trigger.\n",
       "                            *\n",
       "                            * It seems to be sufficient to re-scan the document for un-activated viewers\n",
       "                            * whenever an event occurs, as Jupyter triggers multiple events on cell evaluation.\n",
       "                            */\n",
       "                            var viewers = document.getElementsByClassName(TARGET_CLASS);\n",
       "                            for (var node of viewers) {\n",
       "                                this.injectViewer(node);\n",
       "                            }\n",
       "                        }\n",
       "                    }\n",
       "                }\n",
       "\n",
       "                injectViewer(node) {\n",
       "                    // (re-)check that this is a valid simulation container and has not already been injected\n",
       "                    if (node.classList.contains(TARGET_CLASS) && !node.classList.contains(ACTIVE_CLASS)) {\n",
       "                        // Mark node as injected, to prevent re-runs\n",
       "                        node.classList.add(ACTIVE_CLASS);\n",
       "\n",
       "                        var uuid;\n",
       "                        if (window.crypto && window.crypto.randomUUID) {\n",
       "                            uuid = window.crypto.randomUUID();\n",
       "                        } else {\n",
       "                            uuid = \"\" + Math.random();\n",
       "                        }\n",
       "\n",
       "                        var frame = document.createElement(\"iframe\");\n",
       "                        frame.width = node.dataset.width || 800;\n",
       "                        frame.height = node.dataset.height || 800;\n",
       "                        frame.style.cssText = `width:${frame.width}px;height:${frame.height}px;max-width:none;border:0;display:block`\n",
       "                        frame.src = VIEWER_URL + \"?uuid=\" + uuid;\n",
       "\n",
       "                        var postMessageToViewer;\n",
       "                        postMessageToViewer = event => {\n",
       "                            if(event.data.type === 'viewer' && event.data.uuid===uuid){\n",
       "                                frame.contentWindow.postMessage({ type: 'jupyter', uuid, value: node.dataset.simulation, fileType: 'hdf5'}, '*');\n",
       "\n",
       "                                // Run once only\n",
       "                                window.removeEventListener('message', postMessageToViewer);\n",
       "                            }\n",
       "                        };\n",
       "                        window.addEventListener(\n",
       "                            'message',\n",
       "                            postMessageToViewer,\n",
       "                            false\n",
       "                        );\n",
       "\n",
       "                        node.appendChild(frame);\n",
       "                    }\n",
       "                }\n",
       "            }\n",
       "\n",
       "            if (!window.simulationViewerInjector) {\n",
       "                window.simulationViewerInjector = new SimulationViewerInjector();\n",
       "            }\n",
       "        })();\n",
       "    \n",
       "    </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sim.plot_3d()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ce588d4",
   "metadata": {},
   "source": [
    "Submit the simulation to the server."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b7467135",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:52:50 UTC </span>Created task <span style=\"color: #008000; text-decoration-color: #008000\">'beam_steering_metasurface'</span> with task_id              \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'fdve-01816346-29a0-4c3f-b1bb-2838aee41328'</span> and task_type <span style=\"color: #008000; text-decoration-color: #008000\">'FDTD'</span>.  \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:52:50 UTC\u001b[0m\u001b[2;36m \u001b[0mCreated task \u001b[32m'beam_steering_metasurface'\u001b[0m with task_id              \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'fdve-01816346-29a0-4c3f-b1bb-2838aee41328'\u001b[0m and task_type \u001b[32m'FDTD'\u001b[0m.  \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>View task using web UI at                                          \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a</span></a>\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><a href=\"https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">0-4c3f-b1bb-2838aee41328'</span></a>.                                         \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mView task using web UI at                                          \n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=135245;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32m'https://tidy3d.simulation.cloud/workbench?\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=64325;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32mtaskId\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=135245;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32m=\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=914285;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32mfdve\u001b[0m\u001b]8;;\u001b\\\u001b]8;id=135245;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32m-01816346-29a\u001b[0m\u001b]8;;\u001b\\\n",
       "\u001b[2;36m             \u001b[0m\u001b]8;id=135245;https://tidy3d.simulation.cloud/workbench?taskId=fdve-01816346-29a0-4c3f-b1bb-2838aee41328\u001b\\\u001b[32m0-4c3f-b1bb-2838aee41328'\u001b[0m\u001b]8;;\u001b\\.                                         \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Task folder: <a href=\"https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\" target=\"_blank\"><span style=\"color: #008000; text-decoration-color: #008000\">'default'</span></a>.                                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTask folder: \u001b]8;id=216934;https://tidy3d.simulation.cloud/folders/9b36e144-ddb6-41f8-8dd8-30b62b26a870\u001b\\\u001b[32m'default'\u001b[0m\u001b]8;;\u001b\\.                                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c20726b5044343d0a50a3254f6cc4937",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:52:52 UTC </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.025</span>. Minimum cost depends on task       \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>execution details. Use <span style=\"color: #008000; text-decoration-color: #008000\">'web.real_cost(task_id)'</span> to get the billed  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>FlexCredit cost after a simulation run.                            \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:52:52 UTC\u001b[0m\u001b[2;36m \u001b[0mMaximum FlexCredit cost: \u001b[1;36m0.025\u001b[0m. Minimum cost depends on task       \n",
       "\u001b[2;36m             \u001b[0mexecution details. Use \u001b[32m'web.real_cost\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m to get the billed  \n",
       "\u001b[2;36m             \u001b[0mFlexCredit cost after a simulation run.                            \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">12:52:53 UTC </span>status = queued                                                    \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m12:52:53 UTC\u001b[0m\u001b[2;36m \u001b[0mstatus = queued                                                    \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>To cancel the simulation, use <span style=\"color: #008000; text-decoration-color: #008000\">'web.abort(task_id)'</span> or              \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008000; text-decoration-color: #008000\">'web.delete(task_id)'</span> or abort/delete the task in the web UI.      \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Terminating the Python script will not stop the job running on the \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>cloud.                                                             \n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[2;36m            \u001b[0m\u001b[2;36m \u001b[0mTo cancel the simulation, use \u001b[32m'web.abort\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or              \n",
       "\u001b[2;36m             \u001b[0m\u001b[32m'web.delete\u001b[0m\u001b[32m(\u001b[0m\u001b[32mtask_id\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m or abort/delete the task in the web UI.      \n",
       "\u001b[2;36m             \u001b[0mTerminating the Python script will not stop the job running on the \n",
       "\u001b[2;36m             \u001b[0mcloud.                                                             \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fbb4d29c46d04cc1826a49aa905811cc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "job = web.Job(simulation=sim, task_name=\"beam_steering_metasurface\", verbose=True)\n",
    "sim_data = job.run(path=\"data/simulation_data.hdf5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8fbd776d",
   "metadata": {},
   "source": [
    "### Result Analysis "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a750857",
   "metadata": {},
   "source": [
    "After the simulation is complete, we first extract the reflected angles and power from the [DiffractionMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.DiffractionMonitor.html). Then, plot the power and angle of each diffraction order as a scatter plot in polar coordinate. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "38482225",
   "metadata": {},
   "outputs": [],
   "source": [
    "theta = np.array(sim_data[\"R\"].angles[0])  # diffraction angle theta\n",
    "phi = np.array(sim_data[\"R\"].angles[1])  # diffraction angle phi\n",
    "power = np.array(sim_data[\"R\"].power)  # diffraction power of each order\n",
    "\n",
    "# plot the power and angle in polar coordinate\n",
    "fig, ax = plt.subplots(subplot_kw={\"projection\": \"polar\"})\n",
    "plt.scatter(phi, theta * 180 / np.pi, s=60, c=power, vmin=0, vmax=1, cmap=\"bwr\")\n",
    "ax.set_rlim(0, 90)\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fb5584b",
   "metadata": {},
   "source": [
    "To see the power values more clearly, we plot the relationship between the power and the diffraction order. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b9226e8d",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.scatter(sim_data[\"R\"].orders_x, sim_data[\"R\"].power.values[:, 0])\n",
    "plt.xlabel(\"Diffraction order\")\n",
    "plt.ylabel(\"Power\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c4e9f0",
   "metadata": {},
   "source": [
    "The Above result shows that about 80% of the power is diffracted to about 45 degree. This is consistent with our design since we have $2\\pi/L_x\\approx 0.71k_0 $, where $L_x$ = 1200 nm is the super cell size in the x direction. This gives a diffraction angle of $sin^{-1}(0.71)\\approx 45^{\\circ}$ at the first diffraction order. Note that another 5% of the power that is also diffracted to 45 degree corresponds to the -1 diffraction order.\n",
    "\n",
    "Lastly, visualize the field distribution at the xz plane. The field above the super cell resembles a plane wave propagating at about 45$^{\\circ}$. Clearly it is not a perfect plane wave. The distortion is due to the fact that 5% of the power is diffracted to the -1 order and about 1% to the 0 order. This design can potentially be further optimized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d702eca7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# plot Ey distribution\n",
    "fig, ax = plt.subplots()\n",
    "Ey = sim_data[\"field\"].Ey.sel(f=freq0).real\n",
    "Ey.plot(x=\"x\", y=\"z\", ax=ax, vmin=-100, vmax=100, cmap=\"bwr\")\n",
    "ax.set_aspect(\"equal\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a88ed322",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "applications": [
   "Metamaterials, gratings, and other periodic structures"
  ],
  "description": "This notebook demonstrates how to model a gradient metasurface reflector in Tidy3D FDTD.",
  "feature_image": "./img/gradient_metasurface_reflector_schematic.png",
  "features": [
   "Parameter sweep",
   "Diffraction analysis"
  ],
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "keywords": "gradient metasurface reflector, metamaterial, nanoantenna, Tidy3D, FDTD",
  "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.11.2"
  },
  "nbdime-conflicts": {
   "local_diff": [
    {
     "diff": [
      {
       "diff": [
        {
         "key": 0,
         "length": 1,
         "op": "removerange"
        }
       ],
       "key": "version",
       "op": "patch"
      }
     ],
     "key": "language_info",
     "op": "patch"
    }
   ],
   "remote_diff": [
    {
     "diff": [
      {
       "diff": [
        {
         "diff": [
          {
           "key": 5,
           "op": "addrange",
           "valuelist": "9"
          },
          {
           "key": 5,
           "length": 1,
           "op": "removerange"
          }
         ],
         "key": 0,
         "op": "patch"
        }
       ],
       "key": "version",
       "op": "patch"
      }
     ],
     "key": "language_info",
     "op": "patch"
    }
   ]
  },
  "title": "Gradient Metasurface Reflector | Flexcompute",
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "0b1e5f8f7d6b4122b648ba95a11b0cd1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "16f931a4513b406cae37a0572c046af9": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_0b1e5f8f7d6b4122b648ba95a11b0cd1",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">🏃 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Waiting for 'beam_steering_metasurface'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🏃 \u001b[0m \u001b[1;32mWaiting for 'beam_steering_metasurface'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "20ec8a0740964c719812cb87aa561ba6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "230959446a454326bcc431a1d103ccc9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "3e4974eccf354d82b00bbb94f284e239": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "3f92ed6ff5054ec297976deda69df2ee": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_932851551ce540979fa3a8c446296abb",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">🏃 </span> <span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">Finishing 'beam_steering_metasurface'...</span>\n</pre>\n",
          "text/plain": "\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'beam_steering_metasurface'...\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "4ee9e9a45a0c4e41bedf779f3d316a3a": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_c299436d26e04555a6901ceada3b249a",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Downloading data for 14 tasks <span style=\"color: #f92672; text-decoration-color: #f92672\">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸</span><span style=\"color: #3a3a3a; text-decoration-color: #3a3a3a\">━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\"> 86%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:02</span>\n</pre>\n",
          "text/plain": "Downloading data for 14 tasks \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;2;249;38;114m╸\u001b[0m\u001b[38;5;237m━━━━━\u001b[0m \u001b[35m 86%\u001b[0m \u001b[33m0:00:02\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "630aa3a76a3049f68e38f9040a9992cc": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_d0dcd237885247cdbb701a1ed8e0ef76",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">L=0.04          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:09</span>\nL=0.06          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:09</span>\nL=0.08          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:08</span>\nL=0.10          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:08</span>\nL=0.11          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:08</span>\nL=0.13          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:08</span>\nL=0.15          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:08</span>\nL=0.17          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:07</span>\nL=0.19          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:07</span>\nL=0.21          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:07</span>\nL=0.22          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:07</span>\nL=0.24          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:06</span>\nL=0.26          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:06</span>\nL=0.28          → <span style=\"color: #008000; text-decoration-color: #008000\">success      </span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:06</span>\n</pre>\n",
          "text/plain": "L=0.04          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:09\u001b[0m\nL=0.06          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:09\u001b[0m\nL=0.08          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:08\u001b[0m\nL=0.10          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:08\u001b[0m\nL=0.11          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:08\u001b[0m\nL=0.13          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:08\u001b[0m\nL=0.15          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:08\u001b[0m\nL=0.17          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:07\u001b[0m\nL=0.19          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:07\u001b[0m\nL=0.21          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:07\u001b[0m\nL=0.22          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:07\u001b[0m\nL=0.24          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:06\u001b[0m\nL=0.26          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:06\u001b[0m\nL=0.28          → \u001b[32msuccess      \u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[33m0:00:06\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "7311c58b59bc46ce97df2d2b941199b8": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_230959446a454326bcc431a1d103ccc9",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">solver progress (field decay = 6.58e-06) <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100%</span> <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "solver progress (field decay = 6.58e-06) \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "932851551ce540979fa3a8c446296abb": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "a149619a8a8f47b7b984f6e4f321a7c1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "ad3cc84594ae46ba9ee2a46ede17d64c": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_20ec8a0740964c719812cb87aa561ba6",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">↑</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">1.9/1.9 kB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">?</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m1.9/1.9 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "b8a6fbae6dd84d9081f27ab55cf71e0a": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_3e4974eccf354d82b00bbb94f284e239",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Uploading data for 14 tasks <span style=\"color: #f92672; text-decoration-color: #f92672\">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</span><span style=\"color: #3a3a3a; text-decoration-color: #3a3a3a\">╺━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\"> 86%</span> <span style=\"color: #808000; text-decoration-color: #808000\">0:00:04</span>\n</pre>\n",
          "text/plain": "Uploading data for 14 tasks \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━\u001b[0m \u001b[35m 86%\u001b[0m \u001b[33m0:00:04\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     },
     "c299436d26e04555a6901ceada3b249a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d0dcd237885247cdbb701a1ed8e0ef76": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "2.0.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "2.0.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border_bottom": null,
       "border_left": null,
       "border_right": null,
       "border_top": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "fecf10a74f0d4e3aa95a193f7048fecf": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/output",
       "_model_module_version": "1.0.0",
       "_model_name": "OutputModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/output",
       "_view_module_version": "1.0.0",
       "_view_name": "OutputView",
       "layout": "IPY_MODEL_a149619a8a8f47b7b984f6e4f321a7c1",
       "msg_id": "",
       "outputs": [
        {
         "data": {
          "text/html": "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000; font-weight: bold\">↓</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">simulation_data.hdf5.gz</span> <span style=\"color: #729c1f; text-decoration-color: #729c1f\">━━━━━━━━━━━━━</span> <span style=\"color: #800080; text-decoration-color: #800080\">100.0%</span> • <span style=\"color: #008000; text-decoration-color: #008000\">1.2/1.2 MB</span> • <span style=\"color: #800000; text-decoration-color: #800000\">1.7 MB/s</span> • <span style=\"color: #008080; text-decoration-color: #008080\">0:00:00</span>\n</pre>\n",
          "text/plain": "\u001b[1;32m↓\u001b[0m \u001b[1;34msimulation_data.hdf5.gz\u001b[0m \u001b[38;2;114;156;31m━━━━━━━━━━━━━\u001b[0m \u001b[35m100.0%\u001b[0m • \u001b[32m1.2/1.2 MB\u001b[0m • \u001b[31m1.7 MB/s\u001b[0m • \u001b[36m0:00:00\u001b[0m\n"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "tabbable": null,
       "tooltip": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
