Skip to content

Instantly share code, notes, and snippets.

@mbacvanski
Created December 14, 2023 16:49
Show Gist options
  • Save mbacvanski/71909a86218400aa388832a6071c53df to your computer and use it in GitHub Desktop.
Save mbacvanski/71909a86218400aa388832a6071c53df to your computer and use it in GitHub Desktop.
Forward-Forward Algorithm with MNIST
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/mbacvanski/71909a86218400aa388832a6071c53df/forward_forward_mnist_with_explanations.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:04:09.192145Z",
"start_time": "2023-12-03T22:04:08.487888Z"
},
"id": "4TgCLCbPlP0b"
},
"outputs": [],
"source": [
"from typing import List\n",
"\n",
"import torch\n",
"from tqdm import tqdm\n",
"\n",
"DEVICE = 'cpu'\n",
"\n",
"metal = torch.device(DEVICE)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3d61H1h8ldmY"
},
"source": [
"The forward-forward architecture's goal is to train each layer individually, so that each layer responds most \"positively\" to positive data and most \"negatively\" to negative data. There are several ways we could define responding \"positively\" versus \"negatively\", but the simplest approach could be just the L2 norm (magnitude) of the vector outputted by the layer.\n",
"\n",
"Let's define a single layer first. This is very similar to a traditional linear layer, where the output is computed as the activation function applied to the intermediate matrix multiplication, $\\sigma(z)$ where the $z=w^Tx+b$ with $w$ being the weights of this layer $x$ being the input, and $b$ the bias."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:13:00.193340Z",
"start_time": "2023-12-03T22:13:00.183319Z"
},
"id": "WhJrOyDVmiaC"
},
"outputs": [],
"source": [
"class Layer(torch.nn.Linear):\n",
" def __init__(self, in_features, out_features, bias=True, device=None, dtype=None):\n",
" super().__init__(in_features, out_features, bias, device, dtype)\n",
"\n",
" # define the components we will use\n",
" self.activation = torch.nn.ReLU()\n",
" self.optimizer = torch.optim.Adam(self.parameters(), lr=0.001)\n",
"\n",
" # define hyperparameters\n",
" self.threshold = 2.0\n",
" self.num_epochs = 20\n",
"\n",
" # keep track of losses during training\n",
" self.losses = []\n",
"\n",
" def forward(self, x):\n",
" \"\"\"\n",
" Here we define the forward pass through this layer. This is the same as how a linear layer does it,\n",
" taking the matrix multiplication of x^T and the weights and adding the bias term. The difference is that\n",
" here we integrate normalization into the layer, so we first take only the unit vector of the input.\n",
"\n",
" Remember that because the previous layer will be outputting a vector of differing magnitude depending on how\n",
" 'excited' it is about its input, taking the norm of the vector guarantees that only the information about\n",
" direction of the output vector from the previous layer is used to determine how excited this layer is about\n",
" the input.\n",
" \"\"\"\n",
" x_normalized = x / (x.norm(2, 1, keepdim=True) + 1e-8)\n",
" # w^T + b\n",
" return self.activation(\n",
" torch.mm(x_normalized, self.weight.T) + self.bias.unsqueeze(0)\n",
" )\n",
"\n",
" def train(self, x_positive, x_negative, verbose=True):\n",
" \"\"\"\n",
" Each layer of the forward-forward network can train itself, because it does not rely on gradients from other\n",
" layers in the network. All it needs is a source of positive and negative data. The first layer of the network\n",
" receives data as the concatenation of X and Y (data and label), while subsequent layers receive the output\n",
" of the previous layer's forward pass on the positive and negative data respectfully.\n",
" \"\"\"\n",
" self.losses = []\n",
" with tqdm(range(self.num_epochs), disable=not verbose) as pbar:\n",
" for _ in pbar:\n",
" goodness_positive = self.forward(x_positive).pow(2).mean(1)\n",
" goodness_negative = self.forward(x_negative).pow(2).mean(1)\n",
"\n",
" \"\"\"\n",
" We want to minimize loss, which we can define in a vector of two parts.\n",
" The first part minimizes the -(goodness - threshold) for positive data, which maximizes goodness for positive data\n",
" The second part minimizes the (goodness - threshold) for negative data, which directly minimizes goodness for negative data\n",
" Threshold is some margin we want to keep between the goodness of positive and negative data.\n",
" Potential for a dual formulation of this optimization problem as well.\n",
" \"\"\"\n",
"\n",
" loss = torch.log(1 + torch.exp(torch.cat([\n",
" -goodness_positive + self.threshold,\n",
" goodness_negative - self.threshold]))).mean()\n",
"\n",
" \"\"\"\n",
" Notice that even though we use the gradient, this gradient is only locally computed within this layer.\n",
" \"\"\"\n",
" self.optimizer.zero_grad()\n",
" loss.backward()\n",
" self.optimizer.step()\n",
"\n",
" self.losses.append(loss.item())\n",
"\n",
" pbar.set_description(f'Loss: {loss.item():.4f}')\n",
"\n",
" \"\"\"\n",
" The goodness computed in this layer's forward pass is needed to train the next layer. This is what the next\n",
" layer will use as its x_positive and x_negative.\n",
" \"\"\"\n",
" return self.forward(x_positive).detach(), self.forward(x_negative).detach()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "n9pvVAk-5Whe"
},
"source": [
"Now that we've defined a single layer, let's combine some layers into a multi-layer network."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:09:12.933892Z",
"start_time": "2023-12-03T22:09:12.927801Z"
},
"id": "2H_psk3v6UaX"
},
"outputs": [],
"source": [
"def combine_x_y(x, y):\n",
" \"\"\"\n",
" The forward-forward network expects inputs to contain both the input data (x) as well as the label (y). This method\n",
" concatenates the data and label together. Note there are 10 possible classes.\n",
" \"\"\"\n",
" x_ = x.clone()\n",
" label_onehot = torch.nn.functional.one_hot(y, 10) * x.max()\n",
" return torch.hstack([x, label_onehot])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:13:03.395731Z",
"start_time": "2023-12-03T22:13:03.390410Z"
},
"id": "dgwNiUuc5NBq"
},
"outputs": [],
"source": [
"class FFNN(torch.nn.Module):\n",
" def __init__(self, dims):\n",
" super().__init__()\n",
" self.layers: List[Layer] = []\n",
"\n",
" for d in range(len(dims) - 1):\n",
" self.layers.append(Layer(dims[d], dims[d + 1]).to(device=DEVICE))\n",
"\n",
" def predict(self, x):\n",
" goodness_per_label = []\n",
" for label in range(10):\n",
" \"\"\" Generate an array of just that label, since we want to append that label to all x \"\"\"\n",
" label_arr = [label] * x.shape[0]\n",
" input = combine_x_y(x, torch.tensor(label_arr).to(device=DEVICE))\n",
"\n",
" \"\"\" Run this input through the network and record the total activation across the whole network \"\"\"\n",
" goodnesses_per_layer = self._forward_pass(input)\n",
" goodness_per_label.append(sum(goodnesses_per_layer).unsqueeze(1))\n",
"\n",
" \"\"\" The class predicted is the class of data that achieves the highest activation. With X staying constant,\n",
" the only difference comes from the label appended to X. \"\"\"\n",
" goodness_per_label = torch.cat(goodness_per_label, 1)\n",
" return goodness_per_label.argmax(1)\n",
"\n",
" def train(self, x_positive, x_negative, n_epochs, mode='batch', validation_x=None, validation_y=None):\n",
" \"\"\" Use the activations from the previous layer for the positive and negative data, respectfully, to train the\n",
" subsequent layers. After every n iterations of training, evaluate the whole model's accuracy on the validation data. \"\"\"\n",
" self._history = {'accuracy': []}\n",
" if mode == 'batch':\n",
" self._train_batch(x_positive, x_negative)\n",
" elif mode == 'sample':\n",
" self._train_sample(x_positive, x_negative, validation_x, validation_y, n_epochs=20)\n",
"\n",
" def _train_batch(self, x_positive, x_negative):\n",
" h_positive, h_negative = x_positive, x_negative\n",
" for i, layer in enumerate(self.layers):\n",
" print('Training layer', i)\n",
" h_positive, h_negative = layer.train(h_positive, h_negative)\n",
"\n",
" def _train_sample(self, x_positive, x_negative, validation_x, validation_y, n_epochs):\n",
" for epoch in range(n_epochs):\n",
" print('Epoch', epoch)\n",
" pbar = tqdm(range(len(x_positive)), desc='Training samples')\n",
" for i in pbar:\n",
" h_positive_sample, h_negative_sample = x_positive[i].unsqueeze(0), x_negative[i].unsqueeze(0)\n",
" for j, layer in enumerate(self.layers):\n",
" h_positive_sample, h_negative_sample = layer.train(h_positive_sample, h_negative_sample, verbose=False)\n",
"\n",
" if i % 10 == 0 and validation_x is not None and validation_y is not None:\n",
" accuracy = self.predict(validation_x).eq(validation_y).float().mean().item()\n",
" self._history['accuracy'].append(accuracy)\n",
" pbar.set_postfix({'Validation accuracy': accuracy})\n",
"\n",
" def get_losses(self):\n",
" return [l.losses for l in self.layers]\n",
"\n",
" def _forward_pass(self, input):\n",
" h = input\n",
" goodnesses = []\n",
" for layer in self.layers:\n",
" \"\"\" Goodness is computed as the magnitude of the activations of this layer \"\"\"\n",
" activation = layer(h)\n",
" activation_magnitude = activation.pow(2).mean(1)\n",
" goodnesses.append(activation_magnitude)\n",
"\n",
" \"\"\" Use the activation of this layer as the input to the next layer \"\"\"\n",
" h = activation\n",
"\n",
" return goodnesses"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Kid_R70k-8Bb"
},
"source": [
"Now let's define our dataloaders for MNIST data, with a training and dataset that are both normalized."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:09:13.233675Z",
"start_time": "2023-12-03T22:09:13.230446Z"
},
"id": "umico8I1_lkH"
},
"outputs": [],
"source": [
"from torch.utils.data import DataLoader\n",
"from torchvision.transforms import Compose, ToTensor, Normalize, Lambda\n",
"from torchvision.datasets import MNIST\n",
"\n",
"\n",
"def MNIST_loaders(train_batch_size=50000, test_batch_size=10000):\n",
" transform = Compose([\n",
" ToTensor(),\n",
" Normalize((0.1307,), (0.3081,)), # mean and std of the MNIST dataset\n",
" Lambda(lambda x: torch.flatten(x))])\n",
"\n",
" train_loader = DataLoader(\n",
" MNIST('./data/', train=True, download=True, transform=transform),\n",
" batch_size=train_batch_size, shuffle=True)\n",
"\n",
" test_loader = DataLoader(\n",
" MNIST('./data/', train=False, download=True, transform=transform),\n",
" batch_size=test_batch_size, shuffle=False)\n",
"\n",
" return train_loader, test_loader\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:09:13.715779Z",
"start_time": "2023-12-03T22:09:13.688937Z"
},
"id": "5s8mhh_s-7Dv"
},
"outputs": [],
"source": [
"torch.manual_seed(42)\n",
"train_loader, test_loader = MNIST_loaders()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:04:24.417392Z",
"start_time": "2023-12-03T22:04:22.193552Z"
},
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bUk_OpUAAJ13",
"outputId": "4e7efa49-d9ec-4fb3-8f15-1c091b50c429"
},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[-0.4242, -0.4242, -0.4242, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.4242, -0.4242, -0.4242, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.4242, -0.4242, -0.4242, ..., 0.0000, 2.8215, 0.0000],\n",
" ...,\n",
" [-0.4242, -0.4242, -0.4242, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.4242, -0.4242, -0.4242, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.4242, -0.4242, -0.4242, ..., 2.8215, 0.0000, 0.0000]])"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x, y = next(iter(train_loader))\n",
"x, y = x.to(DEVICE), y.to(DEVICE)\n",
"\n",
"x_positive = combine_x_y(x, y)\n",
"x_positive"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "5aiC-oPwOzUi"
},
"outputs": [],
"source": [
"\n",
"x_test, y_test = next(iter(test_loader))\n",
"x_test, y_test = x_test.to(DEVICE), y_test.to(DEVICE)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:13:09.490247Z",
"start_time": "2023-12-03T22:13:09.484813Z"
},
"id": "6N0OFm61AD2c"
},
"outputs": [],
"source": [
"\"\"\" Let's make a network with 2 layers of 100 neurons each. \"\"\"\n",
"input_dimension = x_positive[0].size(0)\n",
"network = FFNN([input_dimension, 100, 100])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:13:51.758600Z",
"start_time": "2023-12-03T22:13:09.752786Z"
},
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dLdX_4G3Bdgs",
"outputId": "07522836-929b-423d-ac15-763ae2c3bbd1"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 100%|██████████| 50000/50000 [27:00<00:00, 30.86it/s, Validation accuracy=0.897]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 100%|██████████| 50000/50000 [17:02:27<00:00, 1.23s/it, Validation accuracy=0.907] \n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 2\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 100%|██████████| 50000/50000 [42:35<00:00, 19.57it/s, Validation accuracy=0.912] \n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 3\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 100%|██████████| 50000/50000 [27:07<00:00, 30.72it/s, Validation accuracy=0.913]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 4\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 100%|██████████| 50000/50000 [27:39<00:00, 30.12it/s, Validation accuracy=0.914]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 5\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Training samples: 1%|▏ | 705/50000 [00:28<33:42, 24.37it/s, Validation accuracy=0.911]\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb Cell 13\u001b[0m line \u001b[0;36m5\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m rnd \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mrandperm(y\u001b[39m.\u001b[39msize(\u001b[39m0\u001b[39m))\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=2'>3</a>\u001b[0m x_negative \u001b[39m=\u001b[39m combine_x_y(x, y[rnd])\n\u001b[0;32m----> <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=4'>5</a>\u001b[0m network\u001b[39m.\u001b[39;49mtrain(x_positive, x_negative, n_epochs\u001b[39m=\u001b[39;49m\u001b[39m10\u001b[39;49m, mode\u001b[39m=\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39msample\u001b[39;49m\u001b[39m'\u001b[39;49m, validation_x\u001b[39m=\u001b[39;49mx_test, validation_y\u001b[39m=\u001b[39;49my_test)\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=6'>7</a>\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39mAccuracy:\u001b[39m\u001b[39m'\u001b[39m, network\u001b[39m.\u001b[39mpredict(x)\u001b[39m.\u001b[39meq(y)\u001b[39m.\u001b[39mfloat()\u001b[39m.\u001b[39mmean()\u001b[39m.\u001b[39mitem())\n",
"\u001b[1;32m/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb Cell 13\u001b[0m line \u001b[0;36m3\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=29'>30</a>\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_train_batch(x_positive, x_negative)\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=30'>31</a>\u001b[0m \u001b[39melif\u001b[39;00m mode \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39msample\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[0;32m---> <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=31'>32</a>\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_train_sample(x_positive, x_negative, validation_x, validation_y, n_epochs\u001b[39m=\u001b[39;49m\u001b[39m20\u001b[39;49m)\n",
"\u001b[1;32m/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb Cell 13\u001b[0m line \u001b[0;36m4\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=44'>45</a>\u001b[0m h_positive_sample, h_negative_sample \u001b[39m=\u001b[39m x_positive[i]\u001b[39m.\u001b[39munsqueeze(\u001b[39m0\u001b[39m), x_negative[i]\u001b[39m.\u001b[39munsqueeze(\u001b[39m0\u001b[39m)\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=45'>46</a>\u001b[0m \u001b[39mfor\u001b[39;00m j, layer \u001b[39min\u001b[39;00m \u001b[39menumerate\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlayers):\n\u001b[0;32m---> <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=46'>47</a>\u001b[0m h_positive_sample, h_negative_sample \u001b[39m=\u001b[39m layer\u001b[39m.\u001b[39;49mtrain(h_positive_sample, h_negative_sample, verbose\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=48'>49</a>\u001b[0m \u001b[39mif\u001b[39;00m i \u001b[39m%\u001b[39m \u001b[39m10\u001b[39m \u001b[39m==\u001b[39m \u001b[39m0\u001b[39m \u001b[39mand\u001b[39;00m validation_x \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mand\u001b[39;00m validation_y \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=49'>50</a>\u001b[0m accuracy \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpredict(validation_x)\u001b[39m.\u001b[39meq(validation_y)\u001b[39m.\u001b[39mfloat()\u001b[39m.\u001b[39mmean()\u001b[39m.\u001b[39mitem()\n",
"\u001b[1;32m/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb Cell 13\u001b[0m line \u001b[0;36m6\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=57'>58</a>\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=58'>59</a>\u001b[0m \u001b[39mNotice that even though we use the gradient, this gradient is only locally computed within this layer.\u001b[39;00m\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=59'>60</a>\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=60'>61</a>\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39moptimizer\u001b[39m.\u001b[39mzero_grad()\n\u001b[0;32m---> <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=61'>62</a>\u001b[0m loss\u001b[39m.\u001b[39;49mbackward()\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=62'>63</a>\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39moptimizer\u001b[39m.\u001b[39mstep()\n\u001b[1;32m <a href='vscode-notebook-cell:/Users/marc/Code/QPAI/Forward_Forward_MNIST_With_Explanations.ipynb#X14sZmlsZQ%3D%3D?line=64'>65</a>\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlosses\u001b[39m.\u001b[39mappend(loss\u001b[39m.\u001b[39mitem())\n",
"File \u001b[0;32m~/mambaforge/envs/torch-metal/lib/python3.10/site-packages/torch/_tensor.py:522\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 512\u001b[0m \u001b[39mif\u001b[39;00m has_torch_function_unary(\u001b[39mself\u001b[39m):\n\u001b[1;32m 513\u001b[0m \u001b[39mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 514\u001b[0m Tensor\u001b[39m.\u001b[39mbackward,\n\u001b[1;32m 515\u001b[0m (\u001b[39mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 520\u001b[0m inputs\u001b[39m=\u001b[39minputs,\n\u001b[1;32m 521\u001b[0m )\n\u001b[0;32m--> 522\u001b[0m torch\u001b[39m.\u001b[39;49mautograd\u001b[39m.\u001b[39;49mbackward(\n\u001b[1;32m 523\u001b[0m \u001b[39mself\u001b[39;49m, gradient, retain_graph, create_graph, inputs\u001b[39m=\u001b[39;49minputs\n\u001b[1;32m 524\u001b[0m )\n",
"File \u001b[0;32m~/mambaforge/envs/torch-metal/lib/python3.10/site-packages/torch/autograd/__init__.py:266\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 261\u001b[0m retain_graph \u001b[39m=\u001b[39m create_graph\n\u001b[1;32m 263\u001b[0m \u001b[39m# The reason we repeat the same comment below is that\u001b[39;00m\n\u001b[1;32m 264\u001b[0m \u001b[39m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m 265\u001b[0m \u001b[39m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 266\u001b[0m Variable\u001b[39m.\u001b[39;49m_execution_engine\u001b[39m.\u001b[39;49mrun_backward( \u001b[39m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m 267\u001b[0m tensors,\n\u001b[1;32m 268\u001b[0m grad_tensors_,\n\u001b[1;32m 269\u001b[0m retain_graph,\n\u001b[1;32m 270\u001b[0m create_graph,\n\u001b[1;32m 271\u001b[0m inputs,\n\u001b[1;32m 272\u001b[0m allow_unreachable\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[1;32m 273\u001b[0m accumulate_grad\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[1;32m 274\u001b[0m )\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"\"\"\" We can generate simple negative data by simply combining the images with random labels. \"\"\"\n",
"rnd = torch.randperm(y.size(0))\n",
"x_negative = combine_x_y(x, y[rnd])\n",
"\n",
"network.train(x_positive, x_negative, n_epochs=10, mode='sample', validation_x=x_test, validation_y=y_test)\n",
"\n",
"print('Accuracy:', network.predict(x).eq(y).float().mean().item())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "VJV8sE07OzUi",
"outputId": "da6253d1-13ce-412d-e52e-1ab280945025"
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x3022ef4c0>]"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABCCUlEQVR4nO3dd3wUZeLH8e9uKoE0CEkIBJLQeyeErkTqIZY7EThAVERFfypWQEBRgfPu0DvFhu2qYPdOkFMQFBVBmlTpTSChplBTdn5/hCy7yW6SDUkmyX7er1der2T2mZlnh7DzzTNPsRiGYQgAAMAkVrMrAAAAvBthBAAAmIowAgAATEUYAQAApiKMAAAAUxFGAACAqQgjAADAVIQRAABgKl+zK1ASNptNR48eVXBwsCwWi9nVAQAAJWAYhjIzMxUTEyOr1X37R5UII0ePHlVsbKzZ1QAAAKVw+PBhNWjQwO3rVSKMBAcHS8p7MyEhISbXBgAAlERGRoZiY2Pt93F3qkQYyX80ExISQhgBAKCKKa6LBR1YAQCAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhBEAAGAqwggAADAVYQQAivHrmfPa8mu6jmdeNLsqVdYH6w7r58NpRZZZuvWYlm49VjEVqqYWbz6m7UczlJVjU06uzezqlFiVWLUXAMqbYRhuVxbt9YcV9u//fns39WlWt6KqVS2sP3hGj3642f5z32Z19bfbu8kwDH226aiuaREpi0W6+58bJEk/zxig0CA/l8cyDEPbj2Uork5N1Qzw1ZG0C9pz/Kz6lvG/ye7UTEUGB7qtR0U4kXlJN736vQ6fviBJ2vLUAAUH+ulSTq4CfH0Klf/5cJom/XuD07YDc4favzcMQzZDeuSDnxUc6KtZw9uU7xvwAGEE8EJF3Xi9zeHT53X6XJaGz/9ejeoEqVaAr56+vrWaRQdr6ZYUfb/3pFP5sW+v1Q9PXKuYsBqFjrXneKaiQgIVHOinvyzbre3H0vXK6M7ysbq+1l9sOaY5X/yi+aM6qW2DUEl5/zY9536to+kX9Z/7eqpdgzCnffafPKewGn4Kr+nv8XvNyrHJ37fkDeJTP9kiq0V69oa2Ttuzc216+r/btP/kOT3/2/aqH1ZDNlteSGgeHSw/H6v9fLk2Qze/+oPT/t/sOqH3fzqsxz7aLFfaz/pSTw1rpXE94gr9nv7thwN66r/bJeXdaHvO/VqS1L9FpN66ravL4x3PuChDUtr5bDWPDpYk2WyGpn26VRkXsjXz+laKDA60l992NF1D//qd/RySdO5SjnYcy1CnhuGyuvn3lKSNh87oxlfy3u+oxIaaMriFkuZ8rdk3tdX17WMkSUfSLqheSKCsVosyLmar3VNfSpLuu6aJHhnY3H6sxz782R5EJKntU1+qa1y4fjpwRn+5tYOCA30VGRwoq8Wizb+m6YmPtxSqT67NkI/VIpvNUMLUJU6vPdC/qfx8rWr31Jca3iFGf7m1o9v3Vd4shmEYpp29hDIyMhQaGqr09HSFhISYXR2gUvn9m2v03Z6T+u99vew3tKLM+u92Lf8lVZ/f30vBgeb91ZfPMAyt2n1SzaODFRUSWPwOkj7bdESnz2VpfM94+7ajaRcUWsNPr6zco15N6iqpcZ1ij5N2PksdZn3lcZ1r+PloxzOD9NOB03p15V5NGdxCf/16j/7781FFhQRozdRkxT2xWJL0f/2bakz3Rlqz/5QGtIq2h4GsHJuaPfmF/Zj5N711B07rt6+ttm9fO7W/Ii9fl2XbU3Xn39c5lS+J9AvZ2nokXaPfXKOuceHytVo1+6a2ig2vIYvFIh+rRYZh6PGPNiu8pr+mDG6ptftP65bX8+pxTfO6+n33RurdtK4OnT6nxz7crA2H0uzH//Pv2uvhD352ee76YTV0JO2Cy9dKYu/sIbIZhs5n5Sq0hp+um/eNdh8/K0naP2eI4qdcucG6uiafbTqiBxZusv/87wmJ6tE4Qit2Htf4d36yb//g7iR1jastSfZ/O8djjnlrjVbtPqnZN7bViK6xyrHZlHEhR3Vq+stqteh45kUtXHtY877a5fa9HJg71H7sZlG19OVDfZ3OJUnrnkxWRK0Abf41Tde//H1JL5Nb17WK0lfbU0tU1pPfqZIq6f2bMAJUcr+kZKimv692H8/UV9tT9d7aw5KkO3vFK6FuLU395MpfQ/kfJvNX7NHr3+zVsof7KqJmgGYv2aEODcPUsWG4/S/J6b9ppdt7xun0uSzVqRVQ6LxnL+WoVoBz4+minw7Jz8eqmzo1KNV7+XTjEU39ZIumDG6hGzrWV/qFbL25ar/e/eGA/H2s2vXcYEnS2v2nlVC3piJc1Eu6crOYNby1mkUFK8DXav9rNF9wgK8+mdRTMWGBevu7/RrUJlp/X31Qf199UM/f3E63dI3V9E+36h8/HizVe7mtR5ze/eGAy9d+eWaQWkxfWmj7TR3ra+rQltqdelazl+zQliPp9tfiI2pqxSP9tONYhgb/ZZXTfi+N7Khh7WOcblzzbmmvnk0iVCvAVxsPpalLXLgC/XyUk2vTH7/cqZ6NI9SnWV0NfOFb7UzNLPK9rHsyWV2eXWb/2fGm6ejmTg300YZfizxWefr3nYl6cflurd1/2uXru58brIOnzqlx3VqyWCwur6Ukff1wX32z64SevtzCku+/9/XSF1uP6ZWVe+3bHhnQTPdd29Tl9ci357nBajLtC7ev5xvTvZHT75u76/z5/b30m5e+K/Z4ZW3Pc4Pl61O2XUkJI0AlZbMZRTbz5nv9m716YdkuXcwueSe0e/s11mODWtg/4OrU9NdT17fW/e9tdFl+ZLeGem/tIb0yupOGtK1n3z7ghW+0K/WsusaF64O7e0iS0s9nq/2svObk7bMGKsj/SlC5mJ2rL7enql/zugpxaG0p+F6L+kCXpL/c2kEHT523/3W5f84QWSwWfbLxVzWsHaTOjWpr3pc79dev95T4mjSqE6SDp84X2r5x+nXq+twy5dgqz0fggblD9ecvd+olD96fo95NI7Rq95XHSvtmDynUNF8Spd2vsngouZnOnM9yGxbLWoCvVZdyqk5nUXfmj+qkoe3qFV/QAyW9f9NnBChDGReznW7GknQpJ1enzmYp42K29p/Ia+K+u19jXcrOVVxETf2mXYz8fPJu2PnPx1MzLmrOF794fP5XVu51+qvu1LksHTpd+Eac7721hyRJc77Yobb1Q/XaN3v1rzWH7K//dOCMjqZd0JwvflGnhmH27be985MuZufKz8eqSdc01ryvdmnrkQxJeQFi/8lzWrz5mF7/dp/OXspRh9gwbSpmJIUkp+Z0STqeeUmJs5fbf35jTGePgogkl0FEkjo+4/njmfJWXFgrjmMQkaRus5e5KVm0q3msUhm8sMz9o5LyUB2CiCTtO3HWtHPTMgJT/Xw4TaE1/BQXUdPsqrh0PPOi/rJst37fvZFa1iv6d++9tYc05XIHsp+mJatucN4jBk9uMKseu0axtYO09Ui6Kc20ALzXvtlDStRq64mS3r+ZZwSl9unGI3rqP9tkc9PMvf1ohvr+cYVW7T7h8vUjaRc0fP736venleVYy9L59cx5TfzHOnV7brn+teaQBv9llbJybGo6bYl+/+YaSXmPIB5+/2d9tumIJNmDiCR1fW6Z0s5n6XxWjkfn7f38CqVmXCSIwCs1CC88Qgll77pWUS63l3UQ8QRhBC79dOC0figwpLGgBxdt0rs/HNAdf/vJ5etD/rpKB0+d15i31rp8fZdDpzrDMPTmqn2a9d/tSs2omIml3vpuv+76+zpl59qUeTFbkpSTa9OAF75Rrz+s0P+2OfdAb/bkF8rONfTdnpP6Yssx3f3P9fpow696YOEm9ZizvNDxO8z6ShP/sd7jejk+lgC8yXePX6tu8bXNrsZVu7Fj/TI93oG5QzW+Z1yZHW/B2C66tWtsmR2vLBBGUEhOrk2/e221Ri1Yo/Tz2fbt7p7ordh5QgvXHtI3u/JaQGw2Q0/9Z5tTmf5/XqnT57Kcd3Q4XPyUJXp28Q69/f1+Jc5erj/+75fC5V2Y8dlWTfzHOrd1czrd5TLH0i9oyseb9czn2/Xl9lQ1nfaF2j71pWYv2aEm077QrtTin5ve868N+tJhuNzRdNcBquAzfFRNr4zuZHYVKqXhHWLK/JjvT0wq85u5JM2+sa3L7Qnl8Ij4+d+2K7NjTRvSUpI0dUhLNawdVGTZFY/00zPDW+vmEox2m3OT6+thFsIICnEcXZB2IS8QXMzOVf953+jxDzfrj//7RaPf/NFpnyc+3qJxb6/V1E+2KGHqkkK92PeeOKdOBToMGnIfIOav2KtOz3ylE5mX8iaPOprhstzfVx/U/7alalfqWW3+NU1HC3S8y861afaSHbrple/Vc+7XOpF5Sff8c4N9eKyjN77d57Y+8G5D2tbTL88MKvZm4G08nSQr/8ZanBdGdChFbYo2KrGhy+0LxnUpFH7GJTXSwru6FyobWqNk8/L4FRge279FZLH7FBxGn+/O3vH2Y3772DXafXn4e0Fzb2qr+IiaGpMUpz/f0r7Y81ksFu15brDGJjWSlDfrrZkII17iUk6ufj6c5tS/I/1Cti7l5ErKm13wHz8eLPSIZNmO47LZDL2/7rD2nTinResOa/6Kvfp+zymX5/m3w0gMV0a/+aOmfLxZ1/5ppW5/d12x9e763DK9sGyXhvx1lca8tUavf3NlpEiuw3tZujVF17/8vXrM/VrZDusxzF6yQ298u08bDqXpaPpFTf90a4lGdQAFBfr56JtH++nefo3L9Lj/vCOxTI9X0UpyE/t55gD9/fZuur1XvD64O6lEx501vLUkqWW9EMXWdu5L4u7G7c6aqf3dvta4bi1NuubKv+mLIzro6eFt1D3BedK8Z4a31tpp7o8jSTOHtdJnk3pKkrrFXXnc1LZBqJ4Y3ML+8wd3JykxvrZu7Fhf3z56jXbMGqTNMwcUehSzbHLfQjPQ+vlYtfPZQU7Hl6TfdXF+7PJqgda8iFqFZ+z19bFq1vA2OjB3qKnT3ksM7a32Dp46p21HM/Ts59t1NP2iHkxuqgeTm9nnjPD3tWpYuxj9uO+UjqRd0OzFO/TO+CtTKj/z+XYt3nzUabbFq/H9nlP6Xq6DTHFW7T6pVbtPamLfxtpzPFM/7rsy8ZHjUL6m077QW+O6qEtcbb3z/QGnYyzdllKqc8P73No1Vgt/cm5Bs1gsemxQC6fh01fL3ay5v+vcQB+svzLB2JTBLbRg1X4N7xCjt77bX+Lj39uvsb7dfUJRwYF65fedNO+rXXr9m6tvBXzn8tTroUF++mlasg6fOa+QQD8lz/tGktSlUbi6J9TRtS0jFVrDz76eT9e42vrPfT3ts4tOvq6Z5n21S72bRjgdf2xSnMYmxdl//mHvSY1akNd5/KWRHTX+Xdd91W7p0kD/25aq9AtXHjEXN7Nvk8hgzbulvdIvZLt99DTGoS6uvDO+q65pfqUF5Lkb2+i6F76VJE3s01i+PhbZDENRwYHqGldbiyYWDmVTh7R0+sxqXNf1I6QAXx+9e3tX/Xw4XWv3n1ZIDd9CSw4MbltPtWv62x93//PORD24cJMmX9esyPdhFob2VkE2m6HHPtqs5lHBmtAnQVJePw9XM+e5GlY6qHW0bu0Wq9vecf2fubJbdFd3jXjjx+ILwisVNTNqUebd0l5vfLtPv6Tkdaz+/P5eys61qVlUsGoW+Ev8k42/6tWVezWhd4LTAnB//G07p58dRYcEKsVF5+ytTw9Um5n/K7S94LHWTuuviJoBslotHg0XLzjF94ZDZ3RTgdlq3UmIqKl9J88V2l7UYoE7jmXonz8e1AP9m9qnsS/Icej62qn9FeDrU+xf5qfPZdkf9f7t9m4a97brjvEH5g7V0bQL6nF5puFh7WP00si8x0knMi+p63PLFBkcoOOZl/TehO5FLhuwcudx3fbOT3pxRAfdcPlRzi2vr3aaAfaje3qoY2yYy5Eo2bm2Qo9sinMxO1cHTp1T86jgq14/6qn/bLP/XyiPqd5LgqG91djqfaf04fpf9dySHTIMQ/NX7FHz6Uu1/uCV/yB/Wbbb7QfW0m0pOp55qaKqW+YIInBnZLdY3dErvviCBTw1rJVu6tRAr4/pbN92LP2iOjYMLxREJOnGjg305UN9CzWN1/AvvJJqvh+n9rffFB35+VgU7OIc1xboZ2CRxeUNb/2TyS5vNGFBfrqlS+GOjJ0ahmvJ//W2P05w9IbD+//64b768J4eenJoy0KPJ3oUcQNvWS9Ez93Y1m0QkZwfsVqtlhI9IrC4+f7efo017nK/h37N8wJSTFgNdbw8Sd9tPeLsZesGB+jA3KFaOy3vmhW3flG/5pHaO3uIPYhIecsw5EtuGanOjdwvnOdpEJHyHge2iA4pk4UsB7aOvupjVBQe01RyhmFox7FMBQf6KiashnysFp27dGXuCsdFom5+dbVeGtlRfZrVLXYGwsfc/PWGyu+mTvWVcSFb43vG695/bVD6hWw1qhOkO3rFa8Zn24o/QCV2Y8f6+mTjkULbu8XXtv816u9jVVau6xkvnxzaSjUDfLVsch8tXHtYbxbzOGPVY9fIMGTvk3AhO9fjOk/sk6DXL3d+tha4gRRcJG5Y+xinqfmHtq2nAF8f1Qr0VabD/+tHBzZXnVoBWju1v7pdHuod4Of6xpa/rtD8UZ3sy8eHX3504m6dkVYxeX+hdm4Uri2/puuryX10IvOSusTV1sbp1+UFhMudNe/snVDoPV3t+iX1wkq2IKI7jtf53muayM/Hoj7N6jr181h0V5JOnL2k+i5WV/ZEwccfA1pH6x93dNOmQ2kaczkEVVZd4sLVOiZEjevWMrsqxSKMVCIXs3NlMwy9uWq/LmTnauOhM079Ivo1r6tXR3fWXUXMXXH/exu1tojOWqj64urU1P/1bypJ+vDuJL2ycq/+r39TxUfUrFJh5C+3dtCcJb/ohREdNHJBXmtXcKDrj6R/3pGol7/erQGto3XuUo5GvPGjAnyturlzA6dO0/mtGE0ig0vUUTm2wOiYnNwrf7G3jy1+BWQpLzi4CyMrH+2nlTtPqGtceKH9kltGaf7lToY3dqyvV1buVat6IXp5VEfFXx5uGhkSqDk3tVWuzXBaZuCTe3to1II1enzQleXmh7SN1sxhrbRsR6qeGta6RIHh/YlJys61KdDPR43q5J0zvGbhjo759V22I7VULU8FhQf5K6JWXn+GgssnuBMW5KcOsWEyDEMRwVfqaLXk9aHo39J5Ii9/X+tVBxF3ejetq95NXT+mqkz8fKz6/P5eZdLKUt4II5WE41Ti7qzceUIfrC88JLWgg0WsRYKqz/EvtaZRwU7DIBf/Xy8N/Wv5zt46oXe8Fqwq3OIwsHVUoYni9s4eosYOC67lP6uXpOEd6mt4B+chlVaLRU0ja2n38bNKSqij1fvyOjv7+1o1ecCVG++nk3qqYe0gbTh4xu0IrqjQK399J8bX1ho3K706alkvRM2iaik8yF+RwSX7690xgDj+Ef3WuC7y87EWmu1yQKsofbk9VRN6X7mpP5jcTO0ahKp7Qh2FBTmHgZHdCg9J7dgwXFufHuj0u2CxWDS+Z7zG9yx5WPCxWuRjdf9oydH80R21K+WsWsdcfb89Px+rvnqor6wWi/x9S9bKYrFY9PE9eYs27nFYQ6VgAISzqhBEJMKI6XalZmrTobRig0i+kvzl+7vXVl9ttVCJtXMz+kKSWseE6sDcocrJtZVoSfOiLH+4r37/5hodKzCh27ShrQqFkQVjuyi5ZaTGvr3WaaK3gk3cdWoFFNlfyWqxaOmDfZRrM+TnY9HyHcfVNKpwE3OH2DBJUkuHG+O4Ak3mY7s30uLNxyRJ703oron/XK+vtjuHpYJ8rBZ9+VDfIssUqnOBQJCvbX3X/06v/b6zTp3Lsq9dJOWFrUFtPFstteC1LW8Bvj5uR/6UhrsWmKLkX2vH4fu+Jk5hjrJDB1YTnTp7SQNe+FaPfUT/DW/z7wmJSizltNdtYoq/IRTXRN+zyZVn6/dd08TptY4Nw9QiOlhxdWo6TYDnzp9/117XtYqSxWLR9N+0KvT6cze2sX//8OVhhe6movax5t1k/X2tslgsSm4VZX984Er9sBr6/P5emj+qk54scO5u8bV1/7VNNO+W9rJaLfrrrR31+pjO2jj9Og1oFaXnby67WTI9YbVanIIIPNc0Mlj1w2qodUzIVfdfQeVAy0gF2XfirOrUCnCawa/zs6Vb3hsVY2S3hnpvbdGTuHni00k9dcP8vLkVkhLqKOmuOk4dkEsiKiSgxLNAFmXB2C5qNeN/6t00Qo8MbK5//HhQ6ReyVTc4QB/f00OGkXfTrFPTXyccWjI+uTevmfzOXvH2zqGOIxKaRQXro3t66OZXf7AHnlHdGioxvrbi6tSUr49V655MVh03fxWXZqGuNvVD1cZFK4TFYtHDDo92avj72EcXvDG2i8fnQeXh72vVikf60SpSjRBGKsDMz7bqb6sPSsr7izj9fLbeKcU8CKhYc25qW2wYaRBeQ7+euVBo+yf39tCNBeZycBqaWMLnuKE1/OyTN1kteQuJleaG/fT1rTXTYb2gIH9fp+GgiyZ211+X79bk65rJYrEov3phDkMuv3/iWnuHwCd/00rXtoxUxoUcxRToJNi5Ubh+mpas2pcDh8ViUZPIYPvrEbXctwpU9ef/CW4mqULZK2lfE1QNhJFyZhiGPYhIss8giKpp+6yBWvHLCfsQylGJDbX9aIa2Hc3QfofJoQJ8C3cKLM0z/kUTu2vQi6skSTajdPMWSMW3OLSIDtErozsXWabgyIQejSPclFSpH0ME+ZWsM2Vl89O0ZF3MzlW0Q6dZs6fXBqoSwkg52+ZmgTdUTUH+zv9l7uqdIF8fqwzD0BMfbdGidXmjnQr+gf/h3UlqVS9EPZvUUZTDKI23xnXRHX9zvUbPuKRGahF9pYOmp6MY2seG6efLw1tL25x9Q4f6+nHfabfTUpeVKYNb6IutKbqtDJdJr0iO4eunackyZLgMpABcI4yUs9JMooTKzXG14fzOcxaLRe1iQ+1hpKAulxe1+tedziuBFtX5rkcT55aHGh62GnwwMUnNnswbUVPaR+u3dIlVozo17ZNklZeJfRtrYt+yXYDOLHROBTzHQ7dyVtwqtqgYBVf9vBruVnOyyHGI55XtRT3bdhcS3r6tiwYUmJ/C074ijud1rNvcm9qW+BhWq0VJjeuUSadZAHCHMFKO/rXmoMuprVHxGhaYaVNSoZt9cf56eV2RHJvrqcjd9b3Mn6jJldZuhule2yKqUCfXqxo54LBruwZhpT8OAJQDwkgZSTufpa9/SVWOw2Q80z7ZamKNKpfympa5JAa1ji60NkNSQh29eGsHPZjc1OUiZQX9pl09Xd8+b2nx7BzXTSN1HUaJOLZENIsKdlVcklS7pr/WTu2vLU8NcFtmTPe8ybyudunvaUNa6rYecWpZz319AMAMhJEycuMrP+j2d9fZl2v+37YUcytUyZTF6pGrp1xbqv0mFZjU68DcoXrvru4K8vfVg8nNtHCicz+OhLo19aLDFOuS81DceDedOfu3jNRdfRIKrcxa3GjVyJBABQf6qf/lVVp7FegrMmt4a219eqC930lpTeiToKeub11lpocG4D3owFpG8od1Lt5yTKMSG2piEYvZeZsRXWLdrjj6++4N9c8fS9avpl5o6VpXirv3to4Jta8XIklfP9yvUJkQhwXcusbV1gsj2hdqbbFYLJo6pKWkvGn+PfXCrR20dGuKBrZyDm4Wi0W1StB6UxTiB4DKjJaRMmYY0kfrfzW7GpVCkL+P6tT01+QBzo8XHFdmrYhJrqJCAou9Gfv6uC7x4ogO6tG4jtNMnpJ0Y8cGRfa9cOzkWtJ3GBLop1u6xJbL/BS0hgCozGgZKQMXHYbvbjqcVqKly6ujRnWCFFrDT5t/TZckvTyqo65pHlnkjbAibpHulqUviRs61tcNHesXX7AIZgaB7gm19dOBM0puGWlaHQCgOISRMtBi+lKzq1DhXh/TudCjqD5N6+qZG9pow6Ez2nYk3W0QiQmtoZ0XXT/GiI+o6TSTab6SdDLNt+KRfvpp/2n7AoRmZIHK0hDx3oTuupRjU2AVndkUgHfgMQ1KxVWH1PwbcKeG4RqTFOfc6dNh5dXXxrifdrx7Qh2X2z+Z1FOSiu078eVDfRQfUVOdGoVfqZcsxbZOuBtiWxbMzCUWi4UgAqDSo2UELjWJrKU9x896tE9IoPu+Djd3bqCj6RfUPaGO4iOcR6N0ahimDYfSJEmD20S7XJyuSWReZ9H/3t9L7687rFdX7i1UZmDrKJfDaEvSSnFn73hJUr/mdYsvXAKVpGEEAKoEWkauUq7NzXScVdxjA5sXW8Zxhs9eTSI0sW+C27I+VoseTG7msuXDcXbPPs3q6vP7ezm9nh9EpLzHOI8PaqGnr29t3/bH37bT0Lb19NyNrmcWtUgam5Q3V8fgNq6HGAf4+mjSNU3KpYWksjyyAYDKipaRq9T88tof1U1J1iJ5+LpmmvPFL5Kkf96ZWKrzuIpybeqHqlt8ba3df1qS9PfbuxUqM65HnHo0rqO0C9nqGldbv+sS6/R6wQCQULeWts8a6PH6LqXF+iQAUHKEkauUU01bRtyJqBWg+67JW9DM52qmJ7/MMFwHEscjx7iZvbVpETObxtepqW5xtRVSw8++GF3BFXfLU1iQvz68O0mBfj4MqwWAYhBGroLhbsW0KsRicb3wm7u3tu7JZId9y+8mO7B1tNbsP63IUrYwWK0WvX93UhnXyjNXO2MqAHgL+oyUkmEYuunVH8yuxlWrHeRfbJnyyBw3d2ogSbq9V7zL4DOuR5zeGNNZSx7oXfYnBwBUKoSRUjqWflEbL48AqYx8rBa9UcQQWkla+mBvvTu+m1pEF37cEeDQOdXdLKmNXKyEW1J/+l07/fLMIMVH1HTZv8LHatGA1tGKqEXfCwCo7nhMU01ZLVKH2LAiy1hkUdsGIVr6YB/FPbHY6bXIkEDd26+xAv189No3e3U+K7fQ/v1bRmrK4BZqW9/zESiO819MGdxCZ85laUTX2GL2AgBUR4SRUvr1zAVTz9+7aYRW7T7p9nWLxaLIkED98MS12n40Q3f+fZ3H53hsUAtJ0uvfFJ7TI/8cE/s29vi4BdWpFaC3but61ccBAFRNPKYppQ/WHa6Q87hbU2T2jW11ffsYSdLjl0ODo/yBLjFhNVTLYW2WR0swf0hBPS8vaV8vNNDjfQEAKA5hpJSW7Ugt1+P7+Vh0YO5Q3dq1YaHX/nNfT8XWDtJfR3bUgblDdU+/wq0TPm76eUzs435iMnee/207PTqwuT68p4fH+wIAUBwe05RSec8dsWxyX0lSjs1W6LWilq7P567TqSPD5QwfhYUF+WvSNU1KVBYAAE/RMlJK5T3HSKPLC8vVKOVEXe6yiGOIsrCCCgCgEihVGJk/f77i4uIUGBioxMRErV27tsjyL774opo3b64aNWooNjZWDz30kC5evFiqCpslK8emN1ft05wlOzTkL6t05nx2hZy3d5MI3VqKUSZWN7OjliR+lKZfCQAApeVxGFm0aJEmT56smTNnasOGDWrfvr0GDhyo48ePuyz/73//W0888YRmzpypHTt26K233tKiRYs0derUq658RXrru/16dvEOvf7tPm0/llGmx77/WvePQKxWi+be3E7dE4qezXPB2C72xeCk0j+maRpZi0cyAIAK5XEYmTdvniZMmKDx48erVatWeu211xQUFKS3337bZfkffvhBPXv21KhRoxQXF6cBAwZo5MiRxbamVDY/H04rt2OX5OZfXLi4rlWUZg1vozHd8wLJ44OutG44TmrGMikAgMrGozCSlZWl9evXKzn5yvokVqtVycnJWr16tct9evToofXr19vDx759+7RkyRINGTLE7XkuXbqkjIwMp6/qzM/Hqo/u6aGwID+3ZUoaImYNb60fnrhWIxxG4YQF+Wvt1P76eeYAFm0DAFQ6HvWOPHnypHJzcxUVFeW0PSoqSr/88ovLfUaNGqWTJ0+qV69eMgxDOTk5uvvuu4t8TDNnzhw9/fTTnlSt3JXHPfz9iUlqEF5DPlaLOjcK1zPD2+j+9zZe1TEtFovLVW4jQwrPEeJrLZxFySoAgIpW7qNpVq5cqdmzZ+uVV17Rhg0b9PHHH2vx4sV65pln3O4zZcoUpaen278OH66YCcYqWv3wGk7BoajxOWU58mVinwT9tnMDNa5bs8yOCQBAaXnUMhIRESEfHx+lpjpP+JWamqro6GiX+0yfPl1jxozRnXfeKUlq27atzp07p7vuukvTpk2T1cVf5wEBAQoIqP4LpHkyPLikc4KUxJQhLcvsWAAAXC2PWkb8/f3VuXNnLV++3L7NZrNp+fLlSkpKcrnP+fPnCwUOH5+8BdLKe66OslQejy+q0NsHAKDceDyj1uTJkzVu3Dh16dJF3bp104svvqhz585p/PjxkqSxY8eqfv36mjNnjiRp2LBhmjdvnjp27KjExETt2bNH06dP17Bhw+yhpCpYsiXF1PMTXAAA1ZXHYWTEiBE6ceKEZsyYoZSUFHXo0EFLly61d2o9dOiQU0vIk08+KYvFoieffFJHjhxR3bp1NWzYMD333HNl9y7K0a9nzmv9wTMVcq6iWopspBEAQDVVqrnG77vvPt13330uX1u5cqXzCXx9NXPmTM2cObM0pzJdrz+suOpjbJh+nTo981Wh7eQLAABYm6ZCuOtuUrBTatPIYDclCS4AgOqLVXtNVDBgtIoJ0VvjuricJ2R090Zas/+0usUVPS08AABVDWGkArgbieOqsaN/yygXW6Xr28eoZXSwGtYJKruKucBKvgCAisZjmgrg7gbv6dDmplHBCvAtnxFIgX55vwrFLcgHAEBZo2XEBMkto5R5MVtxdSrPDKhfPthXX25P0ajEhsUXBgCgDBFGKkKBhpE3x3Uxpx5FaFgnSHf2TjC7GgAAL8Rjmgrg53MljfRsUsfEmgAAUPkQRsrIgFaFO55OGdxCTw5tqSB/Xz17Qxsl1K2pl0d2MqF2AABUXjymKSPNooL15XbnBQQn9m1s//733Rvp990bVXS1AACo9GgZAQAApiKMAAAAUxFGytDtPePNrgIAAFUOYaQMzRjWSn2a1TW7GgAAVCl0YC1j79zWVbP+u03d4hnCCwBASRBGypiP1aKnh7cxuxoAAFQZPKYBAACmomXEDcMwdO+/NpS4vLuVeQEAQNFoGXFjy5F0fbE1xexqAABQ7RFG3LiUYzO7CgAAeAXCSBkxDLNrAABA1UQYcYNwAQBAxSCMlBE6sAIAUDqEETcMmkYAAKgQhBEAAGAqwogbtIsAAFAxCCMAAMBUhBE3jmdeMrsKAAB4BcKIG098tNmj8gymAQCgdAgjbpzPyvWoPH1MAAAoHcIIAAAwFWEEAACYijACAABMRRhxITvX8xV76cAKAEDpEEZcOH0uy+wqAADgNQgjLrAsDQAAFYcw4sK8r3aaXQUAALwGYcSF99f9WqJyE/sklHNNAACo/nzNrkBV5O9r1Y9T+is8yE+vf7vP7OoAAFClEUZKqXZNf7OrAABAtcBjGgAAYCrCSCkwpwgAAGWHMFIKY7o3MrsKAABUG4QRD93SpYEeH9zC7GoAAFBtEEY81LNJhPx8XFw2Cw9vAAAoDcKIhyyEDgAAyhRhBAAAmIow4iHaRQAAKFuEkavUqWGYJOnGjvXNrQgAAFUUM7B6KCYs0OnnD+7uobMXcxQa5GdSjQAAqNpoGfHAU8NaqXOj2k7bfKwWgggAAFeBMOKBcT3izK4CAADVDmHEAwzrBQCg7BFGAACAqQgjAADAVIQRAABgKsIIAAAwFWGkhF4Z3cnsKgAAUC0RRkpoSNt6ZlcBAIBqiTACAABMRRgBAACmIowAAABTEUYAAICpCCMFnDp7yewqAADgVQgjBVzKsZldBQAAvAphpICUjItmVwEAAK9CGCkgNZ0wAgBARSKMFPDeT4fNrgIAAF6FMFLAt7tOmF0FAAC8CmEEAACYijACAABMVaowMn/+fMXFxSkwMFCJiYlau3ZtkeXT0tI0adIk1atXTwEBAWrWrJmWLFlSqgoDAIDqxdfTHRYtWqTJkyfrtddeU2Jiol588UUNHDhQO3fuVGRkZKHyWVlZuu666xQZGakPP/xQ9evX18GDBxUWFlYW9a8QSx/sbXYVAACotjwOI/PmzdOECRM0fvx4SdJrr72mxYsX6+2339YTTzxRqPzbb7+t06dP64cffpCfn58kKS4u7upqXcFaRIeYXQUAAKotjx7TZGVlaf369UpOTr5yAKtVycnJWr16tct9/vOf/ygpKUmTJk1SVFSU2rRpo9mzZys3N9fteS5duqSMjAynL7P4Wi2mnRsAAG/gURg5efKkcnNzFRUV5bQ9KipKKSkpLvfZt2+fPvzwQ+Xm5mrJkiWaPn26/vznP+vZZ591e545c+YoNDTU/hUbG+tJNcuUlTACAEC5KvfRNDabTZGRkXrjjTfUuXNnjRgxQtOmTdNrr73mdp8pU6YoPT3d/nX4sHkTkTWPCjbt3AAAeAOP+oxERETIx8dHqampTttTU1MVHR3tcp969erJz89PPj4+9m0tW7ZUSkqKsrKy5O/vX2ifgIAABQQEeFK1cjOkbT2zqwAAQLXmUcuIv7+/OnfurOXLl9u32Ww2LV++XElJSS736dmzp/bs2SOb7cpquLt27VK9evVcBpHK5qZO9c2uAgAA1ZrHj2kmT56sBQsW6G9/+5t27Nihe+65R+fOnbOPrhk7dqymTJliL3/PPffo9OnTeuCBB7Rr1y4tXrxYs2fP1qRJk8ruXZSjqJBAs6sAAEC15vHQ3hEjRujEiROaMWOGUlJS1KFDBy1dutTeqfXQoUOyWq9knNjYWP3vf//TQw89pHbt2ql+/fp64IEH9Pjjj5fduwAAAFWWxTAMw+xKFCcjI0OhoaFKT09XSEj5zvkR98Rip58PzB1arucDAKC6Kun9m7VpAACAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRhxkJpx0ewqAADgdQgjDnalZppdBQAAvA5hBAAAmIow4qDyz0ULAED1QxgBAACmIow4OJF5yewqAADgdQgjDh7+4GezqwAAgNchjFy2/uBps6sAAIBXIoxcdvOrq82uAgAAXokwUoRnhrc2uwoAAFR7hJEijEmKM7sKAABUe4QRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhBFJhmGYXQUAALwWYUTSodPnza4CAABeizAiKTvXZnYVAADwWoQRSTylAQDAPIQRSWQRAADMQxiRZKNpBAAA0xBGxGMaAADMRBgRYQQAADMRRiQdOn3O7CoAAOC1CCOSZny2rdA2Px+LCTUBAMD7EEYkXcjOLbStcd1aJtQEAADvQxiR6z4j9CMBAKBiEEYknb2UU2ibj5XHNAAAVATCiBt+vlwaAAAqAndcAABgKsKIG7d2jTW7CgAAeAXCiBv1QgPNrgIAAF6BMAIAAExFGHGDkb0AAFQMwggAADAVYQQAAJiKMOIOz2kAAKgQhBEAAGAqwggAADAVYcQNg+c0AABUCMIIAAAwFWHEjYa1a5pdBQAAvAJhxI0mkbXMrgIAAF6BMAIAAExFGAEAAKYijAAAAFMRRgAAgKkIIwAAwFSEERe6NAo3uwoAAHgNwogLvZvWNbsKAAB4DcIIAAAwFWHEBdalAQCg4hBGAACAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijDiQveEOmZXAQAAr+FrdgUqm/cnJqlbfG2zqwEAgNegZaQAgggAABWrVGFk/vz5iouLU2BgoBITE7V27doS7bdw4UJZLBbdcMMNpTktAACohjwOI4sWLdLkyZM1c+ZMbdiwQe3bt9fAgQN1/PjxIvc7cOCAHnnkEfXu3bvUlQUAANWPx2Fk3rx5mjBhgsaPH69WrVrptddeU1BQkN5++223++Tm5mr06NF6+umnlZCQcFUVBgAA1YtHYSQrK0vr169XcnLylQNYrUpOTtbq1avd7jdr1ixFRkbqjjvuKNF5Ll26pIyMDKcvAABQPXkURk6ePKnc3FxFRUU5bY+KilJKSorLfb777ju99dZbWrBgQYnPM2fOHIWGhtq/YmNjPakmAACoQsp1NE1mZqbGjBmjBQsWKCIiosT7TZkyRenp6favw4cPl2MtAQCAmTyaZyQiIkI+Pj5KTU112p6amqro6OhC5ffu3asDBw5o2LBh9m02my3vxL6+2rlzpxo3blxov4CAAAUEBHhSNQAAUEV51DLi7++vzp07a/ny5fZtNptNy5cvV1JSUqHyLVq00JYtW7Rp0yb71/XXX69rrrlGmzZt4vELAADwfAbWyZMna9y4cerSpYu6deumF198UefOndP48eMlSWPHjlX9+vU1Z84cBQYGqk2bNk77h4WFSVKh7QAAwDt5HEZGjBihEydOaMaMGUpJSVGHDh20dOlSe6fWQ4cOyWplYlcAAFAyFsMwDLMrUZyMjAyFhoYqPT1dISEhZX78uCcW278/MHdomR8fAABvVNL7N00YAADAVIQRBxG1GMEDAEBFI4w4qfRPrAAAqHYIIwAAwFSEEQeVvysvAADVD2EEAACYijDi4NS5LLOrAACA1yGMAAAAUxFGAACAqQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhBEAAGAqwoiDyOAAs6sAAIDXIYw4OJ55yewqAADgdQgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMOWkQHm10FAAC8DmEEAACYijACAABM5fVhJP18tv37WgG+JtYEAADv5PVh5EJ2rv37B5ObmVgTAAC8k9eHkb0nztq/r13T38SaAADgnbw6jOTk2jT6zTX2n61efTUAADCHV99+s3JtTj9bLRaTagIAgPfy6jACAADMRxhxQLsIAAAVjzACAABM5dVhxEJbCAAApvPqMAIAAMxHGAEAAKYijDhgZC8AABWPMAIAAExFGAEAAKYijAAAAFMRRpzQaQQAgIrm1WGEDqsAAJjPq8MIAAAwH2EEAACYijACAABMRRhxQB8SAAAqHmEEAACYijACAABMRRgBAACmIow4oMsIAAAVjzACAABMRRgBAACmIowAAABTEUYAAICpCCMOLMx6BgBAhSOMAAAAUxFGAACAqQgjAADAVIQRB/QYAQCg4hFGAACAqQgjAADAVIQRAABgKsIIAAAwVanCyPz58xUXF6fAwEAlJiZq7dq1bssuWLBAvXv3Vnh4uMLDw5WcnFxk+YqUlWtz+pk5zwAAqHgeh5FFixZp8uTJmjlzpjZs2KD27dtr4MCBOn78uMvyK1eu1MiRI7VixQqtXr1asbGxGjBggI4cOXLVlS9rwYF+ZlcBAACvYzEMw/Bkh8TERHXt2lUvv/yyJMlmsyk2Nlb333+/nnjiiWL3z83NVXh4uF5++WWNHTu2ROfMyMhQaGio0tPTFRIS4kl1i5R+IVvtn/7S/vOBuUPL7NgAAHi7kt6/PWoZycrK0vr165WcnHzlAFarkpOTtXr16hId4/z588rOzlbt2rXdlrl06ZIyMjKcvgAAQPXkURg5efKkcnNzFRUV5bQ9KipKKSkpJTrG448/rpiYGKdAU9CcOXMUGhpq/4qNjfWkmgAAoAqp0NE0c+fO1cKFC/XJJ58oMDDQbbkpU6YoPT3d/nX48OHyqZBHD6gAAEB58PWkcEREhHx8fJSamuq0PTU1VdHR0UXu+6c//Ulz587VsmXL1K5duyLLBgQEKCAgwJOqAQCAKsqjlhF/f3917txZy5cvt2+z2Wxavny5kpKS3O73/PPP65lnntHSpUvVpUuX0te2jBk0jQAAYDqPWkYkafLkyRo3bpy6dOmibt266cUXX9S5c+c0fvx4SdLYsWNVv359zZkzR5L0hz/8QTNmzNC///1vxcXF2fuW1KpVS7Vq1SrDtwIAAKoij8PIiBEjdOLECc2YMUMpKSnq0KGDli5dau/UeujQIVmtVxpcXn31VWVlZem3v/2t03Fmzpypp5566upqDwAAqjyP5xkxQ3nNM3LmXJY6PvOV/WfmGQEAoOyUyzwjAAAAZc2rw0ilbxICAMALeHUYAQAA5vPqMFIFussAAFDteXUYAQAA5iOMAAAAU3l1GMnlMQ0AAKbz6jCyeu8ps6sAAIDX8+owcinbZnYVAADwel4dRmw8pgEAwHReHUaIIgAAmM+7wwhpBAAA03l3GKFtBAAA03l3GCGLAABgOi8PI6QRAADM5t1hxOwKAAAA7w4jNhtxBAAAs3l1GAEAAObz6jBCuwgAAObz6jDCUxoAAMzn1WGE0TQAAJjPy8OI2TUAAABeHUYAAID5vDqMMB08AADm8+owQgdWAADM59Vh5M1V+8yuAgAAXs+rw8jJs1lmVwEAAK/n1WEEAACYjzACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhJHL/ntfL7OrAACAVyKMXNa2QajZVQAAwCsRRgAAgKm8Oox89/g1SqhbUwvv6m52VQAA8Fq+ZlfATA3Cg/T1w/3MrgYAAF7Nq1tGAACA+QgjAADAVIQRAABgKsIIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhBEAAGAqwggAADAVYQQAAJiqSqzaaxiGJCkjI8PkmgAAgJLKv2/n38fdqRJhJDMzU5IUGxtrck0AAICnMjMzFRoa6vZ1i1FcXKkEbDabjh49quDgYFksljI7bkZGhmJjY3X48GGFhISU2XHhjOtcMbjOFYPrXDG4zhWjvK+zYRjKzMxUTEyMrFb3PUOqRMuI1WpVgwYNyu34ISEh/LJXAK5zxeA6Vwyuc8XgOleM8rzORbWI5KMDKwAAMBVhBAAAmMqrw0hAQIBmzpypgIAAs6tSrXGdKwbXuWJwnSsG17liVJbrXCU6sAIAgOrLq1tGAACA+QgjAADAVIQRAABgKsIIAAAwlVeHkfnz5ysuLk6BgYFKTEzU2rVrza5SpfXUU0/JYrE4fbVo0cL++sWLFzVp0iTVqVNHtWrV0s0336zU1FSnYxw6dEhDhw5VUFCQIiMj9eijjyonJ8epzMqVK9WpUycFBASoSZMmevfddyvi7Znm22+/1bBhwxQTEyOLxaJPP/3U6XXDMDRjxgzVq1dPNWrUUHJysnbv3u1U5vTp0xo9erRCQkIUFhamO+64Q2fPnnUqs3nzZvXu3VuBgYGKjY3V888/X6guH3zwgVq0aKHAwEC1bdtWS5YsKfP3a5birvNtt91W6Pd70KBBTmW4zkWbM2eOunbtquDgYEVGRuqGG27Qzp07ncpU5OdEdf18L8l17tevX6Hf57vvvtupTKW7zoaXWrhwoeHv72+8/fbbxrZt24wJEyYYYWFhRmpqqtlVq5RmzpxptG7d2jh27Jj968SJE/bX7777biM2NtZYvny5sW7dOqN79+5Gjx497K/n5OQYbdq0MZKTk42NGzcaS5YsMSIiIowpU6bYy+zbt88ICgoyJk+ebGzfvt146aWXDB8fH2Pp0qUV+l4r0pIlS4xp06YZH3/8sSHJ+OSTT5xenzt3rhEaGmp8+umnxs8//2xcf/31Rnx8vHHhwgV7mUGDBhnt27c3fvzxR2PVqlVGkyZNjJEjR9pfT09PN6KioozRo0cbW7duNd577z2jRo0axuuvv24v8/333xs+Pj7G888/b2zfvt148sknDT8/P2PLli3lfg0qQnHXedy4ccagQYOcfr9Pnz7tVIbrXLSBAwca77zzjrF161Zj06ZNxpAhQ4yGDRsaZ8+etZepqM+J6vz5XpLr3LdvX2PChAlOv8/p6en21yvjdfbaMNKtWzdj0qRJ9p9zc3ONmJgYY86cOSbWqvKaOXOm0b59e5evpaWlGX5+fsYHH3xg37Zjxw5DkrF69WrDMPJuBlar1UhJSbGXefXVV42QkBDj0qVLhmEYxmOPPWa0bt3a6dgjRowwBg4cWMbvpnIqeJO02WxGdHS08cc//tG+LS0tzQgICDDee+89wzAMY/v27YYk46effrKX+eKLLwyLxWIcOXLEMAzDeOWVV4zw8HD7dTYMw3j88ceN5s2b23++5ZZbjKFDhzrVJzEx0Zg4cWKZvsfKwF0YGT58uNt9uM6eO378uCHJ+OabbwzDqNjPCW/6fC94nQ0jL4w88MADbvepjNfZKx/TZGVlaf369UpOTrZvs1qtSk5O1urVq02sWeW2e/duxcTEKCEhQaNHj9ahQ4ckSevXr1d2drbT9WzRooUaNmxov56rV69W27ZtFRUVZS8zcOBAZWRkaNu2bfYyjsfIL+Ot/yb79+9XSkqK0zUJDQ1VYmKi03UNCwtTly5d7GWSk5NltVq1Zs0ae5k+ffrI39/fXmbgwIHauXOnzpw5Yy/j7dd+5cqVioyMVPPmzXXPPffo1KlT9te4zp5LT0+XJNWuXVtSxX1OeNvne8HrnO9f//qXIiIi1KZNG02ZMkXnz5+3v1YZr3OVWCivrJ08eVK5ublO/xCSFBUVpV9++cWkWlVuiYmJevfdd9W8eXMdO3ZMTz/9tHr37q2tW7cqJSVF/v7+CgsLc9onKipKKSkpkqSUlBSX1zv/taLKZGRk6MKFC6pRo0Y5vbvKKf+6uLomjtcsMjLS6XVfX1/Vrl3bqUx8fHyhY+S/Fh4e7vba5x+juhs0aJBuuukmxcfHa+/evZo6daoGDx6s1atXy8fHh+vsIZvNpgcffFA9e/ZUmzZtJKnCPifOnDnjNZ/vrq6zJI0aNUqNGjVSTEyMNm/erMcff1w7d+7Uxx9/LKlyXmevDCPw3ODBg+3ft2vXTomJiWrUqJHef/99rwsJqH5uvfVW+/dt27ZVu3bt1LhxY61cuVL9+/c3sWZV06RJk7R161Z99913ZlelWnN3ne+66y77923btlW9evXUv39/7d27V40bN67oapaIVz6miYiIkI+PT6Fe3KmpqYqOjjapVlVLWFiYmjVrpj179ig6OlpZWVlKS0tzKuN4PaOjo11e7/zXiioTEhLilYEn/7oU9XsaHR2t48ePO72ek5Oj06dPl8m199b/DwkJCYqIiNCePXskcZ09cd999+nzzz/XihUr1KBBA/v2ivqc8JbPd3fX2ZXExERJcvp9rmzX2SvDiL+/vzp37qzly5fbt9lsNi1fvlxJSUkm1qzqOHv2rPbu3at69eqpc+fO8vPzc7qeO3fu1KFDh+zXMykpSVu2bHH6QP/qq68UEhKiVq1a2cs4HiO/jLf+m8THxys6OtrpmmRkZGjNmjVO1zUtLU3r16+3l/n6669ls9nsH0BJSUn69ttvlZ2dbS/z1VdfqXnz5goPD7eX4dpf8euvv+rUqVOqV6+eJK5zSRiGofvuu0+ffPKJvv7660KPrCrqc6K6f74Xd51d2bRpkyQ5/T5XuuvscZfXamLhwoVGQECA8e677xrbt2837rrrLiMsLMypdzGuePjhh42VK1ca+/fvN77//nsjOTnZiIiIMI4fP24YRt6QvYYNGxpff/21sW7dOiMpKclISkqy758/lGzAgAHGpk2bjKVLlxp169Z1OZTs0UcfNXbs2GHMnz+/2g/tzczMNDZu3Ghs3LjRkGTMmzfP2Lhxo3Hw4EHDMPKG9oaFhRmfffaZsXnzZmP48OEuh/Z27NjRWLNmjfHdd98ZTZs2dRpympaWZkRFRRljxowxtm7daixcuNAICgoqNOTU19fX+NOf/mTs2LHDmDlzZrUZcmoYRV/nzMxM45FHHjFWr15t7N+/31i2bJnRqVMno2nTpsbFixftx+A6F+2ee+4xQkNDjZUrVzoNKT1//ry9TEV9TlTnz/firvOePXuMWbNmGevWrTP2799vfPbZZ0ZCQoLRp08f+zEq43X22jBiGIbx0ksvGQ0bNjT8/f2Nbt26GT/++KPZVaq0RowYYdSrV8/w9/c36tevb4wYMcLYs2eP/fULFy4Y9957rxEeHm4EBQUZN954o3Hs2DGnYxw4cMAYPHiwUaNGDSMiIsJ4+OGHjezsbKcyK1asMDp06GD4+/sbCQkJxjvvvFMRb880K1asMCQV+ho3bpxhGHnDe6dPn25ERUUZAQEBRv/+/Y2dO3c6HePUqVPGyJEjjVq1ahkhISHG+PHjjczMTKcyP//8s9GrVy8jICDAqF+/vjF37txCdXn//feNZs2aGf7+/kbr1q2NxYsXl9v7rmhFXefz588bAwYMMOrWrWv4+fkZjRo1MiZMmFDoA5XrXDRX11eS0//hivycqK6f78Vd50OHDhl9+vQxateubQQEBBhNmjQxHn30Uad5Rgyj8l1ny+U3BwAAYAqv7DMCAAAqD8IIAAAwFWEEAACYijACAABMRRgBAACmIowAAABTEUYAAICpCCMAAMBUhBEAAGAqwggAADAVYQQAAJiKMAIAAEz1/0aG6xp+mInBAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(network._history['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:13:54.915422Z",
"start_time": "2023-12-03T22:13:54.154311Z"
},
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_UQYITJGCzLH",
"outputId": "da4566fb-e37a-4a35-ac6b-7fba06926113"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test accuracy: 0.9107999801635742\n"
]
}
],
"source": [
"x_test, y_test = next(iter(test_loader))\n",
"x_test, y_test = x_test.to(DEVICE), y_test.to(DEVICE)\n",
"\n",
"print('Test accuracy:', network.predict(x_test).eq(y_test).float().mean().item())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2023-12-03T22:14:00.468042Z",
"start_time": "2023-12-03T22:13:59.979175Z"
},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 573
},
"id": "KXsNdJfYC9YK",
"outputId": "c3e43afe-2e11-456d-c2f8-bdd2cc363cb1"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAHHCAYAAABEEKc/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABdZUlEQVR4nO3dd1gU58IF8DNLWTpIkaIIdiwIioBo7EQsUVESe429RSUmxtyoaVejJsbYu8aWqIldY0SixoKiFAsqIlFBpYhIl7rz/eHn3oCggCzDLuf3PPs82dl3Z88wd+8eZ9+dEURRFEFERERESjKpAxARERFVNSxIREREREWwIBEREREVwYJEREREVAQLEhEREVERLEhERERERbAgERERERXBgkRERERUBAsSERERUREsSEREKiYIAr788kupYxBRGbAgEVGF27p1KwRBwJUrV6SOUmFu3bqF7t27w8jICObm5hg+fDiePHkidSwiUhFtqQMQEVV1Dx8+RIcOHWBqaooFCxYgIyMD33//Pa5fv47g4GDo6upKHZGIKhgLEhFVewqFArm5udDT0yv28QULFiAzMxMhISGoU6cOAMDDwwPvvvsutm7divHjx1dmXCKqBPyKjYgkkZubi3nz5sHNzQ2mpqYwNDRE+/btcerUKeUYURTh6OiIvn37vvL87OxsmJqaYsKECcplOTk5mD9/Pho0aAC5XA57e3t8+umnyMnJKfRcQRAwdepU7Ny5E82aNYNcLsfx48dLzPr777/jvffeU5YjAPD29kajRo2wZ8+ecm1/WFgYevToARMTExgZGaFr1664ePFioTF5eXn46quv0LBhQ+jp6cHCwgLvvPMOAgIClGPi4+MxevRo1K5dG3K5HLa2tujbty/u379frlxE9AKPIBGRJNLS0rBx40YMHjwY48aNQ3p6OjZt2gQfHx8EBwfD1dUVgiBg2LBhWLx4MZKTk2Fubq58/uHDh5GWloZhw4YBeHEUqE+fPjh37hzGjx+PJk2a4Pr16/jxxx9x584dHDhwoNDr//XXX9izZw+mTp0KS0tLODo6Fpvz0aNHSExMROvWrV95zMPDA8eOHSvztkdERKB9+/YwMTHBp59+Ch0dHaxbtw6dOnXCmTNn4OnpCQD48ssvsXDhQowdOxYeHh5IS0vDlStXEBoainfffRcA4Ofnh4iICEybNg2O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EtdT1ve9FIpua3GCg4NFAOKDBw9KHFPW94JUitvekSNHin379i3TejRl3/bt21fs0qXLa8eoy76tKDyCVIlyc3MREhICb29v5TKZTAZvb28EBQUV+5ygoKBC4wHAx8enxPFVWWpqKgDA3Nz8teMyMjLg4OAAe3t79O3bFxEREZUR761FRUXBzs4O9erVw9ChQxETE1PiWE3ar7m5udixYwc+/PDD1164WV3367/du3cP8fHxhfadqakpPD09S9x35XnfV1WpqakQBAFmZmavHVeW90JVc/r0adSsWRONGzfGpEmT8PTp0xLHasq+TUhIwNGjRzFmzJg3jlXnfVtWLEiVKCkpCQUFBbC2ti603NraGvHx8cU+Jz4+vkzjqyqFQoEZM2agXbt2aN68eYnjGjdujM2bN+PgwYPYsWMHFAoF2rZti4cPH1Zi2rLz9PTE1q1bcfz4caxZswb37t1D+/btkZ6eXux4TdmvAHDgwAGkpKRg1KhRJY5R1/1a1Mv9U5Z9V573fVWUnZ2N2bNnY/Dgwa+9kGlZ3wtVSffu3bFt2zYEBgZi0aJFOHPmDHr06IGCgoJix2vKvv35559hbGyM/v37v3acOu/b8tCWOgBVD1OmTMGNGzfe+H21l5cXvLy8lPfbtm2LJk2aYN26dfjmm29UHbPcevToofzvFi1awNPTEw4ODtizZ0+p/lWmzjZt2oQePXrAzs6uxDHqul/phby8PAwYMACiKGLNmjWvHavO74VBgwYp/9vZ2RktWrRA/fr1cfr0aXTt2lXCZKq1efNmDB069I0/nFDnfVsePIJUiSwtLaGlpYWEhIRCyxMSEmBjY1Psc2xsbMo0viqaOnUqjhw5glOnTqF27dpleq6Ojg5atmyJu3fvqiidapiZmaFRo0Yl5taE/QoADx48wMmTJzF27NgyPU9d9+vL/VOWfVee931V8rIcPXjwAAEBAa89elScN70XqrJ69erB0tKyxOzqvm8B4OzZs4iMjCzzexhQ731bGixIlUhXVxdubm4IDAxULlMoFAgMDCz0r+t/8/LyKjQeAAICAkocX5WIooipU6di//79+Ouvv1C3bt0yr6OgoADXr1+Hra2tChKqTkZGBqKjo0vMrc779d+2bNmCmjVrolevXmV6nrru17p168LGxqbQvktLS8OlS5dK3Hfled9XFS/LUVRUFE6ePAkLC4syr+NN74Wq7OHDh3j69GmJ2dV53760adMmuLm5wcXFpczPVed9WypSzxKvbn799VdRLpeLW7duFW/evCmOHz9eNDMzE+Pj40VRFMXhw4eLn332mXL8+fPnRW1tbfH7778Xb926Jc6fP1/U0dERr1+/LtUmlNqkSZNEU1NT8fTp02JcXJzylpWVpRxTdHu/+uor8c8//xSjo6PFkJAQcdCgQaKenp4YEREhxSaU2scffyyePn1avHfvnnj+/HnR29tbtLS0FBMTE0VR1Kz9+lJBQYFYp04dcfbs2a88ps77NT09XQwLCxPDwsJEAOLSpUvFsLAw5S+3vvvuO9HMzEw8ePCgeO3aNbFv375i3bp1xefPnyvX0aVLF3HFihXK+29630vldduam5sr9unTR6xdu7YYHh5e6D2ck5OjXEfRbX3Te0FKr9ve9PR0cdasWWJQUJB479498eTJk2KrVq3Ehg0bitnZ2cp1aMK+fSk1NVU0MDAQ16xZU+w61GnfqgILkgRWrFgh1qlTR9TV1RU9PDzEixcvKh/r2LGjOHLkyELj9+zZIzZq1EjU1dUVmzVrJh49erSSE5cPgGJvW7ZsUY4pur0zZsxQ/m2sra3Fnj17iqGhoZUfvowGDhwo2trairq6umKtWrXEgQMHinfv3lU+rkn79aU///xTBCBGRka+8pg679dTp04V+7/bl9ujUCjEuXPnitbW1qJcLhe7du36yt/AwcFBnD9/fqFlr3vfS+V123rv3r0S38OnTp1SrqPotr7pvSCl121vVlaW2K1bN9HKykrU0dERHRwcxHHjxr1SdDRh3760bt06UV9fX0xJSSl2Heq0b1VBEEVRVOkhKiIiIiI1wzlIREREREWwIBEREREVwYJEREREVAQLEhEREVERLEhERERERbAgERERERXBgkRERERUBAsSEVV5jo6OWLZsWanHnz59GoIgICUlRWWZqpKy/n2I6M1YkIiowgiC8Nrbl19+Wa71Xr58GePHjy/1+LZt2yIuLg6mpqblej0iIm2pAxCR5oiLi1P+9+7duzFv3jxERkYqlxkZGSn/WxRFFBQUQFv7zf83ZGVlVaYcurq6anM1dSKqmngEiYgqjI2NjfJmamoKQRCU92/fvg1jY2P88ccfcHNzg1wux7lz5xAdHY2+ffvC2toaRkZGcHd3x8mTJwut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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAHHCAYAAACfqw0dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABf3klEQVR4nO3deVhVBf7H8fdlR1lEEBRFSXFPMAERl5qUBHOtLLVyy7LUtnEy9dekTc3kkjVOaaZWLpVLWdpkSSqKu4K7qWXuKyiorMp27+8P7E6UCyJ6LvB5Pc95njjLvZ97y/h4zrnfa7JYLBZERERE5KbYGR1AREREpCxSiRIREREpAZUoERERkRJQiRIREREpAZUoERERkRJQiRIREREpAZUoERERkRJQiRIREREpAZUoERERkRJQiRIRsQGBgYEMGDDA6BgichNUokTEELNnz8ZkMrF161ajo5SKhIQEhg4dSmhoKI6OjphMJqMjichtphIlIlIKfvjhBz7++GNMJhN169Y1Oo6I3AEqUSIixWA2m7l8+fI1tw8ZMoS0tDS2bt3KAw88cAeTiYhRVKJExGbl5uYyZswYQkND8fT0pHLlyrRr147Vq1db97FYLAQGBtK9e/c/HX/58mU8PT159tlnretycnIYO3YsQUFBODs7ExAQwKuvvkpOTk6RY00mE88//zxffPEFTZs2xdnZmdjY2Gtm9fPzw9XVtRRe9f8cPnyYRx99lKpVq1KpUiVatWrF999//6f9PvjgA5o2bUqlSpXw8vIiLCyMefPmWbdnZGTw8ssvExgYiLOzM76+vjzwwANs3769VPOKVDQORgcQEbmW9PR0Pv74Y/r06cMzzzxDRkYGn3zyCdHR0SQkJNC8eXNMJhNPPvkkEydO5Pz581StWtV6/HfffUd6ejpPPvkkUHg2qVu3bqxfv57BgwfTuHFj9uzZw7///W8OHDjAkiVLijz/qlWr+PLLL3n++efx8fEhMDDwjr325ORkWrduTXZ2Ni+++CLe3t7MmTOHbt26sWjRIh566CEAZs6cyYsvvkjPnj156aWXuHz5Mrt372bLli08/vjjADz33HMsWrSI559/niZNmpCamsr69evZv38/LVq0uGOvSaTcsYiIGGDWrFkWwJKYmHjNffLz8y05OTlF1l24cMHi5+dneeqpp6zrfvnlFwtgmTZtWpF9u3XrZgkMDLSYzWaLxWKxfPbZZxY7OzvLunXriuz30UcfWQDLhg0brOsAi52dnWXv3r03/dqGDRtmudn/vdapU8fSv39/688vv/yyBSiSNSMjw3LXXXdZAgMDLQUFBRaLxWLp3r27pWnTptd9bE9PT8uwYcNuKo+I3Jgu54mIzbK3t8fJyQkoPIt0/vx58vPzCQsLK3IpqkGDBkRERPDFF19Y150/f55ly5bxxBNPWD8p99VXX9G4cWMaNWpESkqKdWnfvj1AkcuEAPfddx9NmjS53S/zqn744QdatmxJ27Ztrevc3NwYPHgwR48eZd++fQBUqVKFkydPkpiYeM3HqlKlClu2bOH06dO3PbdIRaISJSI2bc6cOQQHB+Pi4oK3tzfVqlXj+++/Jy0trch+/fr1Y8OGDRw7dgwoLEx5eXn07dvXus+vv/7K3r17qVatWpGlQYMGAJw9e7bIY9511123+dVd27Fjx2jYsOGf1jdu3Ni6HWDkyJG4ubnRsmVL6tevz7Bhw9iwYUORYyZOnMhPP/1EQEAALVu25I033uDw4cO3/0WIlHMqUSJisz7//HMGDBhAvXr1+OSTT4iNjWXFihW0b98es9lcZN/evXvj6OhoPRv1+eefExYWVqSImM1mmjVrxooVK666DB06tMhjlvaN4rdD48aN+eWXX1iwYAFt27bl66+/pm3btowdO9a6z2OPPcbhw4f54IMP8Pf355133qFp06YsW7bMwOQiZZ9uLBcRm7Vo0SLq1q3LN998U2R45e8Lwm+qVq1K586d+eKLL3jiiSfYsGEDkydPLrJPvXr12LVrFx06dLD5YZh16tThl19++dP6n3/+2br9N5UrV6ZXr1706tWL3NxcHn74Yf71r38xevRoXFxcAKhRowZDhw5l6NChnD17lhYtWvCvf/2LTp063ZkXJFIO6UyUiNgse3t7oHCMwW+2bNnCpk2brrp/37592bdvHyNGjMDe3p7evXsX2f7YY49x6tQpZs6c+adjL126RFZWVimmvzUPPvggCQkJRV5rVlYWM2bMIDAw0HqvVmpqapHjnJycaNKkCRaLhby8PAoKCv506dPX1xd/f/8/jXUQkZujM1EiYqhPP/30qvOXXnrpJbp06cI333zDQw89ROfOnTly5AgfffQRTZo0ITMz80/HdO7cGW9vb7766is6deqEr69vke19+/blyy+/5LnnnmP16tW0adOGgoICfv75Z7788kt+/PFHwsLCSvQ6jh07xmeffQZg/Sqbf/7zn0DhWaPf35tVHKNGjWL+/Pl06tSJF198kapVqzJnzhyOHDnC119/jZ1d4d+BO3bsSPXq1WnTpg1+fn7s37+fKVOm0LlzZ9zd3bl48SK1atWiZ8+ehISE4ObmxsqVK0lMTOTdd98t0WsVkSuM/nigiFRMv404uNZy4sQJi9lstrz99tuWOnXqWJydnS333HOPZenSpZb+/ftb6tSpc9XHHTp0qAWwzJs376rbc3NzLRMmTLA0bdrU4uzsbPHy8rKEhoZa/vGPf1jS0tKs+wE3NRZg9erV13wt99133w2P/+OIA4vFYjl06JClZ8+elipVqlhcXFwsLVu2tCxdurTIPtOnT7fce++9Fm9vb4uzs7OlXr16lhEjRlhfS05OjmXEiBGWkJAQi7u7u6Vy5cqWkJAQy4cffljs1yYiV2eyWH53nlxEpIz761//yieffEJSUhKVKlUyOo6IlGO6J0pEyo3Lly/z+eef88gjj6hAichtp3uiRKTMO3v2LCtXrmTRokWkpqby0ksvGR1JRCoAlSgRKfP27dvHE088ga+vL++//z7Nmzc3OpKIVAC6J0pERESkBHRPlIiIiEgJqESJiIiIlIDuibqNzGYzp0+fxt3d3ea/YkJEREQKWSwWMjIy8Pf3tw62vRqVqNvo9OnTBAQEGB1DRERESuDEiRPUqlXrmttVom4jd3d3oPBfgoeHh8FpREREpDjS09MJCAiw/h6/FpWo2+i3S3geHh4qUSIiImXMjW7F0Y3lIiIiIiWgEiUiIiJSAipRIiIiIiWgEiUiIiJSAipRIiIiIiWgEiUiIiJSAipRIiIiIiWgEiUiIiJSAipRIiIiIiWgEiUiIiJSAipRIiIiIiWgEiUiIiJSAipRZdAvSRmkZOYYHUNERKRCczA6gNy8/1u8h23HLtCoujttg3xoE+RDy7uqUtlZ/zpFRETuFP3WLWMKzBZy880A/JyUwc9JGXy8/ggOdiZa1PaidZA3bYN8CAmogqO9TjSKiIjcLiaLxWIxOkR5lZ6ejqenJ2lpaXh4eJTqY6dk5rDxUCobD6aw/mAKJy9cKrK9spM9EXW9aV3Pm7b1fWjo547JZCrVDCIiIuVRcX9/q0TdRrezRP3R8dRs1h9MYcOhFDYeTOFCdl6R7T5uzoWFKsiH1kHe1PKqdFvziIiIlFUqUTbgTpao3zObLew7k87GQymsP5hK4pHzXMorKLJPoHclWgf50DbIh8i63nhVdrpj+URERGyZSpQNMKpE/VFOfgE7jl+0XvrbdTKNAvP//rWbTNDU34M2QT60qedDeGBVXJ3sDcsrIiJiJJUoG2ArJeqPMi7nseXwedYfTGHjoRQOJGcW2e5kb0eLOlWuXPrzIbimJw66SV1ERCoIlSgbYKsl6o/Opl9m46HUwnuqDqZwJu1yke3uzg60qudNmys3qder5qab1EVEpNxSibIBZaVE/Z7FYuFIShYbDqaw4WAqGw+lkH45v8g+vu7O1rNUbYK8qeHpalBaERGR0qcSZQPKYon6owKzhb2n0wov/R1MJfHoeXKuzKn6Td1qlQtLVb3Cm9Q9KzkalFZEROTWqUTZgPJQov7ocl4B249duDJOIZU9Jy/yu3vUsTNBs5qetLnyyb8WdbxwcdRN6iIiUnaoRNmA8lii/ijtUh6bD6ey4con/w6fyyqy3dnBjvDAqtZJ6k39PbG30/1UIiJiu1SibEBFKFF/dCbtUuG9VFdK1dmMol+U7OnqSGRdb9rU96FNPW/u8qmsm9RFRMSmqETZgIpYon7PYrFw6Fwm638tHPq55XAqGTlFb1L393SxDv1sHeSNr7uLQWlFREQKqUTZgIpeov4ov8DM7lNp1rNU249dJLeg6E3qDfzcaF2vsFRF1K2Ku4tuUhcRkTtLJcoGqERd36XcAhKPnmfDocL5VHtPp/P7/xrt7UyE1PK0jlO4p3YVnB10k7qIiNxeKlE2QCXq5lzIymXT4dQr4xRSOJqaXWS7q6M94XdVpW2QN22CfGhc3QM73aQuIiKlTCXKBqhE3ZqTF7LZeDDV+vU0KZm5RbZXrexEZD1v2ly5/Ffbu5JBSUVEpDxRibIBKlGlx2Kx8EtyBhsOFo5T2HI4lazcgiL71PJytV76a13PGx83Z4PSiohIWaYSZQNUom6fvAIzu05ctE5S3378Avnmov8pN6ruTtsgH9o1qEbbIB/NpxIRkWJRibIBKlF3TlZOPglHz7Ph18JJ6vvPpBfZHuTrxgvtg+gS7K8yJSIi16USZQNUooyTkpnDxkOpbPg1hWU/nbF+iXJdn8oMuz+I7s39cbC3MziliIjYIpUoG6ASZRvSL+cxd+NRPl5/hIvZeQDUrlqJ5+8P4qEWNXFUmRIRkd9RibIBKlG2JTMnn882HWPmusOczyr8pF8tL1eG/iWInqG1cHJQmRIREZUom6ASZZuyc/P5YvNxpq89TEpm4Xf7+Xu6MOQv9Xg0LAAXRw30FBGpyFSibIBKlG27lFvA/ITjfLTmkPWLkv08nHnuvnr0aVlbZUpEpIJSibIBKlFlw+W8Ar7ceoJp8Yc4k3YZAB83Z567ry6PR9SmkpODwQlFROROUomyASpRZUtOfgGLtp3kw9WHOHXxEgDelZ145t669G1Vh8rOKlMiIhWBSpQNUIkqm3LzzSzecZIpqw9y4nxhmfKq5MjT7erSL7IO7i6OBicUEZHbSSXKBqhElW15BWa+3XmaKat+tX4ZsqerI0+1uYsBbQLxdFWZEhEpj4r7+9smPtM9depUAgMDcXFxISIigoSEhGvuO3PmTNq1a4eXlxdeXl5ERUX9af8BAwZgMpmKLDExMUX22b59Ow888ABVqlTB29ubwYMHk5mZWWSf48eP07lzZypVqoSvry8jRowgPz+/9F642DRHezt6htZi5fD7mNyrOfWqVSbtUh7/XnmAthNW8d6KA1zMzr3xA4mISLlkeIlauHAhw4cPZ+zYsWzfvp2QkBCio6M5e/bsVfePj4+nT58+rF69mk2bNhEQEEDHjh05depUkf1iYmI4c+aMdZk/f7512+nTp4mKiiIoKIgtW7YQGxvL3r17GTBggHWfgoICOnfuTG5uLhs3bmTOnDnMnj2bMWPG3Jb3QWyXg70dPe6pyfK/3scHfe6hgZ8bGZfzeT/uV9pOWM07P/5snTslIiIVh+GX8yIiIggPD2fKlCkAmM1mAgICeOGFFxg1atQNjy8oKMDLy4spU6bQr18/oPBM1MWLF1myZMlVj5kxYwavv/46Z86cwc6usEfu2bOH4OBgfv31V4KCgli2bBldunTh9OnT+Pn5AfDRRx8xcuRIzp07h5OT0w2z6XJe+WQ2W/hxbxL/ifuVn5MyAKjkZE/fyDo8064uPm7OBicUEZFbUSYu5+Xm5rJt2zaioqKs6+zs7IiKimLTpk3Feozs7Gzy8vKoWrVqkfXx8fH4+vrSsGFDhgwZQmpqqnVbTk4OTk5O1gIF4OrqCsD69esB2LRpE82aNbMWKIDo6GjS09PZu3fvzb9YKTfs7Ex0alaDH15sx4y+odxd04Ps3AKmrzlM2wmr+OfSfZxNv2x0TBERuc0MLVEpKSkUFBQUKSoAfn5+JCUlFesxRo4cib+/f5EiFhMTw9y5c4mLi2PChAmsWbOGTp06UVBQAED79u1JSkrinXfeITc3lwsXLljPep05cwaApKSkq+b6bdvV5OTkkJ6eXmSR8svOzkTHptX57vm2fDogjJCAKlzOM/Px+iO0m7iaN/67l6Q0lSkRkfLK8HuibsX48eNZsGABixcvxsXFxbq+d+/edOvWjWbNmtGjRw+WLl1KYmIi8fHxADRt2pQ5c+bw7rvvUqlSJapXr85dd92Fn59fkbNTN2vcuHF4enpal4CAgFt9iVIGmEwm2jfyY8nQ1sx5qiUtalchJ9/M7I1HuXfial5f8pN17pSIiJQfhpYoHx8f7O3tSU5OLrI+OTmZ6tWrX/fYSZMmMX78eJYvX05wcPB1961bty4+Pj4cPHjQuu7xxx8nKSmJU6dOkZqayhtvvMG5c+eoW7cuANWrV79qrt+2Xc3o0aNJS0uzLidOnLhuLilfTCYT9zWoxtdDWvPF0xG0DKxKboGZzzYf4y/vrGb0N3s4cT7b6JgiIlJKDC1RTk5OhIaGEhcXZ11nNpuJi4sjMjLymsdNnDiRt956i9jYWMLCwm74PCdPniQ1NZUaNWr8aZufnx9ubm4sXLgQFxcXHnjgAQAiIyPZs2dPkU8JrlixAg8PD5o0aXLV53F2dsbDw6PIIhWPyWSiTZAPXz4XyYLBrWhdz5u8AgvzE45z/6R4Xl20i2OpWUbHFBGRW2T491gMHz6c/v37ExYWRsuWLZk8eTJZWVkMHDgQgH79+lGzZk3GjRsHwIQJExgzZgzz5s0jMDDQen+Sm5sbbm5uZGZm8o9//INHHnmE6tWrc+jQIV599VWCgoKIjo62Pu+UKVNo3bo1bm5urFixghEjRjB+/HiqVKkCQMeOHWnSpAl9+/Zl4sSJJCUl8fe//51hw4bh7KxPX0nxtKrrTau63iQePc/7cb+y7tcUvtx6kq+3n6J7c3+G3R9EvWpuRscUEZGSsNiADz74wFK7dm2Lk5OTpWXLlpbNmzdbt913332W/v37W3+uU6eOBfjTMnbsWIvFYrFkZ2dbOnbsaKlWrZrF0dHRUqdOHcszzzxjSUpKKvKcffv2tVStWtXi5ORkCQ4OtsydO/dPuY4ePWrp1KmTxdXV1eLj42P529/+ZsnLyyv260pLS7MAlrS0tJt7Q6Tc2nbsvGXAp1ssdUYutdQZudRy16illhfnb7ccSEo3OpqIiFxR3N/fhs+JKs80J0quZffJi7wfd5CV+wvvszOZ4MFmNXihfRCNquu/FRERI+m782yASpTcyE+n0piy6iCxe/83NiOmaXVe6BBEU39PA5OJiFRcKlE2QCVKiuvnpHQ+WHWQH/ac4bc/kVGN/XixQxDBtaoYmk1EpKJRibIBKlFys35NzmDK6oN8t+s05it/Mu9vWI0XOtSnRW0vY8OJiFQQKlE2QCVKSurQuUymrj7ItztPU3ClTbWr78NLHeoTFlj1BkeLiMitUImyASpRcquOpmTxYfxBvtl+ivwrZap1PW9e7FCfVnW9DU4nIlI+qUTZAJUoKS0nzmfzYfwhFm07QV5B4R/ZlndV5aUO9WldzxuTyWRwQhGR8kMlygaoRElpO3XxEh/FH2Jh4glyC8wAhNbx4sUO9bm3vo/KlIhIKVCJsgEqUXK7JKVd5qM1h5ifcJyc/MIyFRJQhZc6BHF/Q1+VKRGRW6ASZQNUouR2O5t+mRlrD/P5lmNczissU3fX9ODF9vV5oImfypSISAmoRNkAlSi5U1Iyc5i57jCfbTpGdm4BAI1rePBi+yCim1bHzk5lSkSkuFSibIBKlNxp57Ny+WT9YeZsPEZmTj4ADfzceKF9fR5sVgN7lSkRkRtSibIBKlFilIvZuXy64SizNhwh43JhmapXrTIvtK9Pl+AaONjbGZxQRMR2qUTZAJUoMVrapTzmbDzKJ+uPkHYpD4C7fCoz7P4gejT3V5kSEbkKlSgboBIltiLjch5zNx3j43WHuZBdWKZqV63E8/cH8VCLmjiqTImIWKlE2QCVKLE1WTn5fL75GDPWHiY1KxeAmlVcGXZ/EI+E1sTZwd7ghCIixlOJsgEqUWKrsnPzmbflONPXHuZcRg4A/p4uPPeXevQOr42Tg85MiUjFpRJlA1SixNZdzitgQcJxpq05RHJ6YZlqUsODf/dqTsPq7ganExExhkqUDVCJkrLicl4BX209wb9X/sr5rFycHOx4NbohT7W5SzOmRKTCKe7vb52zFxFcHO3pGxlI7MvtaN/Il9x8M//8fj+Pf7yZkxeyjY4nImKTVKJExMrX3YVP+ocx7uFmVHKyZ/Ph83SavI5F206ik9YiIkWpRIlIESaTiT4ta7PspXaE1vEiIyefV77axXOfbyM1M8foeCIiNkMlSkSuqo53Zb58NpJXYxriaG/ix73JRE9eR9z+ZKOjiYjYBJUoEbkmezsTQ/8SxJJhbWjg50ZKZg6D5mxl9De7ybry3XwiIhWVSpSI3FBTf0/++3xbnml3FyYTzE84Qaf/rGPr0fNGRxMRMYxKlIgUi4ujPa91bsK8p1tRs4orx89n89j0TUyM/ZncfLPR8URE7jiVKBG5KZH1vFn2cjseaVELswU+jD9Ej6kb+CUpw+hoIiJ3lEqUiNw0DxdH3n0shI+eDKVqZSf2nUmn6wfrmbn2MGazRiGISMWgEiUiJRZzd3ViX25Hh0a+5BaY+dcP++kzUwM6RaRiUIkSkVvi6+7Cx/3DGH9lQOeWI+eJmbyOr7ae0IBOESnXVKJE5JaZTCZ6XxnQGVbHi8ycfEYs2q0BnSJSrqlEiUipqeNdmYV/GtC5VgM6RaRcUokSkVL1+wGdDf3cScnMZdCcrYz6ejeZGtApIuWISpSI3BZN/T359vk21gGdCxJP0Ok/a0nUgE4RKSdUokTktvltQOf8ZwoHdJ44f4nHpm9i/LKfyckvMDqeiMgtUYkSkduuVV1vYl9uR8/QWlgs8NGaQ3SfsoGfk9KNjiYiUmIqUSJyR7i7ODLp0f8N6Pw5KYNuH2xgxtpDFGhAp4iUQSpRInJHxdxdnR9fvpeoxoUDOt/+4Wf6zNzMifMa0CkiZYtKlIjccdXcnZnZr3BAZ2UnexKOnKfTfzSgU0TKFpUoETHE/wZ03ltkQOezn2lAp4iUDSpRImKo2t6VWPhsJCNjGuFob2L5vsIBnSv3aUCniNg2lSgRMZy9nYkhf6lXZEDn03O3MnKRBnSKiO1SiRIRm/HbgM7B99bFZIKFWzWgU0Rsl0qUiNgUF0d7/u/Bxn8a0Dlu2X4N6BQRm6ISJSI26bcBnY9eGdA5fc1hDegUEZuiEiUiNsvdxZF3Hg1het+iAzqnr9GAThExnkqUiNi86KZFB3SOW/YzfWZoQKeIGMvwEjV16lQCAwNxcXEhIiKChISEa+47c+ZM2rVrh5eXF15eXkRFRf1p/wEDBmAymYosMTExRfY5cOAA3bt3x8fHBw8PD9q2bcvq1auL7JOYmEiHDh2oUqUKXl5eREdHs2vXrtJ74SJyU34b0DnhkSsDOo+eJ2byWr5M1IBOETGGoSVq4cKFDB8+nLFjx7J9+3ZCQkKIjo7m7NmzV90/Pj6ePn36sHr1ajZt2kRAQAAdO3bk1KlTRfaLiYnhzJkz1mX+/PlFtnfp0oX8/HxWrVrFtm3bCAkJoUuXLiQlJQGQmZlJTEwMtWvXZsuWLaxfvx53d3eio6PJy8u7PW+GiNyQyWSiV3jhgM7wQC+ycgt49evdDP5sGyka0Ckid5jJYuBf4SIiIggPD2fKlCkAmM1mAgICeOGFFxg1atQNjy8oKMDLy4spU6bQr18/oPBM1MWLF1myZMlVj0lJSaFatWqsXbuWdu3aAZCRkYGHhwcrVqwgKiqKrVu3Eh4ezvHjxwkICABgz549BAcH8+uvvxIUFFSs15eeno6npydpaWl4eHgU6xgRKZ4Cs4WZ6w7z7vJfyCuw4F3ZifGPBPNAEz+jo4lIGVfc39+GnYnKzc1l27ZtREVF/S+MnR1RUVFs2rSpWI+RnZ1NXl4eVatWLbI+Pj4eX19fGjZsyJAhQ0hNTbVu8/b2pmHDhsydO5esrCzy8/OZPn06vr6+hIaGAtCwYUO8vb355JNPyM3N5dKlS3zyySc0btyYwMDAa+bJyckhPT29yCIit4e9nYnn7qvHt8Pa0qi6O6lZuTwzdyuvLtqlAZ0ickcYVqJSUlIoKCjAz6/o3xr9/Pysl9VuZOTIkfj7+xcpYjExMcydO5e4uDgmTJjAmjVr6NSpEwUFhfNlTCYTK1euZMeOHbi7u+Pi4sJ7771HbGwsXl5eALi7uxMfH8/nn3+Oq6srbm5uxMbGsmzZMhwcHK6ZZ9y4cXh6elqX385iicjt08Tfg2+fb8OzVwZ0frn1JJ3+s5aEIxrQKSK3l+E3lpfU+PHjWbBgAYsXL8bFxcW6vnfv3nTr1o1mzZrRo0cPli5dSmJiIvHx8QBYLBaGDRuGr68v69atIyEhgR49etC1a1fOnDkDwKVLlxg0aBBt2rRh8+bNbNiwgbvvvpvOnTtz6dKla2YaPXo0aWlp1uXEiRO39T0QkULODvaMfrAxC343oLPXDA3oFJHby7AS5ePjg729PcnJRb9kNDk5merVq1/32EmTJjF+/HiWL19OcHDwdfetW7cuPj4+HDx4EIBVq1axdOlSFixYQJs2bWjRogUffvghrq6uzJkzB4B58+Zx9OhRZs2aRXh4OK1atWLevHkcOXKEb7/99prP5ezsjIeHR5FFRO6ciGsM6Nx/RpfWRaT0GVainJycCA0NJS4uzrrObDYTFxdHZGTkNY+bOHEib731FrGxsYSFhd3weU6ePElqaio1atQACu+jgsL7r37Pzs4Os9ls3cfOzg6TyVRku8lksu4jIrbptwGdM/qG4n1lQGf3KRv4SAM6RaSUGXo5b/jw4cycOZM5c+awf/9+hgwZQlZWFgMHDgSgX79+jB492rr/hAkTeP311/n0008JDAwkKSmJpKQkMjMzgcLRBCNGjGDz5s0cPXqUuLg4unfvTlBQENHR0QBERkbi5eVF//792bVrFwcOHGDEiBEcOXKEzp07A/DAAw9w4cIFhg0bxv79+9m7dy8DBw7EwcGB+++//w6/SyJSEh2bVufHv95LVGM/cgvMjNeAThEpZYaWqF69ejFp0iTGjBlD8+bN2blzJ7GxsdabzY8fP269Twlg2rRp5Obm0rNnT2rUqGFdJk2aBIC9vT27d++mW7duNGjQgEGDBhEaGsq6detwdnYGCi8jxsbGkpmZSfv27QkLC2P9+vV8++23hISEANCoUSO+++47du/eTWRkJO3ateP06dPExsZaz2iJiO3zcXNmZr9QJj4SrAGdIlLqDJ0TVd5pTpSI7ThxPpu/fbmLhKOFn9qLauzH+Eea4ePmbHAyEbE1Nj8nSkTkTgqoWon5g1sxqlMjHO1NrNyfTPS/17J8b/FGqoiI/JFKlIhUGFcb0Dn4s22M+GoXGZf1lU4icnNUokSkwvnjgM6vtp2k03/WseVw6o0PFhG5QiVKRCqk3w/orOXlyskLl+g9czNv/6ABnSJSPCpRIlKhRdT1ZtlL7XgsrHBA54y1hQM6953WgE4RuT6VKBGp8NxdHJnY8w8DOqeuZ1q8BnSKyLWpRImIXPHbgM4HmviRV2BhQuzP9J6xSQM6ReSqVKJERH7Hx82ZGX1DmdizcEBn4tELxExey8LE4xrQKSJFqESJiPyByWTisbAAYl++l5aBVcnKLWDk13t4Zu5WzmXkGB1PRGyESpSIyDX8NqBzdKdGONnbsXL/WWImr+VHDegUEVSiRESuy97OxLP31ePb59tYB3Q++9k2XtGATpEKTyVKRKQYGte4MqDzvsIBnYu2neSRaRs5eUE3nYtUVCpRIiLF5Oxgz+hOjVk4OBI/D2cOJGfy0Icb2X3yotHRRMQAKlEiIjep5V1VWTKs8PLeuYwcek3frC8yFqmAVKJEREqghqcrXz0XyX0NqnEpr4BnP9/Gp+uPGB1LRO4glSgRkRJyd3Hkk/5hPB5RG4sF3ly6jzf+u1dTzkUqCJUoEZFb4GBvx7963M3oTo0AmL3xKM9+to3s3HyDk4nI7aYSJSJyi0ymwjEIUx9vgZODHSv3J9Nr+mbOpl82OpqI3EYqUSIipaRzcA3mP9OKqpWd2HMqjYc+3MgvSRlGxxKR20QlSkSkFIXW8WLx0NbU9anMqYuX6DltI+t/TTE6lojcBipRIiKlrI53Zb4Z2pqWd1UlIyefAbMS+DLxhNGxRKSUqUSJiNwGVSo58dmglvRo7k++2cKrX+/mnR9/xqxP7omUGypRIiK3ibODPf/u1ZwX2wcBMHX1IV5auJPLeQUGJxOR0qASJSJyG5lMJoZ3bMg7PYNxsDPx3a7T9P1kC+ezco2OJiK3SCVKROQOeDQsgLlPtcTdxYHEoxd4+MMNHEnJMjqWiNwClSgRkTukdZAP3wxpTc0qrhxNzebhDzew9eh5o2OJSAmpRImI3EH1/dxZPKw1IbU8uZCdx+Mfb+G7XaeNjiUiJaASJSJyh/m6u7BgcCQdm/iRm2/mhfk7mLr6IBaLPrknUpaoRImIGMDVyZ5pT4YyqO1dALzz4y+M+noPeQVmg5OJSHGpRImIGMTezsTrXZrwZvem2Jlg4dYTPDU7kfTLeUZHE5FiUIkSETFYv8hAZvYLw9XRnnW/pvDotE2cunjJ6FgicgMqUSIiNqBDYz++ei4SX3dnfknOoMfUDew5mWZ0LBG5DpUoEREbcXdNT5YMa0Oj6u6cy8jhsembWLkv2ehYInINKlEiIjbEv4orXz0XSbv6PlzKK2DwZ1uZveGI0bFE5CpUokREbIy7iyOfDginT8sAzBZ447t9vPndPgr05cUiNkUlSkTEBjna2/H2Q80YGdMIgE83HOG5z7eRnZtvcDIR+Y1KlIiIjTKZTAz5Sz0+6HMPTg52rNiXTO8ZmzmbcdnoaCKCSpSIiM3rGuLPvKcj8KrkyO6TaTw0dSMHkjOMjiVS4alEiYiUAWGBVVk8tA13+VTm1MVLPDJtIxsOphgdS6RCU4kSESkjAn0q882Q1oQHepFxOZ/+nybw5dYTRscSqbBUokREyhCvyk58NiiCbiH+5JstvLpoN+8u/0VfXixiAJUoEZEyxsXRnsm9mvP8/UEAfLDqIC8v3ElOfoHByUQqFpUoEZEyyM7OxCvRDZn4SDAOdia+3Xmavh8ncCEr1+hoIhWGSpSISBn2WHgAswe2xN3ZgYSj53lk2kaOpmQZHUukQlCJEhEp49rW92HRkNbUrOLK4ZQsHp62kW3HzhsdS6TcU4kSESkHGlZ3Z/HQ1jSr6cn5rFz6zNzC97vPGB1LpFwzvERNnTqVwMBAXFxciIiIICEh4Zr7zpw5k3bt2uHl5YWXlxdRUVF/2n/AgAGYTKYiS0xMTJF9Dhw4QPfu3fHx8cHDw4O2bduyevXqPz3f7NmzCQ4OxsXFBV9fX4YNG1Y6L1pE5Dbw9XBh4bOtiGrsR26+mWHztjMt/pA+uSdymxhaohYuXMjw4cMZO3Ys27dvJyQkhOjoaM6ePXvV/ePj4+nTpw+rV69m06ZNBAQE0LFjR06dOlVkv5iYGM6cOWNd5s+fX2R7ly5dyM/PZ9WqVWzbto2QkBC6dOlCUlKSdZ/33nuP1157jVGjRrF3715WrlxJdHR06b8JIiKlqJKTA9P7hjKwTSAAE2J/5v8W7yGvwGxsMJFyyGQx8K8oERERhIeHM2XKFADMZjMBAQG88MILjBo16obHFxQU4OXlxZQpU+jXrx9QeCbq4sWLLFmy5KrHpKSkUK1aNdauXUu7du0AyMjIwMPDgxUrVhAVFcWFCxeoWbMm3333HR06dCjx60tPT8fT05O0tDQ8PDxK/DgiIiUxa8MR3ly6D4sF7m1QjamP34O7i6PRsURsXnF/fxt2Jio3N5dt27YRFRX1vzB2dkRFRbFp06ZiPUZ2djZ5eXlUrVq1yPr4+Hh8fX1p2LAhQ4YMITU11brN29ubhg0bMnfuXLKyssjPz2f69On4+voSGhoKwIoVKzCbzZw6dYrGjRtTq1YtHnvsMU6cuP5k4JycHNLT04ssIiJGGdjmLmb0DcPV0Z61B87x6EebOH3xktGxRMoNw0pUSkoKBQUF+Pn5FVnv5+dX5LLa9YwcORJ/f/8iRSwmJoa5c+cSFxfHhAkTWLNmDZ06daKgoHAInclkYuXKlezYsQN3d3dcXFx47733iI2NxcvLC4DDhw9jNpt5++23mTx5MosWLeL8+fM88MAD5OZeewbLuHHj8PT0tC4BAQE3+7aIiJSqB5r48eWzkVRzd+bnpAx6TN3AT6fSjI4lUi4YfmN5SY0fP54FCxawePFiXFxcrOt79+5Nt27daNasGT169GDp0qUkJiYSHx8PgMViYdiwYfj6+rJu3ToSEhLo0aMHXbt25cyZwk+ymM1m8vLyeP/994mOjqZVq1bMnz+fX3/99ao3oP9m9OjRpKWlWZcbnbkSEbkTmtXyZPHQ1jTwc+NsRg6PTd/Eqp+TjY4lUuYZVqJ8fHywt7cnObnoH+Tk5GSqV69+3WMnTZrE+PHjWb58OcHBwdfdt27duvj4+HDw4EEAVq1axdKlS1mwYAFt2rShRYsWfPjhh7i6ujJnzhwAatSoAUCTJk2sj1OtWjV8fHw4fvz4NZ/L2dkZDw+PIouIiC2o5VWJRUNa0zbIh+zcAp6es5W5m44aHUukTDOsRDk5OREaGkpcXJx1ndlsJi4ujsjIyGseN3HiRN566y1iY2MJCwu74fOcPHmS1NRUazHKzs4GCu+/+j07OzvM5sJPr7Rp0waAX375xbr9/PnzpKSkUKdOnWK+QhER2+Lh4sisgeH0CgvAbIEx3+7lraX7KDBrBIJISRh6OW/48OHMnDmTOXPmsH//foYMGUJWVhYDBw4EoF+/fowePdq6/4QJE3j99df59NNPCQwMJCkpiaSkJDIzMwHIzMxkxIgRbN68maNHjxIXF0f37t0JCgqyjieIjIzEy8uL/v37s2vXLg4cOMCIESM4cuQInTt3BqBBgwZ0796dl156iY0bN/LTTz/Rv39/GjVqxP3333+H3yURkdLjaG/H+EeaMSK6IQCfrD/C0C+2cSlXX14scrMMLVG9evVi0qRJjBkzhubNm7Nz505iY2OtN5sfP37cep8SwLRp08jNzaVnz57UqFHDukyaNAkAe3t7du/eTbdu3WjQoAGDBg0iNDSUdevW4ezsDBReRoyNjSUzM5P27dsTFhbG+vXr+fbbbwkJCbE+19y5c4mIiKBz587cd999ODo6Ehsbi6OjPh4sImWbyWRi2P1B/Kd3c5zs7fhxbzK9Z27mXEaO0dFEyhRD50SVd5oTJSK2LvHoeZ6Zu5WL2XnU8nJl1oBw6vu5Gx1LxFA2PydKRESMFx5YlcVD2xDoXYmTFy7x8LSNbDyYYnQskTJBJUpEpIK7y6cy3wxtQ2gdLzIu59Pv0wQWbTtpdCwRm1eiEnXixAlOnvzfH7CEhARefvllZsyYUWrBRETkzqla2Ykvno6gS3AN8s0WXvlqF++tOKAvLxa5jhKVqMcff9w6dDIpKYkHHniAhIQEXnvtNd58881SDSgiIneGi6M97/e+h6F/qQfA+3G/MvzLXeTk65N7IldTohL1008/0bJlSwC+/PJL7r77bjZu3MgXX3zB7NmzSzOfiIjcQXZ2Jl6NacT4h5thb2di8Y5T9P0kgYvZ1/7KK5GKqkQlKi8vzzoyYOXKlXTr1g2ARo0aFRlJICIiZVPvlrWZNSAcN2cHEo6c5+FpGzmWmmV0LBGbUqIS1bRpUz766CPWrVvHihUriImJAeD06dN4e3uXakARETHGvQ2qsWhIJP6eLhw+l8VDH25k27ELRscSsRklKlETJkxg+vTp/OUvf6FPnz7WIZX//e9/rZf5RESk7GtU3YPFw9pwd00Pzmfl8vjMzfywR1ccROAWhm0WFBSQnp6Ol5eXdd3Ro0epVKkSvr6+pRawLNOwTREpL7Jy8nlx/g7ifj4LwOhOjRh8b11MJpPByURK320dtnnp0iVycnKsBerYsWNMnjyZX375RQVKRKQcquzswIx+YfSPLPwS9nHLfua1JT+RX2A2OJmIcUpUorp3787cuXMBuHjxIhEREbz77rv06NGDadOmlWpAERGxDfZ2Jv7R/W7GdGmCyQTzthxn0JytZObkGx1NxBAlKlHbt2+nXbt2ACxatAg/Pz+OHTvG3Llzef/990s1oIiI2Jan2t7FR0+G4uJox5oD53j0o02cSbtkdCyRO65EJSo7Oxt398IvqFy+fDkPP/wwdnZ2tGrVimPHjpVqQBERsT3RTauzcHAkPm5O7D+TTo+pG9h7Os3oWCJ3VIlKVFBQEEuWLOHEiRP8+OOPdOzYEYCzZ8/qBmoRkQoiJKAKi4e2ob6vG8npOTz20SZWX7nxXKQiKFGJGjNmDK+88gqBgYG0bNmSyMhIoPCs1D333FOqAUVExHYFVK3EoiGtaV3Pm6zcAgbNSeSzzboiIRVDiUccJCUlcebMGUJCQrCzK+xiCQkJeHh40KhRo1INWVZpxIGIVBS5+Wb+b/EeFm0r/HL6Z9rdxehOjbGz0wgEKXuK+/u7xCXqNydPFv6BqVWr1q08TLmkEiUiFYnFYmHKqoO8u+IAADFNq/PvXs1xdbI3OJnIzbmtc6LMZjNvvvkmnp6e1KlThzp16lClShXeeustzGbNDBERqYhMJhMvdKjPf3o3x8nejti9SfSZuZmUzByjo4ncFiUqUa+99hpTpkxh/Pjx7Nixgx07dvD222/zwQcf8Prrr5d2RhERKUO6N6/JZ4Na4unqyM4TF3noww0cPJtpdCyRUleiy3n+/v589NFHdOvWrcj6b7/9lqFDh3Lq1KlSC1iW6XKeiFRkh85lMnBWIsfPZ+Nd2Yn5g1vRwM/d6FgiN3RbL+edP3/+qjePN2rUiPPnz5fkIUVEpJypV82NxUNbc3dND1KvfHnxwbMZRscSKTUlKlEhISFMmTLlT+unTJlCcHDwLYcSEZHywdvNmc8HRdCkhgcpmbn0mbmFQ+d0aU/KhxJdzluzZg2dO3emdu3a1hlRmzZt4sSJE/zwww/Wr4Sp6HQ5T0Sk0IWsXPrM3MzPSRn4ujuz8NlI7vKpbHQskau6rZfz7rvvPg4cOMBDDz3ExYsXuXjxIg8//DB79+7ls88+K3FoEREpn7wqO/HF0xE08HPjbEYOfWZs5lhqltGxRG7JLc+J+r1du3bRokULCgoKSushyzSdiRIRKepcRg59Zm7m4NlM/D1dWPhsJAFVKxkdS6SI23omSkREpCSquTsz75kI6larzOm0y/SesZmTF7KNjiVSIipRIiJyR/m6uzD/mVbc5VOZUxcv0WfmZk5dvGR0LJGbphIlIiJ3nJ9HYZGq412JE+cv8fjMzZxJU5GSssXhZnZ++OGHr7v94sWLt5JFREQqkOqehUWq14xNHEvN5vGZW1gwuBV+Hi5GRxMplps6E+Xp6XndpU6dOvTr1+92ZRURkXLGv4or859pRc0qrhxJyaLPzM2czbhsdCyRYinVT+dJUfp0nohI8Zw4n02v6Zs4nXaZIF835j/TimruzkbHkgpKn84TEZEyI6BqJeYPbkUNTxcOns3kiY83k5qZY3QsketSiRIREZtQx7sy855phZ+HMweSM3ni4y2cz8o1OpbINalEiYiIzbjLp7BIVXN35uekDJ78eAsXs1WkxDapRImIiE2pV82N+c9E4OPmzL4z6Tz5yRbSsvOMjiXyJypRIiJic4J83Zn3TATelZ346VQ6fT/dQtolFSmxLSpRIiJikxr4ufPFMxF4VXJk98k0+n+aQMZlFSmxHSpRIiJisxpV9+CLp1tRpZIjO09cZMCsRDJz8o2OJQKoRImIiI1r4u/B54Mi8HBxYNuxCwyclUCWipTYAJUoERGxeXfX9OTzpyNwd3Eg8egFBs5OJDtXRUqMpRIlIiJlQnCtKnw2KAJ3ZwcSjpxn0OytXMotMDqWVGAqUSIiUmY0D6jC7KdaUtnJnk2HU3lm7lYu56lIiTFUokREpEwJrePFnKdaUsnJnvUHUxj82TYVKTGESpSIiJQ5YYFVmTUgHFdHe9YeOMeQz7eRk68iJXeWSpSIiJRJEXW9+XRAOC6Odqz+5RxDP99Obr7Z6FhSgahEiYhImRVZz5tP+ofj7GBH3M9nGTZvO3kFKlJyZ9hEiZo6dSqBgYG4uLgQERFBQkLCNfedOXMm7dq1w8vLCy8vL6Kiov60/4ABAzCZTEWWmJiYIvscOHCA7t274+Pjg4eHB23btmX16tVXfc7U1FRq1aqFyWTi4sWLt/x6RUSk9LQJ8mFmvzCcHOxYsS+ZF+fvUJGSO8LwErVw4UKGDx/O2LFj2b59OyEhIURHR3P27Nmr7h8fH0+fPn1YvXo1mzZtIiAggI4dO3Lq1Kki+8XExHDmzBnrMn/+/CLbu3TpQn5+PqtWrWLbtm2EhITQpUsXkpKS/vScgwYNIjg4uPRetIiIlKp7G1RjRt9QnOztWPZTEi8v2Em+ipTcZiaLxWIxMkBERATh4eFMmTIFALPZTEBAAC+88AKjRo264fEFBQV4eXkxZcoU+vXrBxSeibp48SJLliy56jEpKSlUq1aNtWvX0q5dOwAyMjLw8PBgxYoVREVFWfedNm0aCxcuZMyYMXTo0IELFy5QpUqVYr229PR0PD09SUtLw8PDo1jHiIhIya36OZlnP9tGXoGFriH+/PuxEBzsDT9fIGVMcX9/G/pfVm5uLtu2bStSWuzs7IiKimLTpk3Feozs7Gzy8vKoWrVqkfXx8fH4+vrSsGFDhgwZQmpqqnWbt7c3DRs2ZO7cuWRlZZGfn8/06dPx9fUlNDTUut++fft48803mTt3LnZ2N36rcnJySE9PL7KIiMid076RHx8+EYqDnYnvdp1mxKLdFJgNPVcg5ZihJSolJYWCggL8/PyKrPfz87vqZbWrGTlyJP7+/kWKWExMDHPnziUuLo4JEyawZs0aOnXqREFB4cdfTSYTK1euZMeOHbi7u+Pi4sJ7771HbGwsXl5eQGEh6tOnD++88w61a9cuVpZx48bh6elpXQICAop1nIiIlJ4Hmvgx5fEW2NuZWLzjFK+qSMltUqbPcY4fP54FCxawePFiXFxcrOt79+5Nt27daNasGT169GDp0qUkJiYSHx8PgMViYdiwYfj6+rJu3ToSEhLo0aMHXbt25cyZMwCMHj2axo0b8+STTxY7z+jRo0lLS7MuJ06cKNXXKyIixRNzd3U+6HMP9nYmvt5+ktHf7MasIiWlzNAS5ePjg729PcnJyUXWJycnU7169eseO2nSJMaPH8/y5ctveNN33bp18fHx4eDBgwCsWrWKpUuXsmDBAtq0aUOLFi348MMPcXV1Zc6cOdZ9vvrqKxwcHHBwcKBDhw7WzGPHjr3q8zg7O+Ph4VFkERERYzzYrAaTezXHzgRfbj3Ja0v2qEhJqXIw8smdnJwIDQ0lLi6OHj16AIU3lsfFxfH8889f87iJEyfyr3/9ix9//JGwsLAbPs/JkydJTU2lRo0aQOF9VMCf7nOys7PDbC78NMfXX3/NpUuXrNsSExN56qmnWLduHfXq1bup1ykiIsboGuKP2WLhrwt3Mj/hBPZ2Jt7qfjcmk8noaFIOGFqiAIYPH07//v0JCwujZcuWTJ48maysLAYOHAhAv379qFmzJuPGjQNgwoQJjBkzhnnz5hEYGGi9d8rNzQ03NzcyMzP5xz/+wSOPPEL16tU5dOgQr776KkFBQURHRwMQGRmJl5cX/fv3Z8yYMbi6ujJz5kyOHDlC586dAf5UlFJSUgBo3LhxsT+dJyIixuvevCYFZgt/+2oXn28+jr3JxBvdmqpIyS0zvET16tWLc+fOMWbMGJKSkmjevDmxsbHWm82PHz9e5IzRtGnTyM3NpWfPnkUeZ+zYsbzxxhvY29uze/du5syZw8WLF/H396djx4689dZbODs7A4WX5GJjY3nttddo3749eXl5NG3alG+//ZaQkJA79+JFROSOeLhFLQrMFl79ejdzNh3Dzs7EmC5NVKTklhg+J6o805woERHbsiDhOKO+2QPAM+3u4v8ebKwiJX9SJuZEiYiI3Em9W9bmXw/dDcDMdUeYEPsLOpcgJaUSJSIiFcoTEXV4q3tTAD5ac4hJy1WkpGRUokREpMLpGxnI2K5NAJi6+hCTV/5qcCIpi1SiRESkQhrY5i7+3rkxAP+J+5X341Sk5OaoRImISIX1dLu6jO7UCID3Vhxg6uqDBieSskQlSkREKrRn76vHqzENAXjnx1/4aM0hgxNJWaESJSIiFd7QvwTxtwcaADB+2c98vO6wwYmkLFCJEhERAV7oUJ+XOtQH4J/f7+fT9UcMTiS2TiVKRETkipej6vNC+yAA3ly6j7mbjhobSGyaSpSIiMgVJpOJ4Q80YMhfCr8/dcy3e/l88zGDU4mtUokSERH5HZPJxKvRDRl8b10A/r7kJ+YnHDc4ldgilSgREZE/MJlMjO7UiEFt7wJg9Dd7+DLxhMGpxNaoRImIiFyFyWTi750bM6B1IAAjv9nN19tOGhtKbIpKlIiIyDWYTCbGdm3Ck61qY7HAK4t2sWTHKaNjiY1QiRIREbkOk8nEm93upk/LwiI1/Mud/HfXaaNjiQ1QiRIREbkBOzsT/+pxN73CAjBb4K8Ld/L97jNGxxKDqUSJiIgUg52diXEPN6NnaC0KzBZeXLCD2J9UpCoylSgREZFisrMzMeGRYB6+pyYFZgvPz9vB8r1JRscSg6hEiYiI3AR7OxPvPBpC9+b+5JstDJu3nbj9yUbHEgOoRImIiNwkezsT7z4aQufgGuQVWBjy+XZW/3LW6Fhyh6lEiYiIlICDvR2TezWn093VyS0w8+xn21h74JzRseQOUokSEREpIUd7O97vcw/RTf3IzTfzzNytrP81xehYcoeoRImIiNwCR3s7PujTgqjGvuTkm3l6biIbD6lIVQQqUSIiIrfIycGOqU+04P6G1bicZ2bQ7K1sOZxqdCy5zVSiRERESoGzgz3TngzlvgbVuJRXwMDZiSQePW90LLmNVKJERERKiYujPdP7htKuvg/ZuQUM+DSBbccuGB1LbhOVKBERkVLk4mjPjL5htK7nTVZuAf0/TWDHcRWp8kglSkREpJS5Otnzcf8wWtWtSmZOPv0+TWD3yYtGx5JSphIlIiJyG1RycuCT/uG0DKxKxuV8nvx4Cz+dSjM6lpQilSgREZHbpLKzA58ODCe0jhfpl/N54uMt7D2tIlVeqESJiIjcRm7ODsweGM49tauQdimPJz/ews9J6UbHklKgEiUiInKbubs4MueploTU8uRCdh5PzNzCgeQMo2PJLVKJEhERuQM8XByZOyiCZjU9Sc3K5fGZmzl4VkWqLFOJEhERuUM8XR35bFBLmtTwICUzlz4zt3DoXKbRsaSEVKJERETuoCqVnPji6QgaVXfnXEYOfWZs5khKltGxpARUokRERO4wr8qFRaqhnztnrxSpY6kqUmWNSpSIiIgBvN2c+eKZCOr7upGUfpk+MzZz4ny20bHkJqhEiYiIGMTnSpGqV60yp9Mu03vGZk5eUJEqK1SiREREDOTr7sL8Z1pR16cypy5e4vGZWziXkWN0LCkGlSgRERGD+Xq4MO+ZVtSuWonj57N5ek4i2bn5RseSG1CJEhERsQHVPV2YPTCcKpUc2XUyjRfn76TAbDE6llyHSpSIiIiNqFvNjY/7heHkYMfK/cm8+d1eLBYVKVulEiUiImJDwgKrMrlXc0wmmLPpGJ+sP2J0JLkGlSgREREb82CzGvxfp8YA/PP7/Xy/+4zBieRqVKJERERs0NPt7qJ/ZB0A/vrlTrYePW9wIvkjlSgREREbZDKZGNO1KVGN/cjNN/PM3K0c1vfs2RSbKFFTp04lMDAQFxcXIiIiSEhIuOa+M2fOpF27dnh5eeHl5UVUVNSf9h8wYAAmk6nIEhMTU2SfAwcO0L17d3x8fPDw8KBt27asXr3aun3Xrl306dOHgIAAXF1dady4Mf/5z39K94WLiIhch72diQ/63ENIQBUuZOcxYFYiKZmaIWUrDC9RCxcuZPjw4YwdO5bt27cTEhJCdHQ0Z8+ever+8fHx9OnTh9WrV7Np0yYCAgLo2LEjp06dKrJfTEwMZ86csS7z588vsr1Lly7k5+ezatUqtm3bRkhICF26dCEpKQmAbdu24evry+eff87evXt57bXXGD16NFOmTLk9b4SIiMhVuDrZ80n/MAKqul6ZIbWVS7kFRscSwGQx+LOTERERhIeHW8uJ2WwmICCAF154gVGjRt3w+IKCAry8vJgyZQr9+vUDCs9EXbx4kSVLllz1mJSUFKpVq8batWtp164dABkZGXh4eLBixQqioqKuetywYcPYv38/q1atKtZrS09Px9PTk7S0NDw8PIp1jIiIyNUcOpfJI9M2cjE7j45N/Jj2ZCj2diajY5VLxf39beiZqNzcXLZt21aktNjZ2REVFcWmTZuK9RjZ2dnk5eVRtWrVIuvj4+Px9fWlYcOGDBkyhNTUVOs2b29vGjZsyNy5c8nKyiI/P5/p06fj6+tLaGjoNZ8rLS3tT8/zezk5OaSnpxdZRERESkO9am7MvDJDavm+ZN5aus/oSBWeoSUqJSWFgoIC/Pz8iqz38/OzXla7kZEjR+Lv71+kiMXExDB37lzi4uKYMGECa9asoVOnThQUFJ7+NJlMrFy5kh07duDu7o6LiwvvvfcesbGxeHl5XfV5Nm7cyMKFCxk8ePA1s4wbNw5PT0/rEhAQUKzXICIiUhzhgVV577EQAGZvPKoZUgZzMDrArRg/fjwLFiwgPj4eFxcX6/revXtb/7lZs2YEBwdTr1494uPj6dChAxaLhWHDhuHr68u6detwdXXl448/pmvXriQmJlKjRo0iz/PTTz/RvXt3xo4dS8eOHa+ZZ/To0QwfPtz6c3p6uoqUiIiUqi7B/py6cIlxy37mn9/vw9/ThU7Natz4QCl1hp6J8vHxwd7enuTk5CLrk5OTqV69+nWPnTRpEuPHj2f58uUEBwdfd9+6devi4+PDwYMHAVi1ahVLly5lwYIFtGnThhYtWvDhhx/i6urKnDlzihy7b98+OnTowODBg/n73/9+3edxdnbGw8OjyCIiIlLaBt9bl76t6mCxwMsLd7LtmGZIGcHQEuXk5ERoaChxcXHWdWazmbi4OCIjI6953MSJE3nrrbeIjY0lLCzshs9z8uRJUlNTrWeYsrOzgcL7r37Pzs4Os9ls/Xnv3r3cf//99O/fn3/961839dpERERuF5PJxNiuTYhq7EtOvpmn52zlSEqW0bEqHMNHHAwfPpyZM2cyZ84c9u/fz5AhQ8jKymLgwIEA9OvXj9GjR1v3nzBhAq+//jqffvopgYGBJCUlkZSURGZm4QCyzMxMRowYwebNmzl69ChxcXF0796doKAgoqOjAYiMjMTLy4v+/fuza9cuDhw4wIgRIzhy5AidO3cGCi/h3X///XTs2JHhw4dbn+fcuXN3+B0SERH5Mwd7O97vcw/BtTy5kJ3HwFkJpGqG1B1leInq1asXkyZNYsyYMTRv3pydO3cSGxtrvdn8+PHjnDnzv+8MmjZtGrm5ufTs2ZMaNWpYl0mTJgFgb2/P7t276datGw0aNGDQoEGEhoaybt06nJ2dgcLLiLGxsWRmZtK+fXvCwsJYv3493377LSEhhTfsLVq0iHPnzvH5558XeZ7w8PA7/A6JiIhcXSUnBz7pH04tL1eOpmbz9NytXM7TDKk7xfA5UeWZ5kSJiMidcPBs4QyptEt5RDf148MnNEPqVpSJOVEiIiJy64J83ZjRNxQnezt+3JvMv77fb3SkCkElSkREpByIqOvNpCszpD7dcIRPNUPqtlOJEhERKSe6hfgzqlMjAN76fh+xPxVvcLWUjEqUiIhIOfLsvXV5IqI2Fgu8tGAH249fMDpSuaUSJSIiUo6YTCb+0a0p7Rv9b4bUUc2Qui1UokRERMoZB3s7PuhzD81qenI+K5cBsxI4n5VrdKxyRyVKRESkHKrs7MAnA8KoWaVwhtQzmiFV6lSiREREyilfdxfmPBWOh4sD245d4K8Ld2I2azxkaVGJEhERKceCfN2Z0S8MJ3s7lv2UxNs/aIZUaVGJEhERKeda1fXmnUeDAfh4/RFmb9AMqdKgEiUiIlIBdG9ek1djGgLwj6X7WL5XM6RulUqUiIhIBTHkvnr0aVk4Q+rFBTvYoRlSt0QlSkREpIIwmUy81b0p9zesxuW8whlSx1I1Q6qkVKJEREQqEAd7O6Y83oK7a3qQmpXLgFmJXNAMqRJRiRIREalgKjs78Gn/cGpWceVISpZmSJWQSpSIiEgF5OvhwuyB4bi7OLD12AX+9uUuzZC6SSpRIiIiFVR9P3em9w3F0d7E93vOMD72Z6MjlSkqUSIiIhVY63o+vNMzBIAZaw8zZ+NRYwOVISpRIiIiFVyPe2oyIvrKDKnv9rJiX7LBicoGlSgRERFh6F/q0adlAGYLvDB/O7tOXDQ6ks1TiRIREZErM6Tu5r4GhTOkBs1J5HhqttGxbJpKlIiIiACFM6SmPtGCJjU8SMnMZcDsBM2Qug6VKBEREbFyc3Zg1sBw/D1dOHwui8GfaYbUtahEiYiISBF+Hi7Mfqol7i4OJB69wCtfaYbU1ahEiYiIyJ808HNn+pOFM6SW7j7DhB81Q+qPVKJERETkqloH+TDhkWAApq85zGebjhobyMaoRImIiMg1PdyiFn97oAEAY/+7l5WaIWWlEiUiIiLX9Xz7IHqF/TZDage7T140OpJNUIkSERGR6zKZTPzzobu5t0E1LuUV8NTsRE6c1wwplSgRERG5IUd7O6Y+fg+Nf5shNSuBi9kVe4aUSpSIiIgUi7uLI7MGhFPD04VD57IY/Nk2cvIr7gwplSgREREptuqeLswaGI67swMJR87zyle7K+wMKZUoERERuSmNqnvwUd9QHOxMfLfrNO8s/8XoSIZQiRIREZGb1ibIh/FXZkhNiz/E55uPGZzozlOJEhERkRLpGVqLv0YVzpAa8+1PxO2vWDOkVKJERESkxF7sEMSjobUwW+D5eTvYczLN6Eh3jEqUiIiIlJjJZOLth5vRrr5P4QypORVnhpRKlIiIiNwSR3s7PnyiBY2qu3MuI4eBsxNJy84zOtZtpxIlIiIit8zdxZFZA8Op7uHCwbOZDP5sa7mfIaUSJSIiIqWihqcrswaG4+bswJYj5xlRzmdIqUSJiIhIqWlcw4NpT7bAwc7Ef3edZlI5niGlEiUiIiKlql39aox7uBkAH8YfYt6W4wYnuj1UokRERKTUPRoWwEsd6gPw+rc/sfrnswYnKn0qUSIiInJbvBxVn0da1KLAbGHYvO38dKp8zZBSiRIREZHbwmQyMe7hZrQN8iE7t4CBsxM5eaH8zJBSiRIREZHbxsnBjg+f/N0MqVmJpF0qHzOkbKJETZ06lcDAQFxcXIiIiCAhIeGa+86cOZN27drh5eWFl5cXUVFRf9p/wIABmEymIktMTEyRfQ4cOED37t3x8fHBw8ODtm3bsnr16iL7HD9+nM6dO1OpUiV8fX0ZMWIE+fn5pffCRUREKgAPF0c+HRCOn4czv57N5NlyMkPK8BK1cOFChg8fztixY9m+fTshISFER0dz9uzVb0CLj4+nT58+rF69mk2bNhEQEEDHjh05depUkf1iYmI4c+aMdZk/f36R7V26dCE/P59Vq1axbds2QkJC6NKlC0lJSQAUFBTQuXNncnNz2bhxI3PmzGH27NmMGTPm9rwRIiIi5Zh/FVdmDWiJm7MDmw+fZ+Si3VgsZXuGlMli8CuIiIggPDycKVOmAGA2mwkICOCFF15g1KhRNzy+oKAALy8vpkyZQr9+/YDCM1EXL15kyZIlVz0mJSWFatWqsXbtWtq1awdARkYGHh4erFixgqioKJYtW0aXLl04ffo0fn5+AHz00UeMHDmSc+fO4eTkdMNs6enpeHp6kpaWhoeHR3HeDhERkXJt7YFzDJydSIHZwvP3B/FKdEOjI/1JcX9/G3omKjc3l23bthEVFWVdZ2dnR1RUFJs2bSrWY2RnZ5OXl0fVqlWLrI+Pj8fX15eGDRsyZMgQUlNTrdu8vb1p2LAhc+fOJSsri/z8fKZPn46vry+hoaEAbNq0iWbNmlkLFEB0dDTp6ens3bv3qllycnJIT08vsoiIiMj/3NugGuMeKpwhNWX1QRYklN0ZUoaWqJSUFAoKCooUFQA/Pz/rZbUbGTlyJP7+/kWKWExMDHPnziUuLo4JEyawZs0aOnXqREFB4fVXk8nEypUr2bFjB+7u7ri4uPDee+8RGxuLl5cXAElJSVfN9du2qxk3bhyenp7WJSAgoHhvhIiISAXyWHgAL7YPAuC1JT8R/0vZnCFl+D1Rt2L8+PEsWLCAxYsX4+LiYl3fu3dvunXrRrNmzejRowdLly4lMTGR+Ph4ACwWC8OGDcPX15d169aRkJBAjx496Nq1K2fOnClxntGjR5OWlmZdTpw4casvUUREpFz66wMNePiemoUzpL4omzOkDC1RPj4+2Nvbk5ycXGR9cnIy1atXv+6xkyZNYvz48Sxfvpzg4ODr7lu3bl18fHw4ePAgAKtWrWLp0qUsWLCANm3a0KJFCz788ENcXV2ZM2cOANWrV79qrt+2XY2zszMeHh5FFhEREfkzk8nE+EeCaV3Pm6zcAp6ancipi5eMjnVTDC1RTk5OhIaGEhcXZ11nNpuJi4sjMjLymsdNnDiRt956i9jYWMLCwm74PCdPniQ1NZUaNWoAhfdRQeH9V79nZ2eH2WwGIDIykj179hT5lOCKFSvw8PCgSZMmxX+RIiIiclVODnZ81DeUhn7unM3IYeCshDI1Q8rwy3nDhw9n5syZzJkzh/379zNkyBCysrIYOHAgAP369WP06NHW/SdMmMDrr7/Op59+SmBgIElJSSQlJZGZmQlAZmYmI0aMYPPmzRw9epS4uDi6d+9OUFAQ0dHRQGFB8vLyon///uzatYsDBw4wYsQIjhw5QufOnQHo2LEjTZo0oW/fvuzatYsff/yRv//97wwbNgxnZ+c7/C6JiIiUTx4ujswaGI6vuzMHkjMZ8vk2cvPNRscqFsNLVK9evZg0aRJjxoyhefPm7Ny5k9jYWOtN3MePHy9yn9K0adPIzc2lZ8+e1KhRw7pMmjQJAHt7e3bv3k23bt1o0KABgwYNIjQ0lHXr1lnLj4+PD7GxsWRmZtK+fXvCwsJYv3493377LSEhIdbHWbp0Kfb29kRGRvLkk0/Sr18/3nzzzTv8DomIiJRv/lVc+XRAOJWd7Nl4KJVRX5eNGVKGz4kqzzQnSkREpPjifznLoDlbKTBbeLF9EMM7GjNDqkzMiRIRERH5zV8a+vKvHncD8P6qg3yZaNufcleJEhEREZvRu2Vtnr+/cIbU6MV7WHPgnMGJrk0lSkRERGzK3zo24KErM6SGfr6Nvadtc4aUSpSIiIjYFJPJxIRHgoms+78ZUqdtcIaUSpSIiIjYnN9mSNX3dSM5PYeBsxJJv2xbM6RUokRERMQmebo6Mvuplvi6O/NLcobNzZBSiRIRERGbVfPKDKlKTvZsOJjK6G/22MwMKZUoERERsWl31/Rk6hMtsLcz8fX2k0xe+avRkQCVKBERESkD7m/oy1vdC2dI/SfuV77cavwMKZUoERERKRMej6jNsPvrAfB/3+xh3a/GzpBSiRIREZEy45WODene3J98s4Uhn29n/5l0w7I4GPbMIiIiIjfJZDIxsWcwSWmXOXXxEo72xp0PUokSERGRMsXZwZ4ZfcPIKSjA193FsBwqUSIiIlLmeFZyBBwNzaB7okRERERKQCVKREREpARUokRERERKQCVKREREpARUokRERERKQCVKREREpARUokRERERKQCVKREREpARUokRERERKQCVKREREpARUokRERERKQCVKREREpARUokRERERKwMHoAOWZxWIBID093eAkIiIiUly//d7+7ff4tahE3UYZGRkABAQEGJxEREREblZGRgaenp7X3G6y3KhmSYmZzWZOnz6Nu7s7JpOp1B43PT2dgIAATpw4gYeHR6k9bnmk9+rm6P0qPr1Xxaf3qvj0XhXf7XyvLBYLGRkZ+Pv7Y2d37TufdCbqNrKzs6NWrVq37fE9PDz0h6yY9F7dHL1fxaf3qvj0XhWf3qviu13v1fXOQP1GN5aLiIiIlIBKlIiIiEgJqESVQc7OzowdOxZnZ2ejo9g8vVc3R+9X8em9Kj69V8Wn96r4bOG90o3lIiIiIiWgM1EiIiIiJaASJSIiIlICKlEiIiIiJaASJSIiIlICKlFl0NSpUwkMDMTFxYWIiAgSEhKMjmRz1q5dS9euXfH398dkMrFkyRKjI9mscePGER4ejru7O76+vvTo0YNffvnF6Fg2adq0aQQHB1uH+0VGRrJs2TKjY5UJ48ePx2Qy8fLLLxsdxSa98cYbmEymIkujRo2MjmWzTp06xZNPPom3tzeurq40a9aMrVu3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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"def plot_loss(loss: List[float], title):\n",
" plt.plot(range(len(loss)), loss)\n",
" plt.title(title)\n",
" plt.xlabel('Training epoch')\n",
" plt.ylabel('Loss')\n",
"\n",
"\n",
"losses = network.get_losses()\n",
"plot_loss(losses[0], 'Layer 0 loss')\n",
"plt.show()\n",
"plot_loss(losses[1], 'Layer 1 loss')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NLZcP3DgOzUj"
},
"outputs": [],
"source": []
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"provenance": [],
"include_colab_link": true
},
"gpuClass": "standard",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment