{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Importing Libraries and Data\n", "In this cell, we start by importing the necessary libraries. We use Matplotlib for data visualization, NumPy for numerical operations, Pandas for data handling, and scikit-learn for machine learning tools. We then define our data: **X** represents the independent variable, and **Y** represents the dependent variable." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:51:53.380858Z", "start_time": "2023-11-05T18:51:53.374238Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.preprocessing import PolynomialFeatures\n", "\n", "\n", "X = np.array([0, 1, 2, -1, -2]).reshape(-1, 1)\n", "Y = np.array([1, 6, 33, 0, 9])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Polynomial Regression Model Training\n", "In this cell, we calculate the degree of the polynomial regression model, which is one less than the number of data points. We use `PolynomialFeatures` to transform our input data into polynomial features up to the specified degree. Then, we create a linear regression model and train it using the polynomial features." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:51:55.473985Z", "start_time": "2023-11-05T18:51:55.465488Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "LinearRegression()" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "degree = len(X)-1\n", "poly = PolynomialFeatures(degree=degree)\n", "X_poly = poly.fit_transform(X)\n", "\n", "regressor = LinearRegression()\n", "regressor.fit(X_poly, Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualization of Polynomial Regression\n", "This cell is responsible for visualizing the polynomial regression results. It generates a range of `x_values` to create a smooth curve and predicts `y_predicted` values. Then, it uses Matplotlib to plot the original data points in red and the predicted curve in blue, providing a visual representation of the model's performance." ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:52:00.190744Z", "start_time": "2023-11-05T18:52:00.065602Z" }, "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAHFCAYAAAAHcXhbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABg2klEQVR4nO3dd1zU9R8H8NexDlBAUaYggnvvRSrDRHHkyLI0wxy5MkeluXJkouYs04YzzVWucqYpaD81UXGPNMEJDlKWiIzP749Pd3AyBAS+d8fr+Xh8H/e9733u7v29L3BvPlMlhBAgIiIiMlAmSgdARERE9DKYzBAREZFBYzJDREREBo3JDBERERk0JjNERERk0JjMEBERkUFjMkNEREQGjckMERERGTQmM0RERGTQmMyUAKtWrYJKpdJuZmZmcHNzw3vvvYc7d+7k+/V8fX3h6+tb+IEqICQkBCqVCiEhIUX2XE05zWZqagoHBwd06dIFJ06cKFjgBkjzcxgZGVns7+3r66tzDaysrFC/fn0sXLgQ6enpRf7+2f2s9OvXD5UqVcr3ay1ZsgSrVq3KcjwyMhIqlSrbx4pL//790aFDhywxaTZzc3OUK1cOTZs2xejRo3HhwgXFYlXS/v37tZ/Jw4cPdR7r27cvunXrpkxgBozJTAmycuVKHD16FPv27cOgQYOwfv16tG7dGomJiUqHpphGjRrh6NGjaNSoUZG/18yZM3H06FGEhIRg8uTJOHLkCHx8fHD16tUif2990KlTJxw9ehQuLi6KvL+XlxeOHj2Ko0ePYuPGjahQoQJGjx6N8ePHKxLP5MmTsXXr1nw/L6dkxsXFBUePHkWnTp0KIbr8Cw8Px+rVqzFjxowsj40YMQJHjx5FaGgo1qxZg27duuHXX39F/fr18eWXXyoQrXISEhIwaNAguLq6Zvv41KlTsXPnThw4cKCYIzNwgozeypUrBQARFhamc3zy5MkCgFi7dm2+Xs/Hx0f4+PgUYoSG6eDBgwKAOHjwYJ7K/fzzzzrHV69eLQCIzz77rAijzF5iYmKxv6eSfHx8RO3atXWOPXv2THh5eQlra2vx7NmzbJ+Xnp4unjx58tLvn9eflbyoXbu2Xv7+vfnmm6JFixY6xyIiIgQA8eWXX2Yp/+TJE9GhQwcBQOzatau4wtRS6ndg+PDhomHDhmLSpEkCgHjw4EGWMp07dxbt2rVTIDrDxZqZEqxFixYAgBs3bgAAnj59ivHjx8PT0xMWFhaoUKEChg8fjsePH+f4GkIIVK1aFe3bt8/yWEJCAuzs7DB8+HAAGVXt69evx8SJE+Hq6gpbW1u8+uqruHLlSpbnr1ixAvXr14elpSXs7e3RvXt3XLp0SadMv379ULp0aVy+fBnt27dHqVKl4OLiglmzZgEAjh07hlatWqFUqVKoVq0aVq9erfP87Kr/T5w4gbfeeguVKlWClZUVKlWqhLffflv7ORWWJk2aAADu3bunc/zq1avo3bs3HB0doVarUbNmTXzzzTdZnn/hwgUEBATA2toaDg4OGD58OHbu3JnlfHx9fVGnTh0cOnQI3t7esLa2Rv/+/QEAcXFx+Pjjj3Wu+ahRo7LU1v38889o3rw57OzsYG1tDS8vL+1rAEB6ejpmzJiB6tWrw8rKCmXKlEG9evWwaNEibZmcmpnyc52vXbuGjh07onTp0nB3d8dHH32E5OTkvH/omZibm6Nx48Z48uQJHjx4AABQqVT44IMP8O2336JmzZpQq9Xan5m8XpfLly+jQ4cOsLa2Rvny5TFkyBDEx8dnKZddM1N6ejq+/vprNGjQQPs5tmjRAr/++isAoFKlSrhw4QJCQ0O1zRSa18ipmenPP/9E27ZtYWNjA2tra3h7e2Pnzp06ZTTX5uDBgxg6dCjKly+PcuXKoUePHrh79+4LP8t79+5h69at6Nu37wvLalhZWWH58uUwNzfPUjsTHR2NwYMHw83NDRYWFvD09MS0adOQmpqqU+727dvo2bMnbGxsUKZMGfTp0wdhYWFZPgfNz8+5c+cQEBAAGxsbtG3bFgDw7NkzzJgxAzVq1IBarYaDgwPee+897c9EZhs3bkTLli1RqlQplC5dGu3bt0d4eHiez/nw4cP4/vvvsWzZMpiamuZYrm/fvti/fz/++eefPL92ScdkpgS7du0aAMDBwQFCCHTr1g1z585F3759sXPnTowZMwarV6+Gv79/jl8YKpUKI0aMwL59+7I0l/z444+Ii4vTJjMaEyZMwI0bN7Bs2TJ8//33uHr1Krp06YK0tDRtmeDgYAwYMAC1a9fGli1bsGjRIpw9exYtW7bM8j4pKSno0aMHOnXqhO3btyMwMBDjx4/HhAkTEBQUhP79+2Pr1q2oXr06+vXrh5MnT+b6uURGRqJ69epYuHAh9u7di9mzZyMqKgpNmzbN0r79MiIiIgAA1apV0x67ePEimjZtivPnz2PevHnYsWMHOnXqhA8//BDTpk3TlouKioKPjw+uXLmCpUuX4scff0R8fDw++OCDbN8rKioK77zzDnr37o1du3Zh2LBhePLkCXx8fLB69Wp8+OGH2L17N8aNG4dVq1bhtddegxACAHD06FH06tULXl5e2LBhA3bu3InPPvtM54tlzpw5mDp1Kt5++23s3LkTGzduxIABA3JNhIH8X+fXXnsNbdu2xfbt29G/f38sWLAAs2fPztfnntk///wDMzMzlC1bVnts27ZtWLp0KT777DPs3bsXrVu3zvN1uXfvHnx8fHD+/HksWbIEa9asQUJCQo7X5Xn9+vXDyJEj0bRpU2zcuBEbNmzAa6+9pk0At27dCi8vLzRs2FDbZJZbU1VoaCj8/f0RGxuL5cuXY/369bCxsUGXLl2wcePGLOUHDhwIc3NzrFu3DnPmzEFISAjeeeedF8b9+++/IyUlBX5+fnk6Tw1XV1c0btwYR44c0f48RUdHo1mzZti7dy8+++wz7N69GwMGDEBwcDAGDRqkfW5iYiL8/Pxw8OBBzJ49G5s2bYKTkxN69eqV7Xs9e/YMr732Gvz9/bF9+3ZMmzYN6enp6Nq1K2bNmoXevXtj586dmDVrFvbt2wdfX18kJSVpnz9z5ky8/fbbqFWrFjZt2oQ1a9YgPj5e+/PxIklJSRgwYABGjRr1wmZtX19fCCGwa9euvHyMBLCZqSTQNDMdO3ZMpKSkiPj4eLFjxw7h4OAgbGxsRHR0tNizZ48AIObMmaPz3I0bNwoA4vvvv9cee76ZKS4uTtjY2IiRI0fqPLdWrVrCz89Pe19T1d6xY0edcps2bRIAxNGjR4UQQjx69EhYWVllKXfz5k2hVqtF7969tceCgoIEALF582btsZSUFOHg4CAAiFOnTmmPx8TECFNTUzFmzJgsMeVW/Z+amioSEhJEqVKlxKJFi/L13MzlNm7cKFJSUsSTJ0/E//73P1G9enVRq1Yt8ejRI23Z9u3bCzc3NxEbG6vzGh988IGwtLQU//77rxBCiE8++USoVCpx4cIFnXLt27fPEpOPj48AIP744w+dssHBwcLExCRL8+Mvv/yiU/U/d+5cAUA8fvw4x3Ps3LmzaNCgQa6fg+bnMCIiQghRsOu8adMmnbIdO3YU1atXz/V9hchoZkpJSREpKSni7t274tNPPxUAxBtvvKEtB0DY2dlpP2eNvF6XcePGCZVKJU6fPq1Trl27dlmuS1BQkPDw8NDeP3TokAAgJk6cmOu55NTMpGnSWblypfZYixYthKOjo4iPj9ceS01NFXXq1BFubm4iPT1dCJFxbYYNG6bzmnPmzBEARFRUVK4xDR06VFhZWWlf7/mYsmtm0ujVq5cAIO7duyeEEGLw4MGidOnS4saNGzrlND+Hmp/5b775RgAQu3fv1ik3ePDgLJ+D5udnxYoVOmXXr1+f5e+HEEKEhYUJAGLJkiVCCPkzaWZmJkaMGKFTLj4+Xjg7O4s333wzx/PT+Oijj4SXl5e22XLKlCk5NjMJIUSFChVEr169Xvi6JLFmpgRp0aIFzM3NYWNjg86dO8PZ2Rm7d++Gk5OTtrNZv379dJ7zxhtvoFSpUvjjjz9yfF0bGxu89957WLVqlbZ54sCBA7h48WK2/5G+9tprOvfr1asHIKO56+jRo0hKSsoSi7u7O/z9/bPEolKp0LFjR+19MzMzVKlSBS4uLmjYsKH2uL29PRwdHV/YXJSQkIBx48ahSpUqMDMzg5mZGUqXLo3ExMQszR/50atXL5ibm8Pa2hqvvPIK4uLisHPnTpQpUwaAbOb7448/0L17d1hbWyM1NVW7dezYEU+fPsWxY8cAyP+469Spg1q1aum8x9tvv53te5ctWxb+/v46x3bs2IE6deqgQYMGOu/Vvn17naaqpk2bAgDefPNNbNq0KdsRcM2aNcOZM2cwbNgw7N27F3FxcS/8PApynbt06aJzrF69enlu/rtw4QLMzc1hbm4OV1dXzJs3D3369MEPP/ygU87f31+npiY/1+XgwYOoXbs26tevr/OavXv3fmF8u3fvBoAsNZkFlZiYiL/++gs9e/ZE6dKltcdNTU3Rt29f3L59O0vz7ot+N3Ny9+5dODg4QKVS5TtO8V8NoMaOHTvg5+cHV1dXnc86MDAQgPzZ19za2NjojJ4Ccv4dAIDXX389y3uVKVMGXbp00XmvBg0awNnZWfs7sHfvXqSmpuLdd9/VKWdpaQkfH58Xjmg8fvw4Fi5ciO+++w5WVlZ5+Vjg6OhYoNGmJRWTmRLkxx9/RFhYGMLDw3H37l2cPXsWr7zyCgAgJiYGZmZmcHBw0HmOSqWCs7MzYmJicn3tESNGID4+Hj/99BMAYPHixXBzc0PXrl2zlC1XrpzOfbVaDQDaKl3Ne2U36sXV1TVLLNbW1rC0tNQ5ZmFhAXt7+yzPt7CwwNOnT3M9l969e2Px4sUYOHAg9u7di+PHjyMsLAwODg461c75NXv2bISFhSE0NBQTJ07EvXv30K1bN20TXkxMDFJTU/H1119rv3Q1myZZ0zRzxcTEwMnJKct7ZHcMyP6zvHfvHs6ePZvlvWxsbCCE0L5XmzZtsG3bNu0fczc3N9SpUwfr16/Xvtb48eMxd+5cHDt2DIGBgShXrhzatm2b69DzwrjOarX6hddTo3LlyggLC8OJEydw/vx5PH78GGvXroWdnZ1Ouefjye91cXZ2zvLe2R173oMHD2Bqapqnsnnx6NEjCCFy/HwBZPmMX/S7mZOkpKQs1yavbty4AbVarf19vXfvHn777bcsn3Xt2rUBFPx3wNraGra2tjrH7t27h8ePH8PCwiLL+0VHR2vfS9OvrWnTplnKbdy48YXNz/3790ePHj3QpEkTPH78GI8fP9b+3MbFxWXbp8rS0vKl/t6UNGZKB0DFp2bNmtpOp88rV64cUlNT8eDBA52ERgiB6Oho7X/nOalSpQoCAwPxzTffIDAwEL/++iumTZuWaye3nGj+oEZFRWV57O7duyhfvny+XzOvYmNjsWPHDkyZMgWffvqp9nhycjL+/fffl3ptLy8v7effpk0bWFlZYdKkSfj666/x8ccfo2zZstr/mnP679zT0xOA/Iye7zgMyP4G2cnuP+by5cvDysoKK1asyPY5mT/nrl27omvXrkhOTsaxY8cQHByM3r17o1KlSmjZsiXMzMwwZswYjBkzBo8fP8b+/fsxYcIEtG/fHrdu3YK1tXWW1y/u62xpaZnjz39mz39W+b0u2V2DnK5LZg4ODkhLS0N0dHShDF8vW7YsTExMcvx8ARTaZ1y+fHmcOnUq38+7c+cOTp48CR8fH5iZmWlfq169evjiiy+yfY4mEStXrhyOHz+e5fH8/g6UK1cOe/bsyfY5NjY22nIA8Msvv8DDw+MFZ5XVhQsXcOHCBfz8889ZHqtcuTLq16+P06dP6xz/999/CzQPUUnFZIYAAG3btsWcOXOwdu1ajB49Wnt88+bNSExM1Pb8z83IkSMREBCAoKAgmJqa6nTWy4+WLVvCysoKa9euxRtvvKE9fvv2bRw4cAA9e/Ys0OvmhUqlghBC+x+pxrJly3Q6KBeGsWPHYtWqVZg1axYGDx4MGxsb+Pn5ITw8HPXq1YOFhUWOz/Xx8cHcuXNx8eJFnaamDRs25Pn9O3fujJkzZ6JcuXLaL+MXUavV8PHxQZkyZbB3716Eh4ejZcuWOmXKlCmDnj174s6dOxg1ahQiIyOzNIcByl7n/LC2ts7zdfHz88OcOXNw5swZnaamdevWvfB9AgMDERwcjKVLl2L69Ok5llOr1Xn6j71UqVJo3rw5tmzZgrlz52qbN9LT07F27Vq4ubnpdD5/GTVq1MD69esRGxubpaYrJ0lJSRg4cCBSU1MxduxY7fHOnTtj165dqFy5sk5z3/N8fHywadMm7N69W9sEBeT/d2DDhg1IS0tD8+bNcyzXvn17mJmZ4Z9//snSVJUXBw8ezHJs1apVWL16NbZt24YKFSroPJaamopbt27pNJ9T7pjMEACgXbt2aN++PcaNG4e4uDi88sorOHv2LKZMmYKGDRvmachlu3btUKtWLRw8eBDvvPMOHB0dCxRLmTJlMHnyZEyYMAHvvvsu3n77bcTExGDatGmwtLTElClTCvS6eWFra4s2bdrgyy+/RPny5VGpUiWEhoZi+fLl2r4thcXc3BwzZ87Em2++iUWLFmHSpElYtGgRWrVqhdatW2Po0KGoVKkS4uPjce3aNfz222/avk2jRo3CihUrEBgYiOnTp8PJyQnr1q3D5cuXAQAmJi9uQR41ahQ2b96MNm3aYPTo0ahXrx7S09Nx8+ZN/P777/joo4/QvHlzfPbZZ7h9+zbatm0LNzc3PH78GIsWLYK5uTl8fHwAAF26dEGdOnXQpEkTODg44MaNG1i4cCE8PDxQtWrVbN9fyeucX/m9Lp06dcKMGTPg5OSEn376SXtdctO6dWv07dsXM2bMwL1799C5c2eo1WqEh4fD2toaI0aMAADUrVsXGzZswMaNG+Hl5QVLS0vUrVs329cMDg5Gu3bt4Ofnh48//hgWFhZYsmQJzp8/j/Xr1xeoj0t2NKNv/vrrLwQEBGR5/ObNmzh27BjS09MRGxuL8PBwrFixAjdu3MC8efN0njN9+nTs27cP3t7e+PDDD1G9enU8ffoUkZGR2LVrF7799lu4ubkhKCgICxYswDvvvIMZM2agSpUq2L17N/bu3Qsgb78Db731Fn766Sd07NgRI0eORLNmzWBubo7bt2/j4MGD6Nq1K7p3745KlSph+vTpmDhxIq5fv44OHTqgbNmyuHfvHo4fP45SpUrpjGrL7vN5nqafzSuvvJKlhuzs2bN48uRJvkeHlWhK9j6m4pHTpHnPS0pKEuPGjRMeHh7C3NxcuLi4iKFDh+qMthEi90nzpk6dqh059bycJo/LbhSGEEIsW7ZM1KtXT1hYWAg7OzvRtWvXLKN3goKCRKlSpbK8V3aTpAkhhIeHh+jUqVOWmDKPMrl9+7Z4/fXXRdmyZYWNjY3o0KGDOH/+vPDw8BBBQUG5Pjc7OZ23RvPmzUXZsmW1o4UiIiJE//79RYUKFYS5ublwcHAQ3t7eYsaMGTrPO3/+vHj11VeFpaWlsLe3FwMGDNBOxHfmzJkXfhZCCJGQkCAmTZokqlevrv2c69atK0aPHi2io6OFEELs2LFDBAYGigoVKggLCwvh6OgoOnbsKA4fPqx9nXnz5glvb29Rvnx5YWFhISpWrCgGDBggIiMjtWWeH82k8TLXWTMi5EVy+wwyAyCGDx+e7WN5vS4XL14U7dq107ku27dvf+FoJiGESEtLEwsWLBB16tTRfh4tW7YUv/32m7ZMZGSkCAgIEDY2NgKA9jVy+j06fPiw8Pf3F6VKlRJWVlaiRYsWOq8nRM5/I/L6M56WliYqVaqUZTSUJibNZmpqKsqWLSsaN24sRo0aleU6azx48EB8+OGHwtPTU5ibmwt7e3vRuHFjMXHiRJGQkKAtd/PmTdGjRw9RunRpYWNjI15//XWxa9cuAUBs375dWy6nnx8h5OjHuXPnivr16wtLS0tRunRpUaNGDTF48GBx9epVnbLbtm0Tfn5+wtbWVqjVauHh4SF69uwp9u/fn+vnk53cRjNNnjxZlC9fXjx9+jTfr1tSqYR4ris50Uto0qQJVCoVwsLClA6lRHr//fexfv16xMTE5NocQlTY5s2bhy+++AJ37tzJ84idojBz5kxMmjQJN2/ehJubm2JxFFRaWhqqVKmC3r1759hviLJiMxO9tLi4OJw/fx47duzAyZMnC7TeDOXf9OnT4erqCi8vLyQkJGDHjh1YtmwZJk2axESGit3w4cOxePFifPPNN/j444+L5T0XL14MQPbZSUlJwYEDB/DVV1/hnXfeMchEBgDWrl2LhIQEfPLJJ0qHYlCYzNBLO3XqFPz8/FCuXDlMmTKFK74WE8008Ldv30ZqaiqqVq2K+fPnY+TIkUqHRiWQpaUl1qxZk6/p/V+WtbU1FixYgMjISCQnJ6NixYoYN24cJk2aVGwxFLb09HT89NNPhd5Hz9ixmYmIiIgMGifNIyIiIoPGZIaIiIgMGpMZIiIiMmhG3wE4PT0dd+/ehY2NTaFNEEVERERFSwiB+Ph4uLq6vnASRKNPZu7evQt3d3elwyAiIqICuHXr1guH2ht9MqNZKOzWrVtZVkwlIiIi/RQXFwd3d3ft93hujD6Z0TQt2draMpkhIiIyMHnpIsIOwERERGTQmMwQERGRQWMyQ0RERAbN6PvM5FVaWhpSUlKUDoMKyMLC4oVD94iIyDiV+GRGCIHo6Gg8fvxY6VDoJZiYmMDT05OrRRMRlUAlPpnRJDKOjo6wtrbmxHoGSDMxYlRUFCpWrMhrSERUwpToZCYtLU2byJQrV07pcOglODg44O7du0hNTYW5ubnS4RARUTEq0Z0MNH1krK2tFY6EXpameSktLU3hSIiIqLiV6GRGg80Sho/XkIio5CrRzUxERERUQGlpwOHDQFQU4OICtG4NmJoqEgqTGSIiIsqfLVuAkSOB27czjrm5AYsWAT16FHs4bGYyUP369YNKpYJKpYK5uTmcnJzQrl07rFixAunp6Xl+nVWrVqFMmTJFFygRERmXLVuAnj11ExkAuHNHHt+ypdhDYjJTGNLSgJAQYP16eVtMnVA7dOiAqKgoREZGYvfu3fDz88PIkSPRuXNnpKamFksMRERUgqSlyRoZIQAAd+GCq6gCAWiPYdSoYvse1GAy87K2bAEqVQL8/IDeveVtpUrFkpmq1Wo4OzujQoUKaNSoESZMmIDt27dj9+7dWLVqFQBg/vz5qFu3LkqVKgV3d3cMGzYMCQkJAICQkBC89957iI2N1dbyTJ06FQCwdu1aNGnSBDY2NnB2dkbv3r1x//79Ij8nIiLSY4cP69TILMNAVMNVvI/v5QEhgFu3ZLlixGTmZehhVZu/vz/q16+PLf+9t4mJCb766iucP38eq1evxoEDBzB27FgAgLe3NxYuXAhbW1tERUUhKioKH3/8MQDg2bNn+Pzzz3HmzBls27YNERER6NevX7GfDxER6ZGoKJ27R+ANAGiA07mWK2rsAFxQz1W16RACUKlkVVvXrsXeu7tGjRo4e/YsAGDUqFHa456envj8888xdOhQLFmyBBYWFrCzs4NKpYKzs7POa/Tv31+77+Xlha+++grNmjVDQkICSpcuXSznQUREesbFRbubDhWOoiUAwBtHcixXHFgzU1DPVbVloVBVm3xroZ135eDBg2jXrh0qVKgAGxsbvPvuu4iJiUFiYmKurxEeHo6uXbvCw8MDNjY28PX1BQDcvHmzqMMnIiJ91bq1HLWkUuEiaiEOdiiFBNTFOfm4SgW4u8tyxYjJTEHltQqtmKvaAODSpUvw9PTEjRs30LFjR9SpUwebN2/GyZMn8c033wBAriuEJyYmIiAgAKVLl8batWsRFhaGrVu3ApDNT0REVEKZmsrh1wD+h1YAgBY4BjOkyUQGABYuLPYWCTYzFVReq9CKuartwIEDOHfuHEaPHo0TJ04gNTUV8+bNg4mJzFs3bdqkU97CwiLLEgCXL1/Gw4cPMWvWLLi7uwMATpw4UTwnQERE+q1HD+CXX3CkbxrwJFMTk5ubTGQ4z4wByVTVlq1iqGpLTk5GdHQ07ty5g1OnTmHmzJno2rUrOnfujHfffReVK1dGamoqvv76a1y/fh1r1qzBt99+q/MalSpVQkJCAv744w88fPgQT548QcWKFWFhYaF93q+//orPP/+8yM6DiIgMTI8eOOLaEwDgPa4NcPAgEBGhSCIDMJkpuExVbVkSmmKqatuzZw9cXFxQqVIldOjQAQcPHsRXX32F7du3w9TUFA0aNMD8+fMxe/Zs1KlTBz/99BOCg4N1XsPb2xtDhgxBr1694ODggDlz5sDBwQGrVq3Czz//jFq1amHWrFmYO3dukZ0HEREZlvv3gWvXVFCpgBaf+gK+vootZQAAKiGyG45jPOLi4mBnZ4fY2FjY2trqPPb06VNERETA09MTlpaWBXuD7KZ0dndXrKqtpCqUa0lERHmybRvQvTtQpw5w7lzRvEdu39/PY5+Zl9Wjhxx+rSeLbRERERW1I/91k/H2VjYODSYzhcHUVFaxERERlQD6lsywzwwRERHlWXIyoBng+sorysaiwWSGiIiI8uzUKZnQODgAlSsrHY3EZIaIiIjyLHMTU06zkxQ3JjNERESUZ/rWXwZgMkNERER5JATwv//JfX3pLwMwmSEiIqI8iogA7t0DzM2Bxo2VjiYDkxkiIiLKE00TU+PGgD7NT8pkhnI1depUNGjQQHu/X79+6NatW7HHERkZCZVKhdOnTxf7exMRkaSP/WUAJjMGq1+/flCpVFCpVDA3N4eXlxc+/vhjJCYmFun7Llq0CKtWrcpTWSYgRETGRR/7ywCcAdigdejQAStXrkRKSgoOHz6MgQMHIjExEUuXLtUpl5KSAnNz80J5Tzs7u0J5HSIiMixxcRnrMLVsqWwsz2PNjAFTq9VwdnaGu7s7evfujT59+mDbtm3apqEVK1bAy8sLarUaQgjExsbi/fffh6OjI2xtbeHv748zZ87ovOasWbPg5OQEGxsbDBgwAE+fPtV5/PlmpvT0dMyePRtVqlSBWq1GxYoV8cUXXwAAPD09AQANGzaESqWCb6YlH1auXImaNWvC0tISNWrUwJIlS3Te5/jx42jYsCEsLS3RpEkThIeHF+InR0RE+XXkiBzN5OUllyHUJ6yZeY4QwJMnxf++1tYvP/mQlZUVUlJSAADXrl3Dpk2bsHnzZpj+t+hlp06dYG9vj127dsHOzg7fffcd2rZti7///hv29vbYtGkTpkyZgm+++QatW7fGmjVr8NVXX8HLyyvH9xw/fjx++OEHLFiwAK1atUJUVBQuX74MQCYkzZo1w/79+1G7dm1YWFgAAH744QdMmTIFixcvRsOGDREeHo5BgwahVKlSCAoKQmJiIjp37gx/f3+sXbsWERERGDly5Mt9OERE9FIOH5a3rVsrG0e2hJGLjY0VAERsbGyWx5KSksTFixdFUlKS9lhCghAypSneLSEhf+cVFBQkunbtqr3/119/iXLlyok333xTTJkyRZibm4v79+9rH//jjz+Era2tePr0qc7rVK5cWXz33XdCCCFatmwphgwZovN48+bNRf369bN937i4OKFWq8UPP/yQbYwRERECgAgPD9c57u7uLtatW6dz7PPPPxctW7YUQgjx3XffCXt7e5GYmKh9fOnSpdm+lkZ215KIiApP69by+2r58uJ5v9y+v5/HZiYDtmPHDpQuXRqWlpZo2bIl2rRpg6+//hoA4OHhAQcHB23ZkydPIiEhAeXKlUPp0qW1W0REBP755x8AwKVLl9DyuYbQ5+9ndunSJSQnJ6Nt27Z5jvnBgwe4desWBgwYoBPHjBkzdOKoX78+rK2t8xQHEREVradPgePH5b4+1sywmek51tZAQoIy75tffn5+WLp0KczNzeHq6qrTybdUqVI6ZdPT0+Hi4oKQkJAsr1OmTJn8vzlks1Z+paenA5BNTc2bN9d5TNMcJoQoUDxERFQ0wsLk4pJOTkCVKkpHkxWTmeeoVMBzeYDeKlWqFKrk8aeqUaNGiI6OhpmZGSpVqpRtmZo1a+LYsWN49913tceOHTuW42tWrVoVVlZW+OOPPzBw4MAsj2v6yKSlpWmPOTk5oUKFCrh+/Tr69OmT7evWqlULa9asQVJSkjZhyi0OIiIqWpn7y+jL4pKZKdrMtHTpUtSrVw+2trawtbVFy5YtsXv3bu3jQghMnToVrq6usLKygq+vLy5cuKBgxIbr1VdfRcuWLdGtWzfs3bsXkZGROHLkCCZNmoQTJ04AAEaOHIkVK1ZgxYoV+PvvvzFlypRcP29LS0uMGzcOY8eOxY8//oh//vkHx44dw/LlywEAjo6OsLKywp49e3Dv3j3ExsYCkBPxBQcHY9GiRfj7779x7tw5rFy5EvPnzwcA9O7dGyYmJhgwYAAuXryIXbt2Ye7cuUX8CRERUU40yUybNsrGkRNFkxk3NzfMmjULJ06cwIkTJ+Dv74+uXbtqv0DnzJmD+fPnY/HixQgLC4OzszPatWuH+Ph4JcM2SCqVCrt27UKbNm3Qv39/VKtWDW+99RYiIyPh5OQEAOjVqxc+++wzjBs3Do0bN8aNGzcwdOjQXF938uTJ+Oijj/DZZ5+hZs2a6NWrF+7fvw8AMDMzw1dffYXvvvsOrq6u6Nq1KwBg4MCBWLZsGVatWoW6devCx8cHq1at0g7lLl26NH777TdcvHgRDRs2xMSJEzF79uwi/HSIiCgnaWkZk+XpY38ZAFAJPeugYG9vjy+//BL9+/eHq6srRo0ahXHjxgEAkpOT4eTkhNmzZ2Pw4MF5er24uDjY2dkhNjYWtra2Oo89ffoUERER8PT0hKU+LTJB+cZrSURUNE6dkmsx2doC//4L/Ne9scjl9v39PL0ZzZSWloYNGzYgMTERLVu2REREBKKjoxEQEKAto1ar4ePjgyOaxSGykZycjLi4OJ2NiIiICkbTxNSqVfElMvmleDJz7tw5lC5dGmq1GkOGDMHWrVtRq1YtREdHA4C2CUTDyclJ+1h2goODYWdnp93c3d2LNH4iIiJjpteT5f1H8WSmevXqOH36NI4dO4ahQ4ciKCgIFy9e1D6ueq7btBAiy7HMxo8fj9jYWO1269atIoudiIjImAkBHDok9/U5mVF8aLaFhYV2eHGTJk0QFhaGRYsWafvJREdHwyXTIhD379/PUluTmVqthlqtLtqgiYiISoC//wYePAAsLYEmTZSOJmeK18w8TwiB5ORkeHp6wtnZGfv27dM+9uzZM4SGhsLb27vQ35MMG68hEVHh0zQxNW8O6HM9gaI1MxMmTEBgYCDc3d0RHx+PDRs2ICQkBHv27IFKpcKoUaMwc+ZMVK1aFVWrVsXMmTNhbW2N3r17F8r7a2bMffLkSYFmsyX98ezZMwAZswgTEdHLM4T+MoDCycy9e/fQt29fREVFwc7ODvXq1cOePXvQrl07AMDYsWORlJSEYcOG4dGjR2jevDl+//132NjYFMr7m5qaokyZMtp5UaytrXPtj0P6KT09HQ8ePIC1tTXMzBRvOSUiMhqG0F8G0MN5Zgrbi8apCyEQHR2Nx48fF39wVGhMTEzg6empXUKBiIhezu3bgLu7HI796BFQSPUIeZafeWZK/L+xKpUKLi4ucHR0REpKitLhUAFZWFjAxETvuoARERksTRNTw4bFn8jkV4lPZjRMTU3Z34KIiOg/htJfBtDD0UxERESkvJAQeauvi0tmxmSGiIiIdERHA5cuASoV4OOjdDQvxmSGiIiIdISGytsGDYCyZRUNJU+YzBAREZGOgwflra+vomHkGZMZIiIi0qFJZvz8lI0jr5jMEBERkdbdu3JNJhMTwxjJBDCZISIiokw0o5gaNgTKlFEykrxjMkNERERammTGUPrLAExmiIiIKBND6y8DMJkhIiKi/9y+DVy7JvvLtGqldDR5x2SGiIiIAGQ0MTVqBNjZKRpKvjCZISIiIgCG2cQEMJkhIiKi/xhi51+AyQwREREBuHkTuH4dMDU1rP4yAJMZIiIiQkatTOPGgK2toqHkG5MZIiIiMtj+MgCTGSIiIoLhLS6ZGZMZIiKiEi4yErhxwzD7ywBMZoiIiEq8P/6Qt82aAaVLKxtLQTCZISIiKuH275e3r76qbBwFxWSGiIioBEtPz6iZYTJDREREBufcOeDBA8DaGmjRQuloCobJDBERUQmmaWLy8QEsLJSNpaCYzBAREZVght5fBmAyQ0REVGIlJwOHDsl9JjNERERkcI4dA548ARwdgTp1lI6m4JjMEBERlVCaJqa2bQETA84IDDh0IiIiehmaZKZdO2XjeFlMZoiIiEqg2Fjg+HG537atsrG8LCYzREREJVBIiJwwr1o1oGJFpaN5OUxmiIiISiBjGJKtwWSGiIioBGIyQ0RERAbr9m3g8mU5gsnXV+loXh6TGSIiohJGs7BkkyZA2bLKxlIYmMwQERGVMMbUxAQwmSEiIipR0tOBffvkPpMZIiIiMjhnzgD37gGlSgGvvKJ0NIWDyQwREVEJsmePvPX3BywslI2lsCiazAQHB6Np06awsbGBo6MjunXrhitXruiU6devH1Qqlc7WokULhSImIiIybHv3ytsOHZSNozApmsyEhoZi+PDhOHbsGPbt24fU1FQEBAQgMTFRp1yHDh0QFRWl3Xbt2qVQxERERIYrLg743//kvjElM2ZKvvkeTV3Xf1auXAlHR0ecPHkSbdq00R5Xq9VwdnYu7vCIiIiMyoEDQGoqUKUK4OWldDSFR6/6zMTGxgIA7O3tdY6HhITA0dER1apVw6BBg3D//v0cXyM5ORlxcXE6GxEREWX0lzGmWhlAj5IZIQTGjBmDVq1aoU6dOtrjgYGB+Omnn3DgwAHMmzcPYWFh8Pf3R3JycravExwcDDs7O+3m7u5eXKdARESkt4Qwzv4yAKASQgilgwCA4cOHY+fOnfjzzz/h5uaWY7moqCh4eHhgw4YN6NGjR5bHk5OTdRKduLg4uLu7IzY2Fra2tkUSOxERkb67cgWoUUOOYPr3Xzk0W5/FxcXBzs4uT9/fivaZ0RgxYgR+/fVXHDp0KNdEBgBcXFzg4eGBq1evZvu4Wq2GWq0uijCJiIgMlqaJqXVr/U9k8kvRZEYIgREjRmDr1q0ICQmBp6fnC58TExODW7duwcXFpRgiJCIiMg7G2sQEKNxnZvjw4Vi7di3WrVsHGxsbREdHIzo6GklJSQCAhIQEfPzxxzh69CgiIyMREhKCLl26oHz58ujevbuSoRMRERmMpCQgJETuG2Myo2jNzNKlSwEAvs+tP75y5Ur069cPpqamOHfuHH788Uc8fvwYLi4u8PPzw8aNG2FjY6NAxERERIbn8GGZ0FSoANSurXQ0hU/xZqbcWFlZYa+mXoyIiIgKRNNfpn17QKVSNpaioDdDs4mIiKhoGHN/GYDJDBERkVG7eRO4eBEwMQFefVXpaIoGkxkiIiIjpmliatYMKFtW2ViKCpMZIiIiI7Zjh7zt3FnZOIoSkxkiIiIjlZQE7N8v95nMEBERkcEJCZEJjZsbUK+e0tEUHSYzRERERkrTxNSpk3EOydZgMkNERGSEhCgZ/WUAJjNERERG6fx5OSzb0hLw91c6mqLFZIaIiMgI7dwpb/39AWtrZWMpakxmiIiIjFBJaWICmMwQEREZnZgY4OhRud+pk7KxFAcmM0REREZmzx4gPR2oWxeoWFHpaIoekxkiIiIjU5KamAAmM0REREYlJSVjPSYmM0RERGRwjhwBHj8GypUDmjdXOpriwWSGiIjIiGiGZAcGAqamysZSXJjMEBERGZHffpO3JaWJCWAyQ0REZDSuXAEuXwbMzID27ZWOpvgwmSEiIjIS27fLWz8/oEwZRUMpVkxmiIiIjMS2bfK2Wzcloyh+TGaIiIiMQHQ0cOyY3H/tNWVjKW5MZoiIiIzAb78BQgBNmwJubkpHU7yYzBARERmBktrEBDCZISIiMnjx8cD+/XKfyQwREREZnD17gGfPgKpVgZo1lY6m+DGZISIiMnCaJqbu3QGVStFQFMFkhoiIyIA9e5axhEFJbGICmMwQEREZtNBQIDYWcHIqOQtLPo/JDBERkQHTNDF17QqYlNBv9RJ62kRERIYvPT1jCYOS2sQEMJkhIiIyWCdPAnfuAKVLA/7+SkejHCYzREREBmrLFnkbGAio1crGoiQmM0RERAZICOCXX+R+z57KxqI0JjNEREQG6MwZ4No1wNIS6NhR6WiUxWSGiIjIAP38s7zt2FH2mSnJmMwQEREZGCEykpk33lA2Fn3AZIaIiMjAnDsHXL0qO/126qR0NMpjMkNERGRgNB1/AwMBGxtlY9EHTGaIiIgMSOYmppI+iklD0WQmODgYTZs2hY2NDRwdHdGtWzdcuXJFp4wQAlOnToWrqyusrKzg6+uLCxcuKBQxERGRsi5cAC5fBiwsgC5dlI5GPyiazISGhmL48OE4duwY9u3bh9TUVAQEBCAxMVFbZs6cOZg/fz4WL16MsLAwODs7o127doiPj1cwciIiImVompjatwdsbZWNRV+ohBBC6SA0Hjx4AEdHR4SGhqJNmzYQQsDV1RWjRo3CuHHjAADJyclwcnLC7NmzMXjw4Be+ZlxcHOzs7BAbGwtbXnUiIjJwtWsDFy8CP/4I9O2rdDRFJz/f33rVZyY2NhYAYG9vDwCIiIhAdHQ0AgICtGXUajV8fHxw5MiRbF8jOTkZcXFxOhsREZExuHhRbubmbGLKTG+SGSEExowZg1atWqFOnToAgOjoaACAk5OTTlknJyftY88LDg6GnZ2ddnN3dy/awImIiIqJpokpIAAoU0bRUPSK3iQzH3zwAc6ePYv169dneUylUuncF0JkOaYxfvx4xMbGardbt24VSbxERETFjaOYsmemdAAAMGLECPz66684dOgQ3NzctMednZ0ByBoaFxcX7fH79+9nqa3RUKvVUJfkpUOJiMgoXbgAnD8vm5i6dlU6Gv2iaM2MEAIffPABtmzZggMHDsDT01PncU9PTzg7O2Pfvn3aY8+ePUNoaCi8vb2LO1wiIiLFaBouOnQAypZVNhZ9o2jNzPDhw7Fu3Tps374dNjY22n4wdnZ2sLKygkqlwqhRozBz5kxUrVoVVatWxcyZM2FtbY3evXsrGToREVGxESIjmeHXX1aKJjNLly4FAPj6+uocX7lyJfr16wcAGDt2LJKSkjBs2DA8evQIzZs3x++//w4bzt9MREQlxPHjwPXrgLU1RzFlR9FkJi9T3KhUKkydOhVTp04t+oCIiIj0kKZWpls3oFQpRUPRS3ozmomIiIiySksDNm6U+2+/rWws+orJDBERkR4LCQGiowF7ezm/DGXFZIaIiEiPrVsnb3v2lItLUlZMZoiIiPRUcjKwebPc5yimnDGZISIi0lO7dwOxsUCFCkDr1kpHo7+YzBAREekpzSimXr0AE35j54gfDRERkR6Kjwd++03us4kpd0xmiIiI9ND27UBSElC1KtCokdLR6DcmM0RERHpozRp527s3oFIpG4u+YzJDRESkZ+7cAfbvl/t9+yobiyFgMkNERKRn1q4F0tOBVq2AypWVjkb/MZkhIiLSI0IAq1fL/aAgZWMxFExmiIiI9MjJk8ClS4ClJfDGG0pHYxiYzBAREekRTa1Mt26AnZ2ioRgMJjNERER64tmzjIny2MSUd0xmiIiI9MTOnUBMDODiArRrp3Q0hoPJDBERkZ7QNDG98w5gaqpsLIaEyQwREZEeePBA1swAbGLKLyYzREREemD9eiA1FWjcGKhdW+loDAuTGSIiIj2gaWJ6911l4zBETGaIiIgUdu4ccOoUYGYGvP220tEYHiYzRERECvvhB3nbtSvg4KBsLIaIyQwREZGCkpIyVsgeOFDZWAwVkxkiIiIFbdkCPH4MVKzIuWUKKs/JzO3bt4syDiIiohJp2TJ5278/55YpqDwnM3Xq1MEaTT0YERERvbSrV4GQEEClkskMFUyek5mZM2di+PDheP311xETE1OUMREREZUIy5fL2w4dAHd3ZWMxZHlOZoYNG4YzZ87g0aNHqF27Nn799deijIuIiMiopaQAq1bJ/UGDFA3F4Jnlp7CnpycOHDiAxYsX4/XXX0fNmjVhZqb7EqdOnSrUAImIiIzRjh3AvXuAkxPQubPS0Ri2fCUzAHDjxg1s3rwZ9vb26Nq1a5ZkhoiIiF5MM7dMv36AubmioRi8fGUiP/zwAz766CO8+uqrOH/+PBw4sw8REVG+3boF7Nkj9wcMUDYWY5DnZKZDhw44fvw4Fi9ejHe5cAQREVGBrVgBCAH4+gJVqyodjeHLczKTlpaGs2fPws3NrSjjISIiMmqpqRlNTJzxt3DkOZnZt29fUcZBRERUImzfDty5I9dg6tlT6WiMA5czICIiKkZLlsjbgQMBtVrZWIwFkxkiIqJicukScOAAYGICDBmidDTGg8kMERFRMdHUynTpIheWpMLBZIaIiKgYJCQAq1fL/WHDlI3F2DCZISIiKgZr1wLx8XIo9quvKh2NcWEyQ0REVMSEyGhiGjZM9pmhwqPox3no0CF06dIFrq6uUKlU2LZtm87j/fr1g0ql0tlatGihTLBEREQF9OefwLlzgJUVEBSkdDTGR9FkJjExEfXr18fixYtzLNOhQwdERUVpt127dhVjhERERC/vm2/kbZ8+QNmyysZijBRdJTIwMBCBgYG5llGr1XB2di6miIiIiApXVBSwebPcHz5c2ViMld632oWEhMDR0RHVqlXDoEGDcP/+/VzLJycnIy4uTmcjIiJSypIlcgkDb2+gQQOlozFOep3MBAYG4qeffsKBAwcwb948hIWFwd/fH8nJyTk+Jzg4GHZ2dtrN3d29GCMmIiLKkJQEfPut3B89WtlYjJlKCCGUDgIAVCoVtm7dim7duuVYJioqCh4eHtiwYQN69OiRbZnk5GSdZCcuLg7u7u6IjY2Fra1tYYdNRESUox9+AN5/H6hUCbh6FTBTtHOHYYmLi4OdnV2evr8N6mN1cXGBh4cHrl69mmMZtVoNNRe7ICIihQkBLFgg9z/8kIlMUdLrZqbnxcTE4NatW3BxcVE6FCIiolzt3SvXYrKxAQYMUDoa46ZonpiQkIBr165p70dEROD06dOwt7eHvb09pk6ditdffx0uLi6IjIzEhAkTUL58eXTv3l3BqImIiF5s/nx5O3AgwF4ORUvRZObEiRPw8/PT3h8zZgwAICgoCEuXLsW5c+fw448/4vHjx3BxcYGfnx82btwIGxsbpUImIiJ6ofPngX375Ey/H36odDTGT9FkxtfXF7n1P967d28xRkNERFQ4Fi6Utz16yM6/VLQMqs8MERGRvrt/Xy4qCXA4dnFhMkNERFSIli4FkpOBZs2Ali2VjqZkYDJDRERUSJ48ATTLDY4eDahUysZTUjCZISIiKiTLlwMPHwJeXkDPnkpHU3IwmSEiIioEKSnA3Lly/5NPOElecWIyQ0REVAjWrwdu3gScnIB+/ZSOpmRhMkNERPSS0tOB2bPl/ujRgKWlsvGUNExmiIiIXtJvvwEXL8qZfocMUTqakofJDBER0UsQAggOlvvDhgF2dsrGUxIxmSEiInoJoaHAX38BajUwapTS0ZRMTGaIiIhewqxZ8rZ/f9n5l4ofkxkiIqICOnUK2LsXMDWVw7FJGUxmiIiICmj6dHn71luAp6eysZRkTGaIiIgK4NQpYPt2wMQEmDRJ6WhKNiYzREREBTBtmrx9+22gRg1lYynpmMwQERHl06lTwK+/slZGXzCZISIiyifWyugXJjNERET5cPJkRq3M5MlKR0MAkxkiIqJ80dTK9O4NVK+ubCwkMZkhIiLKo5Mn5TpMrJXRL0xmiIiI8mjqVHnbpw9QrZqioVAmTGaIiIjy4H//A3bskLP9cgSTfmEyQ0RE9AJCAJ9+Kvf792etjL5hMkNERPQCO3cCf/4JWFoCU6YoHQ09j8kMERFRLtLSgPHj5f6HHwIVKigbD2XFZIaIiCgX69YB588DZcpkNDWRfmEyQ0RElIPk5Iwh2J9+CpQtq2w8lD0mM0RERDn49lvgxg3A1RUYMULpaCgnTGaIiIiyER8PzJgh96dMAaytlY2HcsZkhoiIKBtz5gAPH8ph2P37Kx0N5YbJDBER0XNu3ADmzpX7s2YBZmbKxkO5YzJDRET0nE8/BZ4+BXx9gW7dlI6GXoTJDBERUSZHjgAbNgAqFbBggbwl/cZkhoiI6D/p6cDo0XK/f3+gQQNFw6E8YjJDRET0n3XrgOPHgdKlM0Yykf5jMkNERAQgMTFjht+JEwFnZ2XjobxjMkNERAQ5eunOHaBSJWDUKKWjofxgMkNERCVeZCQwe7bcnzNHro5NhoPJDBERlXgjRwJJSYCPD9Czp9LRUH4pmswcOnQIXbp0gaurK1QqFbZt26bzuBACU6dOhaurK6ysrODr64sLFy4oEywRERml334Dfv1VToy3ZAmHYhsiRZOZxMRE1K9fH4sXL8728Tlz5mD+/PlYvHgxwsLC4OzsjHbt2iE+Pr6YIyUiImP05Anw4Ydy/6OPgFq1lI2HCkbRCZoDAwMRGBiY7WNCCCxcuBATJ05Ejx49AACrV6+Gk5MT1q1bh8GDBxdnqEREZIRmzpT9ZdzdgcmTlY6GCkpv+8xEREQgOjoaAQEB2mNqtRo+Pj44cuSIgpEREZExuHIF+PJLub9oEVCqlLLxUMHp7dJZ0dHRAAAnJyed405OTrhx40aOz0tOTkZycrL2flxcXNEESEREBksI4IMPgGfPgI4duf6SodPbmhkN1XM9sYQQWY5lFhwcDDs7O+3m7u5e1CESEZGB2bgR2L8fUKuBr75ip19Dp7fJjPN/Uy9qamg07t+/n6W2JrPx48cjNjZWu926datI4yQiIsMSE5PR6XfCBKByZWXjoZent8mMp6cnnJ2dsW/fPu2xZ8+eITQ0FN7e3jk+T61Ww9bWVmcjIiLSGD0aePAAqF07Y/kCMmyK9plJSEjAtWvXtPcjIiJw+vRp2Nvbo2LFihg1ahRmzpyJqlWromrVqpg5cyasra3Ru3dvBaMmIiJDtWsXsGYNYGICrFgBWFgoHREVBkWTmRMnTsDPz097f8yYMQCAoKAgrFq1CmPHjkVSUhKGDRuGR48eoXnz5vj9999hY2OjVMhERGSg4uKAIUPk/qhRQLNmioZDhUglhBBKB1GU4uLiYGdnh9jY2MJtckpLAw4fBqKiABcXoHVrwNS08F6fiIgK1bBhwNKlgJcXcO4cYG2tdESUm/x8f+vt0Gy9tmWLXMjj9u2MY25ucqKC/yb4IyIi/XHokExkAGDZMiYyxkZvOwDrrS1b5CpkmRMZQK4b37OnfJyIiPTGkyfAwIFyf9AgIFPvBjISTGbyIy1N1sgIgTSYYA3ewS24ycc0rXWjRslyRESkF8aNA65eBVxdgTlzlI6GigKTmfw4fFhbI/M+vse7WIPp+CzjcSGAW7dkOSIiUtzevYBmLeNVq4AyZZSMhooKk5n8iIrS7vbHCgDASryHq6iSYzkiIlJGTAzw3ntyf8QIoF07ZeOhosNkJj9cXLS7r+AIOmEH0mCGKZiWYzkiIip+QgBDh8r/LWvUAGbNUjoiKkpMZvKjdWs5aum/RTxmYBIAYAPewlnUlcfd3WU5IiJSzLp1wM8/A2ZmcpI8jl4ybkxm8sPUVA6/BgCVCg1wBm9iIwRMMBmfy+MLF3K+GSIiBd28CQwfLvenTAGaNFE2Hip6TGbyq0cP4JdfgAoVAADTMAUmSMOv6IpjM//gPDNERApKTQXeeQeIjQVatODaSyUFk5mC6NEDiIwEDh5EjXVTENThPgBg0n5OXkBEpKRp0+SAUhsb2bxkxqlhSwQuZ1AIbtwAqlYFUlKAP/4A/P2L5G2IiCgX+/cDAQGy8+/69cBbbykdEb2M/Hx/s2amEHh4AIMHy/2JEzPmzyMiouIRHQ306SP//r7/PhOZkobJTCGZOFH2lj92jCsaEBEVp7Q0mcjcvw/UrSvHYVDJwmSmkDg7Ax99JPfHjQOePVM2HiKikmLmTODAAaBUKWDTJsDKSumIqLgxmSlEY8fKpOaff4BvvlE6GiIi47d/PzB1qtxfulROkEclD5OZQlS6NDBjhtyfPl1OpU1EREUjIgLo1QtITwf69wf69lU6IlIKk5lC1q8fUK8e8Pgx8PnnSkdDRGScnjwBuncH/v0XaNqUteElHZOZQmZqCsybJ/e/+Qb4+29l4yEiMjZCAAMHAmfOAI6OctCFpaXSUZGSmMwUgVdfBTp1kjNRjh2rdDRERMZlwQI5j4yZmVx/yc1N6YhIaUxmisiXX8pamu3bgZAQpaMhIjIOf/wBfPKJ3F+wAGjTRtl4SD8wmSkiNWtmTKQ3cqSspSEiooK7fBno2VN2+A0KylhMkojJTBGaNg0oWxY4exZYskTpaIiIDNeDB7L5/vFjuYDkt98CKpXSUZG+YDJThMqXB4KD5f7kyUBUlLLxEBEZoqdPgW7dgOvXAU9P2XzPDr+UGZOZIjZwoBw2GBeX0c5LRER5k54OvPcecOQIYGcH7NwpRzARZcZkpoiZmsomJpUK+OknIDRU6YiIiAzHlCnAhg1y5NKWLbI/ItHzmMwUgyZNMjoDDx8OpKQoGw8RkSH44YeMWdW/+w7w91c2HtJfTGaKyRdfyD40Fy4AixYpHQ0RkX7bvBkYMkTuT5wolysgygmTmWJibw/Mni33p04Fbt1SNBwiIr31xx9A796yv8ygQVwahl6MyUwx6tcP8PYGEhOBoUPllNxERJThxAk5cunZM+D11+VK2ByCTS/CZKYYmZjINmALC9kjf906pSMiIlJQWpqcIn39eiAkBJcvpCEwEEhIANq2lYMmTE2VDpIMAZOZYlarlpxzBpAzA9+/r2w8RESK2LIFqFQJ8PMDevfGP34D0K7+PTx8KAdNbN0KqNVKB0mGgsmMAsaNA+rVA2JigA8/VDoaIqJitmWLXJfg9m0AwHV4wg8HcTvNFTVxEbuG7YCNjcIxkkFhMqMAc3NgxQpZfbpxo5zNkoioREhLk9XS/3UajIQH/HAQt1ARNXAJB9AWDlOGyXJEecRkRiGNGwMffyz3hw6V640QERm9w4e1NTI3UBG+CMFNeKAaruAA/OGMaDnc8/BhhQMlQ8JkRkFTpgDVqsk1m8aMUToaIqJi8N8idTdQEX44iBuohKr4GwfhBxdEZylHlBdMZhRkZQUsXy6HHa5cCWzbpnRERERFzMUFl1EdrfAnIuCFKriKg/CDK6KylCPKKyYzCmvVKmMByoED+c8IERm38NKt0cbkT9yGO2rgEg7CDxVwN6OASgW4uwOtWysXJBkcJjN6YPp0oEEDObqpf39OpkdExunPPwHftqZ4kF4ejXASh+ADN9zJKKCZHW/hQk4wQ/nCZEYPqNVycihLS2DPHrnKNhGRMdm7FwgIAOLiZKXLgR/vwMHtuYlk3NyAX34BevRQJkgyWCohjLseIC4uDnZ2doiNjYWtra3S4eTq66/lvDOWlsCpU1zqnoiMw6pVco2l1FQgMFDmK9bWkMOvDx+W7esuLjLLYY0M/Sc/3996XTMzdepUqFQqnc3Z2VnpsIrMBx8A7dsDT58CffrItUmIiAyVEHLU5nvvyUTm7bflQAdr6/8KmJoCvr7yAV9fJjJUYHqdzABA7dq1ERUVpd3OnTundEhFRjOqqVw5IDxczhRMRGSInj2Ti+tOny7vT5gArF0r16YjKmxmSgfwImZmZkZdG/M8FxeZ0Lz2muwD16qVXDmWiMhQPH4s/24dOCArW5Yulc1MREVF72tmrl69CldXV3h6euKtt97C9evXcy2fnJyMuLg4nc3QdOmSMVy7f3/g2jVl4yEiyqtLl4BmzWQiU7o0sHMnExkqenqdzDRv3hw//vgj9u7dix9++AHR0dHw9vZGTExMjs8JDg6GnZ2ddnN3dy/GiAvPF1/IWpm4OLkeW1KS0hEREeVu+3ageXPg6lWgYkU5FLt9e6WjopLAoEYzJSYmonLlyhg7dizG5DD/f3JyMpKTk7X34+Li4O7ubhCjmZ539y7QsCFw/z4wYACwbJnSERERZZWeDsyYITv7AoCPD/Dzz4CDg7JxkWEzmtFMzytVqhTq1q2Lq1ev5lhGrVbD1tZWZzNUrq7AunWyY/Dy5cDq1UpHRESkKzZW1h5rEpkPPgD27WMiQ8XLoJKZ5ORkXLp0CS4laM2Otm2BadPk/pAhQFiYsvEQEWmcOAE0agRs3SpHKS1fLufLMjdXOjIqafQ6mfn4448RGhqKiIgI/PXXX+jZsyfi4uIQFBSkdGjFauJEoHNnOf9M167AnTsvfg4RUVERQiYt3t7A9etApUpy7rv+/ZWOjEoqvU5mbt++jbfffhvVq1dHjx49YGFhgWPHjsHDw0Pp0IqViYlc7qB2bTlRZrdu7BBMRMp4/Fg2K334IZCSIv8enTolRzARKcWgOgAXhCEtZ/Ai16/LPxgxMcBbb2X0pyEiKg4HDsiJ8G7dkk1Jc+cCI0bw7xAVDaPtAFzSeXkBmzcDZmbAhg3AzJlKR0REJUFSEjB6tOzDd+sWULky8L//ydoZJjKkD5jMGBgfn4xVtSdNksMfiYiKyqlTQOPGckZyABg8GDh9GmjaVMmoiHQxmTFAgwbJ/4gA4J13gJAQRcMhIiP09KkcfNC8uZzV19lZzub77bdyZl8ifcJkxkDNnw/06CEXc+vaFThzRumIiMhYhIYC9evLpuzUVNnh99w5oGNHpSMjyh6TGQNlaipHOLVpI5c86NABiIxUOioiMmSxsbIZydcX+PtvufDtli2yObt8eaWjI8oZkxkDZmkp10KpUweIjpZroDx8qHRURGRo0tPlDOPVqgHffy+Pvf8+cPEi0L27srER5QWTGQNXpgywZ49c1O3vv4FOnWRNDRFRXpw6JRe17ddPrgNXvbrsh/fdd/LvC5EhYDJjBCpUAPbuBeztgePHgcBAID5e6aiISJ/dvy+XSGnSBDh6VHbqnTMHOHtWjpokMiRMZoxEjRpycbcyZYAjR2QNTWKi0lERkb5JTJQrXFeuLGtfhAD69AGuXAE++USusURkaJjMGJFGjWRCY2cn10np3Bl48kTpqIhIH6SlyYUgq1UDJk8GEhJkrUxoKLB2LeDqqnSERAXHZMbINGkim5xsbGS7d5cuTGiISrL0dGDjRjlQYOBA4O5duTDk+vXAX3/JEZFEho7JjBFq3lx2Ci5dWq6lwk7BRCVPerpc/qR+fbmW2+XLQNmyco6qy5flMRN+A5CR4I+ykfL2Bnbvzqih8fcHHjxQOioiKmppaXJemEaN5GR358/Lpufp04GICLnGklqtdJREhYvJjBFr1UomMg4OwMmTQOvWcpE4IjI+ycnADz/IwQBvvilnBbexAT77TE6oOXmyTGqIjJGZ0gFQ0WrUSHYGbtdOjlZ45RXZSbh6daUjI6LC8O+/MolZtAiIipLH7O3l+m0ffACUK6dsfETFgclMCVC9OvC//wEBAbKtvFUrYNs2mdgQkWG6eBH46ivgxx+BpCR5zM0N+Ogj2dGXi0FSScJmphLC3R04dEiOdnr4UPahWbtW6aiIKD9SU+U/IgEBQO3acp6YpCTZyXflSuCff4BRo5jIUMnDZKYEcXCQfWi6d5erbfftC0yaJEc9EJH+unlT9n3x8JC/v/v2yZFI3bvL3+nwcLkcASe8o5KKyUwJU6oU8MsvwPjx8v4XXwC9enEuGiJ98/SpHJXUqRPg6Ql8/rmcI8bBARg7VtbCbNkilx5QqZSOlkhZ7DNTApmYADNnyr40gwbJ5ObqVXlbpYrS0RGVXELI9dVWrQI2bAAeP854zN8fGDwY6NaNNTBEz2MyU4IFBQFeXsDrr8thnI0byz+i3bsrHRlRyXLhgkxeNmwArl3LOO7uLpuD+/UDqlZVLDwivcdkpoRr3Vq2t/fqJUc89egBjBkDzJoFmJsrHR2R8bpyRc7Qu2EDcO5cxnErK/kPRr9+gJ8fZ+klyguVEEIoHURRiouLg52dHWJjY2Fra6t0OHorJUX2o5k3T9739gZ++kmu4UJEL08I4PRp2c9lyxY5tFrD3BwIDJRLDHTpwtFIRED+vr+ZzJCOrVvlf4RxcXL20EWL5H12MCTKv6dPgYMHgR075HbzZsZj5ubAq6/KWpgePeS6SUSUgclMJkxm8u/6deDdd2WzEwB07Qp8/z3g6KhsXESGICJCrly/Zw+wfz+QmJjxmJWVrIHp0UOOUipTRrEwifQek5lMmMwUTFqabHKaPFnOSePgACxZIv+LZC0NUYa4ODkh5e+/yyTm7791H69QAejcWTYf+fvLhIaIXozJTCZMZl7O2bNyNMXZs/J+p07A4sXsS0MlV1IScOwY8McfcgsLk8m/hqmp7HPWvj3QsSPQoAH/ASAqCCYzmTCZeXnJyXJyvVmzZEdhKytgyhQ56okjnsjYJSQAR47I2pfQUDkPzLNnumUqVwbatgU6dJC1L1ydmujlMZnJhMlM4bl8GRgyRP5BB4A6dYAFC2QnRiJjcfu27C+m2c6c0a15AQAXF5m0tG0rbz08lImVyJgxmcmEyUzhEkKu0vvxx3LBSkB2aJwzRyY3RMUmLQ04fBiIipLZRevWso0nH5KSgFOnZLORZrt9O2u5ihXlsgGarXJlNh0RFTUmM5kwmSkaMTFyrZhvvpEr+ZqYAP37A9Ony+8VoiK1ZQswcqRu5uHmJucS6NEj26ekpADnz8s+Lprt/PmstS4mJnIV6ldeAVq1krdubkV4LkSULSYzmTCZKVpXr8rJ9jZvlvctLYH335cL4VWooGxsZKS2bAF69pTVhJlpqkp++QVPO/bA+fOy1uXUKeDkSdmJ/fm+LgDg5AS0bAm0aCG3xo05aR2RPmAykwmTmeJx5IhMYDRz01hYAAMGAJ9+KqvoiQpFWpocSpepRuYeHHEW9XAG9XEaDXDarCkui2pIS8vaDlSmDNCkidyaNpWbmxubjIj0EZOZTJjMFB8hgAMHgGnTZFcGQI52evNNYNQo+QVCVFBPngAX15zE+SFf4xzq4izq4Szq4T6csi1fvjzQsKGsaWnUSN56ejJxITIUTGYyYTKjjNBQ2X/mwIGMY97eMqnp3h0w4xKnlIOnT+UijBcu6G7//JO1ZQkAVEhHFVxDPZxFQ4SjAU6jweJBcB3WjYkLkQFjMpMJkxllhYXJPpmbNskOmADg6goEBck1n6pVUzQ8UlBcnExaLl2S28WL8vaff4D09OyfU97uGerG/onauID6OIN6OIvauIBSeKJb8OBBwNe3yM+BiIoOk5lMmMzoh6goYOlS4NtvgQcPMo6/8oocBdWjB9epMUbp6XJxxStXMrbLl+V2927OzytbFqhdG6hVS97Wri2H/juV/6/PzJ07OVTTqGQnmIiIfA/TJiL9wmQmEyYz+iU5GfjtN2DlSrkQn+Y/cHNzICAAeOMN4LXXuIKwIRECuH8fuHZNrkuk2a5eldvTpzk/19kZqFFDJi21agE1a8rN2TmXvi2a0UyaN9fINJopp+HZRGQ4mMxkwmRGf929C6xZIyfhu3gx47iZmZxVtWNHOT18tWrstKm09HRZu/bPPzJp0dxevSpv4+Nzfq6FBVClClC9utxq1JBb9eovURuX3Twz7u7AwoVMZIiMBJOZTJjMGIaLF+U/1D//LCcyy8zTM2PNm9at5bwgL60QZo81NgkJQGSkbKGJiACuX5dJy/Xr8n5SUs7PVankEPxq1TK2qlXlbaVKRfTR8hoSGTWjS2aWLFmCL7/8ElFRUahduzYWLlyI1q1b5+m5TGYMz+XLwM6dwO7d8rvq+YnOqlWT31utWsnh3jVq5HN0VAFmjzV0QgCxsbL/yo0bupsmgdEsT5ETU1O5BlGVKnI6/ypVZMJSpQrg5QWo1cVyKkRUQhhVMrNx40b07dsXS5YswSuvvILvvvsOy5Ytw8WLF1ExD7OxMZkxbAkJQEgIsHevXLX43Lms/T6trIAGDeQ8IvXryz4XtWrl0O8mD7PHGlpCIwTw77+y2e7OHZmjaW5v35YJzK1buTcFaZQtK2tSvLzkVrlyxn7FilwlnYiKj1ElM82bN0ejRo2wdOlS7bGaNWuiW7duCA4OfuHzmcwYl0eP5CzDhw7JRQHDw2XCkx1N51IvL9lU5emRDs+PesD9wUk44R4skKL7BD0aCZOWJs/14UM5+uvBA+DePd0tOlomMFFR2U/Tn51y5WTtyvObp6fc7OyK9ryIiPIqP9/fej112bNnz3Dy5El8+umnOscDAgJw5MiRbJ+TnJyM5ORk7f24uLgijZGKV9myQOfOcgNkx9S//5Zr75w8KSdXu3RJ1kRER8stJETzbBMA27SvVQ4P4YIouCAK5RADe/Ev7G/9C/sPI2DbqApKlYLOZmEhm7PMzeWmyXc0/w4IIRfdfPZMzqmTkiJHbyUlydlrNVtCgpxjJS5O1pbExsrE5dEjWcOi2c/vvxn29jIXq1BB3mr2K1aUm7s7YG1d8M+eiEhf6XUy8/DhQ6SlpcHpuR6fTk5OiI6OzvY5wcHBmDZtWnGER3rAxCRjdEyfPhnH4+Mz5jPRdmr96x4iLibhLlyRAgvEoDxiUB7nUVf3RZcU6ynkqkwZwMFBTs3v5JR1c3WVm7Mz+6wQUcml18mMhuq5cblCiCzHNMaPH48xY8Zo78fFxcHd3b1I4yP9Y2OTsZCgVsglwM8P6VAhBuX+q5NxwT044V/Y41/Y4xHKIsb/TcRbOyExUdaiJCbKGpXMNS4pKbIpSPNjqLnV1NpYWGTcWltnbFZWMjZb24xbW1tZ45R5K1dObuyjQkT0YnqdzJQvXx6mpqZZamHu37+fpbZGQ61WQ81/USk7rVsDbm4wuXMHDuIhHPAQ9XAu43FNn5nfhwEc4UtEZDBMlA4gNxYWFmjcuDH27dunc3zfvn3w9vZWKCoyWKamcvg1kHUWPs39hQsV7/xLRET5o9fJDACMGTMGy5Ytw4oVK3Dp0iWMHj0aN2/exJAhQ5QOjQxRjx5y+HWFCrrH3dwMclg2ERHpeTMTAPTq1QsxMTGYPn06oqKiUKdOHezatQseHh5Kh0aGqkcPoGtXzh5LRGQk9H6emZfFeWaIiIgMT36+v/W+mYmIiIgoN0xmiIiIyKAxmSEiIiKDxmSGiIiIDBqTGSIiIjJoTGaIiIjIoDGZISIiIoPGZIaIiIgMGpMZIiIiMmhMZoiIiMig6f3aTC9Ls1pDXFycwpEQERFRXmm+t/Oy6pLRJzPx8fEAAHd3d4UjISIiovyKj4+HnZ1drmWMfqHJ9PR03L17FzY2NlCpVIX62nFxcXB3d8etW7eMchFLnp/hM/Zz5PkZPmM/R55fwQkhEB8fD1dXV5iY5N4rxuhrZkxMTODm5lak72Fra2uUP6QaPD/DZ+znyPMzfMZ+jjy/gnlRjYwGOwATERGRQWMyQ0RERAaNycxLUKvVmDJlCtRqtdKhFAmen+Ez9nPk+Rk+Yz9Hnl/xMPoOwERERGTcWDNDREREBo3JDBERERk0JjNERERk0JjMEBERkUFjMpNHkZGRGDBgADw9PWFlZYXKlStjypQpePbsWa7PE0Jg6tSpcHV1hZWVFXx9fXHhwoViijr/vvjiC3h7e8Pa2hplypTJ03P69esHlUqls7Vo0aJoAy2ggpyfIV3DR48eoW/fvrCzs4OdnR369u2Lx48f5/ocfb9+S5YsgaenJywtLdG4cWMcPnw41/KhoaFo3LgxLC0t4eXlhW+//baYIi2Y/JxfSEhIlmulUqlw+fLlYow47w4dOoQuXbrA1dUVKpUK27Zte+FzDO365fccDekaBgcHo2nTprCxsYGjoyO6deuGK1euvPB5SlxDJjN5dPnyZaSnp+O7777DhQsXsGDBAnz77beYMGFCrs+bM2cO5s+fj8WLFyMsLAzOzs5o166dds0offPs2TO88cYbGDp0aL6e16FDB0RFRWm3Xbt2FVGEL6cg52dI17B37944ffo09uzZgz179uD06dPo27fvC5+nr9dv48aNGDVqFCZOnIjw8HC0bt0agYGBuHnzZrblIyIi0LFjR7Ru3Rrh4eGYMGECPvzwQ2zevLmYI8+b/J6fxpUrV3SuV9WqVYsp4vxJTExE/fr1sXjx4jyVN7TrB+T/HDUM4RqGhoZi+PDhOHbsGPbt24fU1FQEBAQgMTExx+codg0FFdicOXOEp6dnjo+np6cLZ2dnMWvWLO2xp0+fCjs7O/Htt98WR4gFtnLlSmFnZ5enskFBQaJr165FGk9hy+v5GdI1vHjxogAgjh07pj129OhRAUBcvnw5x+fp8/Vr1qyZGDJkiM6xGjVqiE8//TTb8mPHjhU1atTQOTZ48GDRokWLIovxZeT3/A4ePCgAiEePHhVDdIULgNi6dWuuZQzt+j0vL+doyNfw/v37AoAIDQ3NsYxS15A1My8hNjYW9vb2OT4eERGB6OhoBAQEaI+p1Wr4+PjgyJEjxRFisQkJCYGjoyOqVauGQYMG4f79+0qHVCgM6RoePXoUdnZ2aN68ufZYixYtYGdn98JY9fH6PXv2DCdPntT57AEgICAgx/M5evRolvLt27fHiRMnkJKSUmSxFkRBzk+jYcOGcHFxQdu2bXHw4MGiDLNYGdL1e1mGeA1jY2MBINfvPaWuIZOZAvrnn3/w9ddfY8iQITmWiY6OBgA4OTnpHHdyctI+ZgwCAwPx008/4cCBA5g3bx7CwsLg7++P5ORkpUN7aYZ0DaOjo+Ho6JjluKOjY66x6uv1e/jwIdLS0vL12UdHR2dbPjU1FQ8fPiyyWAuiIOfn4uKC77//Hps3b8aWLVtQvXp1tG3bFocOHSqOkIucIV2/gjLUayiEwJgxY9CqVSvUqVMnx3JKXcMSn8xMnTo1285YmbcTJ07oPOfu3bvo0KED3njjDQwcOPCF76FSqXTuCyGyHCtKBTnH/OjVqxc6deqEOnXqoEuXLti9ezf+/vtv7Ny5sxDPImdFfX6AstcwP+eXXUwvilXp6/ci+f3ssyuf3XF9kZ/zq169OgYNGoRGjRqhZcuWWLJkCTp16oS5c+cWR6jFwtCuX34Z6jX84IMPcPbsWaxfv/6FZZW4hmZF9soG4oMPPsBbb72Va5lKlSpp9+/evQs/Pz+0bNkS33//fa7Pc3Z2BiAzVRcXF+3x+/fvZ8lci1J+z/Flubi4wMPDA1evXi2018xNUZ6fPlzDvJ7f2bNnce/evSyPPXjwIF+xFvf1y0n58uVhamqapZYit8/e2dk52/JmZmYoV65ckcVaEAU5v+y0aNECa9euLezwFGFI168w6fs1HDFiBH799VccOnQIbm5uuZZV6hqW+GSmfPnyKF++fJ7K3rlzB35+fmjcuDFWrlwJE5PcK7Y8PT3h7OyMffv2oWHDhgBkO3loaChmz5790rHnVX7OsTDExMTg1q1bOl/+Rakoz08frmFez69ly5aIjY3F8ePH0axZMwDAX3/9hdjYWHh7e+f5/Yr7+uXEwsICjRs3xr59+9C9e3ft8X379qFr167ZPqdly5b47bffdI79/vvvaNKkCczNzYs03vwqyPllJzw8XPFrVVgM6foVJn29hkIIjBgxAlu3bkVISAg8PT1f+BzFrmGRdi82Infu3BFVqlQR/v7+4vbt2yIqKkq7ZVa9enWxZcsW7f1Zs2YJOzs7sWXLFnHu3Dnx9ttvCxcXFxEXF1fcp5AnN27cEOHh4WLatGmidOnSIjw8XISHh4v4+HhtmcznGB8fLz766CNx5MgRERERIQ4ePChatmwpKlSooJfnmN/zE8KwrmGHDh1EvXr1xNGjR8XRo0dF3bp1RefOnXXKGNL127BhgzA3NxfLly8XFy9eFKNGjRKlSpUSkZGRQgghPv30U9G3b19t+evXrwtra2sxevRocfHiRbF8+XJhbm4ufvnlF6VOIVf5Pb8FCxaIrVu3ir///lucP39efPrppwKA2Lx5s1KnkKv4+Hjt7xgAMX/+fBEeHi5u3LghhDD86ydE/s/RkK7h0KFDhZ2dnQgJCdH5znvy5Im2jL5cQyYzebRy5UoBINstMwBi5cqV2vvp6eliypQpwtnZWajVatGmTRtx7ty5Yo4+74KCgrI9x4MHD2rLZD7HJ0+eiICAAOHg4CDMzc1FxYoVRVBQkLh586YyJ/AC+T0/IQzrGsbExIg+ffoIGxsbYWNjI/r06ZNlCKihXb9vvvlGeHh4CAsLC9GoUSOdYaFBQUHCx8dHp3xISIho2LChsLCwEJUqVRJLly4t5ojzJz/nN3v2bFG5cmVhaWkpypYtK1q1aiV27typQNR5oxmG/PwWFBQkhDCO65ffczSka5jTd17mv4/6cg1V/wVMREREZJBK/GgmIiIiMmxMZoiIiMigMZkhIiIig8ZkhoiIiAwakxkiIiIyaExmiIiIyKAxmSEiIiKDxmSGiIiIDBqTGSIyKGlpafD29sbrr7+uczw2Nhbu7u6YNGmSQpERkVI4AzARGZyrV6+iQYMG+P7779GnTx8AwLvvvoszZ84gLCwMFhYWCkdIRMWJyQwRGaSvvvoKU6dOxfnz5xEWFoY33ngDx48fR4MGDZQOjYiKGZMZIjJIQgj4+/vD1NQU586dw4gRI9jERFRCMZkhIoN1+fJl1KxZE3Xr1sWpU6dgZmamdEhEpAB2ACYig7VixQpYW1sjIiICt2/fVjocIlIIa2aIyCAdPXoUbdq0we7duzFnzhykpaVh//79UKlUSodGRMWMNTNEZHCSkpIQFBSEwYMH49VXX8WyZcsQFhaG7777TunQiEgBTGaIyOB8+umnSE9Px+zZswEAFStWxLx58/DJJ58gMjJS2eCIqNixmYmIDEpoaCjatm2LkJAQtGrVSuex9u3bIzU1lc1NRCUMkxkiIiIyaGxmIiIiIoPGZIaIiIgMGpMZIiIiMmhMZoiIiMigMZkhIiIig8ZkhoiIiAwakxkiIiIyaExmiIiIyKAxmSEiIiKDxmSGiIiIDBqTGSIiIjJoTGaIiIjIoP0fsSz2emSuugwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_values = np.linspace(min(X), max(X), 100).reshape(-1, 1)\n", "\n", "x_values_poly = poly.transform(x_values)\n", "y_predicted = regressor.predict(x_values_poly)\n", "\n", "plt.scatter(X, Y, color='red', label='Data')\n", "\n", "plt.plot(x_values, y_predicted, color='blue', label='Predicted')\n", "\n", "plt.title(f'Polynomial Regression Prediction (Degree {degree})')\n", "plt.xlabel('X')\n", "plt.ylabel('Y')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Table\n", "This cell creates a Pandas DataFrame `df` that contains the original data in the 'X' column, actual 'Y' values in the 'Y' column, and the predicted 'Y' values in the 'Y_pred' column." ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:52:15.416747Z", "start_time": "2023-11-05T18:52:15.394026Z" }, "scrolled": true }, "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", "
XYY_pred
0011.000000e+00
1166.000000e+00
22333.300000e+01
3-10-1.532108e-14
4-299.000000e+00
\n", "
" ], "text/plain": [ " X Y Y_pred\n", "0 0 1 1.000000e+00\n", "1 1 6 6.000000e+00\n", "2 2 33 3.300000e+01\n", "3 -1 0 -1.532108e-14\n", "4 -2 9 9.000000e+00" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_predicted = regressor.predict(X_poly)\n", "data = {'X': X.ravel(), 'Y': Y, 'Y_pred': y_predicted}\n", "df = pd.DataFrame(data)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Polynomial Coefficients\n", "In this cell, we extract the coefficients of the polynomial regression model and create a DataFrame `coeff_df`. The DataFrame presents the coefficients alongside the corresponding features, which are powers of 'X'. This helps in understanding the impact of each term on the model's predictions." ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:53:55.286538Z", "start_time": "2023-11-05T18:53:55.277046Z" }, "scrolled": true }, "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", "
FeatureCoefficient
0X^12.0
1X^21.0
2X^31.0
3X^41.0
\n", "
" ], "text/plain": [ " Feature Coefficient\n", "0 X^1 2.0\n", "1 X^2 1.0\n", "2 X^3 1.0\n", "3 X^4 1.0" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coefficients = regressor.coef_\n", "coeff_data = {'Feature': [f'X^{i}' for i in range(1, degree + 1)], 'Coefficient': coefficients[1:]}\n", "coeff_df = pd.DataFrame(coeff_data)\n", "coeff_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Generating LaTeX Equation\n", "In this cell, we use the IPython.display library to present the polynomial equation in a LaTeX format. The equation includes the intercept term and non-zero coefficients, effectively excluding terms with coefficients equal to zero. This representation provides a more concise and meaningful equation for your polynomial regression model." ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:55:37.776422Z", "start_time": "2023-11-05T18:55:37.766784Z" }, "scrolled": true }, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle Our Equation: 1.000 + 2.000X^1 + 1.000X^2 + 1.000X^3 + 1.000X^4$" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, Math\n", "\n", "\n", "coefficients = [i for i in regressor.coef_]\n", "\n", "\n", "terms = [f'{coeff:.3f}X^{i}' for i, coeff in enumerate(coefficients) if coeff != 0]\n", "latex_equation = \"$Our Equation: {:.3f} + {}$\".format(\n", " regressor.intercept_,\n", " ' + '.join(terms)\n", ")\n", "\n", "display(Math(latex_equation))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Calculating Polynomial Values\n", "\n", "In this cell, we define a function, `calculate_polynomial_value`, that calculates the polynomial value with provided coefficients, a value, and an intercept term. The function correctly applies the powers of 'value' to each coefficient, and then adds the intercept term to the result.\n", "\n", "The example usage demonstrates how to use the function with the coefficients and intercept from the regressor object. The code calculates and prints the polynomial value with five decimal places for the given value of -2. The result is 9 which is correct according to our initial input output table." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "ExecuteTime": { "end_time": "2023-11-05T18:56:19.359906Z", "start_time": "2023-11-05T18:56:19.353891Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.00000\n" ] } ], "source": [ "def calculate_polynomial_value(coefficients, X, intercept):\n", " result = sum(coeff * (X ** i) for i, coeff in enumerate(coefficients))\n", " return result + intercept\n", "\n", "# Example usage:\n", "coefficients = regressor.coef_\n", "intercept = regressor.intercept_\n", "X = 1\n", "result = calculate_polynomial_value(coefficients, X, intercept)\n", "print(f\"{result:.5f}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.13" } }, "nbformat": 4, "nbformat_minor": 2 }