diff --git a/posts/2024-attention.ipynb b/posts/2024-attention.ipynb new file mode 100644 index 0000000..d5d7e50 --- /dev/null +++ b/posts/2024-attention.ipynb @@ -0,0 +1,687 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "12a1fd37", + "metadata": { + "vscode": { + "languageId": "raw" + } + }, + "source": [ + "---\n", + "author: Nipun Batra\n", + "badges: true\n", + "categories:\n", + "- ML\n", + "date: '2024-5-30'\n", + "title: RNN\n", + "toc: true\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c1e75d2d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "%config InlineBackend.figure_format = 'retina'\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "from einops import rearrange, reduce, repeat" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "88b73e31", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2024-05-30 09:41:48-- https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 8752 (8.5K) [text/plain]\n", + "Saving to: ‘names-indian.txt’\n", + "\n", + "names-indian.txt 100%[===================>] 8.55K --.-KB/s in 0s \n", + "\n", + "2024-05-30 09:41:49 (33.8 MB/s) - ‘names-indian.txt’ saved [8752/8752]\n", + "\n" + ] + } + ], + "source": [ + "!wget https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt -O names-indian.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0821eb9b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
0Abhishek
1Aman
2Harsh
3Ayush
4Aditi
......
1160Prasoon
1161Madhusudan
1162Prastuti
1163Rampratap
1164Madhukar
\n", + "

1165 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " 0\n", + "0 Abhishek\n", + "1 Aman\n", + "2 Harsh\n", + "3 Ayush\n", + "4 Aditi\n", + "... ...\n", + "1160 Prasoon\n", + "1161 Madhusudan\n", + "1162 Prastuti\n", + "1163 Rampratap\n", + "1164 Madhukar\n", + "\n", + "[1165 rows x 1 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.read_csv('names-indian.txt', header=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a3cc557e", + "metadata": {}, + "outputs": [], + "source": [ + "# convert all names to lowercase\n", + "names = pd.read_csv('names-indian.txt', header=None)[0].str.lower().values" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "562eb3c2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['abhishek', 'aman', 'harsh', ..., 'prastuti', 'rampratap',\n", + " 'madhukar'], dtype=object)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e23abf7d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Density')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAALmCAYAAAD4wPyKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AABy40lEQVR4nOzde5iWVb0//veDwxkURVER8oQEmjtNMBUNqaQUleigHUwxMMudqV/Svrkr2e3MzPwaWu0kUNRtSbmNMjJ1s0ERIcAwbYsipAaICp44jcjI8/vDH8+WOM4wB27m9bquua41z73utT4z3N4zvmc96y6Vy+VyAAAAAAAonBZNXQAAAAAAAHUj4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKCqmroAiuONN97I448/niTZa6+9UlXl8gEAAACAbVVTU5OlS5cmSQ4//PC0adNmu8eU0LHNHn/88Rx99NFNXQYAAAAAFN7MmTPTt2/f7R7HFg0AAAAAAAVlBS/bbK+99qq0Z86cmX333bcJqwEAAACAYlmyZEnlHfLvzNq2h4CXbfbOPXf33XffdOvWrQmrAQAAAIDiqq/nW9miAQAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACioqqYuAABoPMPGzWrqEprM2KF9m7oEAACAemcFLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAt4kzz33XEaMGJFevXqlffv22WOPPdK3b99cc801Wb169XaNvXr16tx111358pe/nL59+2b33XdPy5Yt07lz5xx77LEZOXJkXnjhha2Oc+KJJ6ZUKm3TBwAAAADQPFQ1dQFN7e67785ZZ52V5cuXV15bvXp1Zs+endmzZ2fMmDGZOHFievToUeuxH3vssfTr1y8rV67c6Ngrr7ySGTNmZMaMGbnuuusyevTonHnmmdv1tQAAAAAAzUuzDnjnzJmTM888M9XV1enQoUO+8Y1vZMCAAamurs4dd9yRn//855k3b14GDRqU2bNnp2PHjrUaf/ny5ZVwt1+/fjn11FPTp0+fdO7cOUuXLs1dd92Vn//851m+fHk+97nPZdddd83JJ5+8xTH79OmTm2++uc5fMwAAAACw82jWAe9FF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFmr8Vu0aJEzzjgjV1xxRQ499NCNjg8cODAnn3xyhgwZkrfeeisXXnhhnn766S1us9C+ffu85z3vqVUdAAAAAMDOqdnuwTtz5sxMnTo1STJs2LANwt31RowYkd69eydJRo0albVr19ZqjuOOOy7jx4/fZLi73uDBg/Pxj388SbJgwYLMmTOnVnMAAAAAAM1Xsw14J0yYUGmfe+65m+zTokWLnH322UmS1157LZMnT26QWgYMGFBpL1iwoEHmAAAAAAB2Ps024H3ooYeSvL3lwVFHHbXZfv3796+0p02b1iC1rFmzptLeZZddGmQOAAAAAGDn02z34J07d26SpEePHqmq2vy3oVevXhudU98eeOCBSnv9lhCb8+STT+b9739/nnrqqbzxxhvZc889c9RRR+UTn/hEPvOZz6Rly5Z1rmPRokVbPL5kyZI6jw0AAAAA1L9mGfC+8cYbWbZsWZKkW7duW+y7++67p3379lm1alUWLlxY77X85S9/ycSJE5Mkhx9++FYD3hdffDEvvvhi5fPFixdn8eLF+d3vfperr746d95551bH2Jzu3bvX6TwAAAAAoGk0y4B3xYoVlXaHDh222n99wLty5cp6rWPNmjUZPnx43nrrrSTJlVdeudm+LVq0yIc+9KGccsopee9735vOnTtnxYoV+fOf/5wbb7wxc+fOzRNPPJEBAwZk5syZede73lWvtQIAAAAAO55mGfC+8cYblXarVq222r9169ZJkurq6nqt4ytf+Upmz56dJDnnnHNy2mmnbbbvXXfdlU6dOm30+gknnJALLrgg5513Xm655Za8+OKLufjii3PXXXfVup6trVBesmRJjj766FqPCwAAAAA0jGYZ8LZp06bSfvPNN7faf/1D0Nq2bVtvNVx11VUZM2ZMkqRv3775yU9+ssX+mwp312vZsmXGjBmTGTNm5KmnnspvfvObLF68OPvtt1+tatradhUAAAAAwI6lRVMX0BQ6duxYaW/LtgurVq1Ksm3bOWyLG2+8MZdffnmStx/i9oc//CHt27ffrjGrqqoybNiwyufvfHAbAAAAALBzapYBb5s2bdK5c+ckyaJFi7bY99VXX60EvPXxELJf/vKXueCCC5Ik+++/f+6///7sueee2z1ukhx66KGV9uLFi+tlTAAAAABgx9UsA97kf8PQ+fPnp6amZrP9nnzyyUq7d+/e2zXn7373u5x99tlZt25d9t1330yaNKlet0UolUr1NhYAAAAAsONrtgHv8ccfn+Tt7RceeeSRzfZ751YH/fr1q/N8kyZNyhlnnJGampp07tw5999/fw4++OA6j7cpTzzxRKXdtWvXeh0bAAAAANjxNNuA92Mf+1ilffPNN2+yz7p163LrrbcmefshZwMGDKjTXA8//HAGDx6cNWvWZLfddsu9996bww47rE5jbU5NTU1uuummyucf+MAH6nV8AAAAAGDH02wD3qOPPjonnHBCkmTs2LGZPn36Rn2uvfbazJ07N0ly0UUXpWXLlhscnzJlSkqlUkqlUoYOHbrJeR599NEMGjQoq1atSvv27TNx4sQcddRRtap18uTJee211zZ7fO3atRk+fHil1tNOO61e9gsGAAAAAHZsVU1dQFMaNWpU+vXrl+rq6gwcODCXX355BgwYkOrq6txxxx0ZPXp0kqRnz54ZMWJErcdfsGBBPvKRj1TC2e9+97vZbbfd8te//nWz53Tp0iVdunTZ4LVbbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVetaAQAAAIDiadYB75FHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOvxp06dmpdeeqny+SWXXLLVc6644oqMHDlyo9dXrlyZX/ziF/nFL36x2XMPP/zw3HHHHTnwwANrXSsAAAAAUDzNOuBN3t7O4LHHHsuoUaMyceLELFq0KK1atUqPHj3yqU99Kl/5ylfSrl27Jq3x61//eo444ohMnz49TzzxRJYuXZpXXnklrVu3zt57750+ffrkk5/8ZIYMGZJddtmlSWsFAAAAABpPqVwul5u6CIph0aJFlb19Fy5cmG7dujVxRQDU1rBxs5q6hCYzdmjfpi4BAABo5hoiX2u2D1kDAAAAACg6AS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoKqaugAAaArDxs1q6hIAAABgu1nBCwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4kzz33HMZMWJEevXqlfbt22ePPfZI3759c80112T16tXbNfbq1atz11135ctf/nL69u2b3XffPS1btkznzp1z7LHHZuTIkXnhhRdqNd4PfvCD9O3bN3vssUfat2+fXr16ZcSIEXnuuee2q1YAAAAAoFhK5XK53NRFNKW77747Z511VpYvX77J4z179szEiRPTo0ePWo/92GOPpV+/flm5cuUW++26664ZPXp0zjzzzC32mz9/fk455ZQ8/fTTmx3n9ttvz6mnnlrrWrfFokWL0r179yTJwoUL061btwaZB6AxDBs3q6lLoJGNHdq3qUsAAACauYbI15r1Ct45c+bkzDPPzPLly9OhQ4dceeWVefjhhzNp0qScd955SZJ58+Zl0KBBWbFiRa3HX758eSXc7devX6666qrcf//9+fOf/5x77703559/flq0aJHly5fnc5/7XO65557NjrVixYoMGjSoEu6ed955mTRpUh5++OFceeWV6dChQ5YvX54zzzwzjz76aO2/GQAAAABA4VQ1dQFN6aKLLkp1dXWqqqpy33335dhjj60c++AHP5hDDjkkl112WebNm5drr702I0eOrNX4LVq0yBlnnJErrrgihx566EbHBw4cmJNPPjlDhgzJW2+9lQsvvDBPP/10SqXSRn2vueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRdnypQptaoVAAAAACieZruCd+bMmZk6dWqSZNiwYRuEu+uNGDEivXv3TpKMGjUqa9eurdUcxx13XMaPH7/JcHe9wYMH5+Mf/3iSZMGCBZkzZ85GfdauXZvrr78+SdK7d++MGDFik3MNGzYsSfLAAw9k1ixvPQYAAACAnV2zDXgnTJhQaZ977rmb7NOiRYucffbZSZLXXnstkydPbpBaBgwYUGkvWLBgo+OTJ0/O66+/niQ555xz0qLFpv/Zhg4dWmn/5je/qd8iAQAAAIAdTrMNeB966KEkSfv27XPUUUdttl///v0r7WnTpjVILWvWrKm0d9lll42Or6/1H+v5R3369Em7du2SNFytAAAAAMCOo9kGvHPnzk2S9OjRI1VVm9+KuFevXhudU98eeOCBSnv9lhDv9MQTT2yynn9UVVWVHj16JGm4WgEAAACAHUezfMjaG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9V7LX/7yl0ycODFJcvjhh28y4F20aFGSt1cbd+rUaYvjde/ePY899liWLl2aNWvWpHXr1ttcy/p5NmfJkiXbPBYAAAAA0PCaZcC7YsWKSrtDhw5b7b8+4F25cmW91rFmzZoMHz48b731VpLkyiuv3GS/9fVua63rrVy5slYBb/fu3be5LwAAAADQ9JrlFg1vvPFGpd2qVaut9l8fklZXV9drHV/5ylcye/bsJG8/PO20007bZL/19dam1qT+6wUAAAAAdizNcgVvmzZtKu0333xzq/3XPwStbdu29VbDVVddlTFjxiRJ+vbtm5/85Ceb7bu+3trUmtS+3q1tQbFkyZIcffTRtRoTAAAAAGg4zTLg7dixY6W9LdsurFq1Ksm2bZGwLW688cZcfvnlSd5+aNof/vCHDbZW+Efr661NrUnt693afsQAAAAAwI6lWW7R0KZNm3Tu3DnJ1h8s9uqrr1ZC0/rYo/aXv/xlLrjggiTJ/vvvn/vvvz977rnnFs9ZH7yuWrUqr7322hb7rl+Fu9dee9Vq/10AAAAAoHiaZcCbJIceemiSZP78+ampqdlsvyeffLLS7t2793bN+bvf/S5nn3121q1bl3333TeTJk3aplWz62v9x3r+UU1NTRYsWFAvtQIAAAAAO75mG/Aef/zxSd5eFfvII49stt8DDzxQaffr16/O802aNClnnHFGampq0rlz59x///05+OCDa1XrP9bzj2bPnl1Zbbw9tQIAAAAAxdAs9+BNko997GO56qqrkiQ333xz3v/+92/UZ926dbn11luTJJ06dcqAAQPqNNfDDz+cwYMHZ82aNdltt91y77335rDDDtvm80888cTstttuef3113PLLbfksssuS6lU2qjfuHHjKu0hQ4bUqVYA2FkNGzerqUtoEmOH9m3qEgAAgAbUbFfwHn300TnhhBOSJGPHjs306dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0E3O8+ijj2bQoEFZtWpV2rdvn4kTJ+aoo46qVa2tWrXKV7/61STJ3Llz88Mf/nCjPtOnT8/YsWOTJP3790/fvv5nDgAAAAB2ds12BW+SjBo1Kv369Ut1dXUGDhyYyy+/PAMGDEh1dXXuuOOOjB49OknSs2fPjBgxotbjL1iwIB/5yEcqD0b77ne/m9122y1//etfN3tOly5d0qVLl41ev/TSSzN+/PjMmzcvl112WebPn59Pf/rTadu2bSZPnpzvfe97qampSdu2bfOjH/2o1rUCAAAAAMXTrAPeI488MuPHj89ZZ52V5cuX5/LLL9+oT8+ePTNx4sR07Nix1uNPnTo1L730UuXzSy65ZKvnXHHFFRk5cuRGr3fs2DETJ07MKaeckqeffjqjR4+uBNDr7brrrrn99ttzxBFH1LpWAAAAAKB4mu0WDeuddtppeeyxx3LJJZekZ8+eadeuXTp16pQ+ffrk6quvzpw5c9KjR4+mLjNJ0qNHj8yZMydXX311+vTpk06dOqVdu3Z597vfnUsuuSSPPfZYTj311KYuEwAAAABoJKVyuVxu6iIohkWLFqV79+5JkoULF6Zbt25NXBFA3TXXB27R/HjIGgAA7DgaIl9r9it4AQAAAACKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQTV6wPuVr3wlc+bMaexpAQAAAAB2Oo0e8P70pz9Nnz59cuSRR+aGG27IK6+80tglAAAAAADsFBo94G3ZsmXK5XL+8pe/5OKLL85+++2XM888M3/84x9TLpcbuxwAAAAAgMJq9IB3yZIl+dGPfpQjjjgi5XI5a9asyZ133plBgwZl//33z7e+9a0sWLCgscsCAAAAACicRg9499hjj3z1q1/Nn//85/z5z3/OV77yleyxxx4pl8tZtGhRvve976Vnz5458cQTc9ttt6W6urqxSwQAAAAAKIRGD3jf6Ygjjsj111+f559/Pr/+9a9z8sknp0WLFimXy5k6dWqGDh2afffdN+eff35mzJjRlKUCAAAAAOxwmjTgXa9ly5b5xCc+kYkTJ+bvf/97vve97+WQQw5JuVzO8uXLM2bMmPTr1y+HHXZYrr322rz00ktNXTIAAAAAQJPbIQLed9p3333zf//v/82TTz6Ze+65J/vss0+SpFwu58knn8xll12W7t2759Of/nQeffTRpi0WAAAAAKAJ7XABb5I8+OCDOffcc/PJT34yL774YsrlcpKkffv2KZfLWbt2bX7961+nT58+ueiii7Ju3bomrhgAAAAAoPHtMAHvwoUL893vfjc9evTIgAEDcuutt2bVqlVJkpNOOinjx4/Pyy+/nHnz5uXrX/96dt9996xbty4//vGP8+Mf/7iJqwcAAAAAaHxNGvCuWbMmv/zlLzNw4MAceOCBueKKK/K3v/0t5XI5++23X771rW/lb3/7W+6999586lOfSsuWLdOjR49cddVVWbBgQU488cSUy+WMHj26Kb8MAAAAAIAmUdUUk86cOTM333xzxo8fn9dffz3J23vstmzZMqeeemqGDx+ej370oymVSpsdY7fddsu//uu/pn///lmwYEFjlQ4AAAAAsMNo9ID3sMMOy5NPPpkklb11e/bsmWHDhuWcc85Jly5dtnmsrl27JknefPPN+i8UAAAAAGAH1+gB79y5c5Mkbdu2zSc/+ckMHz48J5xwQp3G2nXXXXP22WdvcaUvAAAAAMDOqtED3iOPPDLDhw/P5z73uey6667bNdZee+2VcePG1U9hAAAAAAAF0+gB7yOPPNLYUwIAAAAA7JRaNPaE3/nOd/Kd73wny5Yt2+ZzXn311cp5DeG5557LiBEj0qtXr7Rv3z577LFH+vbtm2uuuSarV6/errHXrVuXJ554IuPGjcsFF1yQvn37pnXr1imVSimVSpkyZco2jXPiiSdWztnaBwAAAADQPDT6Ct6RI0emVCrlk5/8ZPbcc89tOueVV16pnPftb3+7Xuu5++67c9ZZZ2X58uWV11avXp3Zs2dn9uzZGTNmTCZOnJgePXrUafzbbrstQ4cOradqAQAAAAD+V6MHvDuSOXPm5Mwzz0x1dXU6dOiQb3zjGxkwYECqq6tzxx135Oc//3nmzZuXQYMGZfbs2enYsWOt5yiXy5V2y5Ytc/jhh2ft2rV5/PHH61Rznz59cvPNN9fpXAAAAABg51KIgHft2rVJ3g5I69NFF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFnrOQ499NBcf/316du3b4444oi0adMmI0eOrHPA2759+7znPe+p07kAAAAAwM6l0ffgrYtHH300SbLXXnvV25gzZ87M1KlTkyTDhg3bINxdb8SIEendu3eSZNSoUZWguTaOPvroXHjhhTnmmGPSpk2b7SsaAAAAAOAdGnwF76233rrJ13/7299m9uzZWzx3zZo1WbBgQW666aaUSqX07du33uqaMGFCpX3uuedusk+LFi1y9tln5xvf+EZee+21TJ48OQMHDqy3GgAAAAAAtkeDB7xDhw5NqVTa4LVyuZxvfvOb2zxGuVxOixYtctFFF9VbXQ899FCSt7c8OOqoozbbr3///pX2tGnTBLwAAAAAwA6jUbZoKJfLlY9Nvbalj5YtW6Zfv3753e9+t0HYur3mzp2bJOnRo0eqqjafc/fq1Wujc5rSk08+mfe///3p1KlT2rRpk27dumXw4MG59dZb67SFBAAAAABQXA2+gveZZ56ptMvlcg466KCUSqXce++9OeSQQzZ7XqlUSps2bdK5c+fssssu9VrTG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9VpHXbz44ot58cUXK58vXrw4ixcvzu9+97tcffXVufPOOyv7BtfWokWLtnh8yZIldRoXAAAAAGgYDR7w7r///pt8vWvXrps91tBWrFhRaXfo0GGr/dcHvCtXrmzIsraoRYsW+dCHPpRTTjkl733ve9O5c+esWLEif/7zn3PjjTdm7ty5eeKJJzJgwIDMnDkz73rXu2o9R/fu3RugcgAAAACgoTR4wPuP1q1b19hTbuSNN96otFu1arXV/q1bt06SVFdXN1hNW3PXXXelU6dOG71+wgkn5IILLsh5552XW265JS+++GIuvvji3HXXXY1fJAAAAADQqBo94N0RtGnTptJ+8803t9p/zZo1SZK2bds2WE1bs6lwd72WLVtmzJgxmTFjRp566qn85je/yeLFi7PffvvVao6tbUGxZMmSHH300bUaEwAAAABoOM0y4O3YsWOlvS3bLqxatSrJtm3n0FSqqqoybNiwXHbZZUmSBx54IJ/97GdrNcbW9iMGAAAAAHYsDRbwfuELX0jy9sPSxo4du9HrdfGPY9XV+oe3vfzyy1t9sNirr75aCXh39D1qDz300Ep78eLFTVgJAAAAANAYGizgHTduXEqlUpJsEMq+8/XaKJfL9RbwJm+HoVOnTs38+fNTU1OTqqpNfyuefPLJSrt37971MndDqcv3FQAAAAAorgYLeN/1rndtMnDc3OuN7fjjj8/UqVOzatWqPPLII3n/+9+/yX4PPPBApd2vX7/GKq9OnnjiiUq7a9euTVgJAAAAANAYGizgffbZZ2v1emP72Mc+lquuuipJcvPNN28y4F23bl1uvfXWJG8/5GzAgAGNWmNt1NTU5Kabbqp8/oEPfKAJqwEAAAAAGkOLpi6gqRx99NE54YQTkry9hcT06dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0AardfLkyXnttdc2e3zt2rUZPnx4pdbTTjtth98vGAAAAADYfg22grcIRo0alX79+qW6ujoDBw7M5ZdfngEDBqS6ujp33HFHRo8enSTp2bNnRowYUed5xo0bt8Hnjz76aKX9xz/+cYNVzT169Mjxxx+/Qf9bbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVedaAQAAAIDi2GED3jVr1uS1117LXnvtlRYtGmah8ZFHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOd5zj333M0eu/rqqzf4/Jxzztko4E2SlStX5he/+EV+8YtfbHasww8/PHfccUcOPPDAOtcKAAAAABRHo2/RsHLlyvzhD3/IH/7wh6xcuXKj48uWLcsnPvGJ7LrrrunatWt23333jBgxImvWrGmQek477bQ89thjueSSS9KzZ8+0a9cunTp1Sp8+fXL11Vdnzpw56dGjR4PMva2+/vWv57rrrssZZ5yR97znPdl7773TsmXLdOjQIQcffHDOPPPM/PrXv86cOXNy6KGHNmmtAAAAAEDjKZXL5XJjTnjLLbfk3HPPTbdu3fLss89usDp33bp1ef/7358///nPeWdZpVIpH/vYx/Kf//mfjVkq/2DRokWVvX0XLlyYbt26NXFFAHU3bNyspi4BGsXYoX2bugQAAOD/1xD5WqOv4L333nuTJEOGDNlo64Xx48fnkUceSZK8733vyyWXXJL3ve99KZfLmTBhQv74xz82drkAAAAAADusRt+D969//WtKpVKOO+64jY7deuutSZKjjjoqDz/8cKqqqrJ27dqccMIJmTVrVm655ZZ89KMfbeySAQAAAAB2SI2+gvell15Kko0eBLZ27do8+OCDKZVK+ed//udUVb2dPbds2TJf+tKXUi6XM3PmzMYuFwAAAABgh9XoAe8rr7ySJGnVqtUGr8+aNSvV1dVJstEq3Z49eyZJXnjhhUaoEAAAAACgGBo94G3Xrl2S/13Ju96DDz6YJOnRo0f23nvvDY61bdu2cYoDAAAAACiQRg94Dz744CTJlClTNnj9N7/5TUqlUj7wgQ9sdM7SpUuTJF26dGnw+gAAAAAAiqLRA96TTjop5XI5P/3pT3PPPfdk5cqVueGGGzJr1qwkyWmnnbbROY899liSpGvXro1aKwAAAADAjqyqsSe86KKL8rOf/SwrVqzIqaeeusGx3r17bzLgnThxYkqlUo488sjGKhMAAAAAYIfX6Ct4991339x9993ZZ599Ui6XKx8HHXRQ7rzzzpRKpQ36L1iwIFOnTk2SfPjDH27scgEAAAAAdliNvoI3SU444YQ888wzmTZtWl544YXsu+++Of7441NVtXE5S5Ysybe+9a0kycCBAxu7VAAAAACAHVaTBLxJ0qpVqwwYMGCr/Y4//vgcf/zxjVARAAAAAECxNPoWDQAAAAAA1A8BLwAAAABAQTXZFg1J8pe//CVTp07N3/72t6xYsSJvvfXWFvuXSqWMHTu2kaoDAAAAANixNUnA+9RTT+ULX/hCZsyYsc3nlMtlAS8AAAAAwDs0esC7ePHifOADH8iyZctSLpeTJB06dMjuu++eFi3sGAEAAAAAsK0aPeC98sors3Tp0pRKpQwfPjxf+9rX0rNnz8YuAwAAAACg8Bo94P3jH/+YUqmUs88+O6NHj27s6QEAAAAAdhqNvifC888/nyQ5++yzG3tqAAAAAICdSqMHvLvvvnuSpFOnTo09NQAAAADATqXRA94+ffokSebNm9fYUwMAAAAA7FQaPeD96le/mnK5bP9dAAAAAIDt1OgB70knnZSvf/3rmTx5cr785S9n7dq1jV0CAAAAAMBOoaqxJ7z11lvTu3fvHHfccRk9enTuvvvufPKTn0yvXr3Srl27rZ7v4WwAAAAAAG9r9IB36NChKZVKlc+XLFmSG264YZvOLZVKAl4AAAAAgP9fowe8SVIul5tiWgAAAACAnUqjB7zPPPNMY08JAAAAALBTavSAd//992/sKQEAAAAAdkotmroAAAAAAADqRsALAAAAAFBQTfKQtfWefvrp3HrrrZk+fXpeeOGFVFdX5957702PHj0qff7617/m73//e9q3b5/+/fs3YbUAAAAAADuWJgl4161bl8suuyyjRo3KunXrUi6XkySlUilvvvnmBn3//ve/59RTT01VVVWeeeaZ7Lfffk1RMgAAAADADqdJtmg4//zzc9111+Wtt95K165d88lPfnKzfU855ZQceOCBeeutt3LnnXc2YpUAAAAAADu2Rg94J02alLFjxyZJLr/88jz77LP51a9+tcVzPvWpT6VcLue///u/G6NEAAAAAIBCaPQtGkaPHp3k7ZW53/3ud7fpnKOPPjpJ8j//8z8NVhcAAAAAQNE0+gre6dOnp1QqZdiwYdt8Trdu3ZIkL7zwQkOVBQAAAABQOI0e8L700ktJkgMOOGCbz2nZsmWSpKampiFKAgAAAAAopEYPeNu3b58kWbp06Tafs2jRoiTJHnvs0SA1AQAAAAAUUaMHvAcddFCS5Iknntjmc+65554kyWGHHdYgNQEAAAAAFFGjB7wDBw5MuVzOT37yk6xbt26r/Z944omMGzcupVIpp5xySiNUCAAAAABQDI0e8H71q19N+/bts2DBgnzpS1/a4r66999/fwYOHJg33ngje+yxR84777xGrBQAAAAAYMdW1dgT7r333vnZz36Ws88+O2PHjs29996bQYMGVY6PGjUq5XI506ZNy5NPPplyuZwWLVpk3Lhx6dChQ2OXCwAAAACww2r0gDdJPve5z6Vly5Y5//zzs3Dhwtx4440plUpJkjFjxiRJyuVykqRDhw655ZZbNgiBAQAAAABogi0a1jvjjDMyf/78/Ou//muOOuqo7LLLLimXy5WPww47LN/4xjcyf/78DBkypKnKBAAAAADYYTXJCt71OnfunG9961v51re+lXXr1uWVV17JW2+9lT322CMtW7ZsytIAAAAAAHZ4TRrwvlOLFi2y5557NnUZAAAAAACF0egB71tvvZVZs2Zl6tSpmTdvXl599dWsWLEiu+66a/bYY4+8+93vzvHHH58+ffqkRYsm20ECAAAAAGCH12gBb01NTX7yk5/khz/8YZ5//vmt9u/evXsuvfTSfOlLX8ouu+zSCBUCAAAAABRLowS8L7/8coYMGZJp06YlScrl8lbPWbhwYb761a/mrrvuyq9//evsscceDV0mAMBOZ9i4WU1dQpMZO7RvU5cAAAANrsED3rfeeiuDBg3KrFmzUi6XUyqVMnDgwHz4wx/O+973vnTu3DkdOnTIihUrsmzZssyZMyf3339/Jk2alHK5nClTpuT000/Pgw8+aMsGAAAAAIB3aPCA9/vf/35mzpyZUqmUI488MrfddlsOPfTQzfb/8Ic/nEsvvTR//etfc/bZZ+fRRx/N9OnTc8011+TrX/96Q5cLAAAAAFAYDbokdu3atbn++usr4e60adO2GO6+03ve8548/PDDOfLII1Mul3PdddelpqamIcsFAAAAACiUBg1477777ixdujSlUin/8R//kTZt2tTq/DZt2uS2225LqVTK0qVL8/vf/76BKgUAAAAAKJ4GDXgfeuihJG9vu9CrV686jXHooYfmpJNOSpJMnTq13moDAAAAACi6Bg14H3nkkZRKpXzoQx/arnE+9KEPpVwu55FHHqmnygAAAAAAiq9BA96FCxcmSf7pn/5pu8ZZf/5zzz233TUBAAAAAOwsGjTgff3115Mku++++3aNs/789eMBAAAAANDAAe/y5cuTJB06dNiucdq3b58kWbFixXbXBAAAAACws2jQgPett96q1/HWrVtXr+MBAAAAABRZgwa8AAAAAAA0nKrGmOSnP/1punTpUufzX3rppXqsBgAAAABg59AoAe+///u/N8Y0AAAAAADNSoMHvOVyuaGnAAAAAABolho04J08eXJDDg8AAAAA0Kw1aMDbv3//hhweAAAAAKBZa9HUBQAAAAAAUDcCXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXiTPPfccxkxYkR69eqV9u3bZ4899kjfvn1zzTXXZPXq1ds19rp16/LEE09k3LhxueCCC9K3b9+0bt06pVIppVIpU6ZMqdV4q1evzg9+8IP07ds3e+yxR9q3b59evXplxIgRee6557arVgAAAACgWKqauoCmdvfdd+ess87K8uXLK6+tXr06s2fPzuzZszNmzJhMnDgxPXr0qNP4t912W4YOHVovtc6fPz+nnHJKnn766Q1ef+qpp/LUU09lzJgxuf3223PqqafWy3wAAAAAwI6tWa/gnTNnTs4888wsX748HTp0yJVXXpmHH344kyZNynnnnZckmTdvXgYNGpQVK1bUaY5yuVxpt2zZMu973/ty+OGH13qcFStWZNCgQZVw97zzzsukSZPy8MMP58orr0yHDh2yfPnynHnmmXn00UfrVCsAAAAAUCzNegXvRRddlOrq6lRVVeW+++7LscceWzn2wQ9+MIccckguu+yyzJs3L9dee21GjhxZ6zkOPfTQXH/99enbt2+OOOKItGnTJiNHjszjjz9eq3GuueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRfXeusHAAAAAKB4mu0K3pkzZ2bq1KlJkmHDhm0Q7q43YsSI9O7dO0kyatSorF27ttbzHH300bnwwgtzzDHHpE2bNnWqde3atbn++uuTJL17986IESM26nPcccdl2LBhSZIHHnggs2bNqtNcAAAAAEBxNNuAd8KECZX2ueeeu8k+LVq0yNlnn50kee211zJ58uTGKG0jkydPzuuvv54kOeecc9Kixab/2d651+9vfvObxigNAAAAAGhCzTbgfeihh5Ik7du3z1FHHbXZfv3796+0p02b1uB1bcr6WpMN6/lHffr0Sbt27ZI0Xa0AAAAAQONptgHv3LlzkyQ9evRIVdXmtyLu1avXRuc0tieeeKLSfmc9/6iqqio9evRI0nS1AgAAAACNp1k+ZO2NN97IsmXLkiTdunXbYt/dd9897du3z6pVq7Jw4cLGKG8jixYtSvL2auNOnTptsW/37t3z2GOPZenSpVmzZk1at25d63k2Z8mSJds8FgAAAADQ8JplwLtixYpKu0OHDlvtvz7gXblyZUOWtVnr693WWtdbuXJlrQLe7t271744AAAAAKDJNMstGt54441Ku1WrVlvtvz4kra6ubrCatmR9vbWpNWm6egEAAACAxtEsV/C2adOm0n7zzTe32n/NmjVJkrZt2zZYTVuyvt7a1JrUvt6tbUGxZMmSHH300bUaEwAAAABoOM0y4O3YsWOlvS3bLqxatSrJtm2R0BDW11ubWpPa17u1/YgBAAAAgB1Ls9yioU2bNuncuXOSrT9Y7NVXX62Epk21R+364HXVqlV57bXXtth3/Srcvfbaq1b77wIAAAAAxdMsA94kOfTQQ5Mk8+fPT01NzWb7Pfnkk5V27969G7yuTVlfa7JhPf+opqYmCxYsSNJ0tQIAAAAAjafZBrzHH398krdXxT7yyCOb7ffAAw9U2v369WvwujZlfa3JhvX8o9mzZ1dWGzdVrQAAAABA42m2Ae/HPvaxSvvmm2/eZJ9169bl1ltvTZJ06tQpAwYMaIzSNnLiiSdmt912S5LccsstKZfLm+w3bty4SnvIkCGNURoAAAAA0ISabcB79NFH54QTTkiSjB07NtOnT9+oz7XXXpu5c+cmSS666KK0bNlyg+NTpkxJqVRKqVTK0KFDG6zWVq1a5atf/WqSZO7cufnhD3+4UZ/p06dn7NixSZL+/funb9++DVYPAAAAALBjqGrqAprSqFGj0q9fv1RXV2fgwIG5/PLLM2DAgFRXV+eOO+7I6NGjkyQ9e/bMiBEj6jzPO1fWJsmjjz5aaf/xj3/Ms88+W/m8R48eG2zJsN6ll16a8ePHZ968ebnssssyf/78fPrTn07btm0zefLkfO9730tNTU3atm2bH/3oR3WuFQAAAAAojmYd8B555JEZP358zjrrrCxfvjyXX375Rn169uyZiRMnpmPHjnWe59xzz93ssauvvnqDz88555xNBrwdO3bMxIkTc8opp+Tpp5/O6NGjKwH0ervuumtuv/32HHHEEXWuFQAAAAAojma7RcN6p512Wh577LFccskl6dmzZ9q1a5dOnTqlT58+ufrqqzNnzpz06NGjqctM8vbq3jlz5uTqq69Onz590qlTp7Rr1y7vfve7c8kll+Sxxx7Lqaee2tRlAgAAAACNpFTe3BO74B8sWrQo3bt3T5IsXLgw3bp1a+KKAOpu2LhZTV0C0MDGDvVMAgAAdiwNka81+xW8AAAAAABFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUFVNXQAAADSEYeNmNXUJTWbs0L5NXQIAAI3ECl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEFVNXUBADSdYeNmNXUJAAAAwHawghcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAFvkueeey4jRoxIr1690r59++yxxx7p27dvrrnmmqxevbre5rnnnnsyZMiQdOvWLa1bt063bt0yZMiQ3HPPPVs9d+jQoSmVStv08eyzz9ZbzQAAAADAjquqqQtoanfffXfOOuusLF++vPLa6tWrM3v27MyePTtjxozJxIkT06NHjzrPsW7dunzxi1/M2LFjN3h98eLFWbx4cSZMmJDhw4fnxhtvTIsWMncAAAAAYNs064B3zpw5OfPMM1NdXZ0OHTrkG9/4RgYMGJDq6urccccd+fnPf5558+Zl0KBBmT17djp27Finef7lX/6lEu4eeeSRueyyy3LwwQdnwYIF+cEPfpA5c+ZkzJgx2WuvvfK9731vi2N17do199577xb77LfffnWqEwAAAAAolmYd8F500UWprq5OVVVV7rvvvhx77LGVYx/84AdzyCGH5LLLLsu8efNy7bXXZuTIkbWeY968efnhD3+YJOnTp08efPDBtG3bNknSt2/fnH766enfv39mz56da665Jl/4whe2uFq4ZcuWec973lPrOgAAAACAnU+z3Q9g5syZmTp1apJk2LBhG4S7640YMSK9e/dOkowaNSpr166t9Tw/+tGPUlNTkyS54YYbKuHueu3atcsNN9yQJKmpqcl1111X6zkAAAAAgOap2Qa8EyZMqLTPPffcTfZp0aJFzj777CTJa6+9lsmTJ9dqjnK5nN/+9rdJkl69euWYY47ZZL9jjjkm7373u5Mkv/3tb1Mul2s1DwAAAADQPDXbgPehhx5KkrRv3z5HHXXUZvv179+/0p42bVqt5njmmWfy/PPPbzTOluZZvHhxnn322VrNAwAAAAA0T8024J07d26SpEePHqmq2vxWxL169dronG31xBNPbHKc7Znn5ZdfTv/+/dO5c+e0bt06++67bz7ykY/kxz/+cVavXl2r+gAAAACAYmuWD1l74403smzZsiRJt27dtth39913T/v27bNq1aosXLiwVvMsWrSo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woRK+9xzz91knxYtWuTss89Okrz22muZPHlyreYol8v57W9/myTp1atXjjnmmE32O+aYY/Lud787SfLb3/42/7ioet68eZk7d26S5IwzztjsQ9+GDh1aaQt4AQAAAGDnV7/v4S+Qhx56KEnSvn37HHXUUZvt179//0p72rRpGThw4DbP8cwzz+T555/faJzNzfPUU09l8eLFefbZZ3PggQduVOvWxtlnn33Ss2fPzJs3L9OmTdvmOgEAAIrKdlvNj205ADbUbAPe9Stie/ToscW9anv16rXROdvqiSee2OQ42zLPOwPe2o4zb968LFy4MKtWrUr79u23ud5FixZt8fjChQsr7SVLlmzzuLCjW/XKi01dAgAAsI229v+uADuyd2Zq67d13V7NMuB94403smzZsiTZ6kbGu+++e9q3b59Vq1ZtEHBui3f+0NnaPOs3V06y0Tx1GadcLmfRokWVrR+2xTtr2Jqjjz56m/sCAABAfRk/oqkrAKgfS5cuzQEHHLDd4zTLPXhXrFhRaXfo0GGr/devgl25cmWDzfPOlbb/OE99jQMAAAAA7Fya7Qre9Vq1arXV/q1bt06SVFdXN9g86+fY1Dz1Nc7WbG2F8htvvJEnn3wye++9d/baa68tbm0B22rJkiWVFeEzZ87Mvvvu28QVsbNzzdGYXG80Ntccjcn1RmNzzdGYXG80lJqamixdujRJcvjhh9fLmM0yoWvTpk2l/eabb261/5o1a5Ikbdu2bbB51s+xqXn+cZx3fl6bcbZma9s/JG/vWQwNZd99992m6xDqi2uOxuR6o7G55mhMrjcam2uOxuR6o77Vx7YM79Qst2jo2LFjpb0t2xisWrUqybZt51DXedbPsal56mscAAAAAGDn0iwD3jZt2qRz585Jtv70zVdffbUSmtbmIWTJhititzbPO7dH+Md56jJOqVTy1yUAAAAA2Mk1y4A3SQ499NAkyfz581NTU7PZfk8++WSl3bt37zrN8Y/j1HaeuozTvXv3DR64BgAAAADsfJptwHv88ccneXtLg0ceeWSz/R544IFKu1+/frWa48ADD0zXrl03GmdTHnzwwSTJfvvtt9E+HOtr3do4L7zwQubNm1enWgEAAACA4mm2Ae/HPvaxSvvmm2/eZJ9169bl1ltvTZJ06tQpAwYMqNUcpVIpgwcPTvL2ytoZM2Zsst+MGTMqK28HDx6cUqm0wfGePXtWVvX+6le/yurVqzc5zrhx4yrtIUOG1KpWAAAAAKB4mm3Ae/TRR+eEE05IkowdOzbTp0/fqM+1116buXPnJkkuuuiitGzZcoPjU6ZMSalUSqlUytChQzc5z8UXX5xddtklSXLhhRemurp6g+PV1dW58MILkyRVVVW5+OKLNznO1772tSTJK6+8kssuu2yj4wsWLMhVV12VJOnRo4eAFwAAAACagWYb8CbJqFGj0rZt29TU1GTgwIG56qqrMmPGjEyePDnnn39+JUjt2bNnRowYUac5evbsmUsvvTRJMnv27PTr1y/jx4/P7NmzM378+PTr1y+zZ89Oklx66aU55JBDNjnOOeecU9l24Sc/+Uk++clP5t57783MmTPz4x//OMcdd1yWL1+eFi1a5Prrr09VVVWd6gUAAAAAiqNULpfLTV1EU7r77rtz1llnZfny5Zs83rNnz0ycODE9evTY6NiUKVMq2zacc845G2yR8E7r1q3Leeedl5tuummzdQwbNiyjR49Oixabz9yXLVuWU045JbNmzdrk8datW+fHP/5xhg8fvtkxAAAAAICdR7NewZskp512Wh577LFccskl6dmzZ9q1a5dOnTqlT58+ufrqqzNnzpxNhru10aJFi4wdOzYTJ07M4MGD07Vr17Rq1Spdu3bN4MGD84c//CFjxozZYribJHvuuWcefvjh/PSnP83xxx+fzp07p02bNjnooINy3nnn5ZFHHhHuAgAAAEAz0uxX8AIAAAAAFFWzX8ELAAAAAFBUAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrAC9TZ7Nmz853vfCcDBw5Mt27d0rp163To0CE9e/bMueeem4ceeqhe5hk5cmRKpdI2fUyZMqVe5mTHtK3XwYknnlgv8/3yl7/MwIEDs88++6RNmzbZf//9c9ZZZ2X69On1Mj47rhNPPHGbr7ftuf+4vzUfL730Un7/+9/n29/+dk4++eTsueeelX/boUOH1nq8e+65J0OGDKn8/O3WrVuGDBmSe+65p17rXr16dX7wgx+kb9++2WOPPdK+ffv06tUrI0aMyHPPPVevc1F/6uN6W716de666658+ctfTt++fbP77runZcuW6dy5c4499tiMHDkyL7zwQr3Ue8ABB2zTffCAAw6ol/mof/VxzY0bN26bfyaOGzeuXupetmxZvv3tb+ef/umfsuuuu2bXXXfNP/3TP+Xb3/52Xn755XqZg4axvdfcs88+W+vf9bbnHuQ+R0OrauoCgGL6wAc+kKlTp270+ptvvpmnn346Tz/9dMaNG5ezzz47P//5z9OqVasmqBLqprq6Op/85Cfzhz/8YYPX//73v+f222/PL3/5y3z729/OFVdc0UQVsqNp0aJFDjnkkKYugx3Y3nvvXS/jrFu3Ll/84hczduzYDV5fvHhxFi9enAkTJmT48OG58cYb06LF9q3lmD9/fk455ZQ8/fTTG7z+1FNP5amnnsqYMWNy++2359RTT92ueah/23u9PfbYY+nXr19Wrly50bFXXnklM2bMyIwZM3Lddddl9OjROfPMM7drPoqvvu5xjelPf/pTPvaxj230h4rHH388jz/+eMaMGZMJEybk6KOPbqIK2ZKmuObe/e53N/qcsK0EvECdPP/880mSrl275lOf+lROOOGEvOtd78pbb72V6dOn59prr83ixYtz6623Zu3atfnFL35RL/M+/vjjWzx+4IEH1ss87Ni+/OUv54ILLtjs8fbt22/X+F/4whcq4e6AAQNy0UUXpWvXrnn88cfzve99LwsWLMjIkSOz77775otf/OJ2zcWO6eabb86qVau22OeJJ56ohBof+tCHst9++23XnO5vzce73vWu9OrVK/fdd1+tz/2Xf/mXSrh75JFH5rLLLsvBBx+cBQsW5Ac/+EHmzJmTMWPGZK+99sr3vve9Ote4YsWKDBo0qBLunnfeefn0pz+dtm3bZvLkybnqqquyfPnynHnmmZk2bVqOOOKIOs9Fw6rL9bZ8+fJKuNuvX7+ceuqp6dOnTzp37pylS5fmrrvuys9//vMsX748n/vc57Lrrrvm5JNP3u5aBw8enO9+97ubPW7BQDFszz1uvXvvvTddu3bd7PFu3brVeewkWbhwYU477bQsXbo0VVVV+T//5/9U/lj1+9//Pv/v//2/LFmyJKeddloeeeSR7Z6PhlWXa26//fbb6u9eSXLVVVdV/l/2nHPOqXON67nP0WDKAHUwaNCg8vjx48s1NTWbPL506dJyz549y0nKScoPPPBAnee64oorKuPQvK2/Dq644ooGm2PSpEmVeU477bSNrvGlS5eW3/Wud5WTlDt16lR+5ZVXGqwWdmyXXXZZ5Vq57bbb6jSG+1vz8e1vf7t89913l1944YVyuVwuP/PMM5V/+3POOWebxnjqqafKVVVV5STlPn36lFevXr3B8VWrVpX79OlTTlKuqqoqP/3003Wu91vf+lalvh/84AcbHZ82bVqllv79+9d5HhrG9l5v06ZNK59xxhnl//mf/9lsnwkTJpRLpVI5Sfnggw8ur1u3rs717r///rX6b4EdT33c426++ebKOc8880zDFVsulz//+c9X5vrVr3610fHx48fXun4aV31cc1tTU1NT7tq1azlJuWPHjhv93K0N9zkamj14gTr5/e9/nzPOOCO77LLLJo/vueeeufbaayuf33nnnY1VGmyXH/7wh0mSqqqq/PSnP93oGt9zzz1z9dVXJ0lee+21jBkzptFrpOmtW7cut99+e5KkQ4cO+fjHP97EFbGj+9d//deceuqp2/WW0h/96EepqalJktxwww1p27btBsfbtWuXG264IUlSU1OT6667rk7zrF27Ntdff32SpHfv3hkxYsRGfY477rgMGzYsSfLAAw9k1qxZdZqLhrG919txxx2X8ePH59BDD91sn8GDB1fufQsWLMicOXPqNBc7h/q4xzWWF154ofIz/CMf+Ug+9alPbdTnjDPOyEc+8pEkyW233VZv+01Tfxrjmvuv//qvyjtXP/nJT270cxd2JAJeoMEMGDCg0l6wYEETVgLbZsWKFZk0aVKS5MMf/vBm34738Y9/PLvuumuS5De/+U2j1ceOY9KkSVm8eHGSt3/hb9euXRNXxM6uXC7nt7/9bZKkV69eOeaYYzbZ75hjjqnsEfjb3/425XK51nNNnjw5r7/+epK33466ub183/kQG/fC5snvehTR7373u6xbty5Jcu6552623/p73Lp16/K73/2uMUpjB3PrrbdW2vWxPQM0JAEv0GDWrFlTaW9upS/sSGbNmpU333wzSdK/f//N9mvVqlUlXJk1a1bWrl3bKPWx43jnL/xnn312E1ZCc/HMM89UVhFt6f70zuOLFy/Os88+W+u5HnrooY3G2pQ+ffpU/rgxbdq0Ws9D8fldjyLa1nvcO4+5xzU/K1asyIQJE5IkBxxwQD7wgQ80bUGwFQJeoME88MADlXbv3r3rZcyBAwemS5cuadWqVbp06ZITTzwx3//+9/Pqq6/Wy/gUw69//esceuihadeuXTp27JhDDjkk55xzTiZPnrxd4z7xxBOVdq9evbbYd/3xmpqajZ4wz85t5cqVldWK+++/f0488cR6Gdf9jS2py/0pSebOndtgc1VVVaVHjx51nofiq+/f9R588MEcccQR6dixY9q1a5cDDzwwZ555ZiZMmFCn1egU17nnnpuuXbumVatW2XPPPXPMMcfkm9/8ZuXdM9tj/T1ut912yz777LPZfvvuu2/lHVvucc3PnXfemdWrVydJPv/5z6dUKtXLuO5zNBQBL9Ag1q1bl+9///uVz88444x6Gff+++/P0qVLs3bt2ixdujQPPPBAvvGNb+Sggw6qvHWVnd8TTzyRuXPnprq6OitXrsz8+fNz66235oMf/GCGDBlSeWtxbS1atKjS3trTkrt3715pL1y4sE7zUUz/+Z//mVWrViVJzjrrrHr7hd/9jS1pzPvT+rnat2+fTp06bdNcS5cu3WA1Jzu/v/zlL5k4cWKS5PDDD6+XgPeZZ57JX/7yl6xcuTLV1dV59tln86tf/SpDhgzJCSecUC/hHsUwZcqULFmyJGvXrs3LL7+cP/3pT7nyyivTo0eP3Hjjjds19vp73Nbupcn/3uP8rtf8NNS7tdznaChVTV0AsHO67rrrMnPmzCRv71d61FFHbdd4hx9+eD72sY/l6KOPTteuXbN27do89dRTuf3223Pffffltddeyyc+8YncfffdOfnkk+vjS2AH1K5du5x++un50Ic+lF69eqVDhw6VIOxnP/tZXn755UyYMCGDBw/O/fffn5YtW9Zq/BUrVlTaHTp02GLf9u3bV9orV66s3RdCodX3L/zub2yLxrw/rZ9ra/Nsaq7WrVvXej6KZ82aNRk+fHjeeuutJMmVV165XeO1atUqp59+egYOHJj3vOc92W233fLaa69l+vTp+fd///csXLgw06ZNy0knnZTp06dnt912q48vgx3QQQcdlI9//OM59thjK+Hq3/72t/znf/5n7rzzzrzxxhv50pe+lFKplC9+8Yt1mqMu9zi/6zUvf//73yvvUDjuuOMq71bZHu5zNLgyQD2bMmVKuaqqqpyk3KVLl/KLL764XeO9+uqrWzz+s5/9rJyknKTctWvXcnV19XbNx45rS9fCCy+8UD7yyCMr18KoUaNqPf4XvvCFyvkLFizYYt+xY8dW+t522221notiWrhwYblFixblJOVjjjlmu8dzf2u+nnnmmcq/7TnnnLPV/t/5zncq/SdNmrTFvpMmTar0/bd/+7da13bQQQeVk5S7d+++1b6f//znK3MtXLiw1nPROGp7vW3N8OHD63W8Ld0Lly9fXh44cGBlvksuuWS756Ph1eWae+2118rr1q3b7PG777673LJly3KScrt27cpLliypU23rf46fcMIJW+17wgknlJOUd9lllzrNReOpz/vclVdeWRnrZz/7Wb3U5z5HQ7NFA1Cv/ud//idDhgxJTU1N2rRpk1//+tfp0qXLdo25tbeHnn/++Rk2bFiS5Pnnn89//ud/btd87Li2dC3svffeufPOOyurdm+44YZaj9+mTZtKe/3D1jbnnW9Fbtu2ba3nopj+4z/+o/Lk7fp4mrL7G9uqMe9P6+fa2jz1MRfFc9VVV2XMmDFJkr59++YnP/nJdo+5pXthx44d86tf/Sp77LFHkmT06NHbdG1SPLvtttsWtz069dRT8+1vfztJsnr16owdO7ZO89TlHuf+1rzcdtttSZLWrVvnzDPPrJcx3edoaAJeoN4888wzGThwYF599dXssssuueOOOxrtaaPnn39+pf3OB37QvBx00EE56aSTkiTz58+vPHF+W3Xs2LHS3tpb8dbvwZps21v82Dk0xC/8W+P+RtK496f1c23LW5LdC5uXG2+8MZdffnmStx/A94c//GGDbToaym677ZZPf/rTSd6+5mbPnt3gc7Jj+uIXv1gJgev6M7Eu9zj3t+Zj5syZefLJJ5Mkp59++lb/GF9f3OfYXgJeoF48//zz+fCHP5znn38+pVIpN910UwYPHtxo8x966KGVto3pm7ftuRbe+bCNdz7QaFPe+bCNdz7QiJ3X7NmzK0/ePvXUU7P77rs3yrzubySNe39aP9eqVavy2muvbdNce+21l/13d3K//OUvc8EFFyRJ9t9//9x///3Zc889G21+90KSpEuXLuncuXOSul8H6+9xW7uXJv97j/O7XvPRUA9X2xbuc2wPAS+w3ZYtW5aTTjopf/vb35K8/db4xv5hWF9Psaf4tudaeOcvVev/cr85649XVVXlkEMOqfOcFMc7f+Gvj+0ZtpX7G0nd7k9J0rt37wabq6amJgsWLKjzPBTH7373u5x99tlZt25d9t1330yaNGmDPzo0BvdC1tvea2H9Pe7111/PCy+8sNl+S5YsyfLly5O4xzUXa9euzR133JHk7T8mfPSjH23U+d3n2B4CXmC7vP766/nIRz5SWdX2/e9/P//8z//c6HWsnz9Junbt2ujzs+PYnmuhb9++adWqVZItv+3vzTffzIwZMyrnrN/3l53XO3/h32uvvXLyySc32tzubyTJgQceWPn339rbkh988MEkyX777ZcDDjig1nMdf/zxlfaW5po9e3bl7cv9+vWr9TwUw6RJk3LGGWekpqYmnTt3zv3335+DDz640etwLyRJli5dmmXLliWp+3Wwrfe4dx5zj2seJk6cmJdffjlJ8tnPfjZVVVWNOr/7HNtDwAvU2erVqzNo0KD8+c9/TpL8y7/8S77+9a83SS033nhjpd2/f/8mqYGm98wzz+T+++9Pkhx88MHZb7/9anV+x44d86EPfShJ8l//9V+bfeveXXfdVVnRMWTIkO2omKK45557snTp0iSN/wu/+xvJ26t61m999OSTT1b+yPSPZsyYUVl1O3jw4DqtBjrxxBOz2267JUluueWWlMvlTfYbN25cpe1euHN6+OGHM3jw4KxZsya77bZb7r333hx22GGNXsfrr79e+SNbu3bt0qdPn0avgR3D6NGjK/ekuv5MPP3009OixdtRyM0337zZfuvvcS1atMjpp59ep7kolqZ6t1biPsf2E/ACdfLmm29myJAhmTZtWpLkoosuyne/+91ajzNu3LiUSqWUSqWMHDlyo+OPP/545s+fv8UxRo8eXXma8z777ON/MndSd999d2pqajZ7/MUXX8wnPvGJyhNn1+8T+E5bu96S5Gtf+1qSt996/M///M956623Nji+bNmyyh8yOnXqlOHDh9fly6Fg6rIfm/sb9e3iiy/OLrvskiS58MILU11dvcHx6urqXHjhhUne3j7m4osv3uQ4Q4cOrVybU6ZM2eh4q1at8tWvfjVJMnfu3Pzwhz/cqM/06dMrT7Dv379/+vbtW9cvix3Uo48+mkGDBmXVqlVp3759Jk6cmKOOOqrW45x44omV6+3ZZ5/d6Pgf//jHja7ld1q5cmXOOOOMyqq6YcOG2e95J/Tss89mzpw5W+zz+9//Pt/5zneSJG3bts255567yX5bu+b22WeffO5zn0uS3Hvvvbnzzjs36vPrX/869957b5Lk85//fPbZZ5/afDkU0CuvvJKJEycmSQ4//PAcccQR23yu+xw7gsZdbw7sND7zmc/kvvvuS5J88IMfzLBhw/LXv/51s/1btWqVnj171nqeRx55JMOHD8+AAQNy8skn5/DDD0/nzp1TU1OTJ598Mrfffnuljl122SWjR49ulKc50/guvPDCrF27Np/4xCdy7LHH5oADDkjbtm2zbNmyTJkyJTfeeGPlLXvHH398nbcK+eAHP5hPf/rTueOOO/K73/0uJ510Ui6++OJ07do1jz/+eK688sr8/e9/T5JcffXVjfagLZrOq6++mt///vdJkve85z153/veVy/jur81Lw899NAGgf76+1WSzJ8/f4PVsMnbIew/6tmzZy699NJ8//vfz+zZs9OvX798/etfz8EHH5wFCxbk6quvrgQkl1566XbtD37ppZdm/PjxmTdvXi677LLMnz8/n/70p9O2bdtMnjw53/ve91JTU5O2bdvmRz/6UZ3noWFs7/W2YMGCfOQjH6k8ZO+73/1udtttty3+rtelS5d06dKl1rV+//vfz+c+97l8/OMfz/HHH5+DDz44HTp0yOuvv56HH344P/vZzyo/d9/97ndv9g+0NK3tveaeffbZDBgwIMcee2xOO+20vPe9761cT3/7299y55135s4776ys3v3hD39Y63dqvdOVV16ZP/7xj1m6dGk+85nPZPbs2Tn11FOTvB0kX3vttUne3papLotYaHj18XP1ne64447KQpH6Xr3rPkejKAPUQZJafey///6bHOfmm2+u9Lniiiu2eHxLH507dy5PmDChYb9omtT++++/TdfCJz7xifKrr766yTG2dr2tt3r16vIpp5yy2TlatGixxfPZufz7v/975d/+Bz/4wTaf5/7GO51zzjm1+rm5OW+99Vb5C1/4whbPHTZsWPmtt97aplomT5682X5PP/10+ZBDDtnsPLvuumv57rvv3p5vCw1ke6+3bb0/vfNjcz8X+/fvX+nzzDPPbPH4lj769+9fXrRoUT1/p6gv23vNTZ48eZvOa9euXfnGG2/cYi1bu+bWmzFjRnmfffbZ7Fz77LNPecaMGdv7raGB1NfP1fXe//73l5OUd9lll/KSJUtqVYv7HDsCK3iBHdopp5ySsWPHZvr06ZkzZ05efPHFvPzyyymXy9ljjz3y3ve+Nx/96EczdOjQ7Lrrrk1dLg3olltuyQMPPJDp06fnb3/7W5YtW5bly5enQ4cO6d69e4477ricc845OfbYY7d7rrZt22bixIn5xS9+kXHjxuUvf/lLXnvttey999454YQT8pWvfKVe5qEYbrvttiRvr6Jd/5bO+uD+Rl20aNEiY8eOzSc+8YmMHj06s2bNyrJly7Lnnnumb9++Of/88+vtIYA9evTInDlz8pOf/CS//vWvM3/+/Lz55pvp3r17TjnllFx00UXZf//962Uumq8f/vCHmTRpUqZPn56nnnoqy5Yty2uvvZZ27dqla9euef/735/PfOYzGThwoCfM78SOOuqo/Md//EemT5+e2bNnZ8mSJVm2bFlqamqy++6757DDDsuHPvShDB8+vE4rxTfl/e9/fx5//PGMGjUqEyZMqLy1/sADD8zgwYNz8cUXp3PnzvUyFzu2p59+On/605+SJCeddFK9b8nhPkdjKJXLm3lqAgAAAAAAOzQPWQMAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAADsxIYOHZpSqZQDDjigqUvZ4RxwwAEplUoZOnRoU5cCAFBnAl4AABrdlClTUiqVKh9nnnnmVs9ZH1SWSqVGqBAAAIpBwAsAQJP79a9/nccff7ypy2AnYMUyANDcCHgBAGhy5XI5V1xxRVOXAQAAhSPgBQCgSe25555Jkt/85jeZM2dOE1cDAADFIuAFAKBJffWrX03r1q2TJN/+9rebuBoAACgWAS8AAE2qe/fu+eIXv5gk+f3vf5+ZM2fWaZx169blv//7v/O1r30t/fr1y5577pmWLVumU6dOOeKII/K1r30tf//737c4xoknnphSqZQTTzwxSTJ//vx86UtfykEHHZS2bdvmgAMOyLBhw/Lcc89tcN5f//rXnHvuuTnooIPSpk2bdO/ePV/+8pfz0ksvbVPtEyZMyKc+9am8613vSps2bdKpU6f06dMn//qv/5pXX321Tt+P2nr99ddz1VVXpV+/ftlrr73SqlWr7LvvvjnttNNy5513plwub/bc9Q+/GzlyZJJk1qxZ+cxnPpNu3bqldevW2W+//fL5z38+c+fO3Wodq1evzr/927/ln/7pn9K+fft07tw5xx9/fG666aaUy+UNHtA3ZcqUynkjR45MqVTKLbfckiR57rnnNniQ37Y8oO+pp57KeeedlwMOOCCtW7fO3nvvnSFDhmTGjBlb/wYCADSVMgAANLLJkyeXk5STlG+++eby888/X27btm05SXngwIGbPOecc86pnLMpV1xxReX45j7atWtXvuuuuzZbV//+/ctJyv379y/ff//95Y4dO25ynC5dupTnzp1bLpfL5V/84hflVq1abbLf/vvvX168ePFm53vllVfKH/zgB7dYc5cuXcrTp0+vxXd309+3/ffff7N9/uu//qvcuXPnLdZxyimnlFesWLHJ89f3ueKKK8o/+clPylVVVZv9/j/wwAObrWPhwoXlQw45ZLM1nHrqqeX77ruv8vnkyZMr527Lv/8/Xjv7779/OUn5nHPOKd91113ldu3abfKcXXbZpXzHHXfU6vsOANBYrOAFAKDJ7bvvvvnyl7+cJLnvvvvy0EMP1XqMmpqa7Lvvvrngggty2223Zdq0aXnkkUcyYcKEXHbZZenQoUNWr16dz372s1tdSfr888/njDPOSKdOnXLDDTfkT3/6U6ZOnZqLL744pVIpL730UoYPH55Zs2bl7LPPzsEHH5wxY8Zk5syZmTx5cj7/+c8neXsV6f/5P/9nk3OsWbMmH/7wh/Pf//3f2WWXXfL5z38+v/zlLzNjxoxMnTo1V155ZTp37pyXXnopp5xyykarhuvLtGnTcvLJJ+fll1/O3nvvne9+97u5++6788gjj+Tuu+/OWWedlST5wx/+kHPOOWeLY91777258MILc9hhh+Wmm27KrFmz8uCDD+aSSy5JixYtsnr16nz+85/Pm2++udG5a9euzaBBg/L0008nSQYNGpQJEyZk9uzZmTBhQk455ZT8/ve/z7e+9a1Nzn3BBRfk8ccfz+DBg5MkXbt2zeOPP77Rx6Y8/vjj+exnP5u99947P/7xjzNjxoxMnz49I0eOTJs2bfLWW2/li1/8YpYuXbrN31cAgEbT1AkzAADNzz+u4C2Xy+UXX3yx3L59+3KS8oABAzY6Z2sreJ955pnym2++udk5Fy5cWN5vv/3KScpnnXXWJvv8f+3df0xV9R/H8ReGXEiv3HCwwdCsRpkZVBYyXbYh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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 371, + "width": 700 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# KDE plot of name lengths\n", + "plt.figure(figsize=(8, 4))\n", + "plt.hist([len(name) for name in names], bins=range(1, 20), density=True, alpha=0.7)\n", + "plt.xlabel('Name length')\n", + "plt.ylabel('Density')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "be610546", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['^abhishek$', '^aman$', '^harsh$', '^ayush$', '^aditi$']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Attach START and END tokens to each name. Need to add these two to the vocabulary.\n", + "start_symbol = '^'\n", + "end_symbol = '$'\n", + "\n", + "names = [start_symbol + name + end_symbol for name in names]\n", + "names[:5]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ba6f75fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['$', '^', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 28\n" + ] + } + ], + "source": [ + "# Find unique characters in the dataset\n", + "vocab = set(''.join(names))\n", + "vocab = sorted(vocab)\n", + "print(vocab, len(vocab))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e27963c8", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a d dimensional lookup table for each character in the vocabulary\n", + "class CharTable:\n", + " def __init__(self, vocab):\n", + " self.vocab = vocab\n", + " self.char2index = {c: i for i, c in enumerate(vocab)}\n", + " self.index2char = {i: c for i, c in enumerate(vocab)}\n", + " self.vocab_size = len(vocab)\n", + " \n", + " def encode(self, name):\n", + " return torch.tensor([self.char2index[c] for c in name])\n", + " \n", + " def decode(self, tensor):\n", + " if type(tensor) == torch.Tensor:\n", + " tensor = tensor.cpu().numpy()\n", + " return ''.join([self.index2char[i] for i in tensor])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4f38b691", + "metadata": {}, + "outputs": [], + "source": [ + "ct = CharTable(vocab)" + ] + }, + { + "cell_type": "markdown", + "id": "f9113c55", + "metadata": {}, + "source": [ + "Let us process the first name in the dataset " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "b63bb74d", + "metadata": {}, + "outputs": [], + "source": [ + "# create embedding layer\n", + "class CharEmbedding(nn.Module):\n", + " def __init__(self, vocab_size, embed_size):\n", + " super(CharEmbedding, self).__init__()\n", + " self.embedding = nn.Embedding(vocab_size, embed_size)\n", + " \n", + " def forward(self, x):\n", + " return self.embedding(x)\n", + "\n", + "embedding_dim = 4\n", + "char_embedding = CharEmbedding(ct.vocab_size, embedding_dim )" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "eba870c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "^abhishek$ tensor([ 1, 2, 3, 9, 10, 20, 9, 6, 12, 0]) ^abhishek$ tensor([[ 1.5891, 0.8863, 0.5558, -1.0004],\n", + " [ 2.4161, 0.1106, -0.5029, 1.6437],\n", + " [-0.0986, 0.0308, 0.2803, 1.6360],\n", + " [ 1.7311, 0.3999, -0.1855, 0.4308],\n", + " [-2.3946, 0.0651, -0.9694, 1.3782],\n", + " [ 0.3705, 0.3209, -0.7172, -1.1866],\n", + " [ 1.7311, 0.3999, -0.1855, 0.4308],\n", + " [ 2.0051, -0.9762, -0.5970, -0.0305],\n", + " [ 0.8369, 0.1552, 0.2730, 0.1157],\n", + " [ 1.1796, 0.8084, -0.7100, 0.0446]], grad_fn=)\n" + ] + } + ], + "source": [ + "name = names[0]\n", + "\n", + "encoding = ct.encode(name)\n", + "print(name, encoding, ct.decode(encoding), char_embedding(encoding))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "df8b8f38", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([10, 4])\n" + ] + } + ], + "source": [ + "print(char_embedding(encoding).shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "9b81e142", + "metadata": {}, + "outputs": [], + "source": [ + "xs=[]\n", + "for i in range(len(name)):\n", + " xs.append(char_embedding(ct.encode(name[i])))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a569105d", + "metadata": {}, + "outputs": [], + "source": [ + "length_name = len(name)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "8fdad8b3", + "metadata": {}, + "outputs": [], + "source": [ + "d = 4\n", + "val_linear = nn.Linear(d, d)\n", + "\n", + "query_linear = nn.Linear(d, d)\n", + "key_linear = nn.Linear(d, d)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "79cdc3b3", + "metadata": {}, + "outputs": [], + "source": [ + "vs = []\n", + "for i in range(length_name):\n", + " vs.append(val_linear(xs[i]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "a789b442", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[tensor([[-0.3461, -0.2448, -0.9961, -0.9596]], grad_fn=),\n", + " tensor([[ 1.5822, -0.3118, -0.5811, -1.5842]], grad_fn=),\n", + " tensor([[ 0.6367, -0.1960, -0.6915, -0.9352]], grad_fn=),\n", + " tensor([[ 0.6783, -0.3742, -0.6622, -1.1489]], grad_fn=),\n", + " tensor([[ 0.2293, -1.0647, 0.0114, 0.0629]], grad_fn=),\n", + " tensor([[-0.2407, -0.8153, -0.2297, -0.0817]], grad_fn=),\n", + " tensor([[ 0.6783, -0.3742, -0.6622, -1.1489]], grad_fn=),\n", + " tensor([[ 1.0542, -0.1283, -0.1633, -0.4887]], grad_fn=),\n", + " tensor([[ 0.2097, -0.1923, -0.7083, -0.7685]], grad_fn=),\n", + " tensor([[ 0.3976, -0.8262, -0.4771, -0.9123]], grad_fn=)]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vs" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "e40dd109", + "metadata": {}, + "outputs": [], + "source": [ + "qs = []\n", + "for i in range(length_name):\n", + " qs.append(query_linear(xs[i]))\n", + "\n", + "ks = []\n", + "for i in range(length_name):\n", + " ks.append(key_linear(xs[i]))\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "6ffcd4d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[tensor([[-0.5431, -0.8826, -2.0655, 0.3620]], grad_fn=),\n", + " tensor([[ 0.2952, -0.6107, -0.4607, 1.6180]], grad_fn=),\n", + " tensor([[0.3232, 0.1415, 0.1938, 0.1639]], grad_fn=),\n", + " tensor([[-0.0149, -0.6881, -0.9877, 0.9795]], grad_fn=),\n", + " tensor([[ 1.0182, 0.6256, 1.4679, -0.5539]], grad_fn=),\n", + " tensor([[-0.2207, -0.9287, -0.9676, 0.4366]], grad_fn=),\n", + " tensor([[-0.0149, -0.6881, -0.9877, 0.9795]], grad_fn=),\n", + " tensor([[-0.6503, -1.5170, -0.6902, 1.8153]], grad_fn=),\n", + " tensor([[-0.2690, -0.6013, -0.9059, 0.4749]], grad_fn=),\n", + " tensor([[ 0.2936, -0.5395, -0.8663, 0.6923]], grad_fn=)]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qs" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "17100afd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[tensor([[-0.0686, -0.6523, -0.3398, -0.2891]], grad_fn=),\n", + " tensor([[-1.8098, -0.3927, -0.2086, 0.4891]], grad_fn=),\n", + " tensor([[-0.5030, 0.1248, -0.1280, -0.0116]], grad_fn=),\n", + " tensor([[-0.9497, -0.3944, -0.1638, 0.1935]], grad_fn=),\n", + " tensor([[0.2378, 0.7928, 0.6968, 0.3017]], grad_fn=),\n", + " tensor([[-0.0548, 0.0063, 0.2924, 0.2715]], grad_fn=),\n", + " tensor([[-0.9497, -0.3944, -0.1638, 0.1935]], grad_fn=),\n", + " tensor([[-1.5675, 0.1323, -0.1190, 0.7133]], grad_fn=),\n", + " tensor([[-0.4218, -0.1489, -0.2049, -0.0142]], grad_fn=),\n", + " tensor([[-0.5909, -0.3664, 0.1543, 0.2502]], grad_fn=)]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ks" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "53f1a8be", + "metadata": {}, + "outputs": [], + "source": [ + "attns = torch.zeros(length_name, length_name)\n", + "for i in range(length_name):\n", + " for j in range(length_name):\n", + " attns[i, j] = torch.matmul(qs[i], ks[j].T)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "5040c6f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[ 1.2102, 1.9374, 0.4234, 1.2723, -2.1590, -0.4814, 1.2723, 1.2385,\n", + " 0.7785, 0.4162],\n", + " [ 0.0670, 0.5930, -0.1845, 0.3490, -0.2468, 0.2845, 0.3490, 0.6654,\n", + " 0.0378, 0.3831],\n", + " [-0.2277, -0.6008, -0.1716, -0.3628, 0.3736, 0.0843, -0.3628, -0.3941,\n", + " -0.1994, -0.1719],\n", + " [ 0.5024, 0.9822, 0.0367, 0.6368, -0.9418, -0.0264, 0.6368, 0.7484,\n", + " 0.2971, 0.3536],\n", + " [-0.8166, -2.6654, -0.6156, -1.5613, 1.5939, 0.2270, -1.5613, -2.0829,\n", + " -0.8154, -0.7429],\n", + " [ 0.8236, 1.1794, 0.1140, 0.8188, -1.3313, -0.1581, 0.8188, 0.6496,\n", + " 0.4234, 0.4306],\n", + " [ 0.5024, 0.9822, 0.0367, 0.6368, -0.9418, -0.0264, 0.6368, 0.7484,\n", + " 0.2971, 0.3536],\n", + " [ 0.7440, 2.8044, 0.2052, 1.6802, -1.2906, 0.3171, 1.6802, 2.1955,\n", + " 0.6157, 1.2878],\n", + " [ 0.5812, 1.1442, 0.1708, 0.7329, -1.0286, -0.1250, 0.7329, 0.7886,\n", + " 0.3818, 0.3583],\n", + " [ 0.4260, 0.1997, -0.1121, 0.2098, -0.7526, -0.0848, 0.2098, 0.0653,\n", + " 0.1241, 0.0637]], grad_fn=)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "attns" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "d32c2a4c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0.1250, 0.2586, 0.0569, 0.1330, 0.0043, 0.0230, 0.1330, 0.1286, 0.0812,\n", + " 0.0565],\n", + " [0.0816, 0.1381, 0.0634, 0.1082, 0.0596, 0.1014, 0.1082, 0.1484, 0.0792,\n", + " 0.1119],\n", + " [0.0942, 0.0649, 0.0996, 0.0823, 0.1718, 0.1287, 0.0823, 0.0798, 0.0969,\n", + " 0.0996],\n", + " [0.1074, 0.1735, 0.0674, 0.1228, 0.0253, 0.0633, 0.1228, 0.1374, 0.0875,\n", + " 0.0925],\n", + " [0.0508, 0.0080, 0.0622, 0.0241, 0.5664, 0.1444, 0.0241, 0.0143, 0.0509,\n", + " 0.0547],\n", + " [0.1318, 0.1882, 0.0648, 0.1312, 0.0153, 0.0494, 0.1312, 0.1108, 0.0883,\n", + " 0.0890],\n", + " [0.1074, 0.1735, 0.0674, 0.1228, 0.0253, 0.0633, 0.1228, 0.1374, 0.0875,\n", + " 0.0925],\n", + " [0.0451, 0.3538, 0.0263, 0.1149, 0.0059, 0.0294, 0.1149, 0.1924, 0.0396,\n", + " 0.0776],\n", + " [0.1076, 0.1890, 0.0714, 0.1253, 0.0215, 0.0531, 0.1253, 0.1325, 0.0882,\n", + " 0.0861],\n", + " [0.1422, 0.1134, 0.0830, 0.1145, 0.0438, 0.0853, 0.1145, 0.0991, 0.1051,\n", + " 0.0990]], grad_fn=)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# applt softmax to get attention weights\n", + "attns = F.softmax(attns, dim=-1)\n", + "attns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfe5e1de", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/posts/2024-rnn.ipynb b/posts/2024-rnn.ipynb new file mode 100644 index 0000000..d760ffa --- /dev/null +++ b/posts/2024-rnn.ipynb @@ -0,0 +1,900 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "12a1fd37", + "metadata": { + "vscode": { + "languageId": "raw" + } + }, + "source": [ + "---\n", + "author: Nipun Batra\n", + "badges: true\n", + "categories:\n", + "- ML\n", + "date: '2024-5-30'\n", + "title: RNN\n", + "toc: true\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c1e75d2d", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "%config InlineBackend.figure_format = 'retina'\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "from einops import rearrange, reduce, repeat" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "88b73e31", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2024-05-30 09:41:48-- https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.108.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 8752 (8.5K) [text/plain]\n", + "Saving to: ‘names-indian.txt’\n", + "\n", + "names-indian.txt 100%[===================>] 8.55K --.-KB/s in 0s \n", + "\n", + "2024-05-30 09:41:49 (33.8 MB/s) - ‘names-indian.txt’ saved [8752/8752]\n", + "\n" + ] + } + ], + "source": [ + "!wget https://raw.githubusercontent.com/MASTREX/List-of-Indian-Names/master/2.%20First.txt -O names-indian.txt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0821eb9b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
0Abhishek
1Aman
2Harsh
3Ayush
4Aditi
......
1160Prasoon
1161Madhusudan
1162Prastuti
1163Rampratap
1164Madhukar
\n", + "

1165 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " 0\n", + "0 Abhishek\n", + "1 Aman\n", + "2 Harsh\n", + "3 Ayush\n", + "4 Aditi\n", + "... ...\n", + "1160 Prasoon\n", + "1161 Madhusudan\n", + "1162 Prastuti\n", + "1163 Rampratap\n", + "1164 Madhukar\n", + "\n", + "[1165 rows x 1 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.read_csv('names-indian.txt', header=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a3cc557e", + "metadata": {}, + "outputs": [], + "source": [ + "# convert all names to lowercase\n", + "names = pd.read_csv('names-indian.txt', header=None)[0].str.lower().values" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "562eb3c2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['abhishek', 'aman', 'harsh', ..., 'prastuti', 'rampratap',\n", + " 'madhukar'], dtype=object)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "names" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e23abf7d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Density')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAALmCAYAAAD4wPyKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AABy40lEQVR4nOzde5iWVb0//veDwxkURVER8oQEmjtNMBUNqaQUleigHUwxMMudqV/Svrkr2e3MzPwaWu0kUNRtSbmNMjJ1s0ERIcAwbYsipAaICp44jcjI8/vDH8+WOM4wB27m9bquua41z73utT4z3N4zvmc96y6Vy+VyAAAAAAAonBZNXQAAAAAAAHUj4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKCqmroAiuONN97I448/niTZa6+9UlXl8gEAAACAbVVTU5OlS5cmSQ4//PC0adNmu8eU0LHNHn/88Rx99NFNXQYAAAAAFN7MmTPTt2/f7R7HFg0AAAAAAAVlBS/bbK+99qq0Z86cmX333bcJqwEAAACAYlmyZEnlHfLvzNq2h4CXbfbOPXf33XffdOvWrQmrAQAAAIDiqq/nW9miAQAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACioqqYuAABoPMPGzWrqEprM2KF9m7oEAACAemcFLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAt4kzz33XEaMGJFevXqlffv22WOPPdK3b99cc801Wb169XaNvXr16tx111358pe/nL59+2b33XdPy5Yt07lz5xx77LEZOXJkXnjhha2Oc+KJJ6ZUKm3TBwAAAADQPFQ1dQFN7e67785ZZ52V5cuXV15bvXp1Zs+endmzZ2fMmDGZOHFievToUeuxH3vssfTr1y8rV67c6Ngrr7ySGTNmZMaMGbnuuusyevTonHnmmdv1tQAAAAAAzUuzDnjnzJmTM888M9XV1enQoUO+8Y1vZMCAAamurs4dd9yRn//855k3b14GDRqU2bNnp2PHjrUaf/ny5ZVwt1+/fjn11FPTp0+fdO7cOUuXLs1dd92Vn//851m+fHk+97nPZdddd83JJ5+8xTH79OmTm2++uc5fMwAAAACw82jWAe9FF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFmr8Vu0aJEzzjgjV1xxRQ499NCNjg8cODAnn3xyhgwZkrfeeisXXnhhnn766S1us9C+ffu85z3vqVUdAAAAAMDOqdnuwTtz5sxMnTo1STJs2LANwt31RowYkd69eydJRo0albVr19ZqjuOOOy7jx4/fZLi73uDBg/Pxj388SbJgwYLMmTOnVnMAAAAAAM1Xsw14J0yYUGmfe+65m+zTokWLnH322UmS1157LZMnT26QWgYMGFBpL1iwoEHmAAAAAAB2Ps024H3ooYeSvL3lwVFHHbXZfv3796+0p02b1iC1rFmzptLeZZddGmQOAAAAAGDn02z34J07d26SpEePHqmq2vy3oVevXhudU98eeOCBSnv9lhCb8+STT+b9739/nnrqqbzxxhvZc889c9RRR+UTn/hEPvOZz6Rly5Z1rmPRokVbPL5kyZI6jw0AAAAA1L9mGfC+8cYbWbZsWZKkW7duW+y7++67p3379lm1alUWLlxY77X85S9/ycSJE5Mkhx9++FYD3hdffDEvvvhi5fPFixdn8eLF+d3vfperr746d95551bH2Jzu3bvX6TwAAAAAoGk0y4B3xYoVlXaHDh222n99wLty5cp6rWPNmjUZPnx43nrrrSTJlVdeudm+LVq0yIc+9KGccsopee9735vOnTtnxYoV+fOf/5wbb7wxc+fOzRNPPJEBAwZk5syZede73lWvtQIAAAAAO55mGfC+8cYblXarVq222r9169ZJkurq6nqt4ytf+Upmz56dJDnnnHNy2mmnbbbvXXfdlU6dOm30+gknnJALLrgg5513Xm655Za8+OKLufjii3PXXXfVup6trVBesmRJjj766FqPCwAAAAA0jGYZ8LZp06bSfvPNN7faf/1D0Nq2bVtvNVx11VUZM2ZMkqRv3775yU9+ssX+mwp312vZsmXGjBmTGTNm5KmnnspvfvObLF68OPvtt1+tatradhUAAAAAwI6lRVMX0BQ6duxYaW/LtgurVq1Ksm3bOWyLG2+8MZdffnmStx/i9oc//CHt27ffrjGrqqoybNiwyufvfHAbAAAAALBzapYBb5s2bdK5c+ckyaJFi7bY99VXX60EvPXxELJf/vKXueCCC5Ik+++/f+6///7sueee2z1ukhx66KGV9uLFi+tlTAAAAABgx9UsA97kf8PQ+fPnp6amZrP9nnzyyUq7d+/e2zXn7373u5x99tlZt25d9t1330yaNKlet0UolUr1NhYAAAAAsONrtgHv8ccfn+Tt7RceeeSRzfZ751YH/fr1q/N8kyZNyhlnnJGampp07tw5999/fw4++OA6j7cpTzzxRKXdtWvXeh0bAAAAANjxNNuA92Mf+1ilffPNN2+yz7p163LrrbcmefshZwMGDKjTXA8//HAGDx6cNWvWZLfddsu9996bww47rE5jbU5NTU1uuummyucf+MAH6nV8AAAAAGDH02wD3qOPPjonnHBCkmTs2LGZPn36Rn2uvfbazJ07N0ly0UUXpWXLlhscnzJlSkqlUkqlUoYOHbrJeR599NEMGjQoq1atSvv27TNx4sQcddRRtap18uTJee211zZ7fO3atRk+fHil1tNOO61e9gsGAAAAAHZsVU1dQFMaNWpU+vXrl+rq6gwcODCXX355BgwYkOrq6txxxx0ZPXp0kqRnz54ZMWJErcdfsGBBPvKRj1TC2e9+97vZbbfd8te//nWz53Tp0iVdunTZ4LVbbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVetaAQAAAIDiadYB75FHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOvxp06dmpdeeqny+SWXXLLVc6644oqMHDlyo9dXrlyZX/ziF/nFL36x2XMPP/zw3HHHHTnwwANrXSsAAAAAUDzNOuBN3t7O4LHHHsuoUaMyceLELFq0KK1atUqPHj3yqU99Kl/5ylfSrl27Jq3x61//eo444ohMnz49TzzxRJYuXZpXXnklrVu3zt57750+ffrkk5/8ZIYMGZJddtmlSWsFAAAAABpPqVwul5u6CIph0aJFlb19Fy5cmG7dujVxRQDU1rBxs5q6hCYzdmjfpi4BAABo5hoiX2u2D1kDAAAAACg6AS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoKqaugAAaArDxs1q6hIAAABgu1nBCwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4kzz33HMZMWJEevXqlfbt22ePPfZI3759c80112T16tXbNfbq1atz11135ctf/nL69u2b3XffPS1btkznzp1z7LHHZuTIkXnhhRdqNd4PfvCD9O3bN3vssUfat2+fXr16ZcSIEXnuuee2q1YAAAAAoFhK5XK53NRFNKW77747Z511VpYvX77J4z179szEiRPTo0ePWo/92GOPpV+/flm5cuUW++26664ZPXp0zjzzzC32mz9/fk455ZQ8/fTTmx3n9ttvz6mnnlrrWrfFokWL0r179yTJwoUL061btwaZB6AxDBs3q6lLoJGNHdq3qUsAAACauYbI15r1Ct45c+bkzDPPzPLly9OhQ4dceeWVefjhhzNp0qScd955SZJ58+Zl0KBBWbFiRa3HX758eSXc7devX6666qrcf//9+fOf/5x77703559/flq0aJHly5fnc5/7XO65557NjrVixYoMGjSoEu6ed955mTRpUh5++OFceeWV6dChQ5YvX54zzzwzjz76aO2/GQAAAABA4VQ1dQFN6aKLLkp1dXWqqqpy33335dhjj60c++AHP5hDDjkkl112WebNm5drr702I0eOrNX4LVq0yBlnnJErrrgihx566EbHBw4cmJNPPjlDhgzJW2+9lQsvvDBPP/10SqXSRn2vueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRdnypQptaoVAAAAACieZruCd+bMmZk6dWqSZNiwYRuEu+uNGDEivXv3TpKMGjUqa9eurdUcxx13XMaPH7/JcHe9wYMH5+Mf/3iSZMGCBZkzZ85GfdauXZvrr78+SdK7d++MGDFik3MNGzYsSfLAAw9k1ixvPQYAAACAnV2zDXgnTJhQaZ977rmb7NOiRYucffbZSZLXXnstkydPbpBaBgwYUGkvWLBgo+OTJ0/O66+/niQ555xz0qLFpv/Zhg4dWmn/5je/qd8iAQAAAIAdTrMNeB966KEkSfv27XPUUUdttl///v0r7WnTpjVILWvWrKm0d9lll42Or6/1H+v5R3369Em7du2SNFytAAAAAMCOo9kGvHPnzk2S9OjRI1VVm9+KuFevXhudU98eeOCBSnv9lhDv9MQTT2yynn9UVVWVHj16JGm4WgEAAACAHUezfMjaG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9V7LX/7yl0ycODFJcvjhh28y4F20aFGSt1cbd+rUaYvjde/ePY899liWLl2aNWvWpHXr1ttcy/p5NmfJkiXbPBYAAAAA0PCaZcC7YsWKSrtDhw5b7b8+4F25cmW91rFmzZoMHz48b731VpLkyiuv3GS/9fVua63rrVy5slYBb/fu3be5LwAAAADQ9JrlFg1vvPFGpd2qVaut9l8fklZXV9drHV/5ylcye/bsJG8/PO20007bZL/19dam1qT+6wUAAAAAdizNcgVvmzZtKu0333xzq/3XPwStbdu29VbDVVddlTFjxiRJ+vbtm5/85Ceb7bu+3trUmtS+3q1tQbFkyZIcffTRtRoTAAAAAGg4zTLg7dixY6W9LdsurFq1Ksm2bZGwLW688cZcfvnlSd5+aNof/vCHDbZW+Efr661NrUnt693afsQAAAAAwI6lWW7R0KZNm3Tu3DnJ1h8s9uqrr1ZC0/rYo/aXv/xlLrjggiTJ/vvvn/vvvz977rnnFs9ZH7yuWrUqr7322hb7rl+Fu9dee9Vq/10AAAAAoHiaZcCbJIceemiSZP78+ampqdlsvyeffLLS7t2793bN+bvf/S5nn3121q1bl3333TeTJk3aplWz62v9x3r+UU1NTRYsWFAvtQIAAAAAO75mG/Aef/zxSd5eFfvII49stt8DDzxQaffr16/O802aNClnnHFGampq0rlz59x///05+OCDa1XrP9bzj2bPnl1Zbbw9tQIAAAAAxdAs9+BNko997GO56qqrkiQ333xz3v/+92/UZ926dbn11luTJJ06dcqAAQPqNNfDDz+cwYMHZ82aNdltt91y77335rDDDtvm80888cTstttuef3113PLLbfksssuS6lU2qjfuHHjKu0hQ4bUqVYA2FkNGzerqUtoEmOH9m3qEgAAgAbUbFfwHn300TnhhBOSJGPHjs306dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0E3O8+ijj2bQoEFZtWpV2rdvn4kTJ+aoo46qVa2tWrXKV7/61STJ3Llz88Mf/nCjPtOnT8/YsWOTJP3790/fvv5nDgAAAAB2ds12BW+SjBo1Kv369Ut1dXUGDhyYyy+/PAMGDEh1dXXuuOOOjB49OknSs2fPjBgxotbjL1iwIB/5yEcqD0b77ne/m9122y1//etfN3tOly5d0qVLl41ev/TSSzN+/PjMmzcvl112WebPn59Pf/rTadu2bSZPnpzvfe97qampSdu2bfOjH/2o1rUCAAAAAMXTrAPeI488MuPHj89ZZ52V5cuX5/LLL9+oT8+ePTNx4sR07Nix1uNPnTo1L730UuXzSy65ZKvnXHHFFRk5cuRGr3fs2DETJ07MKaeckqeffjqjR4+uBNDr7brrrrn99ttzxBFH1LpWAAAAAKB4mu0WDeuddtppeeyxx3LJJZekZ8+eadeuXTp16pQ+ffrk6quvzpw5c9KjR4+mLjNJ0qNHj8yZMydXX311+vTpk06dOqVdu3Z597vfnUsuuSSPPfZYTj311KYuEwAAAABoJKVyuVxu6iIohkWLFqV79+5JkoULF6Zbt25NXBFA3TXXB27R/HjIGgAA7DgaIl9r9it4AQAAAACKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXgBAAAAAApKwAsAAAAAUFACXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQTV6wPuVr3wlc+bMaexpAQAAAAB2Oo0e8P70pz9Nnz59cuSRR+aGG27IK6+80tglAAAAAADsFBo94G3ZsmXK5XL+8pe/5OKLL85+++2XM888M3/84x9TLpcbuxwAAAAAgMJq9IB3yZIl+dGPfpQjjjgi5XI5a9asyZ133plBgwZl//33z7e+9a0sWLCgscsCAAAAACicRg9499hjj3z1q1/Nn//85/z5z3/OV77yleyxxx4pl8tZtGhRvve976Vnz5458cQTc9ttt6W6urqxSwQAAAAAKIRGD3jf6Ygjjsj111+f559/Pr/+9a9z8sknp0WLFimXy5k6dWqGDh2afffdN+eff35mzJjRlKUCAAAAAOxwmjTgXa9ly5b5xCc+kYkTJ+bvf/97vve97+WQQw5JuVzO8uXLM2bMmPTr1y+HHXZYrr322rz00ktNXTIAAAAAQJPbIQLed9p3333zf//v/82TTz6Ze+65J/vss0+SpFwu58knn8xll12W7t2759Of/nQeffTRpi0WAAAAAKAJ7XABb5I8+OCDOffcc/PJT34yL774YsrlcpKkffv2KZfLWbt2bX7961+nT58+ueiii7Ju3bomrhgAAAAAoPHtMAHvwoUL893vfjc9evTIgAEDcuutt2bVqlVJkpNOOinjx4/Pyy+/nHnz5uXrX/96dt9996xbty4//vGP8+Mf/7iJqwcAAAAAaHxNGvCuWbMmv/zlLzNw4MAceOCBueKKK/K3v/0t5XI5++23X771rW/lb3/7W+6999586lOfSsuWLdOjR49cddVVWbBgQU488cSUy+WMHj26Kb8MAAAAAIAmUdUUk86cOTM333xzxo8fn9dffz3J23vstmzZMqeeemqGDx+ej370oymVSpsdY7fddsu//uu/pn///lmwYEFjlQ4AAAAAsMNo9ID3sMMOy5NPPpkklb11e/bsmWHDhuWcc85Jly5dtnmsrl27JknefPPN+i8UAAAAAGAH1+gB79y5c5Mkbdu2zSc/+ckMHz48J5xwQp3G2nXXXXP22WdvcaUvAAAAAMDOqtED3iOPPDLDhw/P5z73uey6667bNdZee+2VcePG1U9hAAAAAAAF0+gB7yOPPNLYUwIAAAAA7JRaNPaE3/nOd/Kd73wny5Yt2+ZzXn311cp5DeG5557LiBEj0qtXr7Rv3z577LFH+vbtm2uuuSarV6/errHXrVuXJ554IuPGjcsFF1yQvn37pnXr1imVSimVSpkyZco2jXPiiSdWztnaBwAAAADQPDT6Ct6RI0emVCrlk5/8ZPbcc89tOueVV16pnPftb3+7Xuu5++67c9ZZZ2X58uWV11avXp3Zs2dn9uzZGTNmTCZOnJgePXrUafzbbrstQ4cOradqAQAAAAD+V6MHvDuSOXPm5Mwzz0x1dXU6dOiQb3zjGxkwYECqq6tzxx135Oc//3nmzZuXQYMGZfbs2enYsWOt5yiXy5V2y5Ytc/jhh2ft2rV5/PHH61Rznz59cvPNN9fpXAAAAABg51KIgHft2rVJ3g5I69NFF12U6urqVFVV5b777suxxx5bOfbBD34whxxySC677LLMmzcv1157bUaOHFnrOQ499NBcf/316du3b4444oi0adMmI0eOrHPA2759+7znPe+p07kAAAAAwM6l0ffgrYtHH300SbLXXnvV25gzZ87M1KlTkyTDhg3bINxdb8SIEendu3eSZNSoUZWguTaOPvroXHjhhTnmmGPSpk2b7SsaAAAAAOAdGnwF76233rrJ13/7299m9uzZWzx3zZo1WbBgQW666aaUSqX07du33uqaMGFCpX3uuedusk+LFi1y9tln5xvf+EZee+21TJ48OQMHDqy3GgAAAAAAtkeDB7xDhw5NqVTa4LVyuZxvfvOb2zxGuVxOixYtctFFF9VbXQ899FCSt7c8OOqoozbbr3///pX2tGnTBLwAAAAAwA6jUbZoKJfLlY9Nvbalj5YtW6Zfv3753e9+t0HYur3mzp2bJOnRo0eqqjafc/fq1Wujc5rSk08+mfe///3p1KlT2rRpk27dumXw4MG59dZb67SFBAAAAABQXA2+gveZZ56ptMvlcg466KCUSqXce++9OeSQQzZ7XqlUSps2bdK5c+fssssu9VrTG2+8kWXLliVJunXrtsW+u+++e9q3b59Vq1Zl4cKF9VpHXbz44ot58cUXK58vXrw4ixcvzu9+97tcffXVufPOOyv7BtfWokWLtnh8yZIldRoXAAAAAGgYDR7w7r///pt8vWvXrps91tBWrFhRaXfo0GGr/dcHvCtXrmzIsraoRYsW+dCHPpRTTjkl733ve9O5c+esWLEif/7zn3PjjTdm7ty5eeKJJzJgwIDMnDkz73rXu2o9R/fu3RugcgAAAACgoTR4wPuP1q1b19hTbuSNN96otFu1arXV/q1bt06SVFdXN1hNW3PXXXelU6dOG71+wgkn5IILLsh5552XW265JS+++GIuvvji3HXXXY1fJAAAAADQqBo94N0RtGnTptJ+8803t9p/zZo1SZK2bds2WE1bs6lwd72WLVtmzJgxmTFjRp566qn85je/yeLFi7PffvvVao6tbUGxZMmSHH300bUaEwAAAABoOM0y4O3YsWOlvS3bLqxatSrJtm3n0FSqqqoybNiwXHbZZUmSBx54IJ/97GdrNcbW9iMGAAAAAHYsDRbwfuELX0jy9sPSxo4du9HrdfGPY9XV+oe3vfzyy1t9sNirr75aCXh39D1qDz300Ep78eLFTVgJAAAAANAYGizgHTduXEqlUpJsEMq+8/XaKJfL9RbwJm+HoVOnTs38+fNTU1OTqqpNfyuefPLJSrt37971MndDqcv3FQAAAAAorgYLeN/1rndtMnDc3OuN7fjjj8/UqVOzatWqPPLII3n/+9+/yX4PPPBApd2vX7/GKq9OnnjiiUq7a9euTVgJAAAAANAYGizgffbZZ2v1emP72Mc+lquuuipJcvPNN28y4F23bl1uvfXWJG8/5GzAgAGNWmNt1NTU5Kabbqp8/oEPfKAJqwEAAAAAGkOLpi6gqRx99NE54YQTkry9hcT06dM36nPttddm7ty5SZKLLrooLVu23OD4lClTUiqVUiqVMnTo0AardfLkyXnttdc2e3zt2rUZPnx4pdbTTjtth98vGAAAAADYfg22grcIRo0alX79+qW6ujoDBw7M5ZdfngEDBqS6ujp33HFHRo8enSTp2bNnRowYUed5xo0bt8Hnjz76aKX9xz/+cYNVzT169Mjxxx+/Qf9bbrklp59+ek4//fSceOKJefe7351dd901K1euzCOPPJLRo0dXtmfo0qVLRo0aVedaAQAAAIDi2GED3jVr1uS1117LXnvtlRYtGmah8ZFHHpnx48fnrLPOyvLly3P55Zdv1Kdnz56ZOHFiOnbsWOd5zj333M0eu/rqqzf4/Jxzztko4E2SlStX5he/+EV+8YtfbHasww8/PHfccUcOPPDAOtcKAAAAABRHo2/RsHLlyvzhD3/IH/7wh6xcuXKj48uWLcsnPvGJ7LrrrunatWt23333jBgxImvWrGmQek477bQ89thjueSSS9KzZ8+0a9cunTp1Sp8+fXL11Vdnzpw56dGjR4PMva2+/vWv57rrrssZZ5yR97znPdl7773TsmXLdOjQIQcffHDOPPPM/PrXv86cOXNy6KGHNmmtAAAAAEDjKZXL5XJjTnjLLbfk3HPPTbdu3fLss89usDp33bp1ef/7358///nPeWdZpVIpH/vYx/Kf//mfjVkq/2DRokWVvX0XLlyYbt26NXFFAHU3bNyspi4BGsXYoX2bugQAAOD/1xD5WqOv4L333nuTJEOGDNlo64Xx48fnkUceSZK8733vyyWXXJL3ve99KZfLmTBhQv74xz82drkAAAAAADusRt+D969//WtKpVKOO+64jY7deuutSZKjjjoqDz/8cKqqqrJ27dqccMIJmTVrVm655ZZ89KMfbeySAQAAAAB2SI2+gvell15Kko0eBLZ27do8+OCDKZVK+ed//udUVb2dPbds2TJf+tKXUi6XM3PmzMYuFwAAAABgh9XoAe8rr7ySJGnVqtUGr8+aNSvV1dVJstEq3Z49eyZJXnjhhUaoEAAAAACgGBo94G3Xrl2S/13Ju96DDz6YJOnRo0f23nvvDY61bdu2cYoDAAAAACiQRg94Dz744CTJlClTNnj9N7/5TUqlUj7wgQ9sdM7SpUuTJF26dGnw+gAAAAAAiqLRA96TTjop5XI5P/3pT3PPPfdk5cqVueGGGzJr1qwkyWmnnbbROY899liSpGvXro1aKwAAAADAjqyqsSe86KKL8rOf/SwrVqzIqaeeusGx3r17bzLgnThxYkqlUo488sjGKhMAAAAAYIfX6Ct4991339x9993ZZ599Ui6XKx8HHXRQ7rzzzpRKpQ36L1iwIFOnTk2SfPjDH27scgEAAAAAdliNvoI3SU444YQ888wzmTZtWl544YXsu+++Of7441NVtXE5S5Ysybe+9a0kycCBAxu7VAAAAACAHVaTBLxJ0qpVqwwYMGCr/Y4//vgcf/zxjVARAAAAAECxNPoWDQAAAAAA1A8BLwAAAABAQTXZFg1J8pe//CVTp07N3/72t6xYsSJvvfXWFvuXSqWMHTu2kaoDAAAAANixNUnA+9RTT+ULX/hCZsyYsc3nlMtlAS8AAAAAwDs0esC7ePHifOADH8iyZctSLpeTJB06dMjuu++eFi3sGAEAAAAAsK0aPeC98sors3Tp0pRKpQwfPjxf+9rX0rNnz8YuAwAAAACg8Bo94P3jH/+YUqmUs88+O6NHj27s6QEAAAAAdhqNvifC888/nyQ5++yzG3tqAAAAAICdSqMHvLvvvnuSpFOnTo09NQAAAADATqXRA94+ffokSebNm9fYUwMAAAAA7FQaPeD96le/mnK5bP9dAAAAAIDt1OgB70knnZSvf/3rmTx5cr785S9n7dq1jV0CAAAAAMBOoaqxJ7z11lvTu3fvHHfccRk9enTuvvvufPKTn0yvXr3Srl27rZ7v4WwAAAAAAG9r9IB36NChKZVKlc+XLFmSG264YZvOLZVKAl4AAAAAgP9fowe8SVIul5tiWgAAAACAnUqjB7zPPPNMY08JAAAAALBTavSAd//992/sKQEAAAAAdkotmroAAAAAAADqRsALAAAAAFBQTfKQtfWefvrp3HrrrZk+fXpeeOGFVFdX5957702PHj0qff7617/m73//e9q3b5/+/fs3YbUAAAAAADuWJgl4161bl8suuyyjRo3KunXrUi6XkySlUilvvvnmBn3//ve/59RTT01VVVWeeeaZ7Lfffk1RMgAAAADADqdJtmg4//zzc9111+Wtt95K165d88lPfnKzfU855ZQceOCBeeutt3LnnXc2YpUAAAAAADu2Rg94J02alLFjxyZJLr/88jz77LP51a9+tcVzPvWpT6VcLue///u/G6NEAAAAAIBCaPQtGkaPHp3k7ZW53/3ud7fpnKOPPjpJ8j//8z8NVhcAAAAAQNE0+gre6dOnp1QqZdiwYdt8Trdu3ZIkL7zwQkOVBQAAAABQOI0e8L700ktJkgMOOGCbz2nZsmWSpKampiFKAgAAAAAopEYPeNu3b58kWbp06Tafs2jRoiTJHnvs0SA1AQAAAAAUUaMHvAcddFCS5Iknntjmc+65554kyWGHHdYgNQEAAAAAFFGjB7wDBw5MuVzOT37yk6xbt26r/Z944omMGzcupVIpp5xySiNUCAAAAABQDI0e8H71q19N+/bts2DBgnzpS1/a4r66999/fwYOHJg33ngje+yxR84777xGrBQAAAAAYMdW1dgT7r333vnZz36Ws88+O2PHjs29996bQYMGVY6PGjUq5XI506ZNy5NPPplyuZwWLVpk3Lhx6dChQ2OXCwAAAACww2r0gDdJPve5z6Vly5Y5//zzs3Dhwtx4440plUpJkjFjxiRJyuVykqRDhw655ZZbNgiBAQAAAABogi0a1jvjjDMyf/78/Ou//muOOuqo7LLLLimXy5WPww47LN/4xjcyf/78DBkypKnKBAAAAADYYTXJCt71OnfunG9961v51re+lXXr1uWVV17JW2+9lT322CMtW7ZsytIAAAAAAHZ4TRrwvlOLFi2y5557NnUZAAAAAACF0egB71tvvZVZs2Zl6tSpmTdvXl599dWsWLEiu+66a/bYY4+8+93vzvHHH58+ffqkRYsm20ECAAAAAGCH12gBb01NTX7yk5/khz/8YZ5//vmt9u/evXsuvfTSfOlLX8ouu+zSCBUCAAAAABRLowS8L7/8coYMGZJp06YlScrl8lbPWbhwYb761a/mrrvuyq9//evsscceDV0mAMBOZ9i4WU1dQpMZO7RvU5cAAAANrsED3rfeeiuDBg3KrFmzUi6XUyqVMnDgwHz4wx/O+973vnTu3DkdOnTIihUrsmzZssyZMyf3339/Jk2alHK5nClTpuT000/Pgw8+aMsGAAAAAIB3aPCA9/vf/35mzpyZUqmUI488MrfddlsOPfTQzfb/8Ic/nEsvvTR//etfc/bZZ+fRRx/N9OnTc8011+TrX/96Q5cLAAAAAFAYDbokdu3atbn++usr4e60adO2GO6+03ve8548/PDDOfLII1Mul3PdddelpqamIcsFAAAAACiUBg1477777ixdujSlUin/8R//kTZt2tTq/DZt2uS2225LqVTK0qVL8/vf/76BKgUAAAAAKJ4GDXgfeuihJG9vu9CrV686jXHooYfmpJNOSpJMnTq13moDAAAAACi6Bg14H3nkkZRKpXzoQx/arnE+9KEPpVwu55FHHqmnygAAAAAAiq9BA96FCxcmSf7pn/5pu8ZZf/5zzz233TUBAAAAAOwsGjTgff3115Mku++++3aNs/789eMBAAAAANDAAe/y5cuTJB06dNiucdq3b58kWbFixXbXBAAAAACws2jQgPett96q1/HWrVtXr+MBAAAAABRZgwa8AAAAAAA0nKrGmOSnP/1punTpUufzX3rppXqsBgAAAABg59AoAe+///u/N8Y0AAAAAADNSoMHvOVyuaGnAAAAAABolho04J08eXJDDg8AAAAA0Kw1aMDbv3//hhweAAAAAKBZa9HUBQAAAAAAUDcCXgAAAACAghLwAgAAAAAUlIAXAAAAAKCgBLwAAAAAAAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAAAAAEBBCXiTPPfccxkxYkR69eqV9u3bZ4899kjfvn1zzTXXZPXq1ds19rp16/LEE09k3LhxueCCC9K3b9+0bt06pVIppVIpU6ZMqdV4q1evzg9+8IP07ds3e+yxR9q3b59evXplxIgRee6557arVgAAAACgWKqauoCmdvfdd+ess87K8uXLK6+tXr06s2fPzuzZszNmzJhMnDgxPXr0qNP4t912W4YOHVovtc6fPz+nnHJKnn766Q1ef+qpp/LUU09lzJgxuf3223PqqafWy3wAAAAAwI6tWa/gnTNnTs4888wsX748HTp0yJVXXpmHH344kyZNynnnnZckmTdvXgYNGpQVK1bUaY5yuVxpt2zZMu973/ty+OGH13qcFStWZNCgQZVw97zzzsukSZPy8MMP58orr0yHDh2yfPnynHnmmXn00UfrVCsAAAAAUCzNegXvRRddlOrq6lRVVeW+++7LscceWzn2wQ9+MIccckguu+yyzJs3L9dee21GjhxZ6zkOPfTQXH/99enbt2+OOOKItGnTJiNHjszjjz9eq3GuueaazJs3L0nygx/8IJdeemnl2LHHHpsTTzwx/fv3z+rVq3PxxRfXeusHAAAAAKB4mu0K3pkzZ2bq1KlJkmHDhm0Q7q43YsSI9O7dO0kyatSorF27ttbzHH300bnwwgtzzDHHpE2bNnWqde3atbn++uuTJL17986IESM26nPcccdl2LBhSZIHHnggs2bNqtNcAAAAAEBxNNuA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AAUl4AUAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAFvkueeey4jRoxIr1690r59++yxxx7p27dvrrnmmqxevbre5rnnnnsyZMiQdOvWLa1bt063bt0yZMiQ3HPPPVs9d+jQoSmVStv08eyzz9ZbzQAAAADAjquqqQtoanfffXfOOuusLF++vPLa6tWrM3v27MyePTtjxozJxIkT06NHjzrPsW7dunzxi1/M2LFjN3h98eLFWbx4cSZMmJDhw4fnxhtvTIsWMncAAAAAYNs064B3zpw5OfPMM1NdXZ0OHTrkG9/4RgYMGJDq6urccccd+fnPf5558+Zl0KBBmT17djp27Finef7lX/6lEu4eeeSRueyyy3LwwQdnwYIF+cEPfpA5c+ZkzJgx2WuvvfK9731vi2N17do199577xb77LfffnWqEwAAAAAolmYd8F500UWprq5OVVVV7rvvvhx77LGVYx/84AdzyCGH5LLLLsu8efNy7bXXZuTIkbWeY968efnhD3+YJOnTp08efPDBtG3bNknSt2/fnH766enfv39mz56da665Jl/4whe2uFq4ZcuWec973lPrOgAAAACAnU+z3Q9g5syZmTp1apJk2LBhG4S7640YMSK9e/dOkowaNSpr166t9Tw/+tGPUlNTkyS54YYbKuHueu3atcsNN9yQJKmpqcl1111X6zkAAAAAgOap2Qa8EyZMqLTPPffcTfZp0aJFzj777CTJa6+9lsmTJ9dqjnK5nN/+9rdJkl69euWYY47ZZL9jjjkm7373u5Mkv/3tb1Mul2s1DwAAAADQPDXbgPehhx5KkrRv3z5HHXXUZvv179+/0p42bVqt5njmmWfy/PPPbzTOluZZvHhxnn322VrNAwAAAAA0T8024J07d26SpEePHqmq2vxWxL169dronG31xBNPbHKc7Znn5ZdfTv/+/dO5c+e0bt06++67bz7ykY/kxz/+cVavXl2r+gAAAACAYmuWD1l74403smzZsiRJt27dtth39913T/v27bNq1aosXLiwVvMsWrSo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woRK+9xzz91knxYtWuTss89Okrz22muZPHlyreYol8v57W9/myTp1atXjjnmmE32O+aYY/Lud787SfLb3/42/7ioet68eZk7d26S5IwzztjsQ9+GDh1aaQt4AQAAAGDnV7/v4S+Qhx56KEnSvn37HHXUUZvt179//0p72rRpGThw4DbP8cwzz+T555/faJzNzfPUU09l8eLFefbZZ3PggQduVOvWxtlnn33Ss2fPzJs3L9OmTdvmOgEAAIrKdlvNj205ADbUbAPe9Stie/ToscW9anv16rXROdvqiSee2OQ42zLPOwPe2o4zb968LFy4MKtWrUr79u23ud5FixZt8fjChQsr7SVLlmzzuLCjW/XKi01dAgAAsI229v+uADuyd2Zq67d13V7NMuB94403smzZsiTZ6kbGu+++e9q3b59Vq1ZtEHBui3f+0NnaPOs3V06y0Tx1GadcLmfRokWVrR+2xTtr2Jqjjz56m/sCAABAfRk/oqkrAKgfS5cuzQEHHLDd4zTLPXhXrFhRaXfo0GGr/devgl25cmWDzfPOlbb/OE99jQMAAAAA7Fya7Qre9Vq1arXV/q1bt06SVFdXN9g86+fY1Dz1Nc7WbG2F8htvvJEnn3wye++9d/baa68tbm0B22rJkiWVFeEzZ87Mvvvu28QVsbNzzdGYXG80Ntccjcn1RmNzzdGYXG80lJqamixdujRJcvjhh9fLmM0yoWvTpk2l/eabb261/5o1a5Ikbdu2bbB51s+xqXn+cZx3fl6bcbZma9s/JG/vWQwNZd99992m6xDqi2uOxuR6o7G55mhMrjcam2uOxuR6o77Vx7YM79Qst2jo2LFjpb0t2xisWrUqybZt51DXedbPsal56mscAAAAAGDn0iwD3jZt2qRz585Jtv70zVdffbUSmtbmIWTJhititzbPO7dH+Md56jJOqVTy1yUAAAAA2Mk1y4A3SQ499NAkyfz581NTU7PZfk8++WSl3bt37zrN8Y/j1HaeuozTvXv3DR64BgAAAADsfJptwHv88ccneXtLg0ceeWSz/R544IFKu1+/frWa48ADD0zXrl03GmdTHnzwwSTJfvvtt9E+HOtr3do4L7zwQubNm1enWgEAAACA4mm2Ae/HPvaxSvvmm2/eZJ9169bl1ltvTZJ06tQpAwYMqNUcpVIpgwcPTvL2ytoZM2Zsst+MGTMqK28HDx6cUqm0wfGePXtWVvX+6le/yurVqzc5zrhx4yrtIUOG1KpWAAAAAKB4mm3Ae/TRR+eEE05IkowdOzbTp0/fqM+1116buXPnJkkuuuiitGzZcoPjU6ZMSalUSqlUytChQzc5z8UXX5xddtklSXLhhRemurp6g+PV1dW58MILkyRVVVW5+OKLNznO1772tSTJK6+8kssuu2yj4wsWLMhVV12VJOnRo4eAFwAAAACagWYb8CbJqFGj0rZt29TU1GTgwIG56qqrMmPGjEyePDnnn39+JUjt2bNnRowYUac5evbsmUsvvTRJMnv27PTr1y/jx4/P7NmzM378+PTr1y+zZ89Oklx66aU55JBDNjnOOeecU9l24Sc/+Uk++clP5t57783MmTPz4x//OMcdd1yWL1+eFi1a5Prrr09VVVWd6gUAAAAAiqNULpfLTV1EU7r77rtz1llnZfny5Zs83rNnz0ycODE9evTY6NiUKVMq2zacc845G2yR8E7r1q3Leeedl5tuummzdQwbNiyjR49Oixabz9yXLVuWU045JbNmzdrk8datW+fHP/5xhg8fvtkxAAAAAICdR7NewZskp512Wh577LFccskl6dmzZ9q1a5dOnTqlT58+ufrqqzNnzpxNhru10aJFi4wdOzYTJ07M4MGD07Vr17Rq1Spdu3bN4MGD84c//CFjxozZYribJHvuuWcefvjh/PSnP83xxx+fzp07p02bNjnooINy3nnn5ZFHHhHuAgAAAEAz0uxX8AIAAAAAFFWzX8ELAAAAAFBUAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrAC9TZ7Nmz853vfCcDBw5Mt27d0rp163To0CE9e/bMueeem4ceeqhe5hk5cmRKpdI2fUyZMqVe5mTHtK3XwYknnlgv8/3yl7/MwIEDs88++6RNmzbZf//9c9ZZZ2X69On1Mj47rhNPPHGbr7ftuf+4vzUfL730Un7/+9/n29/+dk4++eTsueeelX/boUOH1nq8e+65J0OGDKn8/O3WrVuGDBmSe+65p17rXr16dX7wgx+kb9++2WOPPdK+ffv06tUrI0aMyHPPPVevc1F/6uN6W716de666658+ctfTt++fbP77runZcuW6dy5c4499tiMHDkyL7zwQr3Ue8ABB2zTffCAAw6ol/mof/VxzY0bN26bfyaOGzeuXupetmxZvv3tb+ef/umfsuuuu2bXXXfNP/3TP+Xb3/52Xn755XqZg4axvdfcs88+W+vf9bbnHuQ+R0OrauoCgGL6wAc+kKlTp270+ptvvpmnn346Tz/9dMaNG5ezzz47P//5z9OqVasmqBLqprq6Op/85Cfzhz/8YYPX//73v+f222/PL3/5y3z729/OFVdc0UQVsqNp0aJFDjnkkKYugx3Y3nvvXS/jrFu3Ll/84hczduzYDV5fvHhxFi9enAkTJmT48OG58cYb06LF9q3lmD9/fk455ZQ8/fTTG7z+1FNP5amnnsqYMWNy++2359RTT92ueah/23u9PfbYY+nXr19Wrly50bFXXnklM2bMyIwZM3Lddddl9OjROfPMM7drPoqvvu5xjelPf/pTPvaxj230h4rHH388jz/+eMaMGZMJEybk6KOPbqIK2ZKmuObe/e53N/qcsK0EvECdPP/880mSrl275lOf+lROOOGEvOtd78pbb72V6dOn59prr83ixYtz6623Zu3atfnFL35RL/M+/vjjWzx+4IEH1ss87Ni+/OUv54ILLtjs8fbt22/X+F/4whcq4e6AAQNy0UUXpWvXrnn88cfzve99LwsWLMjIkSOz77775otf/OJ2zcWO6eabb86qVau22OeJJ56ohBof+tCHst9++23XnO5vzce73vWu9OrVK/fdd1+tz/2Xf/mXSrh75JFH5rLLLsvBBx+cBQsW5Ac/+EHmzJmTMWPGZK+99sr3vve9Ote4YsWKDBo0qBLunnfeefn0pz+dtm3bZvLkybnqqquyfPnynHnmmZk2bVqOOOKIOs9Fw6rL9bZ8+fJKuNuvX7+ceuqp6dOnTzp37pylS5fmrrvuys9//vMsX748n/vc57Lrrrvm5JNP3u5aBw8enO9+97ubPW7BQDFszz1uvXvvvTddu3bd7PFu3brVeewkWbhwYU477bQsXbo0VVVV+T//5/9U/lj1+9//Pv/v//2/LFmyJKeddloeeeSR7Z6PhlWXa26//fbb6u9eSXLVVVdV/l/2nHPOqXON67nP0WDKAHUwaNCg8vjx48s1NTWbPL506dJyz549y0nKScoPPPBAnee64oorKuPQvK2/Dq644ooGm2PSpEmVeU477bSNrvGlS5eW3/Wud5WTlDt16lR+5ZVXGqwWdmyXXXZZ5Vq57bbb6jSG+1vz8e1vf7t89913l1944YVyuVwuP/PMM5V/+3POOWebxnjqqafKVVVV5STlPn36lFevXr3B8VWrVpX79OlTTlKuqqoqP/3003Wu91vf+lalvh/84AcbHZ82bVqllv79+9d5HhrG9l5v06ZNK59xxhnl//mf/9lsnwkTJpRLpVI5Sfnggw8ur1u3rs717r///rX6b4EdT33c426++ebKOc8880zDFVsulz//+c9X5vrVr3610fHx48fXun4aV31cc1tTU1NT7tq1azlJuWPHjhv93K0N9zkamj14gTr5/e9/nzPOOCO77LLLJo/vueeeufbaayuf33nnnY1VGmyXH/7wh0mSqqqq/PSnP93oGt9zzz1z9dVXJ0lee+21jBkzptFrpOmtW7cut99+e5KkQ4cO+fjHP97EFbGj+9d//deceuqp2/WW0h/96EepqalJktxwww1p27btBsfbtWuXG264IUlSU1OT6667rk7zrF27Ntdff32SpHfv3hkxYsRGfY477rgMGzYsSfLAAw9k1qxZdZqLhrG919txxx2X8ePH59BDD91sn8GDB1fufQsWLMicOXPqNBc7h/q4xzWWF154ofIz/CMf+Ug+9alPbdTnjDPOyEc+8pEkyW233VZv+01Tfxrjmvuv//qvyjtXP/nJT270cxd2JAJeoMEMGDCg0l6wYEETVgLbZsWKFZk0aVKS5MMf/vBm34738Y9/PLvuumuS5De/+U2j1ceOY9KkSVm8eHGSt3/hb9euXRNXxM6uXC7nt7/9bZKkV69eOeaYYzbZ75hjjqnsEfjb3/425XK51nNNnjw5r7/+epK33466ub183/kQG/fC5snvehTR7373u6xbty5Jcu6552623/p73Lp16/K73/2uMUpjB3PrrbdW2vWxPQM0JAEv0GDWrFlTaW9upS/sSGbNmpU333wzSdK/f//N9mvVqlUlXJk1a1bWrl3bKPWx43jnL/xnn312E1ZCc/HMM89UVhFt6f70zuOLFy/Os88+W+u5HnrooY3G2pQ+ffpU/rgxbdq0Ws9D8fldjyLa1nvcO4+5xzU/K1asyIQJE5IkBxxwQD7wgQ80bUGwFQJeoME88MADlXbv3r3rZcyBAwemS5cuadWqVbp06ZITTzwx3//+9/Pqq6/Wy/gUw69//esceuihadeuXTp27JhDDjkk55xzTiZPnrxd4z7xxBOVdq9evbbYd/3xmpqajZ4wz85t5cqVldWK+++/f0488cR6Gdf9jS2py/0pSebOndtgc1VVVaVHjx51nofiq+/f9R588MEcccQR6dixY9q1a5cDDzwwZ555ZiZMmFCn1egU17nnnpuuXbumVatW2XPPPXPMMcfkm9/8ZuXdM9tj/T1ut912yz777LPZfvvuu2/lHVvucc3PnXfemdWrVydJPv/5z6dUKtXLuO5zNBQBL9Ag1q1bl+9///uVz88444x6Gff+++/P0qVLs3bt2ixdujQPPPBAvvGNb+Sggw6qvHWVnd8TTzyRuXPnprq6OitXrsz8+fNz66235oMf/GCGDBlSeWtxbS1atKjS3trTkrt3715pL1y4sE7zUUz/+Z//mVWrViVJzjrrrHr7hd/9jS1pzPvT+rnat2+fTp06bdNcS5cu3WA1Jzu/v/zlL5k4cWKS5PDDD6+XgPeZZ57JX/7yl6xcuTLV1dV59tln86tf/SpDhgzJCSecUC/hHsUwZcqULFmyJGvXrs3LL7+cP/3pT7nyyivTo0eP3Hjjjds19vp73Nbupcn/3uP8rtf8NNS7tdznaChVTV0AsHO67rrrMnPmzCRv71d61FFHbdd4hx9+eD72sY/l6KOPTteuXbN27do89dRTuf3223Pffffltddeyyc+8YncfffdOfnkk+vjS2AH1K5du5x++un50Ic+lF69eqVDhw6VIOxnP/tZXn755UyYMCGDBw/O/fffn5YtW9Zq/BUrVlTaHTp02GLf9u3bV9orV66s3RdCodX3L/zub2yLxrw/rZ9ra/Nsaq7WrVvXej6KZ82aNRk+fHjeeuutJMmVV165XeO1atUqp59+egYOHJj3vOc92W233fLaa69l+vTp+fd///csXLgw06ZNy0knnZTp06dnt912q48vgx3QQQcdlI9//OM59thjK+Hq3/72t/znf/5n7rzzzrzxxhv50pe+lFKplC9+8Yt1mqMu9zi/6zUvf//73yvvUDjuuOMq71bZHu5zNLgyQD2bMmVKuaqqqpyk3KVLl/KLL764XeO9+uqrWzz+s5/9rJyknKTctWvXcnV19XbNx45rS9fCCy+8UD7yyCMr18KoUaNqPf4XvvCFyvkLFizYYt+xY8dW+t522221notiWrhwYblFixblJOVjjjlmu8dzf2u+nnnmmcq/7TnnnLPV/t/5zncq/SdNmrTFvpMmTar0/bd/+7da13bQQQeVk5S7d+++1b6f//znK3MtXLiw1nPROGp7vW3N8OHD63W8Ld0Lly9fXh44cGBlvksuuWS756Ph1eWae+2118rr1q3b7PG777673LJly3KScrt27cpLliypU23rf46fcMIJW+17wgknlJOUd9lllzrNReOpz/vclVdeWRnrZz/7Wb3U5z5HQ7NFA1Cv/ud//idDhgxJTU1N2rRpk1//+tfp0qXLdo25tbeHnn/++Rk2bFiS5Pnnn89//ud/btd87Li2dC3svffeufPOOyurdm+44YZaj9+mTZtKe/3D1jbnnW9Fbtu2ba3nopj+4z/+o/Lk7fp4mrL7G9uqMe9P6+fa2jz1MRfFc9VVV2XMmDFJkr59++YnP/nJdo+5pXthx44d86tf/Sp77LFHkmT06NHbdG1SPLvtttsWtz069dRT8+1vfztJsnr16owdO7ZO89TlHuf+1rzcdtttSZLWrVvnzDPPrJcx3edoaAJeoN4888wzGThwYF599dXssssuueOOOxrtaaPnn39+pf3OB37QvBx00EE56aSTkiTz58+vPHF+W3Xs2LHS3tpb8dbvwZps21v82Dk0xC/8W+P+RtK496f1c23LW5LdC5uXG2+8MZdffnmStx/A94c//GGDbToaym677ZZPf/rTSd6+5mbPnt3gc7Jj+uIXv1gJgev6M7Eu9zj3t+Zj5syZefLJJ5Mkp59++lb/GF9f3OfYXgJeoF48//zz+fCHP5znn38+pVIpN910UwYPHtxo8x966KGVto3pm7ftuRbe+bCNdz7QaFPe+bCNdz7QiJ3X7NmzK0/ePvXUU7P77rs3yrzubySNe39aP9eqVavy2muvbdNce+21l/13d3K//OUvc8EFFyRJ9t9//9x///3Zc889G21+90KSpEuXLuncuXOSul8H6+9xW7uXJv97j/O7XvPRUA9X2xbuc2wPAS+w3ZYtW5aTTjopf/vb35K8/db4xv5hWF9Psaf4tudaeOcvVev/cr85649XVVXlkEMOqfOcFMc7f+Gvj+0ZtpX7G0nd7k9J0rt37wabq6amJgsWLKjzPBTH7373u5x99tlZt25d9t1330yaNGmDPzo0BvdC1tvea2H9Pe7111/PCy+8sNl+S5YsyfLly5O4xzUXa9euzR133JHk7T8mfPSjH23U+d3n2B4CXmC7vP766/nIRz5SWdX2/e9/P//8z//c6HWsnz9Junbt2ujzs+PYnmuhb9++adWqVZItv+3vzTffzIwZMyrnrN/3l53XO3/h32uvvXLyySc32tzubyTJgQceWPn339rbkh988MEkyX777ZcDDjig1nMdf/zxlfaW5po9e3bl7cv9+vWr9TwUw6RJk3LGGWekpqYmnTt3zv3335+DDz640etwLyRJli5dmmXLliWp+3Wwrfe4dx5zj2seJk6cmJdffjlJ8tnPfjZVVVWNOr/7HNtDwAvU2erVqzNo0KD8+c9/TpL8y7/8S77+9a83SS033nhjpd2/f/8mqYGm98wzz+T+++9Pkhx88MHZb7/9anV+x44d86EPfShJ8l//9V+bfeveXXfdVVnRMWTIkO2omKK45557snTp0iSN/wu/+xvJ26t61m999OSTT1b+yPSPZsyYUVl1O3jw4DqtBjrxxBOz2267JUluueWWlMvlTfYbN25cpe1euHN6+OGHM3jw4KxZsya77bZb7r333hx22GGNXsfrr79e+SNbu3bt0qdPn0avgR3D6NGjK/ekuv5MPP3009OixdtRyM0337zZfuvvcS1atMjpp59ep7kolqZ6t1biPsf2E/ACdfLmm29myJAhmTZtWpLkoosuyne/+91ajzNu3LiUSqWUSqWMHDlyo+OPP/545s+fv8UxRo8eXXma8z777ON/MndSd999d2pqajZ7/MUXX8wnPvGJyhNn1+8T+E5bu96S5Gtf+1qSt996/M///M956623Nji+bNmyyh8yOnXqlOHDh9fly6Fg6rIfm/sb9e3iiy/OLrvskiS58MILU11dvcHx6urqXHjhhUne3j7m4osv3uQ4Q4cOrVybU6ZM2eh4q1at8tWvfjVJMnfu3Pzwhz/cqM/06dMrT7Dv379/+vbtW9cvix3Uo48+mkGDBmXVqlVp3759Jk6cmKOOOqrW45x44omV6+3ZZ5/d6Pgf//jHja7ld1q5cmXOOOOMyqq6YcOG2e95J/Tss89mzpw5W+zz+9//Pt/5zneSJG3bts255567yX5bu+b22WeffO5zn0uS3Hvvvbnzzjs36vPrX/869957b5Lk85//fPbZZ5/afDkU0CuvvJKJEycmSQ4//PAcccQR23yu+xw7gsZdbw7sND7zmc/kvvvuS5J88IMfzLBhw/LXv/51s/1btWqVnj171nqeRx55JMOHD8+AAQNy8skn5/DDD0/nzp1TU1OTJ598Mrfffnuljl122SWjR49ulKc50/guvPDCrF27Np/4xCdy7LHH5oADDkjbtm2zbNmyTJkyJTfeeGPlLXvHH398nbcK+eAHP5hPf/rTueOOO/K73/0uJ510Ui6++OJ07do1jz/+eK688sr8/e9/T5JcffXVjfagLZrOq6++mt///vdJkve85z153/veVy/jur81Lw899NAGgf76+1WSzJ8/f4PVsMnbIew/6tmzZy699NJ8//vfz+zZs9OvX798/etfz8EHH5wFCxbk6quvrgQkl1566XbtD37ppZdm/PjxmTdvXi677LLMnz8/n/70p9O2bdtMnjw53/ve91JTU5O2bdvmRz/6UZ3noWFs7/W2YMGCfOQjH6k8ZO+73/1udtttty3+rtelS5d06dKl1rV+//vfz+c+97l8/OMfz/HHH5+DDz44HTp0yOuvv56HH344P/vZzyo/d9/97ndv9g+0NK3tveaeffbZDBgwIMcee2xOO+20vPe9761cT3/7299y55135s4776ys3v3hD39Y63dqvdOVV16ZP/7xj1m6dGk+85nPZPbs2Tn11FOTvB0kX3vttUne3papLotYaHj18XP1ne64447KQpH6Xr3rPkejKAPUQZJafey///6bHOfmm2+u9Lniiiu2eHxLH507dy5PmDChYb9omtT++++/TdfCJz7xifKrr766yTG2dr2tt3r16vIpp5yy2TlatGixxfPZufz7v/975d/+Bz/4wTaf5/7GO51zzjm1+rm5OW+99Vb5C1/4whbPHTZsWPmtt97aplomT5682X5PP/10+ZBDDtnsPLvuumv57rvv3p5vCw1ke6+3bb0/vfNjcz8X+/fvX+nzzDPPbPH4lj769+9fXrRoUT1/p6gv23vNTZ48eZvOa9euXfnGG2/cYi1bu+bWmzFjRnmfffbZ7Fz77LNPecaMGdv7raGB1NfP1fXe//73l5OUd9lll/KSJUtqVYv7HDsCK3iBHdopp5ySsWPHZvr06ZkzZ05efPHFvPzyyymXy9ljjz3y3ve+Nx/96EczdOjQ7Lrrrk1dLg3olltuyQMPPJDp06fnb3/7W5YtW5bly5enQ4cO6d69e4477ricc845OfbYY7d7rrZt22bixIn5xS9+kXHjxuUvf/lLXnvttey999454YQT8pWvfKVe5qEYbrvttiRvr6Jd/5bO+uD+Rl20aNEiY8eOzSc+8YmMHj06s2bNyrJly7Lnnnumb9++Of/88+vtIYA9evTInDlz8pOf/CS//vWvM3/+/Lz55pvp3r17TjnllFx00UXZf//962Uumq8f/vCHmTRpUqZPn56nnnoqy5Yty2uvvZZ27dqla9euef/735/PfOYzGThwoCfM78SOOuqo/Md//EemT5+e2bNnZ8mSJVm2bFlqamqy++6757DDDsuHPvShDB8+vE4rxTfl/e9/fx5//PGMGjUqEyZMqLy1/sADD8zgwYNz8cUXp3PnzvUyFzu2p59+On/605+SJCeddFK9b8nhPkdjKJXLm3lqAgAAAAAAOzQPWQMAAAAAKCgBLwAAAABAQQl4AQAAAAAKSsALAAAAAFBQAl4AAAAAgIIS8AIAAAAAFJSAFwAAAACgoAS8AAAAAAAFJeAFAAAAACgoAS8AAAAAQEEJeAEAAAAACkrACwAAAABQUAJeAAAAAICCEvACAAAAABSUgBcAAAAAoKAEvAAAAAAABSXgBQAAAAAoKAEvAADsxIYOHZpSqZQDDjigqUvZ4RxwwAEplUoZOnRoU5cCAFBnAl4AABrdlClTUiqVKh9nnnnmVs9ZH1SWSqVGqBAAAIpBwAsAQJP79a9/nccff7ypy2AnYMUyANDcCHgBAGhy5XI5V1xxRVOXAQAAhSPgBQCgSe25555Jkt/85jeZM2dOE1cDAADFIuAFAKBJffWrX03r1q2TJN/+9rebuBoAACgWAS8AAE2qe/fu+eIXv5gk+f3vf5+ZM2fWaZx169blv//7v/O1r30t/fr1y5577pmWLVumU6dOOeKII/K1r30tf//737c4xoknnphSqZQTTzwxSTJ//vx86UtfykEHHZS2bdvmgAMOyLBhw/Lcc89tcN5f//rXnHvuuTnooIPSpk2bdO/ePV/+8pfz0ksvbVPtEyZMyKc+9am8613vSps2bdKpU6f06dMn//qv/5pXX321Tt+P2nr99ddz1VVXpV+/ftlrr73SqlWr7LvvvjnttNNy5513plwub/bc9Q+/GzlyZJJk1qxZ+cxnPpNu3bqldevW2W+//fL5z38+c+fO3Wodq1evzr/927/ln/7pn9K+fft07tw5xx9/fG666aaUy+UNHtA3ZcqUynkjR45MqVTKLbfckiR57rnnNniQ37Y8oO+pp57KeeedlwMOOCCtW7fO3nvvnSFDhmTGjBlb/wYCADSVMgAANLLJkyeXk5STlG+++eby888/X27btm05SXngwIGbPOecc86pnLMpV1xxReX45j7atWtXvuuuuzZbV//+/ctJyv379y/ff//95Y4dO25ynC5dupTnzp1bLpfL5V/84hflVq1abbLf/vvvX168ePFm53vllVfKH/zgB7dYc5cuXcrTp0+vxXd309+3/ffff7N9/uu//qvcuXPnLdZxyimnlFesWLHJ89f3ueKKK8o/+clPylVVVZv9/j/wwAObrWPhwoXlQw45ZLM1nHrqqeX77ruv8vnkyZMr527Lv/8/Xjv7779/OUn5nHPOKd91113ldu3abfKcXXbZpXzHHXfU6vsOANBYrOAFAKDJ7bvvvvnyl7+cJLnvvvvy0EMP1XqMmpqa7Lvvvrngggty2223Zdq0aXnkkUcyYcKEXHbZZenQoUNWr16dz372s1tdSfr888/njDPOSKdOnXLDDTfkT3/6U6ZOnZqLL744pVIpL730UoYPH55Zs2bl7LPPzsEHH5wxY8Zk5syZmTx5cj7/+c8neXsV6f/5P/9nk3OsWbMmH/7wh/Pf//3f2WWXXfL5z38+v/zlLzNjxoxMnTo1V155ZTp37pyXXnopp5xyykarhuvLtGnTcvLJJ+fll1/O3nvvne9+97u5++6788gjj+Tuu+/OWWedlST5wx/+kHPOOWeLY91777258MILc9hhh+Wmm27KrFmz8uCDD+aSSy5JixYtsnr16nz+85/Pm2++udG5a9euzaBBg/L0008nSQYNGpQJEyZk9uzZmTBhQk455ZT8/ve/z7e+9a1Nzn3BBRfk8ccfz+DBg5MkXbt2zeOPP77Rx6Y8/vjj+exnP5u99947P/7xjzNjxoxMnz49I0eOTJs2bfLWW2/li1/8YpYuXbrN31cAgEbT1AkzAADNzz+u4C2Xy+UXX3yx3L59+3KS8oABAzY6Z2sreJ955pnym2++udk5Fy5cWN5vv/3KScpnnXXWJvv8f+3df0xV9R/H8ReGXEiv3HCwwdCsRpkZVBYyXbYh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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 371, + "width": 700 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# KDE plot of name lengths\n", + "plt.figure(figsize=(8, 4))\n", + "plt.hist([len(name) for name in names], bins=range(1, 20), density=True, alpha=0.7)\n", + "plt.xlabel('Name length')\n", + "plt.ylabel('Density')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be610546", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['^abhishek$', '^aman$', '^harsh$', '^ayush$', '^aditi$']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Attach START and END tokens to each name. Need to add these two to the vocabulary.\n", + "start_symbol = '^'\n", + "end_symbol = '$'\n", + "\n", + "names = [start_symbol + name + end_symbol for name in names]\n", + "names[:5]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ba6f75fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['$', '^', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 28\n" + ] + } + ], + "source": [ + "# Find unique characters in the dataset\n", + "vocab = set(''.join(names))\n", + "vocab = sorted(vocab)\n", + "print(vocab, len(vocab))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "e27963c8", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a d dimensional lookup table for each character in the vocabulary\n", + "class CharTable:\n", + " def __init__(self, vocab):\n", + " self.vocab = vocab\n", + " self.char2index = {c: i for i, c in enumerate(vocab)}\n", + " self.index2char = {i: c for i, c in enumerate(vocab)}\n", + " self.vocab_size = len(vocab)\n", + " \n", + " def encode(self, name):\n", + " return torch.tensor([self.char2index[c] for c in name])\n", + " \n", + " def decode(self, tensor):\n", + " if type(tensor) == torch.Tensor:\n", + " tensor = tensor.cpu().numpy()\n", + " return ''.join([self.index2char[i] for i in tensor])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4f38b691", + "metadata": {}, + "outputs": [], + "source": [ + "ct = CharTable(vocab)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "eba870c4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(tensor([1]),\n", + " tensor([0]),\n", + " tensor([2]),\n", + " tensor([27]),\n", + " tensor([2, 3]),\n", + " tensor([27, 2]))" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct.encode('^'), ct.encode('$'), ct.encode('a'), ct.encode('z'), ct.encode('ab'), ct.encode('za')" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "e40dd109", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('^', '^', '^ab')" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct.decode([1]), ct.decode(torch.tensor([1])), ct.decode(torch.tensor([1, 2, 3]))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "6ffcd4d9", + "metadata": {}, + "outputs": [], + "source": [ + "# create embedding layer\n", + "class CharEmbedding(nn.Module):\n", + " def __init__(self, vocab_size, embed_size):\n", + " super(CharEmbedding, self).__init__()\n", + " self.embedding = nn.Embedding(vocab_size, embed_size)\n", + " \n", + " def forward(self, x):\n", + " return self.embedding(x)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "17100afd", + "metadata": {}, + "outputs": [], + "source": [ + "char_embedding = CharEmbedding(ct.vocab_size, 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "7c43cdd2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvcAAALmCAYAAADG9buFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AACXlUlEQVR4nOzdd3hUZfrG8ftkJj2BEEgCIfQeigiEIgiKCAio4LoUUTfYey/4c1Us7GJ3Lbi2BUWBxUYRFUSKNCGAlBB6EUJCCiEhvZ7fH1lGIgRSpiST7+e6cu1kzjnvPHE1ueed57yvYZqmKQAAAAC1noerCwAAAABgH4R7AAAAwE0Q7gEAAAA3QbgHAAAA3AThHgAAAHAThHsAAADATRDuAQAAADdBuAcAAADcBOEeAAAAcBOEewAAAMBNEO4BAAAAN0G4BwAAANwE4R4AAABwE4R7AAAAwE0Q7gEAAAA3QbgHAAAA3ITV1QXAMfLy8rRjxw5JUkhIiKxW/q8GAACoSYqKipSSkiJJ6tq1q3x8fKo9JonPTe3YsUO9e/d2dRkAAACogI0bNyoqKqra49CWAwAAALgJZu7dVEhIiO3xxo0b1aRJExdWAwAAgD9LTEy0dVqcmd2qg3Dvps7ssW/SpIkiIiJcWA0AAADOx173R9KWAwAAALgJwj0AAADgJgj3DrBp0ya98MILGjp0qCIiIuTt7a2AgAC1b99ekyZN0po1a1xdIgAAANwQPfd2NnDgQK1evfqs5wsKCrRv3z7t27dPM2fO1M0336yPPvpIXl5eLqgSAAAA7oiZeztLSEiQJIWHh+vBBx/UV199pY0bN2r9+vV644031LRpU0nSZ599pujoaBdWCkkyDEMzZ850dRkAAAB2wcy9nXXs2FH/+Mc/9Je//EUWi6XMsb59++qmm25S//79tXfvXs2ZM0d33XWXBg4c6KJqAQAA4E6Yubez7777TmPHjj0r2J/WqFEjvf7667bvv/rqK2eVBgAAADdHuHeByy+/3Pb4wIEDLqyk7srKyrL9s09OTlZGRoaLKwIAAKg+wr0L5Ofn2x6XN8MPx5g9e7Z69eql+vXrq23btpKkJ598UkFBQfL399fgwYP1j3/8Q6ZpurhSAACAyqPn3gVWrVple9ypU6cqjREfH3/e44mJiVUa1509+OCDevvtt23fG4ZRJsTn5ORoxYoVWrFihZ544gm77RQHAADgLKQXJyspKdG0adNs348dO7ZK4zRr1sxeJdUJq1atsgX7Zs2a6R//+IdGjBihhg0b6uOPP9bVV1+t7du367vvvtOsWbNcXC0AAEDVEO6d7M0339TGjRslSdddd5169uzp4orqhjlz5kiSvLy8tGzZMrVv3952zGKxKDQ0VEOGDNGQIUP00ksvMWsPAABqJRKME61atUqTJ0+WJIWGhur999+v8lhHjx497/HExET17t27yuO7m0OHDkmSIiMjywT7cwkICHBGSQAAAHZHuHeSnTt3asyYMSoqKpKPj4++/PJLhYaGVnm8iIgIO1bn/nx9fSVJKSkpMk1ThmG4uCIAAAD7Y7UcJzh06JCGDh2qkydPymKxaO7cuWxc5WSXXnqpJOnYsWP6v//7PxUWFrq4IgAAAPsj3DtYQkKChgwZooSEBBmGof/85z+69tprXV2W28vMK9S+pExtPZqufUmZmnDzJLVp00aSNG3aNLVu3Vq33XabpNL/jwoKClxZLgAAgF0YJgt6O0xqaqoGDRqkuLg4SdK7776re++91ymvHR8fb1tR5+jRo3Wijcc0Ta0/eEKz1v+upXFJKi75419ti4eh/o2lvV+9pg2rV5x1rbe3twYPHqw77rhD1157LW07AADA4RyR1wj3DpKRkaHBgwdry5Ytkkpni5988kmnvX5dC/exxzL0yLyt2puUdcFzmxQd10VFe7Rvx2YtX778rOMjRozQV199ZevTBwAAcARH5DXachwgJydHI0eOtAX7p59+2qnBvq5ZvS9FYz9YX6FgL0mJ1sb6pd5gTfn3XEnSM888ozfffFOtWrWSJH3//fe6//77HVYvAACAoxDu7aygoEBjxozR2rVrJZXuivrSSy+5uCr3FXssQ3fO2qycguJKXZdTUKw7Z22WJLVu3VoPPfSQ4uLibMuHfvrpp8rIyLB7vQAAAI7EUph2NmHCBC1dulSSNHjwYN16662KjY0t93wvL68LrruOczNNU4/M21rpYH/a6etOd6b5+PjogQce0I033qiioiLt2bOHvQIAAECtQri3s2+++cb2ePny5erWrdt5z2/RooUOHz7s4Krc0/qDJyrcinM+B1KybY89PT1tj9mlFgAA1Da05aDW+vzX3yt8bubWH1WcffKcx9YfSJUklZSU6OOPP5bEJyoAAKB2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8Gpp40fS7sWSeUb4NyxSEu2zqB1cEu4zMzN16NAhZWZmnv+d8/8MHDjQCVXZ17/+9S/1799fubm5Gjp0qP7v//5Pl19+uXJzczV37lx9+OGHkkpvynn00UddXC0AADXP9sycSgX703KKSzQp9pDmX9xW3QL9LnxBwlbp27uklF3nPm4WSwlb/vg+KU5q2bJSNQHO4tRw/9FHH2n69OnasWOHTNO88AUqXd/6fDel1lQXX3yx/vvf/+rGG2/UqVOn9H//939nndO+fXstXry4zPKZAACgtMf+/l1HKh3sT8spLtEDu45oRVSH829ud2C5NPdGqTC74oN/GS01miu1GVyl2gBHckrPfXFxsUaPHq277rpL27dvV0lJiUzTrPBXbXX11Vdr+/btevjhh9W+fXv5+fkpKChIvXr10ssvv6zffvtNbdu2dXWZAADUOGvTs7QnO+/CJ57H7uw8rUs/z54zCVsrHOzLvD0oyi29LmFrteoDHMEpM/f//ve/tXDhQklSWFiYJk2apJ49eyo4OLjC2z/XVi1atNAbb7yhN954w9WlAABQa8w8lmqncU6of4NzfEJumqWtOBWcsfex/hHv84vM0uvm3y3dvU463ycDgJM5JdyfXhUmMjJSq1evVoMGDZzxsgAAoBbKLCrWD6kV22TqQr5PTVdmUbECrZayB45vL7/H/hyaBP4R4A+cLFGHRhYpOU46vEZqdaldagXswSnhfteuXTIMQ8888wzBHgAAnFdCfuFZy11WVbEpJeYXnh3udy/+U6/N+V3c2CIfq5RXJD2zIl+eHoZaBBnyWPSGNKKJmjZtKl9fX/sUDVSDU3tizrexBAAAgCRlV2AlvcrIOtd4v6+v1BiB3oYe6O0lSdqSWKKhn+eow7vZavfgfLVr104bNmywR6lAtTkl3Ldr106SlJaW5oyXAwAAtZi/xXLhk84QEH2Xwpb/prDlv537+P/Gu+yyy0oX60japctaVj4CTRvirY+u9tGlzS0K9jVkodUeNZBT2nLGjx+v3377Td99950GD2bZKAAAUL5wb09ZDNmlNcdqSE28/7RRZEEllr08g2EYuq2Hl27r4VX2wG3LpYieVawQsC+nzNw/8MADuuiii/T+++9r9erVznhJAABQSwVaLbqqUX27jHVVo6Cz++29/O0yto13gH3HA6rBKeHe29tbS5YsUc+e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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 371, + "width": 379 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_2d_embeddings(embedding, vocab):\n", + " plt.figure(figsize=(4, 4))\n", + " for i, char in enumerate(vocab):\n", + " tensor = ct.encode(char)\n", + " embedding = char_embedding(tensor)\n", + " plt.scatter(embedding[0, 0].item(), embedding[0, 1].item())\n", + " plt.text(embedding[0, 0].item(), embedding[0, 1].item(), char)\n", + " plt.xlabel('Dimension 1')\n", + " plt.ylabel('Dimension 2')\n", + "\n", + "plot_2d_embeddings(char_embedding, vocab)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "07e8a4ab", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.nn.functional as F\n", + "\n", + "class RNN(nn.Module):\n", + " def __init__(self, input_size, hidden_size, output_size):\n", + " super(RNN, self).__init__()\n", + "\n", + " self.hidden_size = hidden_size\n", + "\n", + " self.i2h = nn.Linear(input_size, hidden_size)\n", + " self.h2h = nn.Linear(hidden_size, hidden_size)\n", + " self.h2o = nn.Linear(hidden_size, output_size)\n", + " self.softmax = nn.LogSoftmax(dim=1)\n", + "\n", + " def forward(self, input, hidden):\n", + " hidden = F.tanh(self.i2h(input) + self.h2h(hidden))\n", + " output = self.h2o(hidden)\n", + " output = self.softmax(output)\n", + " return output, hidden\n", + "\n", + " def init_hidden(self):\n", + " return torch.zeros(1, self.hidden_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "2b63f5d2", + "metadata": {}, + "outputs": [], + "source": [ + "rnn = RNN(2, 128, ct.vocab_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "0349df1a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current character: a\n", + "Curent tensor: tensor([2])\n", + "Current embedding: tensor([[-1.4545, 0.9880]], grad_fn=)\n", + "tensor([[-2.5902, -3.3533, -3.8653, -3.9548, -3.5940, -2.8801, -3.4821, -3.0470,\n", + " -3.5943, -3.5595, -3.6062, -3.5047, -3.6877, -3.3012, -3.7079, -4.4289,\n", + " -2.9308, -3.6200, -3.3797, -3.7172, -2.8883, -2.6247, -3.7265, -3.3239,\n", + " -3.7247, -2.9247, -3.4027, -3.2497]], grad_fn=)\n", + "Predicted character: $\n" + ] + } + ], + "source": [ + "# Predict the next character given the current character\n", + "current_char = \"a\"\n", + "print(\"Current character:\", current_char)\n", + "# convert to tensor\n", + "current_tensor = ct.encode(current_char)\n", + "print(\"Curent tensor:\", current_tensor)\n", + "# Look up the embedding\n", + "current_embedding = char_embedding(current_tensor)\n", + "print(\"Current embedding:\", current_embedding)\n", + "# Initialize the hidden state\n", + "hidden = rnn.init_hidden()\n", + "#print(hidden)\n", + "# Pass the embedding and hidden state through the RNN\n", + "output, hidden = rnn(current_embedding, hidden)\n", + "print(output)\n", + "\n", + "# Print the predicted character (most probable)\n", + "_, predicted_index = output.topk(1)\n", + "# flatten the tensor\n", + "predicted_index = predicted_index.squeeze().item()\n", + "# convert to character\n", + "predicted_char = ct.decode([predicted_index])\n", + "print(\"Predicted character:\", predicted_char)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "49abd859", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a function to generate a word (sequence of characters) given a \n", + "# starting sequence of characters (stops when END token is predicted) \n", + "# or if the length of the generated word exceeds a certain limit of 10 characters\n", + "def create_name(start_string, rnn, char_embedding, ct):\n", + " with torch.no_grad():\n", + " # start with the last character in the start_string\n", + " current_char = start_string[-1]\n", + " current_tensor = ct.encode(current_char)\n", + " current_embedding = char_embedding(current_tensor)\n", + " hidden = rnn.init_hidden()\n", + " name = start_string\n", + " while current_char != end_symbol and len(name) < 10:\n", + " output, hidden = rnn(current_embedding, hidden)\n", + " # Find the next character by sampling from the output distribution\n", + " predicted_index = torch.multinomial(torch.exp(output), 1).item()\n", + " current_char = ct.decode([predicted_index])\n", + " _, predicted_index = output.topk(1)\n", + " predicted_index = predicted_index.squeeze().item()\n", + " current_char = ct.decode([predicted_index])\n", + " name += current_char\n", + " current_tensor = ct.encode(current_char)\n", + " current_embedding = char_embedding(current_tensor)\n", + " return name\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "affbe8c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^anm$'" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^a', rnn, char_embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "2f46e5c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^c$'" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^c', rnn, char_embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "c64c5361", + "metadata": {}, + "outputs": [], + "source": [ + "# Generate dataset for training\n", + "def generate_data(names, ct):\n", + " X = []\n", + " Y = []\n", + " for name in names:\n", + " for i in range(1, len(name)):\n", + " X.append(name[i-1])\n", + " Y.append(name[i])\n", + " X = [ct.encode(x) for x in X]\n", + " Y = [ct.encode(y) for y in Y]\n", + " return X, Y\n", + "\n", + "X, Y = generate_data(names, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "16ba3fdb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(tensor([1]), tensor([2]))" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X[0], Y[0], X[1], Y[1], X[2], Y[2]" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "3befbd3d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "^abhishek$\n", + "^ a\n", + "a b\n", + "b h\n" + ] + } + ], + "source": [ + "print(names[0])\n", + "print(ct.decode(X[0]), ct.decode(Y[0]))\n", + "print(ct.decode(X[1]), ct.decode(Y[1]))\n", + "print(ct.decode(X[2]), ct.decode(Y[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "ea2040fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 1/12, Loss: 2.684675631081001\n", + "Epoch: 2/12, Loss: 2.4274482760898484\n", + "Epoch: 3/12, Loss: 2.3604175581492934\n", + "Epoch: 4/12, Loss: 2.3314669918697972\n", + "Epoch: 5/12, Loss: 2.3155676853116023\n", + "Epoch: 6/12, Loss: 2.3054449003057\n", + "Epoch: 7/12, Loss: 2.2983417296262845\n", + "Epoch: 8/12, Loss: 2.2929774504282614\n", + "Epoch: 9/12, Loss: 2.2887099773854604\n", + "Epoch: 10/12, Loss: 2.2851798680263626\n", + "Epoch: 11/12, Loss: 2.2821793051528485\n", + "Epoch: 12/12, Loss: 2.2795761335450453\n" + ] + } + ], + "source": [ + "# Training loop\n", + "num_epochs = 12\n", + "learning_rate = 3e-4\n", + "embedding_size = 8\n", + "hidden_size = 32\n", + "rnn = RNN(embedding_size, hidden_size, ct.vocab_size)\n", + "embedding = CharEmbedding(ct.vocab_size, embedding_size)\n", + "\n", + "optimizer = torch.optim.Adam(list(rnn.parameters()) + list(embedding.parameters()), lr=learning_rate)\n", + "\n", + "criterion = nn.NLLLoss()\n", + "\n", + "for epoch in range(num_epochs):\n", + " total_loss = 0\n", + " for i in range(len(X)):\n", + " optimizer.zero_grad()\n", + " hidden = rnn.init_hidden()\n", + " input_tensor = X[i]\n", + " target_tensor = Y[i].squeeze()\n", + " input_embedding = embedding(input_tensor)\n", + " target_tensor = target_tensor.unsqueeze(0)\n", + " output, hidden = rnn(input_embedding, hidden)\n", + " \n", + " predicted_next_char = output.argmax().item()\n", + " \n", + " loss = criterion(output, target_tensor)\n", + " loss.backward()\n", + " optimizer.step()\n", + " total_loss += loss.item()\n", + " \n", + " #print(i, loss.item())\n", + " if (epoch+1) % 1 == 0:\n", + " print(f'Epoch: {epoch+1}/{num_epochs}, Loss: {total_loss/len(X)}')" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "9c04a265", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvcAAALmCAYAAADG9buFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAB7CAAAewgFu0HU+AACXlUlEQVR4nOzdd3hUZfrG8ftkJj2BEEgCIfQeigiEIgiKCAio4LoUUTfYey/4c1Us7GJ3Lbi2BUWBxUYRFUSKNCGAlBB6EUJCCiEhvZ7fH1lGIgRSpiST7+e6cu1kzjnvPHE1ueed57yvYZqmKQAAAAC1noerCwAAAABgH4R7AAAAwE0Q7gEAAAA3QbgHAAAA3AThHgAAAHAThHsAAADATRDuAQAAADdBuAcAAADcBOEeAAAAcBOEewAAAMBNEO4BAAAAN0G4BwAAANwE4R4AAABwE4R7AAAAwE0Q7gEAAAA3QbgHAAAA3ITV1QXAMfLy8rRjxw5JUkhIiKxW/q8GAACoSYqKipSSkiJJ6tq1q3x8fKo9JonPTe3YsUO9e/d2dRkAAACogI0bNyoqKqra49CWAwAAALgJZu7dVEhIiO3xxo0b1aRJExdWAwAAgD9LTEy0dVqcmd2qg3Dvps7ssW/SpIkiIiJcWA0AAADOx173R9KWAwAAALgJwj0AAADgJgj3DrBp0ya98MILGjp0qCIiIuTt7a2AgAC1b99ekyZN0po1a1xdIgAAANwQPfd2NnDgQK1evfqs5wsKCrRv3z7t27dPM2fO1M0336yPPvpIXl5eLqgSAAAA7oiZeztLSEiQJIWHh+vBBx/UV199pY0bN2r9+vV644031LRpU0nSZ599pujoaBdWCkkyDEMzZ850dRkAAAB2wcy9nXXs2FH/+Mc/9Je//EUWi6XMsb59++qmm25S//79tXfvXs2ZM0d33XWXBg4c6KJqAQAA4E6Yubez7777TmPHjj0r2J/WqFEjvf7667bvv/rqK2eVBgAAADdHuHeByy+/3Pb4wIEDLqyk7srKyrL9s09OTlZGRoaLKwIAAKg+wr0L5Ofn2x6XN8MPx5g9e7Z69eql+vXrq23btpKkJ598UkFBQfL399fgwYP1j3/8Q6ZpurhSAACAyqPn3gVWrVple9ypU6cqjREfH3/e44mJiVUa1509+OCDevvtt23fG4ZRJsTn5ORoxYoVWrFihZ544gm77RQHAADgLKQXJyspKdG0adNs348dO7ZK4zRr1sxeJdUJq1atsgX7Zs2a6R//+IdGjBihhg0b6uOPP9bVV1+t7du367vvvtOsWbNcXC0AAEDVEO6d7M0339TGjRslSdddd5169uzp4orqhjlz5kiSvLy8tGzZMrVv3952zGKxKDQ0VEOGDNGQIUP00ksvMWsPAABqJRKME61atUqTJ0+WJIWGhur999+v8lhHjx497/HExET17t27yuO7m0OHDkmSIiMjywT7cwkICHBGSQAAAHZHuHeSnTt3asyYMSoqKpKPj4++/PJLhYaGVnm8iIgIO1bn/nx9fSVJKSkpMk1ThmG4uCIAAAD7Y7UcJzh06JCGDh2qkydPymKxaO7cuWxc5WSXXnqpJOnYsWP6v//7PxUWFrq4IgAAAPsj3DtYQkKChgwZooSEBBmGof/85z+69tprXV2W28vMK9S+pExtPZqufUmZmnDzJLVp00aSNG3aNLVu3Vq33XabpNL/jwoKClxZLgAAgF0YJgt6O0xqaqoGDRqkuLg4SdK7776re++91ymvHR8fb1tR5+jRo3Wijcc0Ta0/eEKz1v+upXFJKi75419ti4eh/o2lvV+9pg2rV5x1rbe3twYPHqw77rhD1157LW07AADA4RyR1wj3DpKRkaHBgwdry5Ytkkpni5988kmnvX5dC/exxzL0yLyt2puUdcFzmxQd10VFe7Rvx2YtX778rOMjRozQV199ZevTBwAAcARH5DXachwgJydHI0eOtAX7p59+2qnBvq5ZvS9FYz9YX6FgL0mJ1sb6pd5gTfn3XEnSM888ozfffFOtWrWSJH3//fe6//77HVYvAACAoxDu7aygoEBjxozR2rVrJZXuivrSSy+5uCr3FXssQ3fO2qycguJKXZdTUKw7Z22WJLVu3VoPPfSQ4uLibMuHfvrpp8rIyLB7vQAAAI7EUph2NmHCBC1dulSSNHjwYN16662KjY0t93wvL68LrruOczNNU4/M21rpYH/a6etOd6b5+PjogQce0I033qiioiLt2bOHvQIAAECtQri3s2+++cb2ePny5erWrdt5z2/RooUOHz7s4Krc0/qDJyrcinM+B1KybY89PT1tj9mlFgAA1Da05aDW+vzX3yt8bubWH1WcffKcx9YfSJUklZSU6OOPP5bEJyoAAKB2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8Gpp40fS7sWSeUb4NyxSEu2zqB1cEu4zMzN16NAhZWZmnv+d8/8MHDjQCVXZ17/+9S/1799fubm5Gjp0qP7v//5Pl19+uXJzczV37lx9+OGHkkpvynn00UddXC0AADXP9sycSgX703KKSzQp9pDmX9xW3QL9LnxBwlbp27uklF3nPm4WSwlb/vg+KU5q2bJSNQHO4tRw/9FHH2n69OnasWOHTNO88AUqXd/6fDel1lQXX3yx/vvf/+rGG2/UqVOn9H//939nndO+fXstXry4zPKZAACgtMf+/l1HKh3sT8spLtEDu45oRVSH829ud2C5NPdGqTC74oN/GS01miu1GVyl2gBHckrPfXFxsUaPHq277rpL27dvV0lJiUzTrPBXbXX11Vdr+/btevjhh9W+fXv5+fkpKChIvXr10ssvv6zffvtNbdu2dXWZAADUOGvTs7QnO+/CJ57H7uw8rUs/z54zCVsrHOzLvD0oyi29LmFrteoDHMEpM/f//ve/tXDhQklSWFiYJk2apJ49eyo4OLjC2z/XVi1atNAbb7yhN954w9WlAABQa8w8lmqncU6of4NzfEJumqWtOBWcsfex/hHv84vM0uvm3y3dvU463ycDgJM5JdyfXhUmMjJSq1evVoMGDZzxsgAAoBbKLCrWD6kV22TqQr5PTVdmUbECrZayB45vL7/H/hyaBP4R4A+cLFGHRhYpOU46vEZqdaldagXswSnhfteuXTIMQ8888wzBHgAAnFdCfuFZy11WVbEpJeYXnh3udy/+U6/N+V3c2CIfq5RXJD2zIl+eHoZaBBnyWPSGNKKJmjZtKl9fX/sUDVSDU3tizrexBAAAgCRlV2AlvcrIOtd4v6+v1BiB3oYe6O0lSdqSWKKhn+eow7vZavfgfLVr104bNmywR6lAtTkl3Ldr106SlJaW5oyXAwAAtZi/xXLhk84QEH2Xwpb/prDlv537+P/Gu+yyy0oX60japctaVj4CTRvirY+u9tGlzS0K9jVkodUeNZBT2nLGjx+v3377Td99950GD2bZKAAAUL5wb09ZDNmlNcdqSE28/7RRZEEllr08g2EYuq2Hl27r4VX2wG3LpYieVawQsC+nzNw/8MADuuiii/T+++9r9erVznhJAABQSwVaLbqqUX27jHVVo6Cz++29/O0yto13gH3HA6rBKeHe29tbS5YsUc+e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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 371, + "width": 379 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_2d_embeddings(embedding, vocab)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "721c95d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^an$'" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^a', rnn, embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "4a30721d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^bhan$'" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^b', rnn, embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "2e099db4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^chan$'" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^c', rnn, embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "7d7bde4e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^dan$'" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^d', rnn, embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "40978228", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'^n$'" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "create_name('^n', rnn, embedding, ct)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f1a8be", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5040c6f4", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/posts/names-indian.txt b/posts/names-indian.txt new file mode 100644 index 0000000..36cef6c --- /dev/null +++ b/posts/names-indian.txt @@ -0,0 +1,1165 @@ +Abhishek +Aman +Harsh +Ayush +Aditi +Anjali +Shubham +Anushka +Rohit +Saurabh +Muskan +Rahul +Utkarsh +Vaibhav +Amit +Saumya +Rishabh +Shruti +Himanshu +Kajal +Ankit +Gaurav +Nikhil +Siddharth +Prashant +Priya +Harshit +Shashank +Akash +Varun +Yash +Shreya +Harshita +Anurag +Vivek +Swati +Vishal +Aditya +Nidhi +Ayushi +Krishna +Anshika +Sakshi +Shivani +Prakhar +Mansi +Tushar +Abhinav +Shivangi +Ashutosh +Adarsh +Divya +Piyush +Pragya +Ajay +Akanksha +Neeraj +Ritika +Tanya +Nisha +Arun +Pallavi +Aniket +Nikita +Vijay +Ananya +Priyanshi +Suraj +Akshat +Ishika +Mohit +Palak +Ankur +Richa +Ravi +Arpit +Ankita +Shraddha +Deepak +Priyanka +Khushi +Shweta +Kavya +Kunal +Dheeraj +Akshita +Riya +Sneha +Pranjal +Isha +Sumit +Kishan +Pawan +Soumya +Neelesh +Sarthak +Alok +Raghav +Rishi +Pragati +Shivam +Lakshya +Ashish +Sandeep +Ishita +Shaurya +Kashish +Vineet +Mayank +Jyoti +Parul +Shambhavi +Anshu +Keshav +Prince +Prakash +Pratibha +Praveen +Priyanshu +Kshitij +Arushi +Ishan +Garima +Manish +Vaishnavi +Shreyansh +Atul +Sarvesh +Vidya +Shubhangi +Mohsin +Saran +Vikash +Aayush +Akhilesh +Nitin +Himani +Sushil +Vartika +Aviral +Abdul +Sumeet +Prerna +Nupur +Neha +Vikas +Vanshika +Rohan +Shivansh +Sunil +Juhi +Nitesh +Ganesh +Naveen +Shikhar +Jitendra +Chirag +Abhay +Lucky +Smriti +Manu +Deependra +Anoop +Devendra +Diksha +Muskaan +Divyansh +Kushal +Nitish +Preeti +Anand +Hemant +Amol +Sonal +Rishab +Shashwat +Shatakshi +Supriya +Anchal +Simran +Srijan +Ashwani +Stuti +Abhijeet +Harshvardhan +Ajit +Poornima +Anil +Mahendra +Ahmad +Shalini +Abhijit +Suyash +Sanskriti +Danish +Tamanna +Unnati +Sachin +Anupam +Shailesh +Shoaib +Vishnu +Surya +Pankaj +Kaif +Pooja +Gayathri +Pradeep +Ritu +Dinesh +Shriya +Tharun +Karan +Kiran +Tarun +Samarth +Ruchi +Udit +Rashi +Shailendra +Sameer +Shubhi +Siddhant +Mahi +Kanika +Aishwarya +Rajat +Rituraj +Naman +Mukesh +Roshan +Nandini +Rashmi +Vigneshwaran +Kriti +Arpita +Divyanshi +Yogesh +Deepika +Astha +Sanjay +Mahek +Narendra +Ekta +Adil +Ritesh +Bhumika +Samriddhi +Anmol +Aayushi +Akshay +Shekhar +Amisha +Amrita +Sekhar +Kundalik +Durga +Apurva +Alka +Indora +Aqsa +Anwar +Apratim +Hasni +Dalia +Aadharsh +Amarnath +Bramoni +Nethaji +Chetna +Aastha +Aakriti +Abhyuday +Akarsh +Navneet +Om +Swapnil +Akhil +Madhav +Divyam +Kirti +Annanya +Arunima +Niteesh +Nithisha +Sandhya +Uttam +Vatsalya +Aparna +Disha +Seema +Suryansh +Yashaswi +Avinash +Smita +Subhra +Tuhin +Arti +Aakash +Ayan +Aryan +Vertika +Umme +Yukti +Vishesh +Ayushman +Geeta +Divyanshu +Jaswant +Hemanshu +Bhoopendra +Bhawana +Divakar +Dimpal +Shrestha +Shivanshi +Shubh +Shreyash +Satyarth +Satyam +Shilpa +Shikha +Soniya +Tanay +Sushant +Ujjwal +Tanu +Subham +Srishti +Suryakant +Sudhanshu +Shivang +Shilpi +Sourabh +Sonu +Shakti +Satendra +Shaqib +Shalu +Sudheer +Vipul +Vipin +Yashika +Virat +Varsha +Sunny +Vineeta +Vibhanshu +Monti +Minakshi +Nitikarsh +Mugdha +Madhu +Khanak +Megha +Manya +Pakhi +Ranu +Purvi +Sapna +Saloni +Prachi +Poonam +Purnima +Prajjwal +Satya +Vandana +Tanishq +Amaan +Yuvraj +Saurav +Sanjeev +Simaran +Shrishti +Amrit +Arman +Archana +Avanish +Yusuf +Anubhav +Anita +Anupriya +Anukriti +Kritika +Jaya +Namrata +Kushagra +Hariom +Gargi +Janvi +Jai +Naziya +Ragini +Priyam +Sania +Sangeeta +Nimish +Nimesh +Prabhakar +Nivedita +Neetika +Monu +Pankhuri +Nilesh +Mallika +Mahima +Mehak +Manshi +Prakhyat +Saket +Rishika +Satvik +Sanskar +Prateek +Prarthana +Rekha +Pratham +Devanshu +Devansh +Dolly +Dhruv +Deeksha +Bhavya +Dev +Deepali +Faizan +Khushboo +Karishma +Madhuri +Maaz +Jahnavi +Jahanvi +Kamran +Kamini +Rana +Sidhi +Hartesh +Mrithyunjay +Nishtha +Dilip +Ramanakanth +Durgesh +Dipa +Rohith +Jagadeesh +Indu +Shyam +Shreyas +Indra +Sasi +Arvind +Kartik +Kartikeya +Chaitanya +Mani +Sukirti +Subodh +Surendra +Ashok +Suresh +Karthikeya +Lalit +Urmila +Sudhakar +Dhruva +Dhananjay +Rama +Raj +Chinmay +Chahat +Sourav +Desh +Raashi +Ram +Laxmi +Krishan +Yatharth +Mridul +Vinay +Sreekanth +Sweta +Thaanya +Rakesh +Pinky +Raju +Rajiv +Rajkumar +Pushkar +Asutosh +Pradip +Mrityunjay +Kavish +Monica +Sabareesh +Lakshmi +Love +Lekhraj +Sahil +Seshikanth +Kalpana +Santosh +Kapil +Subash +Raunak +Mangal +Tejas +Mayur +Ravisankar +Mahesh +Mahato +Aaryan +Manas +Surbhi +Deepshikha +Amar +Anuj +Siddhesh +Venkata +Renu +Farhan +Vignesh +Abhimanyu +Faraz +Bilal +Abhilash +Vaishali +Apoorva +Hemlata +Aanchal +Sathwika +Deepa +Utkarsha +Deep +Dushyant +Anshuman +Sukumaran +Chandran +Anshul +Saanchi +Aadil +Ali +Nishant +Aaditya +Vipasha +Abbas +Anubha +Chandra +Ayesha +Rizwa +Sanjeeda +Devadathan +Vardhamann +Sairam +Abhedhya +Gnaneswar +Sara +Rupal +Sahaj +Robin +Rupanjali +Rupeshwary +Brahmaputra +Hariharan +Pranav +Babu +Bibhu +Chirayu +Sameeksha +Ashmita +Chhavi +Shreepriya +Nahid +Sharique +Anusha +Anunay +Vidit +Shwetanshi +Anshit +Anubhuti +Vashif +Jahangeer +Sharanya +Saudamini +Arshad +Yeram +Asad +Asthana +Asmita +Ashal +Zeal +Areeb +Archita +Archi +Arish +Shyamali +Sejal +Shaileja +Gitanshu +Mansoon +Akshaya +Madhusri +Meet +Prajeeth +Gyanvi +Govindam +Mairaz +Abhilasha +Mritunjay +Mudit +Mubasshira +Goldy +Monish +Moosvi +Fariya +Toshit +Kanha +Khalid +Kaushiki +Elamathi +Vasundhara +Kandarp +Noopur +Suchita +Sumaiya +Himanshi +Ibrahim +Jagriti +Khansa +Kunaal +Ishwa +Joshika +Sawan +Priyesh +Priyal +Pradium +Omhari +Pranidhi +Leena +Harshada +Prathmesh +Ritank +Rishit +Meenu +Ranjan +Shukant +Jashveer +Nargis +Shreyans +Manaswini +Neelu +Mukund +Eshma +Aruba +Ehtisham +Nitya +Nishu +Noorsaba +Punya +Nihal +Devyanti +Nishchay +Shagun +Joy +Reshami +Ronit +Rishu +Prasun +Prakharendra +Priyamvada +Rajneesh +Kausar +Rouby +Sanket +Hari +Saumile +Shagufta +Shaad +Rupali +Jenamani +Sadiya +Saksham +Saharsh +Kushan +Munthala +Mini +Mrinal +Mudita +Mrinalini +Medha +Meenal +Nageshwar +Miren +Pardhuman +Parth +Prajal +Naseer +Nalin +Nav +Niti +Nawaz +Shamseer +Tavish +Tarushi +Tripti +Udbhav +Tuhina +Talin +Tahreem +Tanupriya +Tarique +Tariq +Utsav +Wasil +Abdur +Yogansh +Zoheb +Yogita +Vedanti +Anas +Vijendra +Abrar +Afzan +Suyesh +Shrey +Shivin +Shreyaansh +Shubhanshi +Shubhankar +Shiba +Sharvan +Shipra +Bhanu +Shiv +Shubhendu +Subhashini +Sriansh +Armoghan +Susheel +Surjeet +Snehill +Balbir +Snigdha +Arsalan +Som +Abhisikta +Aarvi +Adhyantika +Akhand +Aisha +Tabish +Yashveer +Zaineb +Aamra +Zufeshan +Alim +Antara +Annushka +Aparsha +Aqib +Apurv +Amish +Alina +Anavi +Ankush +Angad +Yashaswini +Uday +Srikrishan +Yashwanth +Vishwanath +Yashwant +Soni +Snehal +Sony +Swasti +Jimi +Utpal +Vishwa +Vidushi +Vishwas +Yachna +Vyom +Vaishavi +Vagisha +Varenyam +Vidhi +Umamaheshwara +Archit +Janhvi +Imaduddeen +Kalash +Kanchan +Kalindi +Hira +Gurjot +Hritika +Hunny +Humaira +Kashif +Mamta +Maanvi +Mandeep +Manvendra +Manideep +Kaushambi +Kasturi +Kaushik +Laiba +Kenisha +Gitika +Atif +Ateequa +Atishay +Shariq +Bhakti +Sravan +Areeba +Asma +Asif +Shakkil +Fatima +Satyendra +Garv +Geetika +Garvit +Devbrat +Devashish +Shakaib +Savan +Diptanshu +Anjoo +Shibashis +Shazia +Shivakumar +Shrikant +Sidarth +Sayan +Sanjit +Snoopi +Sharuk +Shailvi +Shyamal +Soubhagya +Snehit +Soudeep +Souvik +Soumyadeep +Siddhi +Shubhkarman +Sivaganesh +Smitesh +Shrinivas +Sanjana +Qarib +Pranay +Rajamani +Ramesh +Ramadoss +Sunish +Nirlipta +Pradosh +Prakriti +Subhashis +Ranjeet +Sai +Sahiti +Sajmi +Sangeeth +Stalin +Rishav +Riddhi +Ruchika +Safin +Sadiqa +Abhaysinha +Aashish +Anjana +Astitva +Ankurjeet +Vibha +Veena +Saravanan +Yashovardhan +Saimadhav +Avnindra +Gaush +Digvijay +Haaris +Jag +Inabat +Babitarani +Rupinder +Bhavesh +Deepro +Deepanshu +Varna +Sujan +Suhaas +Sukrit +Suprabha +Sulochana +Sravani +Sowjanya +Sravya +Sreelakshmi +Surajit +Shahansha +Sheshidhar +Upamanyu +Vangara +Vamsi +Swarag +Suryakala +Swarnava +Tanvi +Tanishta +Niranjan +Munir +Narayan +Nagjibhai +Sura +Mohandas +Shiromani +Shahid +Sitaram +Suman +Sugathan +Palata +Akshit +Akansha +Amrin +Anitha +Amrutha +Kasniya +Omkar +Aakanksha +Veerendra +Vengatesh +Vilas +Vishwadeep +Machhan +Grover +Jauhari +Hanif +Arnav +Bhushan +Kori +Yakub +Kalapu +Jodha +Rajendra +Rishiraj +Prabhu +Vikram +Tulshidas +Putta +Azmi +Vimlesh +Rehman +Sarath +Jami +Tanveer +Jeyahar +Kalyani +Kalaivani +Harsha +Harleen +Harshini +Himadri +Hershit +Kishor +Mythili +Mayukh +Navin +Niraj +Neenu +Lav +Kishore +Majaz +Manju +Manali +Hajira +Ashik +Ashay +Ashwini +Aswin +Aswathy +Thirukural +Upasana +Aravind +Asharudeen +Arnab +Atiq +Furqan +Febin +Geethu +Gunta +Gunjan +Cherry +Bhawna +Debanjana +Eashan +Taramla +Karthik +Ashit +Asvin +Ashirvad +Padum +Nivika +Nainika +Balamurugan +Atharva +Nashra +Aryaman +Rakhee +Raghwendra +Raksha +Raman +Rakshita +Pranjali +Pragun +Prashansi +Arihant +Arunlal +Brajesh +Dwijaa +Fatahun +Divyaraj +Gurvansh +Diganth +Anuraktika +Hatchinghoi +Anushi +Harshraj +Haider +Chiranjeev +Jyotsana +Kaustubh +Chandrasekhara +Chandrashekhar +Husain +Hammaad +Jaykant +Devdarshdeep +Wamika +Zaid +Abhinandan +Shalin +Tanpreet +Soumitra +Shirjon +Vratanshi +Digraj +Adity +Ana +Amita +Anadi +Davneet +Anikrishna +Ahad +Aeman +Akhya +Ambika +Jasmine +Tanish +Anish +Sadique +Ajith +Agrim +Ahinsa +Ritul +Ramandeep +Roma +Sadiq +Saawani +Satnam +Sifat +Vijaypal +Snehil +Sayeed +Satwik +Shabaj +Shreyasi +Hemavarun +Varnit +Vandita +Vidyadhar +Zahed +Viraj +Shubhanshu +Sagar +Sushmita +Rajveer +Susmithaa +Abhigya +Babli +Nagamani +Dhairya +Divyanshika +Pritha +Priyakanta +Nemi +Apurwa +Saddam +Ranjeeta +Neharika +Ramsundar +Ramkrishna +Omkant +Monika +Mitika +Mukul +Navodit +Naini +Ramakrishna +Radhika +Purnava +Ratan +Reghu +Ravinderpreet +Prasanna +Prabhjot +Prashasti +Puneet +Prassanna +Srasti +Sonika +Jivani +Jeevan +Suramya +Shravya +Shresth +Snehlata +Karthikeyan +Jamir +Akarshita +Ajeet +Hitesh +Amitesh +Ambuj +Wasfia +Udisha +Inderveer +Abuzar +Aatish +Sheesh +Kundan +Manush +Paakhi +Madan +Gundeep +Gauri +Ifra +Jaypreet +Iskand +Parijat +Ratnesh +Kritagya +Shalvi +Sankalp +Prasoon +Madhusudan +Prastuti +Rampratap +Madhukar