{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The polygon midpoint puzzle\n",
"Suppose I assigned the following task:\n",
"\n",
"Write a program to create a polygon from a random set of point (any sort of craziness allowed with crossing lines, concave shapes, etc.!)\n",
"\n",
"Show what happens to the polygon as you iteratively replace update the polygon by replacing each point with its midpoint."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 1: Write code to plot a polygon.\n",
"In the first step of our solution, we'll write code to plot a polygon."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using Plots # this is a plotting package for Julia\n",
"n = 11 # generate 11 random points\n",
"x = randn(n)\n",
"y = randn(n)\n",
"\n",
"scatter(x,y) # this plots each point\n",
"for i=1:n-1\n",
" plot!([x[i],x[i+1]], [y[i],y[i+1]], color=:lightblue)\n",
"end\n",
"plot!()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's a mess! Let's add some commands to clean up the plot and actually plot that last line."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plot!([x[n],x[1]],[y[n],y[1]],color=:lightblue) # plot the last line\n",
"plot!(legend=false)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are going to wrap this into a function. This will make it easier to reuse."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"\n",
"`plot_polygon` A function to plot a set of points as a polygon.\n",
"\"\"\"\n",
"function plot_polygon(x,y)\n",
" if maxabs(x) > 0.5\n",
" x = 0.5*(x/maxabs(x)); # scale so x max is 0.5;\n",
" end\n",
" if maxabs(y) > 0.5\n",
" y = 0.5*(y/maxabs(y)); # scale so x max is 0.5;\n",
" end\n",
" \n",
" scatter(x,y); # draw the points\n",
"\n",
" # draw the lines\n",
" npts = length(x);\n",
" for i=1:npts-1\n",
" plot!([x[i], x[i+1]], [y[i], y[i+1]], color=:lightblue);\n",
" end\n",
" # draw the last line\n",
" plot!([x[length(x)], x[1]], [y[length(y)], y[1]], color=:lightblue);\n",
"\n",
" # set the limits on the plot, and adjust properties\n",
" plot!(xlim=(-0.5,0.5), ylim=(-0.5,0.5), legend=false)\n",
"end\n",
"\n",
"n = 11; # use a 11 point polygon.\n",
"x = randn(n,1)\n",
"y = randn(n,1)\n",
"plot_polygon(x,y)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2 write code to take the midpoints\n",
"\n",
"In the next step, we need to see what happens when we take the midpoints of each line of the polygon. This will generate a new set of points from the original set of points.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xnew = zeros(n,1)\n",
"ynew = zeros(n,1)\n",
"for i=1:n-1\n",
" xnew[i] = (x[i] + x[i+1])/2.\n",
" ynew[i] = (y[i] + y[i+1])/2.\n",
"end\n",
"# handle the stinker at the end\n",
"xnew[n] = (x[n]+x[1])/2\n",
"ynew[n] = (y[n]+y[1])/2\n",
"\n",
"# Show the midpoints without the final lines, this is a\n",
"# really simple version of plot_polygon.\n",
"scatter(x,y)\n",
"plot!(x,y)\n",
"scatter!(xnew,ynew)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"function poly_midpoints(x,y)\n",
" n = length(x)\n",
" xnew = zeros(n,1)\n",
" ynew = zeros(n,1)\n",
" for i=1:n-1\n",
" xnew[i] = (x[i] + x[i+1])/2.\n",
" ynew[i] = (y[i] + y[i+1])/2.\n",
" end\n",
" # handle the stinker at the end\n",
" xnew[n] = (x[n]+x[1])/2\n",
" ynew[n] = (y[n]+y[1])/2\n",
" return xnew,ynew\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAGcCAYAAAB3OLxVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl4W+WZN/6vJdmyJcuyZHnfs5KNLCQkDikECoFScEumfSn9MSRhKemEzjD8mtAppdDOTCFppwMDbd/MTDrQZZy2LKGlpYQSCISENMTZiUMWO3a8SpasfT/n/cNOiLPKx7KOHvv7uS6uixpZuk+/Oc7tc+7zPBmyLMsgIiIiItVo1C6AiIiIaKxjQ0ZERESkMjZkRERERCpjQ0ZERESkMjZkRERERCpjQ0ZERESkMjZkRERERCpjQ0ZERESkMp3aBZyrs7MTnZ2dapdBRERENGylpaUoLS297OvSqiHr7OzEXXfdha1bt6pdChEREdGwXXfddWhoaLhsU5Z2DdnWrVvxq1/9ClOmTFG7nLTx8MMP45lnnlG7DEoAsxIHsxIHsxIHsxrs8OHDuPvuu9HZ2SlWQ3balClTMGfOHLXLSBsGg4H/fwiCWYmDWYmDWYmDWSnHoX4B7N27V+0SKEHMShzMShzMShzMSjk2ZAKYPHmy2iVQgpiVOJiVOJiVOJiVcmzIBGA2m9UugRLErMTBrMTBrMTBrJRjQyaAu+66S+0SKEHMShzMShzMShzMSrkMWZZltYs4rbGxEVdddRV2797NoUAiIiIS2lD6Gl4hE8CGDRvULoESxKzEwazEwazEwayUY0MmgMbGRrVLoAQxK3EwK3EwK3EwK+V4y5KIiIhoBPCWJREREZFA2JARERERqYwNGREREZHK2JAJoL6+Xu0SKEHMShzMShzMShzMSjk2ZAJ46KGH1C6BEsSsxMGsxMGsxMGslGNDJoAlS5aoXQIliFmJg1mJg1mJg1kpx4aMiIiISGVsyIiIiIhUxoZMAJs2bVK7BEoQsxIHsxIHsxIHs1KODZkAGhoa1C6BEsSsxMGsxMGsxMGslOPWSUREREQjgFsnEREREQmEDRkRERGRytiQEREREamMDZkAVqxYoXYJlCBmJQ5mJQ5mJQ5mpRwbMgFw5WNxMCtxMCtxMCtxMCvl+JQlERER0QjgU5ZEREREAmFDRkRERKQyNmQC2LZtm9olUIKYlTiYlTiYlTiYlXJsyASwbt06tUugBDErcTArcTArcTAr5diQCWDjxo1ql0AJYlbiYFbiYFbiYFbKsSETgMFgULsEShCzEgezEgezEkc6ZyXLMqLRqNplXBQbMiIiIhq19uzZg6985S7os7ORlZWFmnET8MMf/hChUEjt0gZhQ0ZERESj0htvvIH5dXV4+d2PEP38d4Hl/42TxQvwrW8/hptuvgXBYFDtEs9gQyaA1atXq10CJYhZiYNZiYNZiSOdsvL7/bjzrq8iNvmziH13D/C5NcDCe4B7/wfSI29h+4c78fTTT6td5hlsyARQVVWldgmUIGYlDmYlDmYljnTKauPGjfB63JC/8gyQqR/8HycshFS3DD/5v+sRi8XUKfAcbMgE8I1vfEPtEihBzEoczEoczEoc6ZTV3r17kVkxFQXllfh8WRDPzXXip1c7P33BjM+ht6cb3d3d6hV5Fp3aBRAREREliyTL6A1GMOkzN2Hd5/4Pqsa7IMuADOC9nrOulAVcAIDs7Gx1Cj0HGzIiIiISWjAaR5c/jG5/CD2BCGKSjPLpcxAIBiDJMt7tzsavm43oiw7cGJRlaLa/iKsW1KGgoEDd4gcM65bl0aNHsXDhQkyePBnz58/H4cOHL/raUCiEadOmYd68ecP5yDGpqalJ7RIoQcxKHMxKHMxKHKnKSpJl2ANhHLR78JdmO9440YM93W6EYhIqTNkw63WAVouOY5/gm1/9Mn7ypwOfNmMhH/C7NZCa3sVj33o0JfUmYlgN2YMPPoiVK1fiyJEjWLNmDe67776Lvvaxxx5DXV0dMjIyhvORY9KaNWvULoESxKzEwazEwazEMZJZBaNxtPQF8GG7C68f68b7bU6cdAeRn52JeaX5uKHaBkOmFi3u/qUsFlVYsWzxPORnhIF1i6H7/mxkPPM5aB+thuad5/HMM8/gC1/4wojVO1QZsizLSr6xp6cHkydPRm9vLzQaDWRZRllZGXbu3HneUxbvv/8+fvSjH+GRRx7BN7/5TezateuC79nY2IirrroKu3fvxpw5c5SUNSq1tram1ZMrdHHMShzMShzMShzJzEqSZTiDkYFbkWG4w/1PQ1qzM1Fs1KMkV498fSaikowjvT4c7/MjS6vBNJsJVXk5Zy4AxeNxvPHGG3j55Zfh8/kwZcoU3H///Sn5MzWUvkbxDFlbWxvKysqg0fRfZMvIyEBVVdV5Yfj9fvzjP/4j/vCHP+DIkSNKP25M4w8icTArcTArcTArcQw3q2Asjm5/GN2+MHoCYUQlGXqtBsVGPSZZc1Fk1EOv7e87JFnG8b4AmhxexGVgsjUXE61G6DSDb/5ptVrcdtttuO2224ZV20gb8aH+1atXY9WqVSgtLWVDRkRERGf0XwWLossfOu8q2ASLEcVGPSzZmYPGnWRZRocvhIN2L/zROGrMBky15SJbp1XrMJJC8QxZZWUl2tvbIUkSgP7/gy50qfKDDz7A97//fdTW1uKuu+7CgQMHMGPGjEu+96233or6+vpB/9TV1WHTpk2DXrd582bU19ef9/2rVq3Chg0bBn2tsbER9fX1cDgcg77+xBNPYO3atYO+1traivr6+vOGE5977rnzViEOBAKor6/Htm3bBn29oaEBK1asOK+2O++8k8fB4+Bx8Dh4HDwOoY8jFovh1VdfxdKlf4MFCxehvKICzzzzDM6egrrYcSy77wG8+s427Oxw4Y/HuvFeWy8+sbvRuH0b5pXm4/Pji7G42oYpNhMe/+Y/4uc///mZ73UGI/jT4Vbs7OhDFiR8tsaGOSVmZOu0qufR0NCAuro6lJSUnOldHn744fO+76LkYVi8eLH8wgsvyLIsy7/73e/kurq6S77+3XfflefOnXvR/757924ZgLx79+7hlDXqPP3002qXQAliVuJgVuJgVunF7XbLddcskgHI2nFXy5j/VVlXPlUGIE+fMUOORCKDXh+XJNnuD8sHe9zyX5p75JebOuSXmzrkLS12+WO7R+4NhGVJki75mb5wVN7Z7pRfbuqQ/9LcI3f5QiN5iEkzlL5mWLcs169fj+XLl+MHP/gBzGYzXnzxRQDAAw88gPr6etx+++3nNn98ylKBQCCgdgmUIGYlDmYlDmaVXu67/wH8de9B4JtvIz7pMwCAmCwDja/g4H//LR5//HE8+S//im5/GF3+MHr8/bNgWdoMFBv0mGjNRbEhC/oEbjFG4tKggf05JWZUnzWwP5oofspyJPApSyIiovTV0tKCcePGQf7/fgJce/+Zr2sgY2JeDHN6NuOqylzUTpkGALCcfiLyArNglyLJMk6cNbA/yWq84MB+ukvJU5ZEREQ0trz99tv9c2Lz7wIgY7Ylgq/WBFCYHYcpE/CG52HvW69hWnE+Fs+bPeRBe/m8gf0cTLWZhB/YTwQbMiIiIkpIPB6HJjMTdWUZqK9yY4IpBl80A292ZOMjpx7HTrRBemwVPvfmm0NuopzBCA7YPegNRlFs1GNBuQVmfeYIHUn6YUMmAIfDAZvNpnYZlABmJQ5mJQ5mlR5ikoTJCxfjJ3/ehqLyAPa6MvH9A3nY58oEMHArcs9r0GVlYfbs2Qm/rz8awyG7F6e8IZj1OlxTYUWxUX/5bxxlxLoZO0bde++9apdACWJW4mBW4mBW6grG4jho9+CN4z1wZppgb23GmhXL8c9bPdjnysKZZuzUfmT86Qe46ytfQWFh4WXfNxKXcKDHg7ea7XAEIphTYsYN1bYx2YwBvEImhCeffFLtEihBzEoczEoczEodnnAUR51+tHqC0GoyUGs2YLzFiNn6+Vj/xKPQPDED0rw7gaKJyGjbA+zZhPHjx+PZZ5655PueO7B/sRX2xxo2ZALgE6fiYFbiYFbiYFapI8syHMEIPnH60e0PI1unwbRCE2rNBmQObFlUU1ODvbs/ws9+9jP8/MVfwrH/FVRWVuHBH/0Q999/P4xG40Xfu8MXxiG7B76Bgf0pNhNyxsDAfiLYkBEREY1xkiyj3RvCUacPfeEYzHod5paYUZGXA80Flqqw2Wx4/PHH8fjjjyf0/v0D+170BiMoNuoxf4wN7CeCDRkREdEYFZUknOwL4pjLj0AsjiJDFq6psKLIkJWUxVfPHtjPyxq7A/uJGNs3bAVx7n5klL6YlTiYlTiYVfKdHtT/8/EeHLB7YDNk4YZqGxZVFqDYqFfcjJ3O6kID+5+tGbsD+4lgQyaAxsZGtUugBDErcTArcTCr5PGEo/iosw9/Pt6DE30B1JgNuHlcEeaW5iM/e/i3EPfs3YvjLj82N/e//2RrLpaMK0SN2TAqtztKJm6dRERENIrJsgx7IIKjrv5B/RydBhMsRtScNaifjM84e2C/emCF/bE+sM+tk4iIiMa4oQ7qK3X2wH6RQY/5ZRaYk3C1baxhQ0ZERDSKRCUJLX0BHHMFEBwY1F9UYUVhkgb1T+PAfnKxISMiIhoFgrE4jrv8aO4LICbJqMzLwUSLMelXqyJxCZ84fTjm8iNTo8GcYjOqzTmcERsmDvULoL6+Xu0SKEHMShzMShzM6tLclxjUT2YzJsnymYH9467+gf2bxxWiJv/TgX1mpRyvkAngoYceUrsEShCzEgezEgezOt+FBvWnF5qSOqh/9md1+sI4mMDAPrNSjg2ZAJYsWaJ2CZQgZiUOZiUOZvWp04P6nzh9cJ8e1C/NR4UpO6mD+qcNHtjPuuzAPrNSjg0ZERFRmjt/UF+PRRV5SR/UPy0wMLDfxoH9lGFDRkRElKaC0TiO9yVvUL+zsxPNzc2wWCy44oorzmvmonEJR84a2J9dbEYNB/ZTgkP9Ati0aZPaJVCCmJU4mJU4xmJWZwb1T/QP6tfmD29Q/+jRo6j/whdRXlGBa665BlOnTsW0GTPx6quvAvh0YP/NgYH9SQMD+7X5Q1thfyxmlSxsyATQ0NCgdgmUIGYlDmYljrGSlSzL6PGH8cEpJ95uccAeCGN6oQmfG1eE6YV5MGQqW/X+2LFjmL/wGvzpwwOQ73oOeKIR+MZraEIpli5dil+99kf8pdmOfT0elOZmY0ltIabaTNBpht4ijJWsRgK3TiIiIlLRhQb1J1pzkzao/6UvfRmb3vsI8X/aAeQWnPn6+Nwolhn2YNoV41Cg12JWCVfYTzZunURERJTmPh3U9yMYk1Bs1GNGYXIH9R0OB17d9CqkL//bmWasUB/HV2sDuLYojFZPDf7la3fj71f8La5bvjwpn0nKsCEjIiJKoQsO6luNMOuTf3Wqra0NUjwOjLsauToJSysDqK8IwRsFfvpJLt7p0kN78AhOnDiR9M+moWFDRkRElALucBRHnX60eYLQajIwLt+A8flG5CicDUtEQUEBsrJz8PnaOO642gUNgDc79fj1CSMCkgYIegBfLwoKCi77XjSyONQvgBUrVqhdAiWIWYmDWYlD5KxOD+pva7vwoP5INmOSLCOeZ8N/vvNXfKWuGlu7srBqlwX/dczU34wBwNb/BOJRfPnLX07KZ4qcldp4hUwAXPlYHMxKHMxKHCJmJckyTnlDOHrWoP680nyUj9CK+mc7vdXRIYcH3kgcliwdHvz8dei2Xgn5i98HSqcAfhewdT0yfv89rFr1dygrK0vKZ4uYVbrgU5ZERERJEo1LaHEPHtSfaDGO2Ir653IEIjho98AZiqLIkIVphXmwZGfi1Vdfxf0ProTT3gOdyYp4wAOtJgMPrVqFH/3oR9BqR+5K3VjGpyyJiIhSKBiN45jLj2Z3APERHtS/EE84ioN2L7r8YZj15291dMcdd+Dzn/88fv/73+P48ePIz8/HF7/4RRQXF6ekPro8NmREREQKuUNRHHX1D+rrUjSof7ZANI7DDi9OeoIwZmoxb2Cj8QtdjcvKysKXvvSllNRFQ8ehfgFs27ZN7RIoQcxKHMxKHOmW1aBB/ZOfDurfMn7kB/VPi8QlHOjxYHNzD7r8YcwsysNNtYWozFN338l0y0okbMgEsG7dOrVLoAQxK3EwK3GkS1aSLKPVHcCWkw5sO+VEOB7HvNJ83DyuCBOtuchUsNXQUMUlGZ/0+vDmwB6Xk6y5WDKuEOMtxhF/WCAR6ZKViHjLUgAbN25UuwRKELMSB7MSh9pZXWhQP9kr6l+OJMto9QTxscOLcExCbb4BVxTkIluXXsP4amclMjZkAjAYDGqXQAliVuJgVuJQK6tANI7jKg7qAwNLWPjDOGT3whuJocKUjak2E3Kz0vOvb55XyqVnokRERCrpC0Vx7NxBfYsROSm+GtUbiOCgw4PeYBSFhizMLS2AJTsrpTVQ6rAhIyKiMU+WZfQEIjjq9KEnEEGOTosZhXmozs9JyWzY2TzhKA45vOj0fbqERVEKb4+SOjjUL4DVq1erXQIliFmJg1mJYySzOntQ/4NTToTj0sCgfiEmWI0pbcYC0Th2d/XhLy0OuMMxzCvNxw3VNhQb9cI0YzyvlOMVMgFUVVWpXQIliFmJg1mJYySyisYlNLsDOK7ioP5pkbiET5w+HHP5odNocGVRHmrNBmg1YjRhZ+N5pRy3TiIiojHj3EH9qrwcTEjxoP5pcUnG8T4/jvT6IMnARKsREy1GZGp582q04NZJREREZ0mXQX2gf17t9BIWoTRewoJSiw0ZERGNSuk0qH+6nq6BJSw8kRjKTdmYlsZLWFBq8bqoAJqamtQugRLErMTBrMQx1KzOHdSPqDiof1pvMIL32nqxo90FvU6DxVUFmF9mGXXNGM8r5diQCWDNmjVql0AJYlbiYFbiSDSr6MBw/J9P9OCjLjeydVp8ptKK66ttqMzLUWVrIU84ih3tTmxt7UVMknFNhRWLKqyw5ozO9cR4Xik3ulrzUer5559XuwRKELMSB7MSx+WyutCg/kSrEXkqDOqfFozGcbjXixZ3EIZMLeaW5qPSlC3M8hVK8bxSjg2ZAPgYsTiYlTiYlTgullVfKIqjLj9OpcGg/mmDl7DIEHoJCyV4XinHhoyIiIRx7qC+QafFjKI8VJvVGdQ/LS7JONHnR9OZJSxyMYlLWNAQsCEjIqK0J8kyTnmCOOrywx2OIV+vw7zSfJSbslWZDTvt3CUsaswGXGHLVfUqHYmJrbsA1q5dq3YJlCBmJQ5mJYZoXML6l19Pq0F9oL8R6/SF8HaLA7u73LBmZ+HG2kLMLjGP6WaM55VyvEImgEAgoHYJlCBmJQ5mld7OHtQvmDILxUY9JlrUHdQ/zRmM4KDdC0cwAltOFhZXFYzapyaHiueVctw6iYiI0kZfKIqjTh9OeUPQaTJQmwaD+qd5wzEccnjQ4QsjL0uH6YUmoTb+ptTj1klERJQWgsEgZFmGwWC46GsuNqhfY86BTsVB/dOCsTgOO7w46Q4iW6fF3BIzKvNy2IhRUqn/J52IiEYVWZbxm9/8BvPmL4DBYIDRaMTMOVfhF7/4Bc6+KSPJMk66A3i75fSK+jKuLs3HknGFmGAxqt6MReISDto92HyiBx3eEKYXmrCkthBVZgObMUo6XiETgMPhgM1mU7sMSgCzEgezGjnf/va38fTTT0Mz9Ubgnv8ENBoc3P0yli1bhl27duHf/v0ZtLiDONbnRygmocSox8ziPNhysi7Y6KQ6q9NLWBzp9SEuy5hgMWKSNZdLWCSA55Vy/NMlgHvvvVftEihBzEoczGpkfPDBB3j66aeBLz0N6eE/AYuWAwvvgfSN12D7+gZ4jVa8frQTH/d6UWzU48YaGxZWWFFouPgsVqqykgeu2G1utuOg3YsyUw6WjCvCtMI8NmMJ4nmlHK+QCeDJJ59UuwRKELMSB7MaGT/96c+gK56A2I0Pn/larTGG2yuCWPSZzyHo82L/u2/h0QfuSXhQf6SzkmUZ3f4wDtq98ERiKMvNxjSbFSY9/4ocKp5XyvFPmwD4xKk4mJU4mNXIaNy3H7EpNwEaDYqz41gz1YOa3Di6Qxq8cNyILev/A7YDv8WTX1+R8HuOZFZcwiK5eF4px4aMiIiSxpCTg6yIB1+s9uOOyiB80Qz8utmATW05kJABuLphyMlRu0x4IzEcsnvR4QshL0uHheUWLmFBqmJDRkRESXPP11chq3oyrGUB/P6UAS+3GhCWBpqcgBvaxpfxpYcfUq2+YCyOJocPLe4AsnVaXFViRhWXsKA0wClFAWzYsEHtEihBzEoczCq5/JEYtp9yovKam9Db2Y5vPrgK/7uz49NmzNEMzU/vQI4uAytXrhzSeycjq2hcwiG7F5tP2NHuDZ5ZwqKaS1gkFc8r5diQCaCxsVHtEihBzEoczCo54pKMww4v3mqxoy8cxdVl+fjc1BpEjv0VeHwadE/VQff0NcBjVyDfeQRvvvEnVFZWDukzhpNVXJJxzOnHm809OObyYbzFgCXjijDRmgutho1YsvG8Uo5bJxERkSJdvhD29XgQiMYx0WrEFQW5ZxZzDQaD+N3vfod33nkHsizjM5/5DO66665LrtifTLIso80TxMcOHwKxOGrMOZhSYEJOpvpbMNHYwa2TiIhoxASiMezv6d/TsdCQhbpyy3mbfufk5OCee+7BPffck9LaZFlGdyCMQ3Yv3OEYynL1WGg7vz6idDPsW5ZHjx7FwoULMXnyZMyfPx+HDx8+7zVbtmzBggULMG3aNMyYMQPf+c53hvuxRESUYnFJRlOvD2812+EMRjGvNB+LKqxp0+w4gxFsO+XE9lMu6DQZuK6qAAvK06c+oksZ9hWyBx98ECtXrsQ999yDl19+Gffddx+2b98+6DVWqxUbN25ETU0NwuEwbrzxRjQ0NOCuu+4a7scTEVEKdPvD2Nfthj8axwSLEVfYcpGZBht/A4AvEsMhhxft3v4lLOrKLSjhEhYkmGGdTT09PdizZw/uvvtuAMDSpUvR3NyM1tbWQa+bNWsWampqAAB6vR4zZ85Ec3PzcD56TKmvr1e7BEoQsxIHs0pMIBrHznYXPjjlRLZOixtqbJhRlJfSZuxiWYVicezpdg9csYvgqhIzPltjQ2luNpsxlfC8Um5YV8ja2tpQVlYGzcCJmZGRgaqqKrS2tqKqquqC39PV1YWXX34Zb7zxxnA+ekx56CH11uyhoWFW4mBWlybJMo46/Wjq9UGnycDc0nxUmtRpdM7NKhqXcNTlx1GnH5oMYFqhCePzjXxqMg3wvFIupUP9Ho8Ht99+Ox599FHMmjUrlR8ttCVLlqhdAiWIWYmDWV1cjz+MfT1u+CJxjLcYMaUgV9XNtU9nFZdkNLsDaOr1ISZJmGAxYpI1F1nc+Dtt8LxSblh/iisrK9He3g5JkgD0P91ysatjXq8Xt9xyC+644w48/PDD5/33s916662or68f9E9dXR02bdo06HWbN2++4OXRVatWnbc4XWNjI+rr6+FwOAZ9/YknnsDatWsHfa21tRX19fVoamoa9PXnnnsOq1evHvS1QCCA+vp6bNu2bdDXGxoasGLF+Xu13XnnnTwOHgePg8eRlscRjMbx1w4Xtp1yIkurwRs/WYsT27cMasbUOo5WTxBvtdixv8eDomwtNv7zo+g7sn9QMzba8uBxiHUcDQ0NqKurQ0lJyZne5XL9ztmGvQ7Z9ddfj+XLl2PZsmV46aWX8OMf//i8oX6fz4ebb74Zt9xyCx5//PGLvhfXISMiSj1JlnHM5UeTwwetJgPTC01psZ2QLMvoCURw0O6BOxxDaa4e02wmPjVJwhhKXzPs67zr16/H+vXrMXnyZKxbt+5MJ/vAAw/g9ddfBwA8++yz2LVrF1555RXMnj0bs2fPxlNPPTXcjx4zzv1NgtIXsxIHs+pnD4TxdosDB+1eVJtzcFOabCfkCvUvYfHBKSfcLheuqyxAHZewSHs8r5TjSv0CuPPOO/Gb3/xG7TIoAcxKHGM9q2AsjoM9HrR5Q7BmZ2JWsRn52eo3O2cvYWHK0mFaoQn/eN+yMZ2VSMb6eXWuofQ1bMiIiMYQSZZx3OXH4V4fNBn9tyer0+D2ZCgWR1OvD819Aeh1Gky19d821XD5ChIYt04iIqLzOAIR7O12wxOJYVy+AVNtJtWfUIxKEo46z1rCwmbCeAuXsKCxhw0ZEdEoF4rFcdDuRasnCEt2Jq6vtsGi8u1JSZbR3Ne/hEWUS1gQsSEjIhqtJFnGib4APnZ4ockAZhebUWNW9/akLMs45Q3hY4cX/mgc1eYcTCkwwZCpVa0monTAX0UEcKH1Tyg9MStxjPaseoMRvHPSgf09HlSacnBTbRFq89V9erLbH8aWkw7s6uxDnl6HG2tsuKok/7LN2GjPajRhVsrxCpkAuPKxOJiVOEZrVqFYHIfsXpz0BJGfnYnFVQWw5mSpWpMrFMUhuwc9gQis2Zm4trIANkPiNY3WrEYjZqUcn7IkIhoF5LNuTwL9+zvWqryemC8Sw8cOL055QzBlaTHNlofSXL3qT3QSpQqfsiQiGkOcwf6nJ/vCMdSYczDNlge9Tr2JlHOXsJhTbEaVmUtYEF0KGzIiIkGFYxIOOTxocQdh1utUvz0ZlSQcG1jCIiMDmDqwhIWOS1gQXRaH+gVw7kanlL6YlThEzqr/9qQfm5t70O4NYWZRHm6otqnWjJ1ebHbzCTuOOH2ozTfg5nFFmFyQm5RmTOSsxhpmpRwbMgGsW7dO7RIoQcxKHKJm5QxG8E5rL/Z2e1Cam42bagsx3mJUZS5LlmWc8gTxVrMd+3o8KDbqsaS2CDOK8pK6npioWY1FzEo53rIUwMaNG9UugRLErMQhWlbhuISP7V40uwMw63W4rrIABUN4UjHZevxhHLR70ReOosSox4JyC8wjtPG3aFmNZcxKOTZkAjAYDGqXQAliVuIQJStZltHiDuKQwwNJBmYW5aE236DagHxfKIqDw1jCQglRsiJmNRxsyIiI0pQrFMXebjdcoSiq8nKTTz14AAAgAElEQVQwvdCEbJ06K9r7B5awaBtYwmJBmYVLWBAlERsyIqI0E4lL+NjhxYm+APKydLi20gqbQa9KLeGBJSxODCxhMbvYjGouYUGUdBzqF8Dq1avVLoESxKzEkY5Z9d+eDGBzsx2tniCuLMzDDTU2VZqxmCThsMOLN0/01zLVZsKSge2XUt2MpWNWdGHMSjleIRNAVVWV2iVQgpiVONItq76B25POUBSVpmxML8pDjgq3JyVZRnNfAE29PkQlCePzjZhUkAt9Ep+aHKp0y4oujlkpx62TiIhUFIn3X4k63heAKUuHWcV5KFThipgsy2j3hnDI4YU/GkdVXg6m2nJhyOTv7URKceskIqI0J8syWj1BHLR7EZdkzCjsX9VejdmsHn8YBx1e9IVGfgkLIrowNmRERCnmDkWxt8eN3mAUFaZszCjMQ05mcm9PhkIh7N69G5FIBDNmzIDNZjvvNf1LWHjREwjDkp2Jz1RaVbk6R0Qc6hdCU1OT2iVQgpiVONTIKhqXsL/Hgy0nHYjEJSyqsOLqMktSm7F4PI5//ud/RmlFJRYtWoQbbrgBpeXlWLZ8OZxOJ4D+JSx2dbiw5aQDgWgM88vysbiqIG2bMZ5X4mBWyrEhE8CaNWvULoESxKzEkcqsZFlGmyeIzc12NPcFMM1mwmdrClFkTG4DJMsy7r//fjzx5JPom/kV4LGdwPcPIFb/ffz6lddxc/0X8dEpBzY322EPRDC72IwbawtRbspJ6/XEeF6Jg1kpx1uWAnj++efVLoESxKzEkaqsPOEo9nZ74AhGUJ6bjRlFeTAk+fbkaTt37sQLL7wA3POfwKLlZ76uL5uE2/7PUnxxnIzmPj9mlBZggsUAnUaM38l5XomDWSnHhkwAfIxYHMxKHCOdVVSS0OTw4ZjLD2OmFtdUWFGc5Cti5/r5z38OXVEtYgvvAQBoMyTcWBLCl6uDyNXl4s9vvYddL/wIBxt3jWgdycbzShzMSjk2ZERESXR6+Yj9dg+icQlTbSZMsBih1Yz8LcHmlpOIVcwCNBpMNEWxZqoHliwZW3v02NhigH1HJzIP7R/xOoho6NiQEREliSccxb4eD+yBCMpy9biyKC+l63gVFdpgbD2OO8f58LnyEFp8Wjx/xIh9fQObf/cch6Xg/KctiUh9YgwQjHFr165VuwRKELMSRzKzikkSDto9eLvFgUA0joXlFiwot6Z8UdWvPPB1/NvPnsdniwN48YQRj+7J/7QZ8/RAu/NXWP63d6e0pmTgeSUOZqUcr5AJIBAIqF0CJYhZiSMZWcmyjA5fCPt7PAjHJUyx5WKiJTcltyfPForFsb/Hg2jpePgP7cOTX1uGrrq/B67+CpCZDRzaDN0rj8Js1OMf/uEfUlpbMvC8EgezUo5bJxERKeCNxLCv242eQASluXpcWZgHY1Zqf8eVZRknPUEc6PEgIyMDVxaaYEYU9z/wNbz80u+ADA2g0UKORXDl7Dn4bcP/YvLkySmtkWgs49ZJREQjJCZJaOr14ajTj5xMLerKLSjNzU55Hb5IDHu63bAHIqjKy8GMwjzodf1TKL/77W/Q3Pw0Nm/ejEgkgnnz5mH+/PlpvdYY0VjHhoyIKAH9tyfDA7cn47iiIBeTrKm/PSnJMo46/Tjc60W27uLLadTW1uLBBx9MaW1EpBwbMgE4HI4L7kNH6YdZiWMoWfkiMezr8aDbH0axUY+ZRVbkpvj2JAC4QhE0drnhDscw0WLEFFuuMIu7DgfPK3EwK+VG/5k8Ctx7771ql0AJYlbiSCSrmCTjkMOLv7TY4Q3HsKDMgoXllpQ3YzGpfw/Md072AgCur7ZhRlHemGjGAJ5XImFWyvEKmQCefPJJtUugBDErcVwqK1mW0envvz0ZisUx0ZqLydZc6FJ8exIAuv1h7Ol2IxSLY7rNhAlWIzRjbBaM55U4mJVybMgEwCdOxcGsxHGxrHyRGPb3eNDlD6PIoMeiCnVuT4YHlrJo84ZQaMhSrY50wPNKHMxKubF5dhMRnSMuyTji9OETpw96rQbzy/JRlpud8icTZVlGmyeI/XYPZBm4qsSMqrwcPiFJNMqxISOiMa9zYHHXQDSOiVYjrihQZ1jeP7CURU8gggpTNq4sykO2TpvyOogo9cbGRKjgNmzYoHYJlCBmJY4NGzbAH41hR7sTO9pdMGZqcWNtIaYXpn5Yvn8pCx/+0uKAN9K/9dLVZRY2YwN4XomDWSnHhkwAjY2NapdACWJWYohLMpxaA95qtsMViuLqsnxcU2GFSYUZrb5QFO+e7MUBuxc1+Tm4qdaGEhUWmk1nPK/EwayU49ZJRDSmdPlD2Net/u3JmCSjqdeLo04/TFk6zCkxw5qTlfI6iGjkcOskIqJzBKL9Ty12+PqfWqwrtyBPn6lKLT0DS1kEY3FMsZkwaQwuZUFEg7EhI6JRLS7JOObyo6nXi0yNBvNK81FhSv3TkwAQjks40ONBqycIW04WFqp0m5SI0g9/EhDRqNXtD2Nftxv+aBwTLEZcYctFpgq3J2VZxilv/5OckixjdrEZNWYuZUFEn+JQvwDq6+vVLoESxKzSQyAax84OFz445US2Tosbavq3Gjq7GUtVVoFoHNvbXdjV2QdbThZurC1Ebb6BzdgQ8LwSB7NSjlfIBPDQQw+pXQIliFmpS5JlHHP6cbjXB50mA3NL81F5kduTI52VLMs43hfAIbsXmdoMLCi3oIxPTyrC80oczEo5NmQCWLJkidolUIKYlXp6/GHs63HDF4ljvMWIKQW5yNRe/CbASGblDkfR2OWGKxTFuHwDptlMl6yFLo3nlTiYlXJsyIhIaMFoHAfsHpzyhlCQk4kbqi0wZ6vz9GR8YCmLT5x+5GbpcF1VAQq4lAURJYANGREJSZJlHHf5cdjhg1aTofqej/ZAGHu63AjE4riiIBeTrLnQajgnRkSJ4TV0AWzatEntEihBzCo17IEw3m5x4IDdi2pzDm6qLUS1eWiD8snKKhKX0NjVh/fbnNDrNLih2oYpNhObsSTieSUOZqUcGzIBNDQ0qF0CJYhZjaxgLI5dHS683+ZEpiYDN1TbMLPYjCwF81nDzUqWZbR7g3ir2Y5T3hBmFefh2soC1RabHc14XomDWSnHrZOIKO1JsowTrgA+7vVCk5GB6YUmVKt4ezIQjWNfjxudvjBKc/WYVWRGTiY3Aieiwbh1EhGNGo5ABHu73fBEYhiXb8BUm0nRFbFkkGUZJ/oCOOTwQpuRgfll+Sg35ahSCxGNLmzIiCgthWJxHLR70eoJwpKdieurbbCo9PQkAHgGlrJwhqKoMRswvVC9xpCIRh82ZESUViRZRnNfAB87vMjIgOrbDMUlGUecPhzp9cGYqcW1lVbYDHpVaiGi0Yu/3glgxYoVapdACWJWw9MbjOCdkw7s6/Gg3JSDm2qLRmyboUSy6g1EsOWkA0d6fZhUkIvP1hSyGVMBzytxMCvleIVMAFz5WBzMSplQLI5Ddi9OeoLIz87E4qoCWEd4QdVLZRWNSzho96LZHYAlOxM31Nhg5tOTquF5JQ5mpRyfsiQi1cgDtycPObwAgGmFJtQOcT2xZOvwhrC3x41YXMa0QhPGcSNwIlKIT1kSUdpzBvufnuwLx1BtzsF0Wx70OvWmKIKxOPZ1e9DhC6HEqMesYjMMXMqCiFKEDRkRpVQ4JuGQw4MWdxBmvS4ltycvRZZltLiDOGj3QJORgatL81FuyuZVMSJKKQ71C2Dbtm1ql0AJYlYXd/r25FvNPWj3hjCzKA83VNtUa8a2bdsGbySG99uc2NPtRpkpGzfVFqJCxQVn6cJ4XomDWSnHhkwA69atU7sEStBYzWrv3r34u7/7O1x3/Q24/fZ6/OIXv0AoFDrz353BCN5t7cWebjdKcvsbn/EWo2qNjyTL+PPug3i7xY5gLI5FFVZcVZLPdcXS1Fg9r0TErJTjUL8AAoEADAaD2mVQAsZaVrIs47HHHsNTTz0FnbUcsfHXQOPpgnTkPYyfOBmb39oMt96MZncAZr0Os4rMKDCod3sS6G8OG7vc8EZimGg1YkoBNwJPd2PtvBIZsxosZUP9R48exbJly9Db24v8/Hy88MILmDJlynmv27BhA9auXQtJkvDZz34WP/3pT6HVclg2UfzDLY6xltWLL76Ip556CrjjXxBb8gig1UECkNF+EONafo7tPQHk5WdhZlEeavMN0Kh4KzAqSfjY7sXxvgDyB1b+z1dx5X9K3Fg7r0TGrJQb1vX5Bx98ECtXrsSRI0ewZs0a3Hfffee9prm5Gd/97nfxwQcf4NixY+jq6sKGDRuG87FElAZkWcbT636EjFm3A59bA2j7f7+rzY3hB5+vwMp/+jb+umUzDO1HMN5iVLUZ6/SF8JdmO1rcQcwoNGFxVQGbMSJKK4obsp6eHuzZswd33303AGDp0qVobm5Ga2vroNe99NJLWLp0KQoLCwEAK1euRENDwzBKJqJ00NnZiSOHD0Fe0P8zQJch4/HpfVg3uw96rYzH9+bhZz/8ITb/6Y+q1RiKxfHXDhd2tLtgysrEjbU2TLTmqtocEhFdiOKGrK2tDWVlZdBo+t8iIyMDVVVV5zVkbW1tqKqqOvO/q6urz3sNXdrq1avVLoESNJayisVi/f+SmQOTTsITV7oxwxLDH05lY3VjPj72ZCEjM/vT16VQ/1IWAbzVbEdPIIK5pfm4psICY+anUxpjKSvRMStxMCvluA6ZAM5uaCm9jaWsysrKUFRaBl3nB/j2vVfDoJXx+D4zjngGbgV2HEK06xjmz5+f0rp8kRj2dLthD0RQlZeDGYUXXnB2LGUlOmYlDmalnOIrZJWVlWhvb4ckSQD6fyNtbW09L4yqqiqcPHnyzP9uaWm5bGC33nor6uvrB/1TV1eHTZs2DXrd5s2bUV9ff973r1q16rw5tcbGRtTX18PhcAz6+hNPPIG1a9cO+lprayvq6+vR1NQ06OvPPffced1/IBBAfX39eWuvNDQ0XHCT1TvvvHPIx/GNb3xjVBzH2UbrcZzOSvTjOO1Sx3Hs2DE8+sT38dTq5YgF/fjW3vxPm7GQF5pfP4TCklL88pe/TMlxSLKMLQeO4E+ftMMbiuCaCivmluZDr9Nc8Di+8IUvjKo8RvNxnHtXRdTjGC15XOo4zv77SuTjOFuix9HQ0IC6ujqUlJSc6V0efvjh877vYoa17MX111+P5cuXY9myZXjppZfw4x//GNu3bx/0mubmZixatAh79uxBYWEhvvCFL+C2227D1772tfPej8teEImjpS+APd1utB05hH+6+28Qql0EadK1gLsLup2/hl4O4603/4y6uroRr8UV6l/Kwh2OYaLFiCm2XOg0XFOMiNQ1lL5mWD+x1q9fj/Xr12Py5MlYt27dmS72gQcewB/+8AcAQG1tLb73ve/hmmuuwYQJE1BSUnLBpzGJSAyyLOOg3YPGbjdqzAY8eMu1+I9//zFmZtph+PO/oujAb/F3y+/C/r17RrwZi0kS9vd48M7JXgDA9dU2zCjKYzNGRMLhwrACaGpqwhVXXKF2GZSA0Z5VTJLwUWcfOnxhXFmYh/EWg2qr7Xf7w9jT7UYoFsdUmwkThri0xmjPajRhVuJgVoOl7AoZpcaaNWvULoESNJqzCsbieK/ViW5/BHXlFkywqrP1UTgWx64OFz445YQxU4sbawoxScFSFqM5q9GGWYmDWSnHpywF8Pzzz6tdAiVotGbVF4pie7sTGQCuU2lRVVmW0eYJYr/dA8jAVSVmVA1jI/DRmtVoxKzEwayUY0MmAD5GLI7RmFWnL4S/dvTBlKVDXYUFObrUb3vmH1jKoicQQYUpG1cW5SF7mHWMxqxGK2YlDmalHBsyIrogWZZxzOXHAbsXZbl6zC3NT/mwvCTLOO7y42OHD1laDRaWW1CSm53SGoiIUoENGRGdR5Jl7Ov2oNkdwCSrEdNsppTPi/WFomjscqMvHMV4iwHTbCY+PUlEoxZ/ugng3IXuKH2NhqwicQnbTznR4g5gTokZ0wvzUtqMxaT+ZTXeOemAJMtYXFWAmUXmpDdjoyGrsYJZiYNZKccrZAIIBAJql0AJEj0rfySG7e0uhGJxLKq0otCgT+nn9wwsZRGMxTHFZsIk69CWshgK0bMaS5iVOJiVclyHjIgAAL2BCHZ0uJCpycDCCitMWan7fS0cl3Cgx4NWTxC2nCzMLjGn9POJiEbCUPoa/sQjIrR5gtjd1Qdrdhbml1ug16ZmmkGWZZzyhrC/xwNJljG72Iwas/KlLIiIRMWGjGgMk2UZh3t9aOr1oSovB7OLzdBqUtMMBaJx7Ol2o9sfRrkpGzOTsJQFEZGoONQvgHN3tKf0JVJWcUnGrs4+NPX6MM1mwlUlqWnGTi+n8VazHe5wFAvKLZhfZkl5MyZSVmMdsxIHs1KODZkA7r33XrVLoASJklUoFsf7bb3o8IVwdVk+JhfkpuQ2oTsUxbutvdjf40G1OQc31RSiTKV1xUTJipiVSJiVcrxlKYAnn3xS7RIoQSJk5QlHsb3dhbgk49rKAlhzskb8M+OSjKZeLz5x+pGbpcN1VQUoSMHnXooIWVE/ZiUOZqUcGzIB8IlTcaR7Vt3+MHZ2uGDQaXFttRWGzJH/EWAPhLGny41ALI4rCnIxyZqbsjm1S0n3rOhTzEoczEo5NmREY8SJPj/2dXtQZNTj6tJ8ZI7wk5SRuISDdg9a3EEU5GRiQbkFefrUb0pORCQCNmREo5wsyzhg9+KYy4/x+QbMKMobscVWT39ehy+Evd0exGUZs4rzUGs2cCkLIqJL4FC/ADZs2KB2CZSgdMsqKknY0e7CMZcfM4vyMLPYPKLNWCAax4cdLuzs6IM1JxM31RRiXL4xLZuxdMuKLo5ZiYNZKceGTACNjY1ql0AJSqesAtE43mvthSMYwcIKC8ZbjCP2WbIs47jLj7+02OEKRjG/LB915VbkZKbvumLplBVdGrMSB7NSjlsnEY1CrlAEO065oMnIQF2FBeYRnN3yhKNo7HLDGYqi1mzAtEITslK00j8RUTrj1klEY1i7N4iPOvuQp89EXfnILbgal2QccfpwpNcHY5YW11ZaYUvxZuRERKMFGzKiUUKWZXzi9OOQw4tyUzbmluSP2PISjkAEe7rd8EVimFSQiyvSZCkLIiJRsSEjGgUkWcaebjdOuoOYXJCLqSO08n40LuGg3YtmdwDW7EzcUGMb0duhRERjBQc9BFBfX692CZQgNbKKxCVsa3OizRPE3BIzptlMI9KMdXhDeKvFjjZPEDOL8nBdVYHQzRjPK3EwK3EwK+V4hUwADz30kNolUIJSnZUvEsP2U05EJAmLKgpgMyR/O6JgLI593R50+EIoMeoxq9gMQxo/PZkonlfiYFbiYFbKsSETwJIlS9QugRKUyqzsgTB2truQpdNgcZUNuVnJPZ1lWUaLO4iDdg80GRm4ujQf5abstFxTTAmeV+JgVuJgVsqxISMS0El3AI1dbtgMWZhfZkn6MhPeSAyNXW70BiOoNudgRmEel7IgIhpBbMiIBCLLMj52eHHE6UeNOQezkrzyviTLONLrwxGnDzk6LRZVWFFk5FIWREQjjb/yCmDTpk1ql0AJGsmsYpKMv3b04YjTj+mFJsxOcjPmDEawpcWBpl4fJliMuLGmcFQ3YzyvxMGsxMGslGNDJoCGhga1S6AEjVRWoVgc77f1ossfxoIyCyZZk7esRVSSsK/bjXdbe6HRZOD6ahumF+aN+nXFeF6Jg1mJg1kpx62TiNKcOxTF9nYnZAB15VZYspO31ESnL4S93W5E4jKm2nIxwZKeG4ETEYmIWycRjRJdvhD+2tEHY5YWC5O4WXcoFse+Hg/avSEUG/WYVZwHYyZ/HBARqYU/gYnS1HGXH/t6PCjN1WNeaT50muFPGMiyjJOeIA70eJCRkYF5pfmoGEVLWRARiYoNGVGakWQZ+3s8ONEXwESLEdMLk7Pyvi8Sw55uN+yBCKry+pey0Os4RkpElA7401gAK1asULsEStBws4rGJexod6G5L4DZxWbMKMobdjN2eimLv7TY4Y/GcU2FFXNL88d8M8bzShzMShzMSjleIRMAVz4Wx3Cy8kdj2HHKhWCsv2lKxpITzmAEe7rdcIdjmGgxYootNym3PkcDnlfiYFbiYFbK8SlLojTgDEawo90FnSYDdeUW5F1m025JkvDmm2/if/7nBbSeakdZSTGWLbsHt912G7RaLWKShI8dPhxz+WHW6zCnJD+pT2cSEdHl8SlLIoGc8gTxUVcfLNmZWFBmgV536ScpQ6EQ/uZLX8af/vg6tFVXIl5+JbR7m/Dqq1/EtYuvx4u/ewVN7ghC8TimF5owwWJM6gKyRESUfGzIiFQiyzKaen043OtDpSkbc0ryE1qMdfXq1fjzW38BVr2C+JWfBzIyEAeQ17wVc2zH0dgbRKEhC4uKrUnfcJyIiEYGh0kEsG3bNrVLoAQlmlVckvFRlxuHe32YUpCLuaWJNWMulwv/9d8bIN3yKDDzNiAjA4CM64pCePar0zHr+pvxk28/gvHaCJuxy+B5JQ5mJQ5mpRwbMgGsW7dO7RIoQYlkFY5J2HaqF+3eIOaV5mOKLfFlLT744AOEQ0FgwVcBAJbMOP5jrgt/f4UP+1xZ+Psd2djyykZs3frucA5jTOB5JQ5mJQ5mpRx/hRbAxo0b1S6BEnS5rLzhGLa3OxGTZHymsgAFOVlDev94PN7/L7psVBtj+KdpHpgzJfzwkAkf9uoBKQAAiMViiuofS3heiYNZiYNZKceGTAAGg0HtEihBl8qqxx/Gzg4XcnRaLKq2KtqqaO7cudBotZgb/Ah/P6sOHQEtvr3XAmdk4EGAvZsAAPPnz1dU/1jC80oczEoczEo5NmREKdDcF8DebjcKDVmYX2ZBplbZtEBZWRke+/efYtaSOmxvC+P5k2UISwO3O+0noNv0OBYvuRmTJk1KYvVERDTS2JARjSBZlnHQ7sVRlx/j8g24sihP8RIUcUlGY7cbs5bcji2//SX+7798F/FZXwQqrgQ6D0Oz+yVUVFbgxf/5eZKPgoiIRhqH+gWwevVqtUugBJ2dVUyS8GGHC0ddflxZlIeZw2jGQrE43m/rfxDg6tJ8PPXw17HuqR9gsu8QTFt+hAnO3fjX7z2Bxl1/RVlZWbIOZ1TjeSUOZiUOZqUcr5AJoKqqSu0SKEGnswpG49jR7oQvEkdduQWludmK37MvFMWOdidkANdVFcCS3f8gwCOPPIJHHnkkGWWPSTyvxMGsxMGslOPWSURJ5hpooDIA1JVbkT+MLYvavUF81OmGSa9DXZkFOZmXXsWfiIjSB7dOIlJJhzeEXZ19/Q1UuQU5l9kG6WJkWcYRpw8fO3woN2XjqpJ86BJYOJaIiMTEhowoCWRZxjGXHwfsXpTlZmNuqfIGKi7J2N3Vh1PeEKYU5OKKgtyEF44lIiIxcahfAE1NTWqXQJcgyTL2dLtxwO5FgRzC/DLlzVgwFsd7bb3o9IVwddnQVvGnoeF5JQ5mJQ5mpRwbMgGsWbNG7RLoIiJxCR+ccuKkO4g5JWb825p/UNxAuUJRvHPSgWAsjmurbKgw5SS5WjobzytxMCtxMCvleMtSAM8//7zaJdAF+CIx7Gh3IhSTsKjSikKDXnFW/cP7fcjTZ2LBMGbPKHE8r8TBrMTBrJRjQyYAPkacfhyBCD7scCJLo8HiahtMWf2n0lCzkmUZTb0+HO71oWJgeF/L4f2U4HklDmYlDmalHBsyoiFqdQfQ2O2GNTsLC8otyFK4DVJsYHi/3RvCVFsuJls5vE9ENFaxISNKkCzLONzrQ1OvD1V5OZhTYla88n4wGseODhe84Rjml+WjnPNiRERjGof6BbB27Vq1Sxjz4pKMXZ19aOr1YZrNhKsu0owlkpUzGME7Jx0Ix+K4rqqAzZhKeF6Jg1mJg1kpxytkAggEAmqXMKaFYnF82O6COxy97NWsy2V1yhPER119MOszUVduQTaH91XD80oczEoczEo5bp1EdAnucBQ7TrkQl2XUlVtgzclS9D5n3+6sNGVjDof3iYhGPW6dRJQE3f4wdna4YMzU4tryAhgU7iMZk2Ts7uxDuy+EaTYTJlmNHN4nIqJB2JARXcBxlx/7ezwoNuoxrywfmRpl45aBaBwftjvhjcSxoMyCMlN2kislIqLRgEP9AnA4HGqXMGbIsox9PW7s6/FgvMWIunLLkJqxs7M6M7wfl3FdVQGbsTTD80oczEoczEo5NmQCuPfee9UuYUyIShJ2tLtwwhXArKI8XFmUN+Rbi6ezavME8V5bL4yZWlxfXYD87MyRKJmGgeeVOJiVOJiVcoobsqNHj2LhwoWYPHky5s+fj8OHD1/wdVu2bMGCBQswbdo0zJgxA9/5zncUFztWPfnkk2qXMOoFonG819oLRzCChRVWjLMYFb3PE08+iUN2L3Z19qHClIPPVBbwSco0xfNKHMxKHMxKOcUN2YMPPoiVK1fiyJEjWLNmDe67774Lvs5qtWLjxo04dOgQPvroI2zduhUNDQ2KCx6L+MTpyDp9azEqyVhcVYBio17R+8QkCdHiGhxx+jB9YK0yPkmZvnheiYNZiYNZKaeoIevp6cGePXtw9913AwCWLl2K5uZmtLa2nvfaWbNmoaamBgCg1+sxc+ZMNDc3K6+YKInavUG8P3BrcXFVAfL0ym4tBqJxbG3tRY8/ggXlFkwq4DZIRESUOEUNWVtbG8rKyqAZGHbOyMhAVVXVBRuys3V1deHll1/GrbfequRjiZJGlmUc6fVhZ0cfSnOzh3Vr8ewrbNdVF6Asl8P7REQ0NCkb6vd4PLj99tvx6KOPYtasWan62FFhw4YNapcwqkiyjN1dbhxyeHFFQS7mlSpfpLXVHcB7bb3IzdLi+qoCvPSrXyS5WhopPK/EwbG+W4MAABthSURBVKzEwayUS7gh++Uvf4nZs2dj9uzZePvtt9He3o54PA6g/2pDa2srqqqqLvi9Xq8Xt9xyC+644w48/PDDl/2sW2+9FfX19YP+qaurw6ZNmwa9bvPmzaivrz/v+1etWnXeH4rGxkbU19ef90juE088cd7eW62traivr0dTU9Ogrz/33HNYvXr1oK8FAgHU19dj27Ztg77e0NCAFStWnFfbnXfeOeTjaGxsHBXHcTa1jiMcl7CtzYlT3iDmlpjxvVX347XXXhvycciyjIN2Dz7qcuPIzg8wJUeGXqc9kxXzSP/j2Lp166g4jtGSx6WO4/nnnx8VxzFa8rjUcZz995XIx3G2RI+joaEBdXV1KCkpOdO7JNLznKZ466Trr78ey5cvx7Jly/DSSy/hxz/+MbZv337e63w+H26++WbccsstePzxxy/5ntw6iUaSNxLDjlNORCQZC8ossBmUbYMUkyTs6uxDpy+MGYUmTLBw5X0iIjrfUPoaxbcs169fj/Xr12Py5MlYt27doA72gQcewOuvvw4AePbZZ7Fr1y688sorZ66wPfXUU0o/lkgReyCMd086kJEBXF9VoLgZC0Rj2NraC3sggrpyCyZaObxPRETDx83FadRwOp04deoULBYLKisrz3y9xR3Ani43bIYszC+zIEur7PeQ3mAEH7a7oNVkYGG5RfETmURENDak5AoZUbpobm7GnXd+BUXFxZg5cyaqqqpQd80ivL1lCw7aPWjscqPabMA1FVbFzdhJdwDvt/XClKXD9VU2NmNERJRUbMgEcKFBR+p34sQJzFtQh1e27EB86dPAt94H7v8l9rp1ePPQCXzS68OMQhNmF+dBo+DW4unh/d1dblTm5WBRpRV63cVPG2YlDmYlDmYlDmalnE7tAujyHnroIbVLSFv//zdXwy3nIPatbUBeEQAg/4p5+KevLUFFVgDPfesf8Off/ErRnFdUkrCrow9d/jCuLMzDeIvhsu/DrMTBrMTBrMTBrJTjFTIBLFmyRO0S0lJ3dzd+//vXELvpkTPNWLUxirWz+2DRy/jO1gDefe2l85a1SIQ/GsPWkwN7W5ZbMMGa2JOUzEoczEoczEoczEo5XiEjYbW0tECKx4HxdQCAGmMUP5zjRntAi+8fyIMzxwpdng3Hjh0b0vs6AhF82OFCpiZjWNspERERJYpXyEhYZrO5/19cp5CfJeFb07zoCGjw+D4znBEtEHAjHnB/+roEtAwM7+dl6bC4msP7RESUGmzIBHDuisbUb/LkyZg640roP/gvfGuqG5oM4HsHzPDGBv5Yv/df0EDG0qVLL/tesixjf8+nT2QuqrRCr+CJTGYlDmYlDmYlDmalHBsyATQ0NKhdQlrKyMjAv3z/e1j1t/Wo0gfx9HZ//5WxkBfY/O/IeO27+PrKlSgtLb3k+0TjEra3u3DM5ceVRXmKn8gEmJVImJU4mJU4mJVyXBiWhPaxw4umXh+eXf0Q3v/jJuis5Yh7HZCjYXx95Uo8++yz0OkuPirpj8Swo92FYCyOq8ssKDbqU1g9ERGNZkPpazjUT8Jq9QTR1OvDNJsJf/zfF/Hb3/4WJ06cgNVqxZe//OVBq/VfiD0Qxs4OFzI1GiyussGk5+lARETq4N9AJKTeYASNXX2oysvBpIElKe69996Ev7+5L4C93cPfTomIiCgZ2JCRcPzRGD5sd8GSnYnZxeYhLfoqyTIO2r045vKjNt+AmUXK58WIiIiShZcFBLBixQq1S/h/7d1/cNT1ncfx1+7m9+8fBJKQbCTGYMFUIgRIRAytpRyWbbXXOulpO4oOnQvOKVfQnt7JRdELd53eHOBIvTj0cAgUqbRcradFUX4JNaElFoj8TMLmFwmbZLOb3eyPz/0RoUQg7H7ZzWc/u6/HDDMSNtn3ztOdfWf3u/sNGS6PFwfPWxCl12FubgYMet+XKZfHi4NmC05bbLhzYgpKJ6UGfBljK3WwlTrYSh1spR2fIVMAP/l4hBAChzv6YHd7UGnMHPOckl82OOzGQfNFONxeVORlBO3gfbZSB1upg63UwVba8V2WpIyj3QM4bbH5vVBdsDtxyGxBjEGP8rwMJMfw9xAiIgo+vsuSws6ZPhtOffFSoz/L2KWD97MSYjCbB+8TEVGI4kJGIa/b5sSfuwZwa1oCbk1P9Ol7vEKgqXsAp/vsKExLwFd58D4REYUwPl2ggH379skeQRqr041D7RZkJcSiZGKKT98z7PHiwPmLONNnx4xJKZgRhIP3ryeSW6mGrdTBVupgK+24kClg7dq1skeQwunx4oD5IuKiDJiTm+bTUjU47Mae1h5YHC7cnZeBwjTfnlELlEhtpSK2UgdbqYOttONLlgrYunWr7BHGnVcIHDJb4PIKLDBmINqHY7+6bSOfvB8bpceCgglIknDwfiS2UhVbqYOt1MFW2nEhU0BCQoLsEcaVEAJHuvpx0TGMe/IykejDYnXaYsPR7gHpB+9HWiuVsZU62EodbKUdFzIKOSctNrT0D2FWdioyE2LGvKxXCBztHsCZPjtuTUtACQ/eJyIiBXEho5DSbnXgswtWTM1IgjF17N+0hj1eHG634IJ9GKWTUjEljb+ZERGRmnhQvwJWrlwpe4Rx0edw4Y8dfZicFIdpE5LGvKx12I09LT3oc7gwLz8jZJaxSGkVDthKHWylDrbSjs+QKcBoNMoeIeiG3B4cMF9EckwUZuakjXnC8C6bE4fbLYiLMqBS0sH71xMJrcIFW6mDrdTBVtrx1Ekkndsr8HFbLxxuDxYUTEB8lOGalxNC4EyfHUe7BzAxMRazc9J8evclERGRDDx1EilDCIGGjj5YnW7ca8y87jLmFQJ/7hrA2X47itITUZKVPOazaERERCrhQkZSHesdhHnQgbm56UiLi77mZZxfHLzfYx/GXZNScUuIHC9GREQUKHy9RwEnTpyQPUJQtPbb0dw7iDsmJCM3Oe6al7E6Rw7e73e6cE9+RsgvY+HaKhyxlTrYSh1spR0XMgWsWrVK9ggB12sfRmNXPwpS4nFbxrVPb9Rlc2JPaw8MOh0WGCdgQkLsOE/pv3BsFa7YSh1spQ620o4vWSpg/fr1skcIKNuwG5+0W5ARF4PS7NSrjgUTQuD0FwfvZyfGokyhg/fDrVU4Yyt1sJU62Eo7LmQKCKe3Ebs8Xhw0WxCl12FObvpVn6rvFQJ/6urHuf4h3JaeiDsUO3g/nFqFO7ZSB1upg62040JG48YrBA539GHI7UGlcQJio0Y/6+X0eHHIbEHv0DBmZqei4Aaf1E9ERBQuuJDRuGnqHkC3zYm78zKQHDv6f70BpwsHzRa4vAL35Gdiwg3OYUlERBRO1DgwJ8LV1tbKHuGmnbHYcLrPjjsnpWBi4uiD8zsHHdjT2jty8H6B2stYOLSKFGylDrZSB1tpx2fIFGC322WPcFO6bE78uXsAt6YnoDDtr++oFELglMWGpgvWkYP3c9MQrVf7dwTVW0UStlIHW6mDrbTjqZMoqPodLnzYcgFxnmGUT05HamoqgJHjyY509aOlfwjFGYmYPkGtg/eJiIhuxJ+9Ru2nIyik/WrHr7H90FGc+7wZD84uwaTsHCxduhTmrm7sbbuItoEhzMxOxR1ZKVzGiIgoonEho6BYt34DPh/SwRCfhJcPDGHoyXfhXPRTfNB4DL9vPo8BxzDuyc/kOymJiIjAhUwJPT09skfwS2dnJ07aPSiaMQu1Z/JwofAbQOFszHx4BV7avAMDff3Yv/k1ZMare/D+9ajWKpKxlTrYSh1spR0XMgU89thjskfwy66DDaj89vfw6rFoNFtjAAiY8mx4dvoAjvbH4rm69/Hquv+Cy+WSPWrAqdYqkrGVOthKHWylHRcyBaxevVr2CD4zWx3InHYXdmypx97+TAACP/mKFT8qHMLbbfH492PJcOSXwdrfh97eXtnjBpxKrSIdW6mDrdTBVtpxIVOAKu84tThc+LSjD71nPsf2df8BeD34Tt4QyrOG8XZbPLacS4SADrjYBr1ej6SkJNkjB5wqrYitVMJW6mAr7biQUUAMuTw4aL6IlNgolE5KhsvSga87D+CRQju2t8TjzbNffP6YexiGvb/A/d9aEpYLGRERkRb8YFi6aW6vwEGzBToAcyenI75gAqp/+gIq7yvG/zW2YKtlGhANoOM49G89C133STz/3BuyxyYiIgoZfIZMAXV1dbJHuC4hBD7t6IN12I3yyRmIjzLggt2J+360DOePN+G/H74bhp9MRvSzU4AX7kR6ZwN2/eY3mD17tuzRgyKUW9FobKUOtlIHW2nHhUwBjY2Nske4rmM9VrQPOlCWm4a0uGj0OUZOEp6ZEIMnH1iE48eP4+XV/4yfLl+Kbdu2of18GxYtWiR77KAJ5VY0Glupg63UwVba8dRJpFlLvx0Nnf24IysZxRlJGBx246PWXsRHGXCPMUP581ISERHdDJ46iYKuxz6MI139KEiNx23piRhye7Dv/EVE63W4Oy+dyxgREZEf+KhJfrMNu/FJuwUZcTEonZQKl1fgwPmL8AqBefkZiI0yyB6RiIhIKVzIyC8ujxcHzBZE63WYMzkdQgAHzRbYXR7My8tAQjTfuEtEROQvLmQKMJlMskcAAHiFwKH2PjjcHlTkZSBar8PhDgv6HMOoyMtASmy07BGlC5VWdGNspQ62UgdbaceFTAHLly+XPQIA4Gj3AC7YnZiTm46kaAMaO/vROTjy93A8UbgWodKKboyt1MFW6mAr7biQKWDhwoWyR8Bpiw1n+uyYMSkVExNj8dkFK1oHhjAzOxXZSXGyxwsZodCKfMNW6mArdbCVdlzI6Ia6bE4c7R5AUXoipqQl4POLgzhpseGrWSkwpibIHo+IiEh5XMhoTANOFw61WzApMRYlWclo6bfjswtWTM1IRFFGouzxiIiIwgIXMgXs3LlTyvU63R4cMFuQEGVAWW4aOm1ONHb245bUeEybkCxlplAnqxX5j63UwVbqYCvtuJApoL6+Pqg/32q14tVXX8W9C76G0lmz8cgPf4h9+/fjk3YLPF6Birx09DvcONRuQU5SHEonpUKn0wV1JlUFuxUFDlupg63UwVba8UOjFLBt27ag/ezTp0+j8uv3wdzWBtzxTYiUKfjsvY+RNn0m5n/LiK9NmYhhj8BB80VkxMWgLCeNy9gYgtmKAout1MFW6mAr7biQRTCv14v7l3wbHc4oiJrPgIm3AgCW5NmwoHAIP//Hv0f/97+LnIpvICHagPLJ6TDouYwREREFGheyCPb++++j+fhfgGc+uryMzcl04uHCIWxricdn9jR4jbcjSq/D3XkZiDbwFW4iIqJg4CNsBPvDH/6A6KwCoHAuAGBGmhMrvmLFvu4Y/O/5ODz3r/8EvcGAoqhhxPH8lEREREGjeSE7efIkKioqMHXqVMyZMwfHjx8f8/IOhwPTp09HWVmZ1quMWI8++mhQfq7X6wUM0YBOh2idwONFNgy4dNh4MgnPTLdiYkocXnz8B4gSnqBcfzgKVisKPLZSB1upg62007yQLVu2DD/+8Y/R3NyMVatWYenSpWNe/rnnnkN5eTkPCNcgWJ98XFFRAVfnKeD8UVTdYkdmnBcvNqVg+dRB3Jbsxis/r4PbbkdeXl5Qrj8c8VOq1cFW6mArdbCVdpoWsu7ubhw5cgQPP/wwAODBBx/E2bNn0draes3L7927F6dOncIjjzwCIYT2aSNUVVVVUH6uyWRCbr4Rd/xpPZbkDaH+XALun+zArMxh/Ox3x9H85hr8w5PVMBj4cqWvgtWKAo+t1MFW6mAr7TQd1N/W1obc3Fzo9SP7nE6ng9FoRGtrK4xG46jL2mw2PP3009i1axeam5tvfmIKmOjoaOx8+200Dnhw4sgfkdQ5hPsWz8e6/9yAhtfW4IEHv4sVK1bIHpOIiCjsBf2g/pUrV6K6uho5OTnBvirSwDC5EJNyJyMtCvju4vnYvuHn8J44gK1bt2L7r7YhKopvxCUiIgo2nxeyzZs3o7S0FKWlpdi9ezfMZjM8npGDvYUQ13x2DAD279+PmpoaTJkyBVVVVWhqakJJScmY17V48WKYTKZRf8rLy686JcN7770Hk8l01fdXV1ejrq5u1NcaGxthMpnQ09Mz6usvvPACamtrR32ttbUVJpMJJ06cGPX1devWYeXKlaO+ZrfbYTKZsG/fvlFfr6+vv+bBjQ899JDft+PKnx3I29E56MC5/iHkpyQg96tlaPrgXVR/34SPPvwADz30EAwGQ0Bvx5VU7jHW7bh0varfjkvC+Xbs2LEjLG5HuPQY63Z8+WUwVW9HuPQY63ZceVtUvh1X8vV21NfXo7y8HNnZ2Zd3l6eeeuqq77suoVFlZaXYtGmTEEKI7du3i/Ly8ht+z549e8SsWbOu++8NDQ0CgGhoaNA6VlhasmRJwH+m0+0RvzvZKXaf7RY7TrSLTzsswuv1Bvx6Ik0wWlFwsJU62EodbDWaP3uN5pcsN27ciI0bN2Lq1KlYu3btqA32iSeewK5du661/PFdlhps3bo14D/zT139cAuBAacbOUmxPD9lgASjFQUHW6mDrdTBVtppPkCouLgYBw4cuOa/vf7669f8emVlJQ4fPqz1KiNWQkJCQH/e+YEhnLc6YNABGfExmJ2TDj2XsYAIdCsKHrZSB1upg6204xHbYc5sNmPz5s1oa2tDVlYWvlf1dzijT4ZeByTy/JREREQhgQtZmBJCoKamBjUvvghddBz0E2+Ft7cVouArKJk7D4nRBszLz+T5KYmIiEIAH40V8OV3gvhiw4YNWL16Nbx/8yw8tS1wPf8pFm45hTsr5sNuHcDeN3/B81MGgZZWJAdbqYOt1MFW2nEhU8C1Pk5kLC6XCy++/ApQ8SPA9AIQn4LcODceLR6Gywv8yxvv42f/9gp6e3uDNHHk8rcVycNW6mArdbCVdlzIFPDkk0/6dflDhw6hu6MdqFz2xVcEXprRDz2A2r+koKX4bzHsdOCdd94J+KyRzt9WJA9bqYOt1MFW2nEhC0ODg4Mj/5E8EQAQpxeIMwhsORePI5YYIGkCdHrDXy9HREREUnEhC0O33377yH807wEAOLx6/GD/BPy6LXHk65/vhfB6MG3aNDkDEhER0ShcyBTw5VM+3Mgtt9yCb3xzEQy/fwUY6B79j04b9DufR1Hx7Zg/f34ApyTA/1YkD1upg63UwVbacSFTwKpVq/z+nlfXr0OaGETUmtnA714Bmt4Fdq+DYU0ZYjua8D+b3uAn8weBllYkB1upg63UwVbacSFTwPr16/3+nqKiIjQcPoRHvvNNxLz7CrDOBP1bq/Cdu2fg0CcHUV5eHoRJSUsrkoOt1MFW6mAr7fjBsArQ+jbigoICvPHGG9iwYQN6enqQnp6OpKSkAE9HV+JbvtXBVupgK3WwlXZcyCJAfHw88vPzZY9BRERE18GXLImIiIgk40KmgNraWtkjkI/YSh1spQ62UgdbaceFTAF2u132COQjtlIHW6mDrdTBVtrphBBC9hCXNDY2YubMmWhoaMBdd90lexwiIiIizfzZa/gMGREREZFkXMiIiIiIJONCpoCenh7ZI5CP2EodbKUOtlIHW2nHhUwBjz32mOwRyEdspQ62UgdbqYOttONCpoDVq1fLHoF8xFbqYCt1sJU62Eo7LmQK4DtO1cFW6mArdbCVOthKOy5kRERERJJxISMiIiKSjAuZAurq6mSPQD5iK3WwlTrYSh1spR0XMgU0NjbKHoF8xFbqYCt1sJU62Eo7njqJiIiIKAh46iQiIiIihXAhIyIiIpKMCxkRERGRZFzIFGAymWSPQD5iK3WwlTrYSh1spR0XMgUsX75c9gjkI7ZSB1upg63UwVbacSFTwMKFC2WPQD5iK3WwlTrYSh1spR0XMiIiIiLJuJARERERScaFTAE7d+6UPQL5iK3UwVbqYCt1sJV2XMgUUFtbK3sE8hFbqYOt1MFW6mAr7biQKSArK0v2COQjtlIHW6mDrdTBVtpxISMiIiKSjAsZERERkWRcyIiIiIgki5I9wLUcP35c9ggh5fDhw2hsbJQ9BvmArdTBVupgK3Ww1Wj+7DM6IYQI4ix+6ejoQFVVFT766CPZoxARERHdtHvvvRf19fXIyckZ83IhtZABI0tZR0eH7DGIiIiIblpOTs4NlzEgBBcyIiIiokjDg/qJiIiIJONCRkRERCQZFzIiIiIiybiQhZCTJ0+ioqICU6dOxZw5c274dlmHw4Hp06ejrKxsnCakS3xt9cEHH2Du3LmYPn06SkpK8Pzzz4/zpJHN1051dXUoLi5GUVERli1bBo/HM86Tki+teH8KDf48VvFxyg+CQsaCBQvEL3/5SyGEEG+99ZYoLy8f8/IrVqwQS5cuFWVlZeMxHl3B11ZHjhwRZ8+eFUII4XA4xLx588SWLVvGa8yI50unM2fOiNzcXNHd3S2EEMJkMomNGzeO65zkWyven0KDP49VfJzyHReyENHV1SXS0tKEx+MRQgjh9XpFdna2aGlpueblP/74Y2EymcSePXvErFmzxnPUiOdvqytVV1eLNWvWBHtEEr53Wrt2rVi+fPnlv7/zzjuisrJyXGeNdFrvU7w/jT9/WvFxyj98yTJEtLW1ITc3F3r9SBKdTgej0YjW1tarLmuz2fD000/jtddeg+Cnlow7f1pdqbOzEzt27MDixYvHY8yI52untrY2GI3Gy38vKCi4YUsKLC33Kd6f5PC1FR+n/MeFTEErV65EdXW1Tx80R6FhYGAAS5YswTPPPIMZM2bIHodIabw/hT4+TvmPC5lEmzdvRmlpKUpLS7F7926YzebLBxMLIdDa2jrqN/dL9u/fj5qaGkyZMgVVVVVoampCSUnJeI8fUbS2AgCr1YpFixbhgQcewFNPPTWeY0e0/Px8mM1meL1eANfvZDQa0dLScvnv586du25LCg5fWwG8P8nmays+Tmkg8eVS+pLKykqxadMmIYQQ27dvv+FB/UIIvjYvia+trFarqKioEDU1NeM5Hn3Bl06XDurv6uoSXq9XLFmyhAf1S+BLK96fQoO/j1V8nPINF7IQ0tzcLMrLy0VxcbEoKysTx44du/xvjz/+uPjtb3971fd8+OGHfPeKBDdqtWvXLiGEEC+99JKIjo4WM2bMuPzn5ZdfljV2xLlepy/fn15//XVRVFQkCgsLxRNPPCHcbreskSPWWK14fwotvt6vLuHjlG94LksiIiIiyXgMGREREZFkXMiIiIiIJONCRkRERCQZFzIiIiIiybiQEREREUnGhYyIiIhIMi5kRERERJJxISMiIiKSjAsZERERkWRcyIiIiIgk40JGREREJNn/A2qXig5UpNlWAAAAAElFTkSuQmCC",
"text/plain": [
"PyPlot.Figure(PyObject )"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: Saved animation to /home/juser/CS314-2016/tmp.gif\n"
]
},
{
"data": {
"text/html": [
"\" />"
],
"text/plain": [
"Plots.AnimatedGif(\"/home/juser/CS314-2016/tmp.gif\")"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## With a for loop and normalized to keep it from shrinking\n",
"n = 11\n",
"x = randn(n,1)\n",
"y = randn(n,1)\n",
"x = x - sum(x)/n # center on the origin\n",
"y = y - sum(y)/n\n",
"x = x/norm(x) # rescale\n",
"y = y/norm(y)\n",
"niter = 30\n",
"anim = @animate for iter=1:niter\n",
" \n",
" xnew,ynew = poly_midpoints(x,y)\n",
" xnew = xnew/norm(xnew)\n",
" ynew = ynew/norm(ynew)\n",
"\n",
" plot_polygon(xnew,ynew)\n",
"\n",
" x = xnew;\n",
" y = ynew;\n",
"\n",
"end\n",
"\n",
"gif(anim, \"tmp.gif\", fps = 10)\n",
"\n",
"## It turns out you can prove this ALWAYS\n",
"# looks like an ellipse at 45 degs!\n",
"# http://www.cs.cornell.edu/cv/ResearchPDF/EllipsePoly.pdf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.4.6",
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.4.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}