{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "gpuType": "T4", "collapsed_sections": [ "XvAe3EPARrBm", "BWCA5X_etylC", "3AQ19vC4t4vs", "NTZdY_8OuXC4", "Tb2Br2K1uf0H", "3GI4NqmeunVl", "oc9xnUMVRoS4", "4jiOX9DBo8Yp" ] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU", "widgets": { "application/vnd.jupyter.widget-state+json": { "a971d84b85cc4d868176a1421dc2a0f7": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_ca555e939bdb4736890800c58a23ec77", "IPY_MODEL_b7ac2f7ecd904a618626d66202170451", "IPY_MODEL_d91c3928ba1043919e6f7b10a0db9447" ], "layout": "IPY_MODEL_aff475d25e07496786680c38e409161a" } }, "ca555e939bdb4736890800c58a23ec77": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_bab23d3e8dce48788b69b7498fe68033", "placeholder": "​", "style": "IPY_MODEL_66ff1b38e57c45f18e085009d5d53f0d", "value": "Map: 100%" } }, "b7ac2f7ecd904a618626d66202170451": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2f48af6ab211491c9639ceb91a19248d", "max": 29908, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_a2a533503e83433299e1bc897743863a", "value": 29908 } }, "d91c3928ba1043919e6f7b10a0db9447": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_0e9f963127fc423f9a189b480657efcc", "placeholder": "​", "style": "IPY_MODEL_3a72ff8679f14ac689de8667571582d6", "value": " 29908/29908 [01:34<00:00, 196.50 examples/s]" } }, "aff475d25e07496786680c38e409161a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "bab23d3e8dce48788b69b7498fe68033": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "66ff1b38e57c45f18e085009d5d53f0d": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "2f48af6ab211491c9639ceb91a19248d": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a2a533503e83433299e1bc897743863a": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "0e9f963127fc423f9a189b480657efcc": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3a72ff8679f14ac689de8667571582d6": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "c08db8312d3e4cc6ada9443e5a32eb6d": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_968c745569084c12ac876b4c3dc8aede", "IPY_MODEL_27c90016d4ac49c2b870ba8967d4a5df", "IPY_MODEL_b59c4157290449269b98f135c09a844e" ], "layout": "IPY_MODEL_ec9ea53f168e4892acfc7b2272f48762" } }, "968c745569084c12ac876b4c3dc8aede": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_0f0be4b403a04e25915758770b64a3bb", "placeholder": "​", "style": "IPY_MODEL_e749b52a2c9241dea2ccb390b1093a06", "value": "Map: 100%" } }, "27c90016d4ac49c2b870ba8967d4a5df": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_f221c8ae15a946e4b80ac2a84813dade", "max": 8257, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_17bd7bf9b90b42f4993e0a4a8d96f5fd", "value": 8257 } }, "b59c4157290449269b98f135c09a844e": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e407f7b6e1924087aed73c6ef7e1e180", "placeholder": "​", "style": "IPY_MODEL_befa179548c043debfeb7d5d59e12050", "value": " 8257/8257 [00:27<00:00, 408.10 examples/s]" } }, "ec9ea53f168e4892acfc7b2272f48762": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0f0be4b403a04e25915758770b64a3bb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e749b52a2c9241dea2ccb390b1093a06": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "f221c8ae15a946e4b80ac2a84813dade": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "17bd7bf9b90b42f4993e0a4a8d96f5fd": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "" } }, "e407f7b6e1924087aed73c6ef7e1e180": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "model_module_version": "1.2.0", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "befa179548c043debfeb7d5d59e12050": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } } } } }, "cells": [ { "cell_type": "markdown", "source": [ "## Training" ], "metadata": { "id": "XvAe3EPARrBm" } }, { "cell_type": "markdown", "source": [ "### Load Training data" ], "metadata": { "id": "BWCA5X_etylC" } }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 107 }, "id": "vGEGzvTmmBWk", "outputId": "92846876-7e0f-4048-b5c7-d12cfc69da00" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Downloading...\n", "From: https://drive.google.com/uc?id=1j0SdyJ8gMrLtpFl1gDJ83s41TyUkKqUt\n", "To: /content/dataset.tsv\n", "100%|██████████| 78.4M/78.4M [00:00<00:00, 140MB/s]\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "'dataset.tsv'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 1 } ], "source": [ "import gdown\n", "\n", "# Link to your file (ID extracted from the URL)\n", "file_id = \"1j0SdyJ8gMrLtpFl1gDJ83s41TyUkKqUt\"\n", "gdown.download(f\"https://drive.google.com/uc?id={file_id}\", \"dataset.tsv\", quiet=False)" ] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "pd.set_option('display.max_colwidth', 10000)" ], "metadata": { "id": "ALucBhN_t56l" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "df = pd.read_csv(\"dataset.tsv\", sep=\"\\t\")\n", "df.drop(columns=[\"Unnamed: 0\"], inplace=True)\n", "df.duplicated().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SLb-3E-nn31D", "outputId": "678ac60a-7dea-4f70-d8bb-9f51a8e9db53" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "92" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "code", "source": [ "df.drop_duplicates(inplace=True)\n", "df.info()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "SoMS0ZfaNs5W", "outputId": "97f5da96-a8e4-4484-e96b-110ad905f00d" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Index: 29908 entries, 0 to 29999\n", "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 title 29908 non-null object\n", " 1 text 29908 non-null object\n", " 2 subject 29908 non-null object\n", " 3 date 29908 non-null object\n", " 4 label 29908 non-null int64 \n", "dtypes: int64(1), object(4)\n", "memory usage: 1.4+ MB\n" ] } ] }, { "cell_type": "code", "source": [ "df.label.sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JK-xgJUcXKgu", "outputId": "11c09e3a-daaa-44a4-faef-eb084cb4c9c0" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "14432" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "code", "source": [ "# Combine features into one text field\n", "df['combined_text'] = (\n", " \"Title: \" + df['title'] + \" | \" +\n", " \"Subject: \" + df['subject'] + \" | \" +\n", " \"Date: \" + df['date'] + \" | \"\n", " \"Text: \" + df['text']\n", ")" ], "metadata": { "id": "W6E2U9ejqDcS" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "max_length = df['combined_text'].str.len().max()\n", "print(f\"The maximum length of the 'combined_text' column is: {max_length}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jrx102ATqgxh", "outputId": "e0a096ab-9886-4533-e5bf-6e579642670e" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "The maximum length of the 'combined_text' column is: 51956\n" ] } ] }, { "cell_type": "code", "source": [ "(df['combined_text'].str.len() > 8000).sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cTPDFaOaro3J", "outputId": "48b5d8d9-43c0-45c5-c7bc-e34facfd421e" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "473" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "code", "source": [ "df[df['combined_text'].str.len() > 8000]['label'].sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zabPj8SNr2x_", "outputId": "8385bdd9-4c7d-4ef7-fe87-4fafa4662265" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "63" ] }, "metadata": {}, "execution_count": 10 } ] }, { "cell_type": "code", "source": [ "df['combined_text'].head()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "BiF_rTsCqPyw", "outputId": "71b267f0-24b0-4cde-9be1-69d541e613d1" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0 Title: Ex-CIA head says Trump remarks on Russia interference 'disgraceful' | Subject: politicsNews | Date: July 22, 2017 | Text: Former CIA director John Brennan on Friday criticized as “disgraceful” President Donald Trump’s efforts to play down U.S. intelligence agencies’ assessment that Russia meddled in the 2016 U.S. election. Trump’s administration has been dogged by investigations into allegations of Russian interference in last year’s U.S. presidential election and possible ties with his campaign team. Speaking one day before his first meeting with Russian President Vladimir Putin in Hamburg earlier this month, Trump said he suspected Russian interference in the election but that no one knows for sure. “These types of comments are just disgraceful ... and the person who said them should be ashamed of himself,” said Brennan, CIA chief under former President Barack Obama, at the Aspen Security Forum. Special Counsel Robert Mueller and several U.S. congressional committees are investigating whether Russia interfered in the election and colluded with Trump’s campaign to try to swing the race in his favor over Democratic rival Hillary Clinton. Those probes are focused almost exclusively on Moscow’s actions, lawmakers and intelligence officials have said, and no evidence has surfaced publicly implicating other countries. Moscow has denied any interference, and Trump has said that his campaign did not collude with Russia. Brennan said he was disappointed by the president’s handling of security issues in his first six months in office. “I must say there are disappointments that I see in terms of what Mr. Trump is doing on the international stage that I think pose serious questions about how he is keeping safe our national security,” Brennan said. Speaking at the same event in Aspen, James Clapper, the former director of national intelligence under Obama, was also critical of Trump’s administration. Asked if Jared Kushner, Trump’s son-in-law and top adviser, should have his security clearance canceled for initially failing to list on a disclosure form contacts he had with Russians, Clapper said it should be suspended pending a review. “I do think the appropriate thing here is take a pause and at least suspend a clearance until you’ve had the opportunity to investigate and then decide whether the clearance should be restored or not,” Clapper told the same panel. Brennan and Clapper also criticized Trump’s remarks in a tweet earlier this year about U.S. spy agencies in which he accused them of practices reminiscent of Nazi Germany. “That (tweet) was a terrible insulting affront not to me or John. We get paid the big bucks to take that. But I’m talking about the rank and file, the people in the trenches, men and women, the patriots in the intelligence community and that was completely inappropriate,” said Clapper.\n", "1 Title: YOU WON’T BELIEVE HIS PUNISHMENT! HISPANIC STORE OWNER Swindles Tax Payers Out Of $1,116,924.27 In Latest Food Stamp Scam | Subject: Government News | Date: Jun 19, 2017 | Text: How did this man come to OWN this store? There is no information on much about this fraudster except that he stole from Americans and is getting just a slap on the wrist. It s no wonder these people are repeat offenders!A hispanic store owner testified in court through a Spanish translator (Why no English?) that he swindled the American tax payers out of millions via food stamp fraud. Eduardo Leonardo plead guilty to stealing from the USDA by illegally exchanging over a million dollars of food stamp benefits for cash for over two years. I stole from the USDA and the Food and Nutrition Service, Eduardo Leonardo said slowly in Spanish through a translator in Brooklyn Federal Court. It was an exchange of benefits for cash. Leonardo, 57, admitted to committing food stamp fraud between Oct. 2015 and March 2017 by giving customers cash in exchange for running their EBT cards for a higher amount, which the federal government would later reimburse.In one instance, an undercover witness from the USDA went into Super Economic and picked up a jar of peanut butter and jelly and crackers, totaling $5.48. The witness then asked Leonardo to exchange benefits for $200 cash and Leonardo charged an undercover EBT card $287.89 and gave the witness $200 in cash, making a $82.41 profit.The USDA lost a total of $1,116,924.27 in the transactions.The scammer has run his store, Super Economic One Way Supermarket out of 104-21 Glenwood Road in Canarsie since Dec. 2011. It became a registered SNAP business on May 25, 2012. Specifically I gave a discounted rate in cash in exchange for them [customers] allowing me to ring up the full amount, Leonardo said to Judge Ann Donnelly.Remember Ann Donnelly?Supplemental Nutrition Assistance Program (SNAP) previously called the food stamp program, uses federal tax dollars to aid low-income households in buying affordable and nutritious food. EBT cards are used like debit cards, to swipe at special terminals in retail food stores to use the benefits in exchange for food.Between Nov. 2015 and Jan. 2017, Super Economic conducted more than 57,000 SNAP transactions totaling more than $1.5 million, according to court documents.About 8 transactions were made for $50 or more, an amount that USDA officials say is high for a store that size, which would normally conduct $15 average transactions.Leonardo is set to be sentenced on Oct. 31 and could face a maximum five years in prison WHAAAAT????THIS IS WHY THIS KEEPS HAPPENING!A man swindles more than a million dollars from Americans yet he gets only 5 years in prison? The punishment does not fit the crime!Via: Brooklyn Eagle\n", "2 Title: Federal Reserve governor Powell's policy views, in his own words | Subject: politicsNews | Date: November 2, 2017 | Text: President Donald Trump on Thursday tapped Federal Reserve Governor Jerome Powell to become head of the U.S. central bank, promoting a soft-spoken centrist to replace Janet Yellen when her term expires in February 2018. In five years as a Fed Governor Jerome Powell has been a consistent, middle of the road voice, backing the consensus crafted by Fed chair Janet Yellen that interest rates should be raised slowly so labor markets could recover, that financial stability risks were muted, and that new regulations had made the economy safer. Following is a collection of quotes from select policy speeches he has delivered since 2015: On Rates: “The financial crisis did significant damage to the productive capacity of our economy, and the damage was of a character, extent, and duration that cannot be fully known today…It seems plausible that at least part of this supply-side damage could be reversed if the economy enjoys a period of sustained growth.4 To encourage that outcome, as monetary policymakers consider removing accommodation, we should look for a little more proof than usual that labor markets are tightening or other supply-side constraints are binding.” - April 2015 speech to New York Council on Foreign Relations: (Graphic: U.S. labor market measures vs interest rates - reut.rs/2h7hsFx) On Financial Stability: “The bottom line is that there has not been an excessive buildup of leverage, maturity transformation, or broadly unsustainable asset prices…Overall, I do not see leveraged finance markets as posing undue financial stability risks. And if risk-taking does not threaten financial stability, it is not the Fed’s job to stop people from losing (or making) money.” - January 2017 speech to American Finance Association, Chicago (Graphic: U.S. stocks and leverage - reut.rs/2iolCp6) On Regulation: “We have substantially increased the capital, liquidity, and other prudential requirements for large banking firms. These measures are not free. Higher capital requirements increase bank costs, and at least some of those costs will be passed along to bank customers and shareholders. But in the longer term, stronger prudential requirements for large banking firms will produce more sustainable credit availability and economic growth.” - June 2017 speech to Salzburg Global Seminar, Salzburg, Austria (Graphic: Commercial credit and bank profitability - reut.rs/2h8lfCm) On the Current Economy: “Risks to the forecast now seem more balanced than they have been for some time. In particular, the global picture has brightened as growth and inflation have broadly moved up for the first time in several years. Here at home, risks seem both moderate and balanced, including the downside risk of lower inflation and the upside risk of labor market overheating. The Committee has been patient in raising rates, and that patience has paid dividends…. If the economy performs about as expected, I would view it as appropriate to continue to gradually raise rates.” - June 2017 speech to the Economic Club of New York (Graphic: The inflation conundrum - reut.rs/2za4ltY) Other issues may confront Powell in his confirmation hearings and as chair, such as whether to keep the current system of paying banks interest on their reserves as the main method of setting short term interest rates, and whether to rely on monetary policy rules: On Reserve Interest: “Simple to operate and has provided good control over the federal funds rate.” - June 2017 speech to the Economic Club of New York (Graphic: Bank reserves at the Fed - reut.rs/2z7Qdl8) On Policy Rules: “I am unable to think of any critical, complex human activity that could be safely reduced to a simple summary equation. In particular, no major central bank uses policy rules in a prescriptive way, and it is hard to predict the consequences of requiring the FOMC to do so, as some have proposed. Policy should be systematic, but not automatic.” - February 2017 speech to the Forecasters Club of New York (Graphic: Monetary policy rules vs reality - reut.rs/2h7mMZE)\n", "3 Title: SCOUNDREL HILLARY SUPPORTER STARTS “TrumpLeaks” Campaign…Desperate Move! | Subject: left-news | Date: Sep 17, 2016 | Text: Hillary Clinton ally David Brock is offering to pay for new information on Donald Trump, hoping that damaging audio or video on the Republican presidential candidate will be submitted to his super PAC.Brock, founder of the left-wing Media Matters and operator of Correct the Record super PAC, recently posted the plea on Correct the Record s website and is referring to the project as TrumpLeaks, NBC News reported.Brock asked for video or audio of Trump that has yet to be released. One of the most important things for voters to evaluate in any election is the full measure of a candidate s views, ideas, and temperament over time, the website states. In making a choice for president, voters must also consider how various candidates present themselves to the public and to the world. There are few things more important in that regard than access to video or audio in the form of prior television or radio interviews or more candid video from events a candidate may have attended. Brock s super PAC goes on to say they can offer compensation to anyone who has new video or audio that has been obtained legally.Read more: WFB\n", "4 Title: NANCY PELOSI ARROGANTLY DISMISSES Questions on Crooked Democrat IT Employees Under Investigation [Video] | Subject: politics | Date: May 26, 2017 | Text: Pleading ignorance is a perfect ploy for Nancy Pelosi Who wouldn t believe she s clueless on pretty much everything. Pelosi claims she s been busy with lots of things . That s laughable! This case is a big deal! Here s what The Daily Caller had to say about this stain on the Democrats:U.S. Capitol Police and other agencies are probing the cyber activities of three brothers who had jobs as congressional staffers at the office of information technology for lawmakers on the House Permanent Select Committee on Intelligence, The Daily Caller News Foundation first reported. Brothers Imran, Abid and Jamal Awan also provided their services for other Democratic members in the lower chamber.When they came under suspicion by law enforcement for accessing the House network without permission last February, they were all banned from accessing it. While some Democratic lawmakers dismissed Imran from their employ when the story, others, like Florida Democratic Rep. Debbie Wasserman Schultz kept him on.Are the Democrats helping these two men hide the evidence?\n", "Name: combined_text, dtype: object" ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
combined_text
0Title: Ex-CIA head says Trump remarks on Russia interference 'disgraceful' | Subject: politicsNews | Date: July 22, 2017 | Text: Former CIA director John Brennan on Friday criticized as “disgraceful” President Donald Trump’s efforts to play down U.S. intelligence agencies’ assessment that Russia meddled in the 2016 U.S. election. Trump’s administration has been dogged by investigations into allegations of Russian interference in last year’s U.S. presidential election and possible ties with his campaign team. Speaking one day before his first meeting with Russian President Vladimir Putin in Hamburg earlier this month, Trump said he suspected Russian interference in the election but that no one knows for sure. “These types of comments are just disgraceful ... and the person who said them should be ashamed of himself,” said Brennan, CIA chief under former President Barack Obama, at the Aspen Security Forum. Special Counsel Robert Mueller and several U.S. congressional committees are investigating whether Russia interfered in the election and colluded with Trump’s campaign to try to swing the race in his favor over Democratic rival Hillary Clinton. Those probes are focused almost exclusively on Moscow’s actions, lawmakers and intelligence officials have said, and no evidence has surfaced publicly implicating other countries. Moscow has denied any interference, and Trump has said that his campaign did not collude with Russia. Brennan said he was disappointed by the president’s handling of security issues in his first six months in office. “I must say there are disappointments that I see in terms of what Mr. Trump is doing on the international stage that I think pose serious questions about how he is keeping safe our national security,” Brennan said. Speaking at the same event in Aspen, James Clapper, the former director of national intelligence under Obama, was also critical of Trump’s administration. Asked if Jared Kushner, Trump’s son-in-law and top adviser, should have his security clearance canceled for initially failing to list on a disclosure form contacts he had with Russians, Clapper said it should be suspended pending a review. “I do think the appropriate thing here is take a pause and at least suspend a clearance until you’ve had the opportunity to investigate and then decide whether the clearance should be restored or not,” Clapper told the same panel. Brennan and Clapper also criticized Trump’s remarks in a tweet earlier this year about U.S. spy agencies in which he accused them of practices reminiscent of Nazi Germany. “That (tweet) was a terrible insulting affront not to me or John. We get paid the big bucks to take that. But I’m talking about the rank and file, the people in the trenches, men and women, the patriots in the intelligence community and that was completely inappropriate,” said Clapper.
1Title: YOU WON’T BELIEVE HIS PUNISHMENT! HISPANIC STORE OWNER Swindles Tax Payers Out Of $1,116,924.27 In Latest Food Stamp Scam | Subject: Government News | Date: Jun 19, 2017 | Text: How did this man come to OWN this store? There is no information on much about this fraudster except that he stole from Americans and is getting just a slap on the wrist. It s no wonder these people are repeat offenders!A hispanic store owner testified in court through a Spanish translator (Why no English?) that he swindled the American tax payers out of millions via food stamp fraud. Eduardo Leonardo plead guilty to stealing from the USDA by illegally exchanging over a million dollars of food stamp benefits for cash for over two years. I stole from the USDA and the Food and Nutrition Service, Eduardo Leonardo said slowly in Spanish through a translator in Brooklyn Federal Court. It was an exchange of benefits for cash. Leonardo, 57, admitted to committing food stamp fraud between Oct. 2015 and March 2017 by giving customers cash in exchange for running their EBT cards for a higher amount, which the federal government would later reimburse.In one instance, an undercover witness from the USDA went into Super Economic and picked up a jar of peanut butter and jelly and crackers, totaling $5.48. The witness then asked Leonardo to exchange benefits for $200 cash and Leonardo charged an undercover EBT card $287.89 and gave the witness $200 in cash, making a $82.41 profit.The USDA lost a total of $1,116,924.27 in the transactions.The scammer has run his store, Super Economic One Way Supermarket out of 104-21 Glenwood Road in Canarsie since Dec. 2011. It became a registered SNAP business on May 25, 2012. Specifically I gave a discounted rate in cash in exchange for them [customers] allowing me to ring up the full amount, Leonardo said to Judge Ann Donnelly.Remember Ann Donnelly?Supplemental Nutrition Assistance Program (SNAP) previously called the food stamp program, uses federal tax dollars to aid low-income households in buying affordable and nutritious food. EBT cards are used like debit cards, to swipe at special terminals in retail food stores to use the benefits in exchange for food.Between Nov. 2015 and Jan. 2017, Super Economic conducted more than 57,000 SNAP transactions totaling more than $1.5 million, according to court documents.About 8 transactions were made for $50 or more, an amount that USDA officials say is high for a store that size, which would normally conduct $15 average transactions.Leonardo is set to be sentenced on Oct. 31 and could face a maximum five years in prison WHAAAAT????THIS IS WHY THIS KEEPS HAPPENING!A man swindles more than a million dollars from Americans yet he gets only 5 years in prison? The punishment does not fit the crime!Via: Brooklyn Eagle
2Title: Federal Reserve governor Powell's policy views, in his own words | Subject: politicsNews | Date: November 2, 2017 | Text: President Donald Trump on Thursday tapped Federal Reserve Governor Jerome Powell to become head of the U.S. central bank, promoting a soft-spoken centrist to replace Janet Yellen when her term expires in February 2018. In five years as a Fed Governor Jerome Powell has been a consistent, middle of the road voice, backing the consensus crafted by Fed chair Janet Yellen that interest rates should be raised slowly so labor markets could recover, that financial stability risks were muted, and that new regulations had made the economy safer. Following is a collection of quotes from select policy speeches he has delivered since 2015: On Rates: “The financial crisis did significant damage to the productive capacity of our economy, and the damage was of a character, extent, and duration that cannot be fully known today…It seems plausible that at least part of this supply-side damage could be reversed if the economy enjoys a period of sustained growth.4 To encourage that outcome, as monetary policymakers consider removing accommodation, we should look for a little more proof than usual that labor markets are tightening or other supply-side constraints are binding.” - April 2015 speech to New York Council on Foreign Relations: (Graphic: U.S. labor market measures vs interest rates - reut.rs/2h7hsFx) On Financial Stability: “The bottom line is that there has not been an excessive buildup of leverage, maturity transformation, or broadly unsustainable asset prices…Overall, I do not see leveraged finance markets as posing undue financial stability risks. And if risk-taking does not threaten financial stability, it is not the Fed’s job to stop people from losing (or making) money.” - January 2017 speech to American Finance Association, Chicago (Graphic: U.S. stocks and leverage - reut.rs/2iolCp6) On Regulation: “We have substantially increased the capital, liquidity, and other prudential requirements for large banking firms. These measures are not free. Higher capital requirements increase bank costs, and at least some of those costs will be passed along to bank customers and shareholders. But in the longer term, stronger prudential requirements for large banking firms will produce more sustainable credit availability and economic growth.” - June 2017 speech to Salzburg Global Seminar, Salzburg, Austria (Graphic: Commercial credit and bank profitability - reut.rs/2h8lfCm) On the Current Economy: “Risks to the forecast now seem more balanced than they have been for some time. In particular, the global picture has brightened as growth and inflation have broadly moved up for the first time in several years. Here at home, risks seem both moderate and balanced, including the downside risk of lower inflation and the upside risk of labor market overheating. The Committee has been patient in raising rates, and that patience has paid dividends…. If the economy performs about as expected, I would view it as appropriate to continue to gradually raise rates.” - June 2017 speech to the Economic Club of New York (Graphic: The inflation conundrum - reut.rs/2za4ltY) Other issues may confront Powell in his confirmation hearings and as chair, such as whether to keep the current system of paying banks interest on their reserves as the main method of setting short term interest rates, and whether to rely on monetary policy rules: On Reserve Interest: “Simple to operate and has provided good control over the federal funds rate.” - June 2017 speech to the Economic Club of New York (Graphic: Bank reserves at the Fed - reut.rs/2z7Qdl8) On Policy Rules: “I am unable to think of any critical, complex human activity that could be safely reduced to a simple summary equation. In particular, no major central bank uses policy rules in a prescriptive way, and it is hard to predict the consequences of requiring the FOMC to do so, as some have proposed. Policy should be systematic, but not automatic.” - February 2017 speech to the Forecasters Club of New York (Graphic: Monetary policy rules vs reality - reut.rs/2h7mMZE)
3Title: SCOUNDREL HILLARY SUPPORTER STARTS “TrumpLeaks” Campaign…Desperate Move! | Subject: left-news | Date: Sep 17, 2016 | Text: Hillary Clinton ally David Brock is offering to pay for new information on Donald Trump, hoping that damaging audio or video on the Republican presidential candidate will be submitted to his super PAC.Brock, founder of the left-wing Media Matters and operator of Correct the Record super PAC, recently posted the plea on Correct the Record s website and is referring to the project as TrumpLeaks, NBC News reported.Brock asked for video or audio of Trump that has yet to be released. One of the most important things for voters to evaluate in any election is the full measure of a candidate s views, ideas, and temperament over time, the website states. In making a choice for president, voters must also consider how various candidates present themselves to the public and to the world. There are few things more important in that regard than access to video or audio in the form of prior television or radio interviews or more candid video from events a candidate may have attended. Brock s super PAC goes on to say they can offer compensation to anyone who has new video or audio that has been obtained legally.Read more: WFB
4Title: NANCY PELOSI ARROGANTLY DISMISSES Questions on Crooked Democrat IT Employees Under Investigation [Video] | Subject: politics | Date: May 26, 2017 | Text: Pleading ignorance is a perfect ploy for Nancy Pelosi Who wouldn t believe she s clueless on pretty much everything. Pelosi claims she s been busy with lots of things . That s laughable! This case is a big deal! Here s what The Daily Caller had to say about this stain on the Democrats:U.S. Capitol Police and other agencies are probing the cyber activities of three brothers who had jobs as congressional staffers at the office of information technology for lawmakers on the House Permanent Select Committee on Intelligence, The Daily Caller News Foundation first reported. Brothers Imran, Abid and Jamal Awan also provided their services for other Democratic members in the lower chamber.When they came under suspicion by law enforcement for accessing the House network without permission last February, they were all banned from accessing it. While some Democratic lawmakers dismissed Imran from their employ when the story, others, like Florida Democratic Rep. Debbie Wasserman Schultz kept him on.Are the Democrats helping these two men hide the evidence?
\n", "

" ] }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "markdown", "source": [ "### Load necessary module for fine-tuning" ], "metadata": { "id": "3AQ19vC4t4vs" } }, { "cell_type": "code", "source": [ "!pip install git+https://github.com/huggingface/transformers.git\n", "!pip install datasets triton" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "FmcC1m5YVpu1", "outputId": "fe65ad65-af56-400a-92b4-01bb510b637f" }, "execution_count": 19, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting git+https://github.com/huggingface/transformers.git\n", " Cloning https://github.com/huggingface/transformers.git to /tmp/pip-req-build-ff3t48wj\n", " Running command git clone --filter=blob:none --quiet https://github.com/huggingface/transformers.git /tmp/pip-req-build-ff3t48wj\n", " Resolved https://github.com/huggingface/transformers.git to commit 5c75087aeee7081025370e10d1f571a11600f1ae\n", " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (3.16.1)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.24.0 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (0.27.0)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (1.26.4)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (24.2)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (6.0.2)\n", "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (2024.11.6)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (2.32.3)\n", "Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (0.21.0)\n", "Requirement already satisfied: safetensors>=0.4.1 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (0.4.5)\n", "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers==4.48.0.dev0) (4.67.1)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.24.0->transformers==4.48.0.dev0) (2024.9.0)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.24.0->transformers==4.48.0.dev0) (4.12.2)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->transformers==4.48.0.dev0) (3.4.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers==4.48.0.dev0) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers==4.48.0.dev0) (2.2.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers==4.48.0.dev0) (2024.12.14)\n", "Requirement already satisfied: datasets in /usr/local/lib/python3.10/dist-packages (3.2.0)\n", "Requirement already satisfied: triton in /usr/local/lib/python3.10/dist-packages (3.1.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from datasets) (3.16.1)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.26.4)\n", "Requirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (17.0.0)\n", "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (0.3.8)\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (2.2.2)\n", "Requirement already satisfied: requests>=2.32.2 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.32.3)\n", "Requirement already satisfied: tqdm>=4.66.3 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.67.1)\n", "Requirement already satisfied: xxhash in /usr/local/lib/python3.10/dist-packages (from datasets) (3.5.0)\n", "Requirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (0.70.16)\n", "Requirement already satisfied: fsspec<=2024.9.0,>=2023.1.0 in /usr/local/lib/python3.10/dist-packages (from fsspec[http]<=2024.9.0,>=2023.1.0->datasets) (2024.9.0)\n", "Requirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets) (3.11.10)\n", "Requirement already satisfied: huggingface-hub>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (0.27.0)\n", "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (24.2)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0.2)\n", "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.4.4)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.3.2)\n", "Requirement already satisfied: async-timeout<6.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (4.0.3)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (24.3.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.5.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (6.1.0)\n", "Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (0.2.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (1.18.3)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.23.0->datasets) (4.12.2)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (3.4.0)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (2.2.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.32.2->datasets) (2024.12.14)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2024.2)\n", "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2024.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n" ] } ] }, { "cell_type": "code", "source": [ "import torch\n", "torch.cuda.empty_cache()\n", "\n", "from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments\n", "from datasets import Dataset\n", "from transformers import DataCollatorWithPadding" ], "metadata": { "id": "eIFZNvehXxMI" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "print(torch.cuda.get_device_name(0))\n", "print(torch.cuda.is_available())\n", "print(torch.cuda.get_device_capability(0)) # Should be >= 8.0 for Flash Attention" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1aHn0pNNbMvz", "outputId": "4a131e5b-e003-40e8-c00d-5cd1e93602e7" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Tesla T4\n", "True\n", "(7, 5)\n" ] } ] }, { "cell_type": "code", "source": [ "model_id = \"answerdotai/ModernBERT-base\"\n", "\n", "# Load the tokenizer for ModernBERT\n", "tokenizer = AutoTokenizer.from_pretrained(model_id)\n", "# Load the pre-trained ModernBERT model for sequence classification with Flash Attention\n", "model = AutoModelForSequenceClassification.from_pretrained(\n", " model_id,\n", " num_labels=1,\n", " # attn_implementation=\"flash_attention_2\", # Enable Flash Attention 2.0\n", " torch_dtype=torch.float32, # Use mixed precision for efficiency\n", ").to(\"cuda\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KZoQQQM9uvQ_", "outputId": "4ae0a6f0-327c-4598-f288-da27329508cb" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Some weights of ModernBertForSequenceClassification were not initialized from the model checkpoint at answerdotai/ModernBERT-base and are newly initialized: ['classifier.bias', 'classifier.weight']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ] } ] }, { "cell_type": "markdown", "source": [ "### Prepare dataset for training" ], "metadata": { "id": "NTZdY_8OuXC4" } }, { "cell_type": "code", "source": [ "# Tokenize the combined text\n", "def tokenize_data(batch):\n", " return tokenizer(\n", " batch['combined_text'],\n", " truncation=True,\n", " padding='longest', # Use dynamic padding to the longest sequence in the batch\n", " max_length=7000,\n", " return_tensors=\"pt\"\n", " )" ], "metadata": { "id": "syO9mbQruBOh" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# Convert to Hugging Face Dataset\n", "dataset = Dataset.from_pandas(pd.DataFrame(df['combined_text']))" ], "metadata": { "id": "NmqvgsogQ9Ag" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# Tokenize the dataset in batches\n", "batch_size = 16 # Adjust based on memory capacity\n", "tokenized_dataset = dataset.map(tokenize_data, batched=True, batch_size=batch_size)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 49, "referenced_widgets": [ "a971d84b85cc4d868176a1421dc2a0f7", "ca555e939bdb4736890800c58a23ec77", "b7ac2f7ecd904a618626d66202170451", "d91c3928ba1043919e6f7b10a0db9447", "aff475d25e07496786680c38e409161a", "bab23d3e8dce48788b69b7498fe68033", "66ff1b38e57c45f18e085009d5d53f0d", "2f48af6ab211491c9639ceb91a19248d", "a2a533503e83433299e1bc897743863a", "0e9f963127fc423f9a189b480657efcc", "3a72ff8679f14ac689de8667571582d6" ] }, "id": "2slbmGKbPXHX", "outputId": "aa551d81-eb62-4c87-fe61-36f93b156358" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Map: 0%| | 0/29908 [00:00" ], "text/html": [ "\n", "
\n", " \n", " \n", " [6355/6355 1:54:34, Epoch 0/1]\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EpochTraining LossValidation Loss
00.0000000.000004

" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [ "TrainOutput(global_step=6355, training_loss=0.021927670485696906, metrics={'train_runtime': 6876.3305, 'train_samples_per_second': 3.697, 'train_steps_per_second': 0.924, 'total_flos': 2.598128586619892e+16, 'train_loss': 0.021927670485696906, 'epoch': 0.9999606624444357})" ] }, "metadata": {}, "execution_count": 40 } ] }, { "cell_type": "markdown", "source": [ "### Save and download model" ], "metadata": { "id": "3GI4NqmeunVl" } }, { "cell_type": "code", "source": [ "# Save the model\n", "trainer.save_model('./saved_model') # Specify the directory to save the model\n", "tokenizer.save_pretrained('./saved_model') # Save the tokenizer" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "m9s6QFAIzdaN", "outputId": "166002d2-61de-4dfd-fa02-849377faee12" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "('./saved_model/tokenizer_config.json',\n", " './saved_model/special_tokens_map.json',\n", " './saved_model/tokenizer.json')" ] }, "metadata": {}, "execution_count": 41 } ] }, { "cell_type": "code", "source": [ "import shutil\n", "import os\n", "\n", "# Create a zip file of the saved model directory\n", "shutil.make_archive('./saved_model', 'zip', './saved_model')\n", "\n", "# Download the zip file\n", "from google.colab import files\n", "files.download('./saved_model.zip')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "id": "G-Gvqwiaze8Z", "outputId": "7c3b3ad1-a9e4-4293-d56a-42a4f9a7af38" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "\n", " async function download(id, filename, size) {\n", " if (!google.colab.kernel.accessAllowed) {\n", " return;\n", " }\n", " const div = document.createElement('div');\n", " const label = document.createElement('label');\n", " label.textContent = `Downloading \"${filename}\": `;\n", " div.appendChild(label);\n", " const progress = document.createElement('progress');\n", " progress.max = size;\n", " div.appendChild(progress);\n", " document.body.appendChild(div);\n", "\n", " const buffers = [];\n", " let downloaded = 0;\n", "\n", " const channel = await google.colab.kernel.comms.open(id);\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", "\n", " for await (const message of channel.messages) {\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", " if (message.buffers) {\n", " for (const buffer of message.buffers) {\n", " buffers.push(buffer);\n", " downloaded += buffer.byteLength;\n", " progress.value = downloaded;\n", " }\n", " }\n", " }\n", " const blob = new Blob(buffers, {type: 'application/binary'});\n", " const a = document.createElement('a');\n", " a.href = window.URL.createObjectURL(blob);\n", " a.download = filename;\n", " div.appendChild(a);\n", " a.click();\n", " div.remove();\n", " }\n", " " ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "download(\"download_e56e2a4d-3008-4274-8653-a40602a7a2a9\", \"saved_model.zip\", 556546545)" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "!nvidia-smi" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ePrD2WOVbNNe", "outputId": "5bdf58aa-129e-41a9-f3ad-6b68874534c5" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Sun Dec 29 11:35:58 2024 \n", "+---------------------------------------------------------------------------------------+\n", "| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n", "|-----------------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|=========================================+======================+======================|\n", "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 73C P0 31W / 70W | 11167MiB / 15360MiB | 0% Default |\n", "| | | N/A |\n", "+-----------------------------------------+----------------------+----------------------+\n", " \n", "+---------------------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=======================================================================================|\n", "+---------------------------------------------------------------------------------------+\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Testing" ], "metadata": { "id": "oc9xnUMVRoS4" } }, { "cell_type": "code", "source": [ "!gdown --id 1fJOaVhtwzQuzpse8OtJSmV5UZjIuR_kN" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "uI0Fdp37OzRt", "outputId": "fa7beee1-2266-4a7e-b81d-878427651897" }, "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "/usr/local/lib/python3.10/dist-packages/gdown/__main__.py:140: FutureWarning: Option `--id` was deprecated in version 4.3.1 and will be removed in 5.0. You don't need to pass it anymore to use a file ID.\n", " warnings.warn(\n", "Downloading...\n", "From: https://drive.google.com/uc?id=1fJOaVhtwzQuzpse8OtJSmV5UZjIuR_kN\n", "To: /content/test.tsv\n", "100% 22.0M/22.0M [00:00<00:00, 54.1MB/s]\n" ] } ] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "\n", "pd.set_option('display.max_colwidth', 10000)\n", "test = pd.read_csv(\"test.tsv\", sep=\"\\t\")\n", "test.drop(columns=[\"Unnamed: 0\"], inplace=True)\n", "test.duplicated().sum()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "ILlMP7PEO-2E", "outputId": "33cb4fc8-f9a3-45bb-b731-77e1512d3bd5" }, "execution_count": 1, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "10" ] }, "metadata": {}, "execution_count": 1 } ] }, { "cell_type": "code", "source": [ "test.drop_duplicates(inplace=True)\n", "test.info()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "uE88vtcJPbZV", "outputId": "22dd4bbe-ff23-48e6-d5f1-25b2939cb5e0" }, "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Index: 8257 entries, 0 to 8266\n", "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 title 8257 non-null object\n", " 1 text 8257 non-null object\n", " 2 subject 8257 non-null object\n", " 3 date 8257 non-null object\n", " 4 label 8257 non-null int64 \n", "dtypes: int64(1), object(4)\n", "memory usage: 387.0+ KB\n" ] } ] }, { "cell_type": "code", "source": [ "# Combine features into one text field\n", "test['combined_text'] = (\n", " \"Title: \" + test['title'] + \" | \" +\n", " \"Subject: \" + test['subject'] + \" | \" +\n", " \"Date: \" + test['date'] + \" | \"\n", " \"Text: \" + test['text']\n", ")" ], "metadata": { "id": "Mv55WKi_PoPG" }, "execution_count": 3, "outputs": [] }, { "cell_type": "code", "source": [ "import torch\n", "torch.cuda.empty_cache()\n", "\n", "from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments\n", "from datasets import Dataset\n", "from transformers import DataCollatorWithPadding" ], "metadata": { "id": "SxoVTW4bR8Qr" }, "execution_count": 6, "outputs": [] }, { "cell_type": "code", "source": [ "!gdown --id 1VCcfo0RxfjCPD7JBlWpx0_Z63Cmeur89" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "PZuA7u0YX9k3", "outputId": "9df30429-51a3-4cd4-eaec-672e445fea83" }, "execution_count": 11, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "/usr/local/lib/python3.10/dist-packages/gdown/__main__.py:140: FutureWarning: Option `--id` was deprecated in version 4.3.1 and will be removed in 5.0. You don't need to pass it anymore to use a file ID.\n", " warnings.warn(\n", "Downloading...\n", "From (original): https://drive.google.com/uc?id=1VCcfo0RxfjCPD7JBlWpx0_Z63Cmeur89\n", "From (redirected): https://drive.google.com/uc?id=1VCcfo0RxfjCPD7JBlWpx0_Z63Cmeur89&confirm=t&uuid=45c74e96-b387-4a05-957d-a462046d1454\n", "To: /content/saved_model.zip\n", "100% 557M/557M [00:24<00:00, 23.1MB/s]\n" ] } ] }, { "cell_type": "code", "source": [ "import zipfile\n", "import os\n", "\n", "zip_file_path = '/content/saved_model.zip'\n", "unzip_dir = 'model_directory' # Directory to extract to\n", "\n", "# Create the directory if it doesn't exist\n", "os.makedirs(unzip_dir, exist_ok=True)\n", "\n", "# Unzip the file\n", "with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:\n", " zip_ref.extractall(unzip_dir)" ], "metadata": { "id": "A7xap4b2VHBh" }, "execution_count": 12, "outputs": [] }, { "cell_type": "code", "source": [ "model_name = unzip_dir\n", "model = AutoModelForSequenceClassification.from_pretrained(model_name).to(\"cuda\")\n", "tokenizer = AutoTokenizer.from_pretrained(model_name)" ], "metadata": { "id": "HxcBHi-mV-Dj" }, "execution_count": 13, "outputs": [] }, { "cell_type": "code", "source": [ "# Tokenize the combined text\n", "def tokenize_data(batch):\n", " return tokenizer(\n", " batch['combined_text'],\n", " truncation=True,\n", " padding='longest', # Use dynamic padding to the longest sequence in the batch\n", " max_length=7000,\n", " return_tensors=\"pt\"\n", " )" ], "metadata": { "id": "GTOcz6puY1JZ" }, "execution_count": 14, "outputs": [] }, { "cell_type": "code", "source": [ "# Convert to Hugging Face Dataset\n", "test_dataset = Dataset.from_pandas(pd.DataFrame(test['combined_text']))\n", "\n", "# Tokenize the dataset in batches\n", "batch_size = 16 # Adjust based on memory capacity\n", "tokenized_dataset = test_dataset.map(tokenize_data, batched=True, batch_size=batch_size)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 49, "referenced_widgets": [ "c08db8312d3e4cc6ada9443e5a32eb6d", "968c745569084c12ac876b4c3dc8aede", "27c90016d4ac49c2b870ba8967d4a5df", "b59c4157290449269b98f135c09a844e", "ec9ea53f168e4892acfc7b2272f48762", "0f0be4b403a04e25915758770b64a3bb", "e749b52a2c9241dea2ccb390b1093a06", "f221c8ae15a946e4b80ac2a84813dade", "17bd7bf9b90b42f4993e0a4a8d96f5fd", "e407f7b6e1924087aed73c6ef7e1e180", "befa179548c043debfeb7d5d59e12050" ] }, "id": "wJ9Ls4xqWd8p", "outputId": "3a736ec9-7fd1-4a07-f62c-0f92063b1301" }, "execution_count": 15, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Map: 0%| | 0/8257 [00:00 0.5).long() # Convert probabilities to binary predictions\n", "\n", " # Store results\n", " predictions.extend(preds.cpu().numpy())\n", " probabilities.extend(probs.cpu().numpy())" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "kdmhybYfafBu", "outputId": "6989b63d-6038-4ca7-9535-b87d2e55f341" }, "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Running Inference: 100%|██████████| 517/517 [28:36<00:00, 3.32s/it]\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n", "\n", "# Ground truth labels (true values from your dataset)\n", "true_labels = test['label']\n", "\n", "# Calculate evaluation metrics\n", "accuracy = accuracy_score(true_labels, predictions)\n", "precision = precision_score(true_labels, predictions)\n", "recall = recall_score(true_labels, predictions)\n", "f1 = f1_score(true_labels, predictions)\n", "auc_roc = roc_auc_score(true_labels, probabilities)\n", "\n", "# Print metrics\n", "print(f\"Accuracy: {accuracy:.4f}\")\n", "print(f\"Precision: {precision:.4f}\")\n", "print(f\"Recall: {recall:.4f}\")\n", "print(f\"F1 Score: {f1:.4f}\")\n", "print(f\"AUC-ROC: {auc_roc:.4f}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "YDLrKth_bCUC", "outputId": "db27415b-f5a1-4b62-aaaf-66fad10fb7a8" }, "execution_count": 24, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Accuracy: 0.7027\n", "Precision: 0.6181\n", "Recall: 1.0000\n", "F1 Score: 0.7640\n", "AUC-ROC: 1.0000\n" ] } ] }, { "cell_type": "code", "source": [ "from sklearn.metrics import confusion_matrix\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "conf_matrix = confusion_matrix(true_labels, predictions)\n", "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n", "plt.title('Confusion Matrix')\n", "plt.xlabel('Predicted Labels')\n", "plt.ylabel('True Labels')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 472 }, "id": "v-_7CEEPdE5T", "outputId": "8ede06f0-d250-4ead-b790-1a1a5cd39546" }, "execution_count": 28, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "

" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAHHCAYAAACPy0PBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABM8klEQVR4nO3deVxU9f4/8NeAzLA5g4AwkAoopqAoLqWjuSWCSqZpt9zRXMIL3hK3KFPEjK5mLml6Wwyvy01btAJTEUQzcUPJLc0Fw5IBN0CQnfP7wx/zbQQ8jM7xIL6ePc7j4XzOZz7nfSaVt+/P53NGIQiCACIiIiIZWcgdABERERETEiIiIpIdExIiIiKSHRMSIiIikh0TEiIiIpIdExIiIiKSHRMSIiIikh0TEiIiIpIdExIiIiKSHRMSIgmdP38egYGB0Gg0UCgU2LZtm1nHv3z5MhQKBWJjY8067uOsd+/e6N27t9xhEJGJmJBQvXfx4kW8/vrraN68OaytraFWq9G9e3csX74chYWFkl47JCQEJ0+exMKFC7F+/Xp07txZ0us9SuPGjYNCoYBara72czx//jwUCgUUCgU+/PBDk8e/evUqoqKikJaWZoZoiaiuayB3AERSio+Pxz/+8Q+oVCqMHTsWbdu2RUlJCfbv34+ZM2fi9OnT+PTTTyW5dmFhIVJSUvDOO+8gPDxckmt4eHigsLAQVlZWkowvpkGDBrhz5w5+/PFHvPLKK0bnNm7cCGtraxQVFT3Q2FevXsX8+fPh6ekJf3//Wr9v165dD3Q9IpIXExKqt9LT0zF8+HB4eHggKSkJbm5uhnNhYWG4cOEC4uPjJbv+tWvXAAAODg6SXUOhUMDa2lqy8cWoVCp0794d//vf/6okJJs2bUJwcDC+/fbbRxLLnTt3YGtrC6VS+UiuR0TmxSkbqrcWLVqE/Px8fPHFF0bJSCVvb2+88cYbhtdlZWVYsGABWrRoAZVKBU9PT7z99tsoLi42ep+npydeeOEF7N+/H88++yysra3RvHlz/Pe//zX0iYqKgoeHBwBg5syZUCgU8PT0BHB3qqPy138XFRUFhUJh1JaQkIDnnnsODg4OsLe3R6tWrfD2228bzte0hiQpKQk9evSAnZ0dHBwcMHjwYPz222/VXu/ChQsYN24cHBwcoNFoMH78eNy5c6fmD/YeI0eOxE8//YScnBxD25EjR3D+/HmMHDmySv+bN29ixowZ8PPzg729PdRqNQYMGIBff/3V0Cc5ORnPPPMMAGD8+PGGqZ/K++zduzfatm2L1NRU9OzZE7a2tobP5d41JCEhIbC2tq5y/0FBQWjUqBGuXr1a63slIukwIaF668cff0Tz5s3RrVu3WvWfOHEi5s6di44dO2Lp0qXo1asXYmJiMHz48Cp9L1y4gJdffhn9+vXDkiVL0KhRI4wbNw6nT58GAAwdOhRLly4FAIwYMQLr16/HsmXLTIr/9OnTeOGFF1BcXIzo6GgsWbIEL774In755Zf7vm/37t0ICgpCdnY2oqKiEBERgQMHDqB79+64fPlylf6vvPIKbt++jZiYGLzyyiuIjY3F/Pnzax3n0KFDoVAo8N133xnaNm3ahNatW6Njx45V+l+6dAnbtm3DCy+8gI8++ggzZ87EyZMn0atXL0Ny4OPjg+joaADA5MmTsX79eqxfvx49e/Y0jHPjxg0MGDAA/v7+WLZsGfr06VNtfMuXL0fjxo0REhKC8vJyAMB//vMf7Nq1Cx9//DHc3d1rfa9EJCGBqB7Kzc0VAAiDBw+uVf+0tDQBgDBx4kSj9hkzZggAhKSkJEObh4eHAEDYt2+foS07O1tQqVTC9OnTDW3p6ekCAGHx4sVGY4aEhAgeHh5VYpg3b57w9z+SS5cuFQAI165dqzHuymt8+eWXhjZ/f3/BxcVFuHHjhqHt119/FSwsLISxY8dWud5rr71mNOZLL70kODk51XjNv9+HnZ2dIAiC8PLLLwt9+/YVBEEQysvLBa1WK8yfP7/az6CoqEgoLy+vch8qlUqIjo42tB05cqTKvVXq1auXAEBYs2ZNted69epl1LZz504BgPDee+8Jly5dEuzt7YUhQ4aI3iMRPTqskFC9lJeXBwBo2LBhrfpv374dABAREWHUPn36dACostbE19cXPXr0MLxu3LgxWrVqhUuXLj1wzPeqXHvy/fffo6KiolbvyczMRFpaGsaNGwdHR0dDe7t27dCvXz/Dff5daGio0esePXrgxo0bhs+wNkaOHInk5GTo9XokJSVBr9dXO10D3F13YmFx96+e8vJy3LhxwzAddezYsVpfU6VSYfz48bXqGxgYiNdffx3R0dEYOnQorK2t8Z///KfW1yIi6TEhoXpJrVYDAG7fvl2r/n/88QcsLCzg7e1t1K7VauHg4IA//vjDqL1Zs2ZVxmjUqBFu3br1gBFX9eqrr6J79+6YOHEiXF1dMXz4cGzZsuW+yUllnK1atapyzsfHB9evX0dBQYFR+7330qhRIwAw6V4GDhyIhg0bYvPmzdi4cSOeeeaZKp9lpYqKCixduhQtW7aESqWCs7MzGjdujBMnTiA3N7fW13zqqadMWsD64YcfwtHREWlpaVixYgVcXFxq/V4ikh4TEqqX1Go13N3dcerUKZPed++i0ppYWlpW2y4IwgNfo3J9QyUbGxvs27cPu3fvxpgxY3DixAm8+uqr6NevX5W+D+Nh7qWSSqXC0KFDsW7dOmzdurXG6ggAvP/++4iIiEDPnj2xYcMG7Ny5EwkJCWjTpk2tK0HA3c/HFMePH0d2djYA4OTJkya9l4ikx4SE6q0XXngBFy9eREpKimhfDw8PVFRU4Pz580btWVlZyMnJMeyYMYdGjRoZ7UipdG8VBgAsLCzQt29ffPTRRzhz5gwWLlyIpKQk7Nmzp9qxK+M8d+5clXNnz56Fs7Mz7OzsHu4GajBy5EgcP34ct2/frnYhcKVvvvkGffr0wRdffIHhw4cjMDAQAQEBVT6T2iaHtVFQUIDx48fD19cXkydPxqJFi3DkyBGzjU9ED48JCdVbs2bNgp2dHSZOnIisrKwq5y9evIjly5cDuDvlAKDKTpiPPvoIABAcHGy2uFq0aIHc3FycOHHC0JaZmYmtW7ca9bt582aV91Y+IOzerciV3Nzc4O/vj3Xr1hn9gD916hR27dpluE8p9OnTBwsWLMDKlSuh1Wpr7GdpaVml+vL111/jr7/+MmqrTJyqS95MNXv2bGRkZGDdunX46KOP4OnpiZCQkBo/RyJ69PhgNKq3WrRogU2bNuHVV1+Fj4+P0ZNaDxw4gK+//hrjxo0DALRv3x4hISH49NNPkZOTg169euHw4cNYt24dhgwZUuOW0gcxfPhwzJ49Gy+99BL+9a9/4c6dO1i9ejWefvppo0Wd0dHR2LdvH4KDg+Hh4YHs7Gx88sknaNKkCZ577rkax1+8eDEGDBgAnU6HCRMmoLCwEB9//DE0Gg2ioqLMdh/3srCwwJw5c0T7vfDCC4iOjsb48ePRrVs3nDx5Ehs3bkTz5s2N+rVo0QIODg5Ys2YNGjZsCDs7O3Tp0gVeXl4mxZWUlIRPPvkE8+bNM2xD/vLLL9G7d2+8++67WLRokUnjEZFEZN7lQyS533//XZg0aZLg6ekpKJVKoWHDhkL37t2Fjz/+WCgqKjL0Ky0tFebPny94eXkJVlZWQtOmTYXIyEijPoJwd9tvcHBwlevcu920pm2/giAIu3btEtq2bSsolUqhVatWwoYNG6ps+01MTBQGDx4suLu7C0qlUnB3dxdGjBgh/P7771Wuce/W2N27dwvdu3cXbGxsBLVaLQwaNEg4c+aMUZ/K6927rfjLL78UAAjp6ek1fqaCYLzttyY1bfudPn264ObmJtjY2Ajdu3cXUlJSqt2u+/333wu+vr5CgwYNjO6zV69eQps2baq95t/HycvLEzw8PISOHTsKpaWlRv2mTZsmWFhYCCkpKfe9ByJ6NBSCYMLKNSIiIiIJcA0JERERyY4JCREREcmOCQkRERHJjgkJERERyY4JCREREcmOCQkRERHJjgkJERERya5ePqn13R3nxTsRPYEOXrghdwhEdU5CeFfJr2HTIdws4xQeX2mWceoiVkiIiIhIdvWyQkJERFSnKPjvfzFMSIiIiKSmUMgdQZ3HhISIiEhqrJCI4idEREREsmOFhIiISGqcshHFhISIiEhqnLIRxU+IiIiIZMcKCRERkdQ4ZSOKCQkREZHUOGUjip8QERERyY4VEiIiIqlxykYUExIiIiKpccpGFD8hIiIikh0rJERERFLjlI0oJiRERERS45SNKCYkREREUmOFRBRTNiIiIpIdKyRERERS45SNKCYkREREUmNCIoqfEBEREcmOFRIiIiKpWXBRqxgmJERERFLjlI0ofkJEREQkO1ZIiIiIpMbnkIhiQkJERCQ1TtmI4idEREREsmOFhIiISGqcshHFhISIiEhqnLIRxYSEiIhIaqyQiGLKRkRERLJjhYSIiEhqnLIRxYSEiIhIapyyEcWUjYiIiGTHCgkREZHUOGUjigkJERGR1DhlI4opGxEREcmOFRIiIiKpccpGFBMSIiIiqTEhEcVPiIiIqB5avXo12rVrB7VaDbVaDZ1Oh59++slwvnfv3lAoFEZHaGio0RgZGRkIDg6Gra0tXFxcMHPmTJSVlRn1SU5ORseOHaFSqeDt7Y3Y2NgHipcVEiIiIqnJsKi1SZMm+OCDD9CyZUsIgoB169Zh8ODBOH78ONq0aQMAmDRpEqKjow3vsbW1Nfy6vLwcwcHB0Gq1OHDgADIzMzF27FhYWVnh/fffBwCkp6cjODgYoaGh2LhxIxITEzFx4kS4ubkhKCjIpHiZkBAREUlNhimbQYMGGb1euHAhVq9ejYMHDxoSEltbW2i12mrfv2vXLpw5cwa7d++Gq6sr/P39sWDBAsyePRtRUVFQKpVYs2YNvLy8sGTJEgCAj48P9u/fj6VLl5qckHDKhoiISGoKhVmO4uJi5OXlGR3FxcWily8vL8dXX32FgoIC6HQ6Q/vGjRvh7OyMtm3bIjIyEnfu3DGcS0lJgZ+fH1xdXQ1tQUFByMvLw+nTpw19AgICjK4VFBSElJQUkz8iJiRERESPiZiYGGg0GqMjJiamxv4nT56Evb09VCoVQkNDsXXrVvj6+gIARo4ciQ0bNmDPnj2IjIzE+vXrMXr0aMN79Xq9UTICwPBar9fft09eXh4KCwtNujdO2RAREUnNTFM2kZGRiIiIMGpTqVQ19m/VqhXS0tKQm5uLb775BiEhIdi7dy98fX0xefJkQz8/Pz+4ubmhb9++uHjxIlq0aGGWeE3BhISIiEhqZlrUqlKp7puA3EupVMLb2xsA0KlTJxw5cgTLly/Hf/7znyp9u3TpAgC4cOECWrRoAa1Wi8OHDxv1ycrKAgDDuhOtVmto+3sftVoNGxub2t8YOGVDRET0xKioqKhxzUlaWhoAwM3NDQCg0+lw8uRJZGdnG/okJCRArVYbpn10Oh0SExONxklISDBap1JbrJAQERFJTCHDtt/IyEgMGDAAzZo1w+3bt7Fp0yYkJydj586duHjxIjZt2oSBAwfCyckJJ06cwLRp09CzZ0+0a9cOABAYGAhfX1+MGTMGixYtgl6vx5w5cxAWFmao0oSGhmLlypWYNWsWXnvtNSQlJWHLli2Ij483OV4mJERERBKTIyHJzs7G2LFjkZmZCY1Gg3bt2mHnzp3o168frly5gt27d2PZsmUoKChA06ZNMWzYMMyZM8fwfktLS8TFxWHKlCnQ6XSws7NDSEiI0XNLvLy8EB8fj2nTpmH58uVo0qQJPv/8c5O3/AKAQhAEwSx3Xoe8u+O83CEQ1UkHL9yQOwSiOichvKvk17B7+UuzjFPwzXizjFMXsUJCREQktUdfIHnsMCEhIiKSmBxTNo8b7rIhIiIi2bFCQkREJDFWSMQxISEiIpIYExJxTEiIiIgkxoREHNeQEBERkexYISEiIpIaCySimJAQERFJjFM24jhlQ0RERLJjhYSIiEhirJCIY0JCREQkMSYk4jhlQ0RERLJjhYSIiEhirJCIY0JCREQkNeYjojhlQ0RERLJjhYSIiEhinLIRx4SEiIhIYkxIxDEhISIikhgTEnFcQ0JERESyY4WEiIhIaiyQiGJCQkREJDFO2YjjlA0RERHJjhUSIiIiibFCIo4JCRERkcSYkIjjlA0RERHJjhUSIiIiibFCIo4JCRERkdSYj4jilA0RERHJjhUSIiIiiXHKRhwTEiIiIokxIRHHhISIiEhiTEjEcQ0JERERyY4VEiIiIqmxQCKKCQkREZHEOGUjjlM2RERE9dDq1avRrl07qNVqqNVq6HQ6/PTTT4bzRUVFCAsLg5OTE+zt7TFs2DBkZWUZjZGRkYHg4GDY2trCxcUFM2fORFlZmVGf5ORkdOzYESqVCt7e3oiNjX2geFkhofu6duEUziZ9i1tXLqIo7ya6T3gHT7XTGc6XFhfi5I+x+OvEQZTcuQ07R1d49xwE7+cGAgCKC27j9E8bkXXuOO7cugaVnQbu7bqi7cDRUNrYGcbJOpeGU9s3IDfzDzRQquDxbF/4BY+FhaXlI79nIjHDO7njueaOaNrIBsVlFTijv43PD2Tgz5yiavsvHNQaz3o4YF78ORxIv2VoTwjvWrXvzvNIPn8DANDuKTWWvORbpc8ra1Nx606pme6GHgU5KiRNmjTBBx98gJYtW0IQBKxbtw6DBw/G8ePH0aZNG0ybNg3x8fH4+uuvodFoEB4ejqFDh+KXX34BAJSXlyM4OBharRYHDhxAZmYmxo4dCysrK7z//vsAgPT0dAQHByM0NBQbN25EYmIiJk6cCDc3NwQFBZkULxMSuq+ykiI4PNUcXl364cDa96uc/3Xr58g+fwJdxkyHnaMr9OeO49jXn8BG44Sn/LqgKPcGCnNvov3g16DWNkPBzWykblmFotwb6Pba2wCAnL8u4ef/RMEn8FU8OzoChbk3kLplFYSKCvgPmfCob5lIVDt3NX44mYVz2fmwVCjwmq4pPnjRBxM3/YqisgqjvkPbawFBqHGsxbsv4khGjuF1fnFZlT7jNqThTkm54XUOk5HHjhwJyaBBg4xeL1y4EKtXr8bBgwfRpEkTfPHFF9i0aROef/55AMCXX34JHx8fHDx4EF27dsWuXbtw5swZ7N69G66urvD398eCBQswe/ZsREVFQalUYs2aNfDy8sKSJUsAAD4+Pti/fz+WLl1qckLCKRu6LzffzvALHoMm7btVe/56+m/wePZ5uLRsBzsnV7To1h8O7l64mfE7AEDj7onuE96Ge9susHd2g+vT7eEXPBZXTx1GRfndv2Azjv0MjbsX2vQfgYaN3eHi7Yf2L47Hxf3xKC2688julai23v7xLHadvYY/bhbi0o07WLz7IlzVKrR0sTPq18LZFi93cMOHSZdqHCu/uAy37pQajtLyqslLzt/O37pTiprTG6LqlZeX46uvvkJBQQF0Oh1SU1NRWlqKgIAAQ5/WrVujWbNmSElJAQCkpKTAz88Prq6uhj5BQUHIy8vD6dOnDX3+PkZln8oxTCFrheT69etYu3YtUlJSoNfrAQBarRbdunXDuHHj0LhxYznDo1pw9vLB1ZOH4dWlH2w0Trh24SRuX7sK/1YdanxPaVEBrKxtDdMxFWWlsLSyMupjaaVCeWkJbl25AJeW7SS9B6KHZae6+3v5dtH/VTdUDSwQGeiNj/devu/0ytReXoh4vjky84oRdyoLO3+7VqXPmuHtYGWpwOUbd7D+8J84rc83/02QpMxVISkuLkZxcbFRm0qlgkqlqrb/yZMnodPpUFRUBHt7e2zduhW+vr5IS0uDUqmEg4ODUX9XV1fDz2O9Xm+UjFSerzx3vz55eXkoLCyEjY1Nre9NtgrJkSNH8PTTT2PFihXQaDTo2bMnevbsCY1GgxUrVqB169Y4evSoXOFRLXV4ORRqbVPEzRuHbyKGYN/quej4cigae7ettn9xfi7O7PwKzbv1N7RpfTriRvpZZKTuRUVFOe7kXMfpnf8DABTl3ap2HKK6QgFgSg9PnLqah8s3Cw3toc954ExmPlLSa/49HHvwCt7b8Ttmf/8b9l+8iX/18sKQdlrD+ZsFJVi25xKif/od0T/9jmv5JfjwJV94N7aV8pZICgrzHDExMdBoNEZHTExMjZdt1aoV0tLScOjQIUyZMgUhISE4c+aMdPf5EGSrkEydOhX/+Mc/sGbNmiqZoyAICA0NxdSpU0XLPtVli2UlJWigVJo9Zqrq/L4fcfOPc3hu0ruwbeSCaxdP4dg3a2CjcYJrK3+jvqVFd/Dzp/Oh1jZDmwEjDe3a1h3RbvB4pG5ZhUMblsCigRV8A4fj+sXTALfKUR03tZcXPB1tMe3b04Y2nWcjdGiiRujmk/d978ajfxl+ffH6HVg3sMA/Orhh24m7//r8M6fIaKHsGX0+3DXWGNbeDf/efdHMd0KPg8jISERERBi11VQdAQClUglvb28AQKdOnXDkyBEsX74cr776KkpKSpCTk2NUJcnKyoJWezcp1mq1OHz4sNF4lbtw/t7n3p05WVlZUKvVJlVHABkTkl9//RWxsbHVlrEUCgWmTZuGDh1qLvtXiomJwfz5843aeowKR6/R/zJbrFS9spJinIr7L7pNeAfubZ4BADg85YWcv9JxLuk7o4SktOgO9q2eiwYqG3Sf8A4sLI1/67Xq8xKe7j0ERXk3YWVjjzs3s3Eybh3snbQgqqvCe3qii6cDpn93BtcLSgzt/k3UcNNYY9ukZ4z6zx3wNE5l3saMrdX/C/W3rHyMfrYJrCwUKK2ofqXI2ax8tHVvaL6boEfCXFM295ueqY2KigoUFxejU6dOsLKyQmJiIoYNGwYAOHfuHDIyMqDT3d1JqdPpsHDhQmRnZ8PFxQUAkJCQALVaDV9fX0Of7du3G10jISHBMIYpZEtIKjOv1q1bV3v+8OHDVealqlNdthiTfMUsMdL9CRXlqCgvq/IHTWFhAeFvuwruJiPvwqKBFZ6b9C4sraqvXikUCthonAAAGcf2wtahMRyatpDuBogeQnhPT3Rv7ogZW89Af9u4SvvVsav46Uy2UdtnI9tjzf4/cPA+UzjezrbIKyqrMRkB7i6UvVnAXTaPGzl22URGRmLAgAFo1qwZbt++jU2bNiE5ORk7d+6ERqPBhAkTEBERAUdHR6jVakydOhU6nQ5du97djh4YGAhfX1+MGTMGixYtgl6vx5w5cxAWFmZIikJDQ7Fy5UrMmjULr732GpKSkrBlyxbEx8ebHK9sCcmMGTMwefJkpKamom/fvobkIysrC4mJifjss8/w4Ycfio5TXbbI6RrzKS0uRP61TMPr/BtZuPXnJSht7WHn6ILG3m3x6/drYWmlhK2jC65dOIU/jiSh/ZCJd99fdAd7P3kX5SXF6D5mBkqLClFadHeeXWWvhoXF3cWAZxO/hdanExQKBf48cQBnd38D3bjZhvNEdcnUXp54/mlnzIs/hzul5Whke3dRdkFxGUrKBcNumHtl3y42JC9dPR3QyNYKv+nzUVJegY5NHTC881P45vj//Xl7qb0W+rxi/HHzDpSWFhjg6wL/JhpE/vDbo7lRMhs5Zp+zs7MxduxYZGZmQqPRoF27dti5cyf69esHAFi6dCksLCwwbNgwFBcXIygoCJ988onh/ZaWloiLi8OUKVOg0+lgZ2eHkJAQREdHG/p4eXkhPj4e06ZNw/Lly9GkSRN8/vnnJm/5BQCFINxng7zENm/ejKVLlyI1NRXl/38LqKWlJTp16oSIiAi88sorDzTuuzvOmzPMJ1r2+RNIXvl2lXbPZ/vi2VHTUJh3Cyd/XIesc8dQcicfto1c0LxbEJ7uPQQKhaLG9wNA8NwvYOd0NxFNXvk2bv15ERVlpYYtwG6+nSW9tyfRwQs35A6hXqjugWbA3WeK7DpbdZdM5Xv+/mC0zs00mKBrBneNNRQAruYW4cdTWdh+OtuwrfeVDm4Y2MYVzvZKFJeV49L1O9hw5C/8+leeBHf15Krp/6c5ec/4SbxTLVz4cIBZxqmLZE1IKpWWluL69esAAGdnZ1jdswXUVExIiKrHhISoqkeRkLScucMs45xf3F+802OqTjyp1crKCm5ubnKHQUREJAluGBTHJ7USERGR7OpEhYSIiKg+k2OXzeOGCQkREZHEmI+I45QNERERyY4VEiIiIolZWLBEIoYJCRERkcQ4ZSOOUzZEREQkO1ZIiIiIJMZdNuKYkBAREUmM+Yg4JiREREQSY4VEHNeQEBERkexYISEiIpIYKyTimJAQERFJjPmIOE7ZEBERkexYISEiIpIYp2zEMSEhIiKSGPMRcZyyISIiItmxQkJERCQxTtmIY0JCREQkMeYj4jhlQ0RERLJjhYSIiEhinLIRx4SEiIhIYsxHxDEhISIikhgrJOK4hoSIiIhkxwoJERGRxFggEceEhIiISGKcshHHKRsiIiKSHSskREREEmOBRBwTEiIiIolxykYcp2yIiIhIdqyQEBERSYwFEnFMSIiIiCTGKRtxnLIhIiIi2bFCQkREJDFWSMSxQkJERCQxhcI8hyliYmLwzDPPoGHDhnBxccGQIUNw7tw5oz69e/eGQqEwOkJDQ436ZGRkIDg4GLa2tnBxccHMmTNRVlZm1Cc5ORkdO3aESqWCt7c3YmNjTf6MmJAQERFJ7N4f+g96mGLv3r0ICwvDwYMHkZCQgNLSUgQGBqKgoMCo36RJk5CZmWk4Fi1aZDhXXl6O4OBglJSU4MCBA1i3bh1iY2Mxd+5cQ5/09HQEBwejT58+SEtLw5tvvomJEydi586dJsXLKRsiIqJ6aMeOHUavY2Nj4eLigtTUVPTs2dPQbmtrC61WW+0Yu3btwpkzZ7B79264urrC398fCxYswOzZsxEVFQWlUok1a9bAy8sLS5YsAQD4+Phg//79WLp0KYKCgmodLyskREREEjPXlE1xcTHy8vKMjuLi4lrFkJubCwBwdHQ0at+4cSOcnZ3Rtm1bREZG4s6dO4ZzKSkp8PPzg6urq6EtKCgIeXl5OH36tKFPQECA0ZhBQUFISUkx6TNiQkJERCQxc03ZxMTEQKPRGB0xMTGi16+oqMCbb76J7t27o23btob2kSNHYsOGDdizZw8iIyOxfv16jB492nBer9cbJSMADK/1ev19++Tl5aGwsLDWnxGnbIiIiB4TkZGRiIiIMGpTqVSi7wsLC8OpU6ewf/9+o/bJkycbfu3n5wc3Nzf07dsXFy9eRIsWLcwTdC0xISEiIpKYuXb9qlSqWiUgfxceHo64uDjs27cPTZo0uW/fLl26AAAuXLiAFi1aQKvV4vDhw0Z9srKyAMCw7kSr1Rra/t5HrVbDxsam1nFyyoaIiEhiFgqFWQ5TCIKA8PBwbN26FUlJSfDy8hJ9T1paGgDAzc0NAKDT6XDy5ElkZ2cb+iQkJECtVsPX19fQJzEx0WichIQE6HQ6k+JlQkJERFQPhYWFYcOGDdi0aRMaNmwIvV4PvV5vWNdx8eJFLFiwAKmpqbh8+TJ++OEHjB07Fj179kS7du0AAIGBgfD19cWYMWPw66+/YufOnZgzZw7CwsIMlZrQ0FBcunQJs2bNwtmzZ/HJJ59gy5YtmDZtmknxMiEhIiKSmBwPRlu9ejVyc3PRu3dvuLm5GY7NmzcDAJRKJXbv3o3AwEC0bt0a06dPx7Bhw/Djjz8axrC0tERcXBwsLS2h0+kwevRojB07FtHR0YY+Xl5eiI+PR0JCAtq3b48lS5bg888/N2nLL8A1JERERJKT49HxgiDc93zTpk2xd+9e0XE8PDywffv2+/bp3bs3jh8/blJ892JCQkREJDELfpWNKE7ZEBERkexYISEiIpIYv+1XnMkVknXr1iE+Pt7wetasWXBwcEC3bt3wxx9/mDU4IiKi+kCORa2PG5MTkvfff9/woJOUlBSsWrUKixYtgrOzs8lbfIiIiIiAB5iyuXLlCry9vQEA27Ztw7BhwzB58mR0794dvXv3Nnd8REREjz0F6nl5wwxMrpDY29vjxo0bAO5+LXG/fv0AANbW1iZ9iQ4REdGTwkJhnqM+M7lC0q9fP0ycOBEdOnTA77//joEDBwIATp8+DU9PT3PHR0RERE8Akyskq1atgk6nw7Vr1/Dtt9/CyckJAJCamooRI0aYPUAiIqLHnUKhMMtRn5lcIXFwcMDKlSurtM+fP98sAREREdU39TyXMItaJSQnTpyo9YCVX8hDREREVFu1Skj8/f2hUChqfC5+5TmFQoHy8nKzBkhERPS4s2CJRFStEpL09HSp4yAiIqq3mI+Iq1VC4uHhIXUcRERE9VZ9X5BqDg/05Xrr169H9+7d4e7ubnhc/LJly/D999+bNTgiIiJ6MpickKxevRoREREYOHAgcnJyDGtGHBwcsGzZMnPHR0RE9Njjd9mIMzkh+fjjj/HZZ5/hnXfegaWlpaG9c+fOOHnypFmDIyIiqg8sFAqzHPWZyQlJeno6OnToUKVdpVKhoKDALEERERHRk8XkhMTLywtpaWlV2nfs2AEfHx9zxERERFSvKMx01GcmP6k1IiICYWFhKCoqgiAIOHz4MP73v/8hJiYGn3/+uRQxEhERPda4y0acyQnJxIkTYWNjgzlz5uDOnTsYOXIk3N3dsXz5cgwfPlyKGImIiKieMzkhAYBRo0Zh1KhRuHPnDvLz8+Hi4mLuuIiIiOoNCxZIRD1QQgIA2dnZOHfuHIC7pajGjRubLSgiIqL6hFM24kxe1Hr79m2MGTMG7u7u6NWrF3r16gV3d3eMHj0aubm5UsRIRERE9ZzJCcnEiRNx6NAhxMfHIycnBzk5OYiLi8PRo0fx+uuvSxEjERHRY40PRhNn8pRNXFwcdu7cieeee87QFhQUhM8++wz9+/c3a3BERET1AadsxJmckDg5OUGj0VRp12g0aNSokVmCIiIiqk+4qFWcyVM2c+bMQUREBPR6vaFNr9dj5syZePfdd80aHBERET0ZalUh6dChg1G56fz582jWrBmaNWsGAMjIyIBKpcK1a9e4joSIiOgenLIRV6uEZMiQIRKHQUREVH8xHRFXq4Rk3rx5UsdBRERET7AHfjAaERER1Y4Fp2xEmZyQlJeXY+nSpdiyZQsyMjJQUlJidP7mzZtmC46IiKg+YD4izuRdNvPnz8dHH32EV199Fbm5uYiIiMDQoUNhYWGBqKgoCUIkIiKi+s7khGTjxo347LPPMH36dDRo0AAjRozA559/jrlz5+LgwYNSxEhERPRYUygUZjnqM5MTEr1eDz8/PwCAvb294ftrXnjhBcTHx5s3OiIionpAjkfHx8TE4JlnnkHDhg3h4uKCIUOGGL4Ut1JRURHCwsLg5OQEe3t7DBs2DFlZWUZ9MjIyEBwcDFtbW7i4uGDmzJkoKysz6pOcnIyOHTtCpVLB29sbsbGxJn9GJickTZo0QWZmJgCgRYsW2LVrFwDgyJEjUKlUJgdARERE5rd3716EhYXh4MGDSEhIQGlpKQIDA1FQUGDoM23aNPz444/4+uuvsXfvXly9ehVDhw41nC8vL0dwcDBKSkpw4MABrFu3DrGxsZg7d66hT3p6OoKDg9GnTx+kpaXhzTffxMSJE7Fz506T4lUIgiCY8oa33noLarUab7/9NjZv3ozRo0fD09MTGRkZmDZtGj744AOTApDCuzvOyx0CUZ108MINuUMgqnMSwrtKfo0p354xyzirh/k+8HuvXbsGFxcX7N27Fz179kRubi4aN26MTZs24eWXXwYAnD17Fj4+PkhJSUHXrl3x008/4YUXXsDVq1fh6uoKAFizZg1mz56Na9euQalUYvbs2YiPj8epU6cM1xo+fDhycnKwY8eOWsdn8i6bvyccr776Kjw8PHDgwAG0bNkSgwYNMnU4IiKieq8uLP+oXGLh6OgIAEhNTUVpaSkCAgIMfVq3bo1mzZoZEpKUlBT4+fkZkhHg7hfqTpkyBadPn0aHDh2QkpJiNEZlnzfffNOk+B76OSRdu3ZF165dkZ2djffffx9vv/32ww5JRERUr5hrQWpxcTGKi4uN2lQqleiSiYqKCrz55pvo3r072rZtC+DumlClUgkHBwejvq6urobvq9Pr9UbJSOX5ynP365OXl4fCwkLY2NjU6t5MXkNSk8zMTH65HhERkYRiYmKg0WiMjpiYGNH3hYWF4dSpU/jqq68eQZQPpl4+qfWdgJZyh0BUJzWKXC53CER1zyNYQ2Kuf/1HRkYiIiLCqE2sOhIeHo64uDjs27cPTZo0MbRrtVqUlJQgJyfHqEqSlZUFrVZr6HP48GGj8Sp34fy9z707c7KysqBWq2tdHQHMWCEhIiKi6pnrOSQqlQpqtdroqCkhEQQB4eHh2Lp1K5KSkuDl5WV0vlOnTrCyskJiYqKh7dy5c8jIyIBOpwMA6HQ6nDx5EtnZ2YY+CQkJUKvV8PX1NfT5+xiVfSrHqK16WSEhIiJ60oWFhWHTpk34/vvv0bBhQ8OaD41GAxsbG2g0GkyYMAERERFwdHSEWq3G1KlTodPp0LXr3apRYGAgfH19MWbMGCxatAh6vR5z5sxBWFiYIREKDQ3FypUrMWvWLLz22mtISkrCli1bTH42Wa0TkntLRPe6du2aSRcmIiJ6UljIsMtm9erVAIDevXsbtX/55ZcYN24cAGDp0qWwsLDAsGHDUFxcjKCgIHzyySeGvpaWloiLi8OUKVOg0+lgZ2eHkJAQREdHG/p4eXkhPj4e06ZNw/Lly9GkSRN8/vnnCAoKMineWj+HpE+fPrUacM+ePSYFIIWiMvE+RE+iRs+Eyx0CUZ1TeHyl5NeI+OGsWcb56MXWZhmnLqp1haQuJBpERERUP3ENCRERkcTq+xfjmQMTEiIiIonJsYbkccNtv0RERCQ7VkiIiIgkxhkbcUxIiIiIJGbBjETUA03Z/Pzzzxg9ejR0Oh3++usvAMD69euxf/9+swZHRERUH1iY6ajPTL6/b7/9FkFBQbCxscHx48cN3zqYm5uL999/3+wBEhERUf1nckLy3nvvYc2aNfjss89gZWVlaO/evTuOHTtm1uCIiIjqA4XCPEd9ZvIaknPnzqFnz55V2jUaDXJycswRExERUb3CNSTiTK6QaLVaXLhwoUr7/v370bx5c7MERURERE8WkxOSSZMm4Y033sChQ4egUChw9epVbNy4ETNmzMCUKVOkiJGIiOixxikbcSZP2bz11luoqKhA3759cefOHfTs2RMqlQozZszA1KlTpYiRiIjoscYntYozOSFRKBR45513MHPmTFy4cAH5+fnw9fWFvb29FPERERHRE+CBH4ymVCrh6+trzliIiIjqJS5qFWdyQtKnT5/7fmthUlLSQwVERERU3zAfEWdyQuLv72/0urS0FGlpaTh16hRCQkLMFRcRERE9QUxOSJYuXVpte1RUFPLz8x86ICIiovqGi1rFme3R+KNHj8batWvNNRwREVG9oTDTf/WZ2b7tNyUlBdbW1uYajoiIqN5ghUScyQnJ0KFDjV4LgoDMzEwcPXoU7777rtkCIyIioieHyQmJRqMxem1hYYFWrVohOjoagYGBZguMiIiovmCFRJxJCUl5eTnGjx8PPz8/NGrUSKqYiIiI6pX7PS6D7jJpUaulpSUCAwP5rb5ERERkVibvsmnbti0uXbokRSxERET1koXCPEd9ZnJC8t5772HGjBmIi4tDZmYm8vLyjA4iIiIyxm/7FVfrNSTR0dGYPn06Bg4cCAB48cUXjebEBEGAQqFAeXm5+aMkIiKieq3WCcn8+fMRGhqKPXv2SBkPERFRvcMv1xNX64REEAQAQK9evSQLhoiIqD6q7+s/zMGkNSTctkRERERSMOk5JE8//bRoUnLz5s2HCoiIiKi+4b/nxZmUkMyfP7/Kk1qJiIjo/izq+RfjmYNJCcnw4cPh4uIiVSxERET1Eisk4mq9hoTrR4iIiEgqJu+yISIiItNwl424WickFRUVUsZBRERUb/E5JOJMfnQ8ERERPR727duHQYMGwd3dHQqFAtu2bTM6P27cOCgUCqOjf//+Rn1u3ryJUaNGQa1Ww8HBARMmTEB+fr5RnxMnTqBHjx6wtrZG06ZNsWjRIpNjZUJCREQkMbm+y6agoADt27fHqlWrauzTv39/ZGZmGo7//e9/RudHjRqF06dPIyEhAXFxcdi3bx8mT55sOJ+Xl4fAwEB4eHggNTUVixcvRlRUFD799FOTYjVplw0RERGZTq4pmwEDBmDAgAH37aNSqaDVaqs999tvv2HHjh04cuQIOnfuDAD4+OOPMXDgQHz44Ydwd3fHxo0bUVJSgrVr10KpVKJNmzZIS0vDRx99ZJS4iGGFhIiI6DFRXFyMvLw8o6O4uPihxkxOToaLiwtatWqFKVOm4MaNG4ZzKSkpcHBwMCQjABAQEAALCwscOnTI0Kdnz55QKpWGPkFBQTh37hxu3bpV6ziYkBAREUnMXFM2MTEx0Gg0RkdMTMwDx9W/f3/897//RWJiIv79739j7969GDBgAMrLywEAer2+yvPHGjRoAEdHR+j1ekMfV1dXoz6Vryv71AanbIiIiCRmrn/9R0ZGIiIiwqhNpVI98HjDhw83/NrPzw/t2rVDixYtkJycjL59+z7wuA+CFRIiIqLHhEqlglqtNjoeJiG5V/PmzeHs7IwLFy4AALRaLbKzs436lJWV4ebNm4Z1J1qtFllZWUZ9Kl/XtDalOkxIiIiIJHbv1toHPaT2559/4saNG3BzcwMA6HQ65OTkIDU11dAnKSkJFRUV6NKli6HPvn37UFpaauiTkJCAVq1aoVGjRrW+NhMSIiIiiSnMdJgqPz8faWlpSEtLAwCkp6cjLS0NGRkZyM/Px8yZM3Hw4EFcvnwZiYmJGDx4MLy9vREUFAQA8PHxQf/+/TFp0iQcPnwYv/zyC8LDwzF8+HC4u7sDAEaOHAmlUokJEybg9OnT2Lx5M5YvX15lakkM15AQERFJTK5tv0ePHkWfPn0MryuThJCQEKxevRonTpzAunXrkJOTA3d3dwQGBmLBggVG00AbN25EeHg4+vbtCwsLCwwbNgwrVqwwnNdoNNi1axfCwsLQqVMnODs7Y+7cuSZt+QUAhVAPv6SmqEzuCIjqpkbPhMsdAlGdU3h8peTX2JD6p1nGGd2piVnGqYtYISEiIpIYv8lGHBMSIiIiifG79cRxUSsRERHJjhUSIiIiiT2KLbuPOyYkREREEuN0hDh+RkRERCQ7VkiIiIgkxikbcUxIiIiIJMZ0RBynbIiIiEh2rJAQERFJjFM24piQEBERSYzTEeKYkBAREUmMFRJxTNqIiIhIdqyQEBERSYz1EXFMSIiIiCTGGRtxnLIhIiIi2bFCQkREJDELTtqIYkJCREQkMU7ZiOOUDREREcmOFRIiIiKJKThlI4oJCRERkcQ4ZSOOUzZEREQkO1ZIiIiIJMZdNuKYkBAREUmMUzbimJAQERFJjAmJOK4hISIiItmxQkJERCQxbvsVx4SEiIhIYhbMR0RxyoaIiIhkxwoJERGRxDhlI44JCRERkcS4y0Ycp2yIiIhIdqyQEBERSYxTNuKYkBAREUmMu2zEccqGiIiIZMeEhCTz1aaNGNDveTzTwQ+jhv8DJ0+ckDskIrOY9I/ncHhzJLJ+Xoysnxcjed10BHb3NZz3auKMzUsmISMpBlk/L8aGf78GF8eGhvM9OrVE4fGV1R6dfJsBAFp6uGDHp//C5d3v49bBpTjzYxTm/fMFNGjAv7YfRwoz/Weqffv2YdCgQXB3d4dCocC2bduMzguCgLlz58LNzQ02NjYICAjA+fPnjfrcvHkTo0aNglqthoODAyZMmID8/HyjPidOnECPHj1gbW2Npk2bYtGiRSbHyt/ZJIkdP23Hh4ti8Po/w/DV11vRqlVrTHl9Am7cuCF3aEQP7a+sHLz78ffoNmoRuo9ajOTDv+PrpZPh01wLW2sl4j4JgyAIGDD5Yzw/fimUVpb4dvnrUPz/rRYHf70Ez4BIo2Ptd78g/c/rSD2TAQAoLSvHxrjDGPTPVWj/UjRmfvgtxg/thndDg+W8dXpACoV5DlMVFBSgffv2WLVqVbXnFy1ahBUrVmDNmjU4dOgQ7OzsEBQUhKKiIkOfUaNG4fTp00hISEBcXBz27duHyZMnG87n5eUhMDAQHh4eSE1NxeLFixEVFYVPP/3UtM9IEATB9Fus24rK5I6ARg3/B9q09cPbc+YCACoqKhDYtxdGjByDCZMmi7ybpNLomXC5Q6i3/kr+N95etg1/6m/h+5X/hFuvWbhdcPcvdbW9NTL3LsIL/1yFPYfOVXlvgwYWuLhzIVZ/tRcffLajxmv8e/pQdPJthoAJy6S6jSdS4fGVkl/jl/O3zDJO95aNHvi9CoUCW7duxZAhQwDcrY64u7tj+vTpmDFjBgAgNzcXrq6uiI2NxfDhw/Hbb7/B19cXR44cQefOnQEAO3bswMCBA/Hnn3/C3d0dq1evxjvvvAO9Xg+lUgkAeOutt7Bt2zacPXu21vGxQkJmV1pSgt/OnEZXXTdDm4WFBbp27YYTvx6XMTIi87OwUOAfQZ1gZ6PEoRPpUCkbQBAEFJf837+MiorLUFEhoJt/i2rHeKFXOzhp7LD++4M1Xqd5U2f06+aDn1MvmP0e6MmUnp4OvV6PgIAAQ5tGo0GXLl2QkpICAEhJSYGDg4MhGQGAgIAAWFhY4NChQ4Y+PXv2NCQjABAUFIRz587h1q3aJ2J1epfNlStXMG/ePKxdu7bGPsXFxSguLjZqEyxVUKlUUodHNbiVcwvl5eVwcnIyandyckJ6+iWZoiIyrzbe7kheNx3WygbILyzGq9M/w9lLely/lY+CwhIsfGMw5q78AQoo8N4bg9GggSW0zupqxwoZokNCym/4Kzunyrk9sRHwb90U1iorfP7NfkSvjpf4zkgKFmZ6Mlp1P/NUqgf7mafX6wEArq6uRu2urq6Gc3q9Hi4uLkbnGzRoAEdHR6M+Xl5eVcaoPNeoUe2qOnW6QnLz5k2sW7fuvn1iYmKg0WiMjsX/jnlEERLRk+r3y1noMjwGPcd+iM++3o/PosegdXMtrt/Kx6hZX2Bgz7a4/ssSZP28GBp7Gxw7k4GKambIn3JxQD+dD9ZtS6n2OmNmr4Vu5L8REvklBvRog2lj+0p9ayQBhZmO6n7mxcTUj595slZIfvjhh/uev3RJ/F/TkZGRiIiIMGoTLFkdkVMjh0awtLSssoD1xo0bcHZ2likqIvMqLSvHpSvXAQDHf7uCTm2aIWxEb0xd+BUSD55Fmxfnw8nBDmVlFcjNL0R6wvu4vDO1yjhjBnfFjdwCxO2tfhfan1k5AICzl/SwsLDAqjkjsGx9Iioq6t3yP6qF6n7mPeiMgFarBQBkZWXBzc3N0J6VlQV/f39Dn+zsbKP3lZWV4ebNm4b3a7VaZGVlGfWpfF3ZpzZkTUiGDBkChUKB+62rVYiUuaorVXFRq7yslEr4+LbBoYMpeL7v3bnJiooKHDqUguEjRsscHZE0LBQKqJTGf6XeyCkAAPR65mm4ONojbu/JKu8b+2JXbIo7jLKyCvFrWChg1cASFhYKJiSPGzM9GO1Bp2eq4+XlBa1Wi8TEREMCkpeXh0OHDmHKlCkAAJ1Oh5ycHKSmpqJTp04AgKSkJFRUVKBLly6GPu+88w5KS0thZWUFAEhISECrVq1qPV0DyDxl4+bmhu+++w4VFRXVHseOHZMzPHoIY0LG47tvtuCHbVtx6eJFvBcdhcLCQgx5aajcoRE9tOipL6J7xxZo5uaINt7uiJ76Inp2bomvth8FAIx5sSue9fOEVxNnDB/4DDYumoCPN+7B+T+M/6XZ+9mn4dXEGV9uPVDlGsMHdMawfh3QyssVnk85YVi/Dlgw9UV8syu1VskL1S1yPYckPz8faWlpSEtLA3B3IWtaWhoyMjKgUCjw5ptv4r333sMPP/yAkydPYuzYsXB3dzfsxPHx8UH//v0xadIkHD58GL/88gvCw8MxfPhwuLu7AwBGjhwJpVKJCRMm4PTp09i8eTOWL19epZIjRtYKSadOnZCamorBgwdXe16sekJ1V/8BA3Hr5k18snIFrl+/hlatffDJfz6HE6dsqB5o7GiPLxaMhdZZjdz8Ipw6/xcG/fMTJB26u8XxaU8XRE99EY4aW/xx9SYWfbETKzYkVRln3JBuSEm7iN8vZ1U5V1ZegYhx/dDSwwUKhQIZmTexevM+fFzNOEQ1OXr0KPr06WN4XZkkhISEIDY2FrNmzUJBQQEmT56MnJwcPPfcc9ixYwesra0N79m4cSPCw8PRt29fWFhYYNiwYVixYoXhvEajwa5duxAWFoZOnTrB2dkZc+fONXpWSW3I+hySn3/+GQUFBejfv3+15wsKCnD06FH06tXLpHE5ZUNUPT6HhKiqR/EcksOXcs0yzrPNNWYZpy6StULSo0eP+563s7MzORkhIiKqa/jdeuLq9LZfIiIiejLU6QejERER1QsskYhiQkJERCSxB9kh86RhQkJERCQxMz05vl7jGhIiIiKSHSskREREEmOBRBwTEiIiIqkxIxHFKRsiIiKSHSskREREEuMuG3FMSIiIiCTGXTbiOGVDREREsmOFhIiISGIskIhjQkJERCQ1ZiSiOGVDREREsmOFhIiISGLcZSOOCQkREZHEuMtGHBMSIiIiiTEfEcc1JERERCQ7VkiIiIikxhKJKCYkREREEuOiVnGcsiEiIiLZsUJCREQkMe6yEceEhIiISGLMR8RxyoaIiIhkxwoJERGR1FgiEcWEhIiISGLcZSOOUzZEREQkO1ZIiIiIJMZdNuKYkBAREUmM+Yg4JiRERERSY0YiimtIiIiISHaskBAREUmMu2zEMSEhIiKSGBe1iuOUDREREcmOFRIiIiKJsUAijhUSIiIiqSnMdJggKioKCoXC6GjdurXhfFFREcLCwuDk5AR7e3sMGzYMWVlZRmNkZGQgODgYtra2cHFxwcyZM1FWVvYAH4A4VkiIiIjqqTZt2mD37t2G1w0a/N+P/WnTpiE+Ph5ff/01NBoNwsPDMXToUPzyyy8AgPLycgQHB0Or1eLAgQPIzMzE2LFjYWVlhffff9/ssTIhISIikphcu2waNGgArVZbpT03NxdffPEFNm3ahOeffx4A8OWXX8LHxwcHDx5E165dsWvXLpw5cwa7d++Gq6sr/P39sWDBAsyePRtRUVFQKpVmjZVTNkRERBJTKMxzFBcXIy8vz+goLi6u8brnz5+Hu7s7mjdvjlGjRiEjIwMAkJqaitLSUgQEBBj6tm7dGs2aNUNKSgoAICUlBX5+fnB1dTX0CQoKQl5eHk6fPm32z4gJCRER0WMiJiYGGo3G6IiJiam2b5cuXRAbG4sdO3Zg9erVSE9PR48ePXD79m3o9XoolUo4ODgYvcfV1RV6vR4AoNfrjZKRyvOV58yNUzZEREQSM9eETWRkJCIiIozaVCpVtX0HDBhg+HW7du3QpUsXeHh4YMuWLbCxsTFTRObDCgkREZHUzLTLRqVSQa1WGx01JST3cnBwwNNPP40LFy5Aq9WipKQEOTk5Rn2ysrIMa060Wm2VXTeVr6tbl/KwmJAQERFJTGGm/x5Gfn4+Ll68CDc3N3Tq1AlWVlZITEw0nD937hwyMjKg0+kAADqdDidPnkR2drahT0JCAtRqNXx9fR8qlupwyoaIiKgemjFjBgYNGgQPDw9cvXoV8+bNg6WlJUaMGAGNRoMJEyYgIiICjo6OUKvVmDp1KnQ6Hbp27QoACAwMhK+vL8aMGYNFixZBr9djzpw5CAsLq3VVxhRMSIiIiCQmx3fZ/PnnnxgxYgRu3LiBxo0b47nnnsPBgwfRuHFjAMDSpUthYWGBYcOGobi4GEFBQfjkk08M77e0tERcXBymTJkCnU4HOzs7hISEIDo6WpJ4FYIgCJKMLKMiaR4iR/TYa/RMuNwhENU5hcdXSn6NKzdr3ppriqaO5q9M1BVcQ0JERESy45QNERGRxOSYsnncMCEhIiKSHDMSMZyyISIiItmxQkJERCQxTtmIY0JCREQkMeYj4jhlQ0RERLJjhYSIiEhinLIRx4SEiIhIYg/7PTRPAiYkREREUmM+IoprSIiIiEh2rJAQERFJjAUScUxIiIiIJMZFreI4ZUNERESyY4WEiIhIYtxlI44JCRERkdSYj4jilA0RERHJjhUSIiIiibFAIo4JCRERkcS4y0Ycp2yIiIhIdqyQEBERSYy7bMQxISEiIpIYp2zEccqGiIiIZMeEhIiIiGTHKRsiIiKJccpGHBMSIiIiiXFRqzhO2RAREZHsWCEhIiKSGKdsxDEhISIikhjzEXGcsiEiIiLZsUJCREQkNZZIRDEhISIikhh32YjjlA0RERHJjhUSIiIiiXGXjTgmJERERBJjPiKOUzZERERSU5jpeACrVq2Cp6cnrK2t0aVLFxw+fPihbkUqTEiIiIjqqc2bNyMiIgLz5s3DsWPH0L59ewQFBSE7O1vu0KpgQkJERCQxhZn+M9VHH32ESZMmYfz48fD19cWaNWtga2uLtWvXSnCXD4cJCRERkcQUCvMcpigpKUFqaioCAgIMbRYWFggICEBKSoqZ7/DhcVErERHRY6K4uBjFxcVGbSqVCiqVqkrf69evo7y8HK6urkbtrq6uOHv2rKRxPoh6mZBY18u7evwUFxcjJiYGkZGR1f5hoUev8PhKuUMg8M/Gk8hcP5ei3ovB/PnzjdrmzZuHqKgo81xARgpBEAS5g6D6KS8vDxqNBrm5uVCr1XKHQ1Rn8M8GPShTKiQlJSWwtbXFN998gyFDhhjaQ0JCkJOTg++//17qcE3CNSRERESPCZVKBbVabXTUVGVTKpXo1KkTEhMTDW0VFRVITEyETqd7VCHXGic3iIiI6qmIiAiEhISgc+fOePbZZ7Fs2TIUFBRg/PjxcodWBRMSIiKieurVV1/FtWvXMHfuXOj1evj7+2PHjh1VFrrWBUxISDIqlQrz5s3joj2ie/DPBj1K4eHhCA8PlzsMUVzUSkRERLLjolYiIiKSHRMSIiIikh0TEiIiIpIdExIiIiKSHRMSksyqVavg6ekJa2trdOnSBYcPH5Y7JCJZ7du3D4MGDYK7uzsUCgW2bdsmd0hEdQYTEpLE5s2bERERgXnz5uHYsWNo3749goKCkJ2dLXdoRLIpKChA+/btsWrVKrlDIapzuO2XJNGlSxc888wzWLny7pe5VVRUoGnTppg6dSreeustmaMjkp9CocDWrVuNvmOE6EnGCgmZXUlJCVJTUxEQEGBos7CwQEBAAFJSUmSMjIiI6iomJGR2169fR3l5eZVHE7u6ukKv18sUFRER1WVMSIiIiEh2TEjI7JydnWFpaYmsrCyj9qysLGi1WpmiIiKiuowJCZmdUqlEp06dkJiYaGirqKhAYmIidDqdjJEREVFdxW/7JUlEREQgJCQEnTt3xrPPPotly5ahoKAA48ePlzs0Itnk5+fjwoULhtfp6elIS0uDo6MjmjVrJmNkRPLjtl+SzMqVK7F48WLo9Xr4+/tjxYoV6NKli9xhEckmOTkZffr0qdIeEhKC2NjYRx8QUR3ChISIiIhkxzUkREREJDsmJERERCQ7JiREREQkOyYkREREJDsmJERERCQ7JiREREQkOyYkREREJDsmJEQyGDduHIYMGWJ43bt3b7z55puPPI7k5GQoFArk5ORIdo177/VBPIo4iUheTEiI/r9x48ZBoVBAoVBAqVTC29sb0dHRKCsrk/za3333HRYsWFCrvo/6h7OnpyeWLVv2SK5FRE8ufpcN0d/0798fX375JYqLi7F9+3aEhYXBysoKkZGRVfqWlJRAqVSa5bqOjo5mGYeI6HHFCgnR36hUKmi1Wnh4eGDKlCkICAjADz/8AOD/ph4WLlwId3d3tGrVCgBw5coVvPLKK3BwcICjoyMGDx6My5cvG8YsLy9HREQEHBwc4OTkhFmzZuHeb2y4d8qmuLgYs2fPRtOmTaFSqeDt7Y0vvvgCly9fNnwXSqNGjaBQKDBu3DgAd79ROSYmBl5eXrCxsUH79u3xzTffGF1n+/btePrpp2FjY4M+ffoYxfkgysvLMWHCBMM1W7VqheXLl1fbd/78+WjcuDHUajVCQ0NRUlJiOFeb2P/ujz/+wKBBg9CoUSPY2dmhTZs22L59+0PdCxHJixUSovuwsbHBjRs3DK8TExOhVquRkJAAACgtLUVQUBB0Oh1+/vlnNGjQAO+99x769++PEydOQKlUYsmSJYiNjcXatWvh4+ODJUuWYOvWrXj++edrvO7YsWORkpKCFStWoH379khPT8f169fRtGlTfPvttxg2bBjOnTsHtVoNGxsbAEBMTAw2bNiANWvWoGXLlti3bx9Gjx6Nxo0bo1evXrhy5QqGDh2KsLAwTJ48GUePHsX06dMf6vOpqKhAkyZN8PXXX8PJyQkHDhzA5MmT4ebmhldeecXoc7O2tkZycjIuX76M8ePHw8nJCQsXLqxV7PcKCwtDSUkJ9u3bBzs7O5w5cwb29vYPdS9EJDOBiARBEISQkBBh8ODBgiAIQkVFhZCQkCCoVCphxowZhvOurq5CcXGx4T3r168XWrVqJVRUVBjaiouLBRsbG2Hnzp2CIAiCm5ubsGjRIsP50tJSoUmTJoZrCYIg9OrVS3jjjTcEQRCEc+fOCQCEhISEauPcs2ePAEC4deuWoa2oqEiwtbUVDhw4YNR3woQJwogRIwRBEITIyEjB19fX6Pzs2bOrjHUvDw8PYenSpTWev1dYWJgwbNgww+uQkBDB0dFRKCgoMLStXr1asLe3F8rLy2sV+7337OfnJ0RFRdU6JiKq+1ghIfqbuLg42Nvbo7S0FBUVFRg5ciSioqIM5/38/IzWjfz666+4cOECGjZsaDROUVERLl68iNzcXGRmZqJLly6Gcw0aNEDnzp2rTNtUSktLg6WlZbWVgZpcuHABd+7cQb9+/YzaS0pK0KFDBwDAb7/9ZhQHAOh0ulpfoyarVq3C2rVrkZGRgcLCQpSUlMDf39+oT/v27WFra2t03fz8fFy5cgX5+fmisd/rX//6F6ZMmYJdu3YhICAAw4YNQ7t27R76XohIPkxIiP6mT58+WL16NZRKJdzd3dGggfEfETs7O6PX+fn56NSpEzZu3FhlrMaNGz9QDJVTMKbIz88HAMTHx+Opp54yOqdSqR4ojtr46quvMGPGDCxZsgQ6nQ4NGzbE4sWLcejQoVqP8SCxT5w4EUFBQYiPj8euXbsQExODJUuWYOrUqQ9+M0QkKyYkRH9jZ2cHb2/vWvfv2LEjNm/eDBcXF6jV6mr7uLm54dChQ+jZsycAoKysDKmpqejYsWO1/f38/FBRUYG9e/ciICCgyvnKCk15ebmhzdfXFyqVChkZGTVWVnx8fAwLdCsdPHhQ/Cbv45dffkG3bt3wz3/+09B28eLFKv1+/fVXFBYWGpKtgwcPwt7eHk2bNoWjo6No7NVp2rQpQkNDERoaisjISHz22WdMSIgeY9xlQ/QQRo0aBWdnZwwePBg///wz0tPTkZycjH/961/4888/AQBvvPEGPvjgA2zbtg1nz57FP//5z/s+Q8TT0xMhISF47bXXsG3bNsOYW7ZsAQB4eHhAoVAgLi4O165dQ35+Pho2bIgZM2Zg2rRpWLduHS5evIhjx47h448/xrp16wAAoaGhOH/+PGbOnIlz585h06ZNiI2NrdV9/vXXX0hLSzM6bt26hZYtW+Lo0aPYuXMnfv/9d7z77rs4cuRIlfeXlJRgwoQJOHPmDLZv34558+YhPDwcFhYWtYr9Xm+++SZ27tyJ9PR0HDt2DHv27IGPj0+t7oWI6ii5F7EQ1RV/X9RqyvnMzExh7NixgrOzs6BSqYTmzZsLkyZNEnJzcwVBuLuI9Y033hDUarXg4OAgRERECGPHjq1xUasgCEJhYaEwbdo0wc3NTVAqlYK3t7ewdu1aw/no6GhBq9UKCoVCCAkJEQTh7kLcZcuWCa1atRKsrKyExo0bC0FBQcLevXsN7/vxxx8Fb29vQaVSCT169BDWrl1bq0WtAKoc69evF4qKioRx48YJGo1GcHBwEKZMmSK89dZbQvv27at8bnPnzhWcnJwEe3t7YdKkSUJRUZGhj1js9y5qDQ8PF1q0aCGoVCqhcePGwpgxY4Tr16/XeA9EVPcpBKGGlXVEREREjwinbIiIiEh2TEiIiIhIdkxIiIiISHZMSIiIiEh2TEiIiIhIdkxIiIiISHZMSIiIiEh2TEiIiIhIdkxIiIiISHZMSIiIiEh2TEiIiIhIdkxIiIiISHb/D4/dnUSNszeoAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "probabilities" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "id": "9cz1_MhPkHXI", "outputId": "34ff1038-2d12-4b24-8494-93c5bee91acf" }, "execution_count": 31, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[0.50001657,\n", " 0.73180765,\n", " 0.50006306,\n", " 0.73142564,\n", " 0.500457,\n", " 0.730648,\n", " 0.49988672,\n", " 0.5000267,\n", " 0.49966726,\n", " 0.5005572,\n", " 0.7317519,\n", " 0.7308919,\n", " 0.73081124,\n", " 0.49979952,\n", " 0.49989775,\n", " 0.50000733,\n", " 0.73092675,\n", " 0.5000122,\n", " 0.7308941,\n", " 0.7307099,\n", " 0.49981403,\n", " 0.4999174,\n", " 0.73107773,\n", " 0.5001563,\n", " 0.5001094,\n", " 0.73106664,\n", " 0.49960276,\n", " 0.7304853,\n", " 0.4989315,\n", " 0.73073626,\n", " 0.49933076,\n", " 0.7307914,\n", " 0.4995961,\n", " 0.7309542,\n", " 0.7305881,\n", " 0.730756,\n", " 0.730791,\n", " 0.73154485,\n", " 0.73174363,\n", " 0.7310429,\n", " 0.500371,\n", " 0.5003924,\n", " 0.49990276,\n", " 0.73099464,\n", " 0.49985507,\n", " 0.73004943,\n", " 0.7308039,\n", " 0.7303853,\n", " 0.7312729,\n", " 0.50049806,\n", " 0.73019195,\n", " 0.73089105,\n", " 0.73086566,\n", " 0.49970746,\n", " 0.5002459,\n", " 0.73114836,\n", " 0.49987105,\n", " 0.5000737,\n", " 0.73095727,\n", " 0.500732,\n", " 0.7308521,\n", " 0.7298369,\n", " 0.7311641,\n", " 0.5000605,\n", " 0.49954134,\n", " 0.7313265,\n", " 0.5002616,\n", " 0.5000128,\n", " 0.4991023,\n", " 0.7312981,\n", " 0.5001435,\n", " 0.7309735,\n", " 0.73123676,\n", " 0.5000661,\n", " 0.73077166,\n", " 0.5004365,\n", " 0.73055613,\n", " 0.49987772,\n", " 0.7314142,\n", " 0.4999144,\n", " 0.73112965,\n", " 0.49877167,\n", " 0.7313731,\n", " 0.731197,\n", " 0.7311808,\n", " 0.49961644,\n", " 0.7309114,\n", " 0.7303586,\n", " 0.7301574,\n", " 0.49988666,\n", " 0.49972376,\n", " 0.73140484,\n", " 0.4999733,\n", " 0.730716,\n", " 0.5004749,\n", " 0.4994043,\n", " 0.49974388,\n", " 0.5002577,\n", " 0.49962893,\n", " 0.7308502,\n", " 0.49997282,\n", " 0.499783,\n", " 0.50014734,\n", " 0.7308109,\n", " 0.73124427,\n", " 0.7312501,\n", " 0.73095757,\n", " 0.73110074,\n", " 0.50029385,\n", " 0.7313042,\n", " 0.73149824,\n", " 0.7311425,\n", " 0.50030893,\n", " 0.5004289,\n", " 0.500374,\n", " 0.50037163,\n", " 0.50016004,\n", " 0.73062754,\n", " 0.7315118,\n", " 0.7312957,\n", " 0.4998365,\n", " 0.5003073,\n", " 0.73148024,\n", " 0.4994193,\n", " 0.50005054,\n", " 0.500043,\n", " 0.50019634,\n", " 0.50007564,\n", " 0.730816,\n", " 0.50061077,\n", " 0.50090617,\n", " 0.7308635,\n", " 0.4996257,\n", " 0.50052005,\n", " 0.500348,\n", " 0.730758,\n", " 0.49999827,\n", " 0.73082376,\n", " 0.73042804,\n", " 0.5003271,\n", " 0.49975848,\n", " 0.7308863,\n", " 0.4998739,\n", " 0.73089147,\n", " 0.5003052,\n", " 0.7312431,\n", " 0.730764,\n", " 0.73062205,\n", " 0.73086536,\n", " 0.49991062,\n", " 0.5000819,\n", " 0.7311548,\n", " 0.73074937,\n", " 0.500564,\n", " 0.7312144,\n", " 0.4992589,\n", " 0.4999196,\n", " 0.73085165,\n", " 0.4999324,\n", " 0.5005716,\n", " 0.49969357,\n", " 0.7312011,\n", " 0.4999647,\n", " 0.50017893,\n", " 0.73152333,\n", " 0.4994444,\n", " 0.4997599,\n", " 0.5004179,\n", " 0.73094785,\n", " 0.7309258,\n", " 0.73102075,\n", " 0.5001387,\n", " 0.50104,\n", " 0.5006729,\n", " 0.49937385,\n", " 0.49972317,\n", " 0.5000464,\n", " 0.50042987,\n", " 0.7308088,\n", " 0.73105025,\n", " 0.73084617,\n", " 0.73074925,\n", " 0.5000743,\n", " 0.73082197,\n", " 0.7307466,\n", " 0.5000672,\n", " 0.7315805,\n", " 0.73120266,\n", " 0.50014526,\n", " 0.500435,\n", " 0.7312897,\n", " 0.5002499,\n", " 0.73119897,\n", " 0.7310065,\n", " 0.500142,\n", " 0.5001808,\n", " 0.49962348,\n", " 0.4998913,\n", " 0.49960577,\n", " 0.5001439,\n", " 0.50102746,\n", " 0.49943832,\n", " 0.7311595,\n", " 0.4997947,\n", " 0.7307384,\n", " 0.7310632,\n", " 0.50013834,\n", " 0.500004,\n", " 0.73076284,\n", " 0.73124766,\n", " 0.49981838,\n", " 0.50069183,\n", " 0.7311896,\n", " 0.7308603,\n", " 0.5003158,\n", " 0.49998748,\n", " 0.50050443,\n", " 0.50021243,\n", " 0.5001541,\n", " 0.5000111,\n", " 0.7316854,\n", " 0.73132277,\n", " 0.7311376,\n", " 0.73083353,\n", " 0.5003835,\n", " 0.7307755,\n", " 0.500229,\n", " 0.73131335,\n", " 0.499826,\n", " 0.50007015,\n", " 0.7306485,\n", " 0.7310175,\n", " 0.49972215,\n", " 0.73141825,\n", " 0.49995214,\n", " 0.73113877,\n", " 0.5002716,\n", " 0.7315377,\n", " 0.7305722,\n", " 0.73093694,\n", " 0.7310239,\n", " 0.50000787,\n", " 0.49976146,\n", " 0.50018376,\n", " 0.5004636,\n", " 0.7307527,\n", " 0.73130804,\n", " 0.49945676,\n", " 0.500953,\n", " 0.4996412,\n", " 0.73141664,\n", " 0.5001029,\n", " 0.730162,\n", " 0.5001869,\n", " 0.5000522,\n", " 0.7309768,\n", " 0.73109716,\n", " 0.7310637,\n", " 0.7317514,\n", " 0.5005362,\n", " 0.730811,\n", " 0.7309047,\n", " 0.7312777,\n", " 0.73080957,\n", " 0.50036913,\n", " 0.5002395,\n", " 0.7308375,\n", " 0.7310308,\n", " 0.7312786,\n", " 0.7308834,\n", " 0.50029564,\n", " 0.73095477,\n", " 0.5003481,\n", " 0.7316858,\n", " 0.7306523,\n", " 0.73072046,\n", " 0.4992834,\n", " 0.73100144,\n", " 0.7309423,\n", " 0.73151654,\n", " 0.7308609,\n", " 0.5004142,\n", " 0.7312314,\n", " 0.730987,\n", " 0.49999905,\n", " 0.5001001,\n", " 0.49988726,\n", " 0.50020576,\n", " 0.73091674,\n", " 0.49929896,\n", " 0.73074794,\n", " 0.7310196,\n", " 0.7305999,\n", " 0.7312425,\n", " 0.50066024,\n", " 0.5000778,\n", " 0.7310708,\n", " 0.730434,\n", " 0.5001822,\n", " 0.5007469,\n", " 0.7311102,\n", " 0.730909,\n", " 0.500285,\n", " 0.4995561,\n", " 0.5001437,\n", " 0.50045866,\n", " 0.500332,\n", " 0.7308288,\n", " 0.7310978,\n", " 0.730815,\n", " 0.500071,\n", " 0.73099023,\n", " 0.5006229,\n", " 0.50006354,\n", " 0.5001445,\n", " 0.49943706,\n", " 0.49958318,\n", " 0.7308718,\n", " 0.49988833,\n", " 0.7307979,\n", " 0.7308288,\n", " 0.4997801,\n", " 0.72984207,\n", " 0.7309019,\n", " 0.49993968,\n", " 0.50042665,\n", " 0.4991538,\n", " 0.7306923,\n", " 0.49991822,\n", " 0.7305326,\n", " 0.4990314,\n", " 0.7312928,\n", " 0.73076284,\n", " 0.7308306,\n", " 0.7312268,\n", " 0.49976528,\n", " 0.7313183,\n", " 0.5003918,\n", " 0.49920478,\n", " 0.4997604,\n", " 0.5002339,\n", " 0.50038224,\n", " 0.50027645,\n", " 0.7314119,\n", " 0.49989405,\n", " 0.50065523,\n", " 0.7318524,\n", " 0.49947733,\n", " 0.50022995,\n", " 0.4997493,\n", " 0.7311692,\n", " 0.4998921,\n", " 0.73108864,\n", " 0.4995824,\n", " 0.7304818,\n", " 0.49986705,\n", " 0.7307681,\n", " 0.7310052,\n", " 0.50001013,\n", " 0.5000905,\n", " 0.7309694,\n", " 0.5003729,\n", " 0.5002992,\n", " 0.73014164,\n", " 0.72944176,\n", " 0.5001378,\n", " 0.7307642,\n", " 0.50077254,\n", " 0.5000701,\n", " 0.7310156,\n", " 0.5004385,\n", " 0.50050604,\n", " 0.4999058,\n", " 0.49915445,\n", " 0.5001234,\n", " 0.5005926,\n", " 0.5000082,\n", " 0.7308409,\n", " 0.5005899,\n", " 0.7308915,\n", " 0.73139936,\n", " 0.731134,\n", " 0.73121774,\n", " 0.7314008,\n", " 0.49982893,\n", " 0.73072773,\n", " 0.73078096,\n", " 0.73120624,\n", " 0.73133135,\n", " 0.7306902,\n", " 0.5001705,\n", " 0.50016993,\n", " 0.5002077,\n", " 0.7313388,\n", " 0.7312992,\n", " 0.5003303,\n", " 0.7313944,\n", " 0.4998766,\n", " 0.7305423,\n", " 0.500419,\n", " 0.5008216,\n", " 0.5003547,\n", " 0.73080605,\n", " 0.5006243,\n", " 0.5001484,\n", " 0.73151827,\n", " 0.731059,\n", " 0.49982077,\n", " 0.5008315,\n", " 0.49964952,\n", " 0.4997144,\n", " 0.7306063,\n", " 0.73182696,\n", " 0.50019133,\n", " 0.7307757,\n", " 0.7310945,\n", " 0.50014395,\n", " 0.73123246,\n", " 0.730297,\n", " 0.7307318,\n", " 0.73001206,\n", " 0.50063276,\n", " 0.7310584,\n", " 0.5002733,\n", " 0.50041026,\n", " 0.50025004,\n", " 0.73078346,\n", " 0.7302773,\n", " 0.7309084,\n", " 0.50112975,\n", " 0.49992394,\n", " 0.73106194,\n", " 0.4997635,\n", " 0.49989715,\n", " 0.7308779,\n", " 0.7309803,\n", " 0.73007214,\n", " 0.7313329,\n", " 0.73106337,\n", " 0.73103523,\n", " 0.50003296,\n", " 0.49914697,\n", " 0.49993777,\n", " 0.7311219,\n", " 0.49961913,\n", " 0.7309497,\n", " 0.7316553,\n", " 0.49975872,\n", " 0.49949923,\n", " 0.5001163,\n", " 0.50044554,\n", " 0.5006988,\n", " 0.73081887,\n", " 0.73087275,\n", " 0.49998873,\n", " 0.50010955,\n", " 0.73076105,\n", " 0.73132974,\n", " 0.7313097,\n", " 0.73069715,\n", " 0.73104626,\n", " 0.49929303,\n", " 0.7311637,\n", " 0.730876,\n", " 0.7309419,\n", " 0.7304739,\n", " 0.50054276,\n", " 0.7308374,\n", " 0.49970663,\n", " 0.7315366,\n", " 0.7311337,\n", " 0.73107797,\n", " 0.7304013,\n", " 0.5003886,\n", " 0.7312597,\n", " 0.73072237,\n", " 0.7314522,\n", " 0.4995687,\n", " 0.49863273,\n", " 0.5002072,\n", " 0.7307129,\n", " 0.49996042,\n", " 0.7312544,\n", " 0.73110586,\n", " 0.50058234,\n", " 0.731725,\n", " 0.73114425,\n", " 0.730907,\n", " 0.7306095,\n", " 0.5005258,\n", " 0.73119164,\n", " 0.7313732,\n", " 0.73052484,\n", " 0.50010157,\n", " 0.73092484,\n", " 0.73038757,\n", " 0.73064625,\n", " 0.50040454,\n", " 0.49989793,\n", " 0.49962452,\n", " 0.7303551,\n", " 0.5004355,\n", " 0.7313864,\n", " 0.7310822,\n", " 0.50022,\n", " 0.5002571,\n", " 0.5001963,\n", " 0.73091304,\n", " 0.7310061,\n", " 0.5009337,\n", " 0.7313311,\n", " 0.49970573,\n", " 0.730657,\n", " 0.49975097,\n", " 0.50015086,\n", " 0.73106664,\n", " 0.73104453,\n", " 0.499516,\n", " 0.49997747,\n", " 0.5000285,\n", " 0.73059523,\n", " 0.7311692,\n", " 0.5001043,\n", " 0.7318259,\n", " 0.73156047,\n", " 0.5024217,\n", " 0.73113364,\n", " 0.730561,\n", " 0.50058687,\n", " 0.5003162,\n", " 0.49964982,\n", " 0.5000657,\n", " 0.7304006,\n", " 0.7315703,\n", " 0.4996328,\n", " 0.49996042,\n", " 0.7309194,\n", " 0.7315101,\n", " 0.730496,\n", " 0.50003767,\n", " 0.500382,\n", " 0.7313314,\n", " 0.7306768,\n", " 0.7305257,\n", " 0.5008147,\n", " 0.7313552,\n", " 0.50030243,\n", " 0.7311979,\n", " 0.73134893,\n", " 0.7314874,\n", " 0.7306652,\n", " 0.50004214,\n", " 0.73074484,\n", " 0.49986687,\n", " 0.7314663,\n", " 0.49975306,\n", " 0.5002723,\n", " 0.730807,\n", " 0.7312264,\n", " 0.50018156,\n", " 0.4994822,\n", " 0.5004544,\n", " 0.5003985,\n", " 0.7312361,\n", " 0.73079085,\n", " 0.49990574,\n", " 0.4999764,\n", " 0.5003374,\n", " 0.49996448,\n", " 0.73110694,\n", " 0.5001881,\n", " 0.49990138,\n", " 0.73107797,\n", " 0.5002843,\n", " 0.49970704,\n", " 0.5004353,\n", " 0.4998111,\n", " 0.73076373,\n", " 0.7308362,\n", " 0.7319336,\n", " 0.5001459,\n", " 0.5002509,\n", " 0.50068533,\n", " 0.49993563,\n", " 0.50044036,\n", " 0.73117954,\n", " 0.73077327,\n", " 0.50049245,\n", " 0.7310929,\n", " 0.73068726,\n", " 0.73148036,\n", " 0.5001762,\n", " 0.7310852,\n", " 0.5008719,\n", " 0.7308255,\n", " 0.5000462,\n", " 0.7313136,\n", " 0.73085034,\n", " 0.50015134,\n", " 0.4999105,\n", " 0.73086154,\n", " 0.49963835,\n", " 0.5004522,\n", " 0.73121697,\n", " 0.49961406,\n", " 0.50015855,\n", " 0.5000798,\n", " 0.730612,\n", " 0.49959645,\n", " 0.5004222,\n", " 0.7308763,\n", " 0.49944985,\n", " 0.73103607,\n", " 0.73106295,\n", " 0.73037004,\n", " 0.7309959,\n", " 0.50060844,\n", " 0.50053835,\n", " 0.49980637,\n", " 0.50025,\n", " 0.5003451,\n", " 0.49976826,\n", " 0.73116064,\n", " 0.49976724,\n", " 0.49998033,\n", " 0.5004538,\n", " 0.7311511,\n", " 0.7307103,\n", " 0.7309412,\n", " 0.50051445,\n", " 0.49953556,\n", " 0.4998225,\n", " 0.50022995,\n", " 0.500384,\n", " 0.49997365,\n", " 0.50016415,\n", " 0.49943322,\n", " 0.7310104,\n", " 0.5000113,\n", " 0.499704,\n", " 0.7306636,\n", " 0.49981272,\n", " 0.50003964,\n", " 0.50030863,\n", " 0.49944475,\n", " 0.5000957,\n", " 0.73141354,\n", " 0.73135346,\n", " 0.731045,\n", " 0.5008514,\n", " 0.73128545,\n", " 0.7310206,\n", " 0.73093957,\n", " 0.49999076,\n", " 0.4999869,\n", " 0.4999746,\n", " 0.49971995,\n", " 0.73199904,\n", " 0.5005905,\n", " 0.72992,\n", " 0.5000127,\n", " 0.7307081,\n", " 0.73112535,\n", " 0.4994652,\n", " 0.500238,\n", " 0.49984127,\n", " 0.5001823,\n", " 0.73131835,\n", " 0.49999475,\n", " 0.7307068,\n", " 0.4996887,\n", " 0.7308143,\n", " 0.49995798,\n", " 0.5005579,\n", " 0.7310634,\n", " 0.49969226,\n", " 0.73096895,\n", " 0.73092955,\n", " 0.50021064,\n", " 0.500414,\n", " 0.7318217,\n", " 0.730905,\n", " 0.49989417,\n", " 0.49978337,\n", " 0.73121667,\n", " 0.50032055,\n", " 0.49971464,\n", " 0.4997864,\n", " 0.7312036,\n", " 0.4998387,\n", " 0.7308906,\n", " 0.5006489,\n", " 0.73111737,\n", " 0.73128605,\n", " 0.7310055,\n", " 0.7312846,\n", " 0.7316134,\n", " 0.7308807,\n", " 0.5000009,\n", " 0.7309372,\n", " 0.4996325,\n", " 0.49940228,\n", " 0.7315719,\n", " 0.5004744,\n", " 0.4997873,\n", " 0.7315755,\n", " 0.5006533,\n", " 0.73243576,\n", " 0.7309701,\n", " 0.49973473,\n", " 0.7306138,\n", " 0.49967209,\n", " 0.7308692,\n", " 0.49989417,\n", " 0.499644,\n", " 0.7313076,\n", " 0.50007796,\n", " 0.49990037,\n", " 0.49981666,\n", " 0.73135585,\n", " 0.49960923,\n", " 0.5002801,\n", " 0.73111933,\n", " 0.7310726,\n", " 0.50022787,\n", " 0.50028414,\n", " 0.50056696,\n", " 0.5000613,\n", " 0.50014913,\n", " 0.50090104,\n", " 0.7303854,\n", " 0.5007454,\n", " 0.73085773,\n", " 0.73124987,\n", " 0.5002411,\n", " 0.73086977,\n", " 0.7310614,\n", " 0.50075513,\n", " 0.5003276,\n", " 0.49983174,\n", " 0.5000041,\n", " 0.49975735,\n", " 0.73104745,\n", " 0.7303503,\n", " 0.49990222,\n", " 0.50014263,\n", " 0.73122156,\n", " 0.73029953,\n", " 0.49983162,\n", " 0.5000852,\n", " 0.5002018,\n", " 0.7306648,\n", " 0.7312112,\n", " 0.7308832,\n", " 0.7316932,\n", " 0.7309973,\n", " 0.73141676,\n", " 0.73055524,\n", " 0.499847,\n", " 0.49998665,\n", " 0.73146766,\n", " 0.7311589,\n", " 0.7311979,\n", " 0.731412,\n", " 0.50014156,\n", " 0.73039633,\n", " 0.5000779,\n", " 0.73071265,\n", " 0.50006896,\n", " 0.7316255,\n", " 0.49966425,\n", " 0.7314927,\n", " 0.50023115,\n", " 0.7307656,\n", " 0.49892175,\n", " 0.50019544,\n", " 0.7305355,\n", " 0.4997086,\n", " 0.73106587,\n", " 0.4996937,\n", " 0.5002188,\n", " 0.49972323,\n", " 0.49997258,\n", " 0.5,\n", " 0.5000477,\n", " 0.7305484,\n", " 0.73153144,\n", " 0.7305603,\n", " 0.731513,\n", " 0.4999985,\n", " 0.500033,\n", " 0.730511,\n", " 0.5001859,\n", " 0.5002162,\n", " 0.5000392,\n", " 0.5003162,\n", " 0.50051683,\n", " 0.49987152,\n", " 0.73094255,\n", " 0.7314224,\n", " 0.7317076,\n", " 0.5001249,\n", " 0.5003861,\n", " 0.5003823,\n", " 0.49978647,\n", " 0.7307335,\n", " 0.49969274,\n", " 0.7309814,\n", " 0.73066837,\n", " 0.4998887,\n", " 0.73090047,\n", " 0.50015575,\n", " 0.5001306,\n", " 0.73052865,\n", " 0.50056857,\n", " 0.731086,\n", " 0.5000559,\n", " 0.7310916,\n", " 0.499573,\n", " 0.73083526,\n", " 0.4999178,\n", " 0.5004368,\n", " 0.4993534,\n", " 0.5001315,\n", " 0.49975836,\n", " 0.5001921,\n", " 0.5005086,\n", " 0.5008587,\n", " 0.50013745,\n", " 0.7309396,\n", " 0.49960726,\n", " 0.5003342,\n", " 0.5004612,\n", " 0.7311579,\n", " 0.7307819,\n", " 0.73081374,\n", " 0.50042266,\n", " 0.7310185,\n", " 0.5002655,\n", " 0.7309653,\n", " 0.7305959,\n", " 0.7313126,\n", " 0.7305068,\n", " 0.5002971,\n", " 0.7309019,\n", " 0.50075233,\n", " 0.7304313,\n", " 0.7310129,\n", " 0.49991062,\n", " 0.7312488,\n", " 0.5006484,\n", " 0.49992967,\n", " 0.7309884,\n", " 0.49991313,\n", " 0.73051506,\n", " 0.50041944,\n", " 0.49943376,\n", " 0.7319001,\n", " 0.7306008,\n", " 0.49951178,\n", " 0.73072976,\n", " 0.5002419,\n", " 0.50051296,\n", " 0.73090947,\n", " 0.5014391,\n", " 0.5003769,\n", " 0.49992514,\n", " 0.4996707,\n", " 0.49956706,\n", " 0.73120433,\n", " 0.7311659,\n", " 0.49975836,\n", " 0.7309957,\n", " 0.499763,\n", " 0.73082197,\n", " 0.73051035,\n", " 0.5005948,\n", " 0.7309045,\n", " 0.5007808,\n", " 0.4995122,\n", " 0.7305514,\n", " 0.5014271,\n", " 0.7309703,\n", " 0.73084766,\n", " 0.7306834,\n", " 0.49974015,\n", " 0.49984068,\n", " 0.73100436,\n", " 0.7316026,\n", " 0.73037916,\n", " 0.7322349,\n", " 0.7324667,\n", " 0.50036365,\n", " 0.7314384,\n", " 0.7314505,\n", " 0.49977347,\n", " 0.50027525,\n", " 0.7308401,\n", " 0.7313605,\n", " 0.5005531,\n", " 0.73100865,\n", " 0.7313817,\n", " 0.49972442,\n", " 0.7314638,\n", " 0.49981385,\n", " 0.73070544,\n", " 0.50021625,\n", " 0.50033945,\n", " 0.73121744,\n", " 0.5000397,\n", " 0.5002741,\n", " 0.7315321,\n", " 0.7311444,\n", " 0.49989268,\n", " 0.50027364,\n", " 0.5003563,\n", " 0.731936,\n", " 0.7310723,\n", " 0.730601,\n", " 0.5002467,\n", " 0.7309612,\n", " 0.4997855,\n", " 0.7309971,\n", " 0.4995927,\n", " 0.5003692,\n", " 0.7301233,\n", " 0.7303844,\n", " 0.5005204,\n", " 0.49985984,\n", " 0.73051286,\n", " 0.5001411,\n", " 0.7310744,\n", " 0.7300225,\n", " 0.5004673,\n", " 0.49988887,\n", " 0.7311421,\n", " 0.49943298,\n", " 0.7312286,\n", " 0.4998365,\n", " 0.73095655,\n", " 0.5001351,\n", " 0.49978837,\n", " 0.49977854,\n", " 0.73069614,\n", " 0.5001848,\n", " 0.7304375,\n", " 0.50112075,\n", " 0.49927607,\n", " 0.73103297,\n", " 0.5001429,\n", " 0.73104817,\n", " 0.7311691,\n", " 0.7313848,\n", " 0.5002024,\n", " 0.5002826,\n", " 0.73135656,\n", " 0.49949756,\n", " 0.49994028,\n", " 0.73069584,\n", " 0.73052484,\n", " 0.7310688,\n", " 0.49985936,\n", " 0.50001544,\n", " 0.49982065,\n", " 0.5007602,\n", " 0.50050986,\n", " 0.73093826,\n", " 0.7307535,\n", " 0.5006642,\n", " 0.5001168,\n", " 0.50004333,\n", " 0.73083025,\n", " 0.73080844,\n", " 0.7311554,\n", " 0.49976146,\n", " 0.50003576,\n", " 0.7307183,\n", " 0.4999683,\n", " 0.49980578,\n", " 0.49976695,\n", " 0.50103486,\n", " 0.73126686,\n", " 0.50042903,\n", " 0.7311433,\n", " 0.49924415,\n", " 0.7308227,\n", " 0.73050815,\n", " 0.7303354,\n", " 0.7309623,\n", " 0.73076224,\n", " 0.49968886,\n", " 0.73079187,\n", " 0.49998474,\n", " 0.73085666,\n", " 0.73052293,\n", " 0.4997768,\n", " 0.49978182,\n", " 0.7309219,\n", " 0.50016433,\n", " 0.49916515,\n", " ...]" ] }, "metadata": {}, "execution_count": 31 } ] }, { "cell_type": "code", "source": [ "import numpy as np\n", "\n", "# Generate thresholds to test (e.g., from 0.0 to 1.0 with a step of 0.01)\n", "thresholds = np.arange(0.35, 0.70, 0.01)\n", "\n", "# Lists to store thresholds and corresponding accuracies\n", "accuracies = []\n", "\n", "# Initialize variables to store the best threshold and highest accuracy\n", "best_threshold = 0.0\n", "best_accuracy = 0.0\n", "\n", "# Loop through thresholds to calculate accuracy\n", "for threshold in thresholds:\n", " # Convert probabilities to binary predictions using the current threshold\n", " predictions = (probabilities >= threshold).astype(int)\n", "\n", " # Calculate accuracy\n", " accuracy = accuracy_score(true_labels, predictions)\n", " accuracies.append(accuracy)\n", "\n", " # Update best threshold if current accuracy is higher\n", " if accuracy > best_accuracy:\n", " best_accuracy = accuracy\n", " best_threshold = threshold\n", "\n", "# Plot accuracy vs threshold\n", "plt.figure(figsize=(8, 6))\n", "plt.plot(thresholds, accuracies, marker='o', label='Accuracy', color='blue')\n", "plt.axvline(best_threshold, color='red', linestyle='--', label=f'Best Threshold: {best_threshold:.2f}')\n", "plt.title(\"Threshold vs Accuracy\")\n", "plt.xlabel(\"Threshold\")\n", "plt.ylabel(\"Accuracy\")\n", "plt.legend()\n", "plt.grid()\n", "plt.show()\n", "\n", "# Print the optimal threshold and corresponding accuracy\n", "print(f\"Best Threshold: {best_threshold:.2f}\")\n", "print(f\"Best Accuracy: {best_accuracy:.4f}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 600 }, "id": "sG9ebO39jqop", "outputId": "f255e33e-146d-46b9-d53a-17c96407c7e2" }, "execution_count": 37, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAArYAAAIjCAYAAAD2qFgcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABos0lEQVR4nO3deXgUVdbH8V9nJ4EQIGFHVpVFEARBVEQUZBdcwY1lBhwRBMVlZFS2UXBF1FFxlGVeRUEWdVQEMpGICoKCQQVEQBbZd0L2Tvq+f7RpaJJAulPdnXS+n+fph+rqqlu3TormcHPqls0YYwQAAACUcSGB7gAAAABgBRJbAAAABAUSWwAAAAQFElsAAAAEBRJbAAAABAUSWwAAAAQFElsAAAAEBRJbAAAABAUSWwAAAAQFElsAAZWcnCybzaaFCxcGuiuSfNOfiRMnymazFWtbm82miRMnWnZsAChPSGwBWM5msxXrlZycHOiu4jyWLFkim82m2rVry+FwBLo7AHBOYYHuAIDg8+6777q9/7//+z8lJiYWWN+sWTNt3rzZn12Dh+bOnasGDRpo586d+vLLL9W1a9dAdwkAikRiC8Byd999t9v77777TomJiQXWSypxYpuRkaHo6OgStYHCpaen65NPPtHUqVM1e/ZszZ07t9Qmtunp6YqJiQl0NwAEGKUIAEoFh8OhZ555RnXr1lVUVJSuv/56bdu2zW2ba6+9VpdcconWrVuna665RtHR0frHP/4hScrOztaECRPUpEkTRUZGql69enrssceUnZ3t1kZiYqKuvvpqxcXFqWLFirr44otdbXjaH0lasGCB2rZtqwoVKig+Pl5333239u7de97zzc7O1kMPPaSEhARVqlRJN954o/bs2XPe/Q4ePKiwsDBNmjSpwGdbtmyRzWbTv/71L0mS3W7XpEmTdOGFFyoqKkrVqlXT1VdfrcTExPMeR5I++ugjZWZm6rbbbtPAgQO1ePFiZWVlFdguKytLEydO1EUXXaSoqCjVqlVLN998s7Zv3+7axuFw6JVXXlHLli0VFRWlhIQE9ejRQz/88IMkaefOnbLZbJozZ06B9s+uO86vWd60aZPuvPNOValSRVdffbUk6aefftKQIUPUqFEjRUVFqWbNmvrLX/6io0ePFmh37969+utf/6ratWsrMjJSDRs21IgRI5STk6Pff/9dNptNL7/8coH9Vq1aJZvNpg8++KBYcQTgP4zYAigVnn32WYWEhOiRRx7RyZMn9fzzz+uuu+7SmjVr3LY7evSoevbsqYEDB+ruu+9WjRo15HA4dOONN+qbb77Rvffeq2bNmunnn3/Wyy+/rN9++00ff/yxJGnjxo3q06ePWrVqpcmTJysyMlLbtm3Tt99+61V/5syZo6FDh+ryyy/X1KlTdfDgQb3yyiv69ttv9eOPPyouLq7I8x02bJjee+893Xnnnbryyiv15Zdfqnfv3ueNU40aNdS5c2d9+OGHmjBhgttn8+fPV2hoqG677TZJzgRw6tSpGjZsmNq3b6/U1FT98MMPWr9+vbp163beY82dO1ddunRRzZo1NXDgQD3++OP69NNPXe1LUl5envr06aOkpCQNHDhQY8aM0alTp5SYmKhffvlFjRs3liT99a9/1Zw5c9SzZ08NGzZMubm5+vrrr/Xdd9+pXbt25+1LYW677TZdeOGFmjJliowxkpz/cfn99981dOhQ1axZUxs3btS///1vbdy4Ud99953rJr59+/apffv2OnHihO699141bdpUe/fu1cKFC5WRkaFGjRrpqquu0ty5c/XQQw8ViEulSpXUr18/r/oNwIcMAPjYyJEjTVFfNytWrDCSTLNmzUx2drZr/SuvvGIkmZ9//tm1rnPnzkaSmTFjhlsb7777rgkJCTFff/212/oZM2YYSebbb781xhjz8ssvG0nm8OHDRfa1uP3Jyckx1atXN5dcconJzMx0bffZZ58ZSWb8+PGudRMmTHA7/5SUFCPJ3H///W7HvvPOO40kM2HChCL7Z4wxb731VoHYGGNM8+bNzXXXXed6f+mll5revXufs62iHDx40ISFhZm3337bte7KK680/fr1c9tu1qxZRpKZNm1agTYcDocxxpgvv/zSSDKjR48ucpsdO3YYSWb27NkFtjk7JvnxvOOOOwpsm5GRUWDdBx98YCSZlStXutYNGjTIhISEmO+//77IPuXHefPmza7PcnJyTHx8vBk8eHCB/QAEHqUIAEqFoUOHKiIiwvW+U6dOkqTff//dbbvIyEgNHTrUbd2CBQvUrFkzNW3aVEeOHHG9rrvuOknSihUrJMk1gvrJJ5+c9w7/8/Xnhx9+0KFDh3T//fcrKirKtV3v3r3VtGlTff7550W2vWTJEknS6NGj3dY/+OCD5+xTvptvvllhYWGaP3++a90vv/yiTZs2acCAAa51cXFx2rhxo7Zu3Vqsds80b948hYSE6JZbbnGtu+OOO/TFF1/o+PHjrnWLFi1SfHy8HnjggQJt5I+OLlq0SDabrcAI85nbeOO+++4rsK5ChQqu5aysLB05ckRXXHGFJGn9+vWSnGURH3/8sfr27VvoaHF+n26//XZFRUVp7ty5rs+WLVumI0eOFFovDiDwSGwBlAoXXHCB2/sqVapIklsSJUl16tRxSzglaevWrdq4caMSEhLcXhdddJEk6dChQ5KkAQMG6KqrrtKwYcNUo0YNDRw4UB9++GGhSe75+rNr1y5J0sUXX1xg36ZNm7o+L8yuXbsUEhLi+jV9vsLaKkx8fLyuv/56ffjhh6518+fPV1hYmG6++WbXusmTJ+vEiRO66KKL1LJlSz366KP66aefinWM9957T+3bt9fRo0e1bds2bdu2TW3atFFOTo4WLFjg2m779u26+OKLFRZWdGXb9u3bVbt2bVWtWrVYxy6uhg0bFlh37NgxjRkzRjVq1FCFChWUkJDg2u7kyZOSpMOHDys1NVWXXHLJOduPi4tT37599f7777vWzZ07V3Xq1HH9pwlA6UKNLYBSITQ0tND15s/ayXxnjsjlczgcatmypaZNm1ZoG/Xq1XPtu3LlSq1YsUKff/65li5dqvnz5+u6667T8uXL3fpQ3P4EysCBAzV06FClpKSodevW+vDDD3X99dcrPj7etc0111yj7du365NPPtHy5cv1zjvv6OWXX9aMGTM0bNiwItveunWrvv/+e0nShRdeWODzuXPn6t5777X0fIoauc3Lyytyn8Kuhdtvv12rVq3So48+qtatW6tixYpyOBzq0aOHV/PwDho0SAsWLNCqVavUsmVL/fe//9X999+vkBDGhYDSiMQWQJnXuHFjbdiwQddff/15f7UdEhKi66+/Xtdff72mTZumKVOm6IknntCKFSs8msqqfv36kpwzEZw9erdlyxbX50Xt63A4XKOdZ+5XXP3799ff/vY3VznCb7/9pnHjxhXYrmrVqho6dKiGDh2qtLQ0XXPNNZo4ceI5E9u5c+cqPDxc7777boEE/5tvvtGrr76q3bt364ILLlDjxo21Zs0a2e12hYeHF9pe48aNtWzZMh07dqzIUdv8EfETJ064rT/XyPfZjh8/rqSkJE2aNEnjx493rT+7FCMhIUGxsbH65Zdfzttmjx49lJCQoLlz56pDhw7KyMjQPffcU+w+AfAv/ssJoMy7/fbbtXfvXr399tsFPsvMzFR6erok56+pz9a6dWtJKjAt2Pm0a9dO1atX14wZM9z2/eKLL7R58+ZzznDQs2dPSdKrr77qtn769OnFPn5cXJy6d++uDz/8UPPmzVNERIT69+/vts3ZU1xVrFhRTZo0Oe+5zp07V506ddKAAQN06623ur0effRRSXJNdXXLLbfoyJEjrinGzpQ/un3LLbfIGFPoFGX528TGxio+Pl4rV650+/yNN944Z1/PlJ+Enz2qfnZcQ0JC1L9/f3366aeu6cYK65MkhYWF6Y477tCHH36oOXPmqGXLlmrVqlWx+wTAvxixBVDm3XPPPfrwww913333acWKFbrqqquUl5enX3/9VR9++KGWLVumdu3aafLkyVq5cqV69+6t+vXr69ChQ3rjjTdUt25d1zyoxRUeHq7nnntOQ4cOVefOnXXHHXe4pvtq0KBBgSmiztS6dWvdcccdeuONN3Ty5EldeeWVSkpKKnSe3HMZMGCA7r77br3xxhvq3r17genFmjdvrmuvvVZt27ZV1apV9cMPP2jhwoUaNWpUkW2uWbNG27ZtK3KbOnXq6LLLLtPcuXP197//XYMGDdL//d//aezYsVq7dq06deqk9PR0/e9//9P999+vfv36qUuXLrrnnnv06quvauvWra6ygK+//lpdunRxHWvYsGF69tlnNWzYMLVr104rV67Ub7/9Vux4xMbG6pprrtHzzz8vu92uOnXqaPny5dqxY0eBbadMmaLly5erc+fOrini9u/frwULFuibb75xi+WgQYP06quvasWKFXruueeK3R8AARDAGRkAlBPFme5rwYIFbusLm/6pc+fOpkWLFoW2k5OTY5577jnTokULExkZaapUqWLatm1rJk2aZE6ePGmMMSYpKcn069fP1K5d20RERJjatWubO+64w/z2229e9ccYY+bPn2/atGljIiMjTdWqVc1dd91l9uzZ47bN2dN9GWNMZmamGT16tKlWrZqJiYkxffv2NX/88UexpvvKl5qaaipUqGAkmffee6/A508//bRp3769iYuLMxUqVDBNmzY1zzzzjMnJySmyzQceeMBIMtu3by9ym4kTJxpJZsOGDcYY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unVq166doqOjdeWVV2rLli1un7/55ptq3LixIiIidPHFF+vdd989Z9zXrl2rNm3aKCoqSu3atdOPP/54zu0Ls3z5cm3atEnvvfeeWrdurZ49e+qf//ynXn/9deXk5Jxz30qVKrniW7NmTcWc8eSqmJgYvfnmmxo+fLhq1qzpcb/gWyS2AGAtEtviqlix6Nctt7hvW72667OQ2FjF1a2rkNhY57qePd23bdCg8DZLKC0tTe+9956aNGmiatWqSXI+yq579+6qVKmSvv76a3377beqWLGievTooZycHOXm5qp///7q3LmzfvrpJ61evVr33nuvbDabBgwYoIcfflgtWrTQ/v37tX//fg0YMKBEfXziiSf0yCOPKCUlRRdddJHuuOMOt1+9Z2Rk6LnnntM777yjjRs3qnr16nrsscf03Xffad68efrpp5902223qUePHtq6daskaeTIkcrOztbKlSv1888/67nnnlPFs+L5xBNP6KWXXtIPP/ygsLAw/eUvp29H/+ijjzRmzBg9/PDD+uWXX/S3v/1NQ4cO1YoVK4qMc58+fdS8eXOtW7dOEydO1COPPFJguwYNGmjixIlFxmL16tVq2bKlatSo4VrXvXt3paamauPGjeeM47PPPqtq1aqpTZs2euGFF85bvoDSg4czAIC1KEUIIp999pkriUtPT1etWrX02WefKSTE+f+X+fPny+Fw6J133pHNZpMkzZ49W3FxcUpOTla7du108uRJ9enTR40bN5YkNWvWzNV+xYoVFRYWZtnI3yOPPKLevXtLkiZNmqQWLVpo27Ztatq0qSRnIv7GG2/o0ksvleS8KWvu3LnauXOn6tat62pj6dKlmj17tqZMmaLdu3frlltuUcuWLSVJjRo1KnDcZ555Rp07d5YkPf744+rdu7eysrIUFRWlF198UUOGDNH9998vSRo7dqy+++47vfjii+rSpUuBtt5//305HA7NnDlTUVFRatGihfbs2aMRI0a4bde4cWPFx8cXGYsDBw64JbWSXO8PHDhQ5H6jR4/WZZddpqpVq2rVqlUaN26c9u/fr2nTphW5D0oPRmwBwFoktsWVllb0Z6Gh7u8PHXItOhwOpaamKjY21plghpw1SH5GGUBJdenSRW+++aYk6fjx43rjjTfUs2dPrV27VvXr19eGDRu0bds2txpMyXmD0fbt23XDDTdoyJAh6t69u7p166auXbvq9ttvV61atSzr45latWrlWs4/xqFDh1yJbUREhNs2P//8s/Ly8lyf58vOznaNSo8ePVojRozQ8uXL1bVrV91yyy1ubZzruBdccIE2b96se++91237q666Sq+88kqh57B582a1atVKUVFRrnUdO3YssF1SUlIRUSiZsWPHupZbtWqliIgI/e1vf9PUqVMVGRnpk2PCOozYAoC1SGyL64y6RY+2dTikvDznurOTWk/bPe9hY9SkSRPX+3feeUeVK1fW22+/raefflppaWlq27at5s6dW2DfhIQESc4R3NGjR2vp0qWaP3++nnzySSUmJuqKK66wrJ/5wsPDXcv5I8gOh8O1rkKFCq71kvPX/qGhofr+++/d9pXkGqkeNmyYunfvrs8//1zLly/X1KlT9dJLL+mBBx4o9nEDoWbNmlq7dq3buoMHD7o+K64OHTooNzdXO3fu1MUXX2xpH2E9RmwBwFrU2AYxm82mkJAQZf55w9pll12mrVu3qnr16mrSpInb68ybutq0aaNx48Zp1apVuuSSS/T+++9Lco6g5s94EAht2rRRXl6eDh06VKD/ZyZ/9erV03333afFixfr4Ycf1ttvv13sYzRr1kzffvut27pvv/1WzZs3L3L7n376SVln3ED43XffeXhmzlHen3/+WYfOGO1PTExUbGxskccuTEpKikJCQlS9enWP+wD/O3bM+UjdrQ/+S/rXv3ikLgCUEIltEMnOztaBAwd04MABbd68WQ888IDS0tLUt29fSdJdd92l+Ph49evXT19//bV27Nih5ORkjR49Wnv27NGOHTs0btw4rV69Wrt27dLy5cu1detWV51tgwYNtGPHDqWkpOjIkSPK9vOcmxdddJFuu+02DRkyRIsXL9aOHTu0du1aTZ06VZ9//rkk6cEHH9SyZcu0Y8cOrV+/XitWrHCrEz6fRx99VHPmzNGbb76prVu3atq0aVq8eHGhN4RJ0p133imbzabhw4dr06ZNWrJkiV588cUC211//fX617/+VeRxb7jhBjVv3lz33HOPNmzYoGXLlunJJ5/UyJEjXSUFa9euVdOmTbV3715JzhvOpk+frg0bNuj333/X3Llz9dBDD+nuu+9WlTMeZbVp0yalpKTo2LFjOnnypFJSUnh4RCmR/0jdrL+MlEaOlM76TQQAwDOUIgSR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QFlSohFbAIBlPE5sq1evrp9++qnA+g0bNqhatWqWdAoAypISjdjm5DifODZxonMZAOA1j2ts77jjDo0ePVqVKlXSNddcI0n66quvNGbMGA0cONDyDgJAaVeixNZul/IfR/7oozxSFwBKwOPE9p///Kd27typ66+/XmFhzt0dDocGDRpEjS2AcolSBAAoHTxObCMiIjR//nw9/fTTSklJUYUKFdSyZUvVr1/fF/0DgFKPR+oCQOngcWKb78ILL9SFF15oZV8AoMzJypKys51fpSS2ABBYHt88dsstt+i5554rsP75558vMLctAAS748edf4aEGFWqFNi+AEB553Fiu3LlSvXq1avA+p49e2rlypWWdAoAyor8xLZKFaahBYBA8/hrOC0tTRGF3LUbHh6u1NRUSzoFAGXF8eM2Sdw4BgClgceJbcuWLTV//vwC6+fNm6fmzZtb0ikAKCtOj9ga7xqIipLWrnW+oqKs6xgAlEMe3zz21FNP6eabb9b27dt13XXXSZKSkpL0/vvva+HChZZ3EABKs2PHnH96feNYaKh0+eWW9QcAyjOPE9u+ffvq448/1pQpU7Rw4UJVqFBBl156qb788ktV5ZZgAOVMfilCXFxg+wEA8HK6r969e6t3796SpNTUVH3wwQd65JFHtG7dOuXl5VnaQQAozfJLEapW9bIUISdHeuUV5/KYMTx5DABKwOt7eFeuXKnBgwerdu3aeumll3Tdddfpu+++s7JvAFDqnTkrglfsdumxx5wvu92yfgFAeeTRiO2BAwc0Z84czZw5U6mpqbr99tuVnZ2tjz/+mBvHAJQ7eXnSr786SxGOHXO+Dw0NcKcAoBwr9oht3759dfHFF+unn37S9OnTtW/fPr322mu+7BsAlFqLF0sNGkgrVji/RmfMCFWDBs71AIDAKPaI7RdffKHRo0drxIgRPEoXQLm2eLF0662SOausdu9e5/qFC6Wbbw5M3wCgPCv2iO0333yjU6dOqW3bturQoYP+9a9/6ciRI5Z04vXXX1eDBg0UFRWlDh06aO3atUVue+2118pmsxV45d/MBgC+lJfnvMfr7KRWOr3uwQed2wEA/KvYie0VV1yht99+W/v379ff/vY3zZs3T7Vr15bD4VBiYqJOnTrlVQfmz5+vsWPHasKECVq/fr0uvfRSde/eXYcOHSp0+8WLF2v//v2u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vPBCk5WVFZBz9BdPY3m2wu6OfvbZZ01cXJz55JNPzE8//WT69etXbqZVsjKWXJfFj+WkSZPMsmXLzPbt2826devMwIEDTVRUlNm4caNrG65La2JZXq9LT+O4e/duU6lSJTNq1CizZcsW89lnn5nq1aubp59+uthtBitfxPLhhx82ycnJZseOHebbb781Xbt2NfHx8ebQoUN+Pz9/8vbfnauvvtoMGDCg0Dat+K4ksfXCa6+9Zi644AITERFh2rdvb7777jvXZ507dzaDBw92vX/iiSdMkyZNTFRUlKlSpYrp2LGjmTdvnuvzjIwMc8MNN5iEhAQTHh5u6tevb4YPHx70Xy75PInl2QpLbB0Oh3nqqadMjRo1TGRkpLn++uvNli1bfNT70sXKWHJdFj+WDz74oGvbGjVqmF69epn169e7tcd1aU0sy/N16enf71WrVpkOHTqYyMhI06hRI/PMM8+Y3NzcYrcZzKyO5YABA0ytWrVMRESEqVOnjhkwYIDZtm2bv04noDyN5a+//mokmeXLlxfanhXflTZjjCn++C4AAABQOlFjCwAAgKBAYgsAAICgQGILAACAoEBiCwAAgKBAYgsAAICgQGILAACAoEBiCwAAgKBAYgsAAICgQGILAD6WnJwsm82mEydO+PW4c+bMUVxcXIna2Llzp2w2m1JSUorcJlDnBwBnI7EFgBKw2WznfE2cODHQXQSAciMs0B0AgLJs//79ruX58+dr/Pjx2rJli2tdxYoV9cMPP3jcbk5OjiIiIizpIwCUF4zYAkAJ1KxZ0/WqXLmybDab27qKFSu6tl23bp3atWun6OhoXXnllW4J8MSJE9W6dWu98847atiwoaKioiRJJ06c0LBhw5SQkKDY2Fhdd9112rBhg2u/DRs2qEuXLqpUqZJiY2PVtm3bAon0smXL1KxZM1WsWFE9evRwS8YdDocmT56sunXrKjIyUq1bt9bSpUvPec5LlizRRRddpAoVKqhLly7auXNnSUIIAJYhsQUAP3niiSf00ksv6YcfflBYWJj+8pe/uH2+bds2LVq0SIsXL3bVtN522206dOiQvvjiC61bt06XXXaZrr/+eh07dkySdNddd6lu3br6/vvvtW7dOj3++OMKDw93tZmRkaEXX3xR7777rlauXKndu3frkUcecX3+yiuv6KWXXtKLL76on376Sd27d9eNN96orVu3FnoOf/zxh26++Wb17dtXKSkpGjZsmB5//HGLIwUAXjIAAEvMnj3bVK5cucD6FStWGEnmf//7n2vd559/biSZzMxMY4wxEyZMMOHh4ebQoUOubb7++msTGxtrsrKy3Npr3Lixeeutt4wxxlSqVMnMmTOnyP5IMtu2bXOte/31102NGjVc72vXrm2eeeYZt/0uv/xyc//99xtjjNmxY4eRZH788UdjjDHjxo0zzZs3d9v+73//u5Fkjh8/Xmg/AMBfGLEFAD9p1aqVa7lWrVqSpEOHDrnW1a9fXwkJCa73GzZsUFpamqpVq6aKFSu6Xjt27ND27dslSWPHjtWwYcPUtWtXPfvss671+aKjo9W4cWO34+YfMzU1Vfv27dNVV13lts9VV12lzZs3F3oOmzdvVocOHdzWdezYsdgxAABf4uYxAPCTM0sEbDabJGeNa76YmBi37dPS0lSrVi0lJycXaCt/Gq+JEyfqzjvv1Oeff64vvvhCEyZM0Lx583TTTTcVOGb+cY0xVpwOAJQ6jNgCQCl12WWX6cCBAwoLC1OTJk3cXvHx8a7tLrroIj300ENavny5br75Zs2ePbtY7cfGxqp27dr69ttv3dZ/++23at68eaH7NGvWTGvXrnVb991333l4ZgDgGyS2AFBKde3aVR07dlT//v21fPly7dy5U6tWrdITTzyhH374QZmZmRo1apSSk5O1a9cuffvtt/r+++/VrFmzYh/j0Ucf1XPPPaf58+dry5Ytevzxx5WSkqIxY8YUuv19992nrVu36tFHH9WWLVv0/vvva86cORadMQCUDKUIAFBK2Ww2LVmyRE888YSGDh2qw4cPq2bNmrrmmmtUo0YNhYaG6ujRoxo0aJAOHjyo+Ph43XzzzZo0aVKxjzF69GidPHlSDz/8sA4dOqTmzZvrv//9ry688MJCt7/gggu0aNEiPfTQQ3rttdfUvn17TZkypcAMDwAQCDZDsRUAAACCAKUIAAAACAoktgAAAAgKJLYAAAAICiS2AAAACAoktgAAAAgKJLYAAAAICiS2AAAACAoktgAAAAgKJLYAAAAICiS2AAAACAoktgAAAAgK/w+B+bIrzeMMWgAAAABJRU5ErkJggg==\n" }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Best Threshold: 0.51\n", "Best Accuracy: 1.0000\n" ] } ] }, { "cell_type": "code", "source": [ "# Predictions corresponding to best_threshold\n", "predictions = (probabilities >= best_threshold).astype(int)\n", "\n", "# Calculate evaluation metrics\n", "accuracy = accuracy_score(true_labels, predictions)\n", "precision = precision_score(true_labels, predictions)\n", "recall = recall_score(true_labels, predictions)\n", "f1 = f1_score(true_labels, predictions)\n", "auc_roc = roc_auc_score(true_labels, probabilities)\n", "\n", "# Print metrics\n", "print(f\"Accuracy: {accuracy:.4f}\")\n", "print(f\"Precision: {precision:.4f}\")\n", "print(f\"Recall: {recall:.4f}\")\n", "print(f\"F1 Score: {f1:.4f}\")\n", "print(f\"AUC-ROC: {auc_roc:.4f}\")\n", "\n", "conf_matrix = confusion_matrix(true_labels, predictions)\n", "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n", "plt.title('Confusion Matrix')\n", "plt.xlabel('Predicted Labels')\n", "plt.ylabel('True Labels')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 561 }, "id": "O3kZy5V3luFh", "outputId": "c8b156ae-5ffd-4b91-d0b6-82c6c89a599e" }, "execution_count": 39, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Accuracy: 1.0000\n", "Precision: 1.0000\n", "Recall: 1.0000\n", "F1 Score: 1.0000\n", "AUC-ROC: 1.0000\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAHHCAYAAACPy0PBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABOl0lEQVR4nO3de1xU1fo/8M9wGxAcEBQGjooohqB4L51M0URQ0eMFy1uKhhoe9KR4i3NMkUr6al7zVplihqVWWoKpiCKVeEPxWuQFw5IBb0AgDAL790c/9nEEHUZnu5E+7177dZy116z97HnJ8eFZa+1RCIIggIiIiEhGZnIHQERERMSEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SESEIXL15EQEAA7O3toVAosHPnTpOOf/XqVSgUCsTGxpp03GdZz5490bNnT7nDICIjMSGhOu/y5ct444030Lx5c1hbW0OlUqFbt25YsWIFiouLJb12SEgIzp49i/feew+bN29G586dJb3e0zRu3DgoFAqoVKpqP8eLFy9CoVBAoVDggw8+MHr869evIyoqCunp6SaIlohqOwu5AyCSUkJCAl555RUolUqMHTsWbdq0QWlpKX788UfMmjUL58+fx8cffyzJtYuLi5Gamor//ve/mDJliiTXcHd3R3FxMSwtLSUZ3xALCwvcvXsXu3btwquvvqp3Li4uDtbW1igpKXmssa9fv44FCxagWbNmaN++fY3ft2/fvse6HhHJiwkJ1VmZmZkYMWIE3N3dceDAAbi6uornwsPDcenSJSQkJEh2/Rs3bgAAHBwcJLuGQqGAtbW1ZOMbolQq0a1bN3zxxRdVEpItW7YgKCgIX3/99VOJ5e7du6hXrx6srKyeyvWIyLQ4ZUN11qJFi1BYWIhPP/1ULxmp5OnpiTfffFN8XVZWhnfeeQctWrSAUqlEs2bN8J///Ac6nU7vfc2aNcOAAQPw448/4oUXXoC1tTWaN2+Ozz77TOwTFRUFd3d3AMCsWbOgUCjQrFkzAH9NdVT++X5RUVFQKBR6bYmJiXjppZfg4OAAOzs7eHl54T//+Y94/mFrSA4cOIDu3bvD1tYWDg4OGDRoEH7++edqr3fp0iWMGzcODg4OsLe3x/jx43H37t2Hf7APGDVqFL7//nvk5eWJbcePH8fFixcxatSoKv1v376NmTNnwtfXF3Z2dlCpVOjXrx9Onz4t9klOTsbzzz8PABg/frw49VN5nz179kSbNm2QlpaGHj16oF69euLn8uAakpCQEFhbW1e5/8DAQDRo0ADXr1+v8b0SkXSYkFCdtWvXLjRv3hwvvvhijfpPmDAB8+bNQ8eOHbFs2TL4+fkhJiYGI0aMqNL30qVLGDZsGPr06YMlS5agQYMGGDduHM6fPw8AGDp0KJYtWwYAGDlyJDZv3ozly5cbFf/58+cxYMAA6HQ6REdHY8mSJfjnP/+Jn3766ZHv279/PwIDA5Gbm4uoqChERETg8OHD6NatG65evVql/6uvvoo///wTMTExePXVVxEbG4sFCxbUOM6hQ4dCoVDgm2++Edu2bNmCVq1aoWPHjlX6X7lyBTt37sSAAQOwdOlSzJo1C2fPnoWfn5+YHHh7eyM6OhoAMGnSJGzevBmbN29Gjx49xHFu3bqFfv36oX379li+fDl69epVbXwrVqxAo0aNEBISgvLycgDARx99hH379uHDDz+Em5tbje+ViCQkENVB+fn5AgBh0KBBNeqfnp4uABAmTJig1z5z5kwBgHDgwAGxzd3dXQAgpKSkiG25ubmCUqkUZsyYIbZlZmYKAITFixfrjRkSEiK4u7tXiWH+/PnC/T+Sy5YtEwAIN27ceGjcldfYuHGj2Na+fXvB2dlZuHXrlth2+vRpwczMTBg7dmyV673++ut6Yw4ZMkRwcnJ66DXvvw9bW1tBEARh2LBhQu/evQVBEITy8nJBrVYLCxYsqPYzKCkpEcrLy6vch1KpFKKjo8W248ePV7m3Sn5+fgIAYd26ddWe8/Pz02vbu3evAEB49913hStXrgh2dnbC4MGDDd4jET09rJBQnVRQUAAAqF+/fo367969GwAQERGh1z5jxgwAqLLWxMfHB927dxdfN2rUCF5eXrhy5cpjx/ygyrUn3377LSoqKmr0nuzsbKSnp2PcuHFwdHQU29u2bYs+ffqI93m/sLAwvdfdu3fHrVu3xM+wJkaNGoXk5GRotVocOHAAWq222uka4K91J2Zmf/1fT3l5OW7duiVOR508ebLG11QqlRg/fnyN+gYEBOCNN95AdHQ0hg4dCmtra3z00Uc1vhYRSY8JCdVJKpUKAPDnn3/WqP9vv/0GMzMzeHp66rWr1Wo4ODjgt99+02tv2rRplTEaNGiAO3fuPGbEVQ0fPhzdunXDhAkT4OLighEjRmDbtm2PTE4q4/Ty8qpyztvbGzdv3kRRUZFe+4P30qBBAwAw6l769++P+vXrY+vWrYiLi8Pzzz9f5bOsVFFRgWXLlqFly5ZQKpVo2LAhGjVqhDNnziA/P7/G1/zHP/5h1ALWDz74AI6OjkhPT8fKlSvh7Oxc4/cSkfSYkFCdpFKp4ObmhnPnzhn1vgcXlT6Mubl5te2CIDz2NSrXN1SysbFBSkoK9u/fjzFjxuDMmTMYPnw4+vTpU6Xvk3iSe6mkVCoxdOhQbNq0CTt27HhodQQAFi5ciIiICPTo0QOff/459u7di8TERLRu3brGlSDgr8/HGKdOnUJubi4A4OzZs0a9l4ikx4SE6qwBAwbg8uXLSE1NNdjX3d0dFRUVuHjxol57Tk4O8vLyxB0zptCgQQO9HSmVHqzCAICZmRl69+6NpUuX4sKFC3jvvfdw4MABHDx4sNqxK+PMyMiocu6XX35Bw4YNYWtr+2Q38BCjRo3CqVOn8Oeff1a7ELjSV199hV69euHTTz/FiBEjEBAQAH9//yqfSU2Tw5ooKirC+PHj4ePjg0mTJmHRokU4fvy4ycYnoifHhITqrNmzZ8PW1hYTJkxATk5OlfOXL1/GihUrAPw15QCgyk6YpUuXAgCCgoJMFleLFi2Qn5+PM2fOiG3Z2dnYsWOHXr/bt29XeW/lA8Ie3IpcydXVFe3bt8emTZv0/oE/d+4c9u3bJ96nFHr16oV33nkHq1atglqtfmg/c3PzKtWX7du3448//tBrq0ycqkvejDVnzhxkZWVh06ZNWLp0KZo1a4aQkJCHfo5E9PTxwWhUZ7Vo0QJbtmzB8OHD4e3trfek1sOHD2P79u0YN24cAKBdu3YICQnBxx9/jLy8PPj5+eHYsWPYtGkTBg8e/NAtpY9jxIgRmDNnDoYMGYJ///vfuHv3LtauXYvnnntOb1FndHQ0UlJSEBQUBHd3d+Tm5mLNmjVo3LgxXnrppYeOv3jxYvTr1w8ajQahoaEoLi7Ghx9+CHt7e0RFRZnsPh5kZmaGuXPnGuw3YMAAREdHY/z48XjxxRdx9uxZxMXFoXnz5nr9WrRoAQcHB6xbtw7169eHra0tunTpAg8PD6PiOnDgANasWYP58+eL25A3btyInj174u2338aiRYuMGo+IJCLzLh8iyf3666/CxIkThWbNmglWVlZC/fr1hW7dugkffvihUFJSIva7d++esGDBAsHDw0OwtLQUmjRpIkRGRur1EYS/tv0GBQVVuc6D200ftu1XEARh3759Qps2bQQrKyvBy8tL+Pzzz6ts+01KShIGDRokuLm5CVZWVoKbm5swcuRI4ddff61yjQe3xu7fv1/o1q2bYGNjI6hUKmHgwIHChQsX9PpUXu/BbcUbN24UAAiZmZkP/UwFQX/b78M8bNvvjBkzBFdXV8HGxkbo1q2bkJqaWu123W+//Vbw8fERLCws9O7Tz89PaN26dbXXvH+cgoICwd3dXejYsaNw7949vX7Tp08XzMzMhNTU1EfeAxE9HQpBMGLlGhEREZEEuIaEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZFcnn9Rq02GK3CEQ1Up3jq+SOwSiWsf6KfxLaKp/l4pP1d2fYVZIiIiISHZ1skJCRERUqyj4+78hTEiIiIikplDIHUGtx4SEiIhIaqyQGMRPiIiIiGTHCgkREZHUOGVjEBMSIiIiqXHKxiB+QkRERCQ7VkiIiIikxikbg5iQEBERSY1TNgbxEyIiIiLZsUJCREQkNU7ZGMSEhIiISGqcsjGInxARERHJjhUSIiIiqXHKxiAmJERERFLjlI1BTEiIiIikxgqJQUzZiIiISHaskBAREUmNUzYG8RMiIiKSmsLMNMcTeP/996FQKDBt2jSxraSkBOHh4XBycoKdnR2Cg4ORk5Oj976srCwEBQWhXr16cHZ2xqxZs1BWVqbXJzk5GR07doRSqYSnpydiY2ONjo8JCRERUR13/PhxfPTRR2jbtq1e+/Tp07Fr1y5s374dhw4dwvXr1zF06FDxfHl5OYKCglBaWorDhw9j06ZNiI2Nxbx588Q+mZmZCAoKQq9evZCeno5p06ZhwoQJ2Lt3r1ExMiEhIiKSmpnCNMdjKCwsxOjRo/HJJ5+gQYMGYnt+fj4+/fRTLF26FC+//DI6deqEjRs34vDhwzhy5AgAYN++fbhw4QI+//xztG/fHv369cM777yD1atXo7S0FACwbt06eHh4YMmSJfD29saUKVMwbNgwLFu2zLiP6LHujoiIiGpOximb8PBwBAUFwd/fX689LS0N9+7d02tv1aoVmjZtitTUVABAamoqfH194eLiIvYJDAxEQUEBzp8/L/Z5cOzAwEBxjJriolYiIqJnhE6ng06n02tTKpVQKpXV9v/yyy9x8uRJHD9+vMo5rVYLKysrODg46LW7uLhAq9WKfe5PRirPV557VJ+CggIUFxfDxsamRvfGCgkREZHUFAqTHDExMbC3t9c7YmJiqr3ktWvX8OabbyIuLg7W1tZP+YaNx4SEiIhIaiaasomMjER+fr7eERkZWe0l09LSkJubi44dO8LCwgIWFhY4dOgQVq5cCQsLC7i4uKC0tBR5eXl678vJyYFarQYAqNXqKrtuKl8b6qNSqWpcHQGYkBARET0zlEolVCqV3vGw6ZrevXvj7NmzSE9PF4/OnTtj9OjR4p8tLS2RlJQkvicjIwNZWVnQaDQAAI1Gg7NnzyI3N1fsk5iYCJVKBR8fH7HP/WNU9qkco6a4hoSIiEhqMjw6vn79+mjTpo1em62tLZycnMT20NBQREREwNHRESqVClOnToVGo0HXrl0BAAEBAfDx8cGYMWOwaNEiaLVazJ07F+Hh4WIiFBYWhlWrVmH27Nl4/fXXceDAAWzbtg0JCQlGxcuEhIiISGq19Emty5Ytg5mZGYKDg6HT6RAYGIg1a9aI583NzREfH4/JkydDo9HA1tYWISEhiI6OFvt4eHggISEB06dPx4oVK9C4cWOsX78egYGBRsWiEARBMNmd1RI2HabIHQJRrXTn+Cq5QyCqdayfwq/mNoEfmGSc4r0zTTJObVQ7UzYiIiL6W+GUDRERkdRq6ZRNbcKEhIiISGoyLGp91jBlIyIiItmxQkJERCQ1TtkYxISEiIhIapyyMYgpGxEREcmOFRIiIiKpccrGICYkREREUmNCYhA/ISIiIpIdKyRERERS46JWg5iQEBERSY1TNgYxISEiIpIaKyQGMWUjIiIi2bFCQkREJDVO2RjEhISIiEhqnLIxiCkbERERyY4VEiIiIokpWCExiAkJERGRxJiQGMYpGyIiIpIdKyRERERSY4HEICYkREREEuOUjWGcsiEiIiLZsUJCREQkMVZIDGNCQkREJDEmJIYxISEiIpIYExLDuIaEiIiIZMcKCRERkdRYIDGICQkREZHEOGVjGKdsiIiISHaskBAREUmMFRLDmJAQERFJjAmJYZyyISIiqoPWrl2Ltm3bQqVSQaVSQaPR4PvvvxfP9+zZEwqFQu8ICwvTGyMrKwtBQUGoV68enJ2dMWvWLJSVlen1SU5ORseOHaFUKuHp6YnY2NjHipcVEiIiIonJUSFp3Lgx3n//fbRs2RKCIGDTpk0YNGgQTp06hdatWwMAJk6ciOjoaPE99erVE/9cXl6OoKAgqNVqHD58GNnZ2Rg7diwsLS2xcOFCAEBmZiaCgoIQFhaGuLg4JCUlYcKECXB1dUVgYKBR8SoEQRBMcN+1ik2HKXKHQFQr3Tm+Su4QiGod66fwq7lTyBcmGefWppFP9H5HR0csXrwYoaGh6NmzJ9q3b4/ly5dX2/f777/HgAEDcP36dbi4uAAA1q1bhzlz5uDGjRuwsrLCnDlzkJCQgHPnzonvGzFiBPLy8rBnzx6jYuOUDRERUR1XXl6OL7/8EkVFRdBoNGJ7XFwcGjZsiDZt2iAyMhJ3794Vz6WmpsLX11dMRgAgMDAQBQUFOH/+vNjH399f71qBgYFITU01OkZO2RAREUnMVFM2Op0OOp1Or02pVEKpVFbb/+zZs9BoNCgpKYGdnR127NgBHx8fAMCoUaPg7u4ONzc3nDlzBnPmzEFGRga++eYbAIBWq9VLRgCIr7Va7SP7FBQUoLi4GDY2NjW+NyYkREREEjNVQhITE4MFCxbotc2fPx9RUVHV9vfy8kJ6ejry8/Px1VdfISQkBIcOHYKPjw8mTZok9vP19YWrqyt69+6Ny5cvo0WLFiaJ1xhMSIiIiCRmqoQkMjISERERem0Pq44AgJWVFTw9PQEAnTp1wvHjx7FixQp89NFHVfp26dIFAHDp0iW0aNECarUax44d0+uTk5MDAFCr1eL/Vrbd30elUhlVHQG4hoSIiOiZoVQqxW28lcejEpIHVVRUVJnyqZSeng4AcHV1BQBoNBqcPXsWubm5Yp/ExESoVCpx2kej0SApKUlvnMTERL11KjXFCgkREZHUZHguWmRkJPr164emTZvizz//xJYtW5CcnIy9e/fi8uXL2LJlC/r37w8nJyecOXMG06dPR48ePdC2bVsAQEBAAHx8fDBmzBgsWrQIWq0Wc+fORXh4uJgEhYWFYdWqVZg9ezZef/11HDhwANu2bUNCQoLR8TIhISIikpgczyHJzc3F2LFjkZ2dDXt7e7Rt2xZ79+5Fnz59cO3aNezfvx/Lly9HUVERmjRpguDgYMydO1d8v7m5OeLj4zF58mRoNBrY2toiJCRE77klHh4eSEhIwPTp07FixQo0btwY69evN/oZJACfQ0L0t8LnkBBV9TSeQ+IyYbtJxslZ/4pJxqmNWCEhIiKSGL/LxjAmJERERBJjQmIYd9kQERGR7FghISIikhgrJIYxISEiIpIa8xGDOGVDREREsmOFhIiISGKcsjGMCQkREZHEmJAYxoSEiIhIYkxIDOMaEiIiIpIdKyRERERSY4HEICYkREREEuOUjWGcsiEiIiLZMSEho8wc3wfFp1Zh8cxgAEADVT0snfMKTu94G7dTl+LX3dFYMnsYVHbWeu/r5NMUu9dNRXbKIlw/tAjfrQ6H73P/qPYazZs0RO6PHyA7ZZHk90P0tH25JQ79+ryM5zv4YvSIV3D2zBm5Q6KnQKFQmOSoy5iQUI118mmK0OBuOPPr72KbayN7uDayR+SyHej0ykJMnP85+rzog3XzR4t9bG2s8O3qcFzT3kGPMR+g9/ilKLxbgu9Wh8PCQv+voIWFGT6LGY+fTl1+avdF9LTs+X43PlgUgzf+FY4vt++Al1crTH4jFLdu3ZI7NJIYExLDmJBQjdjaWGHjwnH41ztfIK+gWGy/cDkbI2eux+6Uc8j8/SYOHf8VUat2oX+PNjA3/+uvl5eHGk4OtnhnbTwu/paLn69o8d5H30PdUIWmro5614n610BkZObg630nn+r9ET0NmzdtxNBhr2LwkGC08PTE3PkLYG1tjZ3ffC13aESykzUhuXnzJhYtWoQhQ4ZAo9FAo9FgyJAhWLx4MW7cuCFnaPSA5ZHDseeHczh4NMNgX1V9axQUlaC8vAIA8OvVHNy8U4iQwS/C0sIc1kpLjBuswc9XsvHb9dvi+/yefw5D+3TAtPe3SXYfRHK5V1qKny+cR1fNi2KbmZkZunZ9EWdOn5IxMnoaWCExTLaE5Pjx43juueewcuVK2Nvbo0ePHujRowfs7e2xcuVKtGrVCidOnJArPLrPK4Gd0L5VE7z94XcG+zo52CJyYj9s+Pqw2FZ4V4fAiSswsv/zuHNkGW7+tAR9XvTG4ClrxKTF0d4Wnyx4DRPnb8afRSWS3QuRXO7k3UF5eTmcnJz02p2cnHDz5k2ZoqKnRmGiow6Tbdvv1KlT8corr2DdunVVsj5BEBAWFoapU6ciNTX1kePodDrodDr991eUQ2FmbvKY/44auzhg8axgDJi8CrrSskf2rW9rjR0rJ+PnK9l496MEsd1aaYl180cj9fQVhERuhLm5GaaN7Y1vVk7GS68tRonuHta8PRJb95zATye5doSI6O9ItoTk9OnTiI2NrbYEpVAoMH36dHTo0MHgODExMViwYIFem7nL87B0fcFksf6ddfBuChcnFVK3zBHbLCzM8VLHFggb3gP2XaahokKAXT0lvlv9L/x5twTDIz5BWVmF2H94v85o6uYIv5AlEAQBABASGYvslEUY2LMttu9Ng98LzyHIzxfTxvQG8NffAXNzM/x5fAXC3/0Cn3175OneOJGJNXBoAHNz8yoLWG/duoWGDRvKFBU9LXV9usUUZEtI1Go1jh07hlatWlV7/tixY3BxcTE4TmRkJCIiIvTanLvPeUhvMtbBYxnoNOw9vbaPF7yGjMwcLIlNREWFgPq21ti1Jhy60jIMm/ZRlUpKPWsrVFQIYjICABWCAEEAzP7/D2nPkCUwN/vfDOKAnm0xY5w/eo1biuu5edLdINFTYmllBW+f1jh6JBUv9/YHAFRUVODo0VSMGPmazNGR1JiQGCZbQjJz5kxMmjQJaWlp6N27t5h85OTkICkpCZ988gk++OADg+MolUoolUq9Nk7XmE7hXR0uXM7WaysqLsXt/CJcuJyN+rbWiF8TDhtrK4z/7yaobK2hsv3rGSQ37hSiokJA0pFfsHDaYCyPfBVrvzwEM4UCM8cHoKy8HIdO/AoAyMjM0btGR5+mqBCEKtcmepaNCRmPt/8zB61bt0Eb37b4fPMmFBcXY/CQoXKHRhJjPmKYbAlJeHg4GjZsiGXLlmHNmjUoLy8HAJibm6NTp06IjY3Fq6++Kld4VEPtWzXBC209AAAXdkXpnfPqPw9Z2bfx69UcBL/5Ef77Rj8kb5qBigoBp3/5HYPC10B7s0CGqInk0bdff9y5fRtrVq3EzZs34NXKG2s+Wg8nTtkQQSHcX0eXyb1798RV5g0bNoSlpeUTjWfTYYopwiKqc+4cXyV3CES1jvVT+NW85aw9Jhnn4uK+JhmnNqoVX65naWkJV1dXucMgIiKSBKdsDOOTWomIiEh2taJCQkREVJdxl41hTEiIiIgkxnzEME7ZEBERkexYISEiIpKYmRlLJIYwISEiIpIYp2wM45QNERERyY4VEiIiIolxl41hrJAQERFJTKEwzWGMtWvXom3btlCpVFCpVNBoNPj+++/F8yUlJQgPD4eTkxPs7OwQHByMnBz97xXLyspCUFAQ6tWrB2dnZ8yaNQtlZfpfoJqcnIyOHTtCqVTC09MTsbGxj/UZMSEhIiKSmEKhMMlhjMaNG+P9999HWloaTpw4gZdffhmDBg3C+fPnAQDTp0/Hrl27sH37dhw6dAjXr1/H0KH/+6LH8vJyBAUFobS0FIcPH8amTZsQGxuLefPmiX0yMzMRFBSEXr16IT09HdOmTcOECROwd+9e4z+j2vBdNqbG77Ihqh6/y4aoqqfxXTZt5+03yThnov2f6P2Ojo5YvHgxhg0bhkaNGmHLli0YNmwYAOCXX36Bt7c3UlNT0bVrV3z//fcYMGAArl+/DhcXFwDAunXrMGfOHNy4cQNWVlaYM2cOEhIScO7cOfEaI0aMQF5eHvbsMe77e1ghISIikpipKiQ6nQ4FBQV6h06nM3j98vJyfPnllygqKoJGo0FaWhru3bsHf///JTitWrVC06ZNkZqaCgBITU2Fr6+vmIwAQGBgIAoKCsQqS2pqqt4YlX0qxzAGExIiIiKJmWoNSUxMDOzt7fWOmJiYh1737NmzsLOzg1KpRFhYGHbs2AEfHx9otVpYWVnBwcFBr7+Liwu0Wi0AQKvV6iUjlecrzz2qT0FBAYqLi436jLjLhoiI6BkRGRmJiIgIvTalUvnQ/l5eXkhPT0d+fj6++uorhISE4NChQ1KH+ViYkBAREUnMVNt+lUrlIxOQB1lZWcHT0xMA0KlTJxw/fhwrVqzA8OHDUVpairy8PL0qSU5ODtRqNQBArVbj2LFjeuNV7sK5v8+DO3NycnKgUqlgY2Nj1L1xyoaIiEhicmz7rU5FRQV0Oh06deoES0tLJCUliecyMjKQlZUFjUYDANBoNDh79ixyc3PFPomJiVCpVPDx8RH73D9GZZ/KMYzBCgkREVEdFBkZiX79+qFp06b4888/sWXLFiQnJ2Pv3r2wt7dHaGgoIiIi4OjoCJVKhalTp0Kj0aBr164AgICAAPj4+GDMmDFYtGgRtFot5s6di/DwcLFKExYWhlWrVmH27Nl4/fXXceDAAWzbtg0JCQlGx8uEhIiISGJyPKk1NzcXY8eORXZ2Nuzt7dG2bVvs3bsXffr0AQAsW7YMZmZmCA4Ohk6nQ2BgINasWSO+39zcHPHx8Zg8eTI0Gg1sbW0REhKC6OhosY+HhwcSEhIwffp0rFixAo0bN8b69esRGBhodLx8DgnR3wifQ0JU1dN4Dknndw+aZJwTc3uZZJzaiGtIiIiISHacsiEiIpIYv1zPMCYkREREEmM+YhgTEiIiIomxQmIY15AQERGR7FghISIikhgLJIYxISEiIpIYp2wM45QNERERyY4VEiIiIomxQGIYExIiIiKJccrGME7ZEBERkexYISEiIpIYCySGMSEhIiKSGKdsDOOUDREREcmOFRIiIiKJsUJiGBMSIiIiiTEfMYwJCRERkcRYITGMa0iIiIhIdqyQEBERSYwFEsOYkBAREUmMUzaGccqGiIiIZMcKCRERkcRYIDGMCQkREZHEzJiRGMQpGyIiIpIdKyREREQSY4HEMCYkREREEuMuG8OYkBAREUnMjPmIQVxDQkRERLJjhYSIiEhinLIxzOgKyaZNm5CQkCC+nj17NhwcHPDiiy/it99+M2lwREREdYFCYZqjLjM6IVm4cCFsbGwAAKmpqVi9ejUWLVqEhg0bYvr06SYPkIiIiOo+o6dsrl27Bk9PTwDAzp07ERwcjEmTJqFbt27o2bOnqeMjIiJ65ilQx8sbJmB0hcTOzg63bt0CAOzbtw99+vQBAFhbW6O4uNi00REREdUBZgrTHMaIiYnB888/j/r168PZ2RmDBw9GRkaGXp+ePXtCoVDoHWFhYXp9srKyEBQUhHr16sHZ2RmzZs1CWVmZXp/k5GR07NgRSqUSnp6eiI2NNfozMrpC0qdPH0yYMAEdOnTAr7/+iv79+wMAzp8/j2bNmhkdABEREZneoUOHEB4ejueffx5lZWX4z3/+g4CAAFy4cAG2trZiv4kTJyI6Olp8Xa9ePfHP5eXlCAoKglqtxuHDh5GdnY2xY8fC0tISCxcuBABkZmYiKCgIYWFhiIuLQ1JSEiZMmABXV1cEBgbWOF6jE5LVq1dj7ty5uHbtGr7++ms4OTkBANLS0jBy5EhjhyMiIqrz5Nhls2fPHr3XsbGxcHZ2RlpaGnr06CG216tXD2q1utox9u3bhwsXLmD//v1wcXFB+/bt8c4772DOnDmIioqClZUV1q1bBw8PDyxZsgQA4O3tjR9//BHLli0zKiExesrGwcEBq1atwrfffou+ffuK7QsWLMB///tfY4cjIiKq80y1y0an06GgoEDv0Ol0NYohPz8fAODo6KjXHhcXh4YNG6JNmzaIjIzE3bt3xXOpqanw9fWFi4uL2BYYGIiCggKcP39e7OPv7683ZmBgIFJTU436jGpUITlz5kyNB2zbtq1RARAREVHNxMTEYMGCBXpt8+fPR1RU1CPfV1FRgWnTpqFbt25o06aN2D5q1Ci4u7vDzc0NZ86cwZw5c5CRkYFvvvkGAKDVavWSEQDia61W+8g+BQUFKC4uFnfmGlKjhKR9+/ZQKBQQBKHa85XnFAoFysvLa3RhIiKivwszE03ZREZGIiIiQq9NqVQafF94eDjOnTuHH3/8Ua990qRJ4p99fX3h6uqK3r174/Lly2jRooVJYq6pGiUkmZmZUsdBRERUZ5lqCYlSqaxRAnK/KVOmID4+HikpKWjcuPEj+3bp0gUAcOnSJbRo0QJqtRrHjh3T65OTkwMA4roTtVottt3fR6VS1bg6AtQwIXF3d6/xgERERKRPjkWtgiBg6tSp2LFjB5KTk+Hh4WHwPenp6QAAV1dXAIBGo8F7772H3NxcODs7AwASExOhUqng4+Mj9tm9e7feOImJidBoNEbF+1hfrrd582Z069YNbm5u4uPily9fjm+//fZxhiMiIiITCw8Px+eff44tW7agfv360Gq10Gq14jPDLl++jHfeeQdpaWm4evUqvvvuO4wdOxY9evQQ14MGBATAx8cHY8aMwenTp7F3717MnTsX4eHhYqUmLCwMV65cwezZs/HLL79gzZo12LZtm9FPbzc6IVm7di0iIiLQv39/5OXliWtGHBwcsHz5cmOHIyIiqvPk+C6btWvXIj8/Hz179oSrq6t4bN26FQBgZWWF/fv3IyAgAK1atcKMGTMQHByMXbt2iWOYm5sjPj4e5ubm0Gg0eO211zB27Fi955Z4eHggISEBiYmJaNeuHZYsWYL169cbteUXABTCw1aqPoSPjw8WLlyIwYMHo379+jh9+jSaN2+Oc+fOoWfPnrh586ZRAUjBpsMUuUMgqpXuHF8ldwhEtY71U/je++GbTplknK0hHUwyTm1kdIUkMzMTHTpU/UCUSiWKiopMEhQRERH9vRidkHh4eIiLXu63Z88eeHt7myImIiKiOkVhoqMuM7pQFRERgfDwcJSUlEAQBBw7dgxffPEFYmJisH79eiliJCIieqbJscvmWWN0QjJhwgTY2Nhg7ty5uHv3LkaNGgU3NzesWLECI0aMkCJGIiIiquMeaynP6NGjMXr0aNy9exeFhYXi3mQiIiKqyowFEoMee21xbm4uMjIyAPxVimrUqJHJgiIiIqpLOGVjmNGLWv/880+MGTMGbm5u8PPzg5+fH9zc3PDaa6+J3yRIREREZAyjE5IJEybg6NGjSEhIQF5eHvLy8hAfH48TJ07gjTfekCJGIiKiZ5ocD0Z71hg9ZRMfH4+9e/fipZdeEtsCAwPxySefoG/fviYNjoiIqC7glI1hRickTk5OsLe3r9Jub2+PBg0amCQoIiKiuoSLWg0zespm7ty5iIiIgFarFdu0Wi1mzZqFt99+26TBERER0d9DjSokHTp00Cs3Xbx4EU2bNkXTpk0BAFlZWVAqlbhx4wbXkRARET2AUzaG1SghGTx4sMRhEBER1V1MRwyrUUIyf/58qeMgIiKiv7Gn8KXLREREf29mnLIxyOiEpLy8HMuWLcO2bduQlZWF0tJSvfO3b982WXBERER1AfMRw4zeZbNgwQIsXboUw4cPR35+PiIiIjB06FCYmZkhKipKghCJiIiorjM6IYmLi8Mnn3yCGTNmwMLCAiNHjsT69esxb948HDlyRIoYiYiInmkKhcIkR11mdEKi1Wrh6+sLALCzsxO/v2bAgAFISEgwbXRERER1AB8db5jRCUnjxo2RnZ0NAGjRogX27dsHADh+/DiUSqVpoyMiIqK/BaMTkiFDhiApKQkAMHXqVLz99tto2bIlxo4di9dff93kARIRET3rzBQKkxx1mdG7bN5//33xz8OHD4e7uzsOHz6Mli1bYuDAgSYNjoiIqC6o47mESRhdIXlQ165dERERgS5dumDhwoWmiImIiKhO4aJWw544IamUnZ3NL9cjIiKix1Inn9R65/gquUMgqpUa9H3fcCeiv5ni/W9Jfg2T/fZfh9XJhISIiKg2qevTLabApI2IiIhkV+MKSURExCPP37hx44mDISIiqovMWCAxqMYJyalTpwz26dGjxxMFQ0REVBcxITGsxgnJwYMHpYyDiIiI/sa4qJWIiEhiXNRqGBMSIiIiiXHKxjDusiEiIqqDYmJi8Pzzz6N+/fpwdnbG4MGDkZGRodenpKQE4eHhcHJygp2dHYKDg5GTk6PXJysrC0FBQahXrx6cnZ0xa9YslJWV6fVJTk5Gx44doVQq4enpidjYWKPjZUJCREQkMYXCNIcxDh06hPDwcBw5cgSJiYm4d+8eAgICUFRUJPaZPn06du3ahe3bt+PQoUO4fv06hg4dKp4vLy9HUFAQSktLcfjwYWzatAmxsbGYN2+e2CczMxNBQUHo1asX0tPTMW3aNEyYMAF79+417jMSBEEw7hZrv5Iyw32I/o74pFaiqp7Gk1rf2v2rScZ5v/9zj/3eGzduwNnZGYcOHUKPHj2Qn5+PRo0aYcuWLRg2bBgA4JdffoG3tzdSU1PRtWtXfP/99xgwYACuX78OFxcXAMC6deswZ84c3LhxA1ZWVpgzZw4SEhJw7tw58VojRoxAXl4e9uzZU+P4HqtC8sMPP+C1116DRqPBH3/8AQDYvHkzfvzxx8cZjoiIqE4zM9Gh0+lQUFCgd+h0uhrFkJ+fDwBwdHQEAKSlpeHevXvw9/cX+7Rq1QpNmzZFamoqACA1NRW+vr5iMgIAgYGBKCgowPnz58U+949R2adyjJoyOiH5+uuvERgYCBsbG5w6dUr8IPLz8/ltv0RERBKKiYmBvb293hETE2PwfRUVFZg2bRq6deuGNm3aAAC0Wi2srKzg4OCg19fFxQVarVbsc38yUnm+8tyj+hQUFKC4uLjG92Z0QvLuu+9i3bp1+OSTT2BpaSm2d+vWDSdPnjR2OCIiojrPVGtIIiMjkZ+fr3dERkYavH54eDjOnTuHL7/88inc7eMxettvRkZGtU9ktbe3R15eniliIiIiqlPMTPQcEqVSCaVSadR7pkyZgvj4eKSkpKBx48Ziu1qtRmlpKfLy8vSqJDk5OVCr1WKfY8eO6Y1XuQvn/j4P7szJycmBSqWCjY1NjeM0ukKiVqtx6dKlKu0//vgjmjdvbuxwREREJAFBEDBlyhTs2LEDBw4cgIeHh975Tp06wdLSEklJSWJbRkYGsrKyoNFoAAAajQZnz55Fbm6u2CcxMREqlQo+Pj5in/vHqOxTOUZNGZ2QTJw4EW+++SaOHj0KhUKB69evIy4uDjNnzsTkyZONHY6IiKjOk2Pbb3h4OD7//HNs2bIF9evXh1arhVarFdd12NvbIzQ0FBERETh48CDS0tIwfvx4aDQadO3aFQAQEBAAHx8fjBkzBqdPn8bevXsxd+5chIeHi5WasLAwXLlyBbNnz8Yvv/yCNWvWYNu2bZg+fbpR8Ro9ZfPWW2+hoqICvXv3xt27d9GjRw8olUrMnDkTU6dONXY4IiKiOk+OJ7WuXbsWANCzZ0+99o0bN2LcuHEAgGXLlsHMzAzBwcHQ6XQIDAzEmjVrxL7m5uaIj4/H5MmTodFoYGtri5CQEERHR4t9PDw8kJCQgOnTp2PFihVo3Lgx1q9fj8DAQKPifeznkJSWluLSpUsoLCyEj48P7OzsHmcYSfA5JETV43NIiKp6Gs8hidp30TTjBLQ0yTi10WN/l42VlZU4f0REREQPZ6pFrXWZ0QlJr169HvmthQcOHHiigIiIiOoa5iOGGZ2QtG/fXu/1vXv3kJ6ejnPnziEkJMRUcREREdHfiNEJybJly6ptj4qKQmFh4RMHREREVNfIsaj1WWOyb/t97bXXsGHDBlMNR0REVGcoTPRfXfbYi1oflJqaCmtra1MNR0REVGewQmKY0QnJ0KFD9V4LgoDs7GycOHECb7/9tskCIyIior8PoxMSe3t7vddmZmbw8vJCdHQ0AgICTBYYERFRXcEKiWFGJSTl5eUYP348fH190aBBA6liIiIiqlMe9bgM+otRi1rNzc0REBDAb/UlIiIikzJ6l02bNm1w5coVKWIhIiKqk8wUpjnqMqMTknfffRczZ85EfHw8srOzUVBQoHcQERGRPjm+7fdZU+M1JNHR0ZgxYwb69+8PAPjnP/+pNycmCAIUCgXKy8tNHyURERHVaTVOSBYsWICwsDAcPHhQyniIiIjqHH65nmE1TkgEQQAA+Pn5SRYMERFRXVTX13+YglFrSLhtiYiIiKRg1HNInnvuOYNJye3bt58oICIiorqGv88bZlRCsmDBgipPaiUiIqJHM6vjX4xnCkYlJCNGjICzs7NUsRAREdVJrJAYVuM1JFw/QkRERFIxepcNERERGYe7bAyrcUJSUVEhZRxERER1Fp9DYpjRj44nIiIiMjWjFrUSERGR8VggMYwJCRERkcQ4ZWMYp2yIiIhIdqyQEBERSYwFEsOYkBAREUmM0xGG8TMiIiIi2bFCQkREJDE+7dwwJiREREQSYzpiGBMSIiIiiXHbr2FcQ0JERFRHpaSkYODAgXBzc4NCocDOnTv1zo8bNw4KhULv6Nu3r16f27dvY/To0VCpVHBwcEBoaCgKCwv1+pw5cwbdu3eHtbU1mjRpgkWLFhkdKxMSIiIiiSlMdBirqKgI7dq1w+rVqx/ap2/fvsjOzhaPL774Qu/86NGjcf78eSQmJiI+Ph4pKSmYNGmSeL6goAABAQFwd3dHWloaFi9ejKioKHz88cdGxcopGyIiIonJNWPTr18/9OvX75F9lEol1Gp1ted+/vln7NmzB8ePH0fnzp0BAB9++CH69++PDz74AG5uboiLi0NpaSk2bNgAKysrtG7dGunp6Vi6dKle4mIIKyRERETPCJ1Oh4KCAr1Dp9M90ZjJyclwdnaGl5cXJk+ejFu3bonnUlNT4eDgICYjAODv7w8zMzMcPXpU7NOjRw9YWVmJfQIDA5GRkYE7d+7UOA4mJERERBJ7cJ3G4x4xMTGwt7fXO2JiYh47rr59++Kzzz5DUlIS/u///g+HDh1Cv379UF5eDgDQarVwdnbWe4+FhQUcHR2h1WrFPi4uLnp9Kl9X9qkJTtkQERFJzFS//UdGRiIiIkKvTalUPvZ4I0aMEP/s6+uLtm3bokWLFkhOTkbv3r0fe9zHwQoJERHRM0KpVEKlUukdT5KQPKh58+Zo2LAhLl26BABQq9XIzc3V61NWVobbt2+L607UajVycnL0+lS+ftjalOowISEiIpKYqaZspPb777/j1q1bcHV1BQBoNBrk5eUhLS1N7HPgwAFUVFSgS5cuYp+UlBTcu3dP7JOYmAgvLy80aNCgxtdmQkJERCQxubb9FhYWIj09Henp6QCAzMxMpKenIysrC4WFhZg1axaOHDmCq1evIikpCYMGDYKnpycCAwMBAN7e3ujbty8mTpyIY8eO4aeffsKUKVMwYsQIuLm5AQBGjRoFKysrhIaG4vz589i6dStWrFhRZWrJECYkREREddSJEyfQoUMHdOjQAQAQERGBDh06YN68eTA3N8eZM2fwz3/+E8899xxCQ0PRqVMn/PDDD3rTQHFxcWjVqhV69+6N/v3746WXXtJ7xoi9vT327duHzMxMdOrUCTNmzMC8efOM2vILAApBEATT3HbtUVImdwREtVODvu/LHQJRrVO8/y3Jr/HV6WyTjDOsnatJxqmNuMuGiIhIYpyOMIwJCRERkcSexoLUZx2TNiIiIpIdKyREREQSY33EMCYkREREEuOMjWGcsiEiIiLZsUJCREQkMTNO2hjEhISIiEhinLIxjFM2REREJDtWSIiIiCSm4JSNQUxIiIiIJMYpG8M4ZUNERESyY4WEiIhIYtxlYxgTEiIiIolxysYwJiREREQSY0JiGNeQEBERkexYISEiIpIYt/0axoSEiIhIYmbMRwzilA0RERHJjhUSIiIiiXHKxjAmJERERBLjLhvDOGVDREREsmOFhIiISGKcsjGMCQkREZHEuMvGME7ZEBERkexYISHJfLklDps2foqbN2/gOa9WeOs/b8O3bVu5wyJ6YhMHdsDEgR3g7mIPAPj5t5tYuPkn7Dt+BQDg4eqA9994GZo2jaG0NEfiiSuI+DARuXl3AQDd2zXFviWjqh37pfBYpGVo0bKxIz6cFohW7g1hb6tE9q1CbD1wHu999hPKyiuezo2SyXDKxjAmJCSJPd/vxgeLYjB3/gL4+rZD3OZNmPxGKL6N3wMnJye5wyN6In/c+BNvr0/GpT/uQAHgtQBfbI8ORtewjfgtJx/x/zccZy/not+sLwAA88d1x9fvDkOPqZ9BEIAj539Hs1c+1Btz3vju6NWhGdIytACAe+XliEs8h/SLOcgvLIFvC2esjugHM4UC8zekPO1bpifEXTaGMSEhSWzetBFDh72KwUOCAQBz5y9ASkoydn7zNUInTpI5OqIns/vIJb3XURtTMHFgB7zg7Qa3hnZwd7FH17CN+PNuKQBgwqIEZO+Yhp4d3HHw5G+4V1aBnDtF4vstzM0wQNMSa3emiW1Xs/NxNfus+DortwA9ks6jm28Tie+OpMB8xDCuISGTu1daip8vnEdXzYtim5mZGbp2fRFnTp+SMTIi0zMzU+CVnt6wtbbE0Qt/QGlpAQGA7l652KektAwVgoAX21SfTAx4sSWcVDbYvPdstecBoLmbA/o83xw/nMky9S0Q1Qq1ukJy7do1zJ8/Hxs2bHhoH51OB51Op9cmmCuhVCqlDo8e4k7eHZSXl1eZmnFyckJm5hWZoiIyrdYejZC8cgysrSxQWFyK4VHf4JesW7iZfxdFJaV4b0JPzNtwCAqFAu9O6AkLczOoHW2rHSukb1sknsjEHzf/rHLu4IrX0L6lGtZWFlgffwrRsT9IfWskATPO2RhUqyskt2/fxqZNmx7ZJyYmBvb29nrH4v+LeUoREtHf1a/XbqHLGxvQY8omfLLrFD6ZPQCtmjrhZn4xRkfvRH+NJ27umoGcb6fD3laJk79qUSEIVcb5R8P66NPZA5v2nKn2OmPe/RaasI0Iee9b9OvSAtNf6SL1rZEEFCY66jJZKyTffffdI89fuWL4t+nIyEhERETotQnmrI7IqYFDA5ibm+PWrVt67bdu3ULDhg1liorItO6VVeDK9TwAwKmLOejk5YrwoZ0xdfleJKVdReuxH8FJZYOy8grkF+mQuW0KribnVRlnTKAvbhUUI/7wxWqv8/uNv6omv2TdgpmZGVZP74vlXx1DRUXV5IboWSZrhWTw4MEYMmQIBg8eXO3xYKJRHaVSCZVKpXdwukZellZW8PZpjaNHUsW2iooKHD2airbtOsgYGZF0zBQKKC31f8e7VVCM/CId/Nq7w9nBFvGHL1V539i+bbEl8VyNtvKamSlgaWHG8v+zSKYSSUpKCgYOHAg3NzcoFArs3LlT77wgCJg3bx5cXV1hY2MDf39/XLyonxzfvn0bo0ePhkqlgoODA0JDQ1FYWKjX58yZM+jevTusra3RpEkTLFq0yOhYZU1IXF1d8c0336CioqLa4+TJk3KGR09gTMh4fPPVNny3cweuXL6Md6OjUFxcjMFDhsodGtETiw71QzffJmjqYo/WHo0QHeqHHu2a4suk8wD+qnq84O0GD1cHjOjdGnHzBuPDr4/j4u+39cbp2cEdHq4O2Pj96SrXGPGyD4L9WsGrqROaudoj2K8V3gn1w1fJP/M5JM8ghYn+M1ZRURHatWuH1atXV3t+0aJFWLlyJdatW4ejR4/C1tYWgYGBKCkpEfuMHj0a58+fR2JiIuLj45GSkoJJk/63W7KgoAABAQFwd3dHWloaFi9ejKioKHz88cdGxSrrlE2nTp2QlpaGQYMGVXteoVBAqGbOlWq/vv36487t21izaiVu3rwBr1beWPPRejhxyobqgEYO9fDpnAFQO9oiv0iHc5k3MPCtrThw8ioA4LkmjogO9YNjfRv8lpOPRXGHsfLr41XGGdevLVLP/Y5fr92ucq6sogIRw7uiZeMGUCgUyMrJx9pv0/DhV1XHIXqYfv36oV+/ftWeEwQBy5cvx9y5c8V/hz/77DO4uLhg586dGDFiBH7++Wfs2bMHx48fR+fOnQEAH374Ifr3748PPvgAbm5uiIuLQ2lpKTZs2AArKyu0bt0a6enpWLp0qV7iYohCkPFf/B9++AFFRUXo27dvteeLiopw4sQJ+Pn5GTVuSZkpoiOqexr0fV/uEIhqneL9b0l+jWNX8k0yTrt/WFfZWapU1mxnqUKhwI4dOzB48GAAf63TbNGiBU6dOoX27duL/fz8/NC+fXusWLECGzZswIwZM3Dnzh3xfFlZGaytrbF9+3YMGTIEY8eORUFBgd500MGDB/Hyyy/j9u3baNCgQY3uTdYpm+7duz80GQEAW1tbo5MRIiKi2sZUS0iq21kaE/N4O0u12r+eCuzi4qLX7uLiIp7TarVwdnbWO29hYQFHR0e9PtWNcf81aqJWP4eEiIiI/qe6naV1ZSMHExIiIiKpmWhjVE2nZ2pCrVYDAHJycuDq6iq25+TkiFM4arUaubm5eu8rKyvD7du3xfer1Wrk5OTo9al8XdmnJmr1g9GIiIjqArl22TyKh4cH1Go1kpKSxLaCggIcPXoUGo0GAKDRaJCXl4e0tP99z9KBAwdQUVGBLl26iH1SUlJw7949sU9iYiK8vLxqvH4EYEJCREQkOYXCNIexCgsLkZ6ejvT0dABAZmYm0tPTkZWVBYVCgWnTpuHdd9/Fd999h7Nnz2Ls2LFwc3MTF756e3ujb9++mDhxIo4dO4affvoJU6ZMwYgRI+Dm5gYAGDVqFKysrBAaGorz589j69atWLFiRY2eJXY/TtkQERHVUSdOnECvXr3E15VJQkhICGJjYzF79mwUFRVh0qRJyMvLw0svvYQ9e/bA2tpafE9cXBymTJmC3r17w8zMDMHBwVi5cqV43t7eHvv27UN4eDg6deqEhg0bYt68eUZt+QVk3vYrFW77Jaoet/0SVfU0tv2evFpgknE6NlOZZJzaiBUSIiIiqfFp/wZxDQkRERHJjhUSIiIiiZl6h0xdxISEiIhIYvyCZsM4ZUNERESyY4WEiIhIYiyQGMaEhIiISGrMSAzilA0RERHJjhUSIiIiiXGXjWFMSIiIiCTGXTaGMSEhIiKSGPMRw7iGhIiIiGTHCgkREZHUWCIxiAkJERGRxLio1TBO2RAREZHsWCEhIiKSGHfZGMaEhIiISGLMRwzjlA0RERHJjhUSIiIiqbFEYhATEiIiIolxl41hnLIhIiIi2bFCQkREJDHusjGMCQkREZHEmI8YxoSEiIhIasxIDOIaEiIiIpIdKyREREQS4y4bw5iQEBERSYyLWg3jlA0RERHJjhUSIiIiibFAYhgTEiIiIqkxIzGIUzZEREQkO1ZIiIiIJMZdNoaxQkJERCQxhcI0hzGioqKgUCj0jlatWonnS0pKEB4eDicnJ9jZ2SE4OBg5OTl6Y2RlZSEoKAj16tWDs7MzZs2ahbKyMlN8JFWwQkJERFRHtW7dGvv37xdfW1j875/96dOnIyEhAdu3b4e9vT2mTJmCoUOH4qeffgIAlJeXIygoCGq1GocPH0Z2djbGjh0LS0tLLFy40OSxMiEhIiKSmFwTNhYWFlCr1VXa8/Pz8emnn2LLli14+eWXAQAbN26Et7c3jhw5gq5du2Lfvn24cOEC9u/fDxcXF7Rv3x7vvPMO5syZg6ioKFhZWZk0Vk7ZEBERSU1hosNIFy9ehJubG5o3b47Ro0cjKysLAJCWloZ79+7B399f7NuqVSs0bdoUqampAIDU1FT4+vrCxcVF7BMYGIiCggKcP3/e+GAMYIWEiIhIYqZa1KrT6aDT6fTalEollEpllb5dunRBbGwsvLy8kJ2djQULFqB79+44d+4ctFotrKys4ODgoPceFxcXaLVaAIBWq9VLRirPV54zNVZIiIiInhExMTGwt7fXO2JiYqrt269fP7zyyito27YtAgMDsXv3buTl5WHbtm1POeqaYUJCREQkMVPtsomMjER+fr7eERkZWaMYHBwc8Nxzz+HSpUtQq9UoLS1FXl6eXp+cnBxxzYlara6y66bydXXrUp4UExIiIiKJmWoJiVKphEql0juqm66pTmFhIS5fvgxXV1d06tQJlpaWSEpKEs9nZGQgKysLGo0GAKDRaHD27Fnk5uaKfRITE6FSqeDj4/MkH0e1uIaEiIioDpo5cyYGDhwId3d3XL9+HfPnz4e5uTlGjhwJe3t7hIaGIiIiAo6OjlCpVJg6dSo0Gg26du0KAAgICICPjw/GjBmDRYsWQavVYu7cuQgPD69xEmQMJiREREQSM/ahZqbw+++/Y+TIkbh16xYaNWqEl156CUeOHEGjRo0AAMuWLYOZmRmCg4Oh0+kQGBiINWvWiO83NzdHfHw8Jk+eDI1GA1tbW4SEhCA6OlqSeBWCIAiSjCyjEmkeIkf0zGvQ9325QyCqdYr3vyX5NX6/U2qScRo3MO2zP2oTriEhIiIi2XHKhoiISGJyTNk8a5iQEBERSYz5iGGcsiEiIiLZsUJCREQkMU7ZGMaEhIiISGKm+i6buowJCRERkdSYjxjENSREREQkO1ZIiIiIJMYCiWFMSIiIiCTGRa2GccqGiIiIZMcKCRERkcS4y8YwJiRERERSYz5iEKdsiIiISHaskBAREUmMBRLDmJAQERFJjLtsDOOUDREREcmOFRIiIiKJcZeNYUxIiIiIJMYpG8M4ZUNERESyY0JCREREsuOUDRERkcQ4ZWMYExIiIiKJcVGrYZyyISIiItmxQkJERCQxTtkYxoSEiIhIYsxHDOOUDREREcmOFRIiIiKpsURiEBMSIiIiiXGXjWGcsiEiIiLZsUJCREQkMe6yMYwJCRERkcSYjxjGKRsiIiKpKUx0PIbVq1ejWbNmsLa2RpcuXXDs2LEnuhWpMCEhIiKqo7Zu3YqIiAjMnz8fJ0+eRLt27RAYGIjc3Fy5Q6uCCQkREZHEFCb6z1hLly7FxIkTMX78ePj4+GDdunWoV68eNmzYIMFdPhkmJERERBJTKExzGKO0tBRpaWnw9/cX28zMzODv74/U1FQT3+GT46JWIiKiZ4ROp4NOp9NrUyqVUCqVVfrevHkT5eXlcHFx0Wt3cXHBL7/8Immcj6NOJiTWdfKunj06nQ4xMTGIjIys9oeFnr7i/W/JHQKBPxt/R6b6dynq3RgsWLBAr23+/PmIiooyzQVkpBAEQZA7CKqbCgoKYG9vj/z8fKhUKrnDIao1+LNBj8uYCklpaSnq1auHr776CoMHDxbbQ0JCkJeXh2+//VbqcI3CNSRERETPCKVSCZVKpXc8rMpmZWWFTp06ISkpSWyrqKhAUlISNBrN0wq5xji5QUREVEdFREQgJCQEnTt3xgsvvIDly5ejqKgI48ePlzu0KpiQEBER1VHDhw/HjRs3MG/ePGi1WrRv3x579uypstC1NmBCQpJRKpWYP38+F+0RPYA/G/Q0TZkyBVOmTJE7DIO4qJWIiIhkx0WtREREJDsmJERERCQ7JiREREQkOyYkREREJDsmJCSZ1atXo1mzZrC2tkaXLl1w7NgxuUMiklVKSgoGDhwINzc3KBQK7Ny5U+6QiGoNJiQkia1btyIiIgLz58/HyZMn0a5dOwQGBiI3N1fu0IhkU1RUhHbt2mH16tVyh0JU63DbL0miS5cueP7557Fq1SoAfz2uuEmTJpg6dSreeotf8EakUCiwY8cOve8YIfo7Y4WETK60tBRpaWnw9/cX28zMzODv74/U1FQZIyMiotqKCQmZ3M2bN1FeXl7l0cQuLi7QarUyRUVERLUZExIiIiKSHRMSMrmGDRvC3NwcOTk5eu05OTlQq9UyRUVERLUZExIyOSsrK3Tq1AlJSUliW0VFBZKSkqDRaGSMjIiIait+2y9JIiIiAiEhIejcuTNeeOEFLF++HEVFRRg/frzcoRHJprCwEJcuXRJfZ2ZmIj09HY6OjmjatKmMkRHJj9t+STKrVq3C4sWLodVq0b59e6xcuRJdunSROywi2SQnJ6NXr15V2kNCQhAbG/v0AyKqRZiQEBERkey4hoSIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SESAbjxo3D4MGDxdc9e/bEtGnTnnocycnJUCgUyMvLk+waD97r43gacRKRvJiQEP1/48aNg0KhgEKhgJWVFTw9PREdHY2ysjLJr/3NN9/gnXfeqVHfp/2Pc7NmzbB8+fKnci0i+vvid9kQ3adv377YuHEjdDoddu/ejfDwcFhaWiIyMrJK39LSUlhZWZnkuo6OjiYZh4joWcUKCdF9lEol1Go13N3dMXnyZPj7++O7774D8L+ph/feew9ubm7w8vICAFy7dg2vvvoqHBwc4OjoiEGDBuHq1avimOXl5YiIiICDgwOcnJwwe/ZsPPiNDQ9O2eh0OsyZMwdNmjSBUqmEp6cnPv30U1y9elX8LpQGDRpAoVBg3LhxAP76RuWYmBh4eHjAxsYG7dq1w1dffaV3nd27d+O5556DjY0NevXqpRfn4ygvL0doaKh4TS8vL6xYsaLavgsWLECjRo2gUqkQFhaG0tJS8VxNYr/fb7/9hoEDB6JBgwawtbVF69atsXv37ie6FyKSFyskRI9gY2ODW7duia+TkpKgUqmQmJgIALh37x4CAwOh0Wjwww8/wMLCAu+++y769u2LM2fOwMrKCkuWLEFsbCw2bNgAb29vLFmyBDt27MDLL7/80OuOHTsWqampWLlyJdq1a4fMzEzcvHkTTZo0wddff43g4GBkZGRApVLBxsYGABATE4PPP/8c69atQ8uWLZGSkoLXXnsNjRo1gp+fH65du4ahQ4ciPDwckyZNwokTJzBjxown+nwqKirQuHFjbN++HU5OTjh8+DAmTZoEV1dXvPrqq3qfm7W1NZKTk3H16lWMHz8eTk5OeO+992oU+4PCw8NRWlqKlJQU2Nra4sKFC7Czs3uieyEimQlEJAiCIISEhAiDBg0SBEEQKioqhMTEREGpVAozZ84Uz7u4uAg6nU58z+bNmwUvLy+hoqJCbNPpdIKNjY2wd+9eQRAEwdXVVVi0aJF4/t69e0Ljxo3FawmCIPj5+QlvvvmmIAiCkJGRIQAQEhMTq43z4MGDAgDhzp07YltJSYlQr1494fDhw3p9Q0NDhZEjRwqCIAiRkZGCj4+P3vk5c+ZUGetB7u7uwrJlyx56/kHh4eFCcHCw+DokJERwdHQUioqKxLa1a9cKdnZ2Qnl5eY1if/CefX19haioqBrHRES1HyskRPeJj4+HnZ0d7t27h4qKCowaNQpRUVHieV9fX711I6dPn8alS5dQv359vXFKSkpw+fJl5OfnIzs7G126dBHPWVhYoHPnzlWmbSqlp6fD3Ny82srAw1y6dAl3795Fnz599NpLS0vRoUMHAMDPP/+sFwcAaDSaGl/jYVavXo0NGzYgKysLxcXFKC0tRfv27fX6tGvXDvXq1dO7bmFhIa5du4bCwkKDsT/o3//+NyZPnox9+/bB398fwcHBaNu27RPfCxHJhwkJ0X169eqFtWvXwsrKCm5ubrCw0P8RsbW11XtdWFiITp06IS4urspYjRo1eqwYKqdgjFFYWAgASEhIwD/+8Q+9c0ql8rHiqIkvv/wSM2fOxJIlS6DRaFC/fn0sXrwYR48erfEYjxP7hAkTEBgYiISEBOzbtw8xMTFYsmQJpk6d+vg3Q0SyYkJCdB9bW1t4enrWuH/Hjh2xdetWODs7Q6VSVdvH1dUVR48eRY8ePQAAZWVlSEtLQ8eOHavt7+vri4qKChw6dAj+/v5VzldWaMrLy8U2Hx8fKJVKZGVlPbSy4u3tLS7QrXTkyBHDN/kIP/30E1588UX861//EtsuX75cpd/p06dRXFwsJltHjhyBnZ0dmjRpAkdHR4OxV6dJkyYICwtDWFgYIiMj8cknnzAhIXqGcZcN0RMYPXo0GjZsiEGDBuGHH35AZmYmkpOT8e9//xu///47AODNN9/E+++/j507d+KXX37Bv/71r0c+Q6RZs2YICQnB66+/jp07d4pjbtu2DQDg7u4OhUKB+Ph43LhxA4WFhahfvz5mzpyJ6dOnY9OmTbh8+TJOnjyJDz/8EJs2bQIAhIWF4eLFi5g1axYyMjKwZcsWxMbG1ug+//jjD6Snp+sdd+7cQcuWLXHixAns3bsXv/76K95++20cP368yvtLS0sRGhqKCxcuYPfu3Zg/fz6mTJkCMzOzGsX+oGnTpmHv3r3IzMzEyZMncfDgQXh7e9foXoiolpJ7EQtRbXH/olZjzmdnZwtjx44VGjZsKCiVSqF58+bCxIkThfz8fEEQ/lrE+uabbwoqlUpwcHAQIiIihLFjxz50UasgCEJxcbEwffp0wdXVVbCyshI8PT2FDRs2iOejo6MFtVotKBQKISQkRBCEvxbiLl++XPDy8hIsLS2FRo0aCYGBgcKhQ4fE9+3atUvw9PQUlEql0L17d2HDhg01WtQKoMqxefNmoaSkRBg3bpxgb28vODg4CJMnTxbeeustoV27dlU+t3nz5glOTk6CnZ2dMHHiRKGkpETsYyj2Bxe1TpkyRWjRooWgVCqFRo0aCWPGjBFu3rz50HsgotpPIQgPWVlHRERE9JRwyoaIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGTHhISIiIhkx4SEiIiIZMeEhIiIiGT3/wBI0zEPvpUqmgAAAABJRU5ErkJggg==\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "## Pipeline" ], "metadata": { "id": "4jiOX9DBo8Yp" } }, { "cell_type": "code", "source": [ "# Define the prediction pipeline\n", "def predict_pipeline(input_df, tokenizer, model):\n", "\n", " model.eval() # Set model to evaluation mode\n", "\n", " # Combine inputs into a single text column (you can customize this)\n", " input_df['combined_text'] = (\n", " \"Title: \" + input_df['title'] + \" | \" +\n", " \"Subject: \" + input_df['subject'] + \" | \" +\n", " \"Date: \" + input_df['date'] + \" | \"\n", " \"Text: \" + input_df['text']\n", " )\n", "\n", " # Tokenize the combined text\n", " tokenized = tokenizer(\n", " input_df['combined_text'].tolist(),\n", " truncation=True,\n", " padding='longest',\n", " max_length=7000,\n", " return_tensors=\"pt\"\n", " )\n", "\n", " # Move tensors to GPU if available\n", " device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", " model.to(device)\n", " input_ids = tokenized['input_ids'].to(device)\n", " attention_mask = tokenized['attention_mask'].to(device)\n", "\n", " # Get model predictions\n", " with torch.no_grad():\n", " outputs = model(input_ids=input_ids, attention_mask=attention_mask)\n", " logits = outputs.logits.squeeze(-1) # Ensure logits is 1D for binary classification\n", "\n", " # Apply sigmoid to get probabilities\n", " probs = torch.sigmoid(logits)\n", " preds = (probs > 0.51).long()\n", "\n", " # Combine results into desired format\n", " results = [{\"title\": row['title'], \"predicted_class\": pred_class.item()}\n", " for row, pred_class in zip(input_df.to_dict(orient='records'), preds)]\n", "\n", " return results" ], "metadata": { "id": "4RBYibMvneLv" }, "execution_count": 51, "outputs": [] }, { "cell_type": "code", "source": [ "# Example DataFrame\n", "data = {\n", " \"title\": [\"Trump's new policy reviewed\", \"Shocking claims about health!\"],\n", " \"text\": [\"Policy details are emerging about new measures.\", \"A new study claims unbelievable results.\"],\n", " \"subject\": [\"Politics\", \"Health\"],\n", " \"date\": [\"2024-12-28\", \"2024-12-29\"]\n", "}\n", "input_df = pd.DataFrame(data)\n", "\n", "# Run the prediction pipeline\n", "output = predict_pipeline(input_df, tokenizer, model)\n", "\n", "# Display the output\n", "print(output)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6qyIetsHqUak", "outputId": "f825afb3-0dd5-4ffa-a438-66c1d95e6172" }, "execution_count": 52, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[{'title': \"Trump's new policy reviewed\", 'predicted_class': 0}, {'title': 'Shocking claims about health!', 'predicted_class': 0}]\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "1d74YbR6sOFz" }, "execution_count": null, "outputs": [] } ] }