{
"cells": [
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from tqdm import tnrange\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"import tensorflow as tf\n",
"from tensorflow.python.keras import models\n",
"from tensorflow.python.keras.layers import Dense\n",
"from tensorflow.python.keras.layers import Dropout\n",
"from tensorflow.python.keras.preprocessing import sequence\n",
"from tensorflow.python.keras.preprocessing import text"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Webpage_id | \n",
" Domain | \n",
" Url | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 31 | \n",
" isrctn.com | \n",
" http://www.isrctn.com/ISRCTN57801413 | \n",
"
\n",
" \n",
" 1 | \n",
" 32 | \n",
" www.clinicaltrialsregister.eu | \n",
" https://www.clinicaltrialsregister.eu/ctr-sear... | \n",
"
\n",
" \n",
" 2 | \n",
" 33 | \n",
" www.clinicaltrialsregister.eu | \n",
" https://www.clinicaltrialsregister.eu/ctr-sear... | \n",
"
\n",
" \n",
" 3 | \n",
" 34 | \n",
" www.clinicaltrialsregister.eu | \n",
" https://www.clinicaltrialsregister.eu/ctr-sear... | \n",
"
\n",
" \n",
" 4 | \n",
" 35 | \n",
" www.clinicaltrialsregister.eu | \n",
" https://www.clinicaltrialsregister.eu/ctr-sear... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Webpage_id Domain \\\n",
"0 31 isrctn.com \n",
"1 32 www.clinicaltrialsregister.eu \n",
"2 33 www.clinicaltrialsregister.eu \n",
"3 34 www.clinicaltrialsregister.eu \n",
"4 35 www.clinicaltrialsregister.eu \n",
"\n",
" Url \n",
"0 http://www.isrctn.com/ISRCTN57801413 \n",
"1 https://www.clinicaltrialsregister.eu/ctr-sear... \n",
"2 https://www.clinicaltrialsregister.eu/ctr-sear... \n",
"3 https://www.clinicaltrialsregister.eu/ctr-sear... \n",
"4 https://www.clinicaltrialsregister.eu/ctr-sear... "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tra_data=pd.read_csv(\"train.csv\")\n",
"tst_data=pd.read_csv(\"test.csv\")\n",
"tst_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Webpage_id | \n",
" Domain | \n",
" Url | \n",
" Tag | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" www.fiercepharma.com | \n",
" http://www.fiercepharma.com/marketing/tecfider... | \n",
" news | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" www.fiercepharma.com | \n",
" http://www.fiercepharma.com/pharma/novo-equipp... | \n",
" news | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" www.fiercepharma.com | \n",
" http://www.fiercepharma.com/pharma/another-exe... | \n",
" news | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" www.fiercepharma.com | \n",
" http://www.fiercepharma.com/pharma/teva-buy-bi... | \n",
" news | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" www.fiercepharma.com | \n",
" http://www.fiercepharma.com/marketing/actress-... | \n",
" news | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Webpage_id Domain \\\n",
"0 1 www.fiercepharma.com \n",
"1 2 www.fiercepharma.com \n",
"2 3 www.fiercepharma.com \n",
"3 4 www.fiercepharma.com \n",
"4 5 www.fiercepharma.com \n",
"\n",
" Url Tag \n",
"0 http://www.fiercepharma.com/marketing/tecfider... news \n",
"1 http://www.fiercepharma.com/pharma/novo-equipp... news \n",
"2 http://www.fiercepharma.com/pharma/another-exe... news \n",
"3 http://www.fiercepharma.com/pharma/teva-buy-bi... news \n",
"4 http://www.fiercepharma.com/marketing/actress-... news "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tra_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"others 17417\n",
"news 7992\n",
"publication 7705\n",
"profile 5196\n",
"conferences 4666\n",
"forum 4503\n",
"clinicalTrials 2839\n",
"thesis 1800\n",
"guidelines 1329\n",
"Name: Tag, dtype: int64"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tra_data.Tag.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"size=tra_data.shape[0]+tst_data.shape[0]"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting util.py\n"
]
}
],
"source": [
"%%writefile util.py\n",
"import re\n",
"from bs4 import BeautifulSoup\n",
"\n",
"r=re.compile('')\n",
"r2=re.compile('>(.*?)<')\n",
"sep='!@#$%^&*()'\n",
"\n",
"def write_pages_text(k,beg,end):\n",
" with open('pages%d.txt'%k,'w',encoding='utf-8') as w:\n",
" for i in range(beg,end):\n",
" with open('pages/%d.html'%(i+1),encoding='utf-8') as o:\n",
" p='.'.join([t.strip() for t in BeautifulSoup(o).get_text(sep).split(sep) if t.find('{')==-1 and len(t.strip())>0])\n",
" # print(p)\n",
" w.write(p.replace('\\n','')+'\\n')\n",
" \n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# import multiprocessing\n",
"# from util import write_pages_text\n",
"\n",
"# procs=4\n",
"# rng=size//procs\n",
"# for i in range(procs):\n",
"# if i < procs-1:\n",
"# p=multiprocessing.Process(target=write_pages_text, args=(i+1,i*rng,(i+1)*rng))\n",
"# else:\n",
"# p=multiprocessing.Process(target=write_pages_text, args=(i+1,i*rng,size))\n",
"# p.start()\n",
"# ! cat pages1.txt pages2.txt pages3.txt pages4.txt > pages.txt"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"370099"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def load_words():\n",
" with open('words_alpha.txt') as word_file:\n",
" valid_words = set(word_file.read().split())\n",
"\n",
" return valid_words\n",
"words_dict=load_words()\n",
"len(words_dict)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8ce3bc1da68e4bc089d39457a8a6dceb"
}
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"with open('pages.txt',encoding='utf-8') as o:\n",
" lines=o.readlines()\n",
" table=str.maketrans('','','!\\\"#$%&\\'()*+,-./:;<=>?@[\\]^_`{|}~')\n",
" for i in tnrange(len(lines)):\n",
" l = lines[i]\n",
" words = [w.translate(table).lower() for w in l.split() if w.translate(table).lower() in words_dict]\n",
" lines[i]=' '.join(words)\n",
" pages=[lines[i-1] for i in tra_data.Webpage_id]\n",
" pages_tst=[lines[i-1] for i in tst_data.Webpage_id]\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"53447 9 5938 466.0 114.0\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJwAAAFNCAYAAABFdHXxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xu0ZWV5J+rfC2jUiAKKiFwsNGUiJi06KorHnIh3hFY00R7StkFjGtOBqH30RDSJkKiRnNPR6ImaoBLxirRXFFpF4uVw0iqgiCLSVhClhAgKKorBgO/5Y80yi2LvXQtqrn2pep4x1thzfvObc71r7ZpQ9Rvf983q7gAAAADAWHZa6QIAAAAA2L4InAAAAAAYlcAJAAAAgFEJnAAAAAAYlcAJAAAAgFEJnAAAAAAYlcAJANhhVNVlVfWYFXjfdVXVVbXLbTz/WVV1ztT+j6rqPiPV9tKqevMYdS5w7f2HWnce43oAwNohcAIAGNm8g63uvnN3X7qVGg6pqk0zXOsvuvv3xqhry8/d3d8aar1pjOsDAGuHwAkAYAc11kgmAIAtCZwAgLkbRr68pKq+WlXXVtXfV9UdhmO7V9VHqurq4dhHqmrfqXMPqKrPVNV1VfWJqnp9Vb1j6vjBVfWPVfX9qvpSVR0yY007VdVxVfVPVfW9qjqtqvYYjm2eWnZUVX2rqr5bVX88de4dq+qUod6Lq+qPNo8mqqq3J9k/yYeH6WR/NPW2z1joegvUdreqOr2qflhVn09y3y2Od1X90rB92PC9XldV366qF1XVLyb5H0nuNdTwo6q6V1WdUFXvrap3VNUPkzxraHvHFiX8blVdUVVXVtULp973rVX1iqn9n4+iWuhzbzlFb6jh9Kq6pqo2VtV/nrrWCcPv4G3DZ7moqjZs/TcJAKxGAicAYLk8I8njMwlP7pfkT4b2nZL8fZJ7ZxJY/CTJ30yd964kn09ytyQnJHnm5gNVtU+SM5K8IskeSV6U5H1VtecM9TwvyZOTPCLJvZJcm+T1W/T5jSS/nOTRSV5WVfcf2o9Psi7JfZI8Nsl/2nxCdz8zybeSPHGYTvZ/zXC9Lb0+yb8k2TvJ7w6vxbwlyXO7e9ckv5rkH7r7x0mekOSKoYY7d/cVQ/8jkrw3yW5J3rnINR+ZZH2SxyU5bpbpgVv53Ju9O8mmTL7vpyb5i6p69NTxJyU5dajt9Nz8zwEAsIYInACA5fI33X15d1+T5JVJjkyS7v5ed7+vu6/v7uuGY49IJotOJ/n1JC/r7p929zmZBBGb/ackZ3b3md39s+4+K8l5SQ6boZ7nJvnj7t7U3TdkEmY9dYtpZn/W3T/p7i8l+VKSBw7t/yHJX3T3td29KcnrZvwOFrvezw0LbP/28Jl/3N1fSXLKEtf81yQHVtVdhnq+sJUa/md3f3D4vn6yRJ0/7u4vZxIGHrnVT7YVVbVfJoHbi7v7X7r7giRvzlSAmOSc4Xd5U5K3Z4HvBwBYGwROAMByuXxq+5uZjHJJVd2pqv6uqr45TPP6TJLdhuDlXkmu6e7rF7nOvZM8bZhO9/2q+n4mocbeM9Rz7yQfmDrv4iQ3Jdlrqs8/T21fn+TOw/a9tqhjenspi11v2p5Jdsktv6/F/HYmAds3q+rTVfWwrdQwS60L/q620ebf5XVbXHufqf0tv587WGcKANYmgRMAsFz2m9reP8nmKV4vzGSa2UO7+y5JfnNoryRXJtmjqu60yHUuT/L27t5t6vWL3X3iDPVcnuQJW5x7h+7+9gznXplk36n9/bY43jNcYzFXJ7kxt/y+FtTd53b3EUnukeSDSU7bSg2z1LbY7+rHSaZ/F/e8Fde+IpPf5a5bXHuW7xsAWGMETgDAcjmmqvYdFuZ+aZL3DO27ZrJu0/eHY8dvPqG7v5nJFLkTqur2w+idJ05d8x1JnlhVj6+qnavqDsNC1tNh0GL+Nskrq+reSVJVe1bVETN+ltOSvKQmC57vk+TYLY5/J5P1nW61YTrZ+zP5zHeqqgOTHLVQ3+E7eUZV3bW7/zXJDzMZpbW5hrtV1V1vQxl/Orz3A5I8O//2u7ogyWFVtUdV3TPJC7Y4b9HP3d2XJ/nHJK8afk//Lslzsvg6UgDAGiZwAgCWy7uSfDzJpcNr89PO/jrJHZN8N8lnk3x0i/OekeRhSb43nPOeJDckPw8xjsgkwLo6k1FL/2dm+zvOazNZD+rjVXXd8N4PnfGz/Hkmi19/I8knMlmE+4ap469K8ifDdL0XzXjNacdmMt3un5O8NZN1lBbzzCSXDdMRfz/DAubd/bVMFum+dKjj1kyL+3SSjUnOTvLfuvvjQ/vbM1l76rJMfpfv2eK8rX3uIzNZbP2KJB9Icvyw7hYAsJ2p7m0Z8Q0AsHVVdVmS3+vuT4xwrfck+Vp3H7/Vzsukqv5Lkqd39yNWuhYAgNXACCcAYFWrql+vqvtW1U5VdWgmI5o+uMI17V1VDx9q+uVM1qH6wErWBACwmnjqBwCw2t0zkzWN7pbJNLb/0t1fXNmScvskf5fkgCTfT3JqkjesaEUAAKuIKXUAAAAAjMqUOgAAAABGJXACAAAAYFTb5RpOd7/73XvdunUrXQYAAADAduP888//bnfvOUvf7TJwWrduXc4777yVLgMAAABgu1FV35y1ryl1AAAAAIxK4AQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIxql5UuAAAAAGB7se64M27RdtmJh69AJSvLCCcAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARiVwAgAAAGBUAicAAAAARjW3wKmq9quqT1bVxVV1UVU9f2g/oaq+XVUXDK/Dps55SVVtrKpLqurxU+2HDm0bq+q4edUMAAAAwLbbZY7XvjHJC7v7C1W1a5Lzq+qs4dhruvu/TXeuqgOTPD3JA5LcK8knqup+w+HXJ3lskk1Jzq2q07v7q3OsHQAAAIDbaG6BU3dfmeTKYfu6qro4yT5LnHJEklO7+4Yk36iqjUkeMhzb2N2XJklVnTr0FTgBAAAArELLsoZTVa1L8qAknxuajq2qC6vq5KrafWjbJ8nlU6dtGtoWawcAAABgFZp74FRVd07yviQv6O4fJnljkvsmOSiTEVB/tbnrAqf3Eu1bvs/RVXVeVZ139dVXj1I7AAAAALfeXAOnqrpdJmHTO7v7/UnS3d/p7pu6+2dJ3pR/mza3Kcl+U6fvm+SKJdpvprtP6u4N3b1hzz33HP/DAAAAADCTeT6lrpK8JcnF3f3qqfa9p7o9JclXhu3Tkzy9qn6hqg5Isj7J55Ocm2R9VR1QVbfPZGHx0+dVNwAAAADbZp5PqXt4kmcm+XJVXTC0vTTJkVV1UCbT4i5L8twk6e6Lquq0TBYDvzHJMd19U5JU1bFJPpZk5yQnd/dFc6wbAAAAgG0wz6fUnZOF1186c4lzXpnklQu0n7nUeQAAAACsHsvylDoAAAAAdhwCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFQCJwAAAABGJXACAAAAYFRzC5yqar+q+mRVXVxVF1XV84f2ParqrKr6+vBz96G9qup1VbWxqi6sqgdPXeuoof/Xq+qoedUMAAAAwLab5winG5O8sLvvn+TgJMdU1YFJjktydnevT3L2sJ8kT0iyfngdneSNySSgSnJ8kocmeUiS4zeHVAAAAACsPnMLnLr7yu7+wrB9XZKLk+yT5IgkpwzdTkny5GH7iCRv64nPJtmtqvZO8vgkZ3X3Nd19bZKzkhw6r7oBAAAA2DbLsoZTVa1L8qAkn0uyV3dfmUxCqST3GLrtk+TyqdM2DW2LtQMAAACwCs09cKqqOyd5X5IXdPcPl+q6QFsv0b7l+xxdVedV1XlXX331bSsWAAAAgG0218Cpqm6XSdj0zu5+/9D8nWGqXIafVw3tm5LsN3X6vkmuWKL9Zrr7pO7e0N0b9txzz3E/CAAAAAAzm+dT6irJW5Jc3N2vnjp0epLNT5o7KsmHptp/Z3ha3cFJfjBMuftYksdV1e7DYuGPG9oAAAAAWIV2meO1H57kmUm+XFUXDG0vTXJiktOq6jlJvpXkacOxM5MclmRjkuuTPDtJuvuaqnp5knOHfn/e3dfMsW4AAAAAtsHcAqfuPicLr7+UJI9eoH8nOWaRa52c5OTxqgMAAABgXpblKXUAAAAA7DgETgAAAACMSuAEAAAAwKgETgAAAACMSuAEAAAAwKgETgAAAACMSuAEAAAAwKgETgAAAACMaquBU1Xdt6p+Ydg+pKqeV1W7zb80AAAAANaiWUY4vS/JTVX1S0nekuSAJO+aa1UAAAAArFmzBE4/6+4bkzwlyV93939Nsvd8ywIAAABgrZolcPrXqjoyyVFJPjK03W5+JQEAAACwls0SOD07ycOSvLK7v1FVByR5x3zLAgAAAGCt2mVrHbr7q1X14iT7D/vfSHLivAsDAAAAYG2a5Sl1T0xyQZKPDvsHVdXp8y4MAAAAgLVplil1JyR5SJLvJ0l3X5DJk+oAAAAA4BZmCZxu7O4fbNHW8ygGAAAAgLVvq2s4JflKVf3HJDtX1fokz0vyj/MtCwAAAIC1apYRTn+Y5AFJbkjy7iQ/TPKCeRYFAAAAwNo1y1Pqrk/yx8MLAAAAAJa01cCpqj6cW67Z9IMk5yX5u+7+l3kUBgAAAMDaNMuUukuT/CjJm4bXD5N8J8n9hn0AAAAA+LlZFg1/UHf/5tT+h6vqM939m1V10bwKAwAAAGBtmmWE055Vtf/mnWH77sPuT+dSFQAAAABr1iwjnF6Y5Jyq+qckleSAJH9QVb+Y5JR5FgcAAADA2jPLU+rOrKr1SX4lk8Dpa1MLhf/1PIsDAAAAYO2ZZYRTkqxP8stJ7pDk31VVuvtt8ysLAAAAgLVqq4FTVR2f5JAkByY5M8kTkpyTROAEAAAAwC3MMsLpqUkemOSL3f3sqtoryZvnWxbLbd1xZ9yi7bITD1+BSgAAAIC1bpan1P2ku3+W5MaqukuSq5LcZ75lAQAAALBWzTLC6byq2i3Jm5Kcn+RHST4/16oAAAAAWLNmeUrdHwybf1tVH01yl+6+cL5lAQAAALBWzfSUuqr6rSS/kaQzWTBc4MQorB0FAAAA25+truFUVW9I8vtJvpzkK0meW1Wvn3dhAAAAAKxNs4xwekSSX+3uTpKqOiWT8AkAAAAAbmGWp9RdkmT/qf39YkodAAAAAIuYZYTT3ZJcXFWbn0z360n+Z1WdniTd/aR5FQcAAADA2jNL4PSyuVfBDmGhBcIBAACA7c9WA6fu/vRyFAIAAADA9mGWNZxuk6o6uaquqqqvTLWdUFXfrqoLhtdhU8deUlUbq+qSqnr8VPuhQ9vGqjpuXvUCAAAAMI65BU5J3prk0AXaX9PdBw2vM5Okqg5M8vQkDxjOeUNV7VxVOyd5fZInJDkwyZFDXwAAAABWqUUDp6o6e/j5l7flwt39mSTXzNj9iCSndvcN3f2NJBuTPGR4bezuS7v7p0lOHfoCAAAAsEotNcJp76p6RJInVdWDqurB069teM9jq+rCYcrd7kPbPkkun+qzaWhbrB0AAACAVWqpRcNfluS4JPsmefUWxzrJo27D+70xycuH81+e5K+S/G6SWqBvZ+FArBe6cFUdneToJNl///1vQ2kAAAAAjGHRwKm735vkvVX1p9398jHerLu/s3m7qt6U5CPD7qYk+0113TfJFcP2Yu1bXvukJCclyYYNGxYMpdh264474xZtl514+ApUAgAAAKxWS41wSpJ098ur6klJfnNo+lR3f2SpcxZTVXt395XD7lOSbH6C3elJ3lVVr05yryTrk3w+k5FP66vqgCTfzmRh8f94W96b5bVQMDX29QRdAAAAsDptNXCqqldlsnj3O4em51fVw7v7JVs5791JDkly96ralOT4JIdU1UGZTIu7LMlzk6S7L6qq05J8NcmNSY7p7puG6xyb5GNJdk5ycndfdGs/JPM1dri0LQRTAAAAsPK2GjglOTzJQd39sySpqlOSfDHJkoFTdx+5QPNbluj/yiSvXKD9zCRnzlAnAAAAAKvALIFTkuyW5Jph+65zqgWSmI4HAAAAa90sgdOrknyxqj6ZyZpKv5mtjG5i+7CapsoBAAAAa8csi4a/u6o+leTXMwmcXtzd/zzvwgAAAABYm2aaUjc8We70OdcCAAAAwHZgp5UuAAAAAIDty6yLhsOqY40pAAAAWJ2WHOFUVTtV1VeWqxgAAAAA1r4lA6fu/lmSL1XV/stUDwAAAABr3CxT6vZOclFVfT7Jjzc3dveT5lYVAAAAAGvWLIHTn829CpaNdY8AAACAedtq4NTdn66qeydZ392fqKo7Jdl5/qUBAAAAsBYtuYZTklTVf07y3iR/NzTtk+SD8ywKAAAAgLVrq4FTkmOSPDzJD5Oku7+e5B7zLAoAAACAtWuWwOmG7v7p5p2q2iVJz68kAAAAANayWRYN/3RVvTTJHavqsUn+IMmH51sWY7BAOAAAALASZhnhdFySq5N8Oclzk5yZ5E/mWRQAAAAAa9csT6n7WVWdkuRzmUylu6S7TakDAAAAYEFbDZyq6vAkf5vkn5JUkgOq6rnd/T/mXRwAAAAAa88sazj9VZJHdvfGJKmq+yY5I4nACQAAAIBbmGUNp6s2h02DS5NcNad6AAAAAFjjFh3hVFW/NWxeVFVnJjktkzWcnpbk3GWoDQAAAIA1aKkpdU+c2v5OkkcM21cn2X1uFQEAAACwpi0aOHX3s5ezEAAAAAC2D7M8pe6AJH+YZN10/+5+0vzKAgAAAGCtmuUpdR9M8pYkH07ys/mWwyzWHXfGLdouO/HwFahk7fIdAgAAwPzMEjj9S3e/bu6VAAAAALBdmCVwem1VHZ/k40lu2NzY3V+YW1UAAAAArFmzBE6/luSZSR6Vf5tS18M+AAAAANzMLIHTU5Lcp7t/Ou9iAAAAAFj7dpqhz5eS7DbvQgAAAADYPswywmmvJF+rqnNz8zWcnjS3qgAAAABYs2YJnI6fexVss3XHnbHSJQAAAAAkmSFw6u5PL0chAAAAAGwftho4VdV1mTyVLklun+R2SX7c3XeZZ2EAAAAArE2zjHDadXq/qp6c5CFzqwhWyGLTEi878fBlrgQAAADWtlmeUncz3f3BJI+aQy0AAAAAbAdmmVL3W1O7OyXZkH+bYgcAAAAANzPLU+qeOLV9Y5LLkhwxl2oAAAAAWPNmWcPp2ctRCKxWC63tZF0nAAAAWNyigVNVvWyJ87q7X77Uhavq5CT/PslV3f2rQ9seSd6TZF0mI6X+Q3dfW1WV5LVJDktyfZJndfcXhnOOSvInw2Vf0d2nzPC5AAAAAFghSy0a/uMFXknynCQvnuHab01y6BZtxyU5u7vXJzl72E+SJyRZP7yOTvLG5OcB1fFJHprJk/GOr6rdZ3hvAAAAAFbIooFTd//V5leSk5LcMcmzk5ya5D5bu3B3fybJNVs0H5Fk8wilU5I8ear9bT3x2SS7VdXeSR6f5Kzuvqa7r01yVm4ZYgEAAACwiiw1wilVtUdVvSLJhZlMv3twd7+4u6+6je+3V3dfmSTDz3sM7fskuXyq36ahbbH2hWo9uqrOq6rzrr766ttYHgAAAADbatHAqar+7yTnJrkuya919wnDKKN5qAXaeon2WzZ2n9TdG7p7w5577jlqcQAAAADMbqmn1L0wyQ2ZLNj9x5N1vZNMQqDu7rvchvf7TlXt3d1XDlPmNo+U2pRkv6l++ya5Ymg/ZIv2T92G94W58zQ7AAAAmFhqDaeduvuO3b1rd99l6rXrbQybkuT0JEcN20cl+dBU++/UxMFJfjBMuftYksdV1e7DYuGPG9oAAAAAWKWWGuG0Tarq3ZmMTrp7VW3K5GlzJyY5raqek+RbSZ42dD8zyWFJNia5PpPFydPd11TVyzOZ2pckf97dWy5EDgAAAMAqMrfAqbuPXOTQoxfo20mOWeQ6Jyc5ecTSAAAAAJijuQVOsD1baL0mAAAAYELgBHM0azBlcXEAAAC2J4suGg4AAAAAt4XACQAAAIBRCZwAAAAAGJXACQAAAIBRCZwAAAAAGJXACQAAAIBRCZwAAAAAGJXACQAAAIBRCZwAAAAAGJXACQAAAIBRCZwAAAAAGJXACQAAAIBR7bLSBbC0dcedsdIlAAAAANwqRjgBAAAAMCqBEwAAAACjMqUOVoGFpk5eduLhK1AJAAAAbDsjnAAAAAAYlcAJAAAAgFGZUgerlGl2AAAArFVGOAEAAAAwKiOcYA0x6gkAAIC1wAgnAAAAAEYlcAIAAABgVAInAAAAAEYlcAIAAABgVAInAAAAAEYlcAIAAABgVAInAAAAAEYlcAIAAABgVLusdAHA+NYdd8Yt2i478fAVqAQAAIAdkcAJ1riFwiUAAABYSQIn2IEZCQUAAMA8WMMJAAAAgFEJnAAAAAAYlSl1sIOw1hMAAADLxQgnAAAAAEa1IoFTVV1WVV+uqguq6ryhbY+qOquqvj783H1or6p6XVVtrKoLq+rBK1EzAAAAALNZyRFOj+zug7p7w7B/XJKzu3t9krOH/SR5QpL1w+voJG9c9koBAAAAmNlqWsPpiCSHDNunJPlUkhcP7W/r7k7y2ararar27u4rV6RK2M4tttbTZScevsyVAAAAsFat1AinTvLxqjq/qo4e2vbaHCINP+8xtO+T5PKpczcNbQAAAACsQis1wunh3X1FVd0jyVlV9bUl+tYCbX2LTpPg6ugk2X///cepEgAAAIBbbUVGOHX3FcPPq5J8IMlDknynqvZOkuHnVUP3TUn2mzp93yRXLHDNk7p7Q3dv2HPPPedZPgAAAABLWPbAqap+sap23byd5HFJvpLk9CRHDd2OSvKhYfv0JL8zPK3u4CQ/sH4TAAAAwOq1ElPq9krygara/P7v6u6PVtW5SU6rquck+VaSpw39z0xyWJKNSa5P8uzlLxkAAACAWS174NTdlyZ54ALt30vy6AXaO8kxy1AaAAAAACNYqUXDge3AuuPOuEXbZScevgKVAAAAsJoInIBRCaEAAAAQOAEzWShIGvt6gikAAIDtg8AJmLtZwyohFAAAwPZB4ARsF4RVAAAAq8dOK10AAAAAANsXI5yAVc3IJQAAgLXHCCcAAAAARiVwAgAAAGBUptQBa46n3gEAAKxuAidghzJrWCWYAgAAuO1MqQMAAABgVAInAAAAAEYlcAIAAABgVNZwApjRYus/We8JAADg5oxwAgAAAGBUAicAAAAARmVKHcA2WmiqnWl2AADAjkzgBLCAxdZrAgAAYOtMqQMAAABgVEY4AczBrNPsTMcDAAC2RwIngGUy6zQ9IRQAALDWmVIHAAAAwKiMcAJYo4yEAgAAVisjnAAAAAAYlRFOADsgo6MAAIB5EjgBrAEWHAcAANYSgRMASYRVAADAeAROANu5WUdHLdd7C7EAAGD7J3ACYFGzBkbzCLW2JawSdAEAwMoSOAFwq6zkiCkAAGBtEDgBsKzGHrkEAACsPgInAFbccgRJptkBAMDyETgBwG0wjwBLKAYAwPZC4ATADms5FkU3DRAAgB2RwAkApqy2cGnWay7HSKjVVAsAAKubwAkAtgPCIAAAVhOBEwDsQFZqgfZtNetUx2154uG2hHHzePqicBAAWMsETgDAdmM5gqTlOHce5hGKjXm9lQzYVlN4OasdMahcbX9utie+28X5buC2WzOBU1UdmuS1SXZO8ubuPnGFSwIAlslyBD9rISDanm3r5x07PBv7+1+OhxTcmveZ9dyFjB3GLUfN22rs39VKfofL8Wd7W2zL51uu6eXb8j4rNcJ2W993Nd3PKzUi+dZck4nq7pWuYauqauck/yvJY5NsSnJukiO7+6sL9d+wYUOfd955y1jh/PjDCwDMyzwCD2B1WK7AaXuy2v+buBz1zePPje918fdZi6rq/O7eMFPfNRI4PSzJCd39+GH/JUnS3a9aqL/ACQAAAFgtdsTAaad5FzOSfZJcPrW/aWgDAAAAYJVZK2s41QJtNxuaVVVHJzl62P1RVV0y96qWx92TfHeli4DtkHsL5sO9BfPh3oL5cG+xLOovV7qC0dx71o5rJXDalGS/qf19k1wx3aG7T0py0nIWtRyq6rxZh6sBs3NvwXy4t2A+3FswH+4tmJ+1MqXu3CTrq+qAqrp9kqcnOX2FawIAAABgAWtihFN331hVxyb5WJKdk5zc3RetcFkAAAAALGBNBE5J0t1nJjlzpetYAdvdNEFYJdxbMB/uLZgP9xbMh3sL5qS6e+u9AAAAAGBGa2UNJwAAAADWCIHTKlZVh1bVJVW1saqOW+l6YLWrqpOr6qqq+spU2x5VdVZVfX34ufvQXlX1uuH+urCqHjx1zlFD/69X1VEr8Vlgtaiq/arqk1V1cVVdVFXPH9rdW7ANquoOVfX5qvrScG/92dB+QFV9brhP3jM8MCdV9QvD/sbh+Lqpa71kaL+kqh6/Mp8IVpeq2rmqvlhVHxn23VuwzAROq1RV7Zzk9UmekOTAJEdW1YErWxWsem9NcugWbcclObu71yc5e9hPJvfW+uF1dJI3JpN/RCc5PslDkzwkyfGb/yENO6gbk7ywu++f5OAkxwz/P3JPScgiAAAHJElEQVRvwba5IcmjuvuBSQ5KcmhVHZzkL5O8Zri3rk3ynKH/c5Jc292/lOQ1Q78M9+PTkzwgk/8HvmH4eyTs6J6f5OKpffcWLDOB0+r1kCQbu/vS7v5pklOTHLHCNcGq1t2fSXLNFs1HJDll2D4lyZOn2t/WE59NsltV7Z3k8UnO6u5ruvvaJGflliEW7DC6+8ru/sKwfV0mf3nfJ+4t2CbDPfKjYfd2w6uTPCrJe4f2Le+tzffce5M8uqpqaD+1u2/o7m8k2ZjJ3yNhh1VV+yY5PMmbh/2KewuWncBp9donyeVT+5uGNuDW2au7r0wm/3BOco+hfbF7zL0HiximGTwoyefi3oJtNkz5uSDJVZmEsP+U5PvdfePQZfo++fk9NBz/QZK7xb0FC/nrJH+U5GfD/t3i3oJlJ3BavWqBNo8UhPEsdo+592ABVXXnJO9L8oLu/uFSXRdoc2/BArr7pu4+KMm+mYycuP9C3Yaf7i2YQVX9+yRXdff5080LdHVvwZwJnFavTUn2m9rfN8kVK1QLrGXfGabzZPh51dC+2D3m3oMtVNXtMgmb3tnd7x+a3Vswku7+fpJPZbJO2m5VtctwaPo++fk9NBy/aybTyN1bcHMPT/Kkqrosk2VJHpXJiCf3FiwzgdPqdW6S9cPTFG6fyYJ1p69wTbAWnZ5k89Owjkryoan23xmeqHVwkh8M04I+luRxVbX7sKDx44Y22CEN61i8JcnF3f3qqUPuLdgGVbVnVe02bN8xyWMyWSPtk0meOnTb8t7afM89Nck/dHcP7U8fnrR1QCYL9n9+eT4FrD7d/ZLu3re712Xyb6h/6O5nxL0Fy26XrXdhJXT3jVV1bCZ/Gd85ycndfdEKlwWrWlW9O8khSe5eVZsyeSLWiUlOq6rnJPlWkqcN3c9MclgmC0Ben+TZSdLd11TVyzMJfZPkz7t7y4XIYUfy8CTPTPLlYa2ZJHlp3FuwrfZOcsrw1KudkpzW3R+pqq8mObWqXpHki5kEvhl+vr2qNmYy+uLpSdLdF1XVaUm+mslTJY/p7puW+bPAWvDiuLdgWdUkvAUAAACAcZhSBwAAAMCoBE4AAAAAjErgBAAAAMCoBE4AAAAAjErgBAAAAMCoBE4AwHarqn405+s/q6ruNbV/WVXdfRuu9+6qurCq/us4FQIArIxdVroAAIA17FlJvpLkim29UFXdM8n/1t333tZrAQCsNCOcAIAdSlXtWVXvq6pzh9fDh/YTqurkqvpUVV1aVc+bOudPq+prVXXWMArpRVX11CQbkryzqi6oqjsO3f+wqr5QVV+uql9Z4P3vUFV/Pxz/YlU9cjj08ST3GK71v29xzhOr6nND/09U1V4LXPdZVfWhqvpoVV1SVcdPHftgVZ1fVRdV1dFT7c+pqv81fOY3VdXfLPUdAQDMyggnAGBH89okr+nuc6pq/yQfS3L/4divJHlkkl2TXFJVb0zywCS/neRBmfzd6QtJzu/u91bVsUle1N3nJUlVJcl3u/vBVfUHSV6U5Pe2eP9jkqS7f20IpD5eVfdL8qQkH+nugxao+ZwkB3d3V9XvJfmjJC9coN9DkvxqkuuTnFtVZwy1/W53XzOEYudW1fuS/EKSP03y4CTXJfmHJF+a4TsCANgqgRMAsKN5TJIDh3AoSe5SVbsO22d09w1Jbqiqq5LsleQ3knyou3+SJFX14a1c//3Dz/OT/NYCx38jyf+TJN39tar6ZpL7JfnhEtfcN8l7qmrvJLdP8o1F+p3V3d8b6nz/8F7nJXleVT1l6LNfkvVJ7pnk0919zdD/vw91JIt8R9193RI1AgD8nMAJANjR7JTkYZsDpM2GcOWGqaabMvm7UuXW2XyNzedv6dZeL5kEVK/u7tOr6pAkJyzSr7fcH/o/JpPPfH1VfSrJHbZSx4LfEQDArKzhBADsaD6e5NjNO1W10BS2aeckeeKw9tKdkxw+dey6TKbf3RqfSfKM4b3vl2T/JJds5Zy7Jvn2sH3UEv0eW1V7DFPnnpzk/xvOvXYIm34lycFD388neURV7V5Vu2QybXCzW/sdAQDcjMAJANie3amqNk29/o8kz0uyoaourKqvJvn9pS7Q3ecmOT2T9Y3en8kUtR8Mh9+a5G+3WDR8a96QZOeq+nKS9yR51jCNbyknJPnvVfX/JvnuEv3OSfL2JBcked+wftNHk+xSVRcmeXmSzw6f69tJ/iLJ55J8IslXpz7XrfqOAAC2VN1bjrwGAGBaVd25u39UVXfKZITS0d39hZWua1pVPSvJhu4+dmt9p87Z/Ll2SfKBJCd39wfmVSMAsOOwhhMAwNadVFUHZrL20SmrLWzaBidU1WMy+VwfT/LBFa4HANhOGOEEAAAAwKis4QQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIxK4AQAAADAqAROAAAAAIzq/wfVew36w9ZPWgAAAABJRU5ErkJggg==\n",
"text/plain": [
"