|
| 1 | +{ |
| 2 | + "cells": [ |
| 3 | + { |
| 4 | + "cell_type": "code", |
| 5 | + "execution_count": 1, |
| 6 | + "metadata": {}, |
| 7 | + "outputs": [], |
| 8 | + "source": [ |
| 9 | + "import sys\n", |
| 10 | + "sys.path.append('..')\n", |
| 11 | + "from data_preprocessing import DataPreprocessing\n", |
| 12 | + "from model_training import ModelTraining\n", |
| 13 | + "import config" |
| 14 | + ] |
| 15 | + }, |
| 16 | + { |
| 17 | + "cell_type": "code", |
| 18 | + "execution_count": 2, |
| 19 | + "metadata": {}, |
| 20 | + "outputs": [], |
| 21 | + "source": [ |
| 22 | + "PROCESSED_DATA_PATH = config.DATA_FOLDER + config.PROCESSED_DATA_PATH" |
| 23 | + ] |
| 24 | + }, |
| 25 | + { |
| 26 | + "cell_type": "code", |
| 27 | + "execution_count": 3, |
| 28 | + "metadata": {}, |
| 29 | + "outputs": [ |
| 30 | + { |
| 31 | + "name": "stderr", |
| 32 | + "output_type": "stream", |
| 33 | + "text": [ |
| 34 | + "2025-02-12 01:33:36,106 - INFO - Loading dataset from ../data/../data/processed_churn_data.csv\n" |
| 35 | + ] |
| 36 | + } |
| 37 | + ], |
| 38 | + "source": [ |
| 39 | + "data = DataPreprocessing.load_data(PROCESSED_DATA_PATH)" |
| 40 | + ] |
| 41 | + }, |
| 42 | + { |
| 43 | + "cell_type": "code", |
| 44 | + "execution_count": 4, |
| 45 | + "metadata": {}, |
| 46 | + "outputs": [ |
| 47 | + { |
| 48 | + "data": { |
| 49 | + "text/html": [ |
| 50 | + "<div>\n", |
| 51 | + "<style scoped>\n", |
| 52 | + " .dataframe tbody tr th:only-of-type {\n", |
| 53 | + " vertical-align: middle;\n", |
| 54 | + " }\n", |
| 55 | + "\n", |
| 56 | + " .dataframe tbody tr th {\n", |
| 57 | + " vertical-align: top;\n", |
| 58 | + " }\n", |
| 59 | + "\n", |
| 60 | + " .dataframe thead th {\n", |
| 61 | + " text-align: right;\n", |
| 62 | + " }\n", |
| 63 | + "</style>\n", |
| 64 | + "<table border=\"1\" class=\"dataframe\">\n", |
| 65 | + " <thead>\n", |
| 66 | + " <tr style=\"text-align: right;\">\n", |
| 67 | + " <th></th>\n", |
| 68 | + " <th>user</th>\n", |
| 69 | + " <th>churn</th>\n", |
| 70 | + " <th>age</th>\n", |
| 71 | + " <th>housing</th>\n", |
| 72 | + " <th>deposits</th>\n", |
| 73 | + " <th>withdrawal</th>\n", |
| 74 | + " <th>purchases_partners</th>\n", |
| 75 | + " <th>purchases</th>\n", |
| 76 | + " <th>cc_taken</th>\n", |
| 77 | + " <th>cc_recommended</th>\n", |
| 78 | + " <th>...</th>\n", |
| 79 | + " <th>payment_type</th>\n", |
| 80 | + " <th>waiting_4_loan</th>\n", |
| 81 | + " <th>cancelled_loan</th>\n", |
| 82 | + " <th>received_loan</th>\n", |
| 83 | + " <th>rejected_loan</th>\n", |
| 84 | + " <th>zodiac_sign</th>\n", |
| 85 | + " <th>left_for_two_month_plus</th>\n", |
| 86 | + " <th>left_for_one_month</th>\n", |
| 87 | + " <th>reward_rate</th>\n", |
| 88 | + " <th>is_referred</th>\n", |
| 89 | + " </tr>\n", |
| 90 | + " </thead>\n", |
| 91 | + " <tbody>\n", |
| 92 | + " <tr>\n", |
| 93 | + " <th>0</th>\n", |
| 94 | + " <td>23547</td>\n", |
| 95 | + " <td>0</td>\n", |
| 96 | + " <td>28.0</td>\n", |
| 97 | + " <td>R</td>\n", |
| 98 | + " <td>0</td>\n", |
| 99 | + " <td>0</td>\n", |
| 100 | + " <td>1</td>\n", |
| 101 | + " <td>0</td>\n", |
| 102 | + " <td>0</td>\n", |
| 103 | + " <td>96</td>\n", |
| 104 | + " <td>...</td>\n", |
| 105 | + " <td>Weekly</td>\n", |
| 106 | + " <td>0</td>\n", |
| 107 | + " <td>0</td>\n", |
| 108 | + " <td>0</td>\n", |
| 109 | + " <td>0</td>\n", |
| 110 | + " <td>Leo</td>\n", |
| 111 | + " <td>0</td>\n", |
| 112 | + " <td>0</td>\n", |
| 113 | + " <td>1.47</td>\n", |
| 114 | + " <td>1</td>\n", |
| 115 | + " </tr>\n", |
| 116 | + " <tr>\n", |
| 117 | + " <th>1</th>\n", |
| 118 | + " <td>58313</td>\n", |
| 119 | + " <td>0</td>\n", |
| 120 | + " <td>35.0</td>\n", |
| 121 | + " <td>R</td>\n", |
| 122 | + " <td>47</td>\n", |
| 123 | + " <td>2</td>\n", |
| 124 | + " <td>86</td>\n", |
| 125 | + " <td>47</td>\n", |
| 126 | + " <td>0</td>\n", |
| 127 | + " <td>285</td>\n", |
| 128 | + " <td>...</td>\n", |
| 129 | + " <td>Semi-Monthly</td>\n", |
| 130 | + " <td>0</td>\n", |
| 131 | + " <td>0</td>\n", |
| 132 | + " <td>0</td>\n", |
| 133 | + " <td>0</td>\n", |
| 134 | + " <td>Capricorn</td>\n", |
| 135 | + " <td>1</td>\n", |
| 136 | + " <td>0</td>\n", |
| 137 | + " <td>2.17</td>\n", |
| 138 | + " <td>0</td>\n", |
| 139 | + " </tr>\n", |
| 140 | + " <tr>\n", |
| 141 | + " <th>2</th>\n", |
| 142 | + " <td>8095</td>\n", |
| 143 | + " <td>0</td>\n", |
| 144 | + " <td>26.0</td>\n", |
| 145 | + " <td>R</td>\n", |
| 146 | + " <td>26</td>\n", |
| 147 | + " <td>3</td>\n", |
| 148 | + " <td>38</td>\n", |
| 149 | + " <td>25</td>\n", |
| 150 | + " <td>0</td>\n", |
| 151 | + " <td>74</td>\n", |
| 152 | + " <td>...</td>\n", |
| 153 | + " <td>Bi-Weekly</td>\n", |
| 154 | + " <td>0</td>\n", |
| 155 | + " <td>0</td>\n", |
| 156 | + " <td>0</td>\n", |
| 157 | + " <td>0</td>\n", |
| 158 | + " <td>Capricorn</td>\n", |
| 159 | + " <td>0</td>\n", |
| 160 | + " <td>0</td>\n", |
| 161 | + " <td>1.10</td>\n", |
| 162 | + " <td>1</td>\n", |
| 163 | + " </tr>\n", |
| 164 | + " <tr>\n", |
| 165 | + " <th>3</th>\n", |
| 166 | + " <td>3120</td>\n", |
| 167 | + " <td>1</td>\n", |
| 168 | + " <td>32.0</td>\n", |
| 169 | + " <td>R</td>\n", |
| 170 | + " <td>5</td>\n", |
| 171 | + " <td>3</td>\n", |
| 172 | + " <td>111</td>\n", |
| 173 | + " <td>5</td>\n", |
| 174 | + " <td>0</td>\n", |
| 175 | + " <td>227</td>\n", |
| 176 | + " <td>...</td>\n", |
| 177 | + " <td>Bi-Weekly</td>\n", |
| 178 | + " <td>0</td>\n", |
| 179 | + " <td>0</td>\n", |
| 180 | + " <td>0</td>\n", |
| 181 | + " <td>0</td>\n", |
| 182 | + " <td>Taurus</td>\n", |
| 183 | + " <td>0</td>\n", |
| 184 | + " <td>0</td>\n", |
| 185 | + " <td>1.83</td>\n", |
| 186 | + " <td>0</td>\n", |
| 187 | + " </tr>\n", |
| 188 | + " <tr>\n", |
| 189 | + " <th>4</th>\n", |
| 190 | + " <td>41406</td>\n", |
| 191 | + " <td>0</td>\n", |
| 192 | + " <td>21.0</td>\n", |
| 193 | + " <td>na</td>\n", |
| 194 | + " <td>0</td>\n", |
| 195 | + " <td>0</td>\n", |
| 196 | + " <td>4</td>\n", |
| 197 | + " <td>0</td>\n", |
| 198 | + " <td>0</td>\n", |
| 199 | + " <td>0</td>\n", |
| 200 | + " <td>...</td>\n", |
| 201 | + " <td>Bi-Weekly</td>\n", |
| 202 | + " <td>0</td>\n", |
| 203 | + " <td>0</td>\n", |
| 204 | + " <td>0</td>\n", |
| 205 | + " <td>0</td>\n", |
| 206 | + " <td>Cancer</td>\n", |
| 207 | + " <td>0</td>\n", |
| 208 | + " <td>0</td>\n", |
| 209 | + " <td>0.07</td>\n", |
| 210 | + " <td>0</td>\n", |
| 211 | + " </tr>\n", |
| 212 | + " </tbody>\n", |
| 213 | + "</table>\n", |
| 214 | + "<p>5 rows × 28 columns</p>\n", |
| 215 | + "</div>" |
| 216 | + ], |
| 217 | + "text/plain": [ |
| 218 | + " user churn age housing deposits withdrawal purchases_partners \\\n", |
| 219 | + "0 23547 0 28.0 R 0 0 1 \n", |
| 220 | + "1 58313 0 35.0 R 47 2 86 \n", |
| 221 | + "2 8095 0 26.0 R 26 3 38 \n", |
| 222 | + "3 3120 1 32.0 R 5 3 111 \n", |
| 223 | + "4 41406 0 21.0 na 0 0 4 \n", |
| 224 | + "\n", |
| 225 | + " purchases cc_taken cc_recommended ... payment_type waiting_4_loan \\\n", |
| 226 | + "0 0 0 96 ... Weekly 0 \n", |
| 227 | + "1 47 0 285 ... Semi-Monthly 0 \n", |
| 228 | + "2 25 0 74 ... Bi-Weekly 0 \n", |
| 229 | + "3 5 0 227 ... Bi-Weekly 0 \n", |
| 230 | + "4 0 0 0 ... Bi-Weekly 0 \n", |
| 231 | + "\n", |
| 232 | + " cancelled_loan received_loan rejected_loan zodiac_sign \\\n", |
| 233 | + "0 0 0 0 Leo \n", |
| 234 | + "1 0 0 0 Capricorn \n", |
| 235 | + "2 0 0 0 Capricorn \n", |
| 236 | + "3 0 0 0 Taurus \n", |
| 237 | + "4 0 0 0 Cancer \n", |
| 238 | + "\n", |
| 239 | + " left_for_two_month_plus left_for_one_month reward_rate is_referred \n", |
| 240 | + "0 0 0 1.47 1 \n", |
| 241 | + "1 1 0 2.17 0 \n", |
| 242 | + "2 0 0 1.10 1 \n", |
| 243 | + "3 0 0 1.83 0 \n", |
| 244 | + "4 0 0 0.07 0 \n", |
| 245 | + "\n", |
| 246 | + "[5 rows x 28 columns]" |
| 247 | + ] |
| 248 | + }, |
| 249 | + "execution_count": 4, |
| 250 | + "metadata": {}, |
| 251 | + "output_type": "execute_result" |
| 252 | + } |
| 253 | + ], |
| 254 | + "source": [ |
| 255 | + "data.head()" |
| 256 | + ] |
| 257 | + }, |
| 258 | + { |
| 259 | + "cell_type": "code", |
| 260 | + "execution_count": 5, |
| 261 | + "metadata": {}, |
| 262 | + "outputs": [], |
| 263 | + "source": [ |
| 264 | + "mt = ModelTraining(PROCESSED_DATA_PATH,\n", |
| 265 | + " logistic_regression_params=config.LOGISTIC_REGRESSION_PARAMS,\n", |
| 266 | + " grid_search_params=config.GRID_SEARCH_PARAMS)" |
| 267 | + ] |
| 268 | + }, |
| 269 | + { |
| 270 | + "cell_type": "code", |
| 271 | + "execution_count": 6, |
| 272 | + "metadata": {}, |
| 273 | + "outputs": [ |
| 274 | + { |
| 275 | + "name": "stderr", |
| 276 | + "output_type": "stream", |
| 277 | + "text": [ |
| 278 | + "2025-02-12 01:33:36,281 - INFO - Performing feature engineering on the dataset\n" |
| 279 | + ] |
| 280 | + } |
| 281 | + ], |
| 282 | + "source": [ |
| 283 | + "mt._split_data()" |
| 284 | + ] |
| 285 | + }, |
| 286 | + { |
| 287 | + "cell_type": "code", |
| 288 | + "execution_count": 7, |
| 289 | + "metadata": {}, |
| 290 | + "outputs": [], |
| 291 | + "source": [ |
| 292 | + "mt._balance_data()" |
| 293 | + ] |
| 294 | + }, |
| 295 | + { |
| 296 | + "cell_type": "code", |
| 297 | + "execution_count": 8, |
| 298 | + "metadata": {}, |
| 299 | + "outputs": [], |
| 300 | + "source": [ |
| 301 | + "mt._scale_features()" |
| 302 | + ] |
| 303 | + }, |
| 304 | + { |
| 305 | + "cell_type": "code", |
| 306 | + "execution_count": 9, |
| 307 | + "metadata": {}, |
| 308 | + "outputs": [], |
| 309 | + "source": [ |
| 310 | + "mt.build_model()" |
| 311 | + ] |
| 312 | + }, |
| 313 | + { |
| 314 | + "cell_type": "code", |
| 315 | + "execution_count": 10, |
| 316 | + "metadata": {}, |
| 317 | + "outputs": [ |
| 318 | + { |
| 319 | + "name": "stdout", |
| 320 | + "output_type": "stream", |
| 321 | + "text": [ |
| 322 | + "Test Data Accuracy: 0.6298\n" |
| 323 | + ] |
| 324 | + }, |
| 325 | + { |
| 326 | + "data": { |
| 327 | + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAx4AAAJPCAYAAADynwLYAAAAP3RFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMS5wb3N0MSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8kixA/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABSrklEQVR4nO3de1hVZd7G8RuQgyiipoiZJGqoGWiJSaFlWuGUZqWSWnaYGe3gAUdzstSsTEvfcSy1Epsx7IAGk4fKPISmmKdsrCyLTMUTCWaiHCw2m73fPxh2IhtPsFiw/H7m2tdcs9ZvrfWsuebt9ef9PM/ycDqdTgEAAACAgTzNHgAAAAAA66PxAAAAAGA4Gg8AAAAAhqPxAAAAAGA4Gg8AAAAAhqPxAAAAAGA4Gg8AAAAAhqPxAAAAAGA4Gg8AAAAAhqtl9gDOV+GxfWYPAQAqlW3uBLOHAACVqs5zi8weQrmq8s+S3o1aVtmzahISDwAAAACGqzGJBwAAAHDRHEVmj+CSR+IBAAAAwHAkHgAAALA+p8PsEVzySDwAAAAAGI7EAwAAANbnIPEwG4kHAAAAAMPReAAAAMDynE5Hlf0q06xZs9SmTRvl5OSUOZeXl6dZs2bpT3/6k8LDw3XttdcqNjZWycnJbu9VUFCg+fPn64477lCHDh3UtWtXTZw4UUePHnVbn5OTo3/84x+6/fbbFRERoVtuuUUvv/yycnNzL+pdaDwAAACAamjZsmWaP3++23M5OTkaOHCg5s2bJx8fHw0cOFC9e/fW4cOHNXHiRD399NOl6u12u0aMGKGZM2cqMDBQDz74oCIiIpScnKx+/fopMzOzVH1eXp4efvhhvfnmmwoJCdFDDz2kkJAQvfXWWxo0aJDy8vIu+H1Y4wEAAADrq0FrPOx2u2bPnq358+fL6XS6rXnttdf0008/KTY2Vs8//7w8PYvzhHHjxmnQoEFasmSJevXqpZtvvlmSlJycrNTUVPXr10/Tpk1z3ScpKUmTJk3S1KlTNWfOHNfxefPmadeuXRo5cqRGjBjhOj5r1izNmzdPc+fO1fjx4y/ovUg8AAAAgGpiy5Yt6tOnj+Lj4xUeHq4GDRq4rVuxYoU8PDw0btw4V9MhSfXq1dPQoUMlSSkpKa7jCQkJ8vT01JgxY0rdJzY2VmFhYUpJSVFWVpYkyWazKTExUYGBgRo2bFip+uHDh6tBgwb6z3/+I5vNdkHvRuMBAAAA63M6qu5XAcuXL9fRo0c1duxYJSYmyt/fv0xNUVGRhg0bpri4ONWrV6/MeR8fH0lSfn6+JOnIkSPav3+/wsLC1KhRozL10dHRcjgc2rp1qyRp586dys/PV2RkpOtep9+7c+fOys3N1c6dOy/o3ZhqBQAAAFQT/fv31/jx41W/fv1ya7y8vPTggw+We37VqlWSpDZt2kiS0tPTJUktWrRwW9+8eXNJ0r59+y6oPj09XZGRkeWO40w0HgAAAEAl6tmz51nPr127ttxzF/IHeXdSUlK0evVq+fv765577pEkZWdnS5ICAwPdXlNyvGS3qpL68pqfknp3O22dDY0HAAAArM9RZPYIDLdp0yaNHTtWkjR58mQFBQVJkgoLCyWpzLSpEiXHCwoKStV7e3ufV/35ovEAAAAAKtHZEg2jLF++XBMmTFBhYaGefPJJ3X333a5zfn5+klTuYvCS4yXrSUrqSxqQc9WfLxoPAAAAWF8lf9ivunA6nfrnP/+p+fPny8vLS88//7wGDhxYqubMqVRnOnnypCS5FqqfayrVmfXni8YDAAAAqIFsNpvGjh2rNWvWyN/fX6+88orrux2na9WqlSTp4MGDbu9z6NAhSVLr1q0vqv580XgAAADA+mrQBwTPh91u1/Dhw5Wamqrg4GDFx8erbdu2bmuDgoIUGhqqtLQ0HT9+XA0bNix1ftOmTfL09FSnTp0kSe3bt1dAQIC+/PJLFRYWllrrYbPZ9MUXX6hOnTq6+uqrL2jMfMcDAAAAqGHmzJnjajoWL15cbtNRIjY2Vna7XTNmzCj1NfSkpCTt3r1bMTExrsXoPj4+6tu3r3799Ve98cYbpe7z2muv6cSJExo0aJBq1bqwDIPEAwAAAJbntNAaj6NHj2rBggWSpHbt2uk///mP27qWLVvqzjvvlCQNGTJEa9as0dKlS7Vnzx5FRUUpPT1dKSkpatq0qcaPH1/q2lGjRunzzz/Xa6+9ph07dig8PFw7d+7U1q1b1a5dOz3++OMXPG4aDwAAAKAG2bJli2tnqc8++0yfffaZ27qePXu6Gg9vb28tWLBA8fHxWrFihRISEtS4cWMNGDBAI0eOVJMmTUpdGxgYqEWLFmnu3Llau3atvvzySwUHB+vPf/6zHnvsMdWtW/eCx+3hPD1rqcYKj+0zewgAUKlscyeYPQQAqFR1nltk9hDKVfDT5ip7lu9VN1bZs2oS1ngAAAAAMBxTrQAAAGB9FlrjUVOReAAAAAAwHIkHAAAArM9RZPYILnkkHgAAAAAMR+IBAAAA62ONh+lIPAAAAAAYjsQDAAAA1ucg8TAbiQcAAAAAw5F4AAAAwPpY42E6Eg8AAAAAhqPxAAAAAGA4ploBAADA+lhcbjoSDwAAAACGI/EAAACA5TmdRWYP4ZJH4gEAAADAcCQeAAAAsD620zUdiQcAAAAAw5F4AAAAwPrY1cp0JB4AAAAADEfiAQAAAOtjjYfpSDwAAAAAGI7EAwAAANbn4DseZiPxAAAAAGA4Eg8AAABYH2s8TEfiAQAAAMBwJB4AAACwPr7jYToSDwAAAACGI/EAAACA9bHGw3QkHgAAAAAMR+MBAAAAwHBMtQIAAID1sbjcdCQeAAAAAAxH4gEAAADrI/EwHYkHAAAAAMOReAAAAMDynM4is4dwySPxAAAAAGA4Eg8AAABYH2s8TEfiAQAAAMBwJB4AAACwPieJh9lIPAAAAAAYjsQDAAAA1scaD9OReAAAAAAwHIkHAAAArI81HqYj8QAAAABgOBIPAAAAWB9rPExH4gEAAADAcCQeAAAAsD7WeJiOxAMAAACA4Wg8AAAAYH0OR9X9KtGsWbPUpk0b5eTklFuze/duXXPNNUpISCi3Zv/+/Ro7dqxuuukmdejQQX369NG7774rRznj/e677/TYY48pOjpaHTt21IABA/TRRx9V6F2YagUAAABUQ8uWLdP8+fPPWvPzzz/r8ccfV2FhYbk1u3fv1gMPPKDffvtNd955pxo2bKh169ZpypQp2rlzp2bMmFGqfsuWLRo2bJh8fHx05513qnbt2lq1apWefPJJ7d27V6NHj76o96HxAAAAAKoRu92u2bNna/78+XI6neXWbd26VU8++aR++eWXs95v0qRJysnJ0dtvv63rr79ekjR69Gj99a9/1fLly9WrVy/16NFDkmSz2fTMM8/Iy8tLSUlJatWqlSRp+PDhGjRokOLj49WrVy+1bdv2gt+LqVYAAACwvhoy1WrLli3q06eP4uPjFR4ergYNGpSpOX78uMaMGaOHH35Y+fn5ioyMLPd+O3bs0Ndff62bbrrJ1XRIko+Pj5566ilJ0nvvvec6vnr1av3888+65557XE2HJNWrV09xcXFyOBxKTEy8qHej8QAAAACqieXLl+vo0aMaO3asEhMT5e/vX6bmp59+0ooVK9SjRw999NFHioqKKvd+W7ZskSTdeOONZc61b99e9evX1xdffKGioqJS9dHR0WXqS+5RUnOhmGoFAAAA66sh2+n2799f48ePV/369cutCQkJ0ZIlS9S+fftz3i89PV2SFBoa6vZ88+bN9e233+rw4cO68sorXfUtWrQoU1u3bl01bNhQhw8fls1mk4+Pz7lf6DQ0HgAAAEAl6tmz51nPr127ttxzZ5s2VaJp06Zq2rTpeY0lOztbkhQYGOj2fMnxkl2zzlVfr149HT9+XHl5eWrYsOF5jaEEjQcAAACsr5K3ua0p7Ha7JMnb29vt+ZLjBQUF51VfknLYbLYLHguNBwAAAFCJzpZoVDU/Pz9JKne73ZLjderUOa/6kobD3dqTc6HxAAAAgPXVkDUele3MqVRnOnnypCQpICCgTH3jxo3L1Ofk5MjDw0N169a94LGwqxUAAABgUSVb4h46dMjt+UOHDqlOnTquNSNnq8/Ly9Px48fVqlUreXpeeBtB4wEAAADrqyHf8ahsXbp0kSRt3ry5zLnvvvtOJ06c0HXXXScvL69z1m/atEnS+S2Ad4fGAwAAALCojh07KiwsTOvWrSvVTNhsNs2YMUOSNGTIENfxHj16qFGjRkpOTtaPP/7oOp6Tk6PZs2fLw8NDDzzwwEWNhTUeAAAAsL5LdI2HJE2dOlUPPfSQhg0bpl69eqlJkyZat26d9u3bp3vvvVc333yzq7Z27dp6/vnnNWrUKA0cOFB33nmn6tSpo1WrVikzM1MjR47UVVdddVHjoPEAAAAALCwiIkKLFy/WnDlzlJqaKpvNppCQED377LMaOHBgmfpbb71Vb7/9tl5//XWtXLlSTqdTrVq10rhx49S7d++LHoeH0+l0VuRFqkrhsX1mDwEAKpVt7gSzhwAAlarOc4vMHkK5fvvPi1X2rNr9J1bZs2oS1ngAAAAAMBxTrQAAAGB91Wy3qUsRiQcAAAAAw5F4AAAAwPpqxrJmSyPxAAAAAGA4Gg8AAAAAhmOqFQAAAKyPxeWmI/EAAAAAYDgSDwAAAFgfiYfpSDwAAAAAGI7EAwAAANbnJPEwG4kHAAAAAMOReAAAAMD6WONhOhIPAAAAAIYj8QAAAID1OZ1mj+CSR+IBAAAAwHAkHgAAALA+1niYjsQDAAAAgOFIPAAAAGB9JB6mI/EAAAAAYDgSDwAAAFgfXy43HYkHAAAAAMOReAAAAMDynA6+42E2Eg8AAAAAhqPxAAAAAGA4ploBAADA+thO13QkHgAAAAAMR+IBAAAA62M7XdOReAAAAAAwHIkHAAAArI/tdE1H4gEAAADAcCQeAAAAsD52tTIdiQcAAAAAw5F4AAAAwPpIPExH4gEAAADAcCQeAAAAsD4nu1qZjcYDlnDiZI7uGfK4WoWG6F+vvuS25osdO/Vu8jLt3JWmEydy5O9fW+3CWmlA3zvUq+dNbq/5YfceJSxaov9+852O/ZotP18ftW7ZQnf16qn+d/WSp2fZ0PC7H3ZrwXvJ+vLr75STm6fLGtZXVKeOemRwf7VueWWlvjcAC6tdV7WfmCHnL4f1+9vT3JZ4NAiS9033yKtFO3kENJAz76SKdu+QbcNSKf9kpV1zJu9ufeXTc6AKd6yT7cM3L/oVAVxaaDxQ4+Xnn9Ko8S/ol1+Pq1VoiNuaN99+X6/GJ0iSrmrZQh3at1PWL8f0xY6d2vbfb7T5ix16fnycPDw8XNd8tHqdJk39p+xFRQq54nLddGNnZZ84qW93/aivv/1e6zZu0ZyXn5W3t7frms+3fqkRf39O9qIiXdWyha6LaK+DGT9r+coUrfh0vf7v+fG6rXu0of99ALAAHz/5DRwrz4AGKvrlsNsSz+AW8nt4ojz86qjoyH45fk6X5+Wh8r4+Rl5Xd9Hv/54sZ/bRCl9T5rnNw+TdvX+lvSpQZVjjYToaD9Ro+w4c0rhnX9aPe/aVW/Pt9z9q9vyFquXlpZkvPqOeN93oOrfjm+/0+JPPasnHq9X5ugj1iekhSTqS9Yuenz5b9qIiTRw7XPfdc6erKdmz74AeHTtRn2/9Ugve+48efXiQJCknN09jJ02TvahIk/8+UgP63uF6TvLyT/T8jDma/PIruqFzR9WtU8eI/zoAWIBHo8vl23+kvIJbnKXIQ74DRsnDr44KVr0t+9aVxcc9PeVzxyPyjrxVvnc/pt/feqFi15ypdh359h8pDy/++ADgwrG4HDVSTm6eXo1P0H1/Hqkf9+xTyBWXl1v7wUer5HQ6FXv3HaWaDkm6rsM1GvbQQEnShytTXMc/WrVWvxcU6Obo6zXw3t6lkpDWLa/Uk8P/WnzNqrWu45+u36T8U78pKrJjqaZDkgb0vUOhVzZXTm6ednyz6+JfHIB1+fnLu0esag+bKq/gFnL8eqTcUq9rbpDnZU1VdPinPxoISXI4ZPskQY4Tv8jrynbyvKJ1ha45k2/fR+UR0FBF+7+v0KsCpnA4q+4Ht2g8UCO9k7RMb779vmrXrq2Xnh2nYQ8OLLfWx9tbYa1DFdX5WrfnW15ZPD3rl2PHSx1vF9ZKXbtEur+mRfE1R4/96jp2b+/b9ekHC/XC06PdXuP8X8RbqxZ/UwigLO+oP8nnpnskW4F+X/KaCjcuK7e2VptOkiT799vKnnQUqSjtS0mS1//qLvaaUs/sEqNabTurcNOHNB4ALgp/AkKN1KRxI/3t8Uc06N4+8vevrWUrPi239pkxT5z1Xt/sSpMkNW3S2HVs2EMDXUmIOzt3/VDmGg8PDzUNDipTa7PZ9O93k7X/UIauuDxYna8NP+t4AFyanDnHZfs0UYXb10i2AtXq6H7TC0nybFL8lx/OrINuzzuOHvpf3ZUVusZ1bXAL+dx2v4oO7VbhZ8nyvume83gjoJpxssbDbBfceNhsNqWkpGjLli3at2+fcnJyZLPZ5O/vr4CAAF111VWKjIzUbbfdxt/swjD97+pVKff5OTNL7/1nuSTpT7d1P69r8vLzNe+tREnSHbeWf80nn67Xh6vW6rsfduvEyRx1aN9WLz07rtRidAAoYd/x2XnXegQ0lCQ5co67Pe/Mzf5fXf0KXSNJ8vGV74BRkt2mgg/msEAXwEW7oM5g06ZNmjBhgrKysuQsZy/kL774QomJiWratKmmTp2qG264oVIGClS27BMnNfzvz+m3337XtRFXq/ftt5zzmt8LCjT6mReV9cuvCrnicj14X/l/65e6Zbs+3/ql6z8X2ou0b//Bs65HAYDz4uNX/O+FBW5POwttkiSPkrqLvUaSb++/yvOypvo9+VU5TxyrwKABk7H2wnTn3Xjs3LlTjz76qLy9vXX//fcrOjpaISEhqlevnnx8fGSz2ZSTk6ODBw/q888/15IlS/Too48qMTFR11xzjZHvAFywnzOz9PjYZ7V3/0E1b9ZUs16c4PabHKc7mZOrUeNf0H+/+U4N6tfTnOmT5e9fu9z6sU/8RS+Mj9PRY8e19OM1+ve7SRr19BTNnPIMW+oCqBinQ+e1TPO0jTEu5ppaHW9WrYiuKtzxmYp2bb3gYQLA6c678Xj99dfl7e2tRYsWqW3btm5rGjdurFatWumWW27RgAEDNGjQIM2dO1fz5s2rtAEDFbXjm+/0t4nT9OvxbF3VqoXiZ76oRpc1POs1e9MPaNTTU3TgUIaCmzRW/MwpatXC/TdDSjRuVHzPKy4P1shhD8rH11tz5r+tV+e9ReMBoGIKfpP8A6RaPm5Pe3gXH3fafr/oazwaXS6fOx6W41iGbCsXVuLgAVyqzrvx+Oqrr9S7d+9ym44ztW3bVr1799a6desuenBAZUte/omm/vMN2e12dY2K1D9eGH/Ob2p8tnGrxr8wQ/mnflP7tldpzsuTFdT4sgt+dr/eMZoz/23tP5ShvPx8vuUB4KI5co7Lyz+g+Mvjx34uc75kPYczJ/uir/G5bbA8fPzk+P2UfPv8tVRtyUJ1rxZXy/fe4XLm58i2+p3KeTnAIE7WJ5nuvBuPoqIiBQQEXNDN69atq/z8/AseFGCEGbPn6+33l0qSHrzvHo0d/hd5eXmd9Zq3Fy/V/819U06nU7163qQXJ4yRn6+v29olH6/WFzt26o5bb9ZNN15f5vzpi8qLiviHH4CL58w6KAVfKc+gK+RIL/ttIM+gKyRJjqwDF32Nh2/xVFKvK66SrrjK7Tg8GwbLs2GwHCd+kWg8AJzDeTcerVq10qeffqq4uDj5lvMHr9Pl5eVp1apVatmyZYUGCFSGl1+Zp3eTl6uWl5cmPjnivHbFenvxUs2YM1+S9MRfHtATf77/rPV79h3Qx6vXKfvESbeNx/pNxXvnN2/WVIH1LqyJB4DT2XfvUK0O3VTr6i6yb1td+qSnl7zaFn+DqOjH/170Nb8nTCn3+d7d+8mne38V7lgn24dvVsIbAVWAxeWmO+8PCD788MM6dOiQ7rvvPq1Zs0Z5eXlu63777TetW7dO999/vzIzM3X//Wf/wxpgtE9S1uvd5OItc196dtx5NR07du7SzNf/JUka88Sfz9l0SMVfJ69Vq5Y2bfuv3vlfslLii/9+o+mvxkuShj5434W+AgCUUpT2pRzHM+V1ZTt5R/f544SHh3z+9JA86zdWUfouOQ7vqdA1AFCZzjvx+NOf/qT9+/drzpw5iouLkyQ1bNhQgYGB8vb2VmFhoXJycnT8+HHXVruPPPKI+vXrZ8zIgfNQVFSkWa+/JUmqH1hP6zdtcyUPZ2p0WQONGzFUkjTrjQUqKnLI18dHP+5J11PPz3B7jZenp6ZNelKSFHrlFZr895F6bvqrmj57vpKWr1TLK5vr58ws/bB7ryTpLw8M0L29Yyr7NQFcaorsKljyuvyGPC2f2warVkRXOY79LM+mofJs2ESOk8dUsOyNil8DWEkN/YDgrFmzNG/ePG3fvl316tUrc37lypVKSEjQnj175OXlpWuvvVbDhw9XREREmVqHw6GkpCQtXrxYBw4ckK+vr6KiohQXF6fQ0NAy9QUFBVq4cKGWLVumjIwMBQQEqHv37ho1apSCgsp+NPlcLug7Ho8//rhuv/12JSQkaOvWrTp8+LB+/fVX13kvLy+FhISoS5cuGjBgANvownS796brSNZRSdKJkzlasab8D3Q1b9ZU40YM1cmcXH2183tJUoHNdtZrvLz+aDwk6Z47b9dVLVvorcQP9OXX32rDpm2qF1BXt3SN0v0D7lJU5LWV9GYALnWOwz/pt/kT5HPzvfJseY28LguW8+SvKty2SoUbl8mZd7JSrgFgnmXLlmn+/Pnlnn/jjTf0yiuv6IorrlBsbKxycnK0YsUKff7555o3b566detWqv7ZZ59VcnKywsLCNHjwYGVmZmrVqlVKTU1VYmJiqU2k7Ha7RowYodTUVF133XXq2bOn9u7dq+TkZG3YsEHJyckKDg6+oPfxcJb3JcDzYLfbdeLECdntdvn6+iogIMCwr5UXHttnyH0BwCy2uRPMHgIAVKo6zy0yewjlyn+h6qb/13n2vQpdb7fbNXv2bM2fP981k+jMxGPPnj3q06ePWrdurffff1/+/v6SpB9++EGDBg1SvXr1tGbNGvn5FX8UNDU1VUOHDlXXrl0VHx/v+jP7xo0bNXToUF199dVasmSJ6/6LFi3Sc889p379+mnatGmu40lJSZo0aZJuv/12zZkz54Le67zXeLhTq1YtNWrUSMHBwWrQoIFhTQcAAABwKdiyZYv69Omj+Ph4hYeHq0GDBm7rFi5cKIfDoSeeeMLVdEhSu3bt1L9/f2VlZWnt2rWu4wkJCZKkuLi4Un9m79atm7p3765du3bp66+/LlXv6empMWPGlHpubGyswsLClJKSoqysrAt6two1HgAAAECN4HBU3a8Cli9frqNHj2rs2LFKTEws1VScbsuWLZKk6OiyHyW+8cYbJUmbN2+WVJygbN++XYGBgQoPDy9TX3KPkvojR45o//79CgsLU6NGjdzWOxwObd269YLejYgCAAAAqCb69++v8ePHq379+uXWFBYW6vDhw2rYsKHbBechIcUf+dy3r3ipQkZGhmw2m9q0aSMPD49z1qenp0uSWrRo4fb5zZs3L1V/vmg8AAAAYH1V+B2Pnj17nvX86VOgzhQZGXnO+584cUJOp1OBgYFuz5c0I7m5uZKk7OxsSaq0+pLjJfXni6lWAAAAQA1it9slSd7e3m7P+/j4SCreDvdi6gsLC0sdP1f9+SLxAAAAgPVV4Xc8zpZoVAZfX19JfzQIZ7LZbJLkWh9yofUlO2GVHD9X/fki8QAAAABqkICAAHl5eZU71SknJ0fSH1OoStaLnG/9uaZSnTx5slT9+SLxAAAAgPVV4RoPo3l7e6t58+Y6cOCA8vPzVadOnVLnDx48KElq3bq1JKlZs2by8/NzHT/TmfWtWrUqdfxMhw4dKlV/vkg8AAAAgBqmS5cucjqdrm11T7dp0yZJUufOnSVJnp6eioyMVHZ2ttLS0s5ZHxQUpNDQUKWlpen48eNu6z09PdWpU6cLGjONBwAAACzP6XBU2a8qDBgwQB4eHnr11VdLTYlKS0vTBx98oODgYN16662u47GxsZKk6dOnl1q7sXHjRq1fv14RERHq0KFDqXq73a4ZM2a4vp4uFX+5fPfu3YqJiVFQUNAFjZmpVgAAAEANEx4erkceeUQLFixQnz591KtXL+Xl5enjjz+W3W7XtGnTSu1KFRMTo5iYGK1evVp9+/ZVjx49lJWVpZUrV6pu3bqaMmVKqfsPGTJEa9as0dKlS7Vnzx5FRUUpPT1dKSkpatq0qcaPH3/BY/Zwnt7CVGOFxy7sAyUAUN3Z5k4wewgAUKnqPLfI7CGUK+/pflX2rLovfVBp9+rRo4cyMjK0fft2t4u5k5OTlZiYqL1796pOnToKDw/XiBEjFBERUabWbrcrISFBS5Ys0aFDhxQYGKjIyEiNHDnSta7jdKdOnVJ8fLxWrFihzMxMNW7cWNHR0Ro5cqSaNGlywe9C4wEAJqHxAGA11brxeOreKntW3elLquxZNQlrPAAAAAAYjjUeAAAAsD4LbadbU5F4AAAAADAciQcAAACsz1k129yifCQeAAAAAAxH4gEAAADrY42H6Ug8AAAAABiOxAMAAACW5yTxMB2JBwAAAADDkXgAAADA+kg8TEfiAQAAAMBwJB4AAACwPgff8TAbiQcAAAAAw5F4AAAAwPpY42E6Eg8AAAAAhiPxAAAAgPWReJiOxAMAAACA4Ug8AAAAYHlOJ4mH2Ug8AAAAABiOxgMAAACA4ZhqBQAAAOtjcbnpSDwAAAAAGI7EAwAAANZH4mE6Eg8AAAAAhiPxAAAAgOU5STxMR+IBAAAAwHAkHgAAALA+Eg/TkXgAAAAAMByJBwAAAKzPYfYAQOIBAAAAwHAkHgAAALA8drUyH4kHAAAAAMOReAAAAMD6SDxMR+IBAAAAwHAkHgAAALA+drUyHYkHAAAAAMOReAAAAMDy2NXKfCQeAAAAAAxH4wEAAADAcEy1AgAAgPWxuNx0JB4AAAAADEfiAQAAAMtjcbn5SDwAAAAAGI7EAwAAANbHGg/TkXgAAAAAMByJBwAAACzPSeJhOhIPAAAAAIYj8QAAAID1kXiYjsQDAAAAgOFIPAAAAGB5NWmNx6lTp/Svf/1Ln3zyiTIyMtSgQQNdf/31GjZsmMLCwsrUr1y5UgkJCdqzZ4+8vLx07bXXavjw4YqIiChT63A4lJSUpMWLF+vAgQPy9fVVVFSU4uLiFBoaauh7kXgAAAAA1URubq4GDx6s1157TQUFBbr33nvVtWtXpaamasCAAUpJSSlV/8Ybb2j06NE6duyYYmNjddttt2nbtm0aNGiQNm7cWOb+zz77rCZPnqyioiINHjxY0dHR+vTTT9WvXz+lpaUZ+m4eTqezRnzGsfDYPrOHAACVyjZ3gtlDAIBKVee5RWYPoVzHYm6usmc1Wr3hoq+dPHmyFi9erBtuuEFz585V3bp1JUlZWVm67777lJeXp08++URBQUHas2eP+vTpo9atW+v999+Xv7+/JOmHH37QoEGDVK9ePa1Zs0Z+fn6SpNTUVA0dOlRdu3ZVfHy8atUqnvy0ceNGDR06VFdffbWWLFlSwbcvH4kHAAAAUA0UFRXp448/liRNnTrV1XRIUpMmTTRq1Cjl5ubq3XfflSQtXLhQDodDTzzxhKvpkKR27dqpf//+ysrK0tq1a13HExISJElxcXGupkOSunXrpu7du2vXrl36+uuvDXs/Gg8AAABYntNRdb+Ldfz4ceXl5alp06Zq1qxZmfPt27eXJG3dulWStGXLFklSdHR0mdobb7xRkrR582ZJkt1u1/bt2xUYGKjw8PAy9SX3KKk3Ao0HAAAAUA34+PhIkmw2m9vzubm5kqSDBw+qsLBQhw8fVsOGDVWvXr0ytSEhIZKkffuKlytkZGTIZrMpJCREHh4e56w3ArtaAQAAwPKqclernj17nvX86dOfThcYGKgWLVpo//792rp1q6KiokqdX7VqlSQpLy9PJ06ckNPpVGBgoNt7lTQjJc1Kdna26xnnU28EEg8AAACgmnj88cclSWPGjNGKFSt08uRJZWVlae7cuUpOTpa3t7ccDofsdrskydvb2+19StKTgoICSbrgeiOQeAAAAMDyqjLxWPuZ+0TjfNx999365Zdf9Oqrr2rMmDGu4/Xr19esWbP01FNPyeFwyNfXV5JUWFjo9j4l07VKFp1faL0RaDwAAACAamTo0KG66667tGHDBmVnZ6tZs2bq3r27PD09lZubqxYtWiggIEBeXl7lTo3KycmR9McUqvr160sqfyrVmfVGoPEAAAAAqpkmTZooNja21LFt27bJ6XSqTZs28vb2VvPmzXXgwAHl5+erTp06pWoPHjwoSWrdurUkqVmzZvLz83MdP9OZ9UZgjQcAAACsz+lRdb8KeOqppxQZGanMzMwy5z766CNJ0i233CJJ6tKli5xOp2tb3dNt2rRJktS5c2dJkqenpyIjI5Wdne32C+Vn1huBxgMAAACoJsLCwpSbm6uFCxeWOr5hwwYtXbpUoaGh6t27tyRpwIAB8vDw0KuvvlpqClVaWpo++OADBQcH69Zbb3UdL0lQpk+fXmrL3o0bN2r9+vWKiIhQhw4dDHs3ploBAADA8qpycXlFPPDAA/rwww+1YMEC7d69W+3atVN6errWrVun+vXr65VXXnF9dTw8PFyPPPKIFixYoD59+qhXr17Ky8vTxx9/LLvdrmnTprl2q5KkmJgYxcTEaPXq1erbt6969OihrKwsrVy5UnXr1tWUKVMMfTcPp9PpNPQJlaTwmHEfMwEAM9jmTjB7CABQqeo8t8jsIZQr86buVfas4NT1Fbo+JydHb7zxhtatW6cjR46oSZMm6tatm4YOHaqmTZuWqU9OTlZiYqL27t2rOnXqKDw8XCNGjFBERESZWrvdroSEBC1ZskSHDh1SYGCgIiMjNXLkSLVq1apC4z4XGg8AMAmNBwCrqc6Nx5Gut1TZs5p+/lmVPasmYY0HAAAAAMOxxgMAAACWV1PWeFgZiQcAAAAAw5F4AAAAwPKcFfy+BiqOxAMAAACA4Ug8AAAAYHms8TAfiQcAAAAAw5F4AAAAwPKcDtZ4mI3EAwAAAIDhSDwAAABgeU6n2SMAiQcAAAAAw5F4AAAAwPJY42E+Eg8AAAAAhqPxAAAAAGA4ploBAADA8phqZT4SDwAAAACGI/EAAACA5bGdrvlIPAAAAAAYjsQDAAAAlscaD/OReAAAAAAwHIkHAAAALM/pJPEwG4kHAAAAAMOReAAAAMDynA6zRwASDwAAAACGI/EAAACA5TlY42E6Eg8AAAAAhiPxAAAAgOWxq5X5SDwAAAAAGI7EAwAAAJbHl8vNR+IBAAAAwHAkHgAAALA8p9PsEYDEAwAAAIDhSDwAAABgeazxMB+JBwAAAADD0XgAAAAAMBxTrQAAAGB5Dj4gaDoSDwAAAACGI/EAAACA5TlJPExH4gEAAADAcCQeAAAAsDw+IGg+Eg8AAAAAhiPxAAAAgOWxq5X5SDwAAAAAGI7EAwAAAJbHrlbmI/EAAAAAYDgSDwAAAFgeu1qZj8QDAAAAgOFIPAAAAGB57GplPhIPAAAAAIarMYlH7cu7mT0EAKhU+V8uMHsIAHDJYFcr89WYxgMAAAC4FBQVFemdd97RBx98oP3796tWrVpq3769/vznP6tHjx6lah0Oh5KSkrR48WIdOHBAvr6+ioqKUlxcnEJDQ8vcu6CgQAsXLtSyZcuUkZGhgIAAde/eXaNGjVJQUJCh7+XhdNaMNf61fJqZPQQAqFQkHgCsxjcixuwhlGvb5fdW2bO6/LykQtf/7W9/0yeffKKmTZvq1ltv1e+//64VK1bo1KlTmjBhgh588EFX7cSJE5WcnKywsDDddNNNyszM1KpVq+Tr66vExES1bdvWVWu32/X4448rNTVV1113nSIjI7V3716tXbtWQUFBSk5OVnBwcIXGfjY0HgBgEhoPAFZD41GsIo3Htm3b9OCDD6ply5ZKTk5W3bp1JUl79+5V//79VVRUpA0bNqhBgwZKTU3V0KFD1bVrV8XHx6tWreLJTBs3btTQoUN19dVXa8mSP8ayaNEiPffcc+rXr5+mTZvmOp6UlKRJkybp9ttv15w5cy567OfC4nIAAACgmvjmm28kSXfeeaer6ZCkVq1aKSoqSgUFBdq1a5ckKSEhQZIUFxfnajokqVu3burevbt27dqlr7/+2nU8ISFBnp6eGjNmTKlnxsbGKiwsTCkpKcrKyjLozWg8AAAAcAlwVuGvIho0aCBJysjIKHOupClo2LCh7Ha7tm/frsDAQIWHh5epjY6OliRt3rxZknTkyBHt379fYWFhatSokdt6h8OhrVu3VvANykfjAQAAAFQTMTExCgoK0vLly/Xee+/p5MmT+uWXXzRt2jTt2rVL3bp109VXX62MjAzZbDaFhITIw6Psjl0hISGSpH379kmS0tPTJUktWrRw+9zmzZuXqjcCu1oBAADA8qryA4I9e/Y86/m1a9eWe65evXpavHixJk6cqBdeeEEvvPCC69x9992nCRMmSJKys7MlSYGBgeXeR5Jyc3PPq77keEm9EWg8AAAAgGrCZrPptdde07Zt23TVVVcpKipKp06d0vr167VkyRI1atRIo0aNkt1ulyR5e3u7vY+Pj4+k4u1zJamwsLDU8XPVG4HGAwAAAJZXlR8QPFuicS7Tp0/XBx98oH79+umFF15wLRrPzs7WX/7yF7322mtq1qyZwsLCJP3RUJzJZrNJkvz9/SVJfn5+pY6fq94IrPEAAAAAqgGHw6Hk5GT5+Pho4sSJpXaqatCggSZOnChJev/991W/fn1J5U+NysnJkfTHlKtzTaU6efJkqXojkHgAAADA8hxmD+A8/PrrryooKFCLFi3cJg9t2rSRJP38889q1qyZ/Pz8dPDgQbf3KjneunVrScXb8Z5+/EyHDh0qVW8EEg8AAACgGggMDJSPj48yMzOVn59f5nzJzlRBQUHy9PRUZGSksrOzlZaWVqZ206ZNkqTOnTu7rgkNDVVaWpqOHz/utt7T01OdOnWqzFcqhcYDAAAAlueUR5X9LpaPj49uv/12/f7775o+fbocjj9ymvz8fL388suSpLvuuktS8Yf/pOJ1Iaev3di4caPWr1+viIgIdejQwXU8NjZWdrtdM2bMkNP5xxdHkpKStHv3btdWvkbxcJ7+1Gqslk8zs4cAAJUq/8sFZg8BACqVb0SM2UMoV2rwgCp71k2ZyRd97fHjx3X//fdr3759CgsLU3R0tE6dOqUNGzYoMzNTPXr00Jw5c1zrP0aNGqXVq1erZcuW6tGjh7KysrRy5UrVrl1b7777rtq2beu6d2FhoYYMGaKvvvpK4eHhioqKUnp6ulJSUtS0aVMtXrxYwcHBFX7/8tB4AIBJaDwAWE11bjzWN6m6xqN71sU3HpKUl5enf//731q9erUOHTokLy8vXXXVVbr33nt13333ydPzj0lLdrtdCQkJWrJkiQ4dOqTAwEBFRkZq5MiRrnUdpzt16pTi4+O1YsUKZWZmqnHjxoqOjtbIkSPVpEmTCo37XGg8AMAkNB4ArIbGo1hFGw+rYlcrAAAAWJ6jAmsvUDlYXA4AAADAcCQeAAAAsLyK7DaFykHiAQAAAMBwJB4AAACwvJrw5XKrI/EAAAAAYDgSDwAAAFgeazzMR+IBAAAAwHA0HgAAAAAMx1QrAAAAWB6Ly81H4gEAAADAcCQeAAAAsDwSD/OReAAAAAAwHIkHAAAALI/tdM1H4gEAAADAcCQeAAAAsDwHgYfpSDwAAAAAGI7EAwAAAJbnYI2H6Ug8AAAAABiOxAMAAACW5zR7ACDxAAAAAGA8Eg8AAABYHl8uNx+JBwAAAADDkXgAAADA8hwe7GplNhIPAAAAAIYj8QAAAIDlsauV+Ug8AAAAABiOxgMAAACA4ZhqBQAAAMtjO13zkXgAAAAAMByJBwAAACzPwW66piPxAAAAAGA4Eg8AAABYnkNEHmYj8QAAAABgOBIPAAAAWB4fEDQfiQcAAAAAw5F4AAAAwPLY1cp8JB4AAAAADEfiAQAAAMvjy+XmI/EAAAAAYDgSDwAAAFgeu1qZj8QDAAAAgOFIPAAAAGB57GplPhIPAAAAAIYj8QAAAIDlsauV+Ug8AAAAABiOxAMAAACWR+JhPhIPAAAAAIaj8QAAAABgOKZaAQAAwPKcNWA73TZt2pyzplmzZlq3bp3rPzscDiUlJWnx4sU6cOCAfH19FRUVpbi4OIWGhpa5vqCgQAsXLtSyZcuUkZGhgIAAde/eXaNGjVJQUFClvs+ZaDwAAACAamDEiBHlnvvwww918OBB3XDDDaWOP/vss0pOTlZYWJgGDx6szMxMrVq1SqmpqUpMTFTbtm1dtXa7XSNGjFBqaqquu+469ezZU3v37lVycrI2bNig5ORkBQcHG/Z+NB4AAACwvJqwuHzkyJFuj6empuq1115TeHi4Jk+eXOp4cnKyunbtqvj4eNWqVfxH+7vvvltDhw7VM888oyVLlrjqk5OTlZqaqn79+mnatGmu40lJSZo0aZKmTp2qOXPmGPR2rPEAAAAAqq2TJ0/qqaeekq+vr2bOnCkfHx/XuYSEBElSXFycq+mQpG7duql79+7atWuXvv7661L1np6eGjNmTKlnxMbGKiwsTCkpKcrKyjLsXWg8AAAAYHmOKvxVptmzZ+v48eMaPny4rrzyStdxu92u7du3KzAwUOHh4WWui46OliRt3rxZknTkyBHt379fYWFhatSokdt6h8OhrVu3VvIb/IHGAwAAAKiG9u7dq0WLFqlZs2Z6+OGHS53LyMiQzWZTSEiIPDzKrpwPCQmRJO3bt0+SlJ6eLklq0aKF22c1b968VL0RWOMBAAAAy3NW4bN69ux51vNr1649r/v861//UlFRkR599NFSU6wkKTs7W5IUGBjo9tp69epJknJzc8+rvuR4Sb0RSDwAAACAaiYrK0sfffSRgoODdc8995Q5b7fbJUne3t5ury9pVAoKCiRJhYWFpY6fq94IJB4AAACwPEcVfsfjfBONs1m+fLkKCwsVGxvrtlnw9fWV9EdDcSabzSZJ8vf3lyT5+fmVOn6ueiOQeAAAAADVzOrVqyVJvXv3dnu+fv36ksqfGpWTkyPpjylX55pKdfLkyVL1RiDxAAAAgOXVhO94lMjKytJ3332na665ptROVqdr1qyZ/Pz8dPDgQbfnS463bt1aktSqVatSx8906NChUvVGIPEAAAAAqpH//ve/kqQuXbqUW+Pp6anIyEhlZ2crLS2tzPlNmzZJkjp37ixJCgoKUmhoqNLS0nT8+HG39Z6enurUqVNlvIL7MRt2ZwAAAKCaqEnf8fj2228lSREREWeti42NlSRNnz691NqNjRs3av369YqIiFCHDh1K1dvtds2YMUNO5x/7fCUlJWn37t2KiYlRUFBQJbyBe0y1AgAAAKqRAwcOSJKCg4PPWhcTE6OYmBitXr1affv2VY8ePZSVlaWVK1eqbt26mjJlSqn6IUOGaM2aNVq6dKn27NmjqKgopaenKyUlRU2bNtX48eMNeyeJxAMAAACXAGcV/iqqZCpUQEDAOWv/+c9/aty4cfLw8NDbb7+trVu36rbbbtP777+vtm3blqr19vbWggUL9Nhjj+nEiRNKSEjQ999/rwEDBuj9998/Z6NTUR7O03OWaqyWTzOzhwAAlSr/ywVmDwEAKpVvRIzZQyjXP0IeqLJnPXnw3Sp7Vk3CVCsAAABYXlV+xwPuMdUKAAAAgOFoPAAAAAAYjqlWAAAAsLya9AFBqyLxAAAAAGA4Eg8AAABYXo3YxtXiSDwAAAAAGI7EAwAAAJbnIPMwHYkHAAAAAMOReAAAAMDy2NXKfCQeAAAAAAxH4gEAAADLY4WH+Ug8AAAAABiOxAMAAACWxxoP85F4AAAAADAciQcAAAAsz+Fh9ghA4gEAAADAcCQeAAAAsDy+XG4+Eg8AAAAAhiPxAAAAgOWRd5iPxAMAAACA4Ug8AAAAYHl8x8N8JB4AAAAADEfjAQAAAMBwTLUCAACA5bGdrvlIPAAAAAAYjsQDAAAAlkfeYT4SDwAAAACGI/EAAACA5bGdrvlIPAAAAAAYjsQDAAAAlseuVuYj8QAAAABgOBIPAAAAWB55h/lIPAAAAAAYjsQDAAAAlseuVuYj8QAAAABgOBIPAAAAWJ6TVR6mI/EAAAAAYDgSDwAAAFgeazzMR+IBAAAAwHAkHgAAALA8vlxuPhIPAAAAAIaj8QAAAABgOBoPWN74p0bKbstQ/Lz/c3s+NDREb86fqd1pm5WXs1d7f9qmV195UUFBjcq958VcAwAX6kRuvnoOm6ihL8w9a53T6dRjL76ua+8bfdY6e1GRFq/eqAee+adufPDvihw8RveOeUlvLV+rwkJ7pV0DVEfOKvzBPRoPWNqNN0Rq8rNjyz3fsWN7bd+2So88PFAnc3L18YoUFRUVafgTj2jHl5+qZcsrK+UaALhQ+b/9rrgZb+qX7Jxz1s5IWKLN36Sdtea3Apsee/ENTftXsnYf/FnXtm2p69q20uGsY5r17nKNmblADoejwtcAQHlYXA7LatCgvt5953V5e3u7Pe/p6alF78Wrfv1AjRk7WbPn/EuS5OXlpdmvTtWjw4bo32/+U7f07FehawDgQqVnZOnvsxL044GMs9bl5v+mF+IXa/WWr855z9mJH+mL73br6pbNNXf8o2rUoJ4k6XDWMf31+bna8N/vtPSzrerX88YKXQNUVywuNx+JByzrX2/OVLNmwdqwYbPb87Gxd+mqq0K1bdsOVwMhSUVFRYobPVH79x9St25R6nL9dRW6BgDOV07+Kc1O/Fj3PfV/+vFAhkKCG7utsxcVacnaLbp37EtaveWrcutK/HoyV++v3ih/P1+9Mu6vrgZCkq5o0kgjBt6poAaB+mHf4QpdAwBnQ+MBSxox/M/qe1cv/d8/XteG1C1ua/r0vl2S9MGSj8ucs9vtWv7h6uK6PrdX6BoAOF/vrlivfy1dI38/X00bOURD73X/z5Kv0vbpuXmLdPxkrv56z+2aM37YWe/76davZS9y6M5ukQpu1KDM+d43dVbK/CmaODS2QtcA1ZmjCn9wj6lWsJyOHdtr+ssTtXXrfzX5uf/ThGfi3NaFh7eTJH377Q9uz+/aVTxfOiL86gpdAwDnq8ll9TX6/j4aGHOT/Gv7avln29zW1fb10cCYbnqkb081bdxQGUd/Pet9d+05KEnq0CZUDodDqTt26ctde5T32++6smmQ7ujaSU0uq1/hawDgbGg8YCl16vgr8b15+u2333X/kCdUVFRUbm2zy4MlSYczjrg9f+RIliQpuGlQha4BgPN1vmslrml9pa5pff4bWRw4clSS5OXpoQcmzNJ3ew6UOv9G0iea/Ngg3dktskLXANWZkzUepqPxgKW8/trLCruqpQbd/7gOHDj7vOO6detIkk6d+s3t+d9++71U3cVeAwBmyz1V/M+ml/79gfx8vPWPMY8oKryNcvJPKWnNJi38aJ0mzn1XwY0aqFO7Vhd9DYDKs337dr355pv6+uuvVVhYqObNm+vee+/V4MGD5ePj46pzOBxKSkrS4sWLdeDAAfn6+ioqKkpxcXEKDQ0tc9+CggItXLhQy5YtU0ZGhgICAtS9e3eNGjVKQUHG/sUpazxgGQ89GKv7B/fTgrcWKTn5w3PWny0NOZ2nh0eFrgEAs9lshZKkU78X6PUJj+v2G65Vvbr+uqJJI40Z0lcDY7qpyOHQa4tXVOgaoDqrSWs8kpKSNGTIEO3YsUO33367+vfvr99++00vvfSS/v73v8vp/CO9efbZZzV58mQVFRVp8ODBio6O1qeffqp+/fopLa30Ntt2u10jRozQzJkzFRgYqAcffFARERFKTk5Wv379lJmZWQmjLx+NByyhbdvWmv3qVKX9uEej/zbpvK7Jzc2XJNWu7ef2fMnxvPxTFboGAMxW26/4b0ejItoo7MrLy5wf2KubpOJF6wX/azgu5hoAFbdv3z5NmTJFTZs21bJly/Tiiy9qwoQJ+vjjj9WxY0etXLlSW7YUb5yTmpqq5ORkde3aVUuXLtW4ceM0c+ZMzZs3T6dOndIzzzxT6t7JyclKTU1Vv379tGjRIo0dO1avv/66pkyZoqNHj2rq1KmGvtsFTbXKy8u76AfVrVv3oq8FzuXllyaqTh1/nTyRozden17qXMmC8JtvukELE2br2C/HNXbcczqccUSXXdZATYObKC1tT5l7Xv6/9Rw/Z/zR/V/MNQBgtob1AiRJVwRd5vZ8yfEih0M5+afU2Cfwoq4BqrOassbj7bffls1m04QJE3TFFVe4jvv6+upvf/ubPvzwQ9ntdklSQkKCJCkuLk61av3xx/pu3bqpe/fu+uyzz/T111+rY8eOrnpPT0+NGTOm1DNjY2P1zjvvKCUlRVlZWWrSpIkh73ZBjUdkZKQ8LmIKiYeHh77//vsLvg44XwH/W1PRpct16tLF/Tc0WrcOVevWodq//5DGjntO3377gzpEXK327dvos/WbytS3b99GkrTz2z/+t3sx1wCA2cJaNNPWb3/U0eMn3Z4/dqL46+ieHh6qH1D3oq8BUHHr1q1zrbs4U1RUlKKioiQVT5vavn27AgMDFR4eXqY2Ojpan332mTZv3qyOHTvqyJEj2r9/v9q2batGjRq5rd+9e7e2bt2qvn37Vvp7SRc41erRRx+Vh4eHnE6n6tevr6ZNm57XLzg42JDBAyV63jZAtXyauf29MGWmJOnfCxJVy6eZWocV/x/sxys+lST1u/fOMverVauW7uoTI0n66KM1ruMXcw0AmK175DWSpM070/Trydwy5zfs2CVJurZtS3nX8rroa4DqrCas8cjOzlZWVpZatWqlnJwcTZkyRTfffLPCw8N1xx13KCEhQQ5H8RMyMjJks9kUEhLiNhgICQmRVDx1S5LS09MlSS1atHD77ObNm5eqN8IFJR5/+9vfFBoaqqefflohISFKTEyUlxf/sEHN9OGHq7VnT7q6dYvSuCef0P/943VJkqenp16ZNUUtWjTXZ59t0rYvdlToGgAwW+TVrXVt25b6Km2fnnplof755J9Vr46/JOmb3emuBeIP3dWjQtcAKNazZ8+znl+7dq3b41lZxdvy22w29e/fX4WFhbrlllvkdDq1bt06vfTSS/r22281c+ZMZWdnS5ICA91Pc6xXr54kKTe3+C8OzlVfcryk3ggXvJ3u3XffrX379unNN9/UW2+9pb/+9a9GjAswnM1m08OPxGnlJ4l6adoEDR58r378ca+u7XiNWrVqoYMHM/Tnv46u8DUAUB1MH/2Qhr3wmr74brd6Pf6cOl3dWjl5p/Ttnv2yFzn0SN+e6h4ZXuFrgOrK4az+azzy84s3sfn+++91zTXXaMGCBa6GYPTo0br//vv18ccfq2fPnq6tb729vd3eq2TL3YKCAklSYWFhqePnqjfCRX3HIy4uTp9++qni4+MVGxvr6qiAmmbrtv+qyw13aMIzcerZo5uuah2qQ4eOaM7cf+vl6XOUlfVLpVwDAGYLvqyBFr88Tu9+sl6rNu3Qtm9/lI+3t65r11r333GTbukcUSnXACg/0TiX02cSPfPMM6XSicsuu0yjR49WXFycPvzwQw0fPlzSHw3FmWw2myTJ3784qfTz8yt1/Fz1RrioxsPLy0uTJ0/W8uXL9dNPP6lTp06VPS6g0rww5Z96Yco/yz2/e/dePfTwqAu658VcAwAXqu8tXdT3li7nrGsWdJl2Js8+Z51/bV8N6xejYf1iznsMF3MNUB1V/7xDCggo3k3Ow8PD7YLxa64pXnt14MAB1a9fX1L5U6Nycoo3gCgJCM41lerkyZOl6o1w0V8uP31VPQAAAICKad68uby9vVVYWKjCwsIy06JKttGtXbu2mjVrJj8/Px08eNDtvUqOt27dWpLUqlWrUsfPdOjQoVL1RuADggAAALA8h5xV9rtYPj4+uvbaayVJn3/+eZnz33zzjSSpXbt28vT0VGRkpLKzs8t8oVySNm0q3va/c+fOkqSgoCCFhoYqLS1Nx48fd1vv6elp6EwmGg8AAACgmnjwwQclSTNnztSxY8dcx3/55RfNnTtXHh4eio2NlSTXv0+fPr3U2o2NGzdq/fr1ioiIUIcOHVzHY2NjZbfbNWPGDDlPW2yflJSk3bt3KyYmxrVo3QgXPdUKAAAAQOW67bbbNGTIEL3zzju688471atXL0lSSkqKjh07pieeeMLVTMTExCgmJkarV69W37591aNHD2VlZWnlypWqW7eupkyZUureQ4YM0Zo1a7R06VLt2bNHUVFRSk9PV0pKipo2barx48cb+m4eTmcN2FtMUi2fZmYPAQAqVf6XC8weAgBUKt+I6rsJwaAr766yZy06sKzC9/jkk0/03nvv6fvvv5eHh4fatGmjhx56yNWIlLDb7UpISNCSJUt06NAhBQYGKjIyUiNHjnSt6zjdqVOnFB8frxUrVigzM1ONGzdWdHS0Ro4cqSZNmlR43GdD4wEAJqHxAGA1NB7FKqPxsCKmWgEAAMDyHGYPACwuBwAAAGA8Eg8AAABYXkW2uUXlIPEAAAAAYDgSDwAAAFiek8TDdCQeAAAAAAxH4gEAAADLY1cr85F4AAAAADAciQcAAAAsr4Z8M9vSSDwAAAAAGI7EAwAAAJbHdzzMR+IBAAAAwHAkHgAAALA8drUyH4kHAAAAAMOReAAAAMDy+HK5+Ug8AAAAABiOxgMAAACA4ZhqBQAAAMtjO13zkXgAAAAAMByJBwAAACzP6STxMBuJBwAAAADDkXgAAADA8viAoPlIPAAAAAAYjsQDAAAAlscHBM1H4gEAAADAcCQeAAAAsDy+42E+Eg8AAAAAhiPxAAAAgOXxHQ/zkXgAAAAAMByJBwAAACyPNR7mI/EAAAAAYDgSDwAAAFge3/EwH4kHAAAAAMOReAAAAMDyHOxqZToSDwAAAACGI/EAAACA5ZF3mI/EAwAAAIDhaDwAAAAAGI6pVgAAALA8PiBoPhIPAAAAAIYj8QAAAIDlkXiYj8QDAAAAgOFIPAAAAGB5Tj4gaDoSDwAAAACGI/EAAACA5bHGw3wkHgAAAAAMR+IBAAAAy3OSeJiOxAMAAACA4Ug8AAAAYHnsamU+Gg8AAACgGnnnnXf04osvlnv+vffeU2RkpCSpoKBACxcu1LJly5SRkaGAgAB1795do0aNUlBQUJlrc3JyNH/+fK1Zs0aZmZm67LLLFBMTo+HDhysgIMCwd5JoPAAAAHAJqEm7Wn3//feSpIceeshtM3D55ZdLkux2u0aMGKHU1FRdd9116tmzp/bu3avk5GRt2LBBycnJCg4Odl2Xl5enhx9+WLt27VK3bt0UExOjnTt36q233tLnn3+uxYsXq27duoa9F40HAAAAUI388MMP8vX11VNPPSUvL69y65KTk5Wamqp+/fpp2rRpruNJSUmaNGmSpk6dqjlz5riOz5s3T7t27dLIkSM1YsQI1/FZs2Zp3rx5mjt3rsaPH2/MS4nF5QAAALgEOJ3OKvtVhM1m0549exQWFnbWpkOSEhIS5OnpqTFjxpQ6Hhsbq7CwMKWkpCgrK8t138TERAUGBmrYsGGl6ocPH64GDRroP//5j2w2W4XGfzY0HgAAAEA18dNPP6mwsFDt2rU7a92RI0e0f/9+hYWFqVGjRmXOR0dHy+FwaOvWrZKknTt3Kj8/X5GRkfLx8SlV6+Pjo86dOys3N1c7d+6svJc5A40HAAAALM8hZ5X9KqJkfYeHh4fGjBmjm266SREREbrrrrv03nvvyeFwSJLS09MlSS1atHB7n+bNm0uS9u3bd0H1JXVGYI0HAAAAUIl69ux51vNr164t99wPP/wgSXr//fd1/fXXq3fv3jp27Jg2bNigF154Qdu3b9esWbOUnZ0tSQoMDHR7n5Ljubm5kuSqr1+//lnrc3Jyzjr2iqDxAAAAAKoJDw8PXX755YqLi9Pdd9/tOn7s2DE9/PDDWrlypW688UbXdKkzp02VKDleUFAgSSosLJQkeXt7n1e9EWg8AAAAYHnOKtxO92yJxrlMmjRJkyZNKnO8UaNGGj9+vP7yl79o6dKleuihhySp3MXgJcf9/f0lSX5+fpL+aEDOVW8E1ngAAAAANUCHDh0kSQcPHiwzlepMJ0+elCTVq1dP0rmnUp1ZbwQSDwAAAFieo4Lb3FaFwsJC/fDDDyooKFDnzp3LnD916pQkydfXV61atZJU3IS4c+jQIUlS69atJemC641A4wEAAABUA4WFhRo4cKCcTqc2bdqkhg0bljr/xRdfSJI6duyooKAghYaGKi0tTcePHy9Tu2nTJnl6eqpTp06SpPbt2ysgIEBffvmlCgsLS631sNls+uKLL1SnTh1dffXVhr0fU60AAABgec4q/NfF8vf316233iqHw6GXX37ZtXWuVJxU/OMf/5Cnp6cefvhhScUfCrTb7ZoxY0apDxcmJSVp9+7diomJUVBQkKTixeN9+/bVr7/+qjfeeKPUc1977TWdOHFCgwYNUq1axuUSHs6Kfl6xitTyaWb2EACgUuV/ucDsIQBApfKNiDF7COVq36RLlT1rV9a2i742MzNTgwcPVkZGhtq2basbbrhBx44d09q1a3Xq1Ck9/fTTrsajsLBQQ4YM0VdffaXw8HBFRUUpPT1dKSkpatq0qRYvXqzg4GDXvU+ePKnY2Fjt379fN9xwg8LDw7Vz505t3bpV7dq107vvvqu6detW9PXLReMBACah8QBgNdW58WgXdH2VPeuHo19U6PoTJ05o3rx5SklJUWZmpvz9/RUREaG//OUvuuGGG0rVnjp1SvHx8VqxYoUyMzPVuHFjRUdHa+TIkWrSpEmZex8/flxz587V2rVr9euvvyo4OFi33XabHnvssXK/CVJZaDwAwCQ0HgCshsajWEUbD6ticTkAAAAsryq/4wH3WFwOAAAAwHAkHgAAALC8mvAdD6sj8QAAAABgOBIPAAAAWB5rPMxH4gEAAADAcCQeAAAAsDzWeJiPxAMAAACA4Ug8AAAAYHms8TAfiQcAAAAAw5F4AAAAwPKcTofZQ7jkkXgAAAAAMByNBwAAAADDMdUKAAAAludgcbnpSDwAAAAAGI7EAwAAAJbn5AOCpiPxAAAAAGA4Eg8AAABYHms8zEfiAQAAAMBwJB4AAACwPNZ4mI/EAwAAAIDhSDwAAABgeQ4SD9OReAAAAAAwHIkHAAAALM/JrlamI/EAAAAAYDgSDwAAAFgeu1qZj8QDAAAAgOFIPAAAAGB5fLncfCQeAAAAAAxH4gEAAADLY42H+Ug8AAAAABiOxgMAAACA4ZhqBQAAAMtzMNXKdCQeAAAAAAxH4gEAAADLY3G5+Ug8AAAAABiOxAMAAACWxwcEzUfiAQAAAMBwJB4AAACwPNZ4mI/EAwAAAIDhSDwAAABgeXzHw3wkHgAAAAAMR+IBAAAAy3Oyq5XpSDwAAAAAGI7EAwAAAJbHGg/zkXgAAAAAMByJBwAAACyP73iYj8QDAAAAgOFIPAAAAGB57GplPhIPAAAAoJrat2+fOnbsqL59+5Y553A4tHjxYt1999269tprFRUVpdGjRys9Pd3tvQoKCjR//nzdcccd6tChg7p27aqJEyfq6NGjRr+GJBoPAAAAXAKcTmeV/SqL3W7XuHHj9Ntvv7k9/+yzz2ry5MkqKirS4MGDFR0drU8//VT9+vVTWlpamXuNGDFCM2fOVGBgoB588EFFREQoOTlZ/fr1U2ZmZqWNuzxMtQIAAACqoblz5+q7775zey41NVXJycnq2rWr4uPjVatW8R/r7777bg0dOlTPPPOMlixZ4qpPTk5Wamqq+vXrp2nTprmOJyUladKkSZo6darmzJlj6PuQeAAAAADVzFdffaX58+fr1ltvdXs+ISFBkhQXF+dqOiSpW7du6t69u3bt2qWvv/66VL2np6fGjBlT6j6xsbEKCwtTSkqKsrKyKv09TkfjAQAAAMurSVOt8vPz9fe//11XXnllmUZBKp42tX37dgUGBio8PLzM+ejoaEnS5s2bJUlHjhzR/v37FRYWpkaNGrmtdzgc2rp1a4XHfjZMtQIAAACqkZdeekk///yzFi9eLF9f3zLnMzIyZLPZ1KZNG3l4eJQ5HxISIql4Ybok12LzFi1auH1e8+bNS9UbhcQDAAAAlueswl9FrF27VsnJyXrsscfcphmSlJ2dLUkKDAx0e75evXqSpNzc3POqLzleUm8UEg8AAACgEvXs2fOs59euXev2+LFjxzRx4kRdc801evzxx8u93m63S5K8vb3dnvfx8ZFUvH2uJBUWFpY6fq56o9SYxsNuyzB7CAAAAKihqvLPkudqPMozceJE5efna8aMGaUWjJ+pZPpVSUNxJpvNJkny9/eXJPn5+ZU6fq56o9SYxgMAAACoCcpLNM5m8eLF+uyzz/T000+rVatWZ62tX7++pPKnRuXk5Ej6Y8rVuaZSnTx5slS9UWg8AAAAAJOtWLFCUvHC8pdeeqnM+bS0NLVp00bNmjVTSkqK/Pz8dPDgQbf3KjneunVrSXI1MuXVHzp0qFS9UWg8AAAAAJPdc889uv7668scz8nJ0dtvv61GjRpp4MCBCggIkKenpyIjI/X5558rLS1Nbdu2LXXNpk2bJEmdO3eWJAUFBSk0NFRpaWk6fvy4GjZsWKbe09NTnTp1MujtitF4AAAAACa799573R4/fPiwq/EYOXKk63hsbKw+//xzTZ8+XfHx8a4F4hs3btT69esVERGhDh06lKqfPn26ZsyYoZdeesm1DW9SUpJ2796tP/3pTwoKCjLwDWk8AAAAgBonJiZGMTExWr16tfr27asePXooKytLK1euVN26dTVlypRS9UOGDNGaNWu0dOlS7dmzR1FRUUpPT1dKSoqaNm2q8ePHGz5mD2dlfF4RAAAAQKU7fPiwevbsqbZt22r58uWlztntdiUkJGjJkiU6dOiQAgMDFRkZqZEjR7pdoH7q1CnFx8drxYoVyszMVOPGjRUdHa2RI0eqSZMmhr8LjQcAAAAAw/HlcgAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EA/mflypW677771KlTJ11//fV69NFHtXPnTrOHBQCVYtasWWrTpo1ycnLMHgqASxSNByDpjTfe0OjRo3Xs2DHFxsbqtttu07Zt2zRo0CBt3LjR7OEBQIUsW7ZM8+fPN3sYAC5xfMcDl7w9e/aoT58+at26td5//335+/tLkn744QcNGjRI9erV05o1a+Tn52fySAHgwtjtds2ePVvz589Xyf+73759u+rVq2fyyABcikg8cMlbuHChHA6HnnjiCVfTIUnt2rVT//79lZWVpbVr15o4QgC4cFu2bFGfPn0UHx+v8PBwNWjQwOwhAbjE0XjgkrdlyxZJUnR0dJlzN954oyRp8+bNVTomAKio5cuX6+jRoxo7dqwSExNL/cUKAJihltkDAMxUWFiow4cPq2HDhm6nHoSEhEiS9u3bV9VDA4AK6d+/v8aPH6/69eubPRQAkETjgUvciRMn5HQ6FRgY6PZ8STOSm5tblcMCgAqLjIw0ewgAUApTrXBJs9vtkiRvb2+35318fCRJBQUFVTYmAAAAK6LxwCXN19dXUvGUK3dsNpskMTcaAACggmg8cEkLCAiQl5dXuVOpSj60xdaTAAAAFUPjgUuat7e3mjdvrl9//VX5+fllzh88eFCS1Lp166oeGgAAgKXQeOCS16VLFzmdTte2uqfbtGmTJKlz585VPSwAAABLofHAJW/AgAHy8PDQq6++WmrKVVpamj744AMFBwfr1ltvNXGEAAAANR/b6eKSFx4erkceeUQLFixQnz591KtXL+Xl5enjjz+W3W7XtGnTXLtbAQAA4OLQeACSnnrqKbVs2VKJiYlKTExUnTp1dP3112vEiBGKiIgwe3gAAAA1nofT6XSaPQgAAAAA1sYaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACGo/EAAAAAYDgaDwAAAACG+3+5GlLWwOZVzQAAAABJRU5ErkJggg==", |
| 328 | + "text/plain": [ |
| 329 | + "<Figure size 1000x700 with 2 Axes>" |
| 330 | + ] |
| 331 | + }, |
| 332 | + "metadata": {}, |
| 333 | + "output_type": "display_data" |
| 334 | + } |
| 335 | + ], |
| 336 | + "source": [ |
| 337 | + "accuracy, precision, recall, f1 = mt.evaluate_model()" |
| 338 | + ] |
| 339 | + }, |
| 340 | + { |
| 341 | + "cell_type": "code", |
| 342 | + "execution_count": 11, |
| 343 | + "metadata": {}, |
| 344 | + "outputs": [ |
| 345 | + { |
| 346 | + "name": "stdout", |
| 347 | + "output_type": "stream", |
| 348 | + "text": [ |
| 349 | + "SVM Accuracy: 0.654 (+/- 0.034)\n" |
| 350 | + ] |
| 351 | + }, |
| 352 | + { |
| 353 | + "data": { |
| 354 | + "text/plain": [ |
| 355 | + "(0.6542955657681, 0.03387213416308271)" |
| 356 | + ] |
| 357 | + }, |
| 358 | + "execution_count": 11, |
| 359 | + "metadata": {}, |
| 360 | + "output_type": "execute_result" |
| 361 | + } |
| 362 | + ], |
| 363 | + "source": [ |
| 364 | + "mt.cross_validate_model()" |
| 365 | + ] |
| 366 | + }, |
| 367 | + { |
| 368 | + "cell_type": "code", |
| 369 | + "execution_count": 12, |
| 370 | + "metadata": {}, |
| 371 | + "outputs": [ |
| 372 | + { |
| 373 | + "name": "stdout", |
| 374 | + "output_type": "stream", |
| 375 | + "text": [ |
| 376 | + "Took 13.44 seconds\n" |
| 377 | + ] |
| 378 | + } |
| 379 | + ], |
| 380 | + "source": [ |
| 381 | + "best_accuracy, best_parameters, best_score = mt.tune_model()" |
| 382 | + ] |
| 383 | + }, |
| 384 | + { |
| 385 | + "cell_type": "code", |
| 386 | + "execution_count": 13, |
| 387 | + "metadata": {}, |
| 388 | + "outputs": [ |
| 389 | + { |
| 390 | + "data": { |
| 391 | + "text/plain": [ |
| 392 | + "(0.6551769760245102, {'C': 0.1, 'penalty': 'l1'}, 0.6551769760245102)" |
| 393 | + ] |
| 394 | + }, |
| 395 | + "execution_count": 13, |
| 396 | + "metadata": {}, |
| 397 | + "output_type": "execute_result" |
| 398 | + } |
| 399 | + ], |
| 400 | + "source": [ |
| 401 | + "best_accuracy, best_parameters, best_score" |
| 402 | + ] |
| 403 | + }, |
| 404 | + { |
| 405 | + "cell_type": "code", |
| 406 | + "execution_count": 15, |
| 407 | + "metadata": {}, |
| 408 | + "outputs": [], |
| 409 | + "source": [ |
| 410 | + "final_results = mt.save_results()" |
| 411 | + ] |
| 412 | + }, |
| 413 | + { |
| 414 | + "cell_type": "code", |
| 415 | + "execution_count": 16, |
| 416 | + "metadata": {}, |
| 417 | + "outputs": [ |
| 418 | + { |
| 419 | + "data": { |
| 420 | + "text/html": [ |
| 421 | + "<div>\n", |
| 422 | + "<style scoped>\n", |
| 423 | + " .dataframe tbody tr th:only-of-type {\n", |
| 424 | + " vertical-align: middle;\n", |
| 425 | + " }\n", |
| 426 | + "\n", |
| 427 | + " .dataframe tbody tr th {\n", |
| 428 | + " vertical-align: top;\n", |
| 429 | + " }\n", |
| 430 | + "\n", |
| 431 | + " .dataframe thead th {\n", |
| 432 | + " text-align: right;\n", |
| 433 | + " }\n", |
| 434 | + "</style>\n", |
| 435 | + "<table border=\"1\" class=\"dataframe\">\n", |
| 436 | + " <thead>\n", |
| 437 | + " <tr style=\"text-align: right;\">\n", |
| 438 | + " <th></th>\n", |
| 439 | + " <th>user</th>\n", |
| 440 | + " <th>churn</th>\n", |
| 441 | + " <th>predicted_churn</th>\n", |
| 442 | + " </tr>\n", |
| 443 | + " </thead>\n", |
| 444 | + " <tbody>\n", |
| 445 | + " <tr>\n", |
| 446 | + " <th>0</th>\n", |
| 447 | + " <td>25745</td>\n", |
| 448 | + " <td>0.0</td>\n", |
| 449 | + " <td>0</td>\n", |
| 450 | + " </tr>\n", |
| 451 | + " <tr>\n", |
| 452 | + " <th>1</th>\n", |
| 453 | + " <td>46433</td>\n", |
| 454 | + " <td>1.0</td>\n", |
| 455 | + " <td>0</td>\n", |
| 456 | + " </tr>\n", |
| 457 | + " <tr>\n", |
| 458 | + " <th>2</th>\n", |
| 459 | + " <td>1376</td>\n", |
| 460 | + " <td>0.0</td>\n", |
| 461 | + " <td>0</td>\n", |
| 462 | + " </tr>\n", |
| 463 | + " <tr>\n", |
| 464 | + " <th>3</th>\n", |
| 465 | + " <td>15062</td>\n", |
| 466 | + " <td>1.0</td>\n", |
| 467 | + " <td>1</td>\n", |
| 468 | + " </tr>\n", |
| 469 | + " <tr>\n", |
| 470 | + " <th>4</th>\n", |
| 471 | + " <td>33076</td>\n", |
| 472 | + " <td>1.0</td>\n", |
| 473 | + " <td>0</td>\n", |
| 474 | + " </tr>\n", |
| 475 | + " <tr>\n", |
| 476 | + " <th>...</th>\n", |
| 477 | + " <td>...</td>\n", |
| 478 | + " <td>...</td>\n", |
| 479 | + " <td>...</td>\n", |
| 480 | + " </tr>\n", |
| 481 | + " <tr>\n", |
| 482 | + " <th>3788</th>\n", |
| 483 | + " <td>3555</td>\n", |
| 484 | + " <td>1.0</td>\n", |
| 485 | + " <td>1</td>\n", |
| 486 | + " </tr>\n", |
| 487 | + " <tr>\n", |
| 488 | + " <th>3789</th>\n", |
| 489 | + " <td>24158</td>\n", |
| 490 | + " <td>0.0</td>\n", |
| 491 | + " <td>0</td>\n", |
| 492 | + " </tr>\n", |
| 493 | + " <tr>\n", |
| 494 | + " <th>3790</th>\n", |
| 495 | + " <td>35673</td>\n", |
| 496 | + " <td>0.0</td>\n", |
| 497 | + " <td>0</td>\n", |
| 498 | + " </tr>\n", |
| 499 | + " <tr>\n", |
| 500 | + " <th>3791</th>\n", |
| 501 | + " <td>35778</td>\n", |
| 502 | + " <td>0.0</td>\n", |
| 503 | + " <td>0</td>\n", |
| 504 | + " </tr>\n", |
| 505 | + " <tr>\n", |
| 506 | + " <th>3792</th>\n", |
| 507 | + " <td>9603</td>\n", |
| 508 | + " <td>0.0</td>\n", |
| 509 | + " <td>0</td>\n", |
| 510 | + " </tr>\n", |
| 511 | + " </tbody>\n", |
| 512 | + "</table>\n", |
| 513 | + "<p>3793 rows × 3 columns</p>\n", |
| 514 | + "</div>" |
| 515 | + ], |
| 516 | + "text/plain": [ |
| 517 | + " user churn predicted_churn\n", |
| 518 | + "0 25745 0.0 0\n", |
| 519 | + "1 46433 1.0 0\n", |
| 520 | + "2 1376 0.0 0\n", |
| 521 | + "3 15062 1.0 1\n", |
| 522 | + "4 33076 1.0 0\n", |
| 523 | + "... ... ... ...\n", |
| 524 | + "3788 3555 1.0 1\n", |
| 525 | + "3789 24158 0.0 0\n", |
| 526 | + "3790 35673 0.0 0\n", |
| 527 | + "3791 35778 0.0 0\n", |
| 528 | + "3792 9603 0.0 0\n", |
| 529 | + "\n", |
| 530 | + "[3793 rows x 3 columns]" |
| 531 | + ] |
| 532 | + }, |
| 533 | + "execution_count": 16, |
| 534 | + "metadata": {}, |
| 535 | + "output_type": "execute_result" |
| 536 | + } |
| 537 | + ], |
| 538 | + "source": [ |
| 539 | + "final_results" |
| 540 | + ] |
| 541 | + } |
| 542 | + ], |
| 543 | + "metadata": { |
| 544 | + "kernelspec": { |
| 545 | + "display_name": "Python 3", |
| 546 | + "language": "python", |
| 547 | + "name": "python3" |
| 548 | + }, |
| 549 | + "language_info": { |
| 550 | + "codemirror_mode": { |
| 551 | + "name": "ipython", |
| 552 | + "version": 3 |
| 553 | + }, |
| 554 | + "file_extension": ".py", |
| 555 | + "mimetype": "text/x-python", |
| 556 | + "name": "python", |
| 557 | + "nbconvert_exporter": "python", |
| 558 | + "pygments_lexer": "ipython3", |
| 559 | + "version": "3.12.6" |
| 560 | + } |
| 561 | + }, |
| 562 | + "nbformat": 4, |
| 563 | + "nbformat_minor": 2 |
| 564 | +} |
0 commit comments