{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib widget" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "import matplotlib as mpl\n", "mpl.rc('text', usetex = True)\n", "mpl.rc('font', family = 'serif')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pysketcher import *" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from ipywidgets import FloatSlider, AppLayout, Label, HBox, Button, Output" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML, SVG, display, clear_output" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from math import tan, radians, sin, cos" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "myfig={}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "gw = \"\"\"\\\n", "libraries: [\"from math import tan, radians, sin, cos\",\"from pysketcher import *\"]\n", "fontsize: 18\n", "g: 9.81 # constant gravity\n", "theta: 30.0 # inclined plane angle\n", "L: 10.0 # sketch sizing parameter\n", "a: 1.0 #\n", "xmin: 0.0 # sketech min Abscissa\n", "ymin: -3.0 # sketech min Ordinate \n", "rl: 2.0 # rectangle width\n", "rL: 1.0 # rectangle length\n", "setframe: # sketch setup\n", " action: \"drawing_tool.set_coordinate_system(xmin=xmin, xmax=xmin+1.5*L,ymin=ymin, ymax=ymin+1.5*L,instruction_file='tmp_mpl_friction.py')\"\n", "setblackline: # default frame values and actions\n", " action: \"drawing_tool.set_linecolor('black')\"\n", "B: point(a+L,0) # wall right end\n", "A: point(a,tan(radians(theta))*L) # wall left end\n", "normal_vec: point(sin(radians(theta)),cos(radians(theta))) # Vector normal to wall\n", "tangent_vec: point(cos(radians(theta)),-sin(radians(theta))) # Vector tangent to wall\n", "help_line: Line(A,B) # wall line\n", "x: a + 3*L/10.\n", "y: help_line(x=x) \n", "contact: point(x, y) \n", "c: contact + rL/2*normal_vec\n", "rectangle: \n", " formula: Rectangle(contact, rl, rL)\n", " style:\n", " linecolor: blue\n", " filled_curves: blue\n", " transform: [\"rotate(-theta, contact)\",\"translate(-rl/2*tangent_vec)\"]\n", "N: \n", " formula: Force(contact - rl*normal_vec, contact, r'$N$', text_pos='start')\n", " style:\n", " linecolor: black\n", "mg: \n", " formula: Gravity(c, rl, text='$Mg$')\n", " style:\n", " linecolor: black\n", "wheel: \n", " formula: \"Composition({'outer': rectangle})\" \n", " style:\n", " shadow: 1\n", "body: \n", " formula: \"Composition({'wheel': wheel, 'N': N, 'mg': mg})\"\n", " style:\n", " linecolor: black\n", "mB:\n", " formula: Text(r'$B$',B)\n", "mA:\n", " formula: Text(r'$A$', A)\n", "wall: \n", " formula: Wall(x=[A[0], B[0]], y=[A[1], B[1]], thickness=-0.25,transparent=False)\n", " style:\n", " linecolor: black \n", "angle: \n", " formula: \"Arc_wText(r'$theta$', center=B, radius=3, start_angle=180-theta, arc_angle=theta, fontsize=fontsize)\"\n", " style:\n", " linecolor: black\n", " linewidth: 1\n", "ground: \n", " formula: Line((B[0]-L/10., 0), (B[0]-L/2.,0))\n", " stlye:\n", " linecolor: black\n", " linestyle: dashed\n", " linewidth: 1\n", "x_const: \n", " formula: Line(contact, contact + point(0,4))\n", " style:\n", " linestyle: dotted\n", " transform: rotate(-theta, contact)\n", "x_axis: \n", " formula: \"Axis(start=contact+ 2*rl*normal_vec, length=2*rl,label='$x$', rotation_angle=-theta)\"\n", "plan: \n", " formula: \"Composition({'body': body, 'angle': angle, 'inclined wall': wall, 'x start': x_const, 'x axis': x_axis, 'mA': mA, 'mB': mB})\"\n", "friction: \n", " formula: \"Composition({'plan': plan, 'ground': ground})\"\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "sketchParse(gw,myfig)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "d = myfig['friction'].draw()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "drawing_tool.display()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "angle = myfig['theta']\n", "def doright(change):\n", " global angle\n", " rotate(-5)\n", " angle += 5\n", "def doleft(change):\n", " global angle\n", " rotate(5)\n", " angle -= 5\n", "def rotate(theta):\n", " global angle\n", " drawing_tool.erase()\n", " myfig['plan']['angle'].changeAngles(180-angle,angle)\n", " myfig['plan'].rotate(theta,myfig['B'])\n", " myfig['friction'].draw()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "left = Button(\n", " description = '',\n", " icon = 'rotate-left',\n", ")\n", "left.on_click(doleft)\n", "right = Button(\n", " description = '',\n", " icon = 'rotate-right',\n", ")\n", "right.on_click(doright)\n", "output = Output()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "applayout = AppLayout(\n", " center=output,\n", " footer=HBox([left,right]),\n", " pane_heights=[0, 6, 1]\n", ")\n", "#drawing_tool.mpl.ion()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "AppLayout(children=(HBox(children=(Button(icon='rotate-left', style=ButtonStyle()), Button(icon='rotate-right'…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "10e8ac1676764fbd99ca07853360958b" } }, "metadata": {} } ], "source": [ "applayout" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "with output:\n", " clear_output()\n", " display(drawing_tool.mpl.gcf().canvas)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "drawing_tool.mpl.ion()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import time" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "for i in range(0,5):\n", " doright(None)\n", " with output:\n", " clear_output(wait=True)\n", " display(drawing_tool.mpl.gcf().canvas)\n", " time.sleep(1)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "", "image/svg+xml": "\n \n \n \n \n 2020-08-02T12:53:25.911892\n image/svg+xml\n \n \n Matplotlib v3.3.0, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n" }, "metadata": {} } ], "source": [ "for i in range(0,10):\n", " doright(None)\n", " clear_output(wait=True)\n", " display(SVG(sketch2SVG()))\n", " time.sleep(0.01)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "" }, "metadata": {}, "execution_count": 21 } ], "source": [ "drawing_tool.mpl" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": "graphviz [('Composition:\\\\nfriction', 'Composition:\\\\nplan'), ('Composition:\\\\nplan', 'Composition:\\\\nbody'), ('Composition:\\\\nbody', 'Composition:\\\\nwheel'), ('Composition:\\\\nwheel', 'Rectangle:\\\\nouter'), ('Rectangle:\\\\nouter', 'Curve:\\\\nrectangle'), ('Composition:\\\\nbody', 'Force:\\\\nN'), ('Force:\\\\nN', 'Line:\\\\narrow'), ('Line:\\\\narrow', 'Curve:\\\\nline'), ('Force:\\\\nN', 'Text:\\\\ntext'), ('Composition:\\\\nbody', 'Gravity:\\\\nmg'), ('Gravity:\\\\nmg', 'Line:\\\\narrow'), ('Line:\\\\narrow', 'Curve:\\\\nline'), ('Gravity:\\\\nmg', 'Text:\\\\ntext'), ('Composition:\\\\nplan', 'Arc_wText:\\\\nangle'), ('Arc_wText:\\\\nangle', 'Arc:\\\\narc'), ('Arc:\\\\narc', 'Curve:\\\\narc'), ('Arc_wText:\\\\nangle', 'Text:\\\\ntext'), ('Composition:\\\\nplan', 'Wall:\\\\ninclined wall'), ('Wall:\\\\ninclined wall', 'Curve:\\\\nwall'), ('Composition:\\\\nplan', 'Line:\\\\nx start'), ('Line:\\\\nx start', 'Curve:\\\\nline'), ('Composition:\\\\nplan', 'Axis:\\\\nx axis'), ('Axis:\\\\nx axis', 'Arrow3:\\\\narrow'), ('Arrow3:\\\\narrow', 'Line:\\\\nline'), ('Line:\\\\nline', 'Curve:\\\\nline'), ('Arrow3:\\\\narrow', 'Line:\\\\nhead left'), ('Line:\\\\nhead left', 'Curve:\\\\nline'), ('Arrow3:\\\\narrow', 'Line:\\\\nhead right'), ('Line:\\\\nhead right', 'Curve:\\\\nline'), ('Axis:\\\\nx axis', 'Text:\\\\nlabel'), ('Composition:\\\\nplan', 'Text:\\\\nmA'), ('Composition:\\\\nplan', 'Text:\\\\nmB'), ('Composition:\\\\nfriction', 'Line:\\\\nground'), ('Line:\\\\nground', 'Curve:\\\\nline')] defaultdict(. at 0x000002109D536670>, {'Composition:\\\\nplan': 1, 'Composition:\\\\nfriction': 0, 'Composition:\\\\nbody': 1, 'Composition:\\\\nwheel': 1, 'Rectangle:\\\\nouter': 1, 'Curve:\\\\nrectangle': 1, 'Force:\\\\nN': 1, 'Line:\\\\narrow': 2, 'Curve:\\\\nline': 7, 'Text:\\\\ntext': 3, 'Gravity:\\\\nmg': 1, 'Arc_wText:\\\\nangle': 1, 'Arc:\\\\narc': 1, 'Curve:\\\\narc': 1, 'Wall:\\\\ninclined wall': 1, 'Curve:\\\\nwall': 1, 'Line:\\\\nx start': 1, 'Axis:\\\\nx axis': 1, 'Arrow3:\\\\narrow': 1, 'Line:\\\\nline': 1, 'Line:\\\\nhead left': 1, 'Line:\\\\nhead right': 1, 'Text:\\\\nlabel': 1, 'Text:\\\\nmA': 1, 'Text:\\\\nmB': 1, 'Line:\\\\nground': 1})\n[('Composition:\\\\nfriction', 'Composition:\\\\nplan'), ('Composition:\\\\nplan', 'Composition:\\\\nbody'), ('Composition:\\\\nbody', 'Composition:\\\\nwheel'), ('Composition:\\\\nwheel', 'Rectangle:\\\\nouter'), ('Rectangle:\\\\nouter', 'Curve:\\\\nrectangle'), ('Composition:\\\\nbody', 'Force:\\\\nN'), ('Force:\\\\nN', 'Line:\\\\narrow (1)'), ('Line:\\\\narrow (1)', 'Curve:\\\\nline (1)'), ('Force:\\\\nN', 'Text:\\\\ntext (1)'), ('Composition:\\\\nbody', 'Gravity:\\\\nmg'), ('Gravity:\\\\nmg', 'Line:\\\\narrow (2)'), ('Line:\\\\narrow (2)', 'Curve:\\\\nline (2)'), ('Gravity:\\\\nmg', 'Text:\\\\ntext (2)'), ('Composition:\\\\nplan', 'Arc_wText:\\\\nangle'), ('Arc_wText:\\\\nangle', 'Arc:\\\\narc'), ('Arc:\\\\narc', 'Curve:\\\\narc'), ('Arc_wText:\\\\nangle', 'Text:\\\\ntext (3)'), ('Composition:\\\\nplan', 'Wall:\\\\ninclined wall'), ('Wall:\\\\ninclined wall', 'Curve:\\\\nwall'), ('Composition:\\\\nplan', 'Line:\\\\nx start'), ('Line:\\\\nx start', 'Curve:\\\\nline (3)'), ('Composition:\\\\nplan', 'Axis:\\\\nx axis'), ('Axis:\\\\nx axis', 'Arrow3:\\\\narrow'), ('Arrow3:\\\\narrow', 'Line:\\\\nline'), ('Line:\\\\nline', 'Curve:\\\\nline (4)'), ('Arrow3:\\\\narrow', 'Line:\\\\nhead left'), ('Line:\\\\nhead left', 'Curve:\\\\nline (5)'), ('Arrow3:\\\\narrow', 'Line:\\\\nhead right'), ('Line:\\\\nhead right', 'Curve:\\\\nline (6)'), ('Axis:\\\\nx axis', 'Text:\\\\nlabel'), ('Composition:\\\\nplan', 'Text:\\\\nmA'), ('Composition:\\\\nplan', 'Text:\\\\nmB'), ('Composition:\\\\nfriction', 'Line:\\\\nground'), ('Line:\\\\nground', 'Curve:\\\\nline (7)')]\nRun dot -Tpng -o friction.png friction.dot\n" } ], "source": [ "myfig['friction'].graphviz_dot('friction')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "!dot -Tpng -o friction.png friction.dot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](friction.png)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "drawing_tool.mpl.gcf().canvas.print_png(\"friction.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](friction.png)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "", "image/svg+xml": "\n \n \n \n \n 2020-08-02T12:55:10.925242\n image/svg+xml\n \n \n Matplotlib v3.3.0, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n" }, "metadata": {} } ], "source": [ "display(SVG(sketch2SVG()))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "gcf = drawing_tool.mpl.gcf()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "056703aaeb724c25a49f77e934b31ebd" } }, "metadata": {} } ], "source": [ "gcf.canvas" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "from io import BytesIO\n", "from PIL import Image\n", "def sketch2PNG():\n", " f = BytesIO()\n", " drawing_tool.mpl.gcf().canvas.print_png(f)\n", " img = Image.open(f)\n", " return img" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "tags": [] }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAABQBElEQVR4nO3deViU9f7/8eewiaKCoGmmrCruJu5LiymZ7Yt4suWolVtpLqnkt+V3lq4ScN9KMztl5VFpsV3lnFO5b7jvMsKo5YaMooICM78/iAmUygW4B+7X47q8Dvc9M/f9Jjv04n1/FovT6XQiIiIiIqbhYXQBIiIiIlK2FABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUERERMRkFABFRERETEYBUETclt1uJzo62ugyREQqHAVAEXFbAwcOZNOmTUaXISJS4SgAiohbSkpKIjk5GbvdbnQpIiIVjgKgiLilFStWEBsbC6AQKCJSwhQARcTtzJ07l8GDBxMYGAiA1Wo1uCIRkYpFAVBE3IrdbiclJYXw8HDCw8MBOH36tMFViYhULAqAIuJW3nrrLcaPHw9AQEAAoA6giEhJUwAUEbdhtVqJiIhwBb+CDqDGAIqIlCwFQBFxG3FxcQwaNOiK8ykpKQZUIyJScXkZXYCICEBiYiKAa+ZvgYCAAD0CFhEpYQqAIuIWNm7cyJw5c644n5SUpEkgIiIlTI+ARcRw8fHxrokfTqeT9PR012vh4eHqAIqIlDAFQBExVFJSEunp6a6JHx9//DGjRo1yvR4eHq5JICIiJUwBUEQMYbVaiYmJITo6msTERJKTk0lLS+OFF15g4cKFbN++ncGDB7vGBsbExJCUlGRw1SIiFYPF6XQ6jS5CRCQvL4/u3bvz448/AvDiiy8ybdo0g6sSEamY1AEUEbcwefJkV/gDmDdvHqdOnTKwIhGRiksBUEQMt3XrVl555ZUi5y5cuMDMmTMNqkhEpGJTABQRQ2VnZ/PUU0+Rk5MDwFNPPYWnpycAM2bM4Pz580aWJyJSISkAioihxo8fz65duwBo1aoV8+bNo2/fvgCcPn2a9957z8jyREQqJE0CERHDZGVlERQURFZWFgCrV6+mc+fO7Nixg5YtWwIQHBzMwYMH8fb2NrJUEZEKRR1AETFM5cqV6d+/v+v4f//7HwAtWrTgvvvuA8Bms/Hvf//biPJERCosdQBFxFBWq5WGDRvicDioVasWaWlpVK5cmZUrV3L77bcD0KxZM7Zv346Hh35nFREpCfppKiKGCg8PJyYmBoCTJ0/yr3/9C4AffvjB9Z5du3bx7bffGlCdiEjFpA6giBhuy5YtREVFARAWFka/fv3429/+xhNPPMEnn3wCQNeuXVm5cqWRZYqIVBgKgCLiFnr27Mny5ctdx//85z/5v//7P1q0aMHu3bsBWLVqFV26dDGqRBGRCkOPgEXELcTGxrq+rlOnDq+88goeHh6MHTvWdT4uLs6I0kREKhx1AEXELTidTjp06MDGjRsB+P777+nZsyeXLl0iIiKCI0eOALBz506aNWtmZKkiIuWeOoAi4hYsFkuRLmBBt8/Hx4fRo0e7zsfHx5d5bSIiFY06gCLiNvLy8mjatCn79+8HYP369bRv355z584RHBxMRkYGXl5epKSkEBwcbHC1IiLllzqAIuI2PD09ix3zV7VqVYYNGwZAbm4uU6ZMMaQ+EZGKQh1AEXErFy9eJCwsjF9++QWLxcKePXuIjIzk5MmThISEkJWVRZUqVbDZbAQFBRldrohIuaQOoIi4lUqVKjFq1Cggf2JIQkICALVq1eLZZ58F4MKFC8yaNcuwGkVEyjt1AEXE7Zw9e5bg4GDOnDmDj48Phw4dom7duqSmptKgQQPy8vIICgoiLS0NPz8/o8sVESl31AEUEbdTvXp1hg4dCsClS5eYOnUqAKGhofzlL38BID09nfnz5xtVoohIuaYOoIi4pWPHjhEaGsrFixepVq0aNpuNgIAAtm/fTqtWrQAICQnhwIEDeHt7G1ytiEj5og6giLilOnXq0L9/fwAyMzN5++23AWjZsiW9evUCIC0tjUWLFhlVoohIuaUOoIi4rYMHDxIZGYnD4eCmm24iNTWVypUr89NPP3HHHXcA0KJFC7Zt24bFYjG4WhGR8kMdQBFxWw0aNKB3794AnDhxgg8++ACA2267jY4dOwKwY8cOvvvuO8NqFBEpj9QBFBG3lpycTJs2bQAIDw9n3759eHl58cUXX/DII48A+YHwp59+MrJMEZFyRR1AEXFrUVFRREdHA2C1Wvn0008BePDBB2ncuDEAK1euZM2aNYbVKCJS3igAiojbi42NdX0dFxeH0+nEw8ODcePGFTkvIiJXR4+ARcTtOZ1O2rVrx+bNmwFYvnw50dHRXLp0ifDwcI4ePQrArl27aNq0qZGlioiUC+oAiojbs1gsvPzyy67jCRMmAODj48Po0aNd5wu2jRMRkT+mDqCIlAt5eXk0adKEAwcOALBhwwbatWtHZmYmwcHB2O12vLy8sFqt1K9f3+BqRUTcmzqAIlIueHp6MnbsWNdxwZi/atWquWYD5+bmMmXKFEPqExEpT9QBFJFyIzs7m7CwMI4dO4bFYmHv3r3Y7Xa6d+/OhQsXcDgc+Pn5YbPZCAwMNLpcERG3pQ6giJQbvr6+jBw5EsifGDJu3Diio6Np2bIlzzzzDADnz59n1qxZBlYpIuL+1AEUkXLlzJkzBAcHc/bsWQDatm3Lf//7X06dOkXDhg3Jy8ujZs2apKWlUaVKFYOrFRFxT+oAiki54u/vz9ChQ13HXbt2pVq1aoSFhdGnTx8ATp06xfz5840qUa7R6dOniY+PZ+fOnUaXImIa6gCKSLnzyy+/EBoayqVLl6hevTo2mw1/f3+2bt1K69atAQgNDeXAgQN4eXkZXK38nmPHjjF27Fg+/vhjnE4nTz31FAsWLDC6LBFTUAdQRMqdm2++mf79+wNw9uxZ3n77bQBuvfVW7rnnHgBSU1NZvHixUSXKVfjHP/7BRx99REEfYuHChaSlpRlclYg5qAMoIuXSgQMHiIyMxOl0Urt2bVJTU/H19eWHH36gW7duALRs2ZKtW7disVgMrlaKc/DgQSIjI7FYLOTl5QEwfPhwpk+fbnBlIhWfOoAiUi41bNiQxx57DIDjx4/zwQcfAHDHHXfQoUMHALZv3873339vWI2SP1s7KSmJ6OhovvvuuyKvNWjQgA8++ICtW7e6JuzMmzePU6dOGVGqiKkoAIpIuRUbG+v6euLEieTl5WGxWIqcL1gwWoyxYsUKoqOjSUpKKvbv4qmnnqJ58+Y899xzAGRlZTFz5syyLlPEdPQIWETKtR49evCf//wHgMWLFxMTE4PD4aBp06bs27cPgLVr19KxY0cjyzStwn8XERERbNiwodhFutPS0mjQoAG5ubkEBgZis9nw8/MzoGIRc1AHUETKtZdfftn19YQJE3A6nXh4eDBu3DjXeXUBS9+ZM2eIi4vjjTfeKHLew8ODhIQEFi1axL59+353h5aQkBD69u0L5C8LM2/evFKvWcTM1AEUkXLN6XTStm1bkpOTgfxHjj169ODixYuEh4fz888/A7B7926aNGliZKkV1qVLlwgJCeHYsWNUqVIFm81GUFDQNV9n586dtGjRAoD69euTkpKCt7d3SZcrIqgDKCLl3O+N+atUqRKjRo1ynU9ISCj1WpxOJ8uWLWPo0KGY6XdrHx8fevfuDeSP4St4JH+tmjdvzv333w/A4cOHWbhwYYnVKCJFqQMoIuVeXl4ekZGRpKSkALBp0ybatGnD2bNnCQkJwW634+3tjdVqpV69eiV+/9zcXBITE4mLi2Pr1q0ALF++nOjo6BK/l9E2bdrERx99xOTJk/Hw+K2HkJqayptvvsmYMWNo1KjRdV9/1apV3HbbbQA0a9aM7du3F7mPiJQM/b9KRMo9T09Pxo4d6zou6AJWr16d559/HoCcnBymTJlSovfNysri7bffJjIykr59+7rCH+SPR6xoxowZQ7t27Zg2bRpff/11kddCQ0OZO3fuDYU/yN/ar0uXLgDs2rWLb7755oauJyLFUwdQRCqE7OxsQkNDOX78OBaLhX379tGwYUOOHz9OaGgo2dnZVK1aFZvNRo0aNW7oXhkZGcyePZvp06dz4sSJy171BPIXNd6wYQPt2rW7oXu5k6+//poHHngAgAcffJClS5eWyn2++uorHnzwQQC6dOnCqlWrSuU+ImamDqCIVAi+vr6MHDkSyB+LN3HiRABq167NgAEDADh37hyzZ8++7nscPXqUMWPGEBwczKuvvnpZ+Lsb+A/w2/Xj4uLIyckhKyvruu9phOzsbObMmcOhQ4eKnL/33nt56KGHmDNnDosWLSq1+9933300bdoUgNWrVysAipQCdQBFpMKw2+0EBweTmZmJj48Pqamp3HzzzVitVho2bIjD4aBWrVqkpaVRuXLlq77u3r17SUhIYMGCBeTk5BR6xQOIAcYBUb+eywbCgGNYLBZGjhxJYGAgffv2JSIioqS+1VKzZs0aHn30UY4fP87zzz/PrFmzDKnjww8/pF+/fgDcf//9fPXVV4bUIVJRqQMoIhVGQEAAQ4cOBfKXJpk2bRoA4eHh9OnTB4CTJ0/y/vvvX9X11q9fz6OPPkrTpk2ZP39+ofBXCRgC7Af+zW/hD8AXGAnkdyJ//PFH8vLyWL58ebmYGdy4cWPOnTsHwPz587Hb7YbU0bdvX+rXrw/kP3reuXOnIXWIVFQKgCJSoYwcORIfHx8A3n77bc6cOQNQZGHohIQEcnNzi/280+nk+++/584776Rjx458/vnnhYKbPzAeSAPeBn6vozcEqA7Atm3byMzM5MSJExw4cOBGv70StX//flauXFnkXGBgIEOHDiUmJoZVq1YREBBgSG3e3t6MHj3adVwWy/iImIkCoIhUKDfffDN//etfATh79ixz5swBoHXr1tx9991A/pIlS5YsKfK53NxcFi5cSOvWrenVqxc//vhj4asCCYANeBOo/SdV+AP5nci8vDzWrVsH5I9ncwfZ2dn07t2bxo0b89xzz5GXl1fk9fj4eBYvXkybNm0MqjDfc88959o55JNPPsFmsxlaj0hFogAoIhXO2LFjsVgsAEyZMoXs7Gyg6LZxcXFxOJ1OLly4wKxZs2jUqBFPPPEE27ZtK3SlRsA84BAwhoKu3tUZAeR3Ijdv3kx2djY2m43Dhw/fwHdWMnx9fTl9+jROp5P9+/fzxRdfFHm94J+d0apWrcqwYcOA/IA+efJkgysSqTgUAEWkwmnUqBGPPvooAMeOHWPBggUAtGnThqpVqwL5j2b79+9PaGgow4YNu2zGa3vgU2A38Cz5Y/6u1c1AfyC/47Zx40ag7LuAubm5xc6ijY2NpU6dOsTFxdGjR48yrelaDB8+3DVh59133yU9Pd3gikQqBgVAEamQCm8PFx8fj91up1evXkUed3744YecPHmy0Kd6Av8F1gGPkr+m340YA+R30zZs2EBOTg779u0rZu3A0vHxxx8TGRnJ7bfffsX4w7vvvpvU1FTGjRuHv79/mdRzPWrWrMlzzz0HwIULF5g5c6bBFYlUDAqAIlIhtWvXjrvuuguAgwcP0qFDB3bu3Ml//vOfy3arsACPA8nA90A3CkLbjWsIPAZAZmam6/HymjVrSuj6f+zIkSNYrVacTucVkygsFguVKl1PZ7PsjR49Gk/P/DA+Y8YMzp8/b3BFIuWfAqCIVFiFu4AHDx5k+fLldOrUqci2cXATsBBoXVpVuL5au3YtDoeDHTt2uGYnl5SjR49eseD0kCFDqF69OnfffTd9+/Yt0fuVpdDQUFf96enpvPfeewZXJFL+KQCKSIUVHR1N69b5wc7hcLjWt3v66ae5+eabf33XceDbUqyiLdAdyA8ve/bsweFwsHbt2hK5empqKs8++yxhYWFXrG/o7+/P/v37WbZsGd26dSuR+xml8DI+kyZNumxBbhG5VgqAIlJhWSyWIl3AuLg4ACpVqsSoUaMKvXNkKVfyWw2rV6/G6XSSnJzMhQsXbvjKGRkZrkWqJ06ceMX6hrVr/9mSNeVDixYtuPfeewGw2WyluhWdiBkoAIpIhfbYY48RHh4OwIoVK0hOTgZg8ODBhSY/HAA2lmIVPSjYLeTnn3/GarWSk5Pjmhl8tZxO5xWPjgvWN/T39+fxxx/n4sWLJVW02yluGR8RuT4KgCJSoXl5eRUZ81fQBaxevTrPP/98oXc+T+mxcHkXEH6bGfxn8vLyXItUFyxyXdg777yDzWbjzTffxM/Pr8Sqdjddu3alU6dOAOzcuZNvvy3NR/ciFZvFqV+hRKSCy8rKIjQ0lBMnTuDh4cG+ffto0KABx48fJyQkpFDXzAqElVIVeUAkkALAoEGDqFu3Lr169aJ9+/Z/+MlLly4RHh7O0aNHAdi1axdNmzYtpTrd25dffslDDz0E5AfCy7eyE5Grow6giFR4lStXZsSIEUD+ZJCJEycC+ePjBgwYUOidg0qxCk/gt05kweLMa9asuWIrtsvH8fn4+Lj2xW3Xrp2pl0G5//77XeF31apVZbakjkhFow6giJiC3W4nODiYzMxMKlWqRGpqKnXq1CElJYVGjRrhcDjIf1R7CggspSqygVDgOBaLhWHDhhEUFMQjjzxCy5YtOXLkCFOmTOGzzz5j586dRR7nZmZmsmnTJu6880632arNKP/6179cwf3BBx9k6dKlBlckUv6oAygiphAQEMDgwYMBuHjxItOnTwcgIiKC3r17//ouJ6U7FtCXghnHTqfT1b0qmBn8yiuvMHnyZFJTU69Y665atWp069bN9OEP4IknnqBevXpA/iPhXbt2GVyRSPmjACgipjFq1Ch8fHwAmD17NmfPngWKLhidvwdwdilWMQSoBuTvR5yZmcmJEyc4ePAgY8aMAcDX1xe73V6KNZRvhR+JA1fsciIif04BUERMo27dujz99NMAnDlzhjlz5gAQFRVFdHT0r+/KBcYVf4ES4Q/cnX+n3FzWrVsH5HcBW7Rowb/+9S9SU1N5/fXXS7GG8m/gwIHUqFEDyN/z+PDhwwZXJFK+KACKiKmMHTvW9Rh1ypQprhnARbuA7wKOUqrgC/K7jPk2b95MdnY2aWlpHD58mH79+lWYxZtLU9WqVRk2bBiQH6QnT55scEUi5YsCoIiYSmRkJI888ggAv/zyCwsWLADgrrvuom3btr++KxuYUEoV3A8Eu46ys7PZtGkT8Nv6gHJ1hg8fTuXKlQF49913SU9PN7gikfJDAVBETKdwty8hIYG8vLwrto2DGx1Xdhr4ZzHX8QYmAzNdZ9avX09OTg779u3j5MmTN3hf86hVqxbPPvssAOfPn2fWrFkGVyRSfmgZGBExpW7duvHDDz8AkJiYyGOPPUZeXh5NmjThwIEDv77rfaD/NVx1F1AVqAnUBzKAAMBGwcSPonpT8Dj4gQceoE2bNtx6662uhY7lz6WmptKgQQPy8vKoWbMmaWlpVKlSxeiyRNyeOoAiYkrF7Svr6elZZNs4eOUarpgH3A5EkD+G8OFfz58Ffvydz/zWcVyzZg0Oh4Pt27dfsd+v/L7Q0FD+8pe/AHDq1Cnmz59vcEUi5YM6gCJiSk6nk6ioKLZu3QrAf//7X7p160Z2djZhYWEcO3bs13d+C/T6gyutJb+L9zFQ8BkPYA2wAHiJP95erjvwXwBiYmJo1qwZHTt2pGfPntf3jZnQ9u3badWqFQAhISEcOHAAb29vg6sScW/qAIqIKV0+5m/ChPxJH76+vowaNarQO0f+wVWGAp2BSfwW/gBeBDqQP87vz/YWLtoFdDqdbN68maysrD//JgSAli1b0qtXfkhPS0tj8eLFBlck4v7UARQR08rNzaVRo0YcOnQIgOTkZFq3bs2ZM2cIDg52LRQNm4A2xVxhEfB4Meev5ceq89drbwHgr3/9K+Hh4XTr1o3bb7/9Gq5jbj/++CN33nknAC1atGDbtm3aNUXkD6gDKCKm5eXl5dp9AyA+Ph4Af39/hg4dWuidA4EZwM+XXeGxYq5qu8YqLBTuAhYsBVMwM1iuzu23307Hjh0B2LFjB999953BFYm4NwVAETG1AQMGUKtWLQAWL15MSkoKkD9G8DdbyH+sO/WyT4+47Hg8+bN/r9VjQDgAKSkp/Pzzz1y4cIEtW7Zcx7XM6fJH+nFxcQZWI+L+FABFxLROnTrFoEGD8PPzA8DhcDBp0iTGjBlDfHw8Hh6X/4icA5z/9ev9wOxCr3kDb15nJV7Ab7OPC7qAa9euxeEorR1JKp4HH3yQxo0bA/DTTz+xdu1agysScV8KgCJiWkFBQRw8eJDU1FTXuXfeeYdJkyYBFBO+vgH8fv068rLXMm6wmn7ATQDs3r2b9PR07HY7u3btusHrmoeHhwfjxv22j7O6gCK/TwFQREzLYrEUWQ8Qij76rVy5Mg0aNCj06tu//u+dl13pQ34LhterMgWPlJ1OJ2vWrAHyu4Gaq3f1nnzySW655RYAli5dyp49ewyuSMQ9KQCKiCnl5OTQq1cvHn744SteKxhPlpaWxr///e9CrywGvqbows6NgKdLqKrnKdgxZNu2bWRmZnL8+HEOHjxYQtev+Hx8fBg9erTruGBij4gUpQAoIqZy5swZmjdvjo+PD99//32x73E6ndSsWZNatWrRpk0bevTo8esrucADl727JDtMAcDg/Dvl5rJ+/XrgtzGBcnUGDhxIQEAAAB9//DFHjhwxtiARN6QAKCKmcOjQIWrWrElAQMBVjaubMmUKFy9eBCgyu7SoNZT8j9GR5E8ogc2bN5OdnU1aWppCzDWoVq0aL7zwApDf6Z0yZYrBFYm4HwVAEanQ1q1bh8ViITw8nPT09Ctej46O5tKlS66JH76+vgD8/PPPfPzxxwB0796dpk2bXvbJh4BOpVDxLcBfAcjKymLz5s2AuoDX6sUXX3T9Xc6ZM4fTp08bXJGIe1EAFJEKacmSJVgsFjp1Kj6kDRo0CIfDwfLly/H29mbgwIG0a9eOTz75xPWe+Ph4HA4HOTk5ZGdnX3aFL0qveMaSv0B0/oLQubm57N27l5MnT5biPSuWm266iWeeeQaA8+fPM3v27D/5hIi5KACKSIWSkJCAxWKhT58+xb4+YcIEnE4nc+bMKbJVWLVq1VizZg2PPPIId9xxBwD79u1j6dKl/OMf/8BqtV52pQ9K61sgf4mZRwA4e/Ys27ZtA3DNDJarM2bMGDw9PQGYNm0aFy5cMLgiEfehACgi5Z7T6WTIkCFYLJYi68AVtmjRIpxO5x+M58vfGg6Kjvl75ZVXeOuttwAuWxj6lRsv/A/9VkPBgtDbt28vtD+x/JmwsDDXLwKnTp3i/fffN7giEfehACgi5VZOTg49e/bEw8ODOXPmFPueNWvW4HQ6f7cjWJx77rmHli1bArBnzx7XgtCvv/46tWvX/vVdR4HlN1L+n2hPwXqDp06dYu/evTgcDu1ucY0K/0IwceJEcnNzDaxGxH0oAIpIuWO322natCk+Pj4sX35lCAsMDCQlJQWn0/m7YwD/yOX7ygJ06dKFV199lZEjRxY6++I1X/va/LZIdcGC0MnJyWRlZZXyfSuOW2+9lXvuuQeA1NRUFi9ebHBFIu5BAVBEyg2r1UpgYCA1atQodoeHpk2bYrfbSU9PJzw8/Ibu9c477xQ5Hj9+PJ6engwdOpTq1av/enYfsPWG7lM8B/kLTr/hOnP06FFSU1O5dOkSGzduLIV7VlyFw3x8fLx2VhFBAVBEbkBsbCxt2rQptmMGkJiY6Ho9JiaGpKSk67rP2rVrsVgsREREkJFx5Z6799xzD5cuXWLXrl34+/tf1z0KW7ZsGStXrixyrmBJGH9/f4YMGVLolcE3fL/f5AALgJbkLzi9yvVK3bp1XesSrl+/npycnBK8b8V2xx130KFDByB/h5Vly5YZXJGI8SxO/SokIjdg7ty5rFixgsTExGI7K1arlTlz5hAXF3fN1160aBGPP/74774+ZMgQZs+eXWQ2743Ky8tzTQYpzMPDgwMHDhAeHs4vv/xCaGgoly5d+vXVVCDkBu56HngPmATYirzSpEkTYmNj6du3L19++aVrEet7772Xdu3a3cA9zeXzzz/n0UcfBfID4Q8//GBsQSIGUwdQRG6I3W53hbu5c+de8XpycjKDB19bl2zChAlYLJbfDX8JCQk4nU7efvvtEg1/APXq1StyPGjQIAAcDodrseibb76Zfv36FXrXEK7PKeBv5IfHERQOf506dWLp0qXs3LmTfv364ePjQ5cuXVyvr1mzxjU5Rf7cQw89RGRkJAA//vgj69atM7giEWMpAIrIDQsPDycqKqrYmbhWq/WqxuM5HA4GDhyIxWJh/Pjxxb5nyZIlOJ1OxowZc8M1F2fmzJkcO3bMdfzwww/z1ltv4efnB8D8+fM5ceIEkL/G3G/hczlgv4Y7pZEf+EKAvwO/7VBy33338dNPP7F69WoefPBB19Iz58+fZ8+ePa5ju93O4cOHr+fbNCUPD48iM4KvpyMtUpEoAIrIdUtOTiYqKgrInySRnJxMcnLyNV0jJyeH6OhoPD09mTdv3hWvWywW1q1bh9PppHfv3iVSd3EyMjIYPnx4kXOff/45gYGBri5gdnY206dPB6BRo0Y89thjv77TAQy7irvsJH+btwhgOpC/MLGnpydPPfUU27dv5+uvv+a2225zhcuMjAy++eYbpk6dysqVK11dPx8fH6pVq3ZD37PZPPnkk9StWxeApUuXsnfvXoMrEjGOAqCIXLdNmzbRo0cPAHr37k1AQECRLqDdbv/d7l9GRgaNGzfGx8en2MkhNWvW5NChQzgcDtcA/tIUGBhY5Nhm++1x7OjRo/H29gZg1qxZZGZmAlw28WUxcInirSJ/UkcL8id55AFQuXJlhg8fzsGDB1mwYAEtWrRwfeLYsWN8+umnzJgxg02bNrnWr/Pw8ODWW29l4MCBV9Qsf6xSpUqMGjUKyF88PCEhweCKRIyjACgi181utxc5HjRoUJFxgElJSa6AWCAlJYUaNWoQGBjIvn37rrhmixYtsNvtnDx5ktDQ0NIo+wpDhw4tcvzKK69Qv35913G9evV48skngfzv+d133wWgbdu23HXXXb++K4fCu3fkdwW/AroAt5G/rEu+wMBAXn/9dWw2G9OnT3d9n06nk0OHDvHRRx8xZ84cdu7c6ZpY4+3tTceOHRkxYgQPPfQQNWvWLLHv30wGDRpEQEAAAAsWLODIkSPGFiRiEAVAESkxBZM9CkKg1Wp1/cd23759dO7cmQYNGlwRHCF/VmtOTg7bt28vkaVcrtbevXuLrPnn4+PDG2+8ccX7Co8fmzx5smsG8Msvv1zoXXOBi+TvE9wCeBD4bf/e+vXrM3XqVNLS0vj73//uCnFOp5M9e/bw3nvv8eGHH5KSkuL6TJUqVejWrRujRo2iZ8+ehdYglOtRvXp1nn/+eSB/+MHUqVONLUjEIFoGRkSuS3JyMqdPn76iwxcdHY3VaiUlJYX4+HhXcEpMTCQmJuaK67zwwgvMmDGjxGfzXq3L73vhwgUqV65c7Hsffvhhli5dCuRPCBkwYABOp5MmTZoU6mb6A2eKfK5Zs2aMGzeOvn37uh4lA+Tm5rJ9+3bWrFlDenp6kc8EBATQqVMnWrduXeQzcuOOHz9OaGgo2dnZVK1aFZvNRo0aNYwuS6RMqQMoItel8Pi/wgYPHozVaiUxMbHI+L/evXtTq1Yt1/HkyZNxOp3MnDnTsPB3++23Fzn+6KOPfjf8wZU7SjgcDjZu3FhkvGDh8Ne5c2e+/PJLtm/fzl//+ldXkLt48SJr1qxh+vTpfPXVV0XCX+3atXn00UcZPnw47du3V/grBbVr12bAgAEAnDt3jtmzZxtckUjZUwdQRK5L4e7e5Qq6KYcOHXI9Agb47rvv8Pf3p3PnzmVR4h9atmyZa49YgMjIyKuaFXrHHXfw008/Afn/DN544w2aNWvGsWPHOHToEADBwcF0796dIUOG0L59e9dnz507x/r169m4caNrV48CoaGhdOnShYiICMMCsZlYrVYaNmyIw+GgVq1apKWl/WH4F6lo1AEUkWtmtVqveGRZ2KBBgwgMDCwS/gB69erlFuEvLy+vSPgD2L1791V9tnAXcPz48TRr1oxly5YVCcNVq1YlJCSEtWvX4nA4OH36NF9//TVTp05l1apVRcJf48aNefbZZ+nXrx8NGjRQ+Csj4eHh9OnTB4CTJ0/y/vvvG1yRSNlSB1BErsngwYNZvHgxkB/0iltQ126389Zbb7ntYrt16tTh+PHjruO1a9fSsWPHq/qs0+mkVatW7NixA4Bvv/2WXr16kZ2dTWhoKMePH8disTBs2DCCgoKoV68eR48eLbJNnoeHBy1btqRLly6azWugLVu2uNaxDAsLY//+/cVuAyhSESkAikiFd/LkSdf4wxkzZvDiiy+6XnvkkUf47LPPrul6H3/8MU899RSQ39X89ttvAXjrrbf4v//7PwDatGnDAw88UORzPj4+tGnTho4dO2o2r5vo2bMny5cvB2DhwoV/uPe0SEWiACgiFdrFixepV68e48ePp1+/fld03K7nR2Bubi4NGjQgLS0NgG3bttGyZUvsdjvBwcFkZmbi5eXFiBEjqFatGlWqVKFjx460bdtW48zczP/+9z/XWo6tWrViy5YtegwvpqAxgCJSof3000+cOnWKl1566YrwV3T27tXz8vIqsh9xwaPugIAAhgwZAuSHxMOHD3PfffcxcuRIbrvtNoU/N3TnnXfSrl07ID/IF3QDRSo6BUARqdC+/vrrYs+/+uqrRXb7uFbPPPOMK1AuWrSI1NRUAEaOHImPjw8A33//PQ0bNtRSLm7MYrEUWcx7woQJBlYjUnYUAEWkwnI6nXz11VfFvpaSklLsjiRXq0qVKgwfPhzIn1U8adIkAOrWrcvTTz8NwNmzZ4vsjSzu6aGHHqJRo0YA/PDDD2zYsMHgikRKnwKgiLit+Ph42rRpg8VicW0z93vsdjsRERHUqFGDmJgYkpKS2Lt3r2ttvsstXLiQrl27kpWVdd31vfDCC/j5+QHw3nvvcfLkSQDGjh3rGkc2ZcoUsrOzr/seUvo8PT0ZO3as69hdZ6+LlCQFQBFxW+PGjWPw4MH07t0bq9X6h+9dvHgxp0+fZvz48SxZsoQePXr87uNfyJ+l+8UXX9zQuLygoCAGDhwIQFZWFjNmzADyF5V+5JFHADh27BgLFiy47ntI2Xj66ae5+eabAfj8888Lbe0nUjEpAIqIW7Pb7bRr145Nmzb97nuSkpIIDw/HbrcX2Z7u008/Lfb9I0aMYPXq1TRo0OCG6xs9erRr7biZM2dy7tw5oOiC0QkJCeTl5d3wvaT0VKpUiVGjRgH5QwcSEhIMrkikdCkAiojbi4qK+sPxena73dUhLFjYNz09nfXr1xd5n7+/P59//jlTp06lUqVKJVJb/fr1efLJJwHIyMjg3XffBaB9+/Z069YNgAMHDvDFF1+UyP2k9AwePBh/f38APvzwQ44ePWpwRSKlRwFQRNyW1WolPDyc8PBw1/Hl5s6dS+/evVmxYkWR7t/l47jatm3L0KFD2b9/P3PnzsVqtZKcnFwidRbeBm7y5MlcunQJKNoFnDBhwnWtOShlp3r16jz//PMA5OTkMHXqVGMLEilFCoAi4raSkpLo0aPH7wbA5ORkV+hLSkoiOjra9VrhiRd9+vTB39+fNm3aMG7cOAYNGkRsbCzdu3cvkTqbNm3Kgw8+CMCRI0f45JNPALj77ru59dZbAdi0aRP/+9//SuR+UnpGjBjh6g6/8847ZGRkGFyRSOlQABQRt2W32wkICADyF1m+PAAWdAitVusV4/+mT5/OF198wWuvveaaSdy7d2/X64GBgUXef6MKd/vi4+NxOBxYLJYruoDi3mrXrs2AAQMAOHfuHG+//bbBFYmUDgVAESkXwsPDSUlJcR0nJia6Al1SUhIBAQGu8X8FHnroIUaPHk1sbOwVy8hc3jG8UZ07d6Zr164A7NmzxzUDuXfv3oSFhQGwYsWKEnvsLKVnzJgxeHjk/+dx2rRpN7RUkIi7UgAUEbdU0N0rUNDpK+61y8f/FVYwe7hw969g0kjbtm1LtObLd5RwOp14eXkVWWMuPj6+RO8pJS8iIsL178uJEyf44IMPAFi1ahWJiYmsXLmSCxcuGFmiyA1TABQRt1Qw/q9Au3btXAEwKSmpSLfvj7p5ycnJrsfIBQpC4eUdwxt177330rx5cwDWrl3LqlWrAOjfvz833XQTAEuWLCnSyRT3dPkyPrm5ucyaNYuYmBhuv/12fv75ZwOrE7lxCoAi4pYKj/+D/A5gcnIyiYmJ9OnTx3W+uPF/l7u801ewUHRJs1gsRWYEF4z5q1y5MiNGjADA4XAwceLEEr+3lKyoqCjXLxVWq5VPP/2U48ePu16vXbu2UaWJlAgFQBFxO3a7/YouWcEj34CAgCLBMDExkYCAgCKPhAvr0aNHkckjSUlJzJ07t0TH/xX2+OOPExwcDMC3337Ljh07ABg6dChVq1YF4P333y8SJsS9vPvuu+zatatIFzAuLo4TJ04A4Ovr6/q7FCmvFABFxK0MHjyYsLAwFi9eXGTiRnh4OL179y6y7MvgwYN56623XJ8rbp3AqKgoYmNjiY2NJTEx0bWgdGl0AAG8vb156aWXXMcFY/5q1Kjh+n4uXrzItGnTSuX+cmPWrl3LkCFDaNOmDTt27KBNmzYAbNmyhSNHjgD53b+CvZ5FyiuLUyuTioiJJCcn06ZNm1JdlPn8+fOEhISQnp6Op6cnBw8eJDQ0lH379tGkSROcTif+/v7YbDaqV69eanXItXvwwQf56quvXMctW7Zk+/btRd7Trl07NmzYUNaliZQodQBFxFQWLVpUat2/An5+fgwfPhyAvLw8Jk+eTGZmJs8884xr3+AzZ84wZ86cUq1Drt3ixYsZOXKk63j79u2uJWEKFEzoESnPFABFpMKKj48nIiLCdWy1Wpk7d26ZBK9hw4ZRpUoVAObNm0f37t3ZuXMnH330kevx4ZQpU7h48WKp1yJXz9fXlylTprBixQrq1q0L5E/cKUwTQKQi0CNgEamwEhMTWbFiBdHR0Zw+fZrNmzcTGxv7uxNGStrIkSNdY/18fHxYuXIl7du359FHH+Xzzz8H8sPhs88+Wyb1yLU5ffo0Q4cOZfHixUXOt2zZknvuuYd27drRo0cP5s6dC+RPUBo0aJARpYpcMwVAEZFSYrPZiIiIIDc3l+rVq3P06FGqVq3K+vXr6dixIwCNGjVi9+7deHp6GlytFMfpdPLxxx/zzDPPkJOTA+QHvYyMDGrUqMGgQYOIi4sjPj6eOXPmaI1HKTf0CFhEpJQEBwfTt29fAM6ePcu8efMA6NChA3feeScA+/fvZ+nSpUaVKH/CYrHw1FNPFdnB5cknn3R9XTDEICoqSmM6pVxRB1BEpBTt3LmTFi1aAFC/fn1SUlLw9vbm+++/p1evXgC0b9+edevWaWkRN/fjjz9Sp04dIiMjsVqtREREkJGRccVOMyLlgTqAIiKlqHnz5tx///0AHD58mIULFwLQs2dPWrVqBcCGDRv44YcfjCpRrtIdd9xBZGQkkL8OZXh4uMKflFsKgCIipezyHSUcDgcWi+WK81J+rFixotSXExIpTQqAIiKlrGvXrnTp0gWA3bt388033wAQExNDWFgYAMuWLWPLli2G1Sh/rmC2L+TPMC+8nWDh10TKAwVAEZEyUFy3z8vLq9ht48T9zJ071/V3mJiYWKT7V7C9oEh5okkgIiJlwOFw0LJlS3bt2gXAypUr6dq1KxcuXCA0NJSTJ0/i4eHBgQMHymydQrl6VquVOXPmEBERQdu2bQkICCAuLs61xqTW/5PyRgFQRKSMfPjhh/Tr1w+A+++/37Xn7BtvvMFrr70GwNChQ5k9e7ZhNYqIOSgAioiUkZycHCIiIjh8+DAAO3bsoHnz5mRkZBAcHMy5c+fw9fUlLS1N+82KSKnSGEARkTLi7e1d7Ji/gh0lALKzs5k+fboh9YmIeagDKCJShs6fP09wcDCnT5/Gy8uLgwcPEhISwpEjRwgPDycnJ4eAgABsNhvVqlUzulwRqaDUARQRKUN+fn4MGzYMgNzcXCZPngxAvXr1eOqpp4D8WaVaVkRESpM6gCIiZezUqVMEBweTlZVFlSpVsNlsBAUFsWfPHpo2bQpA3bp1sVqtVKpUyeBqRaQiUgdQRKSM1axZk+eeew6ACxcuMHPmTACaNGnCQw89BMDPP//Mxx9/bFiNIlKxqQMoImKAtLQ0IiIiyMvLIzAwEJvNhp+fH+vWraNTp04AREZGsnv3bjw89Lu6iJQs/VQRETFASEgIffv2BeD06dO89957AHTs2JHbb78dgH379rF06VLDahSRiksdQBERg+zYsYOWLVsCEBwczMGDB/H29ua7777j3nvvBaBDhw6sXbsWi8ViZKkiUsGoAygiYpAWLVpw3333AWCz2fj3v/8NwD333OMKhuvXr+enn34yrEYRqZgUAEVEDBQbG+v6Oi4uDofDgcVioVGjRq7zEyZMMKI0EanA9AhYRMRATqeTLl26sHbtWgC++uortm7dymuvvUZAQAB2ux2ArVu30qpVKwMrFZGKRAFQRMRgX375pWv5l5CQENLS0vjnP/9JQEAAw4cPB6Bv37588sknRpYpIhWIAqCIiMEcDgctWrRg9+7dADz33HO8++67XLhwgZCQEE6dOoWHhwcHDx4kLCzM4GpFpCLQGEAREYN5eHgwbtw41/Hx48cBqFKlCi+++CKQHxInTZpkSH0iUvGoAygi4gYuXbpEREQER44cAWDnzp00a9aM06dPExwczPnz5/H19SUtLY2bbrrJ4GpFpLxTB1BExA34+PgwevRo13F8fDwAgYGBDBo0CIDs7GxmzJhhSH0iUrGoAygi4ibOnTtHcHAwGRkZeHl5kZKSQnBwMIcPHyY8PJzc3Fxq1KhBWloa1apVM7pcESnH1AEUEXETVatWZdiwYQDk5uYyZcoUAOrXr8+TTz4JQEZGBu+++65hNYpIxaAOoIiIGzl58iQhISFkZWVRpUoVbDYbQUFB7N69m2bNmgFwyy23YLVa8fHxMbhaESmv1AEUEXEjtWrV4tlnnwXgwoULzJo1C4CmTZvy4IMPAnD06FE+/vhjw2oUkfJPHUARETeTmppKgwYNyMvLIygoiLS0NPz8/FizZg1dunQBoHHjxuzatQsPD/0eLyLXTj85RETcTGhoKI8//jgA6enpzJ8/H4DOnTtz2223AbB3716++uorw2oUkfJNHUARETe0fft2196/ISEhHDhwAG9vb7755hvuv/9+ADp27MiaNWuwWCxGlioi5ZA6gCIibqhly5b06tULgLS0NBYtWgTAvffeS/PmzQFYt24dK1euNKxGESm/FABFRNzUyy+/7Po6Pj4ep9OJxWIhNjbWdT4uLs6I0kSknNMjYBERN+V0OuncuTPr1q0D4JtvvuHee+8lJyeHBg0aYLPZANi2bRstW7Y0slQRKWfUARQRcVOXd/smTJgAgLe3N2PGjHGdL9g2TkTkaqkDKCLixhwOB82aNWPv3r0ArFmzhk6dOnH+/HlCQkJIT0/H09OTgwcPEhoaamyxIlJuqAMoIuLGPDw8GDdunOu4YMyfn58fw4cPByAvL49JkyYZUp+IlE/qAIqIuLlLly4RHh7O0aNHAdi1axdNmzYlPT2d4OBgLly4QOXKlUlLS6NWrVoGVysi5YE6gCIibs7Hx4fRo0e7jhMSEgAICgpi4MCBAGRlZTFjxgxD6hOR8kcdQBGRciAzM5Pg4GDsdjteXl5YrVbq16+PzWYjPDycvLw8atSogc1mo2rVqkaXKyJuTh1AEZFyoFq1agwbNgyA3NxcpkyZAsCxY8dc+wFnZGQwb948w2oUkfJDHUARkXLixIkThISEkJ2djZ+fH59//jm9e/cmPDycrVu3AlCvXj1SUlLw8fExtlgRcWvqAIqIlBM33XQTzzzzDADnz5/ngQceoHnz5vz000888MADABw5coSFCxcaWaaIlAPqAIqIlCOHDh2iYcOG5OXl4eXlxZEjR6hduzarV6+ma9euADRp0oSdO3e6Hg2LiFxOPx1ERMqRsLAw+vTpA+SPBUxMTASgS5cudOnSBYA9e/bw9ddfG1ajiLg/dQBFRMqZbdu2ceuttwIQGhrKgQMH8PLy4uuvv3Y9Cu7UqROrV6/GYrEYWKmIuCt1AEVEyplWrVpxzz33AJCamsrixYsBuPfee2nWrBkAa9euZdWqVYbVKCLuTQFQRKQcio2NdX0dFxeH0+nEw8PjivMiIsXRI2ARkXLI6XTSqVMn1q9fD8C3335Lr169yMnJoUGDBthsNgC2b99OixYtjCxVRNyQOoAiIuWQxWIpttvn7e1dZNu4+Pj4Mq9NRNyfOoAiIuWUw+GgadOm7Nu3D8gf99exY0fOnz9PcHAwp0+fxtPTk5SUFEJCQgyuVkTciTqAIiLllIeHB+PGjXMdF3QB/fz8GD58OAB5eXlMmjTJkPpExH2pAygiUo5dvHiR8PBwfv75ZwB2795NkyZNOHXqFMHBwWRlZVG5cmVsNhs1a9Y0uFoRcRfqAIqIlGOVKlUqMuYvISEBgJo1azJw4EAAsrKymDlzpiH1iYh7UgdQRKScy8zMJDg4GLvdjre3N1arlXr16pGWlkZERAR5eXkEBgZis9nw8/MzulwRcQPqAIqIlHPVqlXj+eefByAnJ4cpU6YAEBISwhNPPAHA6dOnmTdvnmE1ioh7UQdQRKQCOH78OKGhoWRnZ1O1alVsNhs1atRg586drnUA69evT0pKCt7e3gZXKyJGUwdQRKQCqF27NgMGDADg3LlzzJ49G4DmzZtz3333AXD48GEWLlxoWI0i4j7UARQRqSCsVisNGzbE4XBQq1Yt0tLSqFy5MqtWreK2224DoFmzZmzfvh0PD/3+L2Jm+gkgIlJBhIeH06dPHwBOnjzJ+++/D0DXrl3p3LkzALt27eKbb74xrEYRcQ/qAIqIVCBbtmwhKioKgLCwMPbv34+XlxdffvklDz30EABdunRh1apVRpYpIgZTB1BEpAJp3bo1PXv2BODQoUMsWbIEgPvvv5+mTZsCsHr1agVAEZNTABQRqWBiY2NdX8fFxeF0OvHw8HBtD1dwXkTMS4+ARUQqGKfTSYcOHdi4cSMA3333HV26dOHuu+9m/fr1FPzY37FjB82bNzeyVBExiDqAIiIVjMVi4eWXX3Ydv/nmm9xzzz1s376dW265xXW+YNs4ETEfdQBFRCqgvLw8mjZtyv79+wHw8PDA4XDQqlUrDh48yPnz5/Hy8iIlJYXg4GCDqxWRsqYOoIhIBeTp6cmzzz7rOq5cuTJLly5ly5YtvPTSSwDk5uYyefJko0oUEQOpAygiUsFcunSJiRMn8sYbb3Dx4kUcDgcAe/fuJTIyklOnThEcHExWVhZVqlTBZrMRFBRkcNUiUpbUARQRKUNz584lNjaW2NhY4uPjS/z669ato02bNrz++usMGzaMv/3tb67XCsb81axZ09UdvHDhAjNnzizxOkTEvakDKCJSRmJiYggPD3ctwRIdHU1sbCw9evS44WtnZWUxfvx4pk+fTps2bZg3bx6tWrXi7NmzBAcHc+bMGby9vTl06BC33HILqampNGjQgLy8PIKCgkhLS8PPz++G6xCR8kEdQBGRMjB48GCsVmuR9feioqKYM2fODV97x44dtG/fnnfeeYeJEyeybt06WrVqBUD16tV5/vnnAcjJyWHq1KkAhIaG8vjjjwOQnp7Oe++9d8N1iEj5oQAoIlLKkpKSmDt3Lu+++26R80FBQSQlJV33dZ1OJzNmzKBdu3YAbNq0idGjR+Pp6VnkfSNGjKBSpUoAvPPOO2RkZABFF4yeNGkSOTk5112LiJQvCoAiIqVs8ODBREVFufboLZCeno7dbr+ua164cIEnn3ySF198kcGDB7Nx48bfXdS5du3aDBgwAIBz587x9ttvA9CiRQvuvfdeAGw2G4sWLbquWkSk/FEAFBEpRUlJSVitVsaPH3/Fa1ar9bquabVa6dSpE0uXLmXRokVMmzYNX1/fP/zMmDFj8PDI/5E/bdo0srKygOK3jRORik8BUESkFBWM8evdu/cVryUlJREQEHBN11u9ejXt2rXj3LlzrFu3jj59+lzV5yIiIlw1nDhxgn/9618A3HbbbXTq1AmAnTt38u23315TPSJSPikAioiUErvdTmJiYrGzfO12O3a7nbZt21719T777DO6d+9O8+bN2bhxIy1atLimegp3+yZOnEhubi4Wi6XI+QkTJlzTNUWkfFIAFBEpJXPnzgXyH9lGR0cX+dO9e3eAK8YF/p5Zs2bRu3dvHnroIZYvX05gYOA11xMVFUV0dLSrpk8//RSABx54gCZNmgCwatUq1qxZc83XFpHyRQFQRKSUbNy4EYAVK1Zc8aeg8/eXv/zlT6+TkJDAsGHDGDlyJAsXLnTN6L0eL7/8suvrCRMm4HQ68fDwYNy4ca7zhZeqEZGKSQtBi4iUkoiICE6fPu1adqWwGjVqEB4ezubNm//wGm+++SavvPIKr776Kv/4xz+wWCw3VJPT6aR9+/Zs2rQJgGXLlnH33Xdz6dIlIiIiOHLkCJA/HrBZs2Y3dC8RcV/qAIqIlBKr1VrsGL/k5GTsdnuxM4MLKwh/f//73/nnP/95w+EP+N0xfz4+PowePdp1vmDbOBGpmNQBFBEpJRaLhUGDBl2x20dMTAxJSUnFdgYLvPPOOwwdOpS//e1v/L//9/9KtK68vDyaNGnCgQMHANiwYYNrZnFwcDAZGRl4eXlhtVqpX79+id5bRNyDOoAiIqUkICDgimVerFYriYmJV+wKUlhiYiLPP/88w4cP5/XXXy/xujw9PRk7dqzruGDMX9WqVXnhhRcAyM3NZfLkySV+bxFxD+oAioiUkujoaKKioopMqoiOjiYgIIAlS5YU+5mffvqJ6OhoevfuzYIFC1yLN5e07OxswsLCOHbsGBaLhT179hAZGcnJkycJCQkhKysLPz8/0tLSCAoKKpUaRMQ46gCKiJSS2NhYkpOTXcfx8fEAvxv+UlNTeeyxx+jcuTPvv/9+qYU/AF9fX0aNGgXkTwyZOHEiALVq1eKZZ54B4Pz588yaNavUahAR46gDKCJSiuLj40lPTwcgKCioyHIrhWVmZtKlSxfOnz/Phg0byqTrdubMGYKDgzl79iw+Pj4cOnSIunXrcujQIRo2bEheXh41a9YkLS2NKlWqlHo9IlJ2FABFRAzmdDqJiYlh+fLlrF27tkyXXxk/frxrJvDYsWNdXcpWrVqxfft2AGbMmMGwYcPKrCYRKX0KgCIiBps1axbDhg3j008/5dFHHy3Tex87dozQ0FAuXrxItWrVsNlszJw5k9dee831npCQEA4cOIC3t3eZ1iYipUdjAEVEDLR161ZGjx7NsGHDyjz8AdSpU4d+/foB+Y+hY2JieO211/jnP/9Jr169AEhLS2Px4sVlXpuIlB51AEVEDHLhwgVat25NlSpVWLt2Lb6+vobUcfDgQSIjI3E4HAC8/vrr/P3vf+fHH3/kzjvvBKBFixZs27atRBajFhHjqQMoImKQV199FZvNxr///W/Dwh9AgwYNeOyxx1zHdevWBeD222+nQ4cOAOzYsYPvvvvOkPpEpOQpAIqIGGDNmjVMnTqVN954g8jISKPLKbI9XEJCAnl5eVgsFl5++WXX+cLrGYpI+aZHwCIiZSw7O5tWrVoRGBjIqlWr8PT0NLokIH+R6qSkJAAWLVpEnz59cDgcNGvWjL179wL5wbVTp05GlikiJUAdQBGRMjZx4kQOHTrE/Pnz3Sb8QdEuYFxcHE6nEw8Pj2K3jROR8k0dQBGRMmSz2WjcuDHDhg1zrbnnLpxOJ23btnXtXrJ8+XKio6O5ePEiERERHD16FIDdu3fTpEkTI0sVkRukDqCISBl66aWXCAgIKLLOnrv4vTF/lSpVcm0bB7hdcBWRa6cOoIhIGVm9ejVdu3blww8/5Omnnza6nGLl5eXRuHFjDh48CMDGjRtp27YtmZmZBAcHY7fb8fb2xmq1Uq9ePYOrFZHrpQ6giEgZcDqdvPLKK7Rq1Yonn3zS6HJ+l6enZ7Fj/qpVq8YLL7wAQE5ODlOmTDGkPhEpGeoAioiUgRUrVnD33Xfz5Zdf8sADDxhdzh/Kzs4mNDSU48ePY7FY2LdvHw0bNuTEiROEhISQnZ2Nn58fNpuNwMBAo8sVkeugDqCISClzOp28+uqrdOzYkfvvv9/ocv6Ur68vI0eOBPJrT0hIAOCmm27imWeeAeD8+fPMnj3bqBJF5AapAygiUsp++OEHunXrxnfffcc999xjdDlX5cyZMwQHB3P27Fl8fHxITU3l5ptvxmq10rBhQxwOBzVr1iQtLY0qVaoYXa6IXCN1AEVEStnEiRNp0aIFPXv2NLqUq+bv78+QIUMAuHTpEtOmTQMgPDycPn36AHDq1Cnef/99w2oUkeunDqCISCnavXs3zZo144MPPuCvf/2r0eVck19++YXQ0FAuXbpE9erVsdls+Pv7s3XrVlq3bg1AaGgoBw4cwMvLy+BqReRaqAMoIlKKpk+fTt26dXn88ceNLuWa3XzzzfTr1w+As2fP8s477wBw6623urqZqampLF682LAaReT6qAMoIlJKzp07R926dRk5ciT/+Mc/jC7nuuzfv5/GjRvjdDqpXbs2qamp+Pr6usY1ArRq1YotW7ZgsVgMrlZErpY6gCIipWTx4sWcO3eOZ5991uhSrlujRo147LHHADh+/DgffvghAHfccQft27cHYNu2bSxbtsywGkXk2qkDKCJSSjp37kz16tX5/vvvjS7lhmzatIl27doB0KBBA/bu3YunpyefffaZKxzecccd/PDDDwZWKSLXQh1AEZFScOjQIdauXUv//v2NLuWGtW3blrvuuguAgwcP8tlnnwHw8MMPExkZCcCPP/7IunXrDKtRRK6NAqCISClYsmQJvr6+5WLh56vx8ssvu76Oi4vD6XTi4eFR7LZxIuL+FABFRErBkiVLuO+++6hatarRpZSIHj16uJZ+2bx5M//9738BiIyMdE3+WLp0KXv37jWsRhG5egqAIiIlLC0tjU2bNhETE2N0KSXGYrEQGxvrOp4wYQIbNmzgvvvuIzg4GCi6bZyIuDdNAhERKWHvvPMOw4YNIz09HX9/f6PLKTG5ubk0btyYlJQUAPz8/GjVqhWLFy+mWbNmnDlzBm9vb6xWK/Xq1TO4WhH5I+oAioiUsGXLltGpU6cKFf4AvLy8GDNmjOvY19eX77//nltuuYUXXngBgJycHKZOnWpQhSJytdQBFBEpQTk5OQQFBTF27Fhee+01o8spcdnZ2YSGhnL8+HE8PDzYt28fDRo04Pjx44SEhHDx4kWqVq2KzWajRo0aRpcrIr9DHUARkRK0adMmMjMzufvuu40upVT4+voyYsQIABwOBxMnTgSgdu3aDBgwAMjfAWX27NmG1Sgif04dQBGREjR58mReeeUVzpw5g4+Pj9HllAq73U5wcDCZmZlUqlSJ1NRU6tSpQ0pKCo0aNcLhcFCrVi3S0tKoXLmy0eWKSDHUARQRKUHr1q2jbdu2FTb8AQQEBDBkyBAALl68yLRp0wCIiIhwzXw+efIk77//vmE1isgfUwdQRKQE1a9fn759+xIfH290KaXq559/JiwsjEuXLlG9enVsNhv+/v5s2bKFqKgoAMLCwti/fz9eXl4GVysil1MHUESkhJw8eZIjR4649s2tyOrWrcvTTz8NwNmzZ5kzZw4ArVu3do1/PHToEImJiYbVKCK/Tx1AEZES8sMPP9CtWzd2795NkyZNjC6n1O3bt48mTZrgdDqpU6cOhw4dwtfXl//+9790794dgFatWrFlyxYSEhJYtGgRycnJ9OjRg/DwcAICArDb7VitVgICAoiLiyM8PNzg70rEHBQARURKyKxZsxg1ahTnz5/H29vb6HLKxGOPPcZnn30GwNy5cxk4cCBOp5MOHTqwceNGAL7//nt69uzJ3LlzGTx4MMX9ZycmJoakpCQyMjLKtH4Rs9IjYBGRErJr1y4iIyNNE/6AItvDJSQkkJeXd8W2cXFxcQCsWLGCHj16FHudv/zlL9jtdpKTk0u3YBEBFABFREpMSkoKDRs2NLqMMtW+fXu6desGwIEDB/jiiy8AePjhh13/LP73v/+xYcMGkpKSiI6OLvY6Bd1CPQIWKRsKgCIiJeTw4cPUr1/f6DLKXOFu34QJE3A6nXh6ejJu3DjX+ddffx273V5sB9BqtRIfH8+cOXMICAgoi5JFTE9jAEVESoDT6aR69er87W9/46WXXjK6nDLldDqJiopi69atAPznP//hrrvu4uLFi4SFhfHLL78UeW8Bq9VKYmIiK1asIDY29ncfD4tIyVMHUESkBJw5c4Zz586ZsgP4e2P+KlWqxMiRI13ng4KCmDt3rutPYmIiKSkpREdHK/yJlDF1AEVESkBGRgYJCQn079+fRo0aGV1OmcvNzaVRo0YcOnQIgM2bNxMVFcXZs2cJDg7mzJkzeHh4YLPZuOWWW4p8Njo6mtOnT7N582YjShcxJXUARURKQI0aNXjzzTdNGf4AvLy8GDt2rOu4YCeU6tWr07dvXwAcDgdTp0694rPR0dEkJydjtVrLpFYRUQAUEZES0r9/f2666SYAlixZQkpKClB0Zu+cOXOw2+1FPpeeng5AYGBg2RQqIgqAIiJSMipXrsyIESOA/G7fxIkTAVi+fLnrsW9mZiZvv/226zN2u525c+fSu3dvzQAWKUMaAygiIiUmIyOD4OBgzp07R6VKlUhLS6Nx48YMHDiQSZMm4XA4uOmmm0hNTeWXX34hJiYGQOP/RMqYAqCIGK5t27YcO3bM6DKkkDp16rBp06br+uyYMWOYNGmS6zrHjh2jR48e2Gw29u/fD0BUVBSBgYHExMQwaNCgEqtbRK6OAqCIGK5evXocPXrU6DKkkFtuuYUjR45c12ePHj1KWFgYOTk5+Pv7Y7PZsFgsREREcPLkSQAeffRRPv3005IsWUSugZfRBYiI1KlTx+gS5DI38ndyyy238PTTTzN//nzOnDnDjBkzWLBggSv8Va1a1TU+UESMoQ6giIiUuL1799K0aVOcTife3t7k5ua6dgGZP38+AwYMMLhCEXPTLGARESlxjRs35uGHHwYgJyfHFf4eeeQR+vfvb1xhIgKoAygiIqVk/fr1dOzY0XVcp04dduzYQc2aNQ2sSkRAHUARESklHTp04M4773Qdz58/X+FPxE0oAIqISKmJjY0F4IUXXqBXr14GVyMiBfQIWERESo3T6eSJJ57gvffeo0qVKkaXIyK/UgAUEZFS5XA48PDQAycRd6IAKCIiImIy+pVMRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGQUAEVERERMRgFQRERExGT+P/scknJdXkddAAAAAElFTkSuQmCC\n" }, "metadata": {} } ], "source": [ "for i in range(0,10):\n", " doright(None)\n", " clear_output(wait=True)\n", " display(sketch2PNG()) \n", " time.sleep(0.01)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.8" } }, "nbformat": 4, "nbformat_minor": 4 }