Skip to content

Instantly share code, notes, and snippets.

@jphme
Last active January 13, 2024 00:53
Show Gist options
  • Save jphme/598f3a6881b2c31af10ca03350458c5c to your computer and use it in GitHub Desktop.
Save jphme/598f3a6881b2c31af10ca03350458c5c to your computer and use it in GitHub Desktop.
Proof of Concept Split by Embeddings
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"from tqdm import tqdm\n",
"import torch.nn.functional as F\n",
"from torch import Tensor\n",
"from transformers import AutoTokenizer, AutoModel\n",
"import numpy as np\n",
"from scipy.spatial.distance import pdist\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"tokenizer = AutoTokenizer.from_pretrained(\"intfloat/multilingual-e5-small\")\n",
"model = AutoModel.from_pretrained(\"intfloat/multilingual-e5-small\") # .to('cuda')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"def average_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:\n",
" last_hidden = last_hidden_states.masked_fill(~attention_mask[..., None].bool(), 0.0)\n",
" return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Auf einer im Mittelalter von Kinzigarmen umschlossenen Insel ließen die Herren von Hanau-Buchen im 12. Jahrhundert eine Wasserburg errichten. Als Bauherr gilt Dammo von Hagenowe, der 1143 erstmals in einer Mainzer Urkunde genannt wird.[1] Nächstgelegener Ort war die spätere Wüstung Kinzdorf. In den Jahren nach 1170 übernahmen dann die Herren von Hanau-Dorfelden die Burg. Mittlerweile hatten sich im Umkreis der Burg bereits Menschen niedergelassen, der Beginn des Dorfes und der späteren Stadt (seit dem 2. Februar 1303) Hanau. Die Burg selbst wird als „Castrum in Hagenowen“ erstmals 1234 in einer Urkunde genannt. „Hagenowe“ bezeichnete damals den die Burg umgebenden Wald. Von der Baugeschichte der Burg Hanau im Mittelalter ist wenig bekannt. Archäologische Grabungen in den Jahren 2001 und 2002 haben Teile der Stützmauer des Burggrabens freigelegt, die auf einem Holzrost aus Eiche gründete. Dieses konnte dendrochronologisch auf das Jahr 1302 datiert werden. Mit Reinhard I. übernahmen die Herren und (seit 1429) Grafen von Hanau, später Hanau-Münzenberg, die Burg Hanau. Im Laufe des 15. Jahrhunderts wurde sie deren Hauptresidenz, die sich vorher zeitweise auch in der Burg Windecken befand. Nach der endgültigen Eroberung von Mariupol konzentrierte sich das russische Militär im Mai und Juni auf die Einnahme von Territorien in der Oblast Luhansk. Verschossen die Russen pro Tag bis zu 60.000 Artilleriegeschosse, konnten die Ukrainer mit 6000 antworten, oft unter gänzlichem Verzicht auf eine Antwort zwecks Einsparung von Munition.[6] Im Kampf um die Stadt Sjewjerodonezk stützte sich die russische Seite auf eine Taktik der Erschöpfung. Anfang Mai hatte Russland noch versucht, mit einer Überschreitung des Flusses Siwerskyj Donez die Ukrainer einzukesseln, was zum Verlust von rund 100 schweren Fahrzeugen geführt hatte. Der Verlust von Sjewjerodonezk führte auch zum Rückzug der Ukrainer aus Solote, wo ihre Truppen seit März erfolgreich den Erstürmungsversuchen standgehalten hatten.[7] Im Raum Cherson konnte die ukrainische Armee kleinere Gebietsgewinne verzeichnen.\n"
]
}
],
"source": [
"testtext = \"\"\"Auf einer im Mittelalter von Kinzigarmen umschlossenen Insel ließen die Herren von Hanau-Buchen im 12. Jahrhundert eine Wasserburg errichten. Als Bauherr gilt Dammo von Hagenowe, der 1143 erstmals in einer Mainzer Urkunde genannt wird.[1] Nächstgelegener Ort war die spätere Wüstung Kinzdorf. In den Jahren nach 1170 übernahmen dann die Herren von Hanau-Dorfelden die Burg. Mittlerweile hatten sich im Umkreis der Burg bereits Menschen niedergelassen, der Beginn des Dorfes und der späteren Stadt (seit dem 2. Februar 1303) Hanau. Die Burg selbst wird als „Castrum in Hagenowen“ erstmals 1234 in einer Urkunde genannt. „Hagenowe“ bezeichnete damals den die Burg umgebenden Wald. Von der Baugeschichte der Burg Hanau im Mittelalter ist wenig bekannt. Archäologische Grabungen in den Jahren 2001 und 2002 haben Teile der Stützmauer des Burggrabens freigelegt, die auf einem Holzrost aus Eiche gründete. Dieses konnte dendrochronologisch auf das Jahr 1302 datiert werden. Mit Reinhard I. übernahmen die Herren und (seit 1429) Grafen von Hanau, später Hanau-Münzenberg, die Burg Hanau. Im Laufe des 15. Jahrhunderts wurde sie deren Hauptresidenz, die sich vorher zeitweise auch in der Burg Windecken befand. Nach der endgültigen Eroberung von Mariupol konzentrierte sich das russische Militär im Mai und Juni auf die Einnahme von Territorien in der Oblast Luhansk. Verschossen die Russen pro Tag bis zu 60.000 Artilleriegeschosse, konnten die Ukrainer mit 6000 antworten, oft unter gänzlichem Verzicht auf eine Antwort zwecks Einsparung von Munition.[6] Im Kampf um die Stadt Sjewjerodonezk stützte sich die russische Seite auf eine Taktik der Erschöpfung. Anfang Mai hatte Russland noch versucht, mit einer Überschreitung des Flusses Siwerskyj Donez die Ukrainer einzukesseln, was zum Verlust von rund 100 schweren Fahrzeugen geführt hatte. Der Verlust von Sjewjerodonezk führte auch zum Rückzug der Ukrainer aus Solote, wo ihre Truppen seit März erfolgreich den Erstürmungsversuchen standgehalten hatten.[7] Im Raum Cherson konnte die ukrainische Armee kleinere Gebietsgewinne verzeichnen.\"\"\"\n",
"print(testtext)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"24 [101, 38, 93, 56, 80, 135, 20, 87, 59, 70, 150, 67, 15, 96, 16, 104, 156, 41, 143, 105, 184, 164, 84, 0]\n"
]
}
],
"source": [
"splitted = testtext.split(\".\")\n",
"print(len(splitted), [len(s) for s in splitted])"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"batch_dict = tokenizer(\n",
" splitted, max_length=512, padding=True, truncation=True, return_tensors=\"pt\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(24, 384)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"outputs = model(**batch_dict)\n",
"embeddings = average_pool(outputs.last_hidden_state, batch_dict[\"attention_mask\"])\n",
"# normalize embeddings\n",
"embeddings = F.normalize(embeddings, p=2, dim=1).tolist()\n",
"len(embeddings), len(embeddings[0])"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABq40lEQVR4nO3deXhb9Z0v/vfR7kWW9zVOnH1zNrIRaFhNUrpBC1Pg0gYyLZ0fJXRopp02v3shvW2nCZDS3FIGZpiHlt4LhfbOUGgLacEkoZRAIMZAFrIn3vddtqzt3D+k75FsvEmWdM6R3q/n8dPGkeUvGNsffT+bJMuyDCIiIiINM6h9ACIiIqLJMGAhIiIizWPAQkRERJrHgIWIiIg0jwELERERaR4DFiIiItI8BixERESkeQxYiIiISPNMah8gVvx+P5qammC32yFJktrHISIioimQZRn9/f0oLS2FwTD+PUrSBCxNTU0oLy9X+xhEREQUhfr6esyYMWPcv0+agMVutwMI/ANnZWWpfBoiIiKair6+PpSXlyu/x8eTNAGLSANlZWUxYCEiItKZyco5WHRLREREmseAhYiIiDSPAQsRERFpHgMWIiIi0ryoApbHHnsMFRUVsNlsWL9+PQ4fPjzuY5988kls3LgROTk5yMnJQVVV1YjHezwefO9738OyZcuQkZGB0tJSbNmyBU1NTdEcjYiIiJJQxAHL888/j+3bt2Pnzp2oqanBihUrsHnzZrS1tY35+AMHDuC2227D/v37cejQIZSXl2PTpk1obGwEAAwODqKmpgb3338/ampq8F//9V84efIkvvCFL0zvn4yIiIiShiTLshzJB6xfvx5r167FL37xCwCBCbPl5eW499578f3vf3/Sj/f5fMjJycEvfvELbNmyZczHvPvuu1i3bh0uXryImTNnTulcfX19cDgc6O3tZVszERGRTkz193dENyxutxtHjhxBVVVV6AkMBlRVVeHQoUNTeo7BwUF4PB7k5uaO+5je3l5IkoTs7OxxHzM8PIy+vr4Rb0RERJScIgpYOjo64PP5UFRUNOL9RUVFaGlpmdJzfO9730NpaemIoCecy+XC9773Pdx2220TRlq7du2Cw+FQ3jiWn4iIKHkltEto9+7deO655/DCCy/AZrN94u89Hg++/OUvQ5ZlPP744xM+144dO9Db26u81dfXx+vYREREpLKIRvPn5+fDaDSitbV1xPtbW1tRXFw84cfu2bMHu3fvxmuvvYbly5d/4u9FsHLx4kW8/vrrk9ahWK1WWK3WSI5PREREOhXRDYvFYsHq1atRXV2tvM/v96O6uhobNmwY9+Meeugh/OhHP8K+ffuwZs2aT/y9CFZOnz6N1157DXl5eZEci4iIiJJcxCmh7du348knn8TTTz+NEydO4O6774bT6cTWrVsBAFu2bMGOHTuUxz/44IO4//778dRTT6GiogItLS1oaWnBwMAAgECwcvPNN+O9997DM888A5/PpzzG7XbH6B+TiCi1Dbl9+Pc3zqKtz6X2UYiiEvG25ltuuQXt7e144IEH0NLSgpUrV2Lfvn1KIW5dXR0MhlAc9Pjjj8PtduPmm28e8Tw7d+7ED37wAzQ2NuKll14CAKxcuXLEY/bv34+rrroq0iMSEdEovz50Abte+RgfNvTiF//tErWPQxSxiOewaBXnsKQWl8eHJ984hxtXlaE8N13t4xBp3rd+8z5e+qAJWTYTau6/DiYjN7OQNsRlDguRVvxXTSN++uop/PffH1X7KES6cKq1HwDQ5/Liw8ZelU9DFDkGLKRLTT1DAIC3z3bCOexV+TRE2ub1+XGu3an8+Y1T7Sqehig6DFhIlzqdwwAAt8+Pv53pUPk0RNp2oXMQbp9f+TMDFtIjBiykS50DoQ6y/SfHXrxJRAGng+mg4qzAwM7a+h70DnnUPBJRxBiwkC51OcMClo/bkSS140Rxcao1MEbi8nn5mFuQAb8MvMWbSdIZBiykS51hAUtLnwvHm7n8kmg8p9oCNywLizNxxYICAMAbp5kWIn1hwEK61DkQqGGZnZ8BANj/MdNCROM51RIIWOYX2XHF/GDAcqqDN5OkKwxYSHfcXj/6XIHOoJtXzwAAvM6AhWhMbq8f5zsCHUILiuxYPycXFqMBjT1DONfhnOSjibSDAQvpTvdgIB1kkIAbV5UBAN6v7xlR10JEARc6nfD6ZWRaTSh12JBuMWHt7BwA7BYifWHAQrojOoRyMywoy07DomI7ZBk4eIq3LESjiYFx8wozIUkSAGBjMC3019MsvCX9YMBCuiNuUnIzLACAaxYVAgBe/5ivFolGEx1CC4oylfeJOpZDZzsx7PWpci6iSDFgId0RQ+NGBywHT7bBGzYci4hCM1gWFNmV9y0usSM/04ohjw9HLnardTSiiDBgId0RKaG8TCsAYNXMHGSnm9Hn8qKmrkfFkxFpz6kxAhZJknDF/HwAgW4hIj1gwEK6I1JCecEbFqNBwpXB2RLsFiIKGfb6cKFzEMDIgAVAaB4LC29JJxiwkO6MTgkBobQQ57EQhZxrd8Lnl2G3mVCUZR3xd58K3rAcb+5De/+wGscjiggDFtKd0SkhALhyQQEMEnCytR+NwU3ORKkuPB0kOoSE/EwrlpZmAQDePMNbFtI+BiykO6NTQgCQnW7BJTMDsyWYFiIKOD1Gh1C4UFqIdSykfQxYSHc6R7U1C1cH00IHGLAQAQjdsMwvtI/591eEzWPx+zmmn7SNAQvpjtgjlJ85MmARdSx/O9sBl4ezJYhOt4kblrEDltWzcpBuMaJjYBgnWrhAlLSNAQvpSvgeodyMkUWEi4rtKHHY4PL4cehcpxrHI9IMl8eHi53BHULFY6eELCYDNszJA8C0EGkfAxbSlfA9Qtlp5hF/J0mSkhZitxClujNtA/DLQHa6GQWZ1nEftzHYLfTX0yy8JW1jwEK6Er5HyGCQPvH31ywUY/rbIMvMyVPqOt0W7BAq/GSHUDhRePvehW4Mur0JORtRNBiwkK6M3iM02mXz8mAxGdDQPYQzwfw9USoSO4Tmj9MhJMzOz8CMnDS4fX68zVQqaRgDFtKVsYbGhUu3mJScPNubKZWNtUNoLJIkKdubWcdCWsaAhXRlrKFxo4W2NzNgodQ11RsWALhyQXCvEOtYSMMYsJCujDU0brSrg3Us713sRu+QJyHnotTW3DuEe3/zPj6o71H7KACAIbcP9d1j7xAay4a5+TAaJJxrd6Ih+HFEWsOAhXRlspQQAMzMS8fcggz4/DI7HyghHn39DP7wQRP+V/VptY8CINAhJMuBwD5/gttIwZFmxsrybACBIXJEWsSAhXRlKikhgGkhShy314+XP2oGANTW92iiO+2kmHA7hXSQcMV8bm8mbWPAQroylZQQEBrTf/BkO0eOU1z99XQ7egYDqccupxt1XeqnVKZacBvuimAdy9/OdMDr88flXETTwYCFdGW8PUKjra3Ihd1qQqfTjQ8aehJwMkpVL9Y2jfjz+3U96hwkjLJDKIKAZfmMbDjSzOhzefFBQ2+8jkYUNQYspCvj7REazWw0YGPwFSOn3lK8DLq9ePV4K4DAXh4AeL+uW80jAQh1CC0onHpKyGiQ8Kl5wW4hpoVIgxiwkG5MtEdoLKJb6PWTDFgoPl493oohjw+z8tJxx2UVAID3Ve4Ucg570dgzBCCylBAQSguxWJ20iAEL6cZEe4TGclUwYDna2Ie2Pldcz0ap6aVgOugLK0pxycxsAMDxpj5Vt4WLDc35mVbkTJI6HU0MkKut70HvIEcCkLYwYCHdmGyP0GgFditWzHAAAPbzloVirNvpxsFg6uSGlaUoy05Dgd0Kr1/G0Ub1akBE/crCcTY0T6Q0Ow3zCjPhl4G/nWV7M2kLAxbSjcn2CI3larY3U5y8crQFXr+MJSVZmBdcMLgqOMtEzcLbUy3BgtvCyNJBgmhvZlqItIYBC+nGVIbGjSbmsbx5ugPDXvWu6Sn5vFjbCCBwuyKsmhksvK1Xr/D2VDAlFGn9iiCK1d841aGJmTJEAgMW0o2pDo0LV1nqQH6mFU63D+9dUL97g5JDU88QDl/oAgB8bkV4wJINQN0bltAMlshTQgBw6ezAxvPGniGcbXfG8mhE08KAhXRjqkPjwhkMEq5eGLjiZlqIYuWPHzZBloF1Fbkoy05T3r98hgMGCWjudaGlN/GF3n0uD5qDnzeSGSzh0ixGrKvIBcC0EGkLAxbSjWhSQkAoLcR5LBQrL30Q7A4KSwcBQLrFhEXFWQCAWhXSQqeD81eKsqxwTKGTbjwb53MeC2kPAxbSjWhSQgDwqfn5MBslnOtw4kIHr7hpes60DeBoYx9MBgmfWVbyib9XMy0UzUj+sVyxIHAr+fa5LtZ+kWYwYCHdiCYlBAB2mxlrg1fcTAvRdInblY3z88e87VupYqeQMuF2mgHLomI7CuxWDHl8OMLaL9IIBiykG9G0NQtKWojzWGgaZFnGS0p3UNmYjxGdQh829sCT4CWCp6ZZcCtIkqSkhQ6yjoU0ggEL6UbHFPcIjUVMvX3nXBecw96YnotSx0eNvbjQOQib2YDrlhSN+Zg5+RnIspng8vhxMjgTJVGiWXo4niuDaaG/nuIAOdIGBiykCx5fZHuERptbkIGZuelw+/x48wx/AFN0xGbm65YUI8NqGvMxBoOElTMTvwixd9CDtv5AUD8/gqWH4xGLEI8396E9+LxEamLAQrrQ7Yxsj9BokiSxW4imxeeX8YcPQruDJqLGxNtTbYHblVKHDXZb9B1CQl6mFZVlgY4ntjeTFjBgIV3oiHCP0FiuDqtj4QRPitQ75zrR1j8MR5pZSZeMR+kUSuDm5limg4TQmH7eSpL6GLCQLkyn4FZYPzsXaWYjWvuGcaypL1ZHoxQhuoM+s6wYFtPEPzpFp9D5DqdyOxhvp5UOoemng4SNYXuF/H4G+aQuBiykC9EOjQtnMxtxeTAvz7QQRWLY68PLHzUDAL6wYuzuoHDZ6RbMKcgAANQm6JblVIxmsIRbPSsHGRYjOgbcON7MIJ/UFVXA8thjj6GiogI2mw3r16/H4cOHx33sk08+iY0bNyInJwc5OTmoqqr6xONlWcYDDzyAkpISpKWloaqqCqdPn47maJSkoh0aN5qoY3md7c0UgYMn29Hn8qIoy4p1s3On9DGryhNbeBuPgMViMmDD3DwATAuR+iIOWJ5//nls374dO3fuRE1NDVasWIHNmzejrW3sXwAHDhzAbbfdhv379+PQoUMoLy/Hpk2b0NjYqDzmoYcews9//nM88cQTeOedd5CRkYHNmzfD5Ur8Lg7SpmiHxo129aLAFXdtfQ86B9j5QFPzYjAd9PnlpTBOsYYqkXUsXU63Uuc1LwYdQuFEWohj+kltEQcsjzzyCO666y5s3boVS5YswRNPPIH09HQ89dRTYz7+mWeewTe/+U2sXLkSixYtwn/8x3/A7/ejuroaQOB2Ze/evfgf/+N/4IYbbsDy5cvx61//Gk1NTfj9738/rX84Sh6dMahhAYASRxoWl2RBloGD/AFMUzAw7EX1iVYA4w+LG4sIWGrreuJe/yFuV2bkpI3bbh0tMab/vYucYUTqiihgcbvdOHLkCKqqqkJPYDCgqqoKhw4dmtJzDA4OwuPxIDc3cK16/vx5tLS0jHhOh8OB9evXT/icw8PD6OvrG/FGyUvchkw3JQQA1yzi9maaulePt8Dl8WNOfobS5jsVC4vsSDMb0T/sxdn2gTieMHY7hMZSkZeO8tw0eHwy3jnfGfPnJ5qqiAKWjo4O+Hw+FBWNnPBYVFSElpaWKT3H9773PZSWlioBivi4SJ9z165dcDgcylt5eXkk/yikM7FKCQGhOpY3TrXDm+DR6aQ/YljcF1aWQpKm3lJvMhqwfIYDQPznsYgdQvNj2CEkBMb0i7QQ61hIPQntEtq9ezeee+45vPDCC7DZbNN6rh07dqC3t1d5q6+vj9EpSYti0dYsrCzPQU66GX0uL45c5GI3Gl/nwLBSbDrZsLixiL1C8a5jUQpuC2N/wwKE5rGwjoXUFFHAkp+fD6PRiNbW1hHvb21tRXFx8YQfu2fPHuzevRt/+ctfsHz5cuX94uMifU6r1YqsrKwRb5S8xB6hWNywGA2SMviL3UI0kZePtsDnl7GszIE5BZHfXoQ2N8cvMJZlWQlYFhbHJ2C5bF4ejAYJ5zqcqO8ajMvnIJpMRAGLxWLB6tWrlYJZAEoB7YYNG8b9uIceegg/+tGPsG/fPqxZs2bE382ePRvFxcUjnrOvrw/vvPPOhM9JqSN8j1AsaliAsKm3rGOhCYQ2M0d+uwKECm9PtfZjIE4Fqx0DbnQPeiBJwNwogqqpyLKZlXUDbG8mtUScEtq+fTuefPJJPP300zhx4gTuvvtuOJ1ObN26FQCwZcsW7NixQ3n8gw8+iPvvvx9PPfUUKioq0NLSgpaWFgwMBHKukiThvvvuw49//GO89NJL+Oijj7BlyxaUlpbixhtvjM0/JenadPcIjeXKBQUwSIHcf0M3XzHSJzX2DOHdC92QJOBzy6MLWIqybCjLToNfBj5s6IntAYNEwe3M3HSkWYxx+RxAqFuIe4VILREHLLfccgv27NmDBx54ACtXrkRtbS327dunFM3W1dWhublZefzjjz8Ot9uNm2++GSUlJcrbnj17lMf88z//M+6991584xvfwNq1azEwMIB9+/ZNu86FkoOYL5GTHv0eodGy0y1YPStQX7D/JH8A0yeJRYfrZ+ei2BH9z6KVYh5LnApvlR1CcapfEUTA8uaZDharkyqiatjftm0btm3bNubfHThwYMSfL1y4MOnzSZKEH/7wh/jhD38YzXEoySkdQpnTr18Jd9XCQrx7oRv7P27DVy+dFdPnJv0T3UGRzF4Zy6rybPzpw+b4BSxtsd8hNJZlZQ5kp5vRM+jBBw09WD1rahN/iWKFu4RI82KxR2gsor35rbMdcHl8MX1u0rdTrf040dwHs1HC9ZUTNxRMRnQK1dZ3x2VLeDxnsIQzGiRlFxfbm0kNDFhI85Q9QhmxKbgVFhXbUeKwweXx49BZDsSikJeCtytXLihEdvr0AuWlpVkwGyV0DLjR0D0Ui+MpAh1C8ZvBMtqVor2ZdSykAgYspHnxSglJkqR0C3HqLQmyLOOlD0LD4qbLZjZiSWlggFxNjNub2/qH0TvkgSGOHULhNi4I3LB8UN+D3kFP3D8fUTgGLKR5sdojNJZrFoYClnhc15P+1Nb3oK5rEOkWI6oWF8bkOVcp81h6YvJ8gii4rcjLgM0cvw4hocSRhvmFmfDLwN/OMi1EicWAhTSvM4ZD40a7bF4eLCYDGnuGcLotvvteSB9Ese2mJUVIt8RmkWC8NjcnMh0kiG4hTr1NLUcuduNip1PVDjEGLKR5oZRQbGtYACDdYsKGOXkAmBYiwOvz448fBsYyTLc7KNwlwcLb4029MS3wTlTBbbiN80XhbTtvJVOELMv4yn+8gysfPoD6GNdhRYIBC2leLPcIjeUa1rFQ0NvnutAxMIycdDM+FfzFHAszctKQn2mBxyfjWFPsNssrM1gSGLCsnx24lWzqdeFsuzNhn5fU0z3owVAw0C7NVm8+GgOWBGvqGcLXn34X//7GWbbSTlEs9wiNRQQsRy52s5Awxb0YHMX/mWUlMBtj9+NRkiSsLA8uQoxR4a0syzjdmpgZLOHSLEasnx2YwcK0UGoQ08AL7VZYTfGvlRoPA5YEe+H9Rrx2og0/efljVD1yEC990MRr1QnEY4/QaOW56ZhXmAmfX2a7ZgpzeXzYd7QFQGzTQUKs61ha+lzoH/bCaJAwOz8jJs85VUpaiN8vKaExmAaakZOm6jkYsCTY8ebAdbDRIKGhewjf+s37+OK/voX3LnSpfDJtisceobFcw2WIKe/AyTb0D3tR6rBhTXBtQyyJTqHaGHUKnWwJpINm52ck/FWvKLx9+1wnhr28KU52Yn5QWU66qudgwJJgJ4L563+9/RL803ULkG4xora+Bzc/cQh3/58juNDBnHC4eOwRGsvVwfbmA6fa4fPzxisVidkrn19RGpf/1paXZ0OSAksV2/pc034+NdJBwsIiOwrtVrg8frx3IbazZUh7Gnt4w5JynMNenO8MBCSXzMzBvdfOx4HvXoXb1s2EQQJeOdqC6352ED/8w3H0DLpVPq02xGto3GhrKnKQbjGiy+nG+Q62N6eafpcHr50I3K7FYljcWDKtJiwMFsfGIi2UqKWHY5EkCRvns705VYgalrJsBiwp4+OWPshyoHCpwB6oxyi027DrS8vwyj9egSsXFMDjk/HU387jiof24z/+ei7lr1vjtUdoNLPRgOKsQPW7WAVAqePPx1rh9voxrzATS0qy4vZ5VsVwc3No6WHiAxYAuGKBqGPhALlk18AaltRzPJgOWlr6yR+IC4vtePrv1+HXf78Oi4rt6HN58eM/ncB1j7yBP33YnLKFufHaIzSW7PRAjUw3b7dSjugOumFFKSQpfqnHVTHqFJJlGWeUGSyJTwkBwMb5BZAk4ERzn9LJR8mJRbcpSBTcLhkjYBGuWFCAP31rIx66aTkK7VbUdQ3inmdrcNPjb+HIxdTLFScqJQSEbnG6nGxtTiXt/cN4K7j88vMr4pMOEsQNy4cNvdOaGNrYMwSn2wezUUJFgjuEhNwMC+YEP/fRxl5VzkDx1zvkQf9woFOzLJtFtylDDIxaUuKY8HFGg4Qvry3H/u9chfuq5iPNbERNXQ9uevwt3PNsDeo6BxNxXE2I5x6h0XKCW3l5w5JaXv6oGT6/jBXl2XH/5T+3IBN2qwlDHh9OBm9IoiEKbmfnZ8R0XkykKssCP8tiOQyPtEXUr+RlWJBmUW8GC8CAJWG8Pj8+DrYhTnTDEi7DasJ9VQtw4LtX4ZY15ZAk4E8fNqPqkYP4lz8dT4khZ/HcIzRa6IaFAUsqCU8HxZvBIGFlDOpYTqowkn8slcEt1LxhSV5aSQcBDFgS5lyHE26vHxkWI2blRnatVpRlw4M3L8fL39qIjfPz4fb58eRfz+PKPfvx1Jvn4faqt4wq3uK5R2i0nAzesKSa+q5B1NT1wCABn1tekpDPGYvNzac0ErAsLQu8+DraxIAlWYVmsDBgSRmi4HZxSVbUMx4Wl2Thf39tPX61dS0WFGWiZ9CDH/7xOK772UG8/nFrLI+rGfHeIxQuV6SEeMOSMsTslQ1z81CYlZgdKauCixDfr4++Jk3NGSzhlgbT2/VdQylx45uKQjNY1K1fARiwJMyx4CuQqaaDJnLVwkK8/K2N2P2lZSiwW3GxcxD/8L+PKLnGZBLvPULhxA1LF3/wpoyXagMByw0rYj+Kfzwrgzcs59qdUc1b8vtlnAm2NCdy6eFYHOlmlOcGXnkfa+YtSzLSygwWgAFLwigdQjGa8WAyGnDrupk48J2rML8wEx6fjI8akusHRiL2CIXLzQi2NfOGJSV83NKHk639sBgN2FxZnLDPm5NhUXb/1EYxQK6hewhDHh8sRkPE6eV4EHUsxxpZeJuMtDLlFmDAkhCyLIfNYJm4QyhSGVYTls0IPKd41ZUsErVHSMhmSiiliNuVqxcVwJGA/77CTaeORdSvzCnIgEnFDiFBzJU6xjqWpMQalhTT0udC96AHRoOE+XHIOc8rDDznmfbkClgStUdIEDUs/cPepC5k1qP6rkE09gzFbPKzLMt4UaSD4rCZeTLT2dx8qk0bBbfC0mBr81G2NiedgWEveoIpci2khExqHyAViKvSeQWZsJlj38c+ryAYsCTZDUsih8YBQFaaGQYJ8MtAz6A7YUWYNLGXP2rGN5+pUf7sSDOjwG5FfqYFBXYbCjKtyLdbUJBpDb7fikK7FbkZlnFvIGrqutHYM4RMq0nZ1J1IK4MTb2vruuH3yxEF5KeC4xEWFmsjYBEpobPtAxh0e5Fu4a+VZCFamh1pZthtib2FHAv/y0qAqUy4nQ5xw3Ku3RnxDz8tS9QeIcFokJCdbkGX040uBiya8fy79QAASQJkOTB5s3fIgzNtE3+cJAVuzQrsoUCmwG5FQaYVb58LTLbdtLQoLi8iJrOoxA6ryYA+V2Ah6tyCqd+8ngp2CM0vVLdDSCiwW1GUZUVr3zBONPdh9axctY9EMdLYEyi41UL9CsCAJSEm2iEUCzNz02E2Shjy+NDUO6SJ9rNYSOQeISEn3YwupxvdHM+vCb2DHvztTGC53mvbr0R+hhXtAy609Q+jvX8YHQNutCv/P/C/7QPD6BwYhl8OTErudLqVoY2jqZEOAgLLNpfPcODdC914v65nygGLzy/jbLu6Sw/HsrTUgda+NhxrYsCSTJT6FQ2kgwAGLAkR6w6h0UxGAyryMnC6bQBn2gaSJmBJdEoICNzmnG13cnicRvzleAu8fhmLiu3KL3VHuhnzCif+Ze3zy+gedI8MZMICm7b+YczKy8Cn5uUn4h9jTKtm5gQDlm7cvHrGlD6mrmsQw14/rCYDyjXQISRUlmbh9Y/bOPE2yTRqqOAWYMASd30uD+q6Atdq8UoJAYG0kAhYrlqY+Jx8PCRyj5Ag9glxPL82vHK0BQBwfWVkU2iNBgn5mYE0kFZF0ykkOoTmFWbCqKHUr1J4y9bmpNLQrZ2hcQC7hOLuRDAdVJadprTNxoOoYzmbRJ1CidwjJIjgiK3N6utzefDX0+0AgM8uT9yclEQRE28/bunDoNs7pY85rZGR/KOJdPfptv6YdXKR+hp6tJUSYsASZyIdtDhO6SBBaW1Ook6hRO4REkRQ2cWUkOpeO94Kj0/G/MLMSVNAelTssKHEYYNfBj6c4tBHpeBW5ZH8owVekJnh8cnK2gDSPy0tPgQYsMSdWLsez3QQACW/n4wBSyJTQpx2qx0vfxRMBy1LzFJCNayKcHOzSAkt1NgNiyRJ3NycZFwen7IahQFLihAdQvEquBXmFmRCkoDuQY+SStG7RO4REpQaFu4TUlW/y4M3RDoomQOW4DyW9+smX4To9flxrt0JQHspIYCbm5ONGMmfaTUlfBL0eBiwxJHb68fp4FTKeLU0C2kWo5JnTIZblkTvERLEbU40S+kodl7/uA1urx9zCjJU30gcT+ETb2VZnvCxFzoH4fb5kWY2aqamIJxYO3KME2+TQnhLsyRpo8CbAUscnWkbgMcnw24zJeRKLZlG9Cd6j5CgbGxmSkhVL3/UDAD4TGWJZn5YxkNlmQMmg4T2/mHlFe14RMHt/KJMTQ6HrAy+KDvR3Aevj6st9E5r9SsAA5a4EsvAlpRkJeSHbjKN6E/0HiEhlwsQVecc9uLAyUA66DNJnA4CAJvZqNS3TVbHEppwq710EABU5GUgw2KEy+PHuQ6n2sehaWroDozj0MoMFoABS1zFeyT/aMnUKaTG0DggdMPidPvg8rA9Uw2vf9yGYa8fFXnpWFyizV/OsTTVeSyhpYfaTJEZDJLys46bm/VP3PjxhiVFhEbyOxLy+ZRZLEkQsCR6j5CQZTMpA7l6UqTwdsjtm7R+IpFeORpIB12/LLnTQYKYx/J+/cSFt1qdwRJuaSkHyCWLUA2LNobGAQxY4kaW5biP5B9NBCxNvS44h6c2iEqr1NgjBATaM3PSAzUzqVDH8taZDix+YB8e239G7aMAAAbdXuz/OPm7g8KtDN6wHGvsG3fomtsb1iGkkS3NY6ksY2tzsmANSwpp6B5Cv8sLs1FSAol4y063ID+YQhE/3PRKrZQQEGptToV9Qi/WNgEA/u3gOU0EuQdOtmPI40N5blrcO+u0YlZeOnLSzXD7/Mqt7GgXOp3w+mVkWk0odWh3i3hlsLX5eFMf/H7t3NpRZNxeP1r7XQBYw5ISRGvfgiI7LKbE/WueIwpv28feTqsXauwRElKpU+jdC10AgP5hL/6rpkHl06ROd1A4SZKUtFBtfc+YjwnfIaTlfy9zCzJhMRnQP+xFfbBok/SnuXcIsgzYzIaEzsGaDAOWOEl0OkhIlsJbNfYICaJTKNlnsbT1u0Z0czx96KKqtSwujw+vf9wGIPm7g0abrPBWdAhpteBWMBsNWBxMWbGORb+0OIMFYMASN8cTNJJ/tGRpbVZjj5AQumFJ7qLb9y4Eijxn5wfaUc+0DeBvZzpVO8/BU+0YdPtQlp2G5TMSU6iuFZMV3uqh4FZQNjezU0i3GjW2pVlgwBInx8NmsCRSstywqLFHSFD2CSX5Dcvh84F00BXz83Hz6hkAgF+9dUG184h00PWVxZp6VZcIy8sdkCSgvmsI7f2fXK1xShkap4OARWlt5g2LXmlxBgvAgCUuup1uNPUGCpYWJ/qGJRiwXOwchEfH0ybV2CMkKPuEkryGRQQsa2fn4qsbKgAA1R+3or4r8bUHLo8P1SeC6aDlqZUOAoAsmxnzg9+7o+tYhr0+XOgMfE20nhICoCxBPNbYq6l2eZq6Bg3OYAEYsMTFiWD9yszcdGTZErs0qsRhQ4bFCK9fxsVOfXYKqbVHSBC3Osl8w9I75MGJlsB/p+sqcjGvMBMb5+dDloH/8/bFhJ/nzdMdGBj2osRhw8oZ2Qn//Fow3iLEc+1O+PyBFR/FWdrtEBIWFtthNEjodLrR0udS+zgUhfAaFi1hwBIHxxK0oXkskiRhrs7TQmrtERJS4Yal5mI3ZBmoyEtHYfCX4B3BW5bn3q3HkDuxU35FOujTlcWa3JOTCMoixFGFt6fC6lf0kCqzmY3KbRELb/WJNSwpJNEj+UfTe+GtWnuEBFF0m8z7hA4H25nXzc5V3nf1okKU56ahd8iDF2sbE3aWYa8Pr55oBZB63UHhROHtBw098IXNMDmtkw6hcKHNzSy81Ruvz6/cjDEllAJCI/nVCVj0fsOi5tA4INTW3JXEKSGlfqUiFLAYDRK2XFoBIFB8m6j6g7fOdKLf5UWh3YrVwV/aqWheYSYyrSYMun3KrQoQVnCr0aWHYxED5HjDoj8tfS74/DIsRgMKVEjJTySqgOWxxx5DRUUFbDYb1q9fj8OHD4/72GPHjuGmm25CRUUFJEnC3r17P/EYn8+H+++/H7Nnz0ZaWhrmzp2LH/3oR7os2HJ5fDjTHggUVLthEQFLuz4DFrX2CAk5wS4hl8ef8NRIIrg8PnzY0AMAWD87b8TffXlNOdLMRnzc0q8ENfH2p7DuoFRNBwGBgHFFeeBmIjwtdLpN3LDoKWDhDYteifqV0myb5r4fIw5Ynn/+eWzfvh07d+5ETU0NVqxYgc2bN6OtrW3Mxw8ODmLOnDnYvXs3iouLx3zMgw8+iMcffxy/+MUvcOLECTz44IN46KGH8Oijj0Z6PNWdau2Hzy8jJ92sWoFcaAmiU5fjsdXaIyRkWk0wGwPfqMlYePt+XQ88PhlFWVaU54688nWkm3HjqjIAwNOHLsT9LG6vH3851gIgsOww1Y0uvHV5fErxvJ5SQotLsiBJQHOvSxkCSfog6le01tIMRBGwPPLII7jrrruwdetWLFmyBE888QTS09Px1FNPjfn4tWvX4uGHH8att94Kq3XsX0BvvfUWbrjhBnz2s59FRUUFbr75ZmzatGnCmxutCt/QrFaB3KzcdJiNEoY8PjT1DqlyhulQOyUUWICYvIW3Yhz/2orcMf8bveOyWQCAPx9rRVNPfP/7OXSuE30uL/IzrSPSU6lKKbwNtjafbR+AXwYcaWYU2LV1PT+RTKsJs/MyAHAei96IG5YZGtrSLEQUsLjdbhw5cgRVVVWhJzAYUFVVhUOHDkV9iMsuuwzV1dU4deoUAOCDDz7Am2++ieuvv37cjxkeHkZfX9+INy1Qu+AWAExGAyqCPyz0WMei5h4hIZlbm0WqZ/3ssQOERcVZuHROLnx+Gc+8E98W55c/FN1BRTBq7PpZDWJz85m2AfQOeZT6lYU66RAKx4m3+tTYo82hcUCEAUtHRwd8Ph+KiopGvL+oqAgtLS1RH+L73/8+br31VixatAhmsxmrVq3Cfffdh9tvv33cj9m1axccDofyVl5eHvXnj6XjKrY0h1PSQjrc2qzmHiEhWW9YPD4/aoLphrXjBCwAcOdlFQCA3xyuh8sTnzoej8+PPx8P/Nz4TCXTQUBg7tDM3MAr2w/qe5QdQvN1lA4SKsXEWxbe6opyw6L3gCVefvvb3+KZZ57Bs88+i5qaGjz99NPYs2cPnn766XE/ZseOHejt7VXe6uvrE3jisfn9sjI0Ts0bFiCwNRXQ5w2LmnuEBFF4m2ytzcea+jDo9sGRZsaCCbpOqhYXodRhQ5fTjT8Gb0Fi7Z1zXegZ9CAvwzKivTrVhc9j0dMOodHY2qxPjT3aHBoHRBiw5Ofnw2g0orW1dcT7W1tbxy2onYrvfve7yi3LsmXL8NWvfhXf/va3sWvXrnE/xmq1Iisra8Sb2i52DcLp9sFqMmBOfoaqZwkV3uo3YFEzJaTcsAwm1wLEd5V25pwJOwBMRgO+siFQy/J0nFqcRXfQpqXFMBk18dpJE8Tm5tr6bl3fsIixDhc6B9HnSq7vo2Tl98tK3dqMXJ3XsFgsFqxevRrV1dXK+/x+P6qrq7Fhw4aoDzE4OAiDYeRRjEYj/H597cIR6aBFxXbVfwDrubVZzT1CQm6SDo8ba2DceG5dOxMWkwEfNfaiZtT01eny+kLdQZ9ZFv2LnWQkBsi9d7Eb9d1ih5D+blhyMizKq/TjLLzVhbb+YXh8MowGCUUaLPKO+Lfq9u3b8eSTT+Lpp5/GiRMncPfdd8PpdGLr1q0AgC1btmDHjh3K491uN2pra1FbWwu3243GxkbU1tbizJkzymM+//nP41/+5V/wpz/9CRcuXMALL7yARx55BF/84hdj8I+YOMebgxuaVU4HAcCcgsANT5fTras6DLX3CAnihiWZim79fnlEh9BkcjMsuGFFKQDg1zFucT58oQudTjdy0s24dE7e5B+QQhaXZMFiMqDf5YUsB74O+Rob4DVV3NysL6LgtsRhU/1F91giPtEtt9yCPXv24IEHHsDKlStRW1uLffv2KYW4dXV1aG4O5bybmpqwatUqrFq1Cs3NzdizZw9WrVqFr3/968pjHn30Udx888345je/icWLF+M73/kO/uEf/gE/+tGPYvCPmDhq7hAaLd1iUl7d6KmORe09QkIydgmdaR9Az6AHaWajMthrMncEi29f/qgZbf2xW2QndgdtWlIMswZ/MKrJYjJgWdjXR+zl0SNlgFwj61j0QKtLDwVTNB+0bds2bNu2bcy/O3DgwIg/V1RUTJr/ttvt2Lt375hTcPVE6RAqndovg3ibV5iJxp4hnGkb0E1Ro9p7hASxT6jLmTy593eC9SuXzMqecpBQWebA6lk5OHKxG8++U4f7qhZM+xw+v4x9RwN1cNczHTSmVeXZOHIx0M21sFh/6SBBGdHPwltdaNDo0kOBL21ipL1/GG39w5CkQA2LFszT4U4htYfGCWKfUDLVsLw7xv6gqRC3LM+8Uwe3d/p1Ze9d6ELHwDAcaWZcPi9/2s+XjFaF7VSar8P6FUF0Cp1pG0jKNRfJpkHDU24BBiwxI9qZZ+dlIMMa1cVVzOmx8FbtPUKCaGvuGnTrcqfVaLIsKwPjIr1tu76yGIV2K9r7h/HK0em3OIt00HVLipgOGodobQaABTpOCRXarcjPtMIvAx+3sI5F60RLsxZnsAAMWGJG1K8s1kDBraDH1ma19wgJoujW7fVjMAleGTZ0D6GlzwWzUVL21UyV2WjA7etDLc7T4ffLeOUou4MmU+KwYV1FLsqy06Zcb6RFkiSFpYUYsGhdQ7ArbYZGa1gYsMSIGMm/VEsBS3B4XGPPEJzDXpVPMzVaSQmlW4ywmALfHnrqshqPqF9ZVuZAmsUY8cfftr4cZqOEmroefNQQfT1CTV032vqHYbeZmA6agCRJePau9Tj43as0c2MbrcpSFt7qgSzLyuJD1rAkuePBojItdAgJORkWZZbJOZ2M6NfCHiEg8AsjN4lam5X6lSiLrwvtNnw2uE35V9O4ZRHD4q5bXASrKfLAKZWYjAZNtpZGiq3N+tAx4Maw1w9JAoodNrWPMyb9fzdowKDbi3MdgYBACzNYws1V6lj6VT7J1Ghhj5CQo7Q2679TSMxfGW/h4VSI4ts/fNikfJ0i4ffL2BdMB12/jLuDUoVIaZ1s6Y9J0TbFh6hfKc6yKbfLWqPNU+nMxy39kGWgwG5FoV1bkaneOoW0sEdIyE2SfUJt/S6c63BCkoDVs6IPWFbNzMGKGQ64vX48927ku7tqG3rQ3OtCptWEjfOZDkoVM3LSkGUzwe3z43SbPl44pSJRv6LVGSwAA5aY0MqG5rGIJYhn2/SREtLCHiEhWTY2v3chOM+jyA7HNIfxiVuW//P2RXh9kb1afiWYDrp2cSFsZqaDUoUkSaFFiNzcrFmNGt7SLDBgiYHjGtnQPBa9tTZrYY+QkCzTbkU783TSQcJnl5cgP9OC5l4X/nK8dfIPCJJlGS9/FEwHVTIdlGpEpxA3N2uX1mewAAxYYkJLI/lHEwHLhQ4nPBG+Ik40rewRErKT5Ibl8DQLbsNZTUbctm4mgMiKbz9s6EVjzxDSLUZctbBg2ucgfRF1LGxt1q7QDBZtdggBDFimzevz42MNtjQLpQ4b0i1GeP0yLnYOqn2cCWllj5CQmx6sYdHxDUvvkAcnggO71kU44XY8t6+fBZNBwuHzXcrAxMm8HBw4d80ipoNSkUgJHW/qg8+v/0GMyYg1LCngQqcTw14/0i1GzMrLUPs4nyBJklLHovXCW63sERJC+4T0G7DUXOyGLAMVeekozIpNQXixw4bNlYGhb1PZ4hxIBwUCls+wOyglzc7PQJrZiCGPD+c79FFPl0pGzmBhwJK0RDpoUbEdRg38kh2LMvFW43UsWhkaJ4galh4dtzW/E+U4/sncsaECAPDC+43omeQG6lhTH+q7hmAzG5gOSlFGg6TU+LGORXt6Bj1wBid6l/KGJXmFNjRrLx0k6KW1WSt7hIRk6BIS81ciXXg4mbUVOVhckgWXx4/fvjdxi7O4XblmUSHSLfqe2krRqwz+jDzKibeaI+pX8jOtmk7ZMmCZptBIfu3u+9BLSkgre4SE8C4hPS5AdHl8+LChBwCwfnZeTJ9bkiTceVlgv9CvD10cty4hPB3E7qDUJn5GHmVrs+YoO4Q0nA4CGLBMiyzLmp7BIoSnhPwaLnjTWkpI3LB4fDIGdLKLKdz7dT3w+GQUZVlRnhv7H0Q3rCxDdroZDd1DeP3jtjEfc6K5Hxc6B2E1GXDNosKYn4H0Y2lYa7MeXwAkMz20NAMMWKalrX8YnU43jAYJC4vtah9nXLPy0mEySBh0+9Dc51L7OOPSyh4hIc1iRFrwerTbqb86lvB0kCTFvr7KZjbilrXlAMbf4vxKsDvoqoUFul/iR9Mzv9AOi9GAPpdX+QVJ2tCgg4JbgAHLtIjisbkFGZrO+5mNBlTkBzqYtJwW0tIeISEn2NrcpcPW5lgOjBvPVy+dBYMEvHmmA2dGjV2XZVlZdsjuILKYDMoLO9axaIsyg0XDBbcAA5Zp0UM6SJingzoWLe0REpQFiDorvPX4/KipC4zkj8XAuPHMyElH1eIiAMDTb10c8XenWgdwrt0JC9NBFMTNzdoUamnW7tA4gAHLtGh5JP9oeugU0tIeISFXp7NYjjX1YdDtgyPNjAWF8U1X3hncL/SfNQ3oc4VSZ6LY9or5BbDb1B8ESOpbqky85Q2LlihD45gSSl6hGxbtdggJSuGthgMWLe0REkThrd6m3b4rxvFX5MR9CN+GuXlYUJSJQbcP//e9BuX9oWFxxXH9/KQf4a3NLLzVhj6XR1mJouUptwADlqj1uzy4EBx1r4cbFmVrs0aHx2ltj5Cg1wWI8RoYNxZJkrAlOEju14cuwO+Xcbq1H6fbBmA2Srg2mDIiWlScBYMUmGrd1j+s9nEIoXRQTrpZ84XxDFii9HFLoMCwxGHTVApjPHMLA0W3nU63JusxtLZHSAgNj9NPl5DfL+O9i/EZGDeeL64qg91mwoXOQRw83Y5XjgY2M2+cXwCHhr6epK40i1G57eXEW23QS/0KwIAlanoquAWAdItJue47o8FbFq3tERJyM4ILEDUY5I3nTPsAegY9SDMblS258ZZhNeHLawItzr9+60LYsDimg2ikSg6Q0xQ9LD0UGLBESbw60EM6SJir4cJbrQ2NE5QFiDpKCYl00CWzsmE2Ju5b/KuXzoIkAftPtuPjln6YDBKuW8J0EI2kFN6ytVkTlJZmjRfcAgxYohYaya+fgEXLrc1a2yMkKEW3OrphCRXcJiYdJFTkZ+CqBaHlhpfPy0d2ura+nqQ+tjZri16m3AIMWKLi8flxqiXwS18PHUKCllubtbZHSNBbl5Asy8rAuEQU3I52R7DFGWB3EI1N3Eo39gzp6oVAsgrdsLCGJSmdbR+A2+eH3WrSxTWaoOWARaspoVCXkEcXbZgN3UNo6XPBbJSwqjwn4Z//ivkFWD0rB0VZVmxeyoCFPinLZkZFXuCXI29Z1KfcsOighkXbPUwadSxYLLa4JEtTBaKTEQFLY88QBt1epFu08+XX2h4hITs4mt/nl9Hn8mq+40XUrywrcyDNkvh1EQaDhOe/cSlkIKH1M6QvS0sduNA5iKNNvfjU/Hy1j5OyBt1e5cUiU0JJSk8TbsPlZliUgOBcu1Pl04ykxT1CQGDBX4ZFLEDU/vW1Ur+iQjpIMBkNDFZoQqHNzbxhUZNoabbbTJp/MQYwYImK0tKss4AF0G7hrRb3CAl66hQ6fCH+Cw+Jpku0Nh9jp5CqGnRUvwIwYImYLMuhGxadzGAJp9XWZi3uERJydbIAsa3fhfMdTkgSsHoWAxbSLtEpdK7DiYFhr8qnSV16ql8BGLBErLFnCL1DHpiNEhYUxXepXDxotfBWi3uEhNC0W20HLO9dCGxnXlhk18X1LqWuvEwrShw2AMCJZqaF1BKacsuAJSmJdNC8QjssJv3961MCFg1Nu9XqHiEhJ1h4q/XWZtHOzHQQ6cHSUg6QU5uYcsuAJUnpOR0EAHMLAjuFLnQ44fH5VT5NgFb3CAlKDYvG9wkd1kDBLdFUVZaJzc28YVGLnqbcAgxYIqbnglsAKHWkIc1shNcvo65rUO3jANDuHiEhVwfTbnuHPDjREvhvc12CJ9wSRUPcsHAJonpCNSwsuk1Kog1PTyP5wxkMkrK5WSt1LFodGifkZGh/2m3NxW7IMlCRl47CLJvaxyGalLhhOd02AJfHp/JpUo/L40N7f6B2UA8zWAAGLBHpHfQoV2iLdZoSArTX2qzVPUJCrg4ClndUHMdPFI3iLBvyMizw+WWcbOlX+zgppyn4uyzdYlTq9LSOAUsERP3KjJw0XXdhiMLbs1oJWDS6R0jQQ5fQuxfUWXhIFC1JkkKbm5kWSjjx4rssOw2SpL1U/FgYsERA7wW3gtY6hbSeEgrfJ6RFLo8PHzb0AOANC+kLNzerp0FnLc0AA5aIiOIwUSymV+E3LFpY6KfVPUJCTkbgNq1n0A2fX/1/X6O9X9cDj09GUZYVM3P1UTxHBHDirZrEDBa91K8ADFgiovcOIWFWXgZMBglOtw/NvS61j6PZPUJCdlrgXH4Z6BvS3i1LeDpIL1e7RECo8PZES79mxiykitAMFv28yGHAMkXDXp9SpKr3gMVsNGBWcL27FgpvtbxHCAAsJgPs1sBmay3uE+LAONKr8px02K0muL1+TfwsSiXhNSx6wYBlik63DsDrl5GdbkapQ/9to1oa0a/lPUKCaG3u0VjA4vH5UVMXGMnPgXGkNwaDpLwAZB1LYultLD/AgGXKlHRQSVZSXLtrqfBWy3uEBK1Ouz3W1IdBtw+ONDMWFOpvtxVRZRlH9Ceax+dHS1+gHIA1LEkoWTqEBK3csGh9j5CQK/YJaay1+V0xjr8iR5NTgokmI+pYOPE2cVp6XfDLgNVkQIGGf+6OxoBlipKl4FaYVxB4Na72LBat7xESlBsWjaWEODCO9E50XR5v6oNfg114yag+WHCrpxksQJQBy2OPPYaKigrYbDasX78ehw8fHvexx44dw0033YSKigpIkoS9e/eO+bjGxkZ85StfQV5eHtLS0rBs2TK899570Rwv5vx+Wblh0XtLszAnuASx0+lW9dZA63uEBC3uE/L7Zbx3kQPjSN/m5GfAZjbA6fbhQqdT7eOkBD22NANRBCzPP/88tm/fjp07d6KmpgYrVqzA5s2b0dbWNubjBwcHMWfOHOzevRvFxcVjPqa7uxuXX345zGYzXnnlFRw/fhw//elPkZOTE+nx4qK+exADw15YTAblF73eZVhNSvGwmnUsWh8aJ4RqWLQTsJxuG0DPoAdpZqNSB0CkNyajQVl1cpSFtwmhx6FxQBQByyOPPIK77roLW7duxZIlS/DEE08gPT0dTz311JiPX7t2LR5++GHceuutsFrHzpU9+OCDKC8vxy9/+UusW7cOs2fPxqZNmzB37txIjxcXIh20sMgOszF5smhzNTCiX+t7hAQxnl9L+4QOB+evXDIrO6n+u6TUo0y8ZeFtQoiWZj3NYAEiDFjcbjeOHDmCqqqq0BMYDKiqqsKhQ4eiPsRLL72ENWvW4O/+7u9QWFiIVatW4cknn4z6+WIt2QpuBS0U3mp9j5CQG5x2q6UbllDBLdNBpG/KxFvesCREQ1gNi55EFLB0dHTA5/OhqKhoxPuLiorQ0tIS9SHOnTuHxx9/HPPnz8ef//xn3H333fjWt76Fp59+etyPGR4eRl9f34i3eBHfREvLkjRgYUpoUuKGpUcj+4RkWVYGxrHglvSuMmwJohbWhSS70A1LEgcs8eL3+3HJJZfgJz/5CVatWoVvfOMbuOuuu/DEE0+M+zG7du2Cw+FQ3srLy+N2vvAZLMlkXoEGblh0MDQOCJ1PK11CDd1DaOlzwWyUsKpcG7VeRNGaX5QJs1FCz6BH+WVK8eHzy2ju0d8MFiDCgCU/Px9GoxGtra0j3t/a2jpuQe1UlJSUYMmSJSPet3jxYtTV1Y37MTt27EBvb6/yVl9fH/Xnn0jnwLAyYGdRsgUswRuWxp4hDLl9qpxB63uEBFF02zvkgVcDO09EO/OyMgfSLEaVT0M0PVaTEfODgw+ZFoqv1j4XvH4ZZqOEQru+prZHFLBYLBasXr0a1dXVyvv8fj+qq6uxYcOGqA9x+eWX4+TJkyPed+rUKcyaNWvcj7FarcjKyhrxFg8nmvsBABV56cgM7pNJFnmZVuSkmyHLwFmV0kJa3yMkiBkxshwIWtSm1K8wHURJQhkgx8LbuBIdQiWONBg1PEpiLBGnhLZv344nn3wSTz/9NE6cOIG7774bTqcTW7duBQBs2bIFO3bsUB7vdrtRW1uL2tpauN1uNDY2ora2FmfOnFEe8+1vfxtvv/02fvKTn+DMmTN49tln8e///u+45557YvCPOD1i+mKyzF8ZTdyyqB2waD0lZDIa4AgGLVroFBIdQlx4SMkiVMfCG5Z4auwRW5r1lQ4CgIivDG655Ra0t7fjgQceQEtLC1auXIl9+/Yphbh1dXUwGEJxUFNTE1atWqX8ec+ePdizZw+uvPJKHDhwAECg9fmFF17Ajh078MMf/hCzZ8/G3r17cfvtt0/zH2/6lA6hJJlwO9q8wky8e6FbtToWPewREnIzLOgd8qi+T6it34XzHU5IErB6FgMWSg6itZk7heKroUt/W5qFqHIc27Ztw7Zt28b8OxGECBUVFVOq+v7c5z6Hz33uc9EcJ66SteBWmKti4a1e9ggJ2enaaG1+93xgO/PCIrty60Okd4tLsiBJQFv/MNr6Xbqrr9ALvc5gATTSJaRVXp8fA8OBX6hLk/iGBVAnYNHLHiEhVyPD495lOoiSULrFpLyAYuFt/DTodCw/EOUNS6owGQ04tONatPcPI1/jc0KiJQKWC51OeH1+mBI4MVUve4QE0SmkdsBymAW3lKQqS7Nwpm0ARxt6cfXCQrWPk5TEDYseU0K8YZmCArtVVxstI1HqSEOa2QiPT8bFrsGEfm69DI0TRGGwmgsQe4c8ONESePW5jhNuKcmsmhmYKfTiB03wcXNzzPn9srL4UI9FtwxYUpzBICkLHROdFtLLHiFBTLtVs+i25mI3ZDnQZl+YxRw/JZcvXlKGLJsJZ9oG8PJHzWofJ+l0DAzD7fPDIAHFDv39/GDAQqrVsehlj5Ag9gmpmRJ6h+P4KYll2cz4+sY5AICfV5+Gn7csMVUfNoNFjwtT9Xdiijkxoj/Rs1j0lhIK3bCoF7CIglsuPKRkdeflFciymXC6bQAvH+UtSyzpuX4FYMBCCBsel/CUkD6Gxgm5Khfd+v2yMqNi9SzuD6LklGUz42uf4i1LPIgtzXqsXwEYsBDCp906E7opVS97hIRslW9Y2vqHMez1w2iQUJ6rvxkKRFN15+UVsNtMONU6gFeOtqh9nKTRqOOWZoABCwGYlZcBo0HCwLBXWfSYCHrZIySIG5Z+lxceFRYg1gW7uEqzbbrMPxNNlSPNjK99ajYA4H9Vn+ItS4yEhsYxYCGdspgMmJUXeMWeyMJbvewREhxpZoju9p7BxHcKXex0AgBm5WYk/HMTJdrWy2crtyz7jvGWJRaUoXHZ+ryhZcBCAEKFt4kMWPS0RwgAjAZJmcirRh1LffCGhekgSgWONDP+/vLgLctrrGWZLlnW9wwWgAELBSW6tVlve4QEMe1WjToWMdhP3IYRJbu/v3w27FYTTrb248+8ZZmWLqcbQx4fAKAkW38zWAAGLBSU6IBFb3uEBGWfkAoBi6hhmckbFkoRjnQztiq1LNq4ZfH5Zbxxqh3O4J45vRD1K0VZVlhNRpVPEx0GLAQgvFMoMQGL3vYICcoNiwopobpOBiyUer4WvGX5uKUffzmu/i3LD146hi1PHcb/qj6t9lEiEqpf0Wc6CGDAQkFiS2rHgBs9CfhlrLehcYJaNywDw15lbs1MpoQohTjSzdh6eQUAYK/KtSwHT7Xjf799EUBo6rRehOpX9PvzgwELAQAyrCaUBndLJCItpLc9QkJ2cDx/ovcJiduVnHQzsmz6SaERxcLff2o2MpVbllZVztAz6MZ3f/eB8ucTzX2qjDeIlhgap9cZLAADFgozN4F1LHrbIySIG5ZE3EKFY/0KpbLsdItyy6JWLcv9Lx5DW/8w5hRkwG41we31J3z/2nTofQYLwICFwsxNYGuzXlNCatWw1HUFZrDMzOMMFkpNXwvespxo7sOrJxJ7y/LSB034wwdNMBok/OzLK7G0LAsAlFUZesAaFkoqSqdQAgpv9bZHSFCrhiV0w6LfHzZE05GdbsGdl1UACMxlSdQakZZeF+7//VEAwLar52FFeTYqSx0AgGNNfQk5w3SNnMGi31taBiykSGSnkN72CAlq3bBcDNawcMotpbKvfWo2MixGHG/uw6sJqGWRZRn//J8fonfIg2VlDmy7Zh4AoLIsELB8pJMblr4hL/qDbdi8YaGkIAKWhu4huIIDhuJFb3uEBGVjc4KLbjnllijwguHOsFqWeN+yPPNOHd441Q6ryYCf3bJC2eElApbjTX3waWA2zGQaegI/P/IzLUiz6HMGC8CAhcLkZViQnW6GLMf/lkVve4QEkRIaGPZi2BvfoE7w+WUl/8wpt5Tqvv6pOciwGHGsqQ+vnWiL2+e50OHEv/zpBADge59ehHmFduXvZudnIN1ixJDHh/Md2i+8TYb6FYABC4WRJClhO4X0tkdIsNtMMAYH3SVqAWJTzxC8fhkWowFFWfocqU0UKzkZFtwRrGXZ+9qpuNyyeH1+bP9tLYY8PmyYk6fUzghGg4QlJaLwVvt1LMlQvwIwYKFRlDqWOAYset0jBACGsAWIidonJNJBM3LTlGCJKJV9feMcpAdvWarjcMvyb2+cQ01dD+xWE/Z8ecWY07j1VMei3LDouKUZYMBCoySiU0ive4QEUXibqI3NFzmDhWiE3PBblurY3rIca+rF3tdOAQB+8IWl46ZRRMCih9bmxmANC1NClFQSMTxOr3uEhFBrc2JSQqKleRYDFiLFXcFblqONfXj949jcsrg8Pmx//gN4fDI2Ly3Cly4pG/exlcFZLMeb+jSxlHEiDd36HxoHMGChUUQNy/kOJ7xxGjut16FxQo4Yz5+gGxYxlp8dQkQhuRkWbNlQASCwYygWtyw/e/UUTrb2Iz/Tgp98cRkkafwXVPMKMmE1GdA/7FVeVGiVmHLLlBAllbLsNKSZjfD45Lh9E+p1j5AQam1OUMAiblg45ZZohLs2zkaa2YiPGnux/+T0blkOn+/Cv//1HABg15eWT1pfZzIasChYeKvlOpaBYa/SIMCUECUVg0HCnILAL8Z4pYWUGxad7REScoIpoUQV3V7sDI7l5w0L0Qh5mVZsuWwWgOndsgwMe/FPv6uFLANfXjMD1y0pmtLHLRMj+pu0G7CIDiFHmhl2nS9OZcBCnxDvwltl8aFOU0K5CSy67R30KB1VDFiIPukbG+cgzWzEhw29OHCyParn+PEfj6O+awhl2Wm4/3NLpvxxyoh+Dbc2iy3Neq9fARiw0BjEEsR4Vb/rdY+QkJ3AG5aLwaWHBXarridUEsVLXqYVWzaIW5bIO4aqT7TiuXfrIUnAT7+8IqJbCKVTqKk3YbuNIqXUr+g8HQQwYKExXLWwAACw72gLzsXhlqXLqc+hcUJusOg2ETcs7BAimtxdVwRuWT5o6MWBU1O/ZekcGMb3/vMjAMDXPzUbl87Ji+jzzi/KhNkooWfQo3TiaE1DkgyNAxiw0BiWz8hG1eJC+GXgZ6+djvnzh1JC+q5hSURbs1h6yHQQ0fjyM6346obIallkWcZ/f+EoOgaGMb8wE/+0aWHEn9dqMmJhcWBk/zGN1rE0JsnQOIABC41j+3WBb94/fNCEE82xzc/qdY+QkMgaFjHldiZ3CBFN6K6Nc2AzG/BBfQ8OTuGW5fe1jdh3rAUmg4Sf3bISNnN0KVdRx6LVEf0NPckxgwVgwELjWFKahc8uLwEAPPLqqZg+d6fSJaTPgEVMuh10++K+1Zo3LERTU2C34quXTu2WpalnCA+8eAwA8I/XzldqUaKxNKyORYsau5Njyi3AgIUm8O2qBTBIwKvHW1Fb3xOT5/T4/OgdCqRS9JoSsltNMAUn9Mb7lqWOY/mJpuwbV8yFzWxAbX0P3jjdMeZj/H4Z3/2/H6Df5cXK8mzcfdXcaX3OylKxBFF7hbcuj0+ZLF7OGhZKZvMKM/GlS2YAAH76l5MxeU697xECAlutxS1LPDuF3F4/mnsD17lMCRFNrsBuxVfWT9wx9OtDF/C3M52wmQ145MsrYDJO79fg4pIsGA0SOgbcaO0bntZzxZoouM20mpCVZlL5NNPHgIUm9I/XzofZKOGvpzvw9rnOaT+fSAfpdY+QkIh9Qo09Q/DLQJrZiAKd3kYRJdo3rpwDq8mA9+t68NdRtyxn2gaw65WPAQD//2cWY05whMN02MxGzC+M7yiIaDWG1a9MtGZALxiw0ITKc9Nxy9pyAIFbluleeep9aJyQnR7/fULhE26T4YcNUSIU2m34yqWfvGXx+Pz4p9/WYtjrx8b5+Uq9SywsLdVmHUtDEtWvAAxYaAruvWY+rCYD3r3QPaXq+4nofY+QkIh9QqJDiEsPiSLzD8Fblpq6Hrx5JnDL8q/7z+KDhl5k2Ux46OblMX0RIDY3a+6GJUm2NAsMWGhSRVk25dXIT/8S+STJcHrfIyTkJKC1WXQIzWL9ClFECu023L4+1DH0YUMPHn09MFPqRzdWosQR21/gysRbjbU2NyTRDBaAAQtN0d1XzUWGJbAV9c/HWqN+nmRJCYVqWOIXsLBDiCh6/1/wluXIxW5s/eW78PplfHZZCb6wojTmn2tJSRYkCWjpc6G9XzuFt6EaluT4GcKAhaYkL9OKv//UbADAI6+ehM8f3S2L3vcICUqX0GD8im7rODSOKGqFWTb8t/UzAQR+7hTYrfjxjZVxqQfLsJowJz+w5V5LE29Zw0Ip6+sb5yDLZsKp1gH88cOmqJ5D73uEBGWfUJxuWGRZ5g0L0TTdfeVcWE2BX3MP3bRceaERD6G0kDYClmGvD23B2x7WsFDKcaSZ8Q9XBoYs/ezVU/D4/BE/h973CAk5cd7Y3DHgxqDbB0lKnh82RIlWmGXDb75xKX65dS2uXlQY18+ltRH9zT0uyDJgMxt0f6MtMGChiNx5WQXyMiy40DmI/zzSEPHH632PkBDvfULidqUkywarKbodJ0QEXDIzB1cvjG+wAoTdsGgkJRRev5IsYxEYsFBEMqwmZZT1z6tPY9gb2S4dve8REuJ9w1LXFZzBwvoVIl1YEhzR39A9hJ4ELEadTLLVrwAMWCgKX7l0FoqzbGjqdeE379RN+eOSYY+QIHLhw14/htyxX4BY1xkcyc/6FSJdcKSZlREEWkgLNSZZSzMQZcDy2GOPoaKiAjabDevXr8fhw4fHfeyxY8dw0003oaKiApIkYe/evRM+9+7duyFJEu67775ojkYJYDMbce+18wAAv9h/dsq/sJNhj5CQYTHCEtxBEo9ptxeDNyyz8jJi/txEFB+VGpp425BkQ+OAKAKW559/Htu3b8fOnTtRU1ODFStWYPPmzWhraxvz8YODg5gzZw52796N4uLiCZ/73Xffxb/9279h+fLlkR6LEuzvVpejPDcNHQPDePrQhSl9TLLsEQLEAsT4dQpxyi2R/mipU6ghWMOS0imhRx55BHfddRe2bt2KJUuW4IknnkB6ejqeeuqpMR+/du1aPPzww7j11lthtY6fBhgYGMDtt9+OJ598Ejk5OZEeixLMYjLgvmsXAACeOHgWfa7J55Eky9A4IZ51LMqUWwYsRLohRvQfa9JOSihZhsYBEQYsbrcbR44cQVVVVegJDAZUVVXh0KFD0zrIPffcg89+9rMjnnsiw8PD6OvrG/FGiXXjqjLMLchAz6AHT715ftLHJ8seISFenUJD7tD8BNawEOmHWIJ4vsOJ/im8iIsXr8+Plj4XgBROCXV0dMDn86GoqGjE+4uKitDS0hL1IZ577jnU1NRg165dU/6YXbt2weFwKG/l5eVRf36KjtEgYft1CwEA//HX85OmRpJlj5CgTLuN8Q1LfbC6324zKVuhiUj7cjMsSgpGzVuW5l4XfH4ZFqMBBTpvcAinepdQfX09/vEf/xHPPPMMbDbblD9ux44d6O3tVd7q6+vjeEoaz/WVxVhSkoWBYS+eeOPshI9NtpRQvPYJ1XWGJtwmy/wEolShhc3NYgZLabZN9/WC4SIKWPLz82E0GtHaOnL5XWtr66QFteM5cuQI2tracMkll8BkMsFkMuHgwYP4+c9/DpPJBJ9v7A4Uq9WKrKysEW+UeAaDhO9sDtSyPP3WBbT1u8Z9bLLsERJygrcfse4SEkPjuKWZSH9Ep5CaNywNSVi/AkQYsFgsFqxevRrV1dXK+/x+P6qrq7Fhw4aoDnDttdfio48+Qm1trfK2Zs0a3H777aitrYXRyCmfWnf1wkKsmpkNl8ePf90//i1LsuwREnKUGpbY5qrr2CFEpFta6BQ61doPACjPTZ76FQAwRfoB27dvxx133IE1a9Zg3bp12Lt3L5xOJ7Zu3QoA2LJlC8rKypR6FLfbjePHjyv/v7GxEbW1tcjMzMS8efNgt9tRWVk54nNkZGQgLy/vE+8nbZIkCd/dtBD/7T/ewbPv1OGuK+aM2UqXLHuEBKXoNtYpIXHDkssZLER6szSYEjrbPoBBtxfploh/zU6LLMv487FATemn5hUk9HPHW8Q1LLfccgv27NmDBx54ACtXrkRtbS327dunFOLW1dWhublZeXxTUxNWrVqFVatWobm5GXv27MGqVavw9a9/PXb/FKS6y+bl47K5eXD7/Hi0+vSYj0mWPUJCvNqaL3YGx/LzhoVIdwrtNhRlWeGXgRPNiU8LHW/uw8XOQdjMBly1MLkClqhCv23btmHbtm1j/t2BAwdG/LmiogKyLEf0/KOfg/ThnzYtxFuPv4XfHWnAP1w5F7PzR94QJMseISEebc1+v4z6YP6ZNSxE+lRZ6kBrXxuONvZh9azchH7uVz4K3K5ctaAQGdbE3u7Em+pdQpQ8Vs/KwTWLCuHzy9j72qkRf5dMe4QEpYbF6Yk4KB9Pa78Lbq8fJoOEEsfUu+aISDuWqlTHIssyXv4okOG4fll0jTBaxoCFYmr7dYGOoZc+aMLJln7l/cm0R0gQbc1unx/OGC1AFC3NZTlpMBn57UmkR5XBzc0fJThgOdU6gHMdTliMBlyzqDChnzsR+BORYqqyzIHPLCuGLAOPvHpSeX8y7RES0ixG2MyBb6FYFd5e7ArNYCEifVo2I3DDcrptAC5P7Le5j+eVo4HblSsW5MNuS44XhuEYsFDMbb9uAQwS8OdjrfiwoQdA8g2NE2JdeFvPgIVI94qzbMjLsMDnl0fcNMebqF+5vrIkYZ8zkRiwUMzNK7TjxlVlAICf/iVQy5Jse4QEEbDEqvD2YicDFiK9kyQpVMfSlJi00Jm2AZxs7YfZKKFqcdHkH6BDDFgoLu67dgFMBgkHT7Xj3QtdSbdHSIh1pxCn3BIlB1HHkqjC233BdNDl8/LhSNIdZAxYKC5m5qXjy2sDCykf/vPJ5E0JKQsQYzPtllNuiZLDMqVTKDGzWF4OpoM+k6TpIIABC8XRvdfMg8VkwOHzXXg5GP0nW0ooN/hKJhZFt/0uj3ITxZQQkb6JEf0nW/rh9vrj+rkudDhxvLkPRoOE65YkZzoIYMBCcVTiSMNX1s8CAJxrD0xvTZahcYJywxKDlJC4XcnNsCRlhT9RKpmRk4Ysmwlunx+n2+JbePvK0cDtyoY5ecrPpGTEgIXi6ptXz0W6JbTAMlmGxgmx3CfEDiGi5CFJUsIWIYp25mQcFheOAQvFVX6mFVsvr1D+nGwpoVi2NbNDiCi5JKKOpaF7EB829MIgAZuWMGAhmpZvbJyLLJsJBin5iklj2dZcxxsWoqSSiNbmfcF00LrZuSiwJ9cN9mjJtRmJNMmRbsZ/3n0Z2vqHUZadpvZxYionI1h0Ozj9LiElYGFLM1FSEK3NJ5r74PX547JuQ+wO+syy5O0OEnjDQgkxv8iOy+flq32MmAuvYZnuAkTesBAll4q8DGRaTXB5/DgbbDyIpebeIdTU9UCSgM1LkzsdBDBgIZoWkRLy+mX0D3ujfh6vz4/G7iEAHBpHlCwMBglL4jhATqSDVs/MQVFW8m93Z8BCNA02s1HpgppOp1BzrwtevwyLyYAie/L/4CFKFZWl8atjUXYHpUA6CGDAQjRtsegUEh1C5TlpSbPNmoiAyrLADcuxGHcKtfW78O7FLgDApyuTPx0EMGAhmrZY7BNi/QpRchKzWI419cLvn16dW7g/H2uFLAMry7OTrplhPAxYiKYpFvuELnYFCvJm5WXE5ExEpA1zCzJhMxvgdPtwvjN2hbevKN1BqXG7AjBgIZq2nOA+oZ5p3LDUc+khUVIyGiQsKYlt4W3nwDDePtcJALg+iZcdjsaAhWiaYlnDMosBC1HSCaWFYlPH8pfjrfDLgUm6qfQihwEL0TRNt4ZFlmXUdXJoHFGyEp1CHzXE5oZFDItL9t1BozFgIZqmUA1LdAFLz6BHmeFSnsOAhSjZVIaN6J/ugMlupxtvnU29dBDAgIVo2nLFPqEoi25Fh1Ch3Yq0sM3WRJQc5hdlwmI0oN/lRX3X0LSe69UTrfD5ZSwqtmN2fmoV6TNgIZomsU+oK8qU0MVgwMIJt0TJyWw0YFGJHcD0B8i9kkK7g0ZjwEI0TeH7hKLBDiGi5LdU1LFMo1Ooz+XBm2c6AKRWO7PAgIVompSU0KA7qsFQF4OzGWblptb1LlEqERNvp9PaXH2iFR6fjPmFmZhXaI/V0XSDAQvRNGUHAxa/DPS7Il+AqEy5zUuNaZVEqWhZWGtztIW3L6fY7qDRGLAQTZPFZECm1QQgujoWpaWZNyxESWtBkR0mg4QupxvNva6IP35g2IuDp9oBpGY6CGDAQhQTSuFthHUsw14fmvsCP7y4R4goednMRswvCqRxoqljef3jNri9fszOz8DCotRLBwEMWIhiItTaHFnA0tg9BFkG0i1G5Gda4nE0ItKIylKxuTnygEV0B11fWQxJSs2N7gxYiGJAGR4XYUroYtiW5lT9IUSUKpbNEAPkIhvRP+j2Yv/JNgCp2c4sMGAhioFob1jqwwIWIkpuorU50k6hAyfb4fL4UZ6bhqXBW5pUxICFKAaivmHpZMBClCoWl9hhkIC2/mG09U298PaVo4HuoM9UlqT0TSwDFqIYiHZ4XB2n3BKljHSLCXMLMgFMfeKty+PD6ydaAaRuO7PAgIUoBrLTA11C3YOR7RMSLc2cckuUGsQ8lqONU6tjeeNUO5xuH0odNqwI1sCkKgYsRDEQTQ2LLMthNyycwUKUCpaWRVbHItJBn07xdBDAgIUoJqKpYWkfGMaQxweDBJRlc8otUSoQrc1TCViGvT68djyQDkrVYXHhGLAQxUA0NSyiQ6jEkQaLid+KRKlgSTBgaep1oXNgeMLH/u1MB/qHvSi0W3HJzJxEHE/T+FOSKAZygimhniEPfFNcgMgOIaLUY7eZMSc/kAI+Nsk8FmV3UGUxDIbUTgcBDFiIYkIU3coy0Ds0tcJbdggRpSaljmWCTiGPz49Xj7M7KBwDFqIYMBsNyLIFFyBOMS3EDiGi1BQa0T/+Dcuhs53oHfIgP9OCtRW5iTqapjFgIYoRUXjbPcXCW96wEKWmyuANy0RLEF85GtgdtHlpMYxMBwFgwEIUMzkRtjZf5Fh+opRUGRzRX9c1iN4xZjd5fX78+ZjoDmI6SGDAQhQjuRHcsAy5fWjvD3QIzMrlDBaiVOJIN6M8NzDK4FjzJ29ZDp/vQpfTjZx0M9bPZjpIYMBCFCPihqXLOXnRrUgHZdlMcAQLdokodYhblrHqWF4OpoM2LSmGychf0wL/TRDFSG6GGM8/+Q2LCFhmsn6FKCWNV8fi88vYd1R0B3FYXDgGLEQxoky7nUINy8VOJwCmg4hSVeU4rc3vXehCx8AwsmwmXDY3X42jaVZUActjjz2GiooK2Gw2rF+/HocPHx73sceOHcNNN92EiooKSJKEvXv3fuIxu3btwtq1a2G321FYWIgbb7wRJ0+ejOZoRKqJZJ+QmHLLlmai1LQ02Np8vsOJgWGv8n6xO+i6JcWcgD1KxP82nn/+eWzfvh07d+5ETU0NVqxYgc2bN6OtrW3Mxw8ODmLOnDnYvXs3iovHvt46ePAg7rnnHrz99tt49dVX4fF4sGnTJjidzkiPR6SaSPYJXWRLM1FKy8+0osRhgywDJ5oDdSx+v4x9wYCFu4M+KeKA5ZFHHsFdd92FrVu3YsmSJXjiiSeQnp6Op556aszHr127Fg8//DBuvfVWWK3WMR+zb98+3HnnnVi6dClWrFiBX/3qV6irq8ORI0ciPR6RapTx/GO0KY5Wx5ZmopS3NFh4+1FDIC30fn0PWvpcyLSa8Kn5TAeNFlHA4na7ceTIEVRVVYWewGBAVVUVDh06FLND9fYGvni5ueO3cw0PD6Ovr2/EG5GaRNHtZDUsPr+Mhq4hAAxYiFLZslF1LK98FOgOunZxIawmo2rn0qqIApaOjg74fD4UFRWNeH9RURFaWlpiciC/34/77rsPl19+OSorK8d93K5du+BwOJS38vLymHx+omiJG5beIQ+8Pv+4j2vtc8Ht88NkkFDisCXqeESkMZVloRH9siwr9SvXV3JY3Fg0V9Fzzz334OjRo3juuecmfNyOHTvQ29urvNXX1yfohERjc6SZIQUnaPdMsABRbGmekZPGGQtEKUx0Cp1u68c757vQ2DOEdIsRVy0sUPlk2mSK5MH5+fkwGo1obW0d8f7W1tZxC2ojsW3bNvzxj3/EG2+8gRkzZkz4WKvVOm5NDJEaTEYDHGlm9Ax60O10Iz9z7P8+2SFERABQaLciP9OKjoFhPPLqKQDA1YsKYTMzHTSWiF7eWSwWrF69GtXV1cr7/H4/qqursWHDhqgPIcsytm3bhhdeeAGvv/46Zs+eHfVzEakpN33yWSwXu4IzWNghRJTSJEnCsmBa6PD5LgDAZ5gOGldENywAsH37dtxxxx1Ys2YN1q1bh71798LpdGLr1q0AgC1btqCsrAy7du0CECjUPX78uPL/GxsbUVtbi8zMTMybNw9AIA307LPP4sUXX4TdblfqYRwOB9LS0mLyD0qUCDkZFqDDOeG02zoW3BJRUGWZA/tPtgMAbGYD00ETiDhgueWWW9De3o4HHngALS0tWLlyJfbt26cU4tbV1cFgCF3cNDU1YdWqVcqf9+zZgz179uDKK6/EgQMHAACPP/44AOCqq64a8bl++ctf4s4774z0iESqmco+obrglNuZnHJLlPJEazMAXLWgEBnWiH8tp4yo/s1s27YN27ZtG/PvRBAiVFRUQJblCZ9vsr8n0ouc9Mn3CXEGCxEJolMI4O6gyTCUI4qh3IyJx/P3uTzoDg6W4+JDIirLTsOKGQ50Ot24ZlGh2sfRNAYsRDE02Xj+umBLc16GBZm8+iVKeZIk4b++eTl8fpm7gybBn5hEMTTZAkQlHcTbFSIKMhokGA2S2sfQPIZzRDEUumEZu+iW9StERNFhwEIUQ2Kf0GQ3LLMYsBARRYQBC1EM5UyWEurklFsiomgwYCGKIdEl1D/shdv7yQWIyg1LHmewEBFFggELUQxl2cwwKAsQR96yeHx+NPZwyi0RUTQYsBDFkMEgIVtJC40svG3uccHnl2E1GVBo5+JOIqJIMGAhijEx7Xb0AkSx9LA8Nx0GtjASEUWEAQtRjCnTbkcNj2OHEBFR9BiwEMVYaAHiqICFHUJERFFjwEIUY+PtEwp1CDFgISKKFAMWohgbb5/QxU5OuSUiihYDFqIYG2ufkCzLqOcNCxFR1BiwEMVYdrBLqDtsn1D3oAf9w14AwIwcBixERJFiwEIUY2N1CYn6leIsG2xmoyrnIiLSMwYsRDGm1LCEpYQudgZmsLB+hYgoOgxYiGJsrBoWUb8yk/UrRERRYcBCFGPihsXp9sHl8QFghxAR0XQxYCGKsSybCcbg6P2eYOEtZ7AQEU0PAxaiGJMk6RPTbkXAwim3RETRYcBCFAe5GYHW5p5BN1weH1r6XACYEiIiihYDFqI4yE4PTbtt6B6CLAMZFiPygvUtREQUGQYsRHEQ3ilUH5YOkiRJzWMREemWSe0DECWj0CwWD3z+wAwWFtwSEUWPAQtRHIgalu5BN3qHAp1CrF8hIooeAxaiOAjvEhp0B3YIzczLUPNIRES6xoCFKA7C9wm1skOIiGjaWHRLFAeihqVzwB0aGseAhYgoarxhIYoD0SV0tn0Aw14/DBJQmp2m8qmIiPSLNyxEcSBqWIa9fgCBYMVi4rcbEVG0+BOUKA5ygl1CAutXiIimhwELURxkWk0wG0ND4jiDhYhoehiwEMVB+AJEgEsPiYimiwELUZzkhu0NmpXLGSxERNPBgIUoTsJvWFjDQkQ0PQxYiOIk/IZlJmtYiIimhQELUZyITiFHmhmONPMkjyYiookwYCGKE5ESYocQEdH0MWAhihMx2XZeQabKJyEi0j+O5ieKkxtWlsLj86NqcZHaRyEi0j0GLERxkm4xYcuGCrWPQUSUFJgSIiIiIs1jwEJERESax4CFiIiINI8BCxEREWkeAxYiIiLSvKgClsceewwVFRWw2WxYv349Dh8+PO5jjx07hptuugkVFRWQJAl79+6d9nMSERFRaok4YHn++eexfft27Ny5EzU1NVixYgU2b96Mtra2MR8/ODiIOXPmYPfu3SguLo7JcxIREVFqkWRZliP5gPXr12Pt2rX4xS9+AQDw+/0oLy/Hvffei+9///sTfmxFRQXuu+8+3HfffTF7TqGvrw8OhwO9vb3IysqK5B+JiIiIVDLV398R3bC43W4cOXIEVVVVoScwGFBVVYVDhw5FddBon3N4eBh9fX0j3oiIiCg5RRSwdHR0wOfzoaho5KjxoqIitLS0RHWAaJ9z165dcDgcylt5eXlUn5+IiIi0T7ddQjt27EBvb6/yVl9fr/aRiIiIKE4i2iWUn58Po9GI1tbWEe9vbW0dt6A2Xs9ptVphtVqj+pxERESkLxHdsFgsFqxevRrV1dXK+/x+P6qrq7Fhw4aoDhCP5yQiIqLkEvG25u3bt+OOO+7AmjVrsG7dOuzduxdOpxNbt24FAGzZsgVlZWXYtWsXgEBR7fHjx5X/39jYiNraWmRmZmLevHlTes6pEM1OLL4lIiLSD/F7e9KmZTkKjz76qDxz5kzZYrHI69atk99++23l76688kr5jjvuUP58/vx5GcAn3q688sopP+dU1NfXj/l5+MY3vvGNb3zjm/bf6uvrJ/w9H/EcFq3y+/1oamqC3W6HJEkxe96+vj6Ul5ejvr6e8100hl8bbeLXRbv4tdGmVP+6yLKM/v5+lJaWwmAYv1Il4pSQVhkMBsyYMSNuz5+VlZWS/yHpAb822sSvi3bxa6NNqfx1cTgckz5Gt23NRERElDoYsBAREZHmMWCZhNVqxc6dOznzRYP4tdEmfl20i18bbeLXZWqSpuiWiIiIkhdvWIiIiEjzGLAQERGR5jFgISIiIs1jwEJERESax4BlEo899hgqKipgs9mwfv16HD58WO0jpbQf/OAHkCRpxNuiRYvUPlZKeuONN/D5z38epaWlkCQJv//970f8vSzLeOCBB1BSUoK0tDRUVVXh9OnT6hw2hUz2dbnzzjs/8T306U9/Wp3DppBdu3Zh7dq1sNvtKCwsxI033oiTJ0+OeIzL5cI999yDvLw8ZGZm4qabbkJra6tKJ9YeBiwTeP7557F9+3bs3LkTNTU1WLFiBTZv3oy2tja1j5bSli5diubmZuXtzTffVPtIKcnpdGLFihV47LHHxvz7hx56CD//+c/xxBNP4J133kFGRgY2b94Ml8uV4JOmlsm+LgDw6U9/esT30G9+85sEnjA1HTx4EPfccw/efvttvPrqq/B4PNi0aROcTqfymG9/+9v4wx/+gN/97nc4ePAgmpqa8KUvfUnFU2tMRBsGU8y6devke+65R/mzz+eTS0tL5V27dql4qtS2c+dOecWKFWofg0YBIL/wwgvKn/1+v1xcXCw//PDDyvt6enpkq9Uq/+Y3v1HhhKlp9NdFlmX5jjvukG+44QZVzkMhbW1tMgD54MGDsiwHvj/MZrP8u9/9TnnMiRMnZADyoUOH1DqmpvCGZRxutxtHjhxBVVWV8j6DwYCqqiocOnRIxZPR6dOnUVpaijlz5uD2229HXV2d2keiUc6fP4+WlpYR3z8OhwPr16/n948GHDhwAIWFhVi4cCHuvvtudHZ2qn2klNPb2wsAyM3NBQAcOXIEHo9nxPfMokWLMHPmTH7PBDFgGUdHRwd8Ph+KiopGvL+oqAgtLS0qnYrWr1+PX/3qV9i3bx8ef/xxnD9/Hhs3bkR/f7/aR6Mw4nuE3z/a8+lPfxq//vWvUV1djQcffBAHDx7E9ddfD5/Pp/bRUobf78d9992Hyy+/HJWVlQAC3zMWiwXZ2dkjHsvvmZCk2dZMqeH6669X/v/y5cuxfv16zJo1C7/97W/xta99TcWTEenDrbfeqvz/ZcuWYfny5Zg7dy4OHDiAa6+9VsWTpY577rkHR48eZf1dhHjDMo78/HwYjcZPVGi3traiuLhYpVPRaNnZ2ViwYAHOnDmj9lEojPge4feP9s2ZMwf5+fn8HkqQbdu24Y9//CP279+PGTNmKO8vLi6G2+1GT0/PiMfzeyaEAcs4LBYLVq9ejerqauV9fr8f1dXV2LBhg4ono3ADAwM4e/YsSkpK1D4KhZk9ezaKi4tHfP/09fXhnXfe4fePxjQ0NKCzs5PfQ3EmyzK2bduGF154Aa+//jpmz5494u9Xr14Ns9k84nvm5MmTqKur4/dMEFNCE9i+fTvuuOMOrFmzBuvWrcPevXvhdDqxdetWtY+Wsr7zne/g85//PGbNmoWmpibs3LkTRqMRt912m9pHSzkDAwMjXpWfP38etbW1yM3NxcyZM3Hffffhxz/+MebPn4/Zs2fj/vvvR2lpKW688Ub1Dp0CJvq65Obm4n/+z/+Jm266CcXFxTh79iz++Z//GfPmzcPmzZtVPHXyu+eee/Dss8/ixRdfhN1uV+pSHA4H0tLS4HA48LWvfQ3bt29Hbm4usrKycO+992LDhg249NJLVT69RqjdpqR1jz76qDxz5kzZYrHI69atk99++221j5TSbrnlFrmkpES2WCxyWVmZfMstt8hnzpxR+1gpaf/+/TKAT7zdcccdsiwHWpvvv/9+uaioSLZarfK1114rnzx5Ut1Dp4CJvi6Dg4Pypk2b5IKCAtlsNsuzZs2S77rrLrmlpUXtYye9sb4mAORf/vKXymOGhobkb37zm3JOTo6cnp4uf/GLX5Sbm5vVO7TGSLIsy4kPk4iIiIimjjUsREREpHkMWIiIiEjzGLAQERGR5jFgISIiIs1jwEJERESax4CFiIiINI8BCxEREWkeAxYiIiLSPAYsREREpHkMWIiIiEjzGLAQERGR5jFgISIiIs37f5WwUm6wUc/8AAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"distances = []\n",
"for i, embedding in enumerate(embeddings[:-1]):\n",
" distances.append(pdist(np.array([embedding, embeddings[i + 1]]), \"cosine\")[0])\n",
"pd.Series(distances).plot()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"15 0.218155\n",
"5 0.217488\n",
"13 0.208706\n",
"22 0.195592\n",
"1 0.194778\n",
"dtype: float64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.Series(distances).sort_values(ascending=False).head()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Jahrhunderts wurde sie deren Hauptresidenz, die sich vorher zeitweise auch in der Burg Windecken befand\n",
"\n",
" Nach der endgültigen Eroberung von Mariupol konzentrierte sich das russische Militär im Mai und Juni auf die Einnahme von Territorien in der Oblast Luhansk\n"
]
}
],
"source": [
"print(splitted[15])\n",
"print()\n",
"print(splitted[16])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "py3.9",
"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.18"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
@jphme
Copy link
Author

jphme commented Jan 13, 2024

2 random wiki articles copied together, the correct split is found immediately.

Could be improved in various (recursively splitting more granular pieces / smaller windows and parallelize everything) but I think the concept is sound and a good implementation will be very fast and flexible..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment