{ "cells": [ { "cell_type": "markdown", "id": "d5eb1be5", "metadata": {}, "source": [ "# Attention Lecture Demos (Week 13)\n", "\n", "Laptop demos for the two attention lectures, in the order of the lecture plan: **Lecture A** (Mon 12/7,\n", "segments 1–6) and **Lecture B** (first half of the extra lecture, segments 7–9). Each segment matches a\n", "block on the board and a section of the note *Attention: Queries, Keys, and Values*. The code starts from\n", "the d2l book (chapter 11); the first line of every code cell says where it comes from:\n", "\n", "* `# [Book §x.y]`: the book's code as is (or the d2l package's version of it);\n", "* `# [Changed from book §x.y]`: the book's code with one change, named on that line;\n", "* `# [Added for CS6140]`: something the book does not show.\n", "\n", "| Seg. | Lecture | Board topic (note §) | Changed / added vs. the book | Time |\n", "|---|---|---|---|---|\n", "| 1 | A | Flashback: attention is a kernel smoother (§2) | — (book code) | <1 s |\n", "| 2 | A | Scores are similarities (§3) | Added: which norm cancels in the softmax, on numbers | <1 s |\n", "| 3 | A | Scaled dot-product attention, √d (§4) | Added: the note's 2-token example with `F.scaled_dot_product_attention`; the √d saturation table | <1 s |\n", "| 4 | A | Masks (§5) | Added: the same padding mask in PyTorch's two conventions (`F.scaled_dot_product_attention`: True = may attend; `nn.MultiheadAttention`: True = blocked) | <1 s |\n", "| 5 | A | Multi-head attention (§6) | Added: `nn.MultiheadAttention`'s per-head weights and its parameter count | <1 s |\n", "| 6 | A | Attention inside the translator (§10) | Changed: HW6's Spanish→English data (book: French→English), a 1-minute training run; Added: the reverse-a-sequence task, without vs with attention | 177 s |\n", "| 7 | B | Self-attention ignores word order (§7) | Added: permutation equivariance, checked on numbers | <1 s |\n", "| 8 | B | Positional encoding (§8) | Added: the note's d = 4 table | <1 s |\n", "| 9 | B | The causal mask (§9) | Added: all-zero scores under the causal mask give the running mean; the future cannot leak back | <1 s |\n", "\n", "Times: measured on an Apple M1 Max (Apple GPU for the translator, CPU elsewhere). Segment 6 is the long\n", "one: about 1.5 minutes for the translator and 1.5 minutes for the reverse task; start it before you go\n", "back to the board. The translator in\n", "segment 6 is the **book's** Bahdanau decoder (the context enters the GRU's input); HW7 Problem 3's decoder\n", "adds the attention step after the GRU instead (note §10): same attention, different wiring.\n" ] }, { "cell_type": "markdown", "id": "da1e8d51", "metadata": {}, "source": [ "## Setup (run once)" ] }, { "cell_type": "code", "execution_count": 1, "id": "3a42377e", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:07.229729Z", "iopub.status.busy": "2026-10-18T03:30:07.229604Z", "iopub.status.idle": "2026-10-18T03:30:09.356433Z", "shell.execute_reply": "2026-10-18T03:30:09.355874Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "device: mps | data: /Users/vip/Dropbox/CS6140/data\n" ] } ], "source": [ "# [Added for CS6140] device, the d2l Apple-GPU patch (as in the HW starters), the course data folder and\n", "# the HW's data module for the Spanish-English pairs\n", "import math, os, sys, time\n", "import torch\n", "from torch import nn\n", "import torch.nn.functional as F\n", "from d2l import torch as d2l\n", "import matplotlib.pyplot as plt\n", "\n", "DEVICE = (torch.device(\"cuda\") if torch.cuda.is_available() else\n", " torch.device(\"mps\") if torch.backends.mps.is_available() else torch.device(\"cpu\"))\n", "if DEVICE.type == \"mps\": # d2l only knows CUDA: point its GPU helpers at Apple's GPU\n", " d2l.num_gpus = lambda: 1\n", " d2l.gpu = lambda i=0: DEVICE\n", " d2l.try_gpu = lambda i=0: DEVICE\n", "DATA = next((d for d in [\"../data\", \"../../data\", \"../../../data\"] if os.path.isdir(d)), \"../data\")\n", "COMMON = next((p for p in [\".\", \"../hw7\", \"../../../2.5_NN/HW7\"] if os.path.exists(f\"{p}/seq2seq_common.py\")), None)\n", "assert COMMON, \"seq2seq_common.py (it comes with the HW7 starter) not found\"\n", "sys.path.insert(0, COMMON)\n", "import seq2seq_common\n", "torch.manual_seed(0)\n", "print(\"device:\", DEVICE, \"| data:\", os.path.abspath(DATA))" ] }, { "cell_type": "markdown", "id": "a704e59c", "metadata": {}, "source": [ "## Segment 1 — Flashback: attention is a kernel smoother (note §2) · Lecture A\n", "\n", "**What to watch:** each prediction is a weighted average of the training targets, with weights from a\n", "kernel on the distance between the query and the training inputs: exactly attention, with the training\n", "inputs as keys and their targets as values. Narrow kernels follow the noise; wide ones blur." ] }, { "cell_type": "code", "execution_count": 2, "id": "da8e5391", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.358250Z", "iopub.status.busy": "2026-10-18T03:30:09.358017Z", "iopub.status.idle": "2026-10-18T03:30:09.496858Z", "shell.execute_reply": "2026-10-18T03:30:09.496402Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.2] four kernels\n", "def gaussian(x):\n", " return torch.exp(-x**2 / 2)\n", "\n", "def boxcar(x):\n", " return torch.abs(x) < 1.0\n", "\n", "def constant(x):\n", " return 1.0 + 0 * x\n", "\n", "def epanechikov(x):\n", " return torch.max(1 - torch.abs(x), torch.zeros_like(x))\n", "\n", "fig, axes = d2l.plt.subplots(1, 4, sharey=True, figsize=(12, 3))\n", "kernels = (gaussian, boxcar, constant, epanechikov)\n", "names = ('Gaussian', 'Boxcar', 'Constant', 'Epanechikov')\n", "x = torch.arange(-2.5, 2.5, 0.1)\n", "for kernel, name, ax in zip(kernels, names, axes):\n", " ax.plot(x.detach().numpy(), kernel(x).detach().numpy())\n", " ax.set_xlabel(name)\n", "d2l.plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "id": "21e120f4", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.498818Z", "iopub.status.busy": "2026-10-18T03:30:09.498644Z", "iopub.status.idle": "2026-10-18T03:30:09.635423Z", "shell.execute_reply": "2026-10-18T03:30:09.634926Z" } }, "outputs": [ { "data": { "image/png": "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IwzjYxvaCY2XA424uDhfH0JQwivIEuMPf/gDlEol1q9fj/POOw/jx48Xs9ZnnHEGvv76azFrTTz++OPCUIeGhorZbHpfa2tr1+fcf//9mDx5co/PphANCtXoZPny5Zg5c6b4DDL+NAgoLS0Vr23ZsgXHHHMMwsPDERERgWnTpolj6ivEes+ePeL4aKU7LCwMM2bMwA8//NDju+l7yeG/8sorxWemp6cLh59hghUy5ImJiWIjrd51110oKytDXV2deJ0mxY499lgxGUUrzDSD3Klx0i45q7/++mvX5/3rX/9CfHw8ampqxOPm5mZce+21QpcUiZKbm4slS5aI1xoaGnDBBReICTedTieuJf/73/8OWVm68cYbxepSbGwsTjrpJC+eHYaRBmRbaWVq7dq1OPvsszF27FhMnDgRt99+O1avXi32oUktsoFk/8heku3u1GF3e/z2228LW6jX63H++eejpaWla5+PP/5Y6LBT78cffzza2trEe99880188cUXXatkpH/iz3/+szge0jCNE+655x7hvA/2e2kVbsWKFXjqqae6PpsmBBjG32xo5xYVFSVeo98yRV2ecsopQlOkD9JYd0aqH8LhcOCRRx5BVlaW+J78/PxDvqegoEBMftO1gca/8+fPF+Pm7vz73/9GUlKS0D5NvHU/jt4h1r257777xHs7I9A++eQTcY2i80Pv/c9//tO171/+8hfMmjXrkM+g437wwQcHdd6DBXaQJQQNWpctWybEQU5rX5DoCblcjv/+979CeGQ8f/rpJ9x5552D/i6bzSZCto466ighqlWrVokBeOfnX3TRRUhNTRWhHRs2bBCDd5VK1edn0aD91FNPFeFmmzZtErN65Mj3XgkjkU6fPl3sQ4OO66+/HsXFxUM4QwwTmJCG3nnnHZFWQQaSBsbkkJKxJw1+9NFHYtKJHNbuYZGXXHIJDAaD0BQZ91deeUU4xGS0aWDw+++/i88tLCzEo48+CoVCId7f0dEhJr1o0m379u1C+/RZ5AR0h64t5IjT57zwwgs+OTcM4ysaGxuxdOnSfm0yTRST1sg5pn3J2fz+++9FJBilInWHBsSUN0iTVLTRvqRJoqqqSkxY0QTyjh07hAN81llnwel04o477hAON9lV2o+2uXPnivfRYJsmrEnf5OS+/PLLeOKJJwb9vfSeOXPm4Jprrun6bJpw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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.2] training data y = 2 sin(x) + x + noise; Nadaraya-Watson = kernel weights, normalized over keys\n", "def f(x):\n", " return 2 * torch.sin(x) + x\n", "\n", "n = 40\n", "x_train, _ = torch.sort(torch.rand(n) * 5)\n", "y_train = f(x_train) + torch.randn(n)\n", "x_val = torch.arange(0, 5, 0.1)\n", "y_val = f(x_val)\n", "\n", "def nadaraya_watson(x_train, y_train, x_val, kernel):\n", " dists = x_train.reshape((-1, 1)) - x_val.reshape((1, -1))\n", " # Each column/row corresponds to each query/key\n", " k = kernel(dists).type(torch.float32)\n", " # Normalization over keys for each query\n", " attention_w = k / k.sum(0)\n", " y_hat = y_train@attention_w\n", " return y_hat, attention_w\n", "\n", "def plot(x_train, y_train, x_val, y_val, kernels, names, attention=False):\n", " fig, axes = d2l.plt.subplots(1, 4, sharey=True, figsize=(12, 3))\n", " for kernel, name, ax in zip(kernels, names, axes):\n", " y_hat, attention_w = nadaraya_watson(x_train, y_train, x_val, kernel)\n", " if attention:\n", " pcm = ax.imshow(attention_w.detach().numpy(), cmap='Reds')\n", " else:\n", " ax.plot(x_val, y_hat)\n", " ax.plot(x_val, y_val, 'm--')\n", " ax.plot(x_train, y_train, 'o', alpha=0.5);\n", " ax.set_xlabel(name)\n", " if not attention:\n", " ax.legend(['y_hat', 'y'])\n", " if attention:\n", " fig.colorbar(pcm, ax=axes, shrink=0.7)\n", "\n", "plot(x_train, y_train, x_val, y_val, kernels, names)" ] }, { "cell_type": "code", "execution_count": 4, "id": "0986c8a3", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.637003Z", "iopub.status.busy": "2026-10-18T03:30:09.636872Z", "iopub.status.idle": "2026-10-18T03:30:09.754016Z", "shell.execute_reply": "2026-10-18T03:30:09.753589Z" } }, "outputs": [ { "data": { "image/png": "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AB6RfsaMGXTsscdScXEx9erViz73uc/RQw89RLW1tdTRJkyYQP/3f//X0ZcBBf6Fyl+Qyal79+70xS9+kd54442OvjSAdvlOuOaaa+iYY46hoqIiGjBgAH31q1+l5cuXd5oCbGudc845dO2117bLuSE3Pr+TE3+G55t//OMfdOWVV3b0ZQAECgdvgrbwr3/9S1fiuEXs3//93+nTn/60/iJ/88036eGHH6Z+/frR1772tQ59sWOxmJ4AOhIXAh577LFUwXf27Nl00UUX0ebNmzvlH6axsZGi0WhHXwbkmPfffz/1nTB//nz9ndDU1EQvvvgiXX311fT222939CUCHNbndxKXdfLNUUcd1dGXAJARWuza2Q9+8AMKh8P02muv0WWXXUYnnnii/pV27Nix9Ic//EH/Ssvuuece/QVfWlqqf73l4/bv3586z2233UbDhw+3zs3hABwWkLRixQo6/fTT9Tm40MCFhw8++EBve/311+ncc8+l8vJyqqiooBEjRuhr8gvFfO+99/T1cctiWVkZjRw5kv77v//bemx+XK6ofuc739HnHDhwoK6oArQWFwJ69+6tJ36v//CHP6QtW7bQrl279Hb+MeS8887TP0Jwix7/apq8R/i9z5Ws//mf/0md7+6776aePXvSjh079PLevXvp+9//vn5fc8v5ySefTM8//7zetmfPHpo0aZL+oaWkpETfi08//XRaS8T06dN1a0SPHj1ozJgx+GNDi/FnO7dmvPrqq3TJJZfQcccdRyeddBLNnDmTVq9erffhHzP4M5g/f/nzmr87ku9j+X3wn//5n/qzuLKykiZOnEjV1dWpfX7961/r93Hyfhk9ejTV1NToY5944gn63e9+l2pZ4fuH3Xzzzfp6+B7g76lbbrlFVzqzfVxuuVm5ciXdd999qXNzRRYK6/M7OXXt2lVv4/cBRyh96Utf0u9Hfm/x+1M63PceSyQSNHfuXBo8eLB+nGHDhqU9zvr16/UPhnxfcdnlrLPO0mUeacGCBdSnTx993/CPLfI6vKGYXnPmzNHHJqNNfvOb3+j7m18fPvanP/1pat8f/ehHdMYZZ6Sdg6/7jjvuyOp1B/BCxa4dcWHxz3/+s/5g4MqWH/7A038Ix6H7779ff+jwl+5f/vIXuummm7J+rObmZh1ac/bZZ+sPlFWrVumCb/L83/zmN6l///46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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.2] the attention weights: rows = training inputs (keys), columns = queries\n", "plot(x_train, y_train, x_val, y_val, kernels, names, attention=True)" ] }, { "cell_type": "code", "execution_count": 5, "id": "0d9c13aa", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.755393Z", "iopub.status.busy": "2026-10-18T03:30:09.755272Z", "iopub.status.idle": "2026-10-18T03:30:09.880737Z", "shell.execute_reply": "2026-10-18T03:30:09.880326Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8gAAAEmCAYAAAC+g7nZAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuFZJREFUeJzsnQd429XVxl9tW/KW93bileXsnTAaNgl7U8puKS2zlELbr6W0FFo6KWUUCpQCZc+wZyAJ2XGGkzjx3tuWZMvW/p5z/7ZjO7bjIcka5/c8QpIt20LRq3vPPee8R+ZyuVxgGIZhGIZhGIZhmCBHPtVPgGEYhmEYhmEYhmF8AQ6QGYZhGIZhGIZhGIYDZIZhGIZhGIZhGIaR4AwywzAMwzAMwzAMw3CAzDAMwzAMwzAMwzASnEFmGIZhGIZhGIZhGA6QGYZhGIZhGIZhGEaCM8gMwzAMwzAMwzAMA0Dp7VfB6XSirq4O4eHhkMlk/I/AMMPgcrlgMpmQnJwMudz3zrFYxwzj/zomWMsM4/9aZh0zjHu17PUAmYLjtLQ0b/9ZhvFLqqurkZqaCl+Ddcww/q9jgrXMMP6vZdYxw7hXy14PkClz3PfEIiIivP3nGcYvMBqN4iCpTy++BuuYYfxfxwRrmWH8X8usY4Zxr5a9HiD3lVVTcMwBMsOMTS++BuuYYcavF1+Etcww49eLr8E6Zhj3atn3GikYhmEYhmEYhmEYZgrgAJlhGIZhGIZhGIZhpqLEmpkCnE7AUA1YOwF1GBCZBvigCyPDMMeBtcww/g/rmGECA9ZywMIBcqDTXAwcfA9oOQLYewBlCBCbA8xYB8TlTfWzYxhmrLCWGcb/YR0zTGDAWg5oOEAOdPFueQIwtwKRKYBKB9i6gPq9gKEWWHYTB8kM4w+wlhnG/2EdM0xgwFoOeLjONpDLPihzTMFxXD6giQDkCuma7tPXD62XHscwjO/CWmYY/4d1zDCBAWs5KOAAearE1V4JNBZJ154IUqnnmMqqKXM81Mqc7kekAM2HpccxDDMxWMsMExh4Wsu8JjOM5+E1mXETXGIdqD0LZMhFv5/KqodDrQVMddLjGIYZP6xlhgkMvKFlXpMZxrPwmsy4EQ6QA7VngdyqaZGn309l1UOxmqXv0+MYhhkfrGWGCQy8pWVekxnGc/CazLgZLrEO1J4FGuVEJ+C0wLtcg79H9421QFyu9DiGYVjLDBNseHNd5jWZYTwD768ZD8ABsrfwdv8RzTmm8jCtHmg+BPQYAadduqb7Oj2Qv5bnITMMa5lhghNvrsu8JjOMZ+D9NeMBOED2FmPpP6Lvu7MnmMrCqDwsqQDobgNaS6Tr5LnAUh7xxDATgrXMMIGBt7XMazLDuB9ekxkPwD3I3mKq+o9oQdZTqXW19CFCv59Kveg0m2GY8cNaZpjAYCq0zGsyw7gXXpMZD8ABsrfo6z8i44+48MHlXH09wZTZ9URPMAXD0Rnu/70ME4ywlhkmMJgqLfOazDDug9dkxgNwGtFbcP8RwwQGrGWGCQxYywzj/7COGQ/AAbI34f4jhgkMWMsMExiwlhnG/2EdM1NZYn3ffffhN7/5zaCv5eXl4dChQ+5+XoEL9x8xTGDAWmaYwIC1zDD+D+uYmcoe5FmzZuGzzz47+guU3MY8brj/iGECA9YywwQGrGWG8X9Yx4ybGHd0SwFxYmKiu/4+wzAMwzAMwzAMw/hngHzkyBEkJycjJCQEy5cvx4MPPoj09PQRH2+xWMSlD6PROPFnyzDMlMA6ZpjAgLXMMP4P65hhfMika+nSpXjuuefw0Ucf4fHHH0d5eTlWr14Nk8k04s9QAB0ZGdl/SUvzwBgjhmE8CuuYYQID1jLD+D+sY4bxLDKXi4b9TYyOjg5kZGTgL3/5C66//voxn3JRkGwwGBARETHRP80wAQ3phA6UfEUnrGOG8X8dE6xlhvF/LbOOGcazWp6Uw1ZUVBRyc3NRUlIy4mM0Go24MAzjv7COGSYwYC0zjP/DOmYYH56D3NnZidLSUiQlJbnvGTGMJ3A6gfZKoLFIuqb7DMP4F6xjhgkMWMsMExg4A3N/Pa4M8l133YV169aJsuq6ujr8+te/hkKhwOWXX+65Z8gwk6W5GDj4HtByBLD3AMoQIDYHmLFOmpvHMIzvwzpmmMCAtcwwgUFz4O6vxxUg19TUiGC4tbUVcXFxWLVqFbZs2SJuM4zPinfLE4C5FYhMAVQ6wNYF1O8FDLXAspv8XsQME/CwjhkmMGAtM0xg0BzY++txBcgvv/yy554Jw7gbKvOgky0Sb1w+IJNJX9dEAHHhQPMh4NB6QJ8jDZdnGMb3YB0zTGDAWmaYwMAZ+Ptr/3zWDDMWDNVS2QedbPWJtw+6H5ECNB+WHscwjG/COmaYwIC1zDCBgSHw99ccIAcJNM3rTx8X4/73DojbQYG1U+qJoLKP4VBrpe/T4xiG8U1YxwwTGLCWGSYwsAb+/poD5CDhya/L8OiXJXhmUzkqWs0ICtRhkmEA9UQMh9UsfZ8exzCMb8I6ZpjAgLXMMIGBOvD31xwgBwGbSlrwx48O9d8vb/HfE51xEZkmuemRWcDQrDndN9YCcbnS4xiG8U1YxwwTGLCWGSYwiAz8/TUHyAFObUc3bvnfbjhdgEIu9QmUtwRJBpmMAchqXquXDAN6jIDTLl3TfZ0eyF/rtwYCDBMUsI4ZJjBgLTNMYCAP/P21/z5z5rj02Bz44Qs70dZlxeyUCFy9PFN8vaJlhJKIQIQs5slqPqkA6G4DWkuk6+S5wFL/tqBnmKCBdcwwgQFrmWECg7jA3l+Pa8wT41/89bPD2FtjQJRWhcevXIhvS1vF1ytagyhAJkikZDVPbnpkGEA9EVT24ccnWwwTdLCOGSYwYC0zTGAQF7j7aw6QA5gNxc3i+tfrZiItRot6Q4+4X9YcZAEyQWKNzpjqZ8EwzGRgHTNMYMBaZpjAQB6Y+2v/D/GZYaFRTlVtUq9xQWqUuM6M1YrrOkO3KL9mGIZhGIZhGIZhjsIBcoDS3GmB2eoA+XKlRoeKr8WFaRCmUQqDuere4JlhGIZhGIZhGIaR4BLrQMHpHNQDUNkhDe9OjgqFRqkQt2Uymcgi7681orylCzkJ4QhmjD02hGuU4nVhGF/VcqD08zBM0MFaZhj/h3UclHCAHAg0FwMH3wNajgD2HjGcO8QSj+myNCTqCwY9NFOvEwFy0Bl1DeGj/fX44Yu78Ou1M3HNyqypfjoMM6KWxaxBGqfg546QDBNUsJYZxv9hHQctHCAHgni3PAGYW4HIFEClA2xdUNfsx7WKIjTrkgY9PCtWyixTBjmYeeqbclFqXljdMdVPhWFG1TLq9wKGWmmcAgfJDOP7sJYZxv9hHQc1XLfn72UflG2iDXVcPqCJAOQKcV2KVETDhBW2LdLjeuEAWZoDvbOyXbwe1KfNML6sZXGfvn5o/SAtMwzjg7CWGcb/YR0HPRwg+zPUp0ilmJRtGtJHa+i2ox4xSLVXS4/rJbM3g1zRErwmXW/uqum/3c1u3oyPa1ncj0gBmg8P0jLDMD4Ia5lh/B/WcdDDAbI/QyY+1KdIpZgDcMGF9m4ruqFBuNIhPa6XLL302AZjD8xWO4INp9OFN3fX9t/nDDLjy1ruR62Vvj9AywzD+CCsZYbxf1jHQQ8HyP4MOdySiQ/1KQ6gx+aE1e5EKCzQanXS43qJ1qkRGaoK2izy9oo21LR399/nAJnxZS33YzVL3x+gZYZhfBDWMsP4P6zjoIcDZH+Gxr+Qwy0Z+JDjVC+GbpvII2epOqBMyJMeN4D+MmtysqY+i/ZKoLFIug7wHsc3esurs+OlQKM7CLPojP9oWUD3jbVAXO4xWu4nyHTMMD4La5lh/J/J6pjgddmvYRdrf4Zmo9L4FxJw8yGpT1GtRaehFTmohSM0Dshfe8wM1WmxOuyp7kBH5X6g/cWxj5Tx81lw3VYHPtjXIG5/d2k67nvvAGeQGZ/Wssgc00Ks0w+r5QmPofBzLTOMz8JaZpjg1vFE1mVek30ODpD9HRIajX/pE6KpDjaTFftdWVAkn43ThhEizUKeLqtFVuk3QKJsbCNlAmAW3CcHGtBpsSMtJhQn5Mb1B80M46taFjpLnistxMPpbCJjKAJAywzj07CWGSY4dTyRdZnXZJ+EA+RAgISmz+nPCL3+SRWeqbbjrpQZwz48Ux+C0+Xbe0fKrDrqmitGyoRLp2U0UoZ+J52OBcgsuDd2SeZc589PhU4jvfXNNgdcLhdkQ52DGcYHtDxqdnfoGIrj6ZgIEC0zjM/DWmaY4NLxRNZlXpN9Fg6QAwUSWnSGuFnYaSAfa2TotcM+NDekA3Z5HcosUVh+vJEy9EEw3k24D9Jk6sHGI83i9oULUhCqVojbDqcLVocTGqV0n2F8SctuG0NBv28iATXDMKxlhglmxromj3ddDpD9daDCr3gAUknmW72l1MORpnNCAxta7SpY7I7RR8oEyCy4g/UmOF1ATnwYMvQ6aFVHA2Ius2aCYgxFgGiZYQIO1jLDBJ+WeU32aThADjBMPTa0dFrF7fQRMshh4VGAQgMtetBhJsfrUUbKBMgsuAaDNNopNTpUXCsVcqgV0tufRz0xQTGGIkC0zDABB2uZYYJPy7wm+zQcIAcYla3SbGO9To2IEGne8TFEpsGgy0IS2tBhloLpEe3rA2QWXL2hR1wnRkoBMtFXZs0BMuNvUN/8uMdQBIiWGSbgYC0zTPBpmddkn4YD5ACjqs08avZYIJejNmkN2hEOeUsx0GMEnHbpmnoeBtrXDyN2h8uFTSUtONJoHNssOB+goTdATooM6f+atjdA5hJrxl8wW+34yyfFmPubT3DrK3tgyjoT0Ool3Y6mY3fNdWQYxnMjZVjLDBM8WuY1OXAD5Iceeki4/95+++3ue0bMpKg4Tv9xH7qUWXjWcQaK5dOA7jagtUS6Jvv6pQOcbIcR+6HadhysrMGRoh2ot+tGnwXnI9T1Z5BDhskg26fseTHMWHA6XXhrdw2+86cNeOSLEhh77Hh3Tx1Of6EBhSmXAUkFo+t4IptwhmG8P1KGtcwwwaFlXpMD08V6+/btePLJJ1FQUODeZ8RMisoWKYM8koN1H1mxOpS6UvC0awbWnpw+un39gFlwruYjaK6sRrRMhn3OLDxdshh/PzMNvp5z6utBHi6DTKOeGMZX6bE5cM2z27ClrK2/j/6GVVl4bnMFKlrNOP+1Htx84lm440QtlPau0cdQTHSuI8Mwnmc8I2VYywzj/1pmHQdWgNzZ2Ykrr7wSTz31FH73u9+5/1kFOzSOZawz1yaYQc5LDBfXBxo60ROWipABrs6jiX3L7kI8uGMrXOowhMRlYG+dCT/470688cMV/RlZX+5BThrQg6xVSW9/LrFmfFHLfTz2VakIjulA50cnZ+P6VVlCrxcvSsN97xbhtZ01+OdX5Wg0peLhiwqOP9N7vHMdGSbYcYOOPTJShrXMMP6vZdZx4ATIP/rRj3D22WfjlFNOOW6AbLFYxKUPo9E4kT8ZPNDQ8L7sDjnKUnaH+gapNHIM2Z2+HuTjZZCnxeqQEKFBo9GCHRXtWJUTe/znJpfj0d1WFLvSccPiLFy3KgvnPLoRB+qN+Nkbe/H3y+Ydf3M+BXRa7DD12EcpseYM8vFgHXtfy0Rpcyee+KpU3P7TxXNx1pyk/u/pNEo8fPFcod07XinE6ztrkBGjxS1rcty7CWcCCtay93XsUVjLQQnrOMC0zDr2OcZ9bPLyyy9j165dePDBB8f0eHpcZGRk/yUtzdeLcadYvFueAOr3AtoYKctD13Sfvk7fP04pZl+mlGb9jgYFsiunS0HxptKWMT29ojoDNpW0QiGX4dpVWUiOCsU/r1gApVwm+iEpk+XLBl3hIUqEaZTDmHRxD/LxYB17V8t9TtW/fGs/rA4nTs6Lw5mzE4d93LnzUvCbc2eL23/+9DDe3l073mfLBBGsZe/qmGE8Aet4nLCWGU8GyNXV1bjtttvw4osvIiTkaCZuNO69914YDIb+C/0OZoSyDzrZMrcCcfmAJgKQK6Rruk9fP7ReetxxsscUCEZrRxjxNICV2VKAvLlkbAHyv78pF9eUxUqJkkqVl07T4/snTBO3ydnaF6kfpv+Y4Azy2GEde1fLxNuFtfi2rBUapRz3nzt71OqMq5Zl9Ovw7tf3YktZ63ieMRNEsJa9q2OG8QSs43HAWmY8XWK9c+dONDU1YcGCBf1fczgc+Prrr/Hoo4+Kkg+FYnAfqkajERfmOFBPBJV9RKZQenfw9+h+RArQfFh63AilkRUtR/uPx1Lq3Bcg76s1wNBtQ2SoatQsLGWJCTIIGkhOgjQ3taXzaCm9r89AHmTSxSXWx4V17F0t03zy360/KG7fuiYHaTGjt0wQ95yRj+o2Mz7c34DvP78DT1+9GEuyYsbzzJkggLXsPR0zjKdgHY8D1jLj6QzymjVrsG/fPhQWFvZfFi1aJAy76PbQ4JgZB2QYQD0RqhFKo9Va6fv0uOMYdB2v/7gP6sedFqeD04XjZpzIMdfudGFJZgzmpkUN+l5smHQA0tpphU/PQI4YnEHWqntNutjFmvExLf/ho2K0dlmRHR+GG1dLmeHjIZfL8NdL52FhRrQYA3Xl01tEXzLDMFOjY4ZhfADWMuPpADk8PByzZ88edNHpdNDr9eI2MwnITY8MA2xSkHsMVrP0fXrcCGyvaBfXM5Mjxvxn+/uQRymPJpfnl7ZWits3rB6cPSb0Oo1fZJCTooaUWPc6d/McZMaXtLy7qh0vb68Stx84bzbUyrF/TJO79QvXLxX9yjaHC3e9tgcPfXhIzFFmGMZ7OmYYxkdgLTMTgOd6+ApkNU9ueoZacucZ/D26b6wF4nKlxw2Dze5A4YFW6A0yrEiIFgY/Y2Fltv64AfL7++pFRiotJhSnzEg45vux4Wpx3dZlhcOTG3HqI2mvBBqLpOsx9n4NNwOZ4BJrxte0TPr59Zv7EN4JXJGZhMWp0eP+89RbT+Z5Pz45W9x/YkMprnpmKwqrO+AzTFDLDOMvazKtwY4uB3qqemBrs415TfY7WMtMoGvZ6YKt1Sa07OgO0KknrGP3jHkayFdffTXZX8H0WbyT1TwJuPmQ1N9EJVx0Sk3i1emB/LXHzGsr/1U56p+qh7XFioftUia344l9+EYrhzpRjfz/5CNq1eCS6IEsnxYr2qlKm7tEKfLAMUh99GWPL1ucLso4hxKjlQJkio2pd1LfW3Lt1hl1k7DnP14PMs9BZqZay06bEzvm7UBndQ/uNFGwSGWdRnz9w6+h1Cuhm63D/K/mj+MpyHDX6XmiRPvuN/YK9/lNJZtwYm4cbl2TjYUZMVM3a9KXR20wzCTX5OY3m1FyWwlsLTY4e44e/MhUMqgT1Ei/Jx0pP0rxn9eZtcwEqZaLLitCx+cd4oALA85wFREKsb+e99U8aJL8xGOJdez9AJlxI7Q5XHbT0c2jqU7aPCbPhSvvbLTvikPN3/Zi2sPTEDZbKusKyQyBteFo769DCSjsgNPsRE9ZD+Sao4JveL4BjS81IvnGZOjP0UOukiNSq8KclEjsrTFgc2kLLliQOugpHWowYldVhxjldPGiwd/rQ6mQC9fsdrMNLZ2TCJBH2jgnzAYOfyy5hpJhCvWEUdkbjdqgDzx6zUbZWPeXWB/jYi29/dmki/Gmlu0pZ6D+eS2M24sw6+VZ4uGkRVeYHHIRHAMuGSAj6ToAe6sd9vbBo8j2nbcPIekhSP5BMnSzRh7pdt78FOEZ8OgXJcIVe8PhZnG5ZFEqHjh/DlQKDxQRjRYAEzQeZ4JaZhhf0TFtqDvrUlD904OIPiUaid+VxrBp87Ww1BxtN5IpZXDZXXDZXOLrlI3qo3NfJ4qvL0bitYlIuDIByggf25Kxlpkg0LIz+yw0fxKFuid3o+DjAihCpeSJJlkjDroGHnKRjh1GB7qN3VBGHdVr2S/L0FPag6TvJyHqpKgxGeV6DdbxhPCxT2NGiJhmLfZmX5zQofF9FWpurkPX/gbxAsWcEdMfIMddGIewBWH4ySdF+LKxFb+4YCaumpcOa6NVBM66mUc3z20ftaH943ZxodOvxOsTkXxTMlZMjxUBMmWZhgbIL22VeiFPnZmA+PCRR3uRURcFyK2iDzl84jPqhm6c6/YAhz4AQiOBlMVH3UTFqI1w6TSQRm3Qazbk9K+vv5gcuomh2XHOIDPe1LKlWYXqZ4D6pxvhMDWLBhf7k3YoI6WP4fVXyvFZgRmp08Lwv7tWQaGQiZNr0rHLenRTbTfY0fpeqzjRrv1HLSJXRQodx10SJwLtoWTF6vDnS+aKzPFjX5bi9V01eHVHjWiJePSKBaJv2W2MpGMKgDtqAFXI0bE549Qyw/iCjl1qHdq26FBzRR3aP9shHuKyuI4GyDO0WLBtAVSxKnFRhCmEfq1N0pqsSTl6gNzxRQdM203iUvrTUkRcGIukm5OQsHT8rRVuh7XMBLiW7ZZQ1L0sR+0V9bDUNIqHGDcbEb1G0l/a3Wni8EpoWa8SAbLD5BA6pj12XyBNtL7Tiq79XWh6uQmheaFI/n4ykq5P6l/fpwzW8YThAHm8pQgeZmdlO37x1j7ccWoulrZFovjGYnQXSz20cp0cSTckQX+u/ug/YKQS6tlabHi9HTYVsCI7FgqdAqHTQsVlIJn3ZSIkKwT1/64XAq96oArVf6rG8qti8F+t1IdMfVJ9J19UevzWrlpx+4ql6aM+b32YGkeagJYu6+Rn1A3cOEckA3W7AMUwb9UxjNroc7AO0ygREaIafg6ybXB2jgkQplDH/cjlcOrSUPXPKlT+trI/0NXO1CLtzjTIQ6Tns628Df+tq4csFnjsyjlQ9ga66li1uAz6lVo55qyfI1orWt5tgWGjQVwqflOBrAeyEHdR3LCn1xl6Hf5wUYE47PrRS7vw2cEmfO+ZbXj66kXHaGNCjKZjCoBrdwFdDUDGKh6bw/iXlulvRWegu6wbh797GO2fVfR+HUJvqXccPVgm7UUsHmyUKdPIEJIWAlWKBntqOrB7Y53wBChp7UDqGitOKlQhpRXoeL5JXF6e40TxZaFIKojEiul6nJAb55lqj5FgLTMBrGVXVDqaXmlCya0lsDVLCRRVggopP05B2LyjpnuaRI24DISqPOiizR08LSbvmTw0PNOAxhcaxZ699CelqHygEhm/yEDyzclQhEzBlB/W8aTgAHkoU9gfR06zv3x7Pw7Vm7D1miJodij6hUubaSrdUEUdu5HdVdkBi92JuHANcuJHdtQkQU97YBoyf52JlndaUPtIrdhY4+lW3JkSit9+txtlLV2YHif9jvf21sFksSM9Rtvvdj0SfWXVLSaLe2fUOayAQgP0GAGLAQgZ0k9NfSRUKjPCqI2j/cfHZr+1/S7WAWq6EMz4SJ+r+bAZRRcVoWuf5IQbeWIk0n+WLqpA+oLYqlYzbn5xl7h92eI0zE8fPXtEWWL9mXpxsdRZxIEXZZK7j3TjwCUHkPd0nji5HolTZibg+euW4Ib/7BCB+WVPbsGLNyxFtG5wIO72WZPaGClL7BzhQOo4WmaCFB/Rct2/6lByewmc3U5xsEVVGym3pSA0c/BB9HBUtHSJkWtv7qpBXe+a1MfBRcCnC+3IrZHjlN0qLDqowNx9cuQW9+COm9vw743l0OvUWDc3GRcsSBEtUR4v32QtMwGqZbvJjoNXHETremm0KWV7aU2Ovzx+UkEsHYrRZdofp6Hpf02o+WsNzIfMIlCm67x/TUHrEOt4UnCAPNZSBC/0x63fV4+D9UZABliFq6tClEFPf3g6VNEjZ3iod5igk+axLJxytRzxF8eLk++2D9tQdk8ZSldQ5rcbL2+rwk9PzxejZfrKqy9fMrw510Di+mYhd1ncO6NOqQaUGun7FCyPc9TGSP3Hg+Ygc4AcWEyxjgeiilOJE2oy2sr5ew7ir4gfpFEajfa9Z7aK6xlJEbj3rBnj+v3UI5X5f5lIvT0V1X+uFuVdtNAfj6XT9Hj5B8tw9TPbcaDeiEe/LMH/rZ0Jj86aDOnNqlmMgFY/zM/z2BzGd7VMlRsUHFN/Ye6/cqHNGZxBGo7NJS34++dHsLW8rf9r4SFKLM2Kwby0KOEPkJ8YAZ1GAbVCLvw86rd2oOSeUjjS5LjoxFh8tL9BeHs8t7lCXGidv/fMGZiTGum5/1nWMhOgWqaWB0enQ5RLU3Y3/d50sSd2F8pwpSivTrwuEY3PN6Li/opBFSZehXU8KThAHmspgof742wOJ/72YbG4fcH8FLxjr8eOPDtu/GEY8kcJjonNpdJJ2PGyvEOhjbr+LD1iTo/Bvs3lwPsdeOqbctT/uwErnGE4MK0DyhAZLlp4fHHTCTfRYrJObkYdvd4D0UQCmnBpUy1XDW/PT4YpI9jz9414Sow4NkDuL7HmADlwmGIdi6dgc/b3AtPB1qy3ZiF0eijUcYMztF0WO65/bjsqWs1IiQrFf65dPOFSZ1qUs+7LEsGyTCH9P7scLhRdUoTEqxMRe86xnw2zkiPx8EUFuPa57SK79dPT8ybXjzyajgmZEgiNBsxtQFTm4CzzGLTMBBk+pmUy0SI9x5x1tPpjJGiW+Z8+KRa+HgSdL6/OiRNGlzQqcTSdJS2NQtKXC4V+1ypkuG/dLHzzTjXqf1+Nv60wifV+3aMbce68ZNx1Wh7SYo4fqI8b1jITQFoWxnguiLWRtEtVVk6Lc5BHj7uRK+VIui5JrL99azJRek8p1PFqpN6WOujrHoF1PCnYCWWspQgDe109IN6PrtmD8590IC5EjfvPm42bzs7BoXQnfvNeEZqMg0uyBtJpsWNP73zT5dOHycqMARLp1SuzcO+Z+chQanDW+y5M+6ocj7zbhJs0DsTpjr9p108mgzzajDpCrQPCEwBTvVRqTSWadE0fqiPY848tg8xjngKOKdQxQXMSdy7eKdzi+4hcFnlMcNxjc4iy6j01BuEA//z1SxA/zCHOeBm44NY/U4+WN5tQ8r3PUXb9e7DXlh0zb5h6G1OjQ4WR3Xt76jw7a5LKp7NWApGpknbHqWUmyJhiLTe+2IgdBTuEuZb0J2XQnz16lVajsQc/fGEnzn9sswiOVQoZrlmRiU33fAf/uW4J1hYkj/kQqk/LCrkMEX9owrSSWjy2vgU/tzgggxPvFNZhzZ834MkNpWJ+ulthLTMBomWaRV50cRFKflLS/zU6sPZkcDzSmmwqNKH6j5WovX8zDp71Biz7Dx+zJrsV1vGk4AzyWEsRPNQf5+hxYP+lBxD+rgFzoMSd2jhhKPWDE6aJ0qp9tQb8/K19eOp7i4ZdmLeXt8HudIk+4cmcJNMi/IMTp+PaPAuOhD2P8F0HMc1lxby9GnT8aTsir7kCsvj8EX8+Nqw3g9xpdf+MuphMIOd0oHH/sKM2RivLaRhhBvLAANnqcMLucIryNsbPmSIdE8YdRuxbuw+2RhvKfl4mHOYHjlnrg8zwyGugvKULoSoFnrlmcX/fvztJOKMDmns/g+1gEeRGKzp+oUX42kXQnHhBv2ZI92TA98ePivHC1ipcvCjNs7MmF14rPXaEsTk84omZai2TUWXFfRWovL9S3Kf+/qzfZh33Z17ZXo0HPjgIU49dZIwvXJCKW9fkTDrDK2s5jNk//QydH++Eo6MLqRVqnJGWi3/mLMIrtWF48MND+Pxgk3Cqd1s2mbXMBICWLQ0W7Dt7Hzp3dUKmlon542NpjfAUYcm1mP+nDej5dg9ksKDjtyEIO2UBdOdd4pm1j3U8KThAHmspggf645xWJ4ouLEL7B22wKVx480IX/nqHFIRSsPbwxQVY94+Nwm32/X314vR5uM02sTJ7YtnjQTQXQ739KczKaoUjPx8tH5lhK++AfPs2tNdWIuKOu6HMlOa2jmjSJcY8uX/epPh+zmnjdj/sM0RJihq5xJow2xyIcGeAPNVOjcHKFOi472R476l7Ye+wQzdXhznvzjkmOKYRaLSBfrPXGT4hQoO/XjLvuKZcE6K5GIrCp6Cf24qe6dPR/E4XYDTD9frX0FZVQHfVnf0L8iWL0vDXTw+LSpT9tQbMTplEb+NYdEwMGLXh8/pgLQeVlit+XSEc54m0n6Uh8zeZoz6+us2Me97c219OPTc1UrjFU2+xu/o2NY5WqM/PRscWGzq3NiGkfh9+YqzDyWdcg58ccGBbRRvO+NvXuO+cWZM75BoIa5nxYy1bW6zYc8oemIvMYkwTtTpNZXBMWpZtfRKRKa3QXZyLpnc64WgxoeuTTbBXVSD8R3dBnjg+D5IxwTqeMBwgDy1FIMMA6onwcH+c0+7EgcsPoO2DNlhVLvzloh5cd8fsQeVXtMDefFK2MPl44P2DODkvHjrN4H+yTb39x8vH2X98vB4RhUyG+EsjYdyiQ/unodCiCnV3PIXk5/8IZbh6ZJOuiWSQR5hRd8zGuXfUxnjo60EersSaTFEog0blaWTU5ZZRNz7i1Bi0eFnHRNeBrv7gOGJFBAo+KhA9wX1Y7A7899tK/OOLElHKTE/pqmUZuOv0PPe950bRcki8DMnfj0Hzm83oKguF69tKWIz/Rcyv7heaohnmZ85Owrt76vDClko8dGHB5P7+8XQ8QS1PCazloNJy5YOV/cFx9t+zkXrr6P4bHxc14K7X9oiscYhKjp+cmofrVmWJdcXdOqYKsuiTAU2aFi1v6RCCCuT9+12886v/w71FJdhe0Y6fvr4X2yvacP+5g/cSE4a1zPihlm0dNuw9ba8IjtVJasz7eh602VMYHA/RslImQ9K1UWj7tA2mrVTdWAXzz59B4tMPQSb3wDgo1vGE4AB5PKUIbuqPI/ONQ1cfQsubLXCpgL+fb4F1QagY4TCUH540HW/urkF1Wzf++WUJ7j4jf1C/k3C97nWwdnePiAwy0T+pSdWg7W0Lomc3QWmvp4mqw85BJrptDpit9n6H6HHjxo0z9Xm2m6UZd0kRx5ZY04aDRj3RKCu3GXX5iFNj0OJFHRPmI2bsWbMHthYbwheFo+CDo8ExjW2jUWkPf1yMmnbpoCY/MRy/v2AOFngiazyKlmk2esJ3E2D42oDOnd2ITqsbNDv8u8syRID8dmGtcNKODJ1k4O4vAfBosJaDSss1f69B+c/Lxe1pf5g2anBMppp/+PAQnt4oPX5BehT+csk8ZMbqPN63SRv95B+koPUtGyLjGhGVb8bLK5fjiQ2l+PMnxXh1R41wpn/8yoXuKblmLTN+pGUa47TvzH3o3N0ppkjM/Xzu1AbHI+2vFTLoz9CL+ejtH3dDv6wRMkON59ZN1vG48dGatimirxQhqQDobgNaS6RrOtla6r7Ahmaj0hximVKGFy53oijLge+fMG3YHlg6Bf7VWqms+alvylDWLPVodJituPbZ7f0lXZQF8lSPSEhqCBKuzULYHFV/jwg5AA7t56UT9Ak7WXuAvv5j6vOMCB0+YD/qZD3CbNbJODVSKRGdBgqnxnzp6+TU6ElTBsZrOiYaX2iEtcEKXYEOBR8XQBkpvc/qOrpx2b+24LaXC0VwHB+uwR8unIP1t6zybHA8ipbpQCjqxCgkfX86VOGOQVpenBmN3IQw9NicYlZr0MNaDiotO8wO1D4qtT5k3peJ9LvTR3wsHUyTtvuC4xtWZeGVHyx3b3B8nDVZGaFE/BUZiFoZArmzS2Ssf7h6Gv5z9RLE6NTYX2sUTtcbDje79zn5I6zloNJyx4YOGLcaoYxWYu5nc6Gb4R0zrolqWTdLJ9bk0DTZiPtrBlOiY84gT6QUYZKQYOd+Ohebv23A500lYkTSefOPzR73ccqMeJyUF4evipvxm/cO4B9XzMf3ntkmTonJHOvPl8zzeI+IQmHp7xEhYzHKmtFmO+uBLLHxpgsF6RQMtHRZkK6f4hO7IQ7WIzmPutXJejxOjf6eXfN1vKDjvs00zVWkUQ6qGCnr+sWhRtz56h50mG3QqRWiCoTKLidcVeFuLSuPatmw2YADlx7ArNdniSzyr94pwotbq4Tz7lhmqgcsrOWg0rJCq8C8r+ah6ZWmUWeWHqgz4rrntqPB2CPmGT980VycMTsRU6FjmaMbstBQ8TgyCSu5tQRR1Ra888Ry/PitQuGQf+2z20TVGZl+Bq2eWctBpeXYtbGY8dIM4VQdVuB+80tPr8mWegt2r94tRjbSvoKZOh1zBnm08sCEWdK1m8QrZrH1ErEsAk9oJIMt2piO1i9EC9uv180SPbN0Irz2kY3YW2MQJ8Uv3rAM2fFhnreDpzKYuFzxuLb322DcbETVg1UovqFY9FMPMuoyTdCoy83U9/UfD2PQ1Udob9DilhLrsTg10vc94KDMeFHHLle/lkmb6T9NF3MNqezy9x8cxHXP7RDB8ZyUSHxw22r8+Ds53guOx6nlyt9VwlJjQeF3CvGdZq04MCpp6sSuqnYENazloFuTNSkapN2ZNmIg+eWhJlz8xGYRHE+P04lqEI8Fx+PUcXdpNxqebUDr+lY0X3QYL16yCJctTgP97z304SHc8r/d7qmS8kdYy0Gn5YTLEhCx2A0meVOg5fp/1aOntAeHrjmEqoerpuoZ+x5ToGMOkL1Ed1k3dszdAcMWg7hPG1ByjVUr5SJAPh5ZMaG4c7EGebIqONsrERWiwAvXL0VeYrh7e0S0+uPOKKXxNXn/zhPvnoZnGoQTt6PbgVid1Ifc2uUbJdZ9GeTEYfqPh2aQ3RIgDzwlHA4Pua4y3qXmLzViriL1OvXRZbGLzNK/vi4T9ykD+/oPlyNDP+TDnMp/2iuBxiLp2hPl9uPQ8qzXZiH69Gg4zU6UXngQ17ZL5d8fFx2d4xyUsJYDHiqrpkxNw/MNx33sf7dU4vr/bEeX1SH8Pt784UpkRId6Vsvj0DH1WM79Yq4oKzVuMeLAyXtx35Jc/O682VDKZVi/tx4XPv4tqlrNCDpYywFP+1ft2LlkJ7rLpaTIuPH0ujwOLWf8KgNpP5XMysruLkPpT0sHBf9Bi9r7+2susfbCaBC7PRT7z2tG1/5ulP20TDjqPf2N1L90/rwUxIVrxuSkeoO9GDN0tTDZFVi4aCmSVDSbMcL7dvCUlb0uCSq9CkWXFqH13VbsPX0vEq9X9Y+z8aUe5OEcrI8psbbZ/dJ1lfGulju2OVB6dwvglKPl3BYkfi8R7V1WXPvcdhRWd4j3018uobLLpKl1RB6jlsm8i0ZSHbr2EJpeasLiR7tx6holPtY34N4zJefcoIS1HNBadllMKPtZI4ybZeg+0g39OXqoolTDVov89bMjeOTzI+L+RQtT8fvz50DdfgTY4QUtj2NNjlweifnfzMee0/fAfMCM3St34/xPCpB74zLc/OJOYei59h/fCDOxU2YmIGhgLQf0mmxpVuHAxY2wtThQ/XA1ch/LHd/v8ta6PEYt05o7/Y/ThcEYBcjVf6qGtcmKvKfzIO/1+QlKIr2/v+YA2RMMEVznlh7oI2OhyFuFGf9bJhypaTwEQb2JY3VFVkamYOXSNMhsZihMh4FvHwdmnQuExbuvl2McPSKx58Zi7idzse+cfTB8Y8CKOiXeOYtmIftYBnmUAJkMvNyWQfay6yrjXS07TF2wfNCF9BXJwIy1SLgqQRzCXPXvrTjS1IkorQrPXrN4+LnGx3NEXvp9QKV1b1/WGLUsV8sx478zxIJc+/daXPm5Bm9arCj+rgn5ST5UptYLzVqnMvAlmTGQu2OcznCwlgNay90H2xButCJ9dSpi77lmxOD4t+sP4plN0mH2nafm4pbvZEPWcnhkLXfUTOmaTIY/CzYvwJ7T9qC7uBuFJxSi4JMCvHfLKtz84i7srurADc/vwE0nTsddp+UOawwacLCWA1bHLms3TJ+akZSfALP8O5j+59Xj/10e1LI0ScWK9i4bTD02OJx6OBKvgkpXC5XDDI0uAhp9BnQqNWJsjkGtln2tW4euP4TG5xvhMDow8+WZkGuCQLM+omMOkN3NEMF1HnbBVFSLsKRSpFwNaDQL8Oxmu+gNWp0TO3qJ9FDXNplM+gdTRgIOK1D2FVC5EYjOBEJjpB4Gd5x6jcMOPuqEKMzfMF8syCHNDkR0ycQG1hdoMI48A9kjJl3jPPFn/EfLrohkNK9XwdYhQ9SMSkSd9TEaSpNw0ettqO3oRmJECP57/RLkJISPSccC4b4YDlRvA9bfId13OadEyzK5DNl/zYY6To3yX5Yjs1GOT/Y1+EyATJuLT4oa8c6eOmwqaRGzy3+9biauXXmcA8bJwFoOSC1b7fFo+soBhdyCxNMboXW8BDRHDNIavb9+8dY+vLy9Wtz/zTmzcPWKzNG1rLX4xJockh6C+RvnY+8Ze8Wom56yHiTNi8Mr31+OBz88iGc3VYiRULur2vHXS+chOWrkFqSAgbUckPvrjt1WdNc0ITy9HOlrN0DRORsIHaPW3KRlq92Jw40m7K81oLS5E5WtZlS1mVHdZhYtGaNDLZfSZwxBvkK0X02KDMX0eB1yZ4cj8+lp6LypHOZis2jrUmukVsagJM67+2sOkN3JEMHZTQ60fVAHp0UL9cwCaMIb0L7zLbyyrUA8/IbV0ybm2kZfq9wMWExHywu0RsDcPCWzdsPmhmHehnn4YncD6vYcQoavZJA7xpBBdqdJl5cdlBnvadm0zYSeMhtkKh3CT82G3XwE6199GnXG05EVGy6C49Ro7fjdF2nURVMRYDUB2jhArZP6kqZAy1TalfGLDBQqzXisuQx5hxpx62njLFfzAF8WN+HHL+46ZrPxyvZqzwbIBGs5oLTsislDyzMNgE0BdbYeocvjpE03jQehz2y5HHaHE3e8ugfv7akDFSj84cICXLwoza/WZHWsGvM+nwfDRgP0Z+ulrynlwuxzUUYM7n59D7aWt+H0v32N+8+dhfPmpQR+OwVrOaDW5J4aCwwb2wCXFtoV6VDKqwfp+LhMUMumeTdgs1GPb0tbsbOyHcUNJlgdI/cskwcAVZdFhKigVMggl0kXp8uFTotdXMjDxOZwoa3LKi5FdUZ8dvDo75hxgRzhM2TI23gYCzKihIbdMuPcH4nz3v6aA+Rhehom/IIPEBy11Le83QJnjxPqFDUiV0fBYZFj9+6tiLEnomBaHk7IiR2/a1tnM1C5qfd56gCnDVBqgJ4O6bHEeD4k3IQuX4cYymzvkUogOzZ2CFfQ0KypOZ1uNlmEWRh97qWP8kHiVpOuQBvK7q+4WcvWFhvaPmsTX44+LRqyGCU+3qFATHc55kV04vEbTx31EGZE98V+LXdRnTMQGg0oVFOu5VU/mgbnA2Vika5u64L6o07EXxYvsszehrLFP/jvTnFKPy1WJ8bhnZgbh4ue2IxDDSYcajAiP9HDWW7Wsv/qeIiWO742wFpvhVwrh/5cPWQy+aDxII7IdPzkNSk4Vilk+Ptl83HWnCS/XJNpJntfcEz0VPWgp7wHZ5+YhJnJEbj9lUJhFHrHK3tEdQYZevVNoghYWMsBsSY7bS60vNUC2mjr5uqgmxkG9IxzzM8YtexSamDpbEVHWwdqK9vx2da/4wn7OrgGeBxHhCgxJzUSuQnhyNTrxJhT2neSv1C4Rnncwydq5zB021DX0SMqH2vbu0XbFgXflJ0+mG4DukzYtsUkDAPnHVGge64GSwriRCXqiuxYhGmCKJyTe2d/HUSvqBea9AcIzmVziV4BmUqGuPPjxOZyW003XOY2LNZU4Z7Tl0NGJ1OjCWfo7DR6fMM+aUNN36OfdSkAVQigCAHMLdJzaCqeklm7NAeZ0B62Yd+v9wlHzXlfzhPz6LwNlY8ROfFhCA85tr9saA9yd7COwAg0PKBlZ49NzElVJ6gRtjAcH+1vQLnJiQJFJ/5xkgyJzkbAOcqCP9wMxIFaFgu0i4YhShtrhWZKtUyb5EWZMdhW3oadPypG1MtGtH/ejryn8rwaJO+oaMMN/9khguNTZybgsSsXQNXbM3lyXjw+OdCIt3fX4Z4zfaMMnHEj7jTOGbQRNgIyQL9WD2WYUtIhBbSdjXA2H8bPPmnDO4V1Iuvz2JULxfvOn9fk/peg0Yo9a/aIkW6z352NrFNj8MZNy/H4V6X4++dH8OH+BpFRvufMfFy0INVzvf1M8OGJNbnTKQ65FC4F9Gf2HgKpQoHWVqB+j3T/eEH4KFp2qcNgcwJWqwuVzVaYHErEwAiHy4VsWQ2W682YnjMLS6fFoCAlCmkxoZOqwKCfjdKqxYUOr4YGzzRabldlh5h+Y3qjFWe8aUf5t0786dJKETDTCNgV2XqcPisRp8xIOL7xLzMmOEA+nnnOeEqjBghOrolA3KVxsLfahdtzY0MtlNVbkC3rwD0J25GwsxaoPM6HxFDXNosB6G4F5ApApgTs3YBGJy3EpE1NONBjArrbxzcLzE0n9fowqTeiUmWFOiVcMgk5qRBzv5wrxlC4g0ZjDyJDVaPOjSZ2V3eI6/lpwxgmDSDUUxnkUZ7/jop2nJAbO2rgzviOlkPSIpD8w2TAAWwqbUFzUy2Wy6swK6wboWWvAw1fjr7gD+e+OFDLNO4hJEzSMTFRLbsr4waIhZYC5O06M07tHefmcriQ/+98yBSe3zxTZuuaZ7ej2+YQJ+SPXjG/PzgmKJNMAfK7hbW4+/Q83tAHEu7U8RAtR38nWrQE0ZqMrhaADLdMDXDZunHgvUcQ35aIXPkS3HH52mODYz9ck/tQRimhnaFFd0k39q3bhznvzEHM6TG4ZU0OTs6Px52vFuJwYyfufn0v/retCr89dzZmp0RO+O8xjCfXZGVEhJikYjfYJdMq0jIFt50NwK7npXFKxwvCh9GyrasFdocMhk47VK4edLlCYYJClEQrNJHIVdtQEBuKC8+cLc1x9oKWKXimnuSzC+iSBFOqCYXv7sH0ejv+8H4kHvuuDYfMZnxV3CwuP5ftEwaW58xLxlmzkxDdO36VGT/BHSAfzzyHnNLGUxo1RHD0xqaF2GpsQlvxJqTI2tGjTUFCzhLAbj7+h8RQ1zb6cKDnTM/T1illm+iDoG+/SuWZdov0c2OdBebGk/porVr0bHXoXEhbPwM15xyC+aAZhScWikyyNjvkuB8U1P9FpkfHzI8F8OauGvz09b3IiNHitZuWj1oOtqtSyiBTv8Zo9JdY27wTIFP28dfvFmH5ND3+9/1lXvmbQYGHtawIUQjjjbLKSsyXlSA71IzQmCwgce7xtTyc+6KtG7DbAKcDUCoH63giWnbzqIrTZibgt+sP4H9xBlz37DxUX3cEjf+hTDmQ/0wuZKYaj/T/kDnSS1sr8cePikVv1tKsGPzrqkXQKAcfiH0nP16UrtUZerC9og1Lpx0tJWX8GHfreBgt9wfHtTuEDl1OG8ocsdhi0GK2vAIXT5chK/EEsnf0+zW5/2lr5Jj1+iwUXVKE1ndase/cfZj91mzoT4/GbG0H3r80Bq/tk+P3m0zC6Xrdoxtx6aI03LomJzhMvBj/21/LZVBFD9ByZxMQlTa2NXmAll2GGrSU70FJux2Jxk5EyJzQwAwr1HCGxiA3PFwkZRQyF2BqpGb+KdVy+LxwzP9iHgrXFCLiiB2/ezcc4S/Mw2d1zdi9bx+qG5pQW9GMX5a34NfvFOGE3DhcuCAVp8yMP2YdZUYnuAPk0cxz6P6A3qQxlUbJ5Wg+uAyK4v2InHcAirg0NPfI0bJ/MyKd7TDIozF9xhKplFIxxg+Jga5tdbsBh43+EEQkGp4kjYbpw26V3K1jc8c2C8zNJ/UKuUy48NGYJ4MOIigmEZuLzCg+713M+l051KgY8YOCguPvPbMNm0tbccH8FNx/3uz+vorXd1JwvEdUwZS1dIlRFS/dsKw/AzwQ+j17a8gdEMOP3PGki/Vx+Oxgo7g+KS/OK38vaHCzll2Q4cijeUhZfARaHIQjPBkbDrRgpqwSGZpOaKNTgMQ5Y9fyUPdF0hw9zdBIKfOkHLIJHY+W3Z1xA4QByKzkCNGHvHOmEye9PBMHLz8I04c70HT7s4g/2QCZw70zI4vqDPj5W/tF9pigU/B/X7N4WI1TBckZsxPx2s4avF1YxwFyoODuNZnaCveZUf2HbGRfWgEVaTQ8WdIqmeHJlWi0arDREItOaJGVn4UsZV3ArMlDx7nNenUWDlx2QPRvll3/IUJ+Uw6dvgYqew+uUIZg3aos/KM+H/86qBIO3m/ursVVyzJw80nTA78/mfH5/XXVB3MRqTqI8BkHIY9OlcqqRea4CdDFjWtNNlvteL1Egy8OLsRMw9eYIy9DqswOhUwOjUqF8Jh0KKmyqw+bxWe0LIxxv5wn2iY6d3Yi5Ptf4KZflEKRVgqzvgvVJic2G/R4wTAHXxxy4YtDTSLIP3deMi5ZlMbVIWMkuAPkkcxz+qAZW2QjPsbSKGuLFcU/B9TyNcjSF6Om/QjaWxowXdaKelkc0vOXQh0RP/4PiT7Xto5KYOvjksBo9hdloeTK3lNqG2CqByKSgLlXHP9EzhMn9VRmrdOIAJmMumbkRGDeF/NQfP67iIl6E8a3OxF59iyoYtOG/aB45IsSERwTtDBTmfQ/Lp+Pg/VG3P3GXhEcnzM3GRsON4tT7tte3o3Hv7tQBOYDKW40idJMyjBlx41+0nfUxdrzPciUEdtaJpk9rZkxTPke4zNarn+mHnWvhcO49UTMe6waJRV7kGytRaLCAG38NCClANDGjk/LA90XLUZgz6tA4z6p/JJ0SOWY49Wyh3RMnDYzUQTInxQ14JKrF0NpK0X3S+shazSg7ZsM6NflTGrBN/bYsL/GgD01BhRWt+Ozg00ig0yHYj89PQ/fXZZxjLYHQmXWFCC/v7cO950zk0/HAwE369jldOHwTYdh3BIFpf5M5NxwUApq2yvF5rreFYVPDJFoR7joa5+RHAn0yAJqTR4aJM98ZSZKr/kQ2o53Yf7MBPl38hGaLa3J4e0H8POYRpx7+eW4f4tD9CX/e2O5KLv+3vJM3LA6q99rhGG8qWXTbhPKHlZBG3MS5vyxEqHd1VLPMZVVi8zxnDGtya2dFjz/bSWe/7YC7WY63IrBDvX5uG6WAssUHyLKeEjSMj13u8pntRw2RwqSiy94F9Hhb8HwuhlR62ZDm5SGvNgu5Blqcb58L15XpuHpg2rRxyz9f1diTkokLl+SLsqwg8rca5wE9ysznHnOQEgk9P0xllOU/awM9jY7MCMXZ1jjENqQjVmyctwS9S1yZi1DhDZ04h8SJCIq6Vx0vXQq1V4hGYOQFb3DIpVxkXhPuBtImDElJ/X9fciN9CEkjXpSxyox45elML5hhk2eA6U+WjppH/JBsbkjGv/44oj4GTqtfmt3LcpbunD+Y5tgd7pEcPzdZem4/5zZ2FnVjiuf3ip6EKkMlOahDjRI2FUlZaDmpUcdtzdRq/JeBnnjkRYxDiBDr8X0uBEWDWbKtWxttgotEwm3rUbjihj8aMvryHaU4b6knVBNWyqdUk9EywPdFxVqScuUSlZMUMse0jFBGdq/fnZYHEhVtpiQkbIJPd8BGt/PgP6EWKnvcowLPh0OfXqgAQfqjMKd80hjp2ilGMrZc5Lwq3UzkRAxiit4L8um6REfrkGTySJ6r6hvmvFz3Lwm1z9dD+MWIxRhCqQ/eAqQdCZQ+jlg/SdKXUlYf6RbVIssy9JjbmpUQK7JxzxtBTD9xoMwvWOFqToL0ckxx2h5lvEbvHzj7dhY2oaHPy4WFVk0O/m5zeViY/39E6aJvkiG8YaWxUHXDw+LFh/ddxYg9OorJR2QIRf1HFNZ9XHW5CZjDx7fUCoOe3rIgQvShJPrV2XhwoWpUqDYnOlXWtbNCMWsBypgersTiJ0JWTi9zkf311HNh3BD7AFc+7Pb8U1JqzhQ/rSoEftqDdj31j787v0DOHdeiqgSGWoOxgR7gDyceU4fFJEZa6UB1GMop6CxRmRkQ2y9Wo3Wdgemx2XiB6fMx+zSBkBBJ1Whk17wB5V3kcC62wCZQhpiPu8KIH4M4vXA6V4ffafLlEEWGKqh7C5D5NpZkIdFDjb46f2g6Kk/iIc2fAaXK1L0Pd19Rr5YgMkwhIJgggRM8xopEF6cGYO/XDIXt7y0E599ux1LtfU4c2FOfy9kn4P1/LTR+489OuZpGD7vLa9ek58Q+DMn/VjLZXdLB100PiLl1hTc/L/dKLXFIj8tAomJDVJ/E5Vw+YKWPaRjIi8xXBhkfXOkBU+t/xq/iziCkBnTkJKtlRyAx7DglzR14oUtlaJFgoLkoaRGh4rAZE5KOFbHdWNWrAJwHMcVvBfKLlNFydMby/FOYS0HyIGAG3VsbbKi7B7poCvzt5li7KAgNheNrkhsKGmHC9L7j9xoA3VNPgZDNeRtRxBxaj7CXGHCoX84LcsMNVidk4FV2bH4/GAT/vFliWh/eHZTBV7cUoWLF6XihydNHzz/3c3mYowf40Yt1z9VD9NWExThCmT/NXvwQTP1/I+yJne7VHjym3o8XlgFi10KjCmD+oMTp+GMWYlQDjB/9Ecta+QVUJw/G4qYKMgGGpkM0LLCWIOT8jJwUl68yKC/uatWHBRQuyJd02VRRjSuWp4hDsZFr7KTtTyuAPnxxx8Xl4qKCnF/1qxZ+NWvfoUzzzwTfslw5jn0xqUFksSr0wP5a4/7Ae+0OXHkh1L2M+mGJGyJbAXagR9/JxsL5iQDBvd8SLh1ULabT+qHOllTmfXADwqFPlzKHIv+Thc6vuqAbpYOqphQFJY3wtJlQE58Cu47R3IGJLv7J69aiHf31KHL4sDlS9IGBZVrk0zQ53+LutI90Gx2wmVIhyxO6oWk8mtifsbo/cfedLF2Ol34srhJ3F4zY0CZPeNTWu74pgMNz0kHXbmP5+Lr0hZ8VNQggrFbL/gOZEdKfUvLHtJxH784ewbO+vs32F5chbZcI2Ii06DUHN1Q2412kaGL/k44ZLQh6F3wq9vM+NU7+/FlcXP/Y2mOMRmG5CSEISc+XIxgEw6bwsjkHaD4CFA0vr5mKrOmAJnKs6lkO4Kd4f0bN+mYKP1pKeztdoTNC0PKj1P6v36wOxIfl4Ugx1WHxPh8nJQbd3RjGYBr8rG/R1qTZZowKChz3Evn3k5h5qXNGbx5p3X3lJkJYt3aVNKKR744IhzuX9xahVe2V+Oiham4+aRspDur3W5IxPgxbtLywIOurN9lQZOsGVMQ3mO1o/zwQXzQkoBHyYwPcizMiMbtp+SIQ58RkxR+qGWlnj6rpP8fp90pxjJGrY6CIuTYQJy8BG48YZpol6AWCjrAJvPYHZXt4hIbpsbNsxy4SFeIiM7yoNbyuALk1NRUPPTQQ8jJyRGzuf7zn//g3HPPxe7du0Ww7JcMNc+hNxO9GWiBJPGO4c1Q92QduvZ3QalXIvP3WTj4qHSAMDMp0q0LvlsHZbvxdG+4DDKdUo30QWH81gjDBgNMO0zoORWo7XTCrtTi8SsXDDLkoQ8wKv8YyfxgsaYFLykiUGtVI9sSivT6vehprYK8dTaAlDFmkCUJUM+yJ9lT0yEODagvmjLgjO9pmcq4Sm4rEbeTbkxC+NII/PavG8T9a1dkIo/0rPQxLXtIx33kJ0YIU4+NO5qxp6EHJyV1QqaJ7H+9Gl9shK3JBqepA/qTNIBah1doTMz6A+iyOsSZGPXbf295BlZOjz225WGSRiZkJEYtC5WtZnEwdmIum9/5PW5Yk43bjGh8vlHsGXOfyIVcKWmywdCDa5/bCZ11Ie6JNuI78R2QWcKmXsde0HI/w6zJPZU9aHm7Rbxe8ReEQJt87Oad1uNVObHisqWsVbREUcBMZl67d27F75I3oiDaDo0+3a2GRExwa7n8/8ph77AjbH4Ykm9OHvzNYfbXNkUIiiob0FRbhka7Dh84FmJBhh53nJKLldn6sVXv+bGW295vQ2dhJ3rKe5B4qRaKEQJxeh2oTYkuVH5OOn5paxV0plKod36EjTIT1DFpyEtLQarWCVkQanlcAfK6desG3X/ggQdERnnLli3+GyBP8sSINol1/6wTt7N+m4UGuU2UEqqVckzr6zN1w4eE2/FQ4E6nT0Rrl3XEDwo60e/a1wVrvQXhW6vQHJ+OC85djtyE8OP/gQHmB8qEGcgwtqCtuh27G+1In5sPY1khTpP34JPobJGFHnuJtWdNushFkKAMGr03GN/TsmGjAZ27O6GIUCDr91ki41/a3IXwECVuOyXHN7XsqQO4Adx5Wi7e21OD7Z2xyK0qRUr2fKFjGrMRvSYaTa82wtlYjdqP5uA37Q34tNdob3FmNP5wYQGmjWSU5wYjE1rkZyRGiACZyrk5QA4QJpnFqf1nrbhO+F4CIpZKG0dTjw3XPrddmNVkx+dh2cUroSj/0Dd07CUtj7Qma9I00M3WoWtfJzq/Lobz5BUIG2Xz3rex3lnZhr9/WozZ5W+jqaEO/25Ow8IMGxaky6ByoyERE5xatrXZxCEskf1Idv9B1zG/f9lNcB54D1WHC1FS1wKDXYESZwZKYk7EL88+VUwN8Wpb2xRqOWJlBLpLu2FrtKLj/QpEXnQClMcJxOMjQsRItx+emIWyt75GW6kFWztTgFYX9rfWI1anwdzUJMxw1kEZRFqecA+yw+HAa6+9hq6uLixfvnzEx1ksFnHpw2g0wieZ4IkRbRLnfzsfdU/UifLqjw5JYs5LCIdqaG/DZMs23I0HNvvkYj2oB3mYDwqFRouES0LR8UE5euoikffNKmRcNMas6hDzg4LUSOyubkd5axcMPXZU2aORLa+BLbE3QD8OfRlrMm2gMujjmXpNFCoB9efyar/R8SS0HHVCFBZsW4Cesh6oY9V4+s1y8fUrlqYjfGDprq9p2cNBe3x4CH5wYg7e+Wwxcho/w7qIg1BGpooFX5tuR+I6A1q+iETdOwWYsaETmy6Q4/azc3H9qmmjulC7y8gkOz4MKJL6nZkA0vIksjh5T+eJwFi/TpqPbXM4cfOLu8REBKpyevaaxQiP0QIpM3xHx946gBtmTZaptYg9Uw2Npgmmg5E4cF8WMqKbkXDZ6NMWFmbE4PkLk9H0rhWb6pNg7XTh27JW7K81ilnlWbE6txkSMX6q40loWRWjwpIDS0R1Q9SqkSsCt5hi8bvCxehoiIUO3QiPiMaVp6/AT+eleWxP56taVsdokXi5FoaPDqCnIRy1v85C3jwbNEnHd59XmWqRp2gA5hUgx6YRlY8H601o6bLg8+Im7FbaMa95G2JSDyM1Kx+BzrgD5H379omAuKenB2FhYXjrrbcwc+bMER//4IMP4je/+Q0CGVWUChn3SOInl9a+0r9+hja7x83wndMXN2/2+3qQ+1ysR/qgoLKPsqUFqPpLHvS16ag75xD0H85B5DKpfHOs5gfRWrVwIqxqMwtnvpZOGTSwYX7i2Aai92WQ+8qsdR6wvK/r6BYbM/qcJpMEfyQYdExELI4Ql/21BrHRowDv6uWZ0jd92bTCw0H7jaunifKrR02ApbYI89oqEaNxwi5X431zHHZGzMOF7alY0CLDv7fFYMmvM0cPjt1oZCICZGEIZprw/18wEQxalqvkSLlZas+hdrD73i0SZnOhKgWeuWYR0qJCpFFPQbAmj/g3hqzJMmUIwtetRrNhBsxNWhy88iCc3U4kXZs0+u+ydiI+FDhvUQ6Km82i7NpkseGdPbXIjQ/HiTnR0A3wJ2DcQzDomAhJD0HqranDfo+8Lh58vwh7DxSJwFinDsMFJ5+Ca1ZN842xf1OkZVVICCIuOAEHfpmFjqI47F69G/M+n4eQjJAxr8mxGoUwlF2ZHSviGgqWDd0OVDU34O6nvkRSjlGMfqOqrSk7hPAw444G8vLyUFhYCIPBgNdffx1XX301NmzYMGKQfO+99+LOO+8cdMqVljbJuntPMc4NsGmnCWELwgaVbhyolwLkfst0YUDj48YVk+23GKYHubnTIjYm/a/NMB8UD7xYheLTjfibUgPss2DfmfuwtHypOHAYT88FuZBSgExBjdbVBR1UKEgb0qsyAiFKzwfIn/eWVy9Ij4a21QmnyinmUfoTfqXjcWrZ1moTZlOhWUdd5p/ZWN4/dig5KjTodDxcpcW9Z+Xjtpd7cG9zElJkrWJD0oVQ1Lr00OeH4PRHkqH/aSMsXxlFL3feU3leMTI5GiB7dwNOZWyh0/1v1E0ga5mMprT52kGfrzT3kwylaCn6+2XzUKBpBDY+HbRa7meYNVkWmYZpq2Wwyw4L5+Di64qhnaEd/eC6V8cyu1l4FkyPCxM9yruq2nG4yYSWtmaclKpE+mQNiTyErcMGl90lqob8iUDWMbUuUh9t+ILh2+56bA4xduzjr77Gya6tOEVZh5wYFXJSYhEibwTaWcvqyDTkzbVgz5o96Cntwb5z9mHR7kWi6nU8a3KIUiH2ruTpU93QiKqaLnS2hwoDTrpQgurKpem4eFEaYsh0cwqhNTlkWojbyunHHQ2o1WpkZ2eL2wsXLsT27dvx97//HU8++eSwj9doNOLi84xzA2wqNGHn4p2IXBWJgk8KoAhRDMogz0yKmLQBjT/SFyBb7U7Riz2oNHXAok8nf4U1+yEPAeZ9MhcNVx9B4vcSRw+OR+i5oDIuMr+iU+s0tKBYPg3nTh/b60onX5RVoODYU7OQv+gd7/SdGfHiQ7/2sVrkP5cPTaIf6MLfdDwBLVf8pkIY7U3/83Sk/jhVGPmQezpBTo/BqOPhIMM80hptfvfVGlFUa4Ch04IbFqfhljU5wkHaMDcRR247gsz7e7PuXjAyoQ05/Wi72SbMAcml09PQBo7eNxSMpd+b7ldj2wJVy3aTHXtO3SNGwRR8VABtthZfH27Gb94rEt//2Rn5OC3ewFo+TiBO7+TcJ3PF7Gh6n/f1cI9Vx9RatjonToyJ++xAIyI7a/C/8iw0f9KG35yX4pFD6Mlgrbfi8A8OI/tv2SMGZL5IoOqYaHq5SVQwJF6XiPx/Dy7l/fRAo9C0pqME1yo+wvQwC/Jy8xETFR2U6/JoWqZD/3lfz0PR+UWih3vU4Pg4a7KM5kYr2pG+fAX+m38hXthajdd2VIvk1IMfHsKfPz2MtXOSREsauYVPxZrY8k6L8JHJ/VcuFKGTryCY9CeV0+kc1Afhl0xgA0yzUuGCmK3YFxzT5owMQIj8xDBg2zOTMqDxRyjTpFMrhIMtlVkPCpAH8N5eKQBZPl2PhEQt4j8qGCQoR7dj+Df4MD0XcrUWCxOVqK2sQBvCUZuwBkrl2N/aVGZNAbInRj2R+demXtMiKleJTQwXJ1xUAshMvZbNJWbUPV4nMgi6GVKp7/PfVsDudGFJZgwKqBKEsk1BpuORKEiNEpeRiFwZiYXbF05YyxMxMqHPnJSoUNS0d4sssjcCZNpo5P8nH4avDX4VHAeylqsfrhaO6spIpSglpJL7H720C04XcOGCVPxgdSaw8a+s5TFA72k6MOy73adjeYj82Pf7CDqOV1lxWVYX9ren4W9Vi3Bkdx12VRvwyOXzMTvlOK1UXoQ+92e9OQu2RttUP5XAZJw6dvQ4UPZzaazTwAqdmnYz7nv3AD472AgZnLhbtxsnJyiQnL0CMpk8qNfl0QhJDRHeKu5ck7PiwvF/a2firtPy8O6eWlGlU1RnxJu7a8WFPJgoUD5vXgoitcdJermRtDvTYNhkgEzpnjVZPt6Sjq+//lrMQaZeZLr/1Vdf4corr4TfMtRJlQRGswGF0PKlr5PQ6HG9dGzoQPun7ZCpZMLttg9qZicy9VqEddeP3YAmwOjboPYbdQ3De3vqxfW6AqkUeqB4LfUWbJ+zHTWP1ozec5FUIA1yby1BfoQNB2VZeM5xBhKmF4zr+YZ60Ml6e0W7yKZn6EKRmyCVmIXNDoNK770PjaBhAlqu/E2lCI5jzowRjsz0HnhpW5X43vWUPR6PkRTT+7IcfZ0a/tuA7bO2w1xsHrOWxTVljpeOPQPQX2bd7Nkya9q8UetI3/9n1InHHyXHeF7L1hYrav4qrRfTHpoGo82OG/6zA6YeOxZlROP3F8yGzFDDWh4H9P7u07LT6sT+c/ej+PpiMWd1rDqWJ89DwYU/w+9uuBBJkSEoa+nCBY9txivbpc/YqYSChD6ovFo3awQvBMara3L90/WwVFqgTlEj9fZUYbD3+FelOPUvX4vgWCmX4e5lOtw4w46U9OyjwXEfvC6PuiabdpuwddpWtH4oJW4msyaHqhW4dHE61t+yCm/dvAIXL0xFiEqO4kYTfv1uEZb8/jPc8UqhqDrrWzfdDf3egVqmQ3p3JaDGlUFuamrC9773PdTX1yMyMhIFBQX4+OOPceqpp8JvmYCTasV90pxjcq0e2LdYVGc42n/sJgMaf4SMuqjsgi6Lhpn5S1keMq2iD7ozZice8/3GFxpFz0TJLSWi/ImGwx9zaj2kfypEHYauECMqtlYP+zvHYtTliRLrnRVtmFOqwM1fKGBcY0TkCt85OQ84xqllCtoaX2rsH9FGvLGzBh1mm5ite8qMBKD5QNDqeLI4bU5UPVQl5jHuWrkLBR8UIGJJhEeMTLLjwvBVcbNH+5BpIT501SG4HC7RIqGM8K1S0WDWcvWfquHodAhPkKhzYnDdf3agotUsKguevGqhZNgTxGvyZKEReO2ftwNOwNZsw8xXZkKhVYxZx0vjgA9uXY2739grSmR/9sY+kVD4xdkzBk/78BLdZd3YvWo3sh7IOr4JGeM1HdMBZNWD0uFJxi8ysKfFiJ+/uQ+HGqTk05KsGPzuvNnIRRWwwcpangB0kGhtsGLfun3IfyZftDZOdk2WyWSYT33K6dH45dqZeGtXDf63rVoEym/trhUXShxetDAV5y9IFZ/L7qL6z9Vo/G8jZr852+2eIONa4f/9738j4Bjnotn+VTs6vuqATC0TvWcD6TPompUcCahVbjGg8UcWZ8Zgd1UH/vhRsRj1MHQe8fre8urVObHDzipOuysNTosTFf9XgarfVwkx5z6Re+yp0JCei/9b58JdZ8wYd49TqFp6/KRLrIcxoSjd0oofrNcgtMclgjEOkH1HyxW/rRAbPv05eoQvDBfZ4398USK+d93KLMmF2U1GUsEI6XXeV/Ow76x9MO0wofDkQsx6bRb0Z+ndbkrkVqOuEcxk6LOo+fVmUTlkPmQePthnvK5la7MVtY9Kc48z78vEnz453O9Y/dT3Fh0tuWctT5jo70Rj9luzceDSA2hd34o9p+zB7HdnH2tsNYqOo3VqPPndhXj0yxL85dPDeG5zBYobTHjsygXiex5hGC3bTU7sP3+/OHyn8ZwJVyUMP1+X8fqaTMZw1jorVKlq/CuuDc8/XijsKKK1Kvzi7Jm4cEGKlCxp53V5otAIPGoPpUTUoasPCR2k3Z02fOtE9PjX5MhQFa5ZmYWrV2RiT41BVIu8W1gnDizps5l6lVdM14u2l9NnJY5tvz7Cmtz6USvKflYm9nHtn7VPbYAckIywaNZ2dGPD4WackK5GquboBnhg9jgkbbBl+iCDrshYtxjQ+CO3rckRp8TlLV34+Vv78M8rjvY/UBbmvV4DpHVzh3eapsdm/jIT6kS1MM9oeKZBzKad9fqsUUuTyXBrIgYgWlVvibXN4VYTCos8E+c/kwJlTzpUi3TI/rNkbsd4iHFsgLsOdaHpf5K7eOavJUOpp78pR5PJgrSYUFy2JM2tRlLBijpOjblfzkXRhUVo/6RdnFoLM7TbUt3au9sXIJdONkAewUymcc8SlP9SKgMksxMOjn1Hy9UPVcPZ5UTYwjBsSu3Bk69I/YsPX1xwdJoEwVqeFLHnxGLuZ3Oxb+0+GL81YteSXZjz3pxxlSbTGn3rmhxh4HXnK4VilN45/9wo5lJnx7vZIGsYLTsjs3H4jzno2hsFVYIKs96YxcGxj+h4YPb41QU9eGdHu7hNgRRVGgxySGYtTxhy+Cf/DHr/1/y5BmX3lIlqutzHcyHXuO+gSCaTYV5alLj88uyZ+HB/A17fWY0tZW1iFBxdQlT7cNrMRJw3P1kY+w1bTTLCmmzqPglFF5hFcJxwdQKSvu/+ShA+NusTGjWl99bIW+wOfLS/Hk2mblRXlABxuUKQtjabKC8aLntMtvOlvf1vYlHua3bX6qVm9x4j4LRL13R/jAY0/ggFqTROg0qoP9hHopB6w8jVmvoSSpu7oFbKcerMhFF/T/INyZjz7hzhpklZ+51Ldwobd3dztMTaPjkTCgqitDGiNMXuioTx7Y2YMWs9unIrseiDuW798GHGpuVjgtleLXft6RKGM/pz9cK5tNlkwZMbSsVD7z49/+gMxSDWsbtQhinFRjrx+kSxmJXeUSoOvtzZk9QXINcZetBlcZ+O6bpn2zbYP34U2thqZPwyAyk3SfN1manXsisyFd2HpTVBfks87n5jn7h980nTsbbX36If1vLk/1lWRmL+pvnCaFK0TizfhbZP28b9eyhz9ObNK8WImOq2btGXvLm0BW5jGC27NNEwvv0NIpUvISyzTjidk4ER4xtrct1uAww9NrSGO/F+Trdoc3rxhqX48yVzjx0fxFqetMlk9p+ykf33bBEFNjzbIKpCaOSZp2KCixam4uXvL8c3d5+MO07JFRMxemxOMTHkuud2YPEDn+GeN/Zi45EW2B3OUddk26GdMD35J4ToKoV/TN6/8jxilsm7umGEtvlII1wWI3JQg4YuJwxh00V6XxWlwOK9i7Fg84JjPlipVIjcMvU6NeLDNW41oPFHyOn2ztNyxW0Kil/dXo3T//q1cLsjfnRS9ogO1wPRn63H/G/nIyRTcn5Wxbrf3OqoSZfDLSYUDivQ+KoZXRUpcEYaYbt6NzR6LtbwOCMtmt0GoHaXlP1NXiAeGn9pPJZVLBOjPYi/fXZYOK/PTYvC2oIhJ5FBrGN3nlrTXOTpf5kuVh2qDnHngkatGrFh0iaq76DSHWYy5iolGj6IgirUiKxrDiDzN4MPRpmp1bIMMlH6m71hDm6pK4HF7sTJeXH4yWkjaJK1PGl0M3VYsHUBIk+U/DTUSRMrj6YsMhn7LEiPgrHHjquf2SY8ICbNMFp2yeRo+dCKjn2JUIebMOu35QgvYFMuX9CxK2k+3txdg3Wf7sCt13Xi75dYcP2aafj49hOwMjt25N/NWp40qbemYs77c6CIUIjxeJSM8jRpMVrcdkoOvvjJiXj7RytxzYpMsXaT98vL26vx3X9vxdLff457Xy9E6Tcvw9HVMmhNtnWFov6dSCgVHUg5fQ9mvTZj0Nx7d8K79oFCO/gemiv2o6u+DukyG8IVDpgcDnRseRGR5R+KkzDZjHUIX3js4tvXf0zZ40EbPzcY0PgrPzhhOjYUN2NreZsw5yCoOf+hC+eIcoqxQq7PZFNPJiw0woOg+Yx0cUfvkHYyAfIwJhRUfkYjI2whMmxKjsKCyMZBJm+Md7Qs/l1aioHOZkBGp9fxwJ6XgdqdYtFW02PjqG/VJD6YiV+cNWP4wC2Idewu6HVNuyNNzI6nnu+BZl7ucJ2kecgtnW040tg56iiqseqYPl+o3xJOGRTJ6YhZ1iY5IbOOfUrLjry1uPeIAbWGbmEE87fL5kv+AaP9XtbypKDe47mfzEVXUZdYnyeqZeoPf+nGZfjJq3vw/r56/OS1PahsM+OOU3ImfoA2jJa7j3Sja38XoJAh7MQ8hGqreE32AR332PXY8eY/UWKIgd65GMlpM/DHOwrGPgaMtTxp9GfoxYGXJknTv58mHcuUR13sPcHAEmwaGbW1rBXr99Xjo/0NaO2y4pudhVik3IaN8gjENzeIjHOmXgfDp21wdrngjE5G0loD5NY6QOeZvTUHyH3E5aE7Yhpu+fYNhDmK8aP4fQhXOlDUoEaXORpxtSEIseyBfIS5yIP6j91sQOOv0Cblr5fOw1mPfANDtw1XL8/ET0/Pm1CfMPUyUjDTR/VfqtH6TitmvDTjmF7w8aLtNemakIv1MCYUkasjhbHYlugutKnUiAu1sTOqN+lbNMs3ADufo3oiQJ8tglpbiwGu/TuhHqDjhz48BIfThdNmJgiXzBEJUh27m4jFRz8jaTwDucnGnh+LjHszIFNMfEHOSQgTh3ETGvU0jI6pDC3uojgYtxoRszYasvZS1rEPabn7SCvUnYXYV1SEuqrlCFWl44mrFgqTmOPCWp40lLUJn3/0oIsMTGkM1MyXZiJi6dgN7EJUCvzj8vlI12vFOJ9HPj+CipYu/PGiAvE9d2g5NDcU4UvDxV4hNFcjVQGxW/mU6dgJGYrtCdhQ0Q21zYzV3VU4K8+OvPNWQ5U4zkkfrOVJo8sfXE1RfEMxXDYXcp/MhTJc6ZVYYUV2rLjcf84s0adcuGMTIg87UGtTo73RJByxKajOSA3BTJMS2rNjIJN7duoAB8gD+MtnR7C1XYefahswKyEEXeHZ6GyohLrKhqY9LigiwpByeQvkwwwgHzTiieknOSpUlMpQdpZOgNyB3WgX42PsrXbsmLdDiDjuwrgJn3ZNqsS614TC1mSAMiFaPAc6hdOeH4OGTQaEy6yIighnl+OpgDLF1OdEZdW97w3DVic6d4UjdnUltJHr8e8DCnx2sEl8QP/szPwpeZrBTPNrzejc1SkuHV92iLETIRkTO/CiUU8TdrLu1bHL2gl7l7bfDJA21OIAjkoD2a3cZ7RMUw6a3uqG06FF24JynKbagfwLzkR+Iq+/UwH5CVT8qkKYadKBV+ZvM8U0irFWeJF518/OyBcVAL94a7/oS6zr6BYjuvpdyMepZXu7EfKwSOH9QaX4lCkTsJanjtqdMFvs+LAxAdUdkndArikaSfsiEWltgGrWB0B8HldmTSFUFdL4YiPggJg+QYZekcu9N55UqZBjVU4sVsXOg0udgdkOLSqqgSNWs8gsV/R0oyILCCtqQZKqG4W2asyeFYXl0/WID3evpwDXB/ZS1tyJf28sR4qsFeendUEdnYZonQaxOg2ya6SXKXSaFvKo1KNz23qh7FPfnLZZHCAfQ0JEiNuCY4Lmjy7culC4ltrb7Dhw8QExtsFSa5nQ7+tzse62jd/ch0xiTLVJ6HhnPzq+lFwX+8yCyEs/L9QIZUI+uxx7m2HK7OwmOzr3UPAkgz0lDZu2bMZ/Ptoovnf9qixRost4F5rBSDOF5Vo5Or7owLZZ21Dz9xoxa3i89LngTsjJOjINjvBsGD89hLp/1cLaaB3RTKYPq9151EyE8aqWaePmsrjQqQHKVDE4I8GAczP532KqoINhMuKLuyQOLrsL5feWY9fiXTDtlPZFY+XSxen4z3VLEB6ixI7Kdpz/2GYcaRzf7yCN9vSkw/BuEZpeaxStEsfTMuN5nB1VKD24G6+WOEVwTCauJ2THIbeO9l9SG8vQvTXjfciVfv7X86FJ04jWhN0rd+PILUfE/mkqDN7CD1YjcX0XztfF4toVWTgpNw6ZMVqkytux35qIp/fZcNvLhVjywOc49S8b8Ot39mNHxfiNA4eDA+ReaG4ifY6uSNUgSSfrL8/J02iR1CotyhErI6S5bVS+MyCtX9naJbKPISo5smJ5k+0NaN7Zgk0LkPF/GaJXgsqtt83chtrHa8e9uR5XBpkMQNorgcYiWEtLxFzIg/dPh9UUDpmhGC4yn3Da0drajBzUQhMRxy7HU8EwZXZUKkunos5EJV5tMMJgMiFGacHvzpuNezl7PGUkXp2IRbsXidYEGtdTcnsJdq3Y1XuYMX4na+phpOB1PFo2fLgf+36Sis5iNbRRVbA1tB7Xrfzhjw/hkie/FZ//jPe0TJ/vBtIygCPJDkRFRmFOQgiXzE4x5A8y8+WZ4sBLGa1EZ2Endi7ZiZK7SmDvHPvmmoyZyLyLHK6r2sw475+b8OG++jHp2NlYgbL/K8PeO9LR06qDylUGR0c7Tx6YYqpazfjZ/zbjYE0zjA41UiJD8d2lGcjrVotKQJooEbYg7pi9NTM1RK6IxKLCRUi8JlHMTKY589tnbkfLuy1unT4xmpa7C4/g4O+y0LFNDm1sFewNbYjUyDAvToHzUkw4ZdFMnHL+dbjxhGyRmKSz0yNNnfjPt5Wi1codcIl1L3RaSczITAYsR+e2JZU7YYcMDXonkqOVkniHlNodrJdOOPMSwkc3B2HcCpVOZd2fhbiL41B8YzFMW00ovasUcRfEQZ2gHncP8nED5AHz2HoqDTButSC0IRlmxXJg8U2IOGkXZG1HgM56dBsM2O/KwtJ5V7HL8RTPX3Sqw1HT2AXbNiPoKGRbTA/kdjNCtVo8cskJyMzmvuKpRpurxbyv5qH+qXqU3l0K0zYTKh+sxKyXZ435dyREaBCmUYpxchWtXchNCD+ulp0Nxeja1YruYgciIlNhNK5E5mUmhOqqpT5Feg+RWzkFxwN8J2gkzdMby0VCikzBMvTsiOutWaqdezvhNDnQrXahNUWGK/IiIKeP7gFrMjN1mWQ68KLRK3TQRbPmadZqzBkxiDllFH+HYapBKEj+8Uu7xazkH764CzedOB13nZYrSjCHW5NtLSYYvrUAJTRObhm6465B4qX7oegqBVqbRtQy4zmcThde2FopfD5ibFasVKmxJisMMzOpGgSo3ySN9gpfHA45emfcso59AlWMCvnP5iP+yngxlpHaJ0ruLEHMWTEiKeV2erXsaj6C7oNtMBXaENKTgvbmpUi/xoiI9IZBa7Iyfy0WxuVhYe+Pt3dZsaWsFZtLW3FS3thNgEeDA+Redvam5PNyZwD1OWLulj00FPYDUp/E4RQHops7kSevlT5kB5TnUPO4+NlENw+6Z8ZE2JwwkU2ufaxWOF0PDI47vu5AxIqIUXuhjs5BHiVA7p3HZm9qQuvmEHSXhUGhViEqtxKp18mgXnsLoD9JlAeZOw24b/cu1Lj0uHrOYv5XnAp6y3MM5TvxXm0Eog47MNumgFHrgjFehpP0VkwrWA3lNN4o+QpkipX8g2To1+lR+pNSZPz66MEFtU+QtrV52pF/XibD9Pgw7KnuEH3IIwbIvVruPlCLti2hsHXEQKG2IHZlHXRLlVCsvAlQaUd0KyfDwbte3SOC48uXpOGU48xzZ9w0S7V+L1yxYWj+ul2UvpWmOHD67CToeqqOWZOZqUUdrxZmXQlXJqD5jWZEr4nu/55xmxHaGdrjmv9Q7/F/r1+CP35cjH99XYYnNpRif60Bf7lkLuIjQvp17DS2oH2bFqZ9WihUCkRklCPxYge0l99BFr08eWAKs8Z3v7FHGC4RBZk5ODFzJaINB8X9nkoLrDVWEYVELAkHjEdYxz5IzCkxWLxvMSrurxCmfP1O11an0DLNRp+023Wvlq2V9WjdHApLfaRYk2PmViN9pQLKNT8cdU0monVqnDknSVzcBQfI1C/a0S16Rin7Oy8jBohaJwab92wthEKpRbdeC2tEF7pq9wP52ceU2hU3SOVeeWwQ4v5yizGO1SH329RbUgd9reObDhSeWChmriZclYDEaxOhm6EbpcR6+DIwl8MBWe9cRVlCPnqqagG5C2FLkhB1Qj5kbcUAGbetvEO4HO9qaUG1q1qMtEqMdK9pADM2HJDhVdNcuEo2Q+8sQ05LAiALQcxyJW7I7YZclwnMHKxjZup1TGiSNZj5v5mDvlb2izI0/qdRHHaRjuMviRdeBMMZdfUFyMfTss05Dbb2dlEOql+bjNAs2nQfAoo/kLQ8wnO8790isV5k6LX45dmDnyfjwVmqhloYduyGqjsEFpUGKYuUSHdUDVv+zviGlvVn68WlD1urDXtO2SP6guMvjhdaptaKkTbYlC3++VkzMCclEj97Yy82lrTgtL99jd+tm4G1pt41OTEfPQ31gBPQZMci+sxcKLqODFqTmanJGlNVXqhKgXvOzMdVyzIgb40VgRB9zpq2qEUWOWK+AgrzEdaxD+tYoVVg+kPTB32t/pl6HPnhEYTmhAodk5+IJmWchnpD1mRXZB4sdQ2QaWSIPCUO4QvzIaPg+ThrsqfgAHlAeTWNaBLltr1z27o+/jdU2mLoFloQ3WnGV8ZUzFp4IzRDynOKG46WWDNuYkDplOhLobIKyiLQRmmM5VHdJd1QxanEyKXqh6vFhU6u6cSL+sljz4kVZSQD5yDTwk0GPZYaC4xbjGh9vxUyYzUK7pJMYhQaJWIviBWb+P4NekTKUXOJ6Azs7H0/Lco8emrOeI/ajm7c+r/d2FlpxXTZGbhTewARUVWQx3RAPyMZsoR5XGbnRzp2khlWh104Zhg3G8Wl5JYSRCyLEDqOOjEKMafGDOpDpgDZ0eOAtdaK7tJutH/ajtYPWpF6jRPJ0yUtk8mfPFQB3RydyF4Pp+WhrN9bh7d214Ie/pdL5k1oZB0zAeLyYF5wA7a++xjm6GrgTG3HvMRUIJ5LZv1Jy+ZisziwJvOfhucaxEWdohaz0WldpmA6dFrooJ+hnsczUuMw/eT5ePaZQ4jdYUPIY5uw/fYtmD1rOkLlcujP0kOmlkGT2LtBV4yuY8YzVLeZcffre0VZPEFjEx++qOBoC0rv3tq5713IHVuhjTUjYnYSl777mY4J2iOTuSZpufzn5Sj/ZTnC5ocJHdMl9txY0QY5EJqvTPtxS5UFHRs6xP46bFobcs+X1mSNJkSMfKSxbIoQxZjWZE/Cq/uA8uqFGQMCmrg8JDzyEMy7DiMk2YaXnivCLqMOczv0WDMgg09ZRzKFIbjE2k30llvQiZJwLiVzFuo/q98rsgjDzaEejqRrk0SJF4mw4dkGsUE2HzSLS/3T9YjYH9EfIJ+3UYWT9zvw9U+/Fi6cA9HFt8Bu6IKyt4Rv6Mw4YdxmOjqPbUel9H5aNPD9xHiFHpsD1z+3XbjKUz/qTevOxFkLroerrRqWslbIcmKPe1rK+JaOqaRrzttzYKmzoPG/jah/th7dxd3o+KpDunze0R8g58SH4fdPhSLKYsA3V3xzzO8yft2K5AzJ8EkulyNsbtioWh5Ig6FHjKAhfnRy9uD1gvE4/7fJjjf1Z2B5rAn/uDQHsox41rKfaZnMf5YUL4Fhk0Gsyc2vNotDrOZXmsWFMlV9AXLLOy04cusR2JpscPZIpntni/8qoYvvgb3ehBd6mrF4GjAnNXKw/8soOmbcDx1ivLi1Cr//4GB/1vhnZ+The8szxQivQcTlQX7STxAzvwrdB1ugnBHHOvYzHRPTfjcN6T9LF6MaScuGjQZ07uwUl7on67DasBp9HLj8gFirxXSIIR5frvp6uNZ2Q9ZrwhhWMPY12dNwgDwgg3xMxk8uh3aRNBs1J8+Fndursb2iHWtmHO05I4MW6kXT69SICx9/eQEzTOlHb7kF4vL7x3qQOQviwqUSyGHmUI+EXC1H3Plx4mJtsYrsEy3O5JBL2WQiVKWE3iBDpEEGF6lXDnHKrc3XCrOR2BMToaj+tt8k5his5n5zCXLP3V3VIb68kMr1Ga/y4AcHRXBMenz7RyuRFiP9G8tiMxEam8n/Gn6qY/GjyRqxIKfdnQbzATMMmw1Cy7rZRw+spkdroWw7+vvkoXJoUjUi20zZqehlJmDnJ2PS8tANIJV4Uv8xlXveuiZnwi8NM37e3FWDN3bVQC6T47YbT4d+2tGyXca/tEzl1FGrosQl5x85YroA6di4ySjKrfuw1FtEpqkPVawKIVkhiD41Gl0FWjQcDoHM0oWvDruwu7odK6fHIichTMw8HknHjPupaTeLz8ZNJb1Z48wYPHzxgKzxcMjlkEVnQruC12R/XpOV4UokXZckLj3VPf06dnQ7BmWPzUfMInNMkMEXVY1QICxaMFYlQ1a8cdxrsjcI+gCZHE8P1ks9xIt6A5rO/Z1QRikRknq0f3RBejRe3l6NXVVHZ90OKq9mgy6Pzbzsh+4fr9xilN4KdaxalFXTZSCUQX5nlQ1blrrwxn0niOB4kKkX/c5uySRGfJAMfF59cxV7TWK2lbaJ91RsmAb5/J7wKp8eaBQW/8SfLpkrguP2L9pF+R4dlDCBoWPaYNOsRrok35g86MfSY3X40Y1WGO12PPaTpZgzM2Zwf6MzFqgcm5YH8tqOGmw43Ay1Uo6/XjoXqoFOuoxHKWvuxB//ux/pHXJceGU2lnJwHDBapoxx9MnR4jKUuAvjhCkQtUmpk9VHSy7F78zEzG9Wo+bAFnzcqBAHVx/sr4e+XI05yRGYqaqHOm0+G7d5EDo0fGlbFX7//kF09Y45vfv0fFyzYpis8QAMWwwi+aCKUnny6THu1vFxtBySFoKQy0KQcNmxppUznp8BZ7dTHFaTnvtbmvp+Z+v412RvEPQBcmFVh5h/PNBQ6ciPj4hyAfpHTbhC+sdekBElrvfWdMDmcPZvkNjB2s2mAMPMrx1zucUEeysoQG6JdKFNZhMmA8cYhgwwiRGnbPRBQs+DTrZIvANMYj472Ch+ZE1+/KiLBONeqPz1p6/vEbdvWJWFk/PiYT5sxp41e8Rp5ZJDS6AMC/qPO+9peQp0TChUcuiXRuLAkRbsMXWiQKafsJYHmjj+dv0BcfvOU3PFCBrGO1jsDtzyv91Y/a0cZ29VIyVGBpzCr34waFkdpxaXYZHLoZi5DhnGWlwX1YK9Rh221vXA0tWB2iNlOCCLQLUjG/NjmrBsuh4RIRyMuTtrfM8b+4RpGrE4Mxp/vGgusmJHH3dHzsdF5xfBbrRj3oZ5iFg0TMaQ8T0dT1LLupmjVxOMd032FkG/Y+zvF+0tr6bSW8MGA2hgauQJR8t9psWGISJECWOPHYfqTaLnZWAGmbOFozAeYQ2ZeTnmcotJ9Fb0uVjTQYnF7kSIasBJdR+95hL9/x/0QTJkriKdqPYFyDz6xXs4nC7c/spudJil8te7z5DaImi4PRG+IJyDY29reQp03Mf8tCh8c6RFHH6Sc+pEtNwHafreN/fBZLFjXloUblw9bQIvGjNRyAn3SKURN++VWiWiT5QOqpng0PKo9OpYefA9LNAcwewIJ6qNSmxoy8eLxjkoLVICRTuFod7ctCgsm6YXLveZsToRyEVrVZMfTxPkWWONUi7WW8oaD+oBHwHqV6VSW6oIOMb/gfFNHXtRy2NZk71J0AfI/Y7DvYYrNY/USP9eF8YNKrGmbOD89GhRZrezsq0/QKZ+R2LEmZvBzniFNWDm5ZjLLSbZWyGcy3uhWcjDBsgEPU/6HSOc1FE1QU17t1g0VmUPLuNmPAf1JtKsRaoEeOTy+aIM1m6wC+MIIuXWFH75va3lKdBxH/Q5TVBf4ogcR8vDlVb/6eKCMW0CGffw5aEmPLupAicWKaHrlon+04Ejg5jA1/JxGaBjtbUT09VhmBaZirnVRry9uxabSlpQ1tIlfEH6vEH6IE3r1Aqx/tPaQYHzU99bNPHnEgQO1XRY2Jc1pj3zwxcfP2s8kL79dfIPkyFXcZuKz+t4irQ81vFTnkYZ7JmngYZK1mYrGl+UMoCptw2eqSs9RgqQd1V14JqVQGunBS2dkokEB8jDMBFhTaTcYpK9FbTppcWSDLbMNgdG9aalvztCf8ZnB6T3zuqc2P6sNOP5E+3/bK4Qt2/5Tk7/Yk1Ox45OB7QztYhew27DXtfyFOi4D8oWEWXNXTCYbYjUqsatZaLewKXVU0WzySK1TLiASw5S9tiBlFtSxLx7Jni0PCaG6FjWu1frc5mnsX8UKNNer6KlCxWtXag39Ij1ni7tZlv/02KGe7uQQ7U013hgr/HVY8waD+w9Nm0ziRm3yT8Y7B3B+KiOp1jLU01QB8iHGozCUClcoxQmWzUPVcFlcSF8UTgilh9bgkBGXUSfUVdfeXV6jJbnYQ7HRIU13nKLyfZW9PYh02LZbbVjonx6sElcD3Q5ZzxLYXUHiuqM4oDjssXSyafL4ULtP6Ty6tRbU7mMbqq0PAU6JmJ0amTqtahoNaOwpgMn5sZN6ODll2/t59LqKYBe+7tf34OWTitO7wyDrsoBuU6OxGsTp+LpBB5+pGV3QP4ylyxKE5eBlWKU3Oi2OcRYIrPFDiUb7x1DZWuXcKimCq0+h+o/XFQwrqxxH7WPSGtywuUJI/eWM76lYx/TsrcJ6gC5r7x6XnoUZLSpfqy2vyRzuN6UuWmR4n1HZbRNpp7+8mp2sB6ByQhrPOUWk+mt6EWrUqADNrFYTgR6P+yp7ug36GK8w3+3SK7V6wqSEa2TFl2ad91T1iOc6BO+y4cVU6plL+t4YJm1CJCrJhYgv7e3Hp8faoJKIcMfL+LSam/y/LeV+LJYKmu/pjQCFhiQeHUiu94GqZY9AVV49Y0AZIavrqTKrIc/LhaHCKPONR4DllqL6D8muOXJj3TsB1r2JEEdIO+o6Os/jkHX3i7Y2+1QJagQf8nwAU54iAp5CeEiMN5V2cEGXcdjssIaa7nFRHsrBtBXEj3RAPmL3uwxlXfGRxztXWc8R1uXFev31ovbVy0/+j7p2CAdVCTdkASFjkvdp1zLXtRxH2So9dbu2tH7kEegvcuK37xbJG7/6ORsbp/xIocbTXjgg4Pi9i9OyoXrWalthcqrmeDUMuNdSpo6RQUHtRISy6bF4I8XzkW6fuIHCh1fd4jKEBq5SKO7GD/RcZBrOagD5H6DrsxohGeHY3ntcpgPmQcNuB4uM0EB8u6qdh7x5CvCcoNNfJ9RF5VeTYR+92rOHnuN13ZUi7J4cq6e22uaR2T/KVvKOOl5tIdfadmN4x7mp0f1l+DTxmw8brU00qm1y4rchDDcfFL2xP9/mHGPdLrt5UKhacr6f2/NNLjKs2DYZIAuf/wlnUxgaJnxDjS+9KlvyvC3z44IDYZplLjnzHxcsSR90iMrqaw66sQo2Nqkfm8muPbX/ooymB35yLxBKZeJbANBg8sjlx3daA8HGT/8b1sVdlS2i9NugrLKzBQLa5I28ZPJIFNQTWNlCB7v5D3jkBe2SuXVNMpnaAAUNifwyn2CQstuGveQnxghSnRp9BeVWo+1Z+6r4ia8ubtW7DX+cGGB+B2Md6CN+cF6o+ghf/jiAqFpmVqG6JPZZC+Ytcx4nv21Btz9+l4cqDeK+yflxeH3589BclSo2/6GJlkjLkzw7a/9laANkDeXSgENBcfKNgeQNLaXYkFvZoKMuuiQRq2Qi/EAjA8IaxI28XRaSph6xn/CSWMPaH4ymYHwPGzvQG7y1W3diAxVYd1cyRHTaXXCYXJw5tjfteyGcQ8U2FJlAVUJUbXPWAJkMmz8xVv7xe1rV2T1j4tiPM+OijY8uaFU3KaNeZRZDpfWxa7VnsKPtMx4jh6bQxxMUeaY+o5pPf2/tTNx4YLhfXgmgqXeAk0SB8bBvL/2V4I2QN5U0iquV6bGYPvs7WLG4uy3Zw+afTwcfQPm+0YDTI8Pg4rdD31HWBO0idf3GTx1Wcf9s58ekObtnjozgR2TvWzOdfHC1P7sf/MbzTh07SGk3pKK6Q9P99ZTCS68pWU3jHugw08KkKnM+oIFx47tG8rvPzgoqopSo0Nx1+m5k/rbzNjpsthx56t74HQBFyxIwRmzE1G4phDdpd2Y8Z8ZojSTCW4tM55JEv38zX2iwoY4uyAJ962bhbhw9wWzpOGtuVsRfWo05rw3h2cfB+n+OigC5AcffBBvvvkmDh06hNDQUKxYsQJ/+MMfkJfnX+l16knbXCoFyEsOK2Frs8MWZhvTKRedqlFm4YtDkikTZwwDQ1ixvYsCzd8cDzRn9b09klEUbewYz9No7MGXxZL+rlx29D1V90SdGNOmCGNjrmDW8tA+5L5Z96PxzZFmvLS1Stwm1+o+TwLG85ApV1WbGcmRIbjvnFkwF5vR8UUHIIc4uGY8iJ9omXEftGd54IMDeHVHjbifEKHBb8+djdNmuX//UvevOsAJyOQyDo49CevYI4zriGHDhg340Y9+hC1btuDTTz+FzWbDaaedhq6uLvgTR5o6xQw8Gnge8obUc5H8/eQxl3P1lVlPeMQTDfhurwQai6Rrus9MKbFhmgllkF/eXiXGINBBydKsGA89O2YgG4+0iPYGMubqK53tOtAFw9cGQCG5V3sN1rLP0lciTX2tVEo4EtRW8bPX94rbVy/PwIrpsV57jsEOHXT1HUz86eK5iAhRoe7JOnFff7YeIeleCpBZx0wQ8NH+Bqz5y4b+4Pi7y9Lx6Z0neiQ4dlqcaHhGqq5Lvklqg/IKrGXGTYzrmPyjjz4adP+5555DfHw8du7ciRNOOAH+wuYSqf/4NEUUTN8aIVPKkHjd2D8gFmQc7U0bt0FXc/HRfgGaYUb9AuRER832Adro7g/Ehkkl1i3jyCDbHU4xs5O4dmUml1d7ib7qjxXZRwOZvk117LpYaFK81O/EWvZpKCNJ5YJUFUImNIsyhz/AeuD9g6gz9CA9RoufnZnv9ecZzJmse97Y2//5SXp2dDvQ8JyXN9WsYyZIqDd0i+TQ9DgdHrqwAItH+Ex0B9TyZGuxQZOqQcxZXkoesJYZNzKpOjKDwSCuY2JGfvNbLBZx6cNolDK2U8mm3g32Sbvpf9+C2PNix2UiMDc1SpjAUIA0I2mY+WOjiXfLE4C5FYhMkQZ80wwzsmknJzpqtucgeUozyLR4jJVPDzSKnkVyXT13XmDP6fQVHVN7xLe9BnsrpuvFtaPLgYb/TMGmmrXs04h2mLQofHKgUZRZDxcgk9nby9urxe2Hg6S02le0/Jv3itBotGBarA4/O0M6mGh+rRn2djs0GRrEnO6FTTXrmAkiHX9veabwzLl4USo0Ss+2IlHLE5F0YxLk3pgGwFpm3MyE37VOpxO33347Vq5cidmzZ4/atxwZGdl/SUub2mHS5NS3pawVaisQ80W3+FryD8e3qdZplHjyqoX45xULkBgZMvayD8ocU3Acly8N9pYrpGu6T18/tJ7Lrf0oQH5mU7m4pjmBIarA7nv1FR1XtppFtk+lkGFRhrSBbnq1CQ6DAyHTQoQZiMdhLfsN83rbYd7ZU3uMQ/2+GgNue3l3fwZz6TTpwCXQ8QUtf1LUIMZp0XjVP10yt//zs68SZDwtTxOGdcwEmY4Vchm+uyzD48Fx18EuGL7xYssTa5nxpQCZepH379+Pl19+edTH3XvvvSLT3HeprpZO66cKKrUz9dixqlwNdDoRMj0EUSeN3yXz5Lx4nDlnHMInhzkqq6bM8VD7fLpPM8yaD0uPY6asxJrcyW0O55jeR9sr2sUc7auWB77Jia/ouK+8mvpL+9yr+0oyaSEmMxCPw1r2G86ekyRGuO2vNeKyf23pN+GjMX1XPL1FzEkmt+u7Tw+e0uqp1nJ7lxU/7x2ndeMJ07Cgt1fcfNgM42aj2FQnXusFw0PWMePHTLWOR6NvTdav1Xtn9jFrmfEAE6on+/GPf4z169fj66+/Rmrq6OMzNBqNuPgKfRts5boozL4mCy67yzubarJfp55jKqseDhrwTTPM6HGM14nSqkU2g0aN0AYuPiJkTNnjs+YkIeE4jw0EfEXHm4eUVxMzX5mJxv82IuHKBO88Cday35Ch1+Hl7y/DNc9uQ1GdERc9sRl3nJKLX7y1D11WB5ZkxuCZaxf3H7YEA1Ot5V+9WyQqdXLiw8S/RR+hOaGYv3k+TDtM3pmbyjpm/Jip1vFoZP4qE9oZWmhztN75g6xlZqoDZOr/u+WWW/DWW2/hq6++QlZWFvyNvg328rxYxK70olspzSYjQy7qOaay6qFYzdL36XGM16HSoxidRmzcmjstowbIlIVa3zva6bpV/qcBf0XqP+416BrgNKxJ1CD9p+neeyKsZb9idkokXr9pBa56Zqso0b/9lULx9ZXZejz1vUVB0XfsK3y0vx7v7akTn7fkWj2wNYV6xiOXR4qLV2AdM4xHUOgUSLrGi9MkWMvMVJdYU1n1Cy+8gJdeegnh4eFoaGgQl+5uqZfX17HYHdhe0SZue32UBw3uJrdqMuOiGTUDofvGWiAuV3ocM7VO1p2jj3p6e3ctrA6nmLNK5ZmMdzjc2CnGcNF4til93VnLfkdmrA5v3LSif279SXlx+PfVizk49iJtXVb88m2ptPqmE6dh7lR/drKOGSYwYC0zUx0gP/7446LX4aSTTkJSUlL/5ZVXXoE/QE6mth4n7n8hFKp/NsNusnt3kDeNctLqgeZDQI8RcNqla7qv0wP5a6XHMVMCjYQZy6inreVSFvOs2V48IWX6qz9oNAW5yLe804LCkwvR/Hazd18d1rJfQlUhb968Ai/dsFRkjgPdWM/XuE+UVluRmxCGW9fkDPregSsOoPimYnRXePGwnXXMMG6lp6YH2+duR/Vfq0XFl9dgLTO+UGLtz1D/cUGZAum1QNv/CpF5Uxdgj5BOn7wRmNIIJxrl1DcHmXqOqaw6ea4UHPOIpylFr5MyyK1dIwfITqcLOyvbxe1FmV5wTGb6GVpeXf90LXp2F6Pn2wbgxBne0zHBWvZLqJx64Pxsxjt8tL8B7w4orR7oomuptaDplQaEhDcj/dpOIDKW12SG8UManq2Do7IMnZ9UQXaNk9dkxq8JmuYrCmyo/+nKigakr9qOuBPaId+kkgJUKn2m7K43AlT6G3oqta6WjAWod8KbG3tmDKOeRi6xLmvpFE7XVOY7Kzly8JgB/jf1+Hi2PoMua9E+6Az/QtzJNYjNDQO+DPOujgnWcmDCWnYr7QNKq39wwjQUpA4urW55djPSV7yByJlNCK3UArW8JjNugHXsVVyNhyDf/jgyT65A5PIQ4MtPeE1m/FrLQRMgf3KgEdqKw1iT9CnUoUZoZs0G9FGSaVb9Xqk3mLK73thc0z9sdOCPBvI3YsdQYr2jQsoez02NEmW+/QPq+6oCyKnc24cuQcCBOiOMPXaEhygxS1UP8xt/R1hCDVxhKVBmZk2NjgnWcmDBWnY7968/0O9afdspOcdsqhVFTyEssQ2a3FxAH89rMjN5WMfepbkYlrcfQYimDNaeeGgKsgF085rM+LWWgyJtSaXhj35ejGvbd4rg2BGSA3WSHpArJEfpuHzA3AocWi+dVDBBnUEmF+uRoNnHfX2w0oOLgS1PSAuBNkaqDqBruk9fp+8zbus/XpYZDcXh92Erb4C5OR3aggTWMeMeWMtu59MDjXhrd60YoffwkNJqWmt7Pnodcnsbuo0Z0M5hLTNugHXsXWjPfPA9WA7XiTU5JDcOco2K99aM32s5KALkL4ub0FFfjgJLPSzGOITNl5xM+5HJgIgUoPmwlMZnghJ9r4t16ygl1jsqJRf0hdR/3LswiMMVOmShwxY+dPHo/PJTU6ywHSiCuS4aMrUcupkD5oqzjpmJwlp2Ox1mK37+1j5x+8YTph3rPG+ohmXvfrEm62aHQa4asB1hLTMTgXXsfQzVcNYXw3SQxpfKED5wf806ZvxYy/JgyB4/8nkJ8pot0DmtcLpCoJs1YFPdh1orpe+pxp0JSuL6e5CHzyA3mXrEHFX6zF+QHi0dplDZR2SKtBAMhBcGtzHQGG1hkgo9ZQY4rBqhY7l6yEcY65iZCKxlt3P/ewfEzPjpcTrccUruMd+3dxhgqzMKLYfNDTv2F7CWmfHCOvY+1k5Yyg2wd6uhilNBnSIlGvphHTN+qmVloDdzb2wOQWF1BxaHhEIZHYEIheLYTTVhNUu17dQAPsbfzeZagVliTbN2KSiTU13gAHb2llfnJYQjMlQFdBilUyylBnA5AU3kYCHTwkBO5XzoMjF69VbT0IQoaz2cqnhkJCXAlhgO7XQMv6lmHTMTgcbtsZbdxmcHGvHmgNLqEIUMaK8ctHa65DqE5ETBpQM0adJn7yBYy8x4ofeXrRtw2ICuJkChHrwu85o8OYbbA6vDoIjWIWy2HOqUcMggG7+OR/rdbF4bvPRM/ZqsDPRm7uqyEEyXzcLs05YjJrpJql2ncVUDX2i6b6yVxi2RKMf4u9mIKbCI6R3zRI7JHd22/vt97Bg43oneD3tfAVoOA62lgCpUmnEdlwtoY8e3MDCj6k3e3IY7lGZYIqdD6ciCctEchKbsBeKGbKpZx8xEYC27vbT63r7S6tXTsCC0Cdj472PWTlX+2VCdsgDhYk0W1ZlHYS0zE6GzCWgrA5oOSns8uXLwusxr8sQZaQ+cfzbUM2YhNorW5CHti2PR8Wi/m41Og5Nm39hfKwOumZtOHCglr9KhvrkFkR1FuF5Zg1PnLAPC10kut82HpPQ8nUDQi0wC1umlWcTDnVgN87unzDWX8RjkSk2ZYUO3Da2dlmMD5Aqp//hkfTuw5S2gqwUITwTM7ZJQOxsBixFIXQSE6se2MDDH1VupU4N2VyNWKKuArf8Cck9nHTPufa+xlt1eWj0tToc757tGXztZy4w7tVz0DuC0AS47oE2QbvetyykLJZ3zmjyx19YTOh7L7+b9dXDR7DtrsjxQm7ldcjm+rrLgCFKwxGJB2LfvwaXPlsSWVAB0twGtJdI1vchLRwhyfaBRnPEesb1GXUOdrM1WO/bXGSGDEwvNm6R/9/gZQMKc3sWAyoLCAWsX0LAXaD54/IWBGZPeGjrt6IQWcl0uzHuqYS/bCyz5PuuYcd97jbXsFj4pajhaWn3hHGiOfDDs2tnVmoae0jo464tYy4z7tEz7uYyV0nuNbhOhMVK5ZuVmyQGX1+SJvbbD6NgVm4euXdWwFBWOX8fH+d28vw5CnL61JisDtZm7tKkT9cYe6OwKaPZFwXBkGzCzBKHz8ySr8L5eB5VWqu2iEyvqkRra9zCeRnGebRwQfcilzV1oGeJkTX3sVHo9P6ITkV0VR98PulggZZFUCkKipl4JUyOQtgyY/12uLBgvQ/TmdLnQbOoR34qqcaJ1Swi0NduhX3YpsOrOwT1LpEU6VWwsOraHiXXMHOe9xlqeHG1dg12rF0Z2Drt2uuBC++cdcHWqEGvfg9C5Fw3WMq/JzGS0TMHVwDXZaZJKreUqYOa5vCZP5rUdsge2VFvRtjkE6qItiF1xKRTjWZOP87t5fx2EGHxrTQ6MAJnESH0LVJpBPaQuFzaWSGNhltq1cPTIoEs3IjTZLj2eBErBLKXy978xet/DkN99DGz6EFDEhvc6WZsGZ5B39M0/TlZDNvT9QCKm/giLQTIIMdYBBZfwQjwRhuiNDNPsThfUCjkcB3rgsIZAm2mTHtenY4K0vOlvI2uZdcwc573GWp4c//f2fnGwmBMfJrlWtx0adu201Fhgb7VDpg6FJtkyWMu8JjPu0PLANdlulbKS1J8cFs+v72Rf2wF07ukUa3JophkKmXl8a/JxfreA99fBhdW31uTACJDpZIrER1lgTQT21xrQ0W1FqEqBmBIXXOoehGRGDm7mHmvfw5DffQxs+hBQxPb2Hbd2WYY16MpNSwQMw7wf6LQrhOZ8yiUxD/deYY7PEL01GqXscaZTA1uzDUqtBZqsiPFrmXXMHOe9xlqeOO/tqcP7++qhkMvwl0vmIUSlGPH17drTJa7DZsogDwk9qmVek5mJMtx7rX9N7nXEJaMfNsx0z2tL1bA2J7oOdEFB++ss3l8zgbcmB0ZzJJVt0MmUoRZWuwNby6Ts8YqoKNgbrAiJaoVmQcHRZu7x9D0M+N3CkW84hz5yVmMjpoAa9dRiOlpiTaXVu3oD5Bn5M/n94EmG6K0vQE5rovIrF8LzTZAn549fy1TqxTpmRnmvDYI/28cMzYf/v3f2i9s/Ojkbc1IjR3x9nXYnuvZTgOxC+HTj0bWT12RmMrCWvf7amg+Z4bI4oU1qh2rWbN5fMwGn48AIkKmsg8o2tHpUHNwJuc2EmBAFUhu6oI2rgjw+HooF50ysH3HA7xYOfXQS6bRL13SfjZgCs8R6gEnXoQYjOi12hGmUyE+K4veDJxmit86ONiidDkQ2GIWW1dnJg40Zxqpl+mBlHTOjvNf4s338uFwu/Oz1vegw2zArOQI/Pjl71Ne3u7gTMpcJ4Rm1UGUmHdUyr8nMZGAte/21NRc1ijVZlZkI2YwJrMm8v2Z8XMeBESATcXnoKLgO77fEI1rWiVPjTbBVNqCzPhvyVT8cXK8+lr4H+n7fAGr62fG6XzP+nUEeECBvL5fcMOenR4kSQn4/eJhevdkT5sDZ3YZ53Y1Qy40wm3KhueCWiWuZdcyM8F7jz/aJ8cLWKnxZ3CxG5FFpNV2P9vrajhyESmsC0uZDNnB8C6/JzGRhLXvttXXUHoazqVnsr1XrJrEm878b48M6Dowe5F62mOLwiHUtVsZ246wF03Hwr1UwN+qRef6SwQ+cSD9i3BD36+Ec+Ri/R9875mmgi/X2XoOuJZkxRx/I7wfPEpeHA9Ovx58/jsPaSgeUm8Khv2Iu5Il5k9My/7sxw7zX+LN9/JQ0deKB9w+I2/eckY+8xPBRX19XexVq/7kdpp1OzL7/TCBugF55TWbcAWvZK69t5zd1qN5VB0VyBqYtnDf4caxlJkB0HFABcnlLF1yQIzY1B6GL5mN+0QJ0l3ZDrpYPX+dOJj5x4YPLQPrq3IcbQD3QoY8JSOIGZJCpfJDYViFlkBdnDQiQCX4/eJQ9tSbUuOJwYG0cfvLMfLgsQ3pSJqpl/ndjhsLviXFhtTtx+yu70WNzYnVOLK5ZkTn6D8jlkOkzMevzTJiLzdDmaSevY/53Y0Z4r/E+zbOvbeQ5GVh4uhOW+sFmpgLWMhMgOg6o9Gd5i1SykRUrZYtkchm0OUMWYh+sc2d8r8TaYneKvuPKVjOaTRaoFDLMS+t1xGS8wr6aDnFdkBIJVZQK6gQpuz8I1jLDeJ2/fXYY+2uNiNKq8KeL50JOrSdj5JjgmGAdM4xfIdfIEZoZOsw3eH/NBAbyQMsgE9PkGuGW6S917ozvEKpWQKdW9JdZ92WPC1KjpNEljNfYW2NAlEmGgj5X3JFgLTOM1/i2tBWPbygVtx+6YA4SIkKO+zN2gx32TvvoD2IdM4zPY6k7Wl03IqxlJgAIuBJrQv9QC769vBp5/85D7NpYn69zZ3wLfZgGXW1mUWbdZ9C1eGD/MeNxuq0ONJV14i+Ph0K7tRqOb+KgCB3lgIK1zDAeh6ppbn15t6h6vnRRGs6YnTSmn6v9Zy0qH6hExv9lIOOeUcrmWMcM47NQYLx71W5ABsx+ZzbCZg/w6RkKa5nxcwImQDZ020TGL8wM2L40wWV3IXTaMOUfPljnzvgWsWFqVLWZ0UoBcm8GeUlW9FQ/raDiQL0Bi4oUkLtkUKsVowfHfbCWGcZj0Dz4O14pFEFybkIY7jtn1pg31Y0vNMJpdkIdP0ybxFBYxwzjkxi/NaKnvAeKMAXvr5mAJ2BSpRW92ePvVISI4Dhsfhh0M0ewmWeYMfQhH6g3oaLVLPxiFmZwBtmb7Kk2YEWRdH6X8N0Er/5thmGO5bEvS7CxpAWhKgX+ecUC0Y4yFjoLO2E+aIZMI0PchXH80jKMn9L4YqO4jj0/Fgott5wxgY1/ZZCdzhHLoStapQB5+QH6X3Ih4UreVDMTIzZcCpA/2l8vrvMSwhEZquKX0ws67qNsaytOaVTApQDiLuFNNcNMdd/xXz87LG7/7rzZyEkIH7OW+zfV62KhjPSvLQfDBAVj0LHT6kTTK03iNh9aM8GA/6xWzcXAwfeAliPSkHGabUpjIciNOi4PZc1diO2QIanUJfoj4i+Pn+pnzPgpsTqpDPBwo+SKvmToeCfGYzruK8mUrzeKAhf5CeFQx46hLJNhGI/2HTtdwEULU3HhwtSxa9nhQtP/eFPNMD7LGHRMtH3cBnurHepENaK+wxM9mMBH6TcC3vIEYG4FIlMAlQ6wdUkzEw21wo26vMWMZQel/52ok6OgSZaygAwz0QxyH2zQ5T0d04Jc3WbG7ELpR6Zdm+yuv84wzAQN86jtJCpUhfvPnTUuLXds6IC1zgpltBIxZ/BBI8P4FGPUMdH0knTQFXdpHOTKgOnOZBg/DpCp9INOt0jAcfkQDaGEJgKIC5fmFh9aj4rmxbhYlFcDCVdweTUz+R7kPjiD7D0dk6v87vX1iO+Qw6oGki/gShCGmUrS9Vq8dfMKtHZZoVUrx6Xlvuxx3EVxYm4qwzA+wjh07Oh2oeXdFvFt3l8zwYLvB8jUF0GlH3S61SfgPuh+RApczYfR0xqPp9bG4i+6TMReMMpoJ4YZR4CcHqMd05xPZvI6RvNh8bitqi4cPrcHZyfEQaFjIxCGmWpoBnxKVOi4tZzxywyEZoeKqi6GYXyIcehYHpGOOevniDLr8MW9/gMME+CM+0j366+/xrp165CcnAyZTIa3334bHoVMA6gvgko/hkOthaXHDJm1EzWJTsz5Wy5U0WyoxEwcfdjRnlcur/aejsX3rZ3YUteOHfkOpN/e2+vIMIxfajkkIwTpP0tHxJIIbz9LhmHcpGOZQobok6Mx/aHpYt/PMMHAuAPkrq4uzJ07F//85z/hFchRj0wDqC9iOKxmmOwKdCEUqdFaaJSccWLcl0Hm+cfe0zF9v8WmQllLlzjAXsSjtRjGb7UsHscwjG/COmYY9wbIZ555Jn73u9/h/PPPh1cgu3ly1CPDAJdr8PfovrEWDW3JOGN9ElY0cSksM3kiQpQI10jdB0uz9PySeknHiMvFrge7cc4mFRaHhCNSy5UgDOOPWnZG5mD/9QYx4omcrBmG8c81uekTDY7cegSmQtNUPVOGCcweZIvFIi59GI00vmUc0Cw2spsnEZNpAPVFUOkHnVKTgHV6VG2ej1X7NWhkk0zGDVAJ0T+vXIB2sxWZsSOUHwUZ3tCxc9pZkP2nCRd0qVF4Ovc5MYy/armtejla3mpD514z4q9goz2G8UcdI38t6u5rQMcXHVAnqRE+j9dlJnjwuK3kgw8+iMjIyP5LWlra+H8J2cyT3XxSAdDdBrSWSNfJc+Fa9APIP5EWYNm6SPf/DzBByQm5cTh3XspUPw2fwdM6xtKb0LYzDqouF9rDnMhdy070DOOvWq5/U+o5jr8snnsWGcZPdWyxZ6Ljy45+LTNMMCFzuYbWVozjh2UyvPXWWzjvvPPGdcpFQjYYDIiIiBi/LT0575G5APVPRKah/UsD9pyyB50hLkTsmIkTZvHGmvF/SCe06E1IJx7A0zqm0+zCi/ej4/UWfLzIhju/OAFxQ+ZRM4y/4Ws69oaWbR0ObE7cDJfNhcX7F0M3i6twGP8nGNfkmr/XoOT2EkQsi8CCbxe4/3+CYXxYyx4vsdZoNOLiFqgkJDpj0JcaXmoU1zvy7Lghmcs/GMYfdezocqD9/VaQP2b1ChUHxwzjp1pufrNBBMe6OToOjhnGT3VMNP5P2l/HX87ZYyb48HiJtSdxWp1ofqNZ3N4524nkyN45jQzD+BUt77VA1u1CY5QTaSdET/XTYRhmgjS93CSueVPNMP5Ld3k3TFtNIkqIuyRuqp8Ow3idcWeQOzs7UVJS0n+/vLwchYWFiImJQXp6OrxJ2ydtcBocomfRNj8EcrlvzWdzOByw2WxT/TQCCoVCAaVSyX1tAbqp3jbDjlXTfMs5nLpQ7Ha70DPjPlQqldAzEzhYG60+3bPIWnY/vCYHJk2vSGty1ElR0CT6VrsT69gzsJYnGSDv2LEDJ598cv/9O++8U1xfffXVeO655+BNqIzLmqHE9thuZMb7lkEXHSTU1NQIITPuRavVIikpCWq1ml/aAIA0Itcr0a12YesMO+70odFaVqsV9fX1MJvNU/1UAg7ysEhNTUVYGM/LDRSsTVZELI8AHEBolm9VdLGWPQevyYGHIlQBdYra5w66WMeehbU8iQD5pJNO8pmgL+78OGyUNeDVjQbc4EPjeCjTRMExvdHi4uI42+km6H1HH47Nzc2iciEnJwdy6p1h/D5Qav1ZLG6JLkOCPhQpUb6xsXY6neJ9RqeqycnJ4kCGnivjHi2TjulzknTMmeTAIGxOGBZsXACnxQlfgrXsGXhNDlxSb0tFyi0pcNl9Y79PsI49B2t5Cky6PE15qxl2JTDNhwJkKqumNxsFx6GhvrHZDxTo9aTSzMrKShEsh4SETPVTYtzAe3vqhI5X5vhW9pgWZHIGpcMuxr3Q52NFRYX4vOQAObCQa3zr4JK17Dl4TQ5cZHIZZGrfORRmHXsW1vJgfGsVGwfGrUY4uh0ob+kS97PifCdA7oOzTZ6Bs8aBg91gR+OWdqzfUy/uX7JoArMcPQy/3zwDfz4GFp37O2FtscKXYS3z68qMDiV3OjZ2wGn3rSqQgbCO+bX1Bn4ZINNImMLvFGJT/Cb0VPSIr/lSBplhmLHR9FoTDi7fg+tfUyI7PgwLM9jBmmH8keIbivFt0rdoeadlqp8KwzATpGt/FwpXF2Lr9K1w2nw3SGYYT6P015EwTrMTzlQVWiJcyIkPgz7Mt1z2mADB6QQM1YC1E1CHAZFp0sxAxq3u1eWJTly2OI2zioxnYB17bSRMxLIIz/4xJrhhLXvFvTpsfhjkKt7rMMGrZb8MkJtfkWYfly1WADLgxFye0TbV3HfffXj77bfFyK+AobkYOPge0HIEsPcAyhAgNgeYsQ6Iy5vqZxdQI2F2z3LitwtSp/opBT2sY2YiNL/a3D8SRp3A0wV8AdYyM5Hy6v455pf6lnt1sBKQOvaT/bXvhOrj6Fls/bBV3F6fKvUfn8ABckBAhj3Ul+gTHwQk3i1PAPV7AW0MoM+Rruk+fZ2+z0zuJX6jGXACZUkOLFydgBgdb6wDAdZx8GadfG0kDDM5WMvBReeuTvSU9kAeKod+ne8YZjIBpGM/2l/7XYBM/U0uiwvKnBAUhvZAo5RjSVbMVD8tJtDKPuhky9wKxOUDmghArpCu6T59/dB66XHMhKl/qVFcb8234/IlvmfOxfg5rGOvYD5sRufuTsiUMsRdwNVcjAdgLXv1oEu/Vg9lmF8WmDK+jtN/9tdyfxVw4yqNKK9eOk2PEJUCvl62Yrbap+QynpnVzz//PPR6PSwWy6Cvn3feebjqqqvG9Dv++9//IjMzE5GRkbjssstgMpn6v/fRRx9h1apViIqKEn9n7dq1KC0t7f9+VlaWuJ4/f7447aKZ21MC9URQ2UdkClntDv4e3Y9IAZoPS49jJoSl1gLTZqO4Xb9cjeXT/OO02h+0zDruhXXs1TU5+pRoqPQq+AP+oGOCtdwLa9k75dWv+l95tT9omXXsn1r2qyMiu9GO9k/bxe0vs3qALuCEnFj4Ot02B2b+6uMp+dsH7j8dWvXY/pkvvvhi3HrrrXj33XfFbaKpqQnvv/8+Pvnkk+P+PAW71Cuxfv16tLe345JLLsFDDz2EBx54QHy/q6sLd955JwoKCtDZ2Ylf/epXOP/880XZB9n2b9u2DUuWLMFnn32GWbNmQa2eopJbMgygngjVCM7oai1gqpMex0yI5reaIXMBh1McOPPUTL8x5/IHLbOOe2Ede69VguZaX+o/2WN/0DHBWu6FtexxTDtNsFRaoAhTIOYs/6nK9Acts479U8t+FSArI5RYXLQYTR+14pPG/eJrbNDl3iHhV1xxBZ599tn+APmFF15Aenr6mLK5TqcTzz33HMLDw8V9yjp//vnn/QHyhRdeOOjxzzzzDOLi4nDgwAHMnj1b3CYou5yYmIgpg9z0yDDA1iWVfQzFapa+T49jJsTB1Ur87ZIeyBTAswvZnMudsI57YR17hbmfzEXLWy2IPc/3D6v9DdZyL6xljxO+MBwLdyyEudgMRahvV2X6G6xj/9SyXwXIhDZHiwpnJ6zPOpEcGSJmp/o6oSqFOGmaqr89Hm688UYsXrwYtbW1SElJEQHvNddcM6YMH5VW9wXHRFJSkshA93HkyBGRNd66dStaWlpEQE1UVVWJANlnIKt5ctMjw4C48MFlIFRSY6wFkudKj2PGTYOhBz99Zy86shy4cXUW4sL9Z0Sbv2iZdcw69hbqeDWSf5AMf8JfdEywllnL3oD2eBQk08Wf8Bcts479b3/tdwEy8fXhln73an8ozaTnONaSqqmG+n/nzp0reiZOO+00FBUViRLrsaBSqY75/+4Lgol169YhIyMDTz31FJKTk8X3KDC2Wq3wKWgOG1nNG2qB5kNSTwSVfdDJFolXpwfy1/rUvDZ/weF04fZXdqPDbMOclEj89PR8+BP+omXWMeuY8X8dE6xl1jLj/1pmHfvf/tr331W9NPy3QZRxJf8wGV8fkXqeeLyTZ7jhhhvwt7/9TWSRTznlFKSlTf4kp7W1FcXFxSI4Xr16tfjaxo0bBz2mr+fY4XBgyqE5bMtuOjqnjXoiqOyDTrZIvD4yp83feOzLEiz4SxeyozW4+qlZUCun/kMwUGEds449SVdRFw7/6DASvpuA5Bv8K4Psb7CWWcuepPzX5bBUWZByawrC5/tXBtmfYB371/7abwLkxhca0f5JO1yzQ1Bi7YRcBqyczj1PnoD6kO+66y4RzFIm2R1ER0eL3uJ//etfovSayqrvueeeQY+Jj48XvRrkdp2amoqQkBDhhj1lkEhpPhu56ZFhAPVEUNmHD5xs+SM7Ktrw3zdL8MfiULhkQHqsdqqfUkDDOu6FdewRyPHWsMEAZaSSA2QPw1ruhbXsdlxOF+qfroe1zorYC2I5QPYgrGP/0rLvPJNRsDZb0f655F59cK5UUj0vLQqRWv8YKeFvUFBKhlphYWFixJM7IJfql19+GTt37hRl1XfccQcefvjhQY9RKpV45JFH8OSTT4oS7HPPPRdTDok1OgNImCVd+5B4/Ymviptw4/M7sOCA9PpFnxgFTaL/9B77I6zjAbCO3T8Spne8U/wl/jMSxl9hLQ+AtexWDJsMIjhWRCgQc5r/uFf7I6xj/9KyzDWeoXxuwGg0ijeJwWBARMQwDmbDUPevOhz+wWHoFoThjzdasb2iHXeckovbTsmBL9LT04Py8nIx15eyoP7ImjVrxKglClh9jUB4fT2hE198ftRz/PfPDuMfX5YI/4WH/qdDYhWQ81gOUn6YAl8mEN5nrOOpxdd1PNHn2Lm3Ezvm7oBMI8PKppViwoQvw1rm1zfQtTzR53fkliOofbQWCd9LwIz/zIAvwzrm19ibWvHtVa2XvuHl2/PtIjjWKOVYNzdpqp9WQELzi7/66itxeeyxx6b66TB+TEunBbe9vBubSlrF/RuyUpBY1SHqVuIu9J+Zqf4I65jxxpqsP0vv88Gxv8NaZjyFy+FC8+uSp0/8pVwJ4klYx/6Hz69s1iYrOr7sELefDW+DQi7DY1cuwLQ43x/v5I+Q0x4J+Q9/+APy8o42ylM2ubKyctifoZLoK6+80ovPkvF1nE4Xvvv0VhxqMIlRCA9eMAcLPnWgDB2IOjlKjIZhPAfrmPEUVHTW/Kq0qY67hA+6PA1rmfEUho0GWBusUEYpEX1KNL/QHoR17H/4fIDc/GYz4ATKEh1ojnLh4QsKsGZGwlQ/rYCloqJi2K9/8MEHsNlsw34vIYH/PZjByOUy3HNmPh54/6A40MpJCMeOG3eI73HPoudhHTOeonNPJ7qPdEMeIod+rZ5faA/DWmY8XQkSe34s5Grf6v8MNFjH/odPB8h2hxOf1rXCkeTAjjwH7j0zHxcvmvrh0cEIzS9mmPFwUl48VmXHQqmQw2l3ImJZhDitpsWYmRpYx8xkcdldiDkzRrhXK8N8egsR0LCWmckSmhOK0LxQxF3MlSBTBevYd/HZ1a26zYw7XinEDms78D3gB6uz8IMTp0/102IYZhxQcEzIlXLkPpqLnH/kQCaTnOgZhvE/IhZFoOCDAlFqzTDM/7d3L8BRlXcfx/+5XyAJJFxCAgToUC6lhIsGgbcDFhraqm+1ShkvreKoLS8OWGbavnQKdNrpBFtHeCsULDMiDPWV0VcQoUYtNFi5C3KRAQpIIU0gCRATSDAJ2fPO/2w3TSAkmyV7bvv9zOwk5+zZ5MnJ/vac55zn4l79nusnfef2tbsYgCM5roKsB92NB0tkwcajcrXuuqQmRMvv8tMl/0s+kcqzjpsnC0CQfD6JcvCcdwCC4POZc1dGkWPA3TgmA+6pIK/bc04WbPzU/H5WbZU8c9cZ6V52TqTkC5HYRJEeg0WG3eefZBqA49WV1kndocOSkrxdoi6dFLlOlgE3qn5vnyTVb5W4hjPkGHDx6NWfv7lH0nr+TaI/P0WWgVY47vbNf+ZmSU5GshSMiJbHPtso1//3I2mM6iaSMVgkOV3k/GGR3StFKk7YXVQAQbi4eqdcWfY7qX77I3+GyTLgOkb5cal9dYlUri2Sa+XJ5Bhwqep3P5batS+aWTaSu5NlwA0V5LSkOHlv7n/It8/vkrikammI/ZLEdOsmEh0jkpAq0nOoSO0lkeOb/U29ADiXzyfG4U0Sl1wt0VnD/Bkmy4C7+HxSt+0tib5+Wa59niMJg3qQY8CNfD6pL3rLPCYb6UMkKiGNLANuqCCrxJpSuX76mNRV95QuX7lhvmMd4Cc1W6Ti72Y/KADOde3wSYmt/0zqrvSU5GFdWj5JlgF3qCqWhqOfmsfkpMHJEh3X7NSBHAOuYVSeE6PkuP/8ejjn10CnVpCXL18uAwYMkMTERBk3bpzs3btXOlN96WVpvHRVGusTpMvwG06qVXyyv8+EDhICwLEqt5yT6Nh6ictOk5jkmJs3IMuA4xl1V6S+uNp/TP4Kx2TArap3njfPn42YJEkcmHjzBhyTgdAqyOvXr5d58+bJokWL5MCBA5KbmyvTpk2T8nL/hOOd4fK2BvFdj5fE/j5zrsWb1Nf6B+zSkXABONbFLXVmlrsOvcVHDVkGHK/mZLQ0VMVIbHK9OXfqTcgx4AqXCv91TB4WLVHRrUy5SJaB0CrIL774ojz99NMyc+ZMGT58uKxcuVKSk5PllVdekc5y/v9ipPZiX0kdXK3zPrV8UperS0R6ftk/TYyLNNY03vrxRWPw214LbtuOWrt2rWRkZEhdXV2L9ffff798//vfD/GvRqSqPVkrl3clS+2lvpKceZksW5RlcozOVrY5zjwmp3y5WqJjbzip5pjMMRmu4Lvuk/Nv+M+vu+R8zjGZYzI6a5qn+vp62b9/v8yfP79pXXR0tEydOlV27drV6mu0stW8wlVdXd3m72iobJDqHVelodtd0v+/9olUHPf3OdZmH3plSyvHXTJEht7rujlU/9b1b7d8Lv3b6TJyy8im5R29doivtvVByNImpcnootFNy7sH7JaGiw03bTfZmNyh8k2fPl3mzJkjmzZtMr9X2jJgy5Yt8v7773foZ8FbOppjdWnzJfMaXH16vkR3KyLLFmWZHKPzs1wpUn6XZD60gxy3gmMy3JDjK/uuSENFo1SmTpQBOXvJcis4JiOgQzXMixcvSmNjo/Tu3bvFel2+cOFCq68pKCiQtLS0pke/fm3f9Y3rHid3nb1Lcl7Kl9ips0X6jBS5dlnk0in/16xckXE/Yh7kMEhKSpJHHnlEVq9e3bRu3bp10r9/f5k8uWOVbXhLR3Os+s7tK6N3jpY+/z1Z5K4fkWWLkGN0dpbH7BojOf+TLwkPzCHHFiLL6Mwcp41Pk7wTeZKzNF+iJ8wiyxYhx+4UZRg3tmG+tdLSUsnOzpadO3fK+PHjm9b/9Kc/le3bt8uePXuCusqlQa6qqpLU1NT2f6lO5aSjVeuAXNrnWJtVO/zO8RdffCFnzpyRgQMHmgOZBbTZVDJGJCYxJrhto0ViktrfNqZLK4MiteOTTz6RO++8U86ePWv+r0eOHGnekVqwYIE4ff96ieZED3pB5yTMbjvHLsxyW+8zp2eZHDuD03KsOCZzTO5sHJOtxzGZY3I4kOUQm1j36NFDYmJipKysrMV6Xc7MzGz1NQkJCeYjZHoC3T1HvKAjJ7nh2rY9o0ePNgde036M+fn5cvToUbOJNSLbbedYkWXLskyOcSsck0PLG8dkOAnHZHdlmWOy+3SoghwfHy9jx46VrVu3mgM3KZ/PZy4/++yz4SojLPbUU0/J0qVLpaSkxOxfHkzTHQDOQo4BbyDLgPuRY3fpcPtGneJp1apVsmbNGjl27JjMmjVLampqzFGt4Q3aD/mf//yn+X9+8skn7S4OgBCQY8AbyDLgfuTY4xXkGTNmyAsvvCALFy6UUaNGycGDB6WwsPCmgbs6nfZfrDwrUnbU/1WXERbaZ+7BBx+Url27NrUUADoFObYMOUZYkWXLkGWEFVm2BDn2cBPrAG1ObWmT6ooTIsfeEbl4UuT6FyKxiSI9BosMu4/RrMNEm1c/+uijt9/vFAggx5YjxwgLsmw5soywIMuWIsceryBbHt7dK0VqL4mkZYvEdRFpqBE5f1ikqsQ/fUzPIXaX0jMqKyulqKjIfPzhD3+wuzjwCnJsKXKMsCHLliLLCBuybBly7D6xjm/2oXeOtXLcc6hIVJR/fUKqSM8U/yTnxzeLZAx29HQxbqIj7WmQn3/+eRkyhAsP6ATk2HLkGGFBli1HlhEWZNlS5Nh9nF1B1jlTtVm13jkOVI4DdDk1W6Ti7/7tPDIVlN3+8Y9/2F0EeA05thw5RliQZcuRZYQFWbYUOXYfZ992rb/q73OszapbE5/sf163A+BM5BjwBrIMeANZBlxcQY7v6h+QS/sct6a+1v+8budAhmHYXQRPYr+6DDlGK8ixC5FltIIsu5CLs8z7jX1rBWdXkNP6+Uer1sG4bqxs6nJ1iUjPL/u3c5CYmBjza319vd1F8aTa2lrza1xcnN1FgYdzHHh/Bd5v6FyBz8fA5yVcgCyjFRyTXciFWeaYHH5k2S19kHXgLZ3KSQOsA3Jpn2NtVq1XtjS8XTJEht7ruAG6YmNjJTk5WSoqKsxARzusfG6lVw01vOXl5dKtWzdOrN3CpTnWipu+z/T9pjTTUTeOhYCQ+Hw+8/NR96l+XsIlyDKa4ZjsYi7MMsfk8CHLN3P+mYlO4aRTOQXmQb5S6m/2kZXrD68Dp3jSk+g+ffrImTNn5OzZs3YXx3O00pKZmWl3MeDxHKvA+yxQSUbn0QuH/fv356KD25Bl3IBjsku5MMsck8OLLLupgqw0pDqVk466pwMLaJ8IbfbhoCtbN4qPj5fBgwfTzLqT6R15mmS6lAtzHLjY1atXL2loaLC7OJ6in5G0rnEpsox/4Zjsci7LMsfk8CHLbqwgKw2ry6Zy0pO/xMREu4sBOIcLc6z0ogwXZoBmyDLgDS7MMsdkhJszLxEBAAAAAGAxKsgAAAAAAFBBBgAAAADApj7IgQm+q6urrf7VgGsE8hHIi9OQY8D9OVZkGXB/lskx0LlZtryCfOXKFfNrv37OmXwccCrNS1pamjgNOQbcn2NFlgH3Z5kcA52b5SjD4sthPp9PSktLJSUl5ZbzX2rtXivQxcXFkpqaamXxXId95c19pbHU8GZlZTlyKhxyHLnvTbu5aV85PceKLEfu+9NubtpXTs9yMDl22z63G/sqsrNs+R1kLUzfvn2D2lZ3stN3tFOwr7y3r5x4lTqAHEf2e9MJ3LKvnJxjRZYj+/3pBG7ZV07Ockdy7KZ97gTsq8jMsvMugwEAAAAAYAMqyAAAAAAAOLWCnJCQIIsWLTK/gn3F+8qdyDH7iveVN5Bl9hXvK28gy+wr3lfBsXyQLgAAAAAAnMiRd5ABAAAAALAaFWQAAAAAAKggAwAAAADgxx1kAAAAAACcWEFevny5DBgwQBITE2XcuHGyd+9eu4vkOAUFBXLnnXdKSkqK9OrVS+6//345ceKE3cVyhcWLF0tUVJQ899xzdhfF88hy+8hy6Miydchy+8hyaMixdchx+8hx6BZ77PzaURXk9evXy7x588wpng4cOCC5ubkybdo0KS8vt7tojrJ9+3aZPXu27N69Wz744ANpaGiQ/Px8qampsbtojrZv3z55+eWXZeTIkXYXxfPIcnDIcmjIsnXIcnDIcseRY+uQ4+CQ49Ds8+L5teEgeXl5xuzZs5uWGxsbjaysLKOgoMDWcjldeXm5TtVlbN++3e6iONaVK1eMwYMHGx988IExadIkY+7cuXYXydPIcmjIcvvIsrXIcmjIctvIsbXIcWjIceRm2TF3kOvr62X//v0yderUpnXR0dHm8q5du2wtm9NVVVWZX9PT0+0uimPpHfd77rmnxfsL4UGWQ0eW20eWrUOWQ0eW20aOrUOOQ0eOIzfLseIQFy9elMbGRundu3eL9bp8/Phx28rldD6fz2zvP3HiRBkxYoTdxXGk119/3Wyyr01AEH5kOTRkuX1k2VpkOTRkuW3k2FrkODTkOLKz7JgKMkK/cvPpp5/KRx99xC5sRXFxscydO9fsq60DvwFORZbbRpbhFmT51sgx3IIcR3aWHVNB7tGjh8TExEhZWVmL9bqcmZlpW7mc7Nlnn5XNmzfLhx9+KH379rW7OI6kzfZ1kLcxY8Y0rdOWCrrPli1bJnV1deb7Dp2HLHccWW4fWbYeWe44stw2cmw9ctxx5Lh9Xs+yY/ogx8fHy9ixY2Xr1q0tmjfo8vjx420tm9MYhmGGd8OGDbJt2zYZOHCg3UVyrClTpsiRI0fk4MGDTY877rhDHn30UfN7N4fXqchy8Mhy8Miy9chy8MhycMix9chx8Mhx8KZ4/PzaMXeQlU7x9Pjjj5s7OC8vT5YuXWpOXTRz5ky7i+a4Zh+vvfaavP322+ZcyBcuXDDXp6WlSVJSkt3FcxTdPzf2ze7SpYtkZGTQZzuMyHJwyHLwyLI9yHJwyHJwyLE9yHFwyHHwUjx+fu2oCvKMGTOkoqJCFi5caFb6Ro0aJYWFhTcN3BXpVqxYYX6dPHlyi/WrV6+WJ554wqZSAf9GloNDluF0ZDk4ZBlORo6DQ44REKVzPTUtAQAAAAAQoRzTBxkAAAAAADtRQQYAAAAAgAoyAAAAAAB+3EEGAAAAAIAKMgAAAAAAftxBBgAAAACACjIAAAAAAH7cQXaBqKgo2bhxo93FAHAbyDHgDWQZ8DYyDirINquoqJBZs2ZJ//79JSEhQTIzM2XatGmyY8eOpm3Onz8v3/rWt8Spli9fLgMGDJDExEQZN26c7N27t83tjx49Kg8++KD5Gv0QWrp0qWVlBcIhEnO8atUq+drXvibdu3c3H1OnTm33NYDTRWKWX331VfNY3PyhrwW8yO0Z//DDD+W+++6TrKwsKvJhFBvOH472aUWxvr5e1qxZI4MGDZKysjLZunWrXLp0qWkbDa9TrV+/XubNmycrV640D8Ra2dUPmhMnTkivXr1afU1tba35t06fPl1+/OMfW15moLNFYo6Liork4YcflgkTJpgn088//7zk5+ebF8Cys7Mt/xuAzhCJWVapqanmNgFaSQa8yO0Zr6mpkdzcXHnyySflu9/9rt3F8S4DtqmsrDT0X1BUVNTmdrrNhg0bmpZ37Nhh5ObmGgkJCcbYsWPN53SbTz75xHz+r3/9q7lcWFhojBo1ykhMTDTuvvtuo6yszPjzn/9sDB061EhJSTEefvhho6ampunnvvvuu8bEiRONtLQ0Iz093bjnnnuMU6dOtVm2vLw8Y/bs2U3LjY2NRlZWllFQUBDUPsjJyTGWLFkS1LaAE5Fjv+vXr5ufK2vWrLH5PwKEJlKzvHr1avN3AF7nhYy3VU50HppY26hr167mQ/sX19XVBfWa6upqs2nFV7/6VTlw4ID8+te/lp/97GetbvvLX/5Sli1bJjt37pTi4mL53ve+Z15Nfu2112TLli3y/vvvy0svvdTiqpReef7444/Nq2nR0dHywAMPiM/na/Xn6xW4/fv3m00rA/Q1urxr164O7w/Ajcjxv1uGNDQ0SHp6us3/ESA0kZzlq1evSk5OjvTr10++853vmC1BAK9xe8ZhoU6sbCMEb775ptG9e3fzatOECROM+fPnG4cOHbrlFaIVK1YYGRkZxrVr15qeX7VqVatXsv7yl780baNXj3Xd6dOnm9b98Ic/NKZNm3bLslVUVJivOXLkSKvPl5SUmM/v3Lmzxfqf/OQn5lXsYHAHGV4Q6TlWs2bNMgYNGtTibwLcJhKzrNtryw8tr95Zu/fee43U1FSjuLi4jT0FuJObM34j7iCHD3eQHdAXorS0VDZt2iTf/OY3zX59Y8aMMQfNaI32ERo5cmSLATTy8vJa3Va3C+jdu7ckJyeb/S2arysvL29aPnnypNmnULfR/kg6yIc6d+5cp/ytgFdFeo4XL14sr7/+umzYsIHBfeBqkZjl8ePHyw9+8AMZNWqUTJo0Sd566y3p2bOnvPzyy536ewAniMSMo+OoIDuAhu4b3/iGLFiwwGyW8cQTT8iiRYtu++fGxcW1GHCj+XJgXfNmHNqE5PLly+botHv27DEfgWZbrenRo4fExMSYAxw0p8tOHuAACIdIzfELL7xgVpC16VjzkwPArSI1y83LOXr0aDl16lTQrwHcxK0Zh3WoIDvQ8OHDzX4JrRkyZIgcOXKkRd+Jffv23fbv1NH79CrZL37xC5kyZYoMGzZMKisr23xNfHy8jB071uw3EaDB12W9Ig1EskjI8W9/+1uzP1ZhYaHccccdt11+wIkiIcvNNTY2mn9Tnz59butvANzCLRmHdagg20jD8fWvf13WrVsnhw8fljNnzsgbb7xhnnTqIBmteeSRR8wD3jPPPCPHjh2T9957z7yDc7vTMug8phkZGfLHP/7RvGq8bds2c+CA9ug2euVLh8vX8ujccvohM3PmzKZttOnW/Pnzm5b1ytjBgwfNh35fUlJifs/VarhRpOZYp3XSq++vvPKK2SzswoUL5kMH+wHcKFKz/Ktf/cpsAfLZZ5+ZgxA99thjcvbsWXnqqadCLj/gRF7IuB5jA+fQSv8G/Z5m2Z2LeZBtpCPp6TyFS5YskdOnT5sjwOoIkk8//bT8/Oc/b/U12kfhnXfeMQ962l9IR9VbuHChGeDm/SM6SkfO0z6Ec+bMkREjRphXzH7/+9/L5MmT23zdjBkzzEnXtQx6cqxl0rtJ2s8iQEOrPz9A+35o860A/aDRh/Z90r4ggJtEao5XrFhhXuB66KGHWvwsbaamI3kCbhOpWda7Vvo36vZ60q53obXZqd5VA7zECxnXEa/vvvvupuVApfrxxx+/ZT9qdFyUjtQVwuvgIH/605/Mq8NVVVWSlJRkd3EAhIAcA95AlgFvI+Pexx1kF1q7dq054l12drYcOnTInI9N51qjcgy4BzkGvIEsA95GxiMPFWQX0mZQgeZTOojG9OnT5Te/+Y3dxQLQAeQY8AayDHgbGY88NLEGAAAAAIBRrAEAAAAA8GOaJwAAAAAAqCADAAAAAODHHWQAAAAAAKggAwAAAADgxx1kAAAAAACoIAMAAAAA4McdZAAAAAAAqCADAAAAACCm/weazYoDIKr2DgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.2] the kernel's width: narrow follows the noise, wide over-smooths\n", "sigmas = (0.1, 0.2, 0.5, 1)\n", "names = ['Sigma ' + str(sigma) for sigma in sigmas]\n", "\n", "def gaussian_with_width(sigma):\n", " return (lambda x: torch.exp(-x**2 / (2*sigma**2)))\n", "\n", "kernels = [gaussian_with_width(sigma) for sigma in sigmas]\n", "plot(x_train, y_train, x_val, y_val, kernels, names)" ] }, { "cell_type": "markdown", "id": "380e3976", "metadata": {}, "source": [ "## Segment 2 — Scores are similarities (note §3) · Lecture A\n", "\n", "**What to watch:** the masked softmax gives padded keys weight 0; additive and dot-product scoring produce\n", "the same shapes. With the Gaussian kernel the query's own length cancels in the softmax, the keys' lengths\n", "do not, unless all keys have the same length." ] }, { "cell_type": "code", "execution_count": 6, "id": "b07dd6d8", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.882067Z", "iopub.status.busy": "2026-10-18T03:30:09.881961Z", "iopub.status.idle": "2026-10-18T03:30:09.886681Z", "shell.execute_reply": "2026-10-18T03:30:09.886228Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[[0.5362, 0.4638, 0.0000, 0.0000],\n", " [0.5333, 0.4667, 0.0000, 0.0000]],\n", "\n", " [[0.2702, 0.4312, 0.2986, 0.0000],\n", " [0.3395, 0.3762, 0.2843, 0.0000]]])\n" ] } ], "source": [ "# [Book §11.3] masked softmax (the d2l package's version): valid lengths 2 and 3 out of 4 keys\n", "print(d2l.masked_softmax(torch.rand(2, 2, 4), torch.tensor([2, 3])))" ] }, { "cell_type": "code", "execution_count": 7, "id": "c8c46e8f", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.887896Z", "iopub.status.busy": "2026-10-18T03:30:09.887804Z", "iopub.status.idle": "2026-10-18T03:30:09.931900Z", "shell.execute_reply": "2026-10-18T03:30:09.931500Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "additive: torch.Size([2, 1, 4])\n", "dot product: torch.Size([2, 1, 4])\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2026-10-17T23:30:09.921175\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.7, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.3] additive (Bahdanau) and scaled dot-product attention: the d2l package's classes, same shapes\n", "queries, keys = torch.normal(0, 1, (2, 1, 20)), torch.normal(0, 1, (2, 10, 2))\n", "values = torch.normal(0, 1, (2, 10, 4))\n", "valid_lens = torch.tensor([2, 6])\n", "attention = d2l.AdditiveAttention(num_hiddens=8, dropout=0.1)\n", "attention.eval()\n", "print(\"additive:\", attention(queries, keys, values, valid_lens).shape)\n", "d2l.show_heatmaps(attention.attention_weights.reshape((1, 1, 2, 10)), xlabel='Keys', ylabel='Queries')\n", "\n", "queries = torch.normal(0, 1, (2, 1, 2))\n", "attention = d2l.DotProductAttention(dropout=0.5)\n", "attention.eval()\n", "print(\"dot product:\", attention(queries, keys, values, valid_lens).shape)" ] }, { "cell_type": "code", "execution_count": 8, "id": "ebd03259", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.933166Z", "iopub.status.busy": "2026-10-18T03:30:09.933067Z", "iopub.status.idle": "2026-10-18T03:30:09.936424Z", "shell.execute_reply": "2026-10-18T03:30:09.935974Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "equal-length keys Gaussian [0.1421 0.3862 0.4717] dot product [0.1421 0.3862 0.4717]\n", "unequal keys Gaussian [0.1136 0.5092 0.3772] dot product [0.041 0.823 0.136]\n" ] } ], "source": [ "# [Added for CS6140] the note's §3 claim on numbers: softmax(-|q-k|^2/2) = softmax(q.k) when all keys have\n", "# the same length, and differs when they don't (|q|^2 is the same for every key, |k|^2 is not)\n", "q = torch.tensor([1.0, 2.0])\n", "for name, K in [(\"equal-length keys\", torch.tensor([[1.0, 0.0], [0.0, 1.0], [0.6, 0.8]])),\n", " (\"unequal keys\", torch.tensor([[1.0, 0.0], [0.0, 2.0], [0.6, 0.8]]))]:\n", " gauss = torch.softmax(-((q - K) ** 2).sum(1) / 2, 0)\n", " dot = torch.softmax(K @ q, 0)\n", " print(f\"{name:18s} Gaussian {gauss.numpy().round(4)} dot product {dot.numpy().round(4)}\")" ] }, { "cell_type": "markdown", "id": "6e21ca6d", "metadata": {}, "source": [ "## Segment 3 — Scaled dot-product attention and the √d (note §4) · Lecture A\n", "\n", "**What to watch:** the note's 2-token example gives weights 0.6225 / 0.3775. Scores of $d$ random\n", "products have spread $\\sqrt d$: without the division the softmax piles almost all weight on one key as\n", "$d$ grows; with it, the weights stay spread out. (The scores here are drawn directly with spread $\\sqrt d$,\n", "so the table is close to, not identical with, the note's, which uses real dot products.)" ] }, { "cell_type": "code", "execution_count": 9, "id": "4fa0ede1", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.937625Z", "iopub.status.busy": "2026-10-18T03:30:09.937546Z", "iopub.status.idle": "2026-10-18T03:30:09.940190Z", "shell.execute_reply": "2026-10-18T03:30:09.939818Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[0.6225, 0.3775],\n", " [0.3775, 0.6225]])\n" ] } ], "source": [ "# [Added for CS6140] the note's 2-token example (d = 4, so sqrt(d) = 2), computed by PyTorch's attention\n", "Q = torch.tensor([[1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0]])\n", "K = torch.tensor([[1.0, 1.0, 0.0, 0.0], [1.0, 0.0, 1.0, 0.0]])\n", "V = torch.eye(2) # V = I, so the output IS the weight matrix\n", "print(F.scaled_dot_product_attention(Q[None], K[None], V[None])[0])" ] }, { "cell_type": "code", "execution_count": 10, "id": "70f1a5dd", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.941328Z", "iopub.status.busy": "2026-10-18T03:30:09.941251Z", "iopub.status.idle": "2026-10-18T03:30:09.956916Z", "shell.execute_reply": "2026-10-18T03:30:09.956508Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " d score std largest weight (unscaled) largest weight (scaled by sqrt d)\n", " 4 2.0 0.53 0.32\n", " 16 4.0 0.74 0.32\n", " 64 8.0 0.87 0.32\n", "256 16.0 0.93 0.32\n" ] } ], "source": [ "# [Added for CS6140] the sqrt(d) saturation: scores with spread sqrt(d) (what q.k of d random products has),\n", "# softmax over 10 keys, mean largest weight, with and without dividing by sqrt(d)\n", "g = torch.Generator().manual_seed(0)\n", "print(\" d score std largest weight (unscaled) largest weight (scaled by sqrt d)\")\n", "for d in [4, 16, 64, 256]:\n", " scores = torch.randn(20000, 10, generator=g) * math.sqrt(d)\n", " unscaled = torch.softmax(scores, -1).max(-1).values.mean()\n", " scaled = torch.softmax(scores / math.sqrt(d), -1).max(-1).values.mean()\n", " print(f\"{d:3d} {scores.std():6.1f} {unscaled:.2f} {scaled:.2f}\")" ] }, { "cell_type": "markdown", "id": "de57dd85", "metadata": {}, "source": [ "## Segment 4 — Masks (note §5) · Lecture A\n", "\n", "**What to watch:** blocked keys get weight exactly 0 because their scores become $-\\infty$ *before* the\n", "softmax. PyTorch has two opposite conventions for the same mask: in `F.scaled_dot_product_attention`\n", "`True` means *may attend*; in `nn.MultiheadAttention` / `nn.Transformer` `True` means *blocked*." ] }, { "cell_type": "code", "execution_count": 11, "id": "c15c57eb", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.958594Z", "iopub.status.busy": "2026-10-18T03:30:09.958451Z", "iopub.status.idle": "2026-10-18T03:30:09.964041Z", "shell.execute_reply": "2026-10-18T03:30:09.963652Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nn.MultiheadAttention weights, sentence 1 (keys 4 blocked) and 2 (keys 2-4 blocked):\n", "tensor([[[0.2560, 0.3910, 0.3530, 0.0000],\n", " [0.4180, 0.3120, 0.2700, 0.0000],\n", " [0.3030, 0.2790, 0.4180, 0.0000],\n", " [0.3360, 0.3900, 0.2740, 0.0000]],\n", "\n", " [[1.0000, 0.0000, 0.0000, 0.0000],\n", " [1.0000, 0.0000, 0.0000, 0.0000],\n", " [1.0000, 0.0000, 0.0000, 0.0000],\n", " [1.0000, 0.0000, 0.0000, 0.0000]]])\n", "same output both ways: True\n" ] } ], "source": [ "# [Added for CS6140] one padding mask (2 sentences, 4 keys, lengths 3 and 1), in PyTorch's two conventions\n", "torch.manual_seed(0)\n", "X = torch.randn(2, 4, 8) # (batch, positions, d)\n", "keep = torch.tensor([[True, True, True, False], # (batch, keys): True = a real token\n", " [True, False, False, False]])\n", "\n", "mha = nn.MultiheadAttention(8, num_heads=1, batch_first=True, bias=False).eval()\n", "_, w = mha(X, X, X, key_padding_mask=~keep) # nn.MultiheadAttention: True = BLOCKED, hence ~keep\n", "print(\"nn.MultiheadAttention weights, sentence 1 (keys 4 blocked) and 2 (keys 2-4 blocked):\")\n", "print(w.detach().round(decimals=3))\n", "\n", "Wq, Wk, Wv = mha.in_proj_weight.chunk(3) # the same projections, through F.sdpa\n", "out = F.scaled_dot_product_attention(X @ Wq.T, X @ Wk.T, X @ Wv.T,\n", " attn_mask=keep[:, None, :]) # F.sdpa: True = MAY ATTEND\n", "print(\"same output both ways:\", torch.allclose(mha.out_proj(out), mha(X, X, X, key_padding_mask=~keep)[0], atol=1e-6))" ] }, { "cell_type": "markdown", "id": "02507b75", "metadata": {}, "source": [ "## Segment 5 — Multi-head attention (note §6) · Lecture A\n", "\n", "**What to watch:** the shapes. $h$ heads split the width $d$ into $h$ pieces of $d/h$, attend in\n", "parallel (one weight matrix per head), and are merged back to $d$. The parameter count is $4(d^2+d)$, the\n", "same as one big head." ] }, { "cell_type": "code", "execution_count": 12, "id": "20cac4af", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.965282Z", "iopub.status.busy": "2026-10-18T03:30:09.965183Z", "iopub.status.idle": "2026-10-18T03:30:09.969014Z", "shell.execute_reply": "2026-10-18T03:30:09.968618Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "output: torch.Size([2, 4, 100])\n" ] } ], "source": [ "# [Book §11.5] the d2l package's MultiHeadAttention: queries (2, 4, 100), key-values (2, 6, 100) -> (2, 4, 100)\n", "num_hiddens, num_heads = 100, 5\n", "attention = d2l.MultiHeadAttention(num_hiddens, num_heads, 0.5)\n", "batch_size, num_queries, num_kvpairs = 2, 4, 6\n", "valid_lens = torch.tensor([3, 2])\n", "X = torch.ones((batch_size, num_queries, num_hiddens))\n", "Y = torch.ones((batch_size, num_kvpairs, num_hiddens))\n", "d2l.check_shape(attention(X, Y, Y, valid_lens), (batch_size, num_queries, num_hiddens))\n", "print(\"output:\", attention(X, Y, Y, valid_lens).shape)" ] }, { "cell_type": "code", "execution_count": 13, "id": "4dad2e4f", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.970452Z", "iopub.status.busy": "2026-10-18T03:30:09.970359Z", "iopub.status.idle": "2026-10-18T03:30:09.974365Z", "shell.execute_reply": "2026-10-18T03:30:09.973983Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "output (2, 7, 256) | per-head weights (2, 4, 7, 7) = (batch, heads, queries, keys)\n", "parameters: 263168 = 4(d^2+d) = 263168\n" ] } ], "source": [ "# [Added for CS6140] PyTorch's version: one weight matrix per head, and the parameter count 4(d^2 + d)\n", "d, h = 256, 4\n", "mha = nn.MultiheadAttention(d, h, batch_first=True)\n", "X = torch.randn(2, 7, d)\n", "out, w = mha(X, X, X, average_attn_weights=False)\n", "print(\"output\", tuple(out.shape), \"| per-head weights\", tuple(w.shape), \"= (batch, heads, queries, keys)\")\n", "print(\"parameters:\", sum(p.numel() for p in mha.parameters()), \"= 4(d^2+d) =\", 4 * (d * d + d))" ] }, { "cell_type": "markdown", "id": "5098b652", "metadata": {}, "source": [ "## Segment 6 — Attention inside the translator (note §10) · Lecture A\n", "\n", "**What to watch:** the book's Bahdanau decoder: at every output step the decoder's state queries all the\n", "encoder's outputs, and the context it gets back enters the GRU. One minute of training on HW6's\n", "Spanish–English data already gives sensible short translations, and the weights show a rough, soft\n", "alignment. Then the long-sequence test: reversing a random sequence, where one fixed context vector must\n", "hold the whole input." ] }, { "cell_type": "code", "execution_count": 14, "id": "c4298c78", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.975687Z", "iopub.status.busy": "2026-10-18T03:30:09.975603Z", "iopub.status.idle": "2026-10-18T03:30:09.979494Z", "shell.execute_reply": "2026-10-18T03:30:09.978986Z" } }, "outputs": [], "source": [ "# [Book §11.4] the book's Bahdanau decoder (the d2l package does not ship it)\n", "class Seq2SeqAttentionDecoder(d2l.AttentionDecoder):\n", " def __init__(self, vocab_size, embed_size, num_hiddens, num_layers,\n", " dropout=0):\n", " super().__init__()\n", " self.attention = d2l.AdditiveAttention(num_hiddens, dropout)\n", " self.embedding = nn.Embedding(vocab_size, embed_size)\n", " self.rnn = nn.GRU(\n", " embed_size + num_hiddens, num_hiddens, num_layers,\n", " dropout=dropout)\n", " self.dense = nn.LazyLinear(vocab_size)\n", " self.apply(d2l.init_seq2seq)\n", "\n", " def init_state(self, enc_outputs, enc_valid_lens):\n", " # Shape of outputs: (num_steps, batch_size, num_hiddens).\n", " # Shape of hidden_state: (num_layers, batch_size, num_hiddens)\n", " outputs, hidden_state = enc_outputs\n", " return (outputs.permute(1, 0, 2), hidden_state, enc_valid_lens)\n", "\n", " def forward(self, X, state):\n", " # Shape of enc_outputs: (batch_size, num_steps, num_hiddens).\n", " # Shape of hidden_state: (num_layers, batch_size, num_hiddens)\n", " enc_outputs, hidden_state, enc_valid_lens = state\n", " # Shape of the output X: (num_steps, batch_size, embed_size)\n", " X = self.embedding(X).permute(1, 0, 2)\n", " outputs, self._attention_weights = [], []\n", " for x in X:\n", " # Shape of query: (batch_size, 1, num_hiddens)\n", " query = torch.unsqueeze(hidden_state[-1], dim=1)\n", " # Shape of context: (batch_size, 1, num_hiddens)\n", " context = self.attention(\n", " query, enc_outputs, enc_outputs, enc_valid_lens)\n", " # Concatenate on the feature dimension\n", " x = torch.cat((context, torch.unsqueeze(x, dim=1)), dim=-1)\n", " # Reshape x as (1, batch_size, embed_size + num_hiddens)\n", " out, hidden_state = self.rnn(x.permute(1, 0, 2), hidden_state)\n", " outputs.append(out)\n", " self._attention_weights.append(self.attention.attention_weights)\n", " # After fully connected layer transformation, shape of outputs:\n", " # (num_steps, batch_size, vocab_size)\n", " outputs = self.dense(torch.cat(outputs, dim=0))\n", " return outputs.permute(1, 0, 2), [enc_outputs, hidden_state,\n", " enc_valid_lens]\n", "\n", " @property\n", " def attention_weights(self):\n", " return self._attention_weights" ] }, { "cell_type": "code", "execution_count": 15, "id": "4c77b21a", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:30:09.980765Z", "iopub.status.busy": "2026-10-18T03:30:09.980678Z", "iopub.status.idle": "2026-10-18T03:31:45.310426Z", "shell.execute_reply": "2026-10-18T03:31:45.309851Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tatoeba es->en, both sides <= 12 tokens: 243,067 pairs, 222,600 distinct Spanish sentences.\n", "train 100,000 pairs (of 237,612 available) | val 1,093 pairs | test 2,000 Spanish sentences (1.09 references each) | final test 2,000 (kept untouched)\n", "vocabularies: Spanish 15,239, English 10,105 tokens (min frequency 2); num_steps = 13\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "600 steps in 91 s, validation loss 2.80\n" ] } ], "source": [ "# [Changed from book §11.4] HW6's Spanish->English data and a 1-minute training run (book: French->English,\n", "# 30 epochs); the book's encoder, decoder and masked loss\n", "t0 = time.time()\n", "data = seq2seq_common.TatoebaEsEn(DATA, batch_size=128)\n", "print(data.describe())\n", "embed_size, num_hiddens, num_layers, dropout = 256, 256, 2, 0.2\n", "encoder = d2l.Seq2SeqEncoder(len(data.src_vocab), embed_size, num_hiddens, num_layers, dropout)\n", "decoder = Seq2SeqAttentionDecoder(len(data.tgt_vocab), embed_size, num_hiddens, num_layers, dropout)\n", "model = seq2seq_common.BookSeq2Seq(encoder, decoder, tgt_pad=data.tgt_vocab[''], lr=0.005)\n", "model(*(a[:2] for a in data.arrays[:3])) # one forward pass sizes the book's nn.LazyLinear\n", "hist = seq2seq_common.train_seq2seq(model, data, DEVICE, steps=600, lr=0.005,\n", " loss_fn=lambda Y_hat, Y: model.loss(Y_hat, Y))\n", "print(f\"{hist['steps']} steps in {hist['seconds']:.0f} s, validation loss {hist['val_loss'][-1]:.2f}\")" ] }, { "cell_type": "code", "execution_count": 16, "id": "29e20374", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:31:45.311858Z", "iopub.status.busy": "2026-10-18T03:31:45.311724Z", "iopub.status.idle": "2026-10-18T03:31:45.404574Z", "shell.execute_reply": "2026-10-18T03:31:45.404124Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tengo hambre . => i am hungry .\n", "¿ dónde está la estación ? => where is the cow ?\n", "me gusta leer libros . => i like to learn french .\n", "mi hermano trabaja en un hospital grande . => my brother works in a car .\n" ] } ], "source": [ "# [Changed from book §11.4] translate with the book's predict_step (greedy), Spanish sentences\n", "def translate(model, data, sentences, save_attention=False):\n", " toks = [seq2seq_common.tokenize(s) for s in sentences]\n", " src, src_len = data.src_batch(toks)\n", " bos = torch.full((len(toks), 1), data.tgt_vocab[''])\n", " preds, att = model.predict_step((src, bos, src_len, bos), DEVICE, data.num_steps, save_attention)\n", " outs = [seq2seq_common.ids_to_tokens(p, data.tgt_vocab) for p in preds.tolist()]\n", " return toks, outs, att\n", "\n", "model.eval()\n", "spanish = [\"tengo hambre .\", \"¿ dónde está la estación ?\", \"me gusta leer libros .\",\n", " \"mi hermano trabaja en un hospital grande .\"]\n", "_, outs, _ = translate(model, data, spanish)\n", "for s, out in zip(spanish, outs):\n", " print(f\"{s:45s} => {' '.join(out)}\")" ] }, { "cell_type": "code", "execution_count": 17, "id": "8ba05adf", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:31:45.405835Z", "iopub.status.busy": "2026-10-18T03:31:45.405750Z", "iopub.status.idle": "2026-10-18T03:31:45.530579Z", "shell.execute_reply": "2026-10-18T03:31:45.530169Z" } }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2026-10-17T23:31:45.514624\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.7, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "segment 6 so far: 96 s\n" ] } ], "source": [ "# [Changed from book §11.4] the attention weights of the last sentence: rows = English output words,\n", "# columns = Spanish input tokens (plus )\n", "toks, outs, att = translate(model, data, [spanish[-1]], save_attention=True)\n", "w = torch.stack([step[0][0][0] for step in att]).cpu() # (output steps, source positions)\n", "n_out, n_in = len(outs[0]) + 1, len(toks[0]) + 1\n", "fig, ax = plt.subplots(figsize=(5, 4))\n", "ax.imshow(w[:n_out, :n_in].detach(), cmap='Reds')\n", "ax.set_xticks(range(n_in), toks[0] + [''], rotation=60)\n", "ax.set_yticks(range(n_out), outs[0] + [''])\n", "ax.set_xlabel('Spanish (keys)'); ax.set_ylabel('English output (queries)')\n", "plt.show()\n", "model.train(); print(f\"segment 6 so far: {time.time() - t0:.0f} s\")" ] }, { "cell_type": "code", "execution_count": 18, "id": "37227326", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:31:45.531814Z", "iopub.status.busy": "2026-10-18T03:31:45.531709Z", "iopub.status.idle": "2026-10-18T03:33:06.808738Z", "shell.execute_reply": "2026-10-18T03:33:06.808224Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no attention (book 10.7) L=5: 0.97 L=10: 0.67 L=15: 0.40 L=20: 0.26 L=25: 0.20 L=30: 0.16 (18 s)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Bahdanau attention (book 11.4) L=5: 0.95 L=10: 0.94 L=15: 0.80 L=20: 0.73 L=25: 0.59 L=30: 0.54 (63 s)\n" ] } ], "source": [ "# [Added for CS6140] the long-sequence test: reverse a random sequence of 5-30 symbols. The same book\n", "# encoder, then the book's decoder WITHOUT attention (one fixed context, seq2seq_common.Seq2SeqDecoder = d2l\n", "# 10.7) vs the book's Bahdanau decoder above. Same sizes, same number of steps.\n", "class ReverseTask:\n", " \"\"\"Random symbols 3..22 (0 , 1 , 2 ), in the translation data's batch format.\"\"\"\n", " def __init__(self, n, lmin, lmax, batch_size=128, seed=0):\n", " self.lmin, self.lmax, self.batch_size, self.num_steps = lmin, lmax, batch_size, lmax + 1\n", " self.tgt_vocab = {'': 0, '': 1, '': 2}\n", " self.g = torch.Generator().manual_seed(seed)\n", " self.arrays, self.val_arrays = self.make(n), self.make(500)\n", "\n", " def make(self, n, L=None):\n", " T = self.num_steps\n", " src, tin, lab = (torch.zeros(n, T, dtype=torch.long) for _ in range(3))\n", " lens = torch.randint(self.lmin, self.lmax + 1, (n,), generator=self.g) if L is None else torch.full((n,), L)\n", " for i, l in enumerate(lens.tolist()):\n", " s = torch.randint(3, 23, (l,), generator=self.g)\n", " src[i, :l], src[i, l] = s, 2\n", " tin[i, 0], tin[i, 1:l + 1] = 1, s.flip(0)\n", " lab[i, :l], lab[i, l] = s.flip(0), 2\n", " return src, tin, lens + 1, lab\n", "\n", "task = ReverseTask(20000, 5, 30)\n", "results = {}\n", "for name in [\"no attention (book 10.7)\", \"Bahdanau attention (book 11.4)\"]:\n", " t1 = time.time()\n", " torch.manual_seed(0)\n", " enc = d2l.Seq2SeqEncoder(23, 32, 128, 1)\n", " dec = (seq2seq_common.Seq2SeqDecoder(23, 32, 128, 1) if name.startswith(\"no\") else\n", " Seq2SeqAttentionDecoder(23, 32, 128, 1))\n", " m = seq2seq_common.BookSeq2Seq(enc, dec, tgt_pad=0, lr=0.005)\n", " m(*(a[:2] for a in task.arrays[:3])) # sizes the book's nn.LazyLinear\n", " seq2seq_common.train_seq2seq(m, task, torch.device(\"cpu\"), steps=500, lr=0.005,\n", " loss_fn=lambda Y_hat, Y, m=m: m.loss(Y_hat, Y))\n", " m.eval()\n", " acc = {}\n", " for L in [5, 10, 15, 20, 25, 30]:\n", " src, tin, slen, lab = task.make(300, L)\n", " preds, _ = m.predict_step((src, tin[:, :1], slen, lab), torch.device(\"cpu\"), L)\n", " acc[L] = (preds[:, :L] == lab[:, :L]).float().mean().item()\n", " results[name] = acc\n", " print(f\"{name:32s} \" + \" \".join(f\"L={L}: {a:.2f}\" for L, a in acc.items()) + f\" ({time.time() - t1:.0f} s)\")" ] }, { "cell_type": "code", "execution_count": 19, "id": "9e1d5b2d", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.809902Z", "iopub.status.busy": "2026-10-18T03:33:06.809818Z", "iopub.status.idle": "2026-10-18T03:33:06.849281Z", "shell.execute_reply": "2026-10-18T03:33:06.848789Z" } }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2026-10-17T23:33:06.833442\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.7, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Added for CS6140] token accuracy by sequence length\n", "fig, ax = plt.subplots(figsize=(5, 3))\n", "for name, acc in results.items():\n", " ax.plot(list(acc), list(acc.values()), 'o-', label=name)\n", "ax.set_xlabel('sequence length'); ax.set_ylabel('token accuracy'); ax.set_ylim(0, 1.05); ax.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "5b3db25c", "metadata": {}, "source": [ "## Segment 7 — Self-attention ignores word order (note §7) · Lecture B\n", "\n", "**What to watch:** in self-attention the queries, keys and values all come from the same tokens. Shuffle\n", "the input tokens and the outputs come out shuffled the same way, nothing else changes: attention alone\n", "treats a sentence as a bag of tokens." ] }, { "cell_type": "code", "execution_count": 20, "id": "bb2168ad", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.850509Z", "iopub.status.busy": "2026-10-18T03:33:06.850427Z", "iopub.status.idle": "2026-10-18T03:33:06.854384Z", "shell.execute_reply": "2026-10-18T03:33:06.854009Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "self-attention output: torch.Size([2, 4, 100])\n" ] } ], "source": [ "# [Book §11.6] self-attention: queries = keys = values = X (the d2l package's MultiHeadAttention)\n", "num_hiddens, num_heads = 100, 5\n", "attention = d2l.MultiHeadAttention(num_hiddens, num_heads, 0.5)\n", "batch_size, num_queries, valid_lens = 2, 4, torch.tensor([3, 2])\n", "X = torch.ones((batch_size, num_queries, num_hiddens))\n", "d2l.check_shape(attention(X, X, X, valid_lens), (batch_size, num_queries, num_hiddens))\n", "print(\"self-attention output:\", attention(X, X, X, valid_lens).shape)" ] }, { "cell_type": "code", "execution_count": 21, "id": "f0f78ad3", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.855611Z", "iopub.status.busy": "2026-10-18T03:33:06.855529Z", "iopub.status.idle": "2026-10-18T03:33:06.859463Z", "shell.execute_reply": "2026-10-18T03:33:06.858993Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "output of shuffled input == shuffled output: True\n" ] } ], "source": [ "# [Added for CS6140] permutation equivariance: shuffle the 6 input tokens, the outputs shuffle the same way\n", "torch.manual_seed(0)\n", "mha = nn.MultiheadAttention(16, 2, batch_first=True).eval()\n", "X = torch.randn(1, 6, 16)\n", "perm = torch.tensor([3, 0, 5, 1, 4, 2])\n", "out = mha(X, X, X)[0]\n", "out_shuffled = mha(X[:, perm], X[:, perm], X[:, perm])[0]\n", "print(\"output of shuffled input == shuffled output:\", torch.allclose(out_shuffled, out[:, perm], atol=1e-6))" ] }, { "cell_type": "markdown", "id": "348734a1", "metadata": {}, "source": [ "## Segment 8 — Positional encoding (note §8) · Lecture B\n", "\n", "**What to watch:** like a binary counter, low columns change fast with the position and high columns\n", "slowly; the sin/cos version is the continuous counter. Every position gets its own pattern, added to the\n", "token's embedding." ] }, { "cell_type": "code", "execution_count": 22, "id": "71940b3e", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.860642Z", "iopub.status.busy": "2026-10-18T03:33:06.860559Z", "iopub.status.idle": "2026-10-18T03:33:06.862644Z", "shell.execute_reply": "2026-10-18T03:33:06.862163Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 in binary is 000\n", "1 in binary is 001\n", "2 in binary is 010\n", "3 in binary is 011\n", "4 in binary is 100\n", "5 in binary is 101\n", "6 in binary is 110\n", "7 in binary is 111\n" ] } ], "source": [ "# [Book §11.6] binary representations of 0-7: the lowest bit alternates fastest\n", "for i in range(8):\n", " print(f'{i} in binary is {i:>03b}')" ] }, { "cell_type": "code", "execution_count": 23, "id": "5835f081", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.863756Z", "iopub.status.busy": "2026-10-18T03:33:06.863676Z", "iopub.status.idle": "2026-10-18T03:33:06.975798Z", "shell.execute_reply": "2026-10-18T03:33:06.975387Z" } }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2026-10-17T23:33:06.929956\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.7, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2026-10-17T23:33:06.959253\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.7, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# [Book §11.6] the d2l package's PositionalEncoding: columns 6-9 over 60 positions, and the heatmap\n", "encoding_dim, num_steps = 32, 60\n", "pos_encoding = d2l.PositionalEncoding(encoding_dim, 0)\n", "X = pos_encoding(torch.zeros((1, num_steps, encoding_dim)))\n", "P = pos_encoding.P[:, :X.shape[1], :]\n", "d2l.plot(torch.arange(num_steps), P[0, :, 6:10].T, xlabel='Row (position)',\n", " figsize=(6, 2.5), legend=[\"Col %d\" % d for d in torch.arange(6, 10)])\n", "d2l.show_heatmaps(P[0, :, :].unsqueeze(0).unsqueeze(0), xlabel='Column (encoding dimension)',\n", " ylabel='Row (position)', figsize=(3.5, 4), cmap='Blues')" ] }, { "cell_type": "code", "execution_count": 24, "id": "d3e356e3", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.977091Z", "iopub.status.busy": "2026-10-18T03:33:06.976983Z", "iopub.status.idle": "2026-10-18T03:33:06.979583Z", "shell.execute_reply": "2026-10-18T03:33:06.979158Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0. 1. 0. 1. ]\n", " [ 0.8415 0.5403 0.01 1. ]\n", " [ 0.9093 -0.4161 0.02 0.9998]\n", " [ 0.1411 -0.99 0.03 0.9996]]\n" ] } ], "source": [ "# [Added for CS6140] the note's d = 4 table (positions 0-3), from the same package class\n", "print(d2l.PositionalEncoding(4, 0).P[0, :4].numpy().round(4))" ] }, { "cell_type": "markdown", "id": "d041f768", "metadata": {}, "source": [ "## Segment 9 — The causal mask (note §9) · Lecture B\n", "\n", "**What to watch:** with all scores equal, position $t$ under the causal mask averages the values of\n", "positions $1..t$, the running mean. Changing the last token changes only the last output: no position\n", "can see the future, which is what lets a decoder train on every position at once." ] }, { "cell_type": "code", "execution_count": 25, "id": "80a69ccc", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.980704Z", "iopub.status.busy": "2026-10-18T03:33:06.980606Z", "iopub.status.idle": "2026-10-18T03:33:06.983695Z", "shell.execute_reply": "2026-10-18T03:33:06.983303Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running mean of 1, 3, 5, 7: tensor([1., 2., 3., 4.])\n", "causal mask (True = may attend):\n", " tensor([[ True, False, False, False],\n", " [ True, True, False, False],\n", " [ True, True, True, False],\n", " [ True, True, True, True]])\n" ] } ], "source": [ "# [Added for CS6140] all-zero scores (Q = K = 0) under PyTorch's causal mask: the output is the running mean of V\n", "V = torch.tensor([[1.0], [3.0], [5.0], [7.0]])[None] # (batch 1, 4 positions, 1 feature)\n", "Z = torch.zeros(1, 4, 1)\n", "print(\"running mean of 1, 3, 5, 7:\", F.scaled_dot_product_attention(Z, Z, V, is_causal=True)[0, :, 0])\n", "print(\"causal mask (True = may attend):\\n\", ~torch.isinf(nn.Transformer.generate_square_subsequent_mask(4)))" ] }, { "cell_type": "code", "execution_count": 26, "id": "31220e0f", "metadata": { "execution": { "iopub.execute_input": "2026-10-18T03:33:06.984877Z", "iopub.status.busy": "2026-10-18T03:33:06.984795Z", "iopub.status.idle": "2026-10-18T03:33:06.989045Z", "shell.execute_reply": "2026-10-18T03:33:06.988651Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "largest change per position: [0. 0. 0. 0.940614]\n" ] } ], "source": [ "# [Added for CS6140] the future cannot leak back: change token 4, outputs 1-3 stay the same\n", "torch.manual_seed(0)\n", "mha = nn.MultiheadAttention(8, 2, batch_first=True).eval()\n", "X = torch.randn(1, 4, 8)\n", "X2 = X.clone(); X2[0, 3] += 10.0\n", "mask = nn.Transformer.generate_square_subsequent_mask(4)\n", "a, b = mha(X, X, X, attn_mask=mask)[0], mha(X2, X2, X2, attn_mask=mask)[0]\n", "print(\"largest change per position:\", (a - b).abs().amax(-1)[0].detach().numpy().round(6))" ] }, { "cell_type": "markdown", "id": "49bd9736", "metadata": {}, "source": [ "---\n", "*Book code: A. Zhang, Z. C. Lipton, M. Li, A. J. Smola, Dive into Deep Learning (d2l.ai), CC BY-SA 4.0.\n", "Changes and additions for CS6140 are marked in each cell.*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.0" } }, "nbformat": 4, "nbformat_minor": 5 }