{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Kernel Methods\n",
    "\n",
    "\n",
    "## First Problem: 1D Non-Linear Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import sklearn\n",
    "import sklearn.linear_model\n",
    "import sklearn.kernel_ridge\n",
    "import sklearn.metrics.pairwise\n",
    "from matplotlib.colors import ListedColormap\n",
    "\n",
    "def plot_model(X_test, clf):\n",
    "    '''\n",
    "    Note: uses globals x, y, x_test, which are assigned below\n",
    "    when the dataset is created. Don't overwrite these variables.\n",
    "    '''\n",
    "    y_test = clf.predict(X_test)\n",
    "    plt.scatter(x_train, y_train)\n",
    "    plt.plot(x_test, y_test)\n",
    "    plt.legend(['Test', 'Train'])\n",
    "    \n",
    "# Set random seed\n",
    "np.random.seed(0)\n",
    "\n",
    "# Create random set of m training x values between -5 and 5\n",
    "m = 100\n",
    "x_train = np.random.rand(m)*10 - 5   \n",
    "\n",
    "# Create evenly spaced test x values (for plotting)\n",
    "x_test  = np.linspace(-5, 5, 100)\n",
    "m_test  = len(x_test);\n",
    "\n",
    "def f(x):\n",
    "    return 0.1*(x + x**2 + 10*x + 0.5*x**2 - 0.5*x**3)*x\n",
    "\n",
    "def f(x):\n",
    "    return 0.5*np.cos(x) + np.sin(x) + 4*np.cos(2*x) + np.exp(np.cos(3*x))\n",
    "\n",
    "\n",
    "y_train = f(x_train) + np.random.randn(m)   # polynomial plus noise\n",
    "\n",
    "x_train = x_train.reshape(-1, 1)\n",
    "x_test  = x_test.reshape(-1, 1)\n",
    "\n",
    "# Plot the training data\n",
    "plt.scatter(x_train, y_train)\n",
    "plt.title('Training Data')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Standard Linear Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "clf = sklearn.linear_model.LinearRegression()\n",
    "clf.fit(x_train, y_train)\n",
    "plot_model(x_test, clf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Kernel Trick for Linear Regression\n",
    "\n",
    "Suppose $\\theta$ can be rewritten as a linear combination of the feature vectors, i.e., $\\theta = \\sum_{i=1}^m \\alpha_i x^{(i)}$. Then we have that\n",
    "$$\n",
    "h_{\\theta}(x) = \\theta^T x = \\sum_{i=1}^m \\alpha_i (x^{(i)})^T x = \\sum_{i=1}^m \\alpha_i K(x^{(i)}, x)\n",
    "$$\n",
    "where $K(x,z) := x^T z$, the \"kernel function\", computes the dot product between $x$ and $z$.\n",
    "\n",
    "We can rewrite this one more time to get\n",
    "$$\n",
    "h_{\\theta}(x) = \\sum_{i=1}^m \\alpha_i K(x^{(i)}, x) = \\alpha^T k(x)\n",
    "$$\n",
    "where\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\alpha &= \\begin{bmatrix}\\alpha_1, \\ldots, \\alpha_m\\end{bmatrix}^T \\\\\n",
    " k(x) &= \\begin{bmatrix}K(x^{(1)}, x), & K(x^{(2)}, x), & \\ldots, & K(x^{(m)},x)\\end{bmatrix}^T\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "We can think this as a new linear regression problem with parameter vector $\\alpha$ and a feature mapping that maps $x$ the vector $k(x)$ of kernel comparisons between $x$ and every training point. \n",
    "\n",
    "Applying the feature mapping to every row of the original data matrix $X$ yields a \"kernel matrix\" $K$ defined by $K_{ij} = K(x^{(i)}, x^{(j)})$.\n",
    "\n",
    "If our assumption holds that the *best* $\\theta$ (the one that achieves minimum cost) can be expressed as a linear combination of feature vectors, then there is some choice for the parameter vector $\\alpha$ that will yield this best hypothesis. So, it suffices to look values of $\\alpha$ that minimize the squared error in this new linear regression problem. That is, we can simply solve the new linear regression problem where we replace the data matrix by the kernel matrix!\n",
    "\n",
    "Note: this is not generally how we solve for $\\alpha$ in practice, but it is concrete proof that we can solve the learning and prediction problems while only accessing the data (feature vectors) through dot products.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.48813504]\n",
      " [ 2.15189366]\n",
      " [ 1.02763376]\n",
      " [ 0.44883183]\n",
      " [-0.76345201]\n",
      " [ 1.45894113]\n",
      " [-0.62412789]\n",
      " [ 3.91773001]\n",
      " [ 4.63662761]\n",
      " [-1.16558481]\n",
      " [ 2.91725038]\n",
      " [ 0.2889492 ]\n",
      " [ 0.68044561]\n",
      " [ 4.25596638]\n",
      " [-4.28963942]\n",
      " [-4.128707  ]\n",
      " [-4.79781603]\n",
      " [ 3.32619846]\n",
      " [ 2.78156751]\n",
      " [ 3.70012148]\n",
      " [ 4.78618342]\n",
      " [ 2.99158564]\n",
      " [-0.38520638]\n",
      " [ 2.80529176]\n",
      " [-3.81725574]\n",
      " [ 1.39921021]\n",
      " [-3.56646713]\n",
      " [ 4.44668917]\n",
      " [ 0.21848322]\n",
      " [-0.8533806 ]\n",
      " [-2.35444388]\n",
      " [ 2.74233689]\n",
      " [-0.43849668]\n",
      " [ 0.68433949]\n",
      " [-4.812102  ]\n",
      " [ 1.17635497]\n",
      " [ 1.12095723]\n",
      " [ 1.16933997]\n",
      " [ 4.43748079]\n",
      " [ 1.81820299]\n",
      " [-1.40492099]\n",
      " [-0.62968046]\n",
      " [ 1.97631196]\n",
      " [-4.39774528]\n",
      " [ 1.66766715]\n",
      " [ 1.7063787 ]\n",
      " [-2.89617439]\n",
      " [-3.71073702]\n",
      " [-1.84571649]\n",
      " [-1.36289229]\n",
      " [ 0.7019677 ]\n",
      " [-0.61398487]\n",
      " [ 4.88373838]\n",
      " [-3.97955189]\n",
      " [-2.91123244]\n",
      " [-3.38690482]\n",
      " [ 1.53108325]\n",
      " [-2.46708397]\n",
      " [-0.33689227]\n",
      " [-2.55574408]\n",
      " [-3.41030416]\n",
      " [-3.89624859]\n",
      " [ 1.56329589]\n",
      " [-3.61817049]\n",
      " [-3.03417638]\n",
      " [-1.31274829]\n",
      " [ 3.2099323 ]\n",
      " [-4.02898724]\n",
      " [ 3.37944907]\n",
      " [-4.03901592]\n",
      " [ 4.76459465]\n",
      " [-0.31348798]\n",
      " [ 4.76761088]\n",
      " [ 1.0484552 ]\n",
      " [ 2.39263579]\n",
      " [-4.60812208]\n",
      " [-2.17193037]\n",
      " [-3.79803439]\n",
      " [-2.03859802]\n",
      " [-3.81272281]\n",
      " [-1.82016821]\n",
      " [-0.85737005]\n",
      " [-4.35852504]\n",
      " [ 1.92472119]\n",
      " [ 0.66601454]\n",
      " [-2.34610509]\n",
      " [ 0.23248053]\n",
      " [-4.06059489]\n",
      " [ 0.75946496]\n",
      " [ 4.29296198]\n",
      " [-1.81431048]\n",
      " [ 1.6741038 ]\n",
      " [-3.68202138]\n",
      " [ 2.16327204]\n",
      " [-2.10593907]\n",
      " [-3.16808638]\n",
      " [ 0.86512935]\n",
      " [-4.79892454]\n",
      " [ 3.28940029]\n",
      " [-4.95304524]] [ 3.09793347  2.55114954  0.08571536  3.09100237  1.8509131  -0.23544831\n",
      "  3.01105187  0.82494047 -4.80715909 -2.03265835  3.39341017  7.24735975\n",
      "  2.69501317  0.07646786  1.00734519  2.36975015 -2.11615325  5.26844716\n",
      "  3.64257027  2.31161294 -2.23092164  2.53502201  3.18445196  4.5431819\n",
      "  1.48653122 -0.14125506  2.93060083 -3.24718483  8.46148029  0.9471273\n",
      "  2.82791734  4.31978397  3.01204663  4.36154216 -2.39916168 -0.50455242\n",
      " -0.04530918 -1.42446413 -1.81043243  0.21493456 -3.68875418  0.67284463\n",
      "  0.81951571  1.13638183 -2.34096853 -1.59492309  2.84126432  4.78951406\n",
      " -1.75211873 -3.5693259   1.52247852  2.48142602 -4.73025506  2.26740079\n",
      "  2.69471823  4.43895768 -1.50380167  1.20525141  5.36432895  0.69578394\n",
      "  2.22872521  2.90050641 -1.85140258  3.8347815   6.07417682 -2.87679273\n",
      "  2.85841924  3.1948896   1.98794248  1.5810306  -4.16342614  6.92274803\n",
      " -4.84329178 -1.3511546   2.37711606 -2.27396386  1.22423345  1.62866058\n",
      " -1.95827223  2.23332261 -3.12884571  1.35760363  1.06923505  0.20784598\n",
      "  1.39234525  1.77079251  5.44427585  0.41756049  2.96857841 -0.88350648\n",
      " -1.75618836 -1.29648524  3.87664165  1.05502711 -1.35226335  4.57168925\n",
      "  0.0723856  -2.81672008  3.13437649 -1.92131611]\n"
     ]
    }
   ],
   "source": [
    "print(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def linear_kernel(X, Z):\n",
    "    '''\n",
    "    Compute dot product between each row of X and each row of Z\n",
    "    '''\n",
    "    m1,_ = X.shape\n",
    "    m2,_ = Z.shape\n",
    "    K = np.zeros((m1, m2))\n",
    "    for i in range(m1):\n",
    "        for j in range(m2):\n",
    "            K[i,j] = np.dot(X[i,:], Z[j,:])\n",
    "\n",
    "    return K\n",
    "\n",
    "K_train = linear_kernel(x_train, x_train) + 1e-10 * np.eye(m)  # see note below\n",
    "K_test  = linear_kernel(x_test,  x_train)\n",
    "\n",
    "clf = sklearn.linear_model.LinearRegression()\n",
    "clf.fit(K_train, y_train)\n",
    "plot_model(K_test, clf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### [Optional; advanced] Why do we add 1e-10 * np.eye(m) to K_train?\n",
    "\n",
    "It turns out that our assumption that $\\theta = \\sum_{i=1}^m \\alpha_i x^{(i)}$ needs to be refined slightly.\n",
    "\n",
    "Let's consider the parameter vector $\\theta^*$ that minimizes the cost function $J(\\theta) = \\frac{1}{2}\\sum_{i=1}^m \\big(\\theta^T x^{(i)} - y^{(i)}\\big)^2$. \n",
    "It is true that there is *some* $\\alpha$ such that $\\theta^* = \\sum_{i=1}^m K(x^{(i)}, x)$. So, we can minimize the cost function by searching over $\\alpha$ instead. But there might be *many* different vectors $\\alpha$ that achieve the same cost, so minimizing $J(\\alpha) = \\frac{1}{2}\\sum_{i=1}^m \\big(\\alpha^T k(x^{(i)}) - y^{(i)}\\big)^2$ is not guaranteed to find the vector $\\alpha$ that corresponds to $\\theta^*$. \n",
    "\n",
    "However, if we instead add even a tiny bit of regularization to our training objective, we are guaranteed to exactly recover $\\theta^*$. This is a result known as the *representer* theorem. \n",
    "\n",
    "Try changing this to\n",
    "``` .python\n",
    "K_train = linear_kernel(x_train, x_train)\n",
    "```\n",
    "You will see that the learned model is slightly wiggly, i.e., the learned $\\theta$ does not *exactly* correspond to a hypothesis in the original hypothesis class. But it should have the same cost as $\\theta^*$ to within a very small tolerance. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Polynomial Kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Explicit definition\n",
    "def polynomial_kernel(X, Z, d):\n",
    "    '''\n",
    "    Compute dot product between each row of X and each row of Z\n",
    "    '''\n",
    "    m1,_ = X.shape\n",
    "    m2,_ = Z.shape\n",
    "    K = np.zeros((m1, m2))\n",
    "    for i in range(m1):\n",
    "        for j in range(m2):\n",
    "            K[i,j] = (np.dot(X[i,:], Z[j,:]) + 1)**d\n",
    "            \n",
    "    return K\n",
    "\n",
    "\n",
    "# Better version: use sklearn.metrics.pairwise.polynomial_kernel\n",
    "\n",
    "d = 12\n",
    "K_train = sklearn.metrics.pairwise.polynomial_kernel(x_train, x_train, degree=d)\n",
    "K_test  = sklearn.metrics.pairwise.polynomial_kernel(x_test,  x_train, degree=d)\n",
    "\n",
    "K_train = K_train + 1e-10*np.eye(m)\n",
    "\n",
    "clf = sklearn.linear_model.LinearRegression()\n",
    "clf.fit(K_train, y_train)\n",
    "plot_model(K_test, clf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gaussian Kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Here is an explicit defintion\n",
    "def gaussian_kernel(X, Z, gamma):\n",
    "    '''\n",
    "    Compute dot product between each row of X and each row of Z\n",
    "    '''    \n",
    "    m1 = X.shape[0]\n",
    "    m2 = Z.shape[0]\n",
    "    \n",
    "    K = np.zeros((m1, m2))\n",
    "    \n",
    "    for i in range(m1):\n",
    "        for j in range(m2):\n",
    "            K[i,j] = np.exp( -gamma * np.linalg.norm(X[i,:] - Z[j,:])**2 )\n",
    "            \n",
    "    return K\n",
    "\n",
    "# Better version: use sklearn.metrics.pairwise.rbf_kernel\n",
    "#   rbf = \"radial basis function\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Gaussian Kernel Intuition\n",
    "\n",
    "$$K(\\mathbf{x}, \\mathbf{z}) = \\exp (- \\gamma ||\\mathbf{x} - \\mathbf{z}||^2 )$$\n",
    "\n",
    "Intepret as *similarity function*\n",
    "\n",
    "* Equal to 1 when $\\mathbf{x} = \\mathbf{z}$\n",
    "* Decays exponentially as $\\mathbf{z}$ and $\\mathbf{x}$ get farther apart\n",
    "* Smaller $\\gamma$ -> slower decay\n",
    "* Larger $\\gamma$ -> faster decay\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "gamma_vals = [0.01, 0.1, 1, 10]\n",
    "\n",
    "x    = np.linspace(-10, 10, 200).reshape(-1,1)\n",
    "zero = np.array([[0]])\n",
    "\n",
    "n_plots = len(gamma_vals)\n",
    "\n",
    "plt.figure(figsize=(12, 4))\n",
    "\n",
    "for i in range(n_plots):\n",
    "    plt.subplot(2, 2, i+1)\n",
    "    k = sklearn.metrics.pairwise.rbf_kernel(x, zero, gamma=gamma_vals[i])\n",
    "    plt.plot(x, k)\n",
    "    plt.title('gamma = %.2f' % (gamma_vals[i]))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Regression with Gaussian Kernel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#gamma = 1000\n",
    "gamma = 1\n",
    "\n",
    "# Matrix of similarities between training points\n",
    "K_train = sklearn.metrics.pairwise.rbf_kernel(x_train, x_train, gamma=gamma) + 1e-2*np.eye(m)\n",
    "\n",
    "# ith row = similarity of ith test point to all training points\n",
    "K_test  = sklearn.metrics.pairwise.rbf_kernel(x_test,  x_train, gamma=gamma) \n",
    "\n",
    "clf = sklearn.linear_model.LinearRegression()\n",
    "clf.fit(K_train, y_train)\n",
    "plot_model(K_test, clf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Regression with Gaussian Kernel and Regularization\n",
    "\n",
    "**Tip**: use regularization with kernel methods.\n",
    "**Tip**: don't form the kernel matrix yourself. Use an optimization routine that allows you to specify the kernel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn import kernel_ridge\n",
    "\n",
    "lambda_val = 0.01\n",
    "gamma = 1\n",
    "\n",
    "clf = kernel_ridge.KernelRidge(alpha=lambda_val, kernel='rbf', gamma=gamma)\n",
    "clf.fit(x_train, y_train)\n",
    "plot_model(x_test, clf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Second Problem: 2D Non-Linear Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x1a20522ef0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD8CAYAAABzTgP2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXd8FVX6h58zc1t6gIQAgdB7h9CRpiAK9oq9u+vadS27rmtfdFd/tnVXbOvaWBVUFJHee+8lECCF9F7vvTNzfn/cEHK59yYBEpLAPJ8PSmbOnDkT7j3vnPO+7/cVUkpMTExMTEyOozT0AExMTExMGhemYTAxMTEx8cI0DCYmJiYmXpiGwcTExMTEC9MwmJiYmJh4YRoGExMTExMvTMNgYmJiYuKFaRhMTExMTLwwDYOJiYmJiReWhh7A6RAVFSU7dOjQ0MMwMTExaVJs3rw5W0oZXVO7JmkYOnTowKZNmxp6GCYmJiZNCiHE0dq0M7eSTExMTEy8MA2DiYmJiYkXpmEwMTExMfHCNAwmJiYmJl6YhsHExMTExAvTMJiYmJiYeNEkw1VNTJoKu7enMXf2brIzi+nUNYrLrutDbLvIhh6WiUm1mIbBxKSeWPLbAb75bBMupw5AVkYxm9cn8/RLF9Gle405RiYmDUadbCUJISYLIfYLIQ4KIZ7xc/7/hBDbKv4cEELkVzmnVzk3py7GY2LS0DidGjM/21xpFAAMQ+JyanwxY0MDjszEpGbOeMUghFCBfwITgRRgoxBijpRyz/E2UsrHqrR/CBhYpYsyKeWAMx2HiUlj4nBCDooq/J5LOpyHy6Vjs6lneVQmJrWjLlYMQ4GDUspEKaULmAlcUU37acA3dXBfE5NGi91hwTCk33NCEagBjIaJSWOgLgxDLJBc5eeUimM+CCHaAx2BJVUOO4QQm4QQ64QQV9bBeExMGoycrBK2bEhGSklIqM3nvKoKBg1rh6qaAYEmjZe6cD77e/Xx/6oENwLfSyn1KsfipJTHhBCdgCVCiJ1SykM+NxHiPuA+gLi4uDMds4lJnaLrBh+/t4aNq49isaoYhiQs3I4jyIqUEme5hiPIQkRkELffP7Shh2tiUi11YRhSgHZVfm4LHAvQ9kbgD1UPSCmPVfw/UQixDI//wccwSClnADMA4uPjAxkeE5MGYc53O9m0Jgm328DtNgBwu3Ratgrlkqt6k5ddSlzHZgwY0tZcLZg0eurCMGwEugohOgKpeCb/m05uJIToDjQD1lY51gwolVI6hRBRwCjgjToYk4nJWWXhL/twuXSvY4Yhycsto33H5oyb2LWBRmZicuqcsWGQUmpCiAeB+YAKfCql3C2EeAnYJKU8HoI6DZgppaz6tt8T+FAIYeDxd0yvGs1kYtIUkFJSUuzye04RgrzcUjrS4ozvk59bysz/bGHz+iSQMGBoW6bdMZjmUSGn1I/TqbFtYwplpW569o0hpnX4GY/N5NyiThLcpJS/Ar+edOz5k35+wc91a4C+dTEGE5OGQghB67bhpKUU+pzTNIMOnZqf8T3Kyty88OSvFOSXV0Y7bVqTxL5dGUx//wq/jm5/7NmRxjt/WwZ4VjRSwogxHbnzgeGUl7lZtTSR5MO5xLZvxujxnQgNs5/x2E2aHmbms4lJHTDtjnjef2O513aSza4ydGT7U36j98fqJYcoKXF5hcAahqS81M2KhQlcclXvGvsoK3Xx9mvLcJZrXsfXrTxMi+gQFvy8F7dbx+X05Fj8OHM7f3p1EnEdz9ywmTQtTC+YiUkd0D8+lgefGkubdhEgIDTMzqVX9eGuB0fUSf97dqZ7ZVEfx+XS2b0zvVZ9bFqb7Pe4y6nzy/c7KSlxVd7D5dIpK3XzwZsrT3/QJk0Wc8VgYlJH9I+PpX98LFJKhKjbBDZHkNXvcUURtKjliqSk2ImuGX7PHY+kOpnszBKyMoqJjgmtPLZ3Zzrff7mVlKR8mjUPZuo1fRg1vlOdP7NJw2EaBhOTOqY2E2ROVgnffbGVbZtSsFgVRo/rxBU39ifIjwFY9Ot+1ixL9NuPxaJw4aXdazWubr1aemQ6vHeSEMLzH+knU1sIvIzJ9k2pvP/35ZUri7TUQj7/cD1ZGUVcNc1UtjlXMLeSTExOg7IyN2mpBTidWs2NT6Igv4znH5/L+lWHKSt1U1TgZOGv+3n12fnouveb+9qVh/lixgakn8wdIeD2+4cS16FZre7bqWsUPXrHeGk0CQF2u4XmLYL9XhMSaiemTVjlz19+vMFnS8vl1Jn7wx5KS/xHZhmGJCOtkPy8slqN06ThMVcMJucdB/ZmsnrpIVwunSEj2jMgPhallklnbrfOfz/cwNoVh1EVgWFILry0O9ffOhBNlxTklRIeGYTdHvirteDnvZSXuTGq2ADNbZCZXsTWjSnED4+rvNen760N0IuHEeM61Wrcx3nkT+P57ac9LJm3n/JyjV79WnHtLQMpyCvjHy8tQXPrGIZEUQQWq8K9D4+sXAE5y91kZ5b47ddiUUg6nEePPjFexzeuOcp/P9xAebkbw5B06NyC3z8+mqiWoX77MWkcmIbB5Lzim882seS3A7hdOlLC5nXJdO4WxRPPX4jFUrNx+M8H69iw+ihul4674tjiefs5sDeTlCP5IDxvyGMu6sxNdw3x2+fOrWlofvb6neUa+3amVxqGg/uyqh3L6ezpWywKU6/pw9Rr+ngdb9UmnJf/bwrz5+zlaGIubdtHMvmKXrRpG3HiWquKqioYhq8TXNcNQsO9Q1sP7M1kxjurvVYYiQeyef7xuYRHOsjJLKFFyxCunjaAoaPan/KzmNQfpmEwOW84ciiHJfMOeIWUOss1Du3PZs2yRMZc1KXa64sLnaxbdQTtJEety6lzaH+217GViw5haJI7Hhju009EpMNv/xarQkRkUOXPQggUJfDk37NvqzqV12gRHcLFl/ckLNwRQABQYcTYjqxdnujlrBYComPCaBvnXZluzrc7fLadDMOTDHg8ITAtpZCP3l1NYUE5F9XSV2JS/5g+BpPzhvWrjuJ2+77tOp0aKxYdrPH67KxirNba1VBwuXRWLU30mxE96bKe2Oy+/QghGFlla6hL9yhEAMOgqgq3/25YrcZSE1JKfvl+Jw/e+i3PPz6Xh+/8jn/+YwXlZW6ftjffHU/HrlHY7Co2u4ojyEKLqBAe+/M4n7bHkn0T/vzhcup8/+VWND//NiYNg7liMDlvkP48uBUY1Zw7TlTLUL+GJRAWi0JOVjEhod4JYn0HtmHKVb35ZdZuFFUgKraf7n90FC2iT4SeWqwqv3/iAt5/YzmaZmDoEiHAZlN5bvpkYlqHnXzL02Lxr/v56btduKo40reuT+b9UjdPPn+hV1tHkJU/v3Yxhw/mkHQ4l6iWofTs28rvyqZNu3Bysv37JE7GMCRZmcW0jo2oufFpsGNLKot+3U9RQTn9Bscy8dIePltfJicwDYPJeUP8iDgWz9vvs71hsSj06B1TY/5BaJid4aM7sL7Cx1ATbk33muircuWN/Rl3cTd2bTuG1arSb3Cs31DV/oNjee3dy1g6P4HM9CK69WzJ6AmdCQ6pnQRGbfjpu51eRgE8eQ37dmWQmV5Ey1a+BqhjlxZ07FK9/tPl1/dj/55Mv4l5J6PrBiGh9TNRz/pqK/Pn7KuMIEs+ks/S3w7w0ltTiGzuPxrrfMfcSjI5b+jcLYphoztgd3i/D+m6ZOHcfTz74ByyM4ur7ePOB4YzcmxHrFYFu8OCzabSsUtzrDbvr5LNpjJ8dIdqJ7vIZkGMHt+ZYaM7VBqFgvwyVi9NZN3Kw5SVerahomPCuP62QTz41FgmXdazTo2CphkUFZT7PWexKGSkFZ123916tuS+R0YRHunAZlexWBWCQ2w+1etUVdCjTwzhEf59L2dCTlYJ837c6xVW7HbrFBc5+WHmjjq/37mCqG553ViJj4+XmzZtauhhmDRBpJRs35zK//6zhbTUAq/8AKEIYlqHMf39y2uM+Ckrc1OQV0azFsFYLApff7qZ5QsTUFWBrhkMH9OR2383rNY+CYBfZu3ix5nbUVTFs72kS+55eCTDRnc4zaetHQ/d/h2FfoyD1aby6juX1WrLKuVoHiuXHKK4yMmA+LZeVeoMQ5KVUYQjyIqqKvz9hUUewcGKX3FM6zCeevEiwsLr3jAsW5DAV59s9LtqCY9w8N7n19X5PRszQojNUsr4mtqZW0km5xVCCAbEt+Wjd9b4JI1JQ5KXU0piQg6du0VV209QkNVr6+fWe4dw7S0DyMkqoVnz4FqrnR5n1ZJDzP5muyfLuErEz0fvrqFjlxZ+t3Pqisuu68t3X2zxmjwtVoXuvVvWyigs+Hkv332x1eMHMSQb1yTRpm0Ef3p1Eja7BUURXtLeL/zjUhITckhPLaRVbBidukbVm5yGxaIE7NssmBQY8zdjcl5SUuz0e1xRBPm5pafVZ1CQlbZxkadkFAzd4F9vreTj99b41TEyDMnKJT4FDeuUiVO6c/m1fbE7LDgcFixWhYFD2vHQU2NrvDY3u4Rv/7sVl0uvVH51lmukJOXz25y9fq8RQtC5WxSjxneic7foetVYGjCkrZci7XGsVpXRF3aut/s2dcwVg8l5SZu2EaQmF/gc19w6HTqfeVGd2rL4twNsWZ/sV/ICPDpFBfUsJSGE4LLr+nLxFb3IySomPMJRa0fw5nXJfqu+u106i+ftZ8SYDkTH1N9qpyZCw+zc9YfhfPrPdRiGRNcM7A4LrdqEc9k1NUuVn6+YhsHkvOSGOwbz/usn1U+wqQweHhcwkqgucJa7WbP8MAf2ZhLdMpTVyxKrjdqxOyz06teq3sZTFZtNPeVwUd0wAoYBF+SV8exDP9NnQGseeOICbNXIhNQnI8d2omuPaFYtSaSwsJze/VszsI5qbx/Yk8mc73aSllpAbLtILr++L126R9fBqBsW0/lsct7icUJvJjWlgJAQGxOn9uDy6/rW295zXm4pLz75K6UlbpxODYtF8SuNcRxFEbSKDeflt6ZgOQUn9plQkF/GprVJuF06fQa28clmPpn0Y4U89+gv1YbvWq0KI8d2qrPaFI2FDauP8NG7a04Y9oockweeuICBQ9s17OACUFvns2kYTM576rJ+gpSSzeuTmT9nLwX5ZfTu15opV/cmqmUo772+nC3rk/3ueftj5LiO3Hrv0DoNT62O1UsP8dm/1iOgUkhvxJiO3PmH4dX+fv73+WYW/3qgWqVZq1Xlgy+vb7BVw+niduukHM3HEeTZfjr+ezB0g4fu+J7iIl9fVbPmQfzfJ9c0yvoUZzUqSQgxGXgHUIGPpZTTTzp/B/B3ILXi0PtSyo8rzt0OPFdx/BUp5ed1MSYTk9pSl1/g77/cysJf9ldOklnpxaxYdJCho9tXaxSEoNLPYLOr9BsUy/2Pjq6zcdVETlYJn/1rvc+b/7qVR+g9oHW1IbM33D6Y3v1b8/P3uziwJ9P/MwooLXU3KcOwYtFBvvrE8wJqGAYtokN4+JlxtGkbQXpaUcAs+JJiFzlZJU1aQfaM18xCCBX4J3AJ0AuYJoTo5afp/6SUAyr+HDcKzYG/AsOAocBfhRC1E5c3MWlk5OWW8tsc72Qqw5BomsGaZYcDGgW7w0KXHtGEhtmIjgnlmpsG8MCTF5ytYQOeus/+CvU4nRqLft1f4/V9BrTh0T+PD6hQa7OphDchCYo9O9L44qMNlJe5KS9z43LqpKUW8tqf5uNy6TgcFgzd/7+nYUifJMqmRl2MfihwUEqZCCCEmAlcAeypxbUXAwullLkV1y4EJgPf1MG4TEzOKnt2pGNRFR/11RqR8McXLqq2hkN9U1LsCujvCFSA52SCgqxMnNqDhXP3eTnUbXaVa24eUOuaF42Bn7/f5RsUID3RVpvXJTFiTEdi4yI4mpjrFVGmKIJO3aLqJVnvbFIX/1KxQNUq4ykVx07mGiHEDiHE90KI456Z2l6LEOI+IcQmIcSmrKzqdepNTBoCu8NSUSezeo43EYrAZle5/XfDGtQoAPQZ0NrvW67FqjBgSNta93PdrQO5elp/wipWB82aB3HrvUO58JKmJamdGUAKxOnUyM7wyKb84Y9jCI904HBYEAIcQRYimwfxu8fO3hZgfVEXn0Z/34ST11g/A99IKZ1CiN8BnwMTanmt56CUM4AZ4HE+n/5wTUzqh74D2xAwIaEKkc2DaRkTSlRMKJOm9jireROB6Nm3FV26R5GwL6vyTVm1KISE2pl8ec9a9yOE4JIre3PJlb0xdKNJrRKqEtexOdnZJT6zkd1hIba9J1KrZasw3pxxNVvWJ5N+rJA2bSMYOLRdrQo+NXbqwjCkAFVjs9oCx6o2kFLmVPnxI+D1KteOO+naZXUwJhOTs47dbuGhZ8by7t+WoxuG3y0lm11l6tW9uWhKjwYYYWCEEDz+3AQW/bqfZQsScLl0Bg9vx2XX9DntbZHGZBRcLp2Na45yNDGXmFZhDB/TsdoM9Stu6Muu7ce8tpMUVRAe4aD/4BObGlarWu9aVg3BGYerCiEswAHgQjxRRxuBm6SUu6u0aS2lTKv4+1XA01LK4RXO583AoIqmW4DBx30OgTDDVc9d0lILSE0uoGWrsFoXuW9seCq9HWbh3P3kZBZXVjuz2VRi2oTx/OuXNKnonKZObk4pLz01j9ISF85yDZvdU6L06ZcmVisdvnt7Gv/51zpys0uRQJ/+rbn7oRFeVfaaGmc1j0EIcSnwNp5w1U+llK8KIV4CNkkp5wgh/gZcDmhALvB7KeW+imvvAv5U0dWrUsrParqfaRjOPZzlbt6dvpz9ezKxWBR03aBtXCRP/OXCJltQxdAN1q8+yrIFCWhug+FjOjDmoi4N7k+oa3KzS1iz/DBFhU569WtF34Ftqi1Jerb5x4uL2b09zScqrEV0CG/OuKracGUpJSVFLqw2BbvDt15GU8NMcDNpNBw6kM2sr7ZxNDGHyGbBTL2mD8PHdPD6Qs54ezUbVh/xqiWsqgo9+rTkqRcnNsSwTWrBhtVHmPHOGqSUaG4Dh8NCbFwkz7w8sVGsilxOjd/dNBPdT2ip3WHhuemTq12Zulw6B/dlIoSga4/os5aBXl+YstsmjYJ9uzJ48+XFlXu1xUUuPv1gLWmpBVx90wDAE+lxslEAT1WvA3uyyMstpVk1lbaklCTszSIro5i27SNp36l5wLbnCzlZJaxccoj83FJ69IkhfnhcnU9qJcVOZryzxisprrxcI+lwHnN/2M1VN/av0/udDroeOHRYCIHbFThbe/2qI3z6z7UIBBJPNNnvH7+A/vF+AyfPKUzDYFKvfPmxb5EUl1Pn1x/2cPHlPQkJtXvi5AMs5y0WxVMQJ4BhyM0p5fXnF5KXU+qRcpCSTl2ieOy58Tj8lMo8H9i8Lol/vbUKWZFct3b5YX6cuYO/vH7JKdeJqI6tG1P8bhm53TorFh1sFIYhKNhGm3YRJB/J9zknBLTv6P8lIuVoHh+/u8ZLZBHg/TeW89p7lzWoYuzZoPGEDZiccxi6QfLRPL/nLFaFxARPQflfZu3ym3ULnklm7450EvZl+lXxfG/6MjLTi3CWa5SXa7icOgcPZPHFjA11+ixNBWe5mw/fXo3bpVcmrJWXa2RlFDPrq611ei+3Sw+orFqbmthnizsfGI69omAQeAzC8fyRQKuohXP3+U340w3JsgUJ9TrexoC5YjCpN4QisFpVv5OEYXhKbC5fkICm6RgBVvwSyayvt6EoCnEdm/HHFy6sdAJmpBWRfDTfR5pAcxusX3WEOx4YfkqlNc8Fdm5L8+tM1TSDtSuOcNv9w+rsXn0GtPZr0BVFNCp10c7donnprSnMnb2LxIM5xLQO49Krelcrj52RVuRXwkTXDDLTq68Lfi5gGgaTekMIwejxnVi55JB3TL+A4BAbS387EFCG4bionK5JdCRgcPhQDm+/tsyjP+Q26Nw9ClVVcONreDTN4IN/rGDcxG70G9ymUSpd1geeKnD+3+Kr228/HaJjwrhwSg+WztuPs2K70GJRCAqxctW0ht9Gqkqr2HDufmhkrdouW5hAwr7A6gpW27m/0WIaBpN6Zdqdg0k+mk/y4TwMaaCqCjabhVHjOjI/QOnH5lHBlJa4KC/zdgxqboM9O9Irfz6amBPQsEgJW9ansHt7OoOHteO+R0edF8ahV79Wfn8nQuCVmFVX3Hj7ILr3asnCX/ZRVOik/+A2XHxZT8KbaKz/lvXJfPXxxmr1rjasPsqEyd3PiYI8gTANg0m9YndYee5vF3NofzZHEnNp3iKYfoNjWfTrvmrLWdZmEne7DRRVoAjht14yeOoPb16XzL5dGfTse3YqoTUkYeEOrr15ALO/2V7p9LdYFRwOK9ffNqiGq08dIQSDhrZjUCPaOjoTfpi5vdqKeuD53M2dvZtHnh13dgbVAJiGwaTeEULQpUc0XXqceMMaEN+W77/c5tPWYlUYPqYjS+YdqFXfhi6JjglBCMjKKPZrbJwujXUrj5wXhgHgkit707FLFPN/3kt+bim9+7dm4tQeTTpj92yRme5fPM8LCcdS8vnf51vYsyONZi2CufiynufU58s0DCYNQqs24Uya2oNFc08UtbHZVZo1D+aK6/tht6v8NmdvjW9vAFEtQ3jm5Un8/YVF7NqW5rfNebCL5EWPPjH06BPT0MNocrRsFUbSYf+RdMcRArIzSljw8140zeDIoVx2b0/jmpsGMPkKf6Vomh7nvhfFpNFy/W2DeORP44gfEUfPvjFcf9sgXv6/KYSE2rj6pgHc9YcRtOsQSVi43ZN16ke10u6wMHZiVwBGj+/sV27CbrMw/IKO9f48Jk2fq6b1x2avIZJNCHTd8PLluJw633+5zW+pz6aIuWIwaVB6929N7/6tfY4L4ak3PGLMiQl99jfbmffDbk94q/SomfYd2KZS3XLo6PasWnqIhH1ZOMs9qxC73cLQUe3p3rvlWXkek6aHYUj27Egj+Ug+US1DuOnOwXz35TY0zUDTdIKCrJSVugFo3TaC9NRCNM13z1K1KOzdmc6Qke3P9iPUOaZhMGkyXD2tP/Ej4li7/DCapjN4WBzde7esdFSrqsITf5nA1o0prFt5BItFYeS4TvQZ0Pq8iEgyOXWKi5y89ucFlSq4Vpsnau5Pr03CYlEJCbURFu7A6dTQNYPgEBv3T5vpPxpOcM7kzZiGwaRJEdehWbWiZ4qqMHh4HIOHx53FUZk0VT7/93rSjxVWRrXpZQbl5RrvTV/B9H9eXvlCYbdbMKyeVcLwCzqwcskh30g4KenV79xwQJuGwcTE5LzE7dbZvD7ZzwQPeTklpCbl07Z9M9avOsJ3X2wlK6OYoGArIWF2r2ssFgVFFTzwxJhGoShbF5wbT2FyTpOeWshP3+7gwN5MIiKDuOTKXsSPiDO3h0xqRX5uKbk5pbRqE05wyAkRQU0zAmo9KapCaambtSsO8+n7ayvF9MpK3ZX+BgCEJwDixbemEN0ytF6f42xiGgaTRk3ykTxefuY3XC4daUiyM0uY8c5qkg7ncs3NAxt6eCaNmLJSFx+8uYq9O9KwWFU0zWD8pK5MuyseRREEBVlp2SqM9NRCn2sNXRLXsRkf/GOlj8KqF9JjYA4n5JxThsEMVzVpEArzy/j+q228+MdfeXf6MvbtyvDb7uvPNuEs17zE2lxOnbk/7KEwv+xsDdekCfL+GyvYsyMNt9ugrNSN26WzbGECc77dUdnmtvuGYrOpUGXxabUpdOsZzRP3zSYvp7TG+zjLNRL2ZdbHIzQY5orB5KyTnVnMX5/4lfJyt0eTJiGHnVuPcdW0/lx6ZW+vtvt2+jcYumawa1saI8d1CngfTTPYuiGZhH1ZNI8KZuTYToRHnF5he5OmRVZGMfv3ZPpoHrmcOr/N2cvl1/dDUQS9+7fm2Vcn8cM320k6kkeL6BAMXbJ/T2b1K4UqWG0qzVsELiTVFKkTwyCEmAy8g6fm88dSyuknnX8cuAdPzecs4C4p5dGKczqws6JpkpTy8roYk0njoqiwnHk/7mHzuiQKC5ye4jxVcDl1Zn+1nTETunjVeK6u9GxyUuAM1eJCJy8/8xt5uaU4yzWsNpXZX23nsefGn1PSBSb+yc4sxmJR/Eq+O50abpdWKd/eqWsUTzx/IQBJh3N5+enfam0UwJMJPaqaF5SmyBlvJQkhVOCfwCVAL2CaEOLkvPCtQLyUsh/wPfBGlXNlUsoBFX9Mo3AOUlRYznOP/sL8OXtJP1bkYxSOo1oEu7Yf8zpmtQWOCw8LC/z2//Vnm8jKLK5MdHO7dJxOjXenLw+oyNpQ6C437hJzW6wuaR0bjub2P7mHhNgCRg8dOpDtta10MooqEAIcQRYcQVaCQ6w89ufxTVZNNhB1sWIYChyUUiYCCCFmAlcAe443kFIurdJ+HXBLHdzXpIkw78c9FBc5a5yQy8s0CvLKPDWc92WxdUMyNpsaUC8prMrK4mQ2rD7qV3HVMCT7d2f4zbY+25RnF7DmgbdJnrMGaUgierRjxD8fodUF/Rp6aE2eyObBDB4ex+b1yV6rBptd5cob+weMaAuLcPgtVwoQ2SyIJ/96IS2iQ9i/OwOb3UL3Xi3rvJZ2Y6AuDEMskFzl5xSgujJRdwPzqvzsEEJswrPNNF1K+WMdjMmkEbF5fXK1+vZVmfmfzWzfksrBvdmV4nqB+OqTTQwd3cGvPlIgGW5B4yg7aeg6c0c/TPHhdAy35znzdx1hwSXPMHXNezTv17mBR9j0uffhkYR8tokViw6BrDAKN/Tjwku6Bbym/+BYVNV3I8VmV7n8+r60q0iubEwV6uqDujAM/syr341hIcQtQDwwtsrhOCnlMSFEJ2CJEGKnlPKQn2vvA+4DiIszs1rrm7070/ltzh5yskro3juGS6/sTYvokNPqyxFU+4+ZYcCe7ekBazV4t5VsWpvkd3+3Z98Ydu9I9/kkarpBt14Nr5uUOm8DpWk5lUbhOHq5i22vfMmEb//aQCM7d7BYVW67bxjT7oyntMRFWJgdxc+kXxWrVeWpFy/iHy8txu3yVMPTNYORYzsx/uLABuVcoy4MQwpQ1Xy2BY6d3EgIcRHwZ2CslLISz7JqAAAgAElEQVRSglBKeazi/4lCiGXAQMDHMEgpZwAzAOLj42sxbZicLgt+2cd3X2yp3MI5llzA6iWJPP/GJbRpF3HK/V04uTtffLShVhLaQK2MAnje/PNz/e/N33zPEF5+6jdcLg29oia0za5y3a2DvJKcGoqcbYfQSsp9TxiSnE21q0VhUjusVvWUalF06NyCdz69lj070ikuctKtZ8vTfilqqtRFHsNGoKsQoqMQwgbcCMyp2kAIMRD4ELhcSplZ5XgzIYS94u9RwCiq+CZMzj6lJS6+/e8Wr0lc1yVl5W6++mTjafU5enwn+g+OxWZXEQK/8tmng82m0rFLc7/nYttF8uq7lzF+cjfato+kf3wsjz83gUlTe9TJvc+U0PYxWIL9O89DO5xaHQXd5UYr9WNkTE4bVVXoO7ANI8Z0PO+MAtTBikFKqQkhHgTm4wlX/VRKuVsI8RKwSUo5B/g7EAp8V+H0OR6W2hP4UAhh4DFS06WUpmFoQA7sycSiKrg56e1e4lVv+VRQVIUHnxpLYkI2O7cew+GwkpqSz/IFB/22F6LmVYOqCmLahHuFnhqG9HIctogO4dZ7h57WmOubDtdcwPrH/ulzXA220+/Zm2rVR1lmHmt+/zYpv6xDGgbN+nRkxAeP0HJE7xqvLU7KIOHTeRQfySDmgr50mjYhoKEyqR/KSl1kphfTrHlQo4tqEtXFiTdW4uPj5aZNmxp6GOcku7en8e705ZSXuX3OWW0qH39bu0mrJqSU/PrDbr77cpsnV0GC3a4SGu7AYlHIyymtjCW3WhUcQVbcbp3yMg2LVWH0+E7ceGc8QUFWViw6yOyvt5GXW0Z4hIOp1/Rh0mU9Gr2WUu7ORBZf+RfKM/MRqoLUDYb8/X56/K7mqG3DrTG75x0UJ2UitRNG3BLs4LKNHxDZM3BNgJR561ly3YtIzcBwubGEOLA3D2Pq+g8IbuV/BRYIrdzF0dkrKdifTES3trS/ZgwWR8Nv1TVmDEMy87PNLJl/AIuqoGk6fQfGct9jowgKstbrvYUQm6WU8TW2Mw2DSVU0t85Dd3zvk2ugWhRGjOnAvQ+PqtP7lRQ7WbviCJnpRXTq2oL44XFkZRQz+5vtJCbkEBHpYMLkbowc2xFFVTAMiRBUTvqL5u7jfydtfdnsKpMv79kktJSklOTtSMRdVEqLQV1r/dZ+ZPZKVt75OlqRt49FqAodp01g7H+f9Xud7nTxTcy1uAtLvK+zqHS45gLGffOXWo+96HAac0c9jLu4DK24DEtoEJZgB1NWv0t45za17ud844eZ2/n1h91en1mLVaFXv9Y88ZcJ9Xrv2hoGUxLDxAuLVeWhp8fw9qvLMKTE7dKxOyxENgti2p01fp5OmZBQOxdd2r3y5++/3MpvP+1BURWEgMKCMhxBlspokqpbRbpuMOvr7T5O7eOyB1Ov6VOZ3dpYEULQvL93aGrpsWwSPvuNosQ0Wo7qQ8frxyJ1A0toEIrqiZnP3XbQxygASN0ge8O+gPdLX7EDf0GDUtM5+uPqUxr78ptfpTwzH2l4QoO14jK00nKWT3uFyzZ8cEp9nS8YusF8P7XMNbfB3h3p5GSVNAqfhmkYTHzo1a81/5hxFWuWJ5KbVUKXHi0ZNKxdnTmNA7FtUwrzf96L221AlbyHD/9vNZ26Rfvo0RTklQXMblUUhfRjRbTvdGJrRNMMVi09xIpFBzF0ycixHRk3qWuj0tA/tmgzi6/8C4ZuYDjdHPxqEavvexNFVVEcVno9dBUDX7zD47wOcfiNbArrFDh5r+q2k8853SNDXZstuLKMXHK2Hqw0CpUYktydiZQeyya4TVSN/ZxvlJdrAaPzLFaF7Mxi0zCYNF7CIxxMvvxkZZP6ZeEv+/x+aQwpWbMskanX9PE6HhJmxwiwFaprOhHNTjj0DN3gzZcWc3B/VuU9UpPyWbU0keemT/YobDYwhltj6Q0vo5WeKCgvXZ48B8PQMNwau9+ehTO3iCGv38fGJ//t04cabKfvUzcGvEfMmH4Y/oyDImg9YWCt/TJaqRMRICdAsai4/YXinmMUFpSTfCSPZs2Dax3G7QiyEhRspbjI6XPO7daJaRNe18M8LUzZbZNGQ0G+/8lEcxvs3ZnO6qWJFBee+ELZ7RaGj+7gU2fXYlHo2bcVkVUMw/bNqRw6kO1leFwunbTUQtatOFwn45dSkrluD3venc3hb5ehlfvXhAKQhkHGqp0c+X45xUc9CrKZa3ZX+0YPoJc6Ofif+RhujclL3iQkriWW0CCs4cFYQh0MfesB9DInK+94nZV3v8GxxVu8hAitIUEMf+8h1CA7VJV+MCRpy7ax9MaXcBUUB7x/wYFk1vz+bZbd/CqBRIWsYUHntI/BMCT/nbGex++ZxXuvL+evT87l+cfnkpdbs0S3ogguv66PzyrVZlMZMqK912e2ITFXDCaNhr4D25CWUuBXU2nf7gwS9mVhGJJb7h3CuIldAbjtd8MoKnKyZ3s6iirQNIPWbSO4//HRXtdvWptUKahXFZdTY93Kw4y5qMsZjV0rc7JwyrNkb9yPoekoNgvK7y1cvOANogZ7Z8wWHkxl/qSnKM8pQAiB4dJof80FdL51YrUCbsdR7FYKE1KJHtaT6w5/Tc7WBLSScloM6srK26aTumBT5RbTkW+X0+HasQx//yEOfbmIo7NXYosIYcjf7+Pwd8vJWLkTKmpdSJdG0k9rKE3JZsqqd33um7Z0K4su+zO6S/MYMKXivfJ4fLEQqEE2Rv77cYRy7r5zzvtxNysXH8LtNjzbnngKSv3jxcW88vbUGlddky7riW5I5ny7s/KzPnpCZ266u+59eKfLeWUYDE0n5df1FCakENGzPbEXx1c680wanslX9GTFooOUlrgwDO8tIs1tVOotffXRRrr2iCa2XSR2u4UHnxrLP15cxKH92aiqIDO9iJf+OI+nX5pYuV9rc1gC5kfY7WfuoN7y/GdkrduLXrFKMJyecN+FU57lhtRvKz9n0jCYP+kpzyqhymCO/rCK8M6xSL1mTSnD6Sa4rWf/XghB1CCP4TkyeyWpCzd5+R20knIOf7eMtGXbcGYVVCbCpczbgOqwVRqFqn3nbjtEym8bUGxWwju3IbR9DFJKVt7xutc2FxX+BTXIRkibKCJ7t6ffszcTPbRxJBHWF7/95Os8NgxJVkYxRw7l0rFLi2qvF0Jw6ZW9mTS1J0WF5dWqvTYUjWs09UhxUga/jnkUV14xerkLxWElKDqSS1e+Q3Dr6v8hTeqfQwey+el/O1BVQWiYHZdTQzekX8E7l0tn4dx93PG74QD87/PNJCbkeN6+KhYFWRnF/N+rS3nl7akAjB7fmVVLDvl8oe0OC2MnntlqAeDAx79WGoWq6GUu0pfvILxzGzb/5VOS56zBXVTmY6H0Uid7//kjQ9/5A+sfft/Tl+FrxRS7lVbjBxASG+1z7uB/F6AV+27H6aVOSlOyvIyOVlLuX5IDT0jroiuewxLswHC6aTWuP/F/u5fyHN8SmABIycWL/k5o3KllbDdVigr9/94URZCbXVKjYTiOxaLQrHnjLPBz3hiGpTe8TGlqduWXw3BrFJe5WHHr35i86B8NPLrzm51bj/Hu9GWehLaKudBmV4luGcKxFP+T0fZNqYDnTW3FooM+BsQwJBlphaQk5dM2LpLO3aKYNLUHC37eh6bpSOlJ2Bs2qj3942NPe+zpy7ez7uH3cBeUBGxTdCiVpde/iKugBKpZEThzCln/0Pu0u3wEQlEo2J+MK6+I0tRs1CC7Z5Ie259x3zzn9/rqVhu1WYl4tdWpfKa0pdvY+PSMgOno0pAo1vNmKiGmTbjfOtGaW69UXw1E0uFctqxPRlEVhoyMo3XsqWuPnQ3Oi3/NktQs8rYf8vlySE0nY9UunLmF2Js3jmiA8w0pJZ//e73fXITM9MBO0PzcMlxODYQIKOmtqoqnLnRcJADX3TqI4Rd0ZP3qoxiaweARcXTq2uK0M6SzN+1nwZRn0Ut9I0yOY7jcZK3bi7uwtFqjcBy9zEnSnDWEtImiJCULYVEx3J6IJHt0BK3HD8AS4j8JrsN1Yzm2aHPlNlYlgfbQFIGiqj4Krz7P4HSTvnw7oR1aUbg/2fukEER0b3derbpvuG0Q/3pzpVeVN6tNpf/gWFq2CvN7jZSSL2ZsYOWSQ2huHSEEc77bydSre3Pljf3P1tBrzbnrIaqCu6AEYfHvSxCq4lnamzQIxUXOgAXXFTXwhC2EZ0vJZlMDxn1rboO4jt4SD+06NOPamwdw/e2D6NwtyscolJa4WDr/ALO/3saWDckY1UzmW57/DL0scOSRGmynx4NXkrF6V43RRlUxylwUHTqG4XSjl5R7VlESnJkFbH3pv6y4bbrPNdmbD7D+kfcxtJMmeUUQ2rGVdwRS5Y0kHW8chyXEgTU8GMVu9d8OUG1WBr1yF9aIEE9EU8Xz2SJCGPvln2r9bOcCg4a1475HRxHVMgQhBHaHhQsv6cbvTwp4qMqOLcdYtSQRl1PHMDzClG6XztwfdnP4YM5ZHH3tOC9WDOHd2gVc6toiQghp57tfa3J2sNlU/8U7AKRHJ8ntZ0UQ2TyYkFCPJs9Ndw3mX2+u8nqDs9lVJkzuRmhY4CpvJ3PoQBZv/HUxhmHgcuo4HBaaR4Xw3PSLCQn17Sdny8Fq1f5sESFEj+zNsQV1J9+ilzpJ+mEVhQdTCe/i2QIzdJ2FU571v51lSEpSMgNUSIGyjHymZc6mYF8StshQfhp4n2d1c3I3mk7bi4dw3aEvSfjPfPJ2HaZ5/850uW0S9mb+35LPZYaMbM+Qke1xuXQsFiVg1bfjLF+Y4LfwlNttsGrJoVr7Jc4W58WKQbGoDHvnD6jB3l9uNdjO8PcfPqdD6xo7doeVvgNao560OhAColuFct2tA7HZvVd7NrvKbfcNrXzbHzQsjoeeGUu7Ds2wWBSatwjmhtsGceMdg2s9DkM3ePu1ZZSXuSu3tcrLNTLTi/jqY/8Te00vFGVpuay85W8UHEip9Thqg7CoZK49IUKcsXJntSsXWU3FupxN+3EXlpC+YgcHPplHh+vG+nxPLMF2ej1yNdbQIOzNw+nz+HVc8OlT9H7kmtM2ClqZkwOfzmPJ9S+y7uH3yN2ZWOM1hqbT2LTdbDa1RqMA+BWlBI9/pizAuYbkvFgxAHS5ZSLBrVuw7eUvKExIIbJnewY8fxutxpj1dRuaux8cwSvPzqcgvwyXU8dmV7HZLTz89DhaxYbTIjqUn77dQU5WCbFxkVxz0wB69PGOgOk3KJZ+g2p2ImtunY1rkti49igOh5UxF3WhR58YDu7P9vgsTm6vGaxffYR7Hxnps+3U+9FrWHH7dL/RQ8fRywL7HwDPtoyUfiOaAiGEwB4ZyqGvF5O5Zhfu4jJk4HVXBf7PW0IcfNf5FjA8Y1BDHDiiI9FKynDlFWMND6HvUzfQ94831Hp8NeHMK+LnYX+gLC0HraQcoSoc+GQew975A93vmeLT/sjslWx6egZFiWlYQ4Po8eAVDHrhjibl8I4fEUfCviy/UXGDhzW+MqGmuqpJg2PoBts3H2PZwgRcLo1BQ9sxblJXn4zmU+0z+Wg+iiJo2z4SIQQul87f/jyf1OQCT7KbALvNwviLu9JnYBv++fcVlJX6vr0JAZ/OusVbwM/pYu7oR8jZXLtqa4rN4nEVuE4yPgJQFASeSVp3uons1YGC/UkBndr2qHCsYcGUZxWgFZeh2K2+DueTn8Gi+vg51GB7pfS213GHjV6PXcuAP9+MGmTn6KwVbJ/+DaUpWbQY2JWBL95xRrkK6x55n/0f/uL3vtcnz8TR4kSkztEfV7H8lte8fhdqkJ32V41uUr4Nl1PjxT/OIyO9qDKCzmZX6dCpBc+8MtFvnen6wFRXNWkSuFw6b/x1IUmH83CWa6gWhYS9WTgcFi640H9+gdutU1biIrRKDd+SYhcgCQm1s31TKh+9uxq3S8eQnuI9docFXTMoLXGfSJ6T4HRqLPntAENGxqH7ybgG6NI92me7YPHVf621UQDPxNzphvGkLd5CSVLmiRMS0A2UYDtD/n4/7a8cjSM6kv0f/cLmv3yGMysfJChWC6rDhhpko8XgbhxbtBlZISBYk1GwBDsY8OLt7HlnNq78YoQi0J1u2lw4iLRl23wmaL3cxcH//Eb8q3ezffrX7Hjlq8rEuNT5G0lfuYOJv7xG63EDav38VTk8c6nPPY//jlJ+3UCXWydWHtv09AwfA6mXOTkyawWD/3YPoe0avn53bbDZLTz/xmQW/bqfNcsPo6qCCy7swrhJXVFVheIiJ4vn7Wf7plTCIuxcdGkP+g5sOFkR0zCYNCgLft7DkUO5lW9RumagA5//ewP9B8d6VbZyu3W++XQTKxYfQkqJw2FlwuRu7Np2jKOH8wCIaRVGZkaRTwhreVngkExN09m5LY1rbxnA919tq1zuK4rAalO55d4hXu1zdyaSvnz7qT2oIen39I0gJQc/X+Cb4FbmIn3FDrrf60nI637vVLrdMwWttJzS1Gyy1u8jqGUkrSYM5MvwqZVGoTb0efI6+jx+HX0eu5bMdXtx5RYSPawnyb+sI23JVr/X6GUuXIUlbH/pC59tLr3UybqH3uOqnZ8AnlDMjJU7OfTVInJ3JOKICqfb3ZcSd8Uov6HAUlaTb1FFrVVKSWFCqt92qt1G3vZDTcYwgMefNuXqPky52lsMsiC/jOcfm0tJsbMy0GLvjgwuvrxHg9UUMQ2DSYOyfKFvchqAUGDz+mTGX3xCZ2jG26vZujGlsn2x28mc73Z6XXcspeC0xiElXHx5L1rFRvDt51vIyiwmIsLBFTf09ZLuBsjeuD9glE8gInq2J6JbO79Zz8cH4C7yjgYSQmANCSKiWzsiurWraCZPKfTVEhrEwBfuON4hMSNPlP1sfdEg/4lvikLbS4eSs/kAis3q1/9RsDcJrdyFM6eA3y76I4UJKV6+lvRl24m7ajRjPn/Gxzh0uHYsCZ/M88mfkJpO20tOlGIVQmBrFoYrr8jn/lLXCW57bkQT/jhzB0WF5ej6id+f06kx78e9jJvUrUFkuM1wHJMGJVBymjQk7ipvxbnZJWzdkOLXiJwpFovKkBFxaG6dX2btIiuzGGe5RmZGMZ//ewN/f2ExO7akVgqeBbVqjl7uOp5eUCtCO3ic5R2uvsBvgpolxEHHa8fW2I8QglbjBngcHzWg2K10vePiwGNq15KeD13lNR7FasEWEcKgV+7GFhmKNAL8vi0Kyb+s5ZfhD3qS3k7WtiopJ+mHVV7RU8cZ9OIdBLVufiL6SRGowXYG/+0eglp6Zw73evQanygpYVEJ69TGp8BRU2XzuiQvo3AcocCOLf5XTPVNnawYhBCTgXcAFfhYSjn9pPN24L/AYCAHuEFKeaTi3LPA3YAOPCylnF8XYzJpGgweEceS3w747u8L4RVldCylAItV8TIWZ0wV53O7Ds1YOv8ARw7l+Ehz796eRsK+TGw2lcf/MoFip2Db8InkR7VCGJKI3EwMISgJb4ahqjhKiui4fxst044Cnsn2uAx1h2vHsOfd2eTuSKyMWFKD7UT0jKPD9eNqNezh7z7IL8MfRCst97zxC1BsVoQQCFVBK3NhCbYT0aMdg1+7p9q+ut83hbydh8hYuQtRsVIY8o/fERIbjWwfQ1DLZhSVpHutcoTVgqIorDpZVO8ktNJyjv6w0muVAuCIjuSqnZ+Q8NlvpMxbT1Cr5vT4/RV+Hdr9/3QTJUkZJH61GMVuRbp1wrrGMmnua42+pndtUQMUwBJCBDxX35yxYRBCqMA/gYlACrBRCDFHSln1VeFuIE9K2UUIcSPwOnCDEKIXcCPQG2gDLBJCdJNS1v1roUmj5PJr+7BpzVGKi07sr9rtHmG7VlWKlkTHhPqV4z5dWrYKpWuPlpXhqgCrlyYGrK7lcuq4nDp/+/MCdM3AiGoFQkGqkB/VytOoYqIqC2/G3oGjcdmDaHtkH8Kq0v3+ywCPkZi89C0OzPiFhM/ng4Qut02k+/2Xodpqp/KaszUB3eU+sVoRCi1H9mbCrBdI+mE1pWk5RA/rWWPhnezNB5g3/nHP6kfTQXhCQ4uTMmk9fiDd75vCRT+/yrzxj6OVOTFcGkJVkLqB7nRXm9zneVgFJYDigDUsmF4PX02vh6+uvgtVZfRHTzLopTvJ25FIUJsWNO/bqfr7NjFGT+jMvB/2+Lz0GIZk0JCGCWWtixXDUOCglDIRQAgxE7gCqGoYrgBeqPj798D7wvOJvQKYKaV0AoeFEAcr+ltbB+MyaQKERwbxyjuXsWjuPrZuTCEkzM5Fl3Rn4NC2Xu1iWofTpVsUCfuyajQQVqtKVEwImWnFGIbhd/7Kzy1j8pW9iKtB9OxkKrOwRZU3OX8OVouVwz0H0T4/lfFfPONVuMbisNVqUvRHaVoOq+950zsSyfDUeT46ayXd7r601n2tuf8ttOIqcjASpFsna+0ecjYfYM/bs5gw6wWuT5pJytz1FCdlYIsIZd2D72LImpOyVJuVTjfWTXH74NYtzlk9pqlX92b7plTSjxV6IvNUBUUV3HH/UELD7eTllrJ9cyqKEAyI9w7IqC/qwjDEAlWVtVKAYYHaSCk1IUQB0KLi+LqTrj19qUuTJklomJ0rb+xfo5jYQ8+M44M3V7B/V4ZfmQzwxIY/+qfxdOjcgv9+uI51K4/6bedy6bz2p/n0HtCay6/1OJhHje/E0cRcL2mNM0IIBs98iXaT6i6J8sh3y/0e10rK2fvBT7U2DO6SMnJ3BM42Nlwahktj2U2vMC19FnFXjOTQV4vZ8frXaOXVJ+2BZ2ur1yNXnzN+gPrE7rDy179fwtaNKezadoywcAejx3cmpnUYv8zaxY8zdyAUEAj+++EGpt01mAsv6V6vY6oLw+BvrXryO1qgNrW51tOBEPcB9wHExcWdyvhMzgE0zcDp1HjkmXGsXHKImf/Z7HfbJyjYRs++rfjLY7+Q5kcauSplpW42r01ix+ZUHv3TeC6Y0Jn5c/bWeF1tkULQvH1UnfR1HHdRWUA11FMRgxS1LFAldYPMtXs48MmvHJ29MmANh+NYI0OIGd2Xgc/fRlR8/U5e5xKqqhA/PI744SfmtgN7M/np2x0+W0zffLaZbj1b1ijxfSbUhWcjBai6EdYWOBaojRDCAkQAubW8FgAp5QwpZbyUMj46+twIUzOpGSklc3/YzYO3fcvTv/+R39/yP5bMPxBQM8ft1Ni9PY3sjOKACWve/Xv8B599sA7dkMSPiKuV9k2NGAZRsozW3es2SanNxMGeymsnodgstL9yVK37sThstLlwEKIWGbcFB5I5MmtFtUZBDbJz8YI3uCV3DhPnvGoahTpgybwDfqPwdE1n+aKD9XrvujAMG4GuQoiOQggbHmfynJPazAFur/j7tcAS6flmzwFuFELYhRAdga7AhjoYk8k5woKf9/LjzB2UlbpxuXQ0t0HKkXzcLt9JXyiCvoNiOXIwB9fJ0hM1kJdTyqN3z2LhL/t8yoqeMlIS7C7jybdP3YdQE1FDutNmUjyW4CohpjYL9mZh9Hny+lPqa9RHTxAU0wxLaDV71lJSnpkfcJUiVIXYi4dwydK3aHNR7UULTWqmsLDcr3/MMKAwv/qV25lyxltJFT6DB4H5eMJVP5VS7hZCvARsklLOAT4BvqhwLufiMR5UtPsWj6NaA/5gRiSZHMcwJHO+2+VX3O5kVFVgd1i59pYBHNibidVm8egh1RJNM9CKAwvZ2WwKLj/G6GQE0LZ1CC99cAtKPaj2CiEY/+3zJHwyj33/moO7qJS4K0fR9483+OQA1ERI22iuSfiCw/9byrHFWzg6eyXSkBhON0JVUOxWRn30JOVZ+SgWC7qfUOGIHnFMmudbH8IfSXPWsOnpGRQkpOCIiqDPkzfQ5/FrTXXjAAwYHEvC3ky/wnv9BtevXIYpomfSaCkrdfGHW7/1m/xzHEURtGwVSp8Brbn0qj60iA7BWe7m0btnU1riPdHb7Cqh4XZys0u9PFmKIjwZxdV8FewOC5pbDzgWi9UzuQ0eFsfdDw7H7qhd6Gljoiwjl33/mkP6ih2Ed4ml50NX0bxvJ8oycvmu480+GdCWYDvxr99Hzz9cWWPfR2atYMXt0710jyzBDrreNZnh7z5U589yLlBW5ua5h38mP6+sMhLPYlVoGRPGi29NwWY7dZHJ2oromYbBpNFiGJIHbvmfX8XTqnw26+ZKMb3j7Np2jPemL8fl0hEKKEJw9c0DGDikLa8+Ox+XS8dZrmF3eBbNNa0uHEGedv40lxxBFq6/bRAjxnQkOMR3//9c4NBXi1h975tIKTFcbizBDlqN7ceFP74SMFfhOFJKvu90M8VHM3zOqQ4b1yfNxBHlUVQ9+MUCtjz/H0qSMwlu3YL+f76Z7vdfds4ks50qRYXl/PTtTjasOoJQBCPHduKya/uc9ufMVFc1afIoiuDiy3vy6+zdAUNIo2NCfYxCytE83n9jBZpuYBgSBYGwCNp3bE7r2Aje+uhqNq5JIiOtkIjIIL7+tOaXDE0zGD66A2tXHvFxahuGZPT4Tk1ylVBbOt98Ea3G9efw/5bhKiwh9qLBtBzVp1YTtl7uoiQly+85xW4ld0cibSYMZO8HP7HxqQ8rVxWlqdlsfPJDyrMLGfDcLXX6PE2FsHAHt9wzhFvuGVJz4zrE3NwzadRccX0/xk/uhvATKWSzqVx/+yCf4x+/v5ayUnelDpNhSFwunX+/tQrDkNjsFkaN78TVNw1A140aZYcsFoW+A9tw093xRLcMrVxlWCwKNpvK/Y+OOqeNwnFCYqPp8/h1DHrhDmJG9631W7xqt/qNpAIw3BrBrZtjaDpbnvvUR2JbKy1n5+vfVMp+m5wdzBWDSaNGUQQ33RXPZdf25X+fb2LD6qO4nDotooYUImMAACAASURBVEO44fZBDB3Z3qt9WamLpMQ8v325nBrJR/K81FI13aiuABs2m0qHLi2475FRBIfYeOWdqWxak8Senek0ax7EBRd2ITomtE6e9VxFKArd7pvC/n//7FWCVKgKkT3iiOzZnuLkTHQ/NRqOX194MJXm/cxkubOFaRhMmgRh4XbueWgUdz84El0zsJxGdTd/8/+A+LbM/no7J29UWSwKA4e25app/YltF1l53GpVGTG2IyPGdjzl+58vuItKSZ2/Ed2lETtxMI7oSOJfu4eSIxmkzNvgqWanG4R1bM1Fc14BwN4szL8EOGC43ATF1F8yl4kvpmEwaVIIIao1CkHBNjp0bs6hhGwfS+AIsvhki7ZpG8H4SV1ZvvAgzoqwWKtNJbJZEHc+MJyQUG/JZ5PqOfz9clbe8TqKqiKRGC6NQS/fSd8nb2DCrBcpSjxG7o5EQtq1pMWgrpXbUdbQINpffQFHf1iJUX5i5aDYLLQaP4CgmOaBbmlSD5hRSSbnHMeSC3j5mXm43QZul47FoqCqCo89N56efVv5tJdSsmPzMZb8tp+SEheDh3lqTgcFn5sRRvVF0ZF0fuh9V6Wc+HEswXYmzv0brcZWr4XlLi5j8dXPk7l6N4pVxdB0WgzowkU/v4q9WVh9Dv28wQxXNTmvKSosZ9mCBA4fzKF1bAQTJjdMJazzgeNV5ba98iU7X/8G4+SscyFof9Voxn/3V5ASQ9NJ/nktBfuSCe/WlrgrRnpJjhfsTyZ/71HCu8TSrI+5ZVeXmIbBxMSkXtFdbrY8/xn7/zUHd3E51lBHQCE/W/MwtGKPAKBitaJYVbQyF2qwDXt4CJeuepewDr6rOZO6pbaGwQxXNTExOS1W3j6dve/9WFnHujp1V1d+sWclIT3OZK2kHAwDvbic0mM5zJvweEBhRJOzj+l8NjExOWWKj2aQ9NMaH5mMgNQgTFhyJIMtz33K4FfvroPRNS103WD9qiOsXuqpjzFqfCeGje6AWgvl2/rCNAwmJianTM62gyg2S+0NQy3Y8+5sBjx/K6r93Hb6pybns2V9MkIIBg1tx5cfb+DgvuzKqLiEvVmsXprIE3+Z4JPVf7YwDUMtKM/+//buOzyqKn3g+PedmgqEECD03kG6oCJNmgWwINgAV+y7q7v2ZVVsa19XV38qawOxgGABQRGkiDRB6dICARJqgEBIm3p+f8wEZzIzZEKSmQTO53l4MnPuvee+c2eYM/fUk+RlHCGxWSqW6nowk6bFN0gJOe6gLPIyj/otg3qu+fyjX1k4b7tnxD3w5WcbQHnuGorYbE52bsti3ZpMuvWKzqJkumA4A2d+Icv+9BIZ36zAYDXjtjtpedswLvzPvRjCXAFL085FyV1bktCkLie37Su3AsLtdBFTq1q55FUZbd10KMjiO8Gr2GyFTlb9lB61gkE3Pp/BT+NfJGP2Slw2B46cfFyFdnZ++D2/TXw/2qFpWlSJCIO/f4EaHZpiiovBVC0u5L6GGAvWmomYq8VhrhYHBglY1NdgNdP46kvO6Tty30GU4TCWMGttRdJ3DCEUHD5OxpyVuG3+87e48m1sfesbujx9q1/fa00738TXT2Hkuslkb07n0LJNrH3oHZzFJsEDwO3m+swZHP1lG65CO0mdmrJs3Isc/nkTBosZt81B3X4XcPHkByL/IiIoPz/89hird6LHaNEFQwi5e49gjLEEFAzgWSDdnn1KD9PXNCCpQ1MKj55ETCYgsGBQLjcoRd1LO51OGzL/JXLS9pOTtp9qLRuc0+0KRbr3bsS2TYewFVuRzWAQDEY5vRiP1WKix8WN6NA5NRphArpgCCmxeWrQQgG8a+wmV49wRJpWedXq1irkutDVWzfEFBs451S1FvWp1qJ+RYdWafTq05Qf5mzl0IFTp9sZzBYj9RtWZ9QtXVm7cu/p/Vq3rx3VxYl0wRBCTHJ1mt04kN2fLfKb+8UUF0PHR24ocdUqTTufmBPj6DJpHOufmvrH2gkiGGMt9Ppv+S/dqZTi4KJ17PpkIbgVTUf3o/6QHpV6/WiLxcjjLwxlwdztrFi6G0G4ZEAzBg5rjcVqiuodQnFlmhJDRGoC04EmwB7geqVUdrF9OgNvA9UAF/CcUmq6d9tHQF/gpHf38Uqp9SWdN1JTYrgdTn558B12vDcPBAxGIx0fHk2nf9x03i41qGlnsvern9nw/CfkZWRRq2tLOk8aR0qPNuV6DqUUP9/6Entm/eQZQQ2Y4mOoN6gbA2ZOqtSFQ7RFZK4kEXkJOK6UekFEHgWSlFKPFNunFaCUUjtFpB7wK9BWKXXCWzB8q5SaWZrzRnquJGehHduxk8TWTsJg1jdZmhZNB378jR9HPn66UChiio/h0qmP0fjqS6IU2dlxeZegNZ/FGiOlFak1n0cA/byPpwBLAL+CQSm1w+fxARE5AqQAJ8p47ogxxVgw1U+JdhiapgG7PlkYUCgAOPMKSZv6Q5UpGE5kFzD1ndWsX5uJW0HT5jUZd9eFNGmeHO3QyjyOoY5S6iCA92/tM+0sIj0BC7DLJ/k5EdkoIq+JSMhVUUTkDhFZKyJrs7KCLyyuadq570wD6tzO4mvxVU4Oh4tnHv6OdWszcbkUyq3YvfMY/5r4A4cPnop2eCUXDCKyUEQ2B/k3ojQnEpFU4GPgVqVU0Tv7GNAG6AHUpNjdhi+l1GSlVHelVPeUFP3rXdPCUZh1gq1vfc36Z6dxaNnGc2IG02Zj+mOKjwlIN8XH0Pzmy6IQUemtXbmPU6dsuF3+74fD7mLeV5ujFNUfSqxKUkqFvNIiclhEUpVSB71f/EdC7FcNmAv8Uym1yifvg96HNhH5EHiwVNFrmhbSvjkrWHLDs6AULpsDU6yVlF7tGDT3X1V6cGb9IT2oN6gbBxb86tf4XLt3e5pce2mUowtPetoxbIWB3XvdbkXa9qNRiMhfWauSZgPjvI/HAd8U30FELMBXwFSl1BfFtqV6/wowEoh+Ualp5wD7yVyW3PAsrnwbrgI7uBXOvEKOrNjCltdK1dej0hGDgQEzJ3Hp1MdoNOJiGlzRi4vfe5BB856vMt3IU+okYLEGiVWgdp3oL2Na1sbnF4AZInIbsA8YBSAi3YG7lFITgOuBS4FkERnvPa6oW+onIpKCZ+aU9cBdZYxH0zRg3+yVQbttugpsbH/3Wzo9ckMUoio/YjDQ+OpLqkxDc3G9L23KzGnrAtItFiPDrm4XhYj8lalgUEodAwYGSV8LTPA+ngZMC3H8gLKcX9O04Jy5BShX8IbYYD16tMhKSLTy0KTLeOOFpdgKHYgIbrfi5gk9aNX2jH14IkJ3yte0c1DqwC5B08VooMHlF0Y4muDcDid5+48Sk1wNc2Lo2VnPVS1ap/Cf968lPe0YDruLZi2TsVgrx1dy5YhC07RyVb1VQ1qMHcyuaX/0+RezCXNiLF0mjSvh6IqllOL3N75k3aQpKIcLt8tFk2sv5aJ3/4Y5PjaqsUWawSA0b1Ur2mEE0AWDpp2jev/f/dTp04nf3/gS2/Ec6g/pQadHbyC+nAZrKqWwHT2JMc5aqi/0He/P47eJH/wxpxKwZ9ZP2I7nMHjeC+USm1Y2umDQtHOUiND8xoE0vzGgGbDMMr5dycq/vEHBoWxQigbDenLx/x4kplbJsw77TbTn5bY5OLR0Azm7DpwXU3BXdnq2KU3TSuXwz5tYPPoZ8vYewW1z4LY7yZz3C9/1+xvKfeZlPpXbTf7+4P30DRYzJ7ftq4iQtVLSBYOmaaXy25Mf+U1FD56G5NyMIxxcFNgF05cYDMTWSQq6zW13nlfrM1RmumDQNK1UTmzZEzTdbXeSHWKbr04Tb8IU5z+lhcFiJqVnG6q3blgOEWplpQsGTdNKJaFJ3aDpRouZxKYlLzbT9t6RdHh4NKb4GMyJcRisZuoP6c7Ar58u71C1s1Sm9RiiJdLrMWia9oeMb1eyeMwzuPL/qE4Sg4HY1JqMSv/Ub1oKpRQ5OzJRSlG9dUO/Ba6c+YWc2n2Q2DpJxKTUCHquwqMn2ffNclyFduoP7akbpssoIgv1RIsuGDQtura9PZs1j0z2jNh1uqjeugEDZj3ld8dweMUWlt70HLajngUaLUmJ9P34Mer2vSCsc+z6ZCHLb38VMRo8jdoKWt95JT3/fY9eQfEs6YJB07QK5Sy0c2LLHqxJCSQ28/8ln7c/iy/b3oozt8Av3RQfw8hN75MYojqqSO7ew3zZ7taARm5TfAyXTvsHjUdcXD4v4jwTbsGg2xg0TTsrphgLtbq1CigUALa98y1uR5BppR1Otr71dYl57/pkQdC5npx5hWx986uzC1gLmy4YNE0rdye27MFtcwSku+1OTmzeU+LxtuOncNsDCxYA27Hor3B2rtMFg6ZpABxbn8a2d+ew9+ufcdkDv9RLo1b3VhhjLAHpBquZ5G6tSjy+3sCumBICp9kwWM00vLJXmWLTSqanxNC085zLZmfRNU9ycOkGAAxGIwaLiSELXia5c4uzyrPVhMvZ9PJ0XIV2v3SjxUzbe4aXeHz9IT2o2akZx9bt9Cw0BIjZiLVGAu3+es1ZxaSFT98xaNp5bv2z0zi4ZL1ntbd8G45T+diO5TB/0EP8/t+vSJv6A/aTuaXKM7Z2EpcvfY2anZtjsJgxWM0kdWzK0MWvElev5NlExWBgyMJXuGDizSQ0rUtsak1a334Fw9dNDms+psrE6XTjdARfG6Oy0r2SNO0892nK1diO5QTdZrCYMFjM4HbTb/oTNLzij2qcwqwT7P16OY5T+Thy89k/fy1iNNBy/FBa3DIIg9l0ej+lFLG1g0+Fca46fiyfKW+vYuO6AygFLVrVYtxdF9KwSfSug+6uqmlaWKbEDAnZ0OvLGGtldMbnWGtWI+3jH1hx52tgEE9Vj8/3iCk+hpTe7Rj83QsYjFVjDebyZrM5efjur8k5UYDvvIIxsSb+9cZwklPioxJXRLqrikhNEVkgIju9f4MWhSLiEpH13n+zfdKbishq7/HTRSSwtUrTtAqV0rNtWPuJQPoXSzm15xAr7nwNV6HdM/q52I9LZ14hWat+J3Pu6ooIt0pYvWwPBfkOik8263C4mT9na3SCKoWytjE8CvyolGoJ/Oh9HkyBUqqz959vy9OLwGve47OB28oYj6ZppdTjlbswxVlL3M9ld2LPzmXXJwtLnF7bmVvInlk/lVeIVU7a9ixshYF3YS6nm51bj0QhotIpa8EwApjifTwFGBnugeIZ0z4AmHk2x2uaVj5SerZh2E//of6QHliSEjBXiwND4JQTRquZuv0uOOMYg9NEsJ/MZdGop5jT8x7WPPwu+QeCr8NwLqpdNxGzObAaTQTqpFaLQkSlU9buqnWUUgcBlFIHRaR2iP1iRGQt4AReUEp9DSQDJ5RSRZ+wTEBPxq5pFcjtcpE5dzXpM5ditFpoMXYQdS7pSK2urRj8nWdZzdyMI3zT+XYcOfkol+fOwBhnpe6lnUi5sC327FNse3s27mJdUX2J2cj++Ws9BYhSHN+4mx3vzePKVW9SvdW5P7V2n4HNmf3FJig2HMRsMTJkeHhVd9FUYuOziCwEgk1sMhGYopSq4bNvtlIqoJ1BROoppQ6ISDNgETAQyAFWKqVaePdpCMxTSnUMEccdwB0AjRo16rZ3795wXp+maV5up4sFV/6DIys248wtBBFMsVZa3jaMXq//2W/fU3sOsf6pqWR+/wvmhFha33kl7e+7FoPZhHK7mdVmPKfS9oc8l5iMKGexLpoi1B/S/bxZ13nblsO89dJP2O1ORASlYPzdF9L70qZRiykivZJEZDvQz3u3kAosUUq1LuGYj4BvgVlAFlBXKeUUkd7AJKXUkJLOq3slaeebw8s3s+nl6ZzafZDavdvR8eExpZ6COm3qD6y893Wcef7rLZvirAxd/G9SerQJP56Vv/N9v78FnQ8pvlFt7CfycOTkBWwTk5Hx9h9KFXdV5na52Z12DKfTTfNWtYJWL0VSpCbRmw2M8z4eB3wTJJAkEbF6H9cCLgZ+V54SaTFw3ZmO17Tz3Y4PvmP+kIfJmL2CE5vT2fnh93zT5Q6O/rajVPns/Oj7gEIBPLOkpn++uFR51endjpTe7TBYzX7pxlgrbe4eDgT/wWmI8hdjpBmMBlq0TqFN+zpRLxRKo6wFwwvAIBHZCQzyPkdEuovIe9592gJrRWQDnoLgBaXU795tjwB/F5E0PG0O75cxHk07pzgLbKy+702/RXGU04Uzt4CV975RqryUM0RPIuWpZiqtQXP/RfObL8MYY0FMRhKbpdJ/+uO0v/9aTytrMWI20uS6vqU+jxZ5ZWp8Vkodw9NeUDx9LTDB+3gFELTdQCm1G+hZlhiqGqUUuXsOISYjCQ1DtdVrmkfW6q2IMfjvt2NrtuOyOzBazEG3F9f8lkEc+20nzvzAqqSmo0r/hW2Oj+WS/z3IRW//DVehHVN8zOkFdPpPf4JF1zyB261wF9oxJcQSk1KDnq/eXerzaJGnJ9GLoINL1rPs1pcoPHIClCKxWSp9P51IzU7Nox2aVkmZYq2EbAc0SshCI5gW4waz86Pvyd64+3SVkik+hsbX9KH2xR3OOkaDyYih2Eyo9Qd359qdH7Pzo/nk7TtMnT6daHJtH4xWPYa1KtBTYkTIyZ2ZzO5yZ8CvNXP1eEbtmoa1ZuXv26xFnnK7md5gNAWHjvuli8lIo6t6M2DWU6XKz2V3sGfGEnZ9tghjjIVWtw6lwRW99FKZ54lwG5/1HUOEbHltZtA57t12Jzs/mk+Hv4+KQlRaZScGAwO+fIofhjyC2+XClW/zVMvUqkbv/7uv1PkZLWaa3zyI5jcPqoBotXOFLhgiJHvj7sB+3YCrwEb2pt1RiEirKmr3aseoPZ+y+9MfObXnELW6taLxNX3CblvQtNLSBUOE1OzcnKxftgUUDsY4K0kdm0UpKq2qsCYl0vZePWOMFhl6oZ4IaX//dRitgb/wjBYzLceXOKZP0yLOkVvAnplL2TVtAfnF2ji0c5u+Y4iQai3qM2ju8yy79UUKDmWDUlRr2YBLpz2mG561Smff7BUsvfE5xGhAKYVyuuj02I10fvyWUuflLLRjP55DTEqN04v3aJWb7pUUYUopcvcexmA2El8/JdrhaFqAvP1ZzGo1DleBzS/dFB/DgFlPUX9w6E4tyu3GdiwHU2IcBqOBXx56lx3/mwt4Rj13fPQGOj1yg+4FFSW6V1IlJSIkNgk2J6GmVQ67pgVfb8GZV8iW12eFLBh2fbqQNQ++iy37FALENUwhf/+x0wWMqwA2PvsJYjDQ6eExFfkStDLSbQyaVo6UUuRlZlXpOvmCQ8dx2wK7VgMUHAz+uvbNXsHyO/59+liXzcGptAMBdx3O/EI2Pf/pWU3BoUWOvmOownL3Hmb/D2sxWs00vKo31qTEaId0Xju8fDPLxr9IXmYWADXaNqbvtMeo0a5JdAMrpbp9L2DH+9/hzC3wSzdYzNQb3C3oMb/+4z2/+ZzOxFlox559ipiUGiXvrEWFvmOootb+4z2+bDueX/72f6z88xtMb3A9uz9fFO2wzlvpM39iXt/7ObXrAG6bA7fNwfH1acy95D5s2aeiHV6pNLyyN4nNUv1nTjUYMCfG0v7+64Iek7PrQNj5G8wmLDUSyhqmVoF0wVAFZcxbzdb/foWr0I4zvxBnbgGuAjs/3/YyufsORzu8886x9WksvfFZcAd25HDa7KRNrVrrDxhMRq5Y9jpt7xmBtVZ1zIlxNB3Vl6vWvE1c3ZpBj4lLTQ4rb2Oclbb3jtS9kyo5/e5UQVv/+1XQefWVS7Fr2gIu+MfNUYjq/LVu0pSgo9oB3AV2jq9LC0hXSmE7noMpLgZTrLXcYzq+YReHlm7AWjORRiMvwVxskruSmBPj6Pnq3WHPhnrBxJtYfd9b/nOBGQ2Y42Nw2RwYrWbcdictbx1K12duLVUsWuTpgqEKKsw6ETTdbXd4Zm7VIuroL9tCbhOTkRodmvilZcxdxaq/vEH+gWMANLyqNxe/+/dyGc/idrpYMuZpMr9fg3K5MZhNrLjndS775hlS+3cpc/6htPzTMPL2H2XTi59jMBtx250kd21J/5mTEIOQl5lFYrN6WHUVUpWgC4YqqP6wC8nesieg54gpIZbUgV3DzsftcGLPycOalIgYdK3i2YqrXytg9tMiBrORlrcOPf380LKNLL7+ab/eOhlzVvLdzgcYsW4yIoLLZid9+hL2frkMc/V4Wk24nLp9OoUVy+9vfEnm92tONwQXfUYWjnicMQe/4NTugxxetslzJzH8IkxxMWf7sv2ICF2eGEuHv4/ixO97ialdw69bdmztgKXgtUpMD3CrggqzTvBVx9soPJYDLk9/c4PVTFLHply58k0MxjMvIeh2OFnz6GR2vDsXt8uFOSGWLpPG0eaeEXrg0VlI/2IpP//ppYDqPTEYuHz5G9S+sO3ptO8GPMChJesD8jAlxHLZ7GdJ6dmGuZf8lZyd+z35iWCKtdD2L9fQ/fkJJcbyRfObyU0/GJBuTIghqW1jsjfvAaUQkxExCJfNfo66l4ZX6GhVX6TWfNaiICalBn2mPII53vtrTzwNhp0fv6XEQgFg+e2vsv2db3HmF+K2ObAdy2HtI/9j+7tzKjjyc1PTUX3p8NBojDEWzNXiMMXHEFs3ieG/vuNXKABkb04Pmofb4SR7Uzpb3/qGk9sz/ihklMKZb+P3N2ZxYtu+EmNx5OQFz7/QwfH1u3AV2DydFnILcOTks3D4RJwF4XUzPROlFEdWbuG3SR+x6eXpuhNEFacLhiqo8OhJlox+BkdOvidBeUalLr3hWU5s3XvGYwsOH2f39MVBBx6te3JK6NXCisnNOML6Z6ay/I5XSft4Ac5C+1m9lmjL25/FkVW/U3jsJAAZ365kbp/7mNHkRhaPeZrsLXvCyqfLE2MZvX8G/T77J4Pnv8TozBnUvCBwZb6ExnWCHm+0mEhsWpe0j3/AVRB4Ld0OF/u++rnEOFIHdAlaLahcLtwOZ2C6UmR8uwq3yxX2ex8Qm8vF4usmMX/ww2x4Zhq/Pf4BX7YZz/b35p5Vflr0lalgEJGaIrJARHZ6/wZUJIpIfxFZ7/OvUERGerd9JCLpPts6lyWe88XOKfNxO4Ks7WBzsOU/s8547MltGRhjgi+vaD9xKmBQUzAZ81bzZdvxbPjXp+x4bx4r732drzv8icKjJ8N7AZWA41Q+C676B7NajuWHYY8yo+EY5vT+M4tHP8OR5ZvJ23eYPTN/4tsL7yVr9daw8rQmJdJg2IXUuah9yDabC/55c0C9vhgMmKvHU39oCcufh1HN1/XZP2FKiPE7vykuJmT3UFehg1X3vs4U82A+TR7Jb09+WOpRyWkfzWf/D2s9dzlK4bY7cRXaWf3XN/WdQxVV1juGR4EflVItgR+9z/0opRYrpTorpToDA4B8wLdj90NF25VSgZWvWoATW/YE/OIHUC53yKqKIvGN64Sc7sAYY8EYd+auk85CO0tveAZXvu10Ps7cAvIysljz8LthvoLy4XY4yZi7ih3vzyvxdRe35IZnObDwN1yFdhwn83AV2jm6eqv/dXUrnPmFrLrvv+UWc+MRF9P1+dswxcdgrhaHMdZKjQ5NuHzpfzCYjLQYOxhjbGDBbTAbaXz1JSXmX71lA4avfYemY/oRWyeJ6m0a0v3lO2hwRa+gBYtyOE8X6PYTuWx+9QuWT3ilVK9p2ztzgnefdivSZywtVV5a5VDWXkkjgH7ex1OAJcAjZ9j/OuA7pVR+Gc97Xkvu0oI9M5bgLDYFgZiNJHdtecZjE5vUpfYlHTj80ybcPkuNmuKstPvrNSW2URxavC7oF4zb4WTPF0vp88HDpXglZ+/4pt3MH/QQrkI7yuVGuRX1Bnah/8xJJa5slrc/i4OL1oUsIIs7umYHbpcrrPabcLT/yzW0nnAF2ZvSsSQlUL1lg9Pb2t47kvTPF//RzuBtfG5337VUb90wrPyrtahP32kT/dJS+3fh4MJfceQV/jEQT4BitUeufBvpM5bQ9bk/hT37b/F1zIu4nc6Q25wFNvZ+9TN5+46Q3KUF9QZ10z3jKpGyvhN1lFIHAbx/a5ew/xjgs2Jpz4nIRhF5TUTKf6TPOajF2MEYYiwBX9BGiznklAW+BnzxJKn9O3saS6vHY7CaaT52MJ0njSvxWJc9sJ66SKQmRnO7XPww9BEKj5zAkZOPM68QV4GNAz+uY8Oz00o8PnfvEf/pHkpgsJjK/UvLFGslpWcbv0KhKP2KFf/lonf+RqOrL6HFuMEMnv8S3Z67rUznq9GmEVf98jZNrumDtVZ1ElvUCygUihisZrI3hr/cbOOr+wS9nqZYKw2G9AhIP75pN9MbjmbFXa/x2+MfsGjUU3zd+fYqN3XIuazE7qoishAINk/0RGCKUqqGz77ZSqmgHZZFJBXYCNRTSjl80g4BFmAysEsp9XSI4+8A7gBo1KhRt717z9zIeq47uT2Dn8Y+z/ENu0CEhMZ1uOSDh6lzUfuw88jLzCIvM4vqrRqEPbjKfjKXz1NH4Sre2CyQ0qsdvV7/M8ndWlVot9eDi9fx48gncJwKvPG0Jlfjxqyvznh84dGTzGg0JvA1BGGwmGl2wwD6fBiZO6FIUUrxSc0ROE4G9mIyxcVwxYo3qNkpsPE8mMJjJ5nd5U4Ksk6cvgszxcfQYFhP+k1/wu+zoJTii6Y3krfviF8eBouJJqP60vfjf5ThVWklCbe7apnGMYjIdqCfUuqg90t+iVKqdYh97wPaK6XuCLG9H/CgUurKks57vo9j8FV49CRupyvkHDYVYev/fcOah9/19J5RCowGcLkxeaddsCZX47LZz1LzLNayzj9wlJM7MklslkpCo+A9eNK/WMryCa8ELRgMZhPjbPNLPM/Pt7/C7s8W+c0IaoyxoACDyYCrmvwdQAAAECVJREFUwI4x1kpis1SGLXntnByx+9uTH7L51S/8roEYDSR1aMqIdZNLlZfteA5b/jOLvV8uw5QQS5u7rqLF2MEBd1pH127nuwEPBO3kYLCYuCVvXrlV2WmBIrVQz2xgHPCC9+83Z9j3BuAx3wQRSfUWKgKMBDaXMZ7zTkyt6hE/Z9t7RlCzcwt+f30Wxzfs4lT6QZSL0//ZnbkFfD/gAa7PmI4pSA+okzsz2ebtr1/7ova0vvNKLNXj+WncC2R8swJDjAW3zUHqgM70+/yJgHl+avdu59c+4iu5e6uwXsNFb/8Na1Ii296ejdvpwhQXQ+cnbqHlbcPY99Vy8jOzSO7a8pyu++78+Fjy9h4hffpiDDEWlMNJtVYNGDT3+VLnZa1Zja5P30rXp888D5LjVD5iCH43qZxuz5xTumCIurLeMSQDM4BGwD5glFLquIh0B+5SSk3w7tcEWA40VEq5fY5fBKTgaQZb7z0mt6Tz6juGymNOr3uDzhVkSozl4skP0Gx0f7/0zO9Ws2jUU7jtTpTT5ekJFWOh3mVdyZi7yq8Pv8FqpsGwngz8MrB2ccXdr5H28QL/X/xxVoYueJnavcOvTiuaFsRSI6HCf6kWHMlm54ffk7Mjk+TurWlx82WYE+Mq9JzhyNufRfbG3cTVrxV29dHZcpzK57O61wXtVVezc3NG/Fa6OxWtdCJSlRQtumCIjIOL17H+2Wnk7NxPUvsmdH7iloAv3c8bXE+BdzI4X2I20u25CXR88PrTaW6ni8/rXovteLFGxqI66CCfRYPVzOh9nwcs6qLcbra9M4fNr36B7dhJanVvTbfnJ5DSo03Q15IxbzWbXp5O/v4s6lzUgU4Tbwpo+K1IR1Zu4ftBD/1RIMZaMSfGcuXKN0lsmhqxOCqDzf+Zybp/fvhHjyURjLEWhsx/iToXd4hucOc4veazVia7PlnI8jv/ffoXeX5mFod+2ki/z/9Jo6suOr1fre6tyZizMuBL3Wi1BHSdPbp2e9CBecEKhD/yMZN/4FhAwSAGA23vGUHbe0aU+Fo2vvgZG56ZdvqLKDf9EHu+XMYVy14POjq5vCm3m/lDHvG7u3EV2HAV2Fh++6sMXVi6cQNVXYf7r6N6i/psfPEzT3fV7q3p8sTYiLwXWnh0waAFcDucrPrrmwFLNboKbKy853UaXtn7dE+TLk+O5eDCX/3GVBisZqq1rE9qf/+B7J5jSneH6na4SGx29r+obdmnWP/UVL8eSMrlxplbwOr732LY4n+fdd7hCrZMZpGDSzfgzC8st1lOq4qGV/am4ZW9ox2GFsK52aqmlcnJHZlB59UBsB3LIX//0dPPk7u0ZPD3L3p+7RkEg9VMszH9Gbbo1YAuq8ndWmEINvjMICQ0S8VUbNS1KS6GtveOOF0Pr9xu9s1ZwdJb/sXPE17m0NINJc7vc2T5ZgyW4L9/Dv+86YzHlpf06YtDb3S7US536O2aFgX6jkELYE6MDbkimXK7McX7/7qtc0lHRqybjNvhRIyGkL14DCYjfT+dyKKrn8TtdOK2OzHGWjHGWhg873n2f7+G9c9+jP1EHuaEGNo/cD0XPHYj4GmfWDh8Iod/3oQz1zMiOH36EpqPHcxFb90X8rUUj9UvnlIMcisL9xm++C1JiZWiAVrTfOmCQQuQ0KgONdo34fi6NJT7jy81MRmpc0lHrEmJQY8LZx3f+oO6M3Lz+2x7ezY5O/dTu3c7Wt02DGvNalRv1ZC2f7kaZ24Bpnj/ieDSpy/m8LJN/tNR5xWya+oPtLhlELV7tQt6vjp9OgW9SzFYzDS/cWCJ8ZaHRsMvImvlFtxBRo138Gmc17TKQlclaUH1n/EEsXWTMCXGIiYjpsRY4hukcOnUgHkSw5KbcYSlN/+LaTWuYk73u3EV2Ojz4UN0fGi036hrEcGcGBdw17Hzo/lBJ2pz5tvY/dmikOc1mIwM/PoZzImxp+8eTAmxVG/dgB4v33lWr6W0Wk+4nLjUZMT8R3dYMRqo3rYxHR/QBYNW+eg7Bi2oxKapjEr/lH1zVpKzM5MabRvT4PILMZhK39e/MOsEs7vdhT371On69O2Tv+XgonUM/+3dEie9A/zuXAK2uc48R1Odi9pz/b7PSZ+xlPwDx6jVozX1h3SP2Ahbc2IcV619m43Pf0r69CUYTEaajx1Ex4fGhHWXpWmRpj+VWkgGs4km1/Qpcz6///crHKfy/RpZ3XYnufuOsO/r5TS9vl+JebS4eRBHf9kWcNdgirPSdFTJx1uqJ9D69itKG3q5iUmuTs9X7qbnK3dHLQZNC5euStIq3IEFa4NOce3MLeDAot/CyqPZTQOp2bmFX2OyKT6GRiMvpo5es1jTypW+Y9AqXGzd5KDpBouZuHq1wsrDaDEzbNGrpM9Ywu7PFmGwmmk5fojfmApN08qHLhi0Ctfur1ezf8HagAFzYjTQctyQsPMxmE00v+kymt90WXmHqGmaD12VpFW41P5d6PzEWIwxFkwJsZgT4zDGWbl06qMkNA4+tbamadGj7xi0iOj08Bhajh/CgQW/YrCYaTC0hx7YpWmVlC4YtIiJrZ2kq4E0rQrQVUmapmmaH10waJqmaX50waBpmqb50W0MmlYOctL2c/TXHcSlJlPnkg7n7DrR2vlBFwyaVgZuh5OlNz1HxrerPJPkKYipVZ0hC16mWvN60Q5P085KmX7WiMgoEdkiIm4RCbmOqIgMFZHtIpImIo/6pDcVkdUislNEpouIpSzxaFqkrXt6KhlzV+MqtOM8VYAzt4DcfYf5YegjJS4ipGmVVVnvdzcD1wA/hdpBRIzAW8AwoB1wg4gUTZ7/IvCaUqolkA3cVsZ4NC2itr31Da4C/xHduBUFh7M5+su26ASlaWVUpoJBKbVVKbW9hN16AmlKqd1KKTvwOTBCPBPcDABmevebAowsSzyaFmn2nLyg6WIQ8g8dj3A0mlY+ItFCVh/I8Hme6U1LBk4opZzF0oMSkTtEZK2IrM3KyqqwYDWtNJI6NA2a7rY7qdW9VYSj0bTyUWLBICILRWRzkH8jwjxHsKkv1RnSg1JKTVZKdVdKdU9JSQnz1JpWsXq+chfGWKtfmjHOSrObBhJfX39OtaqpxF5JSqmyzmGQCTT0ed4AOAAcBWqIiMl711CUrmlVRr3LunHZnOdY+8hksjftxppcjfb3X0eHB0ZFOzRNO2uR6K66BmgpIk2B/cAY4EallBKRxcB1eNodxgHfRCAeTStX9QZ0Yfiat6MdhqaVm7J2V71aRDKB3sBcEZnvTa8nIvMAvHcDfwbmA1uBGUqpLd4sHgH+LiJpeNoc3i9LPJqmaVrZSVXsa929e3e1du3aaIehaZpWpYjIr0qpkGPOiuhx+5qmaZofXTBomqZpfnTBoGmapvnRBYOmaZrmRxcMmqZpmp8q2StJRLKAvWXIohaeAXaVjY6rdHRcpaPjKp1zMa7GSqkSh+RXyYKhrERkbThdtiJNx1U6Oq7S0XGVzvkcl65K0jRN0/zogkHTNE3zc74WDJOjHUAIOq7S0XGVjo6rdM7buM7LNgZN0zQttPP1jkHTNE0L4ZwsGERklIhsERG3iIRsvReRoSKyXUTSRORRn/SmIrJaRHaKyHQRsZRTXDVFZIE33wUikhRkn/4ist7nX6GIjPRu+0hE0n22dY5UXN79XD7nnu2THs3r1VlEVnrf740iMtpnW7ler1CfF5/tVu/rT/NejyY+2x7zpm8XkSFlieMs4vq7iPzuvT4/ikhjn21B39MIxTVeRLJ8zj/BZ9s47/u+U0TGRTiu13xi2iEiJ3y2VeT1+kBEjojI5hDbRUTe8Ma9UUS6+mwr3+ullDrn/gFtgdbAEqB7iH2MwC6gGWABNgDtvNtmAGO8j98B7i6nuF4CHvU+fhR4sYT9awLHgTjv84+A6yrgeoUVF5AbIj1q1wtoBbT0Pq4HHARqlPf1OtPnxWefe4B3vI/HANO9j9t597cCTb35GCMYV3+fz9DdRXGd6T2NUFzjgTeDHFsT2O39m+R9nBSpuIrt/xfgg4q+Xt68LwW6AptDbL8c+A7P6pe9gNUVdb3OyTsGpdRWpdT2EnbrCaQppXYrpex4FgsaISICDABmevebAowsp9BGePMLN9/rgO+UUvnldP5QShvXadG+XkqpHUqpnd7HB4AjQEWsqRn083KGeGcCA73XZwTwuVLKppRKB9K8+UUkLqXUYp/P0Co8qyVWtHCuVyhDgAVKqeNKqWxgATA0SnHdAHxWTuc+I6XUT3h+CIYyApiqPFbhWQEzlQq4XudkwRCm+kCGz/NMb1oycEJ5FhjyTS8PdZRSBwG8f2uXsP8YAj+Uz3lvI18TEWuwgyowrhgRWSsiq4qqt6hE10tEeuL5FbjLJ7m8rleoz0vQfbzX4ySe6xPOsRUZl6/b8PzqLBLsPY1kXNd635+ZIlK0BHCluF7eKremwCKf5Iq6XuEIFXu5X69ILO1ZIURkIVA3yKaJSqlwlgiVIGnqDOlljivcPLz5pAId8ax8V+Qx4BCeL7/JeFbAezqCcTVSSh0QkWbAIhHZBOQE2S9a1+tjYJxSyu1NPuvrFewUQdKKv84K+UyVIOy8ReRmoDvQ1yc54D1VSu0KdnwFxDUH+EwpZRORu/DcbQ0I89iKjKvIGGCmUsrlk1ZR1yscEft8VdmCQSl1WRmzyAQa+jxvABzAMwdJDRExeX/1FaWXOS4ROSwiqUqpg94vsiNnyOp64CullMMn74PehzYR+RB4MJJxeatqUErtFpElQBdgFlG+XiJSDZgL/NN7i12U91lfryBCfV6C7ZMpIiagOp6qgXCOrci4EJHL8BS2fZVStqL0EO9peXzRlRiXUuqYz9P/AS/6HNuv2LFLyiGmsOLyMQa41zehAq9XOELFXu7X63yuSloDtBRPjxoLng/BbOVpzVmMp34fYBwQzh1IOGZ78wsn34C6Te+XY1G9/kggaO+FiohLRJKKqmJEpBZwMfB7tK+X9737Ck/d6xfFtpXn9Qr6eTlDvNcBi7zXZzYwRjy9lpoCLYFfyhBLqeISkS7Au8BwpdQRn/Sg72kE40r1eTocz5rw4LlLHuyNLwkYjP+dc4XG5Y2tNZ6G3JU+aRV5vcIxGxjr7Z3UCzjp/fFT/terolrYo/kPuBpPKWoDDgPzven1gHk++10O7MBT4k/0SW+G5z9uGvAFYC2nuJKBH4Gd3r81vendgfd89msC7AcMxY5fBGzC8wU3DUiIVFzARd5zb/D+va0yXC/gZsABrPf517kirlewzwueqqnh3scx3tef5r0ezXyOneg9bjswrJw/7yXFtdD7/6Do+swu6T2NUFzPA1u8518MtPE59k/e65gG3BrJuLzPJwEvFDuuoq/XZ3h61TnwfH/dBtwF3OXdLsBb3rg34dPjsryvlx75rGmapvk5n6uSNE3TtCB0waBpmqb50QWDpmma5kcXDJqmaZofXTBomqZpfnTBoGmapvnRBYOmaZrmRxcMmqZpmp//B9x8PkbaUGrFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 100  # number of points per class\n",
    "D = 2   # dimensionality\n",
    "K = 2   # number of classes\n",
    "\n",
    "X = np.zeros((N*K,D)) # data matrix (each row = single example)\n",
    "y = np.zeros(N*K) # class labels\n",
    "\n",
    "for j in range(K):\n",
    "  ix = range(N*j,N*(j+1))\n",
    "  r = np.linspace(0.0,1,N) # radius\n",
    "  t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.4 # theta\n",
    "  X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]\n",
    "  y[ix] = j\n",
    "\n",
    "# lets visualize the data:\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "h = 0.05\n",
    "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
    "                     np.arange(y_min, y_max, h))\n",
    "\n",
    "X_test = np.c_[xx.ravel(), yy.ravel()]\n",
    "labels=['or','ob']\n",
    "\n",
    "def plot_model(X_test, clf):\n",
    "    Z = clf.predict(X_test)\n",
    "\n",
    "    cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])\n",
    "\n",
    "    \n",
    "    # Plot also the training points\n",
    "    #plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)\n",
    "    for i in [0, 1]:\n",
    "        plt.plot(X[y==i, 0], X[y==i, 1], labels[i])\n",
    "    plt.xlabel('x1')\n",
    "    plt.ylabel('x2')\n",
    "    plt.xlim(xx.min(), xx.max())\n",
    "    plt.ylim(yy.min(), yy.max())\n",
    "    plt.xticks(())\n",
    "    plt.yticks(())\n",
    "    \n",
    "    \n",
    "    # Put the result into a color plot\n",
    "    Z = Z.reshape(xx.shape)\n",
    "    #plt.contourf(xx, yy, Z, alpha=1, cmap=cmap_light)\n",
    "    plt.pcolormesh(xx, yy, Z,cmap=cmap_light)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Kernelized Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#gamma = 0.01\n",
    "#gamma = 0.1\n",
    "#gamma = 1\n",
    "gamma = 10\n",
    "gamma = 1000\n",
    "\n",
    "K      = sklearn.metrics.pairwise.rbf_kernel(X, X, gamma=gamma)\n",
    "K_test = sklearn.metrics.pairwise.rbf_kernel(X_test, X, gamma=gamma)\n",
    "\n",
    "clf = sklearn.linear_model.LogisticRegression(solver='lbfgs')\n",
    "clf.fit(K, y)\n",
    "\n",
    "plot_model(K_test, clf)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM Loss Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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1luJjY3loosuYtasWUDqJZUPHTpE+/btqV27NjExMae8AQFMmDDhlE/Cb7zxBnXq1CE2NpY1a9YAMGrUKPr06QO4xVT69u1Lo0aNqFKlSlJd/sTERO655x5q1qxJhw4daNeuXdJrS5cupXnz5tStW5fLL7+cbdu2pfl9Ll++nAYNGlCrVi06derEnj17ABg+fDg1atSgVq1aST/LOXPmEBcXlzQ72FuC4uqrr2ZM8rU+soq/ZTWzY8t0eeSMOnRItXZtX7WRsmVVt23Lnnsb45G81G0wqiMfOHBAa9eureeff77efffdOnv27KTXhg4dqv3791dV1YULF2q9evWSXqtYsaKuXbtWGzZsqKqqcXFxumrVqpNKIHslL4X88ssv6y233KKqqqtXr9YKFSrokSNHUi2pPGHCBO3Vq1fSdfbu3XvKtW+66SadNGnSSXENHz5cVVXfeust7dmzp6qqjhw5Unv37q2qrtTyddddpwkJCbpq1So977zzVFX1iy++0CuuuEITEhJ027ZtWrx4cf3iiy/0+PHj2rBhQ92xY4eqqo4dO1ZvvfXWU2J54okn9KWXXlJV1djY2KSf5WOPPab9+vVTVdUyZcro0aNHVdVXorlDhw46b968pL8Pb5nozZs3a0xMzCn3sfLImVGoEHz5pSu5ALB1K3Tu7CZoGRMmihQpwtKlSxkxYgTR0dF07dqVUaNGAXD99dczYcIEEhMTGTt27Cmf4M866yxKlCjB2LFjqV69OoX8mME+b948evToAcCFF15IxYoVWbduXaollWNjY5k+fTqDBg3ip59+SrVuz7Zt24j2DsTwuOaaawCoW7cu//zzT6pxXH311URERFCjRg22b9+eFFvnzp2JiIigdOnStGzZEoC1a9fy+++/c9lllxEXF8czzzzD5jRG+O3bt4+9e/fSvHlzAG6++eakZwy1atXixhtvZPTo0UnloBs3bsz999/P8OHD2bt3b9L+UqVKsXXr1nR/phkVngkfXF2dsWNdLX2AefPcGH1jwkhkZCQtWrTgySef5M0330yqhlmhQgUqVarEnDlzmDhxIl26dDnl3K5du9K7d2+/unPg9CWNUyupfMEFF7B06VJiY2MZPHgwTz311CnnFSxYkKNHj560z9s9FRkZmVSBMyXvMcljOl1sqkrNmjVZvnw5y5cv57fffuPHH39M/5tNxZQpU+jduzdLly6lbt26xMfH89BDD/HBBx9w5MgRGjRokNQNdfTo0XTXEsiM8E34AG3awHPP+dpvvgkffxy8eEzYCkZ15LVr1/LHH38ktZcvX07FihWT2t26deO+++7jvPPOo3z58qec36lTJwYOHMjll1/u1/fYrFmzpH7pdevWsXHjRqpVq5ZqSeWtW7dSqFAhunfvzoMPPphqSePq1avz559/+nXv9DRp0oSJEyeSmJjI9u3bmT17NgDVqlVj586dLFy4EIATJ06watWq016nWLFilChRgp9++gmATz/9lObNm5OYmMimTZto2bIlQ4cOZe/evRw8eJC//vqL2NhYBg0aRL169ZIS/rp16wIyuin31tLx18CBrpKmd1HlO++EmBioWze4cRkTYAcPHuTee+9N6kqoWrUqI0aMSHq9c+fO9OvX77TrzEZFRTFo0CC/73fPPfdw1113ERsbS548eRg1ahT58+dn3LhxjB49mrx581K6dGkef/xxFi9ezIABA4iIiCBv3ry88847p1yvffv2vPfee1myoMm1117LjBkziImJ4YILLuCSSy6hWLFi5MuXjwkTJtC3b1/27dtHfHw8/fv3p2bNmqe91scff8xdd93F4cOHqVKlCiNHjiQhIYHu3buzb98+VJX77ruP4sWL89hjjzFr1iwiIyOpUaMGV1xxBQCzZs2iffv2Z/x9pZQ7yyNn1MGD0KABeN+5K1SApUt9E7WMCYCcVh45FDVp0oTJkydTvHjxM77WwYMHKVKkCLt27aJ+/frMnz+f0qVLZ0GUGdesWTO++eYbSnifM3qEdHlkEfkHOAAkAPH+BpXtihRxyyNefLFbB3fTJld+Ydo0yGO/BBkTql555RU2btyYJQm/Q4cO7N27l+PHj/PYY48FLdnv3LmT+++//5RknxWyI5u1VNVTp79lofnzoV49V0Eh084/31XTvPJK1/E5ezYMGgSvvJJVYRpjstgll1ySZdfy9tsHW3R0NFdffXVArp3jH9rOmgWtWkG7drB//xlerH17SD4aYNgwOM2Sa8YYk9MEOuEr8KOILBWRO7L64ps3w9VXu+HzM2e6tU7SmQSXvocfdhf16tULli8/w4sak7pQeoZmQltW/FsJdMJvrKp1gCuA3iJyStELEblDRJaIyJKdO3dm6OLlyrleF68VK6BRI1i79gwijohw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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_loss():\n",
    "    xmin, xmax = -4, 4\n",
    "    xx = np.linspace(xmin, xmax, 100)\n",
    "\n",
    "    plt.figure()\n",
    "    plt.plot(xx, np.log2(1 + np.exp(-xx)), 'r-',linewidth=3)\n",
    "    plt.plot(xx, np.where(xx < 1, 1 - xx, 0), 'b-',linewidth=3)\n",
    "    plt.xlabel(r\"$\\theta^T x$\")\n",
    "    plt.ylabel(\"Loss\")\n",
    "    plt.legend([\"Logistic Loss\", \"SVM loss (hinge loss)\"])\n",
    "    plt.title(r\"cost($\\theta^T x, y)$ for $y = 1$\")\n",
    "    plt.show()\n",
    "    \n",
    "plot_loss()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#gamma = 0.01\n",
    "#gamma = 0.1\n",
    "#gamma = 1\n",
    "gamma = 10\n",
    "\n",
    "C = 10 # C = 2/lambda\n",
    "\n",
    "clf = sklearn.svm.SVC(C=C, kernel='rbf', gamma=gamma)\n",
    "clf.fit(X, y)\n",
    "plot_model(X_test, clf)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM vs Kernelized Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "C = 1000\n",
    "gamma = 100\n",
    "\n",
    "# Fit kernelized logistic regression\n",
    "K      = sklearn.metrics.pairwise.rbf_kernel(X, X, gamma=gamma)\n",
    "K_test = sklearn.metrics.pairwise.rbf_kernel(X_test, X, gamma=gamma)\n",
    "logistic = sklearn.linear_model.LogisticRegression(C=C, solver='lbfgs')\n",
    "logistic.fit(K, y)\n",
    "\n",
    "# Fit SVM with same parameter\n",
    "svm = sklearn.svm.SVC(C=C, kernel='rbf', gamma=gamma)\n",
    "svm.fit(X, y)\n",
    "\n",
    "plt.figure(figsize=(10,4))\n",
    "plt.subplot(121)\n",
    "plot_model(K_test, logistic)\n",
    "\n",
    "plt.subplot(122)\n",
    "plot_model(X_test, svm)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
