├── HW1 ├── .gitattributes ├── Gabor.ipynb ├── HW1Intro.ipynb └── data │ └── gabor │ ├── Zebra_running_Ngorongoro.jpg │ ├── unknownGabor.data │ └── unknownLoG.data ├── HW2_part1 ├── GenSinusoid.m ├── HW2_part1_Intro.ipynb ├── ShowPatches.m └── gensin.m ├── HW2_part2 ├── HW2_part2_Intro.ipynb └── data │ └── edge │ ├── boundaryMap │ ├── 100075.bmp │ ├── 12074.bmp │ ├── 23025.bmp │ ├── 35010.bmp │ ├── 41004.bmp │ ├── 41025.bmp │ └── 97017.bmp │ ├── snapshot.png │ └── trainImgs │ ├── 100075.jpg │ ├── 12074.jpg │ ├── 23025.jpg │ ├── 35010.jpg │ ├── 41004.jpg │ ├── 41025.jpg │ └── 97017.jpg ├── HW3 ├── Gibbs Sampling.ipynb └── data │ └── gibbs │ ├── a.jpeg │ ├── b.jpeg │ ├── c.jpeg │ ├── cat3.jpg │ ├── cat4.jpg │ ├── d.jpeg │ ├── e.jpeg │ ├── f.jpeg │ ├── gibbs_demo.jpg │ └── moon.jpg └── HW4 ├── DeepNetwork.ipynb ├── MNIST_data ├── t10k-images-idx3-ubyte.gz ├── t10k-labels-idx1-ubyte.gz ├── train-images-idx3-ubyte.gz └── train-labels-idx1-ubyte.gz └── mnist_deep.png /HW1/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /HW1/Gabor.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "If you find any bugs in this ipython notebook, please post a question on Piazza or contact Fengze Liu (fliu23@jhu.edu).\n", 8 | "If there's an error say \"something is undefined\", please run the cell that contains the definition or use \"menu -> cell -> run all above\"\n", 9 | "\n", 10 | "Please download this ipynb file as well as the data folder (also posted in Piazza https://piazza.com/configure-classes/fall2021/as050375675)\n", 11 | "Original notebook by Weichao Qiu, modified by Donald Li, Chenxi Liu and Hongru Zhu." 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "# Initialization" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "# Import python library for this notebook\n", 28 | "import numpy as np # fundamental package for scientific computing\n", 29 | "import matplotlib.pyplot as plt # package for plot function\n", 30 | "\n", 31 | "# show figures inline\n", 32 | "%matplotlib inline \n", 33 | "\n", 34 | "def myimshow(I, **kwargs):\n", 35 | " # utility function to show image\n", 36 | " plt.figure();\n", 37 | " plt.axis('off')\n", 38 | " plt.imshow(I, cmap=plt.gray(), **kwargs)" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "# Generate sinusoid stimuli\n", 46 | "\n", 47 | "Sinusoid $ I(\\mathbf{x}) = A \\cos(\\mathbf{\\omega} \\mathbf{x} + \\rho) $\n", 48 | "\n", 49 | "$ A $ is the amplitude, $ \\rho $ is the phase, and $ \\mathbf{\\omega} $ is the frequency." 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": null, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "def genSinusoid(sz, A, omega, rho):\n", 59 | " # Generate Sinusoid grating\n", 60 | " # sz: size of generated image (width, height)\n", 61 | " radius = (int(sz[0]/2.0), int(sz[1]/2.0))\n", 62 | " [x, y] = np.meshgrid(range(-radius[0], radius[0]+1), range(-radius[1], radius[1]+1)) # a BUG is fixed in this line\n", 63 | "\n", 64 | " stimuli = A * np.cos(omega[0] * x + omega[1] * y + rho)\n", 65 | " return stimuli\n", 66 | "\n", 67 | "theta = np.pi/4\n", 68 | "omega = [np.cos(theta), np.sin(theta)]\n", 69 | "sinusoidParam = {'A':1, 'omega':omega, 'rho':np.pi/2, 'sz':(32,32)}\n", 70 | "myimshow(genSinusoid(**sinusoidParam)) \n", 71 | "# ** is a special syntax in python, which enables passing a key-value dictionary as parameter" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "# Generate gabor filter\n", 79 | "A general type of Gabor filter[1] can be defined: \n", 80 | "$$ g(x,y;\\lambda,\\theta,\\psi,\\sigma,\\gamma) = \\exp\\left(-\\frac{x'^2+\\gamma^2y'^2}{2\\sigma^2}\\right)\\exp\\left(i\\left(2\\pi\\frac{x'}{\\lambda}+\\psi\\right)\\right) $$\n", 81 | "[1] https://en.wikipedia.org/wiki/Gabor_filter " 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "Here we implement a type of Gabor filter which satisfies the neurophysiological constraints for simple cells: \n", 89 | "$$ \\psi (x; \\omega, \\theta, K) = \\left[\\frac{\\omega^2}{ 4 \\pi K^2} \\exp \\{-(\\omega^2/8K^2)[4(x\\cdot(cos\\theta, sin\\theta))^2 + (x \\cdot ( -sin \\theta, cos \\theta))^2]\\} \\right] \\times \\left[ \\exp \\{ iwx \\cdot (cos\\theta, sin\\theta) \\} exp(K^2/2) \\right] $$" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": null, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "def genGabor(sz, omega, theta, func=np.cos, K=np.pi):\n", 99 | " radius = (int(sz[0]/2.0), int(sz[1]/2.0))\n", 100 | " [x, y] = np.meshgrid(range(-radius[0], radius[0]+1), range(-radius[1], radius[1]+1))\n", 101 | "\n", 102 | " x1 = x * np.cos(theta) + y * np.sin(theta)\n", 103 | " y1 = -x * np.sin(theta) + y * np.cos(theta)\n", 104 | " \n", 105 | " gauss = omega**2 / (4*np.pi * K**2) * np.exp(- omega**2 / (8*K**2) * ( 4 * x1**2 + y1**2))\n", 106 | "# myimshow(gauss)\n", 107 | " sinusoid = func(omega * x1) * np.exp(K**2 / 2)\n", 108 | "# myimshow(sinusoid)\n", 109 | " gabor = gauss * sinusoid\n", 110 | " return gabor\n", 111 | " \n", 112 | "g = genGabor((256,256), 0.3, np.pi/4, func=np.cos) \n", 113 | "# change func to \"cos\", \"sin\" can generate sin gabor or cos gabor, here we pass a function name as a parameter\n", 114 | "myimshow(g)\n", 115 | "np.mean(g)" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "# Interactive: Gabor demo\n", 123 | "If you evaluate the next cell in your computer, you can see an interactive demo like this. \n", 124 | "\n", 125 | "\n", 126 | "**Drag the slider to change parameters, and see the change of gabor filter.**" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": null, 132 | "metadata": {}, 133 | "outputs": [], 134 | "source": [ 135 | "from IPython.html.widgets import interact, interactive, fixed\n", 136 | "def demoGabor(theta, omega):\n", 137 | " myimshow(genGabor((128,128), omega, theta))\n", 138 | "interact(demoGabor, theta=(0,np.pi,np.pi/4), omega=(0.1,1,0.1))" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "# Generate gabor filter bank" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "metadata": {}, 152 | "outputs": [], 153 | "source": [ 154 | "theta = np.arange(0, np.pi, np.pi/4) # range of theta\n", 155 | "omega = np.arange(0.02, 0.42, 0.1) # range of omega\n", 156 | "params = [(t,o) for o in omega for t in theta]\n", 157 | "sinFilterBank = []\n", 158 | "cosFilterBank = []\n", 159 | "gaborParams = []\n", 160 | "for (theta, omega) in params:\n", 161 | " gaborParam = {'omega':omega, 'theta':theta, 'sz':(128, 128)}\n", 162 | " sinGabor = genGabor(func=np.sin, **gaborParam)\n", 163 | " cosGabor = genGabor(func=np.cos, **gaborParam)\n", 164 | " sinFilterBank.append(sinGabor)\n", 165 | " cosFilterBank.append(cosGabor)\n", 166 | " gaborParams.append(gaborParam)\n", 167 | "\n", 168 | "plt.figure()\n", 169 | "n = len(sinFilterBank)\n", 170 | "for i in range(n):\n", 171 | " plt.subplot(4,4,i+1)\n", 172 | " # title(r'$\\theta$={theta:.2f}$\\omega$={omega}'.format(**gaborParams[i]))\n", 173 | " plt.axis('off'); plt.imshow(sinFilterBank[i])\n", 174 | "\n", 175 | "plt.figure()\n", 176 | "for i in range(n):\n", 177 | " plt.subplot(4,4,i+1)\n", 178 | " # title(r'$\\theta$={theta:.2f}$\\omega$={omega}'.format(**gaborParams[i]))\n", 179 | " plt.axis('off'); plt.imshow(cosFilterBank[i])\n", 180 | "print(gaborParam)" 181 | ] 182 | }, 183 | { 184 | "cell_type": "markdown", 185 | "metadata": {}, 186 | "source": [ 187 | "# Apply filter bank to zebra image" 188 | ] 189 | }, 190 | { 191 | "cell_type": "markdown", 192 | "metadata": {}, 193 | "source": [ 194 | "# Homework 4.1\n", 195 | "Apply Gabor filters to the zebra image. Adjust the frequency and orientation of the Gabors to find the horizontal and vertical stripes. Plot the output. (3 points) Can you also find Gabors that respond to the legs? (3 points)" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": {}, 202 | "outputs": [], 203 | "source": [ 204 | "from skimage.color import rgb2gray\n", 205 | "from scipy.signal import convolve2d\n", 206 | "zebra = rgb2gray(plt.imread('data/gabor/Zebra_running_Ngorongoro.jpg'))\n", 207 | "plt.figure(); myimshow(zebra)\n", 208 | "sinGabor = sinFilterBank[2] \n", 209 | "plt.figure(); myimshow(sinGabor)\n", 210 | "%time res = convolve2d(zebra, sinGabor, mode='valid') # Will take about one minute\n", 211 | "plt.figure(); myimshow(res); # title('response') Book figure" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "\"Zebra running Ngorongoro\" by Muhammad Mahdi Karim (data/gabor/Zebra_running_Ngorongoro.jpg)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "metadata": {}, 224 | "source": [ 225 | "For examples of filters applied to texture processing see: https://scikit-image.org/docs/dev/auto_examples/features_detection/plot_gabor.html" 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": {}, 231 | "source": [ 232 | "# Quadrature pair, simple/complex cell" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "# Homework4.2\n", 240 | "Run the following Example, explain the results of the simple and complex cells when applying them to the stimuli. (4 points) Does the results match with your expectation?" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": null, 246 | "metadata": {}, 247 | "outputs": [], 248 | "source": [ 249 | "theta = np.pi\n", 250 | "sinGabor = genGabor((129,129), 0.4, theta, np.sin)\n", 251 | "cosGabor = genGabor((129,129), 0.4, theta, np.cos)\n", 252 | "plt.figure(); \n", 253 | "plt.subplot(121); plt.axis('off'); plt.imshow(sinGabor, vmin=-0.2, vmax=0.2)\n", 254 | "plt.subplot(122); plt.axis('off'); plt.imshow(cosGabor, vmin=-0.2, vmax=0.2)\n", 255 | "\n", 256 | "theta = np.pi/4\n", 257 | "sinusoid = genSinusoid((256,256), 1, (omega*np.sin(theta), omega*np.cos(theta)), 0)\n", 258 | "plt.figure(); myimshow(sinusoid); plt.title('Stimuli')\n", 259 | "\n", 260 | "response = convolve2d(sinusoid, sinGabor, mode='valid')\n", 261 | "response2 = convolve2d(sinusoid, cosGabor, mode='valid')\n", 262 | "\n", 263 | "plt.figure(); \n", 264 | "plt.subplot(121); plt.imshow(response, vmin=0); plt.title('Response of sin gabor(simple cell)')\n", 265 | "plt.subplot(122); plt.imshow(response**2 + response2**2, vmin=0); plt.title('Resp. of complex cell')" 266 | ] 267 | }, 268 | { 269 | "cell_type": "markdown", 270 | "metadata": {}, 271 | "source": [ 272 | "# Homework 4.3: Find parameter of an unknown gabor filter\n", 273 | "Find the tuning curve of an idealized neuron by measuring its response to different sinusoids. (3 points) \n", 274 | "The neuron is a Gabor function so you need to find its preferred orientation and phase. Use equations from _Slide: [SimpleCellsVisualCortex](https://cs.jhu.edu/~ayuille/JHUcourses/ProbabilisticModelsOfVisualCognition2017/Lecture3SimpleCells/SimpleCellsVisualCortex.pdf) - The Tuning of Gabor Filters _ if you want." 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": null, 280 | "metadata": {}, 281 | "outputs": [], 282 | "source": [ 283 | "import pickle\n", 284 | "# The parameter of this gabor(cell) is unknown\n", 285 | "# Try to find its parameter:\n", 286 | "unknownGabor = pickle.load(open('data/gabor/unknownGabor.data', 'rb'), encoding='latin1')\n", 287 | "plt.figure(); myimshow(unknownGabor)\n", 288 | "\n", 289 | "# You can use sinusoid as a stimuli\n", 290 | "# For example:\n", 291 | "rho = 0\n", 292 | "omega = 0.3\n", 293 | "theta = np.pi/6\n", 294 | "sinusoid = genSinusoid(unknownGabor.shape, 1, (omega*np.cos(theta), omega*np.sin(theta)), rho)\n", 295 | "plt.figure(); myimshow(sinusoid)\n", 296 | "response = convolve2d(sinusoid, unknownGabor, mode='valid')\n", 297 | "print('Strength of response:', response)" 298 | ] 299 | }, 300 | { 301 | "cell_type": "markdown", 302 | "metadata": {}, 303 | "source": [ 304 | "# Demo: Gaussian, Laplacian of Gaussian" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": null, 310 | "metadata": {}, 311 | "outputs": [], 312 | "source": [ 313 | "# Utility function to plot 3D surface\n", 314 | "def surf(X, Y, Z, **kargs): \n", 315 | " # Plot 3D data as surface, similar to surf(X,Y,Z) of http://www.mathworks.com/help/matlab/ref/surf.html\n", 316 | " from mpl_toolkits.mplot3d import Axes3D\n", 317 | " fig = plt.figure()\n", 318 | " ax = fig.add_subplot(111, projection='3d')\n", 319 | " ax.plot_surface(X, Y, Z, **kargs)\n", 320 | " \n", 321 | "sigma = 20\n", 322 | "from mpl_toolkits.mplot3d import Axes3D\n", 323 | "\n", 324 | "[X, Y] = np.meshgrid(np.arange(-100, 101), np.arange(-100, 101))\n", 325 | "Z = 1/(np.sqrt(2.0 * np.pi) * sigma) * np.exp(-(X**2+Y**2)/(2.0*sigma**2))\n", 326 | "\n", 327 | "dx = np.roll(Z, 1, axis=1) - Z\n", 328 | "dx2 = np.roll(dx, 1, axis=1) - dx\n", 329 | "\n", 330 | "dy = np.roll(Z, 1, axis=0) - Z\n", 331 | "dy2 = np.roll(dy, 1, axis=0) - dy\n", 332 | "\n", 333 | "LoG = -(dx2+dy2)\n", 334 | "\n", 335 | "surf(X, Y, Z, alpha=0.3)\n", 336 | "# title('Gaussian')\n", 337 | "\n", 338 | "surf(X, Y, dx + dy, alpha=0.3)\n", 339 | "# title('First order derivative')\n", 340 | "\n", 341 | "surf(X, Y, LoG, alpha=0.3)\n", 342 | "# title('Second order derivative (Laplacian of Gaussian)')" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "metadata": {}, 348 | "source": [ 349 | "# Homework 4.4 Find the parameter of Laplacian of Gaussian\n", 350 | "\n", 351 | "Find the parameter $\\sigma$ of a Laplacian of Gaussian filter by measuring its response to different sinusoids. (3 points) \n", 352 | "Use equation in _[LinearModelsSimpleCells](https://cs.jhu.edu/~ayuille/JHUcourses/ProbabilisticModelsOfVisualCognition2017/Lecture3SimpleCells/SimpleCellsRetina.pdf) - The Response of a Center-Surround Cell to sinusoids_ if you want." 353 | ] 354 | }, 355 | { 356 | "cell_type": "code", 357 | "execution_count": null, 358 | "metadata": { 359 | "scrolled": true 360 | }, 361 | "outputs": [], 362 | "source": [ 363 | "import pickle\n", 364 | "\n", 365 | "unknownLoG = pickle.load(open('data/gabor/unknownLoG.data', 'rb'), encoding='latin1')\n", 366 | "plt.figure(); myimshow(unknownLoG)\n", 367 | "[X, Y] = np.meshgrid(np.arange(-100, 101), np.arange(-100, 101))\n", 368 | "surf(X, Y, unknownLoG, alpha=0.3)\n", 369 | "\n", 370 | "# You can use sinusoid as a stimuli\n", 371 | "# For example:\n", 372 | "rho = 0\n", 373 | "omega = 0.1\n", 374 | "theta = np.pi/3\n", 375 | "sinusoid = genSinusoid(unknownLoG.shape, 1, (omega*np.cos(theta), omega*np.sin(theta)), rho)\n", 376 | "plt.figure(); myimshow(sinusoid)\n", 377 | "response = convolve2d(sinusoid, unknownLoG, mode='valid')\n", 378 | "print('Strength of response:', response)" 379 | ] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "execution_count": null, 384 | "metadata": {}, 385 | "outputs": [], 386 | "source": [ 387 | "\n" 388 | ] 389 | } 390 | ], 391 | "metadata": { 392 | "anaconda-cloud": {}, 393 | "kernelspec": { 394 | "display_name": "Python 3", 395 | "language": "python", 396 | "name": "python3" 397 | }, 398 | "language_info": { 399 | "codemirror_mode": { 400 | "name": "ipython", 401 | "version": 3 402 | }, 403 | "file_extension": ".py", 404 | "mimetype": "text/x-python", 405 | "name": "python", 406 | "nbconvert_exporter": "python", 407 | "pygments_lexer": "ipython3", 408 | "version": "3.7.4" 409 | } 410 | }, 411 | "nbformat": 4, 412 | "nbformat_minor": 1 413 | } 414 | -------------------------------------------------------------------------------- /HW1/HW1Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Homework 1 Introduction - Probabilistic Models of Visual Cortex and iPython Notebook Basics" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "This homework contains code demo to illustrate concepts from the lectures. The code is written in python language. To run these demos, [IPython/Jupyter notebook](http://ipython.org/notebook.html) is required. The IPython Notebook is a web-based interactive computational environment where you can combine code execution, text, mathematics, plots and rich media into a single document. In this document, we provide instructions of getting started with this tool." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Click this link to begin the first homework -> [GaborDemos](./Gabor.ipynb)" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "## What's IPython notebook (also called Jupyter notebook)?\n", 29 | "\n", 30 | "\"The IPython Notebook is a web-based interactive computational environment where you can combine code execution, text, mathematics, plots and rich media into a single document\" - [ipython.org](http://ipython.org/notebook.html)\n", 31 | "\n", 32 | "In IPython Notebook, you can use python code to perform various computations interactively." 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "# Installation" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "Here's a very brief installation guide. If it's not detailed enough, check the instruction from the [official website](http://ipython.org/notebook.html), or google it.\n", 47 | "\n", 48 | "**Windows/Mac/Linux:** \n", 49 | "The simplest way is to install Anaconda (a python distribution for scientific computation). \n", 50 | "https://store.continuum.io/cshop/anaconda/\n", 51 | "This definitely works for Windows and OS X and ensures you have all of the correct versions of the required libraries.\n", 52 | "\n", 53 | "**Linux/Mac (advanced):**\n", 54 | "1. Install pip with package manager (for ubuntu, it's **apt-get install pip**).\n", 55 | "2. Use pip to install dependencies (notebook, numpy, scipy, etc.) (In later versions of OS X, you'll have to install these packages in a virtual environment, or else just use Anaconda!)\n", 56 | "\n", 57 | "**pip install notebook numpy scipy**\n", 58 | "\n", 59 | "**NOTE:** Installation of ipython notebook should not take you too much time. " 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "# Usage" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "To run a notebook, navigate using your terminal/command line to the directory containing the .ipynb file and execute the command `ipython notebook`. Then select the notebook from the page that opens in your browser. To execute a cell containing python code, select that cell and press **Shift+Enter**.\n", 74 | "\n", 75 | "Here is the Hello World demo to show how the notebook works\n", 76 | "\n", 77 | "- Select the code cell below and press **Shift+Enter** to execute it." 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": null, 83 | "metadata": {}, 84 | "outputs": [], 85 | "source": [ 86 | "print(\"Hello World!\")" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": {}, 92 | "source": [ 93 | "If you have programming experience with a programming language like C, MATLAB, or R, then Python should be fairly easy to grasp.\n", 94 | "You can find a lot of tutorials on the web.\n", 95 | "\n", 96 | "Here is a video tutorial to show how to use python in IPython notebook. The videos 1-5 (skip 2) are enough for this course. It's suitable for beginner **without** python knowledge. \n", 97 | "\n", 98 | "[Video Link](https://www.youtube.com/watch?v=R6Sh58B3cOE&list=PLRJx8WOUx5Xd3_dgw5xRmABUd8MWdsA_C&index=2)\n" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": {}, 104 | "source": [ 105 | "# Updates" 106 | ] 107 | }, 108 | { 109 | "cell_type": "markdown", 110 | "metadata": { 111 | "collapsed": true 112 | }, 113 | "source": [ 114 | "\n", 115 | "**Note:**\n", 116 | "\n", 117 | "Code is previously written and tested in python2. We have now modified the code to run in python3. If you are using python2 and got any compatible issue, please post it on Piazza.\n", 118 | "\n", 119 | "Original notebook by Weichao Qiu, modified by Donald Li, Chenxi Liu and Hongru Zhu." 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": { 126 | "collapsed": true 127 | }, 128 | "outputs": [], 129 | "source": [] 130 | } 131 | ], 132 | "metadata": { 133 | "anaconda-cloud": {}, 134 | "kernelspec": { 135 | "display_name": "Python 3", 136 | "language": "python", 137 | "name": "python3" 138 | }, 139 | "language_info": { 140 | "codemirror_mode": { 141 | "name": "ipython", 142 | "version": 3 143 | }, 144 | "file_extension": ".py", 145 | "mimetype": "text/x-python", 146 | "name": "python", 147 | "nbconvert_exporter": "python", 148 | "pygments_lexer": "ipython3", 149 | "version": "3.7.4" 150 | } 151 | }, 152 | "nbformat": 4, 153 | "nbformat_minor": 1 154 | } 155 | -------------------------------------------------------------------------------- /HW1/data/gabor/Zebra_running_Ngorongoro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW1/data/gabor/Zebra_running_Ngorongoro.jpg -------------------------------------------------------------------------------- /HW1/data/gabor/unknownGabor.data: -------------------------------------------------------------------------------- 1 | cnumpy.core.multiarray 2 | _reconstruct 3 | p0 4 | (cnumpy 5 | ndarray 6 | p1 7 | (I0 8 | tp2 9 | S'b' 10 | p3 11 | tp4 12 | Rp5 13 | (I1 14 | (I65 15 | I65 16 | tp6 17 | cnumpy 18 | dtype 19 | p7 20 | (S'f8' 21 | p8 22 | I0 23 | I1 24 | tp9 25 | Rp10 26 | (I3 27 | S'<' 28 | p11 29 | NNNI-1 30 | I-1 31 | I0 32 | tp12 33 | bI00 34 | S'\x08\x80\x03\xc1\x89t~;aF\xaa\x0b\x96\x88\x83;\xf2\xce\xd1Q\xfa\x10\xc5\xbbQ\xb6\r\x03\x98\xa6\xfc\xbb\xd7\x08\xd9\x97\xb7\x8b%\xbc\x14[\x98\x90\x0e\xebD\xbc\xd6\xb4\xad{\xdd\x1fQ\xbc\x0f\x12\xdb\xaa\xad\xcez<\xc4\x86\xa6\xc4\x94\t\xb2<\xa9\x7f\xa4\x14\xca\xe3\xd7<9X\xdf\xf5\x03\x86\xf4DP\xbdwR\x02\x99\x12\x17s\xbd\x00c\x04\x98\x07\xdc\x8c\xbd\xb0 \xd8\x16\xb0\x83\x98\xbdk\x05\x9e9>\x19\x95=\x15\xd6\xaa\x859\xf0\xd4=\x1e\xf6\x1f\xef\xd9\xfb\xf5=\x93m\xc3\x1al%\r>\x01\x05\x80\xbf!3\x17>\xfb\xc1paIR\xdc\xbdZ\xde\xa4\x02\x16!C\xbe\xc3I\x1d\xfc\x84;b\xbe\xfa\xe2\xb2th,u\xbew\xc8H1\x96\xc6~\xbe*\x16\xda\xae\x8f\xbcb\xbe\x19\xc9v\'\xb6\x96\x98>a\xce\x07\xb9\xf1\xc2\xb5>/\xeb\xa2\xfc\x90&\xc6>\xc2\xeb\x94\xf8\x88\xe9\xcc>^\xb2!\xbf\xdd\xaf\xbb>\xd5\xf7O\xe7=\xe4\xd5\xbe\xc9\x14xg\x15\xaa\xf2\xbeo\xcf\xa1\xec\t\xb2\x00\xbfF*\x96\xc0n[\x03\xbfzEk\xfcB\n\xf5\xbe\xb3\xb5\xbfkY-\xfa>Qh\xbc\xc0\xe5\xf5\x16?+\xb9\xdeA1#"?c\x9b\x85w\x1d\x8c"?C\x86\x80\x1ca_\x14?!$Ng\x16x\x03\xbf\xdd\xe6\xec\xad^2$\xbf3\xc9\x91K6f,\xbf_\xc5_\x89\x96\x80)\xbfV\xc4k;V\xba\x1a\xbfX\xf8\xc3\xba-\\\xea>\x10L<\xbb/K\x19?\xe2\x99j\x19[\x04 ?\xb6=\xf6\xf6\xc24\x19?\xe6\x19\xfcG\xafc\x08?\xd6S\xb8\xf8\x9d\x16\xc3>\xe4\\\xf7Q\xa4d\xf6\xbeib\xfa\x84\\\x03\xfa\xbe!}`\x8dD\xee\xf1\xbe8\xabR\x1a\x8bb\xdf\xbe\xb9\x94\xea\xde\xa3p\xb0\xbe\xa1\xcai\x8a5\xb4\xbb>\xdc\xe8}\x04\x83a\xbe>\xf1\x0c\xc1\xb0\x05`\xb2>\x15p\xd9\xaem\xb4\x9c>\xe8\xde\xae\x96R\x08s>\xe8+\xd9\x15\x04og\xbe\x0c\xf3\xb8\x03\xcb\x07\x8d;\xdeL\xf3\xdf3\xce\xa5\xbb\xf1S\xc28\xf2\xaa\xeb\xbb\xaaj\xd2t\xe0\x97\x19\xbc\x82?i\xcd5Y>\xbc\x0c\x95\x8a_\xec\xb8T\xbc/\x9ah\xd2\x91\x8dR<&g\xad\x9e\xbf\xba\xa2o\xea\x1c\x8b\x882\x1c>\xafp\xdf\n#p\x17>\xca\x9db\x0fdG6\xbeeg\x8e.\x92\x0e_\xbe\xf2\xc8\xd2\x8c\xbe\xd1u\xbek\xbf\x7fG\xfe\xe2\x83\xbe\x18\xe0\x9f\\Z\xe3\x81\xbe+&\x98\x94y.\x8b>\x10\x87\xdc\x99\x13"\xb4>\xa0\x15\x067\x1c\t\xc9>\x10\x954\xce\x8b\x17\xd4>@2\t\xdb\x8d\xdc\xd1>\xc4\x04-\xfb\xa8\x9b\xc3\xbe]S\xe1)c\xa4\xf2\xbe\x11\xee\x15\xbd \xb3\x04\xbf\x91\x91q\x05B&\r\xbf\x1d\x8a\xac\xdc\xf9k\x08\xbf\xb4\xf3\x01\x85\xe4k\xd1>\xf3\xaa\xbaL\xab\x87\x18?\xa8Rf\n\x93\xa7(?\xbe\x89YQ\xc7i.?Af\xae\xb3\xe8X\'?\xae\xc1\xf4zg\x1a\xf9>-\xbe\x1aT}\xbf&\xbf\x05\xd4\xd2\x00>"5\xbf\x80p\xc8%G\xd86\xbf\x82}\xe5\xfa\xe9\x91/\xbf\x11c\x0e\x16\x8a\x1e\x0e\xbfv\x17!\x03\xeaQ\x1d?\x7f\xd4\xb6\xa3\xe3\n*?\xf5P\x1b\x03{\xb9(??X\x11\x91|e\x1e?\xb1t.\xb1\x9a\xfb\x00?\xf5\x92\xf0\xe4p\x8e\xf9\xbe\x84\x99\xfa,\t\x06\x07\xbf\x99\xc7S\xe7\xaaH\x03\xbf\xd9\xab\x1d\xd5#\xee\xf4\xbe\xd4\xe0qP=\xf6\xd7\xbeF\xf7\x1d\x89\xeb?\xbc>,\xce6d( \xcd>\x90c3\x1b\x9f\xad\xc5>J\x85\xc0\xb9t\xac\xb4>!\x9b(\x877\xc0\x96>\xc0*\x82\xacVl_\xbe#\xba-\xe7\x80@z\xbe\xea9\xe2\x89\xe6\xd5y;\xb7\x01\x03\x11\x10\xc0\xd6\xbb\x94\xf4\\\xfa\xf0\x90\x0b\xbc\x94\xab},\xea\xac3\xbc`\xe6\x12\x1b\x85\xe1Q\xbc\xdf\xd8\x00\x94K\xa8T\xbc\xbd\x11_\xf4\x81\xe2\x8f<\x8e\x965\x9e\x1eR\xc2<\x0b&\xce\xeb\xb0\xf4\xe6<\x9e\x0e\x0e\x17[\x98\x02=\x8b\xaf\x19T\xe3L\n=\xf62\xf8\x82\x06o.\xbd\xae\x92\xf4,\x8cza\xbd\xf72J\xc3\xf1L\x83\xbd\xc5X\xdf\xdd\xbb\xa3\x9b\xbd$\xb2\xc8vIe\xa4\xbd(A\x83\xce\xf8\xc1\xb2=O\xd9O\xb0<\xe0\xe7=\x06u\xa79\xb1c\x07>\xc9\x01\xc0\x05\xbes\x1d>A-\xd4\xe3\x82\x17%>\x83}h\xa4y0\x19\xbe\x9c\xa4\xd3\xb9\x8dBW\xbeQ\x9a\xcej5lt\xbe@\xd6f\x9d\xd8\x8b\x86\xbe\xc1\xb9\xf2x\xbc\x1d\x8e\xbeh\xe1Cu\xde\xe3\xdf\xbd\xed\xe73\xcc\xd1\x10\xb0>\t\xd5}\xd4\xc1\xae\xc9>\xdd(Hd\xb0\xd5\xd8>9\xfb\xfdE\x882\xde>s\xb2~\x83\x9e}\xc1>\x91U\xc1;<+\xef\xbe\x9c\xf6G4k<\x07\xbf\x16\xf7\xdc\x18\xfd\xb2\x13\xbf\xb8\x0b\x04\xe1\xc5w\x15\xbf@f\x8b<\xfc\x04\x02\xbf\xa0\x00\x0f>@\xdf\x14?DA@\xa2\x954.?I\xed\x8e\x00\\\x846?\xf8VPd\xe6\xc45?\xa9\x18\xf3\xa8\x9e=$?G\xcf@\x13\xd5\xa2"\xbf\xc4\x9c\xea\xaa\x0f&<\xbf}\xb7\xe4n\x80\x8cB\xbf^uz\x01c\x9b?\xbf\x91\x07\xe0\x12b^-\xbf\x01\xa2\xa0#2C\x14?\x1b\x867\x02\x1a\xbf2?5>\xbd\x18\xaf\x056?T\x98\xe3b\nx0?\x80\x98\x0b\xe2\x13\x06\x1d?6\xcb\xfc\xa3\x98}\xe1\xbe\xdc@\x92\x8d\x89\xc2\x11\xbf\xca\xcc+k\x85\xd5\x12\xbf\xb3\x05\x87\r\xe0\xad\x08\xbfg\xb4A\x8d\x99\x00\xf4\xbeA\xf6\x87B\x17\xdd\xb1\xbe\xf7\xc2pT]\xc1\xd7>|\xf7\xdb\x1aG0\xd7>W\x85m\xb8\x02\x9f\xca>\x8b\x01V\xe2\xf2w\xb3>S&O\xd0\xfaT\x82>\xf7/\xe35\xab%\x86\xbep\xa3\x86\x02\xb9\x86\x84\xbeo\x82\xf4\xf4\xf9\xd7\xbb\xbb\x8d\xce\x08\x0eF\x9d\xfa\xbb\xea3\xde\xfe\\\x1c\'\xbc\x86\x81\x0cp\xac\xfcI\xbc\'\x88 \xb1\xf8=_\xbc\x04t\x18_i\x17q<\x06B\x99I\xf1$\xb3<\xb2\xfd>\x7f\xcc\xf6\xf3"s\x1b>m\xc8\xb3\xderd*><\xfcl\xa3N\xad\x1d>\xec\xd2\x85|y\xc8L\xbe\x9c\xfch\xed6Iq\xbe\x04I\x81Bu\xfe\x86\xbe\xfa\xe9\xc4\xc7\xa2\xbd\x93\xbeoY\xa6ddx\x8c\xbe\x07\xc9j\xb4\x1e\xf6\xa3>\x86\xc6\xff)\x1b\xb3\xc7>\xeb.9\xd8g\xc2\xdb>P~\xe1\xd9(\x17\xe5>\x00\xda"j.(\xe0>SN\x85\x01\xbf\x1b\xe2\xbe>\xaf\x8c\x16\x06F\x07\xbf\xe3\xa19\x0f\xe5&\x18\xbf\xa0\x1a3\x83k% \xbfw\xb6\xf0\x02t:\x18\xbf\xb3b#\xdfy\xc8\x02?\xd2\xa4\xb4\x00\xe2O0?\xba\x88]\x81ZH>?T\xef\x8apU\xc1A?\x8a\xde\x93\xd9\xa5\xfa8?9\x07\x84\xa0\x0e\xf5\xed\xbe\x00\x04\xcc/\x15;@\xbf\xc8^(\x84\x82XK\xbf\x8d\x82\xb2\x0c\x87\x16L\xbf\x9d0n\x87\xa6\x0bB\xbf\x84\xab\xe3\xaa}!\x13\xbf\xed\x01\xfc\x96\xfe\xb96?\xee\x1d\x93\xeb\xdb\xc4A?\x98\xce\t\x89b\xfe??\xd2\xed=\xd9Uv2?\xf3\xd4k\x1c@\x18\x0f?\x04\\\x81\xd0[\x0c\x16\xbf*\x84o\x08$\x98 \xbf\xff\xb5\xed\xf9pA\x1a\xbf\xe7E\x01\x87\x9f\xeb\n\xbfr\x17\xbdF\xa2\xcd\xe9\xbe\x87`\x9f\xe7\xde\xbf\xdc>)\x7f\x1dx\x90:\xe6>\rr6\xd9W\x0e\xdf>\x8f\xcf\x89\x81F\x16\xcc>\xf6\x15fPM=\xab>9\xa7\xb7S\x17]\x87\xbeE\xf9|`\xe5J\x95\xbe\xaa\xc7\x88/\xedx\x8a\xbe@7\xa6J\x0bW\xe6\xbb{`\xca\x87\\\xa6\x18\xbcgt\x93v\xaa\xb8@\xbc\xaa\xfcM\x88\x181\\\xbcf\xbe\x8ad\xf8xO\xbcK\xdd\xc6I\x7f\xf4\xa0<\x0c\xf9\xe4=\xe5E\xd1<\xd3MOx\xc4\x88\xf4<\x15\xb6\x0e4K.\x0f=\xa8:N\x96\x96\x0f\x10=}\x08\xdb\xa7L\xe6A\xbd\xd7\xdc|\x9a\xb5fq\xbdCE\xfb5\x83*\x92\xbd\xb9N\xfa\x81\xec\x8c\xa8\xbdwp0\xada\xe5\xad\xbdTE7z\xff\x99\xc9=\x8cZ!H\x01(\xf9=\x85u`\n\xbc)\x17>/\x82\x93\xa2\xcf\xa4+>\x84+\'^\xd9O1>g\xeb\xdbP\x97R7\xbe\x93h\xf9"\xeb\x05j\xbe_\x86K\x83\xdcH\x85\xbe1\xcf|\x89\xabR\x96\xbeL\x8c\xe6\x9eu\xee\x9a\xbe\xf2\xd2\xeb\x9a\xf5\xd3\x85>\xff\xb3\xb0|C/\xc3>\xbf@\xd0\xc7\xc8.\xdc>\xe3\xfb\x93\xc07\xe8\xe9>\x84\xe3\x86_0\x05\xed>\xfah6\x83\x8fN\xa7>9\x98}\xf2\x19\x08\x04\xbf}D9\xc1\x81\xde\x1a\xbfH1\xf7\xf9\x8e\xa2%\xbf\xbe/?\xfc\xd0\xff%\xbf\t%1}v\xb4\x07\xbf3\nu\x1fPQ-?\x13\x98\xe9\x11*mB?\xa0\x92\xffZ)\x06J?K\xbd_me\xacG?\xef\x99\\\x03#S1?\x89J\xd4p\xc9\x82=\xbf\x8eo\xef\x0c\xc6&R\xbfR\xf4J\x19T\x8eV\xbfKlU[J.R\xbfL\x19\xb0\xd1N\xdb<\xbfh\xeb&\x0e\x99\xa33?\x08w.\x95a\xa0I?B\x02\xdf\x9e\xca-L?\xeb\xb9s\x92C\x00D?\xde\xf46w\x0ch/?\xa85\xc0\xa0\xac\x01\x0f\xbf\x99o\x9b\x82\x1c\xd7)\xbf\xa2t\x8bX\x14^)\xbf~\xc1_\xebq\x98\x1f\xbf5\xd3\x11\x11Cd\x07\xbf\xc2\xe2+\xb9\xe0\x1f\xbf>\xc6Y\xde~\xf7\x83\xf2>\x14\xf9\xadj\xe0r\xf0>fNB\xc4U\xf2\xe1>\xa3l\x9a\xafy[\xc8>\xafH\xf0\xbfJ\xb2\x86>\xb0A\x82\x1e\x13\xb4\xa2\xbe\xa0\x12o\x94Q\xb4\x9e\xbeB\xd9\x93\xa0\xfdZ\x8d\xbes,\xb5\xbd\xbf\xb3\x07\xbc<\xf2\x15>~m3\xbc\x84^N\x9f\'\xa6T\xbcs\x9a\xcf\x03\x99\xf4d\xbcD\xdf\x0f\x0c\xc6\xf6\x85\xde\xc4\x00\xf0\xec\x94)>\xa9\xdf\xe4\x1a\xd7\xc36>\x83\xfb\xb2~\xe5\xa3\x14>lY\xf5\xa2\xd1\xaf`\xbe\xd3K\x82V\xa2\xdd\x81\xbe\x1c\x9d\xcb\xa7\x90\x8e\x96\xbe\x0b\x1e\xa3w\xeb\x1f\xa2\xbee\x92\xc7\xda[`\x92\xber\x9a\xaaS\xfdz\xb9>\xda\xa3\x90\xe8\x81\xdb\xd9>Z\xcd\xcav\x94\xa7\xec>\xf2\x84\x81\xb2\x93\x86\xf4>C\xda\xfd\xbf\xe8\x94\xe9>\x82\xa4\x12x\x17\x83\xfa\xbe\xb1\xc7\xcay\x93\xdc\x1a\xbf\xd43\x98\xe9*;*\xbf=\x00\xe0\xb5_\x9c0\xbf{\x8c\x98\xdb\x1a\xa3%\xbf\x83\xbcx\xf3"\xd6!?\x7f\xc6\x88\xa8j\xfaC?\x90h\xf7&0NQ?\xb8\x11\x07+\xe6ES?\x13(\xa7\x85gbH?\xd6H\xc3\xe1kH*\xbf>\xeb\x06k\x012U\xbfzq\xbd\xa1\xc3s`\xbf/F\xc3r\x8a\x10`\xbfx\x97D\xa6\xe6\xf6R\xbf\xfbm\xd7X/\xf3\xc9>a\x87M\x98\xb1\xe3O?u\x1f\xb7\x05\xed\x86V?r\x81\xd9\x88IDS?8\xa0\xb6\xfd\xf7\xb5D?\xc5c\x86\x14\xc3\xf2\x14?\xf3\x14V\x9bg\xd90\xbf\xfb\xc2\x0f\xf9\t16\xbf\x11\x10J\xa6\xc3\xa30\xbf"\xd2HB\xcd\x08 \xbfZ2\xa6\x89u\xaf\xf7\xbeEkd\x94s\x97\xf8>Xv\xff\x89Di\xff>\x9c.\xc0zr\xb5\xf4>\x13Y\xe6\xa9\x9a\xb4\xe1>\x9b\xcc\xcfX\x97\n\xbd>\rU\xe4\xcc\x97\xf2\xa7\xbe\nQh\xf7\xfa\xdf\xaf\xbe\xa1\xf0\x1bP\xf1\x92\xa2\xbe3(\x8d\xee\xe7\xfd\x8b\xbe\x8f\\C\x05(\x80$\xbc\xd3y\x8aG]pJ\xbc\xd3\x9dx\x00\xfegd\xbc\xa8\xb1\xbd\xa7\x9c5A<@\x81\xfd\x13\x99]\xb0<\x01\xd5\xa9V\x07D\xde<\x82\xb8\xa3\x13^\x18\x01=n\xc3\xe7\xec\xba\x1f\x18=\x93\xc4\x7fT\xd0\xe1\n=\xde\xa8I9}\xc1R\xbd\xf6Cxd\xb1\x13\x80\xbd\xe3\xb6S\xcf\x9c\xd5\x9f\xbd\xb1\xb2n\xa8\xe1/\xb4\xbdt\x05\xc4\xef\te\xb2\xbd\x11<;\x14-\xd0\xdd=\x08\xc75\x82\x9f\x8c\x08>\xc0\xdf\x0ed\xd6Z%>S?2\xd2\xfe\x118>\x19|\xbf\xd2\x95)9>\x8a\xf9\x9b0j\xe8O\xbe\x10;\x9d\xd65\xe3z\xbe\xad\x8a\xa3\xe2\xa5\xa5\x94\xbel\xde\x9b\xc7u\x88\xa4\xbe\x80\x1f\x10fh\xcb\xa5\xbe\xae \xf88\xd9e\xa5>\xed!\x0e\x87\xb5\x0f\xd5>>\xc4\xcbG\xc0\xc5\xec>\x82Q\xd3\x8d\xc3!\xf9>\xd6\x0fu"\xd0\x84\xf9>\xa4\x14)-\x0e5\xdb\xbe\xffr.\xcd\xf9~\x17\xbf\xba\xda\x8a\xf5\xbc\xe2,\xbfI\x13\xca\xec\x1d\x1c6\xbf\x85\xad\x83bL\xc24\xbf\xbcjKO(\xbd\xfa\xbe\xf8\xba\xd6\x87!\x8aB?\x15\xda*\x07\xc1\xe0T?8n\xc4\x1fL\xff[?\xa8\xae\x0e\x88\xa5\xccW?\x123|\x00\x84t7?\xc1\xabc\x8e\xf9uT\xbfe\x86\x15\xdai\xb4e\xbf\xaa\x1fg\xfa\xff\x88i\xbf)\xcei\xe4\xaabc\xbf\x94\xf50;/\xa0H\xbf\xbb\xa0x\x18\xd3\xeeN?\xfa,\xd3\xab\x893`?\xda\x02\xde\xc3@\xc8`?\xd6\xe8\xf8\x11j\x8dV?\xd0\xb9\xd3\x96\xe6}>?\x95\xd9\xcb;\xb7\x9e.\xbf\x1ex$\xb3)SA\xbf\xea.4\xc9\xad\xcb?\xbf\xce+\xcd\x83\xbd\xcc2\xbf\x03\x9a\xd6$\xb6\xea\x18\xbf\xe1\x912\xb3\x9de\xf1>~\xcc#bfr\n? i\xdd\x0b\x0f\xb4\x05?\xc9\x94\xd4\xec\x83\x82\xf6>\xea\x7f\x9b\x8be\xfc\xdb>\xea\xf5l\x91mU\x80\xbe\xf6\x1b\xe4h\x0c\xa9\xbc\xbe\xb0.\xac\'\xcdV\xb5\xbe\x9f\xf0\xf5\x85\xdbb\xa3\xbecOK7J\x05\x86\xbe\x82\xbc1Dnh>\xbc\xfb~2\xfd\xb3f^\xbc\x92!R\xcd\xbe\'h\xbc\x8e\xf2"\xba\x1ft\x97\x85(K~\xe1,6>=G\xe22\x99\x02B>\xb8\xb2\xb6\xa8c)\x1e\xbe\x02w\x01\x81\xa2\x98q\xbe\xca\xd7\xd3\xfaQ)\x91\xbe\xa1\xa5\xe6F\xe2\x97\xa4\xbe\xcc\xd3Y\x98\xf2\xb0\xae\xbe\xd1\xf1=\xb4\x10\xa5\x8d\xbe\xdb\xfb\x891\x04\x18\xcd>\x06\xf9yR\x050\xea>p\x83I\x93\xee\x88\xfb>~9\xc6c\xf4{\x02?\xbb\x15\xc7u=\xba\xf0>-\xb3\xd2\x84\xaa\xbb\x10\xbf\xbbq\xb4o\xda\xb9,\xbf\xcb\xaa:v\xb8\x85:\xbf\xd2e^\x9be\xb2?\xbf\x06\x9eI\x82\x0c\x031\xbf\x1aT\xbfN\xba\x17:?\xff!/\x1d\x19\x9cV?\x96\x18\x1e\x7f\x0bib?\xfc\xbc4Y\x88nc?\xb7w\xa6\x90\x1b|U?\x17\xb9gL\x9d\xf4I\xbf\xde\xd0\xbe\xac\x1fxi\xbf\xf9\xdakJekr\xbfL\xb5\x1d\xba\xfc\x15q\xbf\xd5\xe8\xc7\xb6\xdc5b\xbf\xe2k-\x16\xa8\xb6:?1\x83\x81\x1d\xb1rd?:\x95?~\x0e\x8ej?\x0c\xdfv\xdf3\x97e?(iv\xe7$`U?\x84\xe3\x8c3UH\xfb>lY\xc8\xdd3AG\xbfv\xa8_q\xd6\x90K\xbfQU\xdc\x92\xb1\xa1C\xbf\xeb\xb3h\xe5\xf4\xa51\xbf\xcb\xf8\xc4\rx\xa3\x00\xbf:@\x9e\xeb\xf1\x89\x12?\xef0[\x00c\x95\x14?4=\xbci\x11\xb6\t?\x84\\\xd3-~\xae\xf4>6@\x17ER\xa6\xca>,\'p\x03|V\xc4\xbe\xc7\x83\x9bW\x0e\x14\xc6\xbe\xf1\x80)\xf9wC\xb8\xbe\xd7i\xb3\xd8\xadK\xa1\xbe\xc5\x02\x0e\xbf\x1f8x\xbe\xebQi\x1ecnS\xbcX\x9b*\x81L\xf1j\xbc\xc7\xe9\xf1;4\xddp\xe4\xda>D\x05T2>xP\xd8\xd6\xcfhC>N\x8ad\t\xe1\x13?>\xee\xf8\x01\xdf\xcfib\xbe\xab\x07\xcaP\x9c\xb8\x89\xbe\xb0\xfc\xf2\xca1\xa5\xa2\xbe\x9ea\x16u\x82\x86\xb1\xbe\xc8\x14g#\x93_\xaf\xbei\xd7\xf3O\x0fs\xbd>\xf5\xc0oCXW\xe5>\xd5\x02\xea\xef\xe1V\xfb>\x0e)\xf2}A\xa7\x06?\x10?\xfc\x8c\xbcY\x04?pf\x0e\x1c\xa7\xef\xfc\xbeX\xcf\xbd\xb2nP)\xbf\x99\'\x99\x99j\xe3<\xbfg8O\x00\x9c\x03E\xbf_\xad+\x9b\xea\xf1A\xbf3\xbe\x18\x08\x8f\x00\x18?I$t\x1dD]U?\xd5~iN>\xfde?(\xb5\xf7\xacf\x07l?\x85n\x19\x1a(\x0cf?\xa5\xed\xf0\xf4\x90#1?1\xe1\xa6r\xc3xi\xbf\xed] \x03\xe9\x18x\xbf3\xe0R\xc7\xd7\xe8z\xbf\x93\xe5\xa1A\xf9\x1ds\xbf\xcc\xe9\xfa\x080\x02Q\xbf\xfd\xacu\x9c40e?\x8dV\x01m\xd1\xfcr?D\x98Y\xb5\x12\x9cr?\xbb_\xdd\xack\x93g??\x07\x90\xaa#\xe4I?\xe8Z\xac\x91?\x08H\xbf\x86\x817\xaahzU\xbf\xdf\xdeb"c\x8cR\xbf\xc4\xfek\x96\x8c\xc6D\xbf\xeb6\x08\x00\x91\xe2\'\xbf\x89\xe4\x8c\x05\xc5\xa5\x11?\x9a]\xda\xb6\x1be!?\x8e\xa8To\x9d\xa5\x1a?\xec \xe7\xc6T?\n?\x13\x15Q\xa9\x9aU\xed>\xf2G7\xe4\x8f\x87\xbc\xbe\xf0&\x83P\xf5\x18\xd4\xbe\x96\x91\x1d\xda.\x95\xcb\xbe\x0c\xeb\x94\x86I\xd2\xb7\xbeU\xcdL\x9fe\xda\x98\xbe\xd8\xf1\xe9%S|\x0f>\x9ceA*\x9b\xafd\xbc6\x0er\x1eb\xd9e\xbc\xc4\xfd?qU\xf8\xa5<\xe4|\xb8\t\x8e\x87\xd9<\xa8\x0ee\xa9\xac\x83\x00=\xcbs\x02\xbeA\x8f\x1b=\xcf{\xe1\xd7o\x07#=~\xa7\x08\xd2\xae:K\xbd\x03T\xb3W\xf5(\x7f\xbd\xc7\xdb\xac\xa8]\xbe\xa1\xbd\tG\x14&V7\xba\xbda^\td\xd7]\xc3\xbd\xebu\xbcw\x8e)\xd6=\x85eK\xc0\xef>\x0b>\xa4\xc0\xe7\xc4\x97z+>\xef\xf3\xef(\xfb\xddA>\x9a\xc91\xd9\xb8\xf1I>B\xa1\xd3\xd8)\xecD\xbe\x9d\x8em\x1a\xec\x01\x81\xbe&\x9b\xe8M\x14\xaa\x9e\xbe\xe5/\x83\xc3+}\xb1\xbe\xed\xed\xf9\xc4w\xdb\xb7\xbe*F\xe2 \xe78\x83>\xb9\x9a\xcd*\xe4\'\xde>$\xe3\xee\x1cK\xa5\xf8>\xbe\xb2\x08\x87\t\xa0\x08?;)1\xb8\x16\xb8\x0e?\xe8#\xfa[\xe7\xc2\xed>$-o\x81\xbf\xd2"\xbf\xd8\xb6qDN\x82<\xbf\xf0R\xa8\xb6\xe3\xf6H\xbf\x91$[\x96\xaa\xfeK\xbfo\x9b/\xa7\x1dm6\xbf\x8f~\xf46)MP?\xcd9\xcdiY\xb3g?\x04U\x80\x93\xbd;r?\xd4\xde\x9d\xda\xb2,r?\x05\xab\x1bA\x9d\xc0`?g\x0f\xd2\xf6\x17\x06c\xbf\xee\xa9q\xaf\xfcC|\xbf\xda&\x86\xc4\xc21\x83\xbf1\x9a\xd4\x07\xc7\xe1\x80\xbf\x08\xd1I\xcb \xa4o\xbf\x83\xf8\x19\xd8\xaf\xdf[?\xdb*z\x16C\x1cx?\x92\x87\xcd\x8d\x8a\x1f}?\xabs\x98\x8a\xc0\x7fv?\xf5~6\x0e\x1d/d?\xd9\xaas\xb0\xee\x8c3\xbf+8\x9cs\xf0J]\xbf\xbcF\x1d\xa7\x91\xd5_\xbf\x8a\xf6\x0c\xfe@\x8dU\xbfR\x86\xdcR\xa1\xe2A\xbf\x8c\x99ie\x1a_\xf3\xbe1F\xa6\xc5\xd9,)?UGhD\x80\r)?AT\x9f5\xd9\xb6\x1d?)v\x1b\xe8\xf2T\x06?\x8b\x9c\x0b\x92wI\xd3>\x85\x81\xa0$\x02E\xde\xbe\xaa\xbb4\xbe\xd5[\xdc\xbe<\xaa\xd3]\xf8\x81\xcd\xbe!\xa4K\x80\x0c\xcf\xb3\xbe\xd8Y\xa1\x95\xdb)\x86\xbe\x08H^\x0ep\xf0x>\xe1\x8b\xbd\xec\xa1\np\xbc\x8b\xf6\x144\x01"\x86<\x06\x98\xeb\xd3`\x85\xc7<\xd7q\x93\xef\x83\xb1\xf2<\x86\x1e\xf7\x15\xc3\x11\x13=\xae\x13\xe6\x88\x8fG&=\xf6\x1f\x80\xa6\x8e\x1c#\xbd\xf5-\x80\x19\xe7\xe3n\xbd5\xe81\xbb\x8b\x07\x96\xbd\xdf!h\x1a\xf5\xb2\xb3\xbd\xac\xd4z\x93\xeeg\xc5\xbd\xe3.~S\xf9\x8c\x84\xbd\xe6R\x1f&,\xbe\xfc=\xca*\x17p\x90\xb1">\xb2\x028\xc2\x9eH=>\xc5\x01\xbe\xe7\xd4\xeaL>\xfe9b\xbb\xa7\x12=>\x9a\xcf\x073@\xc2r\xbe\xd7D\x0c\xe3\x84\xd2\x96\xbe\xb3\x04\x9f\x00\x9dY\xaf\xbe\x1d\xe4\xb2\x0b\x0b\xb7\xbb\xben\xf4\x1e\xf7Sb\xb3\xbe\xa6\xa9\xf9\x06\xb1\xdd\xd0>`\xe5c\xe1\x84\x03\xf4>/\xa4\x820\xd8.\x08?\xd9\xe9\xa6\xaa\xba\xf3\x12?\xb5\x03\xf8\x12\x84\xfb\x0c?a\xa8\x89K\xd2\x1e\x14\xbf `\x05.i(9\xbf\xb0\xce\xda\x85K\xe3J\xbf\xa7\xee\x95.\xaf\x8fR\xbf\xa2+\x1d\x96\xe30L\xbf\xcf\x04i\x13A\xca\xa5d\xd9\xf3\x8au?\x01sK\xc2\x98\x19z?\xfeS\xb5\xc9-\xbbr?\xbb\xac\x91\xd4|\x08=\xbfN\x8e\xed\x96\x11\xd8|\xbf{\x89\x99u\x84\xdd\x88\xbf\xfe\xcfy\xc7\x0bd\x8a\xbf\x04pR\xe2Bb\x81\xbfwk\xa3hw\tM\xbf\xe7\xe3Y\x08^\xf9y?l\x8e\x92)(\xa8\x84?\x11k\x8d\xe3\xca5\x83?\xa8\'\x1d\xd8\xde\xcdv?o\xf7\xa2{| R?\x82\x94q\x9f\xe7F`\xbf\xd0o\x1dk&\xach\xbf\x06\xa4\xf4\x98\x92%d\xbf\xbd\xfaC\xad\xb8JU\xbf\xb3\x11\xab\xf5D%4\xbfSH}=\xe0\xab+?\xde\xa1\xf7\x0b=%5?N\xc5v\xd8\xf8s.?\x15\xb9\xa3jFm\x1c?\xb8\x81x\xf5\xad\xbe\xfb>E&\xd9v3\x0e\xde\xbeB\xcc.k<\xf0\xe9\xbe}\xfd\xa0@9\x96\xe0\xbe\xb7g\xc1\x86R7\xcb\xbe\x1bT\xfa\xae1\xa0\xa9\xbe\xc9N\xbcp\xf0\x00q>\x04\xad\xd1\xe8\xc3\xad\x86>\xa9\xbb\x00\x10s7T\xbc\xeb)\xa9\xed&~\xb2<8\xaa\\\xe8\xb60\xe3<\x07\x9dD\xb0w\x91\x07=5\xc9\xf3\xa3@e"=\xb6 W\x8f\x14\x9a!=B\xea\xa0\x82\x951Y\xbd\xa6l\xe3m4\xb9\x88\xbdX\xe3\x00\x1bc\xa5\xaa\xbd:\x9c\x9bdn\x8d\xc2\xbd\x1e\x16te8,\xc6\xbd\xf8\x9cR\x88\xc5n\xe7=\x82\xa0\x87mv\xdd\x16>D\xbe:d\x7f\xb55>\xdf\xebQnB\xbcJ>E\xb5\xbd\x19g\xcdP>\x9c\xdb[\xe6\xbdQ\\\xbe\xa7_\x03t\xe1H\x8e\xbe\xd8\xbf\xf8\x013~\xa9\xbe\xc8\xd1\x7f\xf2U\x9d\xbb\xbe\xf7\x08O@-\xe9\xc0\xbex\x05\xdbZ\x16\x17\xb3>\xee7\xb8\x9b\xef\x9d\xec>7fY\xd3\x03\x92\x05?\xbd\xa3\xc9\xcb\x00}\x14?\x9d\x07\xc7\xfc\x1du\x17?\x08\x1ac\xeeR\x1a\xc4\xbe\xbd\x8d\x8e\t\xb3.3\xbf\xff\x0b\x84T\xa4IJ\xbf\xd9H\x84\xdb\xdd\xdeU\xbf\xad\tK\xef\xe9\xd3V\xbf\xc2\xd1Qv\xecX5\xbf_\x17\xaf I\x13b?h\xd54\xc2\xe9\x0cw?\x8c\xfd]\xde\x9e\xcf\x80?\x96\xf0\xc4\xdc\xaf{\x7f?\xde\x02\xebvV,f?.\x9324P\x8ew\xbf\x1dt\xfd\xabf\x0b\x8d\xbf\x06\t\xca\xef\xd2\x9e\x92\xbf(\x8d\xb8\x10\xa1\xf4\x8e\xbf\xa5gql\xf8ox\xbf\xabj\x95\xde\x14\x8bt?\xa5\x160\x86\xbc=\x8a?\xc2\x12f\xb7)\xba\x8d?\xad\xd33e\xee\xc8\x85?\x02\xd5\'\xc3\xdbGq?\xefN\xd2\xe5A\x10V\xbf$\xf4V\x18\xa5\xf2p\xbfk\xd7\xa5\x9c\xaf\x19q\xbf\xe9\xae\x81\xce\x05\x01f\xbf\xba+\xb0\'E\x9aP\xbfthl+qL\x14?X\xc6\xcax\x9e\'??\xf8h\x12\xc3@X^\'S\xd6\xb9:\xf4\xbe\xd3\xca[\x8f\x19\xe9\xf0\xbeSRrR\xc8\xb3\xe0\xbe\x1f\xca\xf9_Z\xfb\xc4\xbe\xb1\xd7\xa79\x18a\x90\xbe%\x88O\xb1rU\x92>I\xd1\n\x1be\x04\x8d>7\x8d\x10\xfc\x06\xd1\x95<\x88\xcc\x8e\xfaa\xab\xd1<8\x7fS\xcfoa\xfa<\xd0\x17Q\xe5[\x83\x19=&ud\xd4\xe6)*=I$W3\x1d]:\xbdKN\xc1\x16j\xa6x\xbd\xe0\xc2\xc6W\xf3[\xa0\xbd\xb6\xfe*$C\xcc\xbb\xbdJ\xf1\xd9\xd8\xcaW\xcb\xbd\x18\xe9\xc0\xa2\xe2H\xbf=\x0e\xebT\x1e\xed~\x08>C\x19\xe3\xb4\x10<->\xd1\xd4\x08\x97y\xc4E>\xac\xb0\xa71w\xd4S>\x91\xfd\xab\xa2\xe92$>\xde\x84R5\xd99\x81\xbe\xdfm\xc9X\xa6\xce\xa2\xbe\x89\x06\xfage\x88\xb8\xbe%XP\xb2LA\xc4\xbe$\r\x93\x8f\x8a\xbd\xb2\xbeE\x8c\xbf\xef;\xf5\xe0>\x9b\xc6\x184ig\x01?\xeb[\xa8\x08\x08\xea\x13?\xb3\x05\x04\xb5\x19c\x1d?MM\x9f#\x9c\xde\x11?^\xb2\x18&F\xe8&\xbf\x989\xc1\xb3W!G\xbf\x1e^\xa0\x16\xe0KW\xbf\xbf\xad\x88\x88\xbbp^\xbf\xe89\xe9\xec\x92\xd7S\xbf\x17\x93\x1b_\xafWT?\x1f\xe5\x7f\x05\xf0\x05v?+f\xdd\xbc\x10\xa4\x83?F\x89vI\xfd\x96\x86?\x1a\xed\xaeY\xa4\xf8|?\xaf\x03f\xb0T\x07e\xbf*k\xa1\x97\x16\xf1\x8d\xbf\xfd\xb0\x8f\xa70\xdd\x97\xbf\x8bB\xc4\x17z\x13\x98\xbf+G\xca7\x01\x06\x8d\xbf\xc3=\xf6\r\xe0:F?\x19\xd8\xd8\x9f\xfd\xe8\x8c?;\xe1\x9a\x81*\xe2\x94?\x94D\x8cU\x9ct\x92?\xe8\xc4GT"Z\x84?\x80\xf7\x0c\x12\xb8"Q?g;\x19\xa6;\xa8s\xbf\xe6\xadFQ\x89Mz\xbfm\xb25R\x0b_t\xbf\xe9E\x0c\xa6\xdc2d\xbf\x94\x1a\xf0\x88\xccr<\xbf\xf4\\\xad\xcf\xb9\x8cB?c\x96\x82\xb9<\xcfG?A&\xdd\x1a&3@?i\xf7-!9\x8f,?\x81s\x87\xe2\xf65\x07?\xa20\x1c\xb5\x9d\x9a\xf7\xbe\xf4}\xb0Ru\xeb\xfe\xbeX\xa4\xfa9`\x91\xf2\xbeM\xdb>\xb9\xea\xe2\xdc\xbe\xe7\x00v!N\xe6\xb7\xbed\x03\xe4\xd2\xc8\xe3\x92>\x10y*\xa3x\xb8\x9c>\xc3\xc5\xc3f\x9a\xac\x8e>r\xd6\x1er\x1bU\xbc<\xe0n\xf85\xb1\xd0\xea<\xec\xf6\xc9G%M\x0f=\xe4\xa5\x0e\xc2\xd6\xa3&=\x1aa\xf9q\xc6v\x13=r\x88\x04\x04$\xe1d\xbd\xd3t\xb9n\xec5\x92\xbd\x9c\xd5E8\xf7\x9f\xb2\xbdb\xf4b\x90\x08K\xc8\xbd\xe4\xce\x1e\xd7~\xd3\xc4\xbd\xfc\xf9\t\xe6\xafn\xf5=\x91\xa2\xd9."\xc8!>\x17}\x0c@\xde\xee?>\xfd\x8d\xe3\xc0u\x8cR>\x12\xdc;5\x05\x1eS>P\xc4\xad\x18u\xe3m\xbe\xfd`\x98b\x98\xeb\x98\xbe_\xdf\x86cD\xba\xb3\xbe\xe5\x96f\xd2\x8e?\xc4\xbe\x0f\xbdQ\xe8\xc0\x9d\xc5\xbeA.r\x95J\xbd\xca>\xf0qh\xb5.\xff\xf8>\x11^\xeb\xec\xf1\x90\x11?>7\x87\\\x9f\xb2\x1f?\xech\x87A\x9a[ ?z\x99\x98\xd6\xd2]\t\xbf\xbco\xd5K"\xe0A\xbf]N$f?1b\xe7#\x93\xc2\x89\xbf\x12\xc4Q\x7f\xde\xae\x9b\xbfL\xb6E\xf6\xfc\xd0\xa0\xbf~(O%\x8eJ\x9a\xbf\xee1\x00\xc1\x7f/\x80\xbf\x95\x98H\xb6\xb4=\x89?\xdc8~\xa4\x05o\x9a?}]jAY?\x9c?d\xdf3:\xcb\x93\x93?\x05\x18\xa0\xb7>iz?\x9e_\xa1\xc4.lp\xbf\xb5?\xb0\x8bU\x17\x82\xbf\xeef\xfc\xdc\x0b\x19\x81\xbf\x93G8\x1a\xb6\xe0t\xbf\x975\xd2\xb0\xb9\x00\\\xbfaJ5|7\xb49?\xc9r\x0e\x83\x0c\xb1Q?\x14\xb5\xcf\xe6\xa9\xd4M?;\x1a4\xc71\xf7??\xa7p.\x12sE$?n\n\x1d\x11b\x08\xdd\xbe\x87\xea\xf0\xd4\x8d\x99\x08\xbfs\xc3\xff\xf4\x9f\xbe\x02\xbfU\xcb\x8b\xe6\xa7\x98\xf1\xbe$\x9aUS\xde}\xd4\xbez\xa1\xef\xb97\x93\x8d\xbe\xbd\xdel\x17(!\xa8>\xe2\xca\x02r\x8e\xf4\xa0>\xec75>Y\xe4\x8b>\x92>Vg7\x95\xd8\x1a\xa8\x87\xe8BD5>C\xa1\xa0\xcab\x18N>\x0fz\xee\xaf;\xe7X>\xe3\xfam\xb6\xa3BB\xbe~O]*\xff\xd7\x8c\xbeS\x1f\x87\xd8\xa6\xd0\xac\xbe\x9a\x17[\xc3Y\xdd\xc1\xbe\x1e\xb0Fc*F\xcb\xbe\x89\x1f\xe6\xf0\x9a"\xa2\xbe\xce\x9a\xf8\x1d\xc7\xa6\xee>\xd1H}\xdf8\x1b\x0c?\xa8\x08y\xaa\xbe\x87\x1e?\xa9\xb1_&\x8b\x11%?\x18\xd7\x0b\xd9\xb4\xae\x11?f\xcf\xf2"c\xbf6\xbf\x83\xbf3\x1a\xb4\xb6S\xbfa\xee\x01\x7f\x88\xcab\xbf\xdc\xd6~\x17\x95#g\xbf\xc2\x96\rq9]X\xbf\x14\x890{\x04\x10g?\x9d a\x952\xda\x83?\xb6\xa2w\x9e8\xab\x90?\xc3Nb\x15\xa4\'\x92?4\x01A)\x9e#\x84?W\xe0+\xda&k~\xbfJ\xa7\xe27\xfa\xa1\x9c\xbf\x8b0\xd6\x04\xf8O\xa5\xbfE\x99\xa1\x04\x16k\xa4\xbfD \xe8m\xf4\x16\x96\xbff\x90\x9b\xc6c{v?\t\xd4\x0f\x89\xd6v\x9d?]\xcb\xcb\x1eg\xa2\xa3?l\xa9y\xcd\xb0~\xa0?\xa1\x8d_\x1c\xa7\xb0\x90?b\xff\xb3\xb6\xeb\xd2.\xbf@\xefA\xd3\xc2\x82\x85\xbf\xf2\xbd\xc5\xec\xac\r\x8a\xbf1\x0f\x82L\xec+\x83\xbfX\xeeP\xb1\xae\xb0q\xbf4\xad\xe4\xa0\xd1\xd9<\xbfJ\xfd4\xf7\x86\x14V?o\xb6\x1b\x8c\xd9\xdfX?\x08\xf0\x97\xd2\x86\x0bP?J^\x1cU\xd1\x91:?S\xf4\xbe\xb1\xf8u\x10?\x9c\x8f\x17\xa7X[\x0f\xbf\xbc\xa0\x93\x90a\x10\x11\xbf\xa3Q\xaa*\x9bY\x03\xbf\x8f\xc92\xc1\xacr\xec\xbe\xdb\x94\xdc\x84z\xce\xc3\xbe\xf1\x9e%\x8f\xa5\xd2\xad>\xa2`\xe8\xb5\xa0\xc9\xb0>\x1e#\x9f H\xd1\xa0>k\x82\xcfE\xb8\xcc\x85>\xa5<\xd6\x9d\xf6l\xf1<\x9c\xd8\xb7\xe9\xc0U\x13=u\xc1\x15\xa2u\x92)=\xe4\x80\xee\xc9\xb7\xbb\t\xbd\xfa+-N\xa1po\xbd\xa9\x80\x86\xf4B\xee\x98\xbdW\xac\xbf\x12D;\xb8\xbd\x03+\xff\x88UX\xcd\xbd\x10\xe2\xb2\xd9\xb1\xd3\xb9\xbdM\x9aE\x8b\x02\x7f\x01>\xdf\xbe+!Q\xab)>\xdbB1\x13\x19\xddE>\x9c\xa6\x89\x96F\xd2W>\xcf(\xde\x906"R>\x1e4\x8c{\x84\x0c{\xbe\xdeq\xdc>\x19pC\'~+\x04?\xa6L.\x0b`\xa1\x1a?\x18\x13D\x85\x0e\xc7&?\xc1\x0f\xa0\xc6"\x9f$?\xdaQ\x95\xe8\xd0\xa3"\xbf\xd9/x\x01.\xa4N\xbf2\xdc\x9f\xb9\xfd\xfaa\xbfU,\x81\x02\xc5\x05k\xbf\xdeN\x93\xb9\xa8{g\xbf\xb8)r\xcc\x10^H?\xbf\x16\xf6b\x99\x94\x80?\xaf\xd0\x8b_\x1e~\x91?\r\x83\xe9\xdb:\n\x97?\xe2\xbbl0-\x8d\x92?\x16\xbf\xa4y\\XO?\x91\xee\xde17f\x99\xbf\xa1r\xcc\x96x\x81\xa8\xbf\xfc\xdd\xf1\x06\xe7E\xac\xbfX\xce\x8c\x1eE\xa3\xa4\xbf\x03K\x1f40\xb9\x80\xbf\xff\x1c5\x9d\x86=\x9b?\xac\xb0\xe3}"\xb1\xa8?\x0b\x98\xd7\x08\xfe\xfc\xa8?W\x18\xce\xb0\xb5M\xa0?[EO%\xf2u\x81?;!\xb5\x03\x87\r\x84\xbf2\tTW\xc6\xdd\x91\xbfQc\x89\x83\xee\xd3\x8f\xbf\xfd\xb1\\\xd8\xbcc\x82\xbf\x10\xe6\xa0\x9cS\'e\xbf\xfa\xe3\x08\xb3\xc3mS?\xd4\x03\xf0 \x1c\x86b?\x90D,\x9d_7]?D\xb8Fa5\xb8M?\x95\xea\xcf\x1e\xf2\xd40?\x80o\xc8\xde<\xfd\x05\xbf\xb7XL*\xedl\x1b\xbfK\x80K\xe4DS\x13\xbf7\xc5\x1f#\x96>\x01\xbf!\xd1\xc9\xf5\xcb^\xe2\xbe)Z\xa2\xe1{\xa2\x8a>nz\x98\x08\x18\xd7\xbc>l\xdf\x8fP\xdbi\xb2>\r |`\x1e\xc9\x9c>\xf9\xb6\x87\xed\xb9\x0f|>P\xdc\xc3@\xb41\x05=\xe6L)\'Q5"=\xceB\xe2b\xc7R(="R\xb5<\xbd\xa1U\xbdsI\x08gy\xc4\x88\xbd\t\xba\x0f\x85\xc7\x19\xad\xbd\xc0\x07\xa7\xa1l,\xc6\xbdR?\'\x1a\x81T\xd0\xbd\xef\xd8%\x02b\x1f\xe7=\xab\x14\x83\xe2B\xb8\x1b>v\x11\xd3T\xcf\xcb<>n?]7GUS>\xc2\xb7\xeas\x83e\\>\xa1\x96}\x8c\xec\xf2]\xbe\x82$\x89c\x1c+\x96\xbe*\xa1\x9f\x15\xaa\x88\xb4\xbe\xae\x00>\xc3\xf02\xc8\xbe\x06\xbfRyJ\xd5\xd0\xbeaF\x8b\x18[\xb0\xad>\x1c=\xbc\x0e\x077\xf9>\xe9\xd7hM-\x18\x15?\x1a\xa2-\x14f\xc7%?w\x004\xf9J\xd9+?\x026\xb0\x1e\xcf\xa4\x04?Z\xa9\xd2\xe3\x91=D\xbf\x9bT\x07\xe002_\xbf\x99\x82\x85\x01%8l\xbf\xd9"\x16\'\x9bEp\xbf\'\x03I\x0eD\x7fX\xbfY\x89\x86\xb1\x18\xa3v?\xf8T\xd7\x1d|\x95\x90?\x81\xa2\xab\x8c\xf6V\x9a?\xf8=7$#\x0f\x9b?\x9c\xe5\xb9\x10O\x94\x88?G9Z\x17\x1c5\x91\xbfH\xf2\x15/\xb4N\xa9\xbf\xcb=\xfe\xf3\x8b\xb7\xb1\xbf\x9f"-\xb3\x13\x15\xb0\xbf\xb0\xde\xfb`9O\x9e\xbfo\xc0\xe7F~\xce\x90?Ld\x0b\x02\x98\xa4\xab?\x97*\x8b\xda9-\xb1?\xf0\xa6HS\xd1i\xab?G3\xf8M\x91\xfe\x98?%0\x8e\xad\x18\x83q\xbfr\x10\xfcO\x14\x87\x95\xbfG\xe9\x8c\xa0(\xff\x97\xbf\x0f\xa3^O^\xc9\x90\xbf+.6\xf0?\x7f|\xbf\xde^\xac\xbd\xba4\x0c\xbf\xb7U\xac\xc2%\xc3g?W6>{\x01$h?K\xd4a\xab]\x95]?F\xa6H\xee\'\xd5F?\x1e\xe5\x08\xb3\x08\x8b\x11?\xf0"q\xbf\x93g"\xbf7\xb4\x88\xee\x80x!\xbf?\xf7\xbco\xd3\xc5\x12\xbf?\xf4\x05\x88\xd2\xf3\xf9\xbe\xec\x1b\xdb\xaa\xe6\x1f\xcc\xbe\x84o\xd8\xbaA\xa7\xc3>\x9dB\xbe\xe5**\xc2>\xc3M\x14\x00\xb8*\xb1>\xe6jN/.\x0b\x95>\xca\x05)"3\x0bi>n\xca2\xacL4\x16=>G7\xcf\x89R*=`\xa0\xab\x1e\x90\x07/\xbd\x8f\x83\x1d\x1c\x8f\xaeu\xbd\x82\x88t\xac\xf7\xbd\x9f\xbd\xe2\xc1\xe9\xed\xfcS\xbd\xbd\xf5UTn\x15H\xd0\xbd\x9c~\x81\x91q\xd1\x98=\x98\xde&SZ\xe6\t>W\xa0>\x88\x1771>\xa4\x19\x04\xa6b\xddK>\x80\xf0g\xf0/=\\>\xc5\xa7\xfb\xbfuPH>\xbb@E\xed\xc2\xc2\x85\xbe\x8e%^yh\xdf\xaa\xbe\xfc\x1c\x8d\xe7\x14\x10\xc3\xbe\x8c\xe4ocMX\xd1\xbe\x94e\xd6\xb5\xafF\xc7\xbe\x9120G\xabQ\xe9>\xc3\xdb\xd5\x1d\x85$\x0e?\xa7\x95a\xeb\xb4\xca"?\xf5\xbd\xa9\xda@_.?\xdaw\x01;.\x12\'?\x1cl\xf9\xb2\xfe\xc43\xbf\x92~@\xb4\x1b?X\xbf\xb3\x1cX\x0bM\xb3j\xbf\x0bJKsr\x07s\xbf\x05\xe9j\xf90.m\xbfG\x88\x14e5*c?\x10\xe7\xd3\xeb\xf1\xe3\x8b?\x9d_O_\xdcV\x9b?\xbf\x19\xaa\xa2\x00\x1c\xa1?p\xc5\xd1\xba\x99\x04\x99?}\x9c\x96g\xaa\xb8p\xbf\xb5\xd1J\x87\x16\xd6\xa6\xbf\xe5\xec\xef\x8d\x97*\xb4\xbfYzU\x84\xdb\x1d\xb6\xbf<\xb9\xa8\xcfu\xd8\xad\xbf\xed\x18\xb7\x00\x80\xe6p\xbf\xfd\xdf0`\xbdn\xaa?V\x1c+3\xe2j\xb5?\xe4\x18K\xd2\xa3\x93\xb4?^\x9b\xeet\xdf\x1b\xa9?\x01\x9a\xf4\xd9P{\x82?\xa1\xf3%\t?_\x95\xbf^"\xb0lW[\xa0\xbf\x04\xde\xa6g/\x94\x9b\xbfg\xd0,e\xbd\x07\x8e\xbf\x15]\x8d[q\xdbk\xbff\xdb\xd6>^\x9eg?\xd3B\xde\xd6\x93\xefq?\xf0\xcbY\xa8\xe2\xa2j?\xbdu\xfa;\x1c\xa8Y?C\x08\x9f\x17\x0f\x1e9?V\x8bL\xef\xa2\xff \xbfy\x00\x04NL+,\xbf\xf1l\xd5yN\x8a"\xbf\xcf\xd7Z\xbctk\x0f\xbf\xf7Kq\xffZ\x06\xee\xbe\xa2H\x14\xc9v\x8b\xbb>\xef\x9eB\'9\x91\xcf>RJ\x8e\x11\xe7\x98\xc2>\x1e>b\xea\xa3\xb6\x88>\x97\xf8a\xe5\xd6\xd3\x17\xbeeZ\xc7\xf3\xf3X#=>Q\xe7Tl\xc4 =9Fx\x90c\x8b_\xbd\xc0t\xc2\x1b\x8fS\x8f\xbdK\x83b\x0fnn\xb1\xbd\xc3\xa3\xc6\xc9\xfc\xff\xc8\xbdCsHD\x8e\x16\xcd\xbd\x9d\xe1\x166\xc6\x08\xf3=\xcf\xf7\xacz\x1f\x88">\x92\x802\xb6\x08&B>\xf7,\xab=\xba\x0eW>DOOL\xb7\xf9\\>\xf8\x81\xbe\xc9\x0bQn\xbe\n\x82r\t\xcek\x9f\xbea\x95b\x8e1<\xbb\xbe\xd8\xe5\xce\x98;w\xce\xbe\r\xec[\xa2\xa0\xe6\xd2\xbe\x7f\x0ez\x03\xaev\xcc>k\xaf\xb7\xa4\xd0\x05\x03?\xbd\x86\x1b\x14\x89s\x1d?\x13\xed\x10\x9e$\xe7,?0p\x1d`\xd5\xe30?\xdc8\xf2\xb9\x06\xde\xff\xbeOz\x02\xf1C]P\xbf\x8f\xadt\xf0Z\xf0f\xbf\xb4\x87\x05\xe5H\xb8s\xbf\xe1\xc4\xb1\xab\\\x1cu\xbfumG\x16^\x1eP\xbf/\xf8\x82@\xe7\xd6\x83?<\xc8G\xbda\xb7\x99?Z\x9a\xbe\x99z_\xa3?\xe1\xa9c7\xc3\xa9\xa2?\x9b\x1d\x17\xa0w\xf8\x88?\xc2\x18\xa9\xf9\xcf\xb5\xa0\xbf\xd9\x0c\x03\xca\xd9\xb8\xb4\xbf\x19w\x87\xf4"l\xbb\xbf\xbbX\xa0\x80\x9f\x7f\xb7\xbf_\xd3aa\x0e[\xa2\xbfo\xda*,]\x06\xa3??\xf6\xb4\x07Q\xf5\xb7?\x94\xd3\xe6\xd2"\xf9\xbb?P\xa5\xb4\xc4\x0c)\xb5?\xa4\xf1\x81\xae\xa4\xe9\xa0?\xe8\x9c/\xbe\xd4l\x8b\xbf&.\xcf.(\xd1\xa3\xbf\xda\x99\x96.m\x90\xa4\xbfJ.5\xc5\xa6U\x9b\xbf\x101\xb4Nq\xfc\x84\xbfB\xeb&\xf7\xc2\xbdS?\x9fG\xef\xa1/[w?\x83\x89\xbe\xe1l\xc8u?Z\x8f.3R`i?\xde+9\x8f9\x0fR?\xb7\xfe\x00+\xe9.\xf9>\xadx*\xdb"|3\xbf\xa9\xcc\xd7\xa8\xfa\x9c0\xbf\x89{\xaf\xf6\xe8\xf3 \xbf3w{\xfby\xe1\x05\xbf\xc8=>\xa8~\r\xcf\xbe\xd9\xc6d\xa7\x1f\xc4\xd6>\x92]&\xd7\xfe9\xd2>}\xfd\xdb`LP\xc0>c\x085^\xe9\xd2\xa2>\x86{\x1a\xd9\xa8\xc0q>\xa4\xdb\xf6\x06\x10Db\xbe6\xd4\x99Brg(=\xe8\xb5\xf4g\xa8\xe3>\xbd\x1c2\x02\x10\xe7\x88{\xbdN\x9e\x92\x1a\x82\xcd\xa2\xbd\xb4\n\x13\xef&\x80\xc0\xbd\xe9\xfe\xa5c_}\xd0\xbd\x0c~\xd2\xbf\x00\xec\xca=\x00\xfcrr\xc8\x89\x11>\x92\xf6\xf1\xd9\xf5x5>u\x03\xd4\xdb%\x85P>}\xf5\xe65n\xc7^>\xd7\xbb\xdb\x93W\\\xf2=\x19jUFF\xad\x8f\xbe2\xb7\xa7\x1et\xa8\xb1\xbeldqr\x90\xcc\xc7\xbe\xaf\x87W"\x05-\xd4\xbe\xa0$\x18\xc5\x03|\xc0\xbexT#"\x98\x15\xf4>\x03\xfe\x04V\xd4\xe4\x14?)\xbflE\x92\xb0(?\xdb\x15v\xdb\x7f\xc12?\xce\xc2\xbb\xb6\x82\x0c&?\x05\xcd\x1a\x83F\x93A\xbf\xd7\x8d\x1b\xa0\xb0\xc2a\xbfr\xfc\x1e\xed\x89tr\xbf\x0b\xca1\xb1\'\xdfx\xbf\xb9\xc55\x07T(p\xbf\xfb\x94qT\x8c}t?\x0e\xbe\x9a\xf8\x16\xa5\x95?)\xff\x88\xfe4\xe2\xa3?:\x8e\t\xfc\xf5\x9c\xa7?\xfcT\xc5&\xa5\xa0\x9e?\xcfUsgl\x05\x8d\xbf\xe7\x0b3a\xae\xd9\xb2\xbf4\xff\xb4k\x07\xe0\xbe\xbfi\xb0\xa6\xa0Q\x17\xc0\xbf\x81\x9f\xa3\x8b\xe8\xc7\xb3\xbf5->|\x1b\t\x80?oYb\xab\xcfY\xb7?\xbc\x05\xb6\xf0tD\xc1?7\xc8\xbd\xb7L\x89\xbf?K\xfc\x95m\xa5\xd2\xb1?E\x92\xc63\x95\xc3v?\x94\xa4\x9b\xb1\xc1j\xa4\xbfW\xd2B\x19\xf9\xcd\xab\xbf\x1apO\xd7\xd8>\xa6\xbf\xb4\xf9Z\x97\xc4\xae\x96\xbf\xb28go,\xfbm\xbfB]\xc4\x86\x16\xe1x?="#\xb4"\x18\x80?\xa0\xe1\xf4f\x87\x9bv?\n\xd27\xb4\xb4\x89d?\xad\x93\xd5\xc0\x03q@?\\Ek\xe3\xe1\x9d4\xbf\x1c\xd5\xc7\x11H\xbe:\xbf\xab\xe1=\xca\x8c\x8e0\xbf*x\xa6\n_\x95\x1a\xbf{\xe4\xfc\x11t\x1c\xf6\xbe\xb8\x0f(9\x96\xfb\xd5>I\xe1\x9b\xd93\xcf\xdf>v\xca\x94&+z\xd1>%\x19\xa8\x85\x80\xab\xb8>\xc2\x1eI\xaf\xb8\xde\x93>H\xb9\xb8\x9c7\'Y\xbe\xca?z\x91K\xfaj\xbe\xad4\xbcE_\n\x05=\xb2X\x84\x9az\xb2d\xbd\xa3?\xd5\xb3\xaee\x92\xbdme5CSp\xb3\xbd|\x1b\xb8\xb5M\x0f\xca\xbd"\xbb\x8aXh\x98\xc4\xbd\x18\xe2\xd8\xab\xd4g\xfb=\x1alF\x96\xb9\xf6KE>HH,z/}Y>\x14\x1f\xf7D\xc8\xb7Y>\xf9\xc9tS\n\xd5x\xbe\xd8\xf2\x7fuP\x98\xa4\xbe\xc8\xba\xf5/+\xd0\xc0\xbes\xd4\x97\xde[\xce\xd1\xbe\xaf*\x0f\xdc\xb9\r\xd3\xbeV\x14\x06N\xa8f\xdd>\xe3\x0c\xa0,\xd3r\n?f\xc7&\xb2\xcd!#?X\xe3\xbc\x8a\xde\xd31?xQ9N\xc9\xaa2?%X\xe2\xdf1\xd3#\xbf\xbf\xd9l\xaa\x86=X\xbf\xccV\xb3T\xc4_o\xbf\xf8h@\xb8\x9c\xa3y\xbf\xb34w\xdcS(y\xbfS\rAOL\n3?gJ\xcfyd\x89\x8f?\xe8\xc0\r\x86\xdd\x86\xa2?\xa0\x9dx\x13\xff\x85\xaa?\x83\xde{1!\xc3\xa7?c\xc8\xc95\xca\xd1\x81?S+\xb9\x94\x17\xdd\xac\xbflP\x15\xcd4}\xbf\xbf\x0c\xa2Q\x04\xaa\xc1\xc3\xbf\xaf\xd8)\xe3\x11\xca\xbf\xbf\xa1\xc3t\x04)\xc2\xa2\xbf3\x15\x83\xb06L\xb2?\x03\xe2\xda\xa5\xcc:\xc3?\x17\xc1\xc8\x8dy4\xc5?^\x91\x9f\xb9\xe6N\xbe?l\xd1\xa7\xe6tM\xa4?\x04\\D\x81\xe1(\x9f\xbfI\x14I\xd4\xe5\xd7\xb0\xbfq\xf8-\x00\xf6f\xb0\xbf\xec\x8a\xec\x98P\xad\xa4\xbf\x12\xb1N&\xf8\xfe\x8b\xbfE\x9b1\xbc\xf9\x80p?<\xfa!)*\x19\x85?\x99\x97\xae\xa65I\x82?m\xa3\xb4\xf0.>t?\xb6\xc0"\xaa\x17\'Z?\xed.;\xb5y\xd8\x1f\xbfos\x8a\xd9\xfc\xf5\\\x90\xfb\xe0>\x11h\xcf\x15\xa2\xdc\xcc>\x87]\x9c\x92V#\xaf>\xac\xb8Z}!\x19t>\xb2\xb7\xfdc\xe3\xe4t\xbe\x1d\x80\x1c\x05\x8b>l\xbe\xd1}\xf4k\x0c\x86G\xbdc\x16\xf7\xd3s\'\x80\xbd\xd4\x1d#,\x0e\xbc\xa4\xbd\xee\x1c\xbc\xf6\x17?\xc1\xbd>\xa6\xd2\x8f\x9b)\xce\xbd|pd\x04+\xf3\xdb=\x03Z\xb9\xefS\xda\x15>\xa3GE\xd3V\xeb8>\x87\x1a(\xe6\xb76R>\x06\xe2\xac\x85=\xa9^>My\x02\x92\x05\xf1P\xbe\xdc\xa1P\x1f\xe1\x10\x95\xbe#\x1dKt\xb3\x93\xb5\xbeh\xd69\x9f:\xa5\xcb\xbe\xee\xe6\xd7\xed\x89\x98\xd5\xbeu\x849[\x07|\x9a\xbe\x7f(\xe7\x11@\xc2\xfc>ShV\x1b\x84\xe7\x1a?\xc2s\xb8!\xbd1.?\xc57\x04M\xc9g5?\x16\x97\x07\x17\xa0< ?\xc4w\x9f0\x8c\x82K\xbfp \xcb%\\!h\xbf4\x85)b?\xc0w\xbf\\\t\x98\xeb\xef\x1e~\xbf\x8c\xf1G\xb3w\xdbn\xbf\xe9%H\xeex\x17\x82?\x15\xdd\xb5\x8b2\x16\x9f?q\xf9\x1a1\x84\xec\xaa?\xca\xd8\xec\xca?@\xae?\x95\x12\xb4\x8d(\xc5\xa0?\xe6\xdc\x15u}o\x9f\xbf\xd9\x80\x84r\x96\xb2\xbc\xbfk\x85\x94\x99\xee\xfe\xc5\xbf<\x8b\x1b\xb3\xeb\xc2\xc5\xbf\xaf\xd5V\x9b\xcf\xd8\xb7\xbf\xf8\xca\xca\xf2\x80&\xa0?L\x137\x1f\x83\xeb\xc2?L\x19\xb87\xd6\xe5\xc9?ZXA\xe3\xaez\xc6?|\x1e\x8c\xf1V7\xb7?\x98G\xc3\x9e\x8fyt\xbf\xf5\xd6\x92"\xe3\xb9\xb1\xbf\xbd\x9c\x8d!h\xf6\xb5\xbf\xba\xcdG\xa5\x08\xb3\xb0\xbf\xbc\x9b+\xaa9\x9b\x9f\xbf\xeb\x19]\xa6\xb5\xecd\xbf\xc8V\xaag\xc0h\x87?\xd20\xc40\x0f\xcf\x8a?\x8aZ\xe0\xf4\xca\xdc\x81?\x8a\xb8\xb5\n\x1ann?\\\x12\xd2M|\xe3A?\xbe\x19\x8c%\xd5{E\xbf\x06\x8c\x97\x99\x97\x85G\xbf\xdaB^\xbc\x89\x87;\xbf6\xe5mb|\xdc$\xbfV\xc9\x8b\xafd\xbb\xfc\xbe$\x99>\xea\x0b\xab\xea>\xfb\xd3\xcec\xdd\x9c\xed>b\xd4\x03Nm\x93\xde>\xfd4\x96;\x9ct\xc4>\'\xbc\xe8\x8f\xdd\xdd\x9c>\xf6\x1exc\r\xfet\xbe\x9b7S\x11C\xacz\xbe\x9dq\x0c\xf80yh\xbe0PnE\x0e\xbdh\xbdW\rq\xea\xeb\x15\x94\xbd\x8f=\x04\xbf1,\xb4\xbdS\'\x9c\xf4\x04\t\xc9\xbd joi7F\xb0\xbd\x82\x19\xe2\xf2n\xb3\x01>\xfc\xcd\x81\xd0gp*>\xfb\xd5\xe8\xf8{CG>\x18\x9c\xfd\xc7\x04\x10Z>\xe8Jt\xf6-\x8dR>\xc2\xc3\xef\x17\n\xaa\x81\xbe\xef\x01;\xb8\xc2\x05\xa9\xbe\xde\xba0uUS\xc3\xbe\xcb*\xf1\xb3TL\xd3\xbe\xc6`/\xbc\x1e\xd2\xd0\xbe\x15\xba\xb5\x89\xcb\x02\xe8>e\x08\x05\x8fX\xff\x10?|\x14\xe6\x17N#\'?\xbfrG\x95}l4?\xb5\x12K]\xbb\x932?\xd2b\xb1\x9f\xb2\x135\xbf)\xdc\xc2\x81,\x88`\xbfm\xdf+\x89\xec\xf6s\xbf\x99\xf5E\x81\xc0\xfd~\xbfr\x19+}\xbf[{\xbf\xae\xbd\x1e\x9d4)d?\xc24\xa5\x94H\xef\x96?\xd8\xd6#\xba\xe6\xd2\xa8?\xc0\xd1Ik`\xe4\xb0?\xbb \x05\xfa\x8b\xd0\xab?\xfa\x9d\xfb\xbb\xe85\xd8>\x9d\x91G\x12\xee\x8e\xb6\xbfQ\xfb7\x17 :\xc6\xbf"\x18d\xc9\t\x7f\xca\xbfA\x11N\xd2\xa8\xdb\xc3\xbfQ\xb7\xfe\xa1\xf3V\x9c\xbf\x9a\x1f\x1e\xbb|)\xbf?\xcf(Q_\xf3\xa2\xcc?\x8f1GF\xc4\xed\xcd?v%\x15N\x8d\x1a\xc4?\x14$\xdc\xbf\xf6\xcb\xa4?Y\x1e\xe2;\x95\xb7\xad\xbf\xd5\x12\xbexS\x81\xba\xbf\x902*\xee\x97[\xb8\xbf\xc7#\xc7\xe9\xb0\x07\xad\xbf\xcb,\x1f^\x8e\xa2\x90\xbftRW<\xd3\xe4\x82?L\x9f\x91\xebF\x96\x91?y\xf1An\xbe\x92\x8c?\x1f\xc4\x80\x97\xc1\x02~?n@\xcd0\xd1/a?/\t~k\x80B=\xbfy^Z\xa1\xdc\xadP\xbf\xef\xc2\xa8\xe5l\'H\xbfL\xb1\x8a\x90\x89D6\xbf\t\xc6\xcb\xb3\r0\x18\xbf\xcav\xbb\x7f\x14\x01\xd2>\xc4\'|$s\x80\xf6>\xb7W\xc8\x00\x95j\xed>\x9bg\x80\x0cO\xc2\xd7>PG\xca\x0c\xf9\xbc\xb7>G\x05\xd9\xee\xc2\x18j>\xfe\xaeI!4n\x85\xbe\x0e\x86\x9c\x9d\x89\xc9y\xbec\x98\xd6\x92n?b\xbe\x93\xb7\x06K"\x8e\x81\xbd5;\xa0Y6I\xa5\xbd\xf3p\x8c\xe0\x16\xb9\xc0\xbd\xb0\xa5_Q\xd6o\xc8\xbd\xf2\x88b\x9b\xc1W\xe5=p\xd2\xd4\x05\x13%\x19>\xb4o\x18j\xbf\xea:>\xd6$\x1f\x07\xf1\xa7R>\xa1\xc0a\xe8\x94\xa5[>\xceI\x7f\xab\xcf\xa8b\xbe\x9a)F\x8e\xbc\xc1\x99\xbe\x03\xbddG~\x87\xb8\xbe\xf0\x91\xdf\xeb\x03\xdd\xcd\xbeWP\xd6\xd6`\'\xd5\xbe\xae\xa3\xde\xc8\xd2\xa1\xbe>\xec\x96\xed\xc0K\xc9\x02?\xdc\xec\xe9p\x8e\x1a ?\x10\xfb]\xeb\x1c.1?\xa3\xf4b\x81,\x7f6?\xa8<"\x1ft!\x05?M\x15\xc4\xc5caS\xbf\xaa\xb7q\xf7\x07rn\xbfE\xa4t\xea\xd8s|\xbf\x12\x14\x98\xdf\xa0\xdc\x80\xbf\xcb\xdfP\xd6\xd5\\g\xbf\xde`\xfa\x8b;\xf5\x8b?\xa1\x1f\xe0\x8dy\xb2\xa4?\x96\x8c\xeciS\xf8\xb0?\xf4\xf5j\xac\xcc\xf5\xb1?\x06\xad\xf1\xf5\xb6\xec\x9f?m\xc8-\xe3\xb1\x9c\xab\xbf\x84?(\xcfR4\xc4\xbf\xbdn\xdc;\x83,\xcd\xbf\xa2s\x9d\x1d\x0cS\xcb\xbf\xaa\xcb\x9b\x9cT\xcd\xb9\xbf5\xaf1\x93K\xd6\xb1?\xd6\xc5}\x85\x1bA\xcc?=Ig!\x99\x12\xd2?\xea\x19o\xe5\xe7\xc9\xcd?\xfc\xf2\xce\xd6\xe2\x8c\xbb?\xe9$\xa6/\xfbZ\x9a\xbfj\xbd>.<3\xbc\xbfG\xf4l\xd7_"\xc0\xbf#\xe2Wy\xd3R\xb7\xbfy\xf6\xac\x1a|9\xa4\xbf\xe7_\x91\xa5\x11\x0fN?\xf3P\xd9[\xa4\xfa\x93?\x11\x1d\xc1tO\xbf\x94?\xc1\xc3\xfa\xb7\\E\x8a?\xa4\x1a1\xaaj\xcet?\x13M\xef\xc7U+;?i7\xe7)>\xebS\xbf\x1eV\x9d\xee\xa12S\xbf\xd5\xa1\xc3\xbd`NE\xbf\x0eJ\x1cy,P.\xbf\x95a\xaa.\xaau\xff\xbe\xb9\x13\'\xa8\x01\x85\xfb>;\xc2Ek\xe3\x87\xf9>\x9b\xa4\x93\xa1\x1a\xe6\xe8>\xaa\x1aE\xa3\xb4x\xcf>Bm\x85\x0c5\x97\xa2>\xb2O\xfc\xe83\x8d\x89\xbeb\xb5\xf0\xf9\xbeY\x88\xbeN\xfa\xbbD2\xf8t\xbe\x85)SV\x12aW\xbe\x96\xae)P\xcbe\x94\xbd\xdc\xa6\xa1G\xd0x\xb3\xbd\x11\xc2\x1a \xc8\x0f\xc6\xbd)\xc2\xeb-\xcb\x9f\xa8=\xf2\xfeV\xa9\xa1\xca\x04>\x88\xae\xc7\xaf\xc6G,>k<\x8b7Q\xa6G>\x19\xfa\xe4]\x87\x93X>\xb3)t\x9bZ\xe4@>\x01\xa3\xbcm\xa7x\x86\xbeS4\x8d\x18M8\xac\xbe?\xb8m\x13\xb1\xad\xc4\xbe\xc4<>\xd5\xa5Z\xd3\xbe\xfa\xd3]\xb0\x05\x92\xc8\xbe|S\xc7\x0cJ\xe4\xf0>t\x81\x07\xe4\xf4=\x14?\x06\xe3\xe6\x98\xef\x0c*?6>^\xc9B\xb35?u{\x8b\xe5\x03I0?\x12\xdd\x9b\xeb\x104A\xbf\x8f\xc5\x0b\x9f\xf1\xd5d\xbfd\x7f\x1e\x8fz\xa6w\xbf\xf6\xf6\x96-\xcbe\x81\xbf+#\xe9K)\xdcz\xbf\xd1\xdcL\xa0\x17Rv?\x98\x03Cbn\xb1\x9e?\x91[\x8d\xee\x83\xf2\xae?p\x147\xff\x8a\x01\xb4?\x0f\xc2Z\xd4\xae\xc0\xad?8\x00\xfer\x8e\xc3\x8d\xbf\xe42<\x99q\x1c\xc0\xbf\xde\xf5\x98\x86\x12-\xcd\xbf\x01\xe0tR\x17\x88\xd0\xbfbgg{\xea\xd3\xc6\xbf\xbe\'\xd3\xdc\xfezv\xbf\xd25\x8d\x07\xb6\xf4\xc7?\x1f\x8f:=/\xce\xd3?\x8a\x89\xa4;\xcb\xa8\xd3?hE\x08z\x9c\xa4\xc8?M\xbd\xa7\x0c\xa8[\xa0?\xfa\xc5\x93\xbb\xeb\xf6\xb8\xbfZ DcdW\xc3\xbf\xef\x83\x82\xff[\xd6\xc0\xbf\xd3\xa5S+\xaa\xe1\xb2\xbf\xfe\x1e\x94\x81\xbb\x07\x91\xbf\xbf6\xe0\xd2\xa0\xe4\x91?x1\x12\xf9\xaf!\x9b?ly9v\x0c\xc8\x94?G\xc3\xba\xb7?\xa6\x84?\x92\xf57\xe8\x033d?\xf66\x0b\xa0U\xf5P\xbf$\x15\x80\x87\x05F[\xbf\xca\xc4sS4|R\xbf\x9d\xebD\xd9\xb3,@\xbf\x88L\xf5\xed\xbbN\x1f\xbf\xb7\xf7r\t\x89\x11\xf3>Ud\x140\xc9\x94\x03?\xea\xd6X\xd2n\xb2\xf7>\xd8Z\xf8\xfbJ1\xe2>\xc5gV\xf8i\x9a\xc0>\x9e_6u\x07Ok\xbeT;\xc6f\xed\xfa\x93\xbe\x12\x08jJ\x80\xe1\x85\xbeYt5\xd64nm\xbe\xd8\xe22(\xab\x9eH\xbe!\xbc\'q\xd0W\xa4\xbd\xd63\xe9\xee\xdb\x08\xbe\xbd;/\xd2G}\xd7\xc0\xbd\x98\x90\xc3\xf3\xa5v\xeb=\x19\x15\xf29h\xc9\x1a>]\'\x8c\xa0\x10\x11;>b5\xc2Sq\xbbQ>[\xc3\xc1\xecM.V>J\x98\x00\r\xc5\xadl\xbe\xd5\xdc\xbb\xe0\xbd\x10\x9d\xbe\xfc\x10\x1f\xf4\x13\xf4\xb9\xbe\xafi$l\xa4\xf9\xcd\xbe\\2-\xd0\xa0\xcb\xd2\xbe\xb4\xad\x05\xf5\xb5[\xd2>\x9b\xaa\xe6\xe6\xc8\x8a\x06?\\j\xa5;\x01\xef!?\x10\xdb\x0fq\xc8.2?\xbc\xc3\xa3\xc8\x8f\xa95?\xed\xa4\xa9h\x88\x8e\x13\xbfV\x83\x00{T\xe0X\xbf#\xd4b\xe2w\xdaq\xbf57\xe4k\xf5\xb7\x7f\xbf\x1a&bN\xcbe\x81\xbf\xb27\xb5\x88\x0bjS\xbf\xfc,\\\xf9Ic\x93?\x13!\xe2%\x90\x96\xa9?4\xd9\xad\xd2\xdf\xe9\xb3?(^c\x08\x93\xb9\xb3?\x8f\xc7\xb1\xa7\xd1\xa4\x98?\x15\x83\xd3xg\x14\xb5\xbf\x9cc5\x95g^\xca\xbf\xf7x\x08\x8b\xf2\x02\xd2\xbfj\x83X\xd1R\xcf\xcf\xbf\x90\xae\xeb\xe8\x9bn\xb8\xbfFA\x8f\xa17<\xbf?\xfd\xc4OX\x07\x81\xd3?\\B\t\xe9\xbez\xd7?FV\t\xd3FT\xd2?\xeb\xfe\xc0\x1a\x03n\xbd?\xe4D\xfa\xd4\xa8\xed\xad\xbf\xa3\x16\xb8\x97/\xa8\xc4\xbf\xff\x87/R\xe4\x0e\xc6\xbf\x87\x08\xe1\x06\xd2H\xbe\xbf\xfa\x9cc\xcc\xad\x9d\xa7\xbf\xab\x95JJ\xb8i\x7f?`\xfa0\x1bY5\x9f?\xd1\xb7\xd5\x14\xd2\xdc\x9d?\xb2\xff\x12A&\xf9\x91?\x16hm\x9d\xc8\'z?&\x91\xa2\x0b\xe0S\xe7\xbe}3=\xa3a\xb7`\xbf\xde\x1f\x93\xef\x0b\x1d]\xbfB]\x110(\xb2N\xbfn\x96\xeb3\x91V4\xbf]\xe1_:\xa6W\xf9\xbe}fH\x03\xcc\'\t?r\xe6\x9fN\x9ek\x04?\xf5\x9f\xd9<0\xe0\xf2>\x04\x18\xed[3l\xd6>\xffNz\xa1\ti\xa4>lQ\x9elr$\x9a\xbe\xe6\xfa,\xdb\x82\x94\x94\xbeQ\xe4W\x85\xeb\xb9\x80\xbeO\xe4\xeat\x10\xa1a\xbe\xd7\x06\xb5m)\xd21\xbe\x137\x82\xf1ux\xb1\xbd2)\x91 \xe6\xb3\xc1\xbd\xfa\xd4\xac\xa9\x99\x91\xc3=C\x912\xf5\xdba\x06>\xc5!\x94\xb8m",>\xfb\xc5\xd9\x1cp]F>o\x16\x12\xcajGU>\xa1|\xae\x10A7&\xber9\xb5\x8c\xec\xf1\x89\xbeg\x10\xc1\x98\xef\x92\xad\xbe\x80j\xb1\xc6\xc0\x97\xc4\xbel\xdbO\xfdS\xe9\xd1\xbex\xb8&\x02P\x95\xb8\xbeG\x11\x0bi\xef+\xf5>:F\x9a\x83\xe0^\x16?\r\xa0y\xac\xcaM+?t\'\xd8\xf3\x0fX5?\xbbe}\n\xef\xf7\'?\xef\x1f%\x92`\xf6G\xbf7\xfds\xf4uRh\xbf\xc4\x07+\xae\xf7\x14z\xbfy\x07\x9c\x88\xe2\x1e\x82\xbf\xbb\x15\x8b\x921Yw\xbf\xd50\xf2\t\xfaB\x82?.\xca\x1bL\x94\xf7\xa2?\x1e\xea\xc3\x9b\x7f\xf4\xb1?\xeb\xb5Z\xc9\x1f\x03\xb6?\xa4\xdd\x92=\xee\xcc\xac?\x8e2\x88\xbdu\xdfSz\xaf\'\xc5>Q\x91\x8e\xea\xd19\x92\xbe-\xb7q\xd2\xa0\x11\xa1\xbeL\x05"v|D\x91\xbe\xa0hww\xf2\x13v\xbe\x83]7\xad\x1b\xebP\xbeCog\x87\x87v\xe8=8\xf4u\xbb\xe7\xea\xb8\xbde\xd9\xd8?\xc4\xa5\xb1\xbd~G\xed\xc7m-\xef=#\x9c\x83\x8f\xa4w\x1a>\xae\xb2\xddF\x84V9>c\xc8\xf0\x17\x84:O>\xa1e2\x97\xa8\x94N>W\xff\xcc\xfd\x89Pr\xbe\xfdw\x04\x96\xb6Z\x9e\xben\x8b\x82\xca&\x90\xb9\xbe\x8a\xad\x18\x1a\x1c\xed\xcb\xbe\xc1k^*\xaa\xd5\xcd\xbe\xa7\xe4B!\x80\x86\xdc>\xea\xb8\xc8\x8e\x0e\xf3\x08?+\x8atb,\x96"?\xf4:\xf6\x94^\xe21?\x95\xb4\xc7@\x01\xf52?\xa3\x91,\x9c\xb4\x92*\xbfa-\xd8\xffPL]\xbfE\x80\x88%\x06zs\xbf}\xd5E\xa4\xd4q\x80\xbf\xc5%\x80t\xc4v\x80\xbf\x12\x1a\xf4K]\tQ?{\x8c\x19\xc9\x82t\x98?\x17;\xb9\x13\xd0f\xad?\r\x82\xb9\xe93\xbf\xb5?f\x8d\xb4_\x0c\xfa\xb3?PY\x83\nV\xc2\x87?\x92?\xac\xdaR\xca\xbc\xbf\xa1_\xc4\x17\xde\xf1\xcf\xbf\xed\xc1\xb9\xa6\x0e\xb4\xd4\xbfm\x85\xe5(\x0b"\xd1\xbf\x1c\xc5\x13\xbcY\x1b\xb3\xbfsZ\xce\xec\x9e\x94\xc7?\x8d_\x97\xd0$\xf3\xd8?G\xcc>\xa1\xd7e\xdc?\xcc\xb9\xeb}:\xeb\xd4?\x9f.\x02$)\xad\xbb?\x9b\xe9\xcf\xd5\xbf.\xba\xbf\xb7U\xf5\xc5\xe2\xf6\xcb\xbf\x07\xe4\x0e\xb3\r\x12\xcc\xbf^\x80K\xe9\x1cC\xc2\xbf\xc0\x8d\xa3i\x9c\xe3\xa8\xbf\xe7\x16\xa4/\r\x8c\x92?\xa3\x04$I\xe2m\xa6?T\xda\xb5?\x17\xff\xa3?\x83\\\xf7,\xc1\xdd\x96?\xc3\x86\x96\xf9\xcf\n~?\xd5\xe8\xae\xec\\2K\xbf\xe3h\x8dP\xa2\xa4i\xbf\xbf<\xfc\x89\xab\x86d\xbf4w r\xd3\x92T\xbf\xf5H\xef\x90\xdf\x1b9\xbf\xe7\x8f\x94V\xac\xa2\xd3\xbe\xda\x07\x84\x91\xbd\xc3\x14?\x05\x99@\x96\x9aW\x0e?\'@\xb0\xfd\x8c\xa3\xfa>\x1fYL5p\x85\xdd>\xd9!\xe3\x17A%\xa1>t\xdb;M\xd2\x92\xa7\xbe\xc5\x19U\xef\xbf!\xa0\xbe-\xe7\x88\rH\xd7\x88\xbe\xe6\x8f\xd1\xc5\xe6\xa1h\xbe5\x8c\xa0{E\x8f3\xbe\x94\xad\xc3\x13\rj">\xf2\xd2\x8aBw\x8d\xb9\xbd\xf6\xdct\xd3:\xa4\xcd=\x05\xe6\x90l{1\x06>\x03PL\xfd\x86\x0b*>@_\x82\x07r\xa9C>-\x19K9\x94\xcdP>\xd8\r]\x13:\xf5I\xbe\x03Ec\x8a2l\x8b\xbe\xediUW\x87\xd2\xac\xbe."\tH \x14\xc3\xbe\x1e.b$\xf3w\xce\xbe\x06\xf4W\xb7I\xec|>\xaa\x83\xec\xf7\xc3\x08\xf8>\x89X&\xefD\xf8\x16?\x98\xa6_\xd1\xba\xa2*?\x12k\xaeK:b3?\xf8Z\x00\x89\x9d\x99\x19??\xe6\xa5=\x10\x9bM\xbf\xd1+\xfb\x11kWj\xbffn\xb7M\xf4\xc6z\xbf\xf64\xa2\xae}z\x81\xbf\xcd;\xe5\xab\xc8>q\xbf\x1c\xc3\xf1\xd1\xcc5\x89?\xa2 \xe1d9\xb4\xa5?\xa9T\x0b\x92;e\xb3?\xc0\xa7P\x1bRy\xb6?o\x18\xa8\xf3q\xcb\xa8?\x82\xe3\xb6\xe4\xf0\xb5\xac\xbfo\xf0W\xd9\xdf\xa4\xc9\xbf\xe5!\xee\xcd\xc2?\xd4\xbfW\x010\x99\x0c\xaf\xd4\xbf\xd7N/;\x85\xe7\xc6\xbfE\xb1`<\x14\x17\xb4?\xbf\x93\xae||\xa8\xd5?+\xe5\x0c\xad\x00x\xde?\xa5\x7f\xe5\x1e\xa4R\xdb?\xb5\x8bW}\x0b\xc3\xcc?\x05\x9e2\x8d\x14\xc1\x97\xbf\x0bI>\xe5\x95\x07\xca\xbf>\x03\x84\x96Y\x83\xd0\xbf\xdfu\xef\xa4\xbd\xf2\xc9\xbf\x97\x86I\xdd:)\xb9\xbf+e\x85\xfde\x12x\xbfM\xf2e\xe7\xd1\x18\xa6?Y\x14\xdf\x80\xf2\xc4\xa9?Q\xf7\xb8\xc7\xcf\xbc\xa1?i\xc9\xb53h\x11\x8f?CX\'1\xd4\x07a?\xfexMV\x05-j\xbf|KYH3\xeal\xbf\xe0\xfb\x9e{\xcawa\xbfG\xd0bo\xc0GK\xbfW3\xff\xeb~v"\xbf\x10\xa7m\xf1\xeb#\x15?\x04\x19\xf0p\xc8I\x17?uX\xe8\xdf\xf2\xca\x08?\xce\x18>\xf8\xe6\x1d\xf1>pQ\x1fl\xaeA\xc8>V;\xe3\xf1\xf7\x1b\xa6\xbeh\x01\xaah\xc4\xdb\xaa\xbe\xfdH\xca#3\\\x99\xbe\x8a\xc8\x88\x1ac\xcb~\xbe\x87+_\x0fX6U\xbe5/\xe5\xd7\x84u\x19>\xf4\xdc\xc4xE\x18&>\xf3\xd2%\x8a<\x9a\x8c\xbd\x11gQ\xa7\xfe\xe4\xef=\x93,\x0fL\xa9I\x18>l\x8ci\xd7:\x146>\x86N\xb4\xc3\xeajI>t\x84\xccN)\x8a@>\x07c\x10\xech\x85t\xbeV\xf3\x02\xed\xeed\x9d\xbe\x9a\xcb1(\xb9p\xb7\xbeH\xac\xf4\xe1\x84\x1c\xc8\xbeQaAq\xce\x84\xc4\xbe+#S> \x1c\xe2>\x050\xa9\xcc\x81\x8b\t?\xce3\x0e\xfe\x9a\xee!?\x86r\xf9\x8c\xaeT0?\x1c\r\xfb\n\x97\xbd-?\xd9\x95\x8dy\x04\xfe4\xbf\xca2\x06\xc5\xa9\xce_\xbfC\xdb0\x97\xe3\xc5s\xbflp\xe2\xdc\xd6\xb2\x7f\xbf\xe6\xee\xb1\xba\x82^|\xbf\x11\x801\xcf\xc5:l?\xe8\x81\xc8\xc0#F\x9c?j\xe9k\xe6\xd7k\xaf?\x18\xd1\x12\xac\x90\x17\xb6?\xe6\x01h\xcc,\x93\xb2?\x15\x07\xc3(\xb8\x85r\xbft\xdd1\xcf\xfc\xd8\xc1\xbf}\x90\x8b\xf1)\xfb\xd1\xbf\\S\xd2\x17\xed%\xd6\xbf)NE~\x9c\x07\xd1\xbf\xd9\x00\x02t\x13R\xa4\xbf\xe9]\xb0\xda\xae\xba\xcf?F\x143_\x88\x9e\xdd?\x89_\x85BS\xf9\xdf?z\xad\x0cm\xab\x19\xd6?7\xcb\x92\x1dz\xd1\xb5?\xce@_[\xce\x90\xc3\xbf\x15j\xf9yC\x88\xd1\xbf\xee&\x07x\xa4\xa0\xd0\xbf\x1f6\x9e\xe5\x83n\xc4\xbf\xd4\x1d\xd4\x8c|6\xa7\xbf\x13Nz\xad9B\xa0?@\x99\x11\x8fu\xc6\xad?Gz\xa9\xaf\x05\xed\xa8?\xa4\x13\xaeA\xa0\x06\x9b?\xa3\xff\xb4\xb4\x198\x7f?\xe8\xaf\xacp\xf5\xf6`\xbf\x10\x13\tbw\x15r\xbf/\\\xf9\x04\x86\xedj\xbf#\x97\xa4\x994\xa5Y\xbf\xae(\'E:\\<\xbf\x1dA]j\xb6\xf4\x00?\x14!\x03N\x8aI\x1f?\x02iL()\xf5\x14?F\xe3\x98\x97\xb0}\x01?\x94\x05/\xfc\xb8\xe4\xe1>\xc8\xa3~\xeft\xd3\x87>\xb48\x12=W%\xb3\xbeW\x89\x91\xf6\x8f|\xa7\xbe\xd2^y\\\xa3+\x91\xbe\x8d3\x0f\xfc\xe2\xd0o\xbew\xf8\xeb \xc1\xed0\xbe\xcd.&\x8b\x1ed0>\x01#\xaez\xf0\xed">\x80+Ac\xf9s\xd1=\x11\xe8\xfbT`V\x04>\xb8\xc1h7Zq&>\xd4\x0f|\x1d\xef\r@>\xfa\xf9\xa6\x96\x04\xefG>\xc6Dv\xf2f^T\xbe\xdd\x06K\xd4^\xad\x8a\xbe]\xcfU\x08\xfb"\xaa\xbe\x80\x93\xbd2+o\xc0\xbekw\x11\xb50\xab\xc7\xbe\xc2\x17\xea\x12\xde\x0e\xb9>\x01cS\xbc\x1d\xf2\xf8>]g|\x0b>\xee\x15?V\x0c\xe4\xcf\xec,(?\x0b\x99\xee\n(10?\x0f>\x8d\xee\x0f\xfe\xe2>J\xef\xb7\xfa\xf5\x86P\xbf\xdc\x8b)T*\x80j\xbf\xf0x7\xac\x9b\x96y\xbf,Il\x800&\x7f\xbf_\x81F\xcd\xa1Jc\xbfu\x87\xc1\x12\x85\xb8\x8e?nY\x00\xffA\t\xa7?\x99\xcc\xef\x117\x81\xb3?\x18."}\xb1A\xb5?\x94\xbb\xb1;\xb2R\xa2?\xc4\xee\xee-\xd9\xaa\xb3\xbf9>\xa4\x12_\xc4\xcc\xbf04%C\xe3l\xd5\xbf\xdd\xad\x0c\x17\x01\xb3\xd4\xbf(\xe4\xff\xe05\x82\xc3\xbfn\xe3\x92\xd2\xff\xb4\xc0?<\x85^\x98E\xbf\xd9?R,\x9d\x1c\x1a\xf6\xe0?8\xb4^pP\xde\xdc?<\x15uE\n\x06\xcb?\xf9u\x95\xaa\x81\x06\xb1\xbf\xf4:\x17\xffnv\xd0\xbfc\xf8\xafu\x0fZ\xd3\xbf\x95\xbc\x9d\x1c)\xe7\xcc\xbf\xa7\x1e#P\xe2\x91\xb9\xbf\xfd\xe2m\x88\x94|x?\xd6\x88\x88\xe6^\xee\xad?z\x11\x1aw\xb7\xce\xaf?\x8f\xf2\xec-\xfb\xce\xa4?\x86\xa78\xe5\x92\xe5\x90?\x9b>\xc7\xd6\x1b`Q?\xf1U\xb6T\xf60s\xbf\x85\'|Wq\xd0r\xbfj\xdaO\xb3\xb9\x91e\xbf\x81MQal\x90O\xbf\x1d\x84\xa5ZH\xeb\x1e\xbf\xa0\xf3\x99\x13c !?\xb5\x8e\x8c\xc8\x03\x00 ?\x82"1\x9f6\x1b\x10?\x06WW\x01\xd7\xfb\xf4>\x95o\x00}\x98x\xc8>y\xd7\'\x8bf\xbb\xb4\xbe\xd7\xbe\x0e\xa7\x02\x87\xb3\xbed\xb5\tO\x95U\xa1\xbe\xe45?\xdf\x87\xf2\x83\xbe\x00\r\x18\x01\x85\xffW\xbe\xa7\x10\x85k\x1c\t0>wk\xf1K(\x0e1>v\xd3\xa8M\xbf\xe3\x1a>D;\x83\xd7,\xbe\xed=\x1a\xe9\x00N\xed\xb7\x14>\xf9\x86\xbd\xc95\xe71>\xf5\xc0\xbc\x13J\x0fC>kl/|\xfbG">r\x81\xab\x8eX\xa9t\xbe\xb6\xa0R\x93)n\x9a\xbe\x92r\xca\xed\x02\x02\xb4\xbe^\x03{IT@\xc3\xbe\x7f?#D\xda\xb2\xb6\xbe\x89\x88_\xdf\xe1\n\xe4>\xbc\x1a\xbc-\xa5>\x08?DR\x16\xb6-\x1b ?B\x82\x13\xd4\xf9\xa5+?2\xbc\xb0\x01\t]$?j\x0e\xea\x86-\x8c:\xbf\x80\xd4\xb2c\x11\xee_\xbfZe\xc1\xa2\x98\xafr\xbf\x06\x8a\x83Ro^|\xbf\xa57\x88/\xfd\xf9u\xbf\xa4\xee\xd31\xc7\xd8v?\xe0$\xd6[\xa1\x1c\x9e?eTo\xdcI?\xaf?3\x0c\x8bV\xfd\xdc\xb4?\x87\xa5\x0f\x8f\xa4\x7f\xaf?yQC\xba\x8c\xf0\x95\xbf\xb7hoPkB\xc4\xbf\xf3\xe1\x14\x0f2\xd3\xd2\xbf\xbf\xb2\x1c\x0f\xf1\n\xd6\xbf\xd7\xa0\xa3\xbbC\x1c\xcf\xbf\x99L1\x8bA\x9fp?\xa0GpANY\xff\x9d\xbeUG\x15\x0bcW\xbc\xbeJ\x14h_A\xc9\xaf\xbe\xdf\x10\xda\xbd\xbe\x16\x96\xbe@\xfd_A\xb7\xeer\xbeA9\xd6*\xfb\x04\x1f\xbe\xd3\xa7k\x81\xc94:>\x8c\xad\xb8\xcd4\x01+>\x14k\xa9\xa9\xb8p\x10>Qy\x9a\xe9\x8cC\x01>1C\x03G\xe2\x00">x{\xd2w\xbcQ8>\x13\x96\x9e\x98\xdf\x1f>>\xf7\t\xaf\xba}\x03X\xbeO\x1e\x8b\xaa\xde\xf8\x87\xbeV6h\x07\x84\x0f\xa6\xbel\x80\xbf{"M\xba\xbe/\tG\x87\x9f\x9f\xc0\xbe\x135\xfa\x0cE\xaa\xc4>\xb5/\x19\x85\xcc\xcf\xf7>L\x9c\xd39\x1f{\x13?&\xa8(\xe9dg$?\x12+\xe2\xc2}\xbd(?\xa6\xdb\x94:\x9dx\x11\xbf\x88\xaf\xfd\xd6(\xd9P\xbf\xf6\xd2,\x12\x97\xc9h\xbfl\x9f\xb9\x88\x97\xc0v\xbfQBX\xa9\x06\x8dy\xbf\x9f\xf7\xebD\xbd\xfa?\xbf\x19\xbc\x1fOH\xdf\x90?w\xb0(\xdd3\xb5\xa6?\x82\xca\xfc\x18\x05B\xb2?/\xbbxK1\x95\xb2?\xa0\xedP\xe41/\x95?\xfa\t\xd6S:\xa7\xb7\xbf\xfe\xd9\xf5\xcbw\xec\xcd\xbf\xfe\xd6mz\xd6\x1a\xd5\xbf\xde\x01\x86\xf0R2\xd3\xbfX\xb6C\xaf\x0c\xc6\xbc\xbf\x8c7\x90jC\xc0\xc6?,^\x8c\x9c\xf3P\xdc?\xe2{\xdfh8\x94\xe1?,^\x8c\x9c\xf3P\xdc?\x8c7\x90jC\xc0\xc6?X\xb6C\xaf\x0c\xc6\xbc\xbf\xde\x01\x86\xf0R2\xd3\xbf\xfe\xd6mz\xd6\x1a\xd5\xbf\xfe\xd9\xf5\xcbw\xec\xcd\xbf\xfa\t\xd6S:\xa7\xb7\xbf\xa0\xedP\xe41/\x95?/\xbbxK1\x95\xb2?\x82\xca\xfc\x18\x05B\xb2?w\xb0(\xdd3\xb5\xa6?\x19\xbc\x1fOH\xdf\x90?\x9f\xf7\xebD\xbd\xfa?\xbfQBX\xa9\x06\x8dy\xbfl\x9f\xb9\x88\x97\xc0v\xbf\xf6\xd2,\x12\x97\xc9h\xbf\x88\xaf\xfd\xd6(\xd9P\xbf\xa6\xdb\x94:\x9dx\x11\xbf\x12+\xe2\xc2}\xbd(?&\xa8(\xe9dg$?L\x9c\xd39\x1f{\x13?\xb5/\x19\x85\xcc\xcf\xf7>\x135\xfa\x0cE\xaa\xc4>/\tG\x87\x9f\x9f\xc0\xbel\x80\xbf{"M\xba\xbeV6h\x07\x84\x0f\xa6\xbeO\x1e\x8b\xaa\xde\xf8\x87\xbe\xf7\t\xaf\xba}\x03X\xbe\x13\x96\x9e\x98\xdf\x1f>>x{\xd2w\xbcQ8>1C\x03G\xe2\x00">Qy\x9a\xe9\x8cC\x01>\x14k\xa9\xa9\xb8p\x10>\x8c\xad\xb8\xcd4\x01+>\xd3\xa7k\x81\xc94:>A9\xd6*\xfb\x04\x1f\xbe@\xfd_A\xb7\xeer\xbe\xdf\x10\xda\xbd\xbe\x16\x96\xbeJ\x14h_A\xc9\xaf\xbeUG\x15\x0bcW\xbc\xbeGpANY\xff\x9d\xbe\xa3\xba\xe7\x0e_\xde\xe3>\x15\xdd\xab,\x91\\\x05?\xb1\x98\'\x97\xd6\xee\x1a?$q\x02;-\xa7%?H\x18\xd6^\x03\xe0\x16?\xee\xbda\xa8+\x0b=\xbf#\xda\x07)\xf8\xb3]\xbf\xd3\x1ah\x9e\x80pp\xbfw\x88\xa7\x83\x18\x8bw\xbf*\xb6.u_\xe8m\xbf\xfcm\x97\x90\x1d\xd7|?\x7f6\x12\xc9\xa1\xa3\x9d?\x8cA:\xf1\xb0\xec\xac?l\x93^\x85\x96L\xb2?\\\x9bv\x0f\x88\x14\xa8?lP\x94\\\xa7_\xa2\xbf\xd8]L\xa8\x17+\xc5\xbf~\xb43i\x92V\xd2\xbf\xdb\xa5\xd8k\x8be\xd4\xbflUq\x00B\xf3\xc9\xbf3\xcb\xc7F\'\xd5\xa8?\x0b\x05\x92o\x81\x8e\xd5?Bh\xab\r\xe7\xc0\xe0?\x9f\xc7i\xbf\xb8U\xe0?\xa0\x08?\x89\x88_\xdf\xe1\n\xe4>\x7f?#D\xda\xb2\xb6\xbe^\x03{IT@\xc3\xbe\x92r\xca\xed\x02\x02\xb4\xbe\xb6\xa0R\x93)n\x9a\xber\x81\xab\x8eX\xa9t\xbekl/|\xfbG">\xf5\xc0\xbc\x13J\x0fC>\xf9\x86\xbd\xc95\xe71>\x1a\xe9\x00N\xed\xb7\x14>D;\x83\xd7,\xbe\xed=v\xd3\xa8M\xbf\xe3\x1a>wk\xf1K(\x0e1>\xa7\x10\x85k\x1c\t0>\x00\r\x18\x01\x85\xffW\xbe\xe45?\xdf\x87\xf2\x83\xbed\xb5\tO\x95U\xa1\xbe\xd7\xbe\x0e\xa7\x02\x87\xb3\xbey\xd7\'\x8bf\xbb\xb4\xbe\x95o\x00}\x98x\xc8>\x06WW\x01\xd7\xfb\xf4>\x82"1\x9f6\x1b\x10?\xb5\x8e\x8c\xc8\x03\x00 ?\xa0\xf3\x99\x13c !?\x1d\x84\xa5ZH\xeb\x1e\xbf\x81MQal\x90O\xbfj\xdaO\xb3\xb9\x91e\xbf\x85\'|Wq\xd0r\xbf\xf1U\xb6T\xf60s\xbf\x9b>\xc7\xd6\x1b`Q?\x86\xa78\xe5\x92\xe5\x90?\x8f\xf2\xec-\xfb\xce\xa4?z\x11\x1aw\xb7\xce\xaf?\xd6\x88\x88\xe6^\xee\xad?\xfd\xe2m\x88\x94|x?\xa7\x1e#P\xe2\x91\xb9\xbf\x95\xbc\x9d\x1c)\xe7\xcc\xbfc\xf8\xafu\x0fZ\xd3\xbf\xf4:\x17\xffnv\xd0\xbf\xf9u\x95\xaa\x81\x06\xb1\xbf<\x15uE\n\x06\xcb?8\xb4^pP\xde\xdc?R,\x9d\x1c\x1a\xf6\xe0?<\x85^\x98E\xbf\xd9?n\xe3\x92\xd2\xff\xb4\xc0?(\xe4\xff\xe05\x82\xc3\xbf\xdd\xad\x0c\x17\x01\xb3\xd4\xbf04%C\xe3l\xd5\xbf9>\xa4\x12_\xc4\xcc\xbf\xc4\xee\xee-\xd9\xaa\xb3\xbf\x94\xbb\xb1;\xb2R\xa2?\x18."}\xb1A\xb5?\x99\xcc\xef\x117\x81\xb3?nY\x00\xffA\t\xa7?u\x87\xc1\x12\x85\xb8\x8e?_\x81F\xcd\xa1Jc\xbf,Il\x800&\x7f\xbf\xf0x7\xac\x9b\x96y\xbf\xdc\x8b)T*\x80j\xbfJ\xef\xb7\xfa\xf5\x86P\xbf\x0f>\x8d\xee\x0f\xfe\xe2>\x0b\x99\xee\n(10?V\x0c\xe4\xcf\xec,(?]g|\x0b>\xee\x15?\x01cS\xbc\x1d\xf2\xf8>\xc2\x17\xea\x12\xde\x0e\xb9>kw\x11\xb50\xab\xc7\xbe\x80\x93\xbd2+o\xc0\xbe]\xcfU\x08\xfb"\xaa\xbe\xdd\x06K\xd4^\xad\x8a\xbe\xc6Dv\xf2f^T\xbe\xfa\xf9\xa6\x96\x04\xefG>\xd4\x0f|\x1d\xef\r@>\xb8\xc1h7Zq&>\x11\xe8\xfbT`V\x04>\x80+Ac\xf9s\xd1=\x01#\xaez\xf0\xed">\xcd.&\x8b\x1ed0>w\xf8\xeb \xc1\xed0\xbe\x8d3\x0f\xfc\xe2\xd0o\xbe\xd2^y\\\xa3+\x91\xbeW\x89\x91\xf6\x8f|\xa7\xbe\xb48\x12=W%\xb3\xbe\xc8\xa3~\xeft\xd3\x87>\x94\x05/\xfc\xb8\xe4\xe1>F\xe3\x98\x97\xb0}\x01?\x02iL()\xf5\x14?\x14!\x03N\x8aI\x1f?\x1dA]j\xb6\xf4\x00?\xae(\'E:\\<\xbf#\x97\xa4\x994\xa5Y\xbf/\\\xf9\x04\x86\xedj\xbf\x10\x13\tbw\x15r\xbf\xe8\xaf\xacp\xf5\xf6`\xbf\xa3\xff\xb4\xb4\x198\x7f?\xa4\x13\xaeA\xa0\x06\x9b?Gz\xa9\xaf\x05\xed\xa8?@\x99\x11\x8fu\xc6\xad?\x13Nz\xad9B\xa0?\xd4\x1d\xd4\x8c|6\xa7\xbf\x1f6\x9e\xe5\x83n\xc4\xbf\xee&\x07x\xa4\xa0\xd0\xbf\x15j\xf9yC\x88\xd1\xbf\xce@_[\xce\x90\xc3\xbf7\xcb\x92\x1dz\xd1\xb5?z\xad\x0cm\xab\x19\xd6?\x89_\x85BS\xf9\xdf?F\x143_\x88\x9e\xdd?\xe9]\xb0\xda\xae\xba\xcf?\xd9\x00\x02t\x13R\xa4\xbf)NE~\x9c\x07\xd1\xbf\\S\xd2\x17\xed%\xd6\xbf}\x90\x8b\xf1)\xfb\xd1\xbft\xdd1\xcf\xfc\xd8\xc1\xbf\x15\x07\xc3(\xb8\x85r\xbf\xe6\x01h\xcc,\x93\xb2?\x18\xd1\x12\xac\x90\x17\xb6?j\xe9k\xe6\xd7k\xaf?\xe8\x81\xc8\xc0#F\x9c?\x11\x801\xcf\xc5:l?\xe6\xee\xb1\xba\x82^|\xbflp\xe2\xdc\xd6\xb2\x7f\xbfC\xdb0\x97\xe3\xc5s\xbf\xca2\x06\xc5\xa9\xce_\xbf\xd9\x95\x8dy\x04\xfe4\xbf\x1c\r\xfb\n\x97\xbd-?\x86r\xf9\x8c\xaeT0?\xce3\x0e\xfe\x9a\xee!?\x050\xa9\xcc\x81\x8b\t?+#S> \x1c\xe2>QaAq\xce\x84\xc4\xbeH\xac\xf4\xe1\x84\x1c\xc8\xbe\x9a\xcb1(\xb9p\xb7\xbeV\xf3\x02\xed\xeed\x9d\xbe\x07c\x10\xech\x85t\xbet\x84\xccN)\x8a@>\x86N\xb4\xc3\xeajI>l\x8ci\xd7:\x146>\x93,\x0fL\xa9I\x18>\x11gQ\xa7\xfe\xe4\xef=\xf3\xd2%\x8a<\x9a\x8c\xbd\xf4\xdc\xc4xE\x18&>5/\xe5\xd7\x84u\x19>\x87+_\x0fX6U\xbe\x8a\xc8\x88\x1ac\xcb~\xbe\xfdH\xca#3\\\x99\xbeh\x01\xaah\xc4\xdb\xaa\xbeV;\xe3\xf1\xf7\x1b\xa6\xbepQ\x1fl\xaeA\xc8>\xce\x18>\xf8\xe6\x1d\xf1>uX\xe8\xdf\xf2\xca\x08?\x04\x19\xf0p\xc8I\x17?\x10\xa7m\xf1\xeb#\x15?W3\xff\xeb~v"\xbfG\xd0bo\xc0GK\xbf\xe0\xfb\x9e{\xcawa\xbf|KYH3\xeal\xbf\xfexMV\x05-j\xbfCX\'1\xd4\x07a?i\xc9\xb53h\x11\x8f?Q\xf7\xb8\xc7\xcf\xbc\xa1?Y\x14\xdf\x80\xf2\xc4\xa9?M\xf2e\xe7\xd1\x18\xa6?+e\x85\xfde\x12x\xbf\x97\x86I\xdd:)\xb9\xbf\xdfu\xef\xa4\xbd\xf2\xc9\xbf>\x03\x84\x96Y\x83\xd0\xbf\x0bI>\xe5\x95\x07\xca\xbf\x05\x9e2\x8d\x14\xc1\x97\xbf\xb5\x8bW}\x0b\xc3\xcc?\xa5\x7f\xe5\x1e\xa4R\xdb?+\xe5\x0c\xad\x00x\xde?\xbf\x93\xae||\xa8\xd5?E\xb1`<\x14\x17\xb4?\xd7N/;\x85\xe7\xc6\xbfW\x010\x99\x0c\xaf\xd4\xbf\xe5!\xee\xcd\xc2?\xd4\xbfo\xf0W\xd9\xdf\xa4\xc9\xbf\x82\xe3\xb6\xe4\xf0\xb5\xac\xbfo\x18\xa8\xf3q\xcb\xa8?\xc0\xa7P\x1bRy\xb6?\xa9T\x0b\x92;e\xb3?\xa2 \xe1d9\xb4\xa5?\x1c\xc3\xf1\xd1\xcc5\x89?\xcd;\xe5\xab\xc8>q\xbf\xf64\xa2\xae}z\x81\xbffn\xb7M\xf4\xc6z\xbf\xd1+\xfb\x11kWj\xbf?\xe6\xa5=\x10\x9bM\xbf\xf8Z\x00\x89\x9d\x99\x19?\x12k\xaeK:b3?\x98\xa6_\xd1\xba\xa2*?\x89X&\xefD\xf8\x16?\xaa\x83\xec\xf7\xc3\x08\xf8>\x06\xf4W\xb7I\xec|>\x1e.b$\xf3w\xce\xbe."\tH \x14\xc3\xbe\xediUW\x87\xd2\xac\xbe\x03Ec\x8a2l\x8b\xbe\xd8\r]\x13:\xf5I\xbe-\x19K9\x94\xcdP>@_\x82\x07r\xa9C>\x03PL\xfd\x86\x0b*>\x05\xe6\x90l{1\x06>\xf6\xdct\xd3:\xa4\xcd=\xf2\xd2\x8aBw\x8d\xb9\xbd\x94\xad\xc3\x13\rj">5\x8c\xa0{E\x8f3\xbe\xe6\x8f\xd1\xc5\xe6\xa1h\xbe-\xe7\x88\rH\xd7\x88\xbe\xc5\x19U\xef\xbf!\xa0\xbet\xdb;M\xd2\x92\xa7\xbe\xd9!\xe3\x17A%\xa1>\x1fYL5p\x85\xdd>\'@\xb0\xfd\x8c\xa3\xfa>\x05\x99@\x96\x9aW\x0e?\xda\x07\x84\x91\xbd\xc3\x14?\xe7\x8f\x94V\xac\xa2\xd3\xbe\xf5H\xef\x90\xdf\x1b9\xbf4w r\xd3\x92T\xbf\xbf<\xfc\x89\xab\x86d\xbf\xe3h\x8dP\xa2\xa4i\xbf\xd5\xe8\xae\xec\\2K\xbf\xc3\x86\x96\xf9\xcf\n~?\x83\\\xf7,\xc1\xdd\x96?T\xda\xb5?\x17\xff\xa3?\xa3\x04$I\xe2m\xa6?\xe7\x16\xa4/\r\x8c\x92?\xc0\x8d\xa3i\x9c\xe3\xa8\xbf^\x80K\xe9\x1cC\xc2\xbf\x07\xe4\x0e\xb3\r\x12\xcc\xbf\xb7U\xf5\xc5\xe2\xf6\xcb\xbf\x9b\xe9\xcf\xd5\xbf.\xba\xbf\x9f.\x02$)\xad\xbb?\xcc\xb9\xeb}:\xeb\xd4?G\xcc>\xa1\xd7e\xdc?\x8d_\x97\xd0$\xf3\xd8?sZ\xce\xec\x9e\x94\xc7?\x1c\xc5\x13\xbcY\x1b\xb3\xbfm\x85\xe5(\x0b"\xd1\xbf\xed\xc1\xb9\xa6\x0e\xb4\xd4\xbf\xa1_\xc4\x17\xde\xf1\xcf\xbf\x92?\xac\xdaR\xca\xbc\xbfPY\x83\nV\xc2\x87?f\x8d\xb4_\x0c\xfa\xb3?\r\x82\xb9\xe93\xbf\xb5?\x17;\xb9\x13\xd0f\xad?{\x8c\x19\xc9\x82t\x98?\x12\x1a\xf4K]\tQ?\xc5%\x80t\xc4v\x80\xbf}\xd5E\xa4\xd4q\x80\xbfE\x80\x88%\x06zs\xbfa-\xd8\xffPL]\xbf\xa3\x91,\x9c\xb4\x92*\xbf\x95\xb4\xc7@\x01\xf52?\xf4:\xf6\x94^\xe21?+\x8atb,\x96"?\xea\xb8\xc8\x8e\x0e\xf3\x08?\xa7\xe4B!\x80\x86\xdc>\xc1k^*\xaa\xd5\xcd\xbe\x8a\xad\x18\x1a\x1c\xed\xcb\xben\x8b\x82\xca&\x90\xb9\xbe\xfdw\x04\x96\xb6Z\x9e\xbeW\xff\xcc\xfd\x89Pr\xbe\xa1e2\x97\xa8\x94N>c\xc8\xf0\x17\x84:O>\xae\xb2\xddF\x84V9>#\x9c\x83\x8f\xa4w\x1a>~G\xed\xc7m-\xef=e\xd9\xd8?\xc4\xa5\xb1\xbd8\xf4u\xbb\xe7\xea\xb8\xbdCog\x87\x87v\xe8=\x83]7\xad\x1b\xebP\xbe\xa0hww\xf2\x13v\xbeL\x05"v|D\x91\xbe-\xb7q\xd2\xa0\x11\xa1\xbeQ\x91\x8e\xea\xd19\x92\xbeu\xdfSz\xaf\'\xc5>[\xeb\t\x9b\xaa\xe5\xe9>\x19\x90\t\x95\xba\xc3\x01?2w\'woh\x0f?\xa6\x10\x93\xcd\x14\x85\x06?\xc6\'\xfe\x0e\xc5-"\xbfJ\x1d\xe7\x9a\xe3\xd0E\xbf?\xe3\xda\x81\x81VZ\xbf\xe1\x004g\x18\xa0d\xbf\x8a\xe1<\t\xba\xf2_\xbfQ\x01\x13\x84 \x9ed?\x9a\xb0\x8e\xcbNV\x8a?]\t1\xf1V$\x9c?Q}\xe5`dg\xa3?g*\xe9\xc0\xa0\xad\x9d?`\x9f\xf4\xc4\xb0\x92\x8b\xbf\x92\x14-y\xb8\xb4\xb6\xbfp\xe7|d\xf6\xaa\xc5\xbf\xb1\xda\xd3\xc3\xce6\xca\xbf\xbf\xaa:\x0f3\xe2\xc2\xbf\xd7\x8a\x12\xb2\xdb\x06\x86?\x19\x96X\xd2\xc5\xd0\xcb?d\x8e.\x83R\x08\xd8?\xbd\x9a\x01\xd9\x16x\xd9?\xe9\xae+\xcd<\xce\xd0?\x10\x9e\x91\x94\x9e\x9a\x9f?~\xa4\xa9_\xe3\x02\xc8\xbf\xd6\xf0c\xe8\xe9.\xd3\xbfw\xbe\xe5\xe5\xb3\xd0\xd1\xbf\x06h\x1c\x826(\xc5\xbf\x8e2\x88\xbdx\xb8&\x02P\x95\xb8\xbel\xdbO\xfdS\xe9\xd1\xbe\x80j\xb1\xc6\xc0\x97\xc4\xbeg\x10\xc1\x98\xef\x92\xad\xber9\xb5\x8c\xec\xf1\x89\xbe\xa1|\xae\x10A7&\xbeo\x16\x12\xcajGU>\xfb\xc5\xd9\x1cp]F>\xc5!\x94\xb8m",>C\x912\xf5\xdba\x06>\xfa\xd4\xac\xa9\x99\x91\xc3=2)\x91 \xe6\xb3\xc1\xbd\x137\x82\xf1ux\xb1\xbd\xd7\x06\xb5m)\xd21\xbeO\xe4\xeat\x10\xa1a\xbeQ\xe4W\x85\xeb\xb9\x80\xbe\xe6\xfa,\xdb\x82\x94\x94\xbelQ\x9elr$\x9a\xbe\xffNz\xa1\ti\xa4>\x04\x18\xed[3l\xd6>\xf5\x9f\xd9<0\xe0\xf2>r\xe6\x9fN\x9ek\x04?}fH\x03\xcc\'\t?]\xe1_:\xa6W\xf9\xben\x96\xeb3\x91V4\xbfB]\x110(\xb2N\xbf\xde\x1f\x93\xef\x0b\x1d]\xbf}3=\xa3a\xb7`\xbf&\x91\xa2\x0b\xe0S\xe7\xbe\x16hm\x9d\xc8\'z?\xb2\xff\x12A&\xf9\x91?\xd1\xb7\xd5\x14\xd2\xdc\x9d?`\xfa0\x1bY5\x9f?\xab\x95JJ\xb8i\x7f?\xfa\x9cc\xcc\xad\x9d\xa7\xbf\x87\x08\xe1\x06\xd2H\xbe\xbf\xff\x87/R\xe4\x0e\xc6\xbf\xa3\x16\xb8\x97/\xa8\xc4\xbf\xe4D\xfa\xd4\xa8\xed\xad\xbf\xeb\xfe\xc0\x1a\x03n\xbd?FV\t\xd3FT\xd2?\\B\t\xe9\xbez\xd7?\xfd\xc4OX\x07\x81\xd3?FA\x8f\xa17<\xbf?\x90\xae\xeb\xe8\x9bn\xb8\xbfj\x83X\xd1R\xcf\xcf\xbf\xf7x\x08\x8b\xf2\x02\xd2\xbf\x9cc5\x95g^\xca\xbf\x15\x83\xd3xg\x14\xb5\xbf\x8f\xc7\xb1\xa7\xd1\xa4\x98?(^c\x08\x93\xb9\xb3?4\xd9\xad\xd2\xdf\xe9\xb3?\x13!\xe2%\x90\x96\xa9?\xfc,\\\xf9Ic\x93?\xb27\xb5\x88\x0bjS\xbf\x1a&bN\xcbe\x81\xbf57\xe4k\xf5\xb7\x7f\xbf#\xd4b\xe2w\xdaq\xbfV\x83\x00{T\xe0X\xbf\xed\xa4\xa9h\x88\x8e\x13\xbf\xbc\xc3\xa3\xc8\x8f\xa95?\x10\xdb\x0fq\xc8.2?\\j\xa5;\x01\xef!?\x9b\xaa\xe6\xe6\xc8\x8a\x06?\xb4\xad\x05\xf5\xb5[\xd2>\\2-\xd0\xa0\xcb\xd2\xbe\xafi$l\xa4\xf9\xcd\xbe\xfc\x10\x1f\xf4\x13\xf4\xb9\xbe\xd5\xdc\xbb\xe0\xbd\x10\x9d\xbeJ\x98\x00\r\xc5\xadl\xbe[\xc3\xc1\xecM.V>b5\xc2Sq\xbbQ>]\'\x8c\xa0\x10\x11;>\x19\x15\xf29h\xc9\x1a>\x98\x90\xc3\xf3\xa5v\xeb=;/\xd2G}\xd7\xc0\xbd\xd63\xe9\xee\xdb\x08\xbe\xbd!\xbc\'q\xd0W\xa4\xbd\xd8\xe22(\xab\x9eH\xbeYt5\xd64nm\xbe\x12\x08jJ\x80\xe1\x85\xbeT;\xc6f\xed\xfa\x93\xbe\x9e_6u\x07Ok\xbe\xc5gV\xf8i\x9a\xc0>\xd8Z\xf8\xfbJ1\xe2>\xea\xd6X\xd2n\xb2\xf7>Ud\x140\xc9\x94\x03?\xb7\xf7r\t\x89\x11\xf3>\x88L\xf5\xed\xbbN\x1f\xbf\x9d\xebD\xd9\xb3,@\xbf\xca\xc4sS4|R\xbf$\x15\x80\x87\x05F[\xbf\xf66\x0b\xa0U\xf5P\xbf\x92\xf57\xe8\x033d?G\xc3\xba\xb7?\xa6\x84?ly9v\x0c\xc8\x94?x1\x12\xf9\xaf!\x9b?\xbf6\xe0\xd2\xa0\xe4\x91?\xfe\x1e\x94\x81\xbb\x07\x91\xbf\xd3\xa5S+\xaa\xe1\xb2\xbf\xef\x83\x82\xff[\xd6\xc0\xbfZ DcdW\xc3\xbf\xfa\xc5\x93\xbb\xeb\xf6\xb8\xbfM\xbd\xa7\x0c\xa8[\xa0?hE\x08z\x9c\xa4\xc8?\x8a\x89\xa4;\xcb\xa8\xd3?\x1f\x8f:=/\xce\xd3?\xd25\x8d\x07\xb6\xf4\xc7?\xbe\'\xd3\xdc\xfezv\xbfbgg{\xea\xd3\xc6\xbf\x01\xe0tR\x17\x88\xd0\xbf\xde\xf5\x98\x86\x12-\xcd\xbf\xe42<\x99q\x1c\xc0\xbf8\x00\xfer\x8e\xc3\x8d\xbf\x0f\xc2Z\xd4\xae\xc0\xad?p\x147\xff\x8a\x01\xb4?\x91[\x8d\xee\x83\xf2\xae?\x98\x03Cbn\xb1\x9e?\xd1\xdcL\xa0\x17Rv?+#\xe9K)\xdcz\xbf\xf6\xf6\x96-\xcbe\x81\xbfd\x7f\x1e\x8fz\xa6w\xbf\x8f\xc5\x0b\x9f\xf1\xd5d\xbf\x12\xdd\x9b\xeb\x104A\xbfu{\x8b\xe5\x03I0?6>^\xc9B\xb35?\x06\xe3\xe6\x98\xef\x0c*?t\x81\x07\xe4\xf4=\x14?|S\xc7\x0cJ\xe4\xf0>\xfa\xd3]\xb0\x05\x92\xc8\xbe\xc4<>\xd5\xa5Z\xd3\xbe?\xb8m\x13\xb1\xad\xc4\xbeS4\x8d\x18M8\xac\xbe\x01\xa3\xbcm\xa7x\x86\xbe\xb3)t\x9bZ\xe4@>\x19\xfa\xe4]\x87\x93X>k<\x8b7Q\xa6G>\x88\xae\xc7\xaf\xc6G,>\xf2\xfeV\xa9\xa1\xca\x04>)\xc2\xeb-\xcb\x9f\xa8=\x11\xc2\x1a \xc8\x0f\xc6\xbd\xdc\xa6\xa1G\xd0x\xb3\xbd\x96\xae)P\xcbe\x94\xbd\x85)SV\x12aW\xbeN\xfa\xbbD2\xf8t\xbeb\xb5\xf0\xf9\xbeY\x88\xbe\xb2O\xfc\xe83\x8d\x89\xbeBm\x85\x0c5\x97\xa2>\xaa\x1aE\xa3\xb4x\xcf>\x9b\xa4\x93\xa1\x1a\xe6\xe8>;\xc2Ek\xe3\x87\xf9>\xb9\x13\'\xa8\x01\x85\xfb>\x95a\xaa.\xaau\xff\xbe\x0eJ\x1cy,P.\xbf\xd5\xa1\xc3\xbd`NE\xbf\x1eV\x9d\xee\xa12S\xbfi7\xe7)>\xebS\xbf\x13M\xef\xc7U+;?\xa4\x1a1\xaaj\xcet?\xc1\xc3\xfa\xb7\\E\x8a?\x11\x1d\xc1tO\xbf\x94?\xf3P\xd9[\xa4\xfa\x93?\xe7_\x91\xa5\x11\x0fN?y\xf6\xac\x1a|9\xa4\xbf#\xe2Wy\xd3R\xb7\xbfG\xf4l\xd7_"\xc0\xbfj\xbd>.<3\xbc\xbf\xe9$\xa6/\xfbZ\x9a\xbf\xfc\xf2\xce\xd6\xe2\x8c\xbb?\xea\x19o\xe5\xe7\xc9\xcd?=Ig!\x99\x12\xd2?\xd6\xc5}\x85\x1bA\xcc?5\xaf1\x93K\xd6\xb1?\xaa\xcb\x9b\x9cT\xcd\xb9\xbf\xa2s\x9d\x1d\x0cS\xcb\xbf\xbdn\xdc;\x83,\xcd\xbf\x84?(\xcfR4\xc4\xbfm\xc8-\xe3\xb1\x9c\xab\xbf\x06\xad\xf1\xf5\xb6\xec\x9f?\xf4\xf5j\xac\xcc\xf5\xb1?\x96\x8c\xeciS\xf8\xb0?\xa1\x1f\xe0\x8dy\xb2\xa4?\xde`\xfa\x8b;\xf5\x8b?\xcb\xdfP\xd6\xd5\\g\xbf\x12\x14\x98\xdf\xa0\xdc\x80\xbfE\xa4t\xea\xd8s|\xbf\xaa\xb7q\xf7\x07rn\xbfM\x15\xc4\xc5caS\xbf\xa8<"\x1ft!\x05?\xa3\xf4b\x81,\x7f6?\x10\xfb]\xeb\x1c.1?\xdc\xec\xe9p\x8e\x1a ?\xec\x96\xed\xc0K\xc9\x02?\xae\xa3\xde\xc8\xd2\xa1\xbe>WP\xd6\xd6`\'\xd5\xbe\xf0\x91\xdf\xeb\x03\xdd\xcd\xbe\x03\xbddG~\x87\xb8\xbe\x9a)F\x8e\xbc\xc1\x99\xbe\xceI\x7f\xab\xcf\xa8b\xbe\xa1\xc0a\xe8\x94\xa5[>\xd6$\x1f\x07\xf1\xa7R>\xb4o\x18j\xbf\xea:>p\xd2\xd4\x05\x13%\x19>\xf2\x88b\x9b\xc1W\xe5=\xb0\xa5_Q\xd6o\xc8\xbd\xf3p\x8c\xe0\x16\xb9\xc0\xbd5;\xa0Y6I\xa5\xbd\x93\xb7\x06K"\x8e\x81\xbdc\x98\xd6\x92n?b\xbe\x0e\x86\x9c\x9d\x89\xc9y\xbe\xfe\xaeI!4n\x85\xbeG\x05\xd9\xee\xc2\x18j>PG\xca\x0c\xf9\xbc\xb7>\x9bg\x80\x0cO\xc2\xd7>\xb7W\xc8\x00\x95j\xed>\xc4\'|$s\x80\xf6>\xcav\xbb\x7f\x14\x01\xd2>\t\xc6\xcb\xb3\r0\x18\xbfL\xb1\x8a\x90\x89D6\xbf\xef\xc2\xa8\xe5l\'H\xbfy^Z\xa1\xdc\xadP\xbf/\t~k\x80B=\xbfn@\xcd0\xd1/a?\x1f\xc4\x80\x97\xc1\x02~?y\xf1An\xbe\x92\x8c?L\x9f\x91\xebF\x96\x91?tRW<\xd3\xe4\x82?\xcb,\x1f^\x8e\xa2\x90\xbf\xc7#\xc7\xe9\xb0\x07\xad\xbf\x902*\xee\x97[\xb8\xbf\xd5\x12\xbexS\x81\xba\xbfY\x1e\xe2;\x95\xb7\xad\xbf\x14$\xdc\xbf\xf6\xcb\xa4?v%\x15N\x8d\x1a\xc4?\x8f1GF\xc4\xed\xcd?\xcf(Q_\xf3\xa2\xcc?\x9a\x1f\x1e\xbb|)\xbf?Q\xb7\xfe\xa1\xf3V\x9c\xbfA\x11N\xd2\xa8\xdb\xc3\xbf"\x18d\xc9\t\x7f\xca\xbfQ\xfb7\x17 :\xc6\xbf\x9d\x91G\x12\xee\x8e\xb6\xbf\xfa\x9d\xfb\xbb\xe85\xd8>\xbb \x05\xfa\x8b\xd0\xab?\xc0\xd1Ik`\xe4\xb0?\xd8\xd6#\xba\xe6\xd2\xa8?\xc24\xa5\x94H\xef\x96?\xae\xbd\x1e\x9d4)d?r\x19+}\xbf[{\xbf\x99\xf5E\x81\xc0\xfd~\xbfm\xdf+\x89\xec\xf6s\xbf)\xdc\xc2\x81,\x88`\xbf\xd2b\xb1\x9f\xb2\x135\xbf\xb5\x12K]\xbb\x932?\xbfrG\x95}l4?|\x14\xe6\x17N#\'?e\x08\x05\x8fX\xff\x10?\x15\xba\xb5\x89\xcb\x02\xe8>\xc6`/\xbc\x1e\xd2\xd0\xbe\xcb*\xf1\xb3TL\xd3\xbe\xde\xba0uUS\xc3\xbe\xef\x01;\xb8\xc2\x05\xa9\xbe\xc2\xc3\xef\x17\n\xaa\x81\xbe\xe8Jt\xf6-\x8dR>\x18\x9c\xfd\xc7\x04\x10Z>\xfb\xd5\xe8\xf8{CG>\xfc\xcd\x81\xd0gp*>\x82\x19\xe2\xf2n\xb3\x01> joi7F\xb0\xbdS\'\x9c\xf4\x04\t\xc9\xbd\x8f=\x04\xbf1,\xb4\xbdW\rq\xea\xeb\x15\x94\xbd0PnE\x0e\xbdh\xbd\x9dq\x0c\xf80yh\xbe\x9b7S\x11C\xacz\xbe\xf6\x1exc\r\xfet\xbe\'\xbc\xe8\x8f\xdd\xdd\x9c>\xfd4\x96;\x9ct\xc4>b\xd4\x03Nm\x93\xde>\xfb\xd3\xcec\xdd\x9c\xed>$\x99>\xea\x0b\xab\xea>V\xc9\x8b\xafd\xbb\xfc\xbe6\xe5mb|\xdc$\xbf\xdaB^\xbc\x89\x87;\xbf\x06\x8c\x97\x99\x97\x85G\xbf\xbe\x19\x8c%\xd5{E\xbf\\\x12\xd2M|\xe3A?\x8a\xb8\xb5\n\x1ann?\x8aZ\xe0\xf4\xca\xdc\x81?\xd20\xc40\x0f\xcf\x8a?\xc8V\xaag\xc0h\x87?\xeb\x19]\xa6\xb5\xecd\xbf\xbc\x9b+\xaa9\x9b\x9f\xbf\xba\xcdG\xa5\x08\xb3\xb0\xbf\xbd\x9c\x8d!h\xf6\xb5\xbf\xf5\xd6\x92"\xe3\xb9\xb1\xbf\x98G\xc3\x9e\x8fyt\xbf|\x1e\x8c\xf1V7\xb7?ZXA\xe3\xaez\xc6?L\x19\xb87\xd6\xe5\xc9?L\x137\x1f\x83\xeb\xc2?\xf8\xca\xca\xf2\x80&\xa0?\xaf\xd5V\x9b\xcf\xd8\xb7\xbf<\x8b\x1b\xb3\xeb\xc2\xc5\xbfk\x85\x94\x99\xee\xfe\xc5\xbf\xd9\x80\x84r\x96\xb2\xbc\xbf\xe6\xdc\x15u}o\x9f\xbf\x95\x12\xb4\x8d(\xc5\xa0?\xca\xd8\xec\xca?@\xae?q\xf9\x1a1\x84\xec\xaa?\x15\xdd\xb5\x8b2\x16\x9f?\xe9%H\xeex\x17\x82?\x8c\xf1G\xb3w\xdbn\xbf\\\t\x98\xeb\xef\x1e~\xbf4\x85)b?\xc0w\xbfp \xcb%\\!h\xbf\xc4w\x9f0\x8c\x82K\xbf\x16\x97\x07\x17\xa0< ?\xc57\x04M\xc9g5?\xc2s\xb8!\xbd1.?ShV\x1b\x84\xe7\x1a?\x7f(\xe7\x11@\xc2\xfc>u\x849[\x07|\x9a\xbe\xee\xe6\xd7\xed\x89\x98\xd5\xbeh\xd69\x9f:\xa5\xcb\xbe#\x1dKt\xb3\x93\xb5\xbe\xdc\xa1P\x1f\xe1\x10\x95\xbeMy\x02\x92\x05\xf1P\xbe\x06\xe2\xac\x85=\xa9^>\x87\x1a(\xe6\xb76R>\xa3GE\xd3V\xeb8>\x03Z\xb9\xefS\xda\x15>|pd\x04+\xf3\xdb=>\xa6\xd2\x8f\x9b)\xce\xbd\xee\x1c\xbc\xf6\x17?\xc1\xbd\xd4\x1d#,\x0e\xbc\xa4\xbdc\x16\xf7\xd3s\'\x80\xbd\xd1}\xf4k\x0c\x86G\xbd\x1d\x80\x1c\x05\x8b>l\xbe\xb2\xb7\xfdc\xe3\xe4t\xbe\xac\xb8Z}!\x19t>\x87]\x9c\x92V#\xaf>\x11h\xcf\x15\xa2\xdc\xcc>\xd9\xfc\xf5\\\x90\xfb\xe0>Z\xe6J@\x11\xb8\xe7>?\x17\xea\x03\x0c\\\xc0\xbe\xccv\xb5\x19\xff\xfd\x10\xbfu\xe7\x9fO\xd4},\xbf\r\x8db\xf9Q_=\xbfos\x8at?\x99\x97\xae\xa65I\x82?<\xfa!)*\x19\x85?E\x9b1\xbc\xf9\x80p?\x12\xb1N&\xf8\xfe\x8b\xbf\xec\x8a\xec\x98P\xad\xa4\xbfq\xf8-\x00\xf6f\xb0\xbfI\x14I\xd4\xe5\xd7\xb0\xbf\x04\\D\x81\xe1(\x9f\xbfl\xd1\xa7\xe6tM\xa4?^\x91\x9f\xb9\xe6N\xbe?\x17\xc1\xc8\x8dy4\xc5?\x03\xe2\xda\xa5\xcc:\xc3?3\x15\x83\xb06L\xb2?\xa1\xc3t\x04)\xc2\xa2\xbf\xaf\xd8)\xe3\x11\xca\xbf\xbf\x0c\xa2Q\x04\xaa\xc1\xc3\xbflP\x15\xcd4}\xbf\xbfS+\xb9\x94\x17\xdd\xac\xbfc\xc8\xc95\xca\xd1\x81?\x83\xde{1!\xc3\xa7?\xa0\x9dx\x13\xff\x85\xaa?\xe8\xc0\r\x86\xdd\x86\xa2?gJ\xcfyd\x89\x8f?S\rAOL\n3?\xb34w\xdcS(y\xbf\xf8h@\xb8\x9c\xa3y\xbf\xccV\xb3T\xc4_o\xbf\xbf\xd9l\xaa\x86=X\xbf%X\xe2\xdf1\xd3#\xbfxQ9N\xc9\xaa2?X\xe3\xbc\x8a\xde\xd31?f\xc7&\xb2\xcd!#?\xe3\x0c\xa0,\xd3r\n?V\x14\x06N\xa8f\xdd>\xaf*\x0f\xdc\xb9\r\xd3\xbes\xd4\x97\xde[\xce\xd1\xbe\xc8\xba\xf5/+\xd0\xc0\xbe\xd8\xf2\x7fuP\x98\xa4\xbe\xf9\xc9tS\n\xd5x\xbe\x14\x1f\xf7D\xc8\xb7Y>HH,z/}Y>lF\x96\xb9\xf6KE>\x1a\x18\xe2\xd8\xab\xd4g\xfb="\xbb\x8aXh\x98\xc4\xbd|\x1b\xb8\xb5M\x0f\xca\xbdme5CSp\xb3\xbd\xa3?\xd5\xb3\xaee\x92\xbd\xb2X\x84\x9az\xb2d\xbd\xad4\xbcE_\n\x05=\xca?z\x91K\xfaj\xbeH\xb9\xb8\x9c7\'Y\xbe\xc2\x1eI\xaf\xb8\xde\x93>%\x19\xa8\x85\x80\xab\xb8>v\xca\x94&+z\xd1>I\xe1\x9b\xd93\xcf\xdf>\xb8\x0f(9\x96\xfb\xd5>{\xe4\xfc\x11t\x1c\xf6\xbe*x\xa6\n_\x95\x1a\xbf\xab\xe1=\xca\x8c\x8e0\xbf\x1c\xd5\xc7\x11H\xbe:\xbf\\Ek\xe3\xe1\x9d4\xbf\xad\x93\xd5\xc0\x03q@?\n\xd27\xb4\xb4\x89d?\xa0\xe1\xf4f\x87\x9bv?="#\xb4"\x18\x80?B]\xc4\x86\x16\xe1x?\xb28go,\xfbm\xbf\xb4\xf9Z\x97\xc4\xae\x96\xbf\x1apO\xd7\xd8>\xa6\xbfW\xd2B\x19\xf9\xcd\xab\xbf\x94\xa4\x9b\xb1\xc1j\xa4\xbfE\x92\xc63\x95\xc3v?K\xfc\x95m\xa5\xd2\xb1?7\xc8\xbd\xb7L\x89\xbf?\xbc\x05\xb6\xf0tD\xc1?oYb\xab\xcfY\xb7?5->|\x1b\t\x80?\x81\x9f\xa3\x8b\xe8\xc7\xb3\xbfi\xb0\xa6\xa0Q\x17\xc0\xbf4\xff\xb4k\x07\xe0\xbe\xbf\xe7\x0b3a\xae\xd9\xb2\xbf\xcfUsgl\x05\x8d\xbf\xfcT\xc5&\xa5\xa0\x9e?:\x8e\t\xfc\xf5\x9c\xa7?)\xff\x88\xfe4\xe2\xa3?\x0e\xbe\x9a\xf8\x16\xa5\x95?\xfb\x94qT\x8c}t?\xb9\xc55\x07T(p\xbf\x0b\xca1\xb1\'\xdfx\xbfr\xfc\x1e\xed\x89tr\xbf\xd7\x8d\x1b\xa0\xb0\xc2a\xbf\x05\xcd\x1a\x83F\x93A\xbf\xce\xc2\xbb\xb6\x82\x0c&?\xdb\x15v\xdb\x7f\xc12?)\xbflE\x92\xb0(?\x03\xfe\x04V\xd4\xe4\x14?xT#"\x98\x15\xf4>\xa0$\x18\xc5\x03|\xc0\xbe\xaf\x87W"\x05-\xd4\xbeldqr\x90\xcc\xc7\xbe2\xb7\xa7\x1et\xa8\xb1\xbe\x19jUFF\xad\x8f\xbe\xd7\xbb\xdb\x93W\\\xf2=}\xf5\xe65n\xc7^>u\x03\xd4\xdb%\x85P>\x92\xf6\xf1\xd9\xf5x5>\x00\xfcrr\xc8\x89\x11>\x0c~\xd2\xbf\x00\xec\xca=\xe9\xfe\xa5c_}\xd0\xbd\xb4\n\x13\xef&\x80\xc0\xbdN\x9e\x92\x1a\x82\xcd\xa2\xbd\x1c2\x02\x10\xe7\x88{\xbd\xe8\xb5\xf4g\xa8\xe3>\xbd6\xd4\x99Brg(=\xa4\xdb\xf6\x06\x10Db\xbe\x86{\x1a\xd9\xa8\xc0q>c\x085^\xe9\xd2\xa2>}\xfd\xdb`LP\xc0>\x92]&\xd7\xfe9\xd2>\xd9\xc6d\xa7\x1f\xc4\xd6>\xc8=>\xa8~\r\xcf\xbe3w{\xfby\xe1\x05\xbf\x89{\xaf\xf6\xe8\xf3 \xbf\xa9\xcc\xd7\xa8\xfa\x9c0\xbf\xadx*\xdb"|3\xbf\xb7\xfe\x00+\xe9.\xf9>\xde+9\x8f9\x0fR?Z\x8f.3R`i?\x83\x89\xbe\xe1l\xc8u?\x9fG\xef\xa1/[w?B\xeb&\xf7\xc2\xbdS?\x101\xb4Nq\xfc\x84\xbfJ.5\xc5\xa6U\x9b\xbf\xda\x99\x96.m\x90\xa4\xbf&.\xcf.(\xd1\xa3\xbf\xe8\x9c/\xbe\xd4l\x8b\xbf\xa4\xf1\x81\xae\xa4\xe9\xa0?P\xa5\xb4\xc4\x0c)\xb5?\x94\xd3\xe6\xd2"\xf9\xbb??\xf6\xb4\x07Q\xf5\xb7?o\xda*,]\x06\xa3?_\xd3aa\x0e[\xa2\xbf\xbbX\xa0\x80\x9f\x7f\xb7\xbf\x19w\x87\xf4"l\xbb\xbf\xd9\x0c\x03\xca\xd9\xb8\xb4\xbf\xc2\x18\xa9\xf9\xcf\xb5\xa0\xbf\x9b\x1d\x17\xa0w\xf8\x88?\xe1\xa9c7\xc3\xa9\xa2?Z\x9a\xbe\x99z_\xa3?<\xc8G\xbda\xb7\x99?/\xf8\x82@\xe7\xd6\x83?umG\x16^\x1eP\xbf\xe1\xc4\xb1\xab\\\x1cu\xbf\xb4\x87\x05\xe5H\xb8s\xbf\x8f\xadt\xf0Z\xf0f\xbfOz\x02\xf1C]P\xbf\xdc8\xf2\xb9\x06\xde\xff\xbe0p\x1d`\xd5\xe30?\x13\xed\x10\x9e$\xe7,?\xbd\x86\x1b\x14\x89s\x1d?k\xaf\xb7\xa4\xd0\x05\x03?\x7f\x0ez\x03\xaev\xcc>\r\xec[\xa2\xa0\xe6\xd2\xbe\xd8\xe5\xce\x98;w\xce\xbea\x95b\x8e1<\xbb\xbe\n\x82r\t\xcek\x9f\xbe\xf8\x81\xbe\xc9\x0bQn\xbeDOOL\xb7\xf9\\>\xf7,\xab=\xba\x0eW>\x92\x802\xb6\x08&B>\xcf\xf7\xacz\x1f\x88">\x9d\xe1\x166\xc6\x08\xf3=CsHD\x8e\x16\xcd\xbd\xc3\xa3\xc6\xc9\xfc\xff\xc8\xbdK\x83b\x0fnn\xb1\xbd\xc0t\xc2\x1b\x8fS\x8f\xbd9Fx\x90c\x8b_\xbd>Q\xe7Tl\xc4 =eZ\xc7\xf3\xf3X#=\x97\xf8a\xe5\xd6\xd3\x17\xbe\x1e>b\xea\xa3\xb6\x88>RJ\x8e\x11\xe7\x98\xc2>\xef\x9eB\'9\x91\xcf>\xa2H\x14\xc9v\x8b\xbb>\xf7Kq\xffZ\x06\xee\xbe\xcf\xd7Z\xbctk\x0f\xbf\xf1l\xd5yN\x8a"\xbfy\x00\x04NL+,\xbfV\x8bL\xef\xa2\xff \xbfC\x08\x9f\x17\x0f\x1e9?\xbdu\xfa;\x1c\xa8Y?\xf0\xcbY\xa8\xe2\xa2j?\xd3B\xde\xd6\x93\xefq?f\xdb\xd6>^\x9eg?\x15]\x8d[q\xdbk\xbfg\xd0,e\xbd\x07\x8e\xbf\x04\xde\xa6g/\x94\x9b\xbf^"\xb0lW[\xa0\xbf\xa1\xf3%\t?_\x95\xbf\x01\x9a\xf4\xd9P{\x82?^\x9b\xeet\xdf\x1b\xa9?\xe4\x18K\xd2\xa3\x93\xb4?V\x1c+3\xe2j\xb5?\xfd\xdf0`\xbdn\xaa?\xed\x18\xb7\x00\x80\xe6p\xbf<\xb9\xa8\xcfu\xd8\xad\xbfYzU\x84\xdb\x1d\xb6\xbf\xe5\xec\xef\x8d\x97*\xb4\xbf\xb5\xd1J\x87\x16\xd6\xa6\xbf}\x9c\x96g\xaa\xb8p\xbfp\xc5\xd1\xba\x99\x04\x99?\xbf\x19\xaa\xa2\x00\x1c\xa1?\x9d_O_\xdcV\x9b?\x10\xe7\xd3\xeb\xf1\xe3\x8b?G\x88\x14e5*c?\x05\xe9j\xf90.m\xbf\x0bJKsr\x07s\xbf\xb3\x1cX\x0bM\xb3j\xbf\x92~@\xb4\x1b?X\xbf\x1cl\xf9\xb2\xfe\xc43\xbf\xdaw\x01;.\x12\'?\xf5\xbd\xa9\xda@_.?\xa7\x95a\xeb\xb4\xca"?\xc3\xdb\xd5\x1d\x85$\x0e?\x9120G\xabQ\xe9>\x94e\xd6\xb5\xafF\xc7\xbe\x8c\xe4ocMX\xd1\xbe\xfc\x1c\x8d\xe7\x14\x10\xc3\xbe\x8e%^yh\xdf\xaa\xbe\xbb@E\xed\xc2\xc2\x85\xbe\xc5\xa7\xfb\xbfuPH>\x80\xf0g\xf0/=\\>\xa4\x19\x04\xa6b\xddK>W\xa0>\x88\x1771>\x98\xde&SZ\xe6\t>\x9c~\x81\x91q\xd1\x98=\xf5UTn\x15H\xd0\xbd\xe2\xc1\xe9\xed\xfcS\xbd\xbd\x82\x88t\xac\xf7\xbd\x9f\xbd\x8f\x83\x1d\x1c\x8f\xaeu\xbd`\xa0\xab\x1e\x90\x07/\xbd>G7\xcf\x89R*=n\xca2\xacL4\x16=\xca\x05)"3\x0bi>\xe6jN/.\x0b\x95>\xc3M\x14\x00\xb8*\xb1>\x9dB\xbe\xe5**\xc2>\x84o\xd8\xbaA\xa7\xc3>\xec\x1b\xdb\xaa\xe6\x1f\xcc\xbe?\xf4\x05\x88\xd2\xf3\xf9\xbe?\xf7\xbco\xd3\xc5\x12\xbf7\xb4\x88\xee\x80x!\xbf\xf0"q\xbf\x93g"\xbf\x1e\xe5\x08\xb3\x08\x8b\x11?F\xa6H\xee\'\xd5F?K\xd4a\xab]\x95]?W6>{\x01$h?\xb7U\xac\xc2%\xc3g?\xde^\xac\xbd\xba4\x0c\xbf+.6\xf0?\x7f|\xbf\x0f\xa3^O^\xc9\x90\xbfG\xe9\x8c\xa0(\xff\x97\xbfr\x10\xfcO\x14\x87\x95\xbf%0\x8e\xad\x18\x83q\xbfG3\xf8M\x91\xfe\x98?\xf0\xa6HS\xd1i\xab?\x97*\x8b\xda9-\xb1?Ld\x0b\x02\x98\xa4\xab?o\xc0\xe7F~\xce\x90?\xb0\xde\xfb`9O\x9e\xbf\x9f"-\xb3\x13\x15\xb0\xbf\xcb=\xfe\xf3\x8b\xb7\xb1\xbfH\xf2\x15/\xb4N\xa9\xbfG9Z\x17\x1c5\x91\xbf\x9c\xe5\xb9\x10O\x94\x88?\xf8=7$#\x0f\x9b?\x81\xa2\xab\x8c\xf6V\x9a?\xf8T\xd7\x1d|\x95\x90?Y\x89\x86\xb1\x18\xa3v?\'\x03I\x0eD\x7fX\xbf\xd9"\x16\'\x9bEp\xbf\x99\x82\x85\x01%8l\xbf\x9bT\x07\xe002_\xbfZ\xa9\xd2\xe3\x91=D\xbf\x026\xb0\x1e\xcf\xa4\x04?w\x004\xf9J\xd9+?\x1a\xa2-\x14f\xc7%?\xe9\xd7hM-\x18\x15?\x1c=\xbc\x0e\x077\xf9>aF\x8b\x18[\xb0\xad>\x06\xbfRyJ\xd5\xd0\xbe\xae\x00>\xc3\xf02\xc8\xbe*\xa1\x9f\x15\xaa\x88\xb4\xbe\x82$\x89c\x1c+\x96\xbe\xa1\x96}\x8c\xec\xf2]\xbe\xc2\xb7\xeas\x83e\\>n?]7GUS>v\x11\xd3T\xcf\xcb<>\xab\x14\x83\xe2B\xb8\x1b>\xef\xd8%\x02b\x1f\xe7=R?\'\x1a\x81T\xd0\xbd\xc0\x07\xa7\xa1l,\xc6\xbd\t\xba\x0f\x85\xc7\x19\xad\xbdsI\x08gy\xc4\x88\xbd"R\xb5<\xbd\xa1U\xbd\xceB\xe2b\xc7R(=\xe6L)\'Q5"=P\xdc\xc3@\xb41\x05=\xf9\xb6\x87\xed\xb9\x0f|>\r |`\x1e\xc9\x9c>l\xdf\x8fP\xdbi\xb2>nz\x98\x08\x18\xd7\xbc>)Z\xa2\xe1{\xa2\x8a>!\xd1\xc9\xf5\xcb^\xe2\xbe7\xc5\x1f#\x96>\x01\xbfK\x80K\xe4DS\x13\xbf\xb7XL*\xedl\x1b\xbf\x80o\xc8\xde<\xfd\x05\xbf\x95\xea\xcf\x1e\xf2\xd40?D\xb8Fa5\xb8M?\x90D,\x9d_7]?\xd4\x03\xf0 \x1c\x86b?\xfa\xe3\x08\xb3\xc3mS?\x10\xe6\xa0\x9cS\'e\xbf\xfd\xb1\\\xd8\xbcc\x82\xbfQc\x89\x83\xee\xd3\x8f\xbf2\tTW\xc6\xdd\x91\xbf;!\xb5\x03\x87\r\x84\xbf[EO%\xf2u\x81?W\x18\xce\xb0\xb5M\xa0?\x0b\x98\xd7\x08\xfe\xfc\xa8?\xac\xb0\xe3}"\xb1\xa8?\xff\x1c5\x9d\x86=\x9b?\x03K\x1f40\xb9\x80\xbfX\xce\x8c\x1eE\xa3\xa4\xbf\xfc\xdd\xf1\x06\xe7E\xac\xbf\xa1r\xcc\x96x\x81\xa8\xbf\x91\xee\xde17f\x99\xbf\x16\xbf\xa4y\\XO?\xe2\xbbl0-\x8d\x92?\r\x83\xe9\xdb:\n\x97?\xaf\xd0\x8b_\x1e~\x91?\xbf\x16\xf6b\x99\x94\x80?\xb8)r\xcc\x10^H?\xdeN\x93\xb9\xa8{g\xbfU,\x81\x02\xc5\x05k\xbf2\xdc\x9f\xb9\xfd\xfaa\xbf\xd9/x\x01.\xa4N\xbf\xdaQ\x95\xe8\xd0\xa3"\xbf\xc1\x0f\xa0\xc6"\x9f$?\x18\x13D\x85\x0e\xc7&?\xa6L.\x0b`\xa1\x1a?\x19pC\'~+\x04?\x02Y%@\xad>\xdc>\xf5Z|^ug\xc8\xbe\xb4\x04&S\x05\x8b\xcb\xbe\x9961!\x8fl\xbc\xbe\xdeq\x9c\xa6\x89\x96F\xd2W>\xdbB1\x13\x19\xddE>\xdf\xbe+!Q\xab)>M\x9aE\x8b\x02\x7f\x01>\x10\xe2\xb2\xd9\xb1\xd3\xb9\xbd\x03+\xff\x88UX\xcd\xbdW\xac\xbf\x12D;\xb8\xbd\xa9\x80\x86\xf4B\xee\x98\xbd\xfa+-N\xa1po\xbd\xe4\x80\xee\xc9\xb7\xbb\t\xbdu\xc1\x15\xa2u\x92)=\x9c\xd8\xb7\xe9\xc0U\x13=\xa5<\xd6\x9d\xf6l\xf1\x1e#\x9f H\xd1\xa0>\xa2`\xe8\xb5\xa0\xc9\xb0>\xf1\x9e%\x8f\xa5\xd2\xad>\xdb\x94\xdc\x84z\xce\xc3\xbe\x8f\xc92\xc1\xacr\xec\xbe\xa3Q\xaa*\x9bY\x03\xbf\xbc\xa0\x93\x90a\x10\x11\xbf\x9c\x8f\x17\xa7X[\x0f\xbfS\xf4\xbe\xb1\xf8u\x10?J^\x1cU\xd1\x91:?\x08\xf0\x97\xd2\x86\x0bP?o\xb6\x1b\x8c\xd9\xdfX?J\xfd4\xf7\x86\x14V?4\xad\xe4\xa0\xd1\xd9<\xbfX\xeeP\xb1\xae\xb0q\xbf1\x0f\x82L\xec+\x83\xbf\xf2\xbd\xc5\xec\xac\r\x8a\xbf@\xefA\xd3\xc2\x82\x85\xbfb\xff\xb3\xb6\xeb\xd2.\xbf\xa1\x8d_\x1c\xa7\xb0\x90?l\xa9y\xcd\xb0~\xa0?]\xcb\xcb\x1eg\xa2\xa3?\t\xd4\x0f\x89\xd6v\x9d?f\x90\x9b\xc6c{v?D \xe8m\xf4\x16\x96\xbfE\x99\xa1\x04\x16k\xa4\xbf\x8b0\xd6\x04\xf8O\xa5\xbfJ\xa7\xe27\xfa\xa1\x9c\xbfW\xe0+\xda&k~\xbf4\x01A)\x9e#\x84?\xc3Nb\x15\xa4\'\x92?\xb6\xa2w\x9e8\xab\x90?\x9d a\x952\xda\x83?\x14\x890{\x04\x10g?\xc2\x96\rq9]X\xbf\xdc\xd6~\x17\x95#g\xbfa\xee\x01\x7f\x88\xcab\xbf\x83\xbf3\x1a\xb4\xb6S\xbff\xcf\xf2"c\xbf6\xbf\x18\xd7\x0b\xd9\xb4\xae\x11?\xa9\xb1_&\x8b\x11%?\xa8\x08y\xaa\xbe\x87\x1e?\xd1H}\xdf8\x1b\x0c?\xce\x9a\xf8\x1d\xc7\xa6\xee>\x89\x1f\xe6\xf0\x9a"\xa2\xbe\x1e\xb0Fc*F\xcb\xbe\x9a\x17[\xc3Y\xdd\xc1\xbeS\x1f\x87\xd8\xa6\xd0\xac\xbe~O]*\xff\xd7\x8c\xbe\xe3\xfam\xb6\xa3BB\xbe\x0fz\xee\xaf;\xe7X>C\xa1\xa0\xcab\x18N>\x1a\xa8\x87\xe8BD5>xQ\x89\x01\xb3.\x13>\xd9\x85+5\xdf\'\xd7=\xac\xdbq\x1d\x07\xa6\xcf\xbd\xcd,G]\x179\xc2\xbd\xb1K\xd5\xdf)\x9d\xa6\xbd\xbf{Kx\xea(\x82\xbd|\xa4\xf4\x19L\x1aJ\xbd1\x89 \xbf\xa5G+=\x9e\x15\xfd\x92\xc0\xab\x1f=Hf\xcfO6T\x01=\x92>Vg7\x95\xd8<\xec75>Y\xe4\x8b>\xe2\xca\x02r\x8e\xf4\xa0>\xbd\xdel\x17(!\xa8>z\xa1\xef\xb97\x93\x8d\xbe$\x9aUS\xde}\xd4\xbeU\xcb\x8b\xe6\xa7\x98\xf1\xbes\xc3\xff\xf4\x9f\xbe\x02\xbf\x87\xea\xf0\xd4\x8d\x99\x08\xbfn\n\x1d\x11b\x08\xdd\xbe\xa7p.\x12sE$?;\x1a4\xc71\xf7??\x14\xb5\xcf\xe6\xa9\xd4M?\xc9r\x0e\x83\x0c\xb1Q?aJ5|7\xb49?\x975\xd2\xb0\xb9\x00\\\xbf\x93G8\x1a\xb6\xe0t\xbf\xeef\xfc\xdc\x0b\x19\x81\xbf\xb5?\xb0\x8bU\x17\x82\xbf\x9e_\xa1\xc4.lp\xbf\x05\x18\xa0\xb7>iz?d\xdf3:\xcb\x93\x93?}]jAY?\x9c?\xdc8~\xa4\x05o\x9a?\x95\x98H\xb6\xb4=\x89?\xee1\x00\xc1\x7f/\x80\xbf~(O%\x8eJ\x9a\xbfL\xb6E\xf6\xfc\xd0\xa0\xbf\x12\xc4Q\x7f\xde\xae\x9b\xbf1b\xe7#\x93\xc2\x89\xbf\xc7\x17(\x0c>$f?t\x9f=A\x8b0\x89?nrvU\x8a\xda\x8c?s\x7fj\x0c3\xd3\x84?\x9c\xe8\xf8e\xaa\x1dr?\xdcO\xff\xec\x98"\x08\xbf$M\xec\xc8\xdc\x1ea\xbf\xce\xee3W\x9a\xd3a\xbf]N7\x87\\\x9f\xb2\x1f?\x11^\xeb\xec\xf1\x90\x11?\xf0qh\xb5.\xff\xf8>A.r\x95J\xbd\xca>\x0f\xbdQ\xe8\xc0\x9d\xc5\xbe\xe5\x96f\xd2\x8e?\xc4\xbe_\xdf\x86cD\xba\xb3\xbe\xfd`\x98b\x98\xeb\x98\xbeP\xc4\xad\x18u\xe3m\xbe\x12\xdc;5\x05\x1eS>\xfd\x8d\xe3\xc0u\x8cR>\x17}\x0c@\xde\xee?>\x91\xa2\xd9."\xc8!>\xfc\xf9\t\xe6\xafn\xf5=\xe4\xce\x1e\xd7~\xd3\xc4\xbdb\xf4b\x90\x08K\xc8\xbd\x9c\xd5E8\xf7\x9f\xb2\xbd\xd3t\xb9n\xec5\x92\xbdr\x88\x04\x04$\xe1d\xbd\x1aa\xf9q\xc6v\x13=\xe4\xa5\x0e\xc2\xd6\xa3&=\xec\xf6\xc9G%M\x0f=\xe0n\xf85\xb1\xd0\xea\x10y*\xa3x\xb8\x9c>d\x03\xe4\xd2\xc8\xe3\x92>\xe7\x00v!N\xe6\xb7\xbeM\xdb>\xb9\xea\xe2\xdc\xbeX\xa4\xfa9`\x91\xf2\xbe\xf4}\xb0Ru\xeb\xfe\xbe\xa20\x1c\xb5\x9d\x9a\xf7\xbe\x81s\x87\xe2\xf65\x07?i\xf7-!9\x8f,?A&\xdd\x1a&3@?c\x96\x82\xb9<\xcfG?\xf4\\\xad\xcf\xb9\x8cB?\x94\x1a\xf0\x88\xccr<\xbf\xe9E\x0c\xa6\xdc2d\xbfm\xb25R\x0b_t\xbf\xe6\xadFQ\x89Mz\xbfg;\x19\xa6;\xa8s\xbf\x80\xf7\x0c\x12\xb8"Q?\xe8\xc4GT"Z\x84?\x94D\x8cU\x9ct\x92?;\xe1\x9a\x81*\xe2\x94?\x19\xd8\xd8\x9f\xfd\xe8\x8c?\xc3=\xf6\r\xe0:F?+G\xca7\x01\x06\x8d\xbf\x8bB\xc4\x17z\x13\x98\xbf\xfd\xb0\x8f\xa70\xdd\x97\xbf*k\xa1\x97\x16\xf1\x8d\xbf\xaf\x03f\xb0T\x07e\xbf\x1a\xed\xaeY\xa4\xf8|?F\x89vI\xfd\x96\x86?+f\xdd\xbc\x10\xa4\x83?\x1f\xe5\x7f\x05\xf0\x05v?\x17\x93\x1b_\xafWT?\xe89\xe9\xec\x92\xd7S\xbf\xbf\xad\x88\x88\xbbp^\xbf\x1e^\xa0\x16\xe0KW\xbf\x989\xc1\xb3W!G\xbf^\xb2\x18&F\xe8&\xbfMM\x9f#\x9c\xde\x11?\xb3\x05\x04\xb5\x19c\x1d?\xeb[\xa8\x08\x08\xea\x13?\x9b\xc6\x184ig\x01?E\x8c\xbf\xef;\xf5\xe0>$\r\x93\x8f\x8a\xbd\xb2\xbe%XP\xb2LA\xc4\xbe\x89\x06\xfage\x88\xb8\xbe\xdfm\xc9X\xa6\xce\xa2\xbe\xde\x84R5\xd99\x81\xbe\x91\xfd\xab\xa2\xe92$>\xac\xb0\xa71w\xd4S>\xd1\xd4\x08\x97y\xc4E>C\x19\xe3\xb4\x10<->\x0e\xebT\x1e\xed~\x08>\x18\xe9\xc0\xa2\xe2H\xbf=J\xf1\xd9\xd8\xcaW\xcb\xbd\xb6\xfe*$C\xcc\xbb\xbd\xe0\xc2\xc6W\xf3[\xa0\xbdKN\xc1\x16j\xa6x\xbdI$W3\x1d]:\xbd&ud\xd4\xe6)*=\xd0\x17Q\xe5[\x83\x19=8\x7fS\xcfoa\xfa<\x88\xcc\x8e\xfaa\xab\xd1<7\x8d\x10\xfc\x06\xd1\x95%\x88O\xb1rU\x92>\xb1\xd7\xa79\x18a\x90\xbe\x1f\xca\xf9_Z\xfb\xc4\xbeSRrR\xc8\xb3\xe0\xbe\xd3\xca[\x8f\x19\xe9\xf0\xbe^\'S\xd6\xb9:\xf4\xbeIj\x1f\x83\xdc\x94\xcd>\xa2i\x92J\x038\x16?\x1e\xef6\xe2\xc6\xf4/?\xf8h\x12\xc3@Xx\x05\xdbZ\x16\x17\xb3>\xf7\x08O@-\xe9\xc0\xbe\xc8\xd1\x7f\xf2U\x9d\xbb\xbe\xd8\xbf\xf8\x013~\xa9\xbe\xa7_\x03t\xe1H\x8e\xbe\x9c\xdb[\xe6\xbdQ\\\xbeE\xb5\xbd\x19g\xcdP>\xdf\xebQnB\xbcJ>D\xbe:d\x7f\xb55>\x82\xa0\x87mv\xdd\x16>\xf8\x9cR\x88\xc5n\xe7=\x1e\x16te8,\xc6\xbd:\x9c\x9bdn\x8d\xc2\xbdX\xe3\x00\x1bc\xa5\xaa\xbd\xa6l\xe3m4\xb9\x88\xbdB\xea\xa0\x82\x951Y\xbd\xb6 W\x8f\x14\x9a!=5\xc9\xf3\xa3@e"=\x07\x9dD\xb0w\x91\x07=8\xaa\\\xe8\xb60\xe3<\xeb)\xa9\xed&~\xb2<\xa9\xbb\x00\x10s7T\xbc\x04\xad\xd1\xe8\xc3\xad\x86>\xc9N\xbcp\xf0\x00q>\x1bT\xfa\xae1\xa0\xa9\xbe\xb7g\xc1\x86R7\xcb\xbe}\xfd\xa0@9\x96\xe0\xbeB\xcc.k<\xf0\xe9\xbeE&\xd9v3\x0e\xde\xbe\xb8\x81x\xf5\xad\xbe\xfb>\x15\xb9\xa3jFm\x1c?N\xc5v\xd8\xf8s.?\xde\xa1\xf7\x0b=%5?SH}=\xe0\xab+?\xb3\x11\xab\xf5D%4\xbf\xbd\xfaC\xad\xb8JU\xbf\x06\xa4\xf4\x98\x92%d\xbf\xd0o\x1dk&\xach\xbf\x82\x94q\x9f\xe7F`\xbfo\xf7\xa2{| R?\xa8\'\x1d\xd8\xde\xcdv?\x11k\x8d\xe3\xca5\x83?l\x8e\x92)(\xa8\x84?\xe7\xe3Y\x08^\xf9y?wk\xa3hw\tM\xbf\x04pR\xe2Bb\x81\xbf\xfe\xcfy\xc7\x0bd\x8a\xbf{\x89\x99u\x84\xdd\x88\xbfN\x8e\xed\x96\x11\xd8|\xbf\xbb\xac\x91\xd4|\x08=\xbf\xfeS\xb5\xc9-\xbbr?\x01sK\xc2\x98\x19z?>\xa5d\xd9\xf3\x8au?\xf4\xc7qe\x8a\x97f?\xcf\x04i\x13A\xca\xa6\xa9\xf9\x06\xb1\xdd\xd0>n\xf4\x1e\xf7Sb\xb3\xbe\x1d\xe4\xb2\x0b\x0b\xb7\xbb\xbe\xb3\x04\x9f\x00\x9dY\xaf\xbe\xd7D\x0c\xe3\x84\xd2\x96\xbe\x9a\xcf\x073@\xc2r\xbe\xfe9b\xbb\xa7\x12=>\xc5\x01\xbe\xe7\xd4\xeaL>\xb2\x028\xc2\x9eH=>\xca*\x17p\x90\xb1">\xe6R\x1f&,\xbe\xfc=\xe3.~S\xf9\x8c\x84\xbd\xac\xd4z\x93\xeeg\xc5\xbd\xdf!h\x1a\xf5\xb2\xb3\xbd5\xe81\xbb\x8b\x07\x96\xbd\xf5-\x80\x19\xe7\xe3n\xbd\xf6\x1f\x80\xa6\x8e\x1c#\xbd\xae\x13\xe6\x88\x8fG&=\x86\x1e\xf7\x15\xc3\x11\x13=\xd7q\x93\xef\x83\xb1\xf2<\x06\x98\xeb\xd3`\x85\xc7<\x8b\xf6\x144\x01"\x86<\xe1\x8b\xbd\xec\xa1\np\xbc\x08H^\x0ep\xf0x>\xd8Y\xa1\x95\xdb)\x86\xbe!\xa4K\x80\x0c\xcf\xb3\xbe<\xaa\xd3]\xf8\x81\xcd\xbe\xaa\xbb4\xbe\xd5[\xdc\xbe\x85\x81\xa0$\x02E\xde\xbe\x8b\x9c\x0b\x92wI\xd3>)v\x1b\xe8\xf2T\x06?AT\x9f5\xd9\xb6\x1d?UGhD\x80\r)?1F\xa6\xc5\xd9,)?\x8c\x99ie\x1a_\xf3\xbeR\x86\xdcR\xa1\xe2A\xbf\x8a\xf6\x0c\xfe@\x8dU\xbf\xbcF\x1d\xa7\x91\xd5_\xbf+8\x9cs\xf0J]\xbf\xd9\xaas\xb0\xee\x8c3\xbf\xf5~6\x0e\x1d/d?\xabs\x98\x8a\xc0\x7fv?\x92\x87\xcd\x8d\x8a\x1f}?\xdb*z\x16C\x1cx?\x83\xf8\x19\xd8\xaf\xdf[?\x08\xd1I\xcb \xa4o\xbf1\x9a\xd4\x07\xc7\xe1\x80\xbf\xda&\x86\xc4\xc21\x83\xbf\xee\xa9q\xaf\xfcC|\xbfg\x0f\xd2\xf6\x17\x06c\xbf\x05\xab\x1bA\x9d\xc0`?\xd4\xde\x9d\xda\xb2,r?\x04U\x80\x93\xbd;r?\xcd9\xcdiY\xb3g?\x8f~\xf46)MP?o\x9b/\xa7\x1dm6\xbf\x91$[\x96\xaa\xfeK\xbf\xf0R\xa8\xb6\xe3\xf6H\xbf\xd8\xb6qDN\x82<\xbf$-o\x81\xbf\xd2"\xbf\xe8#\xfa[\xe7\xc2\xed>;)1\xb8\x16\xb8\x0e?\xbe\xb2\x08\x87\t\xa0\x08?$\xe3\xee\x1cK\xa5\xf8>\xb9\x9a\xcd*\xe4\'\xde>*F\xe2 \xe78\x83>\xed\xed\xf9\xc4w\xdb\xb7\xbe\xe5/\x83\xc3+}\xb1\xbe&\x9b\xe8M\x14\xaa\x9e\xbe\x9d\x8em\x1a\xec\x01\x81\xbeB\xa1\xd3\xd8)\xecD\xbe\x9a\xc91\xd9\xb8\xf1I>\xef\xf3\xef(\xfb\xddA>\xa4\xc0\xe7\xc4\x97z+>\x85eK\xc0\xef>\x0b>\xebu\xbcw\x8e)\xd6=a^\td\xd7]\xc3\xbd\tG\x14&V7\xba\xbd\xc7\xdb\xac\xa8]\xbe\xa1\xbd\x03T\xb3W\xf5(\x7f\xbd~\xa7\x08\xd2\xae:K\xbd\xcf{\xe1\xd7o\x07#=\xcbs\x02\xbeA\x8f\x1b=\xa8\x0ee\xa9\xac\x83\x00=\xe4|\xb8\t\x8e\x87\xd9<\xc4\xfd?qU\xf8\xa5<6\x0er\x1eb\xd9e\xbc\x9ceA*\x9b\xafd\xbc\xd8\xf1\xe9%S|\x0f>U\xcdL\x9fe\xda\x98\xbe\x0c\xeb\x94\x86I\xd2\xb7\xbe\x96\x91\x1d\xda.\x95\xcb\xbe\xf0&\x83P\xf5\x18\xd4\xbe\xf2G7\xe4\x8f\x87\xbc\xbe\x13\x15Q\xa9\x9aU\xed>\xec \xe7\xc6T?\n?\x8e\xa8To\x9d\xa5\x1a?\x9a]\xda\xb6\x1be!?\x89\xe4\x8c\x05\xc5\xa5\x11?\xeb6\x08\x00\x91\xe2\'\xbf\xc4\xfek\x96\x8c\xc6D\xbf\xdf\xdeb"c\x8cR\xbf\x86\x817\xaahzU\xbf\xe8Z\xac\x91?\x08H\xbf?\x07\x90\xaa#\xe4I?\xbb_\xdd\xack\x93g?D\x98Y\xb5\x12\x9cr?\x8dV\x01m\xd1\xfcr?\xfd\xacu\x9c40e?\xcc\xe9\xfa\x080\x02Q\xbf\x93\xe5\xa1A\xf9\x1ds\xbf3\xe0R\xc7\xd7\xe8z\xbf\xed] \x03\xe9\x18x\xbf1\xe1\xa6r\xc3xi\xbf\xa5\xed\xf0\xf4\x90#1?\x85n\x19\x1a(\x0cf?(\xb5\xf7\xacf\x07l?\xd5~iN>\xfde?I$t\x1dD]U?3\xbe\x18\x08\x8f\x00\x18?_\xad+\x9b\xea\xf1A\xbfg8O\x00\x9c\x03E\xbf\x99\'\x99\x99j\xe3<\xbfX\xcf\xbd\xb2nP)\xbfpf\x0e\x1c\xa7\xef\xfc\xbe\x10?\xfc\x8c\xbcY\x04?\x0e)\xf2}A\xa7\x06?\xd5\x02\xea\xef\xe1V\xfb>\xf5\xc0oCXW\xe5>i\xd7\xf3O\x0fs\xbd>\xc8\x14g#\x93_\xaf\xbe\x9ea\x16u\x82\x86\xb1\xbe\xb0\xfc\xf2\xca1\xa5\xa2\xbe\xab\x07\xcaP\x9c\xb8\x89\xbe\xee\xf8\x01\xdf\xcfib\xbeN\x8ad\t\xe1\x13?>xP\xd8\xd6\xcfhC>\xe4\xda>D\x05T2>\xdcQ9!\x12:\x16>A\xca\x9e\xf2K\xcb\xee=9\x17\xba\x86ln\xb0\xbd\xc3\xc8\xdd\x18\x0c\xa7\xbe\xbd\xa9t\x06\x988\xf6\xa9\xbde\x84\xb8h\xa3\x99\x8b\xbd(P\xf31\xcd\xcca\xbdF\xda\xab\xb6\xe4\t\xda\xbcP#IZ7\'!=\xbe_\x02\x12#{\n=$\xfd\xda\xa0\xa0\xa8\xe8\x84\\\xd3-~\xae\xf4>4=\xbci\x11\xb6\t?\xef0[\x00c\x95\x14?:@\x9e\xeb\xf1\x89\x12?\xcb\xf8\xc4\rx\xa3\x00\xbf\xeb\xb3h\xe5\xf4\xa51\xbfQU\xdc\x92\xb1\xa1C\xbfv\xa8_q\xd6\x90K\xbflY\xc8\xdd3AG\xbf\x84\xe3\x8c3UH\xfb>(iv\xe7$`U?\x0c\xdfv\xdf3\x97e?:\x95?~\x0e\x8ej?1\x83\x81\x1d\xb1rd?\xe2k-\x16\xa8\xb6:?\xd5\xe8\xc7\xb6\xdc5b\xbfL\xb5\x1d\xba\xfc\x15q\xbf\xf9\xdakJekr\xbf\xde\xd0\xbe\xac\x1fxi\xbf\x17\xb9gL\x9d\xf4I\xbf\xb7w\xa6\x90\x1b|U?\xfc\xbc4Y\x88nc?\x96\x18\x1e\x7f\x0bib?\xff!/\x1d\x19\x9cV?\x1aT\xbfN\xba\x17:?\x06\x9eI\x82\x0c\x031\xbf\xd2e^\x9be\xb2?\xbf\xcb\xaa:v\xb8\x85:\xbf\xbbq\xb4o\xda\xb9,\xbf-\xb3\xd2\x84\xaa\xbb\x10\xbf\xbb\x15\xc7u=\xba\xf0>~9\xc6c\xf4{\x02?p\x83I\x93\xee\x88\xfb>\x06\xf9yR\x050\xea>\xdb\xfb\x891\x04\x18\xcd>\xd1\xf1=\xb4\x10\xa5\x8d\xbe\xcc\xd3Y\x98\xf2\xb0\xae\xbe\xa1\xa5\xe6F\xe2\x97\xa4\xbe\xca\xd7\xd3\xfaQ)\x91\xbe\x02w\x01\x81\xa2\x98q\xbe\xb8\xb2\xb6\xa8c)\x1e\xbe=G\xe22\x99\x02B>\x85(K~\xe1,6>\x11\x8e\xbcMO0 >T\xf9[P"\x05\xfe=\x84H\x7fq{\xc6\xc0=\x8d\x18\x88\x1d\r\x88\xbd\xbdG\xca\xe6\x8f\xd9+\xb1\xbd\xb4\xd0?C\xe3\xff\x95\xbd\xa1F%\x88\xbf3r\xbd)Y"\x83^\xa69\xbd\xf4\xd8Dp\x00\x8c =\xbdpv9T\x17\x13=<%V\xe2\x17\x8b\xf5\xbccOK7J\x05\x86\xbe\x9f\xf0\xf5\x85\xdbb\xa3\xbe\xb0.\xac\'\xcdV\xb5\xbe\xf6\x1b\xe4h\x0c\xa9\xbc\xbe\xea\xf5l\x91mU\x80\xbe\xea\x7f\x9b\x8be\xfc\xdb>\xc9\x94\xd4\xec\x83\x82\xf6> i\xdd\x0b\x0f\xb4\x05?~\xcc#bfr\n?\xe1\x912\xb3\x9de\xf1>\x03\x9a\xd6$\xb6\xea\x18\xbf\xce+\xcd\x83\xbd\xcc2\xbf\xea.4\xc9\xad\xcb?\xbf\x1ex$\xb3)SA\xbf\x95\xd9\xcb;\xb7\x9e.\xbf\xd0\xb9\xd3\x96\xe6}>?\xd6\xe8\xf8\x11j\x8dV?\xda\x02\xde\xc3@\xc8`?\xfa,\xd3\xab\x893`?\xbb\xa0x\x18\xd3\xeeN?\x94\xf50;/\xa0H\xbf)\xcei\xe4\xaabc\xbf\xaa\x1fg\xfa\xff\x88i\xbfe\x86\x15\xdai\xb4e\xbf\xc1\xabc\x8e\xf9uT\xbf\x123|\x00\x84t7?\xa8\xae\x0e\x88\xa5\xccW?8n\xc4\x1fL\xff[?\x15\xda*\x07\xc1\xe0T?\xf8\xba\xd6\x87!\x8aB?\xbcjKO(\xbd\xfa\xbe\x85\xad\x83bL\xc24\xbfI\x13\xca\xec\x1d\x1c6\xbf\xba\xda\x8a\xf5\xbc\xe2,\xbf\xffr.\xcd\xf9~\x17\xbf\xa4\x14)-\x0e5\xdb\xbe\xd6\x0fu"\xd0\x84\xf9>\x82Q\xd3\x8d\xc3!\xf9>>\xc4\xcbG\xc0\xc5\xec>\xed!\x0e\x87\xb5\x0f\xd5>\xae \xf88\xd9e\xa5>\x80\x1f\x10fh\xcb\xa5\xbel\xde\x9b\xc7u\x88\xa4\xbe\xad\x8a\xa3\xe2\xa5\xa5\x94\xbe\x10;\x9d\xd65\xe3z\xbe\x8a\xf9\x9b0j\xe8O\xbe\x19|\xbf\xd2\x95)9>S?2\xd2\xfe\x118>\xc0\xdf\x0ed\xd6Z%>\x08\xc75\x82\x9f\x8c\x08>\x11<;\x14-\xd0\xdd=t\x05\xc4\xef\te\xb2\xbd\xb1\xb2n\xa8\xe1/\xb4\xbd\xe3\xb6S\xcf\x9c\xd5\x9f\xbd\xf6Cxd\xb1\x13\x80\xbd\xde\xa8I9}\xc1R\xbd\x93\xc4\x7fT\xd0\xe1\n=n\xc3\xe7\xec\xba\x1f\x18=\x82\xb8\xa3\x13^\x18\x01=\x01\xd5\xa9V\x07D\xde<@\x81\xfd\x13\x99]\xb0<\xa8\xb1\xbd\xa7\x9c5A<\xd3\x9dx\x00\xfegd\xbc\xd3y\x8aG]pJ\xbc\x8f\\C\x05(\x80$\xbc3(\x8d\xee\xe7\xfd\x8b\xbe\xa1\xf0\x1bP\xf1\x92\xa2\xbe\nQh\xf7\xfa\xdf\xaf\xbe\rU\xe4\xcc\x97\xf2\xa7\xbe\x9b\xcc\xcfX\x97\n\xbd>\x13Y\xe6\xa9\x9a\xb4\xe1>\x9c.\xc0zr\xb5\xf4>Xv\xff\x89Di\xff>Ekd\x94s\x97\xf8>Z2\xa6\x89u\xaf\xf7\xbe"\xd2HB\xcd\x08 \xbf\x11\x10J\xa6\xc3\xa30\xbf\xfb\xc2\x0f\xf9\t16\xbf\xf3\x14V\x9bg\xd90\xbf\xc5c\x86\x14\xc3\xf2\x14?8\xa0\xb6\xfd\xf7\xb5D?r\x81\xd9\x88IDS?u\x1f\xb7\x05\xed\x86V?a\x87M\x98\xb1\xe3O?\xfbm\xd7X/\xf3\xc9>x\x97D\xa6\xe6\xf6R\xbf/F\xc3r\x8a\x10`\xbfzq\xbd\xa1\xc3s`\xbf>\xeb\x06k\x012U\xbf\xd6H\xc3\xe1kH*\xbf\x13(\xa7\x85gbH?\xb8\x11\x07+\xe6ES?\x90h\xf7&0NQ?\x7f\xc6\x88\xa8j\xfaC?\x83\xbcx\xf3"\xd6!?{\x8c\x98\xdb\x1a\xa3%\xbf=\x00\xe0\xb5_\x9c0\xbf\xd43\x98\xe9*;*\xbf\xb1\xc7\xcay\x93\xdc\x1a\xbf\x82\xa4\x12x\x17\x83\xfa\xbeC\xda\xfd\xbf\xe8\x94\xe9>\xf2\x84\x81\xb2\x93\x86\xf4>Z\xcd\xcav\x94\xa7\xec>\xda\xa3\x90\xe8\x81\xdb\xd9>r\x9a\xaaS\xfdz\xb9>e\x92\xc7\xda[`\x92\xbe\x0b\x1e\xa3w\xeb\x1f\xa2\xbe\x1c\x9d\xcb\xa7\x90\x8e\x96\xbe\xd3K\x82V\xa2\xdd\x81\xbelY\xf5\xa2\xd1\xaf`\xbe\x83\xfb\xb2~\xe5\xa3\x14>\xa9\xdf\xe4\x1a\xd7\xc36>\xde\xc4\x00\xf0\xec\x94)>\xdc"\r\xc19\xc0\x11>f\xa4\xd8~`}\xee=\x8d\x90\x17^\xf3\x81\x9d=\xc1\xd6z\xbe\xc2.\xb4\xbdb\x07\x8b\xe2\t\xe2\xa4\xbdy\xcf\xc4\xe8$d\x89\xbd\xef\xac\x97\x12\x1b\xacc\xbdk\xbd\x19\x91\x18\xbe#\xbd\xc7@3I\r\xf0\x18=\xf1\xff8y\x1b\x83\x08=S\x07\xfa4\xdb)\xea~m3\xbcs,\xb5\xbd\xbf\xb3\x07\xbcB\xd9\x93\xa0\xfdZ\x8d\xbe\xa0\x12o\x94Q\xb4\x9e\xbe\xb0A\x82\x1e\x13\xb4\xa2\xbe\xafH\xf0\xbfJ\xb2\x86>\xa3l\x9a\xafy[\xc8>fNB\xc4U\xf2\xe1>\x14\xf9\xadj\xe0r\xf0>\xc6Y\xde~\xf7\x83\xf2>\xc2\xe2+\xb9\xe0\x1f\xbf>5\xd3\x11\x11Cd\x07\xbf~\xc1_\xebq\x98\x1f\xbf\xa2t\x8bX\x14^)\xbf\x99o\x9b\x82\x1c\xd7)\xbf\xa85\xc0\xa0\xac\x01\x0f\xbf\xde\xf46w\x0ch/?\xeb\xb9s\x92C\x00D?B\x02\xdf\x9e\xca-L?\x08w.\x95a\xa0I?h\xeb&\x0e\x99\xa33?L\x19\xb0\xd1N\xdb<\xbfKlU[J.R\xbfR\xf4J\x19T\x8eV\xbf\x8eo\xef\x0c\xc6&R\xbf\x89J\xd4p\xc9\x82=\xbf\xef\x99\\\x03#S1?K\xbd_me\xacG?\xa0\x92\xffZ)\x06J?\x13\x98\xe9\x11*mB?3\nu\x1fPQ-?\t%1}v\xb4\x07\xbf\xbe/?\xfc\xd0\xff%\xbfH1\xf7\xf9\x8e\xa2%\xbf}D9\xc1\x81\xde\x1a\xbf9\x98}\xf2\x19\x08\x04\xbf\xfah6\x83\x8fN\xa7>\x84\xe3\x86_0\x05\xed>\xe3\xfb\x93\xc07\xe8\xe9>\xbf@\xd0\xc7\xc8.\xdc>\xff\xb3\xb0|C/\xc3>\xf2\xd2\xeb\x9a\xf5\xd3\x85>L\x8c\xe6\x9eu\xee\x9a\xbe1\xcf|\x89\xabR\x96\xbe_\x86K\x83\xdcH\x85\xbe\x93h\xf9"\xeb\x05j\xbeg\xeb\xdbP\x97R7\xbe\x84+\'^\xd9O1>/\x82\x93\xa2\xcf\xa4+>\x85u`\n\xbc)\x17>\x8cZ!H\x01(\xf9=TE7z\xff\x99\xc9=wp0\xada\xe5\xad\xbd\xb9N\xfa\x81\xec\x8c\xa8\xbdCE\xfb5\x83*\x92\xbd\xd7\xdc|\x9a\xb5fq\xbd}\x08\xdb\xa7L\xe6A\xbd\xa8:N\x96\x96\x0f\x10=\x15\xb6\x0e4K.\x0f=\xd3MOx\xc4\x88\xf4<\x0c\xf9\xe4=\xe5E\xd1\x8f\xcf\x89\x81F\x16\xcc>\rr6\xd9W\x0e\xdf>)\x7f\x1dx\x90:\xe6>\x87`\x9f\xe7\xde\xbf\xdc>r\x17\xbdF\xa2\xcd\xe9\xbe\xe7E\x01\x87\x9f\xeb\n\xbf\xff\xb5\xed\xf9pA\x1a\xbf*\x84o\x08$\x98 \xbf\x04\\\x81\xd0[\x0c\x16\xbf\xf3\xd4k\x1c@\x18\x0f?\xd2\xed=\xd9Uv2?\x98\xce\t\x89b\xfe??\xee\x1d\x93\xeb\xdb\xc4A?\xed\x01\xfc\x96\xfe\xb96?\x84\xab\xe3\xaa}!\x13\xbf\x9d0n\x87\xa6\x0bB\xbf\x8d\x82\xb2\x0c\x87\x16L\xbf\xc8^(\x84\x82XK\xbf\x00\x04\xcc/\x15;@\xbf9\x07\x84\xa0\x0e\xf5\xed\xbe\x8a\xde\x93\xd9\xa5\xfa8?T\xef\x8apU\xc1A?\xba\x88]\x81ZH>?\xd2\xa4\xb4\x00\xe2O0?\xb3b#\xdfy\xc8\x02?w\xb6\xf0\x02t:\x18\xbf\xa0\x1a3\x83k% \xbf\xe3\xa19\x0f\xe5&\x18\xbf>\xaf\x8c\x16\x06F\x07\xbfSN\x85\x01\xbf\x1b\xe2\xbe\x00\xda"j.(\xe0>P~\xe1\xd9(\x17\xe5>\xeb.9\xd8g\xc2\xdb>\x86\xc6\xff)\x1b\xb3\xc7>\x07\xc9j\xb4\x1e\xf6\xa3>oY\xa6ddx\x8c\xbe\xfa\xe9\xc4\xc7\xa2\xbd\x93\xbe\x04I\x81Bu\xfe\x86\xbe\x9c\xfch\xed6Iq\xbe\xec\xd2\x85|y\xc8L\xbe<\xfcl\xa3N\xad\x1d>m\xc8\xb3\xderd*>\x7f\xcc\xf6\xf3"s\x1b>`o\x01\xae\xd0\x1a\x02>\xf9O\x19_\xdfi\xdc=\xde\x92\x0c\xe4T&\x83\xbdd\xd7\xd3Rd\x12\xa9\xbd\xf3\xfaZ\xdbD\x9a\x97\xbdA\x16\x83\xe4\rF{\xbd h\x047f\x9cS\xbdq3\xdd"f\xb0\x03\xbd\xf7\xdb\x19\xa3@\xc9\x10=\xc0,\x7f\x9796\xfd<\xb2\xfd>\x8b\x01V\xe2\xf2w\xb3>W\x85m\xb8\x02\x9f\xca>|\xf7\xdb\x1aG0\xd7>\xf7\xc2pT]\xc1\xd7>A\xf6\x87B\x17\xdd\xb1\xbeg\xb4A\x8d\x99\x00\xf4\xbe\xb3\x05\x87\r\xe0\xad\x08\xbf\xca\xcc+k\x85\xd5\x12\xbf\xdc@\x92\x8d\x89\xc2\x11\xbf6\xcb\xfc\xa3\x98}\xe1\xbe\x80\x98\x0b\xe2\x13\x06\x1d?T\x98\xe3b\nx0?5>\xbd\x18\xaf\x056?\x1b\x867\x02\x1a\xbf2?\x01\xa2\xa0#2C\x14?\x91\x07\xe0\x12b^-\xbf^uz\x01c\x9b?\xbf}\xb7\xe4n\x80\x8cB\xbf\xc4\x9c\xea\xaa\x0f&<\xbfG\xcf@\x13\xd5\xa2"\xbf\xa9\x18\xf3\xa8\x9e=$?\xf8VPd\xe6\xc45?I\xed\x8e\x00\\\x846?DA@\xa2\x954.?\xa0\x00\x0f>@\xdf\x14?@f\x8b<\xfc\x04\x02\xbf\xb8\x0b\x04\xe1\xc5w\x15\xbf\x16\xf7\xdc\x18\xfd\xb2\x13\xbf\x9c\xf6G4k<\x07\xbf\x91U\xc1;<+\xef\xbes\xb2~\x83\x9e}\xc1>9\xfb\xfdE\x882\xde>\xdd(Hd\xb0\xd5\xd8>\t\xd5}\xd4\xc1\xae\xc9>\xed\xe73\xcc\xd1\x10\xb0>h\xe1Cu\xde\xe3\xdf\xbd\xc1\xb9\xf2x\xbc\x1d\x8e\xbe@\xd6f\x9d\xd8\x8b\x86\xbeQ\x9a\xcej5lt\xbe\x9c\xa4\xd3\xb9\x8dBW\xbe\x83}h\xa4y0\x19\xbeA-\xd4\xe3\x82\x17%>\xc9\x01\xc0\x05\xbes\x1d>\x06u\xa79\xb1c\x07>O\xd9O\xb0<\xe0\xe7=(A\x83\xce\xf8\xc1\xb2=$\xb2\xc8vIe\xa4\xbd\xc5X\xdf\xdd\xbb\xa3\x9b\xbd\xf72J\xc3\xf1L\x83\xbd\xae\x92\xf4,\x8cza\xbd\xf62\xf8\x82\x06o.\xbd\x8b\xaf\x19T\xe3L\n=\x9e\x0e\x0e\x17[\x98\x02=\x0b&\xce\xeb\xb0\xf4\xe6<\x8e\x965\x9e\x1eR\xc2<\xbd\x11_\xf4\x81\xe2\x8f<\xdf\xd8\x00\x94K\xa8T\xbc`\xe6\x12\x1b\x85\xe1Q\xbc\x94\xab},\xea\xac3\xbc\x94\xf4\\\xfa\xf0\x90\x0b\xbc\xb7\x01\x03\x11\x10\xc0\xd6\xbb\xea9\xe2\x89\xe6\xd5y;#\xba-\xe7\x80@z\xbe\xc0*\x82\xacVl_\xbe!\x9b(\x877\xc0\x96>J\x85\xc0\xb9t\xac\xb4>\x90c3\x1b\x9f\xad\xc5>,\xce6d( \xcd>F\xf7\x1d\x89\xeb?\xbc>\xd4\xe0qP=\xf6\xd7\xbe\xd9\xab\x1d\xd5#\xee\xf4\xbe\x99\xc7S\xe7\xaaH\x03\xbf\x84\x99\xfa,\t\x06\x07\xbf\xf5\x92\xf0\xe4p\x8e\xf9\xbe\xb1t.\xb1\x9a\xfb\x00??X\x11\x91|e\x1e?\xf5P\x1b\x03{\xb9(?\x7f\xd4\xb6\xa3\xe3\n*?v\x17!\x03\xeaQ\x1d?\x11c\x0e\x16\x8a\x1e\x0e\xbf\x82}\xe5\xfa\xe9\x91/\xbf\x80p\xc8%G\xd86\xbf\x05\xd4\xd2\x00>"5\xbf-\xbe\x1aT}\xbf&\xbf\xae\xc1\xf4zg\x1a\xf9>Af\xae\xb3\xe8X\'?\xbe\x89YQ\xc7i.?\xa8Rf\n\x93\xa7(?\xf3\xaa\xbaL\xab\x87\x18?\xb4\xf3\x01\x85\xe4k\xd1>\x1d\x8a\xac\xdc\xf9k\x08\xbf\x91\x91q\x05B&\r\xbf\x11\xee\x15\xbd \xb3\x04\xbf]S\xe1)c\xa4\xf2\xbe\xc4\x04-\xfb\xa8\x9b\xc3\xbe@2\t\xdb\x8d\xdc\xd1>\x10\x954\xce\x8b\x17\xd4>\xa0\x15\x067\x1c\t\xc9>\x10\x87\xdc\x99\x13"\xb4>+&\x98\x94y.\x8b>\x18\xe0\x9f\\Z\xe3\x81\xbek\xbf\x7fG\xfe\xe2\x83\xbe\xf2\xc8\xd2\x8c\xbe\xd1u\xbeeg\x8e.\x92\x0e_\xbe\xca\x9db\x0fdG6\xbe\xafp\xdf\n#p\x17>o\xea\x1c\x8b\x882\x1c>\xe2g\x13\xce\xd1h\x0b>\x1ad\x8a\xf6#*\xf1=\xfcmI\xb07\x1f\xc8=\x98\xd4\x8d\x9df\x91\x91\xbd% R=\x17\x89\x9c\xbd\xee\x15\xde\x97g\xcf\x88\xbd\xe4\xe3\xf3\x96\xb4@k\xbd\xecg\xd8\x80\x8c\xf4A\xbdW\xaf\x15\xe3\xa5}\xd4<\x10\x01\x87\xed\xa6\x7f\x04=\x8c/\xd1\xe1\x83,\xf0\xbc\xaaj\xd2t\xe0\x97\x19\xbc\xf1S\xc28\xf2\xaa\xeb\xbb\xdeL\xf3\xdf3\xce\xa5\xbb\x0c\xf3\xb8\x03\xcb\x07\x8d;\xe8+\xd9\x15\x04og\xbe\xe8\xde\xae\x96R\x08s>\x15p\xd9\xaem\xb4\x9c>\xf1\x0c\xc1\xb0\x05`\xb2>\xdc\xe8}\x04\x83a\xbe>\xa1\xcai\x8a5\xb4\xbb>\xb9\x94\xea\xde\xa3p\xb0\xbe8\xabR\x1a\x8bb\xdf\xbe!}`\x8dD\xee\xf1\xbeib\xfa\x84\\\x03\xfa\xbe\xe4\\\xf7Q\xa4d\xf6\xbe\xd6S\xb8\xf8\x9d\x16\xc3>\xe6\x19\xfcG\xafc\x08?\xb6=\xf6\xf6\xc24\x19?\xe2\x99j\x19[\x04 ?\x10L<\xbb/K\x19?X\xf8\xc3\xba-\\\xea>V\xc4k;V\xba\x1a\xbf_\xc5_\x89\x96\x80)\xbf3\xc9\x91K6f,\xbf\xdd\xe6\xec\xad^2$\xbf!$Ng\x16x\x03\xbfC\x86\x80\x1ca_\x14?c\x9b\x85w\x1d\x8c"?+\xb9\xdeA1#"?Qh\xbc\xc0\xe5\xf5\x16?\xb3\xb5\xbfkY-\xfa>zEk\xfcB\n\xf5\xbeF*\x96\xc0n[\x03\xbfo\xcf\xa1\xec\t\xb2\x00\xbf\xc9\x14xg\x15\xaa\xf2\xbe\xd5\xf7O\xe7=\xe4\xd5\xbe^\xb2!\xbf\xdd\xaf\xbb>\xc2\xeb\x94\xf8\x88\xe9\xcc>/\xeb\xa2\xfc\x90&\xc6>a\xce\x07\xb9\xf1\xc2\xb5>\x19\xc9v\'\xb6\x96\x98>*\x16\xda\xae\x8f\xbcb\xbew\xc8H1\x96\xc6~\xbe\xfa\xe2\xb2th,u\xbe\xc3I\x1d\xfc\x84;b\xbeZ\xde\xa4\x02\x16!C\xbe\xfb\xc1paIR\xdc\xbd\x01\x05\x80\xbf!3\x17>\x93m\xc3\x1al%\r>\x1e\xf6\x1f\xef\xd9\xfb\xf5=\x15\xd6\xaa\x859\xf0\xd4=k\x05\x9e9>\x19\x95=\xb0 \xd8\x16\xb0\x83\x98\xbd\x00c\x04\x98\x07\xdc\x8c\xbdwR\x02\x99\x12\x17s\xbd\x81S\x0e\x8d>DP\xbd%\xc7\xfa\x97=I\x16\xbdd\x99\xf4\xcb\x18\xd1\x01=9X\xdf\xf5\x03\x86\xf4<\xa9\x7f\xa4\x14\xca\xe3\xd7<\xc4\x86\xa6\xc4\x94\t\xb2<\x0f\x12\xdb\xaa\xad\xcez<\xd6\xb4\xad{\xdd\x1fQ\xbc\x14[\x98\x90\x0e\xebD\xbc\xd7\x08\xd9\x97\xb7\x8b%\xbcQ\xb6\r\x03\x98\xa6\xfc\xbb\xf2\xce\xd1Q\xfa\x10\xc5\xbbaF\xaa\x0b\x96\x88\x83;\x08\x80\x03\xc1\x89t~;' 35 | p13 36 | tp14 37 | b. -------------------------------------------------------------------------------- /HW2_part1/GenSinusoid.m: -------------------------------------------------------------------------------- 1 | function stimuli=GenSinusoid(sz, A, omega, rho) 2 | % to generate the sinusoid images 3 | % Generate Sinusoid grating 4 | % sz: size of generated image (width, height) 5 | radius = [sz(1)/2, sz(2)/2]; 6 | [x, y] = meshgrid(-radius(1):radius(1)-1, -radius(2):radius(2)-1) ; 7 | % a BUG is fixed in this line 8 | stimuli = A * cos(omega(1) * x + omega(2) * y + rho); 9 | -------------------------------------------------------------------------------- /HW2_part1/HW2_part1_Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Welcome to the Q4 of HW2. In this part, you are encouraged to explore sparse coding with MATLAB code. (JHU students can have free access to MATLAB. Please visit this [link](https://ep.jhu.edu/faculty/getting-started/software-and-hardware-benefits) for details.)\n", 8 | "\n", 9 | "The original code can be downloaded from http://redwood.berkeley.edu/bruno/sparsenet/. Please refer to the paper (http://redwood.berkeley.edu/bruno/papers/nature-paper.pdf) for more details. Please note that a few modifications to the code will be needed in this homework. \n", 10 | "\n", 11 | "The code provided by the author contains some compiled C code for performance considerations, so you need to compile the code with the `mex` command before using it. The README included with the downloaded code contains a brief guide about how to do that. The mex (C code) part was written and tested in a unix-like system. In the experiment, we found the code can be run normally in Mac and Linux, but it's not stable in Windows. You are allowed to complete this part in a teamwork.\n", 12 | "\n", 13 | "Please read the instructions carefully, and your patience would be greatly appreciated. If you have any questions concerning this part, please post on Piazza/HW2.\n", 14 | "\n" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": { 20 | "collapsed": true 21 | }, 22 | "source": [ 23 | "Note: This contains some fairly computationally heavy experiments. Please start it early and give your computer enough time to run it.\n", 24 | "\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "In this part, you are assigned three subparts. To begin with, you need to understand the \"sparsenet.m\" code as much as possible. The followings are some important parameters in the \"sparsenet.m\" code, to which you need pay attention.\n", 32 | "\n", 33 | "- A: a N by M basis matrix with each column denoting one basis image, where N denotes the dimension of each basis image and M denotes the number of basis iamges. You will need to initialize the value of A yourself to a random matrix with normalized columns (see the README).\n", 34 | "- beta: sparsity parameter (lambda in the referred paper).\n", 35 | "- X: matrix of image patches to be reconstructed by the basis images.\n", 36 | "- S: coefficient matrix with each column denoting the reconstruction coefficients with respect to the corresponding column in X." 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": {}, 42 | "source": [ 43 | "1. Sparse coding of natural images.\n", 44 | "\n", 45 | " In this subpart, we calculate the sparse coefficient of natural images, which are included in the downloaded code in the `IMAGES` array. **Run the code with different values of M with other parameters set to their default values and show what the resulting bases (shown in Fig 1) look like**. Please select M from these numbers: 25, 64, 100.\n", 46 | "\n", 47 | "2. Sparse coding of high-frequency sinusoid images.\n", 48 | "\n", 49 | " In the 2nd subpart, we change the matrix X reconstructed by the basis from natural images to the high-frequency sinusoid images, which is different from the 1st subpart. First, the \"gensin.m\" included with this homework can help you generate the sinusoid patches. In \"gensin.m\", you need to set the \"omega\" parameter to choose certain frequency of sinusoid patches. Second, in each iteration reassign X with randomly selected patches from the high-frequency sinusoids pool generated by the \"gensin.m\" script. A few modifications are required to reassign X compared with the original code. Then change the M with other parameters set as the default. **Try setting M to 4, 36, and 100 and show the resulting bases. How do these basess change with M?**\n", 50 | "\n", 51 | "3. Sparse coding of low-frequency sinusoid images.\n", 52 | "\n", 53 | " Congrats on making it to the end! In this subpart, we need to generate low-frequency sinusoid images, which is the only difference from the 2nd subpart. Same with before, change the M with other parameters set as the default. We suggest you set the M to 4, 36, 100, and show the resulting bases. **How do these bases change according to the different M? Please make comparisons with the 2nd part and explain why these differences arise.** You are encouraged to use the \"ShowPatches.m\" code to visualize the sinusoid patches you generated in subparts 2 and 3. \n", 54 | "\n", 55 | "\n" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "**gensin.m** and **ShowPatches.m** can be found in the zip archive of this homework. The rest code should be downloaded from the author's webpage." 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "Originally by Weichao Qiu, modified by Donald Li, Chenxi Liu and Hongru Zhu." 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": null, 75 | "metadata": { 76 | "collapsed": true 77 | }, 78 | "outputs": [], 79 | "source": [] 80 | } 81 | ], 82 | "metadata": { 83 | "anaconda-cloud": {}, 84 | "kernelspec": { 85 | "display_name": "Python 3", 86 | "language": "python", 87 | "name": "python3" 88 | }, 89 | "language_info": { 90 | "codemirror_mode": { 91 | "name": "ipython", 92 | "version": 3 93 | }, 94 | "file_extension": ".py", 95 | "mimetype": "text/x-python", 96 | "name": "python", 97 | "nbconvert_exporter": "python", 98 | "pygments_lexer": "ipython3", 99 | "version": "3.8.8" 100 | } 101 | }, 102 | "nbformat": 4, 103 | "nbformat_minor": 1 104 | } 105 | -------------------------------------------------------------------------------- /HW2_part1/ShowPatches.m: -------------------------------------------------------------------------------- 1 | % illustrate the patches for training 2 | load('patchsin_highfre.mat'); % the matrix you generate 3 | row=16;col=16; 4 | NumShow=8; 5 | sampledpatch=zeros(NumShow*row,NumShow*col); 6 | for ii=1:NumShow^2 7 | thispatch=reshape(patchsin(:,ii),[row, col]); 8 | rowidx=mod(ii,NumShow)+NumShow*(mod(ii,NumShow)==0); 9 | colidx=(ii-rowidx)/NumShow+1; 10 | sampledpatch((rowidx-1)*row+1:rowidx*row,... 11 | (colidx-1)*col+1:colidx*col)=thispatch; 12 | end 13 | imshow(sampledpatch,[]); 14 | -------------------------------------------------------------------------------- /HW2_part1/gensin.m: -------------------------------------------------------------------------------- 1 | % generate the sinusoid patches 2 | A=1; 3 | sz=[16 16]; 4 | numimg=1e6; % to compromise the running time with the results, about 5e4 is suggested. 5 | omeganorm=1;% high frequency for 1e3, low frequency for 1 6 | patchsin=zeros(sz(1)*sz(2),numimg); 7 | 8 | for ii=1:numimg 9 | theta = pi*rand; 10 | omega =omeganorm* [cos(theta),sin(theta)]*(0.4*rand+0.8);% 11 | % omenorm*(0.8:1.2) 12 | rho=pi/2*rand; 13 | im=GenSinusoid(sz, A, omega, rho); 14 | % imshow(im,[]); 15 | patchsin(:,ii)=reshape(im,sz(1)*sz(2),1); 16 | end 17 | save('patchsin_lowfre.mat','patchsin'); 18 | % save('patchsin_highfre.mat','patchsin'); % for low freqency patches 19 | -------------------------------------------------------------------------------- /HW2_part2/HW2_part2_Intro.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Reference: \n", 8 | "**S. M. Konishi, A.L. Yuille, J.M. Coughlan and S.C. Zhu. Statistical Edge Detection: Learning and Evaluating Edge Cues. IEEE Transactions on Pattern Analysis and Machine Intelligence. TPAMI. Vol. 25, No. 1, pp 57-74. January 2003.**" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "The homework questions are at the end, but run through the notebook step-by-step to make sure you have an idea what it's doing!" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "# Initialization and define some utility functions" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": null, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "import numpy as np\n", 32 | "import matplotlib.pyplot as plt\n", 33 | "%matplotlib inline\n", 34 | "\n", 35 | "def myimshow(im):\n", 36 | " plt.figure()\n", 37 | " plt.axis('off')\n", 38 | " plt.imshow(im, cmap=plt.gray())" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "# Read image and edge map" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": null, 51 | "metadata": {}, 52 | "outputs": [], 53 | "source": [ 54 | "# Show image and edge labeling\n", 55 | "# id = '100075'\n", 56 | "id = '35010' # butterfly\n", 57 | "# id = '97017' # building\n", 58 | "#id = '41004' # deer\n", 59 | "# Change the id to try a different image\n", 60 | "\n", 61 | "def loadData(id):\n", 62 | " from skimage.color import rgb2gray\n", 63 | " edgeMap = plt.imread('data/edge/boundaryMap/' + id + '.bmp'); edgeMap = edgeMap[:,:,0]\n", 64 | " im = plt.imread('data/edge/trainImgs/' + id + '.jpg')\n", 65 | " grayIm = rgb2gray(im)\n", 66 | " return [grayIm, edgeMap]\n", 67 | "\n", 68 | "[im, edgeMap] = loadData(id)\n", 69 | "myimshow(edgeMap); # title('Boundary')\n", 70 | "myimshow(im * (edgeMap==0)); # title('Image with boundary')" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "# Define function to filter image \n", 78 | "$ \\frac{dI}{dx} $, $ \\frac{dG*I}{dx} $" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": null, 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "def dIdx(im):\n", 88 | " # Compute magnitude of gradient\n", 89 | " # 'CentralDifference' : Central difference gradient dI/dx = (I(x+1)- I(x-1))/ 2\n", 90 | " dx = (np.roll(im, 1, axis=1) - np.roll(im, -1, axis=1))/2\n", 91 | " dy = (np.roll(im, 1, axis=0) - np.roll(im, -1, axis=0))/2\n", 92 | " mag = np.sqrt(dx**2 + dy**2)\n", 93 | " return mag\n", 94 | "\n", 95 | "def dgIdx(im, sigma=1):\n", 96 | " from scipy.ndimage import gaussian_filter\n", 97 | " gauss = gaussian_filter(im, sigma = sigma)\n", 98 | " dgauss = dIdx(gauss)\n", 99 | " return dgauss\n", 100 | "\n", 101 | "dx = dIdx(im)\n", 102 | "dgI = dgIdx(im)\n", 103 | "\n", 104 | "# Show filtered images\n", 105 | "myimshow(dx); # title(r'$ \\frac{dI}{dx} $')\n", 106 | "myimshow(dgI); # title(r'$ \\frac{d G*I}{dx} $')\n", 107 | "\n", 108 | "# def showEdge(im, edgeMap):\n", 109 | "# # draw edge pixel\n", 110 | "# im = im * (edgeMap != 0)\n", 111 | "# figure(); myimshow(im); title('Highlight edge')" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "def kde(x):\n", 121 | " # Kernel density estimation, to get P(dI/dx | on edge) and P(dI/dx | off edge) from data\n", 122 | " from scipy.stats import gaussian_kde\n", 123 | " f = gaussian_kde(x, bw_method=0.01 / x.std(ddof=1))\n", 124 | " return f\n", 125 | " \n", 126 | "def ponEdge(im, edgeMap):\n", 127 | " # Compute on edge histogram\n", 128 | " # im is filtered image\n", 129 | " \n", 130 | " # Convert edge map to pixel index\n", 131 | " flattenEdgeMap = edgeMap.flatten()\n", 132 | " edgeIdx = [i for i in range(len(flattenEdgeMap)) if flattenEdgeMap[i]]\n", 133 | " \n", 134 | " # find edge pixel in 3x3 region, shift the edge map a bit, in case of inaccurate boundary labeling\n", 135 | " [offx, offy] = np.meshgrid(np.arange(-1,2), np.arange(-1,2)); offx = offx.flatten(); offy = offy.flatten()\n", 136 | " maxVal = np.copy(im)\n", 137 | " for i in range(9):\n", 138 | " im1 = np.roll(im, offx[i], axis=1) # x axis\n", 139 | " im1 = np.roll(im1, offy[i], axis=0) # y axis \n", 140 | " maxVal = np.maximum(maxVal, im1)\n", 141 | "\n", 142 | " vals = maxVal.flatten()\n", 143 | " onEdgeVals = vals[edgeIdx]\n", 144 | " \n", 145 | " bins = np.linspace(0,0.5, 100)\n", 146 | " [n, bins] = np.histogram(onEdgeVals, bins=bins)\n", 147 | " # n = n+1 # Avoid divide by zero\n", 148 | "\n", 149 | " pon = kde(onEdgeVals)\n", 150 | "\n", 151 | " return [n, bins, pon]\n", 152 | "\n", 153 | "\n", 154 | "def poffEdge(im, edgeMap):\n", 155 | " flattenEdgeMap = edgeMap.flatten()\n", 156 | " noneEdgeIdx = [i for i in range(len(flattenEdgeMap)) if not flattenEdgeMap[i]]\n", 157 | " \n", 158 | " vals = im.flatten()\n", 159 | " offEdgeVals = vals[noneEdgeIdx] \n", 160 | "\n", 161 | " bins = np.linspace(0,0.5, 100)\n", 162 | " n, bins = np.histogram(offEdgeVals, bins=bins)\n", 163 | "\n", 164 | " # n = n+1\n", 165 | " # p = n / sum(n)\n", 166 | " \n", 167 | " poff = kde(offEdgeVals)\n", 168 | " \n", 169 | " return [n, bins, poff]\n", 170 | "\n", 171 | "dx = dIdx(im)\n", 172 | "[n1, bins, pon] = ponEdge(dx, edgeMap)\n", 173 | "[n2, bins, poff] = poffEdge(dx, edgeMap)\n", 174 | "\n", 175 | "plt.figure(); # Plot on edge\n", 176 | "# title('(Normalized) Histogram of on/off edge pixels')\n", 177 | "plt.plot((bins[:-1] + bins[1:])/2, n1.astype(float)/sum(n1), '-', lw=2, label=\"p(f|y=1)\")\n", 178 | "plt.plot((bins[:-1] + bins[1:])/2, n2.astype(float)/sum(n2), '--', lw=2, label=\"p(f|y=-1)\")\n", 179 | "plt.legend()\n", 180 | "\n", 181 | "plt.figure()\n", 182 | "# title('Density function of on/off edge pixels')\n", 183 | "plt.plot(bins, pon(bins), '-', alpha=0.5, lw=3, label=\"p(f|y=1)\")\n", 184 | "plt.plot(bins, poff(bins), '--', alpha=0.5, lw=3, label=\"p(f|y=-1)\")\n", 185 | "plt.legend()" 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": {}, 191 | "source": [ 192 | "# Compute $ P(\\frac{dI}{dx} | \\text{on edge}) $ and $ P(\\frac{dI}{dx} | \\text{off edge}) $" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": null, 198 | "metadata": {}, 199 | "outputs": [], 200 | "source": [ 201 | "%%time\n", 202 | "ponIm = pon(dx.flatten()).reshape(dx.shape) # evaluate pon on a vector and reshape the vector to the image size\n", 203 | "myimshow(ponIm)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": null, 209 | "metadata": {}, 210 | "outputs": [], 211 | "source": [ 212 | "%%time\n", 213 | "poffIm = poff(dx.flatten()).reshape(dx.shape) # Slow, evaluation of this cell may take several minutes\n", 214 | "myimshow(poffIm)" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": null, 220 | "metadata": {}, 221 | "outputs": [], 222 | "source": [ 223 | "T = 1\n", 224 | "myimshow(np.log(ponIm/poffIm)>T) # " 225 | ] 226 | }, 227 | { 228 | "cell_type": "markdown", 229 | "metadata": {}, 230 | "source": [ 231 | "# Show ROC curve (trade off between true and false positives)" 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "execution_count": null, 237 | "metadata": {}, 238 | "outputs": [], 239 | "source": [ 240 | "gt = (edgeMap!=0) # Ground-truth labels\n", 241 | "print(np.sum(gt == True)) # Edge\n", 242 | "print(np.sum(gt == False)) # Non-edge" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": null, 248 | "metadata": {}, 249 | "outputs": [], 250 | "source": [ 251 | "def ROCpoint(predict, gt):\n", 252 | " # predict = (log(ponIm/poffIm)>=T)\n", 253 | " truePos = (predict==True) & (gt == predict)\n", 254 | " trueNeg = (predict==False) & (gt == predict)\n", 255 | "\n", 256 | " falsePos = (predict==True) & (gt != predict)\n", 257 | " falseNeg = (predict==False) & (gt != predict)\n", 258 | "\n", 259 | " y = np.double(truePos.sum()) / np.sum(gt == True)\n", 260 | " x = np.double(falsePos.sum()) / np.sum(gt == False)\n", 261 | " return [x, y]\n", 262 | "\n", 263 | "p = []\n", 264 | "for T in np.arange(-5, 5, step=0.1):\n", 265 | " predict = (np.log(ponIm/poffIm)>=T)\n", 266 | " p.append(ROCpoint(predict, gt))\n", 267 | "x = [v[0] for v in p]\n", 268 | "y = [v[1] for v in p]\n", 269 | "plt.plot(x, y)\n", 270 | "plt.xlabel('False positive rate')\n", 271 | "plt.ylabel('True positive rate')" 272 | ] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "metadata": {}, 277 | "source": [ 278 | "## Interactive: Change threshold \n", 279 | "\n", 280 | "Below is an interactive demo to show the result for different threshold T. You can also observe the point on ROC curve.\n", 281 | "\n", 282 | "(Evaluate next cell to run the demo)\n", 283 | "\n", 284 | "" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": {}, 291 | "outputs": [], 292 | "source": [ 293 | "# interactive threshold demo, evaluate this cell\n", 294 | "# You can safely skip this cell if you see any error happens.\n", 295 | "from IPython.html.widgets import interact, interactive, fixed\n", 296 | "def demoThreshold(T):\n", 297 | " predict = (np.log(ponIm/poffIm)>=T)\n", 298 | " plt.figure(1)\n", 299 | " plt.imshow(predict)\n", 300 | " p = ROCpoint(predict, gt)\n", 301 | " plt.figure(2)\n", 302 | " plt.plot(x, y)\n", 303 | " plt.plot(p[0], p[1], '*')\n", 304 | " plt.xlabel('False positive rate')\n", 305 | " plt.ylabel('True positive rate')\n", 306 | "\n", 307 | "# compute ROC curve\n", 308 | "p = []\n", 309 | "for T in np.arange(-5, 5, step=0.1):\n", 310 | " predict = (np.log(ponIm/poffIm)>=T)\n", 311 | " p.append(ROCpoint(predict, gt))\n", 312 | "x = [v[0] for v in p]\n", 313 | "y = [v[1] for v in p]\n", 314 | " \n", 315 | "interact(demoThreshold, T=(-5, 5, 0.1))" 316 | ] 317 | }, 318 | { 319 | "cell_type": "markdown", 320 | "metadata": {}, 321 | "source": [ 322 | "# HW2 Q5:\n", 323 | "1. Load another image (e.g. the butterfly or building), apply this edge detection algorithm, find a good threshold and display your result (6 points)\n", 324 | "2. Use $ \\frac{dG*I}{dx} $ instead of $\\frac{dI}{dx}$ for edge detection where $G$ is a Gaussian. Show results for a couple of different variances `sigma`. (8 points)" 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "execution_count": null, 330 | "metadata": {}, 331 | "outputs": [], 332 | "source": [] 333 | } 334 | ], 335 | "metadata": { 336 | "anaconda-cloud": {}, 337 | "kernelspec": { 338 | "display_name": "Python 3", 339 | "language": "python", 340 | "name": "python3" 341 | }, 342 | "language_info": { 343 | "codemirror_mode": { 344 | "name": "ipython", 345 | "version": 3 346 | }, 347 | "file_extension": ".py", 348 | "mimetype": "text/x-python", 349 | "name": "python", 350 | "nbconvert_exporter": "python", 351 | "pygments_lexer": "ipython3", 352 | "version": "3.8.8" 353 | } 354 | }, 355 | "nbformat": 4, 356 | "nbformat_minor": 1 357 | } 358 | -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/100075.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/100075.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/12074.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/12074.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/23025.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/23025.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/35010.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/35010.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/41004.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/41004.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/41025.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/41025.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/boundaryMap/97017.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/boundaryMap/97017.bmp -------------------------------------------------------------------------------- /HW2_part2/data/edge/snapshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/snapshot.png -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/100075.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/100075.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/12074.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/12074.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/23025.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/23025.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/35010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/35010.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/41004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/41004.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/41025.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/41025.jpg -------------------------------------------------------------------------------- /HW2_part2/data/edge/trainImgs/97017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW2_part2/data/edge/trainImgs/97017.jpg -------------------------------------------------------------------------------- /HW3/Gibbs Sampling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\n", 8 | "\n", 9 | "\n", 10 | "# Gibbs sampling\n", 11 | "\n", 12 | "Originally by Weichao Qiu.\n", 13 | "\n", 14 | "If you find this ipython notebook is unclear or contains bugs, please post it on Piazza.\n", 15 | "If there's an error says \"something is undefined\", please run the cell that contains the definition or use \"menu -> cell -> run all above\"" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "# Foreground/background classification.\n", 23 | "\n", 24 | "Here we consider a model for foreground/background classification that can include spatial context. Intuitively, neighboring pixels in the image are likely to belong to the same class, i.e. are likely to be either all background or all foreground. This is a form of prior knowledge, or natural statistic, which can be learnt by analyzing natural images.\n", 25 | "\n", 26 | "For pixel $i$, the foreground label is $ S_i = 1 $, and background label is $ S_i = -1 $.\n", 27 | "\n", 28 | "The prior term in the energy encourages neighbouring pixels to have the same intensity ($N(i)$ is the set of pixels neighboring $i$): \n", 29 | "$ E_p[S] = \\gamma \\sum_{i} \\sum_{j \\in N(i)} { - S_i S_j} $ \n", 30 | "\n", 31 | "The data term is defined as:\n", 32 | "\n", 33 | "$ E_d[S, I] = \\eta \\sum_{i} (I_i - S_i)^2 $\n", 34 | "\n", 35 | "\n", 36 | "These two terms are combined to get the energy.\n", 37 | "\n", 38 | "$ E[S] = E_p[S] + E_d[S, I] $\n", 39 | "\n", 40 | "Then the posterior of the labeling $S$ given the image $I$ (with temperature parameter $T$) is\n", 41 | "\n", 42 | "$ P(S|I) = \\frac{1}{Z} \\exp\\left( - \\frac{E[S]}{T} \\right) $" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "The block of code below initializes the ipython notebook" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": null, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "# Initiialization code\n", 59 | "%matplotlib inline\n", 60 | "import numpy as np\n", 61 | "# from pylab import imshow, show, get_cmap, imread, figure, subplots, title, subplot\n", 62 | "import matplotlib.pyplot as plt\n", 63 | "from numpy import random\n", 64 | "import pylab as pl" 65 | ] 66 | }, 67 | { 68 | "cell_type": "markdown", 69 | "metadata": {}, 70 | "source": [ 71 | "The block of code below loads an image and normalizes it to the range $[-1, 1]$." 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "im = plt.imread('data/gibbs/cat4.jpg')\n", 81 | "plt.imshow(im)\n", 82 | "\n", 83 | "def myimshow(state):\n", 84 | " plt.imshow(state, interpolation='nearest')\n", 85 | "\n", 86 | "# Preprocess image to range (-1, 1)\n", 87 | "def preproc_data(im, scale=0.1, debug=False):\n", 88 | " import skimage.color\n", 89 | " import skimage.transform\n", 90 | " \n", 91 | " tinyim = skimage.transform.rescale(im, scale,multichannel=True)\n", 92 | " grayim = skimage.color.rgb2gray(tinyim)\n", 93 | "\n", 94 | " # Linear map the data to -1, 1\n", 95 | " scale = grayim.max() - grayim.min()\n", 96 | " data = 2 * (grayim - grayim.min()) / scale - 1\n", 97 | " if debug:\n", 98 | " print('original range:', grayim.min(), grayim.max())\n", 99 | " print('remapped range:', data.min(), data.max())\n", 100 | "\n", 101 | " return [data, tinyim]\n", 102 | "\n", 103 | "[data, im] = preproc_data(im, debug=True) # data is normalized image" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "The block of code below defines the neighborhood structure for the Gibbs sampler." 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": null, 116 | "metadata": {}, 117 | "outputs": [], 118 | "source": [ 119 | "def getneighor(y, x, h, w): # get 4-side neighbor\n", 120 | " n = []\n", 121 | " if (x != 0): n.append((y, x-1))\n", 122 | " if (x != w-1): n.append((y, x+1))\n", 123 | " if (y != 0): n.append((y-1, x))\n", 124 | " if (y != h-1): n.append((y+1, x))\n", 125 | " return n\n", 126 | "\n", 127 | "def poslist(h,w):\n", 128 | " '''Get point list of a grid'''\n", 129 | " pos = []\n", 130 | " for x in range(w):\n", 131 | " for y in range(h):\n", 132 | " pos.append((y, x))\n", 133 | " return pos" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "Define a utility function to compute energy." 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": null, 146 | "metadata": {}, 147 | "outputs": [], 148 | "source": [ 149 | "def energy_prior(state, gamma):\n", 150 | " total = 0\n", 151 | " (h, w) = state.shape\n", 152 | " pos = poslist(h, w)\n", 153 | " for p in pos:\n", 154 | " neighbor = getneighor(p[0], p[1], h, w) # compute neighbor\n", 155 | " \n", 156 | " for n in neighbor:\n", 157 | " total += state[p[0]][p[1]] * state[n[0]][n[1]]\n", 158 | " E = - gamma * total\n", 159 | " return E\n", 160 | " \n", 161 | "def energy_data(state, data, eta):\n", 162 | " E = eta * sum((data - state)**2)\n", 163 | " return E\n", 164 | "\n", 165 | "def energy(state, data, gamma, eta):\n", 166 | " return energy_prior(state, gamma) + energy_data(state, data, eta)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "Define the Gibbs sampler." 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": null, 179 | "metadata": {}, 180 | "outputs": [], 181 | "source": [ 182 | "def gibbs_sampler(state, data, gamma, eta, debug=False): # 0/1 state\n", 183 | " (h, w) = state.shape\n", 184 | " new_state = state.copy()\n", 185 | " pos = poslist(h, w)\n", 186 | " for p in pos:\n", 187 | " neighbor_pos = getneighor(p[0], p[1], h, w)\n", 188 | " neighbor_value = [new_state[n[0]][n[1]] for n in neighbor_pos]\n", 189 | "\n", 190 | " tmp1 = -gamma * -1 * sum(neighbor_value) # x_i = -1\n", 191 | " tmp2 = -gamma * 1 * sum(neighbor_value) # x_i = 1\n", 192 | " \n", 193 | " # add data term\n", 194 | " v = data[p[0]][p[1]]\n", 195 | " tmp1 += eta * (v - (-1))**2 # x_i = -1\n", 196 | " tmp2 += eta * (v - 1)**2 # x_i = 1\n", 197 | " \n", 198 | " tmp1 = np.exp(-tmp1)\n", 199 | " tmp2 = np.exp(-tmp2)\n", 200 | "\n", 201 | " p1 = tmp1 / (tmp1 + tmp2)\n", 202 | " prob = random.uniform() # roll a dice\n", 203 | " \n", 204 | " if (debug): print(p1)\n", 205 | " if (prob > p1):\n", 206 | " new_state[p[0]][p[1]] = 1\n", 207 | " else:\n", 208 | " new_state[p[0]][p[1]] = -1\n", 209 | " return new_state" 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "# Animation: sample with data term included\n", 217 | "Run this demo below; make sure to watch the animation as it happens!" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "from IPython.display import display, clear_output\n", 227 | "import time\n", 228 | "random_seed = 1 # Change this in your experiment\n", 229 | "random.seed(random_seed)\n", 230 | "\n", 231 | "(h, w) = data.shape\n", 232 | "mat = random.random((h,w))\n", 233 | "mat[mat>0.5] = 1\n", 234 | "mat[mat<=0.5] = -1\n", 235 | "random_state = mat\n", 236 | "\n", 237 | "\n", 238 | "# Initial the random state\n", 239 | "init_state = random_state\n", 240 | "\n", 241 | "# Set parameters\n", 242 | "gamma = 20\n", 243 | "eta = 1\n", 244 | "\n", 245 | "new_state = random_state.copy()\n", 246 | "E = [energy(init_state, data, gamma, eta)]# array of energies at each iteration\n", 247 | "\n", 248 | "\n", 249 | "f, ax = plt.subplots() # prepare animation\n", 250 | "for i in range(100):\n", 251 | " clear_output(wait=True)\n", 252 | " new_state = gibbs_sampler(new_state, data, gamma, eta)\n", 253 | " E.append(energy(new_state, data, gamma, eta))\n", 254 | " # time.sleep(1)\n", 255 | " myimshow(new_state)\n", 256 | " display(f)\n", 257 | "\n", 258 | "plt.title(\"Foreground\")\n", 259 | "mask = (new_state==1)\n", 260 | "fg = data.copy()\n", 261 | "x=range(30)\n", 262 | "\n", 263 | "plt.imshow(fg, cmap='gray', interpolation='nearest')\n", 264 | "plt.subplots()\n", 265 | "print(E)\n" 266 | ] 267 | }, 268 | { 269 | "cell_type": "markdown", 270 | "metadata": {}, 271 | "source": [ 272 | "# Questions: Gibbs sampler\n", 273 | "Set random_seed to a different value (and tell me what it is in your homework!)\n", 274 | "1. Try a few different values of $ \\gamma $, $ \\eta $, including special case that only contains the prior term. What happens when the parameters change? (6 points)\n", 275 | "2. Run with different images, plot your results. Find two or three images from the web or your image collection. Can you find an image that causes the model to identify the foreground poorly? Include the image that you use. (4 points)\n", 276 | "3. Around what iteration does the sampler converge for the Einstein image with $ \\gamma = 20 $ and $ \\eta = 1 $ and how do you know it? Don't just say \"the image stopped changing very much\"! Hint: Check the energy of each state $S$.(6 points)" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": null, 282 | "metadata": {}, 283 | "outputs": [], 284 | "source": [] 285 | } 286 | ], 287 | "metadata": { 288 | "anaconda-cloud": {}, 289 | "kernelspec": { 290 | "display_name": "Python 3", 291 | "language": "python", 292 | "name": "python3" 293 | }, 294 | "language_info": { 295 | "codemirror_mode": { 296 | "name": "ipython", 297 | "version": 3 298 | }, 299 | "file_extension": ".py", 300 | "mimetype": "text/x-python", 301 | "name": "python", 302 | "nbconvert_exporter": "python", 303 | "pygments_lexer": "ipython3", 304 | "version": "3.8.8" 305 | } 306 | }, 307 | "nbformat": 4, 308 | "nbformat_minor": 1 309 | } 310 | -------------------------------------------------------------------------------- /HW3/data/gibbs/a.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/a.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/b.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/b.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/c.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/cat3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/cat3.jpg -------------------------------------------------------------------------------- /HW3/data/gibbs/cat4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/cat4.jpg -------------------------------------------------------------------------------- /HW3/data/gibbs/d.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/d.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/e.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/e.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/f.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/f.jpeg -------------------------------------------------------------------------------- /HW3/data/gibbs/gibbs_demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/gibbs_demo.jpg -------------------------------------------------------------------------------- /HW3/data/gibbs/moon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW3/data/gibbs/moon.jpg -------------------------------------------------------------------------------- /HW4/DeepNetwork.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Deep Network\n", 8 | "## This training is super super slow, it can take up hours!!!\n", 9 | "\n", 10 | "Originally by the Tensorflow authors, modified by Donald Li for Fall 2017\n", 11 | " \n", 12 | "This homework requires [tensorflow](https://www.tensorflow.org/install/), please make sure it is correctly installed before running the codes." 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "# Initialization and Preparing DATA\n" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": null, 25 | "metadata": {}, 26 | "outputs": [], 27 | "source": [ 28 | "#Start a new session for tensorflow\n", 29 | "import tensorflow.compat.v1 as tf\n", 30 | "sess = tf.InteractiveSession()\n", 31 | "\n", 32 | "#Download Mnist dataset\n", 33 | "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n", 34 | "\n", 35 | "tf.disable_eager_execution()\n", 36 | "tf.disable_v2_behavior()\n", 37 | "\n", 38 | "#Initialize weight\n", 39 | "def weight_variable(shape):\n", 40 | " initial = tf.truncated_normal(shape, stddev=0.1)\n", 41 | " return tf.Variable(initial)\n", 42 | "\n", 43 | "def bias_variable(shape):\n", 44 | " initial = tf.constant(0.1, shape=shape)\n", 45 | " return tf.Variable(initial)\n", 46 | "\n", 47 | "#Initialize place holder\n", 48 | "x = tf.placeholder(tf.float32, shape=[None, 28,28])\n", 49 | "y_ = tf.placeholder(tf.int32, shape=[None])" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "Here, we define what a convolutional layer and pooling layers. The following is the structure of the current convolutional network.\n", 57 | "" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "def conv2d(x, W):\n", 67 | " return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')\n", 68 | "\n", 69 | "def max_pool_2x2(x):\n", 70 | " return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],\n", 71 | " strides=[1, 2, 2, 1], padding='SAME')\n", 72 | "\n", 73 | "def avg_pool_2x2(x):\n", 74 | " return tf.nn.avg_pool(x, ksize=[1, 2, 2, 1],\n", 75 | " strides=[1, 2, 2, 1], padding='SAME')\n" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": null, 81 | "metadata": {}, 82 | "outputs": [], 83 | "source": [ 84 | "import numpy as np\n", 85 | "def next_batch(num, data, labels):\n", 86 | " '''\n", 87 | " Return a total of `num` random samples and labels. \n", 88 | " '''\n", 89 | " idx = np.arange(0 , len(data))\n", 90 | " np.random.shuffle(idx)\n", 91 | " idx = idx[:num]\n", 92 | " data_shuffle = data[idx]\n", 93 | " labels_shuffle = labels[idx]\n", 94 | "\n", 95 | " return data_shuffle, labels_shuffle" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": null, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "batch[1].shape" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "We have to specify how many parameters there should be, and for the first convolution and pooling layer, what kind of how many units are there, and how they are being connected. Here, h is the hidden layer." 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "W_conv1 = weight_variable([5, 5, 1, 32])\n", 121 | "b_conv1 = bias_variable([32])\n", 122 | "x_image = tf.reshape(x, [-1, 28, 28, 1])\n", 123 | "h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)\n", 124 | "h_pool1 = max_pool_2x2(h_conv1)\n", 125 | "#h_pool1 = avg_pool_2x2(h_conv1)" 126 | ] 127 | }, 128 | { 129 | "cell_type": "markdown", 130 | "metadata": {}, 131 | "source": [ 132 | "Of course, we can do similar thing to make the second layer of the network, it is important to notice that the number of input and output units are differnet in different layers, so when you want to decrease or increase the number of layer, you have to be careful about that. The output image size is 7*7 here." 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [ 141 | "W_conv2 = weight_variable([5, 5, 32, 64])\n", 142 | "b_conv2 = bias_variable([64])\n", 143 | "\n", 144 | "h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)\n", 145 | "h_pool2 = max_pool_2x2(h_conv2)\n", 146 | "#h_pool2 = avg_pool_2x2(h_conv2)" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "We add a fully-connected layer to allow processing on the entire image, here we have used a ReLu function. Then do the drop out process to prevent overfitting, finally there is a read out layer to get the results. " 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": null, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [ 162 | "W_fc1 = weight_variable([7 * 7 * 64, 1024])\n", 163 | "b_fc1 = bias_variable([1024])\n", 164 | "\n", 165 | "h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])\n", 166 | "h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)\n", 167 | "\n", 168 | "keep_prob = tf.placeholder(tf.float32)\n", 169 | "h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)\n", 170 | "W_fc2 = weight_variable([1024, 10])\n", 171 | "b_fc2 = bias_variable([10])\n", 172 | "\n", 173 | "y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2\n", 174 | "y_onehot = tf.one_hot(y_,10)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "metadata": {}, 180 | "source": [ 181 | "Here, we train and test the model. Instead of using least square, we are using cross entropy to be the term being oprtimized. We do not use a steepest gradient descent here, but using a ADAM alogrithm to do the optimization, in every 100 iterations, results will be printed out. For each batch of training, we feed in 50 images. This training is super super slow, it can take up hours!!!" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": null, 187 | "metadata": {}, 188 | "outputs": [], 189 | "source": [ 190 | "# Defining cross-entropy here\n", 191 | "cross_entropy = tf.reduce_mean(\n", 192 | " tf.nn.softmax_cross_entropy_with_logits(labels=y_onehot, logits=y_conv))\n", 193 | "train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)\n", 194 | "correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_onehot, 1))\n", 195 | "accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", 196 | "\n", 197 | "#Do the training\n", 198 | "with tf.Session() as sess:\n", 199 | " sess.run(tf.global_variables_initializer())\n", 200 | " for i in range(5000):\n", 201 | " batch = next_batch(50,x_train,y_train)\n", 202 | " if i % 100 == 0:\n", 203 | " train_accuracy = accuracy.eval(feed_dict={\n", 204 | " x: batch[0], y_: batch[1], keep_prob: 1.0})\n", 205 | " print('step %d, training accuracy %g' % (i, train_accuracy))\n", 206 | " train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})\n", 207 | "\n", 208 | "#Test the accuracy\n", 209 | " print('test accuracy %g' % accuracy.eval(feed_dict={\n", 210 | " x: x_test, y_: y_test, keep_prob: 1.0}))" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": {}, 216 | "source": [ 217 | "# Softmax Regression Model\n", 218 | "\n", 219 | "First, we have to initialize place holders and variables. \n", 220 | "It will be better to run the initialization and data preparation cell again before running the following!" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": null, 226 | "metadata": {}, 227 | "outputs": [], 228 | "source": [ 229 | "#Initialize weights and bias for the regression model\n", 230 | "#Start a new session for tensorflow\n", 231 | "import tensorflow.compat.v1 as tf\n", 232 | "sess = tf.InteractiveSession()\n", 233 | "\n", 234 | "#Download Mnist dataset\n", 235 | "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()\n", 236 | "\n", 237 | "tf.disable_eager_execution()\n", 238 | "tf.disable_v2_behavior()\n", 239 | "\n", 240 | "#Initialize place holder\n", 241 | "x = tf.placeholder(tf.float32, shape=[None, 28,28])\n", 242 | "y_ = tf.placeholder(tf.int32, shape=[None])\n", 243 | "\n", 244 | "\n", 245 | "W = tf.Variable(tf.zeros([784,10]))\n", 246 | "b = tf.Variable(tf.zeros([10]))\n", 247 | "\n", 248 | "sess.run(tf.global_variables_initializer())" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": [ 255 | "The class is predicted using a softmax model, and the loss function uses a cross entropy in this case." 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": null, 261 | "metadata": {}, 262 | "outputs": [], 263 | "source": [ 264 | "#Class prediction\n", 265 | "x_oneD = tf.reshape(x, [-1, 784])\n", 266 | "y = tf.matmul(x_oneD,W) + b\n", 267 | "y_onehot = tf.one_hot(y_,10)\n", 268 | "#Loss function\n", 269 | "cross_entropy = tf.reduce_mean(\n", 270 | " tf.nn.softmax_cross_entropy_with_logits(labels=y_onehot, logits=y))" 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "metadata": {}, 276 | "source": [ 277 | "The following cell do the training for the regression model, you can try to manipulate the number of training done to see what's happen." 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": null, 283 | "metadata": {}, 284 | "outputs": [], 285 | "source": [ 286 | "#Do the gradient decent training \n", 287 | "train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)\n", 288 | "for _ in range(1000): #You may want to try 10,100,1000,10000\n", 289 | " batch = next_batch(100,x_train,y_train)\n", 290 | " train_step.run(feed_dict={x: batch[0], y_: batch[1]})" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "After training, calculate the prediction and see how off it is to the true value." 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": null, 303 | "metadata": {}, 304 | "outputs": [], 305 | "source": [ 306 | "#Check the prediction\n", 307 | "correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_onehot,1))\n", 308 | "\n", 309 | "#Calculate and print the accuracy\n", 310 | "accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", 311 | "print(\"Accuracy is\", accuracy.eval(feed_dict={x: x_test, y_: y_test}))" 312 | ] 313 | }, 314 | { 315 | "cell_type": "markdown", 316 | "metadata": {}, 317 | "source": [ 318 | "# HW\n", 319 | "\n", 320 | "1. Try both average pooling and max-pooling for the convolutional neural network, does the results agree on what you have discussed in Question 2-2? What is the difference between them? (5 points)\n", 321 | "2. Modify the code to make it into a one-layer network (it is very simple), but you just have to be careful about the dimension of each output layer to make sure they are correct, do you find a accuracy difference between one-layer convolutional network and a two-layer convolutional network? Report the results and explain (5 points)\n", 322 | "3. Run the simple softmax regression model and see how is the results different from the convolutional neural network? You should change the number of training and see how the accuaracy changes in the regression model. (5 points)" 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "execution_count": null, 328 | "metadata": {}, 329 | "outputs": [], 330 | "source": [] 331 | } 332 | ], 333 | "metadata": { 334 | "anaconda-cloud": {}, 335 | "kernelspec": { 336 | "display_name": "Python 3", 337 | "language": "python", 338 | "name": "python3" 339 | }, 340 | "language_info": { 341 | "codemirror_mode": { 342 | "name": "ipython", 343 | "version": 3 344 | }, 345 | "file_extension": ".py", 346 | "mimetype": "text/x-python", 347 | "name": "python", 348 | "nbconvert_exporter": "python", 349 | "pygments_lexer": "ipython3", 350 | "version": "3.8.8" 351 | } 352 | }, 353 | "nbformat": 4, 354 | "nbformat_minor": 1 355 | } 356 | -------------------------------------------------------------------------------- /HW4/MNIST_data/t10k-images-idx3-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW4/MNIST_data/t10k-images-idx3-ubyte.gz -------------------------------------------------------------------------------- /HW4/MNIST_data/t10k-labels-idx1-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW4/MNIST_data/t10k-labels-idx1-ubyte.gz -------------------------------------------------------------------------------- /HW4/MNIST_data/train-images-idx3-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW4/MNIST_data/train-images-idx3-ubyte.gz -------------------------------------------------------------------------------- /HW4/MNIST_data/train-labels-idx1-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW4/MNIST_data/train-labels-idx1-ubyte.gz -------------------------------------------------------------------------------- /HW4/mnist_deep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccvl/VisualCortexCourse/162ffc4d47a751397157ef4c4aa88a11cebad2b7/HW4/mnist_deep.png --------------------------------------------------------------------------------