diff --git "a/phase4/notebooks/ManytooneLSTM.ipynb" "b/phase4/notebooks/ManytooneLSTM.ipynb" new file mode 100644--- /dev/null +++ "b/phase4/notebooks/ManytooneLSTM.ipynb" @@ -0,0 +1,38071 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xzSW--JliWb1", + "outputId": "251c178d-3583-4379-db08-bb8860b2c8ea" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: tensorflow in /usr/local/lib/python3.12/dist-packages (2.19.0)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n", + "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)\n", + "Collecting lime\n", + " Downloading lime-0.2.0.1.tar.gz (275 kB)\n", + "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/275.7 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m275.7/275.7 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: shap in /usr/local/lib/python3.12/dist-packages (0.50.0)\n", + "Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.4.0)\n", + "Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.6.3)\n", + "Requirement already satisfied: flatbuffers>=24.3.25 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (25.9.23)\n", + "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.7.0)\n", + "Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.2.0)\n", + "Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (18.1.1)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.4.0)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from tensorflow) (25.0)\n", + "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (5.29.5)\n", + "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.32.4)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from tensorflow) (75.2.0)\n", + "Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.17.0)\n", + "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.2.0)\n", + "Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (4.15.0)\n", + "Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.0.1)\n", + "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.76.0)\n", + "Requirement already satisfied: tensorboard~=2.19.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.19.0)\n", + "Requirement already satisfied: keras>=3.5.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.10.0)\n", + "Requirement already satisfied: h5py>=3.11.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.15.1)\n", + "Requirement already satisfied: ml-dtypes<1.0.0,>=0.5.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.5.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.3)\n", + "Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.16.3)\n", + "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.3)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.61.1)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.4.9)\n", + "Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (11.3.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (3.2.5)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (from lime) (4.67.1)\n", + "Requirement already satisfied: scikit-image>=0.12 in /usr/local/lib/python3.12/dist-packages (from lime) (0.25.2)\n", + "Requirement already satisfied: slicer==0.0.8 in /usr/local/lib/python3.12/dist-packages (from shap) (0.0.8)\n", + "Requirement already satisfied: numba>=0.54 in /usr/local/lib/python3.12/dist-packages (from shap) (0.60.0)\n", + "Requirement already satisfied: cloudpickle in /usr/local/lib/python3.12/dist-packages (from shap) (3.1.2)\n", + "Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.12/dist-packages (from astunparse>=1.6.0->tensorflow) (0.45.1)\n", + "Requirement already satisfied: rich in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (13.9.4)\n", + "Requirement already satisfied: namex in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (0.1.0)\n", + "Requirement already satisfied: optree in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (0.18.0)\n", + "Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.12/dist-packages (from numba>=0.54->shap) (0.43.0)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.4.4)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.11)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (2.5.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (2025.11.12)\n", + "Requirement already satisfied: networkx>=3.0 in /usr/local/lib/python3.12/dist-packages (from scikit-image>=0.12->lime) (3.6.1)\n", + "Requirement already satisfied: imageio!=2.35.0,>=2.33 in /usr/local/lib/python3.12/dist-packages (from scikit-image>=0.12->lime) (2.37.2)\n", + "Requirement already satisfied: tifffile>=2022.8.12 in /usr/local/lib/python3.12/dist-packages (from scikit-image>=0.12->lime) (2025.12.12)\n", + "Requirement already satisfied: lazy-loader>=0.4 in /usr/local/lib/python3.12/dist-packages (from scikit-image>=0.12->lime) (0.4)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (3.10)\n", + "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (0.7.2)\n", + "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (3.1.4)\n", + "Requirement already satisfied: markupsafe>=2.1.1 in /usr/local/lib/python3.12/dist-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow) (3.0.3)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich->keras>=3.5.0->tensorflow) (4.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich->keras>=3.5.0->tensorflow) (2.19.2)\n", + "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow) (0.1.2)\n", + "Building wheels for collected packages: lime\n", + " Building wheel for lime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for lime: filename=lime-0.2.0.1-py3-none-any.whl size=283834 sha256=cc79be689c263db97fd71d9cd88b8f21f91ebd4d922d6874882ea66ebf638e5d\n", + " Stored in directory: /root/.cache/pip/wheels/e7/5d/0e/4b4fff9a47468fed5633211fb3b76d1db43fe806a17fb7486a\n", + "Successfully built lime\n", + "Installing collected packages: lime\n", + "Successfully installed lime-0.2.0.1\n" + ] + } + ], + "source": [ + "!pip install tensorflow numpy pandas scikit-learn matplotlib lime shap\n" + ] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from tensorflow.keras.preprocessing.text import Tokenizer\n", + "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", + "from tensorflow.keras.layers import Embedding, Bidirectional, LSTM, Dense, Input, Layer\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras.optimizers import Adam\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import accuracy_score, classification_report\n" + ], + "metadata": { + "id": "-2QgEQLDiidT" + }, + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from google.colab import files\n", + "uploaded = files.upload()\n", + "\n", + "df = pd.read_csv(list(uploaded.keys())[0])\n", + "\n", + "texts = df['text'].astype(str).values\n", + "labels = df['hate_label'].values # ✅ FIXED\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 73 + }, + "id": "FpD-kqDXiqRQ", + "outputId": "d067ce29-1bde-41fa-c040-3afd6207012b" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " Upload widget is only available when the cell has been executed in the\n", + " current browser session. Please rerun this cell to enable.\n", + " \n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saving bprism_c.csv to bprism_c (1).csv\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "MAX_VOCAB = 20000\n", + "MAX_LEN = 100\n", + "\n", + "tokenizer = Tokenizer(num_words=MAX_VOCAB, oov_token=\"\")\n", + "tokenizer.fit_on_texts(texts)\n", + "\n", + "sequences = tokenizer.texts_to_sequences(texts)\n", + "padded_sequences = pad_sequences(\n", + " sequences, maxlen=MAX_LEN, padding='post', truncating='post'\n", + ")\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " padded_sequences, labels, test_size=0.2, random_state=42\n", + ")\n" + ], + "metadata": { + "id": "_74C9kAVizSn" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!wget http://nlp.stanford.edu/data/glove.6B.zip\n", + "!unzip glove.6B.zip\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a7T8q5yXkGWq", + "outputId": "3d38060e-25f8-43a6-d421-ce4253bb6df1" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "--2025-12-27 06:48:13-- http://nlp.stanford.edu/data/glove.6B.zip\n", + "Resolving nlp.stanford.edu (nlp.stanford.edu)... 171.64.67.140\n", + "Connecting to nlp.stanford.edu (nlp.stanford.edu)|171.64.67.140|:80... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://nlp.stanford.edu/data/glove.6B.zip [following]\n", + "--2025-12-27 06:48:13-- https://nlp.stanford.edu/data/glove.6B.zip\n", + "Connecting to nlp.stanford.edu (nlp.stanford.edu)|171.64.67.140|:443... connected.\n", + "HTTP request sent, awaiting response... 301 Moved Permanently\n", + "Location: https://downloads.cs.stanford.edu/nlp/data/glove.6B.zip [following]\n", + "--2025-12-27 06:48:14-- https://downloads.cs.stanford.edu/nlp/data/glove.6B.zip\n", + "Resolving downloads.cs.stanford.edu (downloads.cs.stanford.edu)... 171.64.64.22\n", + "Connecting to downloads.cs.stanford.edu (downloads.cs.stanford.edu)|171.64.64.22|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 862182613 (822M) [application/zip]\n", + "Saving to: ‘glove.6B.zip’\n", + "\n", + "glove.6B.zip 100%[===================>] 822.24M 4.63MB/s in 2m 40s \n", + "\n", + "2025-12-27 06:50:54 (5.15 MB/s) - ‘glove.6B.zip’ saved [862182613/862182613]\n", + "\n", + "Archive: glove.6B.zip\n", + " inflating: glove.6B.50d.txt \n", + " inflating: glove.6B.100d.txt \n", + " inflating: glove.6B.200d.txt \n", + " inflating: glove.6B.300d.txt \n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "EMBED_DIM = 100\n", + "word_index = tokenizer.word_index\n", + "vocab_size = min(MAX_VOCAB, len(word_index) + 1)\n", + "\n", + "embedding_matrix = np.zeros((vocab_size, EMBED_DIM))\n", + "\n", + "with open(\"glove.6B.100d.txt\", encoding=\"utf8\") as f:\n", + " for line in f:\n", + " values = line.split()\n", + " word = values[0]\n", + " vector = np.asarray(values[1:], dtype=\"float32\")\n", + " if word in word_index and word_index[word] < vocab_size:\n", + " embedding_matrix[word_index[word]] = vector\n" + ], + "metadata": { + "id": "DJNuyGILkKMY" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "class AttentionLayer(Layer):\n", + " def __init__(self):\n", + " super(AttentionLayer, self).__init__()\n", + "\n", + " def build(self, input_shape):\n", + " self.W = self.add_weight(\n", + " name=\"attention_weight\",\n", + " shape=(input_shape[-1], 1),\n", + " initializer=\"glorot_uniform\",\n", + " trainable=True\n", + " )\n", + " self.b = self.add_weight(\n", + " name=\"attention_bias\",\n", + " shape=(input_shape[1], 1),\n", + " initializer=\"zeros\",\n", + " trainable=True\n", + " )\n", + "\n", + " def call(self, inputs):\n", + " score = tf.nn.tanh(tf.matmul(inputs, self.W) + self.b)\n", + " attention_weights = tf.nn.softmax(score, axis=1)\n", + " context_vector = attention_weights * inputs\n", + " context_vector = tf.reduce_sum(context_vector, axis=1)\n", + " return context_vector, attention_weights\n" + ], + "metadata": { + "id": "dAb_FgFbk7Ix" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "input_layer = Input(shape=(MAX_LEN,))\n", + "\n", + "embedding_layer = Embedding(\n", + " vocab_size,\n", + " EMBED_DIM,\n", + " weights=[embedding_matrix],\n", + " trainable=False\n", + ")(input_layer)\n", + "\n", + "bilstm_layer = Bidirectional(\n", + " LSTM(128, return_sequences=True)\n", + ")(embedding_layer)\n", + "\n", + "context_vector, attention_weights = AttentionLayer()(bilstm_layer)\n", + "\n", + "output_layer = Dense(1, activation=\"sigmoid\")(context_vector)\n", + "\n", + "model = Model(inputs=input_layer, outputs=output_layer)\n", + "\n", + "model.compile(\n", + " loss=\"binary_crossentropy\",\n", + " optimizer=Adam(learning_rate=0.001),\n", + " metrics=[\"accuracy\"]\n", + ")\n", + "\n", + "model.summary()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 305 + }, + "id": "j8a4WYrHlAFE", + "outputId": "2fb69a31-8a53-4d08-f0ee-8120f46ad69c" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1mModel: \"functional\"\u001b[0m\n" + ], + "text/html": [ + "
Model: \"functional\"\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", + "│ input_layer (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m2,000,000\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ bidirectional (\u001b[38;5;33mBidirectional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m234,496\u001b[0m │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ attention_layer │ [(\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m), (\u001b[38;5;45mNone\u001b[0m, │ \u001b[38;5;34m356\u001b[0m │\n", + "│ (\u001b[38;5;33mAttentionLayer\u001b[0m) │ \u001b[38;5;34m100\u001b[0m, \u001b[38;5;34m1\u001b[0m)] │ │\n", + "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", + "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n", + "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" + ], + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
+              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+              "│ input_layer (InputLayer)        │ (None, 100)            │             0 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ embedding (Embedding)           │ (None, 100, 100)       │     2,000,000 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ bidirectional (Bidirectional)   │ (None, 100, 256)       │       234,496 │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ attention_layer                 │ [(None, 256), (None,   │           356 │\n",
+              "│ (AttentionLayer)                │ 100, 1)]               │               │\n",
+              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+              "│ dense (Dense)                   │ (None, 1)              │           257 │\n",
+              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2,235,109\u001b[0m (8.53 MB)\n" + ], + "text/html": [ + "
 Total params: 2,235,109 (8.53 MB)\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m235,109\u001b[0m (918.39 KB)\n" + ], + "text/html": [ + "
 Trainable params: 235,109 (918.39 KB)\n",
+              "
\n" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m2,000,000\u001b[0m (7.63 MB)\n" + ], + "text/html": [ + "
 Non-trainable params: 2,000,000 (7.63 MB)\n",
+              "
\n" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "history = model.fit(\n", + " X_train,\n", + " y_train,\n", + " epochs=50,\n", + " batch_size=64,\n", + " validation_split=0.1\n", + ")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7YRC6lZNlDaL", + "outputId": "f5237411-d961-4fc3-ab1c-76dafdd395b1" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.7131 - loss: 0.5337 - val_accuracy: 0.7022 - val_loss: 0.5563\n", + "Epoch 2/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.7204 - loss: 0.5216 - val_accuracy: 0.6920 - val_loss: 0.5600\n", + "Epoch 3/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.7193 - loss: 0.5126 - val_accuracy: 0.6992 - val_loss: 0.5545\n", + "Epoch 4/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 14ms/step - accuracy: 0.7406 - loss: 0.4941 - val_accuracy: 0.7022 - val_loss: 0.5605\n", + "Epoch 5/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.7478 - loss: 0.4757 - val_accuracy: 0.6959 - val_loss: 0.5729\n", + "Epoch 6/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.7541 - loss: 0.4531 - val_accuracy: 0.6997 - val_loss: 0.5729\n", + "Epoch 7/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.7733 - loss: 0.4287 - val_accuracy: 0.6908 - val_loss: 0.6080\n", + "Epoch 8/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.7815 - loss: 0.4125 - val_accuracy: 0.6971 - val_loss: 0.5985\n", + "Epoch 9/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 13ms/step - accuracy: 0.7951 - loss: 0.3876 - val_accuracy: 0.6895 - val_loss: 0.6591\n", + "Epoch 10/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8010 - loss: 0.3701 - val_accuracy: 0.6874 - val_loss: 0.6490\n", + "Epoch 11/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 15ms/step - accuracy: 0.8115 - loss: 0.3579 - val_accuracy: 0.6916 - val_loss: 0.6907\n", + "Epoch 12/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8177 - loss: 0.3452 - val_accuracy: 0.6929 - val_loss: 0.7421\n", + "Epoch 13/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8287 - loss: 0.3178 - val_accuracy: 0.6768 - val_loss: 0.7646\n", + "Epoch 14/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8390 - loss: 0.3003 - val_accuracy: 0.6802 - val_loss: 0.8380\n", + "Epoch 15/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8333 - loss: 0.2993 - val_accuracy: 0.6794 - val_loss: 0.8665\n", + "Epoch 16/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8360 - loss: 0.2876 - val_accuracy: 0.6887 - val_loss: 0.8115\n", + "Epoch 17/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8378 - loss: 0.2877 - val_accuracy: 0.6920 - val_loss: 0.8661\n", + "Epoch 18/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8534 - loss: 0.2702 - val_accuracy: 0.6819 - val_loss: 0.8735\n", + "Epoch 19/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8438 - loss: 0.2725 - val_accuracy: 0.6739 - val_loss: 0.9648\n", + "Epoch 20/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 13ms/step - accuracy: 0.8417 - loss: 0.2814 - val_accuracy: 0.6870 - val_loss: 0.9659\n", + "Epoch 21/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8491 - loss: 0.2600 - val_accuracy: 0.6904 - val_loss: 1.0135\n", + "Epoch 22/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8554 - loss: 0.2590 - val_accuracy: 0.6836 - val_loss: 1.0348\n", + "Epoch 23/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8535 - loss: 0.2609 - val_accuracy: 0.6916 - val_loss: 0.9680\n", + "Epoch 24/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8511 - loss: 0.2567 - val_accuracy: 0.6891 - val_loss: 1.1065\n", + "Epoch 25/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8529 - loss: 0.2522 - val_accuracy: 0.6925 - val_loss: 1.0379\n", + "Epoch 26/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8605 - loss: 0.2480 - val_accuracy: 0.6946 - val_loss: 1.0602\n", + "Epoch 27/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8564 - loss: 0.2543 - val_accuracy: 0.6861 - val_loss: 1.0222\n", + "Epoch 28/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8589 - loss: 0.2451 - val_accuracy: 0.6908 - val_loss: 1.1285\n", + "Epoch 29/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8599 - loss: 0.2427 - val_accuracy: 0.7030 - val_loss: 1.1004\n", + "Epoch 30/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8591 - loss: 0.2455 - val_accuracy: 0.6887 - val_loss: 1.1408\n", + "Epoch 31/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8608 - loss: 0.2379 - val_accuracy: 0.6870 - val_loss: 1.1495\n", + "Epoch 32/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8637 - loss: 0.2374 - val_accuracy: 0.6874 - val_loss: 1.2024\n", + "Epoch 33/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8600 - loss: 0.2444 - val_accuracy: 0.6933 - val_loss: 1.0902\n", + "Epoch 34/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8658 - loss: 0.2357 - val_accuracy: 0.6967 - val_loss: 1.0906\n", + "Epoch 35/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 16ms/step - accuracy: 0.8673 - loss: 0.2321 - val_accuracy: 0.6925 - val_loss: 1.1971\n", + "Epoch 36/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8644 - loss: 0.2330 - val_accuracy: 0.7001 - val_loss: 1.2568\n", + "Epoch 37/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8658 - loss: 0.2320 - val_accuracy: 0.6840 - val_loss: 1.2881\n", + "Epoch 38/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 14ms/step - accuracy: 0.8593 - loss: 0.2444 - val_accuracy: 0.6937 - val_loss: 1.1835\n", + "Epoch 39/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8635 - loss: 0.2395 - val_accuracy: 0.6920 - val_loss: 1.1560\n", + "Epoch 40/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8632 - loss: 0.2432 - val_accuracy: 0.6827 - val_loss: 1.1650\n", + "Epoch 41/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8710 - loss: 0.2281 - val_accuracy: 0.6959 - val_loss: 1.2212\n", + "Epoch 42/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8689 - loss: 0.2244 - val_accuracy: 0.6946 - val_loss: 1.3072\n", + "Epoch 43/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8623 - loss: 0.2355 - val_accuracy: 0.6908 - val_loss: 1.1535\n", + "Epoch 44/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8701 - loss: 0.2292 - val_accuracy: 0.6946 - val_loss: 1.1705\n", + "Epoch 45/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 16ms/step - accuracy: 0.8722 - loss: 0.2240 - val_accuracy: 0.6810 - val_loss: 1.2715\n", + "Epoch 46/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8714 - loss: 0.2235 - val_accuracy: 0.6895 - val_loss: 1.2926\n", + "Epoch 47/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8708 - loss: 0.2259 - val_accuracy: 0.6967 - val_loss: 1.2702\n", + "Epoch 48/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8701 - loss: 0.2233 - val_accuracy: 0.6959 - val_loss: 1.3388\n", + "Epoch 49/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 14ms/step - accuracy: 0.8695 - loss: 0.2259 - val_accuracy: 0.6988 - val_loss: 1.3213\n", + "Epoch 50/50\n", + "\u001b[1m333/333\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 17ms/step - accuracy: 0.8734 - loss: 0.2179 - val_accuracy: 0.7052 - val_loss: 1.4391\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_pred = (model.predict(X_test) > 0.5).astype(\"int32\")\n", + "\n", + "print(\"Accuracy:\", accuracy_score(y_test, y_pred))\n", + "print(classification_report(y_test, y_pred))\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h_AZxWovlHOk", + "outputId": "e759a6c5-ae62-4561-cd99-6a23707e8203" + }, + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m185/185\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 10ms/step\n", + "Accuracy: 0.6803722504230119\n", + " precision recall f1-score support\n", + "\n", + " 0 0.68 0.75 0.71 3164\n", + " 1 0.67 0.60 0.64 2746\n", + "\n", + " accuracy 0.68 5910\n", + " macro avg 0.68 0.68 0.68 5910\n", + "weighted avg 0.68 0.68 0.68 5910\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "plt.plot(history.history['accuracy'], label='Train Acc')\n", + "plt.plot(history.history['val_accuracy'], label='Val Acc')\n", + "plt.legend()\n", + "plt.title(\"Model Accuracy\")\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 452 + }, + "id": "F6B--i2amUOd", + "outputId": "c0c6f7d4-8ed0-485f-91e8-eb6a74a2bba3" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGzCAYAAADXFObAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgyVJREFUeJzt3XdcVfX/B/DXvRe4DBmyhyjuiQsFUTNN3FGWe2uOLC2V6pdWrhZ+s8wsywZq5cxSK7fiSkVRzIEDxYUiU4TLkHXv+f3xkYs3QLkIXLi8no/HfXDvuWd8zgHued/PeH9kkiRJICIiIqrm5IYuABEREVF5YFBDRERERoFBDRERERkFBjVERERkFBjUEBERkVFgUENERERGgUENERERGQUGNURERGQUGNQQERGRUWBQQ0RPTSaTYcGCBXpvd/PmTchkMqxevbrcy0RENQ+DGiIjsXr1ashkMshkMhw5cqTI+5IkwdPTEzKZDM8//7wBSlg+duzYAZlMBnd3d2g0GkMXh4iqEAY1REbG3Nwc69atK7L80KFDuHPnDpRKpQFKVX7Wrl0LLy8vxMXFYf/+/YYuDhFVIQxqiIxM//79sWnTJuTn5+ssX7duHXx8fODq6mqgkj29zMxM/PnnnwgKCkK7du2wdu1aQxepRJmZmYYuAlGNw6CGyMiMGDEC9+7dw969e7XLcnNz8fvvv2PkyJHFbpOZmYm33noLnp6eUCqVaNq0KT7//HNIkqSzXk5ODmbNmgUnJydYW1vjhRdewJ07d4rdZ2xsLF555RW4uLhAqVSiZcuWWLly5VOd25YtW/DgwQMMGTIEw4cPx+bNm5GdnV1kvezsbCxYsABNmjSBubk53Nzc8PLLL+PatWvadTQaDb766it4e3vD3NwcTk5O6Nu3L06dOgXg8f19/tuHaMGCBZDJZLh48SJGjhyJ2rVro2vXrgCAc+fOYfz48WjQoAHMzc3h6uqKV155Bffu3Sv2mk2cOBHu7u5QKpWoX78+XnvtNeTm5uL69euQyWT48ssvi2x37NgxyGQyrF+/Xt9LSmRUTAxdACIqX15eXvD398f69evRr18/AMDOnTuRlpaG4cOHY9myZTrrS5KEF154AQcOHMDEiRPRtm1b7N69G++88w5iY2N1bqKTJk3CmjVrMHLkSHTu3Bn79+/HgAEDipQhISEBnTp1gkwmw/Tp0+Hk5ISdO3di4sSJUKlUmDlzZpnObe3atejRowdcXV0xfPhwzJ49G3///TeGDBmiXUetVuP5559HaGgohg8fjhkzZiA9PR179+5FZGQkGjZsCACYOHEiVq9ejX79+mHSpEnIz8/HP//8g+PHj6NDhw5lKt+QIUPQuHFjfPrpp9qAcO/evbh+/TomTJgAV1dXXLhwAT/88AMuXLiA48ePQyaTAQDu3r0LX19fpKamYsqUKWjWrBliY2Px+++/IysrCw0aNECXLl2wdu1azJo1q8h1sba2xosvvlimchMZDYmIjMKqVaskANLJkyelb775RrK2tpaysrIkSZKkIUOGSD169JAkSZLq1asnDRgwQLvd1q1bJQDSxx9/rLO/wYMHSzKZTIqOjpYkSZLOnDkjAZBef/11nfVGjhwpAZDmz5+vXTZx4kTJzc1NSk5O1ll3+PDhkq2trbZcN27ckABIq1ateuL5JSQkSCYmJtKPP/6oXda5c2fpxRdf1Flv5cqVEgBpyZIlRfah0WgkSZKk/fv3SwCkN998s8R1Hle2/57v/PnzJQDSiBEjiqxbcK6PWr9+vQRAOnz4sHbZ2LFjJblcLp08ebLEMn3//fcSAOnSpUva93JzcyVHR0dp3LhxRbYjqmnY/ERkhIYOHYoHDx5g27ZtSE9Px7Zt20psetqxYwcUCgXefPNNneVvvfUWJEnCzp07tesBKLLef2tdJEnCH3/8gcDAQEiShOTkZO2jT58+SEtLw+nTp/U+pw0bNkAul2PQoEHaZSNGjMDOnTtx//597bI//vgDjo6OeOONN4rso6BW5I8//oBMJsP8+fNLXKcspk6dWmSZhYWF9nl2djaSk5PRqVMnANBeB41Gg61btyIwMLDYWqKCMg0dOhTm5uY6fYl2796N5ORkjB49uszlJjIWDGqIjJCTkxMCAgKwbt06bN68GWq1GoMHDy523Vu3bsHd3R3W1tY6y5s3b659v+CnXC7XNt8UaNq0qc7rpKQkpKam4ocffoCTk5POY8KECQCAxMREvc9pzZo18PX1xb179xAdHY3o6Gi0a9cOubm52LRpk3a9a9euoWnTpjAxKbl1/dq1a3B3d4e9vb3e5Xic+vXrF1mWkpKCGTNmwMXFBRYWFnByctKul5aWBkBcM5VKhVatWj12/3Z2dggMDNQZ3bZ27Vp4eHjgueeeK8czIaqe2KeGyEiNHDkSkydPRnx8PPr16wc7O7tKOW5B7pjRo0dj3Lhxxa7TunVrvfZ59epVnDx5EgDQuHHjIu+vXbsWU6ZM0bOkj1dSjY1arS5xm0drZQoMHToUx44dwzvvvIO2bduiVq1a0Gg06Nu3b5ny7IwdOxabNm3CsWPH4O3tjb/++guvv/465HJ+RyViUENkpF566SW8+uqrOH78ODZu3FjievXq1cO+ffuQnp6uU1tz+fJl7fsFPzUajbYmpEBUVJTO/gpGRqnVagQEBJTLuaxduxampqb49ddfoVAodN47cuQIli1bhpiYGNStWxcNGzbEiRMnkJeXB1NT02L317BhQ+zevRspKSkl1tbUrl0bAJCamqqzvKDmqjTu37+P0NBQLFy4EPPmzdMuv3r1qs56Tk5OsLGxQWRk5BP32bdvXzg5OWHt2rXw8/NDVlYWxowZU+oyERkzhvZERqpWrVr47rvvsGDBAgQGBpa4Xv/+/aFWq/HNN9/oLP/yyy8hk8m0I6gKfv539NTSpUt1XisUCgwaNAh//PFHsTfppKQkvc9l7dq1eOaZZzBs2DAMHjxY5/HOO+8AgHY486BBg5CcnFzkfABoRyQNGjQIkiRh4cKFJa5jY2MDR0dHHD58WOf9b7/9ttTlLgjApP8Mjf/vNZPL5Rg4cCD+/vtv7ZDy4soEACYmJhgxYgR+++03rF69Gt7e3nrXfBEZK9bUEBmxkpp/HhUYGIgePXrg/fffx82bN9GmTRvs2bMHf/75J2bOnKntQ9O2bVuMGDEC3377LdLS0tC5c2eEhoYiOjq6yD4XLVqEAwcOwM/PD5MnT0aLFi2QkpKC06dPY9++fUhJSSn1OZw4cQLR0dGYPn16se97eHigffv2WLt2Ld59912MHTsWv/zyC4KCghAeHo5nnnkGmZmZ2LdvH15//XW8+OKL6NGjB8aMGYNly5bh6tWr2qagf/75Bz169NAea9KkSVi0aBEmTZqEDh064PDhw7hy5Uqpy25jY4Nu3brhs88+Q15eHjw8PLBnzx7cuHGjyLqffvop9uzZg2effRZTpkxB8+bNERcXh02bNuHIkSM6zYdjx47FsmXLcODAAfzvf/8rdXmIjJ7hBl4RUXl6dEj34/x3SLckSVJ6ero0a9Ysyd3dXTI1NZUaN24sLV68WDuUuMCDBw+kN998U3JwcJCsrKykwMBA6fbt20WGOEuSGII9bdo0ydPTUzI1NZVcXV2lnj17Sj/88IN2ndIM6X7jjTckANK1a9dKXGfBggUSAOns2bOSJIlh1O+//75Uv3597bEHDx6ss4/8/Hxp8eLFUrNmzSQzMzPJyclJ6tevnxQREaFdJysrS5o4caJka2srWVtbS0OHDpUSExNLHNKdlJRUpGx37tyRXnrpJcnOzk6ytbWVhgwZIt29e7fYa3br1i1p7NixkpOTk6RUKqUGDRpI06ZNk3Jycorst2XLlpJcLpfu3LlT4nUhqmlkkvSfelEiIqry2rVrB3t7e4SGhhq6KERVBvvUEBFVM6dOncKZM2cwduxYQxeFqEphTQ0RUTURGRmJiIgIfPHFF0hOTsb169dhbm5u6GIRVRmsqSEiqiZ+//13TJgwAXl5eVi/fj0DGqL/YE0NERERGQXW1BAREZFRYFBDRERERqHGJN/TaDS4e/curK2tn2oWXiIiIqo8kiQhPT0d7u7uT5zjrMYENXfv3oWnp6ehi0FERERlcPv2bdSpU+ex69SYoKZgor7bt2/DxsbGwKUhIiKi0lCpVPD09NSZcLckNSaoKWhysrGxYVBDRERUzZSm6wg7ChMREZFRYFBDRERERoFBDRERERmFGtOnpjQkSUJ+fj7UarWhi0J6UCgUMDEx4VB9IqIarkxBzfLly7F48WLEx8ejTZs2+Prrr+Hr61vi+kuXLsV3332HmJgYODo6YvDgwQgODtbOW+Ll5YVbt24V2e7111/H8uXLAQDdu3fHoUOHdN5/9dVXsWLFirKcQhG5ubmIi4tDVlZWueyPKpelpSXc3NxgZmZm6KIQEZGB6B3UbNy4EUFBQVixYgX8/PywdOlS9OnTB1FRUXB2di6y/rp16zB79mysXLkSnTt3xpUrVzB+/HjIZDIsWbIEAHDy5Emd2pHIyEj06tULQ4YM0dnX5MmT8eGHH2pfW1pa6lv8Ymk0Gty4cQMKhQLu7u4wMzPjt/5qQpIk5ObmIikpCTdu3EDjxo2fmJyJiIiMk95BzZIlSzB58mRMmDABALBixQps374dK1euxOzZs4usf+zYMXTp0gUjR44EIGplRowYgRMnTmjXcXJy0tlm0aJFaNiwIZ599lmd5ZaWlnB1ddW3yE+Um5sLjUYDT0/PcguUqPJYWFjA1NQUt27dQm5uLmcuJiKqofT6Spubm4uIiAgEBAQU7kAuR0BAAMLCwordpnPnzoiIiEB4eDgA4Pr169ixYwf69+9f4jHWrFmDV155pUhtydq1a+Ho6IhWrVphzpw5j20qysnJgUql0nk8Cb/hV1/83RERkV41NcnJyVCr1XBxcdFZ7uLigsuXLxe7zciRI5GcnIyuXbtqO+JOnToV7733XrHrb926FampqRg/fnyR/dSrVw/u7u44d+4c3n33XURFRWHz5s3F7ic4OBgLFy7U5/SIiIioGqvw0U8HDx7Ep59+im+//RZ+fn6Ijo7GjBkz8NFHH2Hu3LlF1g8JCUG/fv3g7u6us3zKlCna597e3nBzc0PPnj1x7do1NGzYsMh+5syZg6CgIO3rgjTLREREZJz0CmocHR2hUCiQkJCgszwhIaHEvi5z587FmDFjMGnSJAAiIMnMzMSUKVPw/vvv6zQb3Lp1C/v27Sux9uVRfn5+AIDo6OhigxqlUgmlUlnqc6NCXl5emDlzJmbOnGnoohAREZWaXh0RzMzM4OPjg9DQUO0yjUaD0NBQ+Pv7F7tNVlZWkf4OCoUCgBi58qhVq1bB2dkZAwYMeGJZzpw5AwBwc3PT5xSMikwme+xjwYIFZdrvyZMndWrGnsb69euhUCgwbdq0ctkfERFRSfRufgoKCsK4cePQoUMH+Pr6YunSpcjMzNSOhho7diw8PDwQHBwMAAgMDMSSJUvQrl07bfPT3LlzERgYqA1uABEcrVq1CuPGjYOJiW6xrl27hnXr1qF///5wcHDAuXPnMGvWLHTr1g2tW7d+mvOv1uLi4rTPN27ciHnz5iEqKkq7rFatWtrnkiRBrVYXubbF+e9otKcREhKC//u//8P333+PL774giOTiIiMzP3MXITfTEH4jRQ0dKqFkX51DVcYqQy+/vprqW7dupKZmZnk6+srHT9+XPves88+K40bN077Oi8vT1qwYIHUsGFDydzcXPL09JRef/116f79+zr73L17twRAioqKKnK8mJgYqVu3bpK9vb2kVCqlRo0aSe+8846UlpZW6jKnpaVJAIrd5sGDB9LFixelBw8eaJdpNBopMyfPIA+NRlPq8yqwatUqydbWVvv6wIEDEgBpx44dUvv27SVTU1PpwIEDUnR0tPTCCy9Izs7OkpWVldShQwdp7969OvuqV6+e9OWXX2pfA5B+/PFHaeDAgZKFhYXUqFEj6c8//3xima5fvy5ZWFhIqampkp+fn7R27doi64SEhEgtWrSQzMzMJFdXV2natGna9+7fvy9NmTJFcnZ2lpRKpdSyZUvp77//LvZYxf0OiYio/CWkPZD+OhMrfbDlvNR7ySGp3rvbtI+hK46V+/Eed//+rzJ1FJ4+fTqmT59e7HsHDx7UeW1iYoL58+dj/vz5j91n7969izRHFfD09CySTbiiPchTo8W83ZV6zAIXP+wDS7Py6cM9e/ZsfP7552jQoAFq166N27dvo3///vjkk0+gVCrxyy+/IDAwEFFRUahbt+ToeuHChfjss8+wePFifP311xg1ahRu3boFe3v7ErdZtWoVBgwYAFtbW4wePRohISHafEUA8N133yEoKAiLFi1Cv379kJaWhqNHjwIQNXf9+vVDeno61qxZg4YNG+LixYs6tXtERDVNnlqDvRcTsPl0LCzMFOjdwgU9mjmjlrLixv3cy8jBwagkhN9IQfjNFNxIziyyTmPnWvCtb48ujRwrrBylwbmfjNyHH36IXr16aV/b29ujTZs22tcfffQRtmzZgr/++qvEQBUAxo8fjxEjRgAAPv30Uyxbtgzh4eHo27dvsetrNBqsXr0aX3/9NQBg+PDheOutt3Djxg3Ur18fAPDxxx/jrbfewowZM7TbdezYEQCwb98+hIeH49KlS2jSpAkAoEGDBmW5BERE1V6iKhvrw29jXfgtJKhytMv/PnsXZiZydGvsiL6t3BDQ3Bl2lk8/XUxc2gPsjozHzsh4nLyZAs0jdQ4yGdDCzQa+9e3hV98eHb3s4VCragzMYVBTAgtTBS5+2Mdgxy4vHTp00HmdkZGBBQsWYPv27YiLi0N+fj4ePHiAmJiYx+7n0b5LVlZWsLGxQWJiYonr7927F5mZmdoki46OjujVqxdWrlyJjz76CImJibh79y569uxZ7PZnzpxBnTp1tAENEVFNI0kSwm+k4Jfjt7A7Mh75DyMLx1pmGNbRE2oNsCsyDjfvZWHfpUTsu5QIhVwG/wYO6NvKFb1busDZuvT9GG8mZ2LXBRHInL2dqvNeS3cbdG3sCL/69vCpZw9bC9PyPNVyw6CmBDKZrNyagAzJyspK5/Xbb7+NvXv34vPPP0ejRo1gYWGBwYMHIzc397H7MTXV/QOWyWTQaDQlrh8SEoKUlBRYWFhol2k0Gpw7dw4LFy7UWV6cJ71PRGSsMnLyseXfWKwJu4WohHTt8g71amOMfz30beUKpYn48vtu36aISkjHrsh47IqMx+X4dByJTsaR6GTM/TMSDRytYGNhilpKE1iZmaCWuYl4rlTASmkCa6UJkjJyseeC2LaATAb41K2Nvq1c0aelKzztq8cUQtX/rk16OXr0KMaPH4+XXnoJgKi5uXnzZrke4969e/jzzz+xYcMGtGzZUrtcrVaja9eu2LNnD/r27QsvLy+EhoaiR48eRfbRunVr3LlzB1euXGFtDRHVCPczc/HTkev45dgtpOfkAxA19wPbuWN0p3po6W5bZBuZTIZmrjZo5mqDmQFNtLUtuyLjceZ2Kq4lFe3/UhKFXIbODR3Qp6UrerdwgbNN9RutyqCmhmncuDE2b96MwMBAyGQyzJ0797E1LmXx66+/wsHBAUOHDi0yf1f//v0REhKCvn37YsGCBZg6dSqcnZ21nYKPHj2KN954A88++yy6deuGQYMGYcmSJWjUqBEuX74MmUxWYj8eIqraLt4Vc/C1cLcxcEmqlnsZOfjxnxv4NewmMnPVAIAGjlYY3akeBvnU0aupx8vRClOfbYipzzZEfFo2riVlICMnH5kPHxk5amTk5CEzR61drpDL0L2pc7n1xzEkBjU1zJIlS/DKK6+gc+fOcHR0xLvvvluqyT71sXLlSrz00ktFAhoAGDRoEMaMGYPk5GSMGzcO2dnZ+PLLL/H222/D0dERgwcP1q77xx9/4O2338aIESOQmZmJRo0aYdGiReVaViKqeNeTMvDZrijsuhAPhVyG9ZM7wbd+ySMnq4rMnHzsOB+HrWdiIZfJMK1HI3Rq4FBu+0/OyMGPh6/j1+O3kPUwmGnpboM3ezZGr+YukMuLfobqw9XWHK621a+25WnIpJLGURsZlUoFW1tbpKWlwcZG91tCdna2dlQOk8NVT/wdElU9Sek5WBZ6FevCY6B+ZPiMq405dsx4BvZWVa9WQJIknI65j99O3sG2c3e1NScFApq7YE7/ZmjoVKuEPTxZYno2fjh0HWtO3EJ2nqgp9/awxZs9GyOguXOxXwhrssfdv/+LNTVERFSusnLz8dM/N/D9oWvaoOC5Zs6Y/lwjvP3bWVxPzsTbm84iZFyHKnMDT1Rl44/TsdgUcRvXH+mHUs/BEkN86iD+4ZDqfZcScCAqEaP86mJGz8alHsosSRIuxqnwR0Qs1p64hZx8Ecy0qWOLGQGN0aMpg5nywKCGiIjKRb5ag00Rd7Bk7xUkpYtcKq3r2GJ2v2bo3FAkZftmZHsM/PYo9l9OxE//3MDkbobLPyVJEkIvJWJ9eAwOXknS1iZZmCowoLUbhnbwREev2tpgY3xnLyzaeRn7LiXil7Bb2HI6Fq/3aIQJXbxgXkwqDlV2Ho5cTcbBqEQcjEpCYnphfpl2de0wo2djPNvEicFMOWLzE9h0YQz4OyQyDI1Gwp37D/Dv7fv4en80ohMzAACe9hZ4p08zPO/tVqRvyJrjt/DB1kiYyGXYNNUf7erWrvRyX01Ix7w/LyDs+j3tMp96tTG0Qx0MaO3+2Ay9x6KT8cmOS7jwsOOzh50F3unTFC+0cUdUQjoOPAxiIm7d12l2szBVoEsjB4z198IzjR0ZzJSSPs1PDGrAG6Ix4O+QqGKpNRJiUrJwNSEdVxMztD+vJWVo+4UAgJ2lKd54rjFGd6qrzaXyX5IkYfq6f7H9fBw87Cyw481nYGtZOcncMnLysSz0KlYeuYF8jQSliRzjOnthWEdPvfrJaDQStp6JxeLdUYhLywYAWJkpivTBaeBkhe5NnNG9qRN869sXW6NDj8c+NURE9ESRsWlYefQGMrLzodZIyNNIUGs0yFNLUGsk5Ks1yNdIyMnXICYlC7n5xad/MDORo6FTLfRo6oRXn234xCHIMpkMwYO8cT42DTEpWXj3j3P4bnT7Cq25kCQJf5+LwyfbL2qnGQho7oL5gS3KlFhOLpfh5fZ10K+VG1YevYFvD0QjM1cNc1M5Ojd0RPemTujexBl1HapH0jpjwaCGiKgGirh1H+NWhiPjYZK30lCayNHIuRYaO9dCYxdr7U/P2hYwUcj1Or6NuSm+GdkOg747hl0X4vHr8VsY6++l51mUzpWEdMx/pKmpnoMlFgS2RI9mzk+9bwszBab1aISRvnVx414mWrjZsDbGgBjUEBHVMKdupmDcynBk5qrh62WPF9u5w0Qug4lcDhOF+KmQy2CqkD38KUed2haoU9sSiqfMnfKo1nXsMKdfc3y47SI+3nYJ7evWRiuPollzyyojJx9f7buCVUdvapuapvdohMndGpR74FHbygy1q+AQ9ZqGQQ0RUQ0SfiMF41eFIytXDf8GDggZ38Gg89xN6OKFY9fuYd+lBExfdxp/v9EV1uZP178mNSsXG07exsojN7Qjjnq3cMHc58vW1ETVB4MaIqIa4sT1e5iw+iSyctXo0sgBP43tCAszwzaVyGQyfD6kNQYsO4Kb97Lw3pZILBvetkz9a64mpGPVsZvYfPqOtvNyPQdLLHihJXo0ffqmJqr6GNQQunfvjrZt22Lp0qWGLgpRjZaTr8bN5Cw41jIrdVK30gq7dg+vrD6JB3lqPNPYET+O7VBl+n7YWZph2Yh2GPp9GP4+exddGjpguG/dUm2r0Ug4dCUJK4/ewD9Xk7XLm7vZYEIXL7zY1r3EUVhkfBjUVGOBgYHIy8vDrl27irz3zz//oFu3bjh79ixat25dLsd78OABPDw8IJfLERsbC6WyfD90iWqKguHRUfHpiIpPx5WEdFyOV+HmvSyoNRJkMqBNHTs818wZzzVzRkt3m6caGXQsOhmv/HwS2XkadGvihB/G+FSZgKaAT73aeKdPUyzaeRnvb43ED4evw6O2BerUtoCHnQU8alvAw84SHrUt4GKtRE6+Br9H3MHPx27ierLIACyTAb2au+CVrvXhV9+eeWBqIAY11djEiRMxaNAg3LlzB3Xq1NF5b9WqVejQoUO5BTSAmGCyZcuWkCQJW7duxbBhw8pt30TG6kGuGhfj0nD+Thoi76oQFZ+Oq4npOrldHmWtNEF6Tj7O3E7FmdupWLL3ClxslA8DHBd0aeSgVx+YI1eTMfHnk8jJ16B7UyesGF31ApoCU55pgPN30rD9fByuJ2dqg5X/UshlMJHLtFMNWJubYFgHT4zr7MU+MzUcg5qSSBKQl2WYY5taiq8cT/D888/DyckJq1evxgcffKBdnpGRgU2bNmHx4sW4d+8epk+fjsOHD+P+/fto2LAh3nvvPYwYMULvYoWEhGD06NGQJAkhISFFgpoLFy7g3XffxeHDhyFJEtq2bYvVq1ejYcOGAMTs3V988QWio6Nhb2+PQYMG4ZtvvtG7HERV1aMBzPlYFc7HpiI6MQOaYlKcKk3kaOJijSYu1mjmao0mruKns7USiek5OHA5EaGXE3HkajISVDlYH34b68Nvw8xEDv8GDvCtbw9XGzELs4uNEi425kU62B6+koTJv5xCTr4GzzVzxnej21fpphi5XIZvRrbDuynNcOd+Fu6kPkDs/QeIfeRnXNoDbR6dBo5WGN/FC4Pa14HVYzIAU83Bv4KS5GUBn7ob5tjv3QXMrJ64momJCcaOHYvVq1fj/fff11a1btq0CWq1GiNGjEBGRgZ8fHzw7rvvwsbGBtu3b8eYMWPQsGFD+Pr6lrpI165dQ1hYGDZv3gxJkjBr1izcunUL9erVAwDExsaiW7du6N69O/bv3w8bGxscPXoU+fkiB8Z3332HoKAgLFq0CP369UNaWhqOHj1ahotDVLkkSUJSeg5SsnKRkpmL+5l5SMnKxf3Mh68fLo9Py8a1pOIDGCdrJbw9bNHKwxYt3KzR1NUGde1LHh7tYmOO4b51Mdy3LrLz1DhxIwX7LyUg9HIi7tx/gENXknDoSlKR7azMFHCxMYeLjTmcrJXYdSEeufkaBDR3xvJRVTugKSCTyVDXwbLEpHVqjfh9qLLz0MipVpEpGKhm4zQJKCHFfm5mlQ9qAODy5cto3rw5Dhw4gO7duwMAunXrhnr16uHXX38tdpvnn38ezZo1w+effw6gdB2F33//fVy8eBFbtmwBAAwcOBBt27bFggULRJHfew8bNmxAVFQUTE2LDsf08PDAhAkT8PHHH5fqvPTFaRKMhyRJVaYvxLWkDLy96Sz+jUkt9TbOjwQw3h628K5jCxeb8vmblCQJ0YkZ2H85EVcSMpCgyka8KhsJqmykZxefRK9XCxcsH9keZib6Jccjqio4TUJ5MLUUwYWhjl1KzZo1Q+fOnbFy5Up0794d0dHR+Oeff/Dhhx8CANRqNT799FP89ttviI2NRW5uLnJycmBpWfpjqNVq/Pzzz/jqq6+0y0aPHo23334b8+bNg1wux5kzZ/DMM88UG9AkJibi7t276NmzZ6mPSTWPRiPhkx2XsPrYTTR2rgWferXRvm5t+NSrjXoOlpUa6Gg0En4Ou4lFOy8jJ18DuQyobSmSq9lbmqG2lSnsrcxQ29JM+9Ohlhmau9mUWwBTHJlMJjL5ulgXeS8zJx8JqmwkqHK0wY6thSkGta/DgIZqDAY1JZHJSl1bYmgTJ07EG2+8geXLl2PVqlVo2LAhnn32WQDA4sWL8dVXX2Hp0qXw9vaGlZUVZs6cidzc3FLvf/fu3YiNjS3Sh0atViM0NBS9evWChYVFids/7j0iQAxlDvrtLLafiwMAXI5Px+X4dKw9EQMAcLAyQ/t6tbWBTus6thXW2TU29QHe2XQWx66JlPpdGznis8Gt4W5Xtf+OrZQmaOBUCw30mJSRyNgwqDECQ4cOxYwZM7Bu3Tr88ssveO2117Tfao8ePYoXX3wRo0ePBgBoNBpcuXIFLVq0KPX+Q0JCMHz4cLz//vs6yz/55BOEhISgV69eaN26NX7++Wfk5eUVqa2xtraGl5cXQkND0aNHj6c8WzI26dl5ePXXCBy7dg+mChk+GegNGwsTRNy6j4hb9xEZq8K9zFzsvZiAvRcTAAAmchlcbMzhaK2Es7USTjo/zbWvXWzMS53WX5Ik/HE6Fgv/uoD0nHyYm8rxXv/mGO1Xj/02iKoJBjVGoFatWhg2bBjmzJkDlUqF8ePHa99r3Lgxfv/9dxw7dgy1a9fGkiVLkJCQUOqgJikpCX///Tf++usvtGrVSue9sWPH4qWXXkJKSgqmT5+Or7/+GsOHD8ecOXNga2uL48ePw9fXF02bNsWCBQswdepUODs7o1+/fkhPT8fRo0fxxhtvlOeloGomMT0b41eexMU4FazMFPh+TAd0bewIAOjbyg2AqMWJjFXh9MMgJyLmPpLSc8SImNQHj92/jbkJfOs7wL+hAzo1sEdzV5tiA5TkjBy8t/k89jwMmtrVtcOSoW1R37F61NYSkcCgxkhMnDgRISEh6N+/P9zdCzs4f/DBB7h+/Tr69OkDS0tLTJkyBQMHDkRaWlqp9vvLL7/Aysqq2P4wPXv2hIWFBdasWYM333wT+/fvxzvvvINnn30WCoUCbdu2RZcuXQAA48aNQ3Z2Nr788ku8/fbbcHR0xODBg8vn5KlaupGcibErT+B2ygM41jLDqvG+8K5TdDJDpYkCPg+bniZD1KjEq7IRl5aNpPQcJKXnIPHhz6T0bJ3Xqux87LuUgH2XRLBia2EKv/r2D4McBzR1scbeSwl4b/N53MvMhalChpkBTfBqtwZ6zzpNRIbH0U/gyBljwN9h9XLuTiomrDqJe5m5qGtviV8n+qKeQ/nWiuSrNYi8q8Lx6/cQdu0eTt5MQVauWmcda3MT7aihZq7WWDK0LVq4P350BRFVLo5+IqJKdSw6GTfvZaGZmzWau9o8dpLEw1eSMHVNBLJy1WjlYYNV433hZF3+U26YKORo62mHtp52mPpsQ+SpNTgfm4bj1+/h+PUUnLqZgvTsfMhlwJRuDTGrV+NqkceFiErGoIaIyiwnX42Ptl3EmuMx2mVyGdDAqRZauts8fNiihZsNaluZ4c8zsXjrt7PI10jo0sgB34/pgFqVlAnWVCFH+7pi9NTr3YE8tQaRsWmwtzIr91oiIjIMBjVEVCZ37mdh2trTOHsnDTIZ0NHLHteTMpGckYPoxAxEJ2bgzzOFuZ7cbM0Rl5YNAAhs447Ph7Q2aM2IqUKOdnVrG+z4RFT+ytQTbvny5fDy8oK5uTn8/PwQHh7+2PWXLl2Kpk2bwsLCAp6enpg1axays7O17y9YsAAymUzn0axZM519ZGdnY9q0aXBwcECtWrUwaNAgJCQklKX4RPSUDl1JwvNfH8HZO2mwszTFqvEd8dur/jj1QQDC3+uJVeM74u3eTdCvlSvqPpxgsCCgmdDFC18Na8umHiIqd3rX1GzcuBFBQUFYsWIF/Pz8sHTpUvTp0wdRUVFwdnYusv66deswe/ZsrFy5Ep07d8aVK1cwfvx4yGQyLFmyRLtey5YtsW/fvsKCmegWbdasWdi+fTs2bdoEW1tbTJ8+HS+//HK5zh9UQ/pMGyX+7iqHRiNh2f6r+Cr0KiQJaF3HFt+Oao86tQszVDvbmMPZxhw9mhV+Hqiy83DxrgoWpgq0rmNbZaZBICLjondQs2TJEkyePBkTJkwAAKxYsQLbt2/HypUrMXv27CLrHzt2DF26dMHIkSMBAF5eXhgxYgROnDihWxATE7i6uhZ7zLS0NISEhGDdunV47rnnAACrVq1C8+bNcfz4cXTq1Enf09BRkCwuKyuL2W+rqawsMaN6cdM0UPm4n5mLmRvPaCdSHOVXF/MCW5SqxsXG3BSdGjhUdBGJqIbTK6jJzc1FREQE5syZo10ml8sREBCAsLCwYrfp3Lkz1qxZg/DwcPj6+uL69evYsWMHxowZo7Pe1atX4e7uDnNzc/j7+yM4OBh169YFAERERCAvLw8BAQHa9Zs1a4a6desiLCys2KAmJycHOTk52tcqlarE81IoFLCzs0NiYiIAwNKycueZobKTJAlZWVlITEyEnZ0dFAo2aVSEs7dT8fra04hNfQBzUzk+GeiNQT51DF0sIiIdegU1ycnJUKvVcHFx0Vnu4uKCy5cvF7vNyJEjkZycjK5du0KSJOTn52Pq1Kl47733tOv4+flh9erVaNq0KeLi4rBw4UI888wziIyMhLW1NeLj42FmZgY7O7six42Pjy/2uMHBwVi4cGGpz62glqggsKHqxc7OrsSaPiq73HwN1ofH4JPtl5Cr1sDLwRLfjfZBczfmciGiqqfCRz8dPHgQn376Kb799lv4+fkhOjoaM2bMwEcffYS5c+cCAPr166ddv3Xr1vDz80O9evXw22+/YeLEiWU67pw5cxAUFKR9rVKp4OnpWeL6MpkMbm5ucHZ2Rl5eXpmOSYZhamrKGppyFp2Ygd9O3cYfEXdwL1NMftqnpQsWD2kDG3M28RFR1aRXUOPo6AiFQlFk1FFCQkKJ35Lnzp2LMWPGYNKkSQAAb29vZGZmYsqUKXj//fchlxcdgGVnZ4cmTZogOjoagKhFyc3NRWpqqk5tzeOOq1QqoVTqn9BLoVDwBkk1UlZuPrafi8PGk7dx6tZ97XJnayWmPtsQE7p4sVmWiKo0vYIaMzMz+Pj4IDQ0FAMHDgQgZn0ODQ3F9OnTi90mKyurSOBSEDSUNGIlIyMD165d0/a78fHxgampKUJDQzFo0CAAQFRUFGJiYuDv76/PKRDRIyRJwvnYNGw4eRt/n7mL9BwxZYBCLkOPps4Y3tET3Zs6cR4kIqoW9G5+CgoKwrhx49ChQwf4+vpi6dKlyMzM1I6GGjt2LDw8PBAcHAwACAwMxJIlS9CuXTtt89PcuXMRGBioDW7efvttBAYGol69erh79y7mz58PhUKBESNGAABsbW0xceJEBAUFwd7eHjY2NnjjjTfg7+//1COfiGqiu6kPsO3cXWz59y4uxRV2oq9rb4lhHT0x2KcOXGw4hxYRVS96BzXDhg1DUlIS5s2bh/j4eLRt2xa7du3Sdh6OiYnRqZn54IMPIJPJ8MEHHyA2NhZOTk4IDAzEJ598ol3nzp07GDFiBO7duwcnJyd07doVx48fh5OTk3adL7/8EnK5HIMGDUJOTg769OmDb7/99mnOnahaSlRl42KcCk1dreFqY17qJqF7GTnYERmPv8/cRfjNFO1yMxM5+rVyxbCOnuhU3wFyOZuYiKh64izdRNXI7ZQsDF5xDAkqka7A3soMLd1t0OLhHEst3W1Q38FKG5ikZ+dhz4UE/HX2Lo5EJ0OtKfx3961vj8A27ghs7QY7SzODnA8R0ZNwlm4iI5SckYOxK8ORoMqBtbkJsnLVSMnMxT9Xk/HP1WTtepZmCjRztUZtSzP8E52M3HyN9j1vD1u80MYdz7dxg5stE00SkXFhUENUDaRn52H8qnDcSM6Eh50F/nitM+wsTREVn44Ld1W4cDcNF+6qcDlehaxcNU7HpGq3behkhRfaeCCwjRsaONUy3EkQEVUwBjVEVVxOvhqv/hqByFgV7K3M8OtEX7jaik68bTzt0MbTTruuWiPhRnIGLtxVIUGVjS6NHNHCzYZDsYmoRmBQQ1SFqTUSZm08g2PX7sHKTIHVEzo+trZFIZehkbM1GjlbV2IpiYiqBiafIKqiJEnC3D8jseN8PMwUcvwwtgNa17EzdLGIiKosBjVEVdSX+65i3YkYyGTAl8PaoksjR0MXiYioSmNQQ1QF/XzsJpaFXgUAfPhiKwxo7WbgEhERVX0MaoiqmL/O3sWCvy8AAGYFNMGYTvUMXCIiouqBQQ1RFXL4ShLe+u0MJAkY618Pb/ZsZOgiERFVGxz9RFQFZOep8fX+q/j+0HXkayQ839oNCwJbcig2EZEeGNQQGdg/V5PwwdZI3LqXBQAY4O2GL4a24RxMRER6YlBDZCDJGTn4aNtF/HnmLgDA1cYcC19siT4tXQ1cMiKi6olBDVEl02gk/HbqNoJ3XkbagzzIZcC4zl54q3dT1FLyX5KIqKz4CUpUia4mpOO9Ledx8uZ9AEBLdxsEv+zNpHpEROWAQQ1RJcjN1+Dr/Vex4tA15KklWJopENSrCcZ39oKJgoMQiYjKA4Maogp2MzkTb274F+fupAEAApo7Y+GLreBhZ2HgkhERGRcGNUQVaOu/sXh/y3lk5qpha2GK4Je90a+VK4dqExFVAAY1RBUgIycf8/6MxObTsQAA3/r2WDqsLdxZO0NEVGEY1BCVs/N30vDmhn9xIzkTchkwo2cTTH+uERTMO0NEVKEY1BCVE0mSEHLkBv636zLy1BLcbc2xdHg7+Na3N3TRiIhqBAY1RI+Rnp2Hw1eSoTSRw8bCFNbmJtqftcxMtFl/kzNy8M6mszgQlQQA6NPSBf8b1Bp2lmaGLD4RUY3CoIaoBBqNhMm/nMLx6ynFvi+TAdZKE1ibmyI9Ow+q7HyYmcgx9/kWGO1Xl52BiYgqGYMaohL8dOQ6jl9PgbmpHE1drJGenQ9Vdh5UD/KRq9ZAkgBVdj5U2fkAgMbOtfD1yHZo5mpj4JITEdVMDGqIinHxrgqLd0cBABYEtsRw37o672fnqaHKzhOBzoM85KkltK5jC3NThSGKS0REYFBDVER2nhozN/6LPLWEXi1cMKyjZ5F1zE0VMDdVwNnaAAUkIqJiMT870X/8b9dlXEnIgGMtJRa97M2+MURE1QSDGqJH/HM1CauO3gQALB7SGg61lIYtEBERlRqDGqKH7mfm4u1NZwEAYzrVQ4+mzgYuERER6YNBDRFE4rz3tpxHgioHDZys8F7/5oYuEhER6YlBDRGAP07HYmdkPEzkMnw1rB0szDiKiYioumFQQzXe7ZQsLPjrAgBgVq8m8K5ja+ASERFRWTCooRpNrZEwa+MZZOTko0O92pj6bENDF4mIiMqoTEHN8uXL4eXlBXNzc/j5+SE8PPyx6y9duhRNmzaFhYUFPD09MWvWLGRnZ2vfDw4ORseOHWFtbQ1nZ2cMHDgQUVFROvvo3r07ZDKZzmPq1KllKT6R1opD13Dq1n3UUprgy2FtOZM2EVE1pndQs3HjRgQFBWH+/Pk4ffo02rRpgz59+iAxMbHY9detW4fZs2dj/vz5uHTpEkJCQrBx40a899572nUOHTqEadOm4fjx49i7dy/y8vLQu3dvZGZm6uxr8uTJiIuL0z4+++wzfYtPpHXuTiq+3HsFALDwhZbwtLc0cImIiOhp6J1ReMmSJZg8eTImTJgAAFixYgW2b9+OlStXYvbs2UXWP3bsGLp06YKRI0cCALy8vDBixAicOHFCu86uXbt0tlm9ejWcnZ0RERGBbt26aZdbWlrC1dVV3yITFZGTr0bQb2eRr5HQ39sVL7f3MHSRiIjoKelVU5Obm4uIiAgEBAQU7kAuR0BAAMLCwordpnPnzoiIiNA2UV2/fh07duxA//79SzxOWloaAMDe3l5n+dq1a+Ho6IhWrVphzpw5yMrKKnEfOTk5UKlUOg+iAisOXkd0YgYca5nhk4HMGkxEZAz0qqlJTk6GWq2Gi4uLznIXFxdcvny52G1GjhyJ5ORkdO3aFZIkIT8/H1OnTtVpfnqURqPBzJkz0aVLF7Rq1UpnP/Xq1YO7uzvOnTuHd999F1FRUdi8eXOx+wkODsbChQv1OT2qIaITM7D8QDQAYH5gS9S2MjNwiYiIqDxU+ISWBw8exKeffopvv/0Wfn5+iI6OxowZM/DRRx9h7ty5RdafNm0aIiMjceTIEZ3lU6ZM0T739vaGm5sbevbsiWvXrqFhw6IjVubMmYOgoCDta5VKBU/PohMTUs2i0Uh4b/N55Ko16NHUCc+3djN0kYiIqJzoFdQ4OjpCoVAgISFBZ3lCQkKJfV3mzp2LMWPGYNKkSQBEQJKZmYkpU6bg/fffh1xe2AI2ffp0bNu2DYcPH0adOnUeWxY/Pz8AQHR0dLFBjVKphFLJeXtI12+nbiP8ZgosTBX4aGArNjsRERkRvfrUmJmZwcfHB6GhodplGo0GoaGh8Pf3L3abrKwsncAFABQKka1VkiTtz+nTp2PLli3Yv38/6tev/8SynDlzBgDg5sZv2lQ6ienZ+HTHJQDAW72boE5tjnYiIjImejc/BQUFYdy4cejQoQN8fX2xdOlSZGZmakdDjR07Fh4eHggODgYABAYGYsmSJWjXrp22+Wnu3LkIDAzUBjfTpk3DunXr8Oeff8La2hrx8fEAAFtbW1hYWODatWtYt24d+vfvDwcHB5w7dw6zZs1Ct27d0Lp16/K6FmTkPvz7IlTZ+fD2sMX4zl6GLg4REZUzvYOaYcOGISkpCfPmzUN8fDzatm2LXbt2aTsPx8TE6NTMfPDBB5DJZPjggw8QGxsLJycnBAYG4pNPPtGu89133wEQCfYetWrVKowfPx5mZmbYt2+fNoDy9PTEoEGD8MEHH5TlnKkG2n85AdvOxUEhlyH4ZW+YKJhMm4jI2MikgjYgI6dSqWBra4u0tDTY2NgYujhUiTJz8tH7y8OITX2AKd0acAZuIqJqRJ/7N7+uktFbsvcKYlMfoE5tC8wMaGzo4hARUQVhUENG7dydVKw6egMA8PHAVrA0q/AsBkREZCAMasho5ak1mP3HeWgk4MW27uje1NnQRSIiogrEoIaM1sojN3AxTgVbC1PMfb6FoYtDREQVjEENGaWYe1n4cp+Ygfv9Ac3hWIuJGImIjB2DGjI6kiTh/a3nkZ2nQacG9hji8/js1EREZBwY1JDRWXMiBv9cTYaZiRyfvsQZuImIagoGNWRUohMz8Mn2iwCA/+vTFA2cahm4REREVFkY1JDRyM3XYObGf5Gdp0HXRo54pcuT5xAjIiLjwaCGjMaSvVcQGauCnaUpvhjaBnI5m52IiGoSBjVkFMKu3cP3h68BABa97A0XG3MDl4iIiCobgxqq9tKy8vDWb2cgScDQDnXQt5WboYtEREQGwKCGqr25f0biblo26jlYYn5gS0MXh4iIDIRBDVVrW/+NxV9n70Ihl2HpsLawUnJuJyKimopBDVVbt1OyMHdrJADgzecao13d2gYuERERGRKDGqqW1BoJb/12Fuk5+fCpVxvTejQ0dJGIiMjAGNRQtbTi0DWE30xBLaUJvhzaFiYK/ikTEdV0vBNQtXPuTiq+3Csmq1zwQkvUdbA0cImIiKgqYFBD1cqDXDVmbjiDfI2E/t6uGNTew9BFIiKiKoJBDVUrS0Ov4HpyJlxtzDlZJRER6WBQQ9XGpTgVfvrnBgDgk5dawc7SzMAlIiKiqoRBDVULGo2EOZvPQ62R0K+VK3o2dzF0kYiIqIphUEPVwtoTt3DmdipqKU2YNZiIiIrFoIaqvARVNj7bFQUAeKdPU7jacrJKIiIqikENVXkf/n0R6Tn5aONph9Gd6hm6OEREVEUxqKEqbf/lBGw/HweFXIZPX2oFhZyjnYiIqHgMaqjKysrNx9ytFwAAE7vWR0t3WwOXiIiIqjIGNVRlLd13FbGpD+BhZ4GZAY0NXRwiIqriGNRQlXThbhpCjoicNB8PbAVLMxMDl4iIiKo6BjVU5ag1Et7bEgm1RsIAbzf0aOZs6CIREVE1wKCGqpw1x2/h7O1UWCtNMC+whaGLQ0RE1USZgprly5fDy8sL5ubm8PPzQ3h4+GPXX7p0KZo2bQoLCwt4enpi1qxZyM7O1muf2dnZmDZtGhwcHFCrVi0MGjQICQkJZSk+VWHxadlYvFvkpPm/vk3hYsOcNEREVDp6BzUbN25EUFAQ5s+fj9OnT6NNmzbo06cPEhMTi11/3bp1mD17NubPn49Lly4hJCQEGzduxHvvvafXPmfNmoW///4bmzZtwqFDh3D37l28/PLLZThlqsoW/n0BGTn5aOtph5F+zElDRESlJ5MkSdJnAz8/P3Ts2BHffPMNAECj0cDT0xNvvPEGZs+eXWT96dOn49KlSwgNDdUue+utt3DixAkcOXKkVPtMS0uDk5MT1q1bh8GDBwMALl++jObNmyMsLAydOnV6YrlVKhVsbW2RlpYGGxsbfU6ZKsmuyHhMXRMBhVyGbW90RXM3/p6IiGo6fe7fetXU5ObmIiIiAgEBAYU7kMsREBCAsLCwYrfp3LkzIiIitM1J169fx44dO9C/f/9S7zMiIgJ5eXk66zRr1gx169Yt8bg5OTlQqVQ6D6q6YlMf4N0/zgEAJj/TgAENERHpTa9xssnJyVCr1XBx0Z0h2cXFBZcvXy52m5EjRyI5ORldu3aFJEnIz8/H1KlTtc1PpdlnfHw8zMzMYGdnV2Sd+Pj4Yo8bHByMhQsX6nN6ZCB5ag3eWHcaaQ/y0KaOLYJ6NTF0kYiIqBqq8NFPBw8exKeffopvv/0Wp0+fxubNm7F9+3Z89NFHFXrcOXPmIC0tTfu4fft2hR6Pyu6LPVdwOiYV1uYm+GZke5iZcFAeERHpT6+aGkdHRygUiiKjjhISEuDq6lrsNnPnzsWYMWMwadIkAIC3tzcyMzMxZcoUvP/++6Xap6urK3Jzc5GamqpTW/O44yqVSiiVSn1OjwzgYFQiVhy6BgD436DW8LS3NHCJiIioutLrK7GZmRl8fHx0Ov1qNBqEhobC39+/2G2ysrIgl+seRqFQAAAkSSrVPn18fGBqaqqzTlRUFGJiYko8LlV9CapsBP12FgAwplM99Pd2M3CJiIioOtM793xQUBDGjRuHDh06wNfXF0uXLkVmZiYmTJgAABg7diw8PDwQHBwMAAgMDMSSJUvQrl07+Pn5ITo6GnPnzkVgYKA2uHnSPm1tbTFx4kQEBQXB3t4eNjY2eOONN+Dv71+qkU9U9ag1Et5c/y9SMnPRws0G7w9obugiERFRNad3UDNs2DAkJSVh3rx5iI+PR9u2bbFr1y5tR9+YmBidmpkPPvgAMpkMH3zwAWJjY+Hk5ITAwEB88sknpd4nAHz55ZeQy+UYNGgQcnJy0KdPH3z77bdPc+5kQF+FXsWJGymwMlPgm5HtYG6qMHSRiIiomtM7T011xTw1Vcex6GSMCjkBSQK+Gt4WL7b1MHSRiIioiqqwPDVETyspPQczNp6BJAHDOngyoCEionLDoIYqjUYjIei3M0hKz0ETl1pY8EJLQxeJiIiMCIMaqjTfHbqGf64mw9xUjuUj28PCjP1oiIio/DCooUpx6mYKluy9AgD48MVWaOxibeASERGRsWFQQ5Vi0c7LUGskvNTOA0N86hi6OEREZIQY1FCFu5KQjlO37kMhl2F2v2aQyWSGLhIRERkhBjVU4daHxwAAApo7w8XG3MClISIiY8WghipUdp4af0TcAQCM8K1r4NIQEZExY1BDFWrH+TiosvPhYWeBZxo7Gbo4RERkxBjUUIUqaHoa4esJhZx9aYiIqOIwqKEKcyUhHSdvig7CQzp4Gro4RERk5BjUUIUpqKXp2YwdhImIqOIxqKEKkZ2nxubTsQCAkX7sIExERBWPQQ1ViB3n45D2II8dhImIqNIwqKEKUdD0NLwjOwgTEVHlYFBD5e7qIx2Eh3ZkB2EiIqocDGqo3K1jB2EiIjIABjVUrh7tIDyCHYSJiKgSMaihcvVoB+Fu7CBMRESViEENlSt2ECYiIkNhUEPlhh2EiYjIkBjUULlhB2EiIjIkBjVULthBmIiIDI1BDZWLnZHsIExERIbFoIbKxboT7CBMRESGxaCGntqjHYSHdGAHYSIiMgwGNfTU1offBgA818wZrrbsIExERIbBoIaeSnxaNjacFE1PI9lBmIiIDIhBDT2V/+26jKxcNdrXtUP3JuwgTEREhsOghsrs1M0UbPk3FjIZsPCFVpDJ2EGYiIgMh0ENlYlaI2HB3xcAAMM6eMK7jq2BS0RERDUdgxoqk02nbiMyVgVrcxO83aepoYtDRERUtqBm+fLl8PLygrm5Ofz8/BAeHl7iut27d4dMJivyGDBggHad4t6XyWRYvHixdh0vL68i7y9atKgsxaenlPYgD5/tjgIAzAxoAsdaSgOXiIiICDDRd4ONGzciKCgIK1asgJ+fH5YuXYo+ffogKioKzs7ORdbfvHkzcnNzta/v3buHNm3aYMiQIdplcXFxOtvs3LkTEydOxKBBg3SWf/jhh5g8ebL2tbW1tb7Fp3KwdN8VpGTmopFzLYz1r2fo4hAREQEoQ1CzZMkSTJ48GRMmTAAArFixAtu3b8fKlSsxe/bsIuvb29vrvN6wYQMsLS11ghpXV1eddf7880/06NEDDRo00FlubW1dZF2qXFcT0vFL2C0AwPzAFjBVsAWTiIiqBr3uSLm5uYiIiEBAQEDhDuRyBAQEICwsrFT7CAkJwfDhw2FlZVXs+wkJCdi+fTsmTpxY5L1FixbBwcEB7dq1w+LFi5Gfn1/icXJycqBSqXQe9HQkSXQOVmsk9G7hgmc4xxMREVUhetXUJCcnQ61Ww8XFRWe5i4sLLl++/MTtw8PDERkZiZCQkBLX+fnnn2FtbY2XX35ZZ/mbb76J9u3bw97eHseOHcOcOXMQFxeHJUuWFLuf4OBgLFy4sBRnRaW1+0ICjkbfg5mJHB8MaGHo4hAREenQu/npaYSEhMDb2xu+vr4lrrNy5UqMGjUK5ua66faDgoK0z1u3bg0zMzO8+uqrCA4OhlJZtKPqnDlzdLZRqVTw9OS8RGWVnafGx9svAgCmPNMAdR0sDVwiIiIiXXo1Pzk6OkKhUCAhIUFneUJCwhP7umRmZmLDhg3FNisV+OeffxAVFYVJkyY9sSx+fn7Iz8/HzZs3i31fqVTCxsZG50Fl9+Ph67hz/wFcbczxeo+Ghi4OERFREXoFNWZmZvDx8UFoaKh2mUajQWhoKPz9/R+77aZNm5CTk4PRo0eXuE5ISAh8fHzQpk2bJ5blzJkzkMvlxY64ovJ1N/UBlh+MBgDM6d8MlmaVWsFHRERUKnrfnYKCgjBu3Dh06NABvr6+WLp0KTIzM7WjocaOHQsPDw8EBwfrbBcSEoKBAwfCwcGh2P2qVCps2rQJX3zxRZH3wsLCcOLECfTo0QPW1tYICwvDrFmzMHr0aNSuXVvfUyA9Be+8jOw8DTp61cYLbdwNXRwiIqJi6R3UDBs2DElJSZg3bx7i4+PRtm1b7Nq1S9t5OCYmBnK5bgVQVFQUjhw5gj179pS43w0bNkCSJIwYMaLIe0qlEhs2bMCCBQuQk5OD+vXrY9asWTp9ZqhinLh+D3+fvQuZDJgf2JLzOxERUZUlkyRJMnQhKoNKpYKtrS3S0tLYv6aUNBoJA74+gktxKoz0q4tPX/I2dJGIiKiG0ef+zcxpVKLwmym4FKdCLaUJ3u7N+Z2IiKhqY1BDJdp06g4AILCNG+ytzAxcGiIiosdjUEPFyszJx85IMSfXYJ86Bi4NERHRkzGooWJtPx+HrFw1GjhaoX1djjAjIqKqj0ENFev3CNH0NMinDkc8ERFRtcCghoq4dS8T4TdSIJcBL7f3MHRxiIiISoVBDRXxx8Namq6NneBma2Hg0hAREZUOgxrSodFI+ON0LAB2ECYiouqFQQ3pCLt+D7GpD2BtboLeLVwMXRwiIqJSY1BDOgo6CL/Qxh3mpgoDl4aIiKj0GNSQVnp2HnPTEBFRtcWghrS2n4tDdp4GjZxroa2nnaGLQ0REpBcGNaRV0PQ0mLlpiIioGmJQQwCAG8mZOHXrPuQy4KV2zE1DRETVD4MaAgD8HnEbAPBsEye42JgbuDRERET6Y1BDUGskbNbmpvE0cGmIiIjKhkEN4Wh0MuLSsmFrYYqezZ0NXRwiIqIyYVBD2g7CL7ZlbhoiIqq+GNTUcGkP8rD7QjwA5qYhIqLqjUFNDbft3F3k5GvQ1MUa3h62hi4OERFRmTGoqeGYm4aIiIwFg5oaLDoxHf/GpEIhl+HFdu6GLg4REdFTYVBTg/0eIYZx92jqBGdr5qYhIqLqjUFNDaXWSNjyb2HTExERUXXHoKaGOnQlEQmqHNS2NMVzzVwMXRwiIqKnxqCmhvo17BYAYFD7OjAz4Z8BERFVf7yb1UAx97Jw8EoSAGB0p3oGLg0REVH5YFBTA60NvwVJAro1cYKXo5Whi0NERFQuGNTUMNl5avx2UszIPYa1NEREZEQY1NQwO87H4X5WHjzsLPBcM05eSURExoNBTQ3z63HRQXikX10o5MwgTERExqNMQc3y5cvh5eUFc3Nz+Pn5ITw8vMR1u3fvDplMVuQxYMAA7Trjx48v8n7fvn119pOSkoJRo0bBxsYGdnZ2mDhxIjIyMspS/BorMjYN/8akwlQhw9AOnoYuDhERUbnSO6jZuHEjgoKCMH/+fJw+fRpt2rRBnz59kJiYWOz6mzdvRlxcnPYRGRkJhUKBIUOG6KzXt29fnfXWr1+v8/6oUaNw4cIF7N27F9u2bcPhw4cxZcoUfYtfo615WEvTr5UbnKyVBi4NERFR+dI7qFmyZAkmT56MCRMmoEWLFlixYgUsLS2xcuXKYte3t7eHq6ur9rF3715YWloWCWqUSqXOerVr19a+d+nSJezatQs//fQT/Pz80LVrV3z99dfYsGED7t69q+8p1EhpD/Kw9YyYFmGMPzsIExGR8dErqMnNzUVERAQCAgIKdyCXIyAgAGFhYaXaR0hICIYPHw4rK92hxAcPHoSzszOaNm2K1157Dffu3dO+FxYWBjs7O3To0EG7LCAgAHK5HCdOnCj2ODk5OVCpVDqPmuyPiDvIztOgmas1OtSr/eQNiIiIqhm9gprk5GSo1Wq4uOim1XdxcUF8fPwTtw8PD0dkZCQmTZqks7xv37745ZdfEBoaiv/97384dOgQ+vXrB7VaDQCIj4+Hs7PuSB0TExPY29uXeNzg4GDY2tpqH56eNbcPiSRJ2qan0Z3qQSZjB2EiIjI+JpV5sJCQEHh7e8PX11dn+fDhw7XPvb290bp1azRs2BAHDx5Ez549y3SsOXPmICgoSPtapVLV2MDm2LV7uJ6ciVpKEwxs52Ho4hAREVUIvWpqHB0doVAokJCQoLM8ISEBrq6uj902MzMTGzZswMSJE594nAYNGsDR0RHR0dEAAFdX1yIdkfPz85GSklLicZVKJWxsbHQeNVXBPE8vt/dALWWlxrFERESVRq+gxszMDD4+PggNDdUu02g0CA0Nhb+//2O33bRpE3JycjB69OgnHufOnTu4d+8e3NzcAAD+/v5ITU1FRESEdp39+/dDo9HAz89Pn1OoceLSHmDvJRGEcp4nIiIyZnqPfgoKCsKPP/6In3/+GZcuXcJrr72GzMxMTJgwAQAwduxYzJkzp8h2ISEhGDhwIBwcHHSWZ2Rk4J133sHx48dx8+ZNhIaG4sUXX0SjRo3Qp08fAEDz5s3Rt29fTJ48GeHh4Th69CimT5+O4cOHw93dvSznXWOsD78NtUaCX317NHGxNnRxiIiIKozebRHDhg1DUlIS5s2bh/j4eLRt2xa7du3Sdh6OiYmBXK4bK0VFReHIkSPYs2dPkf0pFAqcO3cOP//8M1JTU+Hu7o7evXvjo48+glJZmEtl7dq1mD59Onr27Am5XI5BgwZh2bJl+ha/RslTa7A+PAYAh3ETEZHxk0mSJBm6EJVBpVLB1tYWaWlpNaZ/zbZzdzF93b9wslbi6LvPwcyEs2IQEVH1os/9m3c5I1bQQXhER08GNEREZPR4pzNSVxLSceJGChRyGUb41TV0cYiIiCocgxojVZBsL6C5M9xsLQxcGiIioorHoMYIZeTkY/Pph/M8dfIybGGIiIgqCYMaI5OTr8a8rZHIyMlHA0crdG7o8OSNiIiIjADTyxqRxPRsTP01AqdjUiGXAW/1bgq5nPM8ERFRzcCgxkicu5OKV3+NQFxaNmzMTfD1yPZ4tomToYtFRERUaRjUGIE/z8Ti/34/h5x8DRo6WeGncR1R39HK0MUiIiKqVAxqqjG1RsLi3VFYcegaAOC5Zs5YOrwtbMxNDVwyIiKiysegpppSZedhxvp/cSAqCQDweveGeKt3UyjYh4aIiGooBjXV0PWkDEz65RSuJ2VCaSLHZ4Nb48W2HoYuFhERkUExqKlmIm6lYPyqk0jPzoebrTl+GNMB3nVsDV0sIiIig2NQU80s2nkZ6dn58KlXGytG+8DJWvnkjYiIiGoAJt+rRpIzcnDq1n0AwNcj2jGgISIiegSDmmpk38UESBLQuo4t3O04nxMREdGjGNRUI3suJgAAerdwMXBJiIiIqh4GNdVERk4+jkQnAwB6t3Q1cGmIiIiqHgY11cShqCTk5mtQ39EKjZ1rGbo4REREVQ6Dmmpiz8V4AKLpSSZjgj0iIqL/YlBTDeTma7D/ciIAoHdL9qchIiIqDoOaauD49XtIz86HYy0l2nnWNnRxiIiIqiQGNdVAQdNTrxYukHNuJyIiomIxqKniNBoJewuGcrPpiYiIqEQMaqq4s3dSkaDKQS2lCTo3dDB0cYiIiKosBjVVXEHCve5NnaA0URi4NERERFUXg5oqbs+Fh0O5mXCPiIjosRjUVGHRiRm4lpQJU4UMPZo6Gbo4REREVRqDmiqsYNRT54aOsDY3NXBpiIiIqjYGNVXYngsc9URERFRaDGqqqPi0bJy5nQqZTOSnISIiosdjUFNF7b0kamnaedrB2drcwKUhIiKq+hjUVFEc9URERKSfMgU1y5cvh5eXF8zNzeHn54fw8PAS1+3evTtkMlmRx4ABAwAAeXl5ePfdd+Ht7Q0rKyu4u7tj7NixuHv3rs5+vLy8iuxj0aJFZSl+lZf2IA9h1+4BAPowqCEiIioVvYOajRs3IigoCPPnz8fp06fRpk0b9OnTB4mJicWuv3nzZsTFxWkfkZGRUCgUGDJkCAAgKysLp0+fxty5c3H69Gls3rwZUVFReOGFF4rs68MPP9TZ1xtvvKFv8auFg1GJyNdIaOxcC/UdrQxdHCIiomrBRN8NlixZgsmTJ2PChAkAgBUrVmD79u1YuXIlZs+eXWR9e3t7ndcbNmyApaWlNqixtbXF3r17ddb55ptv4Ovri5iYGNStW1e73NraGq6uxl9zwVFPRERE+tOrpiY3NxcREREICAgo3IFcjoCAAISFhZVqHyEhIRg+fDisrEqugUhLS4NMJoOdnZ3O8kWLFsHBwQHt2rXD4sWLkZ+fX+I+cnJyoFKpdB7VQXaeGgejRK0Xm56IiIhKT6+amuTkZKjVari46NYguLi44PLly0/cPjw8HJGRkQgJCSlxnezsbLz77rsYMWIEbGxstMvffPNNtG/fHvb29jh27BjmzJmDuLg4LFmypNj9BAcHY+HChaU8s6rj2LVkZOaq4WpjDm8PW0MXh4iIqNrQu/npaYSEhMDb2xu+vr7Fvp+Xl4ehQ4dCkiR89913Ou8FBQVpn7du3RpmZmZ49dVXERwcDKVSWWRfc+bM0dlGpVLB09OznM6k4jza9CSTyQxcGiIioupDr+YnR0dHKBQKJCQk6CxPSEh4Yl+XzMxMbNiwARMnTiz2/YKA5tatW9i7d69OLU1x/Pz8kJ+fj5s3bxb7vlKphI2Njc6jqlNrJOx9OCs3m56IiIj0o1dQY2ZmBh8fH4SGhmqXaTQahIaGwt/f/7Hbbtq0CTk5ORg9enSR9woCmqtXr2Lfvn1wcHB4YlnOnDkDuVwOZ2dnfU6hSjsdcx/3MnNhY24C3/r2T96AiIiItPRufgoKCsK4cePQoUMH+Pr6YunSpcjMzNSOhho7diw8PDwQHByss11ISAgGDhxYJGDJy8vD4MGDcfr0aWzbtg1qtRrx8SLxnL29PczMzBAWFoYTJ06gR48esLa2RlhYGGbNmoXRo0ejdu3aZT33Kqcg4V7P5i4wVTAvIhERkT70DmqGDRuGpKQkzJs3D/Hx8Wjbti127dql7TwcExMDuVz3hhwVFYUjR45gz549RfYXGxuLv/76CwDQtm1bnfcOHDiA7t27Q6lUYsOGDViwYAFycnJQv359zJo1S6fPTHV38a4Kv526AwDow6HcREREepNJkiQZuhCVQaVSwdbWFmlpaVWuf82lOBVG/ngc97Py0NbTDr+96g8zE9bUEBER6XP/5p3TwC7HqzDqpxO4n5WHNnVs8fMrvgxoiIiIyoB3TwOKik/HyB9PICUzF63r2OKXiX6wtTA1dLGIiIiqJQY1BnIlIR0jfzyOlMxceHvY4tdXGNAQERE9DQY1BnD1YUBzLzMXrTxssGaiH2wtGdAQERE9DQY1lSw6MR0jfjyB5IxctHBjQENERFReGNRUoujEDAz/4QSSM3LQ3M0Gayf5wc7SzNDFIiIiMgoMairJtaQMjPjxOJIzctDM1RprJ/mhthUDGiIiovLCoKYSpGfnYfRPJ5CULgKadZM7wZ4BDRERUbliUFMJVhy6hri0bNS1t8TaSX4MaIiIiCoAg5oKdjf1AX765wYA4IMBzeFQS2ngEhERERknBjUV7PM9UcjJ18C3vj16teCcTkRERBWFQU0FioxNw5Z/YwEA7/dvDplMZuASERERGS8GNRVEkiR8uuMSJAl4oY072njaGbpIRERERo1BTQU5GJWEY9fuwUwhxzt9mhq6OEREREaPQU0FyFdr8OmOSwCA8V284GlvaeASERERGT8GNRXgt1N3cDUxA3aWppjWvZGhi0NERFQjMKgpZ5k5+Viy9woA4M3nGnNeJyIiokrCoKacfX/4OpIzclDPwRKjO9UzdHGIiIhqDAY15Sg+LRs/HL4GAHi3bzOYmfDyEhERVRbedcvRkr1RyM7ToH1dO/Rr5Wro4hAREdUoDGrKyaU4FTZF3AEAvD+gBRPtERERVTIGNeUkeOdlSBIwwNsNPvVqG7o4RERENQ6DmnJw6EoSDl9JgqlChv/ry0R7REREhsCg5impNRKCHybaG9PJC/UcrAxcIiIiopqJQc1T+uP0HVyOT4eNuQneeI6J9oiIqIbKyTB0CRjUPK1nGjtiUPs6eLNnY9S2MjN0cYiIiCpfyg3g6/bAyRCDFsPEoEc3Am62FvhiaBtDF4OIiMgwHqQC64YCGQnA6Z+BdmMAE8N8yWdNDREREZWNOg/4bSyQfAWw8QBGbDRYQAMwqCEienqSBKQnGLoURJVLkoBts4AbhwCzWsDIjYCNm0GLxKCmPEgSoM43dCmIyFAO/Q/4oglw/ndDl4So8hz9Cvj3V0AmBwavBFy9DV0iBjVPLe4s8HMgcOCTij+WOg84+RPw+ytAyvWKPx4RPVm2Cjj2jXh+/FvDloWoslz8C9g3Xzzvuwho0sew5XmoTEHN8uXL4eXlBXNzc/j5+SE8PLzEdbt37w6ZTFbkMWDAAO06kiRh3rx5cHNzg4WFBQICAnD16lWd/aSkpGDUqFGwsbGBnZ0dJk6ciIwMww8fQ1oscPMf4Ph3QHp8xRxDkoCLfwLL/YDtbwGRfwBrBgNZKRVzPCIqvX/XALnp4nlsBJB42bDlIaposRHA5iniue8UwO9Vw5bnEXoHNRs3bkRQUBDmz5+P06dPo02bNujTpw8SExOLXX/z5s2Ii4vTPiIjI6FQKDBkyBDtOp999hmWLVuGFStW4MSJE7CyskKfPn2QnZ2tXWfUqFG4cOEC9u7di23btuHw4cOYMmVKGU65nDXtB3j6AfkPRBV0eYs5DoT0Fh2xUq4Blo6AtZt4vnEMkJ9b/sckotLRqIETK8Rzpa34eWat4cpDVNFSbwPrR4h7XuPeQJ9gQ5dIl6QnX19fadq0adrXarVacnd3l4KDg0u1/ZdffilZW1tLGRkZkiRJkkajkVxdXaXFixdr10lNTZWUSqW0fv16SZIk6eLFixIA6eTJk9p1du7cKclkMik2NrZUx01LS5MASGlpaaVaXy83j0rSfBtJWlBbkpKjy2efSVckaf1Isd/5NpL0saskhX4sSdkqSYq/IEmfeIjlm6dKkkZTPsckIv1c+FP8Hy7ykqSzv4nnixtLUn6eoUtW+bJVNfO8a5IHaZK03F/8nS/3F7/zSqDP/Vuvmprc3FxEREQgICBAu0wulyMgIABhYWGl2kdISAiGDx8OKysxncCNGzcQHx+vs09bW1v4+flp9xkWFgY7Ozt06NBBu05AQADkcjlOnDhR7HFycnKgUql0HhWmXmcRsUpqYP/HT7ev9ATRm3y5H3B5m+iA1X4c8MZp4Ln3AaU14NICGLoakCmAs+uAf77Q/zgaNRC1U0TdRFQ2BX1oOrwCtHgRsHQQuTquhRq2XJUt/jywpAWw5iVDl4Qqijof+H0CkHgBqOUiRjoprQ1dqiL0CmqSk5OhVqvh4uKis9zFxQXx8U/uTxIeHo7IyEhMmjRJu6xgu8ftMz4+Hs7Ozjrvm5iYwN7evsTjBgcHw9bWVvvw9PR88gk+jZ7zAciAC5uBu2fKto+TIcCydsCplSJAatIPeC0MeGFZ0WFyjQKA/p+J5/s/Ev1sSuv+LWD1AGD9cGBlnyqR2pqo2ok9DcSEAXJToOMkkZvDe6h4ryY1QeVmAb9PBHJUwI3DQPLVJ29D1YskAbveBaL3ASYWwIgNgF0F31PLqFJHP4WEhMDb2xu+vr4Vfqw5c+YgLS1N+7h9u4JrJFxbAd4P+wmFLtR/++hQ0Qk4LxNwbw+M3w6M3AA4Nyt5m46TgE6vi+dbXgNul9xhG4D4wzy7Afiui/gwBgBVbMX0BSIydgW1NK1eLvzS0Xak+Bm1s+Z05N87D0iOKnx9YavBikIVQHUX+HOaGHkLGTDoR8CjvaFLVSK9ghpHR0coFAokJOgmmUpISICrq+tjt83MzMSGDRswceJEneUF2z1un66urkU6Iufn5yMlJaXE4yqVStjY2Og8KlyP98S3tmv7geuHSr+dKu5hT3IJaD8WmLwf8Opaum17fyxqdNQ5ovPW/ZvFr5eVIqoOt7wqRmp4+gEDHjZbHf8WSLhY+vIS1XSqu8CFLeJ5wRcLAHBrLXJ1qHNrRs6aqF3AyR/F89bDxM+C60LVW7YKCP0IWNa+sOax98dA80DDlusJ9ApqzMzM4OPjg9DQwvZijUaD0NBQ+Pv7P3bbTZs2IScnB6NHj9ZZXr9+fbi6uursU6VS4cSJE9p9+vv7IzU1FREREdp19u/fD41GAz8/P31OoWLZ1wc6TBDPQxeKmpEnUeeLvDNZyYCLN9DvM0AmK/0x5Qpg0E+Aa2uxj7VDxTwcj7p+UNTOXNgCyE2A5z4Axu8QNT3Nngc0+aKWqDTlLY4kAXnZT16PyFiE/yD+b+p1Adzb6r7XdpT4aexNUBmJ4hs8IAK7fv8TX+oSLwBJUY/flqqu/FzgxA/AsrbAP5+LUU6enYCJe4HO0w1duifSu/kpKCgIP/74I37++WdcunQJr732GjIzMzFhgriZjx07FnPmzCmyXUhICAYOHAgHBwed5TKZDDNnzsTHH3+Mv/76C+fPn8fYsWPh7u6OgQMHAgCaN2+Ovn37YvLkyQgPD8fRo0cxffp0DB8+HO7u7mU47QrU7R3A1EqM47/095PXP/AJEHMMMLMGhv4MmFrof0zlw/TU1m6iGnjTeJGoLz8H2P0+8MuLQPpdwKERMHGPKKPi4VymfRcBppaiDGc36H/s3CyRfPDLFkDcOf23J6pucjOBU6vE80draQp4DxFfHuLOAAkXKrVoestKEZ9TuVn6bSdJwNbXxRcp55aiT6FFbaDhc+J91tZUDfGRor9l3Nkn/44lSTQdfusH7HwHyLon7hnD1gKv7AI8K77bSHnQe5buYcOGISkpCfPmzUN8fDzatm2LXbt2aTv6xsTEQC7XjZWioqJw5MgR7Nmzp9h9/t///R8yMzMxZcoUpKamomvXrti1axfMzc2166xduxbTp09Hz549IZfLMWjQICxbtkzf4le8Ws6A/zTg8GdA6IdA0/6FAcR/Xd0HHFkinr/wFeDQsOzHtXEXgc3KfsD1A6I5KylKfGsCxOiM3h8DZla629l5As/+H7BvAbDnA6BpX/HhVBoajWjOuvmPeP3HJGDKQcDMsuznQVTVnV0PZKcCtb1Enqr/snIEmvQVoxfPrAP6VEK2cX1JkjiP3e8DD1IAl1bAsF8B+wal2z78RyB6L6BQippi04ef1S1fAq7uFkFN99kVV356soSLwE8BoqalgG1dwLEx4NjkkZ9NRIb6vXOBOyfFelZOQPc5ojuEwtQw5S8jmSSVtc2helGpVLC1tUVaWlrF96/JVgFftREfFoHLAJ9xRddJiwVWdBXrdJgIPL+kfI4dtVP0rcHDX6ulI/DiN8V/+BbIzxVlSY7Sryx75wNHlwIKM0BpI761dZwMDPj8ac+CqGrSaIDlvsC9q0Df/wGdpha/3uUdwIYR4uYQdKlq3RiSr4q0EQVfRiADIInkgS//IL7YPE7iJeD7Z0U/vn6LAb9HkqBmpwGLG4k+Ra8fB5ybV9RZlI8HqcCvA0XtW91OQF1/8bN2ff26AVQ1ORnAjz3EzNnW7kB+trjXPImpJdD5TdHMVIWGa+tz/+bcTxXB3Abo9rZ4fnARkPdA9311nuhH8yBF9IXp82n5Hbtpv4f9cuTi2+LrYY8PaAAxFLWg0/CplaLp7EkifhYBDQC88I34MAREp8GoXWUuPlGVFr1PBDRKG6DdqJLXa9xLBDSZSWKbqiA/R3wefddZBDQmFkCvD4GZ54A6vkBOGrB+GHDgU5HHqjh52aJGVp0jcnP5TtZ939xWpJsAqkcT1L9rgLv/ipv/6V+Ara+JtBpfNBVZ3I+vECk6qtOExZIEbA96GNC4AVP/Ad69AbxzHZiwS3zR9p8ONO7zMHiTi4fPeODNf4Eec6pUQKMv1tRUlLxs4JsOQNpt8cHRZUbhewU1HEob4NVDpa/y1UduZtGmpifZPAU4txFwaytGYMkVxa93/SCwZpDoKPnsbPFPAAC73gOOLxe1Q6+HiaY4osqWmwVc+kvcVOs/C/gX0++lrH55Ufz9+09/crPS7veBsG9EZ/zhBu40fOMfUTtz72EOmUa9RI1qbS/xOj8X2PO+6AANAA17imYlS3vd/ZTmf/zcb8DmyaJZY1p41a3x0GiAb3xE04vfVMBEKaaliT0NaPJ01zWrJQLVPsFFc4aVliQB5zeJfisBCwCnJk97BsU7/Qvw1xsiUBm/XSSHfZy8bHG+VTiQ0ef+zaCmIv27FvjzdcDcDphxFrCwA67sBtY9TNA19BeRhbSqSE8AvukovrH1/7zotzBA9NP5qZdYp9Vg8cFX8KGVlw381BNIiBQfmqM2Vd0PNDI+cWfFB/q5TeLvs8Aru0WTwtNKuCBqOWRy8f9sV/fx68dHAiu6iE7Db0WJvjaVLfOe6CtRMBKrlosYpdRiYPH/m2c3An/PEP0w7OoCQ38tHN0VHQqseVk8H/lbybMyZ6seNkHlAFOPihxe+shIFIMOPH1FrXdFubYf+PUl8eXyrcuFXwLzHojam5gwEeTEnCj8e7KoLWo6Wryg37GyUkTtSUHtVdMBwIh15XcuBeIjxWdwfjbQcx7wzFvlfwwDYPNTVdFmOODUTHQqPPqVmJJgy8PZTH1frVoBDQBYuwA954rnoR+JD5dHZSYDa4eIf3DPTsCLy3U/GE3NRZBjYi46EYb/WHllp5opO00kBfu+m3ic/En8fdrVE3+jgPjWmp/z9McqSLbX/IUnBzSAuJm7tRE1mobIWXNpm6gtPrMWgEykcJh+UnTmLenLRpthwKR9olkiNUZMpvvvGhEcbX1NrNNxcskBDSACkca9xHN9m6DU+aI2bO0gYHFDYM1gMdIsPeHJ2+rrZIj42WaEbq22qYWo3XjmLfHF7N2bwKT94nf54D7w2xhg6zQgJ710x3k0pYbsYe33lV0i11F5ykkHNo0TAU2jXkCXWeW7/2qCQU1FkitEtAwAx78DNo4W/xTu7YDeHxm2bCXp8Ir4581JA/bMLVyelw1sGAmk3hJV1sPXFo54eJRzc6DXw3Pb84HoVFgZJElUI59ZJ25iy/2A38aJKmYyLpIE3AoDtkwFPm8qcizFnRUd1lsNAsb+Cbx5RmTktnIWfQvKMj/aozKSRA0QIEY3llbbh3m5zqx5uuPr68pu0SekYGTTxL2i35y57ZO3dW0lRjE26StqW/6cJgLGjATAsWnpPrtaPpwD6sIW/fJf/fsLkHgRgEx0No7eC2ybKfq4/NQLOLIUSI4u/f5KknYHiNohnnec+Ph15XKgjg8wcR/QdZYo25k1YnBFTPFzDwIoPqXGpL1A3c5iGpx/y/FvQpKAv2cC96IBGw/gpe9FuWsgNj9VNEkS33buPJzCQGkLTD1c2JZdFd2JEFWYkB62yXYRnQMjfxcfihP3Pb49WJJEE9vVPeIDdVJo8QHQ01DnA/HnRPXw7ePiZ0Yx3+Ym7gM8O5bvsSuKJIlrZmZV+ozSNU3qbWDHO8CVnYXLnJqLEYathxXtA3Jhq/j2KjcVHSbLOhrn4CLgYDDg0QGYrMdklVkpwOdNRJ+FV/8RGYcrWswJcSPNfyCuyYvLyzb6SqMRweCBTwBIImicFFq6c8jJEDUt+dmlP++cdNFJNzNJjCxr2EMMi7+8vejgBcemogmo6yz9+w4CwP5PRNoNr2eA8dv02/bmUVHjnnZbNEV2e+dh7q9HrnHCRdGvKCFSvH40pcbZjcCWKYCtp2jGLKnvoj5OrRLBn0wBTNhRPs2tVQibn6oSmUx0CiswcHnVDmgA8a2kIDPy9rdEvp3I30XfgKG/PrmDm0wmPkgtHcU/deiH5Ve21BgxZH1RXTFkcfcc4OKfIqCRm4rpH7rMAOp3E+tXhxEYAHDvGvDLCyIY/Dmw8mq4KtPpX0XtWfQ+/bNXq/OBY9+IGrgrO8Xvut0YcZN9PQzo9FrRgAYQTbxNB4ig4q83Sh7V8zh52Q/nvYH+nY4t7QtHH55dr/+x9ZVwEVg3RAQ0jXuXPaABxDf9Z98BRv8uRke98E3pgzJlLXF8oPT/g0eWioDGvqEIApyaiiagyfvFsPgBX4jkfnITkX7i8GJg+9v6n1d+LnD6Z/H8SbU0xfHqArx2VASMkkbMnbeyj/gf1miAsG+BH7qLzz5LRzH54/NfFgZfLV4U/SzTbot+PU8r7hyw813xvOc8owto9MWamsry71rx4dJ6aOUfuywe3Ae+7iByzxR44Rug/ZjS7+PRTtGjNwONej5dmaJDgT8mirIBotarrl9hfgn3doUZmQvyhFi7A7MuVN2q2Pwc0d/q8Oeiqr9AVRgxU57uRAAhAeImAIhUBl1niQ/4J31TjT0tOq/GP8xYXdcfeH7p4yd7fZTqLvCNr5jz7L95VUrj3zWiCcamjvhmXVIyzZIU/B9YOgBBl0UKhYpQ0AcmPU4E92O2GjYRZuRmMd9c7fpiqPDjBg2kxQJftxc1O8PWPH5+oQepwMWt4m8CEIFtnQ76l6uWi/hseJocQud/Fx2As9NEjheXloUJ7Br3ETnCihshtmuO6KP1tB2Gs1UigEq5Jo43YkPV/ax7CqypqYrajao+AQ0gevk/2nbedZZ+AQ0gOhN2fDiCautrorNhWWg04lvZmkGFfZKmHBId+EZtEt/m6nXWnWKi4XNiVEP63cKmv6rm5lFgxTOiel+dI8o88jdRpX1525NnXa8MWSnAoc9EQFlWeQ+ArVNFQOPSSkwjEn9O3Fi+9hFV58XNHZatEt9Af+op1je3A174WsxbVtqABhDZtnstEM9DF4omrNK6fVKkYABEMKRvQAOI4dFWziLt/NXis6o/tcxkMZInPU40x43YYPjM3k36iBv9/RtiyojH2f+RCGjqdhYB/eNY2ImcKm1GiNc7/0+/vnOnVoqf7cc9fVJE78HAa8dEM1ZelghoTCyAAUtEhveS0lr4jBc/n6bDsCSJwC7lmgi4X1phlAGNvngFqGRtRoimnK5BwHPzyraP3h+J9u+MBFH9r2/F4INU0UF5/8cAJPFhMGGXGGb6uH9gU3MxRQVQ9ZqgslKAP6cDq/uLanQrJ2BQiKjNatKncELEfQvKPsno05IkkW/km44i6Fo37PGdIh/nwCeis24tF2Dc38CsSKD7e4CFvbjhbZsJfNVaND9kq8SxL/0tmppOrBDBUOthwPRTIm17WT64fV4Ro6FyM8Q369Jc1wtbgZ+fF7WVrq1Fk0hZKEzEqCJAdGQvbznpwNrBopOorScwZnPxTXGVzcyqcJTU4/4H754pnHeu98elTwMRsEDkj4mNAM6Vct66xMsi8aBMURhYPC3bOsDYv0Q/oFaDRN+tjhMffx5OTZ++w/CpEODCZtEcN2RV1fidVwEMaqhkMplIHBgwv+zfAEwtxDBvhRkQtV2MGDjxvbixP0l8pKhavbJTzDHzwjdA4Fel73SsHYGxtWqMgpIk0Unwm47Av7+KZT7jxTBb78GFH4LdZ4vzvXXUMNlo710TqeM3TxY3dFNL0SfltzGAKk6/fcWcEH1hAPG7s7QXj+7viuCm7//Et8yMBGDffODLVsCq/mKkYPpd0XQxZqvIWF3LqeznJJcDLywTf4dX94hJ/koiSSLAKhge27gPMGHn0yUnKwhUr+4WI6nKS34OsGGUyKti6QCM2SJqpqqKJ42CkiQxShKSyHtVx6f0+7Z2Lczcvm9B6YZYn3o4jLtpP8DWo/THehK5XEyZMXilmFOpNAqCqtO/6N/XK/GyaMICRHBXTSabrAwMaqjiubUW1bEKpeg8t/P/gC+aiRFVNw4XH3Cc3SgmY7t/Q0zCNnG3/s1fDXuIfjcZ8SKRliHlZormsy1TRKDg1FwkhQv8qugEorZ1Cvt97FtYeQFZfq5o5vvWX+TWMDEHnpsr+h04txCBx29jSp/zJTfrYW4TCWgzsuh0HWZW4kYw4wwwcIXI6ZSTJmaMl5sCz7wtOgE37FE+5+fUVOwTEM1axQXW6jxRpb/vYZOT76vAiPWi4+vTcG4OuLcXOWt2zxH9hJ62Fk6jFlnAbxwSTXqjNpX+hlpZGvUSZUuNAe6eLvr+ld2i5kShLEx/oY9Or4uM7BkJol/a4+RkFNYIlaWDcHkra4dhjQb4+00x5L1RL5HdmrQY1FDlaD8GeDtKdNR0aSX6kJzfJEb6fN1eDB1Njxc31h3viJt//gPRH+HVQ6Ifjb5MlEDzh+3zhm6C+mcJcC1UBAo95wGvHn78KIWuQaJPUML5x9cqlJdbYcD3z4hmPnUO0KCH6CvQ7W1RszJ8rRjOf+ekCEpLI/RD0d5v7Q70DS55PYUp0HYE8FoYMHydSFk/9R+RCPLRflLloessEVBmJYscIo/KThPJJU//LPo19f0f0P+z8hlyCxTeSM9vEiP3vmwpRu9cOyCCKX1Ikvg9XNwqAsDhawAPPWo5KouZZeEEmf/9H1TniWzHgAhua9fTf/8mysK5845/K2oZS3J+E5CjEqOr6nfX/1jlzdQcaDtSPD+1qvTbnQoBbp8QTW+BS5m1/T84+okqnySJ6vLTv4jRA7kPq41lClElnBojXnf7P9EU8zQ3lat7RX8DK2eRCr28blD6SLkh+oeoc4BhawsDrSc5/LnoQFnbC5h2smJGzWSliFqJ07+I11ZOYn6bR5vDClzdJ64lJDH6qGDYf3FuHgFWDxDPR/0BNA4o/7KX1e1wMUoIkmjaathD/M2tHQokXRLNbYNXPnki2LK4sFX0g7i6D8jLLFxubiuauZoNEBNCKmuJb+TZqaKD8X8f8ZEizQJkoqytXi7/spaXS9uAjaNEf5+Z5wv/rk7+JFJGWNiL2rrSJAYsjiSJWtBroUCTfiLpYnHrrHhGfEno86l+CRQrUlKUmPVdphDNsU9qOky7AyzvJD4zS5rKxghx7qdiMKiponIzxQf96V9EEj1ANBm9/EPhN7ynkZ8LfN5Y3BzGbQPqP/P0+9TXhlFiNFOD7uImWtpvVrmZIhlZRkLFfIAlRYnAI/NhH4/240T7/OM6HP7zhaiBkZuKxIx1/Yquk5Mh5khKvSU69r7wdfmWuzzs+D8g/HsxncLA78RIrIwEoJarGLVSMN9RRcnLFs1Gl7eJ9AOPpk5QKEX/nQcphUPgS1Idbmx52SIRX25GYTLMbJX4285KLtsw+/9KugJ85y+a90b/UThTeIHb4UBIL1FTGnSpanWqXdlPNLn2+EDkBSqJJAHrh4sRU3V8RfN1DRntxCHdVH2YWYnh7hN3ixl9e38iMi6XR0ADiNoNQzZBXT8oblwyhWjO0Keq2MwKePZhU8+hz0SwUJ4OfSYCGofGoiPsC8ue/GHfNUj0BXhcx+F980VAY+spfp9VUc+5ooNy6i0xCi0jAXBuKbIFV3RAA4imhyZ9RMD39hUxos9/uqiVU+eIm31BQKO0Ecs9fERCuzYjxLrD11f9gAYofiTikS/FOTo0enyNX2k5NRH9nwDRgfa/zXkFyRNbDa5aAQ3wSIfhnx/fYfjCFhHQyE3F300NCWj0xZoaMn7R+0T1tKWjmC25LLlGykKdL0Z7JV0S/UT6/a8M+8gTo6Xu33jyNzl9ZCQCS1qI4GTKIf1u5DkZohN30iXxjXH8NtG3ARBB3C8PJ2otaNqpqh5NDtkoABi8qmJnhS4NSRJDs9W5YjSThX3FJeurTAXJMG08gFd2ib/p/GzRh6rZgPI5xoNUkfcoK1m3iSkzGVjSXFzTyQcAj/blc7zykpct5rbKTgVG/V44GeijslJEM1VmEvDsbKDHnEovpiGxpoboUfWfFTeHrGTg1pHKO+6pEHHjt7AXfYPKQmEKPPeBeH5sWdkTGP7X6V9EQOPRQf+aCWWtRzoOhxd2HM5Wifw7ANBhYtUOaABRUxL4lciNMmKj4QMaQNTkOTYWmWmtXY0joAFENnGlDaCKBdaPFAFNva6FNTjlwcKucATVwUWFQ+f/XSMCGvd2VS+gAXQ7DEesLn6dvXNFQOPYFHgmqNKKVh0xqCHjpzAtTLteWU1QmfceTgQI0dTx32Hb+mj5skj+lqMCjix5+rJp1IUfnh0nlW0fDg2BQSsByMS+Tq0C9rwvhqfa1RP5jaoDn/FA5zcqr/aupjJRFtbIJJwXP3t/VP4jd9qNBtzaiP+V/R+Kv/WCDMJl/VuvDAVNUFE7izbpXj/4MEGfTDQ7FdSKUrEY1FDNUJAE7OJfolmooh34WAwRdvEWHXCfhlwuEiACQPiP+qX5L87VPSL4sKhdeF3KonGACNgAYMfbhSOoBn779HldyPg8+rfWeljF1JrIFUC/z8Tz07+KVAqpt0StYssqPEKspAzDuVnA3zPF844Ti++YTzoY1FDN4PWM6KPwIAW4ebhijxV/vrAmpN//ymcYecOe4hzUOaJq/WmcfJhVtd3o0mdnLknXIKD5C2LUCQD4vQZ4dX26fZJxatBDdM5W2oikjhWlbifAewgASXy5AIC2ow0/F9aTFJdh+NAi0Z/O2h3oOd9gRatOGNRQzaAwETdfQMzSW1EkSWSrlTTim6lXl/LZr0xW+KF2dp1Ik14WKdcLp14o61xG/y3XwO+Ael3E7NllyQpLNYOJmUikOf0kYOdZsccKWCjyDRUoj7/1itbihYcZhmNEhuG4s4VTjAz4omr0+aoGGNRQzVGQoOzS3/pncC2tC1vEnE0mFkCvj568vj48O4oZjCWNSMpXFqdWAZDEaB/7BuVTLmUtYMIOMaqlqn8bJsOychQdoCuarQfwzFvieaMAwLFRxR/zaZlaFHYYPvnTwwmA1eLLUbNy7FBt5BjUUM1Rr4vImJudClw/VP77z80C9jysVu86s2K+jfacJ1L4X96m/znkZRe213eoAnPfEFWkrkFiyPhL3xu6JKVX0AR1ZZeoqTG3K+wjRKXCoIZqDrlCJI4DKmYU1NGvANUdkXSu85vlv39AdCgsqEr/a3rpZiYucHGr6FNk6ymGMxMZM7lcjLiycjR0SUqvoMNwgd4fA7WcDVeeaohBDdUsBSMwLv8tplB4kgepQNQu4O4ZMW1BSVJjgKNLxfPeH1VsM0zAAsCurjjmHj06XBZkVfUZb5g5sIjoyfweZkZu0F105ie9MDkD1Sx1/YFaLiIt/vUDJddYSJKY1XfXHN15eWzqiORojk0e+dlEBBcFCcVaDKzYc1BaAy8uFzOcR6wSOXga9Xz8NnFnxQzbclMxHxMRVU0tBwK1DwFOzTgDdxkwqKGaRa4QQUf496IJqrig5t41YHuQSHoFiOGU6hwxO7LqjnhcP1B0O5kc6Leocj6I6ncTc92Efy86FL4e9vhZjguGcbd4gdXZRFVdZcw/ZqQY1FDN0/IlEQxc3g7k5xRm6MzPBY59BRxaLIIYhVLMtdR5hhiOmnkPuHcVSL4KJF8p/Hn/hhiR5DcVcPWuvPMImA9E7xXDtHe/J2pvipOdJmqdgKqdVZWI6CkxqKGax9MPsHYD0uNEPoim/YBbYcDfM4DkKLFOg+7AgCViOoACVg7iUbeT7v7yc0Rzlk2dSjsFAGIW7xe/BVb1E6Oamr9QfM3T2Q1AXhbg1Fw0vxERGSl2FKaaRy4v7Pdy+lfRfLOqrwhoLB2Bl38UM0w/GtA8jolSdNyVG+DfqZ5/4WzEf70JPLiv+74kFXYQ7jiRbfREZNQY1FDNVDAKKmp74ZxF7ceKbKeth1avm/9zHwAOjYGMeJHN+FE3/xFNZGa1xHw7RERGrExBzfLly+Hl5QVzc3P4+fkhPDz8seunpqZi2rRpcHNzg1KpRJMmTbBjxw7t+15eXpDJZEUe06ZN067TvXv3Iu9PnTq1LMUnAup0FLNJA4BjU2DCTjEDrqW9YctVFqYWYqoCmRw4txG4tK3wvYIOwq2HMs06ERk9vfvUbNy4EUFBQVixYgX8/PywdOlS9OnTB1FRUXB2LjqqIjc3F7169YKzszN+//13eHh44NatW7Czs9Ouc/LkSajVau3ryMhI9OrVC0OGDNHZ1+TJk/Hhhx9qX1taMiU7lZFcDoz6HUg4DzQLFB2BqzPPjiLh39GlwLaZou+MOldkHgaYQZiIagS9g5olS5Zg8uTJmDBhAgBgxYoV2L59O1auXInZs2cXWX/lypVISUnBsWPHYGpqCkDUzDzKyclJ5/WiRYvQsGFDPPvsszrLLS0t4epaCfOGUM3g1EQ8jEWP94Aru4GkS8COt0WeC02+CHBcWxm6dEREFU6v5qfc3FxEREQgICCgcAdyOQICAhAWFlbsNn/99Rf8/f0xbdo0uLi4oFWrVvj00091amb+e4w1a9bglVdegew//RrWrl0LR0dHtGrVCnPmzEFWVlaJZc3JyYFKpdJ5EBk1EyXw0neATAFc2FyY4Zi1NERUQ+hVU5OcnAy1Wg0XFxed5S4uLrh8+XKx21y/fh379+/HqFGjsGPHDkRHR+P1119HXl4e5s+fX2T9rVu3IjU1FePHj9dZPnLkSNSrVw/u7u44d+4c3n33XURFRWHz5s3FHjc4OBgLFy7U5/SIqj/3dmJ24sOfiWHclo4i4R4RUQ1Q4XlqNBoNnJ2d8cMPP0ChUMDHxwexsbFYvHhxsUFNSEgI+vXrB3d3d53lU6ZM0T739vaGm5sbevbsiWvXrqFhw6JDb+fMmYOgoCDta5VKBU/PCpg1maiq6fYOELUDSIgUI7oKkgsSERk5vYIaR0dHKBQKJCQk6CxPSEgosa+Lm5sbTE1NoVAUTqDXvHlzxMfHIzc3F2ZmhR00b926hX379pVY+/IoPz8/AEB0dHSxQY1SqYRSyQ9zqoFMzIBRm4CLf4rJK4mIagi9+tSYmZnBx8cHoaGh2mUajQahoaHw9y8+U2mXLl0QHR0NjUajXXblyhW4ubnpBDQAsGrVKjg7O2PAgAFPLMuZM2cAiKCJiP7Dxh3o9JoY7k1EVEPonacmKCgIP/74I37++WdcunQJr732GjIzM7WjocaOHYs5c+Zo13/ttdeQkpKCGTNm4MqVK9i+fTs+/fRTnRw0gAiOVq1ahXHjxsHERLcC6dq1a/joo48QERGBmzdv4q+//sLYsWPRrVs3tG7duiznTUREREZG7z41w4YNQ1JSEubNm4f4+Hi0bdsWu3bt0nYejomJgfyRdPGenp7YvXs3Zs2ahdatW8PDwwMzZszAu+/qZj7dt28fYmJi8MorrxQ5ppmZGfbt24elS5ciMzMTnp6eGDRoED744AN9i09ERERGSiZJkmToQlQGlUoFW1tbpKWlwcaGmVWJiIiqA33u35z7iYiIiIwCgxoiIiIyCgxqiIiIyCgwqCEiIiKjwKCGiIiIjAKDGiIiIjIKDGqIiIjIKDCoISIiIqPAoIaIiIiMAoMaIiIiMgp6z/1UXRXMBqFSqQxcEiIiIiqtgvt2aWZ1qjFBTXp6OgAxwSYRERFVL+np6bC1tX3sOjVmQkuNRoO7d+/C2toaMpmsXPetUqng6emJ27dvc7LMSsDrXbl4vSsXr3fl4vWuXGW53pIkIT09He7u7pDLH99rpsbU1MjlctSpU6dCj2FjY8N/ikrE6125eL0rF6935eL1rlz6Xu8n1dAUYEdhIiIiMgoMaoiIiMgoMKgpB0qlEvPnz4dSqTR0UWoEXu/KxetduXi9Kxevd+Wq6OtdYzoKExERkXFjTQ0REREZBQY1REREZBQY1BAREZFRYFBDRERERoFBDRERERkFBjVPafny5fDy8oK5uTn8/PwQHh5u6CIZjcOHDyMwMBDu7u6QyWTYunWrzvuSJGHevHlwc3ODhYUFAgICcPXqVcMUtpoLDg5Gx44dYW1tDWdnZwwcOBBRUVE662RnZ2PatGlwcHBArVq1MGjQICQkJBioxNXbd999h9atW2uzqvr7+2Pnzp3a93mtK9aiRYsgk8kwc+ZM7TJe8/KzYMECyGQynUezZs2071fktWZQ8xQ2btyIoKAgzJ8/H6dPn0abNm3Qp08fJCYmGrpoRiEzMxNt2rTB8uXLi33/s88+w7Jly7BixQqcOHECVlZW6NOnD7Kzsyu5pNXfoUOHMG3aNBw/fhx79+5FXl4eevfujczMTO06s2bNwt9//41Nmzbh0KFDuHv3Ll5++WUDlrr6qlOnDhYtWoSIiAicOnUKzz33HF588UVcuHABAK91RTp58iS+//57tG7dWmc5r3n5atmyJeLi4rSPI0eOaN+r0GstUZn5+vpK06ZN075Wq9WSu7u7FBwcbMBSGScA0pYtW7SvNRqN5OrqKi1evFi7LDU1VVIqldL69esNUELjkpiYKAGQDh06JEmSuLampqbSpk2btOtcunRJAiCFhYUZqphGpXbt2tJPP/3Ea12B0tPTpcaNG0t79+6Vnn32WWnGjBmSJPHvu7zNnz9fatOmTbHvVfS1Zk1NGeXm5iIiIgIBAQHaZXK5HAEBAQgLCzNgyWqGGzduID4+Xuf629raws/Pj9e/HKSlpQEA7O3tAQARERHIy8vTud7NmjVD3bp1eb2fklqtxoYNG5CZmQl/f39e6wo0bdo0DBgwQOfaAvz7rghXr16Fu7s7GjRogFGjRiEmJgZAxV/rGjNLd3lLTk6GWq2Gi4uLznIXFxdcvnzZQKWqOeLj4wGg2Otf8B6VjUajwcyZM9GlSxe0atUKgLjeZmZmsLOz01mX17vszp8/D39/f2RnZ6NWrVrYsmULWrRogTNnzvBaV4ANGzbg9OnTOHnyZJH3+Pddvvz8/LB69Wo0bdoUcXFxWLhwIZ555hlERkZW+LVmUENEOqZNm4bIyEidNnAqf02bNsWZM2eQlpaG33//HePGjcOhQ4cMXSyjdPv2bcyYMQN79+6Fubm5oYtj9Pr166d93rp1a/j5+aFevXr47bffYGFhUaHHZvNTGTk6OkKhUBTpsZ2QkABXV1cDlarmKLjGvP7la/r06di2bRsOHDiAOnXqaJe7uroiNzcXqampOuvzepedmZkZGjVqBB8fHwQHB6NNmzb46quveK0rQEREBBITE9G+fXuYmJjAxMQEhw4dwrJly2BiYgIXFxde8wpkZ2eHJk2aIDo6usL/vhnUlJGZmRl8fHwQGhqqXabRaBAaGgp/f38DlqxmqF+/PlxdXXWuv0qlwokTJ3j9y0CSJEyfPh1btmzB/v37Ub9+fZ33fXx8YGpqqnO9o6KiEBMTw+tdTjQaDXJycnitK0DPnj1x/vx5nDlzRvvo0KEDRo0apX3Oa15xMjIycO3aNbi5uVX83/dTdzWuwTZs2CAplUpp9erV0sWLF6UpU6ZIdnZ2Unx8vKGLZhTS09Olf//9V/r3338lANKSJUukf//9V7p165YkSZK0aNEiyc7OTvrzzz+lc+fOSS+++KJUv3596cGDBwYuefXz2muvSba2ttLBgweluLg47SMrK0u7ztSpU6W6detK+/fvl06dOiX5+/tL/v7+Bix19TV79mzp0KFD0o0bN6Rz585Js2fPlmQymbRnzx5JknitK8Ojo58kide8PL311lvSwYMHpRs3bkhHjx6VAgICJEdHRykxMVGSpIq91gxqntLXX38t1a1bVzIzM5N8fX2l48ePG7pIRuPAgQMSgCKPcePGSZIkhnXPnTtXcnFxkZRKpdSzZ08pKirKsIWupoq7zgCkVatWadd58OCB9Prrr0u1a9eWLC0tpZdeekmKi4szXKGrsVdeeUWqV6+eZGZmJjk5OUk9e/bUBjSSxGtdGf4b1PCal59hw4ZJbm5ukpmZmeTh4SENGzZMio6O1r5fkddaJkmS9PT1PURERESGxT41REREZBQY1BAREZFRYFBDRERERoFBDRERERkFBjVERERkFBjUEBERkVFgUENERERGgUENERERGQUGNURERGQUGNQQERGRUWBQQ0REREbh/wEvUsKv/iJ1rwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "def visualize_attention(text):\n", + " seq = tokenizer.texts_to_sequences([text])\n", + " padded = pad_sequences(seq, maxlen=MAX_LEN, padding='post')\n", + "\n", + " attention_model = Model(\n", + " inputs=model.input,\n", + " outputs=model.layers[-2].output[1]\n", + " )\n", + "\n", + " weights = attention_model.predict(padded)[0]\n", + " words = text.split()\n", + "\n", + " weights = weights[:len(words)].flatten()\n", + "\n", + " plt.bar(words, weights)\n", + " plt.xticks(rotation=90)\n", + " plt.title(\"Attention Weights\")\n", + " plt.show()\n", + "\n", + "visualize_attention(\"this movie was absolutely fantastic\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 527 + }, + "id": "Ac1hOVfembjP", + "outputId": "24e74ebd-af0f-4727-d57d-b93db578a969" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 203ms/step\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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lyTt27dPkuxXOX3//fdasGCBHnnkEfn5+embb77RiBEj1K5dOzVq1Oh3HwQAAHDvK3Go6d27t06ePKnx48crMzNTTZo0UWJion0ycFpamlxcfh4AatWqlRYsWKBx48Zp7Nixqlu3rpYuXaqGDRva+yxbtsweiiSpT58+kqQJEyZo4sSJcnNz0+rVq+0Bqnr16nryySc1bty4m/7gAADALDc1UTgmJkYxMTFFLlu/fn2htl69eqlXr17X3d6AAQM0YMCA6y6vXr26vvjii5KWCQAAShGe/QQAAIxAqAEAAEYg1AAAACMQagAAgBEINQAAwAiEGgAAYARCDQAAMAKhBgAAGIFQAwAAjECoAQAARiDUAAAAIxBqAACAEQg1AADACIQaAABgBEINAAAwAqEGAAAYgVADAACMQKgBAABGINQAAAAjEGoAAIARCDUAAMAIhBoAAGAEQg0AADACoQYAABiBUAMAAIxAqAEAAEYg1AAAACMQagAAgBEINQAAwAiEGgAAYARCDQAAMAKhBgAAGIFQAwAAjECoAQAARiDUAAAAIxBqAACAEQg1AADACIQaAABgBEINAAAwAqEGAAAYgVADAACMQKgBAABGINQAAAAjEGoAAIARCDUAAMAIhBoAAGAEQg0AADACoQYAABiBUAMAAIxAqAEAAEYg1AAAACMQagAAgBEINQAAwAiEGgAAYISbCjWzZs1ScHCwPDw8FBYWps2bN9+w/+LFi1W/fn15eHgoNDRUK1ascFi+ZMkSde3aVX5+frLZbNqxY0ehbVy8eFEvvfSS/Pz8VKFCBT355JPKysq6mfIBAICBShxqFi1apNjYWE2YMEHbt29X48aNFRkZqRMnThTZPzk5WX379tXAgQOVmpqqqKgoRUVFadeuXfY+ubm5atOmjd58883r7nfEiBH63//+p8WLF+uLL75Qenq6evbsWdLyAQCAoUocaqZPn65BgwYpOjpaDRo0UEJCgjw9PTV37twi+8+YMUPdunXTyJEjFRISoilTpqhZs2aaOXOmvc8f//hHjR8/XhEREUVu48yZM/r3v/+t6dOnq1OnTmrevLnef/99JScna+PGjSX9CAAAwEAlCjWXLl3Stm3bHMKHi4uLIiIilJKSUuQ6KSkphcJKZGTkdfsXZdu2bbp8+bLDdurXr68aNWpcdzt5eXnKyclxeAEAAHOV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SkxMLHI5V7b+jDk1wC3QuHHjIoeHZ86cyTOgbpPu3bsTaJzg8OHDBJo77OWXX9aZM2e0adMmlStXTomJifrwww9Vt25dh9OC4PQTcEt88cUX6t69u2rUqKHw8HBJV2+SlZaWpv/3//6f2rZt6+QKgVtj8uTJN1w+fvz4O1RJ6VGlShV99tlnatmypby8vLR161Y98MADWrZsmaZOnaqvv/7a2SXeNQg1wC1y/PhxzZ49W999950kKSQkRC+++KKqVq3q5MqAW+fXj0K4fPmyDh8+rDJlyqhOnTravn27kyozl5eXl7755hsFBwerZs2aWrBggVq3bq3Dhw/rwQcf1Pnz551d4l2DOTXALeLn56cePXro4Ycfts8/2Lp1qyQVmkAM3KtSU1MLteXk5GjAgAF64oknnFCR+erVq6d9+/YpODhYjRs31rvvvqvg4GAlJCSoSpUqzi7vrsJIDXALJCYmql+/fvrxxx8LXRlis9mYyAfjffvtt3rsscd05MgRZ5dinP/85z+6cuWKBgwYoG3btqlbt246ffq03Nzc9MEHH6h3797OLvGuQagBboG6deuqa9euGj9+PE/lRqn09ddf67HHHtNPP/3k7FKMd/78efuzoJi07YhQA9wCXl5eSk1NVZ06dZxdCnBbvf322w7vLctSRkaGPvroI7Vv314LFixwUmXmmjx5sv785z87PAJHki5cuKC33nqLydm/QKgBboHnn39erVu31sCBA51dCnBb1apVy+G9i4uLKleurE6dOmnMmDGqWLGikyozl6urqzIyMhQQEODQ/uOPPyogIIDT279AqAFugfPnz6tXr16qXLmyQkNDVbZsWYflw4YNc1JlAO51Li4uysrKUuXKlR3a165dq969e+vkyZNOquzuw9VPwC3w8ccfa9WqVfLw8ND69etls9nsy2w2G6EGQIn5+vrKZrPJZrPpgQcecPh/JT8/X+fOndOf/vQnJ1Z492GkBrgFgoKCNGzYMP3lL3+xPyMHMEXPnj2L3XfJkiW3sZLS5cMPP5RlWXr++ecVHx/v8BBRNzc3BQcH22/2iasYqQFugUuXLql3794EGhjpl79Mcef0799f0tV5TK1atSp0WhuFMVID3AIjRoxQ5cqVNXbsWGeXAsBABQUFOnjwoE6cOGG/uec17dq1c1JVdx9GaoBbID8/X1OnTtXKlSvVqFGjQt+opk+f7qTKgNvj5MmT2rdvn6Srd7z99SRW3DobN27UM888o6NHj3Jzz9/ASA1wC3Ts2PG6y2w2m9auXXsHqwFun9zcXA0dOlTz5s2zjxi4urqqX79+eueddwrdSwW/X5MmTfTAAw9o0qRJqlKlisOEYYnTg79EqAEAFNuQIUO0evVqzZw5U61bt5Z09W7Cw4YNU5cuXTR79mwnV2ie8uXLa+fOnbr//vudXcpdj1ADACg2f39/ffLJJ+rQoYND+7p16/T0009zz5TboFOnTho1apS6devm7FLuesypAQAU2/nz54t8vllAQIDOnz/vhIrMN3ToUL3yyivKzMws8uaejRo1clJldx9GagAAxda5c2f5+flp3rx58vDwkHT1GUT9+/fX6dOntXr1aidXaJ6ibhVhs9lkWRYThX+FUAMAKLZdu3YpMjJSeXl5aty4sSRp586d8vDw0MqVK/Xggw86uULzHD169IbLa9aseYcqufsRagAAJXL+/HnNnz9fe/fulSSFhITo2WefVbly5ZxcGUo7Qg0AAPeAPXv2KC0tTZcuXXJo79Gjh5MquvswURgAUGwffvih/P391b17d0nSqFGjNGfOHDVo0EAff/wxp0Jug0OHDumJJ57Qt99+a59LI8l+vxrm1PyMB9UAAIrt9ddft59mSklJ0cyZMzV16lT5+/trxIgRTq7OTMOHD1etWrV04sQJeXp6avfu3fryyy/VokULrV+/3tnl3VU4/QQAKDZPT0/t3btXNWrU0OjRo5WRkaF58+Zp9+7d6tChA/epuQ38/f21du1aNWrUSN7e3tq8ebPq1auntWvX6pVXXlFqaqqzS7xrMFIDACi2ChUq6Mcff5QkrVq1Sl26dJEkeXh46MKFC84szVj5+fmqWLGipKsBJz09XdLVq56uPX8LVzGnBgBQbF26dNELL7ygpk2bav/+/XrkkUckSbt371ZwcLBzizNUw4YNtXPnTtWqVUthYWGaOnWq3NzcNGfOHNWuXdvZ5d1VGKkBABTbrFmzFB4erpMnT+rTTz+Vn5+fJGnbtm3q27evk6szxzfffGN/YOi4cePsk4MnT56sw4cPq23btlqxYoXefvttZ5Z512FODQAAdxlXV1dlZGQoICBAtWvX1pYtW+wBUpJOnz4tX1/fQk/sLu04/QQAKJGffvpJ//73v/Xdd99Junrzveeff16VKlVycmXm8PHx0eHDhxUQEKAjR47YR22u4VgXjZEaAECxffnll3rsscfk7e2tFi1aSLp66ik7O1v/+9//1K5dOydXaIbBgwdr3rx5qlKlitLS0nTffffJ1dW1yL6HDh26w9XdvQg1AIBiCw0NVXh4uGbPnm3/JZufn68XX3xRycnJ+vbbb51coTkSExN18OBBDRs2TJMnT7ZfAfVrw4cPv8OV3b0INQCAYitXrpx27NihevXqObTv27dPTZo04bLu2yA6Olpvv/32dUMNfsbVTwCAYmvWrJl9Ls0vfffdd/anduPWev/99wk0xcREYQDADX3zzTf2n4cNG6bhw4fr4MGDevjhhyVJGzdu1KxZs/TGG284q0RAEqefAAC/wcXFxeFBitdjs9l4uCKcipEaAMANHT582NklAMVCqAEA3FDNmjULte3Zs0dpaWm6dOmSvc1msxXZF7hTCDUAgGI7dOiQnnjiCX377bcOp6Su3dmW009wJq5+AgAU2/Dhw1WrVi2dOHFCnp6e2rVrl7788ku1aNFC69evd3Z5KOWYKAwAKDZ/f3+tXbtWjRo1kre3tzZv3qx69epp7dq1euWVV5SamursElGKMVIDACi2/Px8+z1T/P39lZ6eLunqvJt9+/Y5szSAOTUAgOJr2LChdu7cqVq1aiksLExTp06Vm5ub5syZo9q1azu7PJRynH4CABTbypUrlZubq549e+rgwYN69NFHtX//fvn5+WnRokXq1KmTs0tEKUaoAQD8LqdPn5avr6/9CijAWQg1AADACEwUBgAARiDUAAAAIxBqAACAEQg1AADACIQaAABgBEINAAAwAqEGAAAY4f8DimC109IujTEAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "from lime.lime_text import LimeTextExplainer\n", + "\n", + "class_names = ['Negative', 'Positive']\n", + "\n", + "def predictor(texts):\n", + " seq = tokenizer.texts_to_sequences(texts)\n", + " pad = pad_sequences(seq, maxlen=MAX_LEN, padding='post')\n", + " return np.hstack([(1 - model.predict(pad)), model.predict(pad)])\n", + "\n", + "explainer = LimeTextExplainer(class_names=class_names)\n", + "\n", + "exp = explainer.explain_instance(\n", + " \"this movie was extremely boring\",\n", + " predictor,\n", + " num_features=6\n", + ")\n", + "\n", + "exp.show_in_notebook()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "id": "ryFxBK3jmg7h", + "outputId": "024c7cd4-015f-4d56-dd5c-42f50ab2a030" + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m157/157\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 7ms/step\n", + "\u001b[1m157/157\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 7ms/step\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " " + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "model.save(\"glove_bilstm_attention_full.h5\")\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rX5VtgY1mjtp", + "outputId": "baacadcc-a956-4b64-a27e-6c94bb58404c" + }, + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "w2yulbramsX5" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file