{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Anomaly Detection using Deep Learning\n", "\n", "## Demo\n", "\n", "We'll train a neural network called an Autoencoder on a credit card fraud dataset from [Kaggle](https://www.kaggle.com/dalpozz/creditcardfraud) without labels. It will learn how to reconstruct the input data after time. Then, we'll use its learned representations to turn to perform binary classification.\n", "\n", "## What's an autoencoder?\n", "\n", "![alt text](https://vanishingcodes.files.wordpress.com/2017/06/stackedae.png \"Logo Title Text 1\")\n", "\n", "Auto-encoder is a type of neural network that approximates the function: \n", "\n", "f(x) = x. \n", "\n", "Basically, given an input x, network will learn to output f(x) that is as close as to x. \n", "\n", "The error between output and x is commonly measured using root mean square error (RMSE)\n", "\n", "mean((f(x) – x) ^ 2) \n", "\n", "which is the loss function we try to minimise in our network.\n", "\n", "Autoencoders follows a typical feed-forward neural networks architecture except that the output layer has exactly same number of neurons as input layer. And it uses the input data itself as its target. Therefore it works in a way of unsupervised learning – learn without predicting an actual label\n", "\n", "The ‘encoder’ – job is to ’embed’ the input data into a lower dimensional array. \n", "The ‘decoder’ - job is to try to decode the embedding array into the original one.\n", "\n", "We can have either one hidden layer, or in the case below, have multiple layers depending on the complexity of our features.\n", "\n", "## What are other Anomaly Detection methods?\n", "\n", "PCA - Principal Component analysis. This is actually a dimensionality reduction technique but can be used to detect anomalies since when visualized, the learned 'principal components' will show outliers.\n", "\n", "![alt text](https://upload.wikimedia.org/wikipedia/commons/6/69/Principal_Component_Analysis_of_the_Italian_population.png \"Logo Title Text 1\")\n", "\n", "K means - This is simple arithmetic, a very popular algorithm. Gives great results for small datasets, utility declines as your data grows >1000 data points.\n", "\n", "![alt text](https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/ClusterAnalysis_Mouse.svg/450px-ClusterAnalysis_Mouse.svg.png \"Logo Title Text 1\")\n", "\n", "![alt text](https://blog.keras.io/img/ae/autoencoder_schema.jpg \"Logo Title Text 1\")\n", "\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/1600/1*8ixTe1VHLsmKB3AquWdxpQ.png \"Logo Title Text 1\")\n", "\n", "\n", "## What are the steps\n", "\n", "1. First part of the forward pass - encode the data points into an encoded representation\n", "2. Second part of the forward pass - decode the data points \n", "3. Measure the Root mean squared error. Minimize it using backpropagation. \n", "4. We'll define a threshold value. If the RMSE is above that threshold value then, it's considered an anomaly. We can Rank the RSME values and the top .1 can be considered anomalies.\n", "\n", "The reason the top X datapoints with the highest RMSE error are considered anomalies is because the RMSE will measure the difference between the learned patterns and the anomaly value. Since the majority of the datapoints share similar patterns, the anomalies will stick out. They'll have the highest difference. \n", "\n", "So we're basically creating a generalized latent representation of all the datapoints (both fraud and valid) and since the valid datapoints far outweight the fraud datapoints, this learned representation will be one for valid datapoints. Then when the difference between the learning and the fraud datapoint is measured, it will be very high. Anomaly spotted! \n", "\n", "\n", "## How can this be applied at CERN?\n", "\n", "Why use deep learning?\n", "-Particle data is very high dimensional\n", "-It works well on big datasets and big computing power\n", "-No need to perform feature engineering, deep nets will learn the most relevant features.\n", "\n", "-Classification for known particles\n", "-Generative models for simulations (Generative adversarial networks, variational autoencoders)\n", "-Clustering (What we're talking about)\n", "\n", "![alt text](https://home.cern/sites/home.web.cern.ch/files/image/featured/2014/01/higgs-simulation-3.jpg \"Logo Title Text 1\")\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Load libraries " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd #data manipulation\n", "import numpy as np #matrix math\n", "import tensorflow as tf #machine learning\n", "import os #saving files\n", "from datetime import datetime #logging\n", "from sklearn.metrics import roc_auc_score as auc #measuring accuracy\n", "import seaborn as sns #plotting" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt #plotting\n", "import matplotlib.gridspec as gridspec\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Exploration" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data_dir = \"C:\\\\Users\\\\weimin\\\\Desktop\\\\Fraud\"\n", "df = pd.read_csv(os.path.join(data_dir, 'creditcard.csv'))" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(284807, 31)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total time spanning: 2.0 days\n", "0.173 % of all transactions are fraud. \n" ] } ], "source": [ "print(\"Total time spanning: {:.1f} days\".format(df['Time'].max() / (3600 * 24.0)))\n", "print(\"{:.3f} % of all transactions are fraud. \".format(np.sum(df['Class']) / df.shape[0] * 100))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TimeV1V2V3V4V5V6V7V8V9...V21V22V23V24V25V26V27V28AmountClass
00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.363787...-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.021053149.620
10.01.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425...-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.0147242.690
21.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.514654...0.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.059752378.660
31.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024...-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.061458123.500
42.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.817739...-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515369.990
\n", "

5 rows × 31 columns

\n", "
" ], "text/plain": [ " Time V1 V2 V3 V4 V5 V6 V7 \\\n", "0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 \n", "1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 \n", "2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 \n", "3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 \n", "4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 \n", "\n", " V8 V9 ... V21 V22 V23 V24 \\\n", "0 0.098698 0.363787 ... -0.018307 0.277838 -0.110474 0.066928 \n", "1 0.085102 -0.255425 ... -0.225775 -0.638672 0.101288 -0.339846 \n", "2 0.247676 -1.514654 ... 0.247998 0.771679 0.909412 -0.689281 \n", "3 0.377436 -1.387024 ... -0.108300 0.005274 -0.190321 -1.175575 \n", "4 -0.270533 0.817739 ... -0.009431 0.798278 -0.137458 0.141267 \n", "\n", " V25 V26 V27 V28 Amount Class \n", "0 0.128539 -0.189115 0.133558 -0.021053 149.62 0 \n", "1 0.167170 0.125895 -0.008983 0.014724 2.69 0 \n", "2 -0.327642 -0.139097 -0.055353 -0.059752 378.66 0 \n", "3 0.647376 -0.221929 0.062723 0.061458 123.50 0 \n", "4 -0.206010 0.502292 0.219422 0.215153 69.99 0 \n", "\n", "[5 rows x 31 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Index(['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10',\n", " 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20',\n", " 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount',\n", " 'Class'],\n", " dtype='object')" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Time float64\n", "V1 float64\n", "V2 float64\n", "V3 float64\n", "V4 float64\n", "V5 float64\n", "V6 float64\n", "V7 float64\n", "V8 float64\n", "V9 float64\n", "V10 float64\n", "V11 float64\n", "V12 float64\n", "V13 float64\n", "V14 float64\n", "V15 float64\n", "V16 float64\n", "V17 float64\n", "V18 float64\n", "V19 float64\n", "V20 float64\n", "V21 float64\n", "V22 float64\n", "V23 float64\n", "V24 float64\n", "V25 float64\n", "V26 float64\n", "V27 float64\n", "V28 float64\n", "Amount float64\n", "Class int64\n", "dtype: object" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuIAAARrCAYAAADGjMMVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0HNd14P9vVS9oAN3YARLc90uKEkmJtBaLkmhbtiPZ\niuQ4nnE0mUmcyHY8mjhe5jdxYsfLjHOc5GdbI5+Jo4l+UeTEmWM7chRbmmizLcoURYrWRnG9JLgT\nJIgdaOzo7vr9UQWyRaGxgw2C98ODw+569V69qtcN3H796j3H8zyMMcYYY4wxl5ab7woYY4wxxhhz\nJbJA3BhjjDHGmDywQNwYY4wxxpg8sEDcGGOMMcaYPLBA3BhjjDHGmDywQNwYY4wxxpg8COe7AsYY\nMxOJyBbgf6nq1cOk/XegTlX/YYT8XwZ2q+pPpq+W00NENgA/BjqA31DV41lpvwv8d+CAqr5/guU/\nC9yrqs2Tr+2IxykDtgZP48B8QIPnzwHbgNtV9dPTWQ9jjMnFAnFjjBknVf3yGHZ7N7B/uusyTX4d\neF5V7xsm7T8Bf6qq359E+e+dRN4xU9V2YAO85YPVhot2++mlqIsxxgzHAnFjjMktLiI/AFYDMeDj\nqrpNRB4F9qrqN0Xka8CHgAGgBfhd4DeATcD/KyJp4BfAX+MHhR7wFH4wmxKRO4G/BNLAG8DtwGZg\nC/D7QDF+z/QHgb8BVgEVQBK/V1lFZCvwKn7wXwM8CMwBbgvy/ztV3XPxyYnInwG/BaSAQ8B/Ad4D\n/GcgJCKFqvofsvZ/ALgeWCoi1cE5/WVwnBDwOvBpVe0UkQ8CfwpEgzp9T1X/TET+Piju+eDctwG/\nqaqvBMc4Dvwm0BykHQCWBMdYGhyvGMgAX1XVJ4N8bwD3DZUzFkHv/m+q6gfHeg1FpDRIuwaIAD8H\n/h9VTY31uMYYM8TGiBtjTG4LgAeCXtT/DXw1O1FEFgKfAd6hqpuAZ4EbVPWvgVfwA7THge/gB+nX\n4Afo64H/KiKVwD8Cvx0c43n84RND1gJbVPVdwB1Au6reqKqrgF/hB85DlqjqtfgfAv4S2BrU6Wng\nDy8+MRH5WFDmO1R1HbAXeFRV/wl4CPhhdhAOoKqfzTqvB4Av4AfxG1V1PXAG+AsRcYDPA78T1OFG\n4E9EpEpVPxYU9y5VPZX70gP+9f8fwfn2AX8P/EdVvQ6/1/5vRGRRULcN4wnCcxjLNXwAeFVVNwLX\nAlXA5yZ5XGPMFcp6xI0xJrcjqvpy8PgN4PcuSq8HdgOvichTwFOq+vNhyrkDuFlVPaBfRB7CD+AV\n2K+quwFU9Xsi8p2sfG+qameQ9piIHBWRPwRW4PeY78ja91+G6hz8/3TW8y056vT3qtodPH8Q+KKI\nRIfZN5cPAmXAe0UE/N7vRlX1ROQu4IMici+wBnDwe5bHMy48xYVzvAmoBf41OBb43y6sA06Oo8yR\njOUafhC4XkR+P3heOEXHNsZcgSwQN8aY3AazHnv4weR5qpoRkdvwe7lvBx4QkedV9Y8uKufibx9d\n/GENqYvLxB9yMaRr6IGIfAr4BPC/gP8DtOIP1RjSf1Hdsus+nOHqFB6mPiMJAX+kqk8FdYwDMREp\nxh+m8jj+8JJHgHtylH3xdc3+INCfNeQjhH+D6A1DiSIyD2gaR31HM5ZrGAI+oqoHgjqU4Z+DMcaM\nmw1NMcaYCRKR9fhDOg6o6jfwhy2sD5JT+ME2wDPA/SLiiEgBfkD9HLAdWCUi64LyPozfwzxcYPd+\n/KEjf4ffk34XflA4Uc8AHwuCZoBPA79U1f4R8gxXxn8RkaiIuMDDwDeAlUAJ8CVVfQJ/nHVBVn3T\nXLg2TfgfZBCRG/F7vYezE1gpIrcG+24ADgPzxlHfqfAM8Nmstvwpbx0iZIwxY2aBuDHGTFAwpORH\nwCsi8gr+0JXPBslPAN8Ukd/BD3JrgD3BjwJ/rqqt+DdL/oOIvIYfbKeAnmEO903gk8FNiT8HXsMf\nojJRfwf8DNglIgeA64D/MHKWt/kfwHH83u/9+D3bnwfeBJ4EDgbn9etB+lB9/wV4UUSuBv4Y+KPg\nvD6Of8Pk26hqE/Bh/Btgd+OPrf+PqnoC/Js1RWTTOOs/EZ/GH2KzB/889wB/dQmOa4yZhRzPs2/U\njDEmH0SkBPgS/uwfPSJyHfB/gXnBeHJjjDGzmAXixhiTRyLydfzpDweDn8+p6rb81soYY8ylYIG4\nMcYYY4wxeWBjxI0xxhhjjMkDC8SNMcYYY4zJAwvEjTHGGGOMyYMrdkGfpqbkhAfHl5cX0dY23Oxi\n5nJm7To7WbvOTtaus5O16+xk7QrV1YlhF0uzHvEJCIcns4aGmamsXWcna9fZydp1drJ2nZ2sXXOz\nQNwYY4wxxpg8GHVoSrBs8Xfxl23uB+5T1bqs9LuAL+OvBveIqj6cK4+IrAAexV++eS9wv6pmROTj\nwCeDMr6uqk+KSCnwffxlkqP4c+vuCJZAfjDY91lV/VpQj68AHwi2f0ZVd03y2hhjjDHGGDNtxtIj\nfg8QU9WbgC8A3xpKEJEI8ADwPuA24BMiMmeEPN8GvqSqt+AvhXy3iMzFXzL4Zvzlnb8hIgXA54Cf\nq+ptwO8Cfx2U8RBwL7AZuEFErg1Wo7sNuAH4aNa+xhhjjDHGzEhjCcQ3A08DqOpOYFNW2hqgTlXb\nVHUAeBG4dYQ8G4EXgsdPAbcD1wPbVbVfVTuAOmAdfoD/v4N9w0BfsBx0gaoeCZZ/fiYoYzN+77in\nqieBsIhUj+9SGGOMMcYYc+mMZdaUEqAj63laRMKqmhomLQmU5soDOEEAPdK+SaBUVdsBgh7z7wOf\nCfbtvGjfZUAf0DJMPZpynVR5edGkbh6ork5MOK+ZuaxdZydr19nJ2nV2snadnaxdhzeWQLwTyL56\nbhCED5eWANpz5RGRzBj2HdqOiFwD/AD4r6r6QtAjPty+A7nKyGUy0+hUVydoakpOOL+ZmaxdZydr\n19nJ2nV2snadnaxdc38QGcvQlO3AnQDBjZJ7stIOACtFpEJEovjDUnaMkOd1EdkSPL4D2AbsAm4R\nkVhwg+YaYK+IXAX8M3Cvqj4FoKqdwICILBcRB39M+bbgeO8XEVdEFuEH/s1jODdjjDHGGGPyYiw9\n4o8D7xWRl/BvsPyYiNwLxFX1b0Xkc/hjtV38WVPqReRteYKyPg88HATtB4DHVDUtIt/BD6hd4Iuq\n2ici3wBiwIMiAtChqncDfwD8ExDCHxf+MoCIbMP/EOAC90/yuhhj8mDrG/Ujpm/ZMP8S1cQYY4yZ\nfo7nTXiBycvaZFbWtK9YZidr1/ybjkDc2nV2snadnaxdZydrV1tZ0xhjjDHGmBnFAnFjjDHGGGPy\nwAJxY4wxxhhj8sACcWOMMcYYY/LAAnFjjDHGGGPywAJxY4wxxhhj8sACcWOMMcYYY/LAAnFjjDHG\nGGPyYCwraxpjjDFTwlZPNcaYC6xH3BhjjDHGmDywQNwYY4wxxpg8sEDcGGOMMcaYPLBA3BhjjDHG\nmDywQNwYY4wxxpg8sEDcGGOMMcaYPBh1+kIRcYHvAuuBfuA+Va3LSr8L+DKQAh5R1Ydz5RGRFcCj\ngAfsBe5X1YyIfBz4ZFDG11X1yazyPwR8RFXvDZ5vzareauBRVf2CiPwEqAIGgV5VvWMiF8QYY4wx\nxphLYSw94vcAMVW9CfgC8K2hBBGJAA8A7wNuAz4hInNGyPNt4EuqegvgAHeLyFzg08DNwPuBb4hI\nQVD+g8A3suupqltUdQvwe8Bp4OtB0kpgc5BuQbgxxhhjjJnRxhKIbwaeBlDVncCmrLQ1QJ2qtqnq\nAPAicOsIeTYCLwSPnwJuB64Htqtqv6p2AHXAumCfl4BP5ajX/wT+WFW7guC/DHhCRF4UkQ+O4byM\nMcYYY4zJm7GsrFkCdGQ9T4tIWFVTw6QlgdJceQBHVb1R9h3ajqr+UES2XFwhEVkHlKjqz4NNUfxe\n9weBCmC7iOxS1cZcJ1VeXkQ4HBrxxEdSXZ2YcF4zc1m75lciHhsxfaLtY+06c0xlG1u7zk7WrrOT\ntevwxhKIdwLZV88NgvDh0hJAe648IpIZw75D20fy28DDWc8bgIeCejWKyOuAADkD8ba2nlEOkVt1\ndYKmpuSE85uZydo1/5JdfSOmT6R9rF1nlqlqY2vX2cnadXayds39QWQsQ1O2A3cCiMiNwJ6stAPA\nShGpEJEo/rCUHSPkeT2rh/sOYBuwC7hFRGIiUoo/3GXvKHV6D8HQl8DtwD8Hx4sDVwd1M8YYY4wx\nZkYaSyD+ONAnIi/h35j5WRG5V0Q+oaqDwOeAZ/AD8EdUtX64PEFZnwe+JiI78IeTPKaqDcB38IPy\nXwBfVNWRu0xgrqq2DD1R1aeAQyKyE3gW+FNVbR7LBTDGGGOMMSYfHM/zRt9rFmpqSk74xO0rltnJ\n2jX/tr5RP2L6lg3zx12mtevMMlVtbO06O1m7zk7WrlBdnXCG224L+hhjjDHGGJMHFogbY4wxxhiT\nBxaIG2OMMcYYkwcWiBtjjDHGGJMHFogbY4wxxhiTBxaIG2OMMcYYkwcWiBtjjDHGGJMHFogbY4wx\nxhiTBxaIG2OMMcYYkwcWiBtjjDHGGJMHFogbY4wxxhiTBxaIG2OMMcYYkwcWiBtjjDHGGJMHFogb\nY4wxxhiTB+HRdhARF/gusB7oB+5T1bqs9LuALwMp4BFVfThXHhFZATwKeMBe4H5VzYjIx4FPBmV8\nXVWfzCr/Q8BHVPXerOffBE4Fu3xFVV8Qka8AHwjK+Iyq7proRTHGGGOMMWa6jaVH/B4gpqo3AV8A\nvjWUICIR4AHgfcBtwCdEZM4Ieb4NfElVbwEc4G4RmQt8GrgZeD/wDREpCMp/EPjGRfXcCPw3Vd0S\n/LwgItcFx78B+Cjw1+O/FMYYY4wxxlw6YwnENwNPA6jqTmBTVtoaoE5V21R1AHgRuHWEPBuBF4LH\nTwG3A9cD21W1X1U7gDpgXbDPS8CnLqrPRuD3RGSbiHxLRMLB8Z5VVU9VTwJhEake0xUwxhhjjDEm\nD0YdmgKUAB1Zz9MiElbV1DBpSaA0Vx7AUVVvlH2HtqOqPxSRLRfV5zngX4FjwEPAHwRltAxTRlOu\nkyovLyIcDuVKHlV1dWLCec3MZe2aX4l4bMT0ibaPtevMMZVtbO06O1m7zk7WrsMbSyDeCWRfPTcI\nwodLSwDtufKISGYM+w5tz+URVW0HEJGfAB8Gdo+zDNraekZKHlF1dYKmpuSE85uZydo1/5JdfSOm\nT6R9rF1nlqlqY2vX2cnadXayds39QWQsQ1O2A3cCiMiNwJ6stAPAShGpEJEo/rCUHSPkeT2rh/sO\nYBuwC7hFRGIiUoo/3GXvcBUREQd4U0QWBJveA7waHO/9IuKKyCL8wL95DOdmjDHGGGNMXowlEH8c\n6BORl/BvzPysiNwrIp9Q1UHgc8Az+AH4I6paP1yeoKzPA18TkR1AFHhMVRuA7+AH5b8Avqiqw3aZ\nBMNa7gP+RUReAIqAh1X11SD/DuDHwP3jvRDGGGOMMcZcSo7neaPvNQs1NSUnfOL2FcvsZO2af1vf\nqB8xfcuG+eMu09p1ZpmqNrZ2nZ2sXWcna1eork44w223BX2MMcYYY4zJAwvEjTHGGGOMyQMLxI0x\nxhhjjMkDC8SNMcYYY4zJAwvEjTHGGGOMyQMLxI0xxhhjjMkDC8SNMcYYY4zJAwvEjTHGGGOMyQML\nxI0xxhhjjMkDC8SNMcYYY4zJAwvEjTHGGGOMyQMLxI0xxhhjjMkDC8SNMcYYY4zJAwvEjTHGGGOM\nyQMLxI0xxhhjjMmD8Gg7iIgLfBdYD/QD96lqXVb6XcCXgRTwiKo+nCuPiKwAHgU8YC9wv6pmROTj\nwCeDMr6uqk9mlf8h4COqem/w/D3A14FBoBH4T6raIyI/AaqC7b2qesckrosxxhhjjDHTaiw94vcA\nMVW9CfgC8K2hBBGJAA8A7wNuAz4hInNGyPNt4EuqegvgAHeLyFzg08DNwPuBb4hIQVD+g8A3Lqrn\nd4F7VPVW4DBwX7B9JbBZVbdYEG6MMcYYY2a6UXvEgc3A0wCqulNENmWlrQHqVLUNQEReBG4FbsqR\nZyPwQvD4KfwAPg1sV9V+oF9E6oB1wK+Al4B/xe8tH7JFVc9l1b8vCP7LgCdEpAz4i+xedWMula1v\n1I+YvmXD/EtUE2OMMcbMdGMJxEuAjqznaREJq2pqmLQkUJorD+CoqjfKvkPbUdUfisiW7Mqo6lkA\nEfkN4F3AnwHV+L3uDwIVwHYR2aWqjblOqry8iHA4NPrZ51BdnZhwXjNzTbZdE/HYtJY/203X9bPr\nPnNMZRtbu85O1q6zk7Xr8MYSiHcC2VfPDYLw4dISQHuuPCKSGcO+Q9tzEpHPAr8J/Jqq9olIA/BQ\nUK9GEXkdEPwx5MNqa+sZ6RAjqq5O0NSUnHB+MzNNRbsmu/pGTLfXzcim4/rZ+3Vmmao2tnadnaxd\nZydr19wfRMYyRnw7cCeAiNwI7MlKOwCsFJEKEYniD0vZMUKe17N6uO8AtgG7gFtEJCYipfjDXfbm\nqoyIfBG4BbhdVZuDzbcD/xykx4Grg7oZY4wxxhgzI42lR/xx4L0i8hL+DZYfE5F7gbiq/q2IfA54\nBj+of0RV60XkbXmCsj4PPBwE7QeAx1Q1LSLfwQ/KXeCLqjpsl0kwFvwrwGvAUyIC8ENV/RsReb+I\n7AQywJ9mBenGGGOMMcbMOI7neaPvNQs1NSUnfOL2FcvsNBXtajdrTs50XD97v84sU9XG1q6zk7Xr\n7GTtCtXVCWe47bagjzHGGGOMMXlggbgxxhhjjDF5YIG4McYYY4wxeWCBuDHGGGOMMXlggbgxxhhj\njDF5MJbpC40xxhhj8s5mpjKzjfWIG2OMMcYYkwcWiBtjjDHGGJMHFogbY4wxxhiTBxaIG2OMMcYY\nkwcWiBtjjDHGGJMHFogbY4wxxhiTBxaIG2OMMcYYkwcWiBtjjDHGGJMHFogbY4wxxhiTB6OurCki\nLvBdYD3QD9ynqnVZ6XcBXwZSwCOq+nCuPCKyAngU8IC9wP2qmhGRjwOfDMr4uqo+mVX+h4CPqOq9\nwfMbgQeDfZ9V1a8F278CfCDY/hlV3TXxy2KMMcYYY8z0GssS9/cAMVW9KQiCvwXcDSAiEeAB4B1A\nN7BdRH4K3Jwjz7eBL6nqVhF5CLhbRHYAnwY2ATHgRRF5TlX7ReRB4P3AG1n1eQj4MHAU+L8ici3g\nALcBNwALgR8HdTLGZLHloa8cL9bvHDF98/wbL1FNjDHG5DKWoSmbgacBVHUnfsA8ZA1Qp6ptqjoA\nvAjcOkKejcALweOngNuB64Htqtqvqh1AHbAu2Ocl4FNDBxOREqBAVY+oqgc8E5SxGb933FPVk0BY\nRKrHfhmMMcYYY4y5tMbSI14CdGQ9T4tIWFVTw6QlgdJceQAnCKBH2ndoO6r6QxHZclFdOi/adxnQ\nB7QMU0ZTrpMqLy8iHA7lSh5VdXViwnnNzDXZdk3EY9Na/mRdqfXL93nlQ6JzZrb1VLbxldiuV4KR\n2nWm/w4zuVnbDG8sgXgnkH313CAIHy4tAbTnyiMimTHsO7R9LHUZ2ndgHGUA0NbWM1LyiKqrEzQ1\nJSec38xMU9Guya6+EdPz/bq5Eut3pb5fk8mZ2dZT1cZXarvOdqO160z/HWaGZ+/X3B9ExjI0ZTtw\nJ5y/UXJPVtoBYKWIVIhIFH9Yyo4R8rye1cN9B7AN2AXcIiIxESnFH+6yd7iKqGonMCAiy0XEwR8/\nvi043vtFxBWRRfiBf/MYzs0YY4wxxpi8GEuP+OPAe0XkJfybIj8mIvcCcVX9WxH5HP5YbRd/1pR6\nEXlbnqCszwMPB0H7AeAxVU2LyHfwA2oX+KKqjvSR9w+AfwJC+OPCXwYQkW34HwJc4P5xXANjjDnP\nbmg1xhhzqYwaiKtqBj/4zXYwK/0J4Ikx5EFVD+HPbnLx9oeBh3McfyuwNev5TuBtt/ur6leBr+Y4\nDWOMMcYYY2YUW9DHGGOMMcaYPLBA3BhjjDHGmDywQNwYY4wxxpg8sEDcGGNmmcFMiv50f76rYYwx\nZhRjmTXFGGPMFJnqWVkyXoa69qO82vgm57obOd3ZSG+mC4CYU0xpqIKSUCVxtwzXcVm1sGzCdTfG\nGDO1LBA3xpjL0NPHfs7RzhMc7zhJd+rCAmURp4C4W4aDQ1emg3OpU5xLnaLAKWR5wTWABeLGGDNT\nWCBujDGXCc/zONJxnF+c2sbuJn/ds7ATZlnpYpaWLKYyVs6R+gur12W8NMlMO22pRlrSZznY9ypV\nXSHmx2vzdQrGGGOyWCBujDEz3EB6kNcb32Tr6e2cTJ4GoCJWxqqy5SxMzCfsDv+r3HVClIYqKQ1V\nUpKq4PjAAX5Zv4N1VWu5ed4NOI5zKU/DGGPMRSwQN8aYS+xo356caeH6U2ye769Z1tDdyPYzL7Pz\n7Cv0pHpxcFhffTXvXngLZ7saxhVIV4TnEHOLOJHay5vN+/jp0ae5e/kdkz4XYwBSmRQd/Z30pftJ\nZ9KkvTQZz6MgFKUwHKMwXEgsXIDr2BwRxmSzQNwYM2VGuxHRjC450MWzx5/ntcbdnOo6A0AiEud9\ni9/FzfNuoKqwAoCG7nPjLrvITfC+xe/iZydf4NkTz7OqbDlrKldNaf3N7PJi/c63PE9l0rT3d9Da\n10ZrXxsdA530DPbSN4ZZehwcIk4BUSdG1IkRcwuJOcWsKryOYrcU13FJxGMku/qm63SMmXEsEDfG\nXFIj9QYDLItdc4lqMjMMjeNOplvpTLfx6jF/xhPXcVlbuZobazexruqqnMNPxqswHOPmedfzs5O/\n5Hv7f8CfXP9ZSgsSU1K2mX08z6O9v4Oz3Y2c7TlHc08zGbzz6a7jUhQupCaaoChSSMSN4DouruPi\n4AfuA5lBBjOD9Kf66ejvpivT7mdO+/8dHdiLS4iyUDW1gwtIZKqpDM+l0E3Y8Ckz61kgboyZUcY6\nbONy5XkZutOddGZaSabb6Mq04wWBjYNLbfEc3rPwVtZXr6UoUjQtdaiIlXPPijv58eEn+If9P+D+\nDb9vQwby5OIe5/GajvdD92APB1sPsb/lELub9tKbvtBDXV5QRnVhJRWxMipi5SSiCdxxBMuHTrWT\n8TIMen30eT30ZroJO1E60s20pRtpTTac3zfmFFMZngtA3C2jyE0M+zq90j68m9nFAnFjTN6kvEH6\nMt30et1kvDQhJ4xLiJATpsAppMApvOx7xPpSfRzvPMWxjpMc6zzBofZjDHoXvsYvdOKUhCooCVUQ\nd0tZvaCSm+a9Y9rrFXHCzCuey8G2w/x/e/6RqyrlLemX+wee2WggPUBfup+B9CAD6QHSXhptraM4\nUkRxpIhEND6hb056Bns40nGcw21HOdx+hFPJM+c/HBaEClhSspDa4jnMLaohFo5N+jxcx6XAKaKA\nIkpDVecD6ZQ3SH+kndPJk7SkztKSaqB+8Mj5fA4ucbeURKiMuFtGsVuC64QmXR9j8skCcWPMJdWf\n6aUxdYq2dCOD3sCI+7qEKHSLKXITFLsldA6E8Dxv0sH5SL2QR/vaJ9zDNphJ0djTxOnkGY51nuRo\nx3HOdDWcD2oAit0SSlw/8E6Eyok40Qkda7Icx+HGuRt56sTPebN5P7XFcymPlealLmZ4nufROZDk\ndNdZ6rvO0NLX9rZ9Xjzz8luex0IFFEWKKAoXEgsVsLxsKUUR/3Eqk2YwM0gqk6K9v4NzPU009jTR\nMXBhysuwE2JZ6RKuqhSuqljFic5T0/5hOPtbsAInQsSJMjeymDnhRQx6/XRlOujKtJNMt5PMtJHM\n+NfBwaXYLaE300V1ZAGVYZuW01x+Rg3ERcQFvgusB/qB+1S1Liv9LuDLQAp4RFUfzpVHRFYAjwIe\nsBe4X1UzIvJx4JNBGV9X1SdFpBD4PlADJIHfUdUmEdmaVb3VwKOq+gUR+QlQBQwCvapq0wEYkwe5\nhpZ0Zzo5N3iStnQjAGEilLiVFLrFxNwiwkRIeSkGUmkG0yn6vB76nSTdXpLuTCdN1HP82AGePfZL\nSt0aStwKKiLVVMVqKC8oozQWJ14YpbQ4SklxlHBo+KEW6UyagfQgaS9FOpMhQwbP8/Dw8DyPnkyS\n1lTD+ef+v8z553ubO8l4GXpTfbT3d9De3xkENY009baQ8TLnjxVx/Tm+l5UuYWnpIpaWLua1/Z2j\njpOf7HCFsSoIF3D9nOt4of4l3mjaw7sWbr4kxzWja+lt5ZXGN2jt88dTOzjUFFaRiMaJhqJE3Qiu\nE2IwM0B/eoCB9AC9qT56Ur3nb6YEqOs4lvMYDg5F4ULmFtVQVVhBTVE1lbEKwq7fy3wyeTqv30g5\njkPUiVHhxqhgDgApb4BkuoOuTBvJdDtdmXb29+2Cvl04uLzx6iJWlC1leekSlpYupniahncZM1XG\n0iN+DxBT1ZtE5EbgW8DdACISAR4A3gF0A9tF5KfAzTnyfBv4kqpuFZGHgLtFZAfwaWATEANeFJHn\ngE8Be1T1qyLyUeBLwB+p6pbg2MuAHwFfD+q5Elirqhe6nowx4zLVy6+D36t3dvAYZ1PHAX8oRoW3\niFD3HHq7Q3T3OrT2OfT3OfT3A1z0h9/J4BQlcYvbcePtZOLtNMdO0Zw5xdEU0Dt0HCAVxUtF/GwO\nuA64IcBN4Tlp/4fRf0Uc6PtVzrRtbw6/PeJGqIiVUxpNUFZQSmWsnLJYGaFgTGtyoIs3m/ZxNAis\nZoqhIQcNPY2c7T5HsrUAgFTT8K+FibwGzNgNZgZ5s2k/h9uP4AHz47UsjM9nXnwuBaGxfXvieV4w\nhGUAqVhJ92AP/el+Im6EiBsm7IZJRONUF1axq+HVcdXv0KmRX7+rFk7vyq1hJ0p5uJpyqgF/OEs8\nVEZT6jRNg/Uc6zjB0Y7j5/efW1TDqvLlSMVKVpUtpyhSOK31M2a8xhKIbwaeBlDVnSKyKSttDVCn\nqm0AIvIicCtwU448G4EXgsdPAe/Dv296u6r2A/0iUgesC477V1n7/tlF9fqfwB+rapeIzMFft/kJ\nESkD/kLieMwvAAAgAElEQVRVnxzLBTDGTJ+UN8iR3v100YKbKoQza2hvrKI1c3FvtUc0CokSj4JY\nhkgEwmEIhz3CYQiFi3CcIuZXreSqqtUMev20DDTR1NtI80ATPakuetM99IV76A/14nl+YJ7xIJNx\n8FIhyEQh4+Klw+C5RNwwBZEQBVGXggKHwgKXSMSho2uQsnA1zvl/rv+/4z9bPq+ME52niLgRCsMx\nisKFFIYLKQhFL8vx7I7jsKH6ap4+8Qteb9zD8tDGy/I8ZoPGniZ2BHPGJyJx3jH3WuYUVY+7HMdx\ngrm7Y6woWzoNNZ05wk6EedFlzIsuA+CGqys43nGKIx3HOdZxgmOdJ/hl/Q5+Wb8DB6iMVbCkdBGL\nEwuJhiJjPo7dM2Gmy1gC8RKgI+t5WkTCqpoaJi0JlObKAzhZPda59h1u+9A2AERkHVCiqj8PNkXx\ne90fBCrwe+Z3qWpjrpMqLy8iHJ74TR7V1Tbd12w02XZNxEe+kSnfr5vR6jea0eqfiMegL0JLMzR1\nJukqfwOnoId0RyW9detxMhGKiyGe8ChOQDwBRcUQi4Hrgt8bnjsIXLsszu3LhwKL1cPu87Mj297y\nvL8/Q3tHho7ONB0dGdo70rS2p2lpTdM9+Na8RYUOhfEMNVVzqakooqa8kKLYW/9Y/9qmJW87xngU\nxEb+459ITK6NJlJ+IjGXVV3LONRylI7iJuYUzM/5WplJ75F8v5+mQqLTvx6nOxvYevolPDyuq72a\na2vXEnInfyPiqO/ZzvG93ib7+h0t/1j3ecsxs15Ti2prWFRbw61sBPzpE3+w5yfUdzZQ39nAua5m\nmvtaeb1pD8vKF7K2Rqgprhz1GLPhtZZvdg2HN5ZAvBPIvnpuEIQPl5YA2nPlEZHMGPYdbvvQtiG/\nDTyc9bwBeCioV6OIvA4IkDMQb2vryZU0qurqBE1NydF3NJeVqWjX0RaiyPfrZrILZQxX/3QmQ93p\nDvYcbWXHvgbakg5OrJuCq36FEx4k3LaUmvQyStdBPDEYBNxvNTjyPZsX6p/sG/UaJpNvPcdEIkZR\n4QBFhVA7x8H/tRfG8zy6uz3a2j1a2zI0t2ZobsnQ0uTQ0nRhsZyiWJjKkhhVpTEqS2OsWVDytmOM\nR3/f4Ijpkyl7MuWvKV3FkdYTnOw5RCJTSZLh95sp75HZ8ns4mezjbPc5ttXvwANumXcj8+Jz6eke\nxL/laXIef+O5SZeRbbKv39HyF8Qio+5zsd1ZQ8l63zj8tvRiEqxKJFiVWElPqpdjHf6N1Idb/J/l\npUtYX72WglBBzmPMhtdaPs2W9+tk5PogMpZAfDtwF/CjYLx39l1GB4CVIlIBdOEPS/km/s2Yw+V5\nXUS2qOpW4A7geWAX8OciEgMK8Ie77A2Oe2eQfgeQ3QX1HuAvs57fDvwhcKeIxIGrg7oZY6ZBOpPh\n4Ml2Xj3YyKuHmkj2+H84XcehtKqP9OJXSIcGWRRZTfX8eTCGcdmXmuM4xOMO8TgsXHCh53HvkXa6\nkk7w45JMDnKqMcWpRn+hnZ+9cprSEofqKpeaapfqqhDlZQ6ue3kP5yiKFLG6fAX7WpXG1ElWsiHf\nVboinOlqYNuZnTjArfNvorZ4Tr6rNKsVhQtZG8wIc66nidca3+RIx3FOdZ1hQ9XVLCtdbEOzzCU1\nlkD8ceC9IvIS/nfGHxORe4G4qv6tiHwOeAZw8WdNqReRt+UJyvo88LCIRPED5cdUNS0i38EPtF3g\ni6raJyJ/A3wvGHc+ANybVae5qtoy9ERVnxKR94vITiAD/KmqNk/0ohhj3s7zPA6dauelvQ28dqiJ\nrl4/+C4pirBlwzzWraiioS3JL7r/iYFML3PDS6iOzMtzrccvGoWKSo+KSg//1wn090NX0iHZ6ZLs\n9IP0jk6PuqNpYBDX9YgnPBIlHolEhkSJR7TAv2H0crKmchXaepSGwZMMZPqJurl7CM3kHe04kRWE\nv5O5xTX5rtIVw3Ec5hbX8GtL3s2htiPsaT7ArnOv0dDTyI21m87fZG3MdBs1EFfVDPAHF20+mJX+\nBPDEGPKgqoeA24bZ/jBvHWqCqvYAH8lRp7fdtq+qn8l5EsaYCUv2DHD0TCdH6jvPB9+FMVi9KszS\nxSHm1Li4bjtJr40Xe7bTnemkIjSHeZHpuUnsUk3tl62gAAoKPCqr/DW5PQ96ehySnRd+OjscOjtc\nwO9dj0aDwLwkQzzhEY97hMc39PWSi7gR5kQWUT94hLr+3VxVeH2+qzRrdQ1083d7v4/nZbh1wc0W\nhOeJ67isrljJosR8Xjr7K04mTzOYGWTzvBsmtDiSMeNlrzJjzNukMx4nzyU5dKqdc63+/IDhkMNN\na+dQUttO7Rz3bUMx9rUcpC3dSNwtY3F0zaz+etdxoLjYo7jYY26whkg6BclgSMtQz3lLs0tL84We\ntYICj+J48FOcoTjuESucWT3n1eH5NAye4HDf66yKbSCcpwWHZrOMl+F7B35Ae38H11RdZcNRZoCi\nSBFbFtzM9jO7ONPdwPOnXuS2Be8kOsYpI42ZKAvEjTHnJXsGOHyqg7r6DvoG/N7fOeWFLJ9fyuK5\nCd67aeGwPdKtfe3sbTlIxClgecE1uFfg17qhMJSVe5SV+0NaPA8G+vF7zJMu3V0O3V0OrS0urS0w\n1HPuukOBuUdRsUdxKE1piUNxsZOXDzMhJ0xNeAFnU8c52r+XVbHrLnkdZrufnXiB/S3KmopVrK2Q\nfFfHBMJumFvm38jOs69yInmKn538JbcvutWCcTOtLBA35grneR5nW3o4cKKN+qZuAKIRl6uWlLNy\nQRml8ZH/CKW9DDvPvoKHx5LoasLODB9/cYk4DhTEoCDmUVWTPr99YIDzQXl3l0N394VedICjdf0A\nhEJQknBIJFzixQ6JuEO82CEedyksdIgVMG03iNZEFtKYqkd7X2N5wTpCjv2pmCqH247yxLFnKCso\n5Xeu+ii7m/bmu0omi+u43FS7iYgbpq7jGDsbXuWWeTaHuJk+9tvVmCtUKp3h2JlODpxoo73Lnz+w\nqjSGLCpj8dxEziXiL7av5QAdA50sL11CyeDo8/Fe6aJRiFZ4lFdcmEkmk4GeboeeHoeiSIzOTo+O\nTo+Ozgxt7emcZcUK8IPymENhzKGw0KG73yUSgUjUO78oUijsL5A03NSRwwk7EZbHruFQ32sc7z/A\n8tg1kz3tK1b2N0iD6UH+7fjP8DyPTTXrLQifoRzHYeOc9XQOdlHfdZaDbYe5ZcFN+a6WmaUsEDfm\nEpqOJeTHq28gxcET7ejJdvoH0zgOLK1NsGZxOVVl41v+uaW3lf0thygOF3FtzTUcq++eplrPbq7r\nL3IUT3isWnjhGwjP8/wZW7ozJLs8uro8uro9ens9evv8n+4efy70C3L/Wnccj1cLeohGHaIRh4Io\n/uOo439AiDq0d7uEw1BTuBontJsDPb+i1hEKo5HLYtz/THiP5bK7eR89qV6urlxNdVFV3uphRuc6\nLu+sfQfPHP8Fu5v2Udd+bNavUmrywwJxY64QzR297DpwjrrTHaTSHtGIy9XLKpBFZRSPcyU7gHQm\nzc6GV/HwuH7udURcG5Iy1RzHIRaDWCxE1QhfNqTTflDe1+dRd6qLgQGH1CCkUg6pFKRSkA4eu7gM\nDPhBfSYzXGn+nwWllcji+XhzTvL4my+SaZ1PYTTML984Q1m8gPJEAdVlhVSXxYL/CykssD8puTT3\ntnC4/Sgl0QRX2bjwy0JhOMY7513PL05t45G9/8SfXP8ZEtF4vqtlZhn7rWnMLHe2pZsnXzrBy/vP\nkfE8imJhNqz0x39HwhO/qVLb6ugcSLKibKlNvZZnoVAwfrwYWns8RlpAadXCC4FEKu0x0A8Dgx4D\nAx79A3DibDfpFJQwl670Bk57pyhceIJYehl9/RlON3VzvGH4FfJKi6MsqImzoLqYBdVxFlTHmV9d\nPOZhTrNV2suwq+F1AK6fc+2ULF1vLo2aoirWVa1ld/Ne/mH/D/nP63/vsvhmyFw+LBA3ZpZqaO3h\np9uP8fL+c3gezK8qZkltgqW1JZO+ya831ce+FiUairK+au0U1dhcauGQQ7gIirjweugNusmXxSqB\nSl7uEk46B9lwXYZ50WXctn4ePf0pWjr6aO7oo7Gtl6aOXpraejnb0s2+Y63sO9Z6vrxI2GXp3ATL\nF5SyYn4pfQMpYtEr60/PgRalY6CTFaVLbUjKZWhNxUr60/3sb1V2N+9jQ/XV+a6SmUWurN+GxlwB\nzrX28NPtx9m5vwHPgwXVce7evJRrV1Xxy91npuQYu5v2kfJSbKraYFN7zXKrYxs5OXAQ7XuVedFl\nOI5DcSxCcSzCojmJt+3f0zfI6aZu6pu6ONXYxZEznRyu7+DQ6Y7z+5QnCphXVcz8qmKqywsJTdPs\nLzNB50CSfa1KYTjGegvgLkuO47C8bAnaVsf/OfgY7X0dhC/6VmPzfJtZxUyMBeLGXEZGuhEt2TNA\nY2svO/b5Q1DmVxdz981LuU6qcafwq9SWvjaOdZ6gNFrC8tIlU1buWBw61T7qPqsWll2Cmlw5SsNV\n1EaWcHbwOM2DZ4CRb3YsikVYtbDsLe3Q25/i6NlOjpzuYOeBczS29tKW7GffsVbCIYfaymIWzYmz\nsGZ2jb/1PI9Xzr1BxsuwsWY90dDk76MY7T2Q79f/WN6jl6OSaAIpX8HBtsMcbDvM1ZWr810lM0tY\nIG7MZS7ZM8CbR1o4eqbz/BCUX9+8lI1THICDH1i81vgmANfVrLsiF+65Uhzt23P+ccKt4CzHea3n\neebW+9MpjqcHsLAgzNolFaxdUkFJPMpgKsO5th7ONHVT39zNqUa/99x1YP/xNjZJDdeuqprQTcQz\nyRtNeznX00Rt8RwWxOfluzpmkq6uXM3xzpPsb1GWliyiOFKU7yqZWcACcWMuUz19KXbXNVNX34Hn\n+TfK/dbtK9m0umbKA/Ahrzbuprm3hQXxWrtB8woSd0spdkvoSDfT0d9JaUHJpMqLhN3zN3MCdHQN\ncOJckhMNSd480sKbR1oIP+OwYWU1m6+Zy9qlFYTGOgn6DDGQHuDHh5/AxeG6mnV2g98sEAlFWF99\nNS83vMobTXu5ed71+a6SmQUsEDfmMjOYyrDvWCv7j7eSSnuUFEdZv7ySxbUJrl8zZ9qOm/ZS/Gvd\nv+E6LhuqbYGXK4njOMwNL+bIwB4OtB7ixtpNU1p+aTzKungl65ZXsmZROa9oIzv2neOVg428crCR\n0uIoN109l1vW1VJbWTylx54uz53YSlt/O2sqVlESfftY+tkoNQi9vQ4DAzDQ7zAw4DA44E+fCeB5\njj+fjwehkHd+4alIFCIRj8Iij2hBPs9gdEtLFlHXfpSTydOs7FlGjd18aybJAnFjLhPpTIZDp9rZ\nXddMb3+aWDTEptVVrJhfOm1LnWer69tNW387q8tX2ly6V6DSUBUxp5jjnae4puqqaTvOnIoiPnDT\nEu68cTHHG5K8uOcsL+87x9Mvn+Tpl0+yZnE5775uAe+tmLkBeUtvK8+d3EpptIS1s3AssedBfx90\ndrp0dzn+qrDdDv39k/895LoeRcVhiuMe8bhHaVmGwiKYKV8oOI7DdTXree7kVvY07+c9i27Nd5XM\nZc4CcWNmOM/z2H2khX9+vo6zLT2EQw7rlleydmnFpOYBH4+BTB8H+n5FYbiQqypn9mIkF98sVhCL\n0N83eP55vm9mu1w5jsOcyCJODBxg58l9FLQP/zqYqpUrHcdhaW0JS2tL+Oi7V/D64Wa2vl7PgRNt\nHDjRxveePsjKBaWsXFg646ZD/HHdkwxmUtyz4k4G0gP5rs5bTORmT8/z6Ex6nG3IcPhYiM4O921B\ndzTqUVaeoajYIxr1e7ajUf9xOAw4+JNkBv+n0zA46PeYDwT/93Q79PT4wX1X0uVcUHZBgUd5RYay\nigxl5UF5eVRVWEFt8RzOdp+jqaeF6qIRVtsyZhSjvpxFxAW+C6wH+oH7VLUuK/0u4MtACnhEVR/O\nlUdEVgCP4q82sRe4X1UzIvJx4JNBGV9X1SdFpBD4PlADJIHfUdUmEfkQ8E3gVFCFr6jqCyLyFeAD\nQRmfUdVdk7oyxswAxxs6+dEv6jh4sh3HgZULSlm/ooqi2KX9S3Sw7xUGvX4+sPhOCmy6witWRWgO\nZ5yjNKfq6c/0UuAWXpLjRsIhrl8zh+vXzOHxbUfRk+0cPdPJ64eb2V3XwpLaBLKojKrSWN7HYh9o\nPcTupr0sL13CO+Zcy/YzL+e1PhOVTns0nMtwqj7Nqfo0yeTQIlEhwhGPyqoMJaUZ4gmPomJ/mMl4\nhCNQEBsq88ICVAUxl96eQXp7HJJJh/ZWh/Y2l4azIRrOhnAcj4pKj5q5acorPPJ168DaCuFs9zn2\ntR5kS9HN+amEmRXG8tf8HiCmqjeJyI3At4C7AUQkAjwAvAPoBraLyE+Bm3Pk+TbwJVXdKiIPAXeL\nyA7g08AmIAa8KCLPAZ8C9qjqV0Xko8CXgD8CNgL/TVV/PFRBEbkOuA24AVgI/DiokzGXpdbOPh57\n4Qg79/l9QuuWV/KRLcs5XN8xSs6p15NOcrjvDQrdOLctuJldDa9e8jqYmcF1XOaEF3J6sI4j/W9y\nVeENl7wO5YkCblw7h1uvW8DuQ43ng/KjZzqpLClAFpWztDZBKA+reaYzaR479FMcHD6y6p68fygY\nr3Qajp1Icex4mtNn0ufHdkcisHhRiPm1Ln2Z7mkfKuK6UBz3KI57zK0Fz0uT7HRoa3VpaXZoaXZp\naXaJRDyq52SYMzdDcTz3arLTobqoiurCKs52n6O1r+2SHtvMLmMJxDcDTwOo6k4Ryb5LZw1Qp6pt\nACLyInArcFOOPBuBF4LHTwHvA9LAdlXtB/pFpA5YFxz3r7L2/bOsMq4Vkc8Au4A/DvZ9VlU94KSI\nhEWkWlWbxn4pjMm/wVSGZ391kideOs7AYIZFc+L8+3etYM2SCoC8BOL7eneQIc3VhTdNyTzI5vJW\nFZ7H2cHjHO57g1Wx6wg7+XlNFERCrFlczupFZZxt6UFPtnO6sYuX9jbwqjaxcmEpsrCM4sJLV7+t\np7fT0NPI5vk3sjBxeUxXmMlAW6tDc6Mf3GYy/lCakoTDwgUhFs4PMafGJRTyI+9Dp0YqbXo4DpSU\nepSUplm0BLq7HM41uDQ1upw5HeLM6RBl5RnmL0zjLfAu2QegtZXC1tPN7GtRfn35HZfkmGb2GUsg\nXgJk//VPi0hYVVPDpCWB0lx5ACcIlkfad7jtQ9sAngP+FTgGPAT8QbBvyzBl5AzEy8uLCIdDuZJH\nVV19ZdwFf6WZbLsm4rEJ5z3R0MnXHv0VZ5q7KY1H+dRvXMW7Ny16y42Yo5U/Wv3HW7/WgSaODxyg\nPFLF2ooNVFcnSHTmLqNghs77nF2vRGLka5DvcxitfqMZrf6TP/8Itd4iTvcd5SyHuCq+8S2pk30N\njif/0OOSRCGypJJkzwB7j7Sw/1gLe4+2su9YK8vmlbJuRRW1VcU4jjNtv7vbezt46vjPiEeL+dg7\nPkyiwL+heaT3y0RMRftmMtDWAucaoOkcpFL+75jCQo+1a2KsWhGlqjI0bEB7Kd4fox0jVgiV1f6H\niJYmj5MnoL3Vpb3NpfHMANdtiLFyefT8h4fpEo8vYl/rAU53naEvmmRh6eXx4StfLG4a3lgC8U4g\n++q5QRA+XFoCaM+VR0QyY9h3uO1D28Afh94OICI/AT4M7M5RRk5tbT0jJY+oujpBU1NywvnNzDQV\n7Zrs6ht3nq6eQX51sJFTjV04Dty+cQH33LKUoliElpaucZU/Wv3HW7+Xk78AYG3BO+nuHqCpKUky\nmbuM7JsiZ4qLb9Ycqf6Q/3MYrX6jGa3+U3H+Fc48znKSNzteZj6rcZ0LnRqTfQ2ONX8iHhu2rKuX\nlrN6USnHziY5eKKNI/UdHKnvoDxRwOrF5VyzuIxoZOKdMLn84/7H6E318e9XfYi+To8+/POYbHte\nbKLtm8l4nGvMsG9vhuYm93zwHS3wmD83TVWNP95bFhUDKbq6UsOWM93vj4vfr6MpKYWr10Gy06H+\nlEtzMzzzs25e2tnDdesjLFs6/AeKqbK6fBVNPTv5wetP8rtrf2vajnO5s7gp9weRsQTi24G7gB8F\n4733ZKUdAFaKSAXQhT8s5Zv4d14Ml+d1EdmiqluBO4Dn8YeX/LmIxIAC/OEue4Pj3hmk3wFsExEH\neFNE3qmqp4H3AK8CLwN/JSLfBBbgB/7NYzg3Y/ImlfbnA997tJV0xqOmvJD7P3TNjFnmu2nwNGcH\nj1Mdns/cyJJ8V2fKzNYluC+liBNlacFa6vp3c2rgMIsLLkzRt/WN+jzWzBcOuaxcUMqK+SU0tvVy\n8EQbJxu72LG3gT1HWrh1/Tzede18Kkunprf6WMcJdja8wvx4LZvnX/px87l4nkdzS4ajx9IcO5Gm\np9cDQkQiHrXz01TXZEiUeDNmasDJSJR4rF6bprasmL0HUujhFC9sH+DN/Q4bN0RZON/FcZwJzRoz\nkvnFtZRGS3jl3OvMLaohHh1+Ws3xrERrrixjCcQfB94rIi/hzzr0MRG5F4ir6t+KyOeAZwAXv7e6\nXkTelico6/PAwyISxQ/iH1PVtIh8B9gWlPFFVe0Tkb8BvheMOx8A7lVVT0TuA/5FRHqB/cDDqjoo\nItuAHUEZ90/BtTFm2pxq7OJXBxrp6h2ksCDERqlhaW1ixgThnufxZs+LAKwr2nzZ3XRmpt+q2HUc\n6X+Tg32vsCi6CseZeStfOo7DnIoi5lQU0d07iJ5q5/jZJP+28wRP7TzB1csquXV9LetXVBGe4M2d\nGS/Djw79BIB/t+oe3BlwHdraMxw9nuLo8QuznUSjsGpFiGhxH6VlsyP4Hk4i4XLT9VGuvirM67sH\nqTua5mfP91NT7XL9xqkfVuM4DmsqVrGz4RUOtx/l2hpb7MyMz6iBuKpm8MdhZzuYlf4E8MQY8qCq\nh/BnN7l4+8PAwxdt6wE+Msy+zwLPDrP9q8BXc56IMTNAV+8gu/af43RTN44DVy0pZ92KSqKTuF9h\nOpwerKM1fY4F0ZVUhOf+/+zdeXzcV33v/9d8Z0Yz2hdbsuV9P3biNbaTOHvAISQsSQPcH+QCJTQF\nChS47e/20palvZfe0l4oF1q20NBAAy2FkkAC2YAsthPHjrfYsX28b/ImS7J2zfq9f3y/I8uylpFk\naST5/Xw8/JD03ebMHH3lz5z5nM/JdXNkFCoMljAjbyFH43s4Ht/HjMjoXrimMD/MNQsq+eTvLeHV\nPWd4aftJdh6qY+ehOooLwty4uJobl0xmauXA3gyvr9nIseYTrJ60gnlls4ep9f3raIfasw5v7Gin\nocELvkNBmDMryJxZQaZOCRIMBth3vD1nbRxJxUUOt9wYYcnVabZsT3DseIonn45RNSnIrDmpy7qC\n54ziqWyv3cnBxiMsmbiIkDO66trL6KbfFpERkHZd7NHzbNtfSzLlMrmigGuvqqKsaPSt55x2U+xq\n20AAh8X5a3LdHBnFrs6/jmNxyxvtG5mWN/+iXPHRKi8c5OalU7h56RRqaltY9/opXt51mqc3HePp\nTceYOrGQaxdVce2iSUyqKOjzWo2xZn5x8GnyQ1Hum//2EXoGHtf1qofUnXOoPxegtdUbiXcclxnT\nvOB7+rQg4fA4HfrOUnmZw9rbIpw+m2LjpjhnzwSpO+cwY1aK6qnpy1KHPOgEmVc2m111eznSdIx5\nZXOGflG5YigQFxlmDc0dvLLrDOcaO8gLO9x41STmTCkZtekem1qepSXdSGVoKrWJE9QmTnTuC9Xk\noHaZjFqFwVLmRBZzMPY6R2J7mBNdnOsmDcjUyiLe++b5vOvWuWw/cI5Xd5/h9YN1PLbuMI+tO8yM\nSUWsmF/J4tkVzK4uuaiCEcB3X3+EjlQHq6qW8XrtG8Pe3o6Yy7mzAc6fd2iou7C6ZSDgrTw5oTLN\ndcuKiURG59+WXJpcFeSdd0dZt6mZo4eDHD4Y4vQpl3kLkpSWDb0G+byy2bxRZ7ENB5lbOnvU/n2X\n0UeBuMgwSaXSvH6wjl2H63FdmF1dzOpFVaNuOe6uEm6cU4nDOASpDufuY/Yr2eWeTDbcFuVfy5HY\nbnZ3vMrMyEKCgdH7+92bcMhh9cIqVi+soq0jybb9tWzee5Y3Dtdz7EwLv1h/mMJoiKtmVXD17Arm\nTi2lkRqONh+nIlrO3GEYAXVdl7Y2l3P1ac6eTXPydIq6ehfw8pyDIZfKqhQTJqYpq7iw7PvRsyO/\n1sBY4TgBqqemmViV5ujhIKdPOuzcHmbS5BSz5qYGvDpoV/mhfGYUT+No83HOtNUyubDq8jVcxrWx\n9xdTZAw4Xd/GK7tO09yWoDAa4vqrJw049zQX9rRvIkmC6vBswgEtZS/9y3cKmRddhu3YwsHYThZE\nV+S6SUNSEA1x45JqblxSTVtHgt1HGth1uJ5dh+vYvPcsm/eehUCK6JKXCUQgv24xh1IpiooCFBUG\nKMgPXDJy3hfXdWlvd2lu8f41NaU5V5+mri5Ne5dKhI4Dkyc55OXHKSt3KSrO3fLuY104DPMWpJg0\nOc1+G+TM6SD1dQ5z5qWYP4QFgRaUz+Vo83H2nT+oQFyypkBcxPebg+v6rPmbTfmpWCLFFlvLgRON\nBIBFM8tZPn8i4dDo/x+zKVXPvo5t5AWiTA7NyHVzZAwx0ZUcjO1kb/tm5kSuJjRO3sQVRMOsWljF\nqoVVuK7Lqbo29hxt4OVzL3I63Ery9AwOHCvkAPHOcwIBKCwMkB8NEApCMAShYIBgyFuAJplwSSQh\nkXBJJKC11SWVvvSxCwsDzJzhMLHCYeJEh0mVDqFQgH3HL29d8itZcYnL8pVJTp5wOHYkiN0TorUx\nxg3X51FUOPC/2RPzK5gQLaem5RQt8dZeSxmKdKVAXOQycF2XLbaWX64/THssRVlRHjcsnszEsvxc\nN8Zrj5EAACAASURBVC0rruuyrfUFXNJMD4+NSXcyekScfEz0Gt5o34ht38LVBeNvkm8gEGDKxELS\nkUYeb9pJWV4pt16/lKaFQRrOp2lpdWlpcb2vrS519WnSPQTYGaGgNzJbVuZQXBSguDjgfS1yqKhw\nyI8qx3gkOA5Mm+Hl1x/cF+LESXjsiQ5WXxPGzA8NeHR8ftlc6lTKUAZAgbjIEDU0x3j0Wcu2/edw\nnAAr5k/k6tkVA/p4OtdqEgc4mzzO5PBMSoMTc90cGYPmR1dwqGMXezu2MCOykOJgea6bdNml0ike\n3fMfpN009y98Fw0d5ymYBJMn9fzGNZ12SaUgmYRkykslCYcChEKMqb8PV4L8fLh6aZJAvIhNr8V5\n+dUEh4+kuHFNHiXF2Y+Oq5ShDJR+Q0QGKe26vLCthp+9cJCOeIqFM8pYOLOcksKx9bF80k2wve0l\nHIIsL7j1oiopIr051LHzkm3V4Vkciu9iQ/MT3Fn6gXFXOeK5Yy9wvOUk109exdUTFrK+ZmOfxztO\nwAu+w+CtbSejWSAAC+aFmDrF4eWNcY7XpHn8iQ5Wrghz1cLsRsdVylAGSoG4yCDUnGvlB0/t5UBN\nIwWREB+6ayE3L63mxR0nh3TdXCwPvqd9E+3pFhZGV1McLFcgPsr1V1Ull8qClZQ4E2hK1/mL/JgB\nXyMX90A2j9+YPMdzTc9RmlfMu0a4ZriMrMICh7W3Rzh0xKs9/uprCQ4fTXHzmjzONDX1ee6C6WXM\nK5vNbpUylCwpEBcZgEQyza9eOcKvXjlKKu2yamEV/3XtfEpH4cI82ahPnsF2bCXfKWJR/upcN0fG\nuEAgwIy8BbzR8So72l6iOjyLsDM27w24MOrvumn2xrbgkmZZ5WK2nn09xy2T4RYIBJg7O8SUyUFe\n2RTnyLEUj/+qg+kzHaZOSxPoI1slP5TPdJUylCwpEBfJ0v4T53nkqb2cqmujvDjC+9+ygBXzK3Pd\nrEFLugk2tTyDS5rVhXcQCgyhiK6IL+LkUx2excnEIXa1v8KKwtty3aQhO5k4Qlu6mYrgJKYWVee6\nOTKC8vMDvOnWCIePJr2A/FCIc7Vp5psUhUW9LwSkUoaSLQXiIv2Ix11e25Zg776tBIDbr5nKu2+d\nS35kbN8+O9s20JxuYH5kOZPCKlcol8+k0AyaUw0ciO1gat48qsLTct2kQWtK1XM6eYS8QJTpeQty\n3RzJkdkzQ1RPDvLciy3UngmyfUuA6TNTTJuR7rGee/dShiK9Gf3FjUVy6OjxJD9/ooO9+5JUTyjg\nz9+/kg+8xYz5IPx0/CgHYjsoCVawpODGXDdHxhkn4LC68A4COGxs+TXt6ZZcN2lQEm6cw7HdQIA5\neVfrU6MrXDQSwCxKcdXiBOEwHDsSYseWEC3NPeeALyifC8D+84dGspkyxoztaEJkmLS1uWzc7OUF\nOg6sWBrmY2+5dkwszNOfWLqdza3PEcDh2sI7x+SS5DL6TQhXs6zgZra3vcgrLb/mtuJ3jan69K7r\nciS2myRxpobnUhgsHZHHzfVk3Fw//lANtf3ZnF8x0eWa0gSHD3qrcm7fEmD6jDTTZ6UuOm568TS2\nnfVKGXYkY0RDY3e+hAyfsR9ViFxGruti9yf5+S/bOXIsRVWlwz1vi7JiWXhcBOFpN8WrLU/T4bay\nOP96ykPKXZThMy+yjBl5hrrkKXa0rct1cwZkX8dWmtL1lDgVTNJKs9JNKAzzF6a4emmCSASOHwuy\n/bUQZ2svBOPBgMO8stkk0gk2nd6aw9bKaNbvUJgxxgG+BSwDYsCD1toDXfa/A/gCkAS+b639Xm/n\nGGPmAY8ALrAL+IS1Nm2M+UPgo/41vmStfdIYkw88ClQBzcDvW2trjTFvBr4EJICzwAettW3GmF8A\nE/3t7dbau4b64siVpfZckt88H+NsbZpwGNZcG2bhgoGvrDZaua7L1rbnOZM8RnV4Nia6MtdNknEu\nEAiwsvDNnE+d40BsBxWhScyMLMp1s/p1On6E19s3ECKPWZGrxs3fALn8yitcVqxOcPRQkFMng/zq\nmRhXLwpxzbIwoVCAeWVz2F2/j98df4mbpl6H01e5FbkiZfMbcS8QtdauAT4LfDWzwxgTBr4GvAW4\nFfiIMWZSH+f8A/A5a+3NeKsb3GOMmQx8CrgRuBP4W2NMBPgjYKd/7A+Bz/nX+BZwr7X2FmA/8KC/\nfT5wk7X2NgXhMhDtsSQ//s0+/u2nTZytTTNrZpD73hllkQmPq/+Anzv6Aodjb5AfKGJSaDqHY29w\nqGPnJf9ELqdQIMwNRW8jFMhjc+tvOB7bl+sm9akxeY5XWp7CwWFuZAnhwNhaoEtGXigEcxekWLI8\nQVFRgF27kzz+ZAenz6TID0WZXTKD2vY6ttfuynVTZRTKJjn0JuBpAGvtRmPMqi77FgEHrLUNAMaY\n9cAtwJpezlkJvOh//xReAJ8CNlhrY0DMGHMAWOo/7t93Ofbz/ve3WWvPdGl/hx/8lwFPGGPKgC9b\na5/s60mVlxcQCg0+X7GysnjQ58ro4Lou67bX8PAvd1HfFKO01OH2mwuZOaPnCVnZ9HlxUfRyN3NA\nemvjy8de4xeHniLPiXJ1yUrynMG1s7i47/Mi0dE5mW20tisXRqoPu94LxVTzlsh7eK72p2xsfYpg\nJI0pWn5ZHyNbfd3H59sb2dD6BEni3DbhncTd2KWP2c/rN1T6XR27r0HVZLh5dRmvbGpn244Ofv1s\njGVLIixdcTWHGo/yQs063nLVDeNqgGcgFDf1LJtAvARo7PJzyhgTstYme9jXDJT2dg4QsNa6/Rzb\n0/bMNqy1pwCMMfcBt+MF6JV4o+5fByqADcaYTdbas709qYaGtiyees8qK4uprW0e9PmSe6fqWnn0\n2X3sOdpAOORw782zmbroPO3tMZqbUz2ek02fN7d0XO6mDshPn9t7ybaa+EE2tjxFiDzm5S3FjQeJ\nkRjU9Zub+35+sY7BXXc4RaLhUdmuXBmpPmzm4scpZCK3Fr+Ll5ofZ0P9MzS3t2Hyrxn09YuLooO6\n33q7j+OpOP9363dpTTWxOH8Nle7sHj8h6u/1G6or/Xd1rN+vHR0xVix1mFodYd3LcXbsjHHwUIDZ\nq+dzsGEfL+/fzoLyeblu5ohT3NT7G5FsAvEmoOvZjh+E97SvGDjf2znGmHQWx/a0PbMNAGPMfwPe\nDbzVWtthjDkNfMdv11ljzDbA4OWQi3SKJVI8+fIRnn71GKm0y9K5E7j/jgVUleWzo2l7j+ck0kmO\nNZ/gbNs5km6SZDpJKp1mUkElc8pmMbN4GuHg6BzBOdjxOlvbXiBIkBuK30ZrqrH/k0SGSXmoittL\n3s2LTT/n9fZ1tKQbWFpwE+FAbqtJxFJxvrfzhxxtPs7MvEUsjGqVWRmaqsog97w9yvbXE+x8I8nu\nzRVEr4anDj9/RQbi0rtsAvENwDuA/zDGXA90HSLYA8w3xlQALXhpKV/Bm4zZ0znbjDG3WWtfAO4C\nngc2AX9jjIkCEbx0l13+497t778LWAdgjPlLvBSXtdbadv+6a4E/Bu42xhQBi/22iQD+RMV9tfz7\nbw9Q19RBRUmE+9cuYMX8ib1+TFjfcZ6D5w9zpPk4yXSyx2PAq5k8IVrO9OKpTEmvJt8pGq6nkTXX\nddnV/jJ7O14jEsjnpuJ7qAhN4lBKOeCSWyXBCt5U8h7WtzzBodguTieOsqrwzUwKz8xJe9qT7Xx7\nx79wsPEIiycsxKTffMWmDsjlFQoGWLUij1kzQmzdPI2zTeXsYz+/3rGTu5Yu1u+ZANkF4o8Bdxhj\nXsabYPmAMeZ+oMha+5Ax5k+AZ/Amfn7fWltjjLnkHP9afwp8zxiThxco/8xamzLGfAMv0HaAv/RH\nub8N/MDPO48D9/u54F8EtgJPGWMAfmKt/bYx5k5jzEYgDfyFtfbc0F8eGQ8On2riJ7/dz74TjQSd\nAHdfP5N33DCLSF7PcwSS6SSbz2znSNMxAApC+Swsn0914SSCgSBBxyFAgIbYeWrb6qhtr+Ncu/d1\nK68zMTSV6XnzmZY3n6hTMJJPFfDqhG9te54T8f0UOaXcXHwvRcGyEW+HSG8Kg6WsLXkve9o3s7dj\nMy81P87syNVclX8dBc7I5ZG2xFv5px3/zPHmGlZWLeP3r3ov614/PWKPL1eGiRMcvvChVfxgQxtb\nk7/mF/Y37NgZ5/61C5g5WXnTV7qA67r9HzUO1dY2D/qJK9dpbKhr7OA/XzrIxje8ub3L503kPbfP\npXpCYY/H72jaTk1dLetrXqUx3kRFtIzFExZRXTgZp5+Ri/ZkB8ebazhaX8u55El/a4Cq0DSm5y1g\nWt68QU+QzJbrupyI72db2wvE3HYmhKq5sejtRLq8GRhqVZQF0/sO6EfjYiBjPef0chstfTgnugSA\nhuRZNrc+R2PqHAEcZkUWYaIrKQ6W93n+YHPEb1s+FYDTrWf53q5/5XTrGW6ovpb3LbwPJ+Dwwvaa\nzmN7ul/6e/2GajTeQyNprN+vvf1+3DT1elzX5X++8lXOttfS8fpNECvk5mVTuO/WOZQUjO/qPIqb\noLKyuMdAQkvqybjT3BbnqVeP8dstJ0gk08yYVMT/96b5LJrZ93/sh+qP8cLRjSTTSeaXzWFF1VKC\nWdZ8zQ9FWVA+lznJ22hLN3Mivp/jsf2cTR7nbPI4W9ueZ1J4BtFAPmXByl5Xs8wEJwPVnGpgR9s6\nTiUO4xBkaf5NzI+uUM1aGfXKQ1WsLXkvR+N72dv+Godjb3A49gZTwnOYFbmK6vCsy7oiZ9pN88Lx\n9fzy0NMk0klM+TxmFE/l5ZObADjUcWUHwjJ8AoEA75j3Fh7e9SiL1pzm/K6lvLTjJJv3nuGt187g\nLatn9PpJrYxfCsRl3GiPJXlm0zGe3XycjniK8uII990yhzWL+x/RXlfzCr85tJ5gIMia6tXMKpk+\n6HYUOMUsiF7Dgug1tKYaOR7fz/H4Pk4njgAQYC9FTiklwQmUBCvIDxQNKlfQdV1OJ45yILad04mj\nAFSGprGq8M3DlopypY/WjQejsQ+dQJDZkauZlbeIE4mD7G1/jZOJQ5xMHCJEmPLQJMqDVRQ5JQT8\nN5cRwkxl4YAepyV1nq9v+yUHzh+mKFzIdZNXMr146mV9Lv29vsM9oi6j24rKJcwpncWhxv188vdu\no+bwFH654QiPrTvM77bW8M4bZ3HzsimEghpEuVIoNWUQ9BHL6NIeS/LCthp+vfEorR1JigvCvG3N\nLG5fMYVwFrXiN9S8yo/tf5IfinLbtBspi5QOui3J2t4D+OZUA6+3reN88hxt7oXfnyAhCp0SCp0S\n5kSXUBQsI98pumQhEdd1aUmf51zyJHXJU5xNHKc13QTAhFA186MriKfaNQGom7H+UfeVyHVd2t0W\n6pKnqU+eJumX2wwSpjQ4gdLgBCYUTGS2038t8rSb5nTiCIdiOzmVOAq4LK9czHvNfezoYYGVoQbS\nw33+eDfW79e+UlMyjjYd5+9f+0emF03hz1Z/ilg8zdOveoNIsUSKqrJ87rl5NtcuqiLojI+AXHGT\nUlNkHGppT/Cb147z2y0naO1IUhAJcd8tc1i7ahrRvOx+tV8+uZkf2/+kKFzIWxfcSjg5fHncxcFy\nqsOzqQ7PJuHGaU7V05iqpzXdSFO6nqZ0PadajnQeHyKPiBMl5SZJuonOYCTDIciE4GSqwtMpcIpJ\npDsUhMu4EAgEKAgUU5BXzLTwXJrSDZxP1dKYOkd96jT1qdMcjsMbzhYmhKopcSrIc6JEAlHCgQgd\nbistqUZa0o3UJU7R7rYAUBGcxL0L13JN1VLdK5IzM0ums3rSNWw+s5VXT29lTfUqfu+WObxp5TSe\n2HCYF7ef5HtP7OYX6w5z95qZ3LB4skbIxzEF4jLm1Dd18Mym47y4o4Z4Ik1Rfph7b5rNm1dNo3AA\nK7JtPPUaP977MwrDBXxqxUc4lz4z5MU6sp0MGQ7kURGaTEVoMgBJN0FruomIU0Bbuon2dAvt6Vbi\n6Q5CgTyiTiGhQJiUm6LIKaUoWEp+oLDzY3qR8SoQcDpHwV3XpS3dTFO6nnaaaUu2cCK+v8/zQ4E8\n5kaWMieymLJQJSsnXd5UFJHBuGfuW9leu5MnDj7FisolREMRSgvzeP9bDHdeO4OnNh5l/c5TPPLU\nXn654TB3XTeTm5ZWEwkrh3y8USAuY4Lruuw/0chvtpxgq60l7bp+DvgMbl02ZcATXDad3sqje35K\nQSifTy3/CFOLqjnXdGaYWt+/UMD7yL2/yZpDrXoiMpYFAgEKgyUUBkuIRMNMcQ1t6SZa003E3A7i\n6XbiboyoU0CRU0phsHTQczBEhlN5tIy1M27hqSO/5bljL/COOXd27qssy+eDb13IO26czdOvHuPF\n7TX86Ll9PL7uEDcvm8KbVkxlYll+Dlsvl5MCcRnVYvEUG3ef5rdbajhR6328PK2ykDtWTWfNID+u\ne+30Nn64+ydEQ1E+ueJBphVP6dx3pedniowlXmDuBdxjhf7GSMbaGbfxyqnXePbo8yyqWMC8stkX\n7S8vjvC+tfN525qZ/GbLCV7cXsPTrx7jmU3HWD5vImtXTmPhzHK90RzjFIjLqJN2XfYfP8+GnafZ\nbM8Si6dwAgFWL6zizSunMX9a6aD/8Gw5s4NHdv870VCEP17+IDOKp13m1g+NRrxFsjeY+yVUc3wY\nWiIycNFQhA9d9T6+sf0hHt71KJ9d/WlKIyWXHFdSmMd9t8zhHTfMZNOes/xmywm27T/Htv3nqCyL\ncuPiam5YPFmj5GOUAnEZNU7VtfLq7jO8vOs05xq9XO0JJRHuXD2dW5dPpbw4MqTrv3Z6Gz/Y8xMi\nwQifXP4gM4dQolBERGSo5pfP4d65d/PzA0/y8K5H+fSKjxJ0ek61DIeC3LjEC7oPnmzi+a01bNl3\nlsfXH+bx9Ycx08u4YfFkViyopCg/+/lSklsKxCVnXNfl6Jlmtthatu6r5VRdGwCRcJAbF0/mhiXV\nmBll/dYAz+Zxnjn6PE8ceppoMMonlv8Bs0pmXI6nICIiMiRvmn4zhxuPsq12J48f/DXvmv+OPo8P\nBALMm1rKvKmlvD+2gC22lg07T2GPn8ceP88PnraYGWWsNJWsmF855EEsGV4KxGVEtbQn2Hu0gV2H\n63njcB11TTEA8kIO1yyoZOWCSlYsmJh1+cH+pNIp/s3+nFdObaY8UsbHl32YKUWTL8u1RUREhioQ\nCPD+Re/hZOsZfnd8HRPyK7ht2o1ZnZsfCXHT0mpuWlrN2fPtvLb3LFtsLXuONrDnaAOPPruP2dXF\nXDWrgqtnVTB3ainhkKptjSYKxGVYtbQnOFjTyIGaRnYfqefIqWYyKykVREKsuXoS1yyoYvGciste\nlul8rJEf7v4JtuEAM4qn8rGlD/SYfyciIpJL0VCUjyz5AF/b+h1+uu8XnG49y3vmv7PXNJWeVJXl\nc/f1M7n7+pnUN3WwdZ/3afP+E40cPtXMr145Sl7YwUwvx8woY+6UEmZVl6gkYo4pEJfLpj2WpKa2\nleNnmzl0sokDJ5s4U9/WuT/oBJg/rZSrZ1dw1ewKZk0uHpZVw1LpFC+e2MCTh58lloqzZOJVPHD1\n/USCef2fLCLSB1U9keEyuXASf7bqU3x35yOsq3mF061neHDxByjKKxzwtSpKoqxdNZ21q6bTHkti\nj59n9+F63jhSz85Ddew8VAd4/y9Pqypi3pRSZkwqYvqkIqZOLMxqVWq5PBSIy4C4rktLe4Iz9e2c\naWjjTEMbNbWtnKhtofb8xYvh5EeCXD2rnLl+LtvcqaXkR4bvVy7tptnXcJCfH3iSmpZTFIYKePfC\nd3J99SocLXwjIiKj3IT8cv7kmo/zr3t+wvbaXXx589e5c9abuG7ySvKCg5uAmR8JsXzeRJbPmwhA\nQ3OMAzWNHPT/HT3TzNHTF5afdwIBJlXkM72qiEnlBUyqyPe/FmgS6DDoNyoyxjjAt4BlQAx40Fp7\noMv+dwBfAJLA96213+vtHGPMPOARwAV2AZ+w1qaNMX8IfNS/xpestU8aY/KBR4EqoBn4fWttrTHm\neuDr/rHPWmv/2m/HF4G3+ds/Y63dNMTX5oriui7xRJrm9jit7Uma2+M0tyWob+qgvjlGQ1OM+qYO\nzjV20BZLXnJ+UX6YRTPLmV5VxLTKImZNLmbKxEIcZ/jrm55tO8erp7ew6fRW6jsaAFhTvZp75949\nqJEEERGRXImGIvzB4vfz9JHf8syR3/Hv9uf86tCz3DrtRm6YsnrIKZblxRFWL6xi9cIqABLJFMfO\ntHD8bAvHa72vJ862dBZQ6KogEqKiJEpFSYSKkigTSiKUFkYoKghTnB/u/JofCam+eZayGZ68F4ha\na9f4QfBXgXsAjDFh4GvAaqAV2GCM+SVwYy/n/APwOWvtC8aY7wD3GGNeAT4FrAKiwHpjzHPAHwE7\nrbV/ZYx5L/A54NPAd4B3AYeAXxljVgAB4FbgOmA68J9+m8YN13VJpV1SKZdkOu19TaW9bWn/e39b\nLJEinvC+Zv7FEyliibT/NUVbR5KW9sRF/xLJdJ9tiISDVJREWDC97MI75PJ8Jk8opKwob9huOtd1\n6UjFaI630JJopSnWxMnW0xxvPsnx5hoaYt5HxZFgHtdPXsVNU69ndqmqooiIyNjkBBzunn0HN065\njhdObGBdzSs8efgZnjz8DBOjFcwuncns0plMzK+gJK+YkrxiisKFA8opzwiHgsz1P7XOcF2X+qaY\n/8l3O2fq2zhT30ZtYwfnGts7F9jrTdAJUJjvB+f5YSrK8nFcl7y8IJFwkGg4SF44SCQvSCTsEPG/\nzwsFCToBgsEATiBAMOgQcgL+NqdzX9AJEHSczuPGsmwC8ZuApwGstRuNMau67FsEHLDWNgAYY9YD\ntwBrejlnJfCi//1TwFuAFLDBWhsDYsaYA8BS/3H/vsuxnzfGlAARa+1B//GeAdbijbo/a611gWPG\nmJAxptJaWzuwl2N47T3awMO/2k0s4QW8ruuSdr2vrv+z6+L/cy98HcY2RfOCFOWHmVZZ2OWmyaOo\nwLt5yosjVBRHmFAapWCE3uHurd/Po3t+Skeqg2Q6SSJ96Qh8RnFeEYsnLOSaqmUsr1qiPHARERk3\nSiMl3DP3Lu6ceTuvnHqNvfX7ONR4lM1ntrH5zLZLjncCDmEnRNgJc+OU63jn3LcO6nEDgQATSqNM\nKI1y1axL97d1JKlv6qCuqYOm1jgt7Qma2xO0tCX87+O0tCU43xKj5lwrDOPcikAAgo6DEwACXtsD\n/vYAAe+rH7uY6WV84r4lw9aWwcgmEC8BGrv8nDLGhKy1yR72NQOlvZ0DBPxgua9je9redVtTt2Pn\nAB1AXQ/X6DUQr6wsHlJEWVlZPKhzbl6lkdr+VFZew83mmhF/3LWVN7N27og/rIiMJstz3QCRnhQz\nvfou4K5cN6TTzFw3YJzIZgZbE9A16nT8ILynfcXA+T7OSWdxbE/bB3Js1+0iIiIiIqNSNoH4BuBu\nAD/fe2eXfXuA+caYCmNMHl5ayit9nLPNGHOb//1dwDpgE3CzMSZqjCnFS3fZ1fUamWOttU1A3Bgz\n1xgTAO70r7EBuNMY4xhjZuAF/ucG9lKIiIiIiIycbFJTHgPuMMa8jDcp8gFjzP1AkbX2IWPMnwDP\n4AX137fW1hhjLjnHv9afAt/zg/Y9wM+stSljzDfwAmoH+EtrbYcx5tvAD/y88zhwv3+NjwE/AoJ4\neeGvAhhj1uG9CXCATwzlRRERERERGW4B1x3OqYAiIiIiItITrXIiIiIiIpIDCsRFRERERHJAgbiI\niIiISA5kM1nziuBXYTkB7Pc3vWKt/XO/6svXgSTe5NC/9o//IvA2f/tnrLWbjDETgR8D+cBJ4AFr\nbZsx5h3AF/xjv2+t/d5IPjfpmzHGAb4FLMNbHOpBa+2B3LZKemOM2cqF9QQOA38DPAK4eBWXPmGt\nTRtj/hD4KN599yVr7ZPGmHzgUaAKb72B37fW1vZ2n8vwM8ZcB/ydtfY2Y8w8hqkve/qbPaJP9ArT\nrV9XAE9y4f/Xb1trf6J+HTv8ldS/D8wCIsCXgN3ofh0yjYhfMBfYaq29zf/35/727+BVbLkJuM4Y\ns8IYcw1wK3Ad8F7gm/6xXwB+bK29GdgGfNT/5f0a3iqitwIfMcZMGrFnJdm4F4haa9cAnwW+muP2\nSC+MMVG8hcEy9+kDwD8An/PvuwBwjzFmMvAp4Ea8Mqd/a4yJAH8E7PSP/SHwOf/Sl9znI/rErlDG\nmD8D/hmI+puGpS/7+Jstw6CHfl0J/EOX+/Yn6tcx5/1And8vbwX+Cd2vl4UC8QtWAlONMc8bY35t\nPCVAxFp70F8R9BlgLd4vzLPWWtdaewwIGWMq/e1P+9d7yj92EXDAWttgrY0D6/Hqrcvo0dlv1tqN\nwKrcNkf6sAwoMMY8a4z5nT+ashJ40d+fue+uBTZYa2PW2kbgALCUHu7RPu5zGX4Hgfu6/Dxcfdnb\n32wZHj3169uMMS8ZYx42xhSjfh1rfgp83v8+gDdSrfv1MrgiA3FjzB8YY3Z1/QecBv7WWns78L/x\nPkIp4cJH4OB9nFLqb2/sZ3t/x8ro0b2PUsYYpW2NTm3AV/BGWjJrCgT8P+Iw+Hu0p/tchpm19j+B\nRJdNw9WX+js8gnro103Af7fW3gIcAr6I+nVMsda2WGub/TdRP8Mb0db9ehlckcGGtfZh4OGu24wx\nBXjv8LDWrjfGTMHr/OIuhxUD5/EWGOppe5P/fXsP27ofK6NH9z5yrLXJXDVG+rQP7xMmF9hnjKnD\nG5XJ6O++67pd9+jok+7y/eXsy97+ZsvIeMxam3m9HwP+EXgJ9euYYoyZjtd/37LW/tgY8/dddut+\nHaQrckS8F18EPgNgjFkGHPc/VokbY+b6kznvxFsBdANwpzHGMcbMwAvczvnb7/avd5d/7B5g9JjO\nFQAAIABJREFUvjGmwl9R9Ba8FUBl9OjsNz/VYWdumyN9+DB+Dr//ZrkEeNYYc5u/P3PfbQJuNsZE\njTGleCliu+jhHrXWNtHzfS4jb9sw9WVvf7NlZDxjjLnW//7NwBbUr2OKP7ftWeB/WGu/72/W/XoZ\nXJEj4r34MvCoMSYzS/dD/vbMx99BvJylVwGMMevwAmoH+IR/7JeAH/gzhs8B91trE8aYP8HLfXLw\nqqbUjMxTkiw9BtxhjHkZL/ftgRy3R3r3MPCIMWY93kz9D+Pda9/z3+juAX5mrU0ZY76B90fdAf7S\nWtthjPk23j26Hm/U5X7/uj3e5zLi/pRh6ste/mbLyPgj4B+NMQm8NNCPWGub1K9jyl8A5cDnjTGZ\nXPFPA9/Q/To0WuJeRERERCQHlJoiIiIiIpIDCsRFRERERHJAgbiIiIiISA4oEBcRERERyQEF4iIi\nIiIiOaBAXEREREQkBxSIi4iIiIjkgAJxEREREZEcUCAuIjIAxpjbjDG7etn3P40xH+zn/C8YY+4Z\nntYNL2PMcmPMQWPMVmPMrG77PmSMOWaMeWYI13/WGDNxyA3t/3FmG2PixpipPex73RhzX5efpxtj\nakaiXSJy5VEgLiJymVhrv2Ct/WE/h70JCI9Ee4bBO4HnrbXXWGuPdNv3QeAvrLV3DuH6dwzh3KxZ\naw8DzwIf6rrdGLMGKAN+4f/8QbyluqeMRLtE5MoTynUDRETGoCJjzL8DC4Eo8IfW2nXGmEeAXdba\nrxhj/hr4PSAO1OEFffcBq4D/Y4xJAb8DvgksB1zgKbxgNmmMuRv4OyAFbAfWAjcBtwF/ABQCjcDb\ngW8DC4AKoBm431prjTEvAFvwgv8q4OvAJOBW//z/Yq3d2f3JGWM+D7wPSAL7gE8CbwY+DgSNMfnW\n2v/a5fivAdcCs40xlf5z+jv/cYLANuBT1tomY8zbgb8A8vw2/cBa+3ljzL/4l3vef+7rgHdba1/z\nH+MI8G7gnL9vDzDLf4zZ/uMVAmngr6y1T/rnbQcezFyni28B3zDG/G9rretv+wjwXWttyhgzBbgX\nuBt4o/trJCJyOWhEXERk4KYBX7PWLge+C/xV153GmOnAZ4DV1tpVeKOv11lrvwm8Bvx3a+1jwDfw\ngvQleAH6MuD/N8ZMAP4VeL//GM8DXdMorgZus9beDtwFnLfWXm+tXQBsxgucM2ZZa1fgvQn4O+AF\nv01PA3/c/YkZYx7wr7naWrsU2AU8Yq39EfAd4Cddg3AAa+1/6/K8vgZ8Fi+IX2mtXQacBL5sjAkA\nfwr8vt+G64E/N8ZMtNY+4F/udmvt8d5fesB7/f+X/3w7gH8BPmCtvQZv1P7bxpgZftuW9xCE4z//\nAF4gjzGmFLgH+J5/3klr7X3W2t39tEVEZNAUiIuIDNxBa+2r/vfb8UZ2u6oBdgBbjTFfAbZbax/v\n4Tp3Af9krXWttTG8QPcu4BZgt7V2B4C19gdAU5fzXrfWNvn7fgY8Yoz5Y2PM1/FGzIu6HPvzTJv9\nr093+bmilzb9i7W21f/568CbjTF5PRzbm7fjBbXb/BHpe4Gr/JHndwArjTFfBP4BLxguHMC1wQvy\nX/G/XwNUA4/7j/VrvE8XlvZ1AWttGu/1/rC/6f3Ar621ZwfYFhGRQVNqiojIwCW6fO/iBZOdrLVp\nY8yteKPca4GvGWOet9Z+utt1ug+GOHj548nu18RLuchoyXxjjPkjvJSKfwJ+DNTjpWpkxLq1rWvb\ne9JTm0I9tKcvQeDT1tqn/DYWAVFjTCFemspjeOkl38cL0nu6dvfXtesbgZi1NtnlsfZYa6/L7PTT\nSmqzaOf3gX3GmBLgD4GPZXGOiMhloxFxEZHLzBizDC+lY4+19m+Br+GlnYAXZGcmaz4DfMIYEzDG\nRPAC6ueADcACY8xS/3rvwptE6HKpO/FSRx4GLN6Ic3AIzX8GeMAPmgE+Bbzkj9gP5BqfNMbkGWMc\nvHSPvwXmAyXA56y1T+ClhUS6tDfFhdemFu+NDMaY6/FGvXuyEZhvjLnFP3Y5sJ8sJlhaa+uAJ4C/\nBlLW2o0DeI4iIkOmEXERkcvMWrvDGPMfwGvGmBagHS+gBS/w+4qf6vEp4B+BnXgjvk8Df2OtjRtj\n3gf80BiTxsu/TgJtPTzcV4CH/NzuFN7kzCVDaP7DwHRgkx9EHwD+a9+nXOJ/+e3ahhdkb8fLDW8B\nngT2GmPO+9feDczDS5X5ObDeL+/4P/ByvT/qP6ctPT2QtbbWf6Pyf4wxUbwBpg9Ya49Cn5M1M74J\nvIo3AVZEZEQFXLenARYREckVP1Xic3jVP9qMMdcAvwKmdKnwISIiY5wCcRGRUcgY8yW88ocJ/9+f\nWGvX5bZVIiJyOSkQFxERERHJAU3WFBERERHJAQXiIiIiIiI5oEBcRERERCQHrtjyhclkym1o6KkS\nmIyU8vIC1Ae5pT7IPfVBbun1zz31Qe6pD4ZfZWVxj4uiXbEj4qHQUNa7kMtBfZB76oPcUx/kll7/\n3FMf5J76IHeu2EBcRERERCSXFIiLiIiIiOSAAnERERERkRwYdZM1jTEO8C1gGRADHrTWHujhuIeA\nemvtZ7M9R0RERERktBiNI+L3AlFr7Rrgs8BXux9gjPkosGQg54iIiIiIjCajMRC/CXgawFq7EVjV\ndacx5gbgOuC72Z4jIiIiIsPrXHs9B84fznUzxpRRl5oClACNXX5OGWNC1tqkMaYa+CLwe8B/yeac\nvh6osrL4crVZBkl9kHvqg9xTH+SWXv/cUx/k3uXog4fX/Ss7T+/hh+/6vwQdlUTMxmgMxJuArr8N\nTpeA+j3ARODXwGSgwBizt59zelVb23x5WiyDUllZrD7IMfVB7qkPckuvf+6pD3LvcvVBfUsjiXSS\nk2caiIYil6Fl40dvb3RGY2rKBuBuAGPM9cDOzA5r7TestSuttbcBXwZ+bK19pK9zRERERGT4xVNx\nAJLpfsdCxTcaR8QfA+4wxrwMBIAHjDH3A0XW2oeyPWdkmioiIiIiALFMIO4qEM/WqAvErbVp4GPd\nNu/t4bhH+jlHREREREZILBUDNCI+EKMxNUVERERExhilpgycAnERERERGZK0myaeTgCQSKdy3Jqx\nQ4G4iIiIiAxJossouEbEs6dAXERERESGJJOWAgrEB0KBuIiIiIgMSWaiJqhqykAoEBcRERGRIYlp\nRHxQFIiLiIiIyJBcnJqiyZrZUiAuIiIiIkOiEfHBUSAuIiIiIkPSdUQ8oUA8awrERURERGRINCI+\nOArERURERGRILsoRV9WUrCkQFxEREZEhiaU1Ij4YCsRFREREZEi0oM/gKBAXERERkT6dbDnN8eaa\nXvfHVL5wUBSIi4iIiEifHtn9b3xv5w973a/JmoMTynUDujPGOMC3gGVADHjQWnugy/53AZ8FXOBH\n1tqv+9u3Ak3+YYettQ+MaMNFRERExqm2RDutidZe92uy5uCMukAcuBeIWmvXGGOuB74K3ANgjAkC\nXwZWAS3AbmPMj/zvA9ba23LTZBEREZHxK5lOEk8nSKVTBJ3gJfuVIz44ozEQvwl4GsBau9EYsyqz\nw1qbMsYsstYmjTFVQBCI442eFxhjnsV7Tn9hrd3Y3wNVVhYPyxOQ7KkPck99kHvqg9zS65976oPc\n668PUnh530XlYYryCi/Z74bSnd8H8wLq0yyNxkC8BGjs8nPKGBOy1iYB/CD8PuCbwK+AVqAN+Arw\nz8B84CljjMmc05va2ubhaL9kqbKyWH2QY+qD3FMf5JZe/9xTH+ReNn0QTyUAqDlTR0U0fcn+5rYL\naSstbe3q0256e2MyGidrNgFdW+t0D6ittT8HpgJ5wAeBfcCj1lrXWrsPqAOqR6i9IiIiIuOW67qd\n6SYdyViPx2QCdVDVlIEYjYH4BuBuAD9HfGdmhzGmxBjzojEmYq1N442Gp4EP4+WSY4yZgjeqfmqk\nGy4iIiIy3qTcC4F1R6qjx2Ni6ThhJwwoR3wgRmNqymPAHcaYl4EA8IAx5n6gyFr7kD858yVjTAJ4\nHXgUL1f8EWPMerxqKh/uLy1FRERERPrXNbBu73VEPE5huIDzsUYF4gMw6gJxf6T7Y9027+2y/yHg\noW77U8D9w9w0ERERkStOoktgHUv1HogXhQsJEFD5wgEYjakpIiIiIjJKdB3h7kj2kpqSihEJRgg5\nIY2ID4ACcRERERHpVdfJlz0F4mk3TSKdJC8Y9gNxTdbMlgJxEREREelVIn2hIkpHD6kpmcV8IsE8\nQk5QI+IDoEBcRERERHrVNee7p/KFMb90YV4wj1AgdFFOufRNgbiIiIiI9Oqi1JQeyhdmRsTzgnmE\ngyFN1hwABeIiIiIi0qtk19SUHkfEvW2RYIRQQDniA6FAXERERER6lbhoRLyHHPF01xzx0EWBu/RN\ngbiIiIiI9Kq/8oWxTGqKk9dZNcV13RFr31imQFxEREREepXMumqKV77QxSXtpkesfWOZAnERERER\n6dXFdcR7yhG/MFkz5AQBVDklSwrERURERKRXF6Wm9FA1JdY5Ih4hHAh556hySlYUiIuIiIhIrxLp\nvuuIxy8aEfcDcY2IZ0WBuIiIiIj0quvodspNXZJ2cvHKmplAXCUMs6FAXERERER6lRndjgYjwKWV\nU3rKEdeIeHZCuW5Ad8YYB/gWsAyIAQ9aaw902f8u4LOAC/zIWvv1/s4RERERkcHJjIAX5RXR0R6j\nIxmjOK+oc//FdcTDgALxbI3GEfF7gai1dg1ewP3VzA5jTBD4MrAWWAN83Bgzsa9zRERERGTwMkF1\ncbgQuLSEYSzZNRD3R8Q1WTMrozEQvwl4GsBauxFYldlhrU0Bi6y1jcAEIAjE+zpHRERERAYvE4gX\nZgLx7qkp6QupKZ1VU5QjnpVRl5oClACNXX5OGWNC1tokgLU2aYy5D/gm8Cugtb9zelNZWXx5Wy4D\npj7IPfVB7qkPckuvf+6pD3Kvrz4IHfXGbStLyqEOIkXOxccHvcV7plZVUHLeC9YLi8Pq1yyMxkC8\nCejac073gNpa+3NjzOPAI8AHszmnJ7W1zUNvrQxaZWWx+iDH1Ae5pz7ILb3+uac+yL3++qC5tQ2A\nUCoPgLN1DdSGLxzf0u7tb2yIEW/3RsLPNTRRG1S/ZvT2pmQ0pqZsAO4GMMZcD+zM7DDGlBhjXjTG\nRKy1abzR8HRf54iIiIjI4CU7J2t6o93t3XPEU3HCThgn4Kh84QCNxhHxx4A7jDEvAwHgAWPM/UCR\ntfYhY8yPgJeMMQngdeBRvAoqF52To7aLiIiIjBrba3cxtbCayoIJg75G0vWC6qLecsRTcSJBb7Rc\n5QsHZtQF4v5I98e6bd7bZf9DwEM9nNr9HBEREZErVku8lX/e+a9ML57Cn636FIFAYFDXSaQTwIVA\nPNZtRDzeNRAPaGXNgRiNqSkiIiIiMkTNiRZcXI4113Ck6figr5NJM8nUDu++zH08FSevc0TcD8RV\nvjArCsRFRERExqG2RHvn9y+eeHnQ10mmkwQIUBAqAKA9dWn5wksCceWIZ0WBuIiIiMg41JZs6/x+\n29kdNMUHV8UkmU4QdkJEQ5kl7i+MiKfSKZLpJBHHC8TDjlJTBkKBuIiIiMg41JrwAvHpxVNJuile\nPrlpUNdJplOEnBDRoBeId80Rj3dZzAe6jogrEM+GAnERERGRcajND8Rvn3YT0WCEdTUbSQ0iZSSZ\nThJyQoScEMFA8KKqKbHUheXtQYH4QCkQFxERERmH2pJejnhFtIzrqldyPtbI6+d2D/g6iXSSsBMi\nEAgQDUUuqiMevyQQD3aeI/1TIC4iIiIyDrX6kzULwgXcMvUGAF48sWHA18mMiANEgxFiXXLEYymv\ntGFe9/KFqpqSFQXiIiIiIuNQZrJmYbiAyYVVLCyfz/7zhzjZcnpA10m6XQLxUJSOVNfUFC8oV474\n4CgQFxERERmHMpM1C0L5ANwyzR8VrxlYKcNEtxHxjmQM13WBnlJTVL5wIBSIi4iIiIxDbcl2Qk6I\nsBMGYMnERZRHyth0agvtyfZ+zva4ruulpvgpJ5FQBBeXuL/a5oVA3KuooiXuB0aBuIiIiMg41JZo\nozCU37m0vRNwuHbyNcTTCY40ZrfSZsr1RrYz9cHzg1GAzsopmaopeUEv2FdqysAoEBcREREZh9oS\n7RSECy7aVlUwEYD6joasrpGpfnIhRzyzqI8XiGfqiGcW9MmMnCc0WTMrCsRFRERExpm0m6Yt2d6Z\nH55RES0Hsg/Ek90D8cyIuD9J88KIePeVNZUjno1QrhsgIiIiIpdXRzKGi0tHKsb6mo2d21virQDs\nbdhPeU0ZAMVNUZaVLO/xOhcCcS/3O9JtmfvugXjQCRIgoNSULI26QNwY4wDfApYBMeBBa+2BLvvf\nB3wGSAI7gY9ba9PGmK1Ak3/YYWvtAyPbchEREZHRIVO6MM+fqJlREM4nwIWKKv3JpKZkJnzm+5My\nMyUMu0/WBG/0XIF4dkZdIA7cC0SttWuMMdcDXwXuATDG5ANfApZYa9uMMf8GvN0Y8ywQsNbelqtG\ni4iIiIwWmUA7M1Kd4QQc8kP5WQfil6SmhDKTNb0R8e7lCzPHKhDPzmjMEb8JeBrAWrsRWNVlXwy4\nwVqb+e0JAR14o+cFxphnjTG/8wN4ERERkStSm7+qZvdAHLyVNtuTHaTddL/XyayQ2Zma0jki3nNq\nSuZYBeLZGY0j4iVAY5efU8aYkLU2aa1NA2cAjDF/DBQBzwGLga8A/wzMB54yxhhrbZ+/BZWVxcPR\nfhkA9UHuqQ9yT32QW3r9c099cPntb/cW3CkpKKC4OHrRvrL8Is611+FEXIoj3r7e+qAh4AXeJYUF\nVFYWMznpTfYMRlzvnJAXzE+pKqc06l0jEsojTVr9moXRGIg3AV17zukaUPs55H8PLADeZa11jTH7\ngAPWWhfYZ4ypA6qBPotk1tY2X/bGS/YqK4vVBzmmPsg99UFu6fXPPfXB8DhVVw+AmwjQ3Nxx0b48\nvOD67PkGKAhSXBzttQ9qG7yx0URHmtraZmKtXuBd19REbW0zzW1ekkLz+QTxoHcNx3VoT3WoX7vo\n7U3JaExN2QDcDeCnmOzstv+7QBS4t0uKyofxcskxxkzBG1U/NSKtFRERERllOidr9pCaUujXFs8m\nTzzhlyHM5Ih3pqZ0qZoSINBZtjBzrMoXZmc0jog/BtxhjHkZCAAPGGPux0tDeQ34A2Ad8DtjDMDX\ngYeBR4wx6wEX+HB/aSkiIiIi41XnZM1uVVOAzkV+WhOt/V6n9zriFxb0CQfDOIELY7vKEc/eqAvE\n/Tzwj3XbvLfL972N4t8/PC0SERERGVvakr1P1iwM+YF4sv8R8WQ6AXRZ4r5bHfF4Kt65qmaGqqZk\nbzSmpoiIiIjIEGSqpkT6TE1p7/c6yd5SU7pUTeke7IecMC4uKaWn9EuBuIiIiMg4k0lNCfeQmhJy\nQkSCEdqyyBHvnpoSdIKEnTAdSS81JZaKXxLsZ0odJl0F4v1RIC4iIiIyzrQl28hzwgQCgR73F4bz\naU224bpun9dJdAvEAaKhyEUra3YfEQ8HvGOVntI/BeIiIiIi40xbor3H/PCMwlABaTfdmWLSm8yC\nPl2rouQHo8SSMZLpJCk31cOIuALxbCkQFxERERln2pJtfQbiBVmWMOxMTQlcCMQjoQjtqVjn8vaX\n5ogrEM+WAnERERGRcSSeSpBIJ3ssXZiRmbDZX554j6kpwQjxVJx2v3JKbzniCQXi/Rp15QtFRERE\nZPD6WswnI9sSht0nawJEQ14t8fU1rwDQ0HGe9TUbO/efbTsHwObTWymPlnHT1OsH+hSuGBoRFxER\nERlH+ipdmJHt6po9BuJ+CcN2v3JK0B8BzwgGvJ/Tbnogzb4iKRAXERERGUc6V9UM9p+a0l8gnkkv\nCfcwIt7uV04JBy5OsMissplSIN4vBeIiIiIi40hnaorT+4h42AkTckJDGhHv6BwRvzgQD/qBuEbE\n+6dAXERERGQcyayY2VeOeCAQoDBU0Bm09+ZCIH4h/aRzRNwPxEPdUlMcPzUlpQV9+qVAXERERGQc\nuTBZs/fUFPDSUxLpJLFkvNdjkp2pKReu1T1HPNQtNSXoaEQ8WwrERURERMaRzsmafaSmwIU88ZZ4\na6/HJNyeV9YEOlfXvHREXDni2VIgLiIiIjKOtGZRvhCgwC9h2NxHIJ5Me+kloUBfqSnKER8sBeIi\nIiIi40hbFlVTAIoyI+KxvgLxJAECF5UovDBZ01vQp3sg7nSWL1SOeH9G3YI+xhgH+BawDIgBD1pr\nD3TZ/z7gM0AS2Al83N/V6zkiIiIiV4pMakpfVVPgwjL3fY+IJy4qXQgXUlNcXODi0XK4MCKu1JT+\njcYR8XuBqLV2DfBZ4KuZHcaYfOBLwO3W2huBUuDtfZ0jIiIiciVpS7aR54QvWWinu2xyxJPp1CUj\n3tHg/2PvzsPkusp733/3UEPP3ZJas2dLy7M8Yht8wCQYggOxGZM4hwQDuceBDISTm5uQnEwnuWSA\ncJ0ThpgxBAgJJEAMeIAYCNgIPFsetCTZkjVLLann6hr2cP/YVd3Vc7fUXVXq/n2ep5/u2nuvXav2\n6pbeeuvda2XHPZ6cES8H4pEC8dk0YiB+A3AvgLV2K3B11b4C8FJrbWWuHR/Iz9JGREREZNkYLo2M\nZrtnkvUyuI47a2nKpEC8nBGvmBjwu6M14ipNmU3DlaYA7UB/1ePQGONbawNrbQQcATDG/AbQCnwb\neOt0bWZ6ou7utoXtucybxqD+NAb1pzGoL13/+tMYLKyRcIRVzStoa8vOemxbuoXB4vC0YxA6IZlU\netz+1tL42vOuthayqbHnGqIJAD/t0taW1fjOoBED8QGgesTc6oC6XEP+18Bm4E3W2tgYM2Ob6fT0\nDC5Ql+VkdHe3aQzqTGNQfxqD+tL1rz+NwcKK4ohcaYSMk2FwMD/r8Vmvif7CIAcOH59ylpViqURz\nqmncGE2cDWUkF1Jyx54rP5KEYCP5IoODeY0v07/ZbMTSlAeBmwGMMdeR3JBZ7R+ALHBrVYnKbG1E\nRERElrxckNyoOZfSFICWVJK9PpHvm3J/EE8uTXEdd9wNnJWbMyc+1vSFs2vEjPhXgZuMMQ8BDnC7\nMeY2kjKUR4B3Aj8AHjDGANw5VZt6dFxERESknipTFzb7TXM6vqU8l/iJfC9rW1ZP2l+aokYckhs0\nS1GA7/g4jjNun6cl7ues4QLxch34HRM2b6/6ebos/sQ2IiIiIsvKcKmSEZ9jIJ4aC8QniuM4uVnT\nmRwuptwUI+QnraoJ1TdrKiM+m0YsTRERERGRk5Arr6pZyXTPZiwQn1yaUsloT5xHvHrbVNly19U8\n4nPVcBlxERERETk5udL8asQrx20/sZMV2c5x+0phCYCB4iA/PLB13D7fTZW/Tw4lVSM+d8qIi4iI\niCwRw8H8asSb/SYcnNFMerVKRnvizZhQlRF3pipN0RL3c6VAXERERGSJqNys2TLHjLjruKS9FMVy\n9rtaJZB2pwi2K4G4N0NGXKUps1MgLiIiIrJE5OZ5syZA2ktRiiYH4qMZcXeqjHilNGVykO7gjGsv\n01MgLiIiIrJEVOYRn+vNmjB9IF6p8XZnLE2ZnBF3HAfPcVWaMgcKxEVERESWiOHKPOLzyIinvBSl\nKCCO43HbK7OmeFOUpvgzZMQhKWcJI2XEZ6NAXERERGSJyAU5XMcl62Xn3CbtJUF1EAfjtoczZcS9\n6acvBMoZcQXis1EgLiIiIrJEDJdGkplQJqx2OZNKIF6acMNmNJdZU6bNiCsQnwsF4iIiIiJLRC7I\nzassBZLSFEiWs68WzjBrStpLJ9/d9JTn9BxPS9zPgQJxERERkSUgjmNypRGa53GjJowF1RMD8Sia\nPiO+pnk116y5nHM6zpzynMqIz41W1hQRERFZAgphkTAO550RHy1NmTBzykwL+niOy/md5057Ts9x\nNX3hHCgjLiIiIrIEVFbHnM/UhTB24+XEQHymBX1mo4z43CgQFxEREVkCxhbzOcnSlHDus6bMxnU9\nYmIF47NouNIUY4wLfBTYAhSAd1lrd004phn4NvBOa+328rbHgIHyIbuttbfXrtciIiIi9VXJiDf7\n8yxNcacuTRmdNWWamVFmUilnUSA+s4YLxIFbgay19npjzHXAh4BbKjuNMVcDHwc2Vm3LAo619sYa\n91VERESkIQyXM+It886IT1cjXlnQ5yQy4uU2qhOfWSOWptwA3Atgrd0KXD1hfwZ4A7C9atsWoNkY\nc78x5oFyAC8iIiKybORKJ5kRn2b6wpmWuJ/NWEZcUxjOpBEz4u1Af9Xj0BjjW2sDAGvtgwDGmOo2\nOeCDwCeBTcA9xhhTaTOd7u62hey3nASNQf1pDOpPY1Bfuv71pzFYGM6xJHBev2ol3d1ttA3MbXXN\nKF/OhHsRbW1jbbyBZFGgtpamcdvnIpNO6s6bmlMa3xk0YiA+AFSPmDtbQA3sAHZZa2NghzHmOLAO\n2DdTo56ewVPqqJya7u42jUGdaQzqT2NQX7r+9acxWDhH+3oBKOWSGGdwMD+ndulskhHP5Qvj2ozk\niwDkRwIGmdu5KqIgBmBgaETjy/RvNhsxEH8QeD3wr+USk21zaPMO4FLg3caY9SRZ9UOL10URERGR\nxjJ2s+bC1IhXSlP2Hx3mhDt1ecrmMzqn3D5aIx6pRnwmjRiIfxW4yRjzEOAAtxtjbgNarbV3TdPm\nU8BnjTE/BGLgHXPIoouIiIgsGYeHe3Bw6My0z6ud53q4jjvtzZruSdxS6JXnHleN+MwaLhC31kbA\nHRM2b5/iuBurfi4Cty1uz0REREQay/eeOABAGAfs7t9Lh7eKrU8f58bLN8zrPCk3Ne3Nms5JBOKu\npi+ck0acNUVERERE5uFEcISIkG5/fgF4Rcr1p13i/mQCcU/TF86JAnERERGR09yxIMm8WO3rAAAg\nAElEQVSMr0qtP6n2KdeftLLm2BL3yogvloYrTRERERGR8SolKNPpCQ4CsOqkM+IpgjggimNcJ5m2\n8FQy4m65RjxUjfiMlBEXEREROY1FccTx0kHa3C6y7vxmTKlIlWdOCarKU0YX9MGZ9/lUmjI3CsRF\nRERETmP9YQ8BJValTi4bDklGHMavrhlGIQ4OzsmUprgqTZkLBeIiIiIip7Gecn14t39y9eGQ1IjD\n+LnEozg6qfpw0PSFc6VAXEREROQ0dqx0avXhUBWIV92wGcbRaInJfKk0ZW4UiIuIiIicpuI4pic4\nSLPbRos3v4V8qo2VpoxlxMM4POmMuGZNmRsF4iIiIiKnqcGol2I8wqpTKEuBqQPxKI7wXO+kzucq\nIz4nCsRFRERETlM9pUp9+MmXpQCkvEqN+PjSFNWILy7NIy4iIiJyGnghv23Stj2FZwDozw/z0MFn\nGBhwKBYc7v7xDkpFaGpyaGl2aG112LDOY+0aF8+bPB3htBlx5xQz4pEy4jNRIC4iIiJyGgrDmL5S\nH0Qptj3WCVXzfadSMamUw/ETET3Hkm1PPxuQSsHGDR4XX+CzunssyK4E4od7h/CG+wAIopBiKYaT\niMU91YjPiQJxERERkdNIFMGRQy77DxVxLyoQ9q+mozNm5aqQzq6ITBYuPLsTSG7mzOehty9i3/6Q\nF/eF7N6TfJ2xweXKy9O0tY3NmhIRjLaLiU5qMR/QzZpzpUBcRERE5DQxOOCwY7vPSM7BX3UEF9i4\nsoP1G4Jxx+3Y1zepbdda6FwD7Zk2HnuixL4DEfsO5LnskphNFyQhYRiXA3Fi4OSWt4exGnEtcT+z\nhgvEjTEu8FFgC1AA3mWt3TXhmGbg28A7rbXb59JGRERE5HQVRhF7XvDYv9cFHNauD3HPOEZvDB3p\njjmfx3Fg3RqPm1/tcvBQxI8fKfLU0wX2HgzhfAhJAueYyvL2pzZ9oWZNmVkjzppyK5C11l4P/B7w\noeqdxpirgf8CzptrGxEREZHTVe9ggXu27mX/Xo9MFi7ZUuL8zSE5+nHxaHZa531Ox3HYsN7j527O\nctklGfp6kwz2SCEJxKNyIH4yy9sDeFrifk4aMRC/AbgXwFq7Fbh6wv4M8AZg+zzaiIiIiJx29h4Z\n5M8/9wgnBgqsXhty5dUlOrtiSnGRQpyj1e046WAZwPcdXvnyFl71iixx5DKSDzh0wCWOTzUjrukL\n56LhSlOAdqC/6nFojPGttQGAtfZBAGPMnNtMp7u7bWF6LCdNY1B/GoP60xjUl65//WkMpvbIc0f4\n6y8+xkgh5PpL19G0/uBo0J0rJjXgHZkuMtnUvM77Ys/w+A09w5CFVM6n5Ac8/6xP4LrQAb7nz3j+\ntrbslNuj8rSFjqvxnUkjBuIDQPWIubMF1CfZhp6ewZPoniyU7u42jUGdaQzqT2NQX7r+9acxmNoD\nj+3nC9/ege+5vPvWSxjKl3gh/+Lo/oFSkn9Mhc0U8qXpTjMnmWyKQr6E5/iQDYgzMXv3xmQvhThi\nxvMPDuan3B7Hyc2exSDQ+DL9m5FGLE15ELgZwBhzHTB59vqFaSMiIiLSUKIo5kv/uZPP37+DtqYU\nv/uLV3D1BasnHTcSDQHQ7LYs2HN7jkdIwGVXlMhkk4z2yPDJhYqO4+A5rm7WnEUjZsS/CtxkjHmI\nZGb6240xtwGt1tq75tqmNl0VERERWRiFYshddz/D4zuPsW5lM+99yxa6O5umPHYkGsLFI+1Mvf9k\nePjERKQzEWdvKvIi0HfCpw+Hzq543udzHU83a86i4QJxa20E3DFh8/YpjrtxljYiIiIip4W+oQJ3\nfuUpXjw8yIVndfGeN1xC8zS12XEckY9zNLltOM7JLbgzFc8pzyVOSCYTJRNCRy7PPeOz5YoSzfNM\nvruOq3nEZ9GIpSkiIiIiy8b+o0P8+ece4cXDg9xw2Tp++61bpg3CAfJxjpiYJmfhylIAPCqL8ASj\n0xeuWAlh4PDc0ynCecbUnuMqIz6LhsuIi4iIiCwXT79wnI9+7WnyxZA3veJcbr7urFmz3GP14fOf\nP3wm7mhGPBidvrC9zcHbGHJwv8fzOz02XzD3aNx1XMJIGfGZKBAXERERqYPvPX6Az9+/A9d1uOOW\ni3nJhWvm1G4kSqYfbFrgQNyjssx9OLagDy5nnxvS3+dw9LBHZ1fM6jVzy3J7jkcxLi5oH5calaaI\niIiI1FAUxfzrA7v43H2W5qzP7952xZyDcBjLiDct4IwpkATOUM6IV5a4d1xcFy64KMDzYp7f4TGS\nm+v5NGvKbBSIi4iIiNTISCHg7/7tKe79yV7WrWzmD3/las7f0DG/c8RDpJw0vpNe0L5VMuJRVY24\nUw4Vm5rhvE0hYehgn/OZS3ztqkZ8VipNEREREamBI705/u4rT3HoeI6Lz1nBHbdcTEvVTZnfe+LA\nrOcI4hLFuEC7u2LB+zc6a0ocEJNMV1i9xP3qtRG9J0J6jnoc2O+y8cyZg2zX9YiJieII11HudyoK\nxEVEREQW2ZO7jvHJbzzLcD7g1decwVteeR6eO//gND9aH76wZSlQXZoSkizLMpYRrzj3/JC+Xpe9\nezxWrpo5EPfKwXcQBaS9hc3eLxV6eyIiIiKySMIo4t++/zx3fuUpCqWId9x8Ib/w05tOKgiH6vrw\nhb1RE6pv1gyISWY7cSfM4JJKw3mbAqLIYaf1R5eyn4pbFYjL1JQRFxEREVkEJwbyfOLuZ7H7+ljd\n2cSv3XoJZ61tO6Vz5uLFmTEFqhf0CSBOSmYmZsQBVq2OWXk04vgxl+dswEUXTD3neSUjXtIUhtNS\nIC4iIiKywB7efpRPffNZiqWIM9e08tJL1rL78AC7Dw+c0nmTjLhD1mlemI5WcUcX9Alxy2Uq7jTF\nE+dtDujvS/HI4yXOPMOjtWXycZVzKCM+PZWmiIiIiCyQXD7gk994lo997WnCMOa6i9bwisvXk055\np3zuOI7JR8NknabRIHchVWfEK9MXOtPcZJlOwznnhQQBbH24NM35yqUpsQLx6SgjLiIiIrIAHt/Z\nwz/dZ+kbKnL22ja2nL+KjtaFu0mxFBcICRZlxhQYXyMeOeV5xGfI2a5eGzHY67J3X8iL+wLOOmN8\nWKka8dkpIy4iIiJyCgaGi3z860/zf/5tG4O5ErfecA7vf9tVCxqEA+TixVnIp8JxHFw8ojgcXeJ+\nqhrxsePhpdelcV3Y+pMSpdL4GzcViM9OGXERERGRkxDHMVufOcIXv7OD4XzAeRvaeftrL2TDqsUJ\nlEdnTHEW/kbNCs/xCJm8oM90OjtcLr3Y58ltAY89WeLaq8fefIzdrKlAfDoKxEVERETm6Vj/CP90\n3w62vXAc33O45oLVmLM62bm/j537+xblOUeixZsxpcLDJ4hL45a4n82WS1Ls3hPy7PaA88/1Wbki\naePpZs1ZNVwgboxxgY8CW4AC8C5r7a6q/a8H/ggIgE9baz9R3v4YULkVebe19vaadlxERESWrMqq\nl2EU8ezuXp56/jhhFLNuZTPXX7yW1uapp/BbSCPREC4eaSe7aM/hOj5hnCcqzw8+W0YcwPcdrr82\nzX3fKfDg1iKv+5kMruuoNGUOGi4QB24Fstba640x1wEfAm4BMMakgA8D1wDDwIPGmP8A+gHHWntj\nfbosIiIiS93BY8P85LmjDAwXyaY9rjPdnLu+HWfCojeLIYpD8nGOFrdtUZ/PwyMmSuYSB1zm9lwb\n1nmcd47H87tDtu9I5hYfnb4w1jzi02nEQPwG4F4Aa+1WY8zVVfsuBHZZa3sBjDE/BF4O7AWajTH3\nk7ym91trt9a22yIiIrIU9Q4W+P4TB3nx8CAOcMGZnVy+adWCTEk4VwPhCSBe1LIUGJvCMIiLgDPt\n9IVTeclVafYdGOHRJ0qcdaY3bol7mVojBuLtJBnuitAY41trgyn2DQIdQA74IPBJYBNwjzHGlNtM\nq7v71Fa3klOnMag/jUH9aQzqS9e//hp1DIIw4u4fvMA/37+dkULImhXNvOKKDXR3LfxiOrM5OpxU\n37al28lkF74MpnLOdJCGEAJKuLizPldbW7bqZ/hvL3X4z+/lePTxkPOuzgDQ1OI37BjXWyMG4gNA\n9Wi5VQH1xH1tQB+wgyRTHgM7jDHHgXXAvpmeqKdncME6LfPX3d2mMagzjUH9aQzqS9e//hp1DOze\nXj7/7R0c6BmmtSnF9Rev4vyNHTiOw+BQvub9OZw7BEAqbKKQn3oBnZOVyabGzhklWewwDvDwZ32u\nR589PO5xHEN7u8+uF0o0rUva9vYPNeQY19J0b0QaMRB/EHg98K/lGvFtVfueAzYZY1YAQyRlKR8E\n3gFcCrzbGLOeJHN+qKa9FhERkdNe72CBr3xvFz965ggAL9+ynjffeB6P2KM168Ng2MsPB/+DYpwn\njEMiAmKSmycXvTSFsXKbucyYMpHjwPkm4MlH0+zcFeGcBUGkGvHpNGIg/lXgJmPMQ4AD3G6MuQ1o\ntdbeZYx5H3AfyWJEn7bWHjDGfAr4bLlmPAbeMVtZioiIiEhFsRRy30/2cvdDewjCmBXtGa69aA3d\nnU01DcIBduWfZCjqo9XtJOWmcR0PDw8XH99Z3NlZKjXiMLcZU6bS3AJXXp7i0RdcMmiJ+5k0XCBu\nrY2AOyZs3l61/27g7gltisBti987ERERWUriOObh7Uf58nef5/hAnmza45oLV3Hehg7cGsyGMlEY\nB+wtWjJOM6/peNu4rPQL+W0ztFwYCxGIA1x8oc+uHo88sPdoP5y5AJ1bghouEBcRERGphRcPD/LP\n39nBjv39eK7Dz1x7Jp1tadJ+7WZDmehQaTfFOM/m7JUnVRpyqtzq0pRTCMRd1+GyizP85AQ8vuso\nAxcVaW9Oz95wmVEgLiIiIsvKoePDfO0Hu3l4e1JycsWmVbz1p85nTVfz6MI99bK78CwA52Quqsvz\nj8uIn+IbgY5WH05AISzxybuf5b1v3VKXTxkamQJxERERWRaO9+f5+oO7eXDbIeIYzl7bxptvPI+L\nzl5Rtz5Vl5sUowKHS3todts5VjrIsdLBmvfHqwoN57qYz7TnKgfyrasGeea5fdyztZOfvf7sUzrn\nUqNAXEREZBmaLvN74+UbatyTxVN5jSOFgKdfOIHd20cUx3S0prli0yrOWN3K0b4RjtY5C15xIkym\nAlzlratbHzxnrDTlVGrEAdrSrXRlOujlGNlLf8Dd+55n1eqf49rzzj3Vbi4ZCsRFRERkUcxU5lGL\ngH8oV+LZPSfYdaCfIIxpbUqx5fyVnLO+veFKJOI45lhwCAeXLn913foxPiN+aoG47/q85qyfoiXd\nwtd23MfxVQf53J6Ps33kGt528ZvqUgPfaBSIi4iIyJIRxzHPHxzggUf38+PnjhDH0Jz1uXLzCjad\n0YnnNlYAXjEcDVCIc3R5qxd9isKZLGSNeHIOhytXX8bl3Zfw6Qe/y6N9D/LwoSe45dyfpbO59iuU\nNhoF4iIiInLaG86XePi5o3z38QPsOzoEQGdrmovPWcE569pxGyQA7w2O8szIjzgvcxnr0ueMbj8e\nJOsQrvLrV5YCCzdryqTzOi7vfNlP4d27nh88doBPHbf81lu24HvLOyuuQFxEREROS7l8iW0vnODH\nzx5h2wvHCaMY13G4ynTzyis2cKQ3h9NAJShhHLB16B6Goj4OlfZwZtrQ5XXj4nEiPELKydDm1u/G\nUUgy2C4eEeEp14hPde5ffo1hYKjIk88f5zPfeo53vu6ihisTqiUF4iIiInJaGCkE7Dk8yK79fTy9\n+wTPHxggipOl3zd2t3LtRat56SXr6GrLAHC0b6Se3Z3k6ZEfMRT1cWbaMBj2sbdoOcgLdHiriAhZ\n7W1siDcOnuMTxeGi1HB7rssdt1zC33zpcX70TFI6dPvNF5Lyl2dmXIF4HcVxzD17vkNrqpWXb7y+\n3t0REZEGN5+ZTuI4JlcIGMyVGMwVR78P5wMKxbB8A2NU/ooJowhweGLnMRyS7KXjgOs4+L5LqvyV\nrvzsuaR8b/w2f/y2EwN5PNfB89zydwfPdalUicRxTBBGFEohYbkPxVLE4EjS377BAkf7RjhyIsfB\n4zkOHRsmLr8+x4Fz17dzyTkrudp0s6G7dVGu+UI5VjrIjvxjtLodXNXy03h47Mw/wVMjD3I8TMpS\nVta5LKXCw6dEYcEz4hWZtMd737KFv/vKU2x99gh9QwV+/Y2X0pytX218vSgQr6OHjzzON3d/G4C1\nLavZ3HVenXskIiKNohKk5gohI4WAkULAoePDFEsRpSD5KgYhpSBiz6EBcoWQ4ZGxoHtopEQYxbM/\n0QQHjw0vwqsZzwG++O2d8+qf7zmsXtHEqo4mVnVkWbuimUw6qWdulCB8d+EZdhee4aLsS1ibPnt0\nexgHPDL8HQCubrlp9GbMzU1XEsYB+0u7SDkZsm5j3LzoOR7EC1sjPlFrU4rf+YXLuevuZ3lsRw8f\n+PxjvOeNl7J2RWNcg1pRIF4n/YUBvrzj66TdFKUo4PPPfZk/uPZ9ZLzJy7/2FfophiVWN6+qQ09F\nZCmr9/RyS8nEaxnHMcVSxOXnr2IoX2J4JBgNqEeKAdtf7KUYTA6qS0FEHCdlGCcTSDdlPNqa0qzq\nyNLWnKa1OUVbc4q2pjRtzSlamlI0pT227T6B7zmkPBffc/E8p9zvsf7H5e9RFBOEMVdu7h7t41T9\nLgURpTCiWAophRG7Dw2UM93lrzAa/bmtOYXnujRlfcIwwnddXNch7bu0NSd9bW9Js6aridVdzTyx\nq2faso16r4YJSRBeCbZ/MPR1VnhrOSO9Cd9Jsb+4i8Gol9X+RgbDEwyGJ0bbZdwmzstcWq9uT6ky\nhaFzigv6zCad8nj3rZfwpf/cyXce3c8ff/on3PrfzuHV15yB5y6PUhUF4nUQxzH/bP+dXDDCz2++\nld5CP/e/+F2+/vw9vHXzLeOO3TOwl79/4lOUohK/esnbuGTVhXXqtYjI8lUoJdnmoaqv4XyQfC8/\nfvHIIIViSLEUUiglwWgM/MsDu+b8PL7nkPI9OlvTrO5qoinjJ19pj6aMz5HeXLnswxsrFUm53HDp\nepoyPs0Zf861todO5OZ9HTbOM/M8lzd63d1t9PQMznquetZOR3HE9vwjnAgOc1HTS1jhrx23f29h\nO48Mf4e0k+XK5lfy1MgPOREeZmDkOKtTGzkS7CXjNLE+dXp88l2ZwnAhpi+cjes63HbTZjaf0cnn\n77d8+bvP88j2o7z1leez+YzOhqiZX0wKxOvgkSNPsO3Ys2zqPJcbNlxHGIU81fMM39//IFd0X8Km\nconK8317+OiTn6IQFvFdj7u2fY53XvJLbOm+ZNz5+gsD/MuOr3Fo+DA/v/kNXLBi05TPG0YhxahE\nk59d9NcoIourFISMFJKgr5JVLZTCcRnKpIQh2V85LoyS7GYUx8QR7OsZgnLVreM4uFV1wScGCmMZ\n09Ga4OTL98Z/Hz2m+jjPxfedmma24jgmjiGM4rHXHkSUqq5TMQgplSIKQYifPs7RY0Pk8kmmOlcI\nyOUDcoUSI4WQXD4JuEtBNKfndxzIpDyyaY+O1jSZlJd8pZPgOZ1KaqjT42quPVKp5HpVptib7tOI\n6QLbmT7Or0W2+GSeo9KmrTXL4FB+dHutP4nJRzmeHdlKPsqxKXsF3anxzz8U9vOT4ftGpxc8VNrN\n2ekLuaT5ZTS5Lewv7uQnw/eTcjK8vO0NdPmrKUYjHAn2c7D0AgdLuwE4K33BuFUrG5lXnsJwMUtT\nJrr6gtVccFYXX/zODrY+c4S/+uLjnLu+nddeeyaXb1q1ZDPkThzP/2OvxWSMcYGPAluAAvAua+2u\nqv2vB/4ICIBPW2s/MVubacRzeQe+0PoLg/zFjz9EKSrxB9e+j1VNKwHY3b+XDz36EVY2reD9L/lt\nXhzYx8ee+gxBFPD2i36RtnTruMdXrdlCHMc8euQJ/mXH18gFY3eG/7cN13PreTeT9ZO7xsMo5CdH\nHufePf/JsZHjXLH6Mm4++1Wsbx3/jr4Ylniy52leHNjHhSsNF67YNOUd04WwyIGhQ6xvWUP2FIL6\nuWZBZPFoDGovimMKxbGa30xThoNHBsgXkyBwtHShELL70MCkj/8r9cFRg/3bPRPXcXDdJPPluclN\ne5UkV1Nm6nzQSCEY9ziOx4Js33eJopg4TkoconLpRBjFLNRlcRxGs86VQHosqPZIV34uP86kXDJp\nj5TnLvkM3kKbGIhXlOICHqlpZ+4oxQUOl/aSdjJ0+xsnHRfFIfuKO9mVfxKAczIXc2bGjNZnx3HE\n84VtPD3yI0pxYbRdt7+Ri5uuZZW/gReL23l8+HsEFOny1rDSX8OB4guMxEO4eKz019ITHMTFZXPm\nclq8jnF9KEQ5DpReoNltY23qrFO6Tospk01RyJdGH+8r7uRosI8zUptZndp4UufcfEbn6M83bLhu\nXm13Hejnnq0v8vjOYwC0ZH0uO28ll2/qZvPGDjpaMyfVp3rq7m6b8h+GRgzE3wj8nLX27caY64Df\nt9beUt6XAp4DrgGGgQeB1wEvm67NDGoeiMdxzCe2fY4njz3DWzbfwo0bXzZu/9d2fYtv7/0eF600\n7Ox9gSiOxmXAqzPkb9l8Czt7n+fxnm2k3RRvOP91nNW+kX967l85NHyEVdkV/NKFb+Z4vm80APcc\nj+6mlRzOHQXgiu5Lee05ryKIAn506BEeOfI4I8HYP4admQ6uW3sV1627hpTn8/Sx59h27Fm29+4i\niAJ8x2Nz1/lcuupCLl11Ec2pZl7o38PO3hfY2fc8ewf2s6ppJed3ncvmznM5v/M8WlPNHM4dZc/A\nXo4Wj7Dz2Iu0pVo4s/0MzmrbyFntZ9CaaqGv0M+BoUMcHD7MoeEjpNwU61vXsqFlLetb19GSaiZX\nynEk18PR3DGO5noAWN3czermbtY0d9OcaqIYljiRP8GxkeQriANWZVewsmklq5pW0ORnCaOQgeIg\nJ/J99OZ7KYRFOrOdrMh20pXpJOtniOOY4VKOvkI/fYV+8mGB9nQrHZkOOjMdo7X9+SDPQHGQgeIQ\nuVKOllQL7ek2OjJtpMvHlKKAoeIQg8UhhoMcTX6WtlQbbelW0l7yH0QURwyXcgyVhhku5Uh7KdpS\nrbSkWkaPieOYkSDPcClHLsjhuz4tqWZa/GZSVccUoxK5Uo7hUg7XcWlONY0eUwnES1HASDBCrjQC\nxDT5zTT72dHzQPKGLh8WGAlGCKOQplQTTX4TKXcskIriiHxQYCTIE8QBWS876TxxHFMIi+TDPMWw\nRNbPkPWypFx/NICJ45hSVGIkKFAMi6S9NE1+hpSbGhfkBFFAPihQCAukvNSk81T6XQgLFMIinuuR\n9SafJ4qj0WMcXNJuGjf2CMt1sUEYUQoChktF8qU8pSgiDnyikkuhFJEvheSLAflCQK5UJFccIV8K\nKRUcRgqQL4TJvkJIvlAidiLwAnBiCH2IPJhYizl6TAShj+/45UzqWEmC78d4qQjXi/CdFCk3zaYN\nXVWZVxffA8cLwQtpTmXIpjKkXL8cHDs8ao8SExFQIohLELu4caVPjGbQgyikGBUpxUXOWdMBoU8U\nugRhTCmMCIKYYhiQD/IUoyJBAHHgEQQuQRDTO5hPrmcUEjolcJNAO+2kIfLHzc4QE1OMCskxTgxh\nCkIf10kyxs3ZFI4T4/oBjlfCcWM80gwPJ4uRuI6bZPU9B88LWd3t43sxGT9Ds58l42fIpJKs9KG+\nHIUwj+uVcP2QJj9DU6qZJi+LW87AxXFMKS5QjPOU4gK+kybtZEg52dHgL44jinGBQjxCMcrjOT4Z\np4mM2zT6MX8cxxTjPMU4TyEawXW8sWNIfm8rxxTiEQrRCA4OGbeJjNNMykmXj4nIxzlGomHy0TAx\nEVm3lSanhazbjOt4xHHESDzMSDTESDREGAc0ua00ua00u23l6eki8tEQw9Egw9EApbhAs9tKs9tO\ni9tOyskQEzEcDTAU9jEU9ZGPcjS7bbR6nbS5XTS5rUSE9IfH6Qt66At7GAr7aPE66PK66fS76fCS\n+5v6gh6Oh4c4HhymPzhGs9fOSm8tG9vOpKm0AtfxOFY6yJFgL0dKe+kPj5Fy0qz2z2BN6kzWpM4k\n6zZzsLibfcWdHC7tISIs/x41sTF9HmekN9PhrWJ34Rl25Z9kJB6q+tuK8Z00Z6cvZHXqDJ7IfZ9c\nNIiLx4bUuTS7bRwq7WEgSuq3M04ThXgEF48z04aV5XKUOI45Fh7kYPEFAkq4eGzKbKHVGws8TzcT\nA/GDpd0cKu3mrPQFrPLXn9Q5TyUQrzh0fJgHHj3AYzt76B0ce7PU0ZrmrDVtrOlqZkV7hhXtWVqb\nUmTTyadRlU+lMmmvYTLpp1Mg/rfAT6y1Xyo/PmCt3VD++TLgr621P1N+/GHgIeD66drMoOaB+DPH\nt/PRJz/N+Z3n8FtX/I9J795LYYkPPHwnR3JH8V1/yprwSs34SDkDfl7H2bztwp+nuznJrJeigG++\ncD/f2ft94vLHzb7j8dL1L+HVZ72SzkwHzxzfzrd2f4cXB/eNO3dHup1r113Fps5zebLnaR458iT5\ncHKWYn3LWs7tPJs9/XvZP3RwdLvruERx8vGtg8O6ljUcy5+gGBZHj/FdnyAKpmxTkXZTFKMSM8l6\nGfJhYcZjmvzsuDcWUx/TRCEsTOrDxPOUomBcvyf3J0tENO61TnWM4zBjnzJeGt/xyQUjo+M3UdpL\nk3ZT5IKRafuddlOkvTT5IE8Qh1Mek3JTNKey5Ep5StNc75Trk/WyFKMihWlem+/6NHnJNSqEhSn7\n7TseWT9LGEfkg/yUx3iOR5OfTd5ghPkpX5vruDR5WRzHIR8WphkTBwI/+e4G4E4+Txw7EHoQu+CG\nSaA66RjKQbILXpgc50xxTOQl53KTwHmqY5zIg8gHNzkPzuTX78Q+Hj4xEZETEL0PxgAAACAASURB\nVDO53x4+vpMiJqYUF6c8xsXDd5I3fUFcHA1UJh+TwsGhNM0xDi6+k8LFJYhLhEx9rVNOChdvhmPA\nJ43nzHxM5bWFcUDA1L+PY8eEBEz9++jikXLSRISU4qmPcXBHg8zqTOhEKSeDg0Mxnv5vNuWkcXBn\nPMYjhef45WOm/ruu9LsYT/33Ud3vmc4DkHaylOKp/xbH+p0hiEtT/g5V+KQJmfp3sbrfMdGMz5Xc\n8OeMO4/vpAkmjI+DO3qMi8cKfy0D4fEJ19ah8tqzTgtd/mqCuEhvcHTS742Lxyp/Hav9M3BwOBYc\n5Fh4cNzvxQpvDRvT55NyxjKsw2E/B0t7GIiO0+J2cE76IjJu06TXFcQljgUHaHO7JmXCTzcTA/Ej\npX3sL+3k7PRFo29A5mshAvGKOI7Ze2SIJ58/xp5Dg7x4ZHBcYD4Tz3XKn8Y5mDM6+a23bDmlvpys\n0ykQ/yTwb9bae8qP9wLnWmsDY8wNwG9Ya3++vO/PgL3AddO1qcuLEBERERGZRWPk68cbANqqHrtV\nAfXEfW1A3yxtREREREQaTiMG4g8CNwOU6723Ve17DthkjFlhjEkDLwd+NEsbEREREZGG04ilKZUZ\nUC4jKQa7HbgSaLXW3lU1a4pLMmvKR6ZqY63dXpcXICIiIiIyBw0XiIuIiIiILAeNWJoiIiIiIrLk\nKRAXEREREakDBeIiIiIiInUw9drCS5QxxgP+FrgayAB/Yq39RnmmlTuBALjfWvundezmkmaMcYD9\nwM7yph9Za39fY1B7xpgLgB8Da6y1eY1BbRhjWoAvAl1AEfgVa+0BXf/aMcZ0AJ8H2oE08D5r7Y80\nBrVnjHkD8BZr7W3lxxqDGqqa7GILUADeZa3dVd9eLS/LLSP+NiBlrX0ZcAtwfnn7x4HbgBuAa40x\nV9Spf8vBecBj1toby1+/X96uMaghY0w78CGSf3grNAa18avAo9bal5MEg79b3q7rXzvvA/7TWvsK\n4O3AR8rbNQY1ZIy5E/gA42MRjUFt3QpkrbXXA79H8v+C1NByC8RfAxwwxnwT+ARwdzkgyVhrn7fW\nxsB9wKvq2ckl7ipggzHmu8aYb5mExqCGyp9K3AW8H8iVt2kMasRa+/8Bf1F+eCbQp+tfcx8G/qH8\nsw/kNQZ18RDwa5UHGoO6uAG4F8Bau5WkYkBqaMmWphhj3gn89oTNPUAeeB3JYkCfIXnnPVB1zCBw\nbi36uNRNMwbvAT5grf2yMeYGkozgG9AYLIppxuBF4EvW2ieNMZVt7WgMFtw01/92a+3DxpgHgEuB\nm9D1XzSzjMFakn+D3ovGYNHMMAb/Yoy5sWqbxqD22oH+qsehMcbX6uS1s2QDcWvtp4BPVW8zxnwJ\n+Eb5nfb3jTGbSf7o26oOawP6atbRJWyaMWgmqf3DWvtDY8x6kn9sNQaLYJox2AW8s/yf41rgfpI3\npxqDBTbV9a/a91PlOv1vAleg678ophsDY8ylwJeA37HWfr+cjdUYLIKZ/g4m0P/HtTfxmrsKwmtr\nuZWm/BC4GcAYswXYa60dAIrGmPPKH9m/BvhBHfu41P0xSfapMgb7rLX9aAxqxlp7fqVGHzgMvFp/\nB7VjjPl9Y8zbyg+HgFDXv7aMMRcBXwZus9beA6AxqD+NQV08yFhcdB2wrb7dWX6WbEZ8Gp8APmaM\n2Qo4wB3l7XcAXwA8kru0f1yn/i0Hfwl83hjzsySZ8beXt2sM6k9jUBufBv6x/ImEB9xe3q7rXzsf\nALLAneXyrH5r7S1oDBqBxqC2vgrcZIx5iCQuun2W42WBaYl7EREREZE6WG6lKSIiIiIiDUGBuIiI\niIhIHSgQFxERERGpAwXiIiIiIiJ1oEBcRERERKQOFIiLiIiIiNSBAnERERERkTpQIC4iIiIiUgfL\nbWVNEZFTYoy5Efh7a+0lU+z7M2CXtfZzM7T/I+BJa+3XF6+Xi8MYcznwb0A/8EZr7Z6qfW8H/gx4\nzlr7mpM8//0ky84fO/Xezvg85wAWOMdae2DCvqeAPwHuAT4CXEOStPox8B5r7chi9k1ElhdlxEVE\nFoi19o9mCsLLfgpI1aI/i+DngO9aa6+sDsLLfhl4/8kG4WU3nULbObPW7gbuB95evd0Ycz3QCXwd\n+AOSZNUW4DKgCfj9WvRPRJYPZcRFROav1RjzJeACIAv8qrX2B8aYzwJPW2s/aIz5U+ANQBE4ThL0\nvRG4GvgbY0wIPECSdb0ciEmysO+31gbGmJuBvwJC4AngVcANwI3AO4EWksz064CPAZuBFcAgSVbZ\nGmO+BzxKEvyvBu4E1gCvKLd/q7V228QXZ4z5X8AvAgGwA/h14KeBdwOeMabJWvtLVcd/GHgJcI4x\nprv8mv6q/Dwe8Djwm9baAWPM64D3A+lyn/7RWvu/jDGfKZ/uu+XX/gPgzdbaR8rPsQd4M3CsvO85\n4Ozyc5xTfr4WIAL+xFr7jXK7J4B3Vc5T5aPA3xlj/l9rbVze9n8B/2CtDY0x/wXssdZG5fM8Dlw8\n8VqJiJwKZcRFROZvI/Bha+3lwD+QlDKMMsacAbwXuMZaezVJ9vVaa+1HgEeA/9ta+1Xg70iC9EtJ\nAvQtwO8YY1YC/wT89/JzfBfYUPUUFwM3WmtfCbwW6LPWXmet3Qw8TBI4V5xtrb2C5E3AXwHfK/fp\nXuA3Jr4wY8zt5XNeY629DHga+Ky19gvAx4F/qQ7CAay1v131uj4M/B5JEH+VtXYLcBD4S2OMA/xP\n4FfKfbgO+H1jzCpr7e3l073SWrtv+ksPJNf/f5dfbx74DPA2a+2VJFn7jxljziz37fIpgnDKr98h\nCeQxxnQAtwCfKLe731q7o7zvLJLx/PIs/RIRmRcF4iIi8/e8tfbH5Z+fIMnsVjsAPAk8Zoz5IPCE\ntfZrU5zntST15rG1tkAS6L4WeDnwrLX2SQBr7T8CA1XtnrLWDpT3fQX4rDHmN4wxd5JkzFurjv33\nSp/L3++terximj59xlo7XH58J/DTxpj0FMdO53UkQe3j5Yz0rcBF5czz64GrjDF/DPwtSTDcMo9z\nQxLk/6j88/XAOuBr5ef6FsmnC5fNdIJypvvjwDvKm/478C1r7dHq44wxV5Fk4P++kmUXEVkoKk0R\nEZm/UtXPMUkwOcpaGxljXkGS5X4V8GFjzHettb814TwTkyEuSf14MPGcJCUXFUOVH4wxv0ZSUvH3\nwBeBEySlGhWFCX2r7vtUpuqTP0V/ZuIBv2Wtvafcx1Yga4xpISlT+SpJcPtpkiB9qnNPvK7VbwQK\n1tqg6rmes9ZeW9lpjFkP9Myhn58Gdhhj2oFfBe6o3mmM+QWSEpZft9Z+cQ7nExGZF2XERUQWmDFm\nC0lJx3PW2g8AHyYpO4EkyK7crHkf8B5jjGOMyZAE1N8GHgQ2G2MuK5/vTSQ3EcZM9hqS0pFPkcwE\n8nqS4PRk3QfcXg6aAX4T+K9yxn4+5/h1Y0zaGOOSlHt8ANgEtAN/aK29m6QsJFPV35Cxa9ND8kYG\nY8x1JFnvqWwFNhljXl4+9nJgJ7B+tk5aa48DdwN/CoTW2q2VfcaYN5OUDr1aQbiILBZlxEVEFpi1\n9kljzL8CjxhjhoARkoAWksDvg+VSj98E/g+wjSTjey/wF9baojHmF4HPGWMikvrrAMhN8XQfBO4q\n13aHJDdnXnoK3f8UcAbwk3IQvQv4pZmbTPK/y/16nCTIfoKkNnwI+Aaw3RjTVz73s8D5JKUy/w78\n0BhzC/D/kNR6/4/ya3p0qiey1vaU36j8jTEmS5Jgepu19kWY8WbNio+QTE34zgnbP0CSkf+kMaay\n7UFr7XvmcyFERGbixPFUCRYREamXcqnEH5LM/pEzxlwJfBNYXzXDh4iInOYUiIuINCBjzJ+TTH9Y\nKn+9z1r7g/r2SkREFpICcRERERGROtDNmiIiIiIidaBAXERERESkDpbtrCk9PYOqyTlNdXU109s7\n1eQRslRpzJcfjfnyovFefpbbmHd3t025FoMy4nLa8f1TmSJZTkca8+VHY768aLyXH415QoG4iIiI\niEgdKBAXEREREakDBeIiIiIiInWgQFxEREREpA4UiIuIiIiI1IECcRERERGROlAgLiIiInXXV+jn\nR4ceIYqjendFpGaW7YI+IiIi0hh2Ht/NXz38MQaKg6zIdGJWnF/vLonUhAJxERERqZuHDz/OF7Z/\nmVIUAHAsfxyDAnFZHlSaIiIiIjUXxRH/8fy9fPbZf8b3fF591isB6M331blnIrWjQFxERERq7vPP\nfZn7XnyA7qaV/MWrfpeXrX8JACcUiMsy0nClKcYYF/gosAUoAO+y1u6q2v8m4PeAGPiCtfbO8vbH\ngIHyYbuttbfXtOMiIiIyJ8WwxI8PP8qa5m7+51XvYWP7Gg6O9OLgcCLfW+/uidRMwwXiwK1A1lp7\nvTHmOuBDwC0AxhgP+EvgamAIeNYY84Xyz4619sb6dFlERETmqhAWAFjXspaWVDMAKdenPd2q0hRZ\nVhqxNOUG4F4Aa+1WkqCb8uMQuNBa2w+sBDygSJI9bzbG3G+MeaAcwIuIiEgDKoZFADJeetz2rmwX\nvYV+TWEoy0YjZsTbgf6qx6ExxrfWBgDW2sAY80bgI8A3gWEgB3wQ+CSwCbjHGGMqbabS1dWM73uL\n9RpkkXV3t9W7C1JjGvPlR2O+dI30JZWkHa0to+Pc3d3Guo5u9gzsJd0GXU0a/6VOf+ONGYgPANUj\n404MqK21/26M+RrwWeCXgS8Cu6y1MbDDGHMcWAfsm+5JentzC91vqZHu7jZ6egbr3Q2pIY358qMx\nX9oO9yflJ1HRoadncHS8m50WAHYe2Mc5HY34ob0slOX2Nz7dm45G/C1/ELgZoFxisq2ywxjTboz5\nvjEmY62NSLLhEfAOklpyjDHrSbLqh2rdcREREZnddKUpKzJdgGZOkeWjETPiXwVuMsY8BDjA7caY\n24BWa+1d5Zsz/8sYUwKeAj5PUiv+WWPMD0lmU3nHTGUpIiIiUj+VmzXTk2rEOwHoLSgQl+Wh4QLx\ncqb7jgmbt1ftvwu4a8L+ELhtkbsmIiIiC2DajHhWGXFZXhqxNEVERESWsMJoIJ4Zt31FOSOuucRl\nuVAgLiIiIjVViJJAfGJpSrPfRNpLay5xWTYUiIuIiEhNFYKpS1Mcx2FFplOBuCwbCsRFRESkporR\n1IE4JDdsDgc58kGh1t0SqTkF4iIiIlJTlVlTJtaIw9gNm5o5RZYDBeIiIiJSU5WbNdPu5Iz42A2b\nCsRl6VMgLiIiIjU1On2hP0VpSqY8l7hmTpFlQIG4iIiI1NRcMuK6YVOWAwXiIiIiUlOVjHjaS03a\nV6kRP65AXJYBBeIiIiJSU4WwQNpN4TqTw5DOTAcODr0FlabI0qdAXERERGqqEJYmLeZT4bkeHZl2\nlabIsqBAXERERGqqEBamnLqwoivTSW+hnyiOatgrkdpTIC4iIiI1VQyLUy7mU7Ei20kUR/QXBmrY\nK5HaUyAuIiIiNVWYNRDXoj6yPPj17oCIiIgsfT88sBWAMI4I45BcMDK6rW0gy+BgfvTYrqpFfc7t\nqH1fRWpFGXERERGpmTAKAPDd6XOBmktclouGy4gbY1zgo8AWoAC8y1q7q2r/m4DfA2LgC9baO2dr\nIyIiIo0hqATizvQhSGV1zRNaXVOWuEbMiN8KZK2115ME3B+q7DDGeMBfAq8CrgfebYxZNVMbERER\naRxBHALgu960x1RqxE8oIy5LXCMG4jcA9wJYa7cCV1d2WGtD4EJrbT+wEvCA4kxtREREpHEEcyhN\nafKzZL2MbtaUJa/hSlOAdqC/6nFojPGttQGAtTYwxrwR+AjwTWB4tjZT6epqxvenfzcuja27u63e\nXZAa05gvPxrzpaVtIAvAEMn/vc3ZDG1t2bH9VT+vXt1Od8sKToz06fdgCdPYNmYgPgBUj4w7MaC2\n1v67MeZrwGeBX55Lm4l6e3ML01upue7uNnp6BuvdDakhjfnyozFfeiqzogwMJf//RqWxbW1t42dN\n6ekZpC3Vzr6BQ+w91EOTn518QjmtLbe/8enedDRiacqDwM0AxpjrgG2VHcaYdmPM940xGWttRJIN\nj2ZqIyIiIo0jiGcvTYGqucRVJy5LWCNmxL8K3GSMeQhwgNuNMbcBrdbau4wxXwD+yxhTAp4CPk8y\ng8q4NnXqu4iIiMxgLjXiACuqZk5Z37p20fslUg8NF4iXM913TNi8vWr/XcBdUzSd2EZEREQaTBDN\nPmsKjC3qoxs2ZSlrxNIUERERWaLmMo84aApDWR4UiIuIiEjNzL1GXIv6yNKnQFxERERqZq6lKR3p\ndhwc3awpS5oCcREREamZud6s6bkeWT9DPizUolsidaFAXERERGpmNCPuzL6oXtpNUQyLi90lkbpR\nIC4iIiI1M9cacYC0l6YYlha7SyJ1o0BcREREamaupSlQDsQjZcRl6VIgLiIiIjUTRAGu4+I6s4cg\nSWmKMuKydCkQFxERkZoJonBO9eGQZMTDOCQs15WLLDUKxEVERKRmgjiYU1kKQNpLAag8RZYsBeIi\nIiJSM0EUzj0Qd9MAFDRziixRCsRFRESkZoIomHUxn4q0lwTiqhOXpUqBuIiIiNREHMeEcYjvzLU0\nJQnES5ECcVmaFIiLiIhITQTx3Ja3r0i7SY24SlNkqVIgLiIiIjUxnznEoepmTQXiskQpEBcREZGa\nqATi3jxLUxSIy1KlQFxERERqohKIp+Y5a0pRNeKyRM3tL6GGjDEu8FFgC1AA3mWt3VW1/xeB9wIB\nsA14t7U2MsY8BgyUD9ttrb29tj0XERGRmVRqxL051ohnlBGXJa7hAnHgViBrrb3eGHMd8CHgFgBj\nTBPw58Cl1tqcMeafgdcZY+4HHGvtjfXqtIiIiMxsvhnx1GiNuDLisjQ1YmnKDcC9ANbarcDVVfsK\nwEuttbnyYx/Ik2TPm40x9xtjHigH8CIiItJA5lsjPpoR18qaskQ1Yka8HeivehwaY3xrbWCtjYAj\nAMaY3wBagW8DlwAfBD4JbALuMcYYa20w3ZN0dTXj+3P7aEwaT3d3W727IDWmMV9+NOZLS9tAFr+Y\n5P/amrO0tWXH7696XBn71XEHAH7G0e/DEqQxbcxAfACoHhm3OqAu15D/NbAZeJO1NjbG7AB2WWtj\nYIcx5jiwDtg33ZP09uam2yUNrru7jZ6ewXp3Q2pIY778aMyXnsHBPEO5EQBKxZjBwfzovra27LjH\nlbHPDSb//fcNDun3YYlZbn/j073paMTSlAeBmwHKJSbbJuz/ByAL3FpVovIOklpyjDHrSbLqh2rS\nWxEREZmTIJrngj7l0pSCSlNkiWrEjPhXgZuMMQ8BDnC7MeY2kjKUR4B3Aj8AHjDGANwJfAr4rDHm\nh0AMvGOmshQRERGpvdEFfeY6j3h5Zc2SbtaUJarhAvFyHfgdEzZvr/p5uiz+bYvTIxEREVkI819Z\ns5wR1/SFskQ1YmmKiIiILEFBPM8FfTRriixxCsRFRESkJio14nNd0KcSsKs0RZYqBeIiIiJSE6ML\n+syxRtx1XFJuSqUpsmQpEBcREZGaGF3QZ46lKQBpL0UxUkZcliYF4iIiIlITQRziAJ4z9/Aj7aYp\nKiMuS5QCcREREamJIArwXB/H+f/Zu/MoOc763v/vqupltp5FUmuXbcm2HtvYlm3sRAYDJsEX8IVg\nAie/E2c1OPlxyUpyc25+OUlucpN7s/wg/pETSIBASG5ISG4SJ4EEA8HYYBuBZVtesPXIsmR7tMyi\n0Sw9Wy9V9fujuket0Sw9M93TpZnP6xwfz3Q9VfVMP92jTz/zraecmvdJeQrisnYpiIuIiMiqKAWl\nmuvDK9JeUkFc1iwFcREREVkVfuDXvGJKRdJNUQiKhGHYoF6JNI+CuIiIiKyKUliq+WY+FenyWuLF\nQDfMlrVHQVxEREQaLgxDSsHSg3jKi25zr/IUWYsUxEVERKThgjAgBBLO0ktTQHfXlLVJQVxEREQa\nrrKG+NJLUzQjLmuXgriIiIg0XCmMbm+/9NKU8oy4bnMva5CCuIiIiDTcuRnxpZWmzARx3V1T1iAF\ncREREWm4mSC+xHXEU25UmpJXaYqsQQriIiIi0nDFZdaIV2bEiwrisgYpiIuIiEjD+TM14kstTdGM\nuKxdS/tYugqMMS7wcWAfkAfutdYerdr+w8AvAiXgWeCD5U3z7iMiIiLNtfzSFNWIy9oVxxnxu4AW\na+2twK8CH6lsMMa0Ar8LvNla+3qgC3jHQvuIiIhI8y13+cJzq6ZoRlzWntjNiAO3AQ8AWGsPGGNu\nrtqWB15nrZ0sf58ApoG3LbDPnHp62kgklvbnMYmPbDbT7C7IKtOYrz8a87XFSzkAZNpbyWRaLthe\n/Vj12G/2uwBItjh6TawxGs94BvFOYLTqe98Yk7DWlqy1AdAPYIz5OaAD+CrwQ/PtM99Jhocn59sk\nMZfNZhgczDW7G7KKNObrj8Z87ZmYmgagmA/I5abP25bJtJz3WPXYT41H/5QP58b1mlhD1tt7fL4P\nHXEM4mNAdW/d6kBdriH/Q2Av8B5rbWiMWXAfERERaa7l1ojP3OJepSmyBsWxRvxR4E4AY8x+ogsy\nq30CaAHuqipRWWwfERERaaJSsLxVU87d4l4Xa8raE8cZ8fuBO4wxjwEOcI8x5m6iMpSDwPuBbwIP\nGmMAPjrXPs3ouIiIiMytFK7wYs1AM+Ky9sQuiJfrwD8w6+HDVV/PN4s/ex8RERGJiWWvmuJqRlzW\nrjiWpoiIiMgas9zSFC1fKGtZ7GbERUREZO2pzIh7NV6s+dChkwCEYYiDo9IUWZM0Iy4iIiINVwpL\neI6H6zhL2s9xHDwnqdIUWZMUxEVERKThSoG/5LKUigQJlabImqQgLiIiIg1XCkpLvlCzwnOSFALN\niMvaoyAuIiIiDVcK/CXfzKci4STIa0Zc1iAFcREREWm4UlhadmmKR5KigrisQQriIiIi0lB+4BOE\nwbJLUxJOglLo45eXQBRZKxTERUREpKEqZSUrqREHVCcua46CuIiIiDRUZQ3whLPMVVMc3V1T1iYF\ncREREWmofCkPrGBGvHz/QS1hKGuN7qwpIiIiDZUPVlaaUpkRf+z5E3QlpgG4/YYd9emcSBNpRlxE\nREQaqlJSstzSFK+87GEJlabI2qIgLiIiIg2V91dWmlKZEffDUt36JBIHKk0RERGRhlrxqinluFIK\n554Rf+jQyfO+V9mKXCwUxEVERKShzgXx2kpTHjl5gGPTIzPfD5cGADhVOMbw+ATDZ13OBC+zOevi\nug6wq+59FlkNsQvixhgX+DiwD8gD91prj85q0wZ8FXi/tfZw+bEngbFyk+PW2ntWr9ciIiIyn8pq\nJ8u9xb1Xri3v6ws5ezQJOBw7mqe9zeEtb07TVa+Oiqyy2AVx4C6gxVp7qzFmP/AR4F2VjcaYm4E/\nA3ZWPdYCONba21e5ryIiIrKIldaIu0RBfHQspLUNtu0okQjTHDnq8+9fmebNN0yydWNb3forslri\neLHmbcADANbaA8DNs7angXcDh6se2we0GWO+Yox5sBzgRUREJAYKSyxNmS0/He2XSPnsu6nI9h0B\nt92a5vY3pPB9+PpTJ5mY0ooqcvGJ44x4JzBa9b1vjElYa0sA1tpHAYwx1ftMAh8G/hy4EviSMcZU\n9plLT08bicTyfiFI82WzmWZ3QVaZxnz90ZivHWGvD0BXpp1MW8ucbTKZ8x9Pt0QrpYQh9B1OwSWQ\n3erT3pGcab/vOvC8ab720CTffmGAH3jDHhzH0WvnIqFximcQHwOqR8ZdKFCXHQGOWmtD4IgxZgjY\nBvTOt8Pw8OSKOyrNkc1mGBzMNbsbsoo05uuPxnxt6Rs5A0CYd8n50xdsz2RayOXOfzw/Hc1w58Yc\nJnIJWoBEqnju8XL7S3aG7My2c2JgnIMv9HHVJT167VwE1tt7fL4PHXEsTXkUuBOgXGLybA37vI+o\nlhxjzHaiWfXTjeqgiIiI1G44P4rruKS99JL37T/tQhDFlQD/gu2O43DrtVtJei7PHB2i5Ac8dOjk\nef+JxFUcg/j9wLQx5jHgPuBDxpi7jTE/vcA+nwa6jTGPAH8HvK+GWXQRERFZBSPTo7QmWnAcZ0n7\n+T4MDrgkvXIQDy8M4gCt6QRXXdrNdMHHvjoyZxuROIpdaYq1NgA+MOvhw3O0u73q6wJwd2N7JiIi\nIkvlBz5jhRybWjcsed+hQRffd9i6yeUsEBDM2/aayzZw+NURvnv8LHt3dZNMxHGuUeR8epWKiIhI\nw4wVcoSEtCZal7zv4EAUUzZvDgHw55kRB0inPK6+tIfpgs9Lp0bnbScSJwriIiIi0jAj+SgUty0x\niPs+jI44tLUHtLVGq5zNVSNebe+ubhwHXuwdJQzD5XVYZBXFrjRFRERE1o6RfHTT66XOiI+NOgSB\nQ8+GAMdxcHDPC+JHes/Vgu9piW5x39aSYGe2g96BcYbG8mzqmnupRJG40Iy4iIiINMzMjHhyaUF8\n+GwUUXp6orpwF48gnL9GvOLKXdEN71/s1UWbEn8K4iIiItIww/koEC+1NGX4rIvrhnR2RSUmruMu\nWpoCsH1TO20tCY6fHqNYWjy4izSTgriIiIg0zOhMaUrtZSLj4wFTkw5d3SFu+SbY0Yz44kHcdRwu\n395JyQ85dWZiWX0WWS0K4iIiItIww9OjODhLCuInT0cz2T0bzs1oe3gLLl9Y7ZKt0V0MX+lbP3du\nlIuTgriIiIg0zEh+lM5UBtepPXL0D0Qz313d51Y+qZSm1LIayoZMmo7WJCcGx/F9ladIfCmIi4iI\nSEOEYchofpTulq4l7dc/GOB5IW3tVUGcqEYlrGFW3HEcLt2aicpThiaX1mmRVaQgLiIiIg0xXpyg\nFPp0p2sP4lNTIblcdJGm45x73HUqa4nXNsN96dYOQOUpEm8K4iIiItIQUCzIJQAAIABJREFUlaUL\nlxLE+wejspRM5/mB2y1Hllou2ATY2NlCW0siKk8JVJ4i8aQgLiIiIg1RCeI9SwniA1ForixbWHFu\nRry2IO44Djuz7RSKAS+dHKv5/CKrSUFcREREGqISxLvSnTXvMzAY4DiQ6ZwVxFlaaQrAjmxUnvLs\nsaGa9xFZTQriIiIi0hAj00ubES+VQobOBmzc4OJ5529bamkKwNYNbbiuw9NHFcQlnhTERUREpCGG\nZ2rEu2tqf2YoIAhgS/bCeFIpTfFrLE0BSCZctm5o5cTgOGfHpmveT2S1KIiLiIhIQ1TuqllraUql\nPnzz5jmCeKU0JVzahZeV8pRnVJ4iMaQgLiIiIg0xnB+lPdlGykvW1H6gvGLKlqx3wbbKDYFqvViz\nYme2HYBnX1IQl/hJNLsDsxljXODjwD4gD9xrrT06q00b8FXg/dbaw7XsIyIiIqsnDEOG8yNkWzfW\n3L5/MKCjw6GtzYFZudljaaumVGTaUmzd0MbzLw9TLAUkE5qDlPiI46vxLqDFWnsr8KvAR6o3GmNu\nBr4BXF7rPiIiIrK6pv1pCn6h5jXER0ZDCoW568Nh+aUpANdfvpF80edI78iS9xVppDgG8duABwCs\ntQeAm2dtTwPvBg4vYR8RERFZRSPl+vBag/jAYBSwt8xRHw7LL02BKIgDPP3SmSXvK9JIsStNATqB\n0arvfWNMwlpbArDWPgpgjKl5n7n09LSRSFxYgyYXh2w20+wuyCrTmK8/GvOL2ym/F4AdGzaTzWbI\njLUs2P7scPT/3Ze1kskkSLecX1eeLqYhD47HBdsyHQsf+3U37qL1/md5/uVhva5iRGMRzyA+BlSP\njLtQoF7uPsPDk8vsnjRbNpthcDDX7G7IKtKYrz8a84vfy/19AKRKLQwO5sjl5l8+MJNp4eSpIqkk\npJJFcrkS+enieW38ILrBT7FUuGBbjoWXJhwZnuDqSzfw5JFBnrP9bNnQtpwfSepovb3H5/vQEcfS\nlEeBOwGMMfuBZxu0j4iIiDTI6Mwa4ouXpkxMBozlQrJZF8dx5myzkhpxOFee8oxWT5EYiWMQvx+Y\nNsY8BtwHfMgYc7cx5qeXss8q9FNERETmMXMzn5bFg/jpvuiP2HMtW1gxc2fNZdSIA1y3pxLEVScu\n8RG70hRrbQB8YNbDh+dod/si+4iIiEiTjCxhRvz06XIQn+dCTTh3Z83lBvGeTJpLNndge0eYLpRo\nScUuAsk6pFehiIiI1N1IfpS0l6I1sfCFlACn+opAyMh0jlzv3G1WUpry0KGTAHR1pHh1YJwXXh7m\nxr3ZJR9HpN7iWJoiIiIiF7mR/Cjd6e5F25VKIQODPh2ZEG+Bxcwcotpxf5kz4nDudvdPq05cYkJB\nXEREROqq4BeZKE7SU0NZypmhgCCAzs5wwXaO4+DiEYTLD+KbultIJV2ePTZEGC58PpHVoCAuIiIi\ndVWpD+9Kdy7atr98I5/OrsVLTlw8Apa3agqA6zjs2NTOcC7PK/3rZ+k8iS8FcREREamrytKFtcyI\nDwxEM9yZrsVnqF3HXfbFmhWXbo3Wcz54eHBFxxGpBwVxERERqataly4MgpC+gYDuLpd0evHjrrQ0\nBWD7pnbSSY+DdkDlKdJ0CuIiIiJSV7UuXTh0NqBYhJ07kgu2q/CclZWmACQ8l+sv38jA8BS9A+Mr\nOpbISimIi4iISF2N5MeAxYP46b4oVO/cUdtqyi4uIcGKZ7JvvmozAAetylOkuRTERUREpK5qnRE/\n3R+VmdQ6Iz6zlvgK68Sv37ORVMLlOy/0qzxFmkpBXEREROpqZHqUhOPRkWyft83hV0Y43efT2hZy\nvG+4puOeu7vmyspT0imP15osA8NTHOkdWdGxRFZCQVxERETqaiQ/Sle6C8dx5m0znnMIAofu7tpD\ntVuOLSu9YBPgjfu2A/CNp0+v+Fgiy6UgLiIiInXjBz5jhdyiZSkjw1FI71pKEHfqU5oCsHdXN5t7\nWjloB5icLq74eCLLoSAuIiIidXNm+iwhIRtbexZsd3bIBUK6e2qv0Z6pEa/DjLjjOLxx33aKpYBv\nfbd/xccTWQ4FcREREambk+NRqceOjm3ztpmaChnPOXR2hSRqu04TqF+NeMXrr9tGMuHywLdfpeTX\n55giS1HbekEiIiIiNThVCeLt8wfxE6d8wGHDxqXNbFdqxEthadn9q9bVnuJNN2znPw6e4LHn+mbq\nxhfy0KGT531/+w076tIXWZ80Iy4iIiJ1c3K8D4DtC8yInzgZBfCeDUtbOrDNjW5PnwvOLrN3F3r7\n915KwnP54mMva1ZcVl3sZsSNMS7wcWAfkAfutdYerdr+TuA3gRLwGWvtp8qPPwmMlZsdt9bes6od\nFxEREU6On6Yj2U5nqmPO7UEQcvK0Tzod0ta+tCCecbvxSDDiD7Ir3LvgqiwLuXBWezv/8cQJvvJ4\nL3fuv3RZxxRZjtgFceAuoMVae6sxZj/wEeBdAMaYJHAfcAswATxqjPlXYBRwrLW3N6fLIiIiMlWa\nZmj6LFf1XDlvSO7rDygUYOv2gKXmaMdx6fY2MeT3MRmM0e4tvDJLrX7gtt08fniAf/7mMa7fs5Gd\nm+f+ECFSb3EsTbkNeADAWnsAuLlq29XAUWvtsLW2ADwCvJFo9rzNGPMVY8yD5QAvIiIiq+j0RKUs\nZeu8bY6/EpWlbMourwyk28sCMOzX7/b0Ha1JfuLtV1HyQz71xeeZytenBl1kMXGcEe8kmuGu8I0x\nCWttaY5tOaALmAQ+DPw5cCXwJWOMKe8zp56eNhIJr+6dl9WRzWaa3QVZZRrz9UdjfvF5ajS6Q+ZV\n23ZfMH6ZsRZ8P+SVV6doa3PYvDVx3ox4uqW25VM2hVs4Xnie0eAMe9JX4TgOmY6WFfU7m81wRzaD\nPTHKlw+8wp/c/xy/9VP7aZujT7PPpdfp8um5i2cQHwOqR8atCtSzt2WAEeAI0Ux5CBwxxgwB24De\n+U4yPDxZ107L6slmMwwO5prdDVlFGvP1R2Mef4+cPHDBY4/3PQXAS/0nGB796gXbT5z0mc6HXGMS\nFPL5mcfTLUnyS7ipTqe3gRF/kNGpEVrdDnJML+MnOKfyWnvvG3czOjbNgef7+dB9D/PjbzXs3dV9\nXtvc+PSc+8rSrLf3+HwfOuIYxB8F3gn8fbnE5NmqbS8AVxpjNgDjRGUpHwbeB1wHfNAYs51o5lz3\nrBUREVlFI/lRHBy6UnOHjmMvR/Nquy/zGM3P2aQmPV6WEX+QEX+QVnfl9dzVF2/e+45raG9N8rUn\nTvD7n3uSa/ds4PXXbuP6yzfSmo5jbJKLWRxfUfcDdxhjHgMc4B5jzN1Ah7X2k8aYXwK+TFTf/hlr\n7UljzKeBzxpjHgFC4H0LlaWIiIhIfYVhyEhhjEyqA8+9sPSzWAx5pdenvc1hc9Zl9MTyz9XlbcLB\nYbg0yLbk7hX0+kKu6/Ajd+zle6/Zwt8/eJTnjp3luWNnSXgOV1+6ga6OFJds6SDhxfEyO7nYxC6I\nW2sD4AOzHj5ctf0LwBdm7VMA7m5870RERGQuE8VJSkGJ7vTcK5m8dNynWIRrr04se9nBCs9JkHF7\nGAvOkg+mVnSs+Vyxo4tf+7HXcurMBN9+vp+nj57h2WNDALSkPK6/YiN7d3YvchSRhcUuiIuIiMjF\nZyQfraUwVxAPw5DDR4o4Duy9sj4LJXQnsowVzjJSx9VT4MI1xgF6OtPcftMOxiYKHD0xyuFXh/nO\n8wMcPzXGDVdsYkPnyi4WlfVLf1cRERGRFasE8Z45gvjgmYCzwyGX7PRob6tP9GjEMoaL6WxPcZPJ\n8u437uGybRkGR6b5rb94nKMnRxffWWQOmhEXERGRFRvJRze37k53zjx2pHcEAPu8B3hctbd+sSPp\npOhwuxgPRpkOJmhx2+t27MW0phO84fptbOlp4/EXBvjI5w/x8++9nqsv7Vm1Plx4d9Adq3ZuqR/N\niIuIiMiKjeRHSblJWhOt5z0+NQmDAy5t7QHbt9U3dnR7mwE4WThW1+PWwnEczCXd/My7r8UPAv6/\n//M09tXhVe+HXNwUxEVERGRFSkGJXHGc7nTXBRdi9r7iAQ6XXOqv+CLN2bq9TQCcLByt63GX4sa9\nWX72B68nCEL++B+f4ZW+9bM2tqycgriIiIisyOhMWcr59eFTkzDQH82Gb8yGHOkdmfmvHtJuK21u\nhoHSiYatnlKL6y/fyE+98xqm8z5/8DdP8i+PHJ/zok+R2RTERUREZEXOrZhyrj48DEOOHU1wbja8\nMefu8TYTEnCy8FJjTlCj77l6Cz/2NsN0weerB3sZn6r9TqGyfimIi4iIyIqMzDEjfvwVn+GzLt09\n0Wx4o/SU68R7C0cado5a3X7DDm7au4nJ6RL/8XgvYxOFZndJYk6rpoiIiMiKVGbEu8oz4lPTId8+\nWMB1Qy6/stSw2XCIylM2eFvK5SmTpN22xp1sDrNLUK7ds5F8MeC7x8/yR393iF+5+0baW5Kr2ie5\neGhGXERERJYtDENG8qNkkh0k3AS+H/Lgw3mmpuCSy3xaVyEX70rtBUJONLk8peKmvZu4cmcXrw6M\n8/ufe5LhXL7ZXZKYUhAXERGRZZsqTVEIinSnuwiCkMe+XaB/IOCySz127ApWpQ87U1cC8ShPgWhp\nw/2v2cL3v3YnJwcn+F//+yDHTo01u1s1e+jQyfP+k8ZRaYqIiIjUJAxDvt33BA4Oo/kxMqkOhstl\nKZ3JTh78RoFXe302bnB4w60pjvetzkombV6GjYltDJZOrvrNfebjOA53v+VKujtS/NPDx/i9v36C\nu96wm7d+zyUkvJXNg546M8ELLw8zNDZNvujjOg5Do9Ps3dXNNZf14LmaZ71YKIiLiIhITR468Sj/\n8OK/znzvOR4pL6p/PvxMK+OnfbZtdfm+N6VJJhtYGD6HXam9DJVOc6JwlCta9q3quefjOA7/+dbL\nuGxbJ5/61+/yjw8f45vPnOadr7uMW67aTCrp1Xys3GSBA8/389izfbzSf+Fa5b0D4/zbt16hJ5Pm\n9ht38KZ92+lsT9Xzx5EGUBAXERGRRR0bfYV/fPGLpJ1WTPpmjk8cZTLIMZWYIAxcxs908pqrE9x8\nYxLPW90QDrAzdQWHJh+mt/BibIJ4dVnH2/dfytDoNA8+eZJP/9sLfP5rL3Ldno1cc9kGLt2aYeuG\nNpKJ82eyh3N5XjwxwndeGODpo2fwgxDXcbj+8o1k2pJku1tpTSfwg4Cdmzp46ugZHnuuj/u/cYwv\nPHqcW67azPe9did7tnUueDOl6n4GQUjJj0qKkgm37jdhkvMpiIuIiMiCRqbG+MTTf0UYhji9N/F4\nXwdBGIVdx/XZkC1xzQ0ON1zVvBnYVreDTYkdnCmdZCoYp9XtAGDSz/H4xFdxHY9bO+4k4TRnBZN0\nyuPuO/byn75nFw8fOsVjz/Vx4Pl+DjzfP9Mm05YkXZ4lz00VyRf8mW07sx3cdv029l+zhc721Hnh\nOYnLtXs2cu2ejbz3TZfz2HN9fO2JE3zru/1867v9bOlp5YYrN7F7WydbetpIpzxKfkBussjA8CQH\nDw8wNlFgdKLA+FSRsLzaZDLh0t2RZmKqyPdcvYVsd+vqPFnriBOGjVvbM84GB3Pr8wdfA7LZDIOD\nuoXweqIxX3805quvGJQ4cPpxtrZt4Yru3QyNTvPc8bN8/dAJBnoexu08Q7H3Svy+y9mQaSGdmaCz\nK6C7JyRRzrZ7d3Wfd8xa76CZbkmSn175DXAGiifoLR5hV/JKNid3MeoPcTz/PD7Rsbu8Tbyl84dx\nnebXUIdhyMh4gf7hSc6O5RmfLDKZL0Wz0WEU3C/bmuHyHV1cu3sDl2zJnLf/YhdRvmnfdp5/ZZiH\nD53imZfOUCgufuFsOunR2Z4infIgDMlNFRmbKBCG4ACvNVnevv9Sdm/rXPRYi1lv7/FsNjPnnxY0\nIy4iIrLOnRw/zWee+1v6JvsAcKYz5E9fgj+0jcTWl0l2niExtYlLN+6i+/ICiUQ8b1TTk8jSWzzC\nWb+fUljkdOllHBx2Jfcy4g8y6p/hiYmvcXP7Wy4ouRgo9lIKi2xL7l6VcgzHcejJpOnJpOdtc/sN\nO1Z0/NdctoHXXLaBQtHnH7/xEsNjecani2S7Wkl4Lh2tSTZ1t3B6aJLO9hQtqQtr1vMFn7Z0ggef\nPMlBO8hBO8hVl3Tz9v2Xcu3uDSpdWaHYzYgbY1zg48A+IA/ca609WrX9ncBvAiXgM9baTy22z1w0\nI37xWm+fokVjvh5pzOdXKPr0nZ2k7+wkp4cmOT00wZFTg0xPORRL0T9tnufQkkrQmvbYvs1jvO0I\nZ9xj9CQ3ck3XdexuvZJSyePs2DQPnfgmY53PghtQGtwBro+3oR/HCfFI4lMk5bRwdcsti5Z1NHtG\nHODI9JPkgui8KaeFPalrafc68cMSR/JPMRnkuLrlFq5tex0AI6VBnpl8hP7SqwBs8Layr+02NiXP\nD8FB6DNQOkEpLLIleQlJ5+K9EHJ2wK9licIwDOk7O8lzx85yemgSgB3Zdl5/7TZuMlmyXS1LCuW1\nvMdn92slH0ya7WKaEb8LaLHW3mqM2Q98BHgXgDEmCdwH3AJMAI8aY/4VeP18+8TNeHECB4ekmyDh\nJmb+PBaEAaXApxSU8EOfhOuRcKI2lRd2GIaUwnNtPMcj4SZION55bYIwoBT6+IGP53okHA/XOf+C\ni8r5ouO4eHO0CcMQP/TxwwAXB8/1LvhzXqVNEAY4C7QJwiBq4zh4Vf2tFoTBzLlm9+W8fvsl/MCf\nt03lfMCibRzHwcFZUZuQ6B+++dpU+l1rm4X+ZFrrccIwnPdnr+73ahyn8jwudJzK68N13Hl//sWO\nU+lLLa+hmePM0+9aX4thGC74+ljsONXvDRwHb46fv/IeKwXREmULvVdLgY/jOHO+52tpc+73Qokw\nJPr9Mus9Xf17CEI858I2fuBTCn2KQZEwDEm6CZJucuZ8lb4U/CLFoEgQBiS9JCk3OfN7MQxDCn6B\nvF8g7+fxw4C0lyLtpUi5KTzXIwxDikHxXJvAJ+WlSHtp0l7UJggDCn6BaT/PVGmaUlAi7aVpTbTQ\n4qVJekmCMGC6lGeqNMVkaZpiUKDFa6E10UJbso2UG7WZLE2RK4wzUZxg2s/Tmmglk2ynI9VBa6IF\nPwwYzY8yPD3KcH6EieIkmWQ73S3d9KS76E534Yc+g1NDDEyeYXDyDMP5UTpTGTamN9KT3kBPqoep\nQpHjIyfozZ3k9ORpzhaG8ErtMNnFxHAbo4MthA54mSHczrPRf2YSp5SidTKLO7kJxjeSLxWY6nmJ\n0bY+HCckLHlMh69wevAVQt/DH96Ck8zjdQ8RFlO0972WVreD665oo6Mnz/HcyxwdOU7gu+xJXdu0\n2uql2pjYRq4wQpe3ictSV8/023MSXJHex7H8s7ww/Tiuk2DCH+XlwvMAbElE4fpE8Shfz/0DO5KX\n85rW/UwEY5woHOVU8RjFMLoxj4vH1uSl7EhdwfbkbvLhFMOlfob9Ac6WBiiFBbq9LD2JzWxIbKHL\n20QpLDIejDLhjzAejFEKC7S7nXR4XbS73bS5GUICpoIJpoMJpsMJSmGRFqeNFredVredlNNKSEgh\nnKIQTpMPpvHDIim3hZTTQtppJVH+gFAKCxTCPMUwj0+JpJMi6aRJOmkqk7CFoMh0KU/OH8YPSySc\nJEknRcJJ4RLNjgf4lMIifliko9vn9Td1c8W2PTx4sI8nDg/x918/yt9//QidGY+t2TRdHQlaU9F7\ntSWR5sTAxMydVR3H4YodXTiOQ6YjzcREHsdxKPkB+YLPdNGP/l/wyRd9Tg9NUPIDSn6I5zo8cXgg\n+oDZkiDTmqSjLUlHa5JMa4qOtiSZ1iSt6QQJzyXhOSQ8F9eN94x9HGfE/wj4jrX28+XvT1prd5S/\nvh74Q2vt28rf3wc8Btw63z7zacaM+BP9h/jMd//mvMcSbgLK/7DNp6Y2jgeOgx/4M8GwWiUkOziU\ngtK8bRKuBzgz4Xq5bTzXw8XBDwP8OfpdCVyVNkEYXNCn6jaVQDNXG68cqALCOX/+2W1mgs8y2lT6\nUwl89WgTlMNYdb8b0+ZcCF1Wm3KYXEkbh3Nhc6E2lT455TY+AdW/qyrHcao+yM73OvMc79xx5ngN\nzQRbWPC1OPP6qOG1WMtrer73Ri3vH2AmSNerTWme93Ol3wnHW/A4led6vt8LlZ8t4XqU5vk9NdMn\nNzHv77IltSn3eaE2nuPNOVbVKh8MFmsz389d4ZTfq0sVBg6Ou8C58Wh3O5kOJyiGF5aMZBKd7Erv\noTPYwejUJIOlE4x6Jyg60Rrf7eEm9rReRcqNAlz1rLYfBtjeoZpDeBxmxAHywSQpp3XOD8j5YIrD\n009QInquWpx2dqauoMvbCMC4P8qJ4otMBOffgCfppOnxsngkGPYHmQ4n5j2/i0fA/P9mz82BRV4f\ntbyGHFxCFn4t1vKadsr3fFzoWNH7J1ywTRg4+Ge3UTx2/YJ9mrcfDiRcFz8ICJaR3BwHPNfFcaLX\n5y//Xzcsqx8rdTHNiHcCo1Xf+8aYhLW2NMe2HNC1yD5zmu8JaaS3Zd/A2659w2qfVkREZPluXMG+\nzck8NfjxZndABIjnLe7HgOpLg92qQD17WwYYWWQfEREREZHYiWMQfxS4E6Bc7/1s1bYXgCuNMRuM\nMSngjcC3FtlHRERERCR24lgjXlkB5Xqigql7gJuADmvtJ6tWTXGJVk352Fz7WGsPN+UHEBERERGp\nQeyCuIiIiIjIehDH0hQRERERkTVPQVxEREREpAkUxEVEREREmiCO64iLXMAY4wF/BNwMpIHfstZ+\nsbxKzkeBEvAVa+1vN7Gb0gDGmKuAbwNbrLXTGvO1yxjTBfw10b0hUsAvWWu/pTFfu6oWW9gH5IF7\nrbVHm9srqbfyndE/A1xG9G/47wLPA58luovRc8DPWGsXvhPRGqQZcblY/BiQtNa+HngXcEX58T8D\n7gZuA77XGLOSW09IzBhjOoGPEP0DXaExX7t+CfiatfZNwE8CHys/rjFfu+4CWqy1twK/SvR+l7Xn\nR4Eha+0bgLcBf0I0ufbr5cccon/b1x0FcblYvBU4aYz5N+BTwBfKIS1trX3JWhsCXwbe0sxOSv0Y\nYxzgk8CvAZPlxzTma9t9wCfKXyeAaY35mncb8ACAtfYA0V89Ze35P8BvlL92iP669Vrg4fJjX2Kd\nvq9VmiKxY4x5P/ChWQ8PAtPAO4hu5PQXRDNkY1VtcsCe1eij1Nc8Y/4K8Hlr7dPGmMpjnWjM14R5\nxvwea+3jxpitRCUqv4jGfK3rBEarvveNMQndHXttsdaOAxhjMsA/AL8OfLj84Rqi93VXk7rXVAri\nEjvW2k8Dn65+zBjzeeCL5Tftw8aYvUT/OGeqmmWAkVXrqNTNPGN+FHh/ObBtBb5C9EFMY74GzDXm\nAMaY64DPA//VWvtweUZcY752zf497iqEr03GmF3A/cDHrbV/Y4z5w6rN6/Z9rdIUuVg8AtwJYIzZ\nB7xqrR0DCsaYy8tlDG8FvtnEPkodWWuvsNbebq29HegD/pPGfG0zxlxD9Cfsu621XwLQmK95j3Lu\nd/t+4NnmdkcawRizhWgy5b9Zaz9TfvgpY8zt5a/fzjp9X2tGXC4WnwL+1BhzgKi+7APlxz8AfA7w\niFZT+HaT+ierR2O+dv0e0AJ8tFyONGqtfRca87XsfuAOY8xjRL/b72lyf6Qxfg3oAX7DGFOpFf8F\n4I+NMSngBaKSlXVHt7gXEREREWkClaaIiIiIiDSBgriIiIiISBMoiIuIiIiINIGCuIiIiIhIEyiI\ni4iIiIg0gYK4iIiIiEgTKIiLiIiIiDSBgriIiIiISBPozpoiIktQviXzn1hrr51j2/8Ajlpr/2qB\n/X8TeNpa+y+N62VjGGNuAP4RGAV+0Fr7ctW2nwT+B/CCtfatyzz+V4hub39m5b1d8Dy7AQvsttae\nnLXtGeC3gK8BnwauIpq0+ktr7R80sl8isv5oRlxEpE6stb+5UAgv+z4guRr9aYAfAL5urb2pOoSX\n/Tjwa8sN4WV3rGDfmllrjwNfAX6y+nFjzK1AN/AvwO8AJ8ofuG4B/kt5u4hI3WhGXERk6TqMMZ8n\nmi1tAX7KWvtNY8xngeestR82xvw28G6gAAwRhb4fBG4G/l9jjA88CHwMuAEIgS8RhdmSMeZO4A8A\nHzgEvAW4DbgdeD/QTjQz/Q7gT4G9wAYgRzSrbI0xDwFPEIX/zcBHgS3Am8r7/5C19tnZP5wx5jeA\nHwZKwBHgZ4HvBz4IeMaYVmvtj1S1vw/4HmC3MSZb/pn+oHweD3gK+Hlr7Zgx5h3ArwGpcp/+0lr7\nG8aYvygf7uvln/2bwHuttQfL53gZeC9wprztBeCy8jl2l8/XDgTAb1lrv1je7xBwb+U4VT4O/LEx\n5n9Za8PyYz8NfMJa6xtjfqHcd4BtQLr8fIuI1I1mxEVElm4ncJ+19gbgE0SlDDOMMbuAXwRusdbe\nTDT7+r3W2o8BB4FfsdbeD/wxUUi/jiig7wP+qzFmI/C/gR8tn+PrwI6qU7wGuN1a+2bg7cCItXa/\ntXYv8DhRcK64zFp7I9GHgD8AHir36QHg52b/YMaYe8rHvMVaez3wHPBZa+3ngD8D/q46hANYaz9U\n9XPdB/wqUYh/rbV2H3AK+H1jjAP8MvAT5T7sB/4fY8wma+095cO92VrbO/9TD0TP/++Uf95p4C+A\nH7PW3kQ0a/+nxphLyn27YY4QTvnnd4iCPMaYLuBdwKfK+4XlD0R/XX4OHiIqZxERqRsFcRGRpXvJ\nWvvt8teHiGZ2q50EngaeNMZ8GDhkrf3nOY7zdqJ689BamycKum8H3gg8b619GsBa+5fAWNV+z1hr\nx8rb/gH4rDHm54wxHyWaMe+oavtPlT6X//9A1fcb5unTX1hrJ8q6dHzTAAAgAElEQVTffxT4fmNM\nao6283kHUah9qjwjfRdwTXnm+Z3Aa40x/x34I6Iw3L6EY0MU8r9V/vpWohnrfy6f69+J/rpw/UIH\nsNYGRM/3+8oP/Sjw79bagVntfhTYRPRc/eYS+ykisiAFcRGRpStWfR0ShckZ5ZD3JqJylCHgvnJI\nnm3272CXqH68NPuYRCUXFeOVL4wx/4XoosJJ4G+Av521b35W36r7Ppe5+pSYoz8L8YBfKM9G30BU\ntvJeY0w7UZnKTcCTwK8QPZdzHXv281r9QSBvrS1VneuFyrnK59sPfLmGfn4G+M/GmE7gp4A/qWww\nxrzVGLMdwFo7TvS83lTDMUVEaqYgLiJSZ8aYfUTlDC9Ya38PuI+o7ASikF25WPPLwM8YYxxjTJqo\nRvmrwKPAXmPM9eXjvYfoIsKQC72VqHTk00SlE+/kXG3zcnwZuKccmgF+HvhGecZ+Kcf4WWNMyhjj\nEpV7/B5wJdAJ/Lq19gtEH1bSVf31OffcDBKV62CM2U806z2XA8CVxpg3ltveALwIbF+sk9baIeAL\nwG8DvrX2QNXmHwL+e9XY/BBRTb+ISN0oiIuI1Fm5pOTvgYPGmINE5Q8fKm/+AvBhY8xPEIXczcCz\n5f8s8D+ttWeJLpb8K2PMk0Rhu0Q06z3bh4H/u1yW8TWimeYrVtD9TwP/AXzHGPMC0Szwjyy8ywV+\nB3iZaPb7eaKZ7V8GngG+CBwu/1w/UN5e6e8/AY8YY64F/hvwC+Wf66eILjq9gLV2EHgP0QWwTxPV\n1v+YtfYViC7WNMbcvEBfPwb8AlWz4WW/DHQRjcvB8vnn+quGiMiyOWE41wSLiIg0S7lU4teJVv+Y\nNMbcBPwbsL1qhQ8REbnIKYiLiMSQMeZ3iZY/LJb/+yVr7Teb2ysREaknBXERERERkSZQjbiIiIiI\nSBMoiIuIiIiINMG6vcX94GBuxTU5PT1tDA/PtYiBxIHGJ940PvGm8Yk3jU/8aYzibbXHJ5vNzHkv\nBs2Ir0AisZKleqXRND7xpvGJN41PvGl84k9jFG9xGR8FcRERERGRJlAQFxERERFpAgVxEREREZEm\nUBAXEREREWkCBXERERERkSZQEBcRERERaQIFcREREZEGG5gc5FunDza7GxIzsbuhjzHGBT4O7APy\nwL3W2qNV298D/CoQAp+z1n50sX1EREREmunz9n7s8FEuyexgR8e2ZndHYiKOM+J3AS3W2luJAvdH\nKhuMMR7w+8BbgFuBDxpjNi20j4iIiEgzjebHODL8EgDHRl9pcm8kTuIYxG8DHgCw1h4Abq5ssNb6\nwNXW2lFgI+ABhYX2EREREWmmJweeISQE4LiCuFSJXWkK0AmMVn3vG2MS1toSgLW2ZIz5QeBjwL8B\nE4vtM5eenra63N40m82s+BjSOBqfeNP4xJvGJ940PvFXGaOnDz2D4zikvBSvTvRq7GIiDuMQxyA+\nBlQ/M+7sQG2t/SdjzD8DnwV+vJZ9ZhsenlxxR7PZDIODuRUfRxpD4xNvGp940/jEm8Yn/ipjNDg5\nxItnX+bqDXsJw5DDwy9y/FQfHcn2ZndxXVvt99B8oT+OpSmPAncCGGP2A89WNhhjOo0xDxtj0tba\ngGg2PFhoHxEREZFmeWLgEACv3XIDu7suBeDl0Veb2SWJkTjOiN8P3GGMeQxwgHuMMXcDHdbaTxpj\nPgd8wxhTBJ4B/ppoBZXz9mlS30VEREQACMOQx/sPkXAT3JB9DcfKAfz42Ktcu+nqJvdO4iB2Qbw8\n0/2BWQ8frtr+SeCTc+w6ex8RERGRpjk10UffRD83ZK+lNdHK7s5dgC7YlHPiWJoiIiIictE72B+V\npdy85UYA2pJtbGnbzCtjvQRh0MyuSUzEbkZcRERE5GIXhiGPnvw2CTfBaH6MR04eAKAt0Ur/5AD/\nfvyrdKe7ztvnth37m9FVaSLNiIuIiIjU2ZGhY0yUJtnZsZ2Ee2655E2tGwA4M3W2WV2TGFEQFxER\nEamzR155HIDLynXhFQriUk1BXERERKSO/MDnW71PkPbSbGnLnretM9VJwk0wNK0gLgriIiIiInV1\nZPglxvLjXJLZgeucH7Vcx2FjywbGCjnyfqFJPZS4UBAXERERqaMjIy8BsKNj25zbN7X2ADCk8pR1\nT0FcREREpI56cycB2NDSM+f2TS0bAVSeIgriIiIiIvUShiGv5k6wuX0jaS81Z5uN5RlxXbApCuIi\nIiIidTKcH2GiOMmenkvnbZP20mSSHQxNnyUMw1XsncSNgriIiIhInbxaLkvZ3bNrwXabWjdQDEqM\nFXKr0S2JKQVxERERkTqp1Ifv2XDJgu3OrSc+1PA+SXwpiIuIiIjUyau5EwDs7lk4iG8sX7B5Rhds\nrmsK4iIiIiJ1EIYhvWMn6Ul305nuWLBtV7qThJPQBZvrnIK4iIiISB2MFsbIFaMb+SzGdRx6WrrI\nFXL4gb8KvZM4UhAXERERqYNXx6KylF2ZnTW170xlCIFccbyBvZI4UxAXERERqYPKhZqXdC4+Iw7Q\nmeoEYCyvlVPWKwVxERERkTqoLF24q4bSFICudAaAUS1huG4piIuIiIjUQW/uJN3pLjpTmZraV9pp\nLfH1S0FcREREZIVG8zlGC2PsymyveZ+2RCsJx2M0P9bAnkmcKYiLiIiIrFBvbmkXagI4jkNnKkOu\nOE6gW92vS4lmd2A2Y4wLfBzYB+SBe621R6u2/zDwi0AJeBb4oLU2MMY8CVQ+Uh631t6zuj0XERGR\n9WrmQs0a68MrOtOdnM2PMFGcaES3JOZiF8SBu4AWa+2txpj9wEeAdwEYY1qB3wWus9ZOGmP+FniH\nMeYrgGOtvb1ZnRYREZH1a6kXalaoTnx9i2Npym3AAwDW2gPAzVXb8sDrrLWT5e8TwDTR7HmbMeYr\nxpgHywFeREREZFX05k7SmcrQne5a0n5d5SA+qiUM16U4zoh3AqNV3/vGmIS1tmStDYB+AGPMzwEd\nwFeBa4EPA38OXAl8yRhjrLWl+U7S09NGIuGtuLPZbG1XRktzaHziTeMTbxqfeNP4xMfYdI7h/Ag3\nbrv2vHHJZFoW3XdbchOcgqlwQmO6yuLwfMcxiI8B1c+MWx2oyzXkfwjsBd5jrQ2NMUeAo9baEDhi\njBkCtgG9851keHhyvk01y2YzDA7qE2xcaXziTeMTbxqfeNP4xMvzQxaArektM+OSzWbI5aYX3dcJ\nE7g4DE2MaExX0Wq/h+YL/XEsTXkUuBOgXGLy7KztnwBagLuqSlTeR1RLjjFmO9Gs+ulV6a2IiIis\na8utDwdwHZdMKsNoIUeolVPWnTjOiN8P3GGMeQxwgHuMMXcTlaEcBN4PfBN40BgD8FHg08BnjTGP\nACHwvoXKUkRERETq5dyKKbUvXVitM5VhtDDGaGFsyTXmcnGLXRAv14F/YNbDh6u+nm8W/+7G9EhE\nRERkfr25E3Qk25cdojvTGRiHvokBBfF1Jo6lKSIiIiIXhYniJEPTw+zK7MBxnGUdo7KE4emJ/np2\nTS4CCuIiIiIiy3RqPLokbWdH7be2n62yhGHf5EBd+iQXDwVxERERkWUamDoDwJa27LKPkSkH8f4J\nBfH1RkFcREREZJkGJ4cAyLZtWvYxEq5HR7KdPgXxdUdBXERERGSZBssz4tnW5QdxiOrEc8VxxosT\n9eiWXCQUxEVERESWaWDyDGkvRWeqY0XHqVywqVnx9UVBXERERGQZgjBgcGqIbOumZa+YUtGZVp34\neqQgLiIiIrIMY4UcxaC4ovrwCq2csj4piIuIiIgsw8BkVB++eYX14aDSlPVKQVxERERkGc5dqLlx\nxcdKeSm6UhnNiK8zsbvFvYiIiEgcPXLywHnfHxp8DoC+if4LtmXGWpZ8/C3tWzgyfJTpUp6WRHr5\nHZWLhmbERURERJYhVxgHoGOFK6ZUbG3bDMDA5GBdjifxpyAuIiIisgy5wjgJJ0GLV5/Z663tURBX\necr6oSAuIiIiskRhGDJenCCTal/x0oUV2ypBXBdsrhsK4iIiIiJLNFWawg/9upWlAGxp2wJAv2bE\n1w0FcREREZElypVvRZ9J1i+Id6Y6cB2X0fxY3Y4p8aYgLiIiIrJElQs1M3WcEXcch45kO+PlkC9r\nn4K4iIiIyBKNz8yIt9f1uAri64uCuIiIiMgS1XvpwoqOVAdTpWlKQamux5V4UhAXERERWaJcYZyE\nW7+lCysqM+yaFV8fFMRFRERElmBm6cJk/ZYurOhIlYN4QUF8PVAQFxEREVmCytKF9bxQs6JDM+Lr\nSqLZHZjNGOMCHwf2AXngXmvt0artPwz8IlACngU+WN407z4iIiIi9dKIpQsrOsrHHC/XoMvaFscZ\n8buAFmvtrcCvAh+pbDDGtAK/C7zZWvt6oAt4x0L7iIiIiNRToy7UjI4ZzYjnNCO+LsQxiN8GPABg\nrT0A3Fy1LQ+8zlo7Wf4+AUwvso+IiIhI3cysId6QGXGVpqwnsStNATqB0arvfWNMwlpbstYGQD+A\nMebngA7gq8APzbfPfCfp6WkjkfBW3NlsNrPiY0jjaHziTeMTbxqfeNP4rL7MWAsA0/1TAGzdsIG2\nZMv87TPzb5tLNpthOrUZgJJX0Bg3WBye3zgG8TGg+plxqwN1uYb8D4G9wHustaExZsF95jI8PLnQ\n5ppksxkGB3MrPo40hsYn3jQ+8abxiTeNT3PkctMADE+OkXATlKYgNz09Z9tMpmWmfa0GB3MUC9Eq\nLGfGhjXGDbTa76H5Qn8cS1MeBe4EMMbsJ7ogs9ongBbgrqoSlcX2EREREVmxaOnCcTLJjrovXQjQ\nnmzDwSGn5QvXhTjOiN8P3GGMeQxwgHuMMXcTlaEcBN4PfBN40BgD8NG59mlGx0VERGRti5YuDMik\n6ntr+wrXcWlLtjKhGvF1IXZBvFwH/oFZDx+u+nq+WfzZ+4iIiIjUVSOXLqzoSHboYs11Io6lKSIi\nIiKx1MilCys6ku1MFCcJwqBh55B4UBAXERERqVEjly6syKTaCQmZKK58YQmJNwVxERERkRqNF8tB\nvEE14qC1xNcTBXERERGRGuUKEyTdBGkv3bBzVMpedJv7tU9BXERERKQGfuAzXhyno0FLF1ZUZsR1\nm/u1T0FcREREpAav5k7ghwFb2zc39DyZSmmK1hJf8xTERURERGpwZOQYAFd0727oeWZKU4oqTVnr\nFMRFREREFvHy2KucnR5mR8e2mdKRRmnXxZrrhoK4iIiIyCIePvEYAFd272n4uSorsqg0Ze1TEBcR\nERFZQK4wzpP9T5NJdbC1rbH14XBuRlwXa659CuIiIiIiC3js1HcohT57uy9v6GopFUk3QYvXwoSC\n+JqnIC4iIiIyDz/w+ebJA6S9FLs7L1m183ak2rWO+DqgIC4iIiIyj2eHXmA4P8L3bn0tSS+5aufN\nJNsZL04ShuGqnVNWn4K4iIiIyDwqF2m+cefrVvW8Hal2/NBnqjS9queV1aUgLiIiIjKH0xP9HBk+\nyt7uy9nWvmVVz92R1Fri64GCuIiIiMgcvlGeDX/TKs+Gw7nb3Gst8bVNQVxERERklmJQ4vH+p+hK\ndXLdpmtW/fwd5bXEc1pLfE1TEBcRERGZ5btDh5kqTXPz1hvwXG/Vz59Racq6oCAuIiIiMsvjfU8B\ncMuWm5py/g7dXXNdUBAXERERqTJVmuK5oRfY2r6FnR3bmtIH1YivDwriIiIiIlWeGniOUlDili03\nrsqdNOdSCeKqEV/bEs3uwGzGGBf4OLAPyAP3WmuPzmrTBnwVeL+19nD5sSeBsXKT49bae1av1yIi\nIrJWPN4flaXcvOWGpvWhI6Ua8fUgdkEcuAtosdbeaozZD3wEeFdlozHmZuDPgJ1Vj7UAjrX29lXu\nq4iIiKwhI/lRXhx+iT1dl7KpdUPT+pH2UiTdpEpT1rg4lqbcBjwAYK09ANw8a3saeDdwuOqxfUCb\nMeYrxpgHywFeREREZEkO9h8iJOSWLTc2uyt0JNt1seYaF8cZ8U5gtOp73xiTsNaWAKy1jwIYY6r3\nmQQ+DPw5cCXwJWOMqewzl56eNhKJlS9HlM1mVnwMaRyNT7xpfOJN4xNvGp/GOPTkM3iOyx3XvJ7O\ndMd52zJjLUs6ViaztPazx7SnrZMTY6c11g0Sh+c1jkF8DKh+ZtyFAnXZEeCotTYEjhhjhoBtQO98\nOwwPT664o9lshsHB3IqPI42h8Yk3jU+8aXziTePTGH0T/Rwf6eXajVeRHwsZ5PznOJebrvlYmUzL\nktoDF4xpi9NKwS9yom+ItJda0rFkYav9Hpov9MexNOVR4E6AconJszXs8z6iWnKMMduJZtVPN6qD\nIiIisvY83n8IIBZlKVC9lrgu2Fyr4jgjfj9whzHmMcAB7jHG3A10WGs/Oc8+nwY+a4x5BAiB99Uw\niy4iIiICQBiGHOx7ipSX4rrsa5rdHeD8tcQ3NvHCUWmc2AVxa20AfGDWw4fnaHd71dcF4O7G9kxE\nRETWkkdOHpj5+szUEGemz3JZ5y4e73uyib06p3Kb+5xmxNesOJamiIiIiKyq3twpAC7N7GpyT86Z\nKU3REoZrloK4iIiIrHu58o1zNrb2NLkn5+g292ufgriIiIise5PFSTzHI+XGZ3WSmbtrai3xNUtB\nXERERNa9ydIUbclWHMdpdldmdCTbgHOz9bL2xO5iTREREZHVVApK5P0C3enupvaj+uJRgIJfAODV\nsRMXbAO4bYduJH6x04y4iIiIrGuTpSkA2hKtTe7J+ZJuEheHvJ9vdlekQRTERUREZF2bLEZBvD0Z\nryDuOA5pL02+PDMua4+CuIiIiKxrk6VJANoSbU3uyf/P3p3HyXXWd77/nFNrV3f1ola39sWWrcey\nLcv7hrENwSE4MDaQzLziSTIYnFxClkmYubkJr0xmMpOZLAPhOjcwgQAhASaEMOzgDYx3y9iWZMtI\nfiRZ+9Kb1Ev1Uus5949T1Sq1e1Uvdbr1fb9ebXXVqXPq132q2996+vc8580S0YRGxJcwBXERERG5\noFVGxFMhGxEHSETiFLwiJa9U61JkHiiIi4iIyAVtqDwiXh/GEfFIAkDtKUuUgriIiIhc0MI8Ip4c\nDeJqT1mKFMRFRETkgjZcHCHuxom64VvVOREJLjCUVRBfkhTERURE5ILl+z7DheFQjoZDMFkT1Jqy\nVCmIi4iIyAWr4BUo+qXQrSFeodaUpU1BXERERC5YQ6NriIdvoiacDeIjxWyNK5H5oCAuIiIiF6yz\na4iHc0S8Id4AQCY/WONKZD4oiIuIiMgFK8wrpkAwIh51owriS1T4pgeLiIjIkvPErhMTbrvz6jUL\nWMm5wnxVTQguc98Yb6AvN4Dn+7iOU+uSZA5pRFxEREQuWEMhHxEHSMfSeL43+qZBlg4FcREREblg\nDRfLQTykPeIAjeoTX7LUmiIiIiI1Vcu2leHiMHXRJK4T3rHJdFUQX1W/osbVyFwKXRA3xrjAp4Ft\nQA54wFp7YMxjUsBjwIesta9PZx8RERGRar7vM1IYoSXZXOtSJlUJ4gP5TI0rkbkWuiAO3AskrbW3\nGGNuBj4B3FPZaIy5HvhbYO109xEREZH5N9nIdhhlS1k8fFIhXUO8Ih1PA2pNWYrC+HeY24CHAay1\n24Hrx2xPAO8FXp/BPiIiIiLnGJ2oGeL+cICYG6UumlQQX4LCOCLeCPRX3S4ZY6LW2iKAtfZZAGPM\ntPcZT0tLimg0Muti29rSsz6GzB+dn3DT+Qk3nZ9wC+P5STck5/yY8/l1+oeDmLCsoZF0eu5rn8tj\nNtc1cirTRV19lKgbxLcwvgYWkzB8/8IYxAeA6u+MO1mgPt99entnvwRQW1ua7m71a4WVzk+46fyE\nm85PuIX1/GQG5/4y7PP5dZ7OBGN4kVKMTGZua0+nk3N6zHq3HoBTZ07TnGgC5vd7s9Qt9M/QRKE/\njEH8WeA9wNfK/d6752kfERERCbmJ+s7nYjWVxbB0YUX1yimVIC6LXxiD+DeBu4wxzwEOcL8x5j6g\nwVr72enuszClioiIyFwplTwywwXyRQ/HAddxcF2HhroYsejcT2sbLpSvqhnyyZqglVOWqtAFcWut\nB3x4zN2vj/O4O6fYR0REREIsmy9ypGOQ492D9A/mGRwpTPjYZDxCOhWjuSFBW3MdZl0zK5elcGZx\nyfeh4giu45KMJM77GAulUSunLEmhC+IiIiKydPm+z9HOQfYd66PjzDC+H9xfl4iwoqWOxvo4iVgE\nHx/fh2LJY3CkSGY4T09/lu6+LPuP9/Pcax001MW44qJlbL14GVde1EpjfXxGtQwXhklF60bD/L5j\nfRM+dvO62q41Xh9L4eAwoCC+pCiIi4iIyILoPDPMy7abnv5gEuPypiQbV6bZsDJNfV1syv09z6c3\nk6O7bwTXdbBH+3hhTycv7OnEATasTHPVpla2XtzKRasacd2JR8sLXpFsKUd7vPYrZ0yH67g0xOs1\nIr7EKIiLiIjIvBrOFtj+006Odw8BQWC++pLlNDXMbATbdR1am5K0NiW58+o1+L7PiZ4hdh88ze43\nTrP/eD+HOzJ859nDNNTFuM60ccNl7Zj1zUTcoMe8MvlzsBSsmFLMRycdCQ+TxlgDJ/Id5Eo5Eoug\nnUampiAuIiIi8+Z41yDP7u4gVyixoqWOa00bbc1zs0qJ4zisbWtgbVsD77ppAyO5InsO97L7YA+7\nDpzmyV0neXLXSdKpGNeZdm68rB3P93EdhxEvmPQYdxZPoE3H0zDUwUB+kLa6xVO3TExBXEREROZc\nyfPYYXvYe6QX13W48fJ2zLrmWU2unEpdIsp1po3MSJ71K9N0nRnhcEeGo50Znth5gid2niAZj7Bx\nZZqGNb0AxJ25v5DPfKlewrCtrrXG1chcUBAXERGROZUrlPjxjhN09Y7QWB/n9m2rWNa4sIHXdRxW\ntqZY2Zrixi3tdPYOc6Qjw5GOQV4/2ke0cIzYOhjqq6N1Gbizv9j2vGvUEoZLjoK4iIiIzJmhkQI/\nfPk4/YN5NqxMc+uVK+dlDfCZcF2HVa31rGqt58YtPse7B9k1YskBJw7W07k/xpq1JVau9ohOkIzC\nsKJKWksYLjm1/ckQERGRJaM3k+Oh7UfpH8yzZUMLt29bVfMQPpbrOqxfkaalNVg3cWVbDK8Ehw9G\neXF7jKOHXUqlGhc5gWQkQdSNKogvIRoRFxERkVk7dGqAR144Sr7ocZ1p44qLltW6pEmNeBlcImy6\n2GXDugKnTrqcOB7h6OEoHSd9Nl5com1FcIXPsHAch8Z4A325AbzKAuyyqIXrbaqIiIgsOkc6Mnzi\nq7soFD3esnVl6EM4wLA3ODpRMxqDdRs8bripwLr1JQoF2Pd6lFd3RBkaDFESB9KxNJ7vMVwcrnUp\nMgcUxEVEROS8HenI8PGv7mQkX+QtV61i05qmWpc0pYKfp+Dn3rR0YSQKGy4ucd1NBZa3lchkXHa9\nHOXYERffq1GxY1SvnCKLn1pTRERE5Lwc7QxC+HC2yIfevYV8MSRpdQpn1xAffyWXZBIuu6LEmdMe\nB2yUI4einOnx2LylSF1qISt9s0YF8SVFI+IiIiIyYx1nhvnEP+9iOFvkgz+/hVuvXFXrkqZtuBSE\n2Lg7+UVxlrX6XHNDgbb2yuh4jNPdtW1VSWsJwyVFQVxERERm5HR/lo9/dSeZ4QK//E7DW7YunhAO\n0F86DUDcmfoKn7EYmMtLmC1FfB/2/jTGkUMRajVXUksYLi0K4iIiIjJt/UN5Pv7VnZwZyPELd27i\nbdesqXVJM3aicABwaIxMf1Jp2wqPbdcWSSZ9jh2JsGd3lGJx/mqcSMyNUhdNKogvEeoRFxERkWkZ\nyhb4r198kd5MjisvWkYqGeWJXSdqUsv5Pu9waYDTxVO0R9cRc+Iz2re+wWfbdQXsnii9Z1x274py\nxdaFT+PpWANdIz3kSwXikdiCP7/MHY2Ii4iIyJRGckU++bVX6M3k2LyuiWs2L691SefleP4AAOvi\nl57X/rEYXLG1yMpVJYYGXV7ZGaN/YGEnqTaW21O6R3oW9Hll7imIi4iIyKRyhRIPfv1VDp4c4OLV\njdx0+QqcMF3pZgaO5ffj4LAmvum8j+G4sGlzifUbi+SyDt9/OEvP6YW7HGelT/zUUOeCPafMDwVx\nERERmVCh6PGpb+xm37E+rjdt3HrlykUbwodKA5wpddAeXUfCnd06hI4D6zd6bNpcJJeHhx7L0dW9\nMGF8WTJYq/1YpjZtQTJ3FMRFRERkXMWSx99++zVeO3SGqza18uv/6gpcd3GGcIDj+f0ArD3PtpTx\nrFrtccdtcYpFeORHOTq75j+MtySaATg6cHzen0vml4K4iIiIvInn+Xzh+3vZub+HLRta+Mi9VxKN\nLO7YMBdtKeO5eGOUO996Nox3dM5vGI9FYqTjDRwbPIFfq3UUZU4s7p8oERERmXO+7/OPj7zO9j2d\nbFrTyG+/fyvxWKTWZc3KUKmf3lIn7bH1JNyp1w+fqYs2RHnb7XFKJXj08RwnTxXm/DmqLUu0MFLM\n0j1yel6fR+ZX6JYvNMa4wKeBbUAOeMBae6Bq+3uAPwaKwBestX9Xvn8HMFB+2CFr7f0LWriIiMgS\n4Ps+//TD/Tz1yik2rEjze7+4jWQ8dHFhxo6V21LOd7WU6di4Psrbb4fHn8rz7e8P8nPviLO8dX7e\nwCxLNnMkc4yjmeO0pxbnCjYSwiAO3AskrbW3GGNuBj4B3ANgjIkBnwRuAIaAZ40x3wH6Acdae2dt\nShYREVn8PC8YCX/qlVOsWV7PR//NNlLJpbFO9fH8fhxc1sTmti1lrA3ro9zxFnjimTyP/DDH3T+b\npKVl7hsQliVbADiaOc71K66e8+PLwghjEL8NeBjAWrvdGHN91bYtwAFrbS+AMeYZ4HbgKJAyxjxK\n8DV9zFq7fWHLFhERWbyKJY/PfW8PP9nbxfoVDXz031xNOmMs3qwAACAASURBVDWzC96E1WCpj95S\nFytjG4i7yTk//r5jfefeEYUtV8bY+5rDwz/Mcvc7kzQ1zm0Yb0k24eBowuYiF8Yg3kgwwl1RMsZE\nrbXFcbZlgCZgGPg48DngUuAhY4wp7zOulpYU0ejs/1zU1pae9TFk/uj8hJvOT7jp/ITbXJ6fXKHE\nX/7jS/xkbxdbNi7jPz9wM/V144+EpxvmPsjOt4P9hwG4NH3FOfUnmL/R/tVroVTy2bfX4ZEf5vnF\n96ZpbJzLNpUkq9MrOD50ktbl9biOpv3NVBh+x4UxiA8A1d8ZtypQj92WBvqAfQQj5T6wzxhzGlgF\nHJvoSXp7h2ddaFtbmu7uzKyPI/ND5yfcdH7CTecn3Oby/PQP5fmb//Mqb5wc4IqNLfzW+7YyPJhl\neDA77uMzE9wfZm8M7sHBZZm37pz6c9n5m1CZSMZoX1Ggsa6el3YU+Pq3Brj7nQnqU3MXmFenVnEi\n08Heo4dpT7XN2XEvBAv9O26i0B/GIP4s8B7ga+Ue8d1V2/YClxpjlgGDBG0pHwc+CGwFPmKMWU0w\ncn5qQasWERFZZI53D/Lgv7zK6YEst1yxgg+8awuxqMsTu5bOhWIypV76St2sjG2cl7aUqVx1RYxi\n0WfXq0UefizoGa+rm5u12Nc3ruXFzp0cHTiuIL5IhfHvGN8EssaY5wgmZv6eMeY+Y8yvW2sLwEeB\nR4DnCVZNOQF8Hmgu94z/M/DBydpSRERELnSvvtHD//jSy5weyHLvWy/igXdfTiwaxlgwO8fy+wBY\nF99csxquuSrGlZdH6R/weeRHWXK5uVn7e316LQBHdYXNRSt0I+LWWg/48Ji7X6/a/l3gu2P2yQP3\nzX91IiIii1vJ8/jW04f4/vNHiEZcPnzPFdy4ZUWty5oXvu9zNGdxicz5RXymqzKRs6kNVq6O0HEy\nwrcfGuLKbUUuv6h5Vsde27A6mLCZ0YTNxSp0QVxERETmx5mBLJ/5zk/Zf7yftuYkv3HvlWxc2Vjr\nsubMwezuc24PexkyXi8tkXaO5WyNqgo4Dmy6tIRXgq7OCHt2R9m8zicaPf82lWQ0wYpUG8cyJ/B8\nTxM2FyEFcRERkSXO931efL2LLz+6j8GRAtdf1s4Hfu4yUsmlHQPOFDsBaImEY8TfceBSU8LzoKc7\nwo+eyPGOtyWIRM4/jK9Lr6VjuIvukdOsUJ/4orO0fwJFRESWgLGTJ9MNydHVP+68es2k+/Zmcnz5\nUcvO/T3Eoi6//LObeds1a3CcuZkwGFa+73Om1EmEKE2RZbUuZ5TjwuYtJUqew4lT8OOn8rz9jjiu\ne37nY0PjWl7s3MHRgeMK4ouQgriIiMgS5Hk+T71ykn954g1GckXMumY+cPdlrGhJ1bq0BTHo9VHw\nc7RGVuE683OZ+fPlurDl8iKH9yc5erzEk8/mueMt5xfG16WDN2JHM8e5YeU1c12qzDMFcRERkSVm\n7+Ez/NOPDnC8e5BkPMKvvNNwx9WrcZf4KHi1M6UuAJZFw9GWMpYbgZ+5M8Gjj+c4dLhENJLntlvi\nM/5LhSZsLm4K4iIiIkvEsa5BvvX0QXbu78EBbrtqFe+7/WKaGxK1Lm1B+b5Hb7GLKHHSbkuty5lQ\nLOZw19sSPPzDHPvfKBGNFrj5htiMwngymmBFfTvHMyc1YXMRUhAXERFZ5I51DfKdZw/xsu0G4NK1\nTfzSOy5dUiuizMSAd4YSBdqja0PfCx+PO7zzZxL84NEse22RYtHnLTfPrE1lfXoNHUOddA/3sKK+\nfR6rlbmmIC4iIrII+b5P55kR/vrrr7LrQA8AF61Kc89tF7P14mWhD6DzKWyrpUwlkXB4188mefRH\nwch4oRj0jE93NZX16bX8pGMHRzLHFcQXGQVxERGRGZrsEvBTrWIyW4Wix97DZ9hpu+jN5ABY3pTk\nqktaWbO8njOZLE++cnJeawgzzy/RV+oh7iSpd8P9F4HKxX4qLtkC+d1RDh+BYiHH2+9ITGud8coV\nNo9lTnDjymvnpVaZHwriIiIiIef7Pj19Wfaf6OfwqQGKJR8H2LAyzeUbWmhrqat1iaHRV+rBo8Sy\nSPjbUsaKRuGKq4q8/tMox0/CDx4N1hlP1U3+daxNBxM2jwxowuZioyAuIiISQp7vc/DEAC/ZLp57\nrYPBkQIAqWSUqze3sr69noa6WI2rDJ8zpaAtJayrpUwlEoEtVxbpOl7HgYMlvvtQlrvelmBZy8ST\nMBOROCvr2zk+qCtsLjYK4iIiIuOYrP1kPvi+T3ffCHuP9I5+ZIaD8B2LuFy0Ks2mNU2sbE3RlK4b\nvaCPnHW6eIr+Ug91TgN1bkOtyzlvrgtvvTVOY2ORHbsKfP+RLHe+NcG6NROvh76p+SJOnejk5c5X\ntJ74IqIgLiIisoB832dguEB37whdfcOc6BniaEeGI52Do6PeAM0NcW7buorrTBs9AyNEXI1yTuZw\nbi+H83uJEGVjYkuty5k1x3G4emuMxrTD08/meezxHFddGeXabbFxV1S5a/2dbD/5It85+DBXt28l\n5iriLQY6SyIiEioTjUTP9yTImfB9n0LRI1cokS96FAoe+WKJXMEjly8xnC0ynCsG/2YLwefl20PZ\nAvmC96ZjtjfXsWVDC2Z9M1s2tLByWWq0x3mhR+cXmyO513lx6FEiRNmcvIaUm651SXPm4o1RGtMO\nP34qz6uvFens8rjzrXHqU+e+MVtet4zb197K48ee5snjz/KO9XfUqGKZCQVxERGRKp7v05fJ0XF6\nmMxInuFskZFciWy+yEgu+HwkV6Tk+ePu//w49zkEvd11iSgrl6VobUyyoiVFW0sdK5el2LCigVRS\n/d7n40judX4y9CgxJ8EliauWVAivWN4a4Z6fT/LM83kOHy3xre9lufmGOL7//DkTUpsTTcTcGN87\n+CgODolI/Jzj3Lbm5oUuXaagIC4iC2LsiF66IUlmMBuqUc4wWejl8SY6P/P1fLVWLHn09Gfp6h2h\nq3eYrr6RcqvICN19WYqlN49YAzgO1CWiNDckSCYiJGMR4rEI8ZhLPBr8e+2lbaOhuz4ZI5WMkohH\nLqjLyy+Uo6MhPM4d6ffSW+yqdUnzJh53eNvtcV7fV+QnLxd48pk8Bw663HpTnHRDMDqeiMS5otWw\nq/s19py2XNO+tcZVy1QUxEVElhjf9ymWPArFqo/S2X+L1bfLH/uO9VHyfEqej+f5RCIuI9kCJc/n\n8KmBcx5bLHkUSn7lyYJ/qp7fASIRl2jEJRpxyp87RFwnuM91iUSCz2NRl3g0+Df4PMKRjgyRyuPL\nj424Dj39I8SjEaIRB7/81J7vgx98zZ4PpZJHNl9ipDx63TeYp28wR18mR28mR99gnt7BHJmhPOON\nZ6cSUda01dPeXEc2X6QhFae+HKrrEhESsciUS+Jds7ltLk6jTGF/die7hp8i5sS5PX0vLdEVSzqI\nQ9A3vsXEWLM6wnMv5Dlx0uOb38mybWuMyy+LEos5bG7exL7eN9jX9waXtlxMQ6y+1mXLJBTERUQW\nmO/7ZPMlBkcKDGULDI0UyeaLZPMlsvkSuUIJe7SXYsmnUPIolTy8ckgueT4Pv3A0+LzknROeS55f\nDuHjt0ycL3u0b+oHEQRwYNyAOxe+/czhWR8jHnVpTidYuayZtuYkQ9ki6boY6foY6bo4ifjEq1JI\nOPi+z+6RZ7HZl0k69bw1fQ/N0aX35mfsxX6qbV7XzDt/JsEbh0r85KU8L+8q8NPXC2y7MobZHOWq\n5VewveMlXu3ew62rb1jAqmWmFMRFRM6T7/vki14wAa8cqgdHiuV/z34MlT8Gs8XR2xP1F09XxHVG\nR4ojrkss5uK6DsvSCWJRd3S0+ZzPI+6btlVuHzjRXz6Wg+s6pBsS5HLF0fsqz+eWn891mHBk2Pd9\nfB/esnUVpZJHsRSM0BfLbx4qt0sln0KxPNmx/JEvlthzuJeSF7zJKJb84POSz/KmOgrFUnAxG4eg\n1aNcR6WeiOuQjEeoS0RJxiM01sdpSSdoaUjQnE6QSkTPqVuTIBcXzy/x0tCPOJLfS4PbzO3p91If\nCffVM+eL4zhccnGU9WsjvLa3wGt7irzwUoHde4qYzStpqm/iSOYYl2UvYVmypdblygQUxEVkQfh+\nMGpbKIewggf9AyMcON4/4T6OA67r4DpBAHQrQbHq/kpwrH5cpOo2MDpaHPx7dhS5supFrlAiXyiv\ngFEokSuPSgcfHtl8kYMnB4Jt5dUxKp970wzUlcl6DXUx2pqS1NfFGBwpkIhFSMRcYtEI0ahLLOKc\nE5ajEfecwB1xHZxJQvD59nN7/rlfR3WP+Ew5TlDj8z/tOK/9t2yceWgIUx+7wv3cOZjdDUDJL5Lz\ns5zIH2DAO0PKbWRT4ko6C0egMMVBlrh43OHabXEuNzFe/WmB1/cV2bmrSKRxM/HLXuTZYzt5+/pb\nqU8ka12qjENBXETOm+/7DGWL9A3m6B/Ms31PB8O5IiPZoD93uLzCRK5Qolj0xm1Z+MH2o/Nao8Pc\ntko4MDo5rz4ZCybpxYLe4XjUJRGPlMN1ZPTzyuMXYrKeQuCb6XuyuGRKvZwqHKK7cILeYic5P4tH\naXR7o9vKxYkriThqI6qWTDrceF2ca66KceBgkdf3LWewZxWDy0/x7X0/YtngNUQu62DzumZamxTK\nwyJ0QdwY4wKfBrYBOeABa+2Bqu3vAf4YKAJfsNb+3VT7iMjMlDyPweECmeEC/UPlyW6DudGJb/2V\nCXCD+QlXl4DyChPxYBS4MnGvMspbl4zhex4XrZr4z8peeRTd84JRbc8/O7J98vTQaAuEV/63MmGv\npSEePK58X9BWEYwmn8nkghH18uh5pa5oxMWsbz4bossBOhFzScajvHqwh0QsQizqTjlZT0TO5fs+\nBT/HsJdh2MtQ9As4OMFfT3Dw8OkpnKSjcIhB7+xfyVwixJ1k8OEmqXPqaYuuxtEl3CcUiwUTOi/b\nHKWr+wZ2deznTPx1zrRs5+939FD83iZa0kkuXdvEuvYG1ixvYPXyFMub6sa9UJDMr9AFceBeIGmt\nvcUYczPwCeAeAGNMDPgkcAMwBDxrjPkO8JaJ9gkbz/fwR1cZqFpt4JyVB85dhcAf8yfj4BfX6K2z\n/3XOfl79iOnwxxkzHHcU0Z/m2OI4QWW8imZa50wUvRIlrzTh9vG+5oUwna+5WJ6cN7oqBOW+W4JT\n4FMOnpztxw1CqI9XCto/SlUT/Yoln3yhVJ4MWCyvKlEiVwg+HxopkBkJgvfgcLBu8mRcx6GxIc7a\n9jqa6oPe26ZUnK6+YZLJKHXxCKnE5Eu2zab1AWDj6vlaCcAjV/TIFQswcvbe+rpg9M3Hm+THYOn8\nT8zzPTy/8iZr4X9WZvLz6ePzw52HJ9w68a0x9/gTbpnwnuoaJjdZHZPvO/p/DN8/+/+NYpahUjb4\nXcDZ3xGM3lP9/xn/nGNw7j2j+4ze9sGjRMkvUqIY/OsX3/Q1+vhnHzf62NLoPl7587yfZbiUoTiN\nHhKXCM2RNpoirTS6rcTdxJT7yPgcx2FFe5R3tm+he7iNZ068SHbtAZpWDJI9uY6XOo7wcqcPTvAa\ncLwYDfF6muoaaE01kE6kiMcdYgmPeBwisRKJmEt9PEkymiAZjZOMJoi4Lr5TxKOE7/h4FIm6ERLR\nGLFIlLgbI+JGiLgOvlMK/t/sl/B8j4gTIeJGiDoRIm4UFyd4DZV//5T8Eg4OruMScVxcJ0LEcYPX\nnu9R8j1838PzfVzHwSk/znFc3PIbPL98LM/3SUTiRNxw/SUljEH8NuBhAGvtdmPM9VXbtgAHrLW9\nAMaYZ4DbgVsm2Sc0dvfs4e92f4mSP3E4FFlQLpAsf1S15dZNY9cc0Fn+AII+zUo2LgHD5Y+J9M6o\nUlloOj/hNvHUitCJECXuJKl3m4g7CeJOkgjRN71JqHMbaHCbcTXaPefaUsu5++K3s7/vILt79sKG\nDsZ7i5MDusofQPAuMFv+WALWNKziYzf+Xq3LOEcYg3gj5/6KKRljotba4jjbMkDTFPuMq60tPSdD\nV21t07+C19vbbuLtW26ai6cVERERkVmYSYabL2F82zkAVH9n3KpAPXZbGuibYh8RERERkdAJYxB/\nFrgboNzvvbtq217gUmPMMmNMnKAt5fkp9hERERERCR1n7ETAWqtaAeUqgplP9wPXAg3W2s9WrZri\nEqya8qnx9rHWvl6TL0BEREREZBpCF8RFRERERC4EYWxNERERERFZ8hTERURERERqQEFcRERERKQG\nwriOeKgZYxzgOLC/fNfz1to/LK/W8iBQBB611v5JrWoUMMZcBrwArLDWZnV+wsEYUw/8b4LLB+WB\nf2etPaHzEw7GmCbgywTXZogDH7XWPq/zEy7GmPcCv2itva98W+cnJKoWj9hGcH2cB6y1B2pblQAY\nY24C/sJae6cx5hLgiwSXLHoN+E1rrTfZ/vNFI+IztwnYYa29s/zxh+X7/xa4j+DKoDcZY66pWYUX\nOGNMI/AJgl+CFTo/4fBrwMvW2tsJAt/vl+/X+QmHjwI/stbeAXwA+FT5fp2fkDDGPAj8Gef+/1vn\nJzzuBZLW2luAPyD4f5HUmDHm94HPEVxHGuCvgD+y1r6VYLW9e2pVm4L4zF0HrDHG/NgY8wMTaAQS\n1to3rLU+8AjwjtqWeWEq/8Xis8DHKF9gXecnPKy1/y/w38s31wN9Oj+h8kngM+XPo0BW5yd0ngN+\no3JD5yd0bgMeBrDWbgeur205UvYG8L6q29cBT5Y/f4ga/syoNWUSxpgPAb835u7fBP7MWvsvxpjb\nCEb13ktwdc+KDHDxwlR54Zrg/BwBvmqtfcUYU7mvEZ2fBTfB+bnfWvuiMeZxYCtwFzo/NTHF+VlJ\n8Lvtd9H5qYlJzs8/G2PurLpP5ydcGoH+qtslY0xUV/uuLWvt/zHGbKy6yym/cYXgZ6Zp4asKKIhP\nwlr7eeDz1fcZY1IEfXhYa58xxqwmOInpqoelgb6FqvNCNcH5OQB8qPw/sZXAo8C70flZcOOdn6pt\nby/38X8fuAadnwU30fkxxmwFvgr8R2vtk+URV52fBTbZz88YA+j8hMnY8+EqhIdSdT94TX9m1Joy\nc/+ZYJQIY8w24Ji1th/IG2M2lVsj3gk8XcMaL1jW2ksq/ftAB/Cz1toBdH5CwRjzh8aYXynfHARK\nOj/hYYy5HPgX4D5r7UMAOj/hpvMTOs8Cd8PoJNrdtS1HJrCz6i9L76KGPzMaEZ+5Pwe+bIz5eYKR\n8Q+U7/8w8BUgQjBr/YXalCcT0PkJhy8A/1D+i0UEuL98v85POPwZwWSmB8utXf3W2nvQ+Qk7nZ/w\n+CZwlzHmOYJJgPdP8Xipjf8A/J0xJg7sBb5eq0J0iXsRERERkRpQa4qIiIiISA0oiIuIiIiI1ICC\nuIiIiIhIDSiIi4iIiIjUgIK4iIiIiEgNKIiLiIiIiNSAgriIiIiISA0oiIuIiIiI1ICCuIjIDBhj\n7jTGvDbBtv9qjPnVKfb/Y2PMPfNT3fwyxlxtjHnDGLPDGLNxzLYPGGOOGmMemcXxHzXGLJ91oVM/\nz0XGmLwxZs042141xrxvzH3fMMb8zXzXJSIXHgVxEZE5Yq39Y2vtP07xsLcDsYWoZx78K+DH1tpr\nrbWHx2z7VeBj1tp3zuL4d81i32mz1h4CHgU+UH2/MeYWoBn4dtV9vw+8dSHqEpELT7TWBYiILEIN\nxpivApcBSeDXrLVPG2O+CLxmrf24MeZPgPcCeeA0Qeh7H3A98D+NMSXgceBTwNWADzxEEGaLxpi7\ngb8ASsAu4B3AbcCdwIeAeqAfeDfwv4DNwDIgA9xnrbXGmCeAlwnCfzvwILACuKO8/7+21u4e+8UZ\nY/4T8EtAEdgH/BbwM8BHgIgxps5a+2+rHv9J4EbgImNMW/lr+ovy80SAncDvWGsHjDHvBj4GxMs1\n/YO19j8ZY/6+fLgfl7/2p4FfsNa+VH6Ow8AvAD3lbXuBjeXnuKj8fPWAB/wXa+33yvvtAh6oHKfK\np4G/Nsb8D2utX77v14HPWGtL5X3fBvwc8LdAy9jvk4jIbGlEXERk5tYCn7TWXg18Bvgv1RuNMeuA\n3wVusNZeTzD6epO19lPAS8D/ba39JvDXBCF9K0FA3wb8R2NMK/Al4JfLz/FjoLqN4grgTmvt24B3\nAX3W2puttZuBFwmCc8VGa+01BG8C/gJ4olzTw8Bvj/3CjDH3l495g7X2KuA14IvW2q8QBNJ/rg7h\nANba36v6uj4J/AFBiL/OWrsNOAn8uTHGAf4D8O/KNdwM/KExZrm19v7y4d5mrT028bceCL7//638\n9WaBvwd+xVp7LcGo/f8yxqwv13b1OCGc8tfvEAR5jDFNwD3A35VvryZ44/JvCd4MiYjMOQVxEZGZ\ne8Na+0L5810EI7vVTgCvADuMMR8HdllrvzXOcd4F/I211rfW5giC7ruA24E91tpXAKy1/wAMVO33\nqrV2oLzt68AXjTG/bYx5kGDEvKHqsd+o1Fz+9+Gq28smqOnvrbVD5dsPAj9jjImP89iJvJsg1O4s\nj0jfC1xeHnl+D3CdMeY/A39FEIbrZ3BsCEL+8+XPbwFWAd8qP9cPCP66cNVkB7DWegTf7w+W7/pl\n4AfW2i5jTAz4KvC71tpTM6xNRGTa1JoiIjJzharPfYIwOcpa6xlj7iAY5X4H8EljzI+ttf9+zHHG\nDoa4BP3jxbHHJGi5qBisfGKM+Q2Cloq/Af43cIagVaMiN6a26trHM15N0XHqmUwE+PfW2ofKNTYA\nSWNMPUGbyjcJ2ku+QBDSxzv22O9r9RuBnLW2WPVce621N1U2lkezu6dR5xeAfcaYRuDXgA+X77+e\n4Hv4V8YYgJUELTlJa+0D0ziuiMi0aERcRGSOGWO2EbR07LXW/hnwSYK2EwhCdmWy5iPAbxpjHGNM\ngiBQPwY8C2w2xlxVPt77CSYR+rzZOwlaRz4PWIIR58gsyn8EuL8cmgF+B3iqPGI/k2P8ljEmboxx\nCdo9/gy4FGgE/sha+12CtpBEVb0lzn5vugkCMcaYmwlGvcezHbjUGHN7+bFXA/uB1VMVaa09DXwX\n+BOgZK3dXr7/eWvtunJby9WcbclRCBeROaURcRGROWatfcUY8zXgJWPMIDBCEGghCH4fL7d6/A7w\n/wG7CUZ8Hwb+u7U2b4z5JeAfjTEeQf91ERge5+k+Dny23NtdIpicuXUW5X8eWAf8pByiDxD0Sc/E\nfyvXtZMgZO8i6A0fBL4HvG6M6Ssfew9wCUGrzDeAZ8rLO/4/BL3e/1f5a3p5vCey1naX36j8T2NM\nkmCA6VestUdg0smaFZ8CXiCYACsisqAc3x9vgEVERGql3CrxRwSrfwwbY64Fvg+srlrhQ0REFjkF\ncRGREDLG/CnB8oeF8sdHrbVP17YqERGZSwriIiIiIiI1oMmaIiIiIiI1oCAuIiIiIlIDF+yqKd3d\nmSXdk9PSkqK3d7wFFuRCpNeDVOi1IBV6LUg1vR7mV1tbetxrMWhEfImKRmezjLAsNXo9SIVeC1Kh\n14JU0+uhNhTERURERERqQEFcRERERKQGFMRFRERERGpAQVxEREREpAYUxEVEREREakBBXERERESk\nBhTERQSA/b0Hee7ki7UuQ0RE5IJxwV7QR0TOyhazfO61LzFYGGJb2xXUx1K1LklERGTJ04i4iPCj\nY08zWBgCoHO4q8bViIiIXBgUxEUucIP5IR4/+tTo7Y6h7hpWIyIicuFQEBe5wD1y5HGypRzXtF8F\nQMdwZ40rEhERuTAoiItcwHqzfTx14nmWJVv4hUvfA0CnRsRFREQWROgmaxpjXODTwDYgBzxgrT1Q\ntf39wB8APvAVa+2D5ft3AAPlhx2y1t6/oIWLLEI/OPQYRa/Iz190F82JJhpi9eoRFxERWSChC+LA\nvUDSWnuLMeZm4BPAPQDGmAjw58D1wCCwxxjzlfLnjrX2ztqULLL4dAx18fypl1hZv4IbV14LwIpU\nOwf7D1MoFYhFYjWuUEREZGkLYxC/DXgYwFq73RhzfWWDtbZkjNlirS0aY9qBCJAnGD1PGWMeJfia\nPmat3T7Zk7S0pIhGI/P2RYRBW1u61iVIiIx9PXxp31fx8fnlq+9lRXsTABtb1/BG/yGKyRFWNy+r\nRZmyAPS7QSr0WpBqej0svDAG8Uagv+p2yRgTtdYWAcoh/H3Ap4DvA0PAMPBx4HPApcBDxhhT2Wc8\nvb3D81V/KLS1penuztS6DAmJsa+H77zxENuP76A12cLx7i5O9DwGwJlM8KP3zd2Psj69dvTxt625\neWELlnmj3w1SodeCVNPrYX5N9CYnjJM1B4Dqat2xgdpa+w1gDRAHfhXYB3zZWutba/cBp4FVC1Sv\nyKLzRv9hALYuvxzHcUbvb4wHP3oDOf0yFhERmW9hDOLPAncDlHvEd1c2GGMajTFPGmMS1lqPYDTc\nAz5I0EuOMWY1waj6qYUuXGSx6BruIepEWJFqO+f+0SCeVxAXERGZb2FsTfkmcJcx5jnAAe43xtwH\nNFhrP1uenPmUMaYAvAp8maBX/IvGmGcIVlP54GRtKSJhd3rkDM+depG71t9JMpqY02Nn8oMM5DOs\nTLXjOue+F6+PpYg4roK4iIjIAghdEC+PdH94zN2vV23/LPDZMdtLwH3zXJrIgnn6xHYeO/oE+VKe\n95fX954rB/oOAdCeWv6mbY7jkI6nGcgP4vv+OW0rIiIiMrfC2JoicsHrHjkNwBPHn+XU0Nxe6XJ/\n30EA2uvaxt3eGE9T8ksMF0fm9HlFRETkXAriIiHUUw7inu/xL/u+je/7c3bsA30HiTguy5LN425X\nn7iIiMjCUBAXCRnf9+kZOc3q+pVc0XoZtvcAO7t3T73jNAwVhjk52EFrXSsRd/x19JvKQbxfK6eI\niIjMKwVxkZAZLAyRLeVYXtfKL1z6HqJOhG/s/x75vNiwIwAAIABJREFUUn7Wxz7Qdwgfn/a6N/eH\nV6TLQTyjEXEREZF5pSAuEjKVtpTldctoT7Xx9vW305vr49EjP571sQ9U+sPHmahZkY43ANCvIC4i\nIjKvFMRFQqYyUbOtrhWAd254O82JJh47+uRoSD9fB/oOEnUitCYnvnx91I3QEKtXj7iIiMg8UxAX\nCZnu0RHxIIgnownee8nPU/SKfH3/d8/7uCPFEY5lTrKhcT3RCfrDKxrjDeRKOXJz0A4jIiIi41MQ\nFwmZnjFBHOC69m1c1Lie3T17znuk+o2+w/j4XNpy8ZSPbYw3Alo5RUREZD4piIuETM/IaVzHpTXZ\nMnqf4zhsbrkEgI7zXFe8ciGfS5ovmvKxjeU+cQVxERGR+aMgLhIy3SOnaUk0v2l5wZX17QCcGuo6\nr+Pu7zuI67hc3LRxyseOjohrCUMREZF5oyAuEiLZYo5MfnB0oma1VfUrgPMbEc8WshzNHGdDei2J\nSHzKxzcmNCIuIiIy3xTERULkdPYMECxdONaKVBsOznld8n7f6UN4vsclzVP3hwMkIgkSkYSCuIiI\nyDxSEBcJkdGlC8dZ5zseidOabKHjPFpT9nTvA5jWRM2KxngDQ4UhSl5pxs8nIiIiU4vWugAROat6\nxZRnTmx/0/Z4JE5P9gw/OvIkiWjinG23rbl5wuPu6dqPgzOt/vCKxnia7pHTZAqD095HREREpk8j\n4iIhMvZiPmM1JYJJlDO56mW+VODAmSOsS6+mLpqc9n6N5Uvdqz1FRERkfiiIi4RIz3AQxCe68mXT\naDgemPYxD/UfoegVp90fXjEaxLVyioiIyLwIXWuKMcYFPg1sA3LAA9baA1Xb3w/8AeADX7HWPjjV\nPiKLRc/IadLxBpJj2k4qGisj4jMIx7t79gCwZdnmGdXSmNCIuIiIyHwK44j4vUDSWnsLQeD+RGWD\nMSYC/DnwDuAW4CPGmOWT7SOyWJS8EmdyfRO2pcDZUer+aY6I+77Pru7XSMXq2NyyaUb11EdTRJzI\njNpgREREZPrCGMRvAx4GsNZuB66vbLDWloAt1tp+oBWIAPnJ9hFZLE5ne/F875xL248Vc6PUR1PT\nbhc5ljlBb66P61ZvJerO7A9gjuOQjjcwmB/E9/0Z7SsiIiJTC11rCtAI9FfdLhljotbaIoC1tmiM\neR/wKeD7wNBU+4ynpSVFNBqZaPOS0NaWrnUJMgMnTh0DYEPrKtra0qQHxp9YuSzVxLGBU8TrXBLR\nsxfnGe98/6gjWLbwxrVXn7N9omOP1ZJqpC/XTzTtsayuedpfi4SbfjdIhV4LUk2vh4UXxiA+AFS/\nEtyxgdpa+w1jzLeALwK/Op19xurtHZ6bakOqrS1Nd7daChaTNzqCIJ7yg3OXyWTHfVx9JLjq5Ykz\n3ee0sYx3vp87vIOYG2XbysvP2T7Rsceqc1IA7D12iM0tl0zvC5FQ0+8GqdBrQarp9TC/JnqTE8bW\nlGeBuwGMMTcDuysbjDGNxpgnjTEJa61HMBruTbaPyGLRXbWG+GRGJ1HmJu8T7xjqomO4i8uXmQkn\nf04lHQ9Cf+dwz3ntLyIiIhML44j4N4G7jDHPAQ5wvzHmPqDBWvtZY8xXgKeMMQXgVeDLBCuonLNP\njWoXOW89I8Hl7SebrAnQFJ/eWuKvdL8GwLa2K8+7psrk0K7h7vM+hoiIiIwvdEG8PNL94TF3v161\n/bPAZ8fZdew+IotKz8hpEpE4DbH6SR83unLKmBHxsVfifObkCzg4DBaG+OEbT0+7HaVaZUS8SyPi\nIiIicy6MrSkiFxzf9+kZOU1b3XIcx5n0sfFIjLpoctL1vYcKw5zJ9tKeaiMRiU/4uKkkInHikThd\nIxoRFxERmWsK4iIhMJDPkPcKU/aHVzTFGxkujlAoFcbdfmLwFADrGlbPurbGWAM9I2coeaVZH0tE\nRETOUhAXCYHKRM2p+sMrmhKT94kfy5wAYE161axrS8cb8HyP09kzsz6WiIiInKUgLhICPaMrpiyb\n1uMrfeID41xhM1fM0T3Sw/LkMlLRulnXpj5xERGR+aEgLhICPdNcurBidOWUca6weXzoFD6wNj37\nthSAdDn0d2rlFBERkTmlIC4SAjNtTRldS3ycEfHjmZMArJ2D/nCAxtERcQVxERGRuaQgLhICPSNn\niDgRWpLTu4x8IhInGUm8qUd8qDBMx3AXTfHG0ZaS2WqIqTVFRERkPiiIi4RA90gPrckWXGf6P5JN\niUaGCsMUvSIA+VKBJ48/h+d7mDm8HH3UjdCSaKZrREFcRERkLimIi9TYSHGEocLwtPvDK85O2Mzg\n+R7PnHyB/vwAm1s2sal545zWuCLVRl+un2wxN6fHFRERuZApiIvUWPcMJ2pWnJ2wOcCLnTvpHO5i\nTf1Krmm7as5rbE8tB87WKiIiIrOnIC5SYz0jwfrcbdNcurCiqTxhc/fpvRzsP0JLoplbVt+IO8WV\nOc9He6oN0IRNERGRuaQgLlJj3eVJkG3lUefpqoyIDxWGSUXruH3tLcTc6JzXB2dHxDVhU0REZO4o\niIvU2NmlC2cWxBPRBKloHVE3yh1rb52Ti/dMZEV5RFxriYuIiMyd+Rk+E5Fp6xruwcGhdYatKQB3\nrn0LjuOMTtycL8uSLUScCF0jCuIiIiJzRUFcpMZ6RnpYlmw+r7aSpkTjPFT0Zq7j0lbXStdwD77v\n48xDH7qIiMiFRq0pIjWUK+Xpz2dm3JZSC+2pNkaKIwwWhmpdioiIyJKgIC5SQz2VpQtTM1u6sBY0\nYVNERGRuha41xRjjAp8GtgE54AFr7YGq7b8E/C5QBHYDH7HWesaYHcBA+WGHrLX3L2zlIjNXCbXt\ni2JEvBLEu+f8gkEiIiIXotAFceBeIGmtvcUYczPwCeAeAGNMHfCnwFZr7bAx5p+AdxtjHgUca+2d\ntSpa5Hx0ly8b3zbDi/nUQntdeS1xXepeRERkToQxiN8GPAxgrd1ujLm+alsOuNVaO1y+HQWyBKPn\nqXIgjwIfs9Zun+xJWlpSRKOROS8+TNra5nclDZm9zOHgjzhmzQbams49X+mB5Jw+Vzp9/sdra0sT\nS18EO6Gv2KvX1iKn8ycVei1INb0eFl4Yg3gj0F91u2SMiVpri9ZaD+gEMMb8NtAAPAZcCXwc+Bxw\nKfCQMcZYa4sTPUlv7/BEm5aEtrY03d2ZWpchUzh25hQODu5Igu78uecrk8nO2fOk08lZHa+7O4Pv\nQzKS5FjfKb22FjH9bpAKvRakml4P82uiNzlhDOIDQHW1bnWgLveQ/yWwGXi/tdY3xuwDDlhrfWCf\nMeY0sAo4toB1i8xY98hpmhNNxCKxWpcyJcdxaE8t5+RQB57v4Tqa6y0iIjIbYQzizwLvAb5W7hHf\nPWb7ZwhaVO4tj5ADfBDYCnzEGLOaYFT91ALVKzItz5w4t1uq6BXpy/WzItX2pm1h1Z5aztHMcXqz\nfed1ASIRERE5K4xB/JvAXcaY5wAHuN8Ycx9BG8pLwIeAp4HHjTEADwKfB75ojHkG8IEPTtaWIhIG\nlfW4G2L1Na5k+trLl7rvGu5REBcREZml0AXx8ij3h8fc/XrV5xP9Pfy++alIZH4M5oMgno431LiS\n6VtRXmaxc6SbLWyucTUiIiKLm5o8RWokUxgEFueI+KmhzhpXIiIisvgpiIvUSCYfBPHFNCK+umEl\nddE6XuvZi+d7U+8gIiIiE1IQF6mRxdgjHnWjbFt+BX25fg4PHK11OSIiIouagrhIjWTyg9RFk0Td\n0E3VmNS1K64CYEfnqzWuREREZHFTEBepgZJXYrg4Qjq2eNpSKkzLJaSidezs3q32FBERkVlQEBep\ngUpbymLqD6+IulGuagvaUw71qz1FRETkfCmIi9TAYlwxpdq17dsA2NH1So0rERERWbwUxEVqYDGu\nIV7tskp7Sterak8RERE5T4trlpjIElFZunCxjIg/c2L7m+5bWd/Owf4jfOvAD2hPLT9n262rb6Q/\nN0BLsnmhShQREVl0NCIuUgOZRdwjXrE+vRaAY5kT59zv+T6fe+3L/PHzf86JwVO1KE1ERGRRUBAX\nqYHBwiB1kcW3dGG1Fak24m6cY5kTeL4PgO/77Oh6hVe6X8PzPZ46/lyNqxQREQkvBXGRBVbySgwX\nhmmIL462lIm4jsu69GpGSll6Rk4DsPfMfvb3HWRNwypaEs282LmTbDFb40pFRETCSUFcZIENFYbx\ngYZFuIb4WOvSawA4mjnO4YFjvNLzGqloHR/Z9kFuW3MTuVKeFzt31rhKERGRcFIQF1lglaULF3N/\neMWKVBvxSJzDA8d44dRLxNwYd6y9leZEE7esugHXcXn6xHb8cuuKiIiInKUgLrLAMqNLFy7u1hQo\nt6c0rKbgFcBxeOuam2lONAHQlGhk2/IrODF4isMDuvCPiIjIWAriIgtscPRiPot/RBzgkuaLqIsm\nuWXl9axItZ2z7bY1NwPw9DjLH4qIiFzoQrdkgzHGBT4NbANywAPW2gNV238J+F2gCOwGPlLeNOE+\nImFSWUN8KYyIAyxLtnDvprvH3ba5ZRPtdcvZ0fUK77/0PdTHUgtcnYiISHiFcUT8XiBprb0F+APg\nE5UNxpg64E+Bt1lr3wI0Ae+ebB+RsBksDJGMJIi5sVqXMu9cx+Uta26i4BV5oePlWpcjIiISKmEM\n4rcBDwNYa7cD11dtywG3WmuHy7ejQHaKfURCo+R7DBWGaVgCEzWn6+aV1xN1ozyjSZsiIiLnCF1r\nCtAI9FfdLhljotbaorXWAzoBjDG/DTQAjwH/eqJ9JnqSlpYU0Whk7qsPkba2dK1LkCrpgSTH+k/i\n47Mi3Uo6nVzY51/A56t+7bWR5pZ11/L0kZ/QTQdXtG1esDpkfPrdIBV6LUg1vR4WXhiD+ABQ/Upw\nqwN1uYf8L4HNwPuttb4xZtJ9xtPbOzzZ5kWvrS1Nd3em1mVIlUwmy97ONwBYlVxFJrNwF7pJp5ML\n+nxjX3s3tF7P00d+wvd++jjtzqoFq0PeTL8bpEKvBamm18P8muhNThhbU54F7gYwxtxMMCGz2meA\nJHBvVYvKVPuI1FzRK3I8c5L6WIrlyWW1LmdBXdy0gZWpdl7pfo2SV6p1OSIiIqEQxhHxbwJ3GWOe\nAxzgfmPMfQRtKC8BHwKeBh43xgA8ON4+tShcZDLHB09R9EuYxnU4jlPrchaU4zhsbFxPx3AXPdkz\nb1rmUERE5EIUuiBe7gP/8Ji7X6/6fKJR/LH7iITKkfJFbTam19e4ktpoTy0HoGu4W0FcRESEEAZx\nkaUokx/k1FAXLYlmGhNLfzLMM+NcwOdMtheA7adepj83cM62yoV/LgRP7Dox4bY7r16zgJWIiEit\nhbFHXGTJ2dH1Kj4+GxvX1bqUmkmXl2zM5DUZSEREBBTERRbEix07cYD1jWtrXUrNpGOVID5Y40pE\nRETCQUFcZJ71jJzm0MAR2lPtpKJ1tS6nZiJuhPpYigGNiIuIiAAK4iLz7sWOnQAXdFtKRTrWQLaU\no1Aq1LoUERGRmlMQF5lHvu/zYudOYm6UdQ2ra11OzTXGg4mqAwW1p4iIiCiIi8yjY5kTdA53c+Xy\ny4lFYrUup+Y0YVNEROQsBXGReVLwijxzMljG78YV19S4mnCojIhrwqaIiIjWEReZM57vcbD/CPt7\n32Bf30EO9R+m4BVpiNVzeath+6mXal1izVVGxAcUxEVERBTERebKl/Z+jZ907Bi9vaZhFZc2X8yt\nq28k6upHDSAVrSPiRNSaIiIigoK4yHmrvnpk53A3P+nYQXOiiStbL6M9tZxEJAHAof4jHOo/Uqsy\nQ8VxHNLxBjL5QXzfx3GcWpckIiJSMwriIrPk+R4vd74CwE0rr2VZsqXGFYVbOt5AX66fkWKWVGzu\n1lXXpePPj75vIiK1o8maIrN0oO8Q/fkBNjVtVAifhsZYpU9c7SkiInJhUxAXmYVsMcerPXuIuTGu\nWn5FrctZFNJaOUVERARQEBeZlVd7fkrBK3DV8stJRhO1LmdRaKysJa6L+oiIyAVOPeIi5+l0tpc3\n+g/TFG/kkuaLal3OonF2CcPwt6aof1pEROZT6IK4McYFPg1sA3LAA9baA2MekwIeAz5krX29fN8O\nYKD8kEPW2vsXrmq50Hi+x47yBM3rVmzDdfTHpemKR+IkIgm1poiIyAUvdEEcuBdIWmtvMcbcDHwC\nuKey0Rjz/7d3p8GN5Odh/7994L5IkOB9ztVzH3vverVa2ZLjQ4olOXZSqrgqkl0p///Ji1RSSVWO\nSqryIv8jdvLCFcclRSlV4iRO4vUqOqyVLNtZ7ezsoZ3Z2TnZQw7vGyBBXMTdnRcAuZzZOTgzJBsk\nn08VCkA3uvtpstF48MPTv98zwB8APRumeQHFNM1XdzhWsU9djl8jUVimL9RNuz/mdDi7TtgdJJFf\nompV0VTN6XCEEEIIRzRiM97LwBsApmm+Czxz13wP8CVgaMO0M4DfMIwfGYbxF/UEXohtc3nxKgAn\nWo46HMnuFHIHsYFsOed0KEIIIYRjGrFFPAykNjyvGoahm6ZZATBN820AwzA2LrMK/A7wH4DDwA8M\nwzDWlrmX5mY/ur63W+JisZDTIexJlm0xnLqN3+Wjp6Vt1wxKEwp5nQ5hXWu2mdHUBBWtSCjk3ZJj\nNRS8//497vp3yzof1cbtbEc8b7wzft95v/DiwGOtU2wP+ZwQG8nxsPMaMRFPAxuPBPVBCXXdLWDE\nNE0buGUYxhLQCUzdb4FkcvWJA21ksViIeLzxL4bbjaYzs6SLWQbCfWSzRafD2ZRQyEsmU3A6jHUe\nu5b8LaSStOixLTlWM9n779/jrn+3rPNR3H1u2Iv7KDZHPifERnI8bK/7fclpxNKUt4FfAqiXmFzd\nxDJfo1ZLjmEYXdRa1ee2K0Cxvw0lhwHo8Lc5HMnuFVrvwlBO+kIIIfavRmwRfx34nGEYFwAF+Kph\nGF8BgqZpfv0+y3wT+JZhGOcBG/jaJlrRhXgs5nKtE5+OgFyk+biC7iAKCmnpOWXfkS4hhRDiYw2X\niJumaQG/fdfkoXu87tUNj0vAV7Y3MiGgbFUYXhmlM9COT/c5Hc6upSkqAZdfujAUQgixrzViaYoQ\nDWssNUHZKnO0+bDToex6YXeQYrVIqVpyOhQhhBDCEZKIC/EIzOVafbgRPeRwJLtfyF27cEXKU4QQ\nQuxXDVeaIkQjG0qOoCoqh5sO8MHCZafD2dXWL9jcBUPd34vUOgshhHhSkogLsUmr5TwT6SkORPrx\n6o3TJ/duFa63iDdKnXi+WGE5UySdLZLKlUjlSpiTSaqWTaVqY9k2igKaqqCqKrqq4HFpeNwaXreG\nz6MT8OloqvzQKIQQYnMkERdik26t3MbGxohKffhWCLlqLeI7XZpi2TZzS6vcnkkxtZBldinH3FKO\nlezW1Kr7vTrvXl+grdlHT2uA7liQnliAcMC9awZ/EkIIsTMkERdik9bqw+VCza3h073oqk56m0tT\nbNtmJp7lyu0lbk4mGZ1Js1q8s3fTaNjDicEorREvkYCbSNBD2O/m1nQSTVXQVBVVVbBtm6plY9Vb\nyYvlCoVSlUKpSr5YIbtaJpsvMzy1wq2plTu2Efa7ONAVQVGgtclLa8SHS5fWcyGE2M8kERdik4aS\nw3g0NwPhXqdD2RMURaHJHWapkKRsVXCpDz8dPagueyPLtllYXmViPstMPEuu8HHiHfK7ONAVpq3J\nRzTi5fMv9uN133vbmfzjtZK/fKqThWSemXiWmXiO6XiWiYUMl0cSd7yuKeimtclHLOIl1uzDsm3U\nBmo1lzp4IYTYXpKIC7EJy4Uki6sJTrYcQ1M1p8PZMyKeMInCMgu5RXpCXU+0Ltu2SWaKjM6mGZvL\nkK+3ert1lYGOEN2xAF2tAXyeO09790vCn4SuqXS3BuhuDcCxj6cnM0W+e2GM+EqBxEqepXSBlWyJ\nkekUAH/+wTQHuyMc7olwuKeJwc4QLl2ONyGE2KskERdiE9ZG0zwq9eFbqskTAWA2N//YiXilajE+\nl8GcTLKULgK15PtwT4TBzjBtzT5UtTFamZtDHvraQ/S11y5UtSyblWyR+EqB+EqezGqJK7eXuHJ7\nCahdGDrQGeJwdxOHeiIc6okQ9rud3AUhhBBbSBJxITZhKFmvD5dEfEutJeIz2blHXjZXKDM0kWR4\nOkWpbKEAvW1BDnaH6Y4FdkXvJaqqEA17iYa9GH1NvHq2m5VskZHpFMPTKYanVxibzXB7Jg3v15Zp\nj/o53B1hoDNEf0eI3lgQt0tazYUQYjeSRFyIh7Bsi6HlYSLuEB3+NqfD2VOaPGHgzkT8YXXg6VyJ\na2PLjM6ksGzwujVOHYhyuLeJoM/1yDFstu58J2yMpbPVT2ern3LFYilVYDG5yuJKnniywPnlVc5f\nrf3NFAW66mUw3a0BulqDdLX65WJQIYTYBSQRF+IhZrPzZMs5nut4Srqf22JuzY1f9zGbnX/oa1ey\nRa6MLDExn8Gm1gvJiQMtHOgK7YrW78fl0lU6Wvx0tPiB2oWoqWyJpVSB5XSBpXSBxEqBmXjujuUU\noDnsIRbx0RLxEgm6iQQ89HVGUKwqkaCHSMCNbdtyXAshhEMkERfiIW4smwAcix5xOJK9qckTZja3\nQLacI+gKfGJ+Nl/mo5EEozNpbGpdDZ460EJve7ChehjZKaqi0Bzy0BzyALXSnlfOdLGcKjCTyDGb\nyDG3vEo8mWdxJY85tQJT91+fril43fodgxN5XPX7+mO/R8fn1fF79IaptxdCiL1AEnEhHuL60hAK\nCsejhtOh7Cp396O90ZHepvXHEU+E2dwCs9l5jjQfXJ9eKFW5ensJc3IFy7ZpCro5e7iV3ragtODe\nRVUUWpt8tDb5OHOo9Y555UqVZKY+Wmi2RFVRmJ5Prz+fjmcplqsks0Usy37otnwejaDPze3pFG1R\nPx1RP33tQWJNvif+YiTdJQoh9htJxIV4gNVyntHUBP3hXoLuT7bWiie38YLNI80HsSwbc3KFj24n\nKJUtgj4XZw61MNgV3pct4E/KpWu0Nftpa66VtsRiIeLxjwdRWkt+bXttkKIqxfogRcVylUKpQr5Y\nYbVQu+UKFRIreeIr+Tu24/No9LWFGOgMUa5YtEV9uKXrRSGEeCBJxIV4gKHkMJZtcaJFWsO3y9oF\nm7PZOa6NLvHdt8dJ5Uq4dJVnjBhGfzOalENsO0VRcOkKLl196EWvVcvmxECUxeQqs4lVJhcyTCxk\nuDW1UiuFoXYRaUvYS2drgL72INGQR37JEEKIu0giLsQDXF8aAuBEy1GHI9m7wu4QmqLx4fQYf37x\nIxTgSG+Es4dbt2WwHfHkNFWho16WcvrjaiIKpQpjs2ne+OkU80s5EqkCiVSBq7eXCPpc9LUHGegI\n0RLxSlIuhBA0YCJuGIYK/D5wBigCv2Wa5shdr/EDfwb8pmmaQ5tZRoiHOT/z7h3Pbdvm8uJVPJqH\nyfQ0U5nG6eZur7Asm6HhKtW8n1V3koPdIY4PRGkOeZ0OTTwGr1vn2ECUhZU8HG6lXLGYTeSYXMgw\nvZjjxniSG+NJmoJuDnVHONAdli9bQoh9rRHPgF8EvKZpvmgYxgvA7wK/sjbTMIxngD8Aeja7jBCP\nI1lcoVAtMhjuk9a7bbC0bPH2uyUSSxa+Q2EUX4bf/PIAQ8Mlp0MTW8Slq/R31AYeqloWc4lVbs+m\nmVrI8IEZ5+KtOP3tIY4PNNPa5HM6XCGE2HGNmIi/DLwBYJrmu/XEeyMP8CXgPz/CMkI8stncAgCd\ngQ6HI9lbqhV4/2KJ6zcr2DYcGNA4c+Ykb0zNMJ+bB6JOhyi2gaaq9LQF6WkL1ktYMgxPrzA+n2F8\nPkOsycvxgei+7ZZSCLE/NWIiHgZSG55XDcPQTdOsAJim+TaAYRibXuZempv96Hv8iv5YLOR0CLtK\nKH1nOcTi9CIKCofb+/Doboei2jqhHS738Hg/ecFfIg7mdSgUKkTCKp95JUB/n4tWf5Q3pn5I0l4m\nHOza0Ti3w4Pee6Hg1v8fHvW9vvH1jxvPk+xjCIhFgzx7ooPpxSwfDceZmM/w5uVZmoIenjnezuHe\npjsScjmfbQ/5u4qN5HjYeY2YiKepnafXqA9KqB93mWRy9THD2x3u7qJMPFwmU1h/XKwWWcgliPla\nKOUtShQesGTjC4W8d+zfTigWyuuPKxUYHdFYnNdQFJszJ3XOnHKh61UymSr99S4MRxYnOFw9tKNx\nbof/+WdDO7q9R3mv331uyGQf77h40DYfZZ1NARefPttFKlvixvgyIzMpfvz+JO9fn+f0wRYGOkOo\niiLns20gnxNiIzkettf9vuQ04rjQbwO/BFCv9766TcsIcV9zuUVAylK2QnJZ4dJPXSzOawSCFmef\nrvD0OTe6/nFrZ8QdJqD7mcnOORipcFIk6ObFkx186VMHONwTIbNa4vyVOb5zfpzR2fSmBhsSQojd\nphFbxF8HPmcYxgVAAb5qGMZXgKBpml/f7DI7E6rYq+Zy8wB0BdodjmT3qlRg/LbG/FytFbxvoEJP\nn4V6j6//iqLQFexgZGWMireMrjy4H2uxdwX9Ll482cHJA1Guji5zeybF+Stz3J5J8YWfGeC5Y+1S\nQy6E2DMaLhE3TdMCfvuuyZ/4ndc0zVcfsowQj8WybeZyC/h07/qoj+LRzM1X+fADF8WCgj9gceRo\nlWDowS2a3cFOhldGSVeXiOryS8R+F/K7eelkB6fqCfnoTJqvf+cGf/rOBF965QBnD7VKb0ZCiF2v\n4RJxIZy2XEhSrJY4GBmQD/pHVC7bfPBhmZv1SzR6+6r0DlTv2Qp+t65gLfleqSQkERfr1hLy3/r8\ncb57fowL1+f5vdeucrA7zK++cpCj/c1OhyiEEI9NEnEh7rJWltIpZSmPZH6xylsXSmQyNk0Rhf6D\nZULhzdf1dgc7AUhVl7YrRLGLtTX5+M3PH+fUg82wAAAePUlEQVQXXujn2z8Z5eKtOP//f/uQEwPN\nfPnTBxnsDDsdohBCPDJJxIW4y2xuHgWFDn+b06HsCpWKzcXLZa7frLWCnzquc+6si9HZ4iOtpzPQ\ngYJCqprYjjDFHtHdGuDvfPkUY3Np/uTN21wfT3J9/AOePhLjS68coKs14HSIQgixaZKIC7HBciHJ\ncmGFdn8MlyYXDD7MYrzWCp5K24RDCp96yU172+P1z+/R3LT6oqQKCWzblrKgBve/L884uv3BzjD/\n4G+c4+ZEktfevM3FW3EuDcd56UQHv/LyoIzUKYTYFSQRF6LOtm0uLl4B4HjUeMir97dq1eby1TJX\nrtVGxzx+VOeZc647uiR8HN3BTuL5axTsHD4luEXRir3sWH8z//Q3nubySII/+ckob1+b590bC7x6\nrpvPvzRAJLD7B+MSQuxdkogLUTeRmSaRX6In2EVHQMpS7ieZtPjJhSJLyzaBgMIrL7np7NiaUWq7\nAh1cjl8jVUngc0siLjZHURTOHY5x5mAr791c4NtvjfLnF6d568osn3uml198vg//PUZ6FUIIp0ki\nLgRQrJa4HL+Kqqici51yOpyGZFk2129WuHi5jGXB4YMazz/jxu3euhKSjRdsdjCwZesV+4OqKrx4\nooNnj7bx1pU5vvP2GN9/Z4K/vDTDL77Qx2ef7sXj3povjUIIsRUkERcC+NHEX5KvFDgRNQi65WKv\nu6UzFm9dKLGwaOH1wssvuOnr1bk1tfJY67t7uUq8Vm+cq9ZOSfHKDAZPP1nQYt/SNZXPnOvmpZMd\nfOO717k2tsxrb47yvQsTHBtoxuhrwuN6cEL+6tnuHYpWCLGfSSIu9r1EfpkfT76JT/dyvEVqwzey\nbZtbI1Xe+6BEpQL9fRovPe/G592eCykDWpiQGmWxPEXVrqApcooSj8/j0jh5oIUjvU3cGE8yNJHk\n8nCC66PLHOmLcKw/it8rx5gQwjlyBhL73usj36NiVXi2/Ry6Km+JNaurNuffLTI9Y+F2wSs/4+bg\noLbtvZl0uge4VbjEYnmaTvfAtm5L7A9ul8bZw62cGIxya2qFG+PLXB9LcnN8hYPdYU4eiBLyy0Wd\nQoidJ1mH2NfM5REux69xIDJAf6jH6XC2zbXRJYqF8qZfn1hUGLmlU6kodHWovPySm2BgE8NjboEu\n1yC3CpeYK49JIr5JD+tKUMosaly6yonBKEf7mrg9m+b62DLD0ylGplP0d4Q4MRilJeJ1OkwhxD4i\nibjYt64lbvJfhv4YBYVfO/JXmUxPOx2S4ypluD2sEV/UUFWbA4crfPr50I726d2id+JS3MyVx6U/\ncbEtNE3lSG8Th3oiTMxnuDa6zPh8hvH5DLEmL0f7m3n5VCe6tjNfPoUQ+5ck4mLfWS2v8sfD3+W9\n+YtoisavHv4CfaGefZ+IJ5cVhod0SiWFUMjiyLEKPj87ngirika7q5/p0jDp6jIRvWVHty/2D1VR\nGOwMM9ARYm5plZsTSWbiOeIrc1y9vcSr57r59Nlu6YtcCLFtJBEX+8q1xE3+69BrpEpp+kLd/Max\nv05XsMPpsBxVrcLYbY35WQ1FsekfrNDTa6E42BjY5RpkujTMXHlMEnGx7RRFoas1QFdrgHSuhDm5\nwvh8mm+/Ncb3Lozz7NF2PvtMD4OdYadDFULsMZKIiz3r/My7lK0KifwSC6txFlbjLBeSqCicbj3O\nsegRRlPjjKbGnQ7VMamVWit4oaDgD1gcOVolGLLveM3jdlH4JDpc/QDMlcc46ntmx7e/12ysIQ8F\nvWSyBQej2XoPq5F/FOGAm2ePtfF3v3yKd67P8+MPpnnn+jzvXJ+nvyPEp892Ua5YuPR7f1N93Hr8\nB+2D1PgLsXdJIi72pIXcIj+e/AmJ/BI2tcRSQaHd38ZTbado8kQcjtBZ1QqMj2rMzWqATXdvlf6B\nKqpDY52MFq5+YlpADZOozHErfwlduXNUxANeGXRJbC+fR+dnn+rh1XPd3Bhf5i8vzfDRyBL/6Q0T\nXauVtBzpbZKLO4UQT6ThEnHDMFTg94EzQBH4LdM0RzbM/wLwz4EK8B9N0/xGffolIF1/2Zhpml/d\n0cBFw7Bsi/98838Szydo8TbT5o/R7o8R87VI94TASrLWCl4sKvj9FoePVgmF7YcvuMMiWis5K026\nukRU39/lQ8I5qqJwcrCFk4MtJDNF3royy5/9dIrh6RTD0ymiYQ9HepsY7Azft5VcCCHupxGzki8C\nXtM0XzQM4wXgd4FfATAMwwX8W+BZIAe8bRjGd4AUoJim+aozIYtG8t7cRcbSE/SGunm563mnw2kY\nlQqM39aYn6u1gvf0VekbqKI2aO4Q0VqYLY+SkkRcNIjmkIe/+jODBP0u5hI5bk2lmI5neff6Ah8M\nLa5f+DnQIbXkQojNacRE/GXgDQDTNN81DGNjgegxYMQ0zSSAYRjngVeAScBvGMaPqO3TPzFN892d\nDVs0gtXyKt++/ae4NTdPxaR8Yc1SHG5ec9Vawe9TC95ofEoQl+IhVV2SbgxFQ1EVhe5YkO5YkNVC\nmZGZNMNTKwxPp/iX3/qAaNjD4Z4mBjtDuF0f13vtplpvqVkXYmc0YiIeptbCvaZqGIZummblHvMy\nQARYBX4H+A/AYeAHhmEY9WXuqbnZj647VBC7Q2KxkNMh7LhvXvw+2XKOr5z+IkG33+lwHJfPW7x1\nYZWbpoKi2AwetBk4qKDukhKdqBVjoThNSc8RdjWvTw8FpS73SezGv9+DzmfbsT+b3V4o6KW9NcSL\np7uYms9wfWyJ8bk0791Y4KK5yMHuJo4NRulqDTz2Pmznufx+63YqHuEs+d/uvEb8NE4DG48EdUNC\nffe8ELAC3KLWUm4DtwzDWAI6gan7bSSZXN3SoBtNLBYiHs84HcaOmsrM8KORn9Duj/F89DnenfvA\n6ZAcY9s2I6NV3r9YoliEUNjm4OEKwZBNueR0dJsXtKMsME0iv4CnGlyfnmFv9fqxk3ZrrykPOp9t\nx/48zvaiITefOt3J00di3J5JMTKTwpxMYk4mCfldLCSyvHSyk+aQZ9PrfFgsT+JBnxNOxCOctR/z\nhp10vy85jZiIvw18Afgf9Rrxjd0p3AQOG4YRBbLUylJ+B/gacAr4vw3D6KLWcj63o1ELR1m2xX83\nv42Nza8f+eK+vigzlbJ4+70S8wsWug7PPe0i0FKiXGrsUpR7CWvNKKikqgm6Oeh0OEJsit+rc+pg\nCycPRFlI5hmZTjExn+G1N0f5k5+McvpAC58608Xpgy0yeqcQ+1wjZiuvA58zDOMCoABfNQzjK0DQ\nNM2vG4bx94EfAiq1XlNmDMP4JvCtes24DXztQWUpYu95b/4SY+kJzrWd5mj0sNPhOKJatfnoWpkr\n1ypYFvT1aLzwnItgQGUivouawTdQFY2Q2kzaWqJkFXCru6+kQmyNrewrfKe2pygKHVE/HVE/zx1r\nw6VrvPXRLB/dXuKj20uEA25eOtnBp053bkHEe5fUq4u9rOEScdM0LeC375o8tGH+d4Hv3rVMCfjK\n9kcnGlGmlOXbI9/Hrbr41UOfdzocR8zNV3n7vRLptI3fr/Disy76+xru7f1YmrQW0tYS85UJ+tzG\nE63Ltm2WKrPoipuwFkVV9vZ1IqJxuF0ar57t5jPnuplazPLWR7O8c32eN96b5I33JmmNeDnQFWag\nM4TXvTfeu0KIh5N3u9jVylaFb1z9T2TLOb506Jdp9jY5HdKOymYtfnqpzNhEFUWB40d1nj7rwuXa\nOz2MtOidLFZmiFdmiGgtRLTWx1rPYnmKK6vnSVYXAVBQCWtRmrQYUb2dQc8JNEVOiWL79bYF+crn\njvBrnznEh8Nxzl+Z4/rYMolUgZ8OLdLdGuBAV5ietqCUrgixx8mnjtg1zs/c2SOlbdu8N3+RsfQk\nfaEePKr7E6/Za9aGm69WYHpSY3pKxbYVgiGLn/2Uj9aWvdfCqyoag57jDBU+YLw4xHHfc4+0fKqy\nxHvZH5CylgBo1trQ0Fm1M6Sry6SqCSZKN7lVuMQhz2l0xS0jd4od4dJVnjvWznPH2vnBexOMzaUZ\nnU0zHc8xHc/h0lX620O0N/k40teE1qid/m/SdpSYSNmK2O0kERe71lBymLH0JFFvM893PL0v+pm2\nbVicVxkf0yiXFNxum4GDFWJt1p5Mwtf41RBdroPMlEeYKA1xxPvUQ//fZbvEldXzjBavATZBtYke\n1yEC2seDrdi2TdFeZa48znJ1gaHCRQ55zmzz3gjxST6PzvGBKMcHoqxkiozWk/KRmRT/+o8uE/S5\nOHuolXNHWjkxEL2jf3IhxO4libjYlaazs1yOX8One3ml+wV0de9/KM0vVLl8USeXVVFVm76BCt29\nFtre33UA2vVe0tUEqWqCseJ1DnhP3ve1S+U53sv9kJyVIqRGaXP1EFFbPpG8K4qCVwkw4D6Ou+xl\nvjKBWbhIu7ufFhnNUzikKeThqVCMc4dbWUjmKZWtWgnL1TnOX53D7VI5NdjCU0dinD7UQsDrcjpk\nIcRjkkRc7DrJQop3Zn+Kpmi80v0SPt3ndEjbaiVlcelymfHJKqASa68yMFjFs886EFEUhQH3cW4U\n3ufy6pvEXN2EtOY7XmPZFjfz73Oz8D42Nke9z3DC9wLjxRsPXXe3+yBuxctk2eTN9Gs8H/wFut3S\nZaJwzlqvK6+e7eZv/vwRxmbTXLoV59KtOBfrN01VONwT4cRgrTW9vz2Equ79XweF2CskERe7ynxu\nkXfnPqBiV3m563mie/jizHTG4vKVMrfHqtg2xFpVuvqKhML37g98rX78Xjx7pMXMrXrpcxuMla5z\nIft9ulwHcCseXIoHXXExXLjMcnUevxriucBfIeZ6tBrRmKsbt+phrHiDC9nv8bT/5x7Y8i7Eo3iS\nLhFVReFgd4SD3RH+2qsHmV1a5cN6Uj40ucLQ5AqvvTmK36NzpLeJwz211w52hnDt8VGkhdjNJBEX\nu0KpWubS4hXM5AgKCk+3naE3tDcvxMlkLK5cr3BrpIJtQ3OTwlNnXfT1aAxP774REbdaVG8nXV1m\nqTpHurr0yflaO73uI2Sqy2Sqy4+8/ojWyqvhv8Zbmf/FxdU/p2TnMbzP7ItrEMTuoCgK3a0BulsD\nfP6lAdKrJYYmktwYX+bGeJLLIwkujyQA0FSFnrYgfW1B+tpD9LUH6WoNSDmLEA1CEnHR8KYyM3zr\nxh8xn1sg5A7yYueztHibH77gLpNcsbhyvcxovQU8HFI4d8bFgQFNksC79LuP0m73UbHLVKlQtWs3\nj+ojorU88fqjejs/G/413sz8CVfzFyjaeU77PvXI/4eyVWSk+BFz5XEiWitteg8xVzdeNfDEMQqx\nJux3r/e+ArCcLjAyk2JkJsXtmRRTi1km5jNsHHA65HfR0xaiJeShNeIlGvbSEvbQHPYS9LmwbVvO\nO0LsAEnERcMqVIr8ePJNfjjxF1i2xZGmg5yJndhTw9fbts38gsX1mxUmp6sANEUUzpxyMdivSa3n\nfSiKgk/Z3mQ2pDXzs6Ff5yeZ17lV+JCiVeCZwGdRlYd3IVe08gwXLjNSvEzZro1qulSZY7R4tbZu\ntZl2Vz9HvOfu6MVFiK0QDXt5LuxdT8wrVYv5pVUmFzNMLmSZX15lfnkVczKJZd271E2hNgiR26Xi\ncWl43Boel4ZbV4kn87h0FbdLw6Wrtce6ilvf+Fyrv6a2vEtXqVQtNFWRBF+IDRTbvvebcK+LxzN7\nesdjsRDxeMbpMB5L1apyYe59vj/2Z2RKWSLuML9x7NdZKjx6mUGjqlRtRseq3Bgqs5ysHYqtLSpn\nTukU7Cxb/Tnl8booFspbu9J9omKXGC5+xKqVIag20eHqI3yPHlgA8laWRGWORGUWiyo6LtpdvbTq\n3RSsVbLWClUqJMqzVCijoDLgOcZR77MEtciO7E8o6CWTlRKn3eRB/WE/rO78Qcs2NQe4ObLIcrrI\nUrrAcrrAcqZILl9mJpGjWKpSLNduW5kqaKqCrqlomlJL7l0qPa1BAj6dgNdFwOci4NUJ+d1Ewx6G\nJpN4XI/+y6D0I/5odnPesBvEYqF7HsB7p2lR7Hq2bfNR4jr/6/afsriawK25+aWBz/Jzfa/g1b17\nYrCe5aTFrZEKI6MVSiVQFBjs1zh+VKctpqIoCremnI5SbKQrbo54zjFWvE7KWmKkuIJb8dKqd9Gq\nd1G1KySrCyxXFinYOQBcipsu/QAxvQtVqV0oF9QiBLUIB7ynsGyLqdItbubfZ6x4nfHiDfrdxzjk\nPUNEa1lfRojt5NJVOlsCdLZ88teljQm+bduUqxbFUpVyxeL0wVbK5SrlqkWpbFGuWJQqtXm1x/Xn\n5drjcqVKqWwxt7xKtWpRsezafdUmmy9TzlgsLOcfGKumKusJesDnIujVCfrdNAXdhANuGYFU7FqS\niAtHrSXX8dUlLsevkigso6BwKDLIydZj+HQvHyxcdjjKJ5PP24xPVhgZrRJPWAD4vHD6hM5RQycY\nkA+QRqcpOoe8Z1i1MsTLMyxX55ktjzJbHgNqTYUKKk1ajGatjSYtdt8SltHC1fXHhz1nSVYXmCuP\nM166wXjpBgoqPjWAXw3hV0IMek/gV0P41CCaIqdssfMURcGta7jrva8c6n68X2/u13pvWTbPHm0j\nV6iQy5fJFcpk82XSuTLL6QLm1Aq5QplcvkI6V/pkfEDQ7yIS9NAUcNMUchMJeCiVqzLwkWh4clYX\njkoXM1xOXGMmW7uIqCfYxZnYCcLukMORPZlC0eanH2WIL6qsJBVqHxU2zVGbjs4qz58NS/33LuRX\nQ/R7jtJjH2KpMs9ydR4NF1G9lnw/aqKsKApRvYNmrZ2Vapx0dZlVO0PeyrJq1X4iniyb66/3KL7a\nKKPuAwx6TuBTg1u6f6IxPUm3h9thq4eVV1WFkN9NyO9+6PbKFWs9Kc+slljJFkllS6xkS0wvZpne\nsNwP3p2ks8VPX3uQ3rYQ/e1BettDBH3SY4xoHJKIix1n2RZTmRnenn2fC7O1gVdafS2cjZ0k5nvy\nHi+cYNs2qbTN1HSVyekqi3EL2669vYIhi1hbldY2C4+n9npJwnc3TdFpc/XQ5urZkvUpikKz3kaz\n3gbU3iMFO8eqlcGvhslbGVbryXmqukQyv8iN/Ht0uQ5wwHOKdlefXAAn9gWXrtIU9NAU9AAfl9TY\ntk2hVK0n5UVWsiUsy2ZqMctMIsc71xfWX9sS9tS7cgytd+sYDXvkPSQcIYm42BFlq8Kt5AhX4te5\nmrhJqpQGIOwOcab1BN3Bzl13EszmLObmLebmq8zNW+RWP76aqS2m4guWaG2z8O3tgT/FNlAVFb8S\nwq/Wfhnyq0HWvqJW7QrLlQXilRlmyreZKd/GrXgJa1FCahMn/C/hk+4RxT6jKAo+j47Po9PR4gdq\nrfOWZbO4kmdyodZjTO0+w4fDCT4cTqwvH/Dq6/2s97XV7jta/GiqlA6K7SWJuNgWlm0xk53DTI5g\nLo8wkhqjVK3V9gV0P893PM3p2AnSxfSmuoNzWqlks5y0iC9ZxOMW8cSdibfHAwP9Gr3dGj1dGj6f\nwq0p6ZlCbD1N0Ym5umnVu2o165UZktVFEpVZEswyVrpBSG0m5uompvcQc/VIYi72LVVV6Ij66Yj6\n17tzBFjJFu9Mzhez3JxIcnMiuf4al67SEwvc0Xre0xbEI3XnYgtJIi6eWLlaZn41znxugffnL5Eq\npYnnl9YTb6i1fA+G++gJdtHqi6IqKtlStuGS8GLRJpW2SKVr9ysrtQQ8m7uz7y6fF/p6NDraVTo7\nNKLN0jeu2FmKohDQwgS0MP22waqVJWMl17tHHC1eY7R4DeCOxHzQdxA59QuAN94Zb5iuLHe6Dn6t\nvOX0wdb1aflihanF7McJer3f9bG5j7v0UxToiPrpbg0Qa/bR1lS7xZp9RENeKTsUj6zhzsaGYajA\n7wNngCLwW6ZpjmyY/wXgnwMV4D+apvmNhy0jHk/VqpKvFihUCuTrt2w5RyK/RCK/vH6/XEhic2ei\n6td9dIf7aPe30R6I4dedrc8ol20KBZt8waZQZP1xftUmm7PJ5mrJdumTF+Tj9UJXp0q0WaUlqtIW\nUwkGJPEWjUNR1PWkHKBLH1xPzDPVFbLWCpliktHiNd7LgUfxE9KaCKnNHPE9RUANS48sYt/zeXSO\n9DZxpLdpfVqlajGbyN3Rcj61mGFuafUTy2uqQms9MW8OeYgE3ESC7tp9wEO4/lha1MVGjXjm/SLg\nNU3zRcMwXgB+F/gVAMMwXMC/BZ4FcsDbhmF8B/iZ+y3TaPKVAhWrAoCNXR8kwV5PZNcGWLJsuz69\nPt9ee1afZm+Yt2E5G5uyVSaBm/hymopVoWxVqNRvZatC2SpTrJbWE+z1RPuupLtsPXwAGK/mocUb\nJaCFCLlChPQwQT2EW/HUmg5sKK9CyrbWU/X6rtXj/nhda38Ly2L9VrVqXVtZFljVO59X69PKFZtK\nuXZfLteS7nKlfl+uJd2V6oP3Q9chGFBoiylEwiqRcP0+ouL3ScItdpeNiXmHqx/bttYT8xwp0uXk\nhlKW6wD41CBBtYmAGkZX3KiKiopWv1dRWOv9h/XHCmuTlLVnn7hXFQ0NHa1+ryraXevizvUqG5e+\nc433mwNKfRCsB73mk+t6Mo8zws3mtvvo0d1/iWRh5b7zcpU0q1Zxk1vYXFQrxdR95+Wt7EO38vA4\nNi9duvfgNJvdlzXNzQrNzSHOHK1ds2HbNulcmaV0gcRKgXgqz1KqQCJVIJHKsjB5/785gMel4fNo\neN06Xo+Gz6Xh9eh43Ro+j467PjqppqnoqoquKWiaiktX0NXaQEi6pqKpCi5dRVVqx79Sv0dRUNee\nU7tX6/dut0bAe+/Uz1OATOlh/6Pdza/70NTG+iLUiIn4y8AbAKZpvmsYxjMb5h0DRkzTTAIYhnEe\neAV48QHLNIwPF6/yzWt/+InW40ahKiou1YVL1Qm5Ari02uPaNBcuzYVbdRN0+Qm6AwRdAbA0/ui1\n/D1akjd3ct8uigIuF7h0hUhExesFn1fB61XW79ceB4MKHjfSwi32rI2JucfropAv1hPzFQpWjqKd\np2jniVemiTsdrNhS37+ws9v73ts7u70H+e75HdxYsH7rhs38/lus3+75taVSv4kt1xXo4J8+//ed\nDuMOjZiIh7nz2KwahqGbplm5x7wMEHnIMvd0v6FGt9PPx17i50+8tNOb3Xa/1pBfexrA2R1eTggh\nhBC7SmNdKVeTBjaO5qJuSKjvnhcCVh6yjBBCCCGEEA2nERPxt4FfAqjXe1/dMO8mcNgwjKhhGG5q\nZSnvPGQZIYQQQgghGo5i241Vr7yhB5TT1K7L+CrwFBA0TfPrG3pNUan1mvLv7rWMaZpDjuyAEEII\nIYQQm9BwibgQQgghhBD7QSOWpgghhBBCCLHnSSIuhBBCCCGEAxqx+0KxBQzDUIBpYLg+6R3TNP+x\ngyGJHSYjzoq7GYZxiVovUwBjpml+1cl4xM4zDON54P8zTfNVwzAOAd+iNjrRNeDvmKZpORmf2Dl3\nHQvngO/xcc7w703T/O/ORbd/SCK+dx0ELpmm+QWnAxGOue8otWL/MQzDCyimab7qdCzCGYZh/CPg\nN6iNTA3wb4B/Zprm/zYM4w+onR9edyo+sXPucSw8Dfwb0zR/17mo9icpTdm7nga6DcP4S8Mw/tQw\nDMPpgMSOu2OUWkCGXtrfzgB+wzB+ZBjGX9S/nIn95Tbw5Q3PnwberD/+AfDZHY9IOOVex8IvG4bx\nE8MwvmkYRug+y4ktJon4HmAYxm8ahnFt4w2YB/4f0zQ/A/wr4A+djVI44J4jzjoVjHDcKvA7wF8B\nfhv4L3I87C+mab4GlDdMUkzTXOs6bW2karEP3ONYeB/4h6ZpvgKMAv/CkcD2ITkJ7wGmaX4T+ObG\naYZh+IFKff55wzC6DMPYeNIVe5+MOCs2ugWM1M8BtwzDWAI6gSlnwxIO2lgPvjZStdifXjdNc+3/\n/zrwe04Gs59Ii/je9S+AvwdgGMYZYEqS8H1HRpwVG32N2nUCGIbRRe0XkzlHIxJO+9AwjFfrj38R\neMvBWISzfmgYxnP1xz8HXHQymP1EWsT3rv8X+EPDMH6ZWsv433I2HOGA14HPGYZxgY9HqRX71zeB\nbxmGcZ5aLxlfk19I9r1/AHzDMAw3cBP4Y4fjEc75v4DfMwyjTK209W87HM++ISNrCiGEEEII4QAp\nTRFCCCGEEMIBkogLIYQQQgjhAEnEhRBCCCGEcIAk4kIIIYQQQjhAEnEhhBBCCCEcIIm4EEIIIYQQ\nDpBEXAghhBBCCAdIIi6EEEIIIYQD/g/i7XOb7gQN8QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12,5*4))\n", "gs = gridspec.GridSpec(5, 1)\n", "for i, cn in enumerate(df.columns[:5]):\n", " ax = plt.subplot(gs[i])\n", " sns.distplot(df[cn][df.Class == 1], bins=50)\n", " sns.distplot(df[cn][df.Class == 0], bins=50)\n", " ax.set_xlabel('')\n", " ax.set_title('histogram of feature: ' + str(cn))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train and test split on time series, using first 75% as training/val, and last 25% as test" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "TEST_RATIO = 0.25\n", "df.sort_values('Time', inplace = True)\n", "TRA_INDEX = int((1-TEST_RATIO) * df.shape[0])\n", "train_x = df.iloc[:TRA_INDEX, 1:-2].values\n", "train_y = df.iloc[:TRA_INDEX, -1].values\n", "\n", "test_x = df.iloc[TRA_INDEX:, 1:-2].values\n", "test_y = df.iloc[TRA_INDEX:, -1].values" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total train examples: 213605, total fraud cases: 398, equal to 0.00186 of total cases. \n" ] } ], "source": [ "print(\"Total train examples: {}, total fraud cases: {}, equal to {:.5f} of total cases. \".format(train_x.shape[0], np.sum(train_y), np.sum(train_y)/train_x.shape[0]))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total test examples: 71202, total fraud cases: 94, equal to 0.00132 of total cases. \n" ] } ], "source": [ "print(\"Total test examples: {}, total fraud cases: {}, equal to {:.5f} of total cases. \".format(test_x.shape[0], np.sum(test_y), np.sum(test_y)/test_y.shape[0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2 types of standardization z-score and min-max scaling.\n", "\n", "z-score will normalize each column into having mean of zero and standardization of ones, \n", "which will be good choice if we are using some sort of output functions like tanh, \n", "that outputs values on both sides of zero. \n", "Besides, this will leave values that are too extreme to still keep some extremeness\n", "left after normalization (e.g. to have more than 2 standard deviations away).\n", "This might be useful to detect outliers in this case.\n", "\n", "The second min-max approach will ensure all values to be within 0 ~ 1. \n", "All positive. This is the default approach if we are using sigmoid as \n", "our output activation.\n", "\n", "Just to recap the differences between sigmoid and tanh below \n", "(sigmoid will squash the values into range between (0, 1); \n", " whereas tanh, or hyperbolic tangent, squash them into (-1, 1)):\n", " \n", "![alt text](https://vanishingcodes.files.wordpress.com/2017/06/tanh-and-sigmoid.png \"Logo Title Text 1\")\n", " \n", "\n", " \n", "Based on experiments, I found tanh to perform better than sigmoid, \n", "when using together with z-score normalization.\n", "Therefore, I chose tanh followed by z-score. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature Normalization - min max score (used for sigmoid activation)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "'''cols_max = []\n", "cols_min = []\n", "for c in range(train_x.shape[1]):\n", " cols_max.append(train_x[:,c].max())\n", " cols_min.append(train_x[:,c].min())\n", " train_x[:, c] = (train_x[:, c] - cols_min[-1]) / (cols_max[-1] - cols_min[-1])\n", " test_x[:, c] = (test_x[:, c] - cols_min[-1]) / (cols_max[-1] - cols_min[-1])'''" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature Normalization 2 - z score (for tanh activation)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "cols_mean = []\n", "cols_std = []\n", "for c in range(train_x.shape[1]):\n", " cols_mean.append(train_x[:,c].mean())\n", " cols_std.append(train_x[:,c].std())\n", " train_x[:, c] = (train_x[:, c] - cols_mean[-1]) / cols_std[-1]\n", " test_x[:, c] = (test_x[:, c] - cols_mean[-1]) / cols_std[-1]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Modelling and results\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Auto-encoder as unsupervised learning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parameters" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Parameters\n", "learning_rate = 0.01 #how fast to learn? too low, too long to converge, too high overshoot minimum\n", "training_epochs = 10\n", "batch_size = 256\n", "display_step = 1\n", "\n", "# Network Parameters (neurons )\n", "n_hidden_1 = 15 # 1st layer num features\n", "#n_hidden_2 = 15 # 2nd layer num features\n", "n_input = train_x.shape[1] # MNIST data input (img shape: 28*28)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train and val the model - (1 hidden layer turned out to be enough)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0001 cost= 0.411727011 Train auc= 0.956021 Time elapsed= 0:00:01.806808\n", "Epoch: 0002 cost= 0.846064389 Train auc= 0.953359 Time elapsed= 0:00:03.255659\n", "Epoch: 0003 cost= 0.354484618 Train auc= 0.953008 Time elapsed= 0:00:04.644354\n", "Epoch: 0004 cost= 0.521521986 Train auc= 0.953450 Time elapsed= 0:00:06.098230\n", "Epoch: 0005 cost= 0.517319083 Train auc= 0.953781 Time elapsed= 0:00:07.534039\n", "Epoch: 0006 cost= 0.679800570 Train auc= 0.954154 Time elapsed= 0:00:08.928748\n", "Epoch: 0007 cost= 0.325362355 Train auc= 0.953365 Time elapsed= 0:00:10.329510\n", "Epoch: 0008 cost= 0.411871493 Train auc= 0.953527 Time elapsed= 0:00:11.756268\n", "Epoch: 0009 cost= 0.280223519 Train auc= 0.954088 Time elapsed= 0:00:13.173037\n", "Epoch: 0010 cost= 1.056191683 Train auc= 0.953535 Time elapsed= 0:00:14.504578\n", "Optimization Finished!\n", "Model saved in file: C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_1layer.ckpt\n" ] } ], "source": [ "X = tf.placeholder(\"float\", [None, n_input])\n", "\n", "weights = {\n", " 'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),\n", " #'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),\n", " 'decoder_h1': tf.Variable(tf.random_normal([n_hidden_1, n_input])),\n", " #'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input])),\n", "}\n", "biases = {\n", " 'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),\n", " #'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),\n", " 'decoder_b1': tf.Variable(tf.random_normal([n_input])),\n", " #'decoder_b2': tf.Variable(tf.random_normal([n_input])),\n", "}\n", "\n", "\n", "# Building the encoder\n", "def encoder(x):\n", " #input times weight + bias. Activate! It rhymes.\n", " # Encoder Hidden layer with sigmoid activation #1\n", " layer_1 = tf.nn.tanh(tf.add(tf.matmul(x, weights['encoder_h1']),\n", " biases['encoder_b1']))\n", " return layer_1\n", "\n", "\n", "# Building the decoder\n", "def decoder(x):\n", " # Encoder Hidden layer with sigmoid activation #1\n", " layer_1 = tf.nn.tanh(tf.add(tf.matmul(x, weights['decoder_h1']),\n", " biases['decoder_b1']))\n", " return layer_1\n", "\n", "# Construct model\n", "#feed the input data into the encoder.\n", "encoder_op = encoder(X)\n", "#and learned representation to the decoder\n", "decoder_op = decoder(encoder_op)\n", "\n", "# Prediction\n", "y_pred = decoder_op\n", "# Targets (Labels) are the input data.\n", "y_true = X\n", "\n", "# Define batch mse\n", "batch_mse = tf.reduce_mean(tf.pow(y_true - y_pred, 2), 1)\n", "\n", "# Define loss and optimizer, minimize the squared error\n", "cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))\n", "#this is gradient descent. Stochastic gradient descent. Backpropagate to update weights!\n", "optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)\n", "\n", "# TRAIN StARTS\n", "save_model = os.path.join(data_dir, 'temp_saved_model_1layer.ckpt')\n", "saver = tf.train.Saver()\n", "\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " sess.run(init)\n", " total_batch = int(train_x.shape[0]/batch_size)\n", " # Training cycle\n", " for epoch in range(training_epochs):\n", " # Loop over all batches\n", " for i in range(total_batch):\n", " #pick a random datapoint from the batch\n", " batch_idx = np.random.choice(train_x.shape[0], batch_size)\n", " batch_xs = train_x[batch_idx]\n", " # Run optimization op (backprop) and cost op (to get loss value)\n", " #recursive weight updating via gradient computation. \n", " _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})\n", " \n", " # Display logs per epoch step\n", " if epoch % display_step == 0:\n", " train_batch_mse = sess.run(batch_mse, feed_dict={X: train_x})\n", " print(\"Epoch:\", '%04d' % (epoch+1),\n", " \"cost=\", \"{:.9f}\".format(c), \n", " \"Train auc=\", \"{:.6f}\".format(auc(train_y, train_batch_mse)), \n", " \"Time elapsed=\", \"{}\".format(datetime.now() - now))\n", "\n", " print(\"Optimization Finished!\")\n", " \n", " save_path = saver.save(sess, save_model)\n", " print(\"Model saved in file: %s\" % save_path)\n", " " ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Test model - on later 25% test data" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_1layer.ckpt\n", "Test auc score: 0.943175\n" ] } ], "source": [ "save_model = os.path.join(data_dir, 'temp_saved_model_1layer.ckpt')\n", "saver = tf.train.Saver()\n", "\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " \n", " saver.restore(sess, save_model)\n", " \n", " test_batch_mse = sess.run(batch_mse, feed_dict={X: test_x})\n", " \n", " print(\"Test auc score: {:.6f}\".format(auc(test_y, test_batch_mse)))\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualize the prediction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Show distribution of all mse (fraud scores if you want to call it)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nnW5OLOpXW5cAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(test_batch_mse, bins = 100)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Zoom into (0, 20) range" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAD8CAYAAACcjGjIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAENJJREFUeJzt3X+s3XV9x/Hna9QRooL86DpWwGJslgDZUJqOOGdY2ARx\nsbgoqVlGlxGYAY0mW5YyE/UfEtiiZCyDBQehECcwldEM2IZoYvYHYCHIT5EqJbQpbQVDNYtsxff+\nOJ9LTu/n3t7b++OcS/t8JCfncz7fz/f7fd/v+XJefH+c01QVkiQN+5VxFyBJWnoMB0lSx3CQJHUM\nB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHWWjbuAuTrhhBNq1apV4y5Dkt5UHnnkkZ9U1fKZxr1p\nw2HVqlVs2bJl3GVI0ptKkhdmM87TSpKkjuEgSeoYDpKkjuEgSeoYDpKkjuEgSeoYDpKkjuEgSeoY\nDpKkzpv2G9ILZdXGe95ob7v6w2OsRJKWDo8cJEkdw0GS1DEcJEkdw0GS1DEcJEkdw0GS1DEcJEkd\nw0GS1DEcJEkdw0GS1Dksfz5j+CczJEk9jxwkSR3DQZLUMRwkSR3DQZLUMRwkSR3DQZLUMRwkSR3D\nQZLUMRwkSR3DQZLUMRwkSR3DQZLUMRwkSR3DQZLUmTEckpyc5DtJnk7yVJLPtP7jktyf5Ln2fOzQ\nPFcm2Zrk2STnDfWfleSJNu26JGn9Rya5o/U/lGTVwv+pkqTZms2Rwz7gL6vqNOBs4IokpwEbgQeq\najXwQHtNm7YeOB04H7g+yRFtWTcAlwKr2+P81n8J8NOqejdwLXDNAvxtkqQ5mjEcqmpnVT3a2j8D\nngFWAuuATW3YJuDC1l4H3F5Vr1XV88BWYG2SE4Gjq+rBqirg1knzTCzr68C5E0cVkqTRO6hrDu10\nz3uAh4AVVbWzTXoJWNHaK4EXh2bb3vpWtvbk/v3mqap9wKvA8QdTmyRp4cw6HJK8DfgG8Nmq2js8\nrR0J1ALXNlUNlyXZkmTLnj17Fnt1knTYmlU4JHkLg2D4alV9s3XvaqeKaM+7W/8O4OSh2U9qfTta\ne3L/fvMkWQYcA7w8uY6qurGq1lTVmuXLl8+mdEnSHMzmbqUANwHPVNWXhyZtBja09gbg7qH+9e0O\npFMZXHh+uJ2C2pvk7LbMiyfNM7GsjwHfbkcjkqQxWDaLMb8L/CnwRJLHWt/fAFcDdya5BHgBuAig\nqp5KcifwNIM7na6oqtfbfJcDtwBHAfe1BwzC57YkW4FXGNztJEkakxnDoar+G5juzqFzp5nnKuCq\nKfq3AGdM0f8L4OMz1SJJGg2/IS1J6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ\n6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgO\nkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO\n4SBJ6hgOkqTOjOGQ5OYku5M8OdT3xSQ7kjzWHhcMTbsyydYkzyY5b6j/rCRPtGnXJUnrPzLJHa3/\noSSrFvZPlCQdrNkcOdwCnD9F/7VVdWZ73AuQ5DRgPXB6m+f6JEe08TcAlwKr22NimZcAP62qdwPX\nAtfM8W+RJC2QGcOhqr4LvDLL5a0Dbq+q16rqeWArsDbJicDRVfVgVRVwK3Dh0DybWvvrwLkTRxWS\npPGYzzWHTyd5vJ12Orb1rQReHBqzvfWtbO3J/fvNU1X7gFeB46daYZLLkmxJsmXPnj3zKF2SdCBz\nDYcbgHcBZwI7gS8tWEUHUFU3VtWaqlqzfPnyUaxSkg5LcwqHqtpVVa9X1S+BrwBr26QdwMlDQ09q\nfTtae3L/fvMkWQYcA7w8l7okSQtjTuHQriFM+CgwcSfTZmB9uwPpVAYXnh+uqp3A3iRnt+sJFwN3\nD82zobU/Bny7XZeQJI3JspkGJPkacA5wQpLtwBeAc5KcCRSwDfgLgKp6KsmdwNPAPuCKqnq9Lepy\nBnc+HQXc1x4ANwG3JdnK4ML3+oX4wyRJczdjOFTVJ6bovukA468CrpqifwtwxhT9vwA+PlMdkqTR\n8RvSkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgO\nkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO\n4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqTOjOGQ5OYku5M8OdR3\nXJL7kzzXno8dmnZlkq1Jnk1y3lD/WUmeaNOuS5LWf2SSO1r/Q0lWLeyfKEk6WLM5crgFOH9S30bg\n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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(test_batch_mse[test_batch_mse < 20], bins = 100)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Display only fraud cases" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(test_batch_mse[test_y == 1.0], bins = 100)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " All scores above treshold: 41, all pos above threshold: 561, and percentage of accuracy above treshold are: 0.07308377896613191\n" ] } ], "source": [ "THRE_TEST = 7\n", "print(\" All scores above treshold: {}, all pos above threshold: {}, and percentage of accuracy above treshold are: {}\".format( \\\n", " np.sum(test_y[test_batch_mse > THRE_TEST]), np.sum(test_batch_mse > THRE_TEST), np.sum(test_y[test_batch_mse > THRE_TEST]) / np.sum(test_batch_mse > THRE_TEST)))\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Build a binary classifier model that output probabilities of being fraud, using previous auto-encoder embedding layer as model input for all data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Get auto-encoder embedding (encoder_op) for both train and test data" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_1layer.ckpt\n", "Dim for test_encoding and train_encoding are: \n", " (71202, 15) \n", " (213605, 15)\n" ] } ], "source": [ "save_model = os.path.join(data_dir, 'temp_saved_model_1layer.ckpt')\n", "saver = tf.train.Saver()\n", "\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " saver.restore(sess, save_model)\n", " \n", " test_encoding = sess.run(encoder_op, feed_dict={X: test_x})\n", " train_encoding = sess.run(encoder_op, feed_dict={X: train_x})\n", " \n", " print(\"Dim for test_encoding and train_encoding are: \\n\", test_encoding.shape, '\\n', train_encoding.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Build the graph for FC layers (best hidden size based on validation is found to be 4)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#n_input = test_encoding.shape[1]\n", "n_input = test_encoding.shape[1]\n", "\n", "hidden_size = 4\n", "output_size = 2\n", "\n", "X = tf.placeholder(tf.float32, [None, n_input], name='input_x')\n", "y_ = tf.placeholder(tf.int32, shape=[None, output_size], name='target_y')\n", "\n", "weights = {\n", " 'W1': tf.Variable(tf.truncated_normal([n_input, hidden_size])),\n", " 'W2': tf.Variable(tf.truncated_normal([hidden_size, output_size])),\n", "}\n", "biases = {\n", " 'b1': tf.Variable(tf.zeros([hidden_size])),\n", " 'b2': tf.Variable(tf.zeros([output_size])),\n", "}\n", "\n", "hidden_layer = tf.nn.relu(tf.add(tf.matmul(X, weights['W1']), biases['b1']))\n", "pred_logits = tf.add(tf.matmul(hidden_layer, weights['W2']), biases['b2'])\n", "pred_probs = tf.nn.softmax(pred_logits)\n", "\n", "cross_entropy = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=pred_logits))\n", "\n", "optimizer = tf.train.AdamOptimizer(2e-4).minimize(cross_entropy)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3) Prepare the data set. Now we need to re-split the train into train/val. We will therefore use 80% of train as our new train, and the remaining 20% as new val. (train : val : test = (0.75 x 0.8 : 0.75 x 0.2 : 0.25 x 1.0)). Then we start to train our binary classifier" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Num of data for train, val and test are: \n", "170884, \n", "42721, \n", "71202\n", "Epoch: 0001 cost= 0.182581738 Val auc= 0.207731 Time elapsed= 0:00:03.417090\n", "Epoch: 0002 cost= 0.058460854 Val auc= 0.213936 Time elapsed= 0:00:03.948501\n", "Epoch: 0003 cost= 0.030899705 Val auc= 0.236756 Time elapsed= 0:00:04.469928\n", "Epoch: 0004 cost= 0.052337252 Val auc= 0.399662 Time elapsed= 0:00:04.997292\n", "Epoch: 0005 cost= 0.012877962 Val auc= 0.747521 Time elapsed= 0:00:05.495617\n", "Epoch: 0006 cost= 0.036469478 Val auc= 0.895387 Time elapsed= 0:00:06.020049\n", "Epoch: 0007 cost= 0.016839981 Val auc= 0.921843 Time elapsed= 0:00:06.534381\n", "Epoch: 0008 cost= 0.045645520 Val auc= 0.931608 Time elapsed= 0:00:07.066796\n", "Epoch: 0009 cost= 0.001679820 Val auc= 0.935035 Time elapsed= 0:00:07.579160\n", "Epoch: 0010 cost= 0.007926022 Val auc= 0.936375 Time elapsed= 0:00:08.127619\n", "Epoch: 0011 cost= 0.003439063 Val auc= 0.937361 Time elapsed= 0:00:08.654019\n", "Epoch: 0012 cost= 0.006417141 Val auc= 0.937514 Time elapsed= 0:00:09.185460\n", "Epoch: 0013 cost= 0.005681335 Val auc= 0.938480 Time elapsed= 0:00:09.696794\n", "Epoch: 0014 cost= 0.001597865 Val auc= 0.939942 Time elapsed= 0:00:10.230210\n", "Epoch: 0015 cost= 0.004186338 Val auc= 0.940151 Time elapsed= 0:00:10.749591\n", "Epoch: 0016 cost= 0.002913384 Val auc= 0.941176 Time elapsed= 0:00:11.280004\n", "Epoch: 0017 cost= 0.003924223 Val auc= 0.942573 Time elapsed= 0:00:11.795375\n", "Epoch: 0018 cost= 0.003839394 Val auc= 0.943365 Time elapsed= 0:00:12.329797\n", "Epoch: 0019 cost= 0.001303510 Val auc= 0.944598 Time elapsed= 0:00:12.847199\n", "Epoch: 0020 cost= 0.002293159 Val auc= 0.945166 Time elapsed= 0:00:13.376578\n", "Epoch: 0021 cost= 0.000685170 Val auc= 0.946547 Time elapsed= 0:00:13.903014\n", "Epoch: 0022 cost= 0.001755937 Val auc= 0.947023 Time elapsed= 0:00:14.468482\n", "Epoch: 0023 cost= 0.001481426 Val auc= 0.948010 Time elapsed= 0:00:15.024964\n", "Epoch: 0024 cost= 0.000348441 Val auc= 0.949114 Time elapsed= 0:00:15.510253\n", "Epoch: 0025 cost= 0.000363539 Val auc= 0.948550 Time elapsed= 0:00:15.985519\n", "Epoch: 0026 cost= 0.007691520 Val auc= 0.950286 Time elapsed= 0:00:16.452761\n", "Epoch: 0027 cost= 0.008556660 Val auc= 0.949917 Time elapsed= 0:00:16.930065\n", "Epoch: 0028 cost= 0.000777736 Val auc= 0.949892 Time elapsed= 0:00:17.398276\n", "Epoch: 0029 cost= 0.001291452 Val auc= 0.949973 Time elapsed= 0:00:17.875580\n", "Epoch: 0030 cost= 0.000441065 Val auc= 0.950238 Time elapsed= 0:00:18.345831\n", "Epoch: 0031 cost= 0.001152101 Val auc= 0.950232 Time elapsed= 0:00:18.830083\n", "Epoch: 0032 cost= 0.000309979 Val auc= 0.950296 Time elapsed= 0:00:19.299366\n", "Epoch: 0033 cost= 0.000525908 Val auc= 0.950433 Time elapsed= 0:00:19.799663\n", "Epoch: 0034 cost= 0.000270954 Val auc= 0.949953 Time elapsed= 0:00:20.324092\n", "Epoch: 0035 cost= 0.000729415 Val auc= 0.949786 Time elapsed= 0:00:20.805373\n", "Epoch: 0036 cost= 0.000435273 Val auc= 0.949889 Time elapsed= 0:00:21.286618\n", "Epoch: 0037 cost= 0.000425348 Val auc= 0.949030 Time elapsed= 0:00:21.756868\n", "Epoch: 0038 cost= 0.001161538 Val auc= 0.948803 Time elapsed= 0:00:22.234138\n", "Epoch: 0039 cost= 0.006822366 Val auc= 0.948048 Time elapsed= 0:00:22.708399\n", "Epoch: 0040 cost= 0.000728036 Val auc= 0.949060 Time elapsed= 0:00:23.259900\n", "Epoch: 0041 cost= 0.001175512 Val auc= 0.948545 Time elapsed= 0:00:23.744190\n", "Epoch: 0042 cost= 0.006420946 Val auc= 0.949168 Time elapsed= 0:00:24.281588\n", "Epoch: 0043 cost= 0.000412152 Val auc= 0.948237 Time elapsed= 0:00:24.769917\n", "Epoch: 0044 cost= 0.000429687 Val auc= 0.948838 Time elapsed= 0:00:25.307346\n", "Epoch: 0045 cost= 0.001194094 Val auc= 0.947878 Time elapsed= 0:00:25.790633\n", "Epoch: 0046 cost= 0.001505452 Val auc= 0.947482 Time elapsed= 0:00:26.257840\n", "Epoch: 0047 cost= 0.000321850 Val auc= 0.948132 Time elapsed= 0:00:26.791289\n", "Epoch: 0048 cost= 0.001842039 Val auc= 0.947630 Time elapsed= 0:00:27.276583\n", "Epoch: 0049 cost= 0.000590771 Val auc= 0.947052 Time elapsed= 0:00:27.758831\n", "Epoch: 0050 cost= 0.001234332 Val auc= 0.947621 Time elapsed= 0:00:28.231089\n", "Epoch: 0051 cost= 0.001385130 Val auc= 0.947609 Time elapsed= 0:00:28.708358\n", "Epoch: 0052 cost= 0.000439028 Val auc= 0.947302 Time elapsed= 0:00:29.250813\n", "Epoch: 0053 cost= 0.000305564 Val auc= 0.947095 Time elapsed= 0:00:29.764165\n", "Epoch: 0054 cost= 0.021936428 Val auc= 0.947347 Time elapsed= 0:00:30.276528\n", "Epoch: 0055 cost= 0.033025336 Val auc= 0.947736 Time elapsed= 0:00:30.760852\n", "Epoch: 0056 cost= 0.000335789 Val auc= 0.947627 Time elapsed= 0:00:31.229061\n", "Epoch: 0057 cost= 0.006740241 Val auc= 0.947932 Time elapsed= 0:00:31.708338\n", "Epoch: 0058 cost= 0.007069444 Val auc= 0.948393 Time elapsed= 0:00:32.175618\n", "Epoch: 0059 cost= 0.001206178 Val auc= 0.947720 Time elapsed= 0:00:32.644828\n", "Epoch: 0060 cost= 0.000577899 Val auc= 0.948092 Time elapsed= 0:00:33.125141\n", "Epoch: 0061 cost= 0.026556492 Val auc= 0.947802 Time elapsed= 0:00:33.600370\n", "Epoch: 0062 cost= 0.001349448 Val auc= 0.947688 Time elapsed= 0:00:34.109760\n", "Epoch: 0063 cost= 0.006423476 Val auc= 0.948004 Time elapsed= 0:00:34.579007\n", "Epoch: 0064 cost= 0.001265702 Val auc= 0.947720 Time elapsed= 0:00:35.095344\n", "Epoch: 0065 cost= 0.000439665 Val auc= 0.947903 Time elapsed= 0:00:35.565598\n", "Epoch: 0066 cost= 0.000438524 Val auc= 0.948328 Time elapsed= 0:00:36.042866\n", "Epoch: 0067 cost= 0.022982113 Val auc= 0.947995 Time elapsed= 0:00:36.543232\n", "Epoch: 0068 cost= 0.000407027 Val auc= 0.947974 Time elapsed= 0:00:37.014450\n", "Epoch: 0069 cost= 0.015265242 Val auc= 0.947401 Time elapsed= 0:00:37.488747\n", "Epoch: 0070 cost= 0.002139451 Val auc= 0.947687 Time elapsed= 0:00:37.989072\n", "Optimization Finished!\n", "Model saved in file: C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_FCLayers.ckpt\n" ] } ], "source": [ "n_epochs = 70\n", "batch_size = 256\n", "\n", "# PREPARE DATA\n", "VAL_PERC = 0.2\n", "all_y_bin = np.zeros((df.shape[0], 2))\n", "all_y_bin[range(df.shape[0]), df['Class'].values] = 1\n", "\n", "train_enc_x = train_encoding[:int(train_encoding.shape[0] * (1-VAL_PERC))]\n", "train_enc_y = all_y_bin[:int(train_encoding.shape[0] * (1-VAL_PERC))]\n", "\n", "val_enc_x = train_encoding[int(train_encoding.shape[0] * (1-VAL_PERC)):]\n", "val_enc_y = all_y_bin[int(train_encoding.shape[0] * (1-VAL_PERC)):train_encoding.shape[0]]\n", "\n", "test_enc_y = all_y_bin[train_encoding.shape[0]:]\n", "print(\"Num of data for train, val and test are: \\n{}, \\n{}, \\n{}\".format(train_enc_x.shape[0], val_enc_x.shape[0], \\\n", " test_encoding.shape[0]))\n", "\n", "# TRAIN STARTS\n", "save_model = os.path.join(data_dir, 'temp_saved_model_FCLayers.ckpt')\n", "saver = tf.train.Saver()\n", "\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " sess.run(init)\n", " total_batch = int(train_enc_x.shape[0]/batch_size)\n", " # Training cycle\n", " for epoch in range(n_epochs):\n", " # Loop over all batches\n", " for i in range(total_batch):\n", " batch_idx = np.random.choice(train_enc_x.shape[0], batch_size)\n", " batch_xs = train_enc_x[batch_idx]\n", " batch_ys = train_enc_y[batch_idx]\n", "\n", " # Run optimization op (backprop) and cost op (to get loss value)\n", " _, c = sess.run([optimizer, cross_entropy], feed_dict={X: batch_xs, y_: batch_ys})\n", " \n", " # Display logs per epoch step\n", " if epoch % display_step == 0:\n", " val_probs = sess.run(pred_probs, feed_dict={X: val_enc_x})\n", " print(\"Epoch:\", '%04d' % (epoch+1),\n", " \"cost=\", \"{:.9f}\".format(c), \n", " \"Val auc=\", \"{:.6f}\".format(auc(val_enc_y[:, 1], val_probs[:, 1])), \n", " \"Time elapsed=\", \"{}\".format(datetime.now() - now))\n", "\n", " print(\"Optimization Finished!\")\n", " \n", " save_path = saver.save(sess, save_model)\n", " print(\"Model saved in file: %s\" % save_path)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4) Test the model on the same test data as before - improved on AUC slightly " ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_FCLayers.ckpt\n", "Test auc score: 0.9556314697810582\n" ] } ], "source": [ "save_model = os.path.join(data_dir, 'temp_saved_model_FCLayers.ckpt')\n", "saver = tf.train.Saver()\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " \n", " saver.restore(sess, save_model)\n", " \n", " test_probs = sess.run(pred_probs, feed_dict={X: test_encoding})\n", " \n", " print(\"Test auc score: {}\".format(auc(test_enc_y[:, 1], test_probs[:, 1])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. (Optional) However, let's test a simple supervisied neural network (two layers) from scratch - without using auto-encoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1) Build graph - 28 (input) -> 8 -> 4 -> 2" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "n_epochs = 200\n", "batch_size = 256\n", "\n", "#n_input = test_encoding.shape[1]\n", "n_input = train_x.shape[1]\n", "\n", "hidden1_size = 8\n", "hidden2_size = 4\n", "output_size = 2\n", "\n", "X = tf.placeholder(tf.float32, [None, n_input], name='input_x')\n", "y_ = tf.placeholder(tf.int32, shape=[None, output_size], name='target_y')\n", "\n", "weights = {\n", " 'W1': tf.Variable(tf.truncated_normal([n_input, hidden1_size])),\n", " 'W2': tf.Variable(tf.truncated_normal([hidden1_size, hidden2_size])),\n", " 'W3': tf.Variable(tf.truncated_normal([hidden2_size, output_size])),\n", "}\n", "biases = {\n", " 'b1': tf.Variable(tf.zeros([hidden1_size])),\n", " 'b2': tf.Variable(tf.zeros([hidden2_size])),\n", " 'b3': tf.Variable(tf.zeros([output_size])),\n", "}\n", "\n", "hidden1_layer = tf.nn.relu(tf.add(tf.matmul(X, weights['W1']), biases['b1']))\n", "hidden2_layer = tf.nn.relu(tf.add(tf.matmul(hidden1_layer, weights['W2']), biases['b2']))\n", "pred_logits = tf.add(tf.matmul(hidden2_layer, weights['W3']), biases['b3'])\n", "pred_probs = tf.nn.softmax(pred_logits)\n", "\n", "cross_entropy = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=pred_logits))\n", "\n", "optimizer = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2) Prepare the data set. Now we need to re-split the train into train/val. We will therefore use 80% of train as our new train, and the remaining 20% as new val. (train : val : test = (0.75 x 0.8 : 0.75 x 0.2 : 0.25 x 1.0)). Then we start to train our Feedford neural network" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Num of data for train, val and test are: \n", "170884, \n", "42721, \n", "71202\n", "Epoch: 0001 cost= 0.040468249 Val auc= 0.325239 Time elapsed= 0:00:05.180817\n", "Epoch: 0002 cost= 0.035306405 Val auc= 0.388354 Time elapsed= 0:00:05.851594\n", "Epoch: 0003 cost= 0.035373054 Val auc= 0.467323 Time elapsed= 0:00:06.498285\n", "Epoch: 0004 cost= 0.058311760 Val auc= 0.532444 Time elapsed= 0:00:07.163055\n", "Epoch: 0005 cost= 0.019052731 Val auc= 0.593557 Time elapsed= 0:00:07.815824\n", "Epoch: 0006 cost= 0.044786640 Val auc= 0.645813 Time elapsed= 0:00:08.532697\n", "Epoch: 0007 cost= 0.018334387 Val auc= 0.701125 Time elapsed= 0:00:09.236605\n", "Epoch: 0008 cost= 0.014931509 Val auc= 0.769009 Time elapsed= 0:00:09.936430\n", "Epoch: 0009 cost= 0.011636144 Val auc= 0.810144 Time elapsed= 0:00:10.559088\n", "Epoch: 0010 cost= 0.008489504 Val auc= 0.832298 Time elapsed= 0:00:11.160689\n", "Epoch: 0011 cost= 0.006762304 Val auc= 0.843969 Time elapsed= 0:00:11.762322\n", "Epoch: 0012 cost= 0.007114011 Val auc= 0.851879 Time elapsed= 0:00:12.370904\n", "Epoch: 0013 cost= 0.007512776 Val auc= 0.858379 Time elapsed= 0:00:12.971503\n", "Epoch: 0014 cost= 0.002974052 Val auc= 0.861122 Time elapsed= 0:00:13.587175\n", "Epoch: 0015 cost= 0.004064919 Val auc= 0.864751 Time elapsed= 0:00:14.184763\n", "Epoch: 0016 cost= 0.004419648 Val auc= 0.867623 Time elapsed= 0:00:14.794352\n", "Epoch: 0017 cost= 0.003554455 Val auc= 0.871195 Time elapsed= 0:00:15.393945\n", "Epoch: 0018 cost= 0.001294234 Val auc= 0.874773 Time elapsed= 0:00:16.103835\n", "Epoch: 0019 cost= 0.004041444 Val auc= 0.879163 Time elapsed= 0:00:16.717468\n", "Epoch: 0020 cost= 0.002081525 Val auc= 0.880892 Time elapsed= 0:00:17.351154\n", "Epoch: 0021 cost= 0.001777722 Val auc= 0.884195 Time elapsed= 0:00:18.042991\n", "Epoch: 0022 cost= 0.070494801 Val auc= 0.886706 Time elapsed= 0:00:18.707759\n", "Epoch: 0023 cost= 0.004722831 Val auc= 0.889980 Time elapsed= 0:00:19.402608\n", "Epoch: 0024 cost= 0.001268321 Val auc= 0.893712 Time elapsed= 0:00:20.074394\n", "Epoch: 0025 cost= 0.001690960 Val auc= 0.898094 Time elapsed= 0:00:20.749190\n", "Epoch: 0026 cost= 0.049302157 Val auc= 0.902242 Time elapsed= 0:00:21.434046\n", "Epoch: 0027 cost= 0.001829385 Val auc= 0.904997 Time elapsed= 0:00:22.073747\n", "Epoch: 0028 cost= 0.049344394 Val auc= 0.905859 Time elapsed= 0:00:22.711410\n", "Epoch: 0029 cost= 0.001225520 Val auc= 0.907995 Time elapsed= 0:00:23.482496\n", "Epoch: 0030 cost= 0.000928764 Val auc= 0.911491 Time elapsed= 0:00:24.128214\n", "Epoch: 0031 cost= 0.000751568 Val auc= 0.912286 Time elapsed= 0:00:24.770888\n", "Epoch: 0032 cost= 0.001236153 Val auc= 0.914481 Time elapsed= 0:00:25.519878\n", "Epoch: 0033 cost= 0.015178922 Val auc= 0.915785 Time elapsed= 0:00:26.148584\n", "Epoch: 0034 cost= 0.000711051 Val auc= 0.917233 Time elapsed= 0:00:26.765190\n", "Epoch: 0035 cost= 0.000776973 Val auc= 0.918654 Time elapsed= 0:00:27.373809\n", "Epoch: 0036 cost= 0.001065262 Val auc= 0.919270 Time elapsed= 0:00:27.984434\n", "Epoch: 0037 cost= 0.000760010 Val auc= 0.920689 Time elapsed= 0:00:28.595059\n", "Epoch: 0038 cost= 0.000980297 Val auc= 0.922112 Time elapsed= 0:00:29.193649\n", "Epoch: 0039 cost= 0.046540443 Val auc= 0.922120 Time elapsed= 0:00:29.806278\n", "Epoch: 0040 cost= 0.000538412 Val auc= 0.922857 Time elapsed= 0:00:30.404872\n", "Epoch: 0041 cost= 0.000580229 Val auc= 0.923489 Time elapsed= 0:00:31.015530\n", "Epoch: 0042 cost= 0.000913732 Val auc= 0.924190 Time elapsed= 0:00:31.622136\n", "Epoch: 0043 cost= 0.001112483 Val auc= 0.923704 Time elapsed= 0:00:32.220728\n", "Epoch: 0044 cost= 0.000885677 Val auc= 0.924142 Time elapsed= 0:00:32.832362\n", "Epoch: 0045 cost= 0.004391036 Val auc= 0.924472 Time elapsed= 0:00:33.430920\n", "Epoch: 0046 cost= 0.021967666 Val auc= 0.924426 Time elapsed= 0:00:34.042546\n", "Epoch: 0047 cost= 0.000886974 Val auc= 0.925232 Time elapsed= 0:00:34.640135\n", "Epoch: 0048 cost= 0.043955125 Val auc= 0.925841 Time elapsed= 0:00:35.250796\n", "Epoch: 0049 cost= 0.000472108 Val auc= 0.925898 Time elapsed= 0:00:36.001760\n", "Epoch: 0050 cost= 0.006673889 Val auc= 0.927685 Time elapsed= 0:00:36.642461\n", "Epoch: 0051 cost= 0.001120769 Val auc= 0.928893 Time elapsed= 0:00:37.277187\n", "Epoch: 0052 cost= 0.001485452 Val auc= 0.929291 Time elapsed= 0:00:37.883793\n", "Epoch: 0053 cost= 0.010922685 Val auc= 0.928809 Time elapsed= 0:00:38.495417\n", "Epoch: 0054 cost= 0.000313734 Val auc= 0.928147 Time elapsed= 0:00:39.173193\n", "Epoch: 0055 cost= 0.066810884 Val auc= 0.928753 Time elapsed= 0:00:39.830943\n", "Epoch: 0056 cost= 0.000422718 Val auc= 0.929409 Time elapsed= 0:00:40.498739\n", "Epoch: 0057 cost= 0.000451357 Val auc= 0.929628 Time elapsed= 0:00:41.100320\n", "Epoch: 0058 cost= 0.001005127 Val auc= 0.930228 Time elapsed= 0:00:41.783172\n", "Epoch: 0059 cost= 0.000800938 Val auc= 0.930222 Time elapsed= 0:00:42.412845\n", "Epoch: 0060 cost= 0.000630695 Val auc= 0.930596 Time elapsed= 0:00:43.009431\n", "Epoch: 0061 cost= 0.000486179 Val auc= 0.930971 Time elapsed= 0:00:43.621023\n", "Epoch: 0062 cost= 0.000455273 Val auc= 0.931817 Time elapsed= 0:00:44.214601\n", "Epoch: 0063 cost= 0.000660782 Val auc= 0.932873 Time elapsed= 0:00:44.824222\n", "Epoch: 0064 cost= 0.004659743 Val auc= 0.932824 Time elapsed= 0:00:45.420812\n", "Epoch: 0065 cost= 0.000479863 Val auc= 0.933134 Time elapsed= 0:00:46.031469\n", "Epoch: 0066 cost= 0.001354309 Val auc= 0.933310 Time elapsed= 0:00:46.639049\n", "Epoch: 0067 cost= 0.000482411 Val auc= 0.933588 Time elapsed= 0:00:47.239684\n", "Epoch: 0068 cost= 0.000753474 Val auc= 0.933416 Time elapsed= 0:00:47.849306\n", "Epoch: 0069 cost= 0.000704671 Val auc= 0.934577 Time elapsed= 0:00:48.445858\n", "Epoch: 0070 cost= 0.012711940 Val auc= 0.934767 Time elapsed= 0:00:49.057517\n", "Epoch: 0071 cost= 0.000474494 Val auc= 0.935490 Time elapsed= 0:00:49.660086\n", "Epoch: 0072 cost= 0.000522156 Val auc= 0.935657 Time elapsed= 0:00:50.270738\n", "Epoch: 0073 cost= 0.000979305 Val auc= 0.936166 Time elapsed= 0:00:50.870304\n", "Epoch: 0074 cost= 0.000649971 Val auc= 0.936200 Time elapsed= 0:00:51.474948\n", "Epoch: 0075 cost= 0.000636919 Val auc= 0.936055 Time elapsed= 0:00:52.130687\n", "Epoch: 0076 cost= 0.001072419 Val auc= 0.936828 Time elapsed= 0:00:52.852613\n", "Epoch: 0077 cost= 0.000425085 Val auc= 0.936628 Time elapsed= 0:00:53.476235\n", "Epoch: 0078 cost= 0.000483887 Val auc= 0.936961 Time elapsed= 0:00:54.149025\n", "Epoch: 0079 cost= 0.000372631 Val auc= 0.936755 Time elapsed= 0:00:54.786755\n", "Epoch: 0080 cost= 0.000417533 Val auc= 0.936559 Time elapsed= 0:00:55.472545\n", "Epoch: 0081 cost= 0.000474568 Val auc= 0.937195 Time elapsed= 0:00:56.097208\n", "Epoch: 0082 cost= 0.003457256 Val auc= 0.937659 Time elapsed= 0:00:56.706830\n", "Epoch: 0083 cost= 0.000591682 Val auc= 0.937525 Time elapsed= 0:00:57.305420\n", "Epoch: 0084 cost= 0.000644049 Val auc= 0.937849 Time elapsed= 0:00:57.911069\n", "Epoch: 0085 cost= 0.000375735 Val auc= 0.937543 Time elapsed= 0:00:58.516677\n", "Epoch: 0086 cost= 0.002177193 Val auc= 0.937433 Time elapsed= 0:00:59.115270\n", "Epoch: 0087 cost= 0.000366558 Val auc= 0.937990 Time elapsed= 0:00:59.763282\n", "Epoch: 0088 cost= 0.045915734 Val auc= 0.938450 Time elapsed= 0:01:00.457161\n", "Epoch: 0089 cost= 0.000904620 Val auc= 0.938465 Time elapsed= 0:01:01.118887\n", "Epoch: 0090 cost= 0.000338566 Val auc= 0.938755 Time elapsed= 0:01:01.780647\n", "Epoch: 0091 cost= 0.000369148 Val auc= 0.939186 Time elapsed= 0:01:02.397322\n", "Epoch: 0092 cost= 0.001583059 Val auc= 0.939294 Time elapsed= 0:01:03.085151\n", "Epoch: 0093 cost= 0.015807930 Val auc= 0.939506 Time elapsed= 0:01:03.706770\n", "Epoch: 0094 cost= 0.000327918 Val auc= 0.939701 Time elapsed= 0:01:04.316426\n", "Epoch: 0095 cost= 0.000484254 Val auc= 0.939762 Time elapsed= 0:01:04.928019\n", "Epoch: 0096 cost= 0.031269640 Val auc= 0.939813 Time elapsed= 0:01:05.523602\n", "Epoch: 0097 cost= 0.000837921 Val auc= 0.940641 Time elapsed= 0:01:06.129247\n", "Epoch: 0098 cost= 0.000504418 Val auc= 0.940583 Time elapsed= 0:01:06.728807\n", "Epoch: 0099 cost= 0.000292782 Val auc= 0.941090 Time elapsed= 0:01:07.340472\n", "Epoch: 0100 cost= 0.000341894 Val auc= 0.941516 Time elapsed= 0:01:08.030269\n", "Epoch: 0101 cost= 0.000370924 Val auc= 0.941951 Time elapsed= 0:01:08.652924\n", "Epoch: 0102 cost= 0.000529793 Val auc= 0.941705 Time elapsed= 0:01:09.259539\n", "Epoch: 0103 cost= 0.000458599 Val auc= 0.942075 Time elapsed= 0:01:09.860171\n", "Epoch: 0104 cost= 0.027924299 Val auc= 0.941844 Time elapsed= 0:01:10.466785\n", "Epoch: 0105 cost= 0.000331197 Val auc= 0.942349 Time elapsed= 0:01:11.078377\n", "Epoch: 0106 cost= 0.000314879 Val auc= 0.942720 Time elapsed= 0:01:11.767237\n", "Epoch: 0107 cost= 0.000196609 Val auc= 0.942604 Time elapsed= 0:01:12.383848\n", "Epoch: 0108 cost= 0.000243780 Val auc= 0.943162 Time elapsed= 0:01:13.077695\n", "Epoch: 0109 cost= 0.014628510 Val auc= 0.943442 Time elapsed= 0:01:13.694372\n", "Epoch: 0110 cost= 0.003521365 Val auc= 0.943230 Time elapsed= 0:01:14.289953\n", "Epoch: 0111 cost= 0.001652211 Val auc= 0.943194 Time elapsed= 0:01:14.983799\n", "Epoch: 0112 cost= 0.000318703 Val auc= 0.943722 Time elapsed= 0:01:15.605455\n", "Epoch: 0113 cost= 0.006262233 Val auc= 0.944066 Time elapsed= 0:01:16.206014\n", "Epoch: 0114 cost= 0.000739925 Val auc= 0.944397 Time elapsed= 0:01:16.824659\n", "Epoch: 0115 cost= 0.005477867 Val auc= 0.944826 Time elapsed= 0:01:17.430272\n", "Epoch: 0116 cost= 0.000283423 Val auc= 0.944952 Time elapsed= 0:01:18.041897\n", "Epoch: 0117 cost= 0.000238850 Val auc= 0.944982 Time elapsed= 0:01:18.637517\n", "Epoch: 0118 cost= 0.000245154 Val auc= 0.945127 Time elapsed= 0:01:19.248141\n", "Epoch: 0119 cost= 0.002327343 Val auc= 0.945271 Time elapsed= 0:01:19.850708\n", "Epoch: 0120 cost= 0.000229534 Val auc= 0.945383 Time elapsed= 0:01:20.455352\n", "Epoch: 0121 cost= 0.000273838 Val auc= 0.945442 Time elapsed= 0:01:21.064974\n", "Epoch: 0122 cost= 0.000423115 Val auc= 0.945734 Time elapsed= 0:01:21.669582\n", "Epoch: 0123 cost= 0.000422732 Val auc= 0.945846 Time elapsed= 0:01:22.279171\n", "Epoch: 0124 cost= 0.000492670 Val auc= 0.946084 Time elapsed= 0:01:22.876792\n", "Epoch: 0125 cost= 0.000165862 Val auc= 0.945938 Time elapsed= 0:01:23.486412\n", "Epoch: 0126 cost= 0.001632753 Val auc= 0.945944 Time elapsed= 0:01:24.082967\n", "Epoch: 0127 cost= 0.000617904 Val auc= 0.946002 Time elapsed= 0:01:24.690581\n", "Epoch: 0128 cost= 0.000246871 Val auc= 0.946401 Time elapsed= 0:01:25.295190\n", "Epoch: 0129 cost= 0.001718988 Val auc= 0.946403 Time elapsed= 0:01:25.894819\n", "Epoch: 0130 cost= 0.000334369 Val auc= 0.946532 Time elapsed= 0:01:26.503404\n", "Epoch: 0131 cost= 0.000350451 Val auc= 0.946814 Time elapsed= 0:01:27.101995\n", "Epoch: 0132 cost= 0.000499874 Val auc= 0.946705 Time elapsed= 0:01:27.710615\n", "Epoch: 0133 cost= 0.000511803 Val auc= 0.947119 Time elapsed= 0:01:28.329259\n", "Epoch: 0134 cost= 0.000401860 Val auc= 0.947194 Time elapsed= 0:01:28.979989\n", "Epoch: 0135 cost= 0.000501440 Val auc= 0.947338 Time elapsed= 0:01:29.593656\n", "Epoch: 0136 cost= 0.000871440 Val auc= 0.947772 Time elapsed= 0:01:30.191212\n", "Epoch: 0137 cost= 0.000350594 Val auc= 0.947888 Time elapsed= 0:01:30.798829\n", "Epoch: 0138 cost= 0.000370808 Val auc= 0.948050 Time elapsed= 0:01:31.398423\n", "Epoch: 0139 cost= 0.001055439 Val auc= 0.948037 Time elapsed= 0:01:32.007043\n", "Epoch: 0140 cost= 0.000314105 Val auc= 0.947878 Time elapsed= 0:01:32.607638\n", "Epoch: 0141 cost= 0.000223214 Val auc= 0.947936 Time elapsed= 0:01:33.219267\n", "Epoch: 0142 cost= 0.000413165 Val auc= 0.948281 Time elapsed= 0:01:33.826882\n", "Epoch: 0143 cost= 0.000234765 Val auc= 0.948560 Time elapsed= 0:01:34.426476\n", "Epoch: 0144 cost= 0.000324353 Val auc= 0.948714 Time elapsed= 0:01:35.040142\n", "Epoch: 0145 cost= 0.000315908 Val auc= 0.948789 Time elapsed= 0:01:35.641709\n", "Epoch: 0146 cost= 0.000187110 Val auc= 0.948943 Time elapsed= 0:01:36.252332\n", "Epoch: 0147 cost= 0.000205271 Val auc= 0.948909 Time elapsed= 0:01:36.849958\n", "Epoch: 0148 cost= 0.000297346 Val auc= 0.949307 Time elapsed= 0:01:37.464558\n", "Epoch: 0149 cost= 0.000389144 Val auc= 0.949332 Time elapsed= 0:01:38.072174\n", "Epoch: 0150 cost= 0.001833800 Val auc= 0.949423 Time elapsed= 0:01:38.671802\n", "Epoch: 0151 cost= 0.000930902 Val auc= 0.949494 Time elapsed= 0:01:39.282428\n", "Epoch: 0152 cost= 0.000635648 Val auc= 0.949657 Time elapsed= 0:01:39.877010\n", "Epoch: 0153 cost= 0.002338056 Val auc= 0.949610 Time elapsed= 0:01:40.487597\n", "Epoch: 0154 cost= 0.030481145 Val auc= 0.949792 Time elapsed= 0:01:41.087194\n", "Epoch: 0155 cost= 0.002830613 Val auc= 0.949944 Time elapsed= 0:01:41.702864\n", "Epoch: 0156 cost= 0.000249402 Val auc= 0.949970 Time elapsed= 0:01:42.303430\n", "Epoch: 0157 cost= 0.003055960 Val auc= 0.949991 Time elapsed= 0:01:42.910075\n", "Epoch: 0158 cost= 0.000213830 Val auc= 0.950399 Time elapsed= 0:01:43.519663\n", "Epoch: 0159 cost= 0.000241917 Val auc= 0.950073 Time elapsed= 0:01:44.118253\n", "Epoch: 0160 cost= 0.003040896 Val auc= 0.950532 Time elapsed= 0:01:44.735900\n", "Epoch: 0161 cost= 0.021820394 Val auc= 0.950543 Time elapsed= 0:01:45.357550\n", "Epoch: 0162 cost= 0.032420643 Val auc= 0.950603 Time elapsed= 0:01:45.968216\n", "Epoch: 0163 cost= 0.000237668 Val auc= 0.950312 Time elapsed= 0:01:46.568772\n", "Epoch: 0164 cost= 0.000465537 Val auc= 0.950668 Time elapsed= 0:01:47.174382\n", "Epoch: 0165 cost= 0.000630139 Val auc= 0.950616 Time elapsed= 0:01:47.785007\n", "Epoch: 0166 cost= 0.000198609 Val auc= 0.950462 Time elapsed= 0:01:48.380592\n", "Epoch: 0167 cost= 0.000270512 Val auc= 0.950597 Time elapsed= 0:01:48.987242\n", "Epoch: 0168 cost= 0.000333281 Val auc= 0.950604 Time elapsed= 0:01:49.588806\n", "Epoch: 0169 cost= 0.000183828 Val auc= 0.950517 Time elapsed= 0:01:50.195419\n", "Epoch: 0170 cost= 0.000218657 Val auc= 0.950634 Time elapsed= 0:01:50.793008\n", "Epoch: 0171 cost= 0.000346057 Val auc= 0.950869 Time elapsed= 0:01:51.402665\n", "Epoch: 0172 cost= 0.001631355 Val auc= 0.950852 Time elapsed= 0:01:52.008240\n", "Epoch: 0173 cost= 0.000211280 Val auc= 0.950784 Time elapsed= 0:01:52.607869\n", "Epoch: 0174 cost= 0.000214562 Val auc= 0.950591 Time elapsed= 0:01:53.218493\n", "Epoch: 0175 cost= 0.001123605 Val auc= 0.950453 Time elapsed= 0:01:53.821097\n", "Epoch: 0176 cost= 0.000174182 Val auc= 0.950680 Time elapsed= 0:01:54.429681\n", "Epoch: 0177 cost= 0.000924346 Val auc= 0.950769 Time elapsed= 0:01:55.029274\n", "Epoch: 0178 cost= 0.000242713 Val auc= 0.950819 Time elapsed= 0:01:55.638932\n", "Epoch: 0179 cost= 0.000292793 Val auc= 0.950939 Time elapsed= 0:01:56.240499\n", "Epoch: 0180 cost= 0.000237769 Val auc= 0.950862 Time elapsed= 0:01:56.841094\n", "Epoch: 0181 cost= 0.000280685 Val auc= 0.950832 Time elapsed= 0:01:57.451718\n", "Epoch: 0182 cost= 0.000912431 Val auc= 0.951153 Time elapsed= 0:01:58.049308\n", "Epoch: 0183 cost= 0.000173386 Val auc= 0.951259 Time elapsed= 0:01:58.658928\n", "Epoch: 0184 cost= 0.001672110 Val auc= 0.951345 Time elapsed= 0:01:59.255518\n", "Epoch: 0185 cost= 0.000276371 Val auc= 0.951269 Time elapsed= 0:01:59.863166\n", "Epoch: 0186 cost= 0.000268763 Val auc= 0.951148 Time elapsed= 0:02:00.462726\n", "Epoch: 0187 cost= 0.000605727 Val auc= 0.951212 Time elapsed= 0:02:01.074391\n", "Epoch: 0188 cost= 0.000728947 Val auc= 0.951217 Time elapsed= 0:02:01.685012\n", "Epoch: 0189 cost= 0.000341934 Val auc= 0.951268 Time elapsed= 0:02:02.302622\n", "Epoch: 0190 cost= 0.032698169 Val auc= 0.951273 Time elapsed= 0:02:02.945332\n", "Epoch: 0191 cost= 0.000183769 Val auc= 0.951320 Time elapsed= 0:02:03.600073\n", "Epoch: 0192 cost= 0.001321183 Val auc= 0.951365 Time elapsed= 0:02:04.251805\n", "Epoch: 0193 cost= 0.000516678 Val auc= 0.951399 Time elapsed= 0:02:04.982752\n", "Epoch: 0194 cost= 0.000485816 Val auc= 0.951235 Time elapsed= 0:02:05.616470\n", "Epoch: 0195 cost= 0.000261687 Val auc= 0.951260 Time elapsed= 0:02:06.228061\n", "Epoch: 0196 cost= 0.000316458 Val auc= 0.951114 Time elapsed= 0:02:06.826689\n", "Epoch: 0197 cost= 0.000738391 Val auc= 0.951202 Time elapsed= 0:02:07.442293\n", "Epoch: 0198 cost= 0.000353829 Val auc= 0.951267 Time elapsed= 0:02:08.052914\n", "Epoch: 0199 cost= 0.000289169 Val auc= 0.951185 Time elapsed= 0:02:08.652511\n", "Epoch: 0200 cost= 0.001263586 Val auc= 0.951238 Time elapsed= 0:02:09.258121\n", "Optimization Finished!\n", "Model saved in file: C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_FCNNets_raw.ckpt\n" ] } ], "source": [ "# PREPARE DATA\n", "VAL_PERC = 0.2\n", "all_y_bin = np.zeros((df.shape[0], 2))\n", "all_y_bin[range(df.shape[0]), df['Class'].values] = 1\n", "\n", "train_enc_x = train_x[:int(train_x.shape[0] * (1-VAL_PERC))]\n", "train_enc_y = all_y_bin[:int(train_x.shape[0] * (1-VAL_PERC))]\n", "\n", "val_enc_x = train_x[int(train_encoding.shape[0] * (1-VAL_PERC)):]\n", "val_enc_y = all_y_bin[int(train_encoding.shape[0] * (1-VAL_PERC)):train_x.shape[0]]\n", "\n", "test_enc_y = all_y_bin[train_x.shape[0]:]\n", "\n", "print(\"Num of data for train, val and test are: \\n{}, \\n{}, \\n{}\".format(train_enc_x.shape[0], val_enc_x.shape[0], \\\n", " test_encoding.shape[0]))\n", "# TRAIN STARTS\n", "save_model = os.path.join(data_dir, 'temp_saved_model_FCNNets_raw.ckpt')\n", "saver = tf.train.Saver()\n", "\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " sess.run(init)\n", " total_batch = int(train_enc_x.shape[0]/batch_size)\n", " # Training cycle\n", " for epoch in range(n_epochs):\n", " # Loop over all batches\n", " for i in range(total_batch):\n", " batch_idx = np.random.choice(train_enc_x.shape[0], batch_size)\n", " batch_xs = train_enc_x[batch_idx]\n", " batch_ys = train_enc_y[batch_idx]\n", " # Run optimization op (backprop) and cost op (to get loss value)\n", " _, c = sess.run([optimizer, cross_entropy], feed_dict={X: batch_xs, y_: batch_ys})\n", " \n", " # Display logs per epoch step\n", " if epoch % display_step == 0:\n", " val_probs = sess.run(pred_probs, feed_dict={X: val_enc_x})\n", " print(\"Epoch:\", '%04d' % (epoch+1),\n", " \"cost=\", \"{:.9f}\".format(c), \n", " \"Val auc=\", \"{:.6f}\".format(auc(val_enc_y[:, 1], val_probs[:, 1])), \n", " \"Time elapsed=\", \"{}\".format(datetime.now() - now))\n", "\n", " print(\"Optimization Finished!\")\n", " \n", " save_path = saver.save(sess, save_model)\n", " print(\"Model saved in file: %s\" % save_path)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3) Predict on test data" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from C:\\Users\\weimin\\Desktop\\Fraud\\temp_saved_model_FCNNets_raw.ckpt\n", "Test auc score: 0.9480815965884679\n" ] } ], "source": [ "save_model = os.path.join(data_dir, 'temp_saved_model_FCNNets_raw.ckpt')\n", "saver = tf.train.Saver()\n", "# Initializing the variables\n", "init = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " now = datetime.now()\n", " \n", " saver.restore(sess, save_model)\n", " \n", " test_probs = sess.run(pred_probs, feed_dict={X: test_x})\n", " \n", " print(\"Test auc score: {}\".format(auc(test_enc_y[:, 1], test_probs[:, 1])))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 }