{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d563033c",
   "metadata": {},
   "source": [
    "# Import tools/models be used"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fc9e6e26",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from math import pi\n",
    "from sklearn.tree import DecisionTreeRegressor     \n",
    "import joblib                                         # to store model\n",
    "import os\n",
    "import errno\n",
    "from sklearn.model_selection import train_test_split  # this is very important"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "313e157e",
   "metadata": {},
   "source": [
    "# Read data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "bdc08ed0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>$M_{inv}$</th>\n",
       "      <th>$rapidity$</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>121.079631</td>\n",
       "      <td>-0.304619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>196.219429</td>\n",
       "      <td>-0.401002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>478.422633</td>\n",
       "      <td>-1.010334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>99.018601</td>\n",
       "      <td>0.097534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>423.950224</td>\n",
       "      <td>2.223391</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9996</th>\n",
       "      <td>128.145991</td>\n",
       "      <td>0.246759</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9997</th>\n",
       "      <td>576.782956</td>\n",
       "      <td>-0.554320</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9998</th>\n",
       "      <td>35.437849</td>\n",
       "      <td>0.628855</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9999</th>\n",
       "      <td>189.229229</td>\n",
       "      <td>0.462469</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10000</th>\n",
       "      <td>443.127754</td>\n",
       "      <td>-1.858528</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10001 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        $M_{inv}$  $rapidity$\n",
       "0      121.079631   -0.304619\n",
       "1      196.219429   -0.401002\n",
       "2      478.422633   -1.010334\n",
       "3       99.018601    0.097534\n",
       "4      423.950224    2.223391\n",
       "...           ...         ...\n",
       "9996   128.145991    0.246759\n",
       "9997   576.782956   -0.554320\n",
       "9998    35.437849    0.628855\n",
       "9999   189.229229    0.462469\n",
       "10000  443.127754   -1.858528\n",
       "\n",
       "[10001 rows x 2 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "directory = '../data/'\n",
    "filein    = 'checkLO.txt'\n",
    "file      = directory+filein\n",
    "data = np.genfromtxt(file)\n",
    "\n",
    "m        = data[:,0:1]\n",
    "rap      = data[:,1:2]\n",
    "x2       = data[:,2:3]\n",
    "\n",
    "m = np.concatenate((m),axis=0) \n",
    "rap = np.concatenate((rap),axis=0) \n",
    "x2 = np.concatenate((x2),axis=0) \n",
    "\n",
    "Data_ave = np.stack((m,rap),axis=-1)\n",
    "df = pd.DataFrame(Data_ave)\n",
    "df.columns = ['$M_{inv}$','$rapidity$']\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0248b96b",
   "metadata": {},
   "source": [
    "# Split data into training and testing sub-sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "de4cf784",
   "metadata": {},
   "outputs": [],
   "source": [
    "# for reproducibility\n",
    "#X_train, X_test, y_train, y_test = train_test_split(Data_ave, x2, test_size=0.4, train_size=0.6 , random_state=0)\n",
    "X_train, X_test, y_train, y_test = train_test_split(Data_ave, x2, test_size=0.4, train_size=0.6 )\n",
    "\n",
    "# rename data for convenience\n",
    "x2_train   = y_train\n",
    "m_train    = X_train[:,0:1]\n",
    "rap_train  = X_train[:,1:2]\n",
    "\n",
    "x2_test   = y_test\n",
    "m_test    = X_test[:,0:1]\n",
    "rap_test  = X_test[:,1:2]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2624e86c",
   "metadata": {},
   "source": [
    "# Now let's do some training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b8ef444a",
   "metadata": {},
   "outputs": [],
   "source": [
    "'''Training and prediction with Linear Model'''\n",
    "#-----------------------------------------------------------------------------#\n",
    "# Input:                                                                      #\n",
    "# X_train  := training data set                                               #\n",
    "# y_train  := targets for training                                            #\n",
    "# X_trest  := testing data set                                                #\n",
    "# y_test   := targets for testing                                             #\n",
    "# filename := name for training storage                                       #\n",
    "# model    := name of the mode we want to use                                 #\n",
    "# ----------------------------------------------------------------------------#\n",
    "# Output:                                                                     #  \n",
    "# loaded_model := trained model                                               #\n",
    "# R2 := quality of the training on the testing set                            #\n",
    "# y_fit := predicted targets                                                  #\n",
    "# y_est := estimated targets                                                  #\n",
    "# ----------------------------------------------------------------------------#\n",
    "# Output labelling :                                                          #\n",
    "# Training(X,y,filename)[0] -> R2                                             #\n",
    "# Training(X,y,filename)[1] -> y_new                                          #\n",
    "# ----------------------------------------------------------------------------#\n",
    "\n",
    "def training (X_train, y_train, X_test, y_test,filename,model):\n",
    "\n",
    "    # train \n",
    "    model.fit(X_train, y_train)\n",
    "\n",
    "    # save trained model\n",
    "    joblib.dump(model, filename)\n",
    "\n",
    "    # load model \n",
    "    loaded_model = joblib.load(filename)\n",
    "\n",
    "    # R^2\n",
    "    R2   = loaded_model.score(X_test, y_test)\n",
    "    \n",
    "    # predicted targets \n",
    "    y_fit = loaded_model.predict(X_test)\n",
    "    \n",
    "    # estimated targets\n",
    "    y_est = loaded_model.predict(X_train)\n",
    "\n",
    "    \n",
    "    return R2, y_fit,y_est#, model.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "06b6bed9",
   "metadata": {},
   "outputs": [],
   "source": [
    "x2_train,x2_test;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "ca19e5ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "m_train,m_test;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "be16d388",
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'storage/x2_LO_DecisionTree.sav'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m/var/folders/mf/qhhyj8vx75n7rk9kxsr65d8r0000gn/T/ipykernel_63716/894990343.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;31m# train\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mTraining_machine_learning\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtraining\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_test\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mDecisionTreeRegressor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;31m# predict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/var/folders/mf/qhhyj8vx75n7rk9kxsr65d8r0000gn/T/ipykernel_63716/2667369897.py\u001b[0m in \u001b[0;36mtraining\u001b[0;34m(X_train, y_train, X_test, y_test, filename, model)\u001b[0m\n\u001b[1;32m     26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     27\u001b[0m     \u001b[0;31m# save trained model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m     \u001b[0mjoblib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfilename\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     30\u001b[0m     \u001b[0;31m# load model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/opt/anaconda3/lib/python3.9/site-packages/joblib/numpy_pickle.py\u001b[0m in \u001b[0;36mdump\u001b[0;34m(value, filename, compress, protocol, cache_size)\u001b[0m\n\u001b[1;32m    479\u001b[0m             \u001b[0mNumpyPickler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    480\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mis_filename\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 481\u001b[0;31m         \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'wb'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    482\u001b[0m             \u001b[0mNumpyPickler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprotocol\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    483\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'storage/x2_LO_DecisionTree.sav'"
     ]
    }
   ],
   "source": [
    "# name of the model for storage\n",
    "filename = 'storage/x2_LO_DecisionTree.sav'\n",
    "\n",
    "# train \n",
    "Training_machine_learning = training(X_train,y_train,X_test,y_test,filename,DecisionTreeRegressor())\n",
    "\n",
    "# predict\n",
    "R2    = Training_machine_learning[0] \n",
    "y_fit = Training_machine_learning[1]\n",
    "y_est = Training_machine_learning[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "3b225d13",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_est,y_train;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "1cf2c418",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_fit,y_test;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "49492be3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9983466629848559"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "R2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "93efe92e",
   "metadata": {},
   "outputs": [],
   "source": [
    "coefs;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56253913",
   "metadata": {},
   "source": [
    "# Let's plot and see what we have"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c97b86ca",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y_fit' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m/var/folders/mf/qhhyj8vx75n7rk9kxsr65d8r0000gn/T/ipykernel_63716/3994879151.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0max1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'data'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0max1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_fit\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'prediction'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0max1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mm_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_est\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'estimated'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0max1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'y_fit' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
    "\n",
    "ax1.scatter(m, x2, label='data')\n",
    "ax1.scatter(m_test, y_fit,label='prediction')\n",
    "ax1.scatter(m_train, y_est,label='estimated')\n",
    "ax1.legend()\n",
    "\n",
    "ax1.set_xlabel(xlabel='m',fontsize=16)\n",
    "ax1.set_ylabel(ylabel=r'$x_2$',fontsize=16)\n",
    "\n",
    "ax2.scatter(rap, x2, label='data')\n",
    "ax2.scatter(rap_test, y_fit,label='prediction')\n",
    "ax2.scatter(rap_train, y_est,label='estimated')\n",
    "\n",
    "ax2.set_xlabel(xlabel='rapidity',fontsize=16)\n",
    "\n",
    "plt.savefig('Plots/x2_LO_DecisionTree_1.pdf')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3a651a0f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEOCAYAAAB1g0unAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzOklEQVR4nO3de5RU9Znv//dDW0q1OjQanEgjQvwZSJBLS6s4nBnFOGDiJUy8HtHx5EZmxpxEE5lAjIouZ+SETPSYk8nSk9HfzEhG8JKOt/wwKuRnPF4CNoSgkKig0hhBtJkAjRTNc/6oqqaqeu+qXdXVXZf+vNbqRfeuql3fb9G9n/29PV9zd0RERKIYUukCiIhI7VDQEBGRyBQ0REQkMgUNERGJTEFDREQiU9AQEZHIqjZomFmDmbWb2WOpn48ys1+Y2e9T/w6vdBlFRAabqg0awNeBVzN+ng887e4nAk+nfhYRkQFk1bi4z8xGAf8K/APwDXc/z8w2Ame6+ztmdiyw0t3H5TvPRz7yER8zZkz/F1hEpI6sXr36PXcfEfTYIQNdmIjuAP4eODLj2J+6+zsAqcBxTKGTjBkzhlWrVvVPCUVE6pSZvRn2WNV1T5nZecA2d19d4uvnmtkqM1u1ffv2MpdORGRwq7qgAUwHLjCzzcD9wFlmdh/wbqpbitS/24Je7O53u3uru7eOGBHYuhIRkRJVXdBw9wXuPsrdxwCXAc+4+xXAI8BVqaddBfysQkUUERm0qnVMI8giYJmZfRF4C7i4wuURqUmJRIItW7awd+/eShdFKmzo0KGMGjWKWCwW+TVVHTTcfSWwMvX9DuBTlSyPSD3YsmULRx55JGPGjMHMKl0cqRB3Z8eOHWzZsoWxY8dGfl1VB41KamvvYPHyjWzt7GJkU5x5s8Yxu6W50sUS6bO9e/cqYAhmxtFHH02xE4YUNAK0tXew4OF1dCW6Aejo7GLBw+sAFDikLihgCJT2e1B1A+HVYPHyjT0BI60r0c3i5RsrVCKRwemII47I+3hnZyf//M//3PPz1q1bueiii/r8vhs3bmTq1KlMnjyZ559/HoD9+/dz9tlns2fPnoKv37x5MyeddBIAq1at4mtf+xoAH374IWeffTZTpkxh6dKlPPvss0yYMIEpU6bQ1dUVWq9i3XHHHZHKWQoFjQBbO7uKOi4ipXF3Dhw4UPLrcy+uI0eO5MEHH+xzue666y4WLVrEgw8+yPe+9z0AfvSjH3HllVfS2NhY1LlaW1u58847AWhvbyeRSLBmzRouvfRSlixZwnXXXceaNWuIx+Oh9SqWgsYAG9kUL+q4iES3efNmPvGJT/B3f/d3nHzyybz99tssXryYU045hUmTJnHTTTf1es2uXbv41Kc+xcknn8zEiRP52c+SM+7nz5/P66+/zpQpU5g3b17WHf5pp53G+vXre85x5plnsnr1anbv3s0XvvAFTjnlFFpaWnrOlSkWi9HV1cWePXuIxWJ0dnby6KOP8td//deh9Vq9ejWTJ0/m9NNP54c//GHP8ZUrV3Leeeexbds2rrjiCtasWcOUKVO46667WLZsGbfccgtz5szJOlduvYDAz2j37t2ce+65TJ48mZNOOomlS5dy5513snXrVmbMmMGMGTOi/rdE5+51+zV16lQvxU9f3uLjv/NzP/5bj/V8jf/Oz/2nL28p6Xwi1eSVV14p6vk/fXmL/9ltT/uYbz3mf3bb033+O9i0aZObmT///PPu7r58+XL/8pe/7AcOHPDu7m4/99xz/Ze//KW7ux9++OHu7p5IJHznzp3u7r59+3Y/4YQT/MCBA75p0yafMGFC1rnTP3//+9/3G2+80d3dt27d6ieeeKK7uy9YsMD//d//3d3dP/jgAz/xxBN9165dWWV88803/YwzzvBp06b52rVr/dprr/WVK1fmrdfEiRN7nnPdddf1lGPFihV+7rnn9vre3f2qq67yBx54IPAzyqxX2Gf04IMP+pe+9KWe53V2drq7+/HHH+/bt2/PW960oN8HYJWHXFfV0ggwu6WZ2z43keamOAY0N8W57XMTNQgug056UkhHZxfOwUkhbe0dfTrv8ccfz7Rp0wB48sknefLJJ2lpaeHkk09mw4YN/P73v896vrvz7W9/m0mTJnH22WfT0dHBu+++m/c9LrnkEh544AEAli1bxsUXX9zzfosWLWLKlCmceeaZ7N27l7feeivrtaNHj2blypU8//zzNDY2snXrVsaPH8+VV17JpZdeyu9+97us5+/cuZPOzk7OOOMMAK688srSP5wAYZ/RxIkTeeqpp/jWt77Fs88+y7Bhw8r6vkE0eyrE7JZmBQkZ9PJNCunL38fhhx/e8727s2DBAr7yla+EPn/JkiVs376d1atXE4vFGDNmTMHFic3NzRx99NH85je/YenSpdx111097/fQQw8xblzeJNk9rr/+em699VbuvPNO5syZw5gxY7j55ptZsmRJVh36c0Zavs9o9erVPPHEEyxYsICZM2dy44039ls5QGMaIpLHQEwKmTVrFvfccw+7du0CoKOjg23bslPL7dy5k2OOOYZYLMaKFSt4881kEtYjjzySP/7xj6Hnvuyyy/jud7/Lzp07mThxYs/7/eAHP8BT20K0t7eHvv6Xv/wlzc3NnHjiiezZs4chQ4bQ0NDQa5C5qamJYcOG8atf/QogK6CUIrdeYZ/R1q1baWxs5IorruC6667j5ZdfDnx9OamlISKhRjbF6QgIEOWcFDJz5kxeffVVTj/9dCA5zfa+++7jmGMO7n4wZ84czj//fFpbW5kyZQrjx48H4Oijj2b69OmcdNJJfPrTn+bqq6/OOvdFF13E17/+dW644YaeYzfccAPXXHMNkyZNwt0ZM2YMjz32WK9yuTu33nory5YtA2Du3LnMmTOH/fv386Mf/ajX8++9916+8IUv0NjYyKxZs/r0meTWa/HixYGf0Wuvvca8efMYMmQIsVisp1xz587l05/+NMceeywrVqzoU1lyVeUmTOXS2trq5dpPQyvEpV68+uqrfOITn4j03NyFrgDxWIPG+OpI0O+Dma1299ag56ulEYFWiMtglf791g2TpCloRNBfg4EitUCTQiSTBsIj0ApxEZEkBY0ItEJcRCRJQSOCebPGEY81ZB2LxxqYNyvaPG8RkXqhMY0I0v25Nz+6ng/2JAA47BDFWxEZfHTlK8LexMFsnJ1dibKkUxCRcEqNXrzPfOYzdHZ2lvTaKBQ0ItIeGyLl50qNXnRq9O7u7sDjaU888QRNTU1FlbEYChoRhc2UClotm9bW3sH0Rc8wdv7jTF/0jFolIig1eimp0VeuXMmMGTO4/PLLe9KhzJ49m6lTpzJhwgTuvvvunteOGTOG9957r+dz/vKXv8yECROYOXNmVmumZGHpb+vhq9TU6EEmL1yelSo98ysoVbTSq0u1KjY1uq9d6v79Ce43DUv+u3Zpn95fqdGLT42+YsUKb2xs9DfeeKPn2I4dO9zdfc+ePT5hwgR/77333P1gWvRNmzZ5Q0ODt7e3u7v7xRdf3FPvTEqN3k/yJbAM6qJSd5bUhd8sg0e/BjvfBjz576NfSx7vA6VGL96pp57K2LFje36+8847mTx5MtOmTePtt9/u9ZkBjB07lilTpgAwdepUNm/e3OdyaPZUBG3tHT2zpoIEdV1pQaDUhadvgUTO72yiK3l80iUln1ap0YuX+ZmtXLmSp556qieopYNfrsMOO6zn+4aGhrJ0T6mlUUA671Q+QYv8tCBQ6sLOLcUdL4FSo/dWqF47d+5k+PDhNDY2smHDBl544YU+vV8xFDQKCOpmyhQbYoGL/LQgUOrCsFHFHS/BzJkzufzyyzn99NOZOHEiF110Ua8L5pw5c1i1ahWtra0sWbIkMDV6ei/tTBdddBH3338/l1xysFV0ww03kEgkmDRpEieddFJW2vRMnkqNnn587ty5zJ8/nwsvvJDrrruu1/Pvvfderr76ak4//fSsmVClKFSvc845h/379zNp0iRuuOGGnq6+gaDU6AWMnf84YZ9QUzzGwgsmhCZzUzp1qUbFpEbvGdPI7KKKxeH8O/vUPSXVQ6nRyyxsE5rmpjjPzT8r72v7kh1UAUeqQjowPH1Lsktq2Cj41I0KGIOYgkYB82aNC9yEpj+7mbR/h1SVSZcoSEgPjWkUMLulmds+N5HmpjhGsoXR37uWabquiFQrtTQiyOxmSncbXbt0Tb91G4WtMtd0XSmXgZgiKtWvlDHtqgsaZnYc8G/AR4EDwN3u/j/N7ChgKTAG2Axc4u4fDGTZwrqNVr35Pis2bC/L+ENbewcGgYPvmq4r5TB06FB27NjB0UcfrcAxiLk7O3bsYOjQoUW9ruqCBrAf+Ka7v2xmRwKrzewXwH8Dnnb3RWY2H5gPfGsgCxbWbbTkhbd6LvJ9HX9YvHxjYMAw6Pfpuhp8HxxGjRrFli1b2L59e6WLIhU2dOhQRo0qbvp01QUNd38HeCf1/R/N7FWgGfgscGbqaf8KrGSAg0ZYt1HuRb4v+4eHdUE5/TsIrsH3wSMWi2WloxApRlUPhJvZGKAFeBH401RASQeWYwaqHG3tHbTc8mRRr9na2VVSltumxljg8eEhx8tFg+8iEkXVtTTSzOwI4CHgGnf/z6h9r2Y2F5gLyaRjfZV7Bx5VU2OspDv3vSHvE3a8XJQrS0SiqMqgYWYxkgFjibs/nDr8rpkd6+7vmNmxwLag17r73cDdkFwR3teyFEojAsl1G7nrONwJvHO/+dH1eccNuhLBG9KEHS+XYfEYnV29kzJq8F1EMlVd95QlmxT/Arzq7t/PeOgR4KrU91cBvXdO6QeF7rSHN8ay1nEMb4xx2CFDAi/AAB/sSdDR2YVzsPWR7raq1CZNbe0d7N63v9fxsLxaIjJ4VWNLYzpwJbDOzNakjn0bWAQsM7MvAm8BFw9EYcLSiKTt2pu82M6bNY6Fj6zPm0I9SOa4Qb5suqWOaUSZEbV4+UYS3b0bZUcMPUSD4CKSpeqChrv/iuQM0yCfGsiyQHAakUyJA87Nj65n1979JA6U1hvW0dnFN5etpTtkoU2swbjp/AmRzpUZJIbFY+zet78nIISNq4S1pjqLDIAiUv+qLmhUm/TFdfHyjaEtjiiti+GNMdwJ7LYyCA0YAIcfegjXLl3D4uUb866dyB20D3qvoOnAYa2psJlc6fda+Mj6nvcY3hjjpvPDM/6KSH2oujGNajS7pZnn5p9FU7z0aa+dexKcN/nYXntshK3+zny8sysROAaSK8qgPWS3LNraO9j9Ye/xDEh2vQW9V1t7B/MeWJsVlD7Yk2Deg2srNi4jIgNDQaOA9FqLMfMfDx3cjsKBpS+9zYVTm7OSHxbq0ApbOBhUxnxjL5nSM6LSLZOweiUOeOj+50FdcYnu4OdXQilrZESkMHVP5VHqGo0wiQPOig3be/bh+E7bOu574a0Cr+ott6VQTBljDQdnREVpmRSz/3mhxwaKVreL9B+1NPKI2t1TjPRFta29o6SAAdkthW8uW1tUGRPdzqo3388qS5T3KnQsymMDRavbRfqPWhp59Mdd88imeM+dcCnSG0Clz5FvAD3MkhfeovX4owpOJwaYMX5E1s/faVsX+rlktmIqSavbRfqPgkYeUS6qmZpCVlVnmjF+RJ9aMENjycbhwkfWl3wOh56ZWIW6tlZsOJgJNV93mln2mEYlu4HC/t8GshWUnvrc0dlFgxnd7jQrc7DUAXVP5TFv1jhiQ6LlvIoNscBV1bnS+26U6oM9Cb6xdE2fBuUh2c+fuSthvuelLcnTnZZu8BSa4dUXUQe3580a12uWWn9v0Zsp3QpMf3bp1mB/fjYiA0VBo4D9Ebt/Egc8cFV1ro7OLob0ceObcmWharnlSa5dugaAsNjYkFHWqB1hXYluFj6yvm+Fy5F5IS40/bgSW/RmyteS1NiK1Dp1T4VIX6RKGDIoqJRxiP6QXpSYrwuu1LJ2diX4Tts6bp09saTX5wob3F74SHACyMwtevtTUJqWQi3J3MdzzzFj/Iiy7QRZa7QRWPWzUvaIrRWtra2+atWqkl5bzLqHenb4oQ00NR7ac6Er5rfFgNsvnRL4R1/sxWHs/McjvXc81jBgrYqg6c7xWANDY0PyZglobor3TLuOMmV6IOtUSWGf52Coe7Uxs9Xu3hr0mFoaIQZqps0V00bzkxffosS0Vf1u975udu8L/yyGGKFlTw+4k/o3HSDGHB3n/7z+flFb5EadlFDsrol9ubMNa/0cdsiQXuny0zJnv+VLTZN7zm8sWwPU9zqTfFOl67netUZjGiEGaqbNfS9Ub8AI02DWM1bw/Uum5M3Amw4ImWMRz2UEjLRCff1Bg9thogb8YsZJinmfnV2JrAkG6XGh9NgKkDVQHsUBJytNSz2ueI8yVboe611r1NII0NbewZ4IM6EGqwPubFp0btaxa5euCew+ajCLPDU46KKR2RJoaoyxd393wXGmoIAf1KLo651tvqm9+cZUpi96pqTp0olu55qla3plVa6XFe+FpkprpX910JhGjnKnDqlH6T753Ey35TpvWslb7cZjLLzgYMbdoPMUShQZZU1FvvOmXw/0ClZhAbavcsdKyj2g3N+D1IXGNMLGGZviMQ4/7BANnpdRvjENBY0cGgDPLzbEWHzxZFa9+X6kNCjphW2FGDBn2uisWUN79u0velOrtCgXm6jngN4X/syAdPOjwZtvxRoMnKzkjvFYQ96dHfvCgE2Lzi148Y1y8Q+a0fXQ6o5+H6TOV7ZqnAxRrxQ0ijBm/uP9VJr60DDEmDZ2OM+9/n7k18QaLNIalnJL33lHvdgEaYwNoStxIOv1uRfgYltDwxtj7E0cKHtrNl3ffHfkCy+YUHCGUjF1ym0d5vpO2zr+48W36XanwYz/etpxgdOwg1bQp/eg2dmVKOkmIl9rr5YDSlhgLWdLUEGjCCcseKJq1lHIwIjaGspU6AKdT3oqcjm79tIK1SWeCoK5Mi/+xdbpjoxp1ZkXrqEh7zX9hKPYvKMrK0AU6i4sVVhrrxpaIrmt1MbYEA49pKEnSIa1AIOC/oVTm8vaElTQKIJaGoOPAcMi5A3LVUqwgewL9Jz//XxRrbZMYQGgFOmuLYjeDXSwHMmL06o332fJC2/1y8U/SFM8hlm0nTNzhbWQ8t2tl/NOPsq2CLnjY7Nbmplw4//H7n3RW6iFWoKh7611GtE1F5mkUGpfU2OspAtPqS3SD3Z/SFt7B7c98Qrv/nFfSedIsrLdoWfOOCs2UWd6Zf7O1A6TA+U/9ya4/LTRve6wowhalf/th3/DnowgnDk7C+g1c+uapWu4Zuka4rEhDI010LknEWlFf1t7R948bmm565geWPVWUQEj/dpyU0sjh2ZPDS5B3ReD0eGHNrBnXzdNjTE+THRnXTyrXSmBM3em2bwH14aOu6XX25R6Ac7tJhroyTZ3hGRlyEfdU0Vqa+/g+p+uKzqqS+3pr750qV653T5RV+b3xfDGGDedP6FfxrEKaYrHWHPTzKJeky9oaEV4gFVvvq+AMUgoYAw+md0+1y5dMyB3/R/sSXBNGbY0KEVnV6KsK+cVNAJE6W8Ukdo3WG4aypmOX0EjR1t7x6D5RRKRwaGcrSkFjRzaIEdEJJyCRo6BSokuIlKLFDRyDFRKdBGRWqSgkSOdq0ZERHpT0MhR6Xw0IiLl1lzGHpSaCxpmdo6ZbTSz18xsfn+8Rzk/YBGRSitnD0pN5Z4yswbgh8BfAluAX5vZI+7+Sjnf59m9f4UdVs4ziohUxgZvZsmbS8vWi1JTQQM4FXjN3d8AMLP7gc8C5QsaC4clm19WtjOKiFTMeDqY8/JlMHt9Wc5Xa91TzcDbGT9vSR0TEZEAZjDetpTtfLUWNILu/7MWcJvZXDNbZWartm/fPkDFEhEZHGotaGwBjsv4eRSwNfMJ7n63u7e6e+uIESMGtHAiIlWpjN3ttRY0fg2caGZjzexQ4DLgkXK+wQGgjrPFi8gg4w72kfFlO19NDYS7+34z+yqwHGgA7nH38ozupPz50J/y7J6/KucpRUQqZoM384mvvli289VU0ABw9yeAJ/rr/Fs7u/gYP+mv04uIDLjNZTxXrXVP9TvlnhKRejK8MVbW8ylo5Jg3axyxIVqkISL14abzJ5T1fAoaOWa3NLP44sk0xcsbnUVEBlpTPFb2fHoKGgFmtzSz5qaZHH5oQ6WLIiJSktgQY+EF5W1lQIGgYWbfM7Njyv6uNaCtvYPd+7orXQwRkSyHH9oQuOzi0IaDR5viMRZfPLlfsnYXmj11DbAM2GZmC4H/5e7vlb0UVUjbvopItYnHGviHv5oIJK9RWzu7GNkUZ96scQO2rUOhoPE+MDz1/Q0kp7oOiqChbV9FpBo0mNHtTnNOcKjU3j+FgsavgO+Z2QiSC9EHzVrpYfEYnV2JShdDyiA2xFh88WQAvvnAWroP1MavcWNsCHsSBypdDKmg5qY4z80/q9LFyFJoIPyrwB+AfyUZMJ4ys2fN7E4z+7yZTTGzuptm9J22dQoY9SSjA7hWZn4Mb4wx/HBt6jKYxWMNVbn9dN6/IXff6u5/STL9uAFLgXeAc4AfA6uBP5rZy2b2L/1d2IHQ1t7BkhfeqnQxpIwS3c7i5RtZvHwjiRpoZcQajJvOn1A1XaQNFn3dUjzWP2G5uSletmnwwxtjefP3xRoqs06rKR6juSmOkazvbZ+bWJXbT+ftnjKz7wHfdfc/mNlPgdvd/dXUY0cAU4CW1NfJ/VzWAbF4+cbB0wc3iFTLBTjM8MYYnXsSWYOai5dvpKMKyt3tnrdv2iCr3G3tHVyzdE1R79HcFKejs6vX+8RjDT0Xz7b2DhY8vI6uRGmzGpviMdbcNBMg8FwGzJk2mtbjj+o1yAww74G1kW86hhj8ydAYO7uS/6czxo9gxYbtbO3sYlg8xu59+0l0HzxXPNbAwgsmVGWQyBV59hSwDujZoMLdd5Ec8/hVfxWuEqr94iKlSaeHGaiLcLEDgHsTB5gzbTQrNmzn2qVrWLx8IzPGj+Ch1R0lXyTLpVBdNi06N+vn2S3N3Pzoej7YE62LN7Pfvq29I3RWUPrfYs6dlr4oZ5YRwmcghV28v7lsLd0R0mC70xOgguSrZ7Uzz/MBmNk24Ep3X25m3cDp7v7SgJWuj1pbW33VqlVFvWb6omeq4u5Oyid9twr06U41quamOFs7u4pusQbdZZ88ehjPvf5+GUtXmvQMnlxhA7VBd/KxIQZGrzvsUrph0hfdjs6unrJlzjLKvLMv50U5amunGgewi2Fmq929NegxzZ7KMWP8CO7TmEbNS/+y5k5ThOy7yxnjR/DY2nfKNvEhPXhZStdS7h9XV6Kb/1MFAQOSXVTxWEPWxTLfQG3YnXzQsVIu5rNbmityZx6ltROPNTBj/AimL3qmJlsShRQKGl8lOXMqc/bUb4D2jK/17l43U41WbMi/RewQg0OGGPu688fPsDszKa/hjTEaDz0k644zKFCkpS826TvVJS+8xcimeK/+5FJanA1mWXfN1y5dE3iXVczvRpRnHXbIED7cX9rU3Kh3gunPtJgLftiFvR4unntzpkJn3qTkdit2dHax4OF1QH3UPW/3VM+TzD5KclvVHwNNJAfAT0g9nABeAdrd/Yv9UsoSldI9NXb+42VpTt1x6ZTQi4b0Vkoz1oDbL53S6w+xUH9xUBdDbjdJW3tH0f9/Rnb//pj5j4c+N/euvdRm/PDGGO6U1FKKxxq4cGpzTzfOkJBgFvY5D1ZhNxTpLqlCj9eCfN1TkebHufsfgPTsqUvc/ePAMOAMYB6whjqZPVWu/TRmtzQrYGQwIGw2ZlM8xpxpo4vexnjOtNGBAWPBw+voSI0ppO/y2to7ep6zePnGXn3SXYnurNQxs1uaiy5T7u9Oc8jvUno6Zeb0yjnTRhOPFZcgMx5r4KbzJ0QOGEFTOm+dPZHn5p/FpkXn8k+XTO5VhvSMIgWMg8Imy6SPF3q81hWacnuau78I4O4XZj5Wr7On5s0a1+fBUiN58UpPI6x1sQZjf7eX1BIACk5b3L1vP4+tfaeo818xbTS3zp7Y63i+gJC+8EX9o7519sSe6ZdB00EzBfXvB/0upZ8X1HXTevxRkaeqZnbBRZnRE2VKZ6EZRZI0MuTvOn3TUOjxWldoTON5M5vm7i+lFu+9TLJVsTYVNOpO+g+k2HnmmZzkLJ0LpzZXxZTJUqQvkMMbY+zau7+kVpMDmzO6a9raO9gfcHFLdHtR3StN8VhgwIBoAaGYP+rMi3tmt1dTqlsoPQ8/6OJa7EU46tqM3G6OfAEjdw1FIZUaYK4l+W4Gojxe6woFjdOAN1LftwJXADHggJm9TvaA+Bp339ZfBR1Is1ua+xQ0IHl3u2LDdm773EQWPrK+ptKSNJjxT5ck0ypPX/RM3jnxwxtjkebMp7uN+jo3INaQf4+AKAGh2D/q3DGSYvr3i70IF2rpBpUzrEVbS33otSTqGo96bbHlDRru/uuM7yen8kydxMFV4C3AZ4AjSN5Y1sWuRW3tHWWZ/bS1sytrtk7UhUGlSrcOmgJWnBbjgHvBrpzMQd8pNz8ZGBQz0z4EdRtlGt4YY2/iQOFWWYEqRQkIhf6oc1sUu/bu7+lS6++ZMLllGxaPYUav1eLF1lnKq9DNQD232AqNaYxx983pn1NTa9Mti/RzDPg4yRlVNS99R1yOi/vIpnjWBai/B8bT5+/sSkTa5zwsi2rmXXmUO/eFF0zoNVaRu2tYvkHA9IAuFF5xmzjgWeMTuaLe5YX9UefOrApqReWOkZRbsRecer+zlepSqHvqDTN7n+RYxsskExSudvd0lxWenLO7MfVV8wrdERdjzNHxAVmBHCRxwAu2lv7xc5MC8+/MGD+i5+dy3LlDePAJWttQSKFZKH25y4v6/19tM2Hq+c5WqkuhoHExMJXkeMaXSU6vxcz+k4NB5GWSgeT3/VjOAVPO2U4vvPFBRRf45Us019wUZ3ZLM6vefJ8lL7zV8xwHHlrdQevxR2VdiEq9c4fk3fuefft7HQ9KIREWXDL15yyUqMGgXmbCiBSr0JjGQ8BDAGY2Cnga2AG8SjJd+leBw1KP73L3Yf1a2gFQzpXc5Q4Y6YHNqFlE06tTM4MCZLcUVmzYHpi+IrP7pS93sWG5epriscApoKUMBJdTlKCl8QIZzIpJfv+/gUfc/c/c/Yvufg4wNnW8C7irPwo40Mp5oS9mH4JCYg3Wc6GKcgFPX9hunT2R2y+dEpqnv78XIoV19xx+2CGhKSYyF74Nb4zRFI8N2B4D82aN67XALdZgA1oGkWpWqHsq0xnA/8g84O7vAn9jZg3An5SzYJUSdQppIbEG49JTjitqncYQg7B0/Ylu5+ZH1wPJC2u+hYOZC78KpdTo74VIpQSlSvbPa1BZJL9igsa7JKfbrgx47H7g34C/KUOZKqpcDY3DDz0ka0Vx+gKUr+uj0P4uH+xJ9Ez3nDdrXOCMpcUXT+65wH2nbV1W11TmdFEgdKVzbIixZ99+xs5/vM8XzWpfHRsWVBUkRIIVEzTuBW4ysxcz12+kjCKZi6rm7SzTIrz0eXIvQGMXPN6nwJQeb5g3axy9EiNl/JzetjZovOLmR9dnrYlweq/xSLe2+rouoZrXEOSOt9RbNlKR/lDMmMY/ACtIphZ50MwuM7Mzzexq4LtAbiCpSVHvgJvisbwJ5sLOM+e00SWVK9PWzq7kftc5i/fSe2FD/m1rP9iT6NVl5iTHYDq7Er3Om5vMrxi5YxTVNCYQJXGhiGSL3NJw927gEjP7EvAt4HMZD78CfKWvhTGzxcD5wD7gdeDz7t6ZemwB8EWgG/iauy/v6/sFKSZh4YVTm3n8N+/0GgPJdyd96+yJvPjGDn6/bXfW8WJSY49M7QwXpFCmzXzyTQLoy8B4tXb31EM20lreNlRqUzEtDQDc/cfufiLwMeDPgU8Ak9z9d2Uozy+Ak9x9EvA7YAGAmX0SuAyYAJwD/HNq8L3s0nfGhXR2Jbjvhbc4tMF69RJ1Jbq5ZukaWm55Misld1t7By23PBkYMP7shKMipcZOB6SwlkxTYzJ1R9jjRnZ6j6iqZQyinMLqVCt1jZIGXqTcig4aGXaSnDF1AsmNmfrM3Z909/QqsBdIjpUAfBa4390/dPdNwGvAqeV4zzBRJ8u++8d9ebuB5j24lrb2jp4/8KCZWQ5s3tHVqxvnjkuncEfIdNl5s8YRa+hdyl1799PW3hE4dTS9N8LCCyYUtXdDtYxBlFvQZ1RLdVX3mlRCMQPhPczsDJKbMh0gubhvv5ld5O5Pl7FsXwCWpr5vJhlE0rakjvWLfOMBxcocZ8jX5ZWZ3DBX2LGg7Lnp3Ezp7Kb5ui7Sj4Xt2AbBe2zXi1qfXlsP3WtSe0oKGsDtwDfc/f81s0OAO4E7gIL9Omb2FPDRgIeud/efpZ5zPbAfWJJ+WcDzA69yZjYXmAswenRpg87l/qOLkqzQSW4jWcxFK2ymV7r8+cYScveJKLT9ab2q1vGWKKp9OrPUp7zdU2b2AzM7MuChMSTXZpDqTnoYOD7KG7r72e5+UsBXOmBcBZwHzPGDG5hvAY7LOM0oknuWB53/bndvdffWESNGBD2loHL/0Y1sikdaHV5sn3S5+uSreYaThKv17jWpTYVaGh8Dfmdm33D3/8g4/iJwu5n9gOReGt9OHesTMzuH5MysM9x9T8ZDjwA/MbPvAyOBE4GX+vp+Ycqx5WvaEEueL+qmTpl90oW6Tcq5BqKW77gHq1rvXpPaZF5gpZmZ/RXJ7qjXgb9199+Z2fHAT4DTU097Cbg8M2V6SYUxe43kGMmO1KEX3P1vUo9dT3KcYz9wjbv/vND5WltbfdWqVSWVJWpSwEKGN8Zov3Em0xc9U1QG3XisIVJ3kaZciki5mdlqd28NfKxQ0EidIA7cBPwdyfGLW919r5kdkTrHH8tZ4HLpS9AAOGHBE31OYJje4S5o3CBsbUZYpl1t3ykiAyFf0Ig05dbdu9x9PslprtOAV8zsPHffVa0BoxymfWx4n8+RHl8IGjeYM210YJ90WKDSrBgRqbSCs6fMbAjJMYShwEZ3P9vMLgfuMrNfA//d3d/u53JWxOYdfbtIB+1wl9t1lJvQcN6scT2JBHNlDnCrW0pEKqHQHuGTgAeB/yd16H0z+7K7/8TMHgVuBdaZ2W3AP2UszKsLfdnFL+r6hrAB6HwD3Eq0JyKVUqilcTfQTjJdyB7gm8C/mdmIVLfU183sHuCHwF+TTPNRN0rdxS/f2ENbewc3P7q+Z2V40A52hWbF5FsJrKAhIv2pUND4JMlFd+8CmNkdwI3AaJK5oXD3tcB/MbPP92M5K6LUQfCwsYe29g7mPbg2K4tsZ1eCeQ+sBegVOMICgFYCi0ilFBoI/zUw38ymmtkE4DaS02F7Ta1193v7oXwV1VxgkVzYgr2wxXVB6czhYOqPqGo90Z6I1K5CQeOLJNdN/BpYB5wFXFRvYxdhglbcpsVjDfzX044LTAo4Y3zwSvR8LYFiWglaCSwilZK3e8rdNwN/YWaNwKHpvS0Gi8wxhI7Orp4xjtxB7swd8hx4aHUHrccf1at7Kd92r8W0ErQSWEQqJdLivlrV18V9UYSt9A4aDA8a04Dee3uLiFRSnxf3Sbiog9LpdRWJbidzKKQpHlPAEJGaUWpq9EEpaEFdlPTUuesq3AdP6nERqS9qaUQUtrXmjPEjCg5Kh62rWPjI+oEouohI2ShoRBR24V+xYXvBvSjCurA6uxLaz1lEaoq6pyLKN3ZRaC+KfLOmyrWKW7moRGQgqKURUdiU2CFmjJ3/ONMXPRPaasi3fqIv+a3SwrrO1IoRkXJT0IgobKFft3vBC/XslmaGN8YCz2vQ54t7vlxUIiLlpKARUe5+GEEpRPJdqG86fwJBSUcc+nxxVy4qERkoChpFmN3SzHPzz2LTonM5UORGSbNbmgN36cv3mqiUi0pEBoqCRomKuVC3tXfQcsuTRZ8rKuWiEpGBoqARoq29g+mLngkd5I56oU4PUqf3z8hl5B8ojyJoK1ktHBSR/qAptwGi7IwXNWlg0CB1Jqc8u+0VmvYrIlIOamkEiDobKT3GcfulUwC4dumaXq2SQuMVhfbsEBGpJgoaAYqZjVRojUS+8QqNO4hIrVHQCFDMIHehVknY+o6meEzjDiJSczSmEWDerHFZYxoQ3ioo1CrRhkkiUk8UNAIUc6GPkhpdg9QiUi8UNEJEvdAX0yoREal1Chp9pO4nERlMFDTKQN1PIjJYaPaUiIhEVpVBw8yuMzM3s49kHFtgZq+Z2UYzm1XJ8omIDFZV1z1lZscBfwm8lXHsk8BlwARgJPCUmX3c3cPzc4iISNlVY0vjduDvISuT+GeB+939Q3ffBLwGnFqJwomIDGZV1dIwswuADndfa9mbHDUDL2T8vCV1rF9ov20RkWADHjTM7CngowEPXQ98G5gZ9LKAY4F7GpnZXGAuwOjRo4suX5QMtyIig9WAd0+5+9nuflLuF/AGMBZYa2abgVHAy2b2UZIti+MyTjMK2Bpy/rvdvdXdW0eMGFF0+bTftohIuKoZ03D3de5+jLuPcfcxJAPFye7+B+AR4DIzO8zMxgInAi/1Rzm037aISLiqGtMI4+7rzWwZ8AqwH7i6v2ZORcklJSIyWFVNSyNXqsXxXsbP/+DuJ7j7OHf/eX+977xZ44g1ZA+hxBpMuaRERKjioFFRuUPsgUPuIiKDj4JGjsXLN5I4kB0lEgdcA+EiIiho9KKBcBGRcAoaOYrZ6lVEZLBR0MgRtKe3NlUSEUlS0Mgxu6WZ2z43keamOAY0xWMMjQ3h2qVrmL7oGdraOypdRBGRilHQCDC7pZnn5p/F7ZdO4cP9B/hgTwLnYEoRBQ4RGawUNPJQShERkWwKGnloJpWISDYFjTw0k0pEJFtN5J4aaOn9NDo6uzCyF4RrJpWIDGYKGjly99Nw6AkczdqQSUQGOQWNHEGD3+mA8dz8sypTKBGRKqExjRwa/BYRCaegkUOD3yIi4RQ0ciiNiIhIOI1p5EgPci9evpGtnV2M1OC3iEgPBY0As1uaFSRERAKoe0pERCJT0BARkcgUNEREJDIFDRERiUxBQ0REIlPQEBGRyBQ0REQkMgUNERGJTEFDREQiU9AQEZHIFDRERCQyBQ0REYms6oKGmf13M9toZuvN7LsZxxeY2Wupx2ZVsowiIoNVVWW5NbMZwGeBSe7+oZkdkzr+SeAyYAIwEnjKzD7u7t3hZytdW3uHUqOLiASotpbG3wKL3P1DAHffljr+WeB+d//Q3TcBrwGn9kcB2to7WPDwOjo6u3Cgo7OLBQ+vo629oz/eTkSkplRb0Pg48Odm9qKZ/dLMTkkdbwbeznjeltSxslu8fCNdiewGTFeim8XLN/bH24mI1JQB754ys6eAjwY8dD3J8gwHpgGnAMvM7GOABTzfQ84/F5gLMHr06KLLt7Wzq6jjIiKDyYAHDXc/O+wxM/tb4GF3d+AlMzsAfIRky+K4jKeOAraGnP9u4G6A1tbWwMCSz8imOB0BAWJkU7zYU4mI1J1q655qA84CMLOPA4cC7wGPAJeZ2WFmNhY4EXipPwowb9Y44rGGrGPxWAPzZo3rj7cTEakpVTV7CrgHuMfMfgvsA65KtTrWm9ky4BVgP3B1f82cSs+S0uwpEZHeLHlNrk+tra2+atWqShdDRKSmmNlqd28NeqzauqdERKSKKWiIiEhkChoiIhJZtQ2E1zWlJxGRWqegMUDS6UnSq83T6UkABQ4RqRnqnhogSk8iIvVAQWOAKD2JiNQDBY0BEpaGROlJRKSWKGgMEKUnEZF6oIHwAaL0JCJSDxQ0BtDslmYFCRGpaeqeEhGRyBQ0REQkMgUNERGJTEFDREQiU9AQEZHI6noTJjPbDrwZ4akfIbmtbL1QfapXPdUF6qs+9VQX6Ft9jnf3EUEP1HXQiMrMVoXtUlWLVJ/qVU91gfqqTz3VBfqvPuqeEhGRyBQ0REQkMgWNpLsrXYAyU32qVz3VBeqrPvVUF+in+mhMQ0REIlNLQ0REIhv0QcPMzjGzjWb2mpnNr3R5CjGze8xsm5n9NuPYUWb2CzP7ferf4RmPLUjVbaOZzapMqcOZ2XFmtsLMXjWz9Wb29dTxmquTmQ01s5fMbG2qLjenjtdcXTKZWYOZtZvZY6mfa7Y+ZrbZzNaZ2RozW5U6VpP1MbMmM3vQzDak/n5OH5C6uPug/QIagNeBjwGHAmuBT1a6XAXK/BfAycBvM459F5if+n4+8D9S338yVafDgLGpujZUug459TkWODn1/ZHA71Llrrk6AQYckfo+BrwITKvFuuTU6xvAT4DH6uD3bTPwkZxjNVkf4F+BL6W+PxRoGoi6DPaWxqnAa+7+hrvvA+4HPlvhMuXl7v8/8H7O4c+S/AUi9e/sjOP3u/uH7r4JeI1knauGu7/j7i+nvv8j8CrQTA3WyZN2pX6Mpb6cGqxLmpmNAs4FfpxxuGbrE6Lm6mNmf0LyBvJfANx9n7t3MgB1GexBoxl4O+PnLaljteZP3f0dSF6EgWNSx2uqfmY2BmgheYdek3VKdeWsAbYBv3D3mq1Lyh3A3wMHMo7Vcn0ceNLMVpvZ3NSxWqzPx4DtwL2prsMfm9nhDEBdBnvQsIBj9TSdrGbqZ2ZHAA8B17j7f+Z7asCxqqmTu3e7+xRgFHCqmZ2U5+lVXRczOw/Y5u6ro74k4FjV1CdlurufDHwauNrM/iLPc6u5PoeQ7Kb+kbu3ALtJdkeFKVtdBnvQ2AIcl/HzKGBrhcrSF++a2bEAqX+3pY7XRP3MLEYyYCxx94dTh2u6TqmugpXAOdRuXaYDF5jZZpJdt2eZ2X3Ubn1w962pf7cBPyXZRVOL9dkCbEm1ZAEeJBlE+r0ugz1o/Bo40czGmtmhwGXAIxUuUykeAa5KfX8V8LOM45eZ2WFmNhY4EXipAuULZWZGsl/2VXf/fsZDNVcnMxthZk2p7+PA2cAGarAuAO6+wN1HufsYkn8bz7j7FdRofczscDM7Mv09MBP4LTVYH3f/A/C2mY1LHfoU8AoDUZdKzwCo9BfwGZIzdl4Hrq90eSKU9z+Ad4AEybuHLwJHA08Dv0/9e1TG869P1W0j8OlKlz+gPv+FZDP5N8Ca1NdnarFOwCSgPVWX3wI3po7XXF0C6nYmB2dP1WR9SI4DrE19rU//vddwfaYAq1K/b23A8IGoi1aEi4hIZIO9e0pERIqgoCEiIpEpaIiISGQKGiIiEpmChoiIRKagISIikSloiIhIZAoaIiISmYKGSD8ys4Vm5mY23syWm9luM3vLzD6fevzK1CY6uyy5GdUJlS6zSD4KGiID4wHgcZL7G6wG7jGzfwT+lmR20s8D40hudiRStQ6pdAFEBonF7v5vAKltRs8HvgKM9VQq+FRW0v9pZse7+5uVK6pIOLU0RAbGz9PfuPsHJFNWv+DZe4dsSP2bmcJapKooaIgMjA9yft4XcgxgaP8XR6Q0ChoiIhKZgoaIiESmoCEiIpEpaIiISGTauU9ERCJTS0NERCJT0BARkcgUNEREJDIFDRERiUxBQ0REIlPQEBGRyBQ0REQkMgUNERGJTEFDREQi+7/6nLaHgzhsygAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1) = plt.subplots(1, 1)\n",
    "\n",
    "ax1.scatter(m_test, (y_test-y_fit)/y_test*100,label='relative % diff test')\n",
    "ax1.scatter(m_train, (y_train-y_est)/y_train*100,label='relative % diff train')\n",
    "ax1.legend()\n",
    "\n",
    "ax1.set_xlabel(xlabel='m',fontsize=16)\n",
    "ax1.set_ylabel(ylabel=r'$\\% diff$',fontsize=16)\n",
    "\n",
    "plt.savefig('Plots/x2_LO_DecisionTree_2.pdf')\n",
    "plt.show()"
   ]
  }
 ],
 "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
