Skip to content

Instantly share code, notes, and snippets.

@nirshlezinger1
Created May 4, 2022 07:58
Show Gist options
  • Save nirshlezinger1/7cf8528f22709fb44fc5e13731758c48 to your computer and use it in GitHub Desktop.
Save nirshlezinger1/7cf8528f22709fb44fc5e13731758c48 to your computer and use it in GitHub Desktop.
LISTA vs ISTA.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "LISTA vs ISTA.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyO+zRSJOsEYHpiY0D6Q/Xzw",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/nirshlezinger1/7cf8528f22709fb44fc5e13731758c48/lista-vs-ista.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# Deep Unfolding\n",
"In this notebook we will compare the iterative soft thresholding algorithm (ISTA) to its deep unfolded version, coined learned ISTA (LISTA). LISTA is in fact the origin of deep unfolding methodology, proposed by Gregor and LeCun back in 2010, and has spurred a multitude of variants over the years. This notebook compares a basic implementation of it to the model-based ISTA, examining the ability of deep unfolding to increase the convergence rate of iterative optimizers. \n"
],
"metadata": {
"id": "jqHEmDXWutMj"
}
},
{
"cell_type": "code",
"source": [
"import torch\n",
"import torch.utils.data as Data\n",
"import torch.nn.functional as F\n",
"import torch.nn as nn\n",
"from scipy.linalg import eigvalsh \n",
"import numpy as np\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"torch.manual_seed(0)\n",
"\n",
"torch.set_default_dtype(torch.float64)"
],
"metadata": {
"id": "qgGnY-8TvTo9"
},
"execution_count": 1,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## ISTA\n",
"We begin by recalling the formulation of ISTA. The original algorihtm aims at solving the LASSO problem\n",
"\\begin{equation} \n",
"\t \\hat{\\boldsymbol{s}} = \\mathop{\\arg\\min}\\limits_{\\boldsymbol{s}} \\frac{1}{2}\\|\\boldsymbol{x}-\\boldsymbol{H}\\boldsymbol{s}\\|^2 +\\rho\\|\\boldsymbol{s}\\|_1,\n",
"\\end{equation}\n",
"via the iterative update equations\n",
"\\begin{equation}\n",
" \\boldsymbol{s}^{(k+1)} \\leftarrow \\mathcal{T}_{\\beta=\\mu\\rho}\\left( \\boldsymbol{s}^{(k)} - \\mu \\boldsymbol{H}^T(\\boldsymbol{H}\\boldsymbol{s}^{(k)}-\\boldsymbol{x}) \\right), \n",
"\\end{equation}\n",
"with $\\mathcal{T}$ being the soft-thresholding operation.\n",
"\n",
"Since one can probe convergence of ISTA when the step-size $\\mu$ satisfies $\\mu \\leq \\frac{1}{\\max {\\rm eig}(\\boldsymbol{H}^T\\boldsymbol{H})}$, we will use this value as our default setting of $\\mu = 1/L$ with $L=\\max {\\rm eig}(\\boldsymbol{H}^T\\boldsymbol{H})$."
],
"metadata": {
"id": "dKT5TkAgo5W_"
}
},
{
"cell_type": "code",
"source": [
"def ista(x, H, rho=0.5, L=1, max_itr=300):\n",
" s = torch.zeros(H.shape[1])\n",
" proj = torch.nn.Softshrink(lambd=rho / L)\n",
" for _ in range(max_itr):\n",
" s_tild = s - 1 / L * (H.T @ (H @ s - x))\n",
" s = proj(s_tild)\n",
" return s"
],
"metadata": {
"id": "ejv6JLOf8Rkj"
},
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Data\n",
"Next, we generate a data set $\\mathcal{D}=\\{(\\boldsymbol{s}_t, \\boldsymbol{x}_t)\\}_{t=1}^{n_t}$, where each $\\boldsymbol{s}_t$ has $m=200$ entries, out of which at most $k=4$ are non-zero, while $\\boldsymbol{x}_t$ has $n=150$ entires and is obtained via \n",
"\\begin{equation}\n",
"\\boldsymbol{x}_t = \\boldsymbol{H}\\boldsymbol{s}_t + \\boldsymbol{w}_t,\n",
"\\end{equation}\n",
"with $\\boldsymbol{w}_t$ being i.i.d. Gaussian noise.\n",
"\n",
"To that aim, we generate a dedicated class inheriting Dataset to get the data samples, and to allow each tuple to be comprised of both $(\\boldsymbol{s}_t, \\boldsymbol{x}_t)$ as well as $\\boldsymbol{H}$."
],
"metadata": {
"id": "pb3vwVLThFnF"
}
},
{
"cell_type": "code",
"source": [
"class SimulatedData(Data.Dataset): \n",
" def __init__(self, x, H, s): \n",
" self.x = x\n",
" self.s = s\n",
" self.H = H \n",
"\n",
" def __len__(self):\n",
" return self.x.shape[1]\n",
"\n",
" def __getitem__(self, idx):\n",
" x = self.x[:, idx] \n",
" H = self.H\n",
" s = self.s[:, idx]\n",
" return x, H, s\n"
],
"metadata": {
"id": "lFnR46I-zJN2"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"The following is an aid function to convert the noise level from SNR to standard deviation"
],
"metadata": {
"id": "TSLfjEPy2WmE"
}
},
{
"cell_type": "code",
"source": [
"def snr2std(y, snr):\n",
" s_db = 10 * torch.log10(y.var())\n",
" noise_db = s_db - snr\n",
" noise_std = 10 ** (noise_db / 20)\n",
" return noise_std"
],
"metadata": {
"id": "E83tiuJc7OGg"
},
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"The next function creates a dataset. To keep things simple, we use as our labeled data the output of the model-based ISTA with $200$ iterations, rather than the actual sparse signal (which may be difficult to retrieve in some sceanrios). "
],
"metadata": {
"id": "HCnvoe7A2bZl"
}
},
{
"cell_type": "code",
"source": [
"def create_data_set(H, n, m, k, N=1000, batch_size=512, snr = 30): \n",
" # The maximal eigenvalue\n",
" L = float(eigvalsh(H.t() @ H, eigvals=(m - 1, m - 1)))\n",
" # Initialization\n",
" x = torch.zeros(n, N) \n",
" s = torch.zeros(m, N)\n",
" # Create signals\n",
" for i in range(N): \n",
" # Random k indices and values\n",
" s_ind = torch.randperm(m)[:k]\n",
" s_nz = torch.randn(k) \n",
" # Create the signal\n",
" x[:, i] = H[:, s_ind] @ s_nz\n",
" # Add noise to the signal \n",
" noise = snr2std(x[:, i], snr) * torch.randn(n)\n",
" x[:, i] += noise\n",
" # Create the sparse representation by solving the Basis-Pursuit\n",
" s[:, i] = ista(x=x[:, i], H=H, L=L)\n",
" #x[x_ind, i] = x_nz\n",
"\n",
"\n",
" simulated = SimulatedData(x=x, H=H, s=s)\n",
" data_loader = Data.DataLoader(dataset=simulated, batch_size=batch_size, shuffle=True)\n",
" return data_loader"
],
"metadata": {
"id": "GhUgG1V1mE3x"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Finally, we generate the data set"
],
"metadata": {
"id": "daJJ2Jcl3YiO"
}
},
{
"cell_type": "code",
"source": [
"#n, m, k = 50, 70, 4\n",
"n, m, k = 150, 200, 4\n",
"# Measurement matrix\n",
"H = torch.randn(n, m)\n",
"H /= torch.norm(H, dim=0) \n",
"\n",
"train_loader = create_data_set(H, n=n, m=m, k=k, N=1000)\n",
"test_loader = create_data_set(H, n=n, m=m, k=k, N=1000)"
],
"metadata": {
"id": "ogzWwvvRnxPu"
},
"execution_count": 6,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Let's see what the samples look like"
],
"metadata": {
"id": "ll2C2WvcoVka"
}
},
{
"cell_type": "code",
"source": [
"x_exm, _, s_exm =test_loader.dataset.__getitem__(5)\n",
"plt.figure(figsize=(8, 8)) \n",
"plt.subplot(2, 1, 1) \n",
"plt.plot(x_exm, label = 'observation' ) \n",
"plt.xlabel('Index', fontsize=10)\n",
"plt.ylabel('Value', fontsize=10)\n",
"plt.legend( )\n",
"plt.subplot (2, 1, 2) \n",
"plt.plot(s_exm, label = 'sparse signal', color='k') \n",
"plt.xlabel('Index', fontsize=10)\n",
"plt.ylabel('Value', fontsize=10)\n",
"plt.legend( )\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 497
},
"id": "fXnrCnVn3kbs",
"outputId": "c05a0fd9-e6f3-44e5-a460-43f0a632adde"
},
"execution_count": 7,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
],
"image/png": "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+MAHCs//mc98BoD777+fZcuWsXz5cj74wQ9y/PHHA3DzzTfzpje9iXPOOYelS5fyoQ99qPCcf/3Xf01PTw/HHXccH/3oR+v+OioAEJGaKQCQRvrRj37E4Ycfzu9+9zsefPBBzjlnZE25KVOmsG7dOq688kquuuoqAF75yldy77338tvf/paLL76Yf/qnfyrc/+GHH+auu+7i1ltv5ctf/jLvfe97WbNmDatXr2bevHk88sgj3H777fz3f/83a9asIZlM8s1vfnNUe3bs2MF3v/tdHnroIdauXcvf//3fH9Dmt73tbXzlK18pPEfUmjVruP3221m3bh233347zzzzDACf+MQnWL16NWvXruUXv/gFa9eurdtrCOoCEJE6UADQvq666irWrFlT1+dcvnw5n/vc58refsIJJ/D+97+fD3/4w5x33nm86lWvKtx2ySWXFH6/733vA2Djxo1cdNFFbN68mf7+/lFD5c4//3w6OjoAOO200/jEJz7Bxo0bedOb3sTSpUu5++67eeCBB3jZy14GwP79+5k9e/ao9kyZMoVcLsfll1/Oeeedx3nnnTfq9hdffJHdu3dz2mmnAfDmN7+Z73//+4XbX/va1zJlyhQAjj32WP7whz8wf/58vv3tb3PDDTcwODjI5s2befjhh1m2bFllL+YYlAEQkZopAJBGOvroo/nNb37DCSecwN///d/zsY99rHBbtBo+vPye97yHK6+8knXr1vGVr3xl1HC5zs7OwuU3v/nNrFq1io6ODs4991x++tOf4u5cdtllrFmzhjVr1vDoo49y3XXXjWpPKpXi17/+NRdeeCHf//73R2UkxiObzRYuJ5NJBgcHefLJJ/nMZz7D3Xffzdq1a3nDG95Q94mXlAEQkZopAGhfY52pT5RNmzYxffp03vKWtzB16lRuvPHGwm233347V199NbfffnvhjHvnzp0cccQRANxyyy1ln/eJJ55gyZIl/M3f/A1PP/00a9eu5eyzz2blypW8733vY/bs2Tz//PPs3r2bhQsXFh63Z88e9u3bx7nnnsvpp5/OkiVLRj3v1KlT6e7u5r777uPUU0/ltttuO+g+7tq1i87OTqZMmcLWrVu54447eM1rXlPJy3RQCgBEpCZDQ0O4uwIAaZh169bxwQ9+kEQiQTqd5ktf+lLhthdeeIFly5aRzWa59dZbgXwx3p/9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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Train and Validation\n",
"\n",
"For training, we use SGDM with learning rate scheduler and the $\\ell_2$ loss"
],
"metadata": {
"id": "RHKRaregobdz"
}
},
{
"cell_type": "code",
"source": [
"def train(model, train_loader, valid_loader, num_epochs=30):\n",
" \"\"\"Train a network.\n",
" Returns:\n",
" loss_test {numpy} -- loss function values on test set\n",
" \"\"\"\n",
" # Initialization\n",
" optimizer = torch.optim.SGD(\n",
" model.parameters(),\n",
" lr=5e-05,\n",
" momentum=0.9,\n",
" weight_decay=0,\n",
" )\n",
" scheduler = torch.optim.lr_scheduler.StepLR(\n",
" optimizer, step_size=50, gamma=0.1\n",
" )\n",
" loss_train = np.zeros((num_epochs,))\n",
" loss_test = np.zeros((num_epochs,)) \n",
" # Main loop\n",
" for epoch in range(num_epochs):\n",
" model.train()\n",
" train_loss = 0\n",
" for step, (b_x, b_H, b_s) in enumerate(train_loader):\n",
" #b_x, b_H, b_x = b_x.cuda(), b_H.cuda(), b_s.cuda() \n",
" s_hat = model(b_x)\n",
" loss = F.mse_loss(s_hat, b_s, reduction=\"sum\")\n",
" optimizer.zero_grad() \n",
" loss.backward() \n",
" optimizer.step() \n",
" model.zero_grad()\n",
" train_loss += loss.data.item()\n",
" loss_train[epoch] = train_loss / len(train_loader.dataset) \n",
" scheduler.step()\n",
"\n",
" # validation\n",
" model.eval()\n",
" test_loss = 0\n",
" for step, (b_x, b_H, b_s) in enumerate(valid_loader):\n",
" #b_x, b_H, b_x = b_x.cuda(), b_H.cuda(), b_s.cuda()\n",
" s_hat = model(b_x)\n",
" test_loss += F.mse_loss(s_hat, b_s, reduction=\"sum\").data.item()\n",
" loss_test[epoch] = test_loss / len(valid_loader.dataset)\n",
" # Print\n",
" if epoch % 10 == 0:\n",
" print(\n",
" \"Epoch %d, Train loss %.8f, Validation loss %.8f\"\n",
" % (epoch, loss_train[epoch], loss_test[epoch])\n",
" )\n",
"\n",
"\n",
" return loss_test"
],
"metadata": {
"id": "63WxCf_JITSb"
},
"execution_count": 8,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Learned ISTA (LISTA)\n",
"As noted earlier, there are many variants of unfolded ISTA. Here we should use the following update equation:\n",
"\\begin{equation}\n",
" \\boldsymbol{s}^{(k+1)} \\leftarrow \\mathcal{T}_{\\beta^{(k)}}\\left( \\boldsymbol{s}^{(k)} - \\mu^{(k)} (\\boldsymbol{B}\\boldsymbol{s}^{(k)}+\\boldsymbol{A}\\boldsymbol{x}) \\right), \n",
"\\end{equation}\n",
"with $\\boldsymbol{A}, \\boldsymbol{B}$ and $\\{\\beta^{(k)},\\mu^{(k)}\\}$ beging trainable parameters."
],
"metadata": {
"id": "HxrAyYc2pHbz"
}
},
{
"cell_type": "code",
"source": [
"class LISTA_Model(nn.Module):\n",
" def __init__(self, n, m, T=6, rho=1.0, H=None):\n",
" super(LISTA_Model, self).__init__()\n",
" self.n, self.m = n, m\n",
" self.H = H\n",
" self.T = T # ISTA Iterations\n",
" self.rho = rho # Lagrangian Multiplier\n",
" self.A = nn.Linear(n, m, bias=False) # Weight Matrix\n",
" self.B = nn.Linear(m, m, bias=False) # Weight Matrix\n",
" # ISTA Stepsizes eta \n",
" self.beta = nn.Parameter(torch.ones(T + 1, 1, 1), requires_grad=True)\n",
" self.mu = nn.Parameter(torch.ones(T + 1, 1, 1), requires_grad=True)\n",
" # Initialization\n",
" if H is not None:\n",
" self.A.weight.data = H.t()\n",
" self.B.weight.data = H.t() @ H \n",
"\n",
" def _shrink(self, s, beta):\n",
" return beta * F.softshrink(s / beta, lambd=self.rho)\n",
"\n",
" def forward(self, x):\n",
" s = self._shrink(self.mu[0, :, :] * self.A(x), self.beta[0, :, :])\n",
" for i in range(1, self.T + 1): \n",
" s = self._shrink(\n",
" s - self.mu[i, :, :] * self.B(s) + self.mu[i, :, :] * self.A(x),\n",
" self.beta[i, :, :],\n",
" )\n",
" return s\n"
],
"metadata": {
"id": "OWvCFWUC9GuH"
},
"execution_count": 9,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"The following functions apply LISTA and ISTA for given data sets"
],
"metadata": {
"id": "iUYvLlGsAMuL"
}
},
{
"cell_type": "code",
"source": [
"def lista_apply(train_loader, test_loader, T, H):\n",
" n = H.shape[1]\n",
" m = H.shape[1]\n",
" lista = LISTA_Model(n=n, m=m, T=T, H=H)\n",
" #lista.cuda()\n",
" \n",
" loss_test = train(lista, train_loader, test_loader)\n",
" err_lista = loss_test[-1]\n",
" return err_lista"
],
"metadata": {
"id": "XbErjona589S"
},
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def ista_apply(test_loader, T, H, rho=0.5):\n",
" m = H.shape[1]\n",
" L = float(eigvalsh(H.t() @ H, eigvals=(m - 1, m - 1)))\n",
"\n",
" loss = 0\n",
" for step, (x, _, s) in enumerate(test_loader.dataset):\n",
" s_hat = ista(x=x, H=H, rho=rho, L=L, max_itr=T)\n",
" loss += F.mse_loss(s_hat, s, reduction=\"sum\").data.item()\n",
"\n",
" return loss / len(test_loader.dataset)\n",
" \n"
],
"metadata": {
"id": "YFpYX3FyOXrC"
},
"execution_count": 11,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Comparing LISTA to ISTA\n",
"Finally, we show that by learning the parameterization of ISTA in a per-iteration manner, one can notably imporve its convergesnce rate. To that aim, in the following loop we compare ISTA to trained LISTA with different number of iterations.\n"
],
"metadata": {
"id": "1xMFNzd5zUOJ"
}
},
{
"cell_type": "code",
"source": [
"# Number of unfoldings\n",
"tstart, tend, tstep = 0, 13, 2\n",
"T_opt = range(tstart, tend, tstep)\n",
"\n",
"ista_MSE = []\n",
"lista_MSE = []\n",
"for i in range(len(T_opt)):\n",
" T = T_opt[i]\n",
" # Apply ISTA with T iterations\n",
" ista_MSE.append(ista_apply(test_loader, T, H))\n",
" # Train and apply LISTA with T iterations / layers\n",
" lista_MSE.append(lista_apply(train_loader, test_loader, T, H))\n",
" \n",
"# plot the resutls \n",
"fig = plt.figure()\n",
"plt.plot(T_opt, ista_MSE, label='ISTA', color='b',linewidth=0.5)\n",
"plt.plot(T_opt, lista_MSE, label='LISTA', color='r', linewidth=2) \n",
"plt.xlabel('Number of iterations', fontsize=10)\n",
"plt.ylabel('MSE', fontsize=10)\n",
"plt.yscale(\"log\")\n",
"plt.legend()\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 644
},
"id": "5fLLBxGBrkJP",
"outputId": "60085237-7ddb-4779-cd2f-0fbeec9ed760"
},
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 0, Train loss 0.17134949, Validation loss 0.11539615\n",
"Epoch 10, Train loss 0.02844153, Validation loss 0.03291038\n",
"Epoch 20, Train loss 0.02302526, Validation loss 0.03146555\n",
"Epoch 0, Train loss 0.16294222, Validation loss 0.01027154\n",
"Epoch 10, Train loss 0.00039944, Validation loss 0.00044741\n",
"Epoch 20, Train loss 0.00031676, Validation loss 0.00041448\n",
"Epoch 0, Train loss 0.16005076, Validation loss 0.00928998\n",
"Epoch 10, Train loss 0.00038584, Validation loss 0.00044998\n",
"Epoch 20, Train loss 0.00029110, Validation loss 0.00039879\n",
"Epoch 0, Train loss 0.16261384, Validation loss 0.00728203\n",
"Epoch 10, Train loss 0.00037819, Validation loss 0.00046729\n",
"Epoch 20, Train loss 0.00028347, Validation loss 0.00041146\n",
"Epoch 0, Train loss 0.15724220, Validation loss 0.00659751\n",
"Epoch 10, Train loss 0.00041298, Validation loss 0.00052746\n",
"Epoch 20, Train loss 0.00030126, Validation loss 0.00045046\n",
"Epoch 0, Train loss 0.15557589, Validation loss 0.00644273\n",
"Epoch 10, Train loss 0.00048024, Validation loss 0.00063444\n",
"Epoch 20, Train loss 0.00033723, Validation loss 0.00051873\n",
"Epoch 0, Train loss 0.15442260, Validation loss 0.00535904\n",
"Epoch 10, Train loss 0.00057877, Validation loss 0.00077456\n",
"Epoch 20, Train loss 0.00039724, Validation loss 0.00061686\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEGCAYAAAB7DNKzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd5xU5fXH8c9hF1iadBFZcSkRRESIqLEXgsGfIrYkEg1qUMREYywxGBtWUNAYIxYkioUsitEoGGNDDYkFQROwIdJkBYWg0ssunN8fz6yO6/ad2Tvl+3699rUzd2fvPUO5Z552HnN3REREKtIg6gBERCS1KVGIiEillChERKRSShQiIlIpJQoREalUbtQBJEO7du28oKAg6jBERNLK3Llz/+fu7csez8hEUVBQwJw5c6IOQ0QkrZjZsvKOq+tJREQqpUQhIiKVUqIQEZFKZeQYhYhIdRQXF1NUVMSWLVuiDqVe5eXlkZ+fT8OGDav1+oxKFGY2GBjcvXv3qEMRkTRQVFREixYtKCgowMyiDqdeuDtr1qyhqKiILl26VOt3Mqrryd2nu/uIli1bRh2KiKSBLVu20LZt26xJEgBmRtu2bWvUisqoRCEiUlPZlCRK1fQ9K1HE2bEDVHVdROTblCjifPYZXHQRvPJK1JGISLZo3rw5ADt27ODXv/41vXv3Zu+992a//fZjyZIlHHDAAfTt25fOnTvTvn17+vbtS9++fVm6dCklJSW0b9+eUaNGJTXGjBrMrqtdd4U//AGefBIuvhjOPBP69Ik6KhHJBo8++igrVqxg3rx5NGjQgKKiIpo1a8abb74JwOTJk5kzZw533nnn17/z7LPPssceezBt2jTGjBmTtG40tSjKMIOTToJbboHZs+Hyy+GTT6KOSkQy3cqVK+nYsSMNGoTbcn5+Pq1bt670dwoLC7nwwgvp3Lkzr7/+etJiU4uiArm5cPbZsHEj3HMPbNoEv/oVtGkTdWQikol+8pOfcMghhzBr1iwGDBjA6aefTr9+/Sp8/ZYtW3jxxRe59957+eqrrygsLOSggw5KSmxKFFVo1gwuuQRWr4Y77oBWreDcc6FJk6gjE5FEmzwZli5N3PkKCkIXdnXk5+ezYMECZs6cycyZMxkwYADTpk1jwIAB5b5+xowZHHnkkTRp0oSTTz6Z66+/nttvv52cnJyExV9KiaKa2reH0aNh8eLwvWdPGDYMkvB3IiIRqe5NPVkaN27MMcccwzHHHEOHDh3429/+VmGiKCws5F//+helWyqsWbOGmTNnMnDgwITHpTGKGuraFW6+Gfr2hd/+FqZP15RaEam7t99+mxUrVgBhBtS8efPYfffdy33tunXrmDVrFp988glLly5l6dKlTJgwgcLCwqTEpkRRS/36wW23QV5emCGVxHEkEckCq1atYvDgwfTu3Zs+ffqQm5vL+eefX+5rn3zySY466igaN2789bEhQ4Ywffp0tm7dmvDYzDPw43D//v29Pjcu2rEDHn0U5s4NA+A9e9bbpUWkDj744AP23HPPqMOIRHnv3czmunv/sq9N+RaFmTUzswfN7D4zOy3qeMrToAEMHQo33ggzZ8KVV0KsBSkikvYiSRRmdr+ZrTKzd8scH2RmC8zsYzMrXWp4EvC4u58DHF/vwdZA48bwy1/CZZfBQw/BmDGwdm3UUYmI1E1ULYrJwKD4A2aWA0wAjgF6AUPNrBeQDyyPvWx7PcZYazvtBKNGhRkU48fDhAmQhG5DEZF6EUmicPd/Al+UObw/8LG7L3b3bcBUYAhQREgWkAZdZfE6doTrr4cf/jB0R02ZEsYzRETSSSrdeDvxTcsBQoLoBDwBnGxmdwPTK/plMxthZnPMbM7q1auTG2kN9egB48ZBt25hhtTzz0cdkYhI9aVSoiiXu29097Pc/Tx3n1LJ6ya6e39379++ffv6DLHafvCDUHRw27ZQpXbu3KgjEhGpWiolik+B3eKe58eOVZuZDTaziWtTeATZDI47LoxdzJ8fBr4XL446KhGJSmmZ8XijR49m/PjxALzxxhtflxrfc889GT16NA888MDX5cYbNWrE3nvvTd++fb8uN3777beTl5dHou6FqVTC4y3ge2bWhZAgTgV+VpMTuPt0YHr//v3PSUJ8CZWTEwa7N2+GiRPhiy9C0cGdd446MhFJJWeccQaPPfYY++yzD9u3b2fBggX06tWLs846C4CCggJefvll2rVr9/XvFBYWst9++/HEE098/bq6iGp6bCHwOtDDzIrMbLi7lwDnA88BHwCPuft7UcRXn5o0gQsvDF/33hvGMjZsiDoqEUkVq1atomPHjgDk5OTQq1evSl+/aNEiNmzYwA033JCwkh6RtCjcfWgFx/8O/L225zWzwcDg7t271/YUkWnTBq66Kux9ceON0KULnHUWNGwYdWQiWSJZe2fXsfrFRRddRI8ePTjiiCMYNGgQZ5xxBnl5eRW+furUqZx66qkceuihLFiwgM8//5wOHTrUKYZUGqOoM3ef7u4jWrZsGXUotda5c1iod+CBYS3G44+r6KBINrv66quZM2cORx99NH/5y18YNGhQpa8vLCzk1FNPpUGDBpx88slMmzatzjFkVKLIJHvvDbfeGsqbX3QRvPpq1BGJZDj35HwlQLdu3TjvvPN46aWX+O9//8uaNWvKfd38+fNZuHAhAwcOpKCggKlTpyak+ymjEkU6zHqqqcMPD1Nq//e/sAZj/vyoIxKR+vTMM89QWrx14cKF5OTk0KpVq3JfW1hYyOjRo78uPb5ixQpWrFjBsmXL6hRDRiWKTOh6Ko8ZnHxy2Afj9de1j7dIJtm0aRP5+flff912223f+vnDDz9Mjx496Nu3Lz//+c+ZMmVKhbvYTZ06lRNPPPFbx0488USmTp1apxhVZjwNbdgAd98NW7ZoH2+RulCZ8eqVGU+ldRRSTc2bh931Vq3SPt4iknwZ1fWUiWMUldl557B/9+DB4fvkybA9Lerrikg6yahEkaljFFXp1i2MX+y9N1x6KcyYoSm1ItWVid3vVanpe86oRJHt9t03zJBq3DhMqX3ttagjEklteXl5rFmzJquShbuzZs2aShftlaXB7Ay1YwdMmwazZ8MZZ0CfPlFHJJJ6iouLKSoqYsuWLVGHUq/y8vLIz8+nYZnSDxUNZmdUoogr4XHOwoULow4nJRQXh21ZP/oIRowI3VQiIuXJikRRSi2K79q8Ge67L8yU+uUvYdddo45IRFKNpsdmuSZN4Ne/hnXrwhqMbdtCwmjbNurIRCTVKVFkmZ12gt/9DlavhjvvhGbNYOTIsDZDRKQ8ShRZqn17uOaaUApkzJjQFXX22WHGlIhIvIyaHpttC+4SoXPnsP/FD38Y9sOYPBlKSqKOSkRSiQaz5VvmzoUpU+Dgg+Gkk5K3l4uIpJ6KBrMzqkUhdbfvvnDbbdCuXVi098ILWuUtku2UKKRcpftgbN0aEsYbb0QdkYhERYlCKmQGxx0XWhhLlsAll8C770YdlYjUNyUKqVKDBjB0KIwdGzZOGjUKFi+OOioRqS+aHivV1rAhnHMObNoEEyfCmjVh0V7HjlFHJiLJlFGJIq7WU9ShZLSmTeE3v4G1a8Mq75KSsNNe69ZRRyYiyaDpsVJnn38eEkaLFmGVd7NmUUckIrWhWk+SNB06hB32li0Li/d22w2GD4dGjaKOTEQSQYPZkjC77w433RSm1l5xBTz8sLZmFckEShSScL16wbhx0LMn/Pa38Le/adGeSDpTopCk2W+/sAajZcuwaO+ll6KOSERqQ4lCku7II8Mq7w0bQsKYPTvqiESkJpQopF6YwZAhMH582Jb10kvh/fejjkpEqkOJQupVTg6cfnoY9J41K6zyXro06qhEpDIZNT1WC+7SR6NGcO65sHFjWOX91VdhlXeHDlFHJiJlacGdpIQvvwyL9iAkjFatoo1HJBtpwZ2ktNat4fe/h88+CwPfrVqFFkfTplFHJiJKFJJSdtkFrr02lDW//nooKICzztIqb5EoaTBbUlKXLjBmDBxySGhpPPig9vIWiYoShaS0vfYKU2p794bf/Q4KC2HHjqijEskuShSSFvbdF269NXRFXXopPPGEyoKI1BclCkkrBx4YyoK0bRtWec+YoYQhkmxKFJKWDj88zI5q3DgkjOefV8IQSRYlCklbZjBwYEgYxcUhYbz6atRRiWQeJQpJe2Zw7LEhYaxZExLG669HHZVI5lCikIxhBiedFAa9ly2DSy6BuXOjjkok/SlRSMZp0ABOPRVuvhneey/Mkpo/P+qoRNJXyicKM+tqZn82s8ejjkXSS24uDBsWFu7Nnh3WYXz4YdRRiaSfpCYKM7vfzFaZ2btljg8yswVm9rGZjarsHO6+2N2HJzNOyWwNG8Lw4XDddfDKK6G0+aJFUUclkj6SXetpMnAn8FDpATPLASYAA4Ei4C0zexrIAcaU+f1fuPuqJMcoWaJxYxg5EjZvhkmTYOXKUHhw992jjkwktSU1Ubj7P82soMzh/YGP3X0xgJlNBYa4+xjguGTGIwLQpAlccEHYmvW++0KJ83PPhU6doo5MJDVFUT22E7A87nkRcEBFLzaztsCNQD8zuzyWUMp73QhgBEDnzp0TF61krObNw1TatWvh3ntDS2PkSG2eJFJWypcZd/c1wMhqvG4iMBHCxkXJjksyR8uWcNll8MUXcM89oejgeeeFMiEiEk2i+BTYLe55fuxYnWkrVKmLNm1CSfPVq+Guu8Ig+MiR2m1PJOlbocbGKGa4e+/Y81zgI2AAIUG8BfzM3d9L1DW1FaokwsqVoUuqRQsYMSJ8F8lkkWyFamaFwBFAOzMrAq5x9z+b2fnAc4SZTvcnMkmIJErHjjB6NCxfHhbvtWsXEoa2Z5Vsk/QWRX2K63o6Z+HChVGHIxlm8eIwrbZTp7AuIy8v6ohEEquiFkVGJYpS6nqSZProI7j/fujaFc48U/t5S+aoKFGkfAkPkVSzxx4wdiwcfDBceSU88ID285bMllGJwswGm9nEtWvXRh2KZIG99oJbboF+/UJZkL/8BbZvjzoqkcRT15NIgsyeDY8+GrZrPemkUMVWJJ2o60kkyfbfP+yFscsuobT5009re1bJDBmVKNT1JKngkEPgtttCiZCLL4Z//EMJQ9JbRiUKd5/u7iNatmwZdSgiHHVUSBgQEsbLL0cbj0htZVSiEEk1ZjBoUEgY69aFhPHCC2phSHpRohCpB2YwZEgYw9i+PYxh/O1voQChSKpTohCpR6UtjFtvDdVpL7sMHnlE6zAktWVUotBgtqSTQw+F8eNhzz1D1dr77oMtW6KOSuS7tI5CJEV88AE89FCYXjt8eJg1JVKfIqkeKyLVt+eeMGYMLF0aVnw3bw5nnx32yRCJkhKFSIopKIDrroPPPoMJE8Kxs88OZc9FoqBEIZKidtkFrroqbNE6aRKsXx+6pAoKoo5Msk1GJQpthSqZqE2bMDtqw4ZQ3nzlShg2LHRVidQHDWaLpJktW+Dhh8O+GKeeCvvuG3VEkik0mC2SIfLy4JxzwtqLqVNDefMhQ+Cww6KOTDJVpesozOz0uMcHl/nZ+ckKSkSqlpsLp58O48aFcYyLL4Znn1V5EEm8qhbcXRz3+E9lfvaLBMciIrXQoAGccEJY7Z2bC5dcAtOmaRMlSZyqEoVV8Li855lh3bqoIxCpFTMYODAUIOzUCX73O5g8GYqLo45M0l1VicIreFze8/S2cmUownPwwarUJmnvoINCeZC+fcO+3nffDZs3Rx2VpKuqBrN7mtk8QuuhW+wxseddkxpZLdRpemybNvD++7B8OTz+OPzkJwmPT6S+9e0bvj76CK6/Htq1C4v3dtop6sgknVQ6PdbMdq/sl919WcIjSoBaT4+9914YORJ69YJ58yAnJ/HBiUTok0/CWozGjcPMqXbtoo5IUklF02NrtI7CzNoChwGfuPvcBMaXULVOFNu2wR57wLJlUFgYJqmLZKBVq0K12pKS0MLo1CnqiCQVVJQoqpoeO8PMescedwTeJcx2etjMfpOUSKPUqBFccUV4fO21mjYiGWvnncM/9QsvDJ+JrrwSFi2KOipJVVV1Pb3n7nvFHv8e6Onuw8ysBfBvd+9TT3HWSJ1WZhcXh1bF0qUwZQr87GcJjU0kFW3cCA88EIbofv5z6N076ogkCrVqUQDxE+sGAH8HcPf1QGZODWrYMHy8glDCU60KyQLNmsH554d/8m++GbZqnT076qgkVVSVKJab2QVmdiLwfeAfAGbWBGiY7OAiM2wYdO0KCxaEdrlIlmjcOFSoHTsWFi8Oq71nztRq72xXVaIYDuwFnAn81N2/ih3/AfBAEuOKVtlWhTY0liyTmxvmcowfH7qlLr4Ypk9XwshWqh5bkZIS6NkzjPA99FDouBXJUu7w8sswYwbst19YZqTZ45mnVtNjzezpyk7q7scnILaEiVtwd87ChQvrfsIHH4Qzz4Tu3cOGxrkqtivy5pthTWrXrqEoYYsWUUckiVLbRLEaWA4UAm9Spr6Tu7+a4DgTImH7UZSUhN1hPv44FM0544y6n1MkQyxaFCYGlpSEbqpevaKOSOqqtokiBxgIDAX6AM8Ahe7+XrICTYSEblz00EMhQXTrBh9+qFaFSBmbNoV9Md5/Hw48MOyNof8m6anOK7PNrDEhYYwDrnX3OxMbYuIkNFGUlISPSgsXhtoHZ52VmPOKZBh3eOMNeOopaNs2TB7s0CHqqKQmap0oYgniWEKSKACeBu5390+TEGdCJHwr1EceCYPZXbqEKbMNM3dmsEgifP55aIyvWQPHHx9aGpaZGxNklNp2PT0E9CYstJvq7u8mL8TESXii2L4d9torJIlJk8JEcxGpUkkJPP00vPZaGO4bOhSaNo06KqlIbRPFDmBj7Gn8Cw1wd0/JYsUJTxQQNiY+7TQoKAgJo1GjxJ5fJMO9/34Yy8jJCbOlunWLOiIpKyHVY9NFUhLF9u2w995hmuzEiaFGs4jU2Pr1YbbUokVwxBFwzDFhO1eJnhJFIkydGtrOnTuHwW21KkRqzR1eeQX+8Q/o2DEMfrdpE3VU2U2JIhG2b4c+fUIb+p574NxzE38NkSxUVAQPPxxaG6ecAt//ftQRZSclikR57DH46U9ht91Cq6Jx4+RcRyQLbd0Kf/0rvPNO2ML1lFP0X6w+KVEkyo4dsM8+8O67cNddcN55ybmOSJb7z39g2rQwS2rYsPDZTJJLiSKRHn8cfvxjyM8P5T30kUckab78MqzJ+PRT+NGP4KijtCYjWWq7cVHkzOwEM7vPzB41s6OjjgeAk04KM6CKisK6ChFJmtatw5atY8eGbe0vuyw05tetizqy7JHUFoWZ3Q8cB6xy995xxwcBfwRygEnuPrYa52oNjHf3Kle7Jb1FAaEj9ZRTwq70H38MeXnJvZ6IfG3x4lAwobg4FCTca6+oI8oMkXQ9mdlhwAbgodJEESs0+BGh2GAR8BahPEgOMKbMKX7h7qtiv3crMMXd367quvWSKHbsgH79YN48+NOfwj6SIlKvNm8Os9bfew9+8INQkFAVdmovsjEKMysAZsQligOB0e7+o9jzywHcvWySKP19A8YCL7j7i5VcZwQwAqBz5877Llu2LIHvogJPPhm6oXbdNaweUqtCJBLuYZ+Mp54KXVXDhsEuu0QdVfpJpTGKToQ9LkoVxY5V5ALgh8ApZjayohe5+0R37+/u/du3b5+YSKtywglhDt+KFWG1tohEwiy0KMaMCXuNPfIIjBoF//63tm9NhJQfzHb3O9x9X3cf6e73RB3Pt5jB6NHh8ZgxoR0sIpHaeWe49FK44QZYvToMfk+aFPb+ltqJIlF8CsTPiM6PHaszMxtsZhPXrl2biNNVz/HHh2Wkn30G995bf9cVkUrl5oZG/7hxcMghcMstcO21Ye6J1EwUYxS5hMHsAYQE8Rbws0Tumlcvg9nxpk8PCaNDhzAdQ3WURVLS+vWhEPTHH8Phh4eChDk5UUeVOiIZozCzQuB1oIeZFZnZcHcvAc4HngM+AB5L9a1Vq3TccdC/f9it5Z7U6h0TkW+0aBFKtN1yCzRvDr//Pdx2G9TH3Jd0llErs81sMDC4e/fu5yxcuLB+L/7MMyFh7LxzaFU0a1a/1xeRWlm5MnQKLF0aksegQWHmezau/lYJj2RzD9MuZs8OnaKXXlq/1xeROlu/PpQ9f+edMMZx6KGhiypbdhRQoqgPzz4L//d/0L49LFmiVoVIGisuhlmz4NVXw+M+fcKYRsuWUUeWPFmRKCLteoLQqjjwwLDy5+abw7w8EUl77qEIw7PPhhpT+fkweHDmVbTNikRRKrIWBYR26zHHQLt2oVXRvHk0cYhI0ixfHsY1iopgp53Cf/k+fdJ/XEOJor64w0EHwRtvhEV4o0ZFE4eI1Iu1a0NLY968UGfq8MPD2EY61pzKikQReddTqeefD4Xz27YNrYoWLaKLRUTqzbZtYUxj1qywc3K/fuFWkC63gKxIFKUibVFAaFUccgi89hrcdBNcfnl0sYhIJNzD7KnnnoMNG6Bz5zCuseuuUUdWMSWK+vbiizBwILRpE1oVO+0UbTwiEqmlS2HGjLBuo1WrMEGyV6/UGtdQoqhv7nDYYfCvf4XqZFdcEW08IpIyvvwS/v53eP/9sEbjyCPD0GZubrRxKVFEYeZMGDAgFMhfsiSzJ2CLSK1s3RpuFa+9FvZD698fjj46mmVYWZEoUmYwu5Q7HHEE/POfcN11cNVVUUckIilsxw6YMyfMh9m0Cbp2DeMaHTrUz/WzIlGUSpkWBcArr4R2ZatWoVXRqlXUEYlImli0KKzXWLUqTKI89ljo2TN511OiiNKRR4aEMXo0XHNN1NGISBr63/9C7dEFC8KuywMGhPJyiSyTrkQRpX/+M6zCadkyTH1Qq0JE6mDzZnjppbCu1x0OOCBMsmzSpG7nTaU9s7PPYYfBUUeFJZx/+EPU0YhImmvSJOxqcMMNcP31oQ7p+PHw2GPJuV5GtShSbjA73qxZIWHstFNoVbRuHXVEIiLfkhUtCnef7u4jWqbiNNRDDw2diuvWhS21RETSREYlipR37bXh+x//CF98EW0sIiLVpERRnw4+OIw4rV8Pt94adTQiItWiRFHfSlsVd9wBa9ZEG4uISDUoUdS3Aw8MdYc3bFCrQkTSghJFFEpbFX/6U1hFIyKSwjIqUZjZYDObuHbt2qhDqdwBB4S9EzdsCJOfRURSWEYlipSeHlvW6NHh+513wurVkYYiIlKZjEoUaWX//UOFr40bYdy4qKMREamQEkWUSlsVEyaE8pAiIilIiSJK/fuHYvObNsEtt0QdjYhIuZQoolbaqrjrLvjss0hDEREpjxJF1L7/fTj++FA3WK0KEUlBShSpoLRVcffdsHJlpKGIiJSlRJEK+vWDE06ALVvg5pujjkZE5FsyKlGkzYK78pS2Ku65B1asiDQUEZF4GZUo0mrBXVn77AMnnQRbt8LYsVFHIyLytYxKFGnvmmvC94kT4dNPo41FRCRGiSKV9OkDp5yiVoWIpBQlilRzzTVgFloVRUVRRyMiokSRcnr3hh//GLZtgzFjoo5GRESJIiWVtiomTYLly6OORkSynBJFKurVC37609CquOmmqKMRkSynRJGqrr46tCr+/GdYtizqaEQkiylRpKo994ShQ6G4WK0KEYmUEkUqu+oqaNAA7r8fli6NOhoRyVJKFKmsZ8/QqigpgRtvjDoaEclSShSp7uqrQ6ti8mRYsiTqaEQkC6V8ojCzPc3sHjN73MzOizqeerfHHnDaaaFVccMNUUcjIlkoqYnCzO43s1Vm9m6Z44PMbIGZfWxmoyo7h7t/4O4jgZ8ABycz3pR11VWQkwMPPgiLFkUdjYhkmWS3KCYDg+IPmFkOMAE4BugFDDWzXma2t5nNKPO1c+x3jgeeAf6e5HhT0/e+B6efDtu3q1UhIvXO3D25FzArAGa4e+/Y8wOB0e7+o9jzywHcvcp6FWb2jLsfW8HPRgAjADp37rzvskxbe7BoEfToER5/+CF07x5tPCKSccxsrrv3L3s8ijGKTkB8XYqi2LFymdkRZnaHmd1LJS0Kd5/o7v3dvX/79u0TF22q6NYNhg1Tq0JE6l3KD2a7+yvu/mt3P9fdJ0QdT6SuvBJyc+Hhh2HhwqijEZEsEUWi+BTYLe55fuxYnaX1VqjV0bUrnHEG7NgB118fdTQikiWiSBRvAd8zsy5m1gg4FXg6ESdO661Qq6u0VTFlCixYEHU0IpIFkj09thB4HehhZkVmNtzdS4DzgeeAD4DH3P29ZMaRUQoK4Kyz1KoQkXqT9FlP9cnMBgODu3fvfs7CTO7DX7o0TJndsQPeey+U+hARqaNUmvWUNFnR9QShVfGLX4REcd11UUcjIhkuoxJFVrniCmjYEKZOhfffjzoaEclgGZUoMn7WU7zOnWH4cHBXq0JEkiqjxihK9e/f3+fMmRN1GMm3fHlYoV1cDPPnw157RR2RiKSxrBijyDq77QZnnx1aFddeG3U0IpKhMipRZFXXU6nLL4dGjWDatNCqEBFJsIxKFFkz6ylefj6MGBEeq1UhIkmgMYpMsGJFKO+xdSv85z+wzz5RRyQideUO69bBl1+Gry++qPrxl1/CLbfAKafU6pIVjVHk1vnNSPR23RXOPRfuuCPMgPrrX6OOSEQg3Ow3barZzb708VdfhWrRNbVyZcLfhloUmWLlytCq2LIF3nkH+vaNOiKRzLF1a80+1cc/37at9tdt3hxatw5fbdpU/bh1a+jYEZo1q9XlsqJFEVfCI+pQ6l/HjjByJNx+exirePLJqCMSSQ3usHEjrF8funLWrfvu46qSwObNtb9+Xl75N/SqbvytWoWJKilALYpM8tln0KVLaFW8/Tb06xd1RCK14x4+xZd3U6/p4/XrQ7mbusjNrf6n+rIJoUmTxPyZ1IOsaFFkvV12gfPOgz/8AUaPhqeeijoiyTbFxd/cqOt6gy8uTlxcTZrATjuFrxYtvnlc+rxVq8pv/M2agVni4kkzalFkms8/D62KzZvhpZfCWEXTptC4cVb/Q5eY0k/qmxlWPNIAAAktSURBVDZ987Vx47efV+dr40bYsOG7N/gtWxIXa8OG372h1+ZxixahRSBVUosiW3ToAL/8Jdx6KwwY8M3xBg1CwmjaNHw6Kvu4vGM1/bn+M9bN9u0hwdf1Bl7Va5L54bBBg5rf0Cv6WePGyYtTaiSj/mdn9WB2vFGj4M03YcmSb24e27aFT4AbNiTvug0bJj75NG0aBgPdw420pCR8j/+qzrFk/l5Nzl1cXPENfOvW5P3dxGvUqPw/95p+NW/+3Zt706ZquWYgdT1li5KS8Gk1/hNn6ePqHqvs5xs31n3AMNuZ1e6GXZObfZMmavlJhdT1lO1yc8OnvhYtknN+99BqqUlyqW7C2rw5dGnk5kJOzre/qnOsvn+vsnOVtrrK+8rL06dxSUlKFJIYZqFPuXHjMFNERDJGRhUFFBGRxFOiEBGRSilRiIhIpTIqUWTlxkUiIkmWUYkiKzcuEhFJsoxKFCIiknhKFCIiUiklChERqVRGlvAws9XAslr+ejvgfwkMJ0qZ8l4y5X2A3kuqypT3Utf3sbu7ty97MCMTRV2Y2Zzyap2ko0x5L5nyPkDvJVVlyntJ1vtQ15OIiFRKiUJERCqlRPFdE6MOIIEy5b1kyvsAvZdUlSnvJSnvQ2MUIiJSKbUoRESkUkoUIiJSKSWKOGY2yMwWmNnHZjYq6nhqw8x2M7OXzex9M3vPzC6MOqa6MrMcM3vHzGZEHUtdmFkrM3vczD40sw/M7MCoY6oNM7so9m/rXTMrNLO8qGOqLjO738xWmdm7ccfamNkLZrYw9j0tdt6q4L2Mi/37mmdmT5pZq0RcS4kixsxygAnAMUAvYKiZ9Yo2qlopAS5x917AD4Bfpen7iHch8EHUQSTAH4F/uHtPYB/S8D2ZWSfg10B/d+8N5ACnRhtVjUwGBpU5Ngp4yd2/B7wUe54OJvPd9/IC0Nvd+wAfAZcn4kJKFN/YH/jY3Re7+zZgKjAk4phqzN1XuvvbscfrCTejTtFGVXtmlg8cC0yKOpa6MLOWwGHAnwHcfZu7fxVtVLWWCzQxs1ygKbAi4niqzd3/CXxR5vAQ4MHY4weBE+o1qFoq7724+/PuXhJ7+gaQn4hrKVF8oxOwPO55EWl8gwUwswKgH/BmtJHUye3AZcCOqAOpoy7AauCBWDfaJDNrFnVQNeXunwLjgU+AlcBad38+2qjqrIO7r4w9/gzoEGUwCfQL4NlEnEiJIkOZWXPgr8Bv3H1d1PHUhpkdB6xy97lRx5IAucD3gbvdvR+wkfTp4vharP9+CCHx7Qo0M7PTo40qcTysF0j7NQNmdgWhG3pKIs6nRPGNT4Hd4p7nx46lHTNrSEgSU9z9iajjqYODgePNbCmhK/AoM3sk2pBqrQgocvfS1t3jhMSRbn4ILHH31e5eDDwBHBRxTHX1uZl1BIh9XxVxPHViZmcCxwGneYIWyilRfOMt4Htm1sXMGhEG6J6OOKYaMzMj9IN/4O63RR1PXbj75e6e7+4FhL+Pme6elp9e3f0zYLmZ9YgdGgC8H2FItfUJ8AMzaxr7tzaANByUL+Np4IzY4zOApyKMpU7MbBChq/Z4d9+UqPMqUcTEBoDOB54j/MN/zN3fizaqWjkY+Dnh0/d/Yl//F3VQAsAFwBQzmwf0BW6KOJ4ai7WIHgfeBuYT7iFpU/7CzAqB14EeZlZkZsOBscBAM1tIaDGNjTLG6qrgvdwJtABeiP3fvych11IJDxERqYxaFCIiUiklChERqZQShYiIVEqJQkREKqVEISIilVKikLRgZm5mt8Y9v9TMRifo3JPN7JREnKuK6/w4VjX25TLHdzWzx2OP+yZyOnOsYu0vy7uWSHUpUUi62AqcZGbtog4kXqwwXnUNB85x9yPjD7r7CncvTVR9gRoliipiaAV8nSjKXEukWpQoJF2UEBZ2XVT2B2VbBGa2Ifb9CDN71cyeMrPFZjbWzE4zs9lmNt/MusWd5odmNsfMPorVmCrdB2Ocmb0Vq+9/btx5Z5nZ05SzutrMhsbO/66Z3Rw7djVwCPBnMxtX5vUFsdc2Aq4DfhpbLPVTM2sW23dgdqyY4JDY75xpZk+b2UzgJTNrbmYvmdnbsWuXVj4eC3SLnW9c6bVi58gzswdir3/HzI6MO/cTZvYPC3s03BL35zE5Fut8M/vO34Vkppp8GhKJ2gRgXumNq5r2AfYklGNeDExy9/0tbOh0AfCb2OsKCKXmuwEvm1l3YBihOup+ZtYY+LeZlVZK/T6h7v+S+IuZ2a7AzcC+wJfA82Z2grtfZ2ZHAZe6+5zyAnX3bbGE0t/dz4+d7yZC6ZJfWNiEZraZvRgXQx93/yLWqjjR3dfFWl1vxBLZqFicfWPnK4i75K/CZX1vM+sZi3WP2M/6EioPbwUWmNmfgJ2BTrF9KLAEbYojqU8tCkkbsSq4DxE2zqmut2J7dGwFFgGlN/r5hORQ6jF33+HuCwkJpSdwNDDMzP5DKNXeFvhe7PWzyyaJmP2AV2JF80qrdx5Wg3jLOhoYFYvhFSAP6Bz72QvuXrofgQE3xcqDvEgokV9VuexDgEcA3P1DYBlQmihecve17r6F0GranfDn0tXM/hSrKZSWVYml5tSikHRzO6HO0ANxx0qIfegxswZAo7ifbY17vCPu+Q6+/e+/bC0bJ9x8L3D35+J/YGZHEMqE1wcDTnb3BWViOKBMDKcB7YF93b3YQsXdumxRGv/nth3IdfcvzWwf4EfASOAnhD0PJMOpRSFpJfYJ+jHCwHCppYSuHoDjgYa1OPWPzaxBbNyiK7CAUCDyPAtl2zGzPazqzYZmA4ebWTsL2+sOBV6tQRzrCUXdSj0HXGBmFouhXwW/15Kwd0dxbKxh9wrOF28WIcEQ63LqTHjf5Yp1aTVw978CV5KeZdKlFpQoJB3dCsTPfrqPcHP+L3Agtfu0/wnhJv8sMDLW5TKJ0O3ydmwA+F6qaIXHdkobBbwM/BeY6+41KVv9MtCrdDAbuJ6Q+OaZ2Xux5+WZAvQ3s/mEsZUPY/GsIYytvFt2EB24C2gQ+51HgTNjXXQV6QS8EusGe4QE7ccsqU/VY0VEpFJqUYiISKWUKEREpFJKFCIiUiklChERqZQShYiIVEqJQkREKqVEISIilfp/1HM/3nrKCfYAAAAASUVORK5CYII=\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment