{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 141 凸最適化\n", "\n", "Consider following quadratic term:\n", "\n", "\\begin{align}\n", " f(x) &= \\frac{1}{2}x^TQx + bx, \\\\\n", " \\nabla f(x) &= Qx + b, \\\\\n", " \\nabla^2 f(x) &= Q.\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 読み込み" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:04.799185Z", "start_time": "2018-05-11T08:26:03.469640Z" }, "collapsed": true }, "outputs": [], "source": [ "import sympy as sy\n", "sy.init_printing(use_latex=True)\n", "\n", "from scipy.optimize import minimize\n", "import numpy as np\n", "\n", "import pandas as pd\n", "import multiprocessing as mp\n", "\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D\n", "% matplotlib inline\n", "\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 変数定義" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:06.570143Z", "start_time": "2018-05-11T08:26:04.802106Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAyBAMAAAAzX++dAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhB2qyJEZt3N\nu5lcG7FTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABB0lEQVQ4EWOQ//+JAQUw/f8vwCDs4ooiyMDq\n4izAIIIqBuKxDIRoWHpnUgLCLRA3sCpwbeM+wJCUxADGUJcxBTB9ZW7gUmAuAGGYe1kZeC4wMHBP\nYPgKwjBRBgZ+oKnxDgzCIIwQ9XdgYPBvYNgFwjBR5oB8BrYA/wCGbSAME51vcJ+hC6RWDIRhouFp\nYa8WgMz9CcIwUYj7Md0AEmd7wFwAwqhqGfT0AsB4YEId4mA4OSAxD7cdwsDrBnyphOUAllTC8nwD\nA2YqYWDeAE4piLgApRKQKGYqAYliphKwKEYqgapFSyVQc9FSCUgUNaWC/c8sAE4pCJeBRDlef0+g\nYirBXhJgLTUA4xJb23kIJvMAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}x_{00}\\\\x_{10}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡x₀₀⎤\n", "⎢ ⎥\n", "⎣x₁₀⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAyBAMAAAC32QizAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhAimWbdq7vN\ndkS3nmAXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACcElEQVRIDe1WvWsTYRx+eh9pLjEmWB2LwSU6\nlNRRHTywRYRCzlUUg4ujoSCoS4ODqyk4CKKJbiJiB9FRHdwcQhHEodj/wKK5qgU93+fNvX3fSy6F\n1EnoD3655/fx3Hvvxz05HI6+YQyzoqiEqbn5MShw586UcHAcBnsdxbmyWGmOIGcqR26YJcWx7gHP\nzIKBj/nIrRhxzHE/BMD5slHQ8OJ7wD2gY/Vs+w6JXG7DKGj4TtwOL3SsONWmyFmbRmEbWj8Jq/Xt\nRMzJ/GJm8rvOa3StRbw0qzP9+VhyV/M9rK5Cum5AtczgjV+YEWCBuM/xesTFjWzZ7tAZKWv7RBFu\n4yTOPiXuc4oh8emOt46QzkhZxCWwt/AIxQAnmI3HKRG3g8s+puiMlC0TeKHbw8SsycmRU/iNWh33\n6aqf18f8+dJ1NuE1Tc7+0F3zaw3UAjyks03Z1+DSR+cHnBBe1+RgLYujYu3EGNN01c9rodu07pYh\nxplIcpwLMw/qDsRc/tBNDuaffH4FX8ynuJ4YRzS9xB2krZso5f1sfWjdeN/X9goKDbtDZ2xYvnEK\n+CT2B8eZ7a810VLkA5VKIJ0JbZOR2HNr8Tqutp+LrOacS+yKJrBp2ThtJifRtWOgx9mxLVHc4xhr\nvaeJ/6KJztuRmij1cIEHr3/elCY6t1oYpYnUwzRNhN2S77d5jJUmSi1I0URyhIYk3r5YEzHIUZpI\nzghNHOIoTZScdE0c4ihNjMeZNucTa+IwJ9bEeD5pmjjMETemJpIz+F8iSlITB9eAz0JNhF2SusjY\nMKmJUg9TNDFzc6s7ShOph/+FJu7mW2wX33x/AdeB0eT/MNhIAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}Q_{00} & Q_{01}\\\\Q_{10} & Q_{11}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡Q₀₀ Q₀₁⎤\n", "⎢ ⎥\n", "⎣Q₁₀ Q₁₁⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFQAAAAZBAMAAABdgxRAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAu90iEO/Nq1REiXaZ\nZjI0D18hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABZElEQVQ4EbWUv0vDQBiGX8u1Jm1tQHBzKFlE\nRezm4hBBNyHgJIjgIHRxCK5FCII42v+gwdUOzrVDBxFRxMxOTk5ChwZpCxbzXX/c15ghDh688N6T\nhy/hDoJ5s4QESzdXUEzgSWXjj+rWXuxksTD1xuHUcqyKjMP5UO1ypLrhqg5IVQ84Ur1mqT5Ss0WO\nVL9WNWxyaqbSdKfoaFO+e2RYqvax6DA2ruLLstn1SPXKQh+NBmTGIqAFMLzcjQd8EJTqA0R/ztMc\nijKRP4LtveESn6cT9QR6N1VFQGFqpoWauwzDwvlE/UY+sN+xT2Gq4eN1e4C0y9Qedvx2CWsUrlbF\nYaGDlM/UMyyibWGVwtRZf6ZVCJC6Zepu00c48YDCVPH8gnBqmqv0OPzOHoWpVMUARpVNJRZzAoQR\nOQFCuZbmUKjz1QzPFRdE5BXIR/W6BUpkZZ/usbleCalSI8rv7X+pZtL/wNIPzHxjeHPRL1EAAAAA\nSUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}b_{00} & b_{01}\\end{matrix}\\right]$$" ], "text/plain": [ "[b₀₀ b₀₁]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAAASBAMAAABY2XrrAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIomZZt0yq7sQze9U\ndkTlFhrvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJklEQVQ4EX2SzWsTURTFT6aZSWITE/QPcDB2\nWRKKIq4aXbjVhYpYNAPFhW5SBEEQsUVw6+wERXTjQt2IO6GFbETFhaFidsVuXdn6kRJQ4z0382Ze\nMrEXzps5v3tzeJn3AGSqBw/DrhSwm9g3V23sCmYC5JbtiRSwm8454MZu4MEzoPDKmkgBq4fC8xB4\n6CcoBV7IAG4nA0gBq4c9r8XlthI0Dpyf7NUq8UQKxB0dbMjqbCesNgYOnGZvvs1VKwVMg8/ML65T\nv7lqpUDNJ78XlGZ9UDAAV4VTdjnf6fI9rK8D3hPZqgE0hM1ABjDACbxVxWDxOkCNlNujLW9l/eKS\nd1T+mgE0hBiEMlDcwSWUQyoGeCMNSo7/6VmpC4Ek9ek/Lrmb6KMoeQbQKFzggNsv9DD9XtRGBIZZ\nwzyODMt9yWczfBxgVfMMoFF4kwNfOt423JOiBiIwOS/HvNIftCo4o3kG0Cj8Fj7qej/g9eF2RR1E\nYHLe3n5hI2jV0QpxUfMM0DzCUqfhnPIh+5vuijoGTM7DRhaH5EhlK2uaZ0C0vzXgyrXPKwjk+5W/\nijYN+E+ed3/2fMXjp/o7zIsAjUL5HvkgW0nO1wDrfAVZdRfHh0cpEVoEzNPzFZKvvwM+yf2jWArw\nQd6o8bpTXEapLletqIcNENAolOmpgdxSZ+6Yir9WsL95C1Sq5gcBUK2GmSM7HW0SqBFI4C20lcdL\nCsQdvlxeHbGj4B8FNM55N4RQyQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$Q_{00} Q_{11} - Q_{01} Q_{10}$$" ], "text/plain": [ "Q₀₀⋅Q₁₁ - Q₀₁⋅Q₁₀" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}b_{00} x_{00} + b_{01} x_{10} + x_{00} \\left(0.5 Q_{00} x_{00} + 0.5 Q_{10} x_{10}\\right) + x_{10} \\left(0.5 Q_{01} x_{00} + 0.5 Q_{11} x_{10}\\right)\\end{matrix}\\right]$$" ], "text/plain": [ "[b₀₀⋅x₀₀ + b₀₁⋅x₁₀ + x₀₀⋅(0.5⋅Q₀₀⋅x₀₀ + 0.5⋅Q₁₀⋅x₁₀) + x₁₀⋅(0.5⋅Q₀₁⋅x₀₀ + 0.5⋅\n", "Q₁₁⋅x₁₀)]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_mat = sy.Matrix(2, 1, sy.symbols('x:2:1'))\n", "Q_mat = sy.Matrix(2, 2, sy.symbols('Q:2:2'))\n", "b_mat = sy.Matrix(1, 2, sy.symbols('b:1:2'))\n", "f_mat = sy.Function('f_mat')(x_mat)\n", "f_mat = ((1/2) *x_mat.T*Q_mat*x_mat+b_mat*x_mat)\n", "display(x_mat, Q_mat, b_mat)\n", "display(Q_mat.det())\n", "display(f_mat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 解析解へ具体的な値を代入\n", "\n", "Optimum vector $x^*$ is\n", "\n", "\\begin{align}\n", " \\nabla f(x^*) &= Qx^* + b = 0, \\\\\n", " x^* &= -Q^{-1}b.\n", "\\end{align}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:08.245972Z", "start_time": "2018-05-11T08:26:06.572256Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Q\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFYAAAAyBAMAAAA0HTGIAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhCrmXbNZt0i\nu0TKQvJ9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA9klEQVRIDWOQ//+JgRig//8jg7CLKzFKGUJc\nDBlEiFIJUuRInlrDAJw2MIuimMuano9TbVjZVxS1DAz9ONUycAw/tZG7QWAKw5D3W5n8tAU4EgR7\n4s8soBSZ6QyHoQjhUXMhYTEkwoGn/K4DNOrQ3ItZnoQxMP3DphZbeZLKwCCITS228kSagSEf6gg0\nN2CWPfMDiFcLtH8/tPAiaC4DAx+s3CdCLXcCst9YZ4PKjJ1AL2C6l4GhHKoUPb9hUctRQLxacwae\nAxDVBN3LUsDAQaza00rq2VBHoJqLpTyZ////b6xqoYI4KFRzcSgasuaS0iYgoa0BAA4uWfs+BKBl\nAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}1 & -1\\\\-1 & 2\\end{matrix}\\right]$$" ], "text/plain": [ "⎡1 -1⎤\n", "⎢ ⎥\n", "⎣-1 2 ⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Q inv\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADUAAAAyBAMAAAAOzY77AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhAimburRN3N\ndmbBWFV7AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA1UlEQVQ4EWOQ//+JAQtg+v9fgEHYxRWLFAOr\ni7MAgwg2GZAYC0QuvaIFUwVEjnUCg/4CZElmUbg+zgAGRgEkucjKr3A5xg0MnF+Q5Bh4EXI8X3HL\nAbVwg1TCAZI+oNh6BbgEkIEqtxNZClWOvQC33HUUKRR9zAUMaciyyPa5MzBcwyHHtkmpcgMOOZ7/\n//8jy7FP/DMPHg/IeuBsaBzB+ciMUTnk0ECwYeFiGIAQA7KQ0i7r9Pkocshpl4HhPoocSpoYyXKV\n8icfIAXokEu7+MpIPGUrAC//ULNFAVEtAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}2 & 1\\\\1 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡2 1⎤\n", "⎢ ⎥\n", "⎣1 1⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "b.T\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABYAAAAyBAMAAACqpzYoAAAAJFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMA74lUMhCrmXbNZj0HdO4AAAAJcEhZcwAA\nDsQAAA7EAZUrDhsAAABHSURBVCgVY5DevYkBBLR3b2QQdnEFs0NcDBlEwCwQ4YjJNgyAibOmZ8PZ\nDAzdA8Muk562AKs7Qc7H5n56ig/zsEJOM0hpCQAPyjBJTF3WawAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left[\\begin{matrix}1\\\\1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡1⎤\n", "⎢ ⎥\n", "⎣1⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Optimal x\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACcAAAAyBAMAAAAtlt8uAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhDN3SK7mWZ2\nRKuKPm/cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA+0lEQVQ4EWOQ//+JARkw/f8vwCDs4oosxsDq\n4izAIIIiBOKwoAo2KU3GEORYwGC/AV0lz2cG/gJ0QV5ZhvgEdEGgeZjaGRhYizAsYuBQX4opyMCg\neAFmJmt6ORCUOQBVMYrCBIEcMOBoYOD8jC7I/xWLIOMEBvYf6Cq5NzDYH0AXZLi1ai7QcLRQgtg3\n7AW7Vk7B8DvrAwZ9eHRAwoGBgS+AgVEAPZQYCxj4vqALsn3FIgg0hv0rukqg4H0FLIJ1QAlIyCMS\nA9cCuCCQAQWnQDRaHDEvYOjAEPRiYDiBLshRpLQOI3mz/f//H0MQahuaRRBRGglizdrYCgEAoAM8\nI+qoiGgAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}-3\\\\-2\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-3⎤\n", "⎢ ⎥\n", "⎣-2⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "f(x*)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAOBAMAAABA5yhLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAArUlEQVQYGWNggALWtHIHEJPpIEsuVAhISTBw\n/gLxuP//n4AQbWRg2A3iMc04ihBk2MzA0O8A5HMgiTEw6AtgEwUqsRcAqX13zAFZOddPEI9dgBVs\nK0yGuQHKKmZgEDIGARWgQBpMOj8AxmJg4EkAs5sYGOYvQIheY2AFqdnEwJAPshUCWBIYeECiCQwM\nRlAhIBU8c1ozg7wCQxgD31aEqP7//58ZgM5gzWwTYAAAPJgg2VBjo+sAAAAASUVORK5CYII=\n", "text/latex": [ "$$-2.5$$" ], "text/plain": [ "-2.50000000000000" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def isPSD(syA, tol=1e-8): \n", " eigenvals = syA.eigenvals()\n", " for key, value in eigenvals.items():\n", " if not key >= tol:\n", " yield False\n", " return True\n", "\n", "Q_params = [(Q_mat[0,0], 1), (Q_mat[0,1], -1),\n", " (Q_mat[1,0], -1), (Q_mat[1,1], 2)\n", " ]\n", "Q_mat_with_param = Q_mat.subs(Q_params)\n", "if isPSD(Q_mat_with_param):\n", " Qinv = Q_mat_with_param.inv()\n", "else:\n", " print('The matrix is not positive semidefinite symmetric matrix')\n", "\n", "b_params = [(b_mat[0,0], 1), (b_mat[0,1], 1)]\n", "b_mat_with_param = b_mat.subs(b_params)\n", "\n", "x_optimal_analytical = -1*Qinv * b_mat_with_param.T\n", "x_params = [(x_mat[0,0], x_optimal_analytical[0]), \n", " (x_mat[1,0], x_optimal_analytical[1])]\n", "params = Q_params\n", "params.extend(b_params)\n", "params.extend(x_params)\n", "f_optimal_analytical = f_mat.subs(params)[0].expand().simplify()\n", "\n", "print('Q')\n", "display(Q_mat_with_param)\n", "print('Q inv')\n", "display(Qinv)\n", "print('b.T')\n", "display(b_mat_with_param.T)\n", "print('Optimal x')\n", "display(x_optimal_analytical)\n", "print('f(x*)')\n", "display(f_optimal_analytical)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 代数的にJacobian, Hessianを関数として作成" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:09.022197Z", "start_time": "2018-05-11T08:26:08.248538Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAAUBAMAAACHYqzgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEVO8Qq5lm\nIrurE6D6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADzElEQVRIDdWVS2gTQRzGv6RJN2uTJhV70CLG\n1heiGBpB8CABjx6a4gOkQuPRU2NPKogVBfHkVhFEEaN4EFQMSg8WkSAKHgR78lKlPXjy4ANfpCL1\n/5+HO5vdbZucdOG/7Mx888v3ZXZmsXw7/v8r2V/CATfGtUP73MYCT/bEi8ICw0sbWhQy/fS9IC3J\nVVwGOeaIKTtwcWpBF9Z5MdxWtrcuqIMCBoqWCLErGC4xYEmuRBD77gMRJDmGeC7wt1Xn1cm6eHoJ\n7A3UWRnRrYGBmkUhR+W0ZQ4SY/QY7koJBVCtyBoRpLMCSzoNdECdETn8ATglZjTqVBBAAhuHZXsx\niPKXyGLZN5oR7koJhStPkHQF7T+Df1z1Kg9zwEg5SNhMkFCI8tdWl0HCXYUGuVFF+xeMr3rTLd8Q\nv1UZxP5FQTJ21/3Dgw2SJoKEQ7Q/IMovQLgrLWRXnhWZKSL23S4m10Zz6O6GKK9TGST1HRgoXsaz\nTB+wm164waKSNRHEhDDAhWh/9G8x13QVy5mutNAfpEpB4k68bk0li1aFy5tD7ZEUrchA8SCGnZPY\ncwt4gRMtBDEgDHAh2h+wmbEzrqvYZBaGKy30BRGLaKNtlha1hDoXgez+Xrr6CvSogsi3wsEu7hoF\nNiDt0FM8n+8/k89XuDdgs19iTC99feWymhAGKMjefH5TPr+TGeio8t1wBSsrnHG3IfQFoW1l0WZP\nZ2h2Aee4eIpxSQ+gfXqqDHzhkVHY35CgFl9NvFoGhAHHXYj+o9EjmIYrDmK40kJfkM5ZJGkNBgpU\nU9jCJVDuTQX5CLx2EOPDkYLEfiNak5pmgrgQBjx3IdqfVcU7whquOIjhSgt9QejT05GznDWIOAMO\n1nJJf3/vKgh9EB/heOQzVoogdURpEflqJogLiRFghQvR/vYAq4lpuBJBXFda6A1ifwU24kphpPwJ\nbzn3aS5hz73xlBs5RMv22fafnZ9TNbUiiYAgDAy8fBBakcQKKgVR/lLr909mva7UimhX/iCTF3bW\n+Ii43HUbV7vGn9T4TfzB5XXScefrPUQrsAdXFeybK3te0bDYI+mSFOoVEcBexztbtfwQ2iPpI1QK\novy1zc/PZ72u1B7RrpRQANV3xPeLUffU8o15O9xTi/p1ECGxprzK8JZxapFI/9EBeuPUahCGBYlU\nrQpXAKyh6xjodNHfEdv0Hm9QhjcZ4EKuhwutMRiuTGFYEAwNOaLCoXJkettNxCceB8nGgzoD+xgQ\nAvHoUw/nMiGuQoN4AK01aq1Na20WBVm+rrWp/9SsSG/pD/qzaTlZ/BzRAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left [ 1.0 x_{00} - 1.0 x_{10} + 1, \\quad - 1.0 x_{00} + 2.0 x_{10} + 1\\right ]$$" ], "text/plain": [ "[1.0⋅x₀₀ - 1.0⋅x₁₀ + 1, -1.0⋅x₀₀ + 2.0⋅x₁₀ + 1]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[>, >]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQYAAAAUBAMAAACdco4rAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEVO8Qq5lm\nIrurE6D6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACUElEQVRIDZ2Vv2uTQRjHv0naptektWZUSkPU\niEKhSEFwencHI/0xFex/0Iwu0g4uTgZFKHZoBgdBwYC4ZBBBBDfdRerg1KFQ2lKiQ3zu3veOe+69\ny/vWG5J77p773Oc97n1e1JYKVyKct31uplf8J4dQaxjfMDzx4UtkglBnd30FtCzVLI6e8/J+fPyt\n5jVnLXEoP1HDpbZY0OvT/w87auw2nn3PchjBE1082JAgzUkcXvYHCv8VWFYdz4948045VLcxvpjh\nMIo31cHkNvENR59DIXY4ALbih/VIYF5NzXRRHmQ4YARvso6pE8IbjuPwB9hs+7ZXY7HDhS4mznI6\n+HilQexgONxB/CWH2QyHvR4mjvI5hHhFeeqGwx2mT4F7rQyH/RbGTvM5hHibcg/DcRzoHLIdevkd\nAryb8jH3NYc7eM9O3GpQk3Usvg/mDCXIblQfnsvUxhKSO+nlAZWeXGY43AF0h7baNpf1zZ0sn+NO\neniXFZXuZMxxHA6Bbx22rx0k7+YvVPO+m15euYefhJ3RHMeBatR7e1fejx2otlSyapSuD17eXWCO\nwIZjO+wtotgWj0H//kYO4hi4jp1IvRdOov29kDUqwJu+ttqv25zEofL6+C2KXYj7lyIUb/gV+k/v\nfAJd6RcXX8XfLCfRchjFKw2Hw7rN0efAdn3EIn+gvps80XLga3ganyOO16HF07yRcuCJQQeexnEB\nBzHL07yRdHASQw5OGscFHKo8yx9JBycx5OCkcZ5yqF0tNCI+niOqNdNJhUaUHswYIU6t+Q+vW8yf\nyNaX5QAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left [ \\left [ 1.0, \\quad -1.0\\right ], \\quad \\left [ -1.0, \\quad 2.0\\right ]\\right ]$$" ], "text/plain": [ "[[1.0, -1.0], [-1.0, 2.0]]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[>, >]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "matrix_params = [(b_mat[0,0], 1), (b_mat[0,1], 1),\n", " (Q_mat[0,0], 1), (Q_mat[0,1], -1),\n", " (Q_mat[1,0], -1), (Q_mat[1,1], 2),\n", " ]\n", "f_mat_with_param = f_mat.subs(matrix_params)[0].expand().simplify()\n", "\n", "np_func = sy.lambdify(x_mat, f_mat_with_param, modules='numpy')\n", "\n", "jac_f = [f_mat_with_param.diff(x) for x in x_mat]\n", "jac_fn = [sy.lambdify(x_mat, jf, modules='numpy') for jf in jac_f]\n", "\n", "hess_f = [[jac.diff(xx) for jac in jac_f] for xx in x_mat]\n", "hess_fn = [sy.lambdify(x_mat, hf, modules='numpy') for hf in hess_f]\n", "\n", "display(jac_f, jac_fn, hess_f, hess_fn)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Scipy.optimizeで数値的に最適化" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### jacobian,hessian関数をラップして変数を与える関数を作成" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:09.041607Z", "start_time": "2018-05-11T08:26:09.025125Z" } }, "outputs": [], "source": [ "numerical_results = {}\n", "init_guess = [0, 0]\n", "\n", "def wrap_np_func(x):\n", " return np_func(*tuple(x))\n", "\n", "def wrap_jacobian(x):\n", " return np.array([jfn(*tuple(x)) for jfn in jac_fn])\n", "\n", "def wrap_hessian(x):\n", " return np.array([hfn(*tuple(x)) for hfn in hess_fn])\n", "\n", "def cbf(x):\n", " global count\n", " count += 1\n", " f = wrap_np_func(x)\n", " plt.scatter(count, f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Nelder-Mead\n", "\n", "https://docs.scipy.org/doc/scipy/reference/optimize.minimize-neldermead.html#optimize-minimize-neldermead" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:09.796217Z", "start_time": "2018-05-11T08:26:09.043139Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal x\n" ] }, { "data": { "text/plain": [ "array([-2.99997629, -2.00000619])" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "f(x*)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAK8AAAAPBAMAAABgoIKoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACSUlEQVQ4EbWTzWsTQRjGn026SbZJk9CDCB4a\nwYNKMUVPnlwvQk9dEATx4CoS/Lisp4IiRkQpKLaghAaF7Mmb+EVBlGoQ8aJgDyJ4yip4stAmbdAW\n2vjMTDYz/4Av5DcfD+8vy+ws0C+7Mu2q6ZAP68K8ZwA76rdgQMcYLx5bwsn6NSjAefSAFioGtRPO\nplokA+yK7AUD1luc8jSMBO96G7B9tCIJWPtxlhYqBnUDeKMWnwLcAW4byDxDxtcwEuy76yG3hcKE\nBNI+pmmhYlAvgVlXrOyfATpAw0ChBGdVw0hQZcfwa4yVJPDUixVilFUu9sVOIrD+AF+ODuCOBcit\na+jYlWL2tyKFq9JFhRxjHCmK2S/uvuAThxpZPvGmhhHj3vI59liH++hMfgyVghtxDW+ImdWkuAGU\nIw1nFYltDSPGZZwOYd8/wyMkrE6ERaWIrRyTVbFwQHGiOdJY0sA4vm8ZMBIgPcGuh6GE1SviUlEq\nMHpI1B7uV/gDvgoxlj80XAP5z5Pr0DASINVlV/a5whqwEiqFkMnK+WKw5qSYV0QcuEamzaVGnGTE\n6dse0lsSOEjxj1ghfKxvYIaRmZnZV00u94o9jUSVS4044RtNtQttiiXEDV95EiuEQX6FOYpZ2QC/\nvaGugfwCpjwNI0nx1ZTYkOxKYIpnrBRSJXC8XrvJe85ZIcD74mhkILfbOgANI7F9/ks+Qqspgcyc\ntagUpKpyr7cmL4Zz/W/kVC7yfgyAWiWEASM5Mc+b9rhypQ/UzrvspEJZ/wP/AdAhIWXzYEPkAAAA\nAElFTkSuQmCC\n", "text/latex": [ "$$-2.49999999953364$$" ], "text/plain": [ "-2.49999999953364" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nMsUkJNMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "method = 'Nelder-Mead'\n", "count = 0\n", "result = minimize(wrap_np_func, init_guess, callback=cbf, \n", " method=method)\n", "\n", "x_optimal_numerical = np.array(result.x)\n", "x_params = [(x_mat[0,0], x_optimal_numerical[0]), \n", " (x_mat[1,0], x_optimal_numerical[1])]\n", "numerical_results[method] = {'x':x_optimal_numerical, \n", " 'y': f_mat_with_param.subs(x_params)}\n", "\n", "print('Optimal x')\n", "display(numerical_results[method]['x'])\n", "print('f(x*)')\n", "display(numerical_results[method]['y'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Powell\n", "\n", "https://docs.scipy.org/doc/scipy/reference/optimize.minimize-powell.html#optimize-minimize-powell" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:10.341564Z", "start_time": "2018-05-11T08:26:09.799400Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal x\n" ] }, { "data": { "text/plain": [ "array([-3. , -2.00000001])" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "f(x*)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAOBAMAAABA5yhLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAArUlEQVQYGWNggALWtHIHEJPpIEsuVAhISTBw\n/gLxuP//n4AQbWRg2A3iMc04ihBk2MzA0O8A5HMgiTEw6AtgEwUqsRcAqX13zAFZOddPEI9dgBVs\nK0yGuQHKKmZgEDIGARWgQBpMOj8AxmJg4EkAs5sYGOYvQIheY2AFqdnEwJAPshUCWBIYeECiCQwM\nRlAhIBU8c1ozg7wCQxgD31aEqP7//58ZgM5gzWwTYAAAPJgg2VBjo+sAAAAASUVORK5CYII=\n", "text/latex": [ "$$-2.5$$" ], "text/plain": [ "-2.50000000000000" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "method = 'Powell'\n", "count = 0\n", "result = minimize(wrap_np_func, init_guess, callback=cbf, \n", " method=method)\n", "\n", "x_optimal_numerical = np.array(result.x)\n", "x_params = [(x_mat[0,0], x_optimal_numerical[0]), \n", " (x_mat[1,0], x_optimal_numerical[1])]\n", "numerical_results[method] = {'x':x_optimal_numerical, \n", " 'y': f_mat_with_param.subs(x_params)}\n", "\n", "print('Optimal x')\n", "display(numerical_results[method]['x'])\n", "print('f(x*)')\n", "display(numerical_results[method]['y'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Newton-CG\n", "\n", "https://docs.scipy.org/doc/scipy/reference/optimize.minimize-newtoncg.html#optimize-minimize-newtoncg" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:10.896108Z", "start_time": "2018-05-11T08:26:10.345228Z" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal x\n" ] }, { "data": { "text/plain": [ "array([-3., -2.])" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "f(x*)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAOBAMAAABA5yhLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAArUlEQVQYGWNggALWtHIHEJPpIEsuVAhISTBw\n/gLxuP//n4AQbWRg2A3iMc04ihBk2MzA0O8A5HMgiTEw6AtgEwUqsRcAqX13zAFZOddPEI9dgBVs\nK0yGuQHKKmZgEDIGARWgQBpMOj8AxmJg4EkAs5sYGOYvQIheY2AFqdnEwJAPshUCWBIYeECiCQwM\nRlAhIBU8c1ozg7wCQxgD31aEqP7//58ZgM5gzWwTYAAAPJgg2VBjo+sAAAAASUVORK5CYII=\n", "text/latex": [ "$$-2.5$$" ], "text/plain": [ "-2.50000000000000" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "method = 'Newton-CG'\n", "count = 0\n", "result = minimize(wrap_np_func, init_guess, callback=cbf, \n", " method=method, jac=wrap_jacobian)\n", "\n", "x_optimal_numerical = np.array(result.x)\n", "x_params = [(x_mat[0,0], x_optimal_numerical[0]), \n", " (x_mat[1,0], x_optimal_numerical[1])]\n", "numerical_results[method] = {'x':x_optimal_numerical, \n", " 'y': f_mat_with_param.subs(x_params)}\n", "\n", "print('Optimal x')\n", "display(numerical_results[method]['x'])\n", "print('f(x*)')\n", "display(numerical_results[method]['y'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### trust-krylov\n", "\n", "https://docs.scipy.org/doc/scipy/reference/optimize.minimize-trustkrylov.html" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:11.475000Z", "start_time": "2018-05-11T08:26:10.899643Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimal x\n" ] }, { "data": { "text/plain": [ "array([-3., -2.])" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "f(x*)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAOBAMAAABA5yhLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAArUlEQVQYGWNggALWtHIHEJPpIEsuVAhISTBw\n/gLxuP//n4AQbWRg2A3iMc04ihBk2MzA0O8A5HMgiTEw6AtgEwUqsRcAqX13zAFZOddPEI9dgBVs\nK0yGuQHKKmZgEDIGARWgQBpMOj8AxmJg4EkAs5sYGOYvQIheY2AFqdnEwJAPshUCWBIYeECiCQwM\nRlAhIBU8c1ozg7wCQxgD31aEqP7//58ZgM5gzWwTYAAAPJgg2VBjo+sAAAAASUVORK5CYII=\n", "text/latex": [ "$$-2.5$$" ], "text/plain": [ "-2.50000000000000" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "method = 'trust-krylov'\n", "count = 0\n", "result = minimize(wrap_np_func, init_guess, callback=cbf, \n", " method=method, jac=wrap_jacobian, hess=wrap_hessian)\n", "\n", "x_optimal_numerical = np.array(result.x)\n", "x_params = [(x_mat[0,0], x_optimal_numerical[0]), \n", " (x_mat[1,0], x_optimal_numerical[1])]\n", "numerical_results[method] = {'x':x_optimal_numerical, \n", " 'y': f_mat_with_param.subs(x_params)}\n", "\n", "print('Optimal x')\n", "display(numerical_results[method]['x'])\n", "print('f(x*)')\n", "display(numerical_results[method]['y'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 解の可視化\n", "### 関数へ数値の代入" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:12.006820Z", "start_time": "2018-05-11T08:26:11.479525Z" } }, "outputs": [], "source": [ "def calc_func(arg):\n", " x1, x2 = arg\n", " return [x1, x2, np_func(x1, x2)]\n", "\n", "def calc_parallel(func, x_lists, column_list):\n", " df = pd.DataFrame(columns=column_list)\n", "\n", " pool = mp.Pool(processes=mp.cpu_count() - 1)\n", " tmp_df = pd.DataFrame(pool.map(func, x_lists), columns=column_list)\n", " pool.close()\n", " pool.join()\n", " return df.append(tmp_df)\n", "\n", "x_min = -10\n", "x_max = 10\n", "x_delta = 1\n", "x_lists = [ (float(x1), float(x2))\n", " for x1 in list(range(x_min, x_max, x_delta))\n", " for x2 in list(range(x_min, x_max, x_delta))\n", " ]\n", "column_list = ['x1', 'x2', 'y']\n", "\n", "func_df = calc_parallel(calc_func, x_lists, column_list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### グラフ化" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2018-05-11T08:26:12.660511Z", "start_time": "2018-05-11T08:26:12.011813Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAADuCAYAAABvc50tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXd4VHX2xt87JVPTOwkhnXRKIBSR\nVQERRBQRFZC4rijKwqKgLi6iqCvFFWVV3BUQFCyIAoIIsjZ+iAihhJKEhDDJpPcyvd3y+2O440zq\nzGQCIdzP8/g8Mrlz52Zm8n3vOd9z3kMwDAMODg4ODg6OnsO73hfAwcHBwcHRX+BElYODg4ODw0Nw\nosrBwcHBweEhOFHl4ODg4ODwEJyocnBwcHBweAhOVDk4ODg4ODwEJ6ocHBwcHBweghNVDg4ODg4O\nD8GJKgcHBwcHh4cQuHg8Z7/EwcHB4TpET5585syZEIFAsAVAGrhg6HpCA8gjSXJ+ZmZmfUcHuCqq\nHBwcHBzXGIFAsCUsLCw5ODi4hcfjccHNdYKmaaKhoSGltrZ2C4DpHR3D3fFwcHBw9H3SgoOD1Zyg\nXl94PB4THBysgjVj0PEx1/B6ODg4ODjcg8cJat/g6ufQqXZyosrBwcHRn8jPF2HevCjI5cPA42VC\nLh+GefOikJ8vut6XdjPAiSoHBwdHf2HXLh+MGJGCnTuDoNPxwDCATsfDzp1BGDEiBbt2+fTk9Nu3\nb/cjCCIzNzdX7O45Zs6cGb1t2zZ/AHjooYcGnTlzRgwAy5cvD7M/btiwYUk9udbrBSeqHBwcHP2B\n/HwRHn00DkYjDyTpWG1MkgSMRh4efTSuJxHrzp07A4YPH67dsWNHQI+vF8CXX35ZlpmZaQSAd999\nN9z+Z7m5uYWeeI1rDSeqHBwcHP2BtWtD24lpW0iSwLp1Ie6cXqVS8U6fPi3ftm2bcu/evf4AcODA\nAe+srKzBd911V2xMTEzq9OnTY2iaBgA899xz4WlpackJCQmps2fPHsQ+bk9WVtbgo0ePShcuXBhh\nMpl4SUlJKdOnT48BAKlUOow97qWXXgpNTExMGTx4cMrChQsj3Ln+awUnqhwcHBz9gb17A50S1T17\nAt05/WeffeZ32223qTIyMkx+fn7UsWPHpABw6dIlycaNGyuuXLmSX15eLvrhhx/kAPD888/X5+Xl\nXSouLs43GAy8nTt3+nZ27g8++KBKJBLRhYWFBfv37y+1/9muXbt8vvvuO/8zZ84UFhUVFbzyyiu1\n7lz/tYITVQ4ODo7+gF7v3Hqu1/PdOf2uXbsCZs+e3QIAM2fObGZTwOnp6bq4uDgLn89HamqqXqFQ\neAHAoUOHvDMyMpISExNTjh8/7p2Xlydx53V/+OEHn0ceeaTR29ubBoDQ0FDKnfNcKzjzBw4ODo7+\ngFRKQ6frXlilUpdFqba2ln/ixAmfy5cvSxYtWgSKogiCIJhp06apRCKRrdWHz+eDJElCr9cTy5Yt\nG3Ty5MmC+Ph4y9KlSwcYjUa3gjiGYUAQPTKkuqZwkSoHBwdHf2DGjCYIBF33sgoEDO6/v8nVU+/Y\nscP//vvvb6qurr5YVVV1sba29kJkZKT56NGj8o6O11+NmsPCwkiVSsX79ttv/bt7DYFAwJhMpnbq\nedddd6l37NgRpNFoeABQV1fnVqR9reBElYODg6M/sHx5nVOi+ve/d+hZ2xVfffVV4P33399i/9i9\n997bsnv37g6rgIOCgqi5c+c2pKSkpE6ZMiV+yJAhuu5eY+7cuQ3Jycm2QiWWBx54QD1lypTWoUOH\nJiclJaW8/vrrYZ2doy9AMIxLJh2cowdHlzAMA4qyZpf4fP4Nlbbh4OhFevSHcP78eeWQIUMauz1w\n1y4fPPpoHEiScChaEggYCAQMPvlEgQcfVPfkWjiA8+fPBw0ZMiS6o59xkSqHR6BpGhaLBUajEVqt\nFlqtFiqVCiqVClqtFgaDAWazGSRJgqZpuHgzx8HB4QwPPqjG6dMFmD27ATIZBYIAZDIKs2c34PTp\nAk5Qex+uUImjR9A0DZIkbdEpQRDg8XggCMImnBRFgSTJds8zGAzw9/eHQCAAj8ezPY+Lbjk4ekBq\nqgnbt1dg+/aK630pNyOcqHK4DMMwYBgGFosFbEM3K4b2ESgrjh2JpNlshlKphEwmg9lsdngOj8cD\nn8/nxJaDg+OGgxNVDqdhGMYWmbYVU1dhn8PnOxbysa9BUZSD2LLH2v/HiS0HB0dfgxNVjm5pK6as\nkPVEzNpGtfaPd3Ree7Ft27emUqkQHBxsi3Dto1sODg6OawknqhydwjAMSJK07Yd6QkxZOhPVro7v\nTGyvXLkCX1/fdmLLiqx9ZMuJLUd/53KdRvTBkSuhh/PqAo0WiicW8unJaaFNC2+Lr0sM9TZd7+vr\n73DVvxztYMXUZDLh/PnzUKvVHk+1uiqqXZ2HIAjbHqy9gLL7vgaDATqdDhqNBiqVCmq1GjqdDkaj\nERaLxRb9cnDc6Hx3odrnnveOpXx7vjrIYKF4DACDheJ9e7466J73jqV8d6Ha7dFvBEFkPvHEE5Hs\nv19++eXQpUuXDujqOe+++25gdnZ2VEc/szfMd4cDBw54EwSR+c477wSxj/32228SgiAyX3755dCe\nnJslIiIivaamxqXgkxNVDhusCJlMJlgsFgDt9zydoS9Egm0LnuzFFgBIkoTRaHQQ2/LycqjVak5s\nOW5ILtdpREt3nY8zkTSPoh37YikahImkeUt3nY+7XKdxa/Sbl5cXc/DgQX9XRcYTsFs/bUlISDB8\n/fXXNremTz/9NGDw4MGGa3pxbeBElcMmpkaj0ZbqtY9MOxrZ1FM8Fam687r2gmsvthUVFTAaje3E\nlu21NRqNtl5bTmw5+hofHLkSStJ0l3e0JE0T/zmicGv0G5/PZ7KzsxtWr17dLgqsrq4WTJ48OS4t\nLS05LS0t+X//+5+s7TGFhYVeQ4cOTUpLS0tesmSJQ4S7cuXK0LS0tOTExMSUZ599dgAAFBUVecXG\nxqY+8sgjUampqSmsUb89ERERZpPJxKuoqBDQNI2ff/7Zd8KECSr25/n5+aJbb701ITU1NTkzM3Mw\nO1z9888/983IyEhKTk5OGTt2bGJFRYUAsHoc33LLLQnJyckpc+bMGeTO3zknqjcx9oYNJEk69Jiy\nsGlUT3O9RLUz2OvpSGwJggBFUTax1Wq1aG1t5YwtOPoUh/PqAttGqG2haBCH82vdGv0GWMe57dmz\nJ6CpqckhhbVgwYKBS5curcvLy7u0d+9exVNPPRXd9rkLFy6Mmj9/fkNeXt6lsLAwC/v4nj17fK5c\nuSK+cOHCpUuXLhWcO3dOeujQITkAKJVK8WOPPdZ06dKlgsTERHPbcwLAfffd17Jjxw7/H3/8UZae\nnq63N/ifP3/+oA8++KA8Pz//0r/+9a/Kp59+OgoAJk2apD137lzhpUuXCh544IHm1157LQwAli9f\nPmDMmDHaS5cuFUyfPr21pqamnZB3B1eodBPSkWFDZylbdyJVZ6dK3Aji01mvbVfGFiRJwmw2w9/f\nv12BVF9IjXP0T4wWyqkgyWCm3DakDwgIoGfNmtW0du3aEIlEYlsYfvvtN5/i4mLbaDetVstvaWlx\nuJ6zZ8/KDx06pACABQsWNL3++uuRAPD999/7HD161CclJSUFsJrxFxYWimNjY83h4eHmCRMmdOkb\nnJ2d3Txz5sy4wsJCyZw5c5qPHTsmB6xD1XNzc+WzZs2KY481m80EAJSWlnrdd999kQ0NDUKz2cwb\nOHCgCQBOnDjhvWfPnisA8PDDD6sWLFjg8kQfTlRvEuwNGy5fvozIyEhIJJJuF/nejFT7Is5eV1di\nazQaUV1dDalU2u45nLEFR28hFvJpgxPCKvHi92ge6Ysvvlg3fPjwlIcfftjmRcwwDE6fPn1JLpd3\nuVjweLx2P2cYBs8880zN888/7+BtXFRU5CWVSm3CvX37dr/Vq1cPAIBNmzYp2cejoqJIoVDIHD16\n1Gfr1q3lrKhSFAVvb2+ysLCwoO1rLlq0KGrJkiW1c+fOVR04cMD7tddes6Wj2boLd+HSv/0c1uDe\nbDbDZDLZ7AEpinJqIXd3T7U7Ie5r6V/AM5Ez+562TSOzwwVomobZbIZer4dWq4VarYZKpYJGo4Fe\nr4fJZOLSyBxuMTkttInP63roCZ8HZnJqmMuj3+wJDQ2l7rnnnpbPP//cVnU7btw49bp162x7tceP\nH283kHz48OHazZs3BwDA5s2bbSnoKVOmqHfs2BGkUql4AFBaWiqsqqpqF/BlZ2e3FhYWFhQWFhaM\nHz9eb/+zV199ter111+vFAj+eFpAQAAdGRlp3rp1qz9gzdD9/vvvEgDQaDT8qKgoCwB8/PHHtmsZ\nPXq0ZuvWrYEAsGvXLh+1Wu1yVM+Jaj/FXkzNZrMtJcsu9s4KJY/Hc0lUuair8/R3RwVSbHq4M7Gt\nr69Ha2urrSKbq0jm6IyFt8XXCTqIBO0R8HjM07fFuTz6rS0rVqyobW1ttSnYpk2bKs6ePStLTExM\niYuLS33//feD2z7ngw8+KN+0aVNIWlpaskqlsonV/fffr541a1bzyJEjkxITE1NmzJgR19ra6pKY\nTZo0STdv3rzWto9/8cUXJdu2bQsaPHhwSkJCQuru3bv9rl5/9ezZs+MyMzMHBwYG2vZv1q5dW/3b\nb7/JU1JSkg8fPuwbHh7e4T5uV3Cj3/oZrJiyFaodpSnz8/MREREBPz+/bs+nVCohFAoRERHh9DXY\ni3hXnDp1CiNHjnT6vL19ntzcXKSlpUEoFPboPC0tLWhsbERCQkKPzsMwDBQKBXx9feHv788ZW9zY\nXJPRb99dqPZZuut8HEnThH3REp8HRsDjMW8/OERxd8YAblJND+lq9Bu3p9pP6EhMO9sbcCX6dDVS\n5XC+UKs77P2R7dNa9vvjZrOZE1sOG3dnDFAnhHoX/OeIIuRwfm2gwUzxJV58anJqWNPTt8XVc45K\nvQ8nqjc4rPtRZWUlwsLCuhRTFleEsi/uffYWnhJDT50HsO4Dtf08u7JsBKzVx6x5BwuPxwNJkhCL\nxRAKhZzY9mMSQ71N7zw0tAIAN/rtOsCJ6g1KW19epVKJAQO6dAyz4Wqk2naB5ugaT4oq2zvrDN21\n/xQVFWHQoEEOVcmsuLKuU5zYcnD0DE5UbzBYu662Jveu0FuRKsMwqKurQ1lZGQQCAeRyOWQyGWQy\nGSQSSY9L1W8UPB2p9vRc7PMZhrGJJ/tvAO22DTozweDafzg4uocT1RsEVwwbusPTe6oMw6C2thal\npaXw8/NDUlISaJq2VbLW19fDYLDacUqlUpvQsm0jfWWRvlHSv546lzvGFuz2QtvolhNbDg4rnKj2\nYewLUpwZCu7sYu4pUaVpGjU1NSgrK0NAQACGDx8OsVhsq/6VyWQIDg52ON5+YozJZMLp06dBEAQk\nEglkMpktuhWLxTfsIu3p9K+nzkVRlFMDEroTW5qmUVhYiJCQEPj6+tqO5Ywt+gj1hSIcWx+KSwcC\nYTHwIJTQSJ7WhHHL6hCSxBUq9TKcqPZB2lbyAt1HpmzvqTOLZk/TvzRNo6qqCuXl5QgKCsKIESPg\n5eXV5XPY12Wj1JCQEDQ1NWHkyJG2qFan00GtVqO6uhpGoxE8Hg9SqdQhjSwSiXptkb7ZIlVXsRdb\nhmEgFAodUsns1oTZ7Nja11FfLie2vUT+Xh/sfSoOFEmAIa1vsEXPw8U9QSjYH4gZ/1UgdYZbLTV8\nPj8zISHBQFEUER8fb9i1a5fS29vb460BWVlZg996662K8ePH6yMiItJPnz59KTw8nOz+mX0DTlT7\nEOzCxFbzWiwWREdHOx19OhuJuFJ8ZC/AFEWhqqoKFRUVCAkJwciRIx3E1F14PB7kcjnkcrnD4xRF\n2cS2tbUVVVVVNrFlRbY/p5HZc3lKVHsz6u2qIrnt2C72Ojras+WKpHpAfaEIe5+KA2ls/4VhSAIk\nSWDvU3EITi5wJ2IViUQ0a/k3ffr0mPXr1wevWrWqzgNX3q/gRLUP0FGPqUAggMlkcnqB6a3eU3ZC\ni1KpRFVVFcLCwpCVldVjgwRn4PP58Pb2hre3t8PjFEVBp9NBp9OhpaUFRqMRp06dAp/PdxBbuVwO\noVB4zRfpvlaoxHK9UsndiW1zczP0ej0iI63zr7leWzc5tj4UFNn1m0SRBI69HYL7N/Wo3WbcuHHa\nCxcuSABg1apVoZ999lkQAMybN6/h5Zdfrn/ppZdCxWIx89JLL9U//vjjA/Pz8yUnTpy4vG/fPu+t\nW7cG7du3r3TPnj0+r7322gCz2UwMGjTItHPnTqWvr+8N3xTPiep1pCvDBj6f3+FQ3s7oDetBkiRR\nW1uL2tpaxMTEYNSoUQ4mBNcLPp8PHx8f+Pj4ALA6GI0cORIkSdrEtqmpCeXl5TCbzRAIBA5iK5PJ\nOoyw+3v615NQFNXjVDL7HrHfcz6fzxlb9IRLBwJtKd/OYEgClw4Eogc9rBaLBYcPH/a588471b/+\n+qv0888/Dzxz5swlhmGQmZmZPGHCBM3tt9+ufeutt0IB1J87d05qNpt5JpOJOHr0qHzcuHGampoa\nwerVq8OPHj162cfHh16xYkXY66+/HvrWW2/VuHtdfYXrv0LehLA9pqyPa0eGDa6KKpv+dfbYrkTV\nYrGgvLwcNTU1CAoKQnBwMGJjY52+luuFQCCAr6+vrXiGxWKx2CqRGxoaoFQqYbFY2rX9eMrkoq+m\nbD0pPs7u3zsDRVG2mzV3jS04sQVgMTj3pbPo3frgTCYTLykpKQUARo0apVmyZEnjv/71r+CpU6e2\n+vj40ABw9913t/zyyy/ezz//fMOjjz4qa2lp4YlEIiYjI0P766+/Sn///Xfv9957r/zIkSMyhUIh\nzsrKSgIAi8VCZGZmat25rr4GJ6rXkLaGDV25H7kSeQKeSf+azWaUlZWhvr4eAwcOxJgxY6DX61Fa\nWur0dfRFhEJhp2Kr1Wqh0+lQV1cHg8GAU6dOQSgUOoitTCZzKULvq9W/nsSTNw4URXW7N99dRXJn\nYvvvf/8by5cvvybbFdcdoYSGRd/9hyKUujX6zX5PlaWzG1GRSMRERkaaNm7cGJSVlaUdMmSI4ccf\nf/QuKysTDRs2zFhUVCQaN26c+ttvv72xF5cO6Ht5pX4ITdMwmUxQKBQgSdImpl0tlq5EnkDP0r9m\nsxlFRUU4deoUxGIxxowZg6ioKIdxZf0RoVAIf39/REZGYvDgwZBKpcjKykJqaiqCgoJsLUPnz59H\nTk4Ozp07h+LiYtTU1ECtVrfr4WTxtBD2VVH1FCRJuh31spFtR9EqAOzevdtjEXWfJ3laEwhBNzMX\nBQySp/Vo9Js9d9xxh/bgwYN+Go2Gp1areQcPHvS//fbbNQAwduxY7caNG0Nvu+02zcSJEzWffPJJ\ncEpKip7H4+G2227TnT59Wp6XlycCAI1Gw7tw4YLIU9d1PeEi1V7E3rCBYRhUVFRg4MCBTj3XnfSv\nq6JqNBqhVCrR3NyMQYMGISEhoV300VtDyvsyXl5e8PLygr+/v+0xhmFgNptte7ZVVVXQ6/WgKAoi\nkcihOMqVz+1a0Zc/Q/v0r6ewb+vqizclvcK4ZXUo2B8Isot9Vb6AwbilPR79ZnvJceP0c+bMaRo+\nfHgyYC1UuuWWWwwA8Kc//Unz7rvvht1xxx06Hx8fWiQSMbfccosWAAYMGEB++OGHyocffjjWbDYT\nAPDKK69UZWRk3PB9tJyoepjODBtcTZW5k/51djG3WCxoaWnB2bNnERMTg8GDB3e68LgzpaY/LmIE\nQUAkEkEkEiEgIMD2OMMwMJlMNrGtrKxEc3MzCIJAfX19uwIpV78HnhJDTxc8efIz7kmk6gz98fvY\nISFJJsz4r6JdnypgjVD5AgYz/qtw1wBCr9fndvT4qlWr6jpqrbn33ns1JEmeZf+tVCrz7H8+ffp0\nzfTp0y+1fV5OTk4R+/9VVVUX3bnW6wknqh7CvsfUGfej7uiNSJXdH21tbYVQKMSoUaO6vb6baUqN\nOxAEAbFYDLFYjMDAQABAaWkpZDIZvL29bWLLto3QNG1zj2L/k0qlvV7h60lR9fT3wdn2HFfpbbHu\nk6TOUCM4uQDH3g6xOirp+RBKKauj0tJ6zlGp9+FEtYe0FVNWSHt6d+zJPVWdToeSkhLodDrExsYi\nOjoaly9f9riloTv01UKcnsAW8UgkEkgkEgQFBTn8jLVq1Ol0aGxshF6vB4B2YiuRSDx2TX3Jmakt\nvZH+BQCVStWuOO2mICTJdLUPlRv9dh3gRNVNOuox9aT1mqt7mR2JsFarhUKhgNFoRGxsLIKCgkAQ\nBIxGY6/PU3VWLPurqHb2OxEEAalUCqlU2qkvsk6nsw0h0Ov1yM/Pbye2rr5nnowGPS2qvRVRqtVq\n+Pn5efy8HBxdwYmqi9iL6dmzZzF8+HCX5l32VjO/vahqNBooFApYLBbExsYiICCgXRN9b7gvuUp/\nE1MWd24U7K0X7cnJyUF0dLRtCEFtbS2MRiOAPyb+ODOEwJPfO0+naz3Z82pPa2vrzRmpclxXOFF1\nko4MG1yxEQSs5gQ9daLpDD6fD41Gg7Nnz4KmacTFxTlUr9rTW/NUXaW/7td60kSCIAiHIQQs9qP1\nVCpVt0MI+rKo9la24qZN/3JcVzhR7YbuDBtcWRDY4iNPN6K3tLSgtLQUFEUhPT2925SXq6Lam/RH\nUQU887519d1ydQgBW5VeXl5ui269vLzcuk5Pi2pvfcdUKtVNmf5VtCpEWy5uCf2p/KdAI2nkiQVi\nekLUhKb56fPr4vziuEKlXoYT1U5gzb7txbTtHz8rks4WWfD5/E4NA9yhubkZCoUCAoEAERERMJlM\nTi0ifSVC7M/pX09Ehe5EcJ0NIWhoaEB9fT2EQiFaWlpQWVkJk8nk1hCC3sq2eJqbUVQPKw/7rDi2\nIo6kSYJiKAIADKSBd6j0UNAPZT8EvjHuDcXk6MlujX4jCCJz/vz5dZs3b64EgJdffjlUq9Xy3377\n7Wp3r/f48eOSiooKr4ceekjl7jnasmvXLp/XXnstQq/X8xiGwaRJk1SbNm2qBIAPPvggYMOGDWE0\nTRN8Pp8ZOnSobuPGjZVBQUEeay7nRLUN9oYNQNdtMQKBACRJuiSqrhoDtE3bMQyDpqYmlJSUQCQS\nISkpCd7e3raWDWfobTGzWCwwmUzdFtT0FXH3NJ5KZ3oyZcsOgg8PD3d43J0hBJ7cA+3NyvLW1lan\nzVb6A4pWhWjFsRVxJsrU7ktDMRRBURSx4tiKuHi/+AJ3IlYvLy/m4MGD/jU1NbWemm96+vRp6enT\np2WeEtVTp06Jly1bFrV///4rw4YNM1osFqxfvz4YAL7++mufjRs3hh4+fLg4JibGQpIk3n///cCq\nqioBJ6oehm2L0Wg0EImsTlnOVPKyouos7k6eYSuBGxsbUVJSAolEgtTUVIeilt5ufXEGk8mEkpIS\nNDc3w8vLq10kxO7zsYtzfxVVT41r86S/bmcC3dUQAlZs2w4hYA3rW1tbIZPJerSd0VkqWW+mUNZs\nQHKYvINnOcfNVv275eKWUJLuekoNSZPElotbQtbcusbldhs+n89kZ2c3rF69OvS9996rsv9ZdXW1\n4LHHHhtUVVXlBQBvv/12+Z133qlLTExMOX78eFFAQAAVEBAw9J///GfFokWLmu67776Y7OzspjVr\n1gwwGo28pKQk+bJly2qmT5+unjt3bnR5eblIIpHQmzZtKhs1apRh6dKlAyoqKrzKyspE1dXVXk89\n9VTdSy+91M4ZavXq1WHLli2rGTZsmBGwWpEuX768AQDWrFkTvnbt2sqYmBgLYP3uP/PMMx6zbGS5\nqUXVvseUoiicPXsWY8eOdXmP1FncOZ4kSTQ1NaG0tBRyuRzp6emQSqUdHnu9RNVkMqG0tBTNzc2I\niYlBQkICSJIEj8dziITsF2ehUAiDwYC6ujr4+vpCJpP1m0Z9T7ogXev5pyxCoRB+fn7tRImdYKTX\n61FXVwedTgeSJN0eQtDR9onBQuHpnRdxtkKNZ++IwV/GuBdtqtXqm6pQ6afynwLZlG9nUAxF/FT+\nk9uj355//vn69PT01FWrVtXaP75gwYKBS5curZs8ebK2uLjYa/LkyQklJSX5I0aM0P7444/yuLg4\nU2RkpOnYsWPyRYsWNeXm5so++eSTshdffLH69OnTsu3bt5cDwKOPPjpwyJAh+h9//FGxf/9+70cf\nfTSGNfG/cuWK+Pjx40Wtra385OTktOeff75BJBI5/LEVFRVJXnjhhQ4Hp1+5ckUyduxY59J5PeCm\nFFW2LYaiKNvCxRrcu1rN21uRKmt1eObMGfj7+2PIkCFdmgG4ahbhCcxmM0pLS9HU1ITo6Gib3aH9\ndXQWCZnNZly4cAEkSaKqqgo6nQ40TUMsFtsKcNiezBth/64tfS3966lzCYVCiEQiiMViRERE2B5n\nfZG1Wi1qamqg0+ls02fssxRSqdRBRNuKvcFCYfGufORWWLf9fMTuL1E3256qkTQ69QEbSaPbd68B\nAQH0rFmzmtauXRsikUhsd/G//fabT3FxsW2B0mq1/JaWFt6tt96q/b//+z+5Uqn0mj9/fv22bduC\nS0tLhb6+vmRHA8lzcnK8d+/efQWw2hg++eSTgqamJj4A3Hnnna0SiYSRSCRkQECApbKyUhAXF2dp\new5nyMnJkWRnZ8fodDreyy+/XPXEE0+0uHOejripRNXThg29EanSNI3a2loolUpQFIWUlBSb/V1X\nXMv0b1sxTUxMdPk9ZE3rw8PDIRaLAVg/H6PRaBvHxhogAHBoE5HL5RCJRH220KmvDjv3lGsRTdPt\nRrW5O4SA/d5SFAULDfztq3zkKFux5PZobPhFCbnI/eyFSqXqtK2sPyIWiGkD2f1MVbFA3KO77xdf\nfLFu+PDhKQ8//HAj+xjDMDh9+vQluVzuEDlOmjRJs2nTppDKykrTunXrqvbv3+//6aef+o8ePbrD\n2akdZXkIgmAA6zg59rGrWTxizZo1wZ988kkwAHz//ffFiYmJxpMnT0rHjBljaHue+Ph4w/Hjx6X3\n3HOPJisry1BYWFiQnZ0dZTBE5xLqAAAgAElEQVQ4OYfWSW68EMAN2LYYk8lkm7nYWWTqSurO1UiV\n7VPtCJqmUVlZiRMnTkCj0SAzMxP+/v5OL4TXQlTNZjMuX76M06dPQy6XY/To0RgwYIDbC3/bPVW2\nmCY4OBjR0dFIS0vDyJEjkZmZiUGDBkEkEkGlUtnG1J05cwZFRUUwm81oaWlpN0/zetEXC5WuR58q\nO4QgICAAAwcORHJyMjIzMzFy5EgMHjwY/v7+MJvN0Ov1yDl9Fn/+6HecLG3F4lF+iJVb/04kAvev\n+WYT1QlRE5r4BL/LBYxP8JkJURN6tI8YGhpK3XPPPS2ff/65zX9z3Lhx6nXr1tkaqY8fPy4BgPj4\neEtLS4ugtLRUnJKSYh4zZox248aNYePHj9cCgI+PD6XVam0f8ujRozXbtm0LBIADBw54+/v7kwEB\nAZ0ubC+++GJDYWFhQWFhYUF0dLTlxRdfrH377bfD2TFyFEVh1apVoQDwwgsv1C5fvjxSoVDYigCM\nRqPH78z7daTqylBwwL0WGVcj1bYLPyumFRUVCAkJwYgRI2xRgCvnd2dP1RUrwcuXL6OhoQGDBg3C\n6NGjr2lKtrOeTHa/trGxEQ0NDSgtLQVJkg4pR7lcDqlUek33az0Zqd7IotoZ9kMIKIoCIfDCO6d0\nKGgy4KU7o3FHjBTHrliDoKoyBXJaS9waQqDT6do5VPVn5qfPr/uh7IdAiup8X1XAEzDz0+f3ePTb\nihUratkIEQA2bdpUMX/+/KjExMQUiqKIUaNGacaOHVsOAEOHDtWx69htt92mWbNmTcTEiRM1ADBl\nyhTNW2+9FZ6UlJSybNmymnXr1lXPmTMnOjExMUUikdAff/yxS0PMR40aZVi3bl3F7NmzYw0GA48g\nCEycOFEFAA899JCqvr5eMGXKlASKoggfHx8qKSnJcO+997rVYtQZ/VJUGYaBVquFyWSCTCZzOsXr\naouMQCCAyeR8Zbp9nypFUaisrERlZSVCQ0ORlZXVrorSlX1SV/dU2Sixq/fFYrFAqVRCp9Nh4MCB\nGDNmjFMLs7OC0tPqX3a/1svLC4mJiQAcU45arRYVFRXtpsOwYuuOh64zeEoMPV2o1FdE1R6D2YJ1\nx5pwqsqAV+9OwP1DrS0/skYGQD0yM1KRGCJzaQiBvW/2jbgf7y5xfnGmN8a9oWjbpwpYI1QBT8C8\nMe4NhbsGEPaj3wYOHEgaDAbbv8PDw8nvvvuupKPnffPNNzZhnDRpko6m6TPsv0NDQ6m8vDyH8W8/\n/fSTou052vbCFhcX53d2nbNnz1bNnj27wxadxYsXNy1evNjjFb/29CtRtTdsaG1tRUtLCwYPHuz0\n891J5zrbGwr8EamWlpaiuroa4eHhGDVqVKci7kr06apAsenijhYdi8WCsrIy1NXVISoqCj4+PoiI\niPD4AtUbLTVdzT1lF2atVuuwX8sKLbtF4K7TkP1reQJPp389JYSeEmgzSeO1n2pwqsqAl6f8IagA\nUKuyrvtykcDlIQQXL17EgQMHYDKZsG/fPqSmpiI2Nrbb37+iogLZ2dmora0Fj8fDk08+iSVLlqC5\nuRkPPfQQlEoloqOjsWvXLvj7+4NhGCxZsgQHDx6EVCrFxx9/jOHDh/f4fekJk6Mnq+P94gu2XNwS\nctVRiS8WiKmrjkr1nKNS79MvRLUjwwahUOhyNaw71bzOHk+SJGpra1FbW4u4uLguxdT+/M7+Du4Y\nuLcVbJIkoVQqUVdX5xCZ1tTU9Jrp+bXqU+1sYWZt/bRaLSiKQmFhIUwmk838wL5NxNl+zL5aqNSX\nBNpC0Vi25xJyKvVYcksoZg3/Q1ArWgz4z69lAACZV+ev09kQgoyMDGRkZGDRokU4d+4cPv30U4wf\nPx5/+9vfurwmgUCA9evXY/jw4ba6hkmTJuHjjz/GhAkTsHz5cqxduxZr167FunXrcOjQIRQXF6O4\nuBgnT57E008/jZMnT/bgXfEMcX5xpqt9qNzot+vADS2qbKqvo6HgQqHQ5cIVTxYesdhHfcHBwQgK\nCkJ0dLRT53fHgclZ7EWVJEmUlZWhtra2wzRvbxVB9YXqXXtbv8rKSgwZMgSAo/mBfT8mW7VqL7ht\nxYorVOoaC0XjuT2XcKS4CU9m+mJG+h/zZkub9Jj/6QVYKOvNlsyN6l+RSIS4uDgEBQVh1apVTj8v\nPDzc5jjl7e2N5ORkVFVVYd++fThy5AgA4NFHH8Vtt92GdevWYd++fcjOzgZBEBg9ejRaW1tRU1PT\nzrWK4+bihhZVduHqaM/UVYF05zldRapmsxlKpRINDQ2IiorCmDFjYDQaUVRU5PT5e7P3lMfjwWKx\noLq6GjU1NYiMjMTo0aM7XCx7y/moLzsqdWR+wN7EsS0/9vu19mPYPOXv3Fcj1Z6IqoWi8cLeQvx8\nuQnL74zDSF+d7VyKBh0e/+wCGACTU4JxuKABQr5719za2tqjHlWlUonc3FyMGjUKdXV1NqEMDw9H\nfb21zqeqqsrBBjEyMhJVVVWcqN7k3NCiCnQeRV2vSNXeXYgVU3Yxc6da2Gw2O328s5AkCb1ej9zc\nXERFRXUqpiy9Gan2VVHtCPv9WvveYXa/VqvVQqPRwGAwIDc31yE9aW/R6KxQ9tVI1d1zWSgaf/+m\nED8WNeLvk+Iwd2QECgoKIBAIUFSnxZOfXwSPILD1kQx8mlPlVpTK0hPjB61Wi5kzZ2LDhg3w8fHp\n9LhOeirdek2O/sMNL6qd4Y4QCAQCl4TYPlI1Go0oLS1FS0uLg7tQ2/P3pq1hd1AUhfLyclRXV4PH\n4yElJcWpPr7ejFT7A/b7tSEhIWhubsbw4cPBMIxtv7a5udnBrN7eyKIzSz9PRqqerNh1p7qZpBm8\nuK8IPxQ24rmJsXgkK8J2XcWNRizecxkiAQ8fzc1AdKAUWjMJuahnbkruWBRaLBbMnDkTc+fOxf33\n3w8ACA0NtaV1a2pqbHNtIyMjUVHxx7ZlZWUlBgwY4PY1ewrTlSuixg83hWp+/DGQMRp5hFhMe0+c\n2BS04Mk6UXw8V6jUy/TbenN3FiN30r8WiwX5+fnIzc2Fv78/xowZ06khgqvpXHd7T9tCURSUSiVO\nnDgBABg9ejR8fHycfo/cuUFx9tw3UqTqLKwYsvu14eHhiI+Px9ChQ5GVlYX09HQEBweDYRjU1tbi\n/PnzyMnJwfnz56FQKFBbW2srnLre0aUnMJM0Fnx+EYcvNWDh+Cg8OirS9rPLjSb89esiSIV8fDxv\nCKIDrb7WOhPVZZFSd7hjps8wDB5//HEkJydj6dKltsenT5+OTz75BADwySef4N5777U9vn37djAM\ngxMnTsDX1/e6p37Vh773KZ35QIr64MEgxmDggWHAGAw89cGDQaUzH0hRH/q+89C7CxobG/lr164N\n7v7I7jlw4ID3Dz/80GkDsVQqHebuuYuKirwSEhJS3X2+J7jhI1VPRjuuiKper0dJSQn0ej0SEhKQ\nkpLS7bW4U6HrjgizEQlFUaioqEBVVRUGDBjgUHHsilDa9/15khst/esKXX3WQqEQ/v7+7Sz9TCaT\nbb+2qakJra2tAKxD6O0jW7FY7PJ36XqJqsFC4dmvC5BTZv1d7ssIs/3sXKUa63L0CJCLsPWRIRjg\na7WrJGkGFS0GBMm8OjynM7gTqf7222/YsWMH0tPTMXToUADA6tWrsXz5cjz44IP46KOPEBUVha++\n+goAMHXqVBw8eBDx8fGQSqXYtm2b29frCUxXroiqly+PY0ztR7+BogiGoojq5cvjRAnxBa5GrE1N\nTfyPPvoohJ34wuJKXz/Lzz//7C2Xy6lJkybpXHpiD17zWtJ3r8xDOLOYnCptwScny/HcnyK6FVWt\nVouSkhIYDAbExsZCpVLZ0kGextX0r70Is8YSnfXCuiKqBEFwe6q9jL3LUFCQtRq2vLwcQqEQPj4+\n0Ol00Gg0qK2thcFgsO3X2ottWz/ejl7jWqI1kfjrl3nIrVDjrpQgfF/QCOnV6PNMuQoLv8yDjxeB\nj+cNRZiPdeSimaTxwjeXUNpkgJ/E/ZFyra2tCA0Ndek548aN6/T7+NNPP7V7jCAIbNy40a3r6w0a\nP9wUypBdj35jSJJo3LQ5JOLNdS612yxbtiyyoqJClJSUlCIQCBiZTEaFhIRYCgoKpAcPHiyeNm1a\nAmvIYD+8/J///GfItm3bgvl8PpOYmGhcv3595fbt24N5PB6za9euwA0bNpTfddddHfoA19TUCKZM\nmRK/fPnyGrlcTr/++uvh7GtOmzatJSgoiFy5cmU9ACxevDgiNDTUMmvWrFb2+Xq9nsjOzh504cIF\nKZ/Px5tvvllxzz33aDIyMpK2bt2qHDFihBEAsrKyBq9fv77i1ltv9cgEmxteVLuLCFjbuq5Y+e0l\nKJv1uFipwt8yJUjr4BiNRgOFQgGz2Yy4uDgEBASAIAgUFxf38DfoHFdFlSAIVFRUoLa2FmFhYV32\nwvZ2pOrJ/cCbFTbrwBY72d+8URRlM7JoampCWVmZbaRe2/5aT97VO/s9aNVb8NTOiyiq0+HNGUko\nbzbie1hFNUfZikW78hDmI8JfU2iboOrNFJ7dXYDjJS3wlQgQ4Sd2+zrVarXNZetmQfPjj4HowqIQ\nAEBRhObHHwIB10R1/fr1ldOmTZMUFhYWHDhwwHvWrFnxubm5+UlJSeaioqJOF9h33303rKys7KJE\nImEaGxv5QUFBVHZ2doNcLqdee+21Dke0AUBFRYXg7rvvjn/11VerZ8yYoT5w4ID3hQsXZPavOWPG\njLiVK1fWUxSFb775xv/UqVOXVCqVbc+A9SK+fPlyQW5urnjq1KkJCoUib+bMmc2fffZZwIgRI6rL\nysqE9fX1Qk8JKtAPRLUr2HRud6Ia5iuGl4AHtcGCV46qAL9qzBxmLThQq9VQKBSgKAqxsbEOLj0s\nvSUgzu6psv7B7NBoZ4wlejNSddYWkotUu6ar7xWfz4ePj0+76tTORrAZjUYoFAqHEWzupIOdyfw0\naEx48ouLKG82YMMDKfhTQiDe+bkUXnwCp8pa8bevCjDQX4zNczJQUnAOAKAxWqPa81VqvDYtEe/8\nXNrj6t+byUwfABijc6PfGIP7o99YMjIydElJSd22JgwePNgwY8aMmOnTp7fOnTu3tbvjAYAkSeKO\nO+4YvGHDhrK7777bFsXav+bgwYPNfn5+5G+//SapqakRpqam6sPCwih7UT1+/Lh88eLF9QAwbNgw\n44ABA8wXL14UZ2dnt0ycODHxnXfeqd6+fbv/Pffc47Gxb0A/ENXuIlVnqnnlIj6atAy+fnIEnth2\nAv/4pgCnSxpwX5QFAh6BuLi4ToseWHFytrKSFShnFrTu9lRpmkZVVRXKy8sRGhqKoKAgREZGOhWZ\nuBqpcunfa487+6CdjWDLycmBr68vtFqtg3eufX+tTCbrdr+2uyriapURT3x2AQ1aMz54OA2joq3X\noTdTEPJ5WLwrHzGBUmyakw5/qRAlAJp1Zjz1RR6KG3T414xk3JkcjNcPFfe4+vdmmqUKAIRYTDNO\njDEjJD0b/QYAUqnUtiAIBALGfn0w2on7L7/8Unzo0CHvb775xu/NN98cUFxcnGd/HpIkkZaWlgIA\nd911V+uGDRuq+Xw+k56erjt06JCvvajavyYAPPbYY41btmwJqq+vFz722GPt/Hw7W1tiYmIsfn5+\n5MmTJyV79uwJ+PDDD8tcfwc654YX1a5wtvDIWySA1kQhUC7G3zJ4+LZcgD0XGlDcIMPGOcPhdzU9\n1dVrOCuqbErXmcWys/SvvZiGhITYzPjz8vJ6Jfp0Rfy0Wi2Ki4uh1WptrSP2Q8fbCj4nqp3jqQwI\nO50pKCjItl8LWL9Her0eOp0OKpUK1dXVMBqNDiln+/5aoGvfX2WTHvM/uwC9hcbmuRkYEvFHFK1o\n1EFnppASJsemOenwlVhtRFVm4M87zqNaZcK7s1Jxa3wAzCQNC8VA3oPq35sxUvWeOLFJffBgUJcp\nYD6f8Z44yWVDeV9fX0qn03X4wUdGRpLNzc2C2tpavq+vL3348GHfCRMmqCmKgkKh8Lrnnns0d955\np3bAgAEBKpWK7+3tTanVaj5gXT8LCwsL7M9HEAR27dqlnDp1atw//vGPsNWrV9d29Lrz5s1rfeON\nNyJIkiRmzpzZzsx/3Lhx2k8//TRg+vTpmgsXLohqamq8MjIyjADwwAMPNK9evTpMo9Hws7Ky2s1e\n7Qn9WlTZPdXukIn4UBssOHXqFCjSgldnjMLEMj1W7CvAzA9PYsODGRgxqOO7Xld7T9njnfGRbRsh\n0jSN6upqlJWVOYgpiystOJ6OVPV6Pa5cuQKj0WirhqRpGlqtFlqt1qFNRCwWQy6XQ6/XQywW94n9\n174o7p6q2O3sd7MfqWdf1MOO1NPpdGhoaIBSqbTt14pEIpjNZqjVashkMtvNZFGdFk9+cRFggK1z\nM5AU9seYvr3nanGqTAWRgIfNczPgI7YuO8pGHVbnmGCgePjv7DSMiLL+jbXordklWQ8iVbVa7Vaf\n6o1M0IIn6zT/+18g04WoEgIBE/TkEy6PfgsLC6MyMzO1CQkJqSKRiA4ODralAEUiEbNs2bKarKys\n5MjISFN8fLwRsKZx58yZE6PRaPgMwxALFiyoCwoKombOnNn6wAMPxB06dMivs0IlgUCA/fv3l0yc\nODF+7dq1VFpamrHtMWKxmBk7dqzaz8+P6ig798ILL9TPmzdvUGJiYgqfz8eHH36olEgkDAA88sgj\nLStXroxasmRJdbsn9pAbXlS7Woy7M3NgGAaNjY1QN9VDZ6aQnJyMixcvwtvbG1PTvBEfLMOinefx\n6Mdn8I+7EjEnK7Ld67liqu/q8exr0TSNmpoaKJVKBAcHY+TIkR3uE7s6Ks7Z6+iqUIndq9NoNIiP\nj7c5DbEmBx1Z/RmNRmi1WptXalVVlUM1K/ufswb2/RVPjZBz9aaFHanXVpTMZjPq6+uh1+tRVVUF\nnU5n3c83CPDmSR2kXny8/8BgJIZIba+79fdKbPilFH4SASL9JDZBvdKgwxNf5MNIAR/NzUDqAG8A\ngM5EYtkea+AiFrh/o6XRaLp0Q+qPiOLjTQPWrlVUL18ex5Ak4RCx8vkMIRAwA9auVbhrAPHtt992\nOtv0pZdeqn/ppZfaifWZM2fa+bJmZGSYLl++XND2cRZ2xJxYLGaOHTtmqwSdNm2axv44iqJw9uxZ\n+VdffWUbFTd48GAzW4UslUqZ3bt3Kzt6jYEDB5IkSZ7p6Gc95YYX1a7oTFQZhkFDQwNKSkogl8sR\nGxkO5koZCC+J7ecEQSAxVI6vn8zCC3vy8drBIlysVmPVtCSIhXyH1+gtlyTWa/bEiRMIDAzsVExZ\nequit6NUsdlsRklJCVpaWhAbG+vQp9vVeQmCgEQigUQigU6ns7kQ2Vez2g8cF4lEDm0j7hbYOPt7\n9iU8NU/VUxEvO/zd19cXCQkJAIAcZQvW7cqHn0SA124PBq2qwZnaEtAMg70lwHcKI+6I80G9noK3\n2Pp3k1+twVM7L0LAA14d72cT1CadGQt35qGw1hq4+PSgpYZhmGs6mL6v4DPlLrUoIb6gcdPmEM2P\nPwQyBiOfkIgp74mTmoKefKK+vzgqnTlzRnzvvfcmTJkypSU9Pb1P/U43vKh2V6hkP++UYRjU1dWh\ntLQUPj4+GDJkCCQSCfJPVwIAcstb4XVV9Nh0go9EiA9mD8HG/yvB+0dKcblOi/cezkCEn1WA3YlU\nuxNVhmFskSlN0xgxYkS3FcxA7xUf2QswO7i8oaGhUztGd+iomtXewJ5tHWE/T/uo1hNFVP05/etp\nM332XEeLm7B0zyUM9Bdj0+x0BHtbaw8sFI2XDxThO0UD7kvxQ3a6FEsO1sKLMuDzH3Kw4awJPmI+\nVk8Kgw/PWkBa2WrAU1/koU5twuLbovHvI0rI3az+7Yuf5bVEFB9vsvahutY2cyORmZlprKysvHi9\nr6MjbnhR7Qq2iMhepPz9/TFs2DCIxX/0wMm8rG/D01+cR3aqBBkZFoeCGh6PwOLb45A2wAfP7c7D\n/R/m4J0H0jA2LtCjkSprW1daWoqAgABkZmbizJkzTgkqe+7eEFWCIECSpM1CjzXh7+lC3V0BVGcG\n9jRN26La5uZmGI1G5OTkQCgUOqSPpVLpDR2teGqv2dN2h3w+H9/l1eGlby8jMUSG/862VvICVgel\nZbsv4VdFMxb/KRpP3DLQmungNUEoleDts2qEeXvhjYlhgKEVTVotdv90Au/kWkAxwJrJESCvXqvc\ny73liY3w+1rmoYfQNE0TPB7v5r5j6APQNE0A6HTx7Bei2tnizOfzoVKp8Pvvv9tESiRqX8nrLbG+\nDclh3vjoghrVliK8MSOtXaHE7YODsXvBKCzaeR6P78jFsxPiMWmg83uT7DW1FVV7MfX39293nc4u\nrq7uqTojqhRFobm5Gc3NzYiJiel2oo0ruNtSw+PxbDNQAauN38iRIx2i2rZj2ezFViQStXs/+0Kx\nVFs8Gal66jMjSRLfFGrx0Zly8Ahgy9wMeF/dJ1UZLPjrl/m4WK3Gy1MSHAaPtxpIVKtakRQqx39n\npyFA5oW6OjFOl7Vi/e+NkAgFePPuQQj2InG40OqEpyjKB93kWIUslUq7/Zy0Wq3tu9GPyGtoaEgJ\nDg5WccJ6/aBpmmhoaPAFkNfZMf1CVNvCtpwolUowDIPRo0d3Ge15XxXPRbfF4udzV7CroBFFm3Lw\n7kMZSAiROxwbHSjFl/NHYtK/j2P9j1dwJEKG58YFI7KjE3eAvajap6P9/PwwfPhwhwgacK0P1pOi\nat+2I5PJEBUV5fRwdWfxdJ+ql5cXAgICHAw6aJq2jWVTqVSoqqqCyWQCn893EFqJROKx6/AUfW3Y\nOUUz2Ph7PfYXqjHQXwy1gbQJaq3ahKe+uIjyFgPW35+CiUl/tO58fqoKOjOFELkXtjzyR/XvryUq\nrD5Sj4ir6ePwq96/2isUAA3GjBgGGf+Pvfb6+noYDNbuh44sGtn3SqVS9bsiJZIk59fW1m6pra1N\nQz8ehHIDQAPII0lyfmcH9AtRZRdniqJsnrehoaHIzMxEXl5et+lTtslcb6EwO8MPYxPD8NoP5Xhg\nUw5WTUvCjKGO45xkIgHigqWQi/jIq9PjqX3leEvoh/EJQR2d3gF2D5aNTH19fdulo9se7+zYLnZq\njjN0Jqr2qfLg4GBkZWWhqakJOp1b3tfXHfuZpvZtIxaLxcF5iI1wL1686LBfK5FIXBI2T94k9KU9\nVaOFwvJ9hfipSI0H0vxh5nkhR2k1yClt0mPB5xehNpL478PpyIq2VnvTDIN3fi7FxyesNQszhobZ\nBHV3bg1e/6UWCYEibJ431JY+PpRfj49PWLcCZSIBpF4iSKVSBAf/MSCFTf/rdDq0tLSgsrISJpMJ\nAoEA586dQ0lJCWiadmlQ+V/+8hccOHAAISEhyMuzBiGrVq3C5s2bba+9evVqTJ06FQCwZs0afPTR\nR+Dz+Xj33XcxefLkHr2/3ZGZmVkPYHqvvgiHR+gXokpRFMrKylBVVeXgecswjFOpWVZUtUYSQj8h\nhvpL8M1To7D06zws31uAU8pWrJw6GBK7ZnSZSACJF4mPHhqMFQcUeOLTc/jL2Cg8OyEeXoKOFzCG\nYaDT6VBbW4uQkJAuxZTF1YIidyNVhmFQX1+PkpIS+Pv7OxRH9eY81etVVCIUCh3afUiSxPnz5xEX\nF2cT27q6Opt5vb2BRVftPp5MI/cVUW3RW7B4Vz4uVKkxf7gv5owIw9pfGyAR8pBXrcHCL/NAEMC2\neUOQfLU/1UTSeOnbInxf0IAZQ0Kx93wdfCXWv8ktxyvw7hElhoWL8c+7BsFfKgTDMPj4RCXe/rkU\nYT4iNGhMkAg7vua26X8WkiRBURSKiopQVVWF++67Dy0tLdi8eTOysrK6/B3//Oc/Y9GiRcjOznZ4\n/Nlnn8Vzzz3n8FhBQQF27tyJ/Px8VFdXY+LEibh8+fINvX/P4Tn6haiWlpaCIIh2nrfOLm5sCktr\nIm2RZIS3CNuyh+H9I6X4z9FSXKxW498PpiM2yDoGUOYlgM5EIT5YhnUTg7C/nI+tx8uRo2zF2w+k\nYdDVuZDAHy08CoUCQqEQoaGhSE5OduraXGnBcaf6l2EYNDU14cqVK/D29u5Q6G8Wm0L7YeP2kVF3\n7T72Ua0nRbUvpH8rWgxYuDMP1Soj1s9MRoxABT6fD4OZBsUAf/n0PAJkXtg0Ox1RAdYUuspgwZKv\nC3CmXIVn74jBlJRg7D1fB4mQj3U/KPDZqWpMTQ3Gn5MFkIuFoGgGa/53BV+eqcFdKcHwlQhwKL/B\n5d9dIBBg5MiRqKurg7+/P9544w0wDOPUd2z8+PFQKpVOvc6+ffvw8MMPQyQSISYmBvHx8cjJycGY\nMWNcul6O/km/ENWEhASXKnDbwo6j0hhJCAQiWwpVwOfhmQlxGB7li+f35GPmhzl4495kTE0Lg0zE\nh95sbb3hg8Ir01IxNi4AK/YV4L7/nsSr9yThnvQwh37YoUOHQq/Xo6GhoavLccAVUXVVgI1GI06d\nOgWxWIyMjAxIpdIOj+1N8esrouqqeb39/NO2frpGoxHl5eU2sXW2etuVa3IFd0U1v1qDhbvyQFIM\ntszNwLCBvigqagafz0dVqwHlzQZr9e/DabZ2mmqVEU/vzENFiwHr7kvC1NQQKBqsWwf7LtTiXKUG\nj2RF4PmJsbhcVAQLQ+CZr/NxpLgZj42JxDO3x2Dlgcs9GlBu7/vb0yrg999/H9u3b8eIESOwfv16\n+Pv7o6qqCqNHj7YdExkZiaqqKqfPSVgviGAYxvN3qhzXnX4hqt3R3eLE5xGQCHn45nwNxg+MgjfP\nUZjGJwThm6dG4dmvLuLZr/JwStkKiZAPnZl0ELJJySFIDffBc7sv4vnd+fjmRBGezgpwECyTyeTW\n4HFncDaiVKlUKCoqgoEYEzEAACAASURBVE6nQ1ZWFuRyeZfH3yyRqit0NP8UsH6+Fy5cgFAobDeS\nra0PsjNC56mWGldTk0evNOO5PQXwlwrxn0fSERtk/f6SJIkdZ+pR0mSAj5iPbfOG2PZJC2o0+OuX\n+TBRND6cnY6RV609m3TWXtRzlRosuT0aj4+xttk06Sx45ZgChfV6/GNyPGaPsNYuaI1kjyfU2Ldg\nucvTTz+NlStXgiAIrFy5EsuWLcPWrVs7/M46OZWJxzAMzVhPcGN+8Tm6pV+IapeC2cbMoTNEQj7q\n1CY8vusKFmb5Iy7O8efhvmLseCwTb/+owNbjZQiWe8FooQHeH+YPDMPAi9RiUQqFgzIZdhfqUHVU\ni7dDSKRKHa/HWVzZJ+1OgFmze3aMXWlpabeCCvTPPdXegiAICIVChIeHOzzett2HLfyynxLTWbtP\nT3E1Uv06twb/PFSMxFA5PngoDUFya6RtJmlsPK3Br5VmyEV8jIzyswnqMUUzlu4ugK9EiM1zhyA+\n2LpNUqMy4pXvrE5zj42OxPyxUQCsxU0rj7ZCbSaw4YFU3J5oFcHT5a34vbQF0YEdZ02cQaPRIDY2\n1u3ns9gXtj3xxBOYNm0aAGtkWlHxh69CZWUlBgwY0O75bWEYhiYIIh3AHQDCAGgBNAFQAihiGKZT\nG0COG4d+IapdwY5/605UA2VeSB/gjWatCW8ea0KJvgArpgy2pYYBQMjn4e+TE5A5yBdLv7JWCO67\nUI8oixmNjY1QKBSQSCQYkpGOsWNkmK5swXO78/DQllN4blICHh090GVRdTWl29Gx9mb3CQkJ8Pf3\nB0mSvTr67Uabp+qpVGtn53Gl3Yed7tORcb07OCuqDMNg49EyfHisHLfE+mP9/cm2Xu1WvQVLvs7H\n2UoznrolEvsuNtiiyT3navDawWIkhMiw8aE0hFxNBV+sUmPxV/nQmazfySmp1iHruRUqLP4qHzQF\nbJmdiqFR1mky35yvxasHi8HnweHvzlU8NfatpqbGdnO0d+9epKWlAQCmT5+OOXPmYOnSpaiurkZx\ncXG3hVAAQBDEFgB1ACgAUgBBALIAeAEoJghiH4DjDMN4dGoKx7WlX4hqd6b6zo5/oxngozmpWPdd\nHnbnVuNMubXoKCXcsedtYlIIFv4pBu/8pMCq74owLIjBYlElhqalQSaT2Y7LivbHvqdH4R/fFGDN\n95fxe0kzXpkS16ui2mauYTuze/a96gvzVPsjrohzV+0+bF9mdXU1tFotaJqGRCJxSCF3N/uUhabp\nbm8qLRSNVw8WY9+FOswYEoqVUxIg5FuFuLRJj0Vf5qFWbcLTQ0R4clwUdp6thVjIxwdHlfjPr+UY\nG+uPt+1E+PClBqzYX4QguRfmZUVgwy9KSL34+N+lBry4rxADfMV4KoWPIQP9QDMM3j2ixEfHKzA6\nxg81KhOCZO7tQwPuiers2bNx5MgRNDY2IjIyEq+++iqOHDmCc+fOgSAIREdH48MPPwQApKam4sEH\nH0RKSgoEAgE2btzY7U0PQRA8APsAKBiGaWcmTxDE7QDmAfAH8LVLF8/Rp+gXotoVrgwq15hISERe\nmDVYhPvGJOH53fl4cPMpPDcxHtmjo8Dj/bGA+QutQjc1ToLDJQb8/Ygaa/yMuDVe5nBef6kXPpg9\nBJ+erMDq7y9jmrIFj6UKMWKEc9fvjvh1ZXbP4kqU6E5E6Yy43EyRqisIhUL4+/vDy8sLSUlJtvOy\nUa1Go0FtbS0MBoNt9qm92LYV0O4i1Va9BU/tvIj8Gi0W3joIT90aZfsdcpSteGZ3AYQ8Ah89MgSW\nmiJr9a+FxtlyFa406nFfRihenmoVYYZhsPm3Crz3f0oMjfTBvx9IwY+FjQCA7/Lq8N9fyzEk0gfv\nzUpFcf45GCw0/rG/ED8VNeHB4eFYfmcc7no/x23fX8C9WapffPFFu8cef/zxTo9fsWIFVqxY4fT5\nrxYlfQsABEFMYRjmEEEQYgA0wzBmhmF+AfCLSxfN0SfpF6LqiUhVLhagWmW0HT86JgD7F47Cin2X\nsOZwMY4pmrF2Rgp4Zh0UCgV0KqsY/PmONGSFXMSnV/iYvyMXc7Mi8fykBIeeVoIgMG90FNb9rxgS\nIQ/v5xpxxXwBr9ydhIBu7shdnWqj1Wpx6tQpxMTEdGl278rCzxUqOU9v2R3at/uEhITYHmdnn7J9\ntQqFwjazlhVbo9HokEGxp7heh799lY8qlRHeIj6eHj/I9rO952rx2qFiDAqQ4P2HUhHpJ8GpGqvl\noImkcaVR7yDCZpLGqoOX8e3FetydFoJX706ESMCD5mr69z+/lmNSUhBWTx8MsZCPFiODP+84j6I6\nLZbfGYc5IwaAIAhozVSPC5U8kf7tDQiCGABgAUEQBMMwB68+FgQglGGY/Ot7dRyeoF+Ialc4Laoi\nAbQmykHE/KVe2PhwBj4/VYl131/G1HePYWGmN2aOTQaaSOD3M9CZSAzy4WHPgiy8/ZMCH/9ejt8U\nzfjXzFRkRDjOo5SJBJiYHAKLqh77CxtwsrQFr0xLwpTU0I4uCYBVVE2mricbkSSJ8vJy1NTUgCAI\njBkzxqPj0dwRP5IkIRAIuhSYviaqfSVSdYWOZp+2bfdpaWlBS0sLysrKHOz9TteYsfKgAlIhH2Ni\n/FHebN3KoxkGG34pxbbfKzE21h9vzUi29XLX6Gis+jgXAHBncpBNhFv0FjzzdT7OVqjx1/GDsGCc\nVWi1JhJ7z9cAAB4ZOQDPT4oDjyCQX6PB6yeNMDN8vDcrFeMTAkEzDP57VAm9mYK4EwMVZ9BoNH15\nQHkdgA8BTLqaErbA6pQkBfAYWyF8PS+Qo2f0e1F1Nv3rLRKgVW+29dSxtLa2YjCvDv/8kw/+e8GM\nNcfVqGVqbEKoM1OQEwSEfAIv3pWI2xKDsHxvPh7echoL/xSDp26NhuDq3pRUyIeJpDE9Vog/T8rE\n8m/y8cyui/g+ta7TqLWril6aplFeXo6qqipERERg1KhRyMnJ8fi8UVciVYPBgOLiYqjVagDWRd/b\n29vlVpJrjafE3ZNpZHdp2+5jMpkQFhYGuVwOvV4PjUaDD39V4vM8LaJ9CDw7UoIvigwQEDQaW9T4\n508V+KmoCQ8ND8fyyfEQXN32OHqlGf88aYJIaF02RkZZo8GSRj3++mUe6jUmvHlfkq0gqazZgL99\nlY/yZiOEfAJ/vzMeAPBTYSOW7y+EjE9gR/ZQJIbIoDdTeOnbIvxwNVUsdXNCDeDcHvL1gmEYiiCI\nMgAxAPYCuAzgPQDb/5+9846Oqtza+O9MTSa9994TCL0qSK+CoCIqilz71Wtv2MUK9oJdFBQLvUgR\nBKkCAUJJSO+9zaTNZDKZdr4/JhkSOohXPi7PWlksZs68czJn8j5n7/3sZ7c/f4VQ/5/j0vzmnSfO\nlv49W6QHoJBJMFpEpnyRwg3RMuITGigsKEAqlRIXF0dfFxfGDLbw9uY8vttbyq58DQAtbWbc26Nh\nhULBoEhPfn1gIK9uyOGTbYXsyFXz9vVJRHg7oVLYDCMAYv2cWXp3P775s4T52wtPG7WeStHb2ey+\nsy3j34VziSiNRiMFBQU0NjYSHR1NXFwcYItYtVrtKVtJOteAL9Qg4VLDxSTVizmuTSKRIJVKkSpV\nvP97OZuydEzs5ssrE2KQiBZ+zD2GhDbu+ukYRY1mbomTMzmkjYoy20CFFZlaPt1VRoiLwKtTEpn1\nQxqOCgl7ixp4YkUmcpmEb2/vQY8gm6jvz4J6nlqdjVSAIdGeZFbpEEWRb/eW8+G2IroHOnNPvJVY\nXyfKGlp5ZHkmBXUt3Hd1KF/uLsXd8cK+z+fqoPTfRkcEKgjCUOBxYD+wDwgBdoqiqD/jAlfw/waX\nBanC6Tf+c41UO6LEvsEu/JLTTJrmKHOnJhEXfNyuzkEu5aWJ8VwV5cXs1bbyx/ZcDbdHd617ujrK\nefeGboyI8+GVdVlM/SKFp8fE4ig/Tqpgc2y6f2gEI+J8Thu1njjVpsPs3tvbm/79+5/Wg/Zi4kyR\nqtlspri4mJqaGiIiIoiPj7fV14xGRFFELpefspVEr9dTVVVFY2MjGRkZmEymk2z/zmXM18XCpSRU\nupjrwHFSrWoy8MiyTLJrdDw2IoJ/DQxufw8pOhOUNZuRSQQ+npbE0GgP9Ho9msZmXv6tiJ0lrfTz\nk3BLpAVNtc096EChmnWZ9UR4q/h0ejcC3RwQRZHvUyp4/49Con2c+HhaEh9tL8JRIeHFdbmsSath\nfKIPz48Op7ggl31FDTy5KgtRhM9v7o6fi4Ivd5eeNHbxfD43uDip/IuMjs2pDviqUz31euADQRBe\nEEXxwD92dldw0XDZkOrpcK41VanV5vpycwzEO8lYmi9yy/fHeGF8HFN7BnT5Ix0Z78Pye/ox5uO9\nbMyoobRWzhs+OhJCuo4Pm9DNjz6hbjy3OpM567Nxc5QhkdiIorMi88SodX9xAy9PjGdckp/di7im\npobCwkLc3d1POxf278KpSNVqtVJeXk5paSkhISHnVcftMKj39PREEASio6MRRRGj0WiPauvq6tDr\n9V3M7E+nbr2U8E9bC55urbSqFmavK8BotjJ/ejeGRh+/yVl/rJasah1yqcD3M3sS326Kr7PKeXpT\nNVnVrTwyLJxZAwI5fPgwepUboGFNRj3dvSXc181CfVk+zbWOfHlIy5b8ZkbHe/P6JFufd5PejFpn\nZE1ajV3Y1NLSwu8lJhYfSyfcS8XH05II9XRkbVoNwAWrf/V6/WlFWf8k2l2UEEUxC8gSBEEBSERR\nXCkIgiPQAzhwpab6/x+X7u50njhTpHomUm1ubiY/Px9tvS1FHBGbiLdjNjcNi+HlDXk8uzqTLdl1\nvDYpAS/n4ynKUE8VEgGGRHuxv6iemxem8+ToaGb0D+nSeuPn6sA3t/fip/3lvL4xh/SKZnZ5ONCn\nPV3cgROj1keWpjM+qYa7erpQV1eHRCI5p6k254vzbX3pGKheWFiIn58fAwcOvGCS6/y+giCgVCpR\nKpVdbP8sFotdcNNZ3dq5Z7NjMMBfIbNLLcK8mOnfrcUGFh3LIcjdgY9vS7JbDposVt7bWsiPBypx\nkEnoF+ZuJ9Qj5U08ujwTg8nKx9OSGBbrhdFoxCBK+XSfjfhGxXnxzvWJSAUoqWviyVW55KgN3Bjn\nwLhgLVnpR6g1KTlY2ojJIvLmpBgmJQfQZrby2uZiNmTpGR7rxVuT43BSylibVsMr63MBLtj7t7Gx\n8ZIUKQmCMANbqneRKIpVoigaO54TRfFHQRA8BUHwB9TYZnZewf9TXDakejrIZLJTpn+1Wi35+flY\nLBaio6NpdbPAwcPtpvoy/JxlLLqjD4v2lfL+1gKu/Wwvr01KYFSCTYQhCAIqhZRQTxUzExV8fVjH\n6xtz+S2zljeuS+xisyYIAjMGhLA9T83+ogYWpBs42nSE165Lsk+96UCsnzNL7u7HJ1uy+XpPJTty\nark5wYGnhiV2IeuLgQ6yPFdSVavV5OXl4ebmRt++ff9ytHwutVqpVHpKdWvnns2OwQAdTkSdRVH/\n7XFcFzNS/avrmCxW3t1SyE9prQyOcOftqQm4OdrKBXXaNp5clcWhsmZu7x/EtlwNru11zJVHqnht\nYz6BbkoWzEgmqt1yML2iiZd262lss+35d18VikwicKS8mceWZ6M3WfjoxkRGxNluilYeruSN7QVY\nRZFYTzmBpko27Szl83QzBY0WpsYoeWp8GDKJwGsb81h6qIoobxUFav0Fp38v4XYaHyAGWzuNGzby\nrAU6aqn9sNkWfgGU/yNneAUXBf8TpNo5Uu1MplFRUfYmcWddE2ATHnm1v0YiEfjX4DCujvbi6ZUZ\nPPhLGlN7BvD8+DhcHGQ4KWW0GM0EuDkwb6IXe6qsvPlbLpM/28djI6OYOTAUaSci9HFW4uYo545o\nOT9ltjD5s33cPzSCe68Ot89gbW5uJi8vj+G+EsTBQXy1p4Jv0w0caTrIyxPjiffvOkPyVDjXjb0j\nrXu2iKipqQm9Xk9FRQU9evQ47TSb88WFttSc2LOp0Wjo16+f3YlIp9NRUVFBS0sLoiiiUqnsROvi\n4vK3iqIulfRvo97Ek6uySCluZGy4jDdvSkIhs91gHCpr4okVWbQYzXa17saMOhRSgbc25fPTwUoG\nRbjzTicSXnG4ijc25eOmELj/6jDm7yzBUS5l1ZFqXvstD39XJV/P6E60jxNGs5W5mwtYdriKAeHu\nVDYZCPdzQe4fxLzlmejaRJ65ypMkNxOpmQW8n9JMUbPI5FhHwj0d+VitRym5MLFRU1PTJRmpYrMj\nfAd4EHAEjEA3wBMoAxaIorj3nzu9K7hYuGxI9XQbmURic3nRarUUFBRgMpmIjo4+yXGlY1D5V7uL\nebSPqgsRx/jaosfPdxbx5a5i9hXV89aUJJwUUlo69bZe3yuIq6K8eHldFnM35fFbRi1vTkm03+mr\nFFJaTRbGRHswpX80n+6p4pNthWw4VsOzo8Jwbq3BYrEQExODm5sbFenVQAU3xirYWq5n6hcpzOgf\nwiMjoux9gyeiowXnXCK0s7XKtLS0kJubi9VqxcHBgR49epx1zfPBxRaTdDgRdb62HaKojn7N0tJS\nTCYTCoWiC9FeiunfC13naEUz/1lyjGaDmdcnxRLYVmZ3O/rpYCXvbikkyN2Br27tToyv7btpMFvY\nU9hAjdbI7f2DeHxkJDKJQJvZypu/5bPyaDX9Q124L1lJqdV2U/Lt3jLWpNV0IeCqJgOPr8jiWJWW\nuwaH8J9rwhn7SQp1ujZm/XAUXxcli2/phYulmf2lzby3px6jWcJ7U2MYGOzAh9uKASgrzKWm0Nzl\nOnWI1850s3EJk2olcC/QG3heFMWN//D5XMHfhMuGVE8HnU6HXq8nOzubqKioLirUzugQRqSWNvKf\nmmaeHCZj2qDj46MUMgmPjIhiWKw3T6/MYNaiQ3g5Kezp4g4S9nNV8vktPfg1vZo3NuQy5YsUHhoW\nyZ2DQ+2kKpVKcXeQ8N6N3Rkb58mrG3K4++dMpnTz5vlre+DaHh04yG2bR3dvCU9NHcCHfxSweH8Z\nGzNqeHpMDJOT/U/aeDtacP4KqRoMBvLz82lpaSEmJgZPT0/27NlzDp/2+ePvbn/oLHTq/J4dU2O0\nWi1qtRqdTofJZCIrK8tOtBciivonI9UO5e2H24pQyiQ4yKVcl+zPgQNltJqszNmQy4aMOobHevHG\npDj7jVlGlRZdmwW90cLrk2K5LtkfsM1GfWx5JpnVOu69KpRburvSUK/hcI2tnLImrYaZA4J4bISN\ngPcWNfDM6myMZisf3pDIyHhvTBYrDa0manVGBoS78+7UBFwdZby/sZAfjjQQ6a3i/RsSCfd0ZPGB\nClZkNAIwoE9PZBKhy3QfjUZjn1nbOfvQMbNWEIRLOf37NjAEuBmYIQjCAEALVAClwAFRFM/epnAF\nlzwuG1I9cSPT6XQUFBTQ1taGQqGgX79+Z3x9R6Q6c0AIf+bW8sJvpewuM/DShPguAqUewW6svn8A\n7/6ex+L95aSWNpJW7Uq85/ENUBAEJicHMCjCkznrs3lvSz6bMmvpGeyGySJiRUJraysZGRm4tmj5\n6fZEfkprZtG+Uv4s3svzE+IYl+iLQ3u6rs0s4q6S88q18dzQK5A567N5emUGy1IreGliPLF+xwnj\nrxjlm0wmioqKUKvVREVFkZSUdMEEcS6p3X/KUamzKKpj7qZOp6OkpISgoKBTWv51JtozGdn/U5Fq\nU6uJF37NZXuehpFxXjgrZewuqAegRm/lrUVHyK9t4eFh4dw1OARJ+2f/88FK3tlSAMDUHv52Qt1T\nWM/Tq7OxWEU+nmYbzaZWq8mtN/Pd3loA5kyI4fpeAVhFkW/+LOWTHcVEeqv44AabpqCi0cCTKzMx\nWUS6BbrwxS3d0RstPLIsk+15DQyPcmHu9cmYLFYeWZ7JtlwNwe4O1OmMdjP/E68TnJx9KCsrw2g0\n8s0331BfX4+fnx+pqakkJibi6NhVkX8i7rzzTtatW4evry/HjtkmT9XX1zN9+nSKi4sJDw9n6dKl\neHh4IIoijzzyCBs2bEClUrFw4UJ69+59rtezFlghCEIAkAcEY0sJDwakwL+AhnNa7AouaVw2pNqB\nlhabN6/BYCAqKgovLy/27dt31uhNpZAiEcBRIeXTqeH8ckTN4iN17Ctq4PnxsUzqfjwqdFRIeXFi\nPBlVWo5VNvPYr8WMiHTiDb/gLq5IPi5KPpmezMaMWl5dn01mlc1lqKxGg7q2mvj4eLvZ/exAfyYl\n+/Pi2iweXZrO8Fhvpva0jZ0yduLI7kGuLL27H8sPVfLelnymfJHCzAEh/Gd4JM5K2QUNNbdYLJSW\nllJZWUlYWBgDBw78r7geXUxSvRhkJggCrq6uuLoen0okiiIGg8Ee1VZVVWEwGJBKpSc5RUml0n8k\nUk2vaObJVVnUao08MzqKGf0CeWFdLkqZhB15Gl7d14ZCbuGLW7oxONKWqdEazLy8Ppffs9UMjvRg\nT2ED4V6O7QRZxvwdxUT5qPjwxiTCPG2P/3iolm8PqnFS2v5Wpvb0R2sw8/yvOWzL1TA+0YdXJsai\nUkjZmqPmxXW59u/iqDhvCupaeGxFJlVNbdzd241b+waSV9fCUyuzqNMZeXp0JIV1erblac74+54q\n+wAQEhLCO++8g9Fo5LPPPiMrK4sdO3acsZd71qxZ/Oc//2HmzJn2x+bOncvIkSOZPXs2c+fOZe7c\nucybN4+NGzeSl5dHXl4eKSkp/Pvf/yYlJeWcrlEHRFGc3+m/C8DuB9x4XgtdwSWLy4ZUDQYDmZmZ\ntLa2Eh0dbe+BhONipTORqiAIOCtltLRZcFDImZbkyrRBsTy3OpOnVmSwIb2GOZPi8XM93tIS7OFI\nrbaNkdFu/Jhaw/j5e5k9NoYpPY73tQqCYOtXDXbmrkWp5NUbeSPFwBPXBHUZ9wWQFOjK0nv6sTil\njA//KGBvoS3SMJi6Eo9EInBT3yBGJfjwwdYCvttbyvpjNcweG0OwIJyzAb8gCFRVVVFbW0tgYCAD\nBw78r6tlL3UIgoCjoyOOjo74+Bw3AjGbzXai7SyKEgQBmUyGRqPpkpY8X5yL+lcURX48UMl7Wwvx\ndVHw/cwedG93NGoz2dK5/1maQZiLwJczexPkbvvuZlZpeWJllq3+OSKCa7v5MuLjFESR9ihSw4Qk\nH16eYCPIBr2J59Zms7uggavDnAj0cmVDRi15dXoeW55BZVOb3RDfbBWZt7mAxQcqSApw5vmx0dy6\n8AgF6ha+2FWCi4OMb29LxlFfzfJjjXy1rxo/VyU/3NGTSG8Vty86csGzVAMCAnB0dOTGG29k7Nix\n5/SaoUOHUlxc3OWxNWvWsH37dgDuuOMOhg0bxrx581izZg0zZ85EEAQGDhxIY2Njl5mr5wPBdnEF\nbC2slee9wBVcsrhsSFUURQIDA7vMDO1Ah6vS2VpAXBxk6NqO10jjfJz46a6+/JBSxgdb85kwfy+z\nx8ZyY2/bNA2ndtvBh64Jo6eHmR+yzcxelcnKw1XMmRRPpLdTF7P7aT28eHNbFQgSntlYxtZiA7PH\nxRLkfjxFJZNKmDU4jFEJvjyzKoODJY38mG2kd4GGq6K8upyvp5OC1yYncGPvQOasy+bx5cfo7qvg\nOWcdvV1OrxIWRZHa2lrq6urw8fH5rzkznYhLyVD/fCNMmUyGu7t7l/qd1WqlrKzspLSkXC7vEtWe\nTWzTcT5nOqbZYObldblsyVEzLMaL1yfF2pW6ap2R/SWNNLaamZLsxzifJoLcbW5HS1KreHtLAZ4q\nOQtn9qBnsBsVjQYAFu4ro9lg6TIx5lBZE0+tyqJBb+LBAd5MSnDj6yMtCAjctvAwTgoZC25LpneI\nG+WNrTy1MptjVVpm9Avk8RGRlLev/Wt6LX1D3XhnagIyicAjmxs4VG1kdLw3r0yMpayhlekLDlFc\n30qY55lTtmdCc3PzX66p1tTU2IkyICCA2lpburuiooKQkBD7ccHBwVRUVFwQqbabQVwaX/4ruKi4\nbEhVpVKdlhjO1VXJSSEju1qLWfS3Hy+VCMwaFMqIOG+eX5PFC2uzWH+shtcmJ7S31NjSykHOAj/d\n2Zdlhyp45/d8Jn+2j1uSPbjKS094SDADBw7EkFcPVPHS6GAOlDSz5JiGnfP3ct+QcO4aHIZSfvwO\nPdjDkbenJjHiwz8xWeHO7w8zPNabp8fGnNTb2iPYjWX39mfJwQpe35DNrd9nMLVXPQ8PjyLAratZ\nRH19PXl5eTg5OeHr60tQUNA5E+rFnsByKZHqxYBEIkGhUODq6tpl8+3sFNUhthEE4aQ5qJ2vw5nS\nvxmVWp5YlUVNcxtPjoxk5oAg+3XZmafhxXW5NLWaCXJ3YM7EGFJTU9EazLyyIZfNWWqGRHny5uQ4\n3FVyRFFkbVo1ACaLyLe3JdMrxA2rKLJgTynztxcT6O7Aj7N6oWrTYEHCgZJGtG1meoe48u7UBHxc\nlGzJVvPSuhwAu0ipoK6FR5bb5nEPi/HigxsTSa9o5qlVWWhajDw5PJTbBoayKKWCT7YX4+kkJ8ZH\nhYfqwm/wmpub/zb176m+q5egHeIV/MO4bEj1bKb65+L/KxEgq1rHLT9kMjNRSVLS8edCPVUsuqM3\nS1MrePv3PCZ9upd+4R4YzVZEQWLva53WO5AEVzPvbC3i+8P17PJy5NUQN8KlUntay4qEaUku3DEs\ngXmb8vjoj0JWH6ni+QlxXBNz3E2oYybr5Cg5gcGhfL6rmEmf7uPW/sE8eE0k7p02H6lE4Nb+wcz9\nLYdwTwd+TatmXXoNtw8I4d6rw5FaDOTm5iKRSEhKSsLZ2Zns7Oxzrr+eq1HE+eJSIdW/U2CkUCjw\n8vLqIraxWCz2Oah1dXUUFRVhNpvtoqjOfs8d63UIi97dWoiXk4Lvbu9Bz+D2dK/ZyvtbC/npYCVx\nvk4EuilxkNtqpIZmkwAAIABJREFUvKVakZe/PURlo4HHRkQwa2AwEkGgqdXEnA159skwz4yJoleI\nGw16E8+uyebPwgbGJvjwysQYnJUy/kgt54OUakob2vBQyflmRjKiiL23tVuAC+9cH0+QmwNLUit5\nZ0shCqnt3G/uG8DCfWV2kn55sBN94ry47+djpBQ3MirOm5fGRzPzh6MXbPwAFzag/ET4+fnZ07pV\nVVX2+bXBwcGUlZXZjysvLycwMPAvvdcVXH64bEj1TDibVWEH/FyVtJmtCIjM3dvM4aY0nh8fa6+j\nSiQCN/cL5ppYb176NYud7YKKY1UtYDZTWVlpN7v/9u6r2VvcxJz1Odz+XSrX9wpgQjdbDdVotW2q\nQe6OfDw9md35Gl7bkMO9i48wMt6H58bFEuzhiEN75GpBwr8GhXB9ryA+2lbA4pQy1h6t5j/DIri5\nX7BdKQmglAkk+qn4/LbefLKtkG//LOGX/aVcG6XkgdGJ+Hsfbyk6H6Xw3xFVXiyC/rsI/0Jwruch\nlUrPKIqqrq5Gr9dz4MABpFIpglLFN0f17Cpu4eooD96aHG+/qcqva+Hp1dnk1bZwW/8gHh0ewZ0/\nHEUhk9jILcWAZzsJ9wqxRXEHShp5dk02mhYTN/UOYOmhKnyclfZ0b6PexIvjopnW25ba/PFABe9t\nqcVFKSPezwkHuZTq5jaeXJlFZrWO2/sH8diICLQGMw+312WvivRgcrIfz6zO5tMdJaRXau0k/eOW\nVG5emI7JYmXOxBiuivTguV9zKNG0Eu194d69F6OlZvLkySxatIjZs2ezaNEirrvuOvvj8+fP5+ab\nbyYlJQU3N7cLSv1eweWNy4ZUzxapnuugchFYeV8/3li+j19z1ewu0PDoiChm9A+xuyMFuDnw1Yye\nPL8mkxWHq5j1/RGGBIjc69jQxex+aIw36x7w4LMdRXy7p4QtWXUAGMxiFzHR1dFe/PrAQBbuLeXz\nnUVMmL+Xe4eEc9fgUABMVpv4yMtZyauTEpjRP4S5v+Xy+sZcfjpQzuyxsQyNsdWS5VKBNrMFH5WU\nO+Il9HZyZGO5jCXZWrZXZvDQsEim9gxAJpXYjTHOBR0EfK5CpnMhlkst/ftPe/Z2FkWZzWbMZjMh\nISH8ma9m9pocGg0WbkpQMTbEQF7GERwcHNhVBQsONeKslPLp9CSGRtui4VaThermNvYUNtDDR8Yn\nt/XBQyXHZLHy+c4SvtlTRqinI4tnJdHUamLpoSq2ZNex8kg1Qe4OLJ7ViwR/Z9Q6Iy+uy2F3QQO9\n/RXMmRDN85vK0Bst3LTgEIIg2K0J9xQ28PzaHJoMJp4eHcmMfkF8vrMEgKxqLS+Oi2ZiN1/e2VLI\niiNtJAU489bkODKrW7j+60MYzVYc5BK8nC88/Ws+wVP7bLjlllvYvn07arWa4OBg5syZw+zZs7np\npptYsGABoaGhLFu2DIAJEyawYcMGoqOjUalUfPfddxd8nldw+eKyIVU4s6l+a2vrWV/vrJShNZhx\nVMiZGCHjvvF9mbM+hzc25rL6aBWvTkqgW+DxyCLZV8EKYHCIA7vKDKT/puYJszs39Aq0+/Q6KqQ8\nMTqaa5P9eWZlBs3VWr7cU8m/e6nolF1GIZNw75BwJif7M3dTHp9ss6WE5VIBk0gXEo7zc+bbmb3Y\nnqtm7qY87v3xCFdHezF7bAxKqUCTzhbhREREMC0+npsEgf3FDbz7ex4vrM3iu72lPD4qigi58I9H\nqpcKqV5KrT1gq6karTB3cz4/HqjEUyUHLDw0rgfuKjn1LUZeWJvFrsImegcouaubAof6Ag4fLqXM\noKBQo8dqhX8PDuQqLz0eKjllDa08szqb9Eot1/fw55kxUagUUlYftdVUlx2uZlyiDy9PsKV7d+XX\n88K6HHQGM8+NjSbZsQEnBzklmlaaDGaSA1145/oEvJ0UvLOlgO9TKojyVvHFLd0I8XBk7uYCfj5o\nE7Z+eGMS3k4Kbv72MCX1rUyIkPHEpCTmbi7g92w1PYJceX5cFLd8exiXvzj27Xzw888/n/LxrVu3\nnvSYIAh8+umn5/0eV/C/hcuKVE+Hc45U29W/HZtiqKeKb27rycaMGt7cmMu0r/Yzo38Is3p7UVVW\nhEFre93DY7szJiOdtRUOvLA2iyWpFbw0IY7k4OOCiTg/Z765rSdXvbsLjd7Ec9sa2Ks5xuMjowl0\nPy4m8ndz4MObujO9MIjXNuRgsojsKTeSWaWlb1RXk/7hcT5cFeXFTwfK+XR7IZM/24ejFFpV8pNG\nsfUP92DJ3f34PauO97bk8+DPaST6OnD/QD/OJYN1Pqnijr5Xq9VqV72eSgx1KaRrLzYuFqlm17by\n7p91lDeZuLVvIF5Ocj7ZUYJCJiGluIHn1uTQ0Ho8IpQIAkazlY+3FfD9/ioEAXr4yumj0tDY0MYX\nvx3i26MtSCUC8ybHMqG7zeRhS7aauZtt5g/3Xx3KA0PDMFpEO5lH+6j45tZkYnydWLGjhqe2Z9Nk\nMBPprWLhzB6U1rdy69LD5NS2ML1PAE+OjCS7poVp36RS2mCgb6gbB0ubSK/QsmBvGV5Ochbclsyh\n9CymLTiE1mDm0eERxPo68ciyDCwiKGV/rUf6cvxeXcH/H/z9Hf6XAM61puqslNJmtrIrT21/zNZn\n6s/GhwZzQw9fFqeUceN3RykXfEiKiwKgxWgm1FXCj3f24d0bulHdbGDa1wd4bnUmGp19wpNdgHFH\n/2Cui1GyObOWcZ/s4YOt+ejaup7foEhPVt8/ABeljKY2KzO+T+fxZemUaPRdjpNLBcaEyXh9oIyJ\nsS60mOFIrYkP/yikQW/scqwgCIxJ9GX9gwN5dVI81ToTD68tYdbCVA6Vnrn3/FxSxaIoUlFRwb59\n+7BarchkMurq6khPT2f//v2kp6fbHZsMBgOiKF4ykSpcvPTvX4HJYuXTHcU8vrGSNrPIV7d259mx\n0dhaGuGznSXc82M6TkopP83qxe39baKj7GodN393mEX7q7i+pz9ujnJigrwJiYzllxIln6bqiPJS\n8t5ob/xNlWz/M4V/L9zLYysycVLY1p7aw48CtZ5bvjvMjwcqmdEvkF/u7E2YpyMfbitizm4tFhFc\nHWT0DnZl5ZFqpn97mFqdkfk3JfH0qCi+2F3KHd8fwWK1KYmTg2ytXV/+WcrwWC8W3t6D1UermX/U\nhK+zgq9vTaZIo+eBJceQtWsDOlqDzhcGg+GsDkpXcAV/Ny6rSPV06cRzVf+qFLaP4+7FR+jrJyUs\nsZUgd0eb5WF+PlNCzExISODtbWXM/jWfPqG2SLSlzUKHt8ukZH+Gx3nz2Y4iFu0tZXNWLQ8Pj+TW\nfsE4yCUIAlgRuCFGwaPX9uP9rfl8sbOYFYcqeWREFNf3CrTXbhUyCV7OCgIcZcQFuLPkSC2bMmu5\nqU8Q/x4ajtBmm7jj7u7O8Kv6M1ahIOeT3dTqTHy1u5jF+8u4fUAI/xoU1kUpLJNKmN43mN5eVu5b\nWcT+kkZuWXCQfmHu3Dc0gqujPE8imI7B6qeDRqMhNzcXDw8P+vXrh0TSoYi2bZSdx7U1NTVRUVGB\nwWCgra2N/Px8uw2gSqX6RyKNi5n+vdCaaqFaz7Nrssms1jE8QsWjQ4KIDLEpWWt1tnm/i1LKmdYr\ngKdGR+Iol2K2iizcW8anO0twd5Tz6U1JDI3xYlPWnzQbTMz6OZsanYn/XBPG3YNtU5P2FDbw+u4c\n1DoTM3t7o8DMN4ca+WrTIdYWWlDJBV4d5c+IeB/ya7S8uCGfvNoWrgmW8caNPRn96QH2FTey/Eg1\nV0V68PqkONQ6Izd/d5i82hZu6OnPEyMj2JhRxw8pFQDMmRhDgKuSWT8cRa0zMjlSxpDkEJ5YmUmj\n3sSdA4PRmyz8klr1l2apdhZ+XcEV/BO4rEj1dDjX9K9b+zzJWYNC+CmljPGf7OW6WEfGhkpIjIux\nm/EvjwlgcUoZH/xhS5utOVrF9DApZrMZuVyOs1LG02NiuKFXIG9stNVkl6VW8MKEOBzlUgxmmzVg\noLsD797QjdsHhPDWb7m8sDaLH1LKeHZcLIPa7eQc5BKsiNw9wI+7ronhsx1FLEmtYMWhcibGqHh0\nXDf8PI5vJK4OMiSCyOK7+jF/eyFf7CxmcUoZMweGMmtQaJcowEkpI8RNjpODkht6B/LtnhLu/uEw\niQEu3DsknDEJvnaCP12kqtVqyc3NRSqVdhkLd+LnfeK4NrB5DaelpeHh4YFOp0OtVqPX65FIJPa0\nsYuLyznNRf2rpPhPTpexiiI/Hqjgwz+KUCmkvH9DAtFKHc4OMsxWkR9Syll+qAqAD25IZFS8re2q\npL6V59Zmk1ahZUyCNy+Oi8G9XYykN1rYnKXG30XOmyO8mTgwDL3Rwgd/FPFLaiURXo4sntWLboEu\nfLqjGGhkRb6FwRHuzB4eiNRsYP62fJZltuAsh6cGOBPpoGfLMZs5f2WTgadHRzK9TyAL95bz+a7j\npB7mpeLhZZkcLG3C31WB1mAhs1rHy+vziPBy5IPr4/jhzwKeWp1Ngp8zDw4N4/uUCorrbbqHjuEW\n54tL2Ez/Cv6HcFmR6uk2sw5HpbOhw1R/fIIXsWIFq4oFlma2sLvCgWfdzIz2aLeha3c96h/hwdQv\n9rMlu47UYoFHZZVM63t8hmqUjxMLbu/Fluw63votl5kLD6GQSahvMUGn/vQewW78fFdffsus5Z3N\necxadIjhsd48NSYGR7kUo9mM1WrFSTBxXVAr/Vxc+K1SzspsDX+UHOa+IeHM6B+MUi5FKZNQ32Il\nxteZj25KJqdGx6fbC/lsRxE/pJRxx8AQ7hgYiqujHIlEgkwCFlFk1qBQbu0XzNq0Kr7eXcKjS9MJ\n91Jxz9VhTE4OOClS7Zhko9friY2NveDNTCKRnNTDaTabaWlpOckCUKVSdSHbjjrtpVRDO19SrWwy\n8MKvORwoaWJYjCcvT4jF21lBQUEzxQ1GHvr1MBlVOkI8HNDojIyK97Y7I73/RyEyqYR5U+IZn+iD\nIAhkVet48ddsrCLE+Kj44NoQLIYWjpQ38/zabMoaDNzeP4iHh4WjlElYf6yWhftsM7GfHhXJjP5B\nlNS38uxvZaRVtjAu0YfnxkSh07fy4qo0UutswqPhwVI8DNXc/FUZefUmRsW68+zYWNZn1PH4yiwU\nUoFXJ8ayObuOvYUNLE2t4vb+gUR4qXh+XT4Gk4V7BodQ3mjg1Y35BLsrGRrlwc6CBpz+AqleomPf\nruB/CJcVqZ4O5yqycZDaop1D6Vkkeqv4cmh3jtW28frGXB5aksbgSE+eHx9LtK8t2dvhbDS9bxCH\nCmp4eX0eP6dWMXvs8UhTEARGJ/gyJNqLr3cXM397EeuPVWPUyojvYbQb8AuCwPgkP0bEevN9Shlf\n7Cxi0mf78HFW4CoXKSkpQRRFYmJi6OXpyUQgo7KZ97fkM29zHt+nlPLQ8CgUMglGy/GoLc7PmY+n\nJ5NdrWX+9kLmby/i+31l3DEolAlRjsjaBS5gSzff2DuIqT0D2ZxVy5c7i3h+TRafbCtkQqSSOwLM\nqMxmioqKqKurIzo6Gh8fn4s+yUYmk+Hm5tZlg+yYTKLVatFoNBQXF9vNEgwGA2q1GldX1zNOkPlv\n4FxJVRRF1qbXMHdzAVYRXp0Yy5QefgiCgMli5Zf0ZpZnVeLqIOPd6xPYX9zI79lqqpvbeGldDnuL\nGrkq0oM5E2Pt/dVf7Crmu71luLdnIyZ280MqiCxKa2ZFZjn+rkoW3JZMvzB3qpvbeH1jHjvy6/Fx\nVmBtNTGjfxA/H6zkwz+KUMolvDM1nrEJPqw7Vsu83wtoMYjcMziEr/eUIag8eGWvBqVUwuwhPnjK\nTdy16ADFzSL9AhTM6uPF+vxadhc0IpMIzLsujlVHq/lhfyXJASpi3UR+Sa3EYLYyMcmHY1U6dhbY\nhrQ4X6D6t7Gx8UqkegX/OITzTJtdOqqSU8BsNp/WTH7Pnj0MHjz4lM+ZTCaKi4tJyavmtZQ23rk+\niUiphpCQENzc3DBbrPxysIKP/iigxWjhtv7BPDQ8CmellKRX/+Ceq8IY5ddKtt6Jz/dUUtFosM1d\nHRNjH1DegfGf7KHVaOshVCml3Dk4jFmDQk/aSDQ6Ix/9kc+S1EoE4IYEZ56c1BsPp5N78PYW1vP+\nlnzSKppxUkiQCbBv9nB7W09nZFY1M397EVuz63BRSvFVSdCaBXY9OfSkY0VRZFe+hq92FXOgpBEX\nhYSRIRJmDgojISrsjLVDi8WCyWQ66zFHjhyhT58+pz3mTOgwSzh69Cje3t7o9XoMBgMymQwXFxd7\nVHsuXrv19fXU19cTHR19QefSgfz8fDw9PU87txegtL6VF9flcKismaQAZ969PoHgdv/njEotL67P\nJa+2hdGx7rw4MQEPlZyX1uWwNUeDKIqYrSJPjoxkWm9bBuFIeRMvrculSNPKdcl+3HdVCBM+P8i/\nBgazI6eWwgYj1/fw56nRkTgppCw/XM37fxRitog8NCyc8gYDvx6rIdHfmf0lTQyJ8mTOxBjMVpFX\nN+axu6CBnsGuTAtrwz88jrt+TANgaLQnz42JYlVaDQv2lOHqKOOZUZE0tbQyf1c5LUYrng4CFqtI\ni9l2EzUl0Z3DlXpy1G30CHJBKZOwv6QJfxcFFlGkTmfi1/v7Eu6lOu3ndzosXbqUmpoannvuuQu7\neH8vLp10yhX8rZC+8sor53P8eR3834YoiqeNSMvKyrr4sYJtUy8uLiYnJwcvLy+CwiL4cX85u/I1\nKKQCSQGuuDg7IZEIJAe7cWPvQJpbzfx0sJwVhypxV8lJKWogyseJ7t4SuoV4cueQGJyUMtamVfF9\nShl1OiPdA13tFoXr0qvxcVFyX6KI1cGdnw9UsPxQBXKJhMQAF6QSm9FDTWUZfpY6KtuU1LdaSK9p\n4+eD5eiNFuL9nXHs5BMc4uHItN6BxPo580eOGm2blY0ZNagUUqJ8nOzpaLCNo5vY3SamKqxt5mhV\nK3qjBb3JQoSXk31wNdg2wVBPR64OkuFlqkNrkbOtzMSqjEaqmtrwdVXi63LykAJRFDGbzV1S7qeK\n3kRRpKqq6oKt3gRBQC6XU1NTQ0JCAgEBAQQFBeHl5YVMJkOv11NXV2cfaNDc3GxXHcvl8i5E29ra\nSmtr6xnJ8FxQX19vN3A4EUazlW/2lPL0qiw0LSbMVpFXJsbQPdAVg8nCxzuKeWldLlJB4KG+Ltw3\nJBx3ZxXVzQY+2lZMvd5EYoALX97SncFRnrSarLy3tZBXN+TjIJfy7tQEZg0MoaXNzOIDlaRVNCOK\nMPsaPx4YEUuNto3HV2Ty08FKeoW48fnN3bg6ypNv9pRR1mCgodXM82OjeXxkBOsz6nhkeSaVTQae\nHBXJU6Oi+OVAGe/vqsIqwrReAdzaL5CnV2fze7aaid18eWJ4JAv2lrH0SC1JgS48MjyC33MbaDaK\n9AlxJdHXkbVZjbSZLMS5Q2adkRptGyFucsqbTZjMIlYR7r0q9IIm1ezZswdnZ+ezzk7+hzDnnz6B\nK/jv4H+GVMvLywkKCrLXBktLS8nMzMTNzY2kpCTc3d2xiCLf7iklzEvFtkIdm3Ia8HVVEu3jZHO7\nUUgZHufD8FhvjpY38eP+cqyiiJujjKtDHFAoFLi5utAn1J1pvYPQGy0sSa3g54PlIEK3QFc2Zdai\nN1oYEwL3jO3NNbHe5NTo+OVgBauPVmLWa2mtysfN1ZWkpCRSy7TUNht4Z1wgBsHBtt6Bk8lVEASi\nfZyprG8hr1aHt4uSJe1rCgjE+jl3sTP0dVFyTbgTWRX1VOosHC5r5IeUMvJqW/BzVRLg5kBjYyPp\n6emYTCZCvV2Y1j+Ccq2F0oZW8mp1/Li/nB15aiQCRHg5IWsnb4vFYh9d1nFNOn46ZxJEUaS6uvov\n+6dWVVXh7+9vJ0mpVIqjoyPu7u72oQF+fn4olUpMJhMajYbS0lLKy8tpaGigtbWVtrY2zGZzl9ru\nhUCj0eDk5HQSqR4oaeQ/S4+xOUvNqHgf7rs6lE1Zaqb28KdWZ+SBX46xPa+e63v689G0JJzNjTi5\nuLL0aB2Pr8ik2WDGQyVn1b198VDJ2VvUwAO/pPNnYSM39wnkwxsTifJx4mhFM4+vzKKx1UxigDPz\nxvgR7e3I6qwmnliRhUZv4tmx0TwzOooarZHHVmRypLwZpUzCqnv7EODmwGMrsliSWkWfUDe+uLk7\nEonAw8sySKk0MiDCnfIGA74uCj78oxiFTMLr18bRYrTw6sY8dEYLjwwLx2QVmb+jBKtVJNDdgfoW\nE0erWugf7k5jq4kSrUiYlyONejNaoxWZAKb2P91hXjraDHq7elwmk51TSn379u0EBQXRvXv3v3QN\n/yZcIdX/EVxWNdWzWRUajUbUajUlJSX4+/szYMAAZLLjH0FHCnZKjwA8hRYWpNbz2LJjLNxbytNj\nYukbZqvXJAW68vNdffk1vZrZqzLYkafB0NrK3QOldmWrp5OClybGc9uAEN7ZnMf7Wwv45WBFu1Wc\niFQqxWKx0CPYjYUze7E+tZD5O0t5Z2c1kd4qHvdyIlwiwaFdLRziKuXDm+LJrYngsx1FfLmrmB9S\nbC0zswaF4qGypYUdFVKsIqy+fwA78zV8vauYN3/L5bOdRdzeP4QZA4Ltx0okErwdJUgkApsfGszi\nlHKWHapgY0YN0R4yxkUquW1oIh7ubuTl5WG1WvFxsRm1b3nkKtYcreLnA+U8vyaLeZvyuK6HPzf2\n8ifaxxmpVGr/bDtudCwWi7031Wq1otVqEUURo9GIRCKxk+KFtKScrYwhlUpPW6ftMLXXarU0Njai\nVCq7CKLOp057YktNg97Ee1sLWZNWQ5C7gz06TCm21Q+XpFayNUdDoJuSr27tzqAIWwvNNk0bL+zK\nIbeulSFRnpitVupbTLQYLby3pZCVR6sJ83Rk4e096BPqRlOridc25rHsUFW7+xLMGhBMg76JV7fX\nklVr4JpoT14YH4Org4wPthXxQ0oFzkopCX5OmK0im7PUfLbTZjDx6rWxXB3pwbtbC9mQUUeIhwNP\n9lVidHZnb2Ej2/Pqmd4ngH6hbryzpYCKpjYmd/MlxNORz3aVYDBZmZLsx8bMOioaDYR7OhDr60RK\ncSPeKilKKRRrWlFIoe2Eik1CbJRdqNYxFF4mk9mn+XS0Xp2oCL+i/r2CSwGXVU3VarWeUuUriiL7\n9u3DYrHg6+tLRETEKR1+RFGk+2t/8K9BYdwUr8RssXKoQc6HWwuo1bYxOsGHJ0ZFE9HJ8PuGL1PQ\nGsxodG3ojFau7e7HQ8OjTqoJ7SuqZ96mPDKrtMilAg/3UXH7iJ7o9Xp7n2ZkZCQ7i5r5YGsBRWo9\nyUGuBLo7sD1HzZJpgcTHx9vXy63R8dmOIn7LrMFRLmXmgBBmDQ5l4Z/FfLG7lOxXRtqJ4FBpI1/t\nLmZbjhqVQspNfYL416BQnKVm3vw1jRXZerJfGYnJZOJYdh7rMzVsrxQob2rD31XJjP4h9PcyEuDl\nxoJDjaw4XEnqc8Ptn/mB4gZ+OVjB5qw6zFaR/mHuTO8bxMh4bxTSkwnSYDCQl5eH0WgkKioKJycn\nrFbrScQoCIL950xEe+jQIZKTk7vcIJ0vNBoNjY2NREZG0tbWZh/VptVqu9RpO2/qpzqnnJwcAgIC\ncHFxYXVaDe9vLUTXZuGOgcHcd3Uoju2TY77YVcpnu2y+uLf2DeSR4RGoFFK0BjMfbS9iaWoV3k5y\nnh0Xzag4b/79yzHKGgwYTBbULUbuGBjMA0PCUMokbMio4+0tBTTqTczoF8TIOC9m/ZDGhCQfNmfV\noZJLeW5cDBOSfNiZX8+bm/KpbGpjag8/Hh8RyUPLMsip0dFqsjIi1ovnxkaxPa+ej7YVYTBbuXtw\nCEMj3XhrQxZpdbZWqUeGhZFR1cKWHDVR3iqu6+HHqiPVFGla6R/mhrujnC05aqwieKnkaPQmnJRS\nZAI0GSzIJccj0w5IBRgU4cHnt5wcaZpMJnQ6nf2nsyLc2dmZjIwM1q9fz/33339a7cTZEB4ejouL\ni/2G8ODBg9TX1zN9+nSKi4sJDw9n6dKlFzoF50pN9X8ElxWpdkQ9nf9fV1dHQUEBFouFuLg4fHx8\nzrjGgHk7GBbjzaODPGltbSUyMhK90cLCvSV8vbsEo9nKLf2CeeCaCDydFMxadAiDycKckf78mFrD\n2uxmjBaRG3oF8uA1Efh3mmdqtYrcsSiVgyWNWEUIc5UwLcGJW4baRrF1wGyxsvpoFZ9sK6S62db0\n/8o1ntw8vNdJEVNerY1cN2bYyLVbgE1scvSF4fYpNx3IrdHxzZ/FrEuvQSLAhEQfjC3NbCw0sG5m\nJLXVVURERBAQEIAowvY8NYv2lrKvqAGlTGBcrDtyB0d+Tavm6AvD7SldsBFgvd7EqiNVLE2tpLzR\ngJeTght6BXBjrwCCPWwm8cXFxWg0GiIjI/H29j7p9+kg187/dr6eEonkJKK9GKSqVqtpbm4mMjLy\nlM+bTKYuRNt5JmrnAeR5eXmYVd68v7OSg6VN9Ap25cXxMcT42m7EijV65v1ewO52pesrE2K4oVcA\noiiyKauOeZsLqdcbGR2uYPbE7ni7OVHdbGD6gsPU603E+Drx2sRYkgJdKKlv5fXf8thX1Ej3QBde\nHB9Dgr8zSw9V8trGfACGhDry+PBQnF3dmbs5n605GqK8Vbw4PoZoHxXzd5TwS2olMonA3CnxhHo4\n8PrGfNIqtQwId+exERH8llnH4v0VyCUiI+N8WJdRh0O7leD0vgEUq1vZkV9PsLuS7oGubM/TYDRb\n6RbowtEKm5enp0pGvd6MBDixQOPuKOOpUZFM6u53Xsrtzorwt956i127diGTyQgPD2fMmDE8/vjj\n5/ENsJHqwYMH8fY+Pn7x6aefxtPTk9mzZzN37lwaGhqYN2/eea3bjiuk+j+Cy5ZUNRoN+fn5ODk5\nERUVRUk5jOC9AAAgAElEQVRJCT4+PmetmQ19dxe12jbGx3twfZwjQ3on2p9T69r4ZFshS1MrUCmk\n3DckgsNljZQ3GlhwY6Qt/eQfyhc7bQYNgiAwo18w9w4Jt7fOvLYug2WHqpgeLbClSkZls4l4f2ce\nvCaSUfE+XRS7bSYLDy9JY3v7iLluga7cOySMUfG+XcRHcJxcNxyrAeDG3oHcfVVYl6i6A+UNrSzc\nW8qy1AoM7e00Lw/3ZdrVichPQUzZ1Vo+3ZLJtgIdJqvtK/D+DYkMi/FCKZeeTIyiyO78epakVrI9\nV40IJPo6kOxhZnLPYJJjzqwcPhFnI9q0tDS6d+9+kvjofHA2Uj0VOmaidpBtfZOWldl6fi8HR7mE\n+wf6Mb1/KA5KJS1tZr78s5QfUipwkEsYGefNmrQalt/dG5VCyhu/5fNnYQOJ/s68NCEGc20hEdGx\n/HK4jm/2lGIwWQlyd2Dt/X0RRViwt4xv/ixFIZPwyLAIpvUOQNNi5IM/ilh3rBaAh4aFM8SrlZ3V\nEr49UIvVKnLfkFBu6xfE2rQaPt5RjNZgxt1RTrSPijg/Z348UIG7Ss4TIyOwWuHDbUVoWkxMTPAk\nzNHIkpw2NC0mege7EuPnxMoj1cgkAoMjPThS3oymxUSsrxPVzW00G85suBLvq2LulISTFPIXiqlT\np/L9998jCALV1dX06tXrvF5/KlKNi4tj+/bt9tmqw4YNIycn50JO7wqp/o/gsiPVmpoa8vPzUSgU\nREdH4+Rk+4MtKCjA2dkZPz+/M65x7ad7MZis1DQbsIoiN/UJ5t/XRHRRuebX6nj393y25apxlNvq\nnmvuTKJBo7anaMsbWvl0eyGrj1bhIJcys38QQ3yNLDmq4dcCE8tvCsDXz5895W18vrOYYo2eOD9n\nHrgmgjEJvnZy/X5fKW9szOX2bk7srLRSUt9KuJeKuwaHMaVnAIoTzMc/+iOfz3YUI5OA2QrXxHgx\nc2AoV51gPajRaDiQns2XR1rJtAVNhHk6Mr1vMFN7BthvAjpQXFxMc5vIvN1qDpY2ATb3pond/JjS\nw59ugS6njDIe/PEQ+0qa8HeWU9RoQgD6hbkzvpsvYxJ87PXd80VHTTYvLw+lUklMTEyX50XRVrfu\nOKezka1arUar1RIREXHe5yKKIr9nq5m3uYBanZFR0a7c298bucVAc3Mzu8raWJ5nprFNZFysGw8P\nC+dYbRtPr85mRt9AlrcT00PDwrm5TyASARZsOsDyfJGKpjZGxXlT0tCKn4uCWQODeX1jPsX1rYxP\n9OGpUZG4OcpZfKCCL3eXYrLYUribstS8OjGGb3cXUdxk5uooD54fF01Ns5G3NuWTU9tCvzA3nhkd\nxYNLjtHYasJoFpnWO4DR8d58sr2YtEotyYEu3NQ7gOWHKjhS2YKHSkaD3oy3kxx1i4n+YW7UaI2U\n1LcS7O6Ars1MY6sZF6UEbdvJokEJMDhEwQvjYgjy/WuisBMxcuRIduzYccH+vxEREXh4eCAIAvfd\ndx/33nsv7u7uNDYe98X28PCgoaHhQpa/Qqr/I7isSNVqtXL48GHCwsJwcXHp8lxJSQlSqZTg4OAz\nrnHbtwcBmDMugg82Z7OtxIBMKjCjfwj3XB3WhQT2Ftbz2LJ0GvQmQtyVXBfjwL/H97EbgwNkVzUx\nb0MGe0r1uDpI6Rnszs58DcumBxPg44WPjw9mi5X1x2r4fGcRRWo9Mb5OPHBNBGMT/Vh5uJIX1mbx\nyWg3Rg7uy+asWr7eXUxGpRYfZwV3DArl5r7B9laYVUcqmb0qk2X39GNnnoafD5aj1hmJ9nHi9gEh\njIx2obQwH6lUSkREBJ9vTuO7Y228MCGW3zJqOVjSiFwqMDbRj1v6BdEn1Cb8qKqqoqCggD+qFfx0\nTMt710WzNb+ZrTlq2sxWonxUTEn2Z1KyP74uSlpaWsjNzWVBWitpais7n7iaQnULGzNq2ZhRS6Fa\nj1QQGBTpwfgkX0bGe+PqcG5G6kajkcLCQrRaLbGxsXbxUUcE25GWPtGwvyN9fCpBVF1dHTqd7rxJ\n9Uh5M+9uKeRoRTOCAP0DFHx0U3ecnJzIrNLy1uYCjpQ3k+jvxIMDfQhRWdDpdHx/tJnfSmwKnSHh\nTjw5IpxwPw+K6w28/XsBfxY2EOHlyLNjoxkU4cGULw+iazNTozUS4uHAC+OiGRzpyc78et7+vYCS\n+laGx3rx1KhIDpc18fyvuQB4OEh4akQYfSN9+GBbERsz6vB3VfLkqEj8XBS8t7WII+XNuCilzJ0S\nz5ZsNauO1uDtZCPwjCotGzPrcFNKGBziQGq1mVqdkTBPB1QKGVnVOryc5FisIo2tZhRSoYv5SAcc\nZAL3XBXG3VeFkJWZSVhYWJeSx8XAkCFDOHz48AWbf1RWVhIYGEhtbS2jR4/mk08+YfLkyVdI9QrO\nC5cVqYJtwz3V71RRUYHJZCI8PPyMr7//pyNUNxn4eVYP/o+9Mw+Tqy6z/+fe2teu6urqfd876XSW\nzp4QCEvCsCOLCK4gKqMOgjo/HUYHcRxHHYUZGRUEQdmEAAookgRCgOzprJ30vu9dVV3VXft+f3/c\n7kp3dpI445Cc5+nnSbr63rp1q+qe+77f857T3NxMRnE1j27u4vWDI+jVCu5cNmnWMEliP9nQztPb\n+yi16WhzBimw6vjiRcVcW5fFyOAAAwMDFBYWMi6a+c9NXWzpdANwe52FTy7KoawwL/XciaTEm4dG\n+cV7XXS5gpTZDSwpsfL8rgF+comR61YvBSaFV90efr2lh62dbowaBZ9YlM+nlxbS0OvhvnWH+POX\nl1KeaSQaT/LmoRGe2tZLy2gAgwpumpvNnavKyTSq+NkftvFEY4S3v7aCAquOdod/chRnGN9kxNet\nC3K4dk4WBpXAY+918svtIzx9TTrJaIhwQuDguJL3+6M0OcKIAszL0rA0G25ZXs1ju5xsaHKy5Rsr\nU69TkiTaHAHePDTKXw47GBgPo1IIrCyzcVVtJpdU2FKJPtORTCYZGBhgcHCQ4uJisrOzT+sCejTJ\nHj12JQgCY2NjBAKB027/9ntC/Oe7PaxvdpJhUPOVi4v44YZO1hSr+crlVTyx08HL+4ax6lV8bXUJ\n18/NQhQE2h0BfvpOF1u75Avzt1bnsapAzah7ghcbvWzsk4npmiL40mWzMJhMvLhvlEfe7QYJ7l5R\nyN0rChj1Rfnxxk7e73BTbNPxrSvKWFRk4YWGIR59v4dwLMm1tZlcnRflgN/A07uGSSQl7lxWwNpZ\ndn71QR/rm53YDCrCsSSlGXq6x4KEY0luXSBnAa7bN4xCELiiJoNuh49DoyH0apFgVD5/epWIUhTw\nRhIIHP/ioFIIPHBlGTfNOzI2dfDgQSorK9FqtcfZ4swgSRKrVq06K1KdjgcffBCj0civf/3rC+3f\nC/hQOG9I1eFwMDExcUyb8Gh885VDvN8+xuO3zyEy0sHixYsBec3yvzZ1sqHZiUWv4gsrZb/dp7b1\n8cimTnZ/cxm/f+8gb/WLHB72YdMK3DY3nc9fOhu99kh1+x8b2vn1Vln1aVCL3LG4kE8tLZjRXk4k\nJdY3jfKL97ppdwQAuLZUxfc/sRLdUUPxh4e8/HpLL+ubRlGIAouLrWztdPPqFxczO9dMfNJW0OFw\nENDn8Hqrj3danHIMXI0dTdjNHzvjvPmVZam1LUmSCERivNk4ykt7h2gc8qFVilw5OxOTVskzOwfY\n/s2VpOnkSD2fz4fX62VfxyDv9YbZ5RTwRMCoFsk0qXH4Y+z4x4sQT2AAcWjIx5uHHbx12MGoL4Io\nQH2hhRVl6awsS6c628iYy0VnZyd2u53i4uJTGuyfCtPXZwOBAO3t7WRlZZGZmXlCQRTARCjG41v7\neH73ECqFwGeX5vPZpQXo1Qrm//ADamwKer0SgWiCTyzK456LijBrlTh9Ef77/V7+cGAEg0bJ0iIL\nG1tdbPzqYnb2jPPwpm7cgRg31GVy1yI7fR3NtIaMPHvQx1hYQi3CvBwdD64t4sVDEzzXMIJGKXLP\nRUV8YmEOm9rGeOTdHgbHw5Rn6OlwBXnw6gp+8W4njmCSy6sy+MLKAt5odPBCg3zsn16cR2G6nn/+\nUyuSBMtKLMzKMfHyvmG8oTirytMJRhPs7psgTSOSbVLS6pI1C1qlmFqPPxoKAdbUZPDttRVY9cd2\nH/bu3ZtaAz9XmCLV/fv3n9H2gUAglf8bCAS44oor+O53v8s777yDzWZLCZXcbjc//vGPz+QpLpDq\neYKPHKnGYrHjGkC43e6U887J8M+vNfHy3iEkYK5d5IEb6pk7LWy8cdDLI5s62dIxht2kZkGBhfVN\nDrbcv4zWxn2IokhXSMdrHVEODvnIMmv4wspiblmQi0al4K3Do9z7UiPfXp3N1h4/W3r8KESBG+bm\ncOeKopSfMMhq4Ufe7eSx93sAOUXn5gV53LE4nzzLzHWj3rEgv9nWy8t7h4gnJeryTNxUYyIXN0WF\nBRQUFKTIYcAT4rld/azbO4RvUkxyz6piecxGo0hVdFOk0jTs46W9Q/ypcZRgVG5ZfumiIj42L4c8\nixaHw0F3dzdZWVkUFhaSSEq81zLM6wdHebfLR1ICsxoW5mhYVWbhospMMqxpx1xUk5LETY83MBGK\nYdGraBnxA2BWC9RlqVkzp4CLqzOxG491cToTTN1weDweKisrMZvNJxRExRJJXtw7whPbB/GF49ww\nN4svryomy6xBkiTea3fz1XWHAVhcaOafrpQtKoPRBL/dMcBTO/qJJSRuW5jLF1cU8uZhBz/c0Mms\nbANNIwHqck18e205tbkmdveO89DrjfR4JWqyjXz90hK+9VoLeWYl/eMR3KEkK3IV3FajwytpeKYx\nQIszTGWmga9fVkJD7wS/3tYPQJ5R5B/XVNA/EeOxrX0EInGun5PFwqI0ntk1SMuofNNWl2fCE4zR\n7wlTl2dCp1Kws2cco0ZBpklNlyt0wmp0CtlmNf94RRlXVJ9cYb97927q6+vPWFR2PITDYa6++mp2\n7dp1Rtt3dXVx4403AvLn4vbbb+eBBx5gbGyMW2+9lb6+PgoLC1m3bt2Zum5dINXzBOcNqfp8Prq7\nu6mrqzvp9j97u4Mnt/by5YtLeGJLF4EYrChL5+8vLmFh0ZH5tN09Hh5+p5M9k+HeH6vQcFFmhNUX\nrUCn0yFJEtu63Pz35m729I1jN6n5/Ipi8tK0fOXFg/z3DcWUWRSI5ix+s62XV/cPE0skubzazudX\nFDOvQCbyhl4Pd/xmD5+oUuFWWHm7xYkkSVxebefTSwtZWGSZ0e7a2DTKV15sxKgCfwzsRjU3L8jj\nlvrcY4g4EIlz/+8+YPOATJRqhcDqqgyur8tmZXk6yqMueoFInO+92cqfGh2p35WmiVxUpOe2FVUU\n2Y/Nsvy3t9p4cc8Ql1Vl8H7HGMFoEo1CoDZDZG6GyJICA/l2CyaTCbPZzBd/f5h4UuI3d8yh4VAb\nO3sn6Inoaej34w7KM8hVWQZWlKazoiyd+kLLMWKtU2HKHrG3t5eCgoKU09bxkEgk2NDs5JFN3fSP\nh1lanMbXLimicnJEZlfvOL/4YICDQ/LoyJIcFY/ePh+VWsNrB0d49L1enP4oV1RncN+lJRRYdfR7\nQnzj1WaaRvxY9Uq+fpk8TtIzFuLhTd1sbh8jXSvwjTWVXF2byZ6+Ce5+vpFEUqI2x8S315Zh0ih4\neFMX77Z7SNcpuLlKQ5E+zhvdCXYMy+/nF5dmkwyM8ec+kaGJCCtKrVxRY+cP+0c4MOglL03DZVUZ\n/G6XnHlalK4ly6RhV+8EKlFAq1Lgi5xcwSsKcGmljX++shzbad7s7N69+5xbCY6OjnLPPfewcePG\nc7rfc4gLpHqe4CPlqHQynG6mqlEjZ1jetaKIanGYLjGP32zr447f7GFxsYW/v7iUpSVWFhVbeezW\nKv719QP8sS3Mq+0RNvTAZ5RDfHJJAekGNSvKbCwvTWdXj4f/fq+bH77VhnlyLXYiIvvjVtj0fO/a\nGr66upRndw7w/O5+NjY7WVhk4fMrirBNqnAz9QIP3lDH0HiY53f389Ie2WyhJtvIp5YWck1tFuGg\nH9dAFwD/el01arWGl/YM8qsPuvnVB92sKrdx68I8LqnIQKkQMWiULMxSsnkgwYNXVdLm8PPmYQfr\nm5zYDGqumSMre6uyZEGJQaNkaUk6f2p08L1VaTQ7Iux3i/z2oJ/fHtzDgoI0rpydydoaO/bJdrZW\nqUBA4Gc31xJNJNndM86mVhebWl3sORzh6aZxarMi1Ge7mW1J4vUGiSUktm7dSk5ODl9cOx+tVosE\ntIz42drpZmunm9/tHOA32/vRKAVmZ5uYX2hhTp6JOblmss2aE5LkxMQEbW1tmM1mFi5ceNIW5J6+\ncX72dif7BryU2w08dnsdF5XbSCaTHBz08p/vdrOzZ5wsk5p/uqKEf9vYTY4+ybYuD49uGaTdGaQu\n18TPbqphXn4ao94ID73Zzh8OjKSe49W76xEEgX9b38HLe2Wl+L2ri6kRR0iz6fnSC41s7x5HQG7P\n/vD6ah7f0sdLe4dRK0W+cnERa6rt/HbnAE9uH0GlFJmbo+fAcJCNLU66xhMUmAQ+W6dnnyPEg39u\nw25Q8fEFOTQO+VKEajMo6XOH6XOHAYglJWInIVSLVsE/rC7h5vk5fxPRexfclC7gbwUfuUr1REk1\n8XicvXv3ptZIT4TndvXz0J9bee7OeqKDzSxfvpxQNMFLewZ5YmsvDp+crnFNiZJKUwy3Jpv7/tjB\ng9dU88ed7ex3JtAoRT42P5fPLSukaJqzUkOvhx9vaOfAgBe1QuCKUj1fubJuRss3EImzbu8QT2/v\nZXgiQmG6jj53iLvnqPjGzRen/i4UTfDGwRF+t7OPdkcAk1rg0iI1a+aW8OWXW3jkltn8Xa0sOBka\nD7Nu7yAv7x3C4YuQZdZw0/xcPjYvm/caGvn+Vj/fvcjCivIMtHoD+0ZjvNHo4L32MeJJiepsIzfU\nZbO2xsYbu9r52XY3z91eyfxyWWTVMxbkrSZ5TbTNEUiNzVw5O5OesSDP7Rqk8TuXzDjPkiTRNOxn\nU6uTTW0uWifbkBoR9GqRb1ycS4lJQooECIfDKetAs9mMyWQiKarY3TvBV15qJMOgxhOUDeoBbAY1\ndZMEOyfPzOxcEzoxSUdHB5FIhMrKyhMqTyVJYlfPOL98v4ddveNolCIPXFnBDfOyUYoibaN+/mtz\nN5taXaTrVXxhZRG31ucwNDzCNU+3k2dWMeiNkW/R8tVVhVxelc54KM5TOwZ5ad8ISQlumpeNXq3g\nqR0DfGVVEU/tGCAcS3DLgly+dFEh7kCM77+2j32OJFa9iruWF/Cf73YzN89My6ifYDTBzfNzuK0+\nl1f3j/DiXjnj9Jb5OSwvtfKjjZ30e8LYjSpWZkmMCSbe7/Bg1ojU2lW0uSK4wqAW5S/00c5GJ4II\nLCg08+WLi1lYeOYE9teoVBsaGnj22Wd58sknz+l+zyH+9+88LuB/BOcNqUqSxPbt209pYfb6wWG+\n+Yq8NjbPruD+q+tYXCzPePqCYZ7YdJh1jeOMhSVqc02smZXJz97u5MlPzUd0tJJVMZffbOvltQPD\nxJMSa2oy+fyKIuom12W7XAH+7ufbmZtr5PCIn3gSLiq38aklBVxUbkvNp8YSSd6cNmajUcAdSwq5\npT4vRcKxWIyOjg62dY6xzaVma48XEUhI8Pnl+Xz9iqoZZhLxRJLNbS5+3zDAlg43ggBz883s6/fy\nk2tLmWtX4PV68fv9smJWpWevS2BTd4AWRwhRgNJ0NR1jUV68q545ece2ezud8tjMW03y2MzUOtz9\nl5WyssxGVZbhmMomEAiwZX8z+x1J/tAexhdOICFfhSqzjCwsSmNujoEKi4gqEUo5GqlUKj73Fx+3\nzrXx5VXF9Ptl0VPjkJdDQz66XMHUc2TqBepyzSwoyaA0w0Bhuo48izYVMiBJEls73fzqg1729k9g\nN6qxG9X4InHWf3UZve4gj27u4c1Doxg1Sj63vIBPLcknEQ6ycXcTb3Qn2TUUQaMU+dqlpXxiYR6R\neJKntvXyu12DhGMJrplt5wsr8rEb1Xzjj6180CkvHVxSkc59q4tRKhT84oNe3jzkQKuEO5cXceuC\nHN5qcvLDDZ0AXFyezt0rCniv3c2zuweJxpNcV5fF8lIrL+8bYWfPOBqlQDwJy4otbOnyoBIhTafC\nE4xxnGmXU6I8Q8/tszRcXpt/phZ9KUiSRENDwzkn1bfffpstW7bw05/+9Jzu9xziAqmeJ/jIkWoi\nkThhm/dkmapT2NTq5J7nD3Drgjz+cmgIX1RiTq6Jayt0lKq9lBQXY8/K4fWDIzz2QQ/9nhAAdyzO\n52LzGKtWLkcQBBy+CM/s6OeFhgF84TiLiizctaKIqiwjqx/eygNrSihW+WgMmnmhYQCnL0qxTc8d\ni/P52Lzc1MiOyxdhxX98QKFJYCgA8aTEoiILlxapKVV5qSgrITc3F0EQ6HcHeeyDHtZNVi45aRqu\nr8vhurk5lGboZ4yVDE2E5SqnYRBPKI5eLXLV7CyunJXJ4hILIjLZDQ0NMTw8zEhIYJdT4IPBJIGY\nhFKUfVovq85kdaUt1e6dgiRJtDsC/Otf2lJmESBXkSvKrCwvTWdRgQmvY4CJiQkqKyuxWCx86fkD\nuPxR/t+achr6JmjoHWf/wAShyXKqxKZnYVEa9YUW5uYYuPaxPdw4y8xN5XLUmyiKqYrWG4qyrWUQ\nZ9LAYEjBvn5val0WQCEI5Fm1GDUKRr2yU5BVr+ITC3P53PJC/uWNVg4OeVlWks6r+4ZRKQQ+uSSf\nO5cXYlDCW7uaefHQBHtH4xjUIoFoknsvLeHTSwp4ftcAv97ahzccZ+0sO1+5uIR8q5ZX943w6629\nKfvJJ26vJdes5tfbBni90YFKIXJbfTaz1S5G1Xn8ducgTr+suL221k6xzcDTO+XP1OVVNqqzDPyl\nyUmnK4RWJZJl0jA0Hk45X02HShQQBI47R3o0TGqB68o1rMpJolYqSSQSZGRkYLfbMRgMZ6y+jsfj\nHDhw4IwzdE+EV155hf7+fr7zne+c0/2eQ1wg1fMEF0j1KOzq8fCpp/bw9GcWgKub3S6RdY1uHEGJ\nAquWzy0r4sb5uejVCuKJJL/b2c+P1rcD8oXoE4sKuGNJYcrz1x+J8/KeQZ7e0cfwRIQSmzwP+LVL\nilhq8TN//nyi8SQbmx08s7Offf0T6NUKbpqfyx2L88k0aVjwb5v5eJWae66q57ltnfzxoBNnSI6c\nu3FeLrfW56XGYdyBKMt+/D7X1tqZiCTZ0jFGUoI5uSauq8viqtlZM4LOW0Z8fOzxBhYUpKVai1a9\nikvKLdQYgsy2a6iuqkSn05FMJnmrcZBvvNbBygItra4IzpD8kai0qbm43Mqa2TnMyjsinnp8Sy+P\nbOpiw1eX0tA3ztZOD9u73ClyK0vXsKoqc1J0lMZ96w4z6ovwyheOVDKxRJKmYR8NfRPs6R1nT9/E\nDAFNcbqOq2qzqMwyUJquRZcI0NvTTSKRQKlUIooiRqORpgkF//L2MP9yVQUqpcj77W62d3vwhePH\nKFsVooCARDwpXw0rMg0sK7WSl6al3+Hmgw4PPT4Jo0bB7YvyuL4um6t/sYu1s+zs6ZvA5Y+yqjyd\nf1hdSkmGnnV7hnhyWx9Of5T5+WYyTGreb3fz8fpcft8wRFKS+Ni8bNZUmPnD7m4290cJxKDMpqO+\n0MxL++SRqURSwqRRkEhKBI/q2x79GjQKgUhCOqVqdwpKAS6ryuD/rSmbcZMUj8c5dOgQJpOJaDQ6\nw8x+esjA6YzIRCIRWlpamDt37mkc0enjN7/5DaIo8tWvfvWc7vcc4gKpnif4yJHqiZJqQCbVZcuW\nnVRY0Tzs44Zf7eSSUjNr7F6qCrMpr6jk/c5xntzay/6BCSw6FbcvzueTiwsQBFj24/e5Y3E+Lb0j\n7HPEEQSBy6vtfGpJQUqdO9XOfWJLD22OAFqlyOpCFV+9asEM79ODgxM8u7OfNw+NEktIrCxLZ0un\nm+vLlNxYoSEtLY3SsjL2Dvh5cc8g77Q4iSUkFhZZuKU+j1Xl6Sz78Qfce3Eh96yuYHQixJ8aR3i9\ncZTW0QBKUeDiChvXz81mVYWNkYkIVz66g3+/oYY1NXY2tzp4dXcPu4fCRBJgM6i4osbOlbMyqS+0\nsKPbw93PHeDZz85nfkEa7Q4/Gw6P8G6bi2aHLHLJ0AkszFFzUWkavT6Bx3eO0vCtVejVCsbGxmhr\nb8crmumN6NjeLZNkPCmhUYoY1AoUosCPb5zF7FxTKo5vOhJJuQpu6Bvn39e3Y9Qo8YXjqQ+nWoSS\nDB01OWlUZhooy9CTZ4A93S7+5Z1hbqpQsWM4zqBfIs+s4jOLsrlxQT6hhMjmNhcv7R3i0KSaFyDf\nosUXieMNxU/4BRAFmCoONUoRq16FRinKtn2TbVe9WoHdqEarEul1hwhPkqJGKcq+1adRQVp0SmIJ\neQ7WoBbJTdPg9EcZDyVQCCCKArEP2ePVKAX+/bpqLqs+NuBgCo2NjZSXl6csAKeb2U+FDMTjcbRa\nbYpkTSYTGs1M0VgwGKSrq4va2toPdYynwsMPP0xpaSmf/OQnz+l+zyEukOp5gvOKVHfu3El9ff1J\n00wOdg1xy2+bAHmIfXWFlTsvKmNBQRqCILCnTybXTa1OVAqR6+Zk8/K+Ie67rIyl5gkMmQX84ZCb\nl/cOMhGKU5Vl5FNLCrhmTjY6tTwDOvuhTRRatfS5QyQkWFCYxsfr81g7Kytl7uDyR3ixYZDnd/Xj\nCsTQKuDjC7L4+JLSGSQ85o/yh/1DvLRnkF53CJNGgS+S4MY5GTx03awZ8WktI35ePzjCG42jjAWi\npOmUrK7M4I8HRnjwqgoWZ8QZHpaTaszpGWzpdPPWYSfvtbsIxZJkGNXMzTPzTquLJz85l2WlM+f1\nnLsXoakAACAASURBVL4I77WP8U6rix3dbiJx2bQgmoRbykWqLRIFaSqKi4rIyMhIXXCD0QS7e8fZ\n1uXmlX3DqVlYASjJ0FObK4uOanNNVGcb0SiPtB7n/eA9Prk4j5uqdew43ENQbcEZU9PuCNDmCDAW\nOJJapFaKRCcNCyw6JStL0liUq0FHhE6Hn3f7IrSNg14lcH2tjRf2uQD45cdn81/vtNHsimHRKblp\nfg7LStNx+CKsP+xkR4+HyOR+jRoFK8vS6XIF6R6Tlcw2vYriDD2iINDnDuHwRVJfpKUlFty+MF1j\nYeISlNv1LCqy0jsWZEePh6QEpTYdXWMhFCIkkrJLkSSREmYBCAKc7ldZQH6ev19VxKVVGcc15Tga\n+/fvZ9asWajVJ/ZqliSJcDg8g2gjkQgqlSpFtFPuVbNmzTrhfs4EDz74IKtXr+aaa645p/s9h7hA\nqucJzitS3bt3LzU1Ncc13PZ6vbS1tRFMiNz9ppt7VpUw7HTxdmcAfzRJTbaROxYfIccuV4Cnt/Xx\n6v4hYgmJfIuW22o03LSkgnSrhVA0wZ8aR3hmZz+to/6UccPti/L52GM7uXZONgv1Ywyo8nh57xA9\nY0FMWiXX1WVza30eJVY1HR0djHt9/P3bQYwqcIeTcis3zyy3G+dkp4zvk0mJnT1uXmoY5M3D8hxp\npl5gZZGBNTUZ1JdkotfrEQSBeDLJtk4Prx8c4e0WJ9GEhF4Jl5aZuGZ+EUtLbTNmP4PRBO+1j7G+\nycG7bS5iCQmdSmRFWTrLS+WfwvSZ5zQYTbC9283jH/TSOK3qM2sU1NjVlJkkSkxJKjK0pFvSUqre\nb73RQYczyLfXltM45OPQkJfGIR+uyXVFpShQmWWgNtfMnFwTD73ZxmUFSr6wOIOysrJjWpAHBid4\namsf77W7iSRk4tOpFETjieOKdtK0CvLMKtK1Alv6QqnfG1QCq0rTuKwmk6gk8HaLi/fbx+TQgnIb\nS0ss/GhjJzlmDb5wHH80wfISK7cvysUfSfDS3mH29k+gUQisqrSxsdk1+Xrk4IO8NA1pOhWD42Em\nTpLuolYIxJMSSUl2NYonk5zA2OgYlNp03LOqkLU1mR96DGbPnj3MmzfvjNZSo9FoimSn7CB1Ot2M\n0HGj0XhWLln3338/n/nMZ1i5cuWp//h/BxdI9TzBR45Uj85UnY6DBw9SUlIyw2w/GAymArMrKyvR\nG03UPrSJmxfkctccLZJCTYMTnt01QNuoH4tOxU0LcvnEonwKrDpc/giXPrwVUYBQLIlVp+SmBXnc\nUp9HsU0vqx17x3lmZz9vtzhJShJqhUh9kYU7S0NctHLF5BiHh5f2DLGhaZRoQqI0TeSmednctryC\nv3t0B3MyRL6xtor3uwO8dnCEpmEfSlHgogob19dlc3FFOmqF3EZc9KMPmF+QBpLEzp5xEhJk6kUW\nZgoszdMwJ99CWppcee9r7eH+zUHKMnQMTUQIxZLo1XK1tboyg1UV6TNCBHb1ePjs7/azotRK11iQ\n4QlZcJNv0bKsNJ0VZVaWFFsxa5UMDg7y223dPNcS54XPLaBrLEhDn9zu7XPLhKVTiczK0lGVrqTE\nEOcvnSFGAvDL63JTgiOtVovDH+XQkI+Dg7Ky99CQF3/kSEWbb9VSaNVRmK6nwKrFH0mwq8dDQ98E\nSlFg7Sw7/oh8c/BPV5YTiCR4ZucA7mCM3DQN9YUWbEY1Q+NhmoZ9DE+Ez0gpe6ZQCLJqWyEKZJvV\ngMDQeBgJUiKoM0GeWc0XVhZy7ZzMVCk75ZYFpOwYp/59IuzevZuFCxee9UzqVMReUVFRimingseT\nySQGg2EG0Z6sMp6Ou+66i+985zvMmXNswPnfCC6Q6nmC84pUm5ubyc7Oxmq1EolE6OzsxOv1Ul5e\nPiNDsfahd4glJArS1PxdlZnPXjyLdIPqGHJcXZnBJ5cU8M+vNbOo2EKdJcHmvgjben0kkhKLi+V1\nzjU1mWhVCoYnwvx+9wCPb+lJWffduKCA6+fmUJNtZHBwkKaOXpqCRjZ2h+h0BtCrFYgClFmU/PK2\n2dgmLdLaRv28dmCYNw6OMOqLYNIoWDsrk+vqsrl33SGunJXJd66qZDwY451WJ28ddrCje5yEJJFr\nVjEvPcm89CS5JgVfeS/Op+rMfKI+m9Zx2N7rY3P7GA5fVDbIz09jdaWN1VUZhKMJbn5iD/91ay2X\nVWXQ6w6xrcvN1k4Pu3o8BKIJRAGKzSIL8w3ojGZ+u3OQzfctn+Fv7PRFZOFR3zh7+sZpGw2kxmhU\nCoHLKyzkGiBTHSdDFcVmUJGWlobRaCQQCOBwOtHY8rnr5S5mZZvIt2rpcgXpcgVTrdgpZJs1FNv0\n9HtCDI6HUwRWm2Pi4wvzuLTSxsB4mBf3DPHnQ6NE4klqbEqax+SK8aFrqnhu9yCto36MGgWXVmZQ\nX2Di0ICH7T0TDHiPCJ0y9CLlNh2HHWF8kYSsdi61olYK7OiWs3dV4pHZUItOyXgojkGtwKBRMB6M\nnXBt9XQFRyYVLCoy87Nb5x/jNjXlNpZIJFJK8NNJ8jlXs6UjIyNEo1EKCwuPeWxqnXaKbH0+H7FY\nDK1WO0MQpdVqjyH3m2++mSeffPKUKVT/i7hAqucJPnKkCrLC8Hhob2/HaDTi9/txOp2UlJQcN+lk\n+Y/fl31bQ2EOjYZQigKXVdu5eUEuK8psOH0Rft8wyEt7BhkLRFEpBEpter57iY28dBOiIZ0/7h9i\n3d4h+j0h0nRKrqvL4eYFuVRnm7jxVzsRAG0iyMGxJLGERK5B4LJyM59eVU1hhglJktjXP8G6PYP8\nYf8wEpBpVPF3tdlcOTuLuXlmQCIWT7CrZ5w3Do2ysdlFKCYLVsrsBr5zVSXz8tNSgeZOb4h121p5\nt3OCFneShCRXmAPjYa6usfLFBWYCfh+hUAiFQoEzruXAmMSugRCtDnnmM9usYcQb4fPLC7lrRSFp\nuiPtVq/Pz192tdDoitHhU3Jo2J8S78zOMbGwMI3aPHlttNCqm3HeJ0Ix9vVP8B9vdzI4HsagVswY\nf7HqlBSYldiUEQrMCvKMIkUWFfduCrKq1IRRp+Gt5jFCsSR1uSYurrSRbdbS6w6yq2ecdkeAQPTY\n+eWjoVNCbpqG7DR9KkkG5LXS2lwzBVYt3a4gzaN+ApEEBrViMksWdnSPp9Y2TWoBkwqCcQlvBJKc\nnBSnHlMpBJSikBohOh0oRIHZWXouy42zqiKD8rKyD9VKPVFk3lRFK0kS+/fvp76+/piAgQ+LwUHZ\nwSkvL+8Ufyljap12elUbDodRKpUpIdTIyAgPPPAA77zzTio/+Wzw1ltvce+995JIJPj85z/Pt771\nrbPeJxdI9bzBR5JUj5dUk0wm2b9/P16vl9LSUvLz8094cVj7X9vIMKr54ZX5tA+O0eBW8Yf9w3iC\nMXLSJt2I5udiN2r4y+FRHvxTC8HJCq0+z8Ati4u5vNo+aUruYd2eQTY0O4glJOryzHhDcWxGFfdU\nhomLavY6YZcT9g/Ia4+Li61cVyeTp0mr5KbHduILhimw6NjZ7yOWkMgyqbm82s7aWXYWFFoQJwU/\nb7c4efDPrURiSSTAolOxqjydugyBbDxUlhSSm5vLRDjOOy0u3mpysG2SPIwaBYuLrSwvtbKowIxV\nGU1VDANuPwddsNuRpNklk93UqMn8fDP5mjD5mjCLaitThuPecIyfb+7muV2D1GQbZ1SRZq2S2Tkm\nWYQ0SbRZJg3f+mMz+wcmWP/VZYwForSN+mkaHGdP5zADviSD/uRxCUcA8owCdXYFc3KMCEoNja44\n73V48EeTFFh1GDUKmkf8fGllEc5AlI3NTrzhOGlaBfkGiRyLjomYkq6xIO5ALPVh16sUIEA0nkyJ\ngwSOiIOO/lIY1AokCYIxmcStWhG1kMQfg0D89CvOk0GnFFldlcHdy/PBO4LX66W6uvqYHOGzwVTl\n2Nrail6vPyZrdroI7nSJtre3F41GQ3Z29lkdWywWw+fz0d/fzw9+8AP27NlDaWkptbW13HLLLaxd\nu/aM9ptIJKisrGTjxo3k5+ezaNEiXnjhhXMhrLpAqucJPvKkKkkSQ0ND9PT0oNPpsFqtpwyivua/\nt9PuCKBTiSzK1fCpi6pYWGTh/fYx1u0dYmvnGAArymzcsiCX3zcM4AnEWJirYWP7BKP+ODqVyOU1\ncjt2eWk63nCc1w+OsG7PIB1O2cqvzgY3LS7h6nlFGLVK+t1BXj84wusHR+gZC6JRilxaZafLFUAh\nxXj0hlL0aelsbhtjQ7OTLZ0eookkmSY1V9TYWVuTyYLCNG58bDd5aVqurctmfeMgW7vHCcRkkc+i\nIguXVGawutJGvlUWF9X/8D0WF1vJNKnZ1uVhcFwejclJ00wKkawsLbFiVAm09Dv5+LOtXFehRUzG\naXUn6PJKTC5vkm/RsqBQNmeoL0zj8JCP//fHZt788hLyLFo6nIHJNVF5XbTdEUgRVYZRjUIQCEbj\n/NOVleRb1Eg+J3G/nCJjMKexqdXFK3uH2dnrITGNW7PN8mhJ4ijTAwEwqSHbqMQRTDIePrJRiU1H\nVZqEXS/gTOhp6PPiCsQwqBVcVpXB642jAFRnGWkZ9aNRilxSYWNWjolDw162droJRmUrQbtRRZsj\nmJoNVSkEjBoFoUic8EkK5A9DsAa1yPVzs7lnVQk2gxqHw0FnZ+cpQwHOBMlkkv7+foaHh6mqqko5\nKU1P8Jn694zXcwqi7erqwmw2z1huOVtMxb5t27aNw4cPo1QqmT9//hnta/v27Tz44IOsX78egB/+\n8IcAfPvb3z7bw7xAqucJPrKkmkwmcTqddHZ2YrVaKS0txe12EwgEKCsrO+n2n3l6D+5AlNnZBjY0\nOwnEJGwGNVfPyeLaumzS9Spe3TfMK/uGGPFGUCkEDGoF/7q2gEJjEp/azusHh3nr8CgToTgZRjVX\n12Zx1Ww7msAo394wzEBAQEGS8YiEWimysiydtbOzuKzKjlGj4OCgl9cODPPnxlHGQzFEARZmiizM\n1bCi1Eqe3Yqo0bO918+GZicfdLiJJpLYjWoSkkS2Sc03FyjRa1QUl5bR6oqyuc3F5vaxlH1fud3A\nJZU2ft8wyDVzsvjuVVVIkkSfJ8T2Lg/butzs7B7HF5HXDGtyjMzNNfPCniG+dlEu8wwTmM1m0qzp\nHBrwsKd3nMOOMG3jEr6o/FExqEQCsSS3LcxlSbGVikzZInAqASccS9A66k8R7aZWJ77ITBbSqkQ0\nSpFAJEE8KRsuLC9N52PzsvnSC40AXFeXxfrDDiIJiaJ0HYuKLBSl6+h0BTk4MEGfJzxjBOWvCYUg\nf1GSkuyXq1WLxBJSan70w5gxFKWJXD/LylVzcsiwpqFWqwmFQrS2tqJUKqmsrDxtMc/pwuv10tLS\ngs1mo6Sk5JRV6HSiPV4IvCRJKBQKBEGgo6MDu91+1naHR+//bLJUp+Pll1/mrbfe4oknngDgmWee\nYefOnTz66KNnu+sLpHqe4CNJqg6Hg9bWVnQ63YyB9bGxMZxOJ9XV1Sfd/ssvHGB7t5tb52dTpPSS\nkVfCG40jbGqVjRaKbXquq8vm6tosej0hHnyjmaFJFWy6TsFVc3JYOzuLOblmtnSO8dqBYTa3Ookl\nodCixqhV4/RHeXi1nrilkE3tHtY3ORidJOgVZTaunJ3J6soM1Aq483f7aXcGUCtE3MEYCgGq7Rrq\nbAKzrUmKrFpUehOH3QIf9Pp5r2McCXn8YmGRhWWl6SwrsVKdbUQUBHrdQTa3jbG5zZUyXlCKAktL\nrCwoSKO+MI05eWa0KgXxZJLDQz62TZLsvv6J1DppqU1HXX5aqo07NUMajUZp6nexs2uMje3jNLlm\njoioFAKlGXoqMo1U2A1UZMo/OWlavv1qI1s63Hyx3sLuMZFdPbJ7kijIozDhePKYahRk84VMk4Yy\nu4F0vYoRb5hOZ1A+XyLUF1gIRhMcGvYxO12g3y/hjYJFK7AwR0OmJk7XeJJmj8REREIlCimrvzl5\nJpqH/cSTEla9ktw0LaFYkj53kHhSNk9QiALBM1ToTkEA8qxabqzL4raF+Vj0KoLBIF6vNxUEPxWm\nbbfbycrKOq7BwpkikUikxHvV1dUnDB04HRxPEBWJRGhqaqKiogK9Xn9cQdSZIBaLsWbNGhoaGs54\nH1NYt24d69evn0Gqu3bt4uc///nZ7voCqZ4n+EiS6lSL6ej1pYmJCfr7+0/p5vKNVw6xoclBIikR\nT0rkWbRcUSNb6Q1PhPlT4wi7emQz9PkFaShF2VjhG6sLeLNxmP2jUSLxJDaDihVFJip1fupLs2gN\n6vjTIQcNvfK2+SYFl9VksaY2l7o8E03Dft46PMr6JgdDE+FJorMQiCQY9kZ4+95lNA56ZUJsP5Ls\nkm/RsCTfQIUhTLYiwC+bBLwxkUX5BhodUbo9MuFb9SqWllhZVmJlWWk6eRYt3nCMqx7diVmnRKUQ\naXfI+1SKArW5JhYUpLGg0EJdjgHP6ABtgy6++X6YlWXpKESBQ0NexgKx1DblmQZqc0zUTpo19HtC\n3PfyYZ799FyikSBNg+O0jfrp8UQY8Eu4w0c+UpO+F8QS8gdNFGBWjonLqzNYU5OJwxdhY4uT9U1O\nXP7oDBejRUUWBsdDuPzR03ImOhmmrn7/Ex92g1pkWUk6d68oZM5k6MLxMD4+TmtrKzabjZycnJRw\nx+v1EolEjknx0el0H4poXS4XHR0d5Ofnn/NWsiRJjIyM0NPTQ2lpKTabbUZlOx1nsk7rcrm46667\n2LRp01kf64X27wWcLT6SpHqipJpgMEhbWxvz5s076fb/+mYrL+0Z5O6VRQwP9DMmWtjaOUYsIZFp\n0nBFjZ36QgsDnhBvNI6kiGhenolZ1iQ3LJtF64CLN/b1c8CZIJKQsOhVXFFtZ82sTDY2OXhl3zCz\n7CqaXDESSQmLTsVF5TYurkhnaXEa/eNhNjS72NjsZGByjbM215QixQWFaYwFYmxuc7Hh0BB7BwPE\nk7LYSKdSoBDgP64uxCSE6XNOsH84TNsEHB5L4g7J56YwXcfyUiubWlzMyTPz84/PYTwUY3//BHsn\nx10ah3yptmmRRc2CIit/ODDKZ5cWcN9lpShFgVFfJNW+PTzk5dCwj4mQXJ0qRdmsYGVZOnPyzBSl\n6yiwyj9CMs6fDwzyl0MjtLjjTO/6nqxFatYqKUzXUZZh4LWDIzP+Pt+iZUWplbIMA80jPnb2eBjy\nyiNWWqVAOC4xK8eILxSnf/K8ZhhU2E0aYokkg+PhY4RQepWY8tlVizKRx8/wm2BQK5idY+SaOrnV\nP30G+HiYSiIKBoNUV1efUN0aiURmVLShUAiVSjWDaA2GYxOCotEora2tJJNJqqqq0Gq1Z/bCToBw\nOExzczMajYaKiorj+gOfrH08NeJzMqLt7OzkoYce4tVXXz3r443H41RWVvLOO++Ql5fHokWLeP75\n55k9e/bZ7voCqZ4nOK9INRqNcuDAgVPO2z3yTge/fL8n9f8Cq47lpemYdUq6nEG2dI4RiSdJN6i4\nvMqOKxBlU6uLykw9bZOjJxk6kUur7VxUlUU8nuSdVhfvtjkJROS81Ug8yT8ssbC8KpeRkMi7rS7e\n7xjDM9nerS+0cHGljYvLbfzqgx7WNzmpyzdzYMCb8smtyzFQoouwsNDEstpy9g8H2Nw2xhuNoyk7\nPptBxYICC/MLzNRm6cjWxGkd9rCzZ4JGR5RWTzIlpMkxa+T80RwTs3NN5OkS9Pd04UzoGUkY2Dfg\nY1//eMqIQCkKlGToqbAbKJ9s4ZbbDeSlaRnxRmgc8rH+8CgbWlzYjWrGAlGOt6ypFGSCn1eQxqv7\nZZJcVWRg90CAUEJ2HSowK8k2qUmKSgYnojj90WPmUf+n8GHERRadkhVl6dw4L4elJdbTsgSEmdVd\ncXHxcUe/ToVo9Ih62+v1EgwGUSgUqZnPSCTC6Ogo5eXlZGZmfqh9n87xDwwMMDg4SGXlEUX46eJU\n67RwxLhi//79PP300zz11FPn5NjffPNNvva1r5FIJLjzzjt54IEHzsVuL5DqeYKPJKmeKKkmmUyy\nc+dOli1bdtLtn9jSw082djA7x4QyFkDUmWga9hGJy25Di4utZJs1OHwRdnR7Ul6187PU5GmjZOfk\n0OWJsb3LTSiWRKcSJ92G0tGrFTy3a2CGYXu5Xc+SYitLii3oNUp29Yzz3rT2rlkrG8b/9KZZ1GSb\naBsZZ8P+Xg46ovT75ItNmk7JkmIry0qtbOlw0zjo5e8vLmFv/zh7+yZS1a5OJVKXZ2ZBoYX6AjOl\nVhWfeaYRSUqSZ4Du8QSO0JG3OS9NTV2+JbVuWpFpYMV/bOXy6gyK0/W0OwN0OAMpxTDI9nlldplg\nJUni9cZRFhVZ6BkL4PTLreJ0rYBVK6LX6XAFYoz6IscQrgDoNQr0KjkRyB+Jp0wTrBqBIouS/aPy\n/qY8jwVkyz+tECcuwViYlPBpyvTBrFUSjMblBBpBPicAoWgy9QGf3lr+MDCqYEGOjtV5AgWGBDqd\nDrPZnKoWT2f9MxgM0tLSglarPWF1d6aIx+M4nU66uroAUgKiKQN8s9l81paBgUCA5uZmzGYzZR9y\nZvZkOJpop35+9KMfsW/fPjZs2HBOnuevhAukep7gvCJVOL34t9/vHuBf/tSC3ahOZVnqVCLldiNK\nhcCAJ5T6fXW2gWQsRttYFJtewVhQvoBnmTUsKbaSYVTjCcbY1TNtVMWsYdgb4bP1VjweL70BBU0u\n2UlHIUBdnpmlJVYqMo24AlGe3zVAj/uID61dJ7CgMI1l5VmUZOgYmYiwo8fD9i5PKqdTFGB1ZQaz\nc03U5pjINKnpdIVSJNs6KhszKAQBtVLArFVy17IC9PEJxLCXhDaN9rEIzaNBuscTuMIz3/ridB2X\nVGZQmK6j0KrDZlTjC8fY2SPbEHY6A7gD0WOs/gQpiSQAyNFqSCAJMqnlWzQMjMvHv6o8nQ5ngOEJ\n2XxeIQjo1QokJMKx5F9Fyfth50eNGgWVdgOXVtlZO9tObtpMp58p44Lpbdmp9c/pRDvlEJRMJunp\n6cHpdFJVVYXFYjmnry+ZTNLb24vD4aC6upq0NHkNN5FI4Pf7U8c5ZRk45WA0dZwnC6I42f7/WnA4\nHHz9619HFEUeeughampq/qrPd5a4QKrnCS6Q6nHw58YR7n/5UOr/KlHAalARiSdTa4VmrZIMvYg/\nFEtVdmoF5BsE8jPTCUTjdDgCKXP00gw9s7JNKBQC+/qPeN+KApTZtJRblWiFON5QjB6fRPdEMmWa\nnpOmoXssxK0VCvSmNAaCIvv6J1ICIbNWyYKCNOYXmMlJ0/LSniH2D3jJt2rpGTtCxrlp2lRrtzRD\nTyIp0Tbq59ndgwQi8RmVmc2gonyyrVueYcCihQlvgPZRH883etGrIJo4Yrd3NDRKkXyrDkGS6HAF\nSceHGwOTtgnT/lLiRNcbAVApRVSi7OoTjidTx6hXiejVClyBmeEJCgFUk+ue08W4IrKr0ZlCrYBs\nHVxUZuG25eWU2c/MZGFKBTtFsl6vl3A4jCAIRCIR0tPTKSkpOe7659lgSuiUmZlJUVHRaY3JBAKB\nFNH6fD4SiUQqQ3WKaKfGeabGcDIyMiguLj4rNe+pIEkSr7zyCj/5yU/43ve+x4033nhOz9VfCX/z\nB3gB5wYfSVI9VabqqUi1cdDL3c/uwzPNJu/odqBWARLyoP8UskxqotEYE1Ep9beF6TqsehWhaJJe\nt+woNFURLSpMw6RVMhaI0ebwpwQy2WY1lRladGISjz9E81gcX+zId7LIqmVWjol8qw5JknD4ozQO\n+ugeC6aOVZLgY/NzKLBoUYoi/mic3rEgh0f8KUIHyDGrCYSjKBUiX7yoGAQ5A3RwPEyHM0iHM5Bq\nb4NcnQUiCVQKYYbK1qyWW5+CIBJKCPgiydRIyulCIySISHKrMMOgYjwUSyWwqBRCKvIslpCOqVSP\nJs0zVfAKyLmneRYteRYtK0vMVKrHUSlEKisrz7mQJxqN0tbWRiQSITs7O0W4wWAQlUqVIi+z2ZxK\nGfowiMfjdHR0EAgEqKmpQa/Xn/GxSpI0Y8TH5/MRjUZTYzPFxcXY7fZzNuJzPIyOjnL//fdjMBh4\n5JFHzqmJxF8ZF0j1PMF5R6o7duxg0aJFp1zn2do5xoYmBzvbR3CEpNNKCZnKu5yCSatErRDxhY+Y\npFt0SrQqRco0YsoQQKMQKEzXY9YpicSTDHpCeCar4imXnvo8AyohyXgwykggwfg0i+OidC0VmSZM\nGgWNg146XMGUWfsUzFol5XbZfEEtSrjc44yHEzSNJQkfJfpRKwQ0SgWJpGwL+GHfeJGpGw+JUGLq\nNuJk15VTPX7uoVaATSdQkSZSm6FgSZGZbJslRWCDg4OMjIxQUVGBzWY7p8895fTV19dHWVkZdrv9\nuMrcqYp2imgVCsUxRHuiqnDKcamoqIicnJxzTnQej4eWlhbsdnvKU/voFvfUWu2HHfE5Gslkkpdf\nfpmf/vSnfP/73+f666//v1CdTsf/qYO9gDPHR5JUT5ZUs2fPHmpra9FoNMd9/GgcPHiQ3NxcWrsH\n6BoLEdKmc3g0Qsuoj+Hx8IxK9XSgUQhIMKPK06lETFolkiQby089phIhO01HLJFkxBtJZW9OwW5Q\nYdUpUJAkGI3jDifxTXvZFp1sVGDUKpEkiUA0wXgwdsws54nWElUK+ToQT0gnfeOVIqgVIgpRriSj\nieRZz4qeK4gC6NQK7EY1BVa5av/6ZWWp0PApTF9XdLlcuN1uVCoV6enppKWlpcjhXIhu/H4/LS0t\nmEwmysrKTrlWOR1TnrdTRBsIBBBFMUWyZrMZhUJBe3s7CoXir+K4FI/HaW9vJxQKHTefeHqL++gR\nn+lEe7ot7pGREe677z7MZjOPPPLIOb/B+R/CBVI9T3DekeqBAwcoKys7LbeYWCzG7t27SSQS+2MM\nEwAAIABJREFUVFVVHbea8ASjNA/72NHtptsVpHXAhT8pq3XPllhEQU4gOZrURECtEhEFuTKOxmdW\nklOtahH5DTvZUUwpYkGutJPJkyepKCbnTo/e9n8bBrVIlknDrBwT9YUWFhZZKLHpPtTaXiQSob29\nnVgsRnV1NRqNJkW0Xq93hoBnutDodIk2kUjQ1dWFx+Ohuroas9l8pi93BuLxeIq8RkZG8Pv9aLVa\nrFZr6hjPVtE7BafTSUdHxxlVvycb8Zm6KTAYDKn3LJlM8tJLL/Hwww/zgx/8gGuvvfb/WnU6Hf9n\nD/wCPhzOO1I9fPgweXl5J1VWTpmJDwwMoNFoKCwsPK05PkmSaGhowGw2Y7HIQeDhhMDhYdkUoXHI\nS5crxKgvjO9kLusXkIKA3KY1qATStVCdk86sfAtVWUZKbHpsRjUqxdmJYqZmKgcGBigrKzvpe51M\nJs+IaKcci/Ly8sjPzz/n5OD3+2lubsZisVBaWgowg8D8fj9A6jg/bOU9ZRIhSRJVVVWn3ek5FaZu\nCKYf5wcffEBDQwOjo6PY7XYef/zx046K+xvGBVI9T/CRJFU4caZqW1sbVqsVu91+zGOSJDE6OkpX\nVxeZmZkUFxfT19eHVqslNzf3hM81PbUjEong8XhSF4lEInHCC+74+DhtbW1o9Ca06TkM+uL0e4IM\nuMP0ekKMeMO4gzF8odgJVbYfHSQpi/dzw5WrMaqUXFZjx6IV6e/vp7+/H71enzrHZ1opHg8TExO0\ntramVLdnsq/pRDtFEFPHqdPp8Hg8KJVKqqurz7nQKZFI0N3djdvtpqam5qTRb1Mt7ukENv18ThHt\n9Hb0dBOKU91wnAskk0l++9vf8uyzzzJv3jzi8TiNjY088sgjLF269K/63H9lXCDV8wQfWVI9XqYq\nyL7AOp2OnJycGb/3eDy0tbVhMBgoLy9PXfz6+voAKCwsPGZf08kUjviWTsf00YSJiQn8fj+JRIJE\nIoEoipSWlpKZmfmhRxBiCXm8x+WP4PRHGQtEcXgjDE2E6feEODAwQbYO1FotokJBIiERTcjznbGE\nJPsaJ5LEJYlQNEE8CTqlgCAgz49ypN0rigLKlPm5wHgoKo8ZqSUsBg1ZFiM2oxqLXoVZo8SkVZKm\nU5KmU2HRqWh65zUe6kgnzIkJRUeYX9c5WHDDZwC5ymptbcVoNFJWVpYyQJh+PqdI7EyINhaLpdYF\nT2b/d6aYMqcfGRnBZDIRi8XOaPbzZHC73bS1tZGTk0NhYeEZVb8nOp8GgwGdTsfY2BgGg4Gqqqpz\nakJxPAwNDXHvvfeSlZXFT3/603OaZPM3gAukep7gvCPVvr4+BEGgoKAAkN1f2traUt6nR6+1Dg0N\nEYlEZmSwTjm5TDm7HI9Mj4d4PE53dzdjY2Pk5uYiCEKqYhAEIUUKU2tLH/YiOb2qmGozns284NGt\nzqlZxXg8jk6no7S0FKvVelrPse5H3+LfIxcTQ8n/b+/Mw6K67zX+Hhi2YV+iMoAIDItLBUFcbppq\nNF6j12BdEpf0am6aRG1FvCbNojeWxCRqoo2NxqBZbGoWkvjUEBMeTV2wqQsjBk1F2YZ9F4QBBmb/\n3T/M7/TMAgxwBmHmfJ6H5xHmwJwz4Lznu71fHf4tJCLo4AIdXnQ7j0df2AWtVgu5XI7Ozk7ExsZa\ntXSbCoNCoWAjRUKIxVQnt+s2IiICo0eP5j0VS2c2TaNf09nP9vZ2VsC4Hb19Ca1Wq0VxcTE0Gg3i\n4uLMGoUGC41+6+vr4ePjA41GA51OB09PT4szqoPFYDDg008/xbvvvotdu3ZhwYIFI7l22hN2d0EC\nlrFbUaWRgSn19fXo7u5GaGgoSktL0d7e3uvIRFNTExQKBaKjowHcFS46l2etmBoMBtTW1qKmpqbH\nhdLcZhOFQoGuri6IRCIjoe1tLEGhUKC4uBje3t6IjIzkveNTo9GwYieRSKDX69kbAtPuU26zCZcf\nv/4YX+WV4YzrNCjhDk+oMFcjw6NTIzFl8RrU19ejsrKSlxEQS7VPnU4HrVYLT09PREZGwtfXlzcL\nPeDu71Aul6Ojo8Pq1WlUaLkdvXq93kzAXFxc2PJEeXm5zW4IerIYNJ1RbW9vh1arNTOD6G+ttba2\nFps2bUJISAj27NnDu4vUMEIQVQfB4US1sbERlZWV0Gq1iIiI6PPN+86dO2hsbERcXFyfqV5LNDc3\nQy6XIzAwEOPGjev3+AQVBYVCge7ubiOLO9o9WlpaCo1Gg5iYmEHtwLQE94agJ2N37g0B3flJ5ynp\nR2/GBe3t7SgqKoKPjw8iIyN5TzNSsVMoFAgLC2NvCDo67vovm6aO+xvdE0LQ1NSEsrIyjB07ls1C\nDBSDwcAKGD1PrVYLrVYLd3d3REREwN/fn9fXaSAWg4QQdHd3GwmtRqOBu7t7n37HBoMBR48exXvv\nvYc333wT8+fPt8folItdX5zAv3EYUaVpP7lcDldXV6sMIIC7EaBcLseECRNY83Fr/vN3dnaiuLgY\nrq6uRjXawUJXfLW1taGxsRFqtRpeXl4ICgqCr68vfHx8eItS79y5g5KSEgQGBva7iYc7T0nHJ0wj\nb5FIBLlcjq6uLoup98HCjex6EjvufCq3S5YbeXt5efUotN3d3SgsLISrqyuio6N5zxDQTvS6ujq2\nbkpfV5qS5aaOByK0fFoM9uZ37O3tjcuXLyMyMhJvvfUWIiIi8Oabb9rcI3iYIIiqg2C3ospd/9bc\n3IySkhL4+/tj9OjRqKqqQnx8fK/fT2umtKGFRjXe3t6seHl5eZm9SavValYooqOjeX/D4AqFRCJB\naGgoNBoNG83StBx9s+UKmLV0d3ejpKQEhBBER0cPytqOC51TVCgUaGpqglKphFgsRlBQEHue1Fx+\nsCiVShQWFsLDwwNSqbRfYmdJaBmGMYpoxWIxampq0NDQMKDVZtZAxY5mOUxvagghRqljrtBybwp6\nElo6N9vW1obx48fzflPDPU+1Wo2mpiZs3boVP/74I5ydnREZGYnly5dj3bp1NnneYYYgqg6CXYsq\nNREXiUSIiYmBWCyGWq3GjRs3kJSUZPH7emtC0uv1rCiYpjm9vb3R2dmJlpYWtqOX73SWQqFASUkJ\nPD09ERUV1aNQ0PoXPU9ap+urQ1av17NbUmxhzUevoaioCP7+/oiIiGBTsVxzedMUd3+ifO6ISWxs\nLG83NfR3Tx2XWltb4eLiYpQh6KmWPJDnksvlaG9vt7o2S+HWPrmpY7FYbPS7VyqVKCoqgkQiQVhY\nmM1Tr1VVVUhNTUVUVBTeeusteHt7o7GxES0tLZgwYYJNn3uYIIiqg2C3olpVVYXKykrExMQYNT/o\n9XpcuXLF4szbQJqQNBoNKisrUVdXBxcXFzAMw4oCfbMd7KC8SqWCXC6HWq0ecN2U2yHLrSfSiEan\n06Gurg6hoaGD7hq2hEajQUlJCdRqNWJjY3scYaFRDVdo1Wo13N3d2dezpxQ3dfsJCQmxiVDQrIVK\npWIdl7hRYn+atnrCFiYRXKGlWQKdTgc/Pz/4+/uz58t36hq4+3d35MgRfPDBB9i7dy/mzp1r77XT\nnnDIi3ZE7FZUNRoNDAaD2X9gQgguXbpktKnGmnlTS7S1taGkpMSs45bWlKiAaTQaNlKgwmBNOlav\n16OqqgqNjY2IjIy0aJM4GPR6PdtgQwiBs7OzWYPRYFeQcRudBhrBc+t09IP7mrq7u6O+vp6ta/Ll\n9sN9fjqq1FfXrSWHICcnJ7OmLVOhpY5FdLSLb5MIwNhicMyYMeju7ja6KTDt5h2s0FZWVmLjxo2I\ni4vD7t27bZZeHiEIouog2K2oWrP+baBiSmuOer0eMTExfRoHmEYKpulYX19fI29WbjcpHeznO3Kk\n86AdHR2IjY1lO4l1Op2ReJk2GPn6+lpd96SOUYNxK+oJWk+Uy+VobW1lO0y5ac7+1pItQWuzYrEY\nUql0QI1APXVH0/lZtVqNhoYGSKVSmzgWWWsxyO3mpdkMjUYDDw8Po9e0L6E1GAz48MMPceTIEbz9\n9tuYPXu2o0anXBz+BXAUHFZUp0+f3m8x1Wq1qKiowJ07dyCVSgdVc+TOUVKnJZo67uzshJeXF5ti\n5BOuz21PIzKm0EYo+mE62uPr62t0nlxj+tjYWN4anbi0tLSgpKQEY8aMYW86qNCamlUMxNaQ1pdb\nWlp4rc1SdDode+PEMAycnJyMbl76s8WlJ/iwGOxpbIYKLY1q6e+/vLwcqampmDhxInbt2sW7UxUA\nFBUVYcWKFeznZWVlePXVV7F582b2azk5OVi8eDFr2rJ06VJs376d93PpB4KoOggOJaq0CSkvL4+t\n0fn6+vZZ9+KmMPmYQ7SEWq1GcXExlEolAgICoFKpBhUlWqK1tZXtgo6IiBhUFGeajqV1TxqVR0VF\nmVlB8oFKpUJxcTEIIYiJienTTagnGz7TkRmu0FLBDg4ORlhYGO9ZAu5MaGxsLFvztzSG1J95Xy4q\nlQq3bt2Cm5sboqOjeZ1ptZSO/+Mf/4i2tjbU19dj06ZNWLt2ba9+2Xyh1+sREhKC3NxchIeHs1/P\nycnBnj178O2339r8HKxEEFUHYXC5sWGMpVoqbUJKSEhAZ2cnFAoFKisr0dnZyb55UaGlNS1q3hAU\nFITk5ORBpxNN6atuyo0S6+vr2e5YWpv19fXtMx1HhchgMGDSpEm8RI7u7u5wd3dno5+WlhbWOzko\nKAi1tbWoqKhgR3voTtKBvn50XrO+vh5SqRRBQUFWfR9tHPL29mY3nXCzBLW1tWzTlqenJ7uf9Be/\n+IVNoizakT5q1CgkJycbCTbd38odz+EKLR3VEolERjcFXKGlmYja2lqbjfowDAMPDw94eHhg9OjR\nKCsrg8FgQHJyMmbNmoWCggKkpqbi2LFjNk/7njlzBlFRUUaCKiBwL7HbSJWuf7O2bmrqXqRUKqHV\nauHm5obw8HAEBQXx2h1J66bl5eVGKUxrvk+tVrNNUNymHW53rEgkgl6vZyOi/ghRf+gtcjRNx1Kv\nWy8vL6NZ377SsVSIqDkBn7VZep7V1dWoqqpCQEAACCFsOn4wnbxcdDodSktLoVQqB23gz/1bpel4\nkUgEDw8PKBQK+Pr6IjY2lvcbQFP0ej0OHz6MTz/9FPv27cOvfvUrmz6fJZ588kkkJiZi48aNRl/P\nycnBsmXLEBoaColEgj179mDixIlDfn4chEjVQbBbUaXi6OfnxwqpNXfN1LxBqVRi3LhxMBgM7M+i\npgo0mh3o2rGOjg4UFxfDw8MDUVFRg66bms6lUqHVarUICAhAeHg4fHx8eE1j0hRmY2NjvwTbkkk/\nYGyqQcWLO4YTFxdnk9psR0cHCgsL4evri8jISCMh6mkumXuu1qRjm5qaIJfLefE0toTBYEBZWRka\nGxsREBAAjUaD7u5uuLi4GNU9e/OO7i+lpaVITU1FUlISXnvtNZv8bvpCo9FAIpGgoKAAo0ePNnqs\nvb0dTk5O8PLyQnZ2NtLS0lBSUjLk58hBEFUHwW5FVSaT4dlnn4VCoUBcXBySkpKQnJyM+Ph4i3U4\nbho2IiLC4ugHN/KiXbyEEPZNltZne3rj4rotxcTEsB23fMK1R6RjE1xXIFPxGsibLK05jh49GuHh\n4YMWa66xAtf8XqfTYcyYMQgNDR10046l56R+wHFxcVZtwwGss1+k4qVSqVBUVAQnJyfExsbaZA60\nN4tBbumgo6MDXV1dcHV1NTPW6M/rqtfr8d577yEzMxPvvPMOfvnLX/J+TdaSlZWFd999F99//32f\nx44bNw55eXk2ydZYiSCqDoLdiipFq9WioKAAly9fxpUrV3Dt2jU4OTlhypQpSExMRGJiIv75z39i\n9OjRSExM7HdjClcQaNqYvslyvXhpPdBWbktarRZlZWVob29HTEyMxW5VOtrBjbxoNEPPtbc32e7u\nbhQXF4NhGMTExNhklpKa63t7eyMwMJA1rOBDECh0XpMaXQz2d2Gaju3q6oLBYIBOp0NISAhCQkJ4\ns1+kDNRisKdObm6au6dzLS4uxqZNmzBt2jTs2LGD95Vz/WXlypWYP38+/ud//sfssYaGBnaeWCaT\nYfny5aisrLyXoz2CqDoIdi+qptB62dWrV5GZmYljx44hNDQUgYGBSExMRFJSEqZNmzaotVparRYK\nhQIKhQLNzc3o7OyEu7s7Ro8eDX9//wEbn/d0PbW1taiurh5QetHUN1ilUhltGaHr0Wht1lb2hXRu\nVqlU9miub+lcuU1bfblXcSPHmJgY3seVgLuZglu3bsHLywuBgYHsDddg7Re5tLa28moxaOpgxT3X\nyspKhISE4NSpUzh27Bj2799vZJzCN+PGjWPLKiKRCHl5eUaPE0KQlpaGb7/9FlVVVThz5gxmzZoF\nAMjIyAAArF+/HgcOHMB7773H1pr/9Kc/2fS8rUAQVQfB4USVolarsW7dOrz00kuIiYlBfX09ZDIZ\nG9HS5p6kpCRMnToVU6ZMsWig3xO0buru7o6oqCgQQowEgRqfU0EYSH2WmivwMSJDMR2XaG5uRldX\nF8RiMcaMGdMvRyhrn4/uUbV2bpb7vVQQLLlX0Q9nZ2c2U2CrmwKu53BcXJzF1H5PY0jcG5jeUsQ6\nnQ4lJSXo7u7G+PHjbRop0tf17bffxqlTp9DS0oIpU6Zg2rRp2LZtm02yFEDfadrs7Gzs378f2dnZ\nyM3NRVpaGnJzc21yLjwjiKqD4LCi2hd6vR5FRUXIzc1Fbm4u8vPzodVqMXnyZFZoJ0yYYBZx0mXe\nSqWy17opd36S1metrXmqVCqUlJRAp9NZ5eg0ELq6ulBUVAQXFxdIpVIzpyXurCd1hOpvbbWzsxOF\nhYXw8vJCVFQUL9E7NSugItva2gqlUgkPDw8EBwfDz8+PFVq+uHPnDoqLi/s919qX/SJ3ywzXYtAW\nzU6m6HQ6HDhwAH/729/w7rvvYtq0aairq8PVq1fxyCOP2Oz5+xLVdevWYfbs2Vi1ahUAIDY2Fjk5\nOTaZieYZQVQdBEFU+0FXVxfy8/Mhk8kgk8lw8+ZNeHt7IykpCQkJCcjPz8fYsWOxbNmyAdVNud2m\ntI4oEomMxk+ampr63XHb33OoqKhAc3MzYmJi4O/vb/E4g8Fg1LDT0dFh5nHb002BTqdDWVkZFAqF\nkUUin5imkwEYLRMwNYAYyHJyarBPu5P5iBxNrQLb2trYrmOJRIKAgABeMwWWuHXrFlJTUzFr1iz8\n8Y9/tFlUagm6gJ1hGKxbtw7PPPOM0eOLFi3Ciy++yDZIzZ07F7t378bUqVOH7BwHiCCqDoLdmj/Y\nArFYjPvvvx/3338/gLtvgM3NzThw4AC2bt2K8PBw5OTk4OzZs0hOTkZSUhKSkpLYsZ6+cHZ2hp+f\nn9FWHY1GA4VCgfr6ehQUFMDZ2Rm+vr5sZMtXfZYQgtu3b6OsrAwSicTMmMAUJycntuOZwo1my8rK\n2EYobs1ToVCgvLwcYWFhiI6O5j3i4e6bDQ8PR2xsLPscXl5eRgYQ9KagpqamX3Op3Ofoy2C/v1D/\nYg8PDxBC2NVoXl5eaG9vx+3btyGXy6HX68125g42+tbpdPjzn/+Mb775BgcPHkRycjIv19QfLly4\nAIlEgqamJsybNw9xcXFG86+WggDBV1hgOCGI6iBgGAZBQUHw8PDA1atXIZFI2JnB3NxcnD59Grt2\n7YJSqcSECRMwdepUTJ06FZMnT7a6SUaj0aC6uhpubm64//774erqCpVKxTZBlZWVsf623Ppsf6Iu\nulvTzc0NiYmJAx79EIlEZo5AtLmoubkZt27dAiEEPj4+0Gg0aGlp4XXlGE1Zu7q6Iikpqdefa+mm\ngJspqKioMNqXSz8YhmFfq6lTp/Jq/0fhWgxyn8PT05NNc3LLBw0NDSgpKenTfrE3bt68idTUVMyZ\nMwf//Oc/bdLEZQ3U2nDUqFFYsmQJZDKZkaiGhoaiurqa/bympmZI7BAFBKxFSP8OARqNBj/99BNb\nn/3Xv/4FV1dXTJkyhRVaqVRqJITWjMhQuLtSueb83AYYSyYFOp0O5eXlaG1tNds7yxfcdDI1pjdd\njcc11RhI1MX10u0tZT0Q6LiMQqFAY2Mjurq64OnpicDAwEGP9pgyWIvB3ow1uEJr+ne2b98+fPfd\ndzh48KBN0qjV1dVYs2YNGhoa4OTkhGeeeQZpaWlGx+Tk5CAlJQXh4eFwdnbGokWLcPbsWWzfvh0P\nP/wwe9x3332HAwcOsI1KmzZtgkwm4/2cbYAQTjsIgqjeA2gn8JUrV5CbmwuZTAa5XI7g4GAkJiay\n0VJ6evqAzfstzaS6urqyTlAajQY1NTUICwtDSEiITVJodOF2Xw08lkw1aNTFrSdb+v7W1lYUFxdj\n1KhRvBhRWIIaLNAVdqZNW5bGkPobfSuVSty6dQs+Pj6IiorirZFKr9cbCS294friiy/g7e2NkydP\nIiUlBS+//LLNotP6+nrU19ezf9tJSUn4+uuvMWHCBPaYnJwcvPrqq2hpaQFw9+939erV2LZtm9Go\nDCEEGzduxMmTJyEWi3HkyJGRUE8FBFF1GARRHSYQQnDixAk8//zzCAgIgJubG9ssRKPZhIQEq7eU\nWEKtVqOpqQkVFRUghEAkEhkZ3vPVAMOHSQS35kmjb9oI5evrCw8PD9TU1Nh0vRzXdak3g4X+dPFa\nuk4aZcfFxfG+Ys4SKpUKL7/8Mttl29DQgMDAQJw6dWpI6pOLFy/Gxo0bMW/ePPZrw3CrDN8Iouog\nCKI6jDh9+jTCwsLYblWdTodbt26xs7P5+fkghCA+Pp4VWmuN03U6HeRyuVE62XT8pL29HXq9fsCj\nMlw/YFvMg+p0OigUCtTW1qK5uRkuLi6scNGbArqsfLDQKDskJGRArkvcxfTc15Z7E0MIQUlJiUWL\nQVvxr3/9C5s2bcKCBQuwdetWNqKms8i2pqKiAr/61a9w48YNo67vYWiAzzeCqDoIgqiOIGia9OrV\nq+xYT1FREfz9/dnZ2eTkZKOUMXdRtTW7YGldjjt+wm3WoVGi6c+gs5p8+QFbQqlUorCwEJ6enuxc\nK+2OphGtWq1mF2hToe1PM5FGo0FRUREMBgNiY2N5HSehte+2tjbU1taiq6uL3es7mHlfa9BoNNiz\nZw9Onz6NjIwMJCQk8P4cfdHZ2YlZs2Zh27ZtWLp0qdFjw9AAn28EUXUQBFEd4dAVcrQJ6sqVK6iv\nr0dERATCwsJw4cIF7NixAw888MCAu2xpDZGKV1dXF2tjJxaL0dTUBODuIL4tXH64bkW02aknaCqW\nG31T9yruXlfTmiXX2SkqKordE8s3phaDhBCL8758LD6gXL9+HWlpaeyMpy2M/ftCq9Vi0aJFmD9/\nPrZs2dLn8cPAAJ9vBFF1EARRtUM6OzuxYcMGXLlyBdOnT0dxcTFUKhUmTZrEbuuZOHHioN5cu7u7\nUVZWhubmZvbn8LWQnAvdiCORSBAaGjqgKI5G+Nzom24XoiM9VVVV8PLyglQqtYmxQn8sBmmTGb2R\n6erqYrMFVGitWeOmVqvx1ltv4dy5czh06BAmT57M92VZBSEEa9euRUBAAPbt22fxmGFogM83dnMh\nAr0jiKodotPp8M0332DJkiXsm5Jarca1a9fY+uyNGzcgFouRmJjI1metretRz2HaDevs7Gxxpysh\nhJ2fpWvxrBVFtVqN4uJim6RhgbvRb3t7OyoqKqBQKODi4mK2BWcwTWFc+LAYtLQJh3Zzc5cJ0J99\n7do1pKWl4de//jWef/55m8zTUk6ePIm0tDTo9Xo89dRTePHFF40eP3v2LObOnQtXV1eIRCKEh4dj\nz549qKqqAjBsDfD5RhBVB8FuRPWrr75Ceno6bt26BZlMZtRmv3PnTnz44YdwdnbGO++8g/nz55t9\nf3l5OVauXIk7d+4gMTERR48evSdpsqGCEILW1lZcuXKFFdqKigqEhoayIpuUlISAgAAjYZbL5VCp\nVIiNje3Tc9hSBy834vL19TWb8aSzmjU1NZBKpbjvvvtscv0KhQKFhYVGoziW0tymwtUfcaf1WUII\nYmNjeR9ZMV0mUFZWhkOHDsHT0xM1NTXIyMgwMk6wBXq9HjExMfj73/+O0NBQJCcn4/PPPzcalzl4\n8CB++uknZGRkIDMzE8ePH8cXX3xh0/Mahgii6iDYjajeunULTk5OWLduHfbs2cOK6s2bN7Fq1SrI\nZDLU1dXhoYceQnFxsVlN7bHHHsPSpUuxcuVKrF+/HvHx8diwYcO9uJR7Bu3e5dZnOzo6EBsbCxcX\nF1RWVuKDDz4Y1LoxbsSlUCjQ3d3Nzni6uLigvr4eAQEBiIyM5NX0nqLT6VBaWgqlUom4uLg+bwxM\nhYs2QnGF1jQK5DaH2bI+a0peXh5efPFFSKVSjBo1Cvn5+UhOTsauXbts9pyXLl1Ceno6Tp06BeDu\nDSwAvPTSS+wx8+fPR3p6OmbOnMkunr99+7Y9pXatwaEu1pGxG5vC8ePHW/x6VlYWVq5cCTc3N0RE\nREAqlUImk2HmzJnsMYQQnD17Fp999hkAYO3atUhPT3c4UXVyckJERAQiIiKwcuVKAHdHMJ544gn4\n+/sjKioKjz/+OJydndkl78nJyYiOjrZaAF1cXBAYGMiO29B6Z2lpKdrb29n53O7ubjaaHchaPEs0\nNTVBLpebeQL3hpubG+677z42YuYa3nNtIqkjlLu7O2pqauDu7m4zG0NTVCoVdu7ciUuXLuH9998f\n0lGU2tpahIWFsZ+HhoaarWLjHkMXRLS0tNhTE5KAAIvdiGpP1NbWYsaMGeznoaGhqK2tNTqmpaUF\nfn5+bIOKpWMcFU9PTxw5coRtcqHdqlevXsXly5fx2muvoaSkBPfdd5/RWI+1JvPUID4sLAzx8fFg\nGMbIYam+vh7FxcVsYxHXYcnaSIe7nLwvT+C+oIb3dL8s8O9RmYqKCpSVlcHV1ZXdYENrtjwoAAAS\nAElEQVRT3f2pJ/eHvLw8/O///i9WrFiBnJwcm26vsYQ1BveCCb6AIzGiRPWhhx5CQ0OD2ddff/11\nLF682OL3DOY//YoVK1BUVATgbnOOn58frl27ZnbsuHHj2GhKJBIhLy/PqusZCURGRhp9Tj2FH3zw\nQTz44IMA7r5+dXV17JL3Q4cO4fbt24iOjmY39SQmJhqNhnR3d6OoqAgikchM6BiGgZeXF7y8vFiz\ndGp2T5uLlEolRCKRUUdsb/XZ6Ohom0VG9Fp8fHzwwAMPwNnZ2eh8KysrjerJvc37WotKpcIbb7yB\n3NxcfPLJJz1mamyNNQb39JjQ0FDWwKO/vsYCAiOFESWqp0+f7vf3WPOfPigoCG1tbdDpdBCJROwx\n3GaKZ599ttf5yHPnzjlsOothGISEhGDJkiVYsmQJgLsiWFhYiNzcXHz99dfYvn079Ho9Jk2aBJVK\nhe7ubrzzzjtW1xstrcXjmt3X1dWxHrzUe7eurg5+fn6YNm2aTeqzvVkM9na+7e3taGpqMpr3pUJr\nTTOTTCbDs88+i1WrVuHcuXNDHp1ySU5ORklJCcrLyxESEoLMzEy2jEJJSUnBxx9/jJkzZ+LYsWOY\nM2eOEKkK2C1206hEmT17tlGjUkFBAVavXs02Ks2dOxclJSVmb7KPPvooli1bxjYqTZ48Gb/73e8A\n3I14xo4di7NnzyI6OtrsOe1wUN0mXLx4EU8//TTGjh0LHx8fFBYWwsfHxyhtHBISMuA0KU0by+Vy\ntLW1sQLF3YDDV32WmuwP1mJQrVYbjSGp1eoePYO7u7vx2muv4ccff8ShQ4cQFxc36Ouwhj/84Q84\nceIEXF1dERUVhSNHjhjdLGRnZ2Pz5s0oLy9HQEAAgoOD0dTUhIyMDKSkpEClUuG///u/kZ+fj4CA\nAGRmZpplQBwA4S7CQbAbUT1+/DhSU1Nx+/Zt+Pn5ISEhge1IfP311/HRRx9BJBJh3759WLBgAQBg\n4cKF+OCDDyCRSFBWVsaO1EyZMgWffPIJ+6b8j3/8A1u2bOkxrRsREQF/f38wDIN169bhmWeeGZqL\nHmHk5+dDLBaz3sZ0ybtMJmO39dTU1CA8PNxorMfX19eqyIa6FXG34nD3jtINOHQZ+UAci/R6PcrK\nytDW1taryf5AseTHnJGRgYaGBpSXlyMlJQVvvPEG78/bG99//z3mzJkDkUiEF154AQCwe/dus+MG\ne3NJCLHnCNZuL0zAGLsR1YFiTZ12w4YNkEqlePbZZy3+jLq6OkgkEjQ1NWHevHnYv3+/2Xxgeno6\n3n//fbaL9I033sDChQvNflZfg/T2jsFggFwuZ0U2Ly8PXV1dRkvef/GLXxilSWlTkFqtRlxcXJ9W\nidxl5NSxiHalctOwpm/wphaDQyEAXV1dePXVV1FQUIAHH3wQ1dXVyM/Px9GjR9mbk6Hk+PHjOHbs\nGD799FOzx/jK2KhUKri4uNgkZX8PEUTVQXB4Ue0LnU6HkJAQXL16FaGhoX0en56eDi8vLzz33HNW\nfZ2LNYP0johGo8H169fZ+dkbN27Azc0NCQkJcHZ2hlwux4EDBwbsVkSfgzuPqlKp2HlUT09P3L59\nG2q1uk+LQT65ePEi/vCHP2Dt2rVITU0dFiLzyCOPYMWKFfjNb35j9thAMjbV1dV477338Morr8DF\nxQWHDx/G9evXERISgq1bt9riEu4Vgqg6CCOqUelecPr0acTFxfUoqEqlkl2orVQq8f3332P79u0D\nei6ZTAapVMrWm1auXImsrCyHF1VXV1ckJycjOTkZGzduBCEEN27cwNNPPw29Xo/g4GD8+te/hkQi\nYWdnp06diqCgIKtF1tXVFUFBQWyURY35q6urcfPmTTZyksvlRvVZW23jefXVV3Hjxg18+eWXFuv4\nfGNNxub111+HSCTC448/bvFnXLhwwShjExcX16ejU25uLhobG+Hi4oKsrCw0NDRg586dOHjwIO7c\nucOKtIDASEEQ1T7IzMzEqlWrjL5WV1eHp556CtnZ2WhsbGQ7XnU6HVavXo2HH37Y4s86cOAA/vrX\nv2Lq1KnYu3cv/P39jR63ZpBe4N8jUbt27cLs2bMB3BXBqqoq5Obm4tKlS3jnnXfQ2tpqtuTd2jEW\nrVaL0tJSEEIwc+ZMuLm5sfVZhUKBmpoadHZ2siNGNG08GL9gQgguXLiAF154AU8++ST27ds3ZNFp\nX531H3/8Mb799lucOXOmx+ujXfWjRo3CkiVLIJPJzESVEILKykq8+eabmDNnDpycnNibxhkzZrAC\n3tnZiYCAAGg0Gru2CxWwP4T0L4/0drc/Y8YMNnJ6+eWXUV9fj48++sjouK+++gqnTp3CBx98AAA4\nevQoZDIZ9u/fzx7TVycmxZ5nZ61Fp9OhoKCAtVzMz88HwzBmS965wtVfi0G6UYamjZVKpZFfsLVj\nMkqlEunp6SgsLMThw4cRFRU16Ovni5MnT2LLli04f/58j17MphmbefPmYfv27T3eYGZkZODy5cu4\ncOECli1bZmSlKJfL8cknnyAoKAgSiYS9aR3hCOG2gyCI6j2goqICixYtwo0bN4y+bo2P6lB1Ytoj\ndOQmLy8PMpkMV65cQVFREQICApCUlISIiAhkZWXh//7v/5CQkDBgi0FLfsF0TIaKLZ0tJYTghx9+\nwIsvvoinn34aGzZssElK2RLWNs9JJBLcvn0bTk5OCAwMREpKCjIyMowyNmVlZWYZm23btpn9LG6H\nb3t7O6ZPnw6dTofNmzcjKSkJM2bMwPnz55GamorNmzfjySeftOErMKQIouogCKI6RNTX1yM4OBgA\n8PbbbyM3NxeZmZlGx+h0OsTExODMmTMICQlBcnIyPvvssx69XIeiE9PeocvJd+zYgePHjyM+Ph51\ndXWIjIxkd89OmTIF3t7eg0rrmo7J5Obm4vz589BqtWhra8Mnn3yCmJgYnq+ud+5l8xw1Wtm8eTMe\ne+wxfPfdd7h48SKysrJQUlICLy8vo9ErO6irjvgLELAOoaY6RDz//PO4du0aGIbBuHHjcOjQIQDG\n9VmRSIQDBw5g/vz50Ov1ePLJJ3s1R//oo4+wYsUKi48xDIP//M//FGZn+4DWRMeMGYOysjKIxWIY\nDAYUFxfj8uXLOHHiBF555RVoNBqzJe/WRrJcv+Dg4GAQQtDW1objx48jMjISEokEq1evxhNPPIGN\nGzfa+Ir7h62a52iknpubix07duA//uM/oFar4ebmhqSkJAD/tg+1A0EVcCCESHUYYm0nZl5eHv72\nt79ZfNPpbXa2r1lYtVqNNWvW4OrVqwgMDMQXX3yBcePG8X+hIwiVSmW05L2goACenp5GS97pXtbe\n6OjowMsvv4yKigocPnzY6HUd6ogsPT0df/nLX+Dj49Nj89yxY8dw8uRJozp/bm4uDhw4MOjnz8nJ\nwd69e5GVlcW+bgaDYcjS30OMcGfgIAiiOgL5+OOPkZGRgTNnzkAsFvd5PDfNJyyV5gdCCO7cuWO0\n5L2yshJhYWFGblB0JIQQgpycHGzduhW///3v8dRTTw2JeAxF89xg6Orqsupv2A4QRNVBENK/I4yT\nJ09i9+7dOH/+fI9vRr3NzlqTzsvKykJ6ejoAYPny5exsqJCG+zcMwyAwMBAPP/ww2+FqMBhQUVGB\ny5cv49y5c3jrrbfQ0dGBmJgYNDU1wcPDAydOnMDYsWOH7DytXULx9NNPY9GiRWZft2YhxWAQi8XQ\n6/XDwthCQIAPBFEdYWzcuBFqtRrz5s0DcHe2z7QTs7fZWWGptO1wcnJCZGQkIiMjsXr1agB3511/\n+uknnDhxAtu3bx9WqU1u89zx48cxadIks2Os2UIzWARBFbAnBFEdYZSWllr8ukQiQXZ2NoC7O1Cv\nX79u8Tg+l0pXV1djzZo1aGhogJOTE5555hmkpaUZHZOTk4PFixcjIiICALB06dIBO06NRFxcXNid\nskNBf3YAt7W1Qa1Wg2EYPPTQQ7w0zwkIODqCqDoYfC6VFolE2Lt3LxITE9HR0YGkpCTMmzfPrDP0\ngQcewLfffmubCxIwoj87gEtLSy1mH7g3aMDdbU6W5lcFBATMGT65KIEhgZvO02g0yMzMREpKitEx\ndKk0gF6XSgcHByMxMREA4O3tjfHjx6O2ttb2FyHQJ4QQfPnll2YWmwICArZFEFUHg5vOGz9+PB57\n7DFMnDgR27dvxzfffAMA+O1vf4uWlhZIpVL86U9/MrKQ64mKigrk5+dj+vTpZo9dunQJ8fHxWLBg\nAQoKCni/JgFzfvjhB4wePbpHM346x5yUlITDhw8P8dkJCNgvwkiNnXAvu3M7Ozsxa9YsbNu2DUuX\nLjV6rL29HU5OTvDy8kJ2djbS0tJQUlJi8ef05VdMCEFaWhqys7MhFovxl7/8hY2UHYmh2gEswCtC\n67yDIIiqHUAF9fr16xg/fvyQbvXQarVYtGgR5s+fjy1btvR5fG/2iX1ZK2ZnZ2P//v3Izs5Gbm4u\n0tLShC0+FuBrB7AArwii6iAI6V87gEaor7zyCr788ksAwNmzZ5GVlQWdTmez5yWE4Le//S3Gjx/f\no6A2NDSw3cQymQwGgwGBgYEDer6srCysWbMGDMNgxowZaGtrQ319/YDP316xZgdwR0cH++/vv//e\n4jiNgIBA/xFE1Y546aWXcOTIEWRnZ2PHjh1oa2tjPVYNBgPvz3fhwgUcPXoUZ8+eRUJCAhISEpCd\nnY2MjAxkZGQAuNvoNGnSJMTHx2PTpk3IzMzsMU3dV53P0oytPTdGffXVV5g4cSKcnJzMUuE7d+6E\nVCpFbGwsu9WIQncAl5eXY/r06YiOjkZKSgo7q9zY2Ihf/vKXiI+Px7Rp0/Bf//VfPa5oExAQ6CeE\nkP58CAxD9Ho9IYSQixcvkuDgYPK73/2OXL9+nRBCSFtb2708tX5RW1tLCCGksbGRTJ48mZw/f97o\n8YULF5IffviB/XzOnDkkLy/P7OcUFhaS+Ph49sPb25u8/fbbRsecO3eO+Pj4sMe88sorNriiwXHz\n5k1SWFhIZs2aRa5cucJ+vaCggEyePJmoVCpSVlZGIiMjiU6nM/v+Rx99lHz++eeEEELWrVtHDh48\nOGTnLmBGf99rhY8R+iFEqiMcQgicnJxw+vRpfPbZZ1AqlZg9ezYmT54MpVKJf/zjH5g3bx6+/vrr\ne32qfULnZUeNGoUlS5ZAJpMZPW6tZV5sbCyuXbuGa9eu4erVqxCLxRYXXT/wwAPsccPRkGL8+PHs\n+jMuWVlZWLlyJdzc3BAREQGpVGr2WhFCcPbsWSxfvhwAsHbt2hHxNyAgMNIRRHWEwzAMtm/fjt27\nd+Opp57CypUroVKpAADu7u545JFHkJyczFrBETI8e82sqfOlpKTgr3/9KwghuHz5Mnx9fVmbvZ44\nc+YMoqKiEB4ebrNzH2qsSYO3tLTAz8+PTf/be6pcQGC4IDgqjXAMBgOkUinWr18PiUSCJ554As89\n9xyWLVvGGu7X1tayAjVcTfF78iumtdn169dj4cKFyM7OhlQqhVgsxpEjR/r8ubS+aAk6PyuRSLBn\nz557Yr9nzXiMKZZujAZqNSkgIMAv/R2pERjmMHffOacQQn5kGMYNgD+AvYSQx+/xqQ05DMO4AqgD\nMJEQ0mjymA8AAyGkk2GYhQD+TAix7JRwj2EYJgfAc4SQvJ8/fwkACCE7f/78FIB0QsglzvcwAG4D\nGEMI0TEMM/PnY+YP9fkLCDgSQvrXDmAYhv09krv8+POnUQDeB5DIMIwjTvYvAPCjqaACACGknRDS\n+fO/swG4MAwzUtbwfANgJcMwbgzDRACIBmBUVCV375bPAVj+85fWAsga0rMUEHBABFG1AwghFudl\nCCE3CSGPAJgFoHhoz2pYsArA55YeYBhmzM/RHBiGmYa7/xdahvDc+oRhmCUMw9QAmAngu58jUhBC\nCgB8CeAmgJMAfk8I0f/8PdkMw9DurRcAbGEYphRAIIAPh/oaBAQcDSH9a8cwDMMQB/0FMwwjBlAN\nIJIQovj5a+sBgBCSwTDMRgAbAOgAdAPYQgi5eK/OV0BAwD4QRFVAQEBAQIAnhPSvgICAgIAATwii\nKiAgICAgwBOCqAoICAgICPCEIKoCAgICAgI8IYiqgICAgIAATwiiKiAgICAgwBP/DyWRhiKobJs9\nAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "ax = fig.add_subplot(111, projection='3d')\n", "\n", "func_pivot_df = func_df.pivot(index='x1', columns='x2', values='y')\n", "x1_pivot = func_pivot_df.index.values\n", "x2_pivot = func_pivot_df.columns.values\n", "y_pivot = func_pivot_df.values\n", "\n", "ax.plot_wireframe(x1_pivot, x2_pivot, y_pivot)\n", "ax.scatter(x_optimal_analytical[0], x_optimal_analytical[1], f_optimal_analytical,\n", " s=100, c='r', label='Analitic')\n", "for key, value in numerical_results.items():\n", " ax.scatter(value['x'][0], value['x'][1], value['y'],\n", " s=100, label='{}'.format(key))\n", "\n", "ax.set_xlabel('$x_1$')\n", "ax.set_ylabel('$x_2$')\n", "ax.set_zlabel('$f(x)$', rotation=90)\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:py3.6]", "language": "python", "name": "conda-env-py3.6-py" }, "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.6.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }