{ "cells": [ { "cell_type": "markdown", "id": "45d4c281-3990-4768-8981-567ff4bb6fbc", "metadata": {}, "source": [ "# Time dependent optimization (PyTorch version)\n", "In this example, we use the inverse computing capibilities of NeuralMag in order to optimize the direction of an external field in order to control the magnetization dynamics of a single-domain particle. Specifilly, the field is optimized such that the magnetization is pointing in a given direction $\\vec{m}_\\text{target}$ at time $T$. This example is taken from [1] and reads\n", "\n", "$$\n", "\\begin{align}\n", " \\vec{H}_\\text{ext}(\\theta, \\phi) &= H_c \\begin{pmatrix}\n", " \\sin(\\theta) \\cos(\\phi)\\\\\n", " \\sin(\\theta) \\sin(\\phi)\\\\\n", " \\cos(\\theta)\n", " \\end{pmatrix},\\\\\n", " \\vec{H}_\\text{eff} &= \\vec{H}_\\text{aniso} + \\vec{H}_\\text{exchange} + \\vec{H}_\\text{ext},\\\\\n", " \\mathcal{L}(\\theta, \\phi) &= \\int_{\\Omega} \\|\\vec{m}(T) - \\vec{m}_\\text{target}\\| \\,\\text{d}V.\n", "\\end{align}\n", "$$\n", "\n", "## Simulation\n", "For this example, we use the JAX backend together with the [Optax](https://optax.readthedocs.io/en/latest/) library for optimiz\n", "### Import libraries\n", "Import libraries, set backend to JAX and reduce FEM quadrature order for better performance." ] }, { "cell_type": "code", "execution_count": 1, "id": "132fae84-f7e7-4b11-abac-397c099cc349", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Version 0.9.1\u001b[0m\n", "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Backend set to 'torch'.\u001b[0m\n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", "from scipy import constants\n", "from tqdm import tqdm\n", "\n", "import neuralmag as nm\n", "\n", "nm.config.backend = \"torch\"\n", "nm.config.fem[\"n_gauss\"] = 1" ] }, { "cell_type": "markdown", "id": "18c24f84-f43c-4e79-b23a-1e8dfead814a", "metadata": {}, "source": [ "### Setup mesh and state\n", "Setup mesh, state and material parameters and set initial magnetization in z-direction." ] }, { "cell_type": "code", "execution_count": 2, "id": "7d95c6e0-67fe-4401-b8d4-d8500c8fb580", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[Mesh] 3D, 2 x 2 x 2 (size = 5e-09 x 5e-09 x 5e-09)\u001b[0m\n", "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default device to 'cpu'.\u001b[0m\n", "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default dtype to 'float32'.\u001b[0m\n", "2025-05-13 13:49:14 NeuralMag:INFO \u001b[1;37;32m[State] Running on device: cpu (dtype = torch.float32, backend = torch)\u001b[0m\n" ] } ], "source": [ "mesh = nm.Mesh((2, 2, 2), (5e-9, 5e-9, 5e-9))\n", "state = nm.State(mesh)\n", "\n", "state.material.Ms = 8e5\n", "state.material.A = 1.3e-11\n", "state.material.Ku = 1e5\n", "state.material.Ku_axis = [0, 0, 1]\n", "state.material.alpha = 0.1\n", "\n", "state.m = nm.VectorFunction(state).fill((0, 0, 1))" ] }, { "cell_type": "markdown", "id": "86dc9257-8ce0-4565-b53b-70fdea52c7d7", "metadata": {}, "source": [ "### Set up external-field function\n", "Next, we set up the external-field function as dynamic attribute depending and the spherical angles $\\phi$ and $\\theta$." ] }, { "cell_type": "code", "execution_count": 3, "id": "edc7a3ac-dff1-460b-bd4a-4a3e65750546", "metadata": {}, "outputs": [], "source": [ "H = 2 * 1e5 / (constants.mu_0 * 8e5)\n", "state.phi = lambda angles: angles[0]\n", "state.theta = lambda angles: angles[1]\n", "state.angles = [torch.pi / 2, torch.pi / 2]\n", "h_ext = lambda angles: torch.stack(\n", " [\n", " H / 2 * torch.sin(angles[0]) * torch.cos(angles[1]),\n", " H / 2 * torch.sin(angles[0]) * torch.sin(angles[1]),\n", " H / 2 * torch.cos(angles[0]),\n", " ]\n", ")" ] }, { "cell_type": "markdown", "id": "54944dc9-df78-49b1-813c-1c899e8d52f3", "metadata": {}, "source": [ "### Set up effective field" ] }, { "cell_type": "code", "execution_count": 4, "id": "2af95aa4-a9e1-4228-81d5-803bcbe1f99a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 13:49:16 NeuralMag:INFO \u001b[1;37;32m[ExchangeField] Register state methods (field: 'h_exchange', energy: 'E_exchange')\u001b[0m\n", "2025-05-13 13:49:16 NeuralMag:INFO \u001b[1;37;32m[UniaxialAnisotropyField] Register state methods (field: 'h_aniso', energy: 'E_aniso')\u001b[0m\n", "2025-05-13 13:49:16 NeuralMag:INFO \u001b[1;37;32m[ExternalField] Register state methods (field: 'h_external', energy: 'E_external')\u001b[0m\n", "2025-05-13 13:49:16 NeuralMag:INFO \u001b[1;37;32m[TotalField] Register state methods (field: 'h', energy: 'E')\u001b[0m\n" ] } ], "source": [ "nm.ExchangeField().register(state, \"exchange\")\n", "nm.UniaxialAnisotropyField().register(state, \"aniso\")\n", "nm.ExternalField(h_ext).register(state, \"external\")\n", "nm.TotalField(\"exchange\", \"aniso\", \"external\").register(state)" ] }, { "cell_type": "markdown", "id": "11c08bf3-75ee-4252-b7bf-1ccb9af7bed7", "metadata": {}, "source": [ "### Set up LLGSolver\n", "Next, we set up the LLGSolver defining ```angles``` as parameters in order to allow for efficient gradient computation." ] }, { "cell_type": "code", "execution_count": 5, "id": "3c49686e-2d09-4b58-b04f-0ee7c973ae8a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 13:49:16 NeuralMag:INFO \u001b[1;37;32m[LLGSolverTorch] Initialize RHS function\u001b[0m\n" ] } ], "source": [ "llg = nm.LLGSolver(state, parameters=[\"angles\"])" ] }, { "cell_type": "markdown", "id": "cff0461b-978d-4f28-9dab-01b943d00a65", "metadata": {}, "source": [ "### Set up optimizer\n", "Now, we define an Adams optimizer along with a L1 loss function and the target magnetization." ] }, { "cell_type": "code", "execution_count": 6, "id": "02cc0a6a-4604-4311-b309-cc917974e9f5", "metadata": {}, "outputs": [], "source": [ "optimizer = torch.optim.Adam(llg.parameters(), lr=0.05)\n", "\n", "my_loss = torch.nn.L1Loss()\n", "m_target = nm.VectorFunction(state).fill((0.5**0.5, 0, 0.5**0.5)).tensor" ] }, { "cell_type": "code", "execution_count": null, "id": "ae6e09c8-d89d-4df5-a69a-134e86733943", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "12343f43-771e-443c-825d-41873702de9d", "metadata": {}, "source": [ "### Perform optimization loop" ] }, { "cell_type": "code", "execution_count": 7, "id": "2b91b860-fc61-4ad5-8b5d-64edff16d86e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [08:55<00:00, 5.36s/it]\n" ] } ], "source": [ "logger = nm.ScalarLogger(\"time-dependent-optimization_torch/log.dat\", [\"step\", \"phi\", \"theta\", \"loss\"])\n", "for step in tqdm(range(100)):\n", " state.step = step\n", "\n", " optimizer.zero_grad()\n", " m_pred = llg.solve(state.tensor([0.0, 0.05e-9]))\n", " state.loss = my_loss(m_pred[-1], m_target)\n", " state.loss.backward()\n", " optimizer.step()\n", "\n", " logger.log(state)" ] }, { "cell_type": "markdown", "id": "324924e9-3ca7-42a3-ae74-bd909bf4a6bb", "metadata": {}, "source": [ "### Plot the solution\n", "Finally, we plot the evolution of the field angles along with the loss function against the number of optimization steps." ] }, { "cell_type": "code", "execution_count": 8, "id": "72e66aaa-d3db-4024-bd6e-1cc6e3ea9ebd", "metadata": {}, "outputs": [ { "data": { "image/png": "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8cQT5g5L1EGNkrny0S6aprFw4cIKVbJ2dnYEBASwcOFC40YoKnJ1VSNaT51STa0yCEIIIUQN2NraMm/ePBYsWHDFeydOnLhi3+VzygUEBNRoXjtRP2qUzCUmJgJw44038v333+MutULmERIiyZwQQgghgFoOgPjrr79wd3enuLiYw4cPU1paauy4xNVIvzkhhBBCXFSrZK6goIBHH30UJycnOnXqZBhxOmnSJGbPnm3UAEUlZFkvIYQQtRATE8O8efPMHYYwslolc9OmTWPv3r3ExMTg4OBg2D9o0CCWL19utOBEFaRmTgghhBAX1WpqklWrVrF8+fIrZpHu1KkTx48fN1pwogrlI1rPnoXMTGja1JzRCCGEEMKMalUzl56ejqen5xX78/LyKiR3wkTc3KB8+TKpnRNCCCGua7VK5nr06MHPP/9seF2ewH366adERkYaJzJLVVZSP9eRlSCEEEIIQS2bWd98802GDh1KfHw8paWlvP/++8THx7N582bWr19v7Bgtw7lj8PtLUJQNY38x/fU6dYLffoO4ONNfSwghhBANVq1q5vr160dsbCylpaV06dKF33//HU9PT7Zs2UL37t2NHaNlsGsCx9bByU2Qst/015NBEEIIIYSgljVzAG3atGHRokXGjMWyubaE4NshfhXs+BSGvW/a63XurB4lmRNCCFFLMTEx3HjjjVy4cIGmMpjOYtWqZg5Ar9dz5MgRNm7cyIYNGyps161ej6vHfd9BQaZpr1U+11xKCmRkmPZaQgghGoWBAwcyZcoUo59Xp9OxatUqo59XVE+taua2bt3KAw88wMmTJ69Yo02n01FWVmaU4CxO677QoiOkH4S930Lv8aa7lrMzBATAiROqdu6GG0x3LSGEEEI0WLWqmRs3bhw9evQgLi6O8+fPc+HCBcN2/vx5Y8doOXQ66PWYer7jU9DrTXs96TcnhBANg6ZBcZ55tmoufP/www+zfv163n//fXQ6HTqdjhMnTgCwa9cuevTogZOTE3369OHw4cMVjl29ejXdunXDwcGBoKAgXnnlFcNSngEBAQDceeed6HQ6w+vjx49zxx134OXlhbOzMz179uSPP/4wyu0WFdWqZu7o0aOsXLmStm3bGjsey9d1BKx7GTKOQWIMtPmX6a7VqRP8/LOMaBVCCHMryYc3fcxz7RfPqkF41/D+++9z5MgROnfuzKuvvgrAgYuVAf/973+ZO3cuLVq0YNy4cTzyyCNs2rQJgL///pvRo0fzwQcf0L9/f44fP84TTzwBwKxZs9ixYweenp588cUX3HLLLVhbWwOQm5vLrbfeyhtvvIG9vT1fffUVw4YN4/Dhw/j7+5viTly3alUzFxERwbFjx4wdS+Ng7wJhI9Xz7Z+a9loyCEIIIUQ1ubm5YWdnh5OTE97e3nh7exsSrzfeeIMBAwYQEhLCtGnT2Lx5M4WFhQC88sorTJs2jTFjxhAUFMTNN9/Ma6+9xv/93/8B0KJFCwCaNm2Kt7e34XVoaChPPvkknTt3pl27drz22mu0adOGH3/80Qyf3jKcPn3akCjXRLVr5vbt22d4PmnSJJ555hlSUlLo0qULtra2Fcp27dq1xoE0Kj0fg+2fwJFfIfMUNPUzzXXKm1nj4lQ1u6y+IYQQ5mHrpGrIzHXtOrr8e7tly5YApKWl4e/vz969e9m0aRNvvPGGoUxZWRmFhYXk5+fj5FT59XNzc3n55Zf5+eefSU5OprS0lIKCApKSkuocb2OVkZHBZ599xieffFKj46qdzIWFhaHT6SoMeHjkkUcMz8vfu64HQJRr0QECb4DEDbDzcxg0yzTX6dhRJXAZGZCWBl5eprmOEEKIq9PpqtXU2VBdXilTvqqT/mK/79zcXF555RXuuuuuK45zcHCo8pzPPvss69at45133qFt27Y4Ojpyzz33UFxcbOToRbWTucTERFPG0fj0fFwlc7u/goHTwMbe+NdwdIQ2beDYMdXUKsmcEEKIq7Czs6txhUu3bt04fPjwVfvJ29raXnHeTZs28fDDD3PnnXcCKiksH3AhjKvayVzr1q0Nzzds2ECfPn2wsal4eGlpKZs3b65Q9rrV4VZw9YXsMxC/GrreZ5rrdOqkkrm4OPiXCQdbCCGEsHgBAQFs27aNEydO4OzsbKh9u5qZM2dy++234+/vzz333IOVlRV79+4lLi6O119/3XDe6Oho+vbti729Pe7u7rRr147vv/+eYcOGodPpmDFjRrWuJ2quVqNZb7zxRpKTk/H09KywPysrixtvvFGaWQGsbaD7WPjrddi+yHTJXOfOsHq1DIIQQghxTc8++yxjxowhJCSEgoICvvjii2seM2TIENasWcOrr77KnDlzsLW1JTg4mMcee8xQZu7cuUydOpVFixbh6+vLiRMnePfdd3nkkUfo06cPHh4evPDCC2RnZ5vy4zV4lTVVXy4zM7NW59Vp/5z1txqsrKxITU01jFgpd+TIEXr06NGg/7FOnz6Nn58fp06dolWrVqa9WE4qvNcJ9CXw5AZoGWr8a3z7LTzwAPTtCxs3Gv/8QgghrlBYWEhiYiKBgYFX7TcmauZq97Vev79NZOzYsdUqV50k+3I1qpkrzyh1Oh0PP/ww9vaX+oGVlZWxb98++vTpU6MAGjUXLwj5N8T9T9XO3fGR8a9RPj2JjGgVQgghGrSaJmnVVaN55tzc3HBzc0PTNFxcXAyv3dzc8Pb25oknnmDJkiUmCdRi9by4Xuv+lVBwwfjnb98erK0hKwvOmmlYvBBCCCHMpkY1c/Pnz8fJyYmAgACeffZZmjSx3GHY9ca/N3h1htQ42PMN9Jlo3PPb20O7dnDokKqd8/U17vmFEEII0aDVqGbOw8OD22+/nZYtW5KTk2OqmBoXnU5NIgyw8zPTrNcqK0EIIYQQ160aJXMHDx5kyJAhfPfddwQEBBAREcEbb7zB/v37TRVf49D1PrB3g/MJkPCn8c9fvhKEJHNCCCHEdadGyVzr1q2ZNGkSf/zxB6mpqUyZMoX9+/fTv39/goKCmDJlCn/++adMTfJPdk0g7AH13BTrtV4+CEIIIYQQ15UaJXOXc3NzY+TIkSxbtoz09HQWLlxIWVkZY8eOpUWLFnzzzTfGjNPy9XxUPR5ZCxdOGvfc5TVz8fFqRKsQQgghANXfPyAgAAcHByIiIti+fXuVZQ8cOMDdd99NQEAAOp2OefPmXVHm5ZdfRqfTVdiCg4NN+AmurdbJ3OVsbW0ZPHgwH374ISdPniQ6Opr27dsb49SNh0c7CBoIaGq9VmNq2xZsbSE3F2QBYyGEEAKA5cuXM3XqVGbNmsXu3bsJDQ1lyJAhpKWlVVo+Pz+foKAgZs+ejbe3d5Xn7dSpE8nJyYZto5nnea32aNZ9+/bRuXNnrKys2LdvX5XldDod4eHhRgmu0en5OCTEXFyvdTrYGmmiSVtbCA6G/ftVU6sspyaEEELw7rvv8vjjjxsm6124cCE///wzn3/+OdOmTbuifM+ePenZsydApe+Xs7GxuWqyV9+qncyFhYWRkpKCp6cnYWFh6HQ6Kls8QqfTSZ+5qrS/BVxbQfZpiF8Fofcb79ydOqlk7sABuO02451XCCGEaEBycnIqrDRlb29fYRGDcsXFxezatYvp06cb9llZWTFo0CC2bNlSpxiOHj2Kj48PDg4OREZGEhUVhb+/f53OWRfVbmZNTEw0LN+VmJhIQkICiYmJV2wJCQnVvviGDRsYNmwYPj4+6HQ6Vq1aVe1jN23ahI2NDWFhYdU+xuysbaDHxaU8ti8y7rllEIQQQohrePjhhxk+fLi5w6iTkJCQCosWREVFVVru3LlzlJWV4eXlVWG/l5cXKSkptb5+REQEixcvZu3atSxYsIDExET69+9v1inbql0z1/qyprvWRmrGy8vLIzQ0lEceeeSai89eLjMzk9GjR3PTTTeRmppqlFjqTbcxEDMbzuyEs3vAx0hN0jI9iRBCiOtAfHw8vpdNkF9ZrZwpDR061PC8a9euRERE0Lp1a7777jseffTReo2lXI1WgLjc0aNH+euvv0hLS0P/j4lwZ86cWa1zDB06tMJNqa5x48bxwAMPYG1tXaPavAbBuQV0Gg77V6hpSobPN855y2vm4uOhrEwt8SWEEKJ+aBrk55vn2k5O19W63C4uLri6ul6znIeHB9bW1ldU+qSmphq1v1vTpk1p3749x44dM9o5a6pWydyiRYsYP348Hh4eeHt7o7vsh0in01U7mauNL774goSEBJYsWcLrr79+zfJFRUUUFRUZXjeIlSt6Pq6SubiVMPg1cGpW93MGBan/0Pn5cPy4WrNVCCFE/cjPB2dn81w7Nxdkec0r2NnZ0b17d6Kjow1Ny3q9nujoaCZONN7Smrm5uRw/fpyHHnrIaOesqVolc6+//jpvvPEGL7zwgrHjuaqjR48ybdo0/v77b2xsqhd6VFQUr7zyiokjqyG/XuDdBVL2Q+w30GdS3c9pZaWaWnfsUAMhJJkTQghxnZs6dSpjxoyhR48e9OrVi3nz5pGXl2cY3Tp69Gh8fX0N/e6Ki4uJj483PD9z5gyxsbE4OzvTtm1bAJ599lmGDRtG69atOXv2LLNmzcLa2pqRI0ea50NSy2TuwoUL3HvvvcaO5arKysp44IEHeOWVV2o0h9306dOZOnWq4fWZM2cICQkxRYjVp9Op2rmf/gM7PoPeE1QyVledO19K5u6+u+7nE0IIUT1OTqqGzFzXFpUaMWIE6enpzJw5k5SUFMLCwli7dq1hUERSUhJWl33/nj17tsL0au+88w7vvPMOAwYMICYmBoDTp08zcuRIMjIyaNGiBf369WPr1q2GQaLmUKtk7t577+X3339n3Lhxxo6nSjk5OezcuZM9e/YYqkf1ej2apmFjY8Pvv//Ov/71ryuO++eQ5cuHM5tVl3vg9xlwIRGOR0O7m41wzi7qUdbKFUKI+qXTSVNnAzVx4sQqm1XLE7RyAQEBlU67drlly5YZKzSjqXYy98EHHxiet23blhkzZrB161a6dOmCra1thbL/+c9/jBfhRa6uruz/R5Ly8ccf8+eff7Jy5UoCAwONfk2TsmsC4aNg68dqmhJJ5oQQQghRC9VO5t57770Kr52dnVm/fj3r16+vsF+n01U7mcvNza0w+iMxMZHY2FiaNWuGv78/06dP58yZM3z11VdYWVnRuXzE5kWenp44ODhcsd9i9HxMJXNHf4cLJ8A9oG7nK0/mjh1TnXGl6l0IIcQ/ZGVlERsbW2Ff8+bN8fPzM09Aos6qncwlJiZWur+8OlJXi2HRO3fu5MYbbzS8Lu/bNmbMGBYvXkxycjJJjXmt0eZtoM2/4Pifqu/c4Nfqdj4vL2jRAtLT1RQlPXoYJ04hhBCNRkxMzBXLbj766KN8+umnZopI1FWte91/9tlndO7cGQcHB0PtWE1/EAYOHIimaVdsixcvBmDx4sVXtGdf7uWXX77irwuL0/Mx9bhnCZQU1v180tQqhBCiCosXL670e1cSOctWq2Ru5syZTJ48mWHDhrFixQpWrFjBsGHDePrpp006x1yj1P4WcPODgvNw4Pu6n0+SOSGEEOK6UqvRrAsWLGDRokUV5lT597//TdeuXZk0aRKvvvqq0QJs9Kys1Xqt0a/Cjk8h7IG6nU+SOSGEEOK6UquauZKSEnpU0h+re/fulJaW1jmo6074aLC2gzO74Mzuup1LkjkhhBDiulKrZO6hhx5iwYIFV+z/5JNPGDVqVJ2Duu44t4CQ4er5jjr2W+jUST2mpqqBEEIIIYRo1GrVzApqAMTvv/9O7969Adi2bRtJSUmMHj26wooL7777bt2jvB70ehz2fwdx/4PBr9d+vdYmTdQ6rQkJqnaukomUhRBCGMe1JpgVNSP3s3ZqlczFxcXRrVs3AI4fPw6Ah4cHHh4exMXFGcrVZrqS61arnuDdFVL2qZGtfesw8XKXLiqZi4uTZE4IIUzA1tYWnU5Heno6LVq0kO87I9A0jfT0dHQ63RWLEYirq1Uy99dffxk7DqHTqdq5HyfBzs8gcmLt12vt0gVWr5Z+c0IIYSLW1ta0atWK06dPc+LECXOH02jodDpatWqFtbW1uUOxKLVuZhUm0Pke+P0ltRrEsT+g/eDanUcGQQghhMk5OzvTrl07SkpKzB1Ko2FrayuJXC1IMteQ2DlB2IOwdb4aCFHXZC4uDvT62tfwCSGEuCpra2tJPoTZybd8Q9PzUfV49Hc4X/kSatfUrh3Y20NeHkj1vxBCCNGoSTLX0DRvA21uAjTY+XntzmFjAx07qufS1CqEEEI0apLMNUSG9Vq/hpKC2p1D+s0JIYQQ1wVJ5hqi9kPAzR8KLsCBH2p3DknmhBBCiOuCJHMNUfl6rQDbF9XuHJLMCSGEENcFSeYaqm4X12s9u1ut2VpTnTurxyNHoKjIuLEJIYQQosGQZK6hauIBne5Sz7fXYr1WX19o2hTKyuDgQaOGJoQQQoiGQ5K5hqx8IETc/yAvo2bH6nTS1CqEEEJcBySZa8ha9YCWoVBWBLFLan58167qcd8+48YlhBBCiAZDkrmGTKeDno+r5zs+A31ZzY4PC1OPsbHGjEoIIYQQDYgkcw1d57vBoSlknlTrtdZEaKh63LsXNM3ooQkhhBDC/CSZa+jsnCD8QfW8ptOUdO6s1mVNT4eUFOPHJoQQQgizk2TOEvR4RD0e+wPOJ1T/OEdHaN9ePZemViGEEKJRkmTOEjRvA20HUav1Wsv7ze3da+yohBBCCNEASDJnKcoHQuxZUrP1Wi/vNyeEEEKIRkeSOUvR7mZoenG91rj/Vf+48mROmlmFEEKIRkmSOUthZX2p79z2RdUfnVrezHrkCBTUoEZPCCGEEBZBkjlLEj4arO0hObb667V6e0OLFqDXQ1ycScMTQgghRP2TZM6SNGkOncvXa63mNCU6nTS1CiGEEI2YJHOWpnwgxIHvIe9c9Y6REa1CCCFEoyXJnKVp1R18wqGsGPZ8Xb1jZESrEEII0WhJMmeJDOu1fl699VovT+b0etPFJYQQQoh6J8mcJep8Fzi6Q1YSHP392uWDg8HODnJy4MQJk4cnhBBCiPojyZwlsnWs2XqttrbQqZN6Lk2tQgghRKNi1mRuw4YNDBs2DB8fH3Q6HatWrbpq+e+//56bb76ZFi1a4OrqSmRkJL/99lv9BNvQ9HgU0MHxaMg4fu3yMqJVCCGEaJTMmszl5eURGhrK/Pnzq1V+w4YN3Hzzzfzyyy/s2rWLG2+8kWHDhrFnzx4TR9oANQtUq0IA7Pjs2uVlRKsQQgjRKNmY8+JDhw5l6NCh1S4/b968Cq/ffPNNVq9ezU8//UR4eHilxxQVFVFUVGR4nZOTU6tYG6Sej6s+c3uWwL/+C3ZNqi4rI1qFEEKIRsmi+8zp9XpycnJo1qxZlWWioqJwc3MzbCEhIfUYoYm1HQTuAVCUBftXXL1seTJ34gRkZpo4MCGEEKJhmD9/PgEBATg4OBAREcH27durLHvgwAHuvvtuAgIC0Ol0V1Qi1eac9cGik7l33nmH3Nxc7rvvvirLTJ8+naysLMMWHx9fjxGamJUV9HxMPd/+6dXXa3V3B39/9XzfPtPHJoQQQpjZ8uXLmTp1KrNmzWL37t2EhoYyZMgQ0tLSKi2fn59PUFAQs2fPxtvb2yjnrA8Wm8wtXbqUV155he+++w5PT88qy9nb2+Pq6mrYXFxc6jHKehA2CmwcIHU/nNp29bLS1CqEEOI68u677/L4448zduxYQkJCWLhwIU5OTnz++eeVlu/Zsydvv/02999/P/b29kY5Z32wyGRu2bJlPPbYY3z33XcMGjTI3OGYl1Mz6HKPen6taUpkRKsQQggLl5OTQ3Z2tmG7vF/85YqLi9m1a1eFPMHKyopBgwaxZcuWWl3bFOc0BotL5r799lvGjh3Lt99+y2233WbucBqG8hUh4ldD7lWqeWVEqxBCCAsXEhJSoS98VFRUpeXOnTtHWVkZXl5eFfZ7eXmRkpJSq2ub4pzGYNbRrLm5uRw7dszwOjExkdjYWJo1a4a/vz/Tp0/nzJkzfPXVV4BqWh0zZgzvv/8+ERERhhvn6OiIm5ubWT5Dg+ATBq16wukdsOtLGPBc5eXKa+bi4qCkRE0mLIQQQliQ+Ph4fH19Da+rag69npi1Zm7nzp2Eh4cbphWZOnUq4eHhzJw5E4Dk5GSSkpIM5T/55BNKS0uZMGECLVu2NGyTJ082S/wNSnnt3M7Poay08jJBQeDqCkVFcPBg/cUmhBBCGImLi0uFvvBVJXMeHh5YW1uTmppaYX9qamqVgxuuxRTnNAazJnMDBw5E07QrtsWLFwOwePFiYmJiDOVjYmKuWv661mk4OHlAzlk4/EvlZaysoHw+vl276i00IYQQor7Z2dnRvXt3oqOjDfv0ej3R0dFERkY2mHMag8X1mRNVsLGH7mPU8+2fVF2ue3f1KMmcEEKIRm7q1KksWrSIL7/8koMHDzJ+/Hjy8vIYO3YsAKNHj2b69OmG8sXFxcTGxhIbG0txcTFnzpwhNja2Qpewa53THMzaZ04YWfexsPE9OPE3pB0Cz+BKylxM5nbvrt/YhBBCiHo2YsQI0tPTmTlzJikpKYSFhbF27VrDAIakpCSsrC7Va509e7bCilLvvPMO77zzDgMGDDC0FF7rnOag07SrzTTb+Jw+fRo/Pz9OnTpFq1atzB2O8S0bBYfWqD50t71z5fuHD0NwMDg6QnY22Eg+L4QQouFr9N/fdSDNrI1Nr4sDIfZ+C4XZV77frh04O0NBARw6VL+xCSGEEMLoJJlrbAIHgEd7KM6FfcuvfF8GQQghhBCNiiRzjY1Od2maku2LKl+vVfrNCSGEEI2GJHONUej9YOcM5w5D4oYr3+/WTT1KzZwQQghh8SSZa4wcXFVCB7CjkvVay2vm9uyBsrL6i0sIIYQQRifJXGPV8zH1eOgXyDpd8b0OHcDJCfLz4ciR+o9NCCGEEEYjyVxj5dkRAvqDVqaW+LqctTWEhann0tQqhBBCWDRJ5hqz8mlKdn0JpUUV35OVIIQQQohGQZK5xqzDbeDqC/nn4MCqiu/JiFYhhBCiUZBkrjGztoEeF9eK++d6reUjWvfsAb2+fuMSQgghhNFIMtfYdXsYrO3gzE44c1mTaseOakmvnBw4etRs4QkhhBCibiSZa+ycW0CnO9Xz7Z9e2m9jA6Gh6rn0mxNCCCEsliRz14NeT6jHuP9B3rlL+8ubWqXfnBBCCGGxJJm7Hvh2B59wKCuC3V9d2i8jWoUQQgiLJ8nc9UCnu1Q7t/NzKCtVzy8f0SqDIIQQQgiLJMnc9aLTXeDYDLJOwZG1al9ICNjbQ3Y2JCSYNz4hhBBC1Iokc9cLWwfoPkY93/5/F/fZQteu6rk0tQohhBAWSZK560mPR0BnBYkbIO2Q2lfe1Lpzp/niEkIIIUStSTJ3PWnqDx1uVc93LFKPvXqpx23bzBOTEEIIIepEkrnrTflAiNhvoTALIiLU6127oLTUfHEJIYQQolYkmbveBN4ALYKhJA9il0JwMLi6Qn4+xMWZOzohhBBC1JAkc9cbnQ56Pa6eb/9HU+vWreaJSQghhBC1Jsnc9ajr/WDvCuePw/E/LzW1Sr85IYQQwuJIMnc9sneGsFHq+fb/k2ROCCGEsGCSzF2vyptaj66Ddl7q+cGDkJlptpCEEEIIUXOSzF2vmreBtjcDGpxYBYGBav+OHeaMSgghhBA1JMnc9ax8mpI9S6DHxcmDpalVCCGEsCiSzF3P2g6CZkFQlAV+NmqfJHNCCCGERZFk7npmZQU9L/ad0+1Tj1u3gqaZLyYhhBBC1IhZk7kNGzYwbNgwfHx80Ol0rFq16prHxMTE0K1bN+zt7Wnbti2LFy82eZyNWvgosG0CDqfA1gbOnYPERHNHJYQQQohqMmsyl5eXR2hoKPPnz69W+cTERG677TZuvPFGYmNjmTJlCo899hi//fabiSNtxBzcIOwBsNGBv5vaJ02tQgghhMWwMefFhw4dytChQ6tdfuHChQQGBjJ37lwAOnbsyMaNG3nvvfcYMmSIqcJs/Ho9ATsWQfMcOI5qah050txRCSGEEKIaLKrP3JYtWxg0aFCFfUOGDGHLli1VHlNUVER2drZhy8nJMXWYlqdFe2jzL2hlrV5LzZwQQghhMSwqmUtJScHLy6vCPi8vL7KzsykoKKj0mKioKNzc3AxbSEhIfYRqeSLGge/FZG7PHigqMm88QgghhKgWi0rmamP69OlkZWUZtvj4eHOH1DC1vRmCgsBJB8XFEBtr7oiEEEIIUQ0Wlcx5e3uTmppaYV9qaiqurq44OjpWeoy9vT2urq6GzcXFpT5CtTxWVhDx5KXaua1bzRuPEEIIIarFopK5yMhIoqOjK+xbt24dkZGRZoqokQkfBf4O6vmfP5k3FiGEEEJUi1mTudzcXGJjY4m92KSXmJhIbGwsSUlJgGoiHT16tKH8uHHjSEhI4Pnnn+fQoUN8/PHHfPfddzz99NPmCL/xcXCDARdHBW+VQRBCCCGEJTBrMrdz507Cw8MJDw8HYOrUqYSHhzNz5kwAkpOTDYkdQGBgID///DPr1q0jNDSUuXPn8umnn8q0JMY0cpp6TMuFg9vNG4sQQgghrkmnadfX2k2nT5/Gz8+PU6dO0apVK3OH0zAFuUNiJky9DeauMXc0QgghhHx/X4VF9ZkT9eT2Yerxtz+hKNe8sQghhBB1MH/+fAICAnBwcCAiIoLt26/e6rRixQqCg4NxcHCgS5cu/PLLLxXef/jhh9HpdBW2W265xZQf4ZokmRNXenCiejxaADu+Mm8sQgghRC0tX76cqVOnMmvWLHbv3k1oaChDhgwhLS2t0vKbN29m5MiRPProo+zZs4fhw4czfPhw4uLiKpS75ZZbSE5ONmzffvttfXycKkkzq7iSXg+e7pCRDU+1hQ8Pq6lLhBBCCDMp//6Oj4/H19fXsN/e3h57e/tKj4mIiKBnz5589NFHAOj1evz8/Jg0aRLTpk27ovyIESPIy8tjzZpLXYx69+5NWFgYCxcuBFTNXGZmJqtWrTLip6sb+YYWV7KygmHD1fOdSXA8+qrFhRBCiPoSEhJSYWWnqKioSssVFxeza9euCsuAWllZMWjQoCqXAa3usqExMTF4enrSoUMHxo8fT0ZGRh0/Vd3YmPXqouG6405Y/BUcLYEtH0O7m80dkRBCCFFpzVxlzp07R1lZWaXLgB46dKjSY6paNjQlJcXw+pZbbuGuu+4iMDCQ48eP8+KLLzJ06FC2bNmCtbV1bT9WnUgyJyo3aBDY2cGFYti+DoYegRbtzR2VEEKI65yLiwuurq5mu/79999veN6lSxe6du1KmzZtiImJ4aabbjJLTNLMKirn7AwDB6rnR0ph+/+ZNRwhhBCiJjw8PLC2tq50GVBvb+9Kj6lq2dCqygMEBQXh4eHBsWPH6h50LUkyJ6p2++3q8UgpxH4LBZlmDUcIIYSoLjs7O7p3715hGVC9Xk90dHSVy4DWZtnQ06dPk5GRQcuWLY0TeC1IMieqdttt6vFUGWTnwp6vzRuPEEIIUQNTp05l0aJFfPnllxw8eJDx48eTl5fH2LFjARg9ejTTp083lJ88eTJr165l7ty5HDp0iJdffpmdO3cycaKasis3N5fnnnuOrVu3cuLECaKjo7njjjto27atWVejkj5zompBQRASAvHxcLwUtn0CEePB2kQ/Njk5kJgISUnQoQO0a2ea6wghhLgujBgxgvT0dGbOnElKSgphYWGsXbvWMMghKSkJq8um3urTpw9Lly7lpZde4sUXX6Rdu3asWrWKzp07A2Btbc2+ffv48ssvyczMxMfHh8GDB/Paa69VORCjPsg8c+LqXngB3noLwpvAv63hvq8g5A7jnf/HH+GNN+DYMTh//tJ+a2uYOhVefhmcnIx3PSGEEBZJvr+rJs2s4urKm1qP6UGvqWlKjOWHH+Cuu2D79kuJXPPm0LEjlJXB229D167w55/Gu6YQQgjRyEgyJ66uTx9o2hRyCuCsDk5thTO76n7eNWtgxAiVtD34IOzbB1lZcO6catb96Sdo1QqOH4ebboJHH1XNsEIIIYSoQJI5cXU2NjB0qHqe1lo9bl1Yt3P+/jvcfTeUlMD998PixdClC1w+b9Dtt8OBAzBhAuh08PnncN99KvkTQgghhIEkc+LaRoxQj+uOwAU9HPgess/W7lwxMTB8OBQXw513wldfqf5xlXF1hY8+gr/+AkdHWLsWZs2q3XWFEEKIRkqSOXFt//433HgjFBbBekfQl8KOT2t+npMnVY1bQYHqi7dsGdjaXvu4AQPg04vXe+MNaECLGwshhBDmJsmcuDadTtWQ2djA3nQ4XAI7v4Di/Jqd5513IC8PIiNh5Uq1XFh1PfAATJmino8eDQcP1uzaQgghRCMlyZyonpAQNVUIwO+lkJ0B+5ZX//j0dPjsM/X89dfBwaHmMbz1lqqly8lRTbTZ2TU/hxBCCNHISDInqm/GDDXC9HwJbCyCrQugutMUfvSRal7t0UM12daGrS18952K4fBhGDOm+tcXQgghGilJ5kT1OTvDe++p55uL4chBOBZ99WNANa1+9JF6/vzzqtm2tjw94fvvVRPtqlWwenXtzyWEEEI0ApLMiZq5+24YPBhKgV8LYctH1z7ms8/UpMBt26pJguuqZ0949ln1/Pnn1chYIYQQ4jolyZyoGZ0OPvxQ1YwdK4WffofU+KrLl5TA3Lnq+bPPVj0NSU1Nm6Zq6Y4ehYV1nPdOCCGEsGAmWjFdNGrt26tk6tVXVe3cH3Nh1GeVl12+HJKSVOI1ZozxYnBxUdcfNw5eeQUeegjc3Y13fmNITVW1hn5+5o7EuHJSIHED5J2D4jwoyVOPOito0QG8OoNnR7B3MXekQghxXdBp2vXVg1wW6jWSoiLoHAzHTkA3e4g5CS5eFctoGoSGwv79an64F180bgylper88fHwzDNq6hNz0jTYu1ctRfbjj7Bzp9ofFKSWJBs0SA3+aNHCvHHWlL4MzuyGo7/B0d8heW/1jmvqD4EDIPR+8O8DVtIQIISoPfn+rpokc6L2Nm6E/v3V83cegWf+UTv3669w661q4ERSkmlqzsqvYWen5p4LCqq67KlTahUJUDWFnp4qsfLxASenusXx008waZKaGLmcTqcSmMuXINPp1BJlc+fWbJ49c9A0OPwLrJsJGccue0MHPuHQLBDsmoCdM9g6QWkhpB2EtHjISa54Ljd/6HqfSuw82tXrxxBCNA7y/V01SeZE3dw/FJavheY2kJAKrs3U/lWrYPx4SEkxba2ZpsGQIbBunVq7dfk/5r47fVpNUPzdd7BlS+XnsLVVAzvGjYMbbqj5aNtvvlFNyGVlatmxwYPVqhm33aaSxA0bIDoa/vhD1VKCmjh5xQrw9a35Z64PZ2Ph95fgxN/qtb0rtL0J2g2GtjeD8zVqF/PPw9k9cOAHiF8NRZfNCdjpTvjXDGjexmThCyEaH/n+rpokc6JuzmdAkDdklcLDt0HUp6qGauVK9X5wMKxfr2rBTGXfPggLU4ndgw9CZiakpak+a/+sKevbF5o2Ve+np6vHvLxLZYKDVVL38MPg5nbta3/yiSqvaSqhW7BAJXRV+fnnSzF6eakk84YbavWxTSL/vEriYpcCGljbQ+QE6Pc0OLjW7pwlBaqGb+8yOLpOndfKBrqNhgEvgIu3MT9B/dKXqVrL1DgozFa1lHZN1ObgCi06gm0tJsgWQlxBvr+rJsmcqLs5T8K0T9TYaNemKlGxtlbThsycWbvVHmrqsccurTDxT/36qVq7u+9WTar/tHs3/N//qRq28sTO21ud79Zbq77me+9dWhXjqafUKN/q9As7flytYLF/v7pPc+fC5MnXPs7Uzh2DpffC+QT1usu9cNNM1ffNWFLiIPpV1f8OVPNsv6fVZl2NdXrNTdMgcT3E/Q9S9qtm5dLCqsvbOIBfBAQNgMCB4BMGVkYa0d2Q5J9X98HaTiXq1nZgY984P6swG/n+rpokc6LuCrOhhzccKFCvu3VTiVBYWP3FkJWlkisbG1Xj5empHgMD1WN1ZGerhO6999SUJwBPPKGSLWfnS+XOnIEPPlDLi4FKWmfPrlnzbF6eOvfSper1p5/Co49W/3hjO7EJlo+Cggvg5gf3fAF+PU17vT9mwekd6rVPONz5CbRob7pr1kVJIcStVKuepMZVfM+2CXiFgJPHpZG9xXmQlw75GRXLNmkBvZ6AHo9Ck+b1F78x6cvUIJjTO+H0dji1HTJPXlnOyhZ8u4F/JLTuC369wLFpvYcrjETT1O+H7DOqBtrVF2zqt9+vfH9XTZI5YRzLp8AbH0PHQFgSp/qhWaqCAvjvfy+tdhEUBHPmqAEWq1fDrl2Xyr72mipbm1UtNE3VXL7+Otjbw99/qwmR61vst/DjJNCXgG93uP/bK0cmm4KmqRqun5+BwkxVi3Xza9DzsYYz8rWsBDa9D9sWquQMVG1i6EgIvAG8u4B7YOXxahqcOwIJ61VtXuLfUJSl3rNxhLAHVBN2TfoOFuVC0haVUJaVgv7ippWBS0uVFHt1Brs6DuipTGkx7P0W/p5bRfJmo2Kpkk4ldb3HQYdbzVtrV1qkktDUA1BWfOk+6kvB2UsloZ6dTJusFFyAohxo4nllU3x54nQ+UT06t1D/vk4el37WCjLhwgm15aVDEw9w8QFXH9V1oa413RdOqK4RSVsh67TaSgsuK6BTMTX1g2ZtoMMtqj+tKX72LpLv76pJMieMI/ssfNBN/We/72sI+be5I6q7v/5SfeeSkiru1+mgd281wOOhh+p2Db1erYqxerWaj27XrvqbukRfBn+9CX9fHJzS8d9w5/+Z9JdxpbLPwqqnIOEv9TroRhVHfSSUV3M+Af73GJy5mLy7+qpate5jwLEWI7PLStRgkM0fXDa9iw68OoF3V2gZCi27gnuA6mdYnAcl+VCYpWrBEterWK6aMAE6azXPn2836HyPSjrrsoReSSHs+VoltVmn1D57V1XT1qqXqsH17Q4OburnWV+qEqTcVJUIJG2Gk5svNd+Darrv9SSEP1j92rqCC5AQo5YQPJ+gmnVLi9RjWQm4t1b30Pvy+5h/qaa0IBNObVPnOLn5H4lJJaztwbuz+vfRNHWdkgK12diDs6dKxJw9waEpZJ9WcZ1PVI/FeSoxdPECZ29waq7uyYVEVaYw89K1HJqqxMi5hfqcF05WHDRUzspGnbM4V/1cVEmn5nwMvh06DlP3pTo/A8V5EP8jxH5zafDTPzk1V+Uq615g2wTaD4FOw02S2Mn3d9UkmRPG8+cbsOEtVVMxYXu9V8GbRFaWWrnil1+gRw81SvX226vfdFvda/TqBUeOqPno1q5VzcWmlJkE3z+hanlA9Vn710zz1Yjp9bDjU1g3Q31JuLaCB5apmi9z2LcC1jwNxTkqSblltupDaIx+fZoGJzbC5g8v9R2siaatVSJl66S+3K1s1ITNFxLVfIB5aRXLN28L3R+G0Aeq37RbUqhiPPIrHPxJJSGgkpK+/1Hns2tSs7gzT8GuL2DnF1BwXu2zcVQJk2dH8AyBFsEquSvIVMlOYZZK9hNiVJO8pq/ZNa+miae6j3bOYF1+H60v3cfLky1TsbJVNeJVcWmpkqe8dMhNA/7xdd3EUyWtzp5qEu+cs5CdfOU53fwh+FZV1qGp+pl2cFPJbtpBSD+kphRKO3RZkqtTfwh0ulPVHru1UjV/tg7qZzgvXf2bZp2CMzvhwGrIuuwPXzsXeOagUScPl+/vqkkyJ4ynKBc+7KZ+8Q95UzUhieqJj1cJXV6e6oM3Z47prrV/JayZqpr87Fzg9nfVHHANQfphWDYKMo6qv/LvXgTBt9Xf9Yty4JfnYe/Fvoz+kXDXItWUZArZZ9UULsn7IGWfesw5qz67nZNKmGybqFqWoAHqy9U9oOrzadqlcx77Q/1bF+eo96zt1CTOHu2gWZDamrZW7+emqyQwN03V/h3/S/X/K+fqqxL+8IfqPjq3pAD2faf6H6YfrNmxLYKh7SDVnGzXRNWQ2TioZPbcEXX/kveqZuiSfHWMlS3YO6ukzbOjqvkNGqieV1VbpWmqdu3sHjh3VCXxto5qs3FUCU9uuvpdl5emkk+XluqeNm+jHu2aqPdz09SqKfnnVDNps0D1vnuASsgLM9X7OSmqvENT9Z57a3W9cmUll85l66jeryyh1utVopW4AQ7+qH4Oyu9FdbgHQNgoNSdkTQY/aRqc3a2mIzqwWv2fGftL9Y+vBvn+rlqDSObmz5/P22+/TUpKCqGhoXz44Yf06tWryvLz5s1jwYIFJCUl4eHhwT333ENUVBQO1Rg1KT8MJrb7K9X/yqEp/GcPODUzd0T1I/+8qsnISbn4pZiqftnrrNQvRPfWFx8D1BdSZf2FVq6Ee+9Vz7/5Bh54wLgxFmbBry+ofk8ArXqqRKVZoHGvU1cFF2DFw6o2Bh0Mehn6Tq5bU+G16PXqvkS/Crkp6t/thufhhudUrU190jTjfdaiXDVwY+fn1V+5o5yLj2oy6zBUJUDGrmnXtIo1QmnxqpaoJF/9/nBsqh6dmqkatDY3VT+p1pepn3c758bRQlAXxflw/E/1/yk/QyWPBZnq/ljbqT8UPEPAM1hNpdO8bd1r6Mv7/Bn59798f1fN7Mnc8uXLGT16NAsXLiQiIoJ58+axYsUKDh8+jGclc5MtXbqURx55hM8//5w+ffpw5MgRHn74Ye6//37efffda15PfhhMTF8G/3eD+ss4YjwMnW3uiEyn4AIc+ln9JZoQc+2+TOWaeELH2yHkDmjdr2Ky8MILapSslRXMn6/msKurshLVtBUTpZq3dFYqSbnh+fpPVKqrrEQlnjsvTjfT5V4Y/Lpp5qQ7uRnWTofkWPW6aWsY/jEE9DP+tcypfATq+QS1ZRxXndodXNUo2/I+YM2CoN3N1e9nJUQ9ke/vqpk9mYuIiKBnz5589NFHAOj1evz8/Jg0aRLTpk27ovzEiRM5ePAg0dHRhn3PPPMM27ZtY+PGjVeULyoqoqioyPD6zJkzhISEyA+DKR3/C74ervqgTNje+Gb6P58A62bB4V8r9k1p0RE82qoOys5e6gtSX6r6p2WeVJ2aM45favYCcGymOgv3+Y+qISsrUwMrFi1S77/0Erz6au1Hy/5zOS6P9jDsA2gdWeuPX6+2fQJrX1B9pWydVNN9n//UfgLjcpoGJzeppr5Da9Q+OxcY8BxEjFPNd0KIBkWSuaqZ9c/y4uJidu3axfTp0w37rKysGDRoEFuqWHqpT58+LFmyhO3bt9OrVy8SEhL45ZdfeKiKUYVRUVG88sorJolfVKHNjWrZp6O/q0Ti/m/MHZFxlBTCpnnw97tQdvEPBM9OqoNwp+HVW3O0tBhObFCjGg/9rJo9dn6umqfDRsENz6oJjFu1glmz1LQlZ86ofdWd7qU4X/WV2fkFnNqq9jl5wI3TodvDDbc2rjIRT6gaot//qzrAb3hb3a8bnlNTezhUY5WOy+WmqdUtdn8F54+rfTor6DYGbvzvtZcpE0KIBsisNXNnz57F19eXzZs3Exl5qabg+eefZ/369Wzbtq3S4z744AOeffZZNE2jtLSUcePGsWDBgkrLSs2cmaQdggV91PxXo/4H7QaZO6K6OfoH/PKsGukGqgP14DfUSLzaKitVw/83fwjHL9Y0W9mqZa66jYY121UtnV4PAweqNWh9fVWi5+sLbdqoFSRAlTmzE/YsgbjvL+v0bg+RT0G/qXWvzTInTVOjKqNfuVTLqLNWU2IEDVSbT5j6vFbWqibz8k7sZ/eoEYqnt19qDrdzhs53q5o4rxAzfTAhRHVJzVzVLOhPdCUmJoY333yTjz/+mIiICI4dO8bkyZN57bXXmDFjxhXl7e3tsbe/1GSSnV3J3D3C+DyD1Zxc2xbAqnEwfrPqk2Np9GXwy3OX+m65tFQjdTvdWff+RNY2qhazzY1qPq6/3lRzie38TG32rvB0b/hoB8TEqO1yLT3gjjDoagWZ8RXnpWraWs3hFTYK3HzrFmdDoNOpuQs73KrmPNvykUrqTm9X24a3Kpa3slXHlBVfeS7fHmquuE53qVGOQghh4cxaM1dcXIyTkxMrV65k+PDhhv1jxowhMzOT1atXX3FM//796d27N2+//bZh35IlS3jiiSfIzc3F6hqjcCSzr0clBbDoJkg7AG3+pWroGsrM/tVRWgTfP66aRNGp/loDpxl13qQrnNikEpUTGy8lZ2llsL8EcjTI1qvHLD2Ud9dzAHraQV836HmnSuJa97Wse10bmUlqdYWEmIsj9c5dWcbaXs1V5xOuJtFt1Uv1axRCWBz5/q6aWWvm7Ozs6N69O9HR0YZkTq/XEx0dzcSJEys9Jj8//4qEzfpiU1MDmGVFXM7WEe75HD4ZqIbGb/lITThqCYpyYNkDaq4mazu4+1M1+tTUAvqqTV+mFnI/uVl11A85qpqs9WVqMEBxKcQB0clwNhP+LoadufBeNzUK83oYhdjUH7o9pDZNU/9m+lIoKVJLr8UfhL7/gg4dzR2pEEKYlNmbWadOncqYMWPo0aMHvXr1Yt68eeTl5TF27FgARo8eja+vL1FRUQAMGzaMd999l/DwcEMz64wZMxg2bJghqRMNiGewmp7kp8mqv1NAX9XPqSHLTYdv7lFTVdg5w/1L1YSt9cnKWvUB8wlTfd6qUlYGq1apSYZ37FBTmWzaBAsWQJNrzNCvaXD8uCrXsqURgzeDuDhYuhS2bYOdOyHnYp9BKyu1XNrzz5tn3VshhKgHZk/mRowYQXp6OjNnziQlJYWwsDDWrl2L18XlkpKSkirUxL300kvodDpeeuklzpw5Q4sWLRg2bBhvvPGGuT6CuJZuY1TNXPxqWPkoPLmh4XbGTz8C396vRjo6NYdRK1XzXENlbQ13360SlrffhunT4euvYc8eNQlxhw6Xyp4/D/v3w5YtsHmzejx3TiU8DzwAL74IHU1Ui3XyJHzwAaxfD66u4Omp1qBt0UItYda3b+3P/ccfMGwYFF62VmSTJmqAyL596j6sXAkDBsBzz8HQoY2/CVoIcV0x+zxz9U3a3M2k4AIs7K/W8Qu5A+75ovJVEMwpfrVa8L04F9z84KFVlte/av16GDECUlPBxUUlecePw6FDKnH7Jzs7KL44SECng3vuUXPbde1a+fn1evj9d5Uwnj4NFy5c2qysoH9/lZzddBN06QLbt8O778L//qeOrcozz8Cbb6p4amLdOrVebmGhStZGjYKICAgJUevb7t8P77yjau1KL45i7dABJk+G0aOvXXsphGgw5Pu7apLMifqTtA0W36r6NXUdAcMXNIyErqwUol9WU4SAWpXh3i8sc/QtQHIy3H8/bNhw5Xt+firZ6dNHbWFhqony9ddVc2258HC45RY1HUpkpEqWvvwSPvwQjh6tXhwuLpeaOwEGDYJHHrm4jFO62g4dUokeQLdu8O230L599c7/++9wxx0qtmHDYMUKsK9ist9Tp+D999VkzOUj2t3d4ckn1RJqISFQjeUAK9A0OHYMNm5UNZ0uLvDYY+pcQgijk+/vqkkyJ+pX/GpY+cjFhO5+tWySORO63DQVz4m/1es+k+Cmly1rYt3KlJbCp5+qxC44WG3t21+9JmrfPlU79t13KlEp53xx+o7cXPXo6goPP6ySQXd3aNZMPWZnw59/QnS0SiTz8lRN26hR8PTTqqauMqtXqyTv/HkV30cfwZgxVx/EUZNE7nI5OfDFFyqxS0i4tN/KCtq1UzWS3bqpz+ddydJhmqau/cknKolLS7uyzE03waRJcPvtl+YBrAu9XpqFhUC+v69GkjlR/+JXw4qxanRm6Ei4Y379J3SaBnuXwW8vqvVK7ZxVHJ2G128cDVFqqmq+XLtWJS7p6Wp/cDBMnKiaJ12uMT1LcbFq4vTzU/3jruXMGXjoIfjrL/X6zTdV/7/KrF+vag3LE7mVK2vePFtWBmvWqJU1tm+HjIyK7zs4wOOPqz52fhcXd4+JUU3QmzZdKmdnB716qcT2yBH48cdLzcmtW6vP8Oijqsm3OjIy1Ofbv//SduyYqkF9+WWVIF4PI5WFqIR8f1dNkjlhHhUSugfgjo/qL6E7nwhrnoaEi4mDV2c1hUqLDlc/7nqk10NsrErOIiJMm0iUlanm3pdfVjVRv/+uarkud/Ik9Oih+v/VNpH7J02DlJRLydPKlbD14jJotrYqeT1xQtU4gkr0xo1T/Qu7d6/YPHvypBpJvGiRqmkE1UcvKgqGD6/8/mmaqsn85BN17fI+jJXp1Qteew1uvrnm/xbZ2erfs2nTmh0nRAMh399Vk2ROmM+BVaqJUytTk7kO/7h665vWVkkhbP8/+CsKSgvUhLIDX1ALt1tXc91TYXqPPgqff65q9HbvVkuXAeTnq1GvsbGqKXTjRnB0NP71NU3VEL72WsVVN2xt4Ykn1KhfH5+rn6OgQCV0r712aeBJnz6q+dXKStUqFhWpZtolS1TfwXIhIWoalS5d1BYQoO7Hhx+qewBqoMkXX6gRu5UpLVUJ4s6dsGuXuo/HLi6D5umpRi137KiOLyhQta/nzqlHOzt1/d69VfLYrFlt7uIler26RmEhuLlVv5ZSiH+Q7++qSTInzOvgT2oEaVE22DjAv2ZA7/HGraUrzlOLzm/+EHJT1L6A/jDsfWhexZehMJ+CAjXoYu9e6NdP9cOzsVF97779Vk1nsnMn+PubPpZNm2DhQpWEPPecajqtiexsNWXM3Lnqc1WlSRM1PcyTT6ravsqkpqr5BD/+WCWCzZqpmrwbb6xYLiFBnauKta1rrEMHVTs5efK1R//q9aqJ/pNPVEKcl1exprFpU7jtNjUC+ZZbVP/LukhLU59z3z6V9PfooboDSMJoOjk56o+DHTsubVlZ8OCDMGUKBAaa7NLy/V01SeaE+WWdhh8nqbnoAPx6q0TLM7hu5y24ADs+g60fQ/7FPlGuvnDji2rNUul71HAdO6aSmuxsNW2Jt7dKpmxs1LxyA+p5Eue6OntW9QPctUs1y9rbq0dHRxg4UCVf1+qHWO7UKdXEu327uh8ffADjx6v3liyBp55SX7iurmo0cvfuqiYzPFxd99AhtR08CImJ6roeHipJ9vBQX8zbtqnt8pHL3t4wa5aqObX9R0326dNqtPOiRaqpuTpsbVXtn7W1GlxTvrm5qVjDw1XcnTpBZqb63KdOqWvFxamm8BMnrjyvk5M6NjJS3dewMPm/fi05OeoPpAMHoHNnVfP7z8E7hw+rP0q++kr9MVEZKys17+Uzz6huGUYm399Vk2RONAyaBru/hN/+q+Z5A/CPhND71aL2Dm7VO09OChz6GQ6tUUtx6S/OLeYeCP2eVgMubOrYx0rUjx9+UPPkgfoy1jQ10nXCBPPG1RAUFqppUL75Rr0eN04lQkuWqNf9+qnnNa1J/KeMDPj5Z9WPMTFR7WvXTl371Cn15R8Xd2mQDKjat9Gj1YAWLy+VsDo6qubb7dvV6OXVq9WAkbrS6VRzcXi4SvJ27bo06rpc165qdPSoUaqJOTf30tQ42dkqLnv7S5urKzRvXvsm/PPn4bffVILUr5+K72rJpKappHTLFlXjFRgId9557ab86tLr1b9jaqp6PH/+0nb4sEraDxyoOILdy0v937vnHvVHxzvvqKmLysv4+amm+J49VW1oaSnMm6c+d7m+fdW/c/Pmxvkc1P77e/78+bz99tukpKQQGhrKhx9+SK9evaosv2LFCmbMmMGJEydo164dc+bM4dZbbzW8r2kas2bNYtGiRWRmZtK3b18WLFhAu3Ym7CZ0DZLMiYYlMwl+nQZHflVrkIJqfu0wFDxDwMUbXFqqTV8KFxLhfIIa1JAWD2d2A5f/UuoMfSdDp7ssf7qR69Gzz6raAFDTl3z6qdSylNM01ez64ouXvmStrVXt2fTpxm1qLC5WTaevvloxcbtc376qmfiee6qXCB0+rGrXHBzU9DfOzqoZNzVVrWCye7faTp5UtW1+fmpr1QratlU1Pz17qpq8cnq9ShJ37FCjlVetutTMa22tagMvXynkahwdVSLi4aESrLZt1damjUoKra0vbXl5asDOTz+ppvnLJ8hu0ULVJPfvrz5rTs6l7cQJNUdhSkrFa+t0qmbxnntUQnjihKpJLd/y89W/r62terSxUbVil285Oeq8aWlqcNG1+PurWtCtW9Uk4JX597/V0nhVrdiyf7+aJPybb1QSGxtr1P+vtfn+Xr58OaNHj2bhwoVEREQwb948VqxYweHDh/GsZKT95s2bueGGG4iKiuL2229n6dKlzJkzh927d9O5c2cA5syZQ1RUFF9++SWBgYHMmDGD/fv3Ex8fj0NN56s0EknmRMOUfRb2fQd7v4X0Q9cufznfHtDxdggeZnkrOIiKSkrUdCjFxWqUqJl+UTZoP/2k+is1a6a+RPv0Md21cnLUHH27dqkaupAQlQB07HhpPkJjKyxUNWa1SQouXIDly2Hx4op9CB0dVZLl5qZ+xoqK1FZYqGrrylcLqa3OndX5t269el/JcjY2qkm5e3eVAG3ZUrfrV8bDQyWnzZurn5VmzVRi3KuXSozL51UsKVH9VFesULXjOTmqlvXZZ6u/3N/ZsyqR7GbcpRDLv7/j4+PxLR8YBdjb22NfxTyTERER9OzZk48++ggAvV6Pn58fkyZNYtq0aVeUHzFiBHl5eaxZs8awr3fv3oSFhbFw4UI0TcPHx4dnnnmGZ599FoCsrCy8vLxYvHgx999/vzE/crVJMicaNk2Ds3vgyG+QfQZyUyEnGbKT1S/3ZkGqCbVZoHoe0A9cjdQ8IYSlyM9XCY8xJilurE6dUjVULVpcfSCHpqmELiPjUvNkQoJaFu/YMbVlZqpzlW/lNWm33662gAB1rqIiVUu4fr1K7KysVB/F8s3TU/Ub7N69Ym3m6dMqkVq5UjWBtm17aQRyx45qku6SEpV0lj/q9Sp2vV7F1KQJtGypkrQWLa7s51gdpaXqXNWZkLselH9//9OsWbN4+eWXr9hfXFyMk5MTK1euZPjw4Yb9Y8aMITMzk9WrV19xjL+/P1OnTmXKlCkVzr9q1Sr27t1LQkICbdq0Yc+ePYSFhRnKDBgwgLCwMN5///26fMRak3Yn0bDpdGqh+4a82L0Q5ubkZO4IGr5KkoBK6XSqxs7NDYKC6nZNe3vVTNqvX82Oa9VKTWMzaVLdrl9X5U24DUxlNXOVOXfuHGVlZXh5eVXY7+XlxaFDlbf4pKSkVFo+5WJTePnj1cqYQ8P7VxJCCCGEqIKLiwuudZ3WppGRBf+EEEII0eh4eHhgbW1Nampqhf2pqal4V7b2MuDt7X3V8uWPNTlnfZBkTgghhBCNjp2dHd27dye6fCk+1ACI6OhoIiMjKz0mMjKyQnmAdevWGcoHBgbi7e1doUx2djbbtm2r8pz1QZpZhRBCCNEoTZ06lTFjxtCjRw969erFvHnzyMvLY+zYsQCMHj0aX19foqKiAJg8eTIDBgxg7ty53HbbbSxbtoydO3fyySefAKDT6ZgyZQqvv/467dq1M0xN4uPjU2GQRX2TZE4IIYQQjdKIESNIT09n5syZpKSkEBYWxtq1aw0DGJKSkrCyutRI2adPH5YuXcpLL73Eiy++SLt27Vi1apVhjjmA559/nry8PJ544gkyMzPp168fa9euNdsccyBTk5g7HCGEEEJUg3x/V036zAkhhBBCWDBJ5oQQQgghLJgkc0IIIYQQFkySOSGEEEIICybJnBBCCCGEBZNkTgghhBDCgkkyJ4QQQghhwSSZE0IIIYSwYNfdChB6vR6A5ORkM0cihBBCiOoq/94u/x4Xl1x3yVxqaioAvXr1MnMkQgghhKip1NRU/P39zR1Gg3LdLedVWlrKnj178PLyqrAemzHk5OQQEhJCfHw8Li4uRj23qEjudf2Re11/5F7XH7nX9cdY91qv15Oamkp4eDg2NtddXdRVXXfJnCllZ2fj5uZGVlYWrq6u5g6nUZN7XX/kXtcfudf1R+51/ZF7bXoyAEIIIYQQwoJJMieEEEIIYcEkmTMie3t7Zs2ahb29vblDafTkXtcfudf1R+51/ZF7XX/kXpue9JkTQgghhLBgUjMnhBBCCGHBJJkTQgghhLBgkswJIYQQQlgwSeaEEEIIISyYJHNGMn/+fAICAnBwcCAiIoLt27ebOySLFxUVRc+ePXFxccHT05Phw4dz+PDhCmUKCwuZMGECzZs3x9nZmbvvvtuwZJuovdmzZ6PT6ZgyZYphn9xr4zlz5gwPPvggzZs3x9HRkS5durBz507D+5qmMXPmTFq2bImjoyODBg3i6NGjZozYcpWVlTFjxgwCAwNxdHSkTZs2vPbaa1w+9k/ud+1s2LCBYcOG4ePjg06nY9WqVRXer859PX/+PKNGjcLV1ZWmTZvy6KOPkpubW4+fonGQZM4Ili9fztSpU5k1axa7d+8mNDSUIUOGkJaWZu7QLNr69euZMGECW7duZd26dZSUlDB48GDy8vIMZZ5++ml++uknVqxYwfr16zl79ix33XWXGaO2fDt27OD//u//6Nq1a4X9cq+N48KFC/Tt2xdbW1t+/fVX4uPjmTt3Lu7u7oYyb731Fh988AELFy5k27ZtNGnShCFDhlBYWGjGyC3TnDlzWLBgAR999BEHDx5kzpw5vPXWW3z44YeGMnK/aycvL4/Q0FDmz59f6fvVua+jRo3iwIEDrFu3jjVr1rBhwwaeeOKJ+voIjYcm6qxXr17ahAkTDK/Lyso0Hx8fLSoqyoxRNT5paWkaoK1fv17TNE3LzMzUbG1ttRUrVhjKHDx4UAO0LVu2mCtMi5aTk6O1a9dOW7dunTZgwABt8uTJmqbJvTamF154QevXr1+V7+v1es3b21t7++23DfsyMzM1e3t77dtvv62PEBuV2267TXvkkUcq7Lvrrru0UaNGaZom99tYAO2HH34wvK7OfY2Pj9cAbceOHYYyv/76q6bT6bQzZ87UW+yNgdTM1VFxcTG7du1i0KBBhn1WVlYMGjSILVu2mDGyxicrKwuAZs2aAbBr1y5KSkoq3Pvg4GD8/f3l3tfShAkTuO222yrcU5B7bUw//vgjPXr04N5778XT05Pw8HAWLVpkeD8xMZGUlJQK99rNzY2IiAi517XQp08foqOjOXLkCAB79+5l48aNDB06FJD7bSrVua9btmyhadOm9OjRw1Bm0KBBWFlZsW3btnqP2ZLZmDsAS3fu3DnKysrw8vKqsN/Ly4tDhw6ZKarGR6/XM2XKFPr27Uvnzp0BSElJwc7OjqZNm1Yo6+XlRUpKihmitGzLli1j9+7d7Nix44r35F4bT0JCAgsWLGDq1Km8+OKL7Nixg//85z/Y2dkxZswYw/2s7HeK3OuamzZtGtnZ2QQHB2NtbU1ZWRlvvPEGo0aNApD7bSLVua8pKSl4enpWeN/GxoZmzZrJva8hSeaERZgwYQJxcXFs3LjR3KE0SqdOnWLy5MmsW7cOBwcHc4fTqOn1enr06MGbb74JQHh4OHFxcSxcuJAxY8aYObrG57vvvuObb75h6dKldOrUidjYWKZMmYKPj4/cb9FoSDNrHXl4eGBtbX3FqL7U1FS8vb3NFFXjMnHiRNasWcNff/1Fq1atDPu9vb0pLi4mMzOzQnm59zW3a9cu0tLS6NatGzY2NtjY2LB+/Xo++OADbGxs8PLyknttJC1btiQkJKTCvo4dO5KUlARguJ/yO8U4nnvuOaZNm8b9999Ply5deOihh3j66aeJiooC5H6bSnXuq7e39xUDBUtLSzl//rzc+xqSZK6O7Ozs6N69O9HR0YZ9er2e6OhoIiMjzRiZ5dM0jYkTJ/LDDz/w559/EhgYWOH97t27Y2trW+HeHz58mKSkJLn3NXTTTTexf/9+YmNjDVuPHj0YNWqU4bnca+Po27fvFVPsHDlyhNatWwMQGBiIt7d3hXudnZ3Ntm3b5F7XQn5+PlZWFb/qrK2t0ev1gNxvU6nOfY2MjCQzM5Ndu3YZyvz555/o9XoiIiLqPWaLZu4RGI3BsmXLNHt7e23x4sVafHy89sQTT2hNmzbVUlJSzB2aRRs/frzm5uamxcTEaMnJyYYtPz/fUGbcuHGav7+/9ueff2o7d+7UIiMjtcjISDNG3XhcPppV0+ReG8v27ds1Gxsb7Y033tCOHj2qffPNN5qTk5O2ZMkSQ5nZs2drTZs21VavXq3t27dPu+OOO7TAwECtoKDAjJFbpjFjxmi+vr7amjVrtMTERO3777/XPDw8tOeff95QRu537eTk5Gh79uzR9uzZowHau+++q+3Zs0c7efKkpmnVu6+33HKLFh4erm3btk3buHGj1q5dO23kyJHm+kgWS5I5I/nwww81f39/zc7OTuvVq5e2detWc4dk8YBKty+++MJQpqCgQHvqqac0d3d3zcnJSbvzzju15ORk8wXdiPwzmZN7bTw//fST1rlzZ83e3l4LDg7WPvnkkwrv6/V6bcaMGZqXl5dmb2+v3XTTTdrhw4fNFK1ly87O1iZPnqz5+/trDg4OWlBQkPbf//5XKyoqMpSR+107f/31V6W/o8eMGaNpWvXua0ZGhjZy5EjN2dlZc3V11caOHavl5OSY4dNYNp2mXTYNthBCCCGEsCjSZ04IIYQQwoJJMieEEEIIYcEkmRNCCCGEsGCSzAkhhBBCWDBJ5oQQQgghLJgkc0IIIYQQFkySOSGEEEIICybJnBBCCCGEBZNkTgghhBDCgkkyJ4Qwi/T0dMaPH4+/vz/29vZ4e3szZMgQNm3aZCij0+lYtWqVWWKzs7MjLy+PkpISmjRpQlJSUr3HIYQQ1WFj7gCEENenu+++m+LiYr788kuCgoJITU0lOjqajIwMc4fGli1bCA0NpUmTJmzbto1mzZrh7+9v7rCEEKJSUjMnhKh3mZmZ/P3338yZM4cbb7yR1q1b06tXL6ZPn86///1vAAICAgC488470el0htcAq1evplu3bjg4OBAUFMQrr7xCaWmp4X2dTseCBQsYOnQojo6OBAUFsXLlymrHt3nzZvr27QvAxo0bDc+FEKIh0mmappk7CCHE9aW0tBR3d3cee+wxZs+ejb29/RVl0tPT8fT05IsvvuCWW27B2tqaFi1a8Pfff3P77bfzwQcf0P//27djl9TeOAzgj1YodBqioIJSh5ZMDnVQUuraUFJDYGRBNElk9BcEDSZGUARhQ9QURBkFEUGUQxE4ijgoJdXQUITZ0BKlQxa/4cK5xM07dOvW6fd84Awevt/3vL6DPLye98cPnJ+fY3h4GG63Gz6fD8DPMFdWVobp6WnY7Xasrq5iamoKR0dHqKure3VOl5eXEEURAJDJZFBQUACNRoNsNguVSgWtVouBgQEsLCx83MIQEb0BwxwRfYqtrS14PB5ks1lIkoTW1lb09/fLgQr4Gcq2t7fR3d0t32tvb0dbWxvGxsbke8FgEKOjo0ilUnLfyMgIFhcX5Rqr1QpJkvKGsVwuh6urK9zd3cFsNiMWi6G4uBgNDQ3Y29uDTqeDIAgoLy9/55UgIvo7/JuViD6Fy+VCKpXCzs4OOjs7EQ6HIUkSlpeX/9iXSCQwMTEBQRDky+Px4Pr6GplMRq6z2Wwv+mw2G05OTvKOW1hYCIPBgNPTU1gsFoiiiHQ6jYqKCtjtdhgMBgY5IvqSeACCiD6NVquFw+GAw+GA1+vF0NAQfD4f3G533p77+3v4/X709PS8Ot5b1dfX4+LiAo+Pj3h+foYgCMjlcsjlchAEAXq9Hslk8s3jExF9FO7MEdGXYTQa8fDwIH8uKirC09PTixpJknB2doba2trfLrX6109aJBJ50ReJRPK+LwcAoVAI8XgclZWVCAaDiMfjMJlMmJubQzweRygUeqdvSUT0vrgzR0T/3O3tLfr6+jA4OAhRFFFSUoJYLIaZmRk4nU65zmAw4PDwEM3NzdBoNCgtLcX4+Di6urqg0+nQ29sLtVqNRCKB4+NjTE5Oyr2bm5swm81oaWnB2toaotEolpaW8s5Jr9cjnU7j5uYGTqcTKpUKyWQSLpcLVVVVH7oeRER/gztzRPTPCYKApqYmBAIB2O12mEwmeL1eeDwezM/Py3Wzs7M4ODhATU0NGhsbAQAdHR3Y3d3F/v4+LBYLrFYrAoEA9Hr9i2f4/X5sbGxAFEWsrKxgfX0dRqPxj/MKh8OwWCzQarWIRqOorq5mkCOiL4+nWYno23ntFCwR0XfFnTkiIiIiBWOYIyIiIlIwHoAgom+Hb48Q0f8Jd+aIiIiIFIxhjoiIiEjBGOaIiIiIFIxhjoiIiEjBGOaIiIiIFIxhjoiIiEjBGOaIiIiIFIxhjoiIiEjB/gMTADYASUQpMAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = np.loadtxt(\"time-dependent-optimization_torch/log.dat\")\n", "fig, ax1 = plt.subplots()\n", "(l1,) = ax1.plot(data[:, 0], data[:, 1], label=\"phi\")\n", "(l2,) = ax1.plot(data[:, 0], data[:, 2], label=\"theta\")\n", "ax1.set_xlabel(\"Step #\")\n", "ax1.set_ylabel(\"phi/theta\")\n", "\n", "ax2 = ax1.twinx()\n", "(l3,) = ax2.plot(data[:, 0], data[:, 3], label=\"L\", color=\"red\")\n", "ax2.set_ylabel(\"L\")\n", "\n", "lines = [l1, l2, l3]\n", "labels = [line.get_label() for line in lines]\n", "ax1.legend(lines, labels, loc=\"best\")\n", "\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.17" } }, "nbformat": 4, "nbformat_minor": 5 }