diff --git a/.gitignore b/.gitignore index cddc84d..a7dd2c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ .ipynb_checkpoints .*.swp *.pyc +__pycache__ +.vscode/ +test.py +venv/ \ No newline at end of file diff --git a/muzero/model_torch.py b/muzero/model_torch.py new file mode 100644 index 0000000..713b458 --- /dev/null +++ b/muzero/model_torch.py @@ -0,0 +1,221 @@ +import torch +import torch.nn as nn +import torch.optim as optim +import torch.nn.functional as F +import numpy as np +from collections import namedtuple +from typing import Tuple, List, Union + + +def set_seed(seed: int = 42) -> None: + torch.manual_seed(seed) + np.random.seed(seed) + + +def bstack(bb: List[Union[float, np.ndarray]]) -> List[np.ndarray]: + # reduced loop version of bstak + l, ll = len(bb), len(bb[0]) + return [np.array([i[j] for i in bb]).reshape(l, -1) for j in range(ll)] + + +def to_one_hot(a: np.ndarray, K: int, a_dim: int) -> np.ndarray: + # vectorized version of to_one_hot + one_hot_action = np.zeros((K * a_dim)) + index = np.arange(0, K * a_dim, a_dim) + index = index[a >= 0] + one_hot_action[a[a >= 0] + index] = 1 + return np.split(one_hot_action, K) + + +def reformat_batch(batch: np.ndarray, K: int, a_dim: int, remove_policy=False) -> Tuple[List[np.ndarray]]: + X, Y = [], [] + for o, a, outs in batch: + a = np.array(a) + x = [o] + to_one_hot(a, K, a_dim) + + # flatten outs + y = [item for sublist in outs for item in sublist] + + X.append(x) + Y.append(y) + + X, Y = bstack(X), bstack(Y) + + if remove_policy: + nY = [Y[0]] + for i in range(3, len(Y), 3): + nY.append(Y[i]) + nY.append(Y[i + 1]) + Y = nY + else: + Y.pop(1) + + return X, Y + + +class DenseRepresentation(nn.Module): + # h network + def __init__(self, o_dim: int, s_dim: int, hidden_layer_dim: int, hidden_layer_count: int) -> None: + super().__init__() + + sequential = [nn.Linear(o_dim, hidden_layer_dim), nn.ELU()] + sequential += [nn.Linear(hidden_layer_dim, + hidden_layer_dim), nn.ELU()] * hidden_layer_count + self.out = nn.Linear(hidden_layer_dim, s_dim) + + self.linearReluStack = nn.Sequential(*tuple(sequential)) + + def forward(self, state: torch.Tensor) -> torch.Tensor: + x = self.linearReluStack(state) + return self.out(x) + + +class DenseDynamics(nn.Module): + # g network + def __init__(self, s_dim: int, a_dim: int, hidden_layer_dim: int, hidden_layer_count: int) -> None: + super().__init__() + + sequential = [nn.Linear(s_dim + a_dim, hidden_layer_dim), nn.ELU()] + sequential += [nn.Linear(hidden_layer_dim, + hidden_layer_dim), nn.ELU()] * hidden_layer_count + + self.linearReluStack = nn.Sequential(*tuple(sequential)) + self.out1 = nn.Linear(hidden_layer_dim, 1) + self.out2 = nn.Linear(hidden_layer_dim, s_dim) + + def forward(self, state: torch.Tensor, action: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: + x = torch.cat([state.T, action.T]).T + x = self.linearReluStack(x) + + return self.out1(x), self.out2(x) + + +class DensePrediction(nn.Module): + # f network + def __init__(self, s_dim: int, a_dim: int, hidden_layer_dim: int, hidden_layer_count: int, with_policy: bool = True) -> None: + super().__init__() + self.with_policy = with_policy + + sequential = [nn.Linear(s_dim, hidden_layer_dim), nn.ELU()] + sequential += [nn.Linear(hidden_layer_dim, + hidden_layer_dim), nn.ELU()] * hidden_layer_count + + self.linearReluStack = nn.Sequential(*tuple(sequential)) + self.out1 = nn.Linear(hidden_layer_dim, a_dim) + self.out2 = nn.Linear(hidden_layer_dim, 1) + + def forward(self, state: torch.Tensor) -> Union[Tuple[torch.Tensor, torch.Tensor], torch.Tensor]: + x = self.linearReluStack(state) + + if self.with_policy: + return self.out1(x), self.out2(x) + return self.out2(x) + + +class MuModel: + LAYER_COUNT = 4 + LAYER_DIM = 128 + BN = False + + def __init__(self, observation_dim: int, action_dim: int, s_dim: int = 8, K: int = 5, lr: float = 1e-3, with_policy: bool = True, device='cpu') -> None: + self.observation_dim, self.action_dim, self.s_dim = observation_dim, action_dim, s_dim + self.K, self.lr, self.with_policy = K, lr, with_policy + self.device = device + + self.h = DenseRepresentation( + o_dim=observation_dim[0], s_dim=s_dim, hidden_layer_dim=self.LAYER_DIM, hidden_layer_count=self.LAYER_COUNT).to(device) + self.g = DenseDynamics(s_dim=s_dim, a_dim=action_dim, hidden_layer_dim=self.LAYER_DIM, + hidden_layer_count=self.LAYER_COUNT).to(device) + self.f = DensePrediction(s_dim=s_dim, a_dim=action_dim, hidden_layer_dim=self.LAYER_DIM, + hidden_layer_count=self.LAYER_COUNT, with_policy=with_policy).to(device) + + params = list(self.h.parameters()) + \ + list(self.g.parameters()) + list(self.f.parameters()) + self.optimizer = optim.Adam(params, lr=self.lr) + self.losses = [] + + # make class compatible with Geohot's other code + self.o_dim = self.observation_dim + self.a_dim = self.action_dim + Mu = namedtuple('mu', 'predict') + self.mu = Mu(self.predict) + + def forward(self, X: List[torch.Tensor], train: bool = True) -> List[torch.Tensor]: + self.h.eval(), self.g.eval(), self.f.eval() + if train: + self.h.train(), self.g.train(), self.f.train() + + X = [torch.from_numpy(x.astype(np.float32)).to(self.device) for x in X] + Y_pred = [] + + state = self.h(X[0]) + if self.with_policy: + policy, value = self.f(state) + Y_pred += [value, policy] + else: + value = self.f(state) + Y_pred.append(value) + + for k in range(self.K): + reward, new_state = self.g(state, X[k + 1]) + if self.with_policy: + policy, value = self.f(state) + Y_pred += [value, reward, policy] + else: + value = self.f(state) + Y_pred += [value, reward] + + state = new_state + + return Y_pred + + def predict(self, X: List[torch.Tensor]) -> List[torch.Tensor]: + with torch.no_grad(): + Y_pred = self.forward(X, train=False) + return Y_pred + + def train(self, batch: List[np.ndarray]) -> None: + self.h.train(), self.g.train(), self.f.train() + losses = [] + mse, smcel = F.mse_loss, nn.BCEWithLogitsLoss() + + X, Y = reformat_batch( + batch, self.K, self.action_dim, not self.with_policy) + Y = [torch.from_numpy(y.astype(np.float32)).to(self.device) for y in Y] + Y_pred = self.forward(X, train=True) + + losses.append(mse(Y_pred[0], Y[0])) + if self.with_policy: + losses.append(smcel(Y_pred[1], Y[1])) + + for k in range(self.K): + losses.append(mse(Y_pred[3 * k + 2], Y[3 * k + 2])) + losses.append(mse(Y_pred[3 * k + 3], Y[3 * k + 3])) + if self.with_policy: + losses.append(smcel(Y_pred[3 * k + 4], Y[3 * k + 4])) + + loss = sum(losses) + self.optimizer.zero_grad() + loss.backward() + self.optimizer.step() + + self.losses.append([loss.item()] + [l.item() for l in losses]) + + def ht(self, state: Union[np.ndarray, torch.Tensor]) -> torch.Tensor: + with torch.no_grad(): + if not torch.is_tensor(state): + state = torch.from_numpy( + state.astype(np.float32)).to(self.device) + return self.h(state) + + def ft(self, state: Union[np.ndarray, torch.Tensor]) -> torch.Tensor: + with torch.no_grad(): + if not torch.is_tensor(state): + state = torch.from_numpy( + state.astype(np.float32)).to(self.device) + if self.with_policy: + policy, value = self.f(state) + return policy.exp(), value + else: + value = self.f(state) + return value diff --git a/muzero_torch_cartpole_v3.ipynb b/muzero_torch_cartpole_v3.ipynb new file mode 100644 index 0000000..f0e9821 --- /dev/null +++ b/muzero_torch_cartpole_v3.ipynb @@ -0,0 +1,442 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "869c49bb-9b92-404e-9a93-2b5f6211a5f7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "%pylab inline\n", + "import gym\n", + "import collections\n", + "import random\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from muzero import model_torch\n", + "from muzero import game as Game\n", + "from muzero.mcts import naive_search" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aee9b919-164a-4597-9d8f-93909ec87830", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.9.0+cu102\n" + ] + } + ], + "source": [ + "print(model_torch.torch.__version__)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b0e95d29-c29c-4a69-ac7f-f62c3e585d5a", + "metadata": {}, + "outputs": [], + "source": [ + "env = gym.make('CartPole-v0')" + ] + }, + { + "cell_type": "markdown", + "id": "53f1dd1a-bdee-45e0-b47a-290ae1edb033", + "metadata": {}, + "source": [ + "Set Seed for Reproducibility" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a3326cf7-6501-44f8-8b9b-5c801da203e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[42]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "seed = 42\n", + "random.seed(seed)\n", + "np.random.seed(seed)\n", + "model_torch.set_seed(seed)\n", + "Game.random.seed(seed)\n", + "Game.np.random.seed(seed)\n", + "env.seed(seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "be635d82-c58a-4e02-9cd3-95c110b54b84", + "metadata": {}, + "outputs": [], + "source": [ + "def play_game(env, m):\n", + " game = Game.Game(env, discount=0.997)\n", + " while not game.terminal():\n", + " cc = random.random()\n", + " if (cc < 0.05):\n", + " policy = [1 / m.action_dim] * m.action_dim\n", + " else:\n", + " policy = naive_search(m, game.observation, T=1)\n", + " game.act_with_policy(policy)\n", + " return game" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "dcb7eb2b-c6e1-4972-a8da-308f22ab6ef3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(4,) 2\n" + ] + } + ], + "source": [ + "device = 'cpu'\n", + "m = model_torch.MuModel(env.observation_space.shape, env.action_space.n, s_dim=128, K=3, lr=1e-3, device=device)\n", + "replay_buffer = Game.ReplayBuffer(50, 128, m.K)\n", + "print(env.observation_space.shape, env.action_space.n)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3b6106d5-095b-41e7-a5c5-40d1fecda75e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "return: 29, action_count: 0 ( 16) 1 ( 13), loss: 252.86\n", + "return: 14, action_count: 0 ( 11) 1 ( 3), loss: 124.44\n", + "return: 16, action_count: 0 ( 6) 1 ( 10), loss: 143.55\n", + "return: 25, action_count: 0 ( 12) 1 ( 13), loss: 173.56\n", + "return: 11, action_count: 0 ( 2) 1 ( 9), loss: 210.48\n", + "return: 45, action_count: 0 ( 22) 1 ( 23), loss: 277.84\n", + "return: 18, action_count: 0 ( 10) 1 ( 8), loss: 203.85\n", + "return: 30, action_count: 0 ( 15) 1 ( 15), loss: 238.98\n", + "return: 16, action_count: 0 ( 6) 1 ( 10), loss: 94.64\n", + "return: 126, action_count: 0 ( 63) 1 ( 63), loss: 1131.46\n", + "return: 40, action_count: 0 ( 21) 1 ( 19), loss: 926.59\n", + "return: 41, action_count: 0 ( 20) 1 ( 21), loss: 1273.09\n", + "return: 200, action_count: 0 ( 97) 1 (103), loss: 2598.50\n", + "return: 194, action_count: 0 ( 96) 1 ( 98), loss: 4195.48\n", + "return: 41, action_count: 0 ( 24) 1 ( 17), loss: 4343.98\n", + "return: 81, action_count: 0 ( 39) 1 ( 42), loss: 3017.06\n", + "return: 54, action_count: 0 ( 27) 1 ( 27), loss: 4378.75\n", + "return: 53, action_count: 0 ( 33) 1 ( 20), loss: 2689.64\n", + "return: 41, action_count: 0 ( 23) 1 ( 18), loss: 3317.25\n", + "return: 48, action_count: 0 ( 27) 1 ( 21), loss: 2766.92\n", + "return: 81, action_count: 0 ( 42) 1 ( 39), loss: 2947.62\n", + "return: 200, action_count: 0 ( 99) 1 (101), loss: 3802.24\n", + "return: 59, action_count: 0 ( 32) 1 ( 27), loss: 3446.98\n", + "return: 100, action_count: 0 ( 46) 1 ( 54), loss: 3019.74\n", + "return: 200, action_count: 0 (102) 1 ( 98), loss: 3470.03\n", + "return: 200, action_count: 0 (101) 1 ( 99), loss: 3593.76\n", + "return: 200, action_count: 0 (102) 1 ( 98), loss: 3797.45\n", + "return: 200, action_count: 0 (100) 1 (100), loss: 3885.07\n", + "return: 200, action_count: 0 (101) 1 ( 99), loss: 4570.01\n", + "return: 200, action_count: 0 (103) 1 ( 97), loss: 4062.75\n" + ] + } + ], + "source": [ + "rews = []\n", + "\n", + "fmt = 'return: %3u, action_count: 0 (%3u) 1 (%3u), loss: %8.2f'\n", + "for j in range(30):\n", + " game = play_game(env, m)\n", + " replay_buffer.save_game(game)\n", + " for i in range(20):\n", + " m.train(replay_buffer.sample_batch())\n", + " rew = sum(game.rewards)\n", + " rews.append(rew)\n", + " history = np.array(game.history)\n", + " actions = [(history == 0).sum(), (history == 1).sum()]\n", + " print(fmt % (rew, *actions, m.losses[-1][0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "29cab57a-ebf3-4fa8-8ed6-852df7455568", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD4CAYAAAD4k815AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABs8UlEQVR4nO2dd5gUVdaH39txcmLIOQuoICCIETOImF1B15yzrrpr2jW7fq45rK7ZXXMOYI5gQkByEiSHSUxOHev7o0JXdVf3dA8DE7jv8/DQVXWr+lZP9++eOvfcc4SiKEgkEomk4+Bo7Q5IJBKJpGWRwi6RSCQdDCnsEolE0sGQwi6RSCQdDCnsEolE0sFwtXYHAAoLC5V+/fq1djckEomkXTF//vwyRVE6R+9vVWEXQkwFpg4aNIh58+a1ZlckEomk3SGE2GC3v1VdMYqifKwoykW5ubmt2Q2JRCLpUEgfu0QikXQwpLBLJBJJB0MKu0QikXQwWlXYhRBThRDPVFVVtWY3JBKJpEMhJ08lEomkgyFdMRKJRNLBkMIukUgkLcxPf5TxR2ltq72/FHaJRCJpghmLt1JZ70+6/enPzuHwB78H4MOFW/hpTdnO6potcvJUIpFIElBa4+OK1xZw0X/np3yuoihc/cZCTn9uDiuLqndC7+yRk6cSiURiYv6Gcj5atNXY1qvMJSvM5qp0G7bXG68nPTK7hXrYNG0iCZhEIpG0FU5+6mcAjhvZA4BAWBXqOn8oqfN9wbDx2m4wePLbNfiCYf5y5JAd7WpcpI9dIpG0G1YWVdMYSE5g7VAUhTUltfxRWsu6sjr63TiTxZsrE54T0IQ6FE6uPnSdL2i8ro8aDNaU1PCvz1fx2NerU+t4ikhhl0haiAUbK7jitd+SFgBJatQ0Bpj0yGyue2tRs6/x0aKtHPHQ9xz+4Pfc9tEyAF6bsxGA4upGHv0qVnCD4XDMvkSYxdwftJ57xEOzjNelNb6UrpsKUtglkhbiitcWMGPxNjZX1DfdWJIyuovj57XbUzrvL28uNCzkVUU1xv5VmpukrFaNdrn4f/N5+KvfjeM/rinjzOfnsHhz4uCOfjfO5NYPlqAoCtWNAWpNFrs/ZBX2wiyP8XrFtp03mSp97JLdlvNemktOmotHpu3TrPOXbqliQOdMMjzqz6gg08OWygbKav307ZTZkl2VAGHtSSispPZE9N6CLQD0Lkgnze009uuCvr1OtZyXbLEK+H9/Xs/s1WXkpLmb7NMrv2wk0+viP9+v5aVz9zWOR1vsuelu43037UQDQIY7SjoUXy4vZlN55Afz7Ky1/LDaPob4m5UlfLBwq+2xpmgMhDj28R8Y/o/PGX3Xl4Aq7AAl1Y3NuqYkMbrFHrZxdVXU+flsaVHC8699cxHldZFYdN1lVlTVSFVDIMaF9vmyYgA2VzaY+mD1mVc1BIzX//l+LQBbLO2twl7dGLHmN5U3sLOQ4Y6SDsWF/53HsY//YGzf88kK/vz8nB265lfLi2Mm7AKmR+zyOj+hsEInTdi3VUlht6MxEOL1XzfaCnMy6J+5ncH+13cXc8kr89m4PbEVbOfX3lbVyOcJBoVFmyqN15f8bz6fLtkGQIM/xD7aoG7m0yWRa0Vb7Ob377AWu0TSkujxw1UNqp8zEEpt0suOZVuruOC/87jj4+WW/cGQVV0CoTCZXtUlU1wjhd2Ox75ezU3vLeHTJizreAS0zzxko+z6qtDNFfUETX93Jaqt7naJ5tf15Un14dtVpVz66m/4g2E+XbrNts0PplWmZh97uskNBPC7yd/f0khhl3QYgiZLcM/bPufp7/7YoevV+4NsrVRFWo9HXl1cw4zFWwlERUoEQmEjeqLeZx+OV+cL8ubcjRbh2Z3Q3SBVDQEWbaqk340zWbCxAn8wzINfrLJMOtrhTxB22DUnDYDTn5vDoFs+Nd4rEDUAb6+1TwuwNsW8Lh8s2MJPfySexBXCarF3Mk2cDuicyeqSWotrqCWRwi7pMERb6CubaRHV+YKc/cKvDP/H51z4X7XIui8Q5oHPV3Hkw7O44rUFNha7YvhTG+LEWX+0aCt/e3cJj9iE1AFc99Yiznnx15T6+uqcDYy844sYy3RnMHt1KdWNgaYbAp8t3Ua/G2da5huEEIA6+fnjH2VauyI+WLiFx79ZwyNf/m57LR1/AleMPr+hU6I9Nf1ebP0OxBPStWV1AGSnWeNJHMK+L399dzHvzN8ct6+FWV4UxRrTnm2ahD1oUCGgTsDvDKSwSzoMgaD1F+92Wn+Vdb4gjYEQkx6ZxbVvLox7nSVbqvj+91LLPl8wxBPfrjG27VwxunUYbwGNS1OJZ2avtRXid3/bzHerSmP2J+KW95dS1RCIsUxbmgUbKzjz+V955MvkFta8r0Wi3DEj4sLSRVJRFCPSpLox4jKrabRa7OV1ftZrgguRgdsuKiZ6UHdqg4h5vgVge52fgkwPd52wp2V/Zb06YHXO9lr27zegU7xbTEjP/HTAek9Ok9rmZqgDUVntzolll8Iu6TBExww3BqzbI277nCmPzWZlUY0hPKAKzezVpTz4xSp+XFMWMyDYXTt60coLP67jYy2/SPT7Rl/DHwwbKV3Lan1sb4Efd0vMJ+j4g2Fufn8JRaZJ4M+WqX5xZ5KK0acgA4CZi7cZUUqa1hJWIpZxdWPAGPCCUS6Ws1/4lYkPfIc/GCYQCkdcMTbCHv2ZR/+9zJTX+cnPsA9hzPRYLfboPgHcf8refHLVQXGvD9AzT3UNmZ9wTtu3D8fs1Q2AAzWL/S9vLYobtbUjtGocuxBiKjB10KBBrdkNSQchWtzq/LE+2z9K62L2BUIKZz6vukAe/2YNr104PqZNdYP1WtE/eD3UDeJb7D6T+OgW4ti7vwJg/X1TbM9JFn8wTKa36XbJ8Ou6cl6bs5FtlQ28eO44QA0nBKs7IRG62wUiVqtD2xcKK4Y7paYxiEDfH+1KU+c1znphDpX1AW44eiigumKOe+IHPE4H9528N58t3UZ91N86Oswwmrx0T8y+wiwv6R7rBOeJ+/Tk13XWidXjRvYgze3kgVNHcv3b9qtgu+eqFrs5vNHrcvDvM8YQDiuYPh5y05P7TFNBhjtKOgzRwh79aB+PaJ+4nSiY45UhNozNzIpt1dw1Y3lMWJ/5uskmlEqWRBZqqujiVmp6ktBvRb/vTeX1fLhwS8y5OubPXhddXdgbgyGjv9UNAeO4ebBcsa2avXqquvDL2nJWFddYPrPFm6uYt6GCk/79Iw988XtMGGNjIGSJOf/veeMsx3sXpMf0ec7Nh5NhEva9euYybd/exvboPnkAxiKnU8b04snTR9ve/6AuWYA1VFLH4RCWga9fYYbtNXYE6YqRdBiihb2pKAudaAu7IQnRjTdBCqof9/kf1rGx3BqnbBaa+qi+fbeqxLL9lzcXcvD93zbZD51EA02q6NeqqAvwz09XcNTD3xuRPLogH/PobK5+Y6FlruC3jRU8/OXvKIpi+ez13Cl62wZ/yHiPmsaAIdh6tMuLP65j8qOz+W1jpXENRcGy8ExHt4hLa33kmdwrMxZvo84UneRxWaWuV35ETKft25sDBnXC6RAWV0ya22ER4H+fMYbFtx9luc6Uvbtz8JDOMf3qnZ+8WCf7FJQKMqWApMPgj5o8rU3WYo8S8qIkFhglI/7BsMLKomr26JYDJLbYz3lxrmX7vQXxrWE7vv+9lKOGd6WLFva3I+gDXXmd33AxDe6SDUREv0YT7vNfnsfp4/pwxPCunPTvnwA4c0JfajXfeTCsGBa5fv/1/pAxCAfDihE50hAIMX9DecyaAR07YdcpqfbRKz/dcHG9NmejxfUV/RTmNIW73Hfy3sZrc1SMMyokJt3ttE0vEG0YnDCqh2WQicfgLlk7bfJUCrukw5DIYk80uXjJK9bKOM/OXmvZ7p6bFrOaNJHFrnPrB0v4ZW05P954GD3z0i1C02Dj/9cxx7mHwkqMwNi/11Je+HEd31w3scm2TaHfm/ke9c8vWiC/WVnCNytLWGKyZBv8IWp9QbrmpLGlsoEKTWx1Aaw3WewVdX7+ra03qGoIxI0zB2vRimh8wTCdsryWOZR3f4uEI/brFLGgv7z2YACe/vNooudG9UVmADcfM8xyzO2y/zv4TJ/TjCsPZESPHDZXxKYLiD7706sPYmfFMklXjKRd8savG2NysiQS9kTWe3S8e7SITxwa+6idTE7wX9aqk266de8Lhgwfbq0vZAnlMzPHNFm3vc7HQ1+sSir/TLzrpYrdvQVMET12FJv6d/UbC5i7voIuOeps7k3vLaHfjTPZpIldVUNEzM2Ti+V1fsMPb0e0ayuaTpmxE6IAz501lr6dMnnurLG8cdF+DO6qPn1M2rM7x+zV3dJW//tcc8Rg9u6VZznmctjLpTkiR3ff5CZhsbucDtzJhhmliBR2SbujpKaRG99bwnkvW90XifzMlQ32C2vOPaBfzFJvM1leF7cfNyJmfyrFHnTfsS8YJjfdjRDw7aoSJj7wnW37M56L5Lb5flUpj32zhqvfWGjsu2vGcvrdODMmFj7L2zIP4HZPI3qcvC8Y4puVxTHHi6oiLgXdN+6LCkGcv6ECgE+WFMVMRoNqkX/3e0nMfh09udZj0+2zccbLg6+v+DxieNcm49L1iWM7V5tdGCxY5068LvX8bJu/RfRAsTORwi5p89T6goy/9yt+jlrCva0yYiU2+EMs2xo/v/Xpz/5iu/+IYV3Zf2D8H/shQzsbP1YzyfjYdfRBwBcMk+Z2kuF2srkJ61NHF0BzhMrzP6xT+xAlwHaTcDWNAV6bszGllan6vZmNZz101B8Mc+8nK2POWbc99mnh0okDk35PnVd+2WjZtjPge+fHRrRAfPdYZgoDXoY2yEdXPlL7Yi/sfWxSNJvbXn/UEFbdPYmh3bKT7seOIoVd0uZZXVxDcbWPez5RJ9X0cGdziN+4e7/ink9WxL2GXcbFgZ0z2X9gJ04f3yfueaE4Kzob4ixCskP3S/sCIbwuBxlel+F3bop/fqqKaHQUDcQujzdP/N01YzkzF2/jtg+XcfP7SwxrOZpVRTUxBR/0gcg8FugTnP5QmP6FsUL2eFSptxfP3ZepWs3QZLh1yjDb/f1tRDM/w97lcu+JezFlb6tr5V+n7M2QrskLqp5b307Y4/HYtFHcNnU4Vxw6iF5Rg85ePXO54rDBtsbBzkQKu6TNEzZlbYTIqk+z3zfZmHUzhw/rihCCw4d1jWtdnjWhr+3+ZCZPdfRHdV8wjNflINPjTOr83HS34V6wC92Mjt3WIzbKtXDLy1/7jTJN/OOFfh79yCwmPzrbku7WbuWsngzNHwxTbeNGKanxceFB/Y3tXnn2VrUd+RnumKX8OtE5YNxOYRnAJu+pruQ8aZ+e9C7I4IkoN81Jo3sl3Q8wuWICyX+f8jI8nHtAf64/eqjFUl9x5yTevXT/lN6/pZCFNiRtHn3Vp/6/nqdF9/vW2YiW2cc5oLN9NSOvKbY5z2b13/r7prC/tvQ7Gt2qHde/oMn+60LpC4bwupxkpdm7BjKiVj0eZ7J4qxuDrI5KaFUSJez6dX8xlY7bouX8bqrq0DVvLgDgpz/KeHv+ppjj+sDgD4Ypr/PbukgmaSIL0CMFYc/wuBjTN9/2WOdsL307ZbBnTzVk1O10GK6V7DQXj07bh5V3TeJfp44ErC6QZ84ck1REkZl9tEVI5s/+oT+N5NioJ4FkSPc4Y+LndxVy5amkzaPn24i22BNZs/1M7oLbpo6wncwyl0lLNexMF/a/asvcdT68/ICYthaL3e3gsD262l4zOk1BfpS1euXrCyzbF//PGqbpdgqWbqnisld/M/bp4X920Z7mRGd6ubbTn51DcXX82Gp/SBX2blHx8mdN6MugLhGXhy6+K+6cZGlnJ7QFmR565WcYYYgx/bzhUCaN6Kbdo4M0t5MnTx/Nl9cegselbttd96gR3WL2NUWv/AzW3zeFSXtGhPyk0b14Is4K07aKdMVI2jzRbpZoAbQTdt3CAzWrotck4roGxItySESOZhXrE4zm3CJ9CjIY2TuPVy+w5prZsL2eF35YR2NAdcXsF8fKj47qic6dUtxEyGMwpPCTlg730okDLfe3ZEtVzAKfs1+IpAjWC1U0xeLNVWyv8xv5z3VuPmZYzBMHEJN7ZXj3nJg2etRKno3vXF/IpU8M6wI+Ze/udMu1X4y1b798I6/M7ooUdkmbx5whr6ohwKRHZluO27lizMWkXQ5BuifyVXdpscPmmOlkJf7BP40CIj72DNMSdD1L4wFR7pt/fb6KO2csZ2VRNV63k5w4SZ+iJxvL6yL3fdDgQoIhhf98H794SCCsGO6pqw8fbBG+x75ezUEJUhRUNwZTKgBy8ODIPX71l4NJczuTism2m3gtzFL969HJsHrmpXP14WqCQN2vnszf6e1L9ufyQ3fvxIJS2CVtHrPFftD/fRNz3M5iN4uMy+kgzRSV4NasPrOwJ+uK0QWm0RD2yHXN/vYu2V6mj+ttOVdR1Bwi8bL5Zae5eOqMyCP/USMiLpvCLC81vqARJaPjMd3nrN9L+dfnq4z92d7kcpDofuDKhkgK3UQcNLiQQ4Z2Mba75Vr96UcOt3c1AbZL7fXY8mh/9I83HsaYvupnqlvs8UIOJVaksEvaPOYojGqb6Jc6m1J0ZjeE2yksLgGnIeyR9ift05OBpknWs+NEw+gDxlcr1IU0+nUdAosf9tdbjuC2qbELmwYUZsZdlegUAofWqSOGdeVQk3jmxJlw/depe9vudzhETDUgM2/Ni0yQ9tAs+4o6PyN75wFq6GA8BnXJsgwo5gVeK++aZBmcAJbdcbTx2hsl3jOvOpCTR/eMeY/ovuvbKc6F7rZIYZe0eRLFFH+4cAuXv6ZOFr583jjD6jNPprkcVotdd8WY23TJSeNrU56VO463Vtg5a0Jf8jLcMX55j9PBK+ePZ+4tR8QshIkWMYD+nTPJMrlvhppirJ0OYfjZo8+NlwEwUS7vRFkD//rOYuO1HsFSXucnFFY4aHBh3EIUoA46Zuva/DmmuZ3G56tj/lyirfIRPXJtrfAltx9t2Y4Iu1T2ZJDCLmnzJMo1bl5qP7JXLkO6qnmw3Q6zK0awb/9ION0E7dE/lcf6O4/fk4X/OComX4jLIThwcCGdsmLjsO2uX5jlNaxyUBNB6SF2QkRKsw3vYZ1kjGd9Z6e544b0xbPyo9EnQivqA4TCCm6nwzZMb8KATvz29yM5YFBhyhPPn159ELP/eqixUGdU7zzeuyz5GG/drSQt9uSQ2R0lbZ5AkrnGM70uY1WqyynI9Dip84dwOQR/OXIoR4/oxt698rjpvSWAfehdU0QLWqrXiBZMh0Nw9IhuLNhYiVMI9hvQiTcu2o99+1kjZ+ysf4BMr5M/7j2G81+ay9crrXlW7AaDh7/8PSZZmu73rqj3EwiFcTqErbA7HcJYMJRq8qphWjSM/nntN6ATo/vExq57XA7bnD96jH4y6wYkUtgl7QC7upN2uJ0OYxLU6RBkeF3U+UO4nQ6cDmEkYdIrGzXH+ot2M6Q6mWf2Teun6pOHh+3RxbJtOS/OkvQMt/oTDth8RnaumEejlv6DdcVqMKzgdgpb4TYPCM1deKNfI57F/+vNh9uufC3I9DDjygONykSSxEhhl7R5AqGwYX03hZ7syu1Ul+6XEjswnDauN2/O2xQTlpgMyUSNmPnnSXtR0xgwEmfpwj7/1iMM63VU7zzW3DM5ZtAwE09IM7yq4Ns91SSaPI2+drrbyRfLilhTUsvw7jm2K1XN2RObm25WXzUcLwWuXSy7zp495ULGZJE+dkmbJxAKx80lEo2uR06H4NSxarhhtK95dJ981t83xVIeLVnMgvbHvcc02X76uD4cNDiSz10X6E5ZXouIxRP1CTahgObl93q4pV0hkXjx8tGEwgoFmR4WbVZTe7gcwpIATK/rGbAIe/Oc3QHNV+Zq5vmS5JDCLmnzBEMKPfLSeencfZlx5YEJ24YNi11w2cSBLL3jaNuJzXj88LdD+ea6Q+IeNwtSsv51swim6sJ45YLxrL5nssWFc/8pkRBHPdrHzhUTb2Wmzhnj+zCwcyanjOlFfmZkEHA5hWGdHzio0Cj8bF4J21xXjG6xN3dgkCSHdMVI2jyBsEKm08FEU1x3PHRhdzrUSjapFp9oyorXJzFPHZN81kCzlZ/qZKvTIXAijPcVwuqn1yNs7FwxfQrs72VAYSaDu2bx10l7GOGS5lS4TofDcHtcfMgAIy/MYabPX486SnXpvr66NZ4rRtIySGGXNIvGQIg9/v4Z9520F9PGxc9nbub2j5YxpGt2wvzndgSC4aQtPN1ude+kuLjsNDezbjiU7nnJF41uifJnuoXsjlNOzc4V0zNOhsU9umfz7zPGWPaZBzS3U41+WX/fFGPf3FuOsJSecziE5XiyXHDQAOZtqOC4UcnnapekjkzbK2kW27U834/ZRFnE46Wf1nPz+0tSfq9gOJy8hacpe6KJyB2lT6eMlMS6JfzJurB74sSY20UOpcUp+Wf3FNM1J+KusvusO2db4++bS++CDGZedZCRH0ayc5BpeyXNIpVSaztKIKTgTtKnaw53bCt4WsJi167hcgrbgcLOYgeY/ddDY4qF2JWK0yea9feQtG+ko0vSLHRd3xVJmQKhcNKuFfPkaVuhJZ4ezK6YTI+LAZ0zedxULSiesPcuyOC2qSP48PIDOEjLyGhnsffMS+fyQ9UqUqmGdEraHlLYJW2eYEixtSKvOnxwzD5zuGNboSUGGbMrxukQfHPdREua30QZd50OwcjeeeyhFVM2pxq2vIdTT2jWdj47SfOQwi5pFno43K7QgEAobOvTtivaEDYtUGoruFsgAkQX23iDxH/PG8ef90s8Ka374eNdQx88myqjJ2n7tJ1vv6RdoZenMwv758uKOO6JH4wl+y1FPGG3q9jTFi32lph01Oc04q3MHN4jh7uiMlJGE1n1ad8f/W8ZksLe7pHhjpKk8QfD+ENhsrwuw/oTppo2V76+AH8wjC8YjimJFg9fMMQrv2zk7Al9DV/0vZ+sYEtlA1ccOoiK+kj+kmjM0SG6KBkpBTpYnHT/wkxuOHooJ9nkLtdpar4jaKz6tP9s9KeClh6Yd0eWli2lIK2AHlk9qAvU4XK48Dp3XSSQFHZJ0pz+7C/M21DB+vumGNafRUs0Pbj+nUWcMroXh+7R9IKi539Yx/2frcLjFJw5oR8Az8xaC8DMxdsA1XVgJ0YWYdf+1zXJ2YYmT1sCIUTS5d6m7NXddn9TFrtTF3ap6zvM9JnTAVhy9hL2e20/BucP5r3j3ttl7y+FXZI08zZUGK8jFnsE3Tc7c/E2Zi7eZlnAEs8KrNeqH1XUB2yPgxbuaCNGdqlsFW10ce6mE4Cr7p4UN+Zfz7seL4ZcdxmFpLK3GKGw+v1eXZH8eo+WoGM9r0p2CaGwYiwNNz/+J5p0C4Ttwzb0Cbt44Xo6Zh/7Q38ayeQ9u1mEXURZm7upruN1OePOL1x5+CAenTaKw4fZP0k5o9xZEpXGxir2enkv3v3+H0m1N39+2+q2Ga/DSvLFwncUKeySlKltDMZY7OV1/oSP8PGsQF2wA6HEYmJ2xZw0uhdP/XmMEZ5nRtnNhT0RXpeT40f1jOuLNyz23VzYb/vpNia/O9nYrq7aCMBja5NzpTSGGo3X66vXG69Pe2UCAO+tfo/3Vu9ct4wUdknKVDcGDH+truxnv/BrwvZvzY0UT773kxU88Y36aOoxhL0pi93GFeOO9bGfs7+6yjInQb3P1kIvFN1W0QW/iT9Fh8If8sfse2/1e2yu3Wxs6+692iSNhbpAnfG6qr7MeL0yXA+oA8dtP93WnO4mjfSxS1KmpjEYCXfU9i3fVh23/d/eWcynS4uMbX1yNCfdbbhigim4YnTsqhFdcdhgrjgsduFSa7P6nsltfuGPPi/RkV0xiqKwqHQRo7qMYtn2ZUybMY2nj3iaA3oeEPecQEAVZH+Sf796X43x2l+6PG67Kl8Vud6dk05FWuySlKkxWey6lZdosnLD9nrb/fd+siLiimliws7u8ub4cEHri2ZRXRHv/P6O7TG9PF9bRh8n2+wCpUAj397fjcofHmr2Jd5Z/Q5nfnom37x3Fiu3zQPgkz8+BmBL7RYenv+wpf3K8pXU++tirpOIusbtpi5bExwu+fpW4/XvFb+ndN1UkMIuSZlqG4s9WrTMIXW+oH1Ju5G98gwrtqmC1XaDQ06ai1PH9GJAYSb/PX+c7XmP/fYYX2/4OuG1W4rrPr+QO36+g5Karbvk/Vqag4eolZ7OGN+3iZatQ1XNVq7q2pmrVzyX0nkvL3uZz9Z/BsDa4kUArNz4Hblf3QVA+VZV4K/98jJeWPqCcd7rK1/n1I9P5YONXyZ+gweGwo+PGpv19eXG60DQZ2l63sb3jdfFmu9+ZyBdMZKUqWkMGDHkobDCYQ9+R0PAKt5moffHcbM0BsNGVZ6mfOy98mNziwsh+NepIxOe9+ySZwE1njia5+Y/Rro7gzP2viDhNeLy67Mog45Eye+DQzior1wPTigvXUaX7PaXb7x7bnqzcqzvKkJhNSR2XYrVmx6Y9wAALyx5gUENqvX9VH4uJ1fXAlDuV10nK6vWWuJ352/+UX0/0wTo2sq19M7ujdupzeEoCuM7uTh37gMc1XUor857hIP3PNNoHwhZhb0AJ1s1n31p8SIYenJK95Is0mKXJI1uhdf5goYrZm1ZHWtLYx9V1bqZCoFQGH8ca3x1cQ2bKxqAxK6YbK+Ls7TFS02xvWG77YSYHY8ufZb7FjzaZLtl25cRDAetO3218Mn1/N/bUxn5X3VwyRXqj3175bqk3n93JBCOv16hKUJBNdrE9vlvzjNwey6Y/NvRrChfwfpwg7H9aZZaXGRduIGqhgqUKE9ZadFvAJRURf6ex394PJd+fSkADcEGLvj8POodDp7Mz+PC76/lLd8W/ihZZLT3Rwl7A5HveUn1zrPYpbBLkkZ3m/z9w2V8vCixu8HpEDw3ex2Db/mU0hqfbZt6f4j/aBOpgWCYFduqWbI5tujKwC5ZSfunJ741kas+OIWLv7yYT9Z+ktQ5iVhbuZZpM6bx2G+PATBr8ywemv8QKCFeyM3mVa2QUigcIs+lPlWUVm3Y4fftiHy78VtG/280q8pXNet8fRLT1gSY97z6f0Xiz75OiQzQ9dpCrgah8OHSl2La/hZSB4mtIasbcM62OYAaPTOneJ6xv8SlOkCWV66J9DlkHcgqTIr7yvb5lDWUsTOQrhhJ8pi09euVJQmbupwO3pqnhjgms5AxEAoz+dHZABRkeiivi1jdqc45/li7DmrXsbRsaWon2lDeqPpLF5QsoCHYwOVfXw7AJYNO5eGCfKOdP9hIrjsLfNWU1Wy2vdbuzrfrvwBgSckihhakVisVwB9UBdbOYt+Sns1nudmcW789obVaF7CfyP+9+Le459iFOdb6a9kc5+/8eY0ayutSFPzhxE+Pi0oXcXifwxO2aQ7SYpckTSrJoRxC2FtWcfh2Vanx2izq+rWSIRSyukv26bJPnJbJE9TcOsFgA+d8dk5kf9Dax0CwAadQf07bGyuwY03FGk788MS4gtAcwkoYX8j+iag18Yf8LCxZaNknti0GQNkyn0DpKl59uA+BkhWAKpRNoVvsdo69f7nqeaQgn8VzHsN3dzfVVQYEov5OFYq90G6q/KPJ9zezbf7zbCxNXOYxKAQ+k1uwwDSPdH6l+mRa5ds5ZUGlsEuSIhgK29bVjEd1Q4A1JU3/WJMh2bS3gShrzOOwT3HbJKEAfPkPNs66j5+/+pt67Yr1LN8eiUkOhBospwQCdfg1P7wvbC+0P2/9iTWVa7h/7v22x+s3z6N2/eyUunrvnHsZ+8rYXRJ7vrF6Y4xrIR7//u1xzvz0TFZsX2HsE5p/XQk18vac+7mvIJfXfryLpVt+YsLrE/h6+ZsJr6lHmIRsvg6dXJkAnOn/nbG9O1NRrA4i9Q3bLe38UeaGU/vcNgfVeSJX1Oc4xGc/EJz0+3PMKltkewwgSwsKqDV9F9wiIrcn16i/jdt+us3yvWopWlzYhRDDhBBPCyHeEUJc2tLXl7QO8SJbmts+zZ38Vy9ZV0y0sDdGLQ55Y+UbzNo8iw1Fiygqj5+UKbRpDi8ufYEp617lBSoBCEZN+gWjwtgCgQYCmrA3xhG/rPL1AMzZ8qPt8cO/PJsJ318Wt192vLlKFcMdmZRMhj8q1jDl/Sm8uOCJpNpvXaeGmK5cFhFrYSyAChNwqoNuka+S5UvfAGD24uetF/HXQ13EBx0IxvexpzmsK43L/OqCuQPfOyphP9M1IS8R6ve1a1Rqi84h+1DdpugcVu+1NhhJL1Cv3f/lFZX07jTM2N9oatNSJPXrEkK8IIQoEUIsjdo/SQixSgixRghxI4CiKCsURbkE+BMQfzlXC/Dc7LWc/9JcFEXhudlrWVvaMhaiJBZfoGXXmaeyCjPZiVN/wBqdUxf1eH/PnHu4/OvLOfbzP3PkxydZjhXVFbG1aiPhoI8ltZt4yOQ/BwhGyYk/ahAJVKwjoMUlN8YRWZ/moqkP+6msL405XrsDOeT9fnvfcXOJHihmLngKgNI1nyd1fvegev4/1r2Lv2I9AEKzWBVFITtN/XxrQw24HOpUXzAqSdYXbxzPg8+NIRD0UR+oJxBQBdDcSndF1Uf5spP9JKM/82xhzT8UTLd+D5KliztLvb7JTXaGqwvjGho5tboWugw39vfL7des90hEsvf/EjDJvEMI4QSeBCYDw4HpQojh2rHjgJnAjoclJKCoqpGf125nc0UDd89cwWEPfr8z3263xpdgAVHn7NQLCKQyH5rsIBAIWN0jdUpyVmwwFODId47k6A+mMPG/oxE2FndNlLA3BK1C+tSXV/Flpho+1xDnfX2mkMlNG1WXy0Pf/Y2Hv78pqX4mInpQ2xG2bvuN0f8bzcezbjf2lWlPP4XevKSuEfJkGa83l6srLPXVwWEljEezsGuDjTi119HCfp1SxEt5OUx7bwrjXxtPQEuuFRaCf39zA7xzHo/+9ihjXxlLVSj6Care4p56pDh2ILUjPVrYbTz6bxzyKP86+F8Jr9NF+5zMrpiu3UfzvLM3ncJhSIukEsj3Nm/wSERSwq4oyiygPGr3OGCNoihrFUXxA28Ax2vtP1IUZTJwRrxrCiEuEkLME0LMKy1N7kOPJifdTb0/xIJNlca+xkDzHp0kiQnGSbsL0E3L852ZZNUkSM1iT1rYo8TWHNqWCJ/Jsq9wOozoCzPlUb+UxiiL/ePMtMgxJUhD0DrIgHWxSkNDJQAvbviEF9bPSKqfiWhRYS9aAMCbaz829inaYOfT0yM3VuMvWhb3GnWmScMGbVm9brH7Q37js6gN+/FpTwdBxfTbrdpCP0X9Pv3eUKyeZ/pMn9r0GftXz+H1Fa8CUKxYhX1L3TZ8JhdHuknkF6zbyA8TYoV5/8YAGcIaKHjZnrGL14b3OpBJ/Sfx0/SfLBOiZnpkqZWuKk2DvEDAwTeoGwMOwauv3t7wk+01doQd8bH3BDaZtjcDPYUQE4UQjwkh/kMCi11RlGcURRmrKMrYzp07N6sDuenqSP/zH5EJkrLathch0BFINDfXNUe12FOavmtCq80pCZJ1xQSixLReSW6Qb4iKYvEFYkU5mkYb8deZh49xr46jqraIUpPLxWfyy9f74ydNA5i7dQ4z1nzUZD90oucXdgSnVsKtTAlQv20hZcveNyxXffL0jtePZMzn06wnBn1QpHpr60yTy/W+SkuzxmCDsXCnVglQF9AiWHSLfd0slIeH07XROliVVW+ybNc4HTRo1ykK+0g3GR/XLHua38siA4+nIFJ9ygXkFgxksN/P/vUN9AyoBsB/LlhCuknYR4XdjBsbmSZ8YNB0LssbiXCp8wPZnmye3/Ny7OiVqVax2iIifRIAQyfD3zbA0GP4etNWZm3YDO4022vsCC0+eaooyneKolylKMrFiqI82dLXN6ML+wpTZsF4i2EkO0aixFB6ZR59Napdil0dPTXAgM5ZcdsAlpqpyU+eWieh6kzCnmhysbGx0rJdUZ84Rh+gMQmf9r0/38Vhbx9miLs5LLHeZxX2h98/zbJ93pcXcNOPtzT5Hjqbaja22CRcQ0BdmLNdhDltxjQOnfcPAtpn6dN82e851Pvf++W9eUlb3HP3C2O5++1jURqrqTc/nWj3GtKu0RhsMD6LRhQjza1fCUHxcopfOYG9+/dhTrpV8Iqr1sftc4kIUxi1dPS5BY8br32jz+TtLdv4eJO2sC67O+9uKeI/xaV8UJ/GnPWbwOkm0xmJpHJFPSmOGz6NS49/xbJv0LjLGEOsMA/OS1DGMD0PHE5yw2Hyw2Ho1PLZSHdE2LcAvU3bvbR9uwxd2FcX1xhiUlztk+6YnUAii70wy8v0cX147cLxrL9vCncdv2fctno2x4sOGsD+AzvFbZdhEvbRfZPzQQajLHaf6XdZn8CiveCHv1q2t0TFmXcOxrp0dPFLxCdbZwFQq1mk5sUq9X7r+S9URyJ4FJPlmWwY48U/3cL1X7ZMEFqDls2wUQjWezT/t1bizR+VWkFB4cH5DxIINvKmF97MyWZ71Qa2hhtV0QJuX/cOwXDQSPWgWuzqQBtSFMrq1IG0JhzAX/Y753S3r/BU1MSAWxi13vLb0siio0EZ3djDH6Cf/rf0ZhkPjWmX/kzGTap0ZboiOYmup8ByPZfpmJnGqCfDPw06kZys2Lqzce2TtJx4R5rNjgj7XGCwEKK/EMIDTAOSf3YEhBBThRDPVFU1L0g/RxP2On+IET3UyYir3ljAHn//rMn83pLUSGSxZ6e5+OdJezG2n/pD0P8uduhuFacDjh7RLW67dLcq7AcP6cwlBw+M6kuYf875Z0wdSX8Ci7XGF9/1saW+2LL9ZOVCy3bvcOxP0pdCKtew5oLxhfyGX7XUV8HTi562bb/OdF/b64r508d/YlFp/Jhpne9L5jXZJhkabBYL6ROb/jhPPmXbIyloz5x1LavxE9Z86qWBWt779DIatYGtMeSnKKD+5te5BO8G1Fz9VUqAH6pWs9lt//0pDiSOeit02E/ivxrqTNehx8U/0Z0GHjUOPsOlToBfUVHJiEnW9MDxhN1nmvR9bcK9/P2AO8m2SwIXPVe0x7HQZ0L8fu0AyYY7vg78DAwVQmwWQpyvKEoQuAL4HFgBvKUoSvzZFBsURflYUZSLcnObl2w+1yQgg7tkkeV1GQmntlW1fGzo7kwiuzG6WlF2WvxMFbrvXFHsi1HreF2qsA/snBmzQKmkvoTXVr7GJV9ebNkf7WM384dpoYyZnoEgaQkmhgH+2feEmH0NweSF3aeJnj8cIFdb5PVDzVqeXGjvqTx+xinG6zkbv2VF+Qru/eXuSIN1s+Gr22POy2ziPpLFbv4g4ooJsqBkQczxYlP+l83aQFll+rPdVfYzi31qTPpngVLerIr9e5QrQeN97NgqEt9fgSbK0WSPuwTsQkmzuqn/TGS4VLdKQ98DoNtelmNudxyL3fTrSPOq1ndWTq+YdunRA8+0V+G8z2yvuaMkGxUzXVGU7oqiuBVF6aUoyvPa/k8URRmiKMpARVHu2Sk9TEBBZsQflu5xct1RQ4zt9dtbLkpAEnEJ7NUzdhDOSbcKeXaCsnS6Px4gzR0/ikYve6coqoX+n98eZ7tWZsylRZT4TGXHFEWh3Ge/lB/gilnX2e6/1lHIsbXxvyuTg256HBn71Y6OikmEX/vsfOEAGQi84TDb/ck9pdYWLQSgQYsFB7jv4zPZa8u7BHxWCzbTZvRdVraM4z44zlKurSkabdr6NMH1K0EenxXr+y+2yWi5jyvPsl2kJcmqE/ZmQrVDcP2aV+P2S3cLeR32369Dot4P4LKKSvrrceInPw+T74drtFQA1y6Fa622aIZmldeHYo0Ep8n/buYgk3cqTZt4dqVZ+3Jd1jCO3P9G2/N3Bu06pUBBpofnzhrL/528F9ccMYRzD+jP9zdMBOCVXzZQUiOt9pZCzyZw8SEDuOjgAZZjqVjs5hWniSx2vexdWFFYsXE2Tyx5hls+ORtQ484B/KZH4Ms/v4AbVr6YxJ1Y2W/SY1zbyb5IB0DIm2lbvqkhicgZHT180q8E8QoHmQpsj5N2IJq7N6mBZebJyFdzswGoiEr7mm2aPLxp9k28v/p9HvvtMdZVrWNRSdOuHB09VNNpcr/Va6Gj/nCQTuWx6WYXFlndQNdvr+DpY/6X9HseUm//eWbbpLF4edw/LNvjGxq5pryCgzYsxB3lMpxY3wB67vS9ToHxF0NeH3Xb6Qan9bua4VZdMnU2br14RcBvqA0bqQgc+hOAqe1ne17DOSe/hdNjb/HvDFpV2HfUxw5wxPCunLZvH8N6752vPo59vqyYOz5q+RwMuyv678UhBL0LrI+80T71RMJuJj1B3LvbJOxhbXJNn9TUl/cHtN9OKBxidrG1mHZ0zg87zkrrS26PfcgZOZ2/lNtb+6c47Cd4GxO4faLR/fH+cBAPDtJRJyYT4YkStAYbZ9j2SmuK2kxtcc2mmk3MWDuDf/z0D5xaNadgnKpOr868kGfft4YtNuh5z019rNN97EqIqrTYiKY3qpazV2Nk8Bl6yD/IyO9n+57RdAkGObz/ZNtjPYj9juRmRCZX+/kDPFdUwvlVNTDpPuYMOt84dmB9A/0nPww9kk8Gl66tGG1IMqc/gHvyfdypPeQUZHU19l+VMYgHek6m55jz45y582hVYd9RH7sdDofg0WmjAKjzJ7dARdI0+uSpAPpGC3uUxR69rdMjN43T9lUDqfbqlUuX7Pjxu9WNWtREGGq0cMRqLZY6pFmvQU146qPCFQFyTP7madX2ESxel+bzHHEi9No35viSdRuZMPoi23MbtT7cX9J0Pm09/YBPCeERDjLi/OzMYu53CI6ribhaqh3EZEs0F4AAyNJisL9fHynlVla7DYBQlX3A2n1lv/BY9TL+74sr1B2+GhpsPs9aNIudMJU2TxtBITir9xHGdmHhHrbvZ0dOGNJ772d7LDPKby4UhezMiHi+MuScyMGRp+E+8Fpj86niUtL2OZNU2DdvKE5F4QxnQdONdfaYwtTLl7Lk7CWkmyZYLzz1fY4+wj7h286mXbti4nH8qJ5MGNCJ2kYp7C2FbgALIeiWaxXkaB+7ne/815sP54u/HMJhe3Rl/X1T6JWfQXfTde4/eW8ArjtyCAcP6cyhQ7to76tQq+VEr9Z8s8Go5eN1NnlXhvkj0RuTauvpYhOymGbO/phmE1J5exXscYxl1zWaZd+oLW/vE7BGidxaVs6TRdawvIgrJoQXB/uG7X210Z9aYZe9LdvnfHa2ZfvKZU9ZttMcbqr91by4NOKS+kNbkRmOrgAFBHy1xufy85YfAJj53ARe8W2KaVvudGr3EKZKCZJtM1F7wPDpxuvOnUcAcIHbGvaXbnNeDoJAnJC/Ps5Mzh92Fidm9AdUwcrMUBc0HtMQJPcQzW896MjYk0992faaiejUdU8Wrt/EmG4R99x7x77D/Qfs8inEHaJDCjtA99w0GRnTghgWu4BBnbO4/NBICGKWN9b1cs0R1kUXXXLSYtrlZUQs+1PH9uKV88dzxWGD+O9544yFTGFFoVZbGRoUgrAS5sFlVl+6nbDvqUTE0zn2XLwm14xD0RdSpZ7Wt4uW7U9/VE8/IRKyWBAKcdqxz3Fwg/q9091Bdf5a5hfPx6eE8TicTCzcGzsCUd6ZTC0ETycjagFOtHMm5HAwc9mrlPgrObNKDe/0a6cEbNIrHPrqeKPqT5VWvuLGrMQuopUiwFYHdFas0vFmv2lkdY4ktsrNUF1YV5/ygaXdnjZrTHKEi3Hd7Oc5akONXDPuBoZkqL7rkBC40nL4pu807j7hLbXR9WvUCJNoRpyQ8F5s6TkGLvwGDopMtg/uNJTJgxKES7ZB2r2PPR7dctMorm5MqTiEpGkcQuBwCG44eg9OGKXG6rqcsV+ja44YwuPTVd/mqN55ttcyT0YJIThwcKGxTw9xDCtQYypGsKh0EbNNC08A6uqtObcBsk0LRNydBuM1fdX14cURJ7oiEVna90mPyc7wRtyI9Q4nDFbTxM7YtJV3t6hukDs2fMg5n53DGgKkCzf5/Q+zvXb/qERr5abolIPrGwgqQX7Z9kvcvgUUhYat6mdz5djr6ByMiOj8+U+x4YMLLe2rTH+3SqGklNNdj/7QGbj/XxDaQJRvTnUbFSLY2RXrn8/xZNM1syu/Tf0w5liBU8tD5LVa9J0n3oJbD0fM6gyuSH8uG3AiT064K+l7iaHnmJhJ1fZGh/Ox6xRkegiGFWqkO6ZFMPvYdR780yhW3jXJ/gRg6sgeLPrHUbxxkb3/FGDynt04a0LfmP164q9wWKHWtLjorE/Pimmru2rMuHJ6Rl47PaSbem5EMDiST1qmk91JLemmJ65K8+YySps0FIoCDiec9SF9g0EKo3J5hwT0cHjJy45dlQgwKrMXNwYjPuV9RUQU89MKaBCCC7+wivOlFZFB7yellofLVOF3jzmXXFOmwjdysjm2Kv6gEBSCujiVn+w4f8AJxuuvpryF150OLi/vbNnGh5u3RRpGTRJ7vbEul+x01bp3Ry3qebDnZK6b+l8AsrTwwWQmxS896E4OHnJCk+06Mh3WFaNP4NX4dm4Bgt0F/cHHvM7D6RAJY9EBcjPcCds89ecx3GmTgkBfkxRWFGNJfjzqbQTJZbIUXU6vxWJ3GxE+kX37Z8QuKLEjc19VWH8MqYLq9mbzv23FXF1eycv9tXwvAyYCWNw/Or3SO5Ob1TNmv9ofJz32OBFQQ/gOH3yCcSzbk217zkC/ffSGy51Bloj/uS/bHonf7qSt0q6o2kBn7aHhwDjzAABHixx6FkTWjORnaYIsBEP9ASOVgM4/yiJPVB7Nqk8Ph/l7WTlOBKccoi2+ikqGddQR95OhiX1mmjqZmfoz1u5JhxV2PeROWuwtg2L42FOsLN1MDItdgZoEmRRrqzezaLNakeipohJjFanL4TZ86S6nl7MDEaHqpQmZ0yR8Q/e7iiWhiODeOSgqc6GGK8oF4fKoFugFVdUMm/h3yzG3jXHZs9Mw0k0hcZdVVBqvHcJh5GzPScuHvSOJwbJcVn+7TvaEK2z343CSJeLL4LQZkfvrrjmnKqs20lO42Vtxc/zAWJ+yPvEZSs/FbYr+cJsHnUNvgbOsmUVOvWwZt5Vt5/GiUmNx0VF19fypppaFZy9mUBf7OQczWZpV75Ke1aTosMKeJYW9RdEt9l0j6zBpz26cMqYXt04ZFjc/CcDF7x7LS3VqbpURB99Kfy0Fq8vhNiI3nC4vEx1ZLFy3kbe3bGO45ss2W+xkFlqWd594gH1mxVhh13zGUfvJ7ILDRnS7dhsFJnfEqaaQRqdwsGe6KvqnpPWyuDGyPPbCnpHeiSXrNjKxLnbwy47uUxy6O1X3T0XtFoKKQrZw47E5d3xDI5dWVHHN2Bsswi7Mj3GH/BUGHGI9MT2fU2rqmNjQYNShzWhi7mvuGXMt21laJIy02JOjwwq7vqy9VrpiWgjNL72LLPY0t5MHTh1Jl5w0I7OgHYsdkWOZe09D0VwwLofLEPYQAtzpOIE9/AHCXtXCdIrkv/4vHv0iN4+/GZfL6qJwejLh6H/CxbOsJ9ywGo6ODZHzZnW1TMwV3lTEdbmjAHWg6ZXThyXrNrJ/wQjLeR63vbCnpxfG7XOWM3al46by1QSjQh/ztcGpsraYIApu4cDtil1jEHa6uWz8jfTtfyju5uQQz+qGR4tESmvCV54W9f5p2lOBa5eZFu2bDhsVI10xLYthsbfC7ypRYigznvQCwujuFzcXVqnWcEFaAXQfqTY68RkGZ6tLynunUJJsbLexTN9jOi5nlKA5nDDhMuiS3IIct+ZSebqohJe2FoPLi0OL6PAILarmhKfhsFut50W/r0ZGuup7Dtj8YbLcsUmxjvn4JPb5n3UlZrYWqVLRUEYQBZdw4LHJZBj0Zqv3CnjiJMSKy982wFW/RdxjKDD2vKRPz9dCKS8acW5q77ub0mGjYnRhr5bC3iKYUwrsagKEyU4mDbPDaVSodDncnORTV49mp+XCkXfBn9+DkadxuqcHb2zZxris2GicpnCZLMkLK6uaHOk6B4OWRTluzaVyQEMjY3xqNM2pE+/hdFcXzj/iEfV6o6ZbwvcAPC57t0p6ej7cXkUwIzb1QXYcKz+aDE8mTkVhW30JlYRxCacl4dVQnzpBa67/6Y6TSTEu6XngyTSeFpx9DoBjH45plhZnAEv3ZLLk7CWcNu4vqb3vbkrHdcV4Y6srSZqPeYGSzpcbvqQihRC55hJUwvQIpVY8xeVwR2KoHS5weWDQ4QAIFEb4A5CCK0bHoSWUcisKV1U0/aT55eDzebHHFGPbrVvRUx6EE58BID2rKzed8TVZenIqEyfX1NI1GMRt8nmbV7tmaNEifmI/nyxPcgUcFAR5YYVXa1ZS5gAXDsLaU9KYhkb+pq22DZrcJ26bp4FkCIX1ORD7OPGvTv2Kr0/9ulnXlkTosMKuZxF8bc5GWVGpBYjEsavKXtZQxl+++wvXfHvNTn/vgBImFwdvbtnGw01Umzdb7Eb4XLSA73my+r9NkYMvN27hk032CbMAsr15ZIbD3FG6Hc7+OG47HefB1+MeGFmQ5NEnW/e9AEaeFuesCLdXNvDVpq14TE8Kj5s+gzTdFWPjs85Pi1+hykwPVxb55gVcDidhbV7DCbi7jwIgiFnYm5epMKgkFvZcby5dTEm+JM2jwwq7EIL9Bqhf+jqfdMfsMIYrRv1fL3O2tS6+CLYUQcK4XGkM9wc4YsSfE7ZVdB+7ywN6GF50CtaBh6l5YApja012u+A7ep8VtwY7HncGv2zYzNS6euh/cFL9N7tv4lXhics1i+HyuYaPXSgK7j9/YBx2aAOFn1hXVTdTAWc73hh4Js9k78Oxh/8feabQSJeIWOxOpweXFrtvFnaPlgXxmjhZMeOhT4S7mrHqV5I87XvdbBOcuE9Pfllbji+YhH9WkpDI5KnVpyxSiFLYVLOJTHemOpmZAgEljNuRBrcUq1b4y5/HbatLj8vhgdP+B7/8GwqHxG0fQ/cmYqr11aqe2KXx8TCHBjpSXaqe1QWyuuBepwq7myg3iBZqGFCUmFjUbl1H2V7yiLCXvw88lYIJfzEidLo5M0BRXUsu4WTfEadz8qLnuPiw+1EKh8BcGNZnonEN4fKyZN3GlEu7BbO7QMM6nDZuJ0nL0arCLoSYCkwdNCixZdFc9PJqUth3HMUId7RupyLsx7x3DGkI5p69OKX3DqDgEs6YlYn2/VRxOd3QaaDqy25J0vIgt49tKGM83HEmPlPBo1nsLkXBY+PftrPYO3e2Lyqe6c6k4OC/Wdum5UODLuwu3Ol53H5+JCfPG1PeYFC+6XfqcMJF30GBtR5tU5w8/gbenjGNw0YmHxEjSZ0OGxUDkQo9vqD0se8o0eGOYa3wQqorURsTVk+1R4+tTgbDx96MzI1J4fLAtUtgePLZ/lzNnGg0o4u5C/uJS7vVGk6Xvbsj0ybypGdeRLTdNjl0RhSOwBu9aKnHPhAn3W48hhYMZcFZC+iR1aPpxpJm02F97BCpm+kLSIt9R4lOKRAOajlKUigR11wMiz0JjDh2x04S9mbgslnskyq6O8etQLoniyx9AtfAfsD84uQvuHeYah3rhTwybfz8Jx56b6S/SX7WkrZLxxZ26YppMaLj2IM1RQAIm5S5LU0QeytycoIi1O4kl9PvCtypTpjaoC8IciFweXP5eWsFJx36T+P4UzVwik2lqO5Z3Zk67lqWnPId02vU4xk28e0edzqXZWv51JuR9VLStujgwi5dMS1FdNpePWxtVyxXimexT82K+HeF1r+d7oppBi3hitGjaVygTnjeshXGRCoqDQkEuXl7ggiVzE4EtbBFT5wnCKcWoy/zbLV/Oriwq2LQKF0xO0y0xR6yKbW2qnwVj/32WEoFG5JBtdhj5/m9WlELiAwwhrC3wIRlSxGdOKw5hDQr2h1vKA0HmoyECOohjHFCDR3a4BlS5O+lvdOhwx0NH7u02HeYsKIwXKwnd3019JpustgjQnPOzNOpDfu5cM/zSE8hHDCa+q0LCQVqebvmd9ZXrSeAvd/XY5OjXB9S9BWibQFnC1TjyddyzEwNxHGTjDgJ8et/El4jpOgx5Pb90ZOiSWFv/3RsYXd1jMnToqpGuuZ4d1kudDsU4BPvzfAVcOB0QiE1DsPcI1/IB0IQrCsFZ1pS5cV+X/URJ/9yCx8f/Cj9tJJxR392OpXOiIC5hb3F7rFJZasLu+hgC2DyOg1mzvpNpE95xL7BpH/CxBvh7UM4zCaFL0BIX00aR9j1NMZhKeztng6b3RE6xuTptqoG9r/va57/YR2zV0eWkpfV+li2ded8bnYoisIzuTmc1V1d7h3UVp6ahV0X1SM+OJb/vTk15nw7PlmqVpL/ckmkorxZ1EHNXGi2MvVJU48pEVXEFaOXvetYwk5aDhm3VSLGnmN/3OGEjAJ+Xb+JBz39bZtELHb7z0YvPBJuYVeaZNcj49jbGOGwwjvzNxPUshlur/UTVuDumSs48/lfjXaTH53NlMd+2GX9UhR4vCCPBWlpEPQTDPnitq13OLg/sNmyL157tyYygQTFNADcpiXv/1e6nUXrNtqmjj1Ge5vMHXAFtWfSr12BK6qCkc4VheM5pL6BI3scYHvc8LHbLHaStC86tivG8LG3/S/q3TOW43Y5GFCYyQ3vLGZ7rY+LDxkYd1AqrYkvrDsDc8GbsK+aUJTFHgwHCSZwFQWD9v3VLfGmhN1lcusI7Z+5+IT+ztfVh7mkZCsZcWqEdnhy7AtlA3Q/7Hae6DkOhh1ve9wpXTEdho4t7Lorph342J/7YR0AtxwzDIASTbij+64oSqv42s2P53W1RYTCVh/7bT/dlvD8oCkR19KypfhCPgbnDzYs9uiqPtG4ze6Di2fB1oW2VYWcSpicsNKslLwdHpcHRpwQ97DDobti2v7vRZKYDi3sTofA7RTtyhXjcOjhhKqQRj9tbK5osNxPSXUjXXJ2fGVjU5i9rjV1xQSDusWu9nfGH/aP/wDvzHuMO5Y9a2xPnzkdgOGdhjPVkQeAvwlht/iFu4+E7iNxFi8zdqXrA4/+fytONLdXHNrfUrpi2j8dWtgBMjyuXe622BHumrEciFjI0YPSQfd/a9ked+/XrL9vCjsb8+RndX0JwbDVFeNUFMJxxPTtJS/azuYs376cE7uqhY8DSmJhD9tY4Blp6txMfijE88XaCljD2mxbwn7enufRP9d+UrOtMC67LxTBVHfX1u6KZAfp8MJ+yJDOfLG8mHtDYdzO9vN4HhH21KynUFih3h80inkrikJYUZ9edgRzoERN/XbDFaPjVCAQ5y3sMg8CjHZkGpZ4ooLVABsCsRFAbneGmjoWQLfoOw+FupKY0nKtzbVjrm3tLjRJb2+B+nnuc0hrd0Wyg7QfpWsm4/oXUNUQoKLO39pdSYlVRTX0u3Em3/+euGIQYETQgGrx73X7F/i1AeGln9Yz8OZPdvj+zT72D4p/ptKn5h0JARd/eTGNUQOHy9TeHyd8rjEcJKyJflMFq/cM29gg5nhsPcvgaa/Ame9DRmo53yVE5iVkuGO7p8Nb7HpR6xpfkPZUcGvuejXvxydLtjXZtjEYJkt7Gnl1zgYAqhoCdM728ubcTQBsrWogP7P5+VMURa3zGRCCj8oX81G5mlN9nVNh3dafYtqbI9F9wl4oluOjT53av0SumL6BAMdlx1Y7Ii0Hjn8SSlbAmHPUfel5aoUkSeoMPx4WvQmH3NDaPZHsIO1b2MNhCNSBN35oW5ZXvcXaxvZZHi/L66IxkNjabvCHcDsFVQ0BAiFVRFcX1/D1imIjt0t4B+fDwopiCHsyOBVoLF3ByjlPEEAhns/7s+rVgFolqdpfbbuQKTcURhx8nf0b7ZO4VJ4kBdJy4dyZrd0LSQvQvisozbwWVn0K1yyBpw6AcRfB+IssTQxhb6d1Txv8TUf0rN9ex6WvzKe6IXKP57w0F38wTF6G6nu+55PlvHbBfkbUTaooiirWyeIC7vzoDD52BSJllxIQUEJMeuswakI+MsJh6h0RL6HDkwXNLJ4skeyOtO+Vp2l50FABxUth+2r49IYY/2CW7oppwxZ7omyIdSZh79vJPv3rqU//TFmtH7/J16772Cvr1UnOX9aWs3xb9Q70MYySwpjgBJaL5D/z2eEaarTVqc4o634H530lkt2O9j15mp4PIT9sMPl4GystTbK9qsW6cFMlVfWJVze2FkEtZv2igwcY+2ZedSCds62RHenuHSuA8Ld3FxuCnzLhIP4UQgjrBPyRiolvoiZKyR1tLHRRImnrtH9hB9jwc2RfTbGliW6xP/39H4y5+8td1bOU0MW2k2lyc0SPXHLSrJ6yET1ymTrSvlakx9X0n3LZ1mqmP/uLsfgpJYI+/CmYzv4mfPGeFPoghV0iSY2OIezFSyP7aqxRJJneiJUbDCv875cNu6JnKaELu8fl4Papw/n7sWqJspx0axa+QCjMfSftZXsNt0PgSkJ452+o4LeNCSrtxCEcqo17zNGM8LhUvnhS2CWS1OgYwl65AfK1VX3rZsEvTxtN9HwxOvPXl++q3iVNQPONu50OzjmgP+cfqN6LvshIxxcMkel18e31E22v8/J54zhhVA8jxDMedXEmkr9YVsTny4psj4WD8euLdgmp8wBpKYTepCLVTpkeQCJJiY4h7AA99lH//+Eh+OxvUG8v4LW+tpc3xmey2M0Uaq6ZNC1L5fGjegLQvzCTi03+eJ0DBhXyyLR9yM9IHK9+zotzWV1cQzAUZs7a7SiKgqIo3PHxch764nfbc4LhRtv9AF20gcmTguWeilQLabFLJCnRvoXdvLpQOGD4CZHt7WuMl+bl9LW+tjeBqlvsnqiUB93z1ORew7rnsP6+KRyzVyQl66lje1namjM+5qY3XWTiP7PW8t2qUk575hce+GIVG8vr2VLZwPrtdYRt/N/BUPzPratQB5KAcPBEUQl/rmo6+qapL54wDRLRUTISiSQx7XuBUlY3GH8plP0OB18PeX2gcAjMuh+2/AY9x4DDSbrbSa0vSJrbQV0btNj1MMVoi71brhq7He2SARLmvdFj1xOxqbyeOr/qknl3/ha6a+/lC4Ypqm6kR541blxJsOS/iysTqEMBDmlopMzZdPROblihNsGcQLqiUK8NVl1F+/6aSiS7mvZtsTscMPk+OPM96DIMPJlwyN/UY5/9DWb9C4B0jyo0PfLSqfMFWbipkk3l9nUhW4Mnv/0DiLXY9agYr03EiyOB3zmRxX76+D4AzFlXztVvLATUxVuvmCaV15XF+tPDCYS9wJvLWVXVvFBaqfY7ga+9j7Yy9nKfk5xQ/GumawZ7fijE9Y5ucdtJJJJY2rWwLy1bymfrPgOILEd3umCkmu+b1Wp4oy6QnbO81PqCnPDkj0x84LvW6LItHy/aCoA7SsD7dlILSRw0uDDmnETu7GhhP3hIZ+P1vSfuxTn797Mcr/UFWVlUw3kHqJO29sIeX6yz0zpxQ3klezWqfvjsBMLu0twq6SNO5vK6+AuY0rR2x9bWkR6n+LJEIrGnXQv7h2s+5O45d1MfqOeA1w/gr7P+qh449mF1YlVbhv6fM8dy1oS+DO+RY1QmalYs904m2rc9qnce31x3CGfu1zemba/8dM7Zvx83Tt4j5pjuiumRq/roF22qtBy3KzwiBFx/9BDS3A5bYVc0sb6ndDsn1FhDH3MyOkGf/eHUl2Daa+SMPCPuPbp1f7nTQ9rgo+K282rtFIBeY+K2k0gksbRrYc/2ZFPrr2VVxSoAPlv/mWpZutNhwESoVi3hQV2yuPP4PW191W0JO7/5gM5ZtqXwHA7B7ceNYHj3nJhjur+8u+Yn37dfPt1y0owBYniP2BQO3XPSyPC46Ncpk/Vldbzwwzr+77OVxnEFdTBwKgqdolwoOd58OO9TGHYs7DGF7M7D495joeLQrqfgccWv/OTR62/m9IQD4yQAk0gktrTrZ9xsTzYhJcT84vnGvkpfJQVpBZDTU00QpihGmbRsr/V2Q2FlhwtQtASFWR4Ks7wcMKhTyufqg4H5Lo4a0ZVbP1iK0yGYc/PhZKe5yPBE7v3P4/sQCIa5U6vWBNAzXx0Eeuals62q0Tj216OHIoRA0VwxDiAvZHW1ZKflW7Zz0mNdRzppTjdog0Sayz73DYAbBxAmlJ6vzqVIJJKkadfZHbO1SvRLSpcY+8obylVhz+oKwUbw1RhFGLKiFu6U1froupPrhRZVNbJ+ex0DCjPj1ib1BcJMGNipWUWqPa7Yc7pkp/HK+eMZ2CXT9v6EEIwfYC1EMUyz/HMz3JZkYZvKG/hieRHvzN8EA9QBJC/Kh56TYRXyrMzOxMXpAS0mPt0dX9h1i12h7bnMJJK2TrvO7pjlyQJgffV6Y9/2Rq32pV5RR6v0A8SE8O3sWqiKorDfP79m2jO/cPQjs+K2awyGSGtmgi9PnNDCAwcXGi4ZOwqzIgnGRvXO45JDBgLqxOu2qshipKVbq7h75gocWqUjoSgxFnu0he5My4v7vvs71MG4b1onCtPiP6G4dVdMgklbiURiT7t+xs1xq+K9rmqdaqUDP2/9mWcWPwNeXdgj1ueAwkzL+SU1EQFbXVzD4Fs+SRgGmWp2yEpT+4o454bCCoGQYhvSmAxuG4s9GQpMCcc+uPwAY9CLjqhZukWtNSq0KkjKfleQN/J0S5ucrKjix95sZm/YbNl1TmU1d9YLTh1wHN9u3MyQnhPonN3bOP7ppi1khcMcUN8AQInmrpEWu0SSOu3ax65b7AoKQ/KH8Mu2X3h+6fMATB93L9kAjRFh7xllsZ/30jxA9b3XaPlTPltaxIU2y/W3Vjaw/33fcOuUYVxwUOxxOzZGDRIzFm9lj245DOqSZezTI1Saa7EbE64p6nu8BU55UcL+7+/+0C6v+dgdTjJHng5fRDJletKj6ot6s2PcNdddMF+d1HZnULjHFMjvS56p8lWvYIifN2ymevzF3ONbx0BXDo9v/5WQtNglkpRp1xa77mMH6JvTl94mC3ArWjk5kyvG4RBccegg/u9ka4bEGlNSrJd/Xs9zs9ca20VVjSiKYljf/5kVObZ0SxWv/7qRjxdtpazW6ta5Z+Zy3pi70bLvitcWcM/MyITlH6W1HP/Ej4D9IqRkiF7UtKPkmlatjuqdZzqiWs7C4aRzvjonMq26hg82b408HelEbwNkFqoLyISAfDU6x5FrSotwifo55Iyczv+d8DadtQnZsCysLJGkTLsW9lxvxDfvcri4ZfwtZLtVsd8WVB/p8VVZzrn+6KH8aWxv4rG5ooG7Z66gzhfkq+XF7PfPr/lqRQlBzQI1++WnPvEDN723hCtfX8AT30Ry04TDCs/OXsfrv26Kub6e8CsUVjjtP7+wukSNCW+2j72ZAwLAK+eP54PLD7Dsy0uPuGiuODQyqS00YXcKB3lpecw+bTY3bq9gYCAInizLNXCqD4K/rdvIGVU13B+O40t3qoNIfigE3faE26uMZG5OoX4e0hUjkaROu3bFFKQVcO+B91LRWMExA46hML2Qj078iEPfOpRtev5wkytGJ5nok5vfX8KHC9U4+KKqBtv8K2ZjclN5Pd+tKuHTJUX8fWr8OO7SGh+KovDs7LUWK1/P4JgqiXLGNMWBNitazTngza+F0Fwx2qRmXloe5PSC6s3gsskmecY7uAsHc2NGoRoJE4dfNpcicnvF7Bfa+0hXjESSOu1a2AGmDpxq2S5IKyDbk829i55kP7eL/iZXjJlHp43itTkbmbPOPr2vLuqgDgSNgciinGdm/cFFBw+kMMtriPPXK0v4emUJAJcfGj98c3VJLf1v+iRmf3Te+GTRc5W3VDS+OZd7TnrktW6x68IOwAVfQfkf9hcafGRS75d54yY1M2cU3Tzq01g/x84NR5VIOiLt2hVjh0M4mL6Hmivmjexs+PLvEIrNSXL8qJ68efEELp04MO61/n3GaEAtTOELRCzHez9ZyY3vLqa6wT7SZVuV6gY6anhX2+N2NNdi1xOcnavledlRMk2LuHJMK3X1yVMhTANQTnfod+COvaHTDY7YQW3fnAE8t62YC932pQAlEkl8OpywA1w28jLSXelUuDUXgC/WHaOzR7fsmH3Tx/Xmz/v1YdIINatgnT/EhqgIlzfmbjLS7Z46xupKKKpWwyinj+/DDUcPjfve/zt/nBFe2FyL3eNysP6+KVx75JBmnR9NllnYLREy2uTprlqoWzCA8Y0+XD1lnhiJJFU6pLA7HU6G5A+hvPNgdUcw/kKkyXt256rDB1v23XTMMO4+YS8cDkGa28FjX6/mLtPyezPj+hUwNGpwePSr1YAaRnnZxIHGqs47jx9hJOYCOGhwZ/bqqboc6v1tI098psdp+zriY2/eAJQyvcbC5b/CfpfumveTSDoQHVLYATqldWJ7SIuMCcYv6+ZxOYwaozqZprwqjYHEk3detyMmomWtlh0xO82NEIKLDlavf9zIHsy86iBL2zuPH8H4/gWM6xcVC95KuEyTsUIII+pGGNEpuzC3Tuehu/ARQSLpOLT7ydN4FKQXsDCouU8SWOwQydeuk0piMK/LQYbH3orVc9OcuE8vTtxHdddEp+Yd0DmLNy+ekPT77Wq8Tgf+YNg0ebqLLHaJRNJsOrTFXhmsVxemJ7DYIbnwx3g4hCA9Tgx6lid23HS0gWySqWBY7LorRmZalEjaPB3WYs/x5BBGrauZG/LvtPcJhhXSbCz2w/foYgkdNPOXI4fQt1P8zIZticgCKH3yVAq7RNLW6bC/Uj2PTL1wNGmxAzw+fZ9mvU8gFDYsdrczYo0/f86+ca3zqw4fzPGjejbr/XY1em1VPQmY6LhfGYmkw9Bhf6UZWq7vOoejSR87wNSR9vHSH1x+AC+fNy7ueYFQ2PCxp2khi9ccMThu+/bASaN7MnGomlM94qXS49g77FdGIukwdFhXTKZLTdFb5xBJWewA/3fyXjijfMjWRFixBEOKxce+/r4pqXW0DfLQn0bF7HPYrTyVSCRtkg77K810a8IukrPYAU7btw+njInNW2LmxXP2tWwHwkqzE3i1ByIWu57dscN+ZSSSDkOH/ZXqwl7vEEkLeyL0tLrR6XWDobCxrL8jo0fFSB+7RNL26bCuGKuPPTlXTCJ+vulw6nxBo+qSEGp2x0AobFjsnbLiZzFs/8g4domkvdDiwi6EOAGYAuQAzyuK8kVLv0cyZLnVqJg60TIWe0Gmh4JMDxX1auhk7/wMNpbXc9aEfmR5Xdxz4p4cMiRBEed2yqZydfWusUCpncXhSyS7I0k9VwshXhBClAghlkbtnySEWCWEWCOEuBFAUZQPFEW5ELgEOK3lu5wcuivmwYJ8lBaw2HX0HOy56W7W3zeFP++nVgM6Y3xfeuW3j9j0VOhToN+TduNy8lQiafMk+yt9CZhk3iHU/K1PApOB4cB0IYS5wsSt2vFWwaMVd/A7BDWB2ha7bkjZvSzXdy/dn+9vmGjEsTukj10iafMk9StVFGUWEF2RYhywRlGUtYqi+IE3gOOFyv8BnyqK8lvLdjc1xnYdC4A/UN9Ey+TZs0cux+zVjX+dsneLXROA0lVQtiZ2f9APM66Fpe/Cwtda9j2ToHO2l76dMpFx7BJJ+2FHfqU9AXNRz83aviuBI4BThBCXxDtZCHGREGKeEGJeaWnpDnQjPscPOh4AX11Ji13T43Lw7zPGMKRrbB73HeLJcfDEGAiHYcErRnGQ8pUfcVDJ5yz56BL4wJTCdtYD8ET8hVMtjTAVs5ZIJG2bFp88VRTlMeCxJNo9AzwDMHbs2J1Ssdjr9ALgWz9bFcz2EIO96DX48HKo3w4HXE1RqJ5Kp5NZGel4UNDLdpR8fy/bXE5G7qJu6dl8ZVSMRNL22RGl2wL0Nm330va1GXQ/u6+xQhXKdoCvrpSH83Opr1Zrrurpy57Oz+WUnt2N2dsTenbnzz267bJ+TR+nLtwSuzIfu0QiaRY7IuxzgcFCiP5CCA8wDfgolQsIIaYKIZ6pqqragW7Ex7DYhYBA3U55j5bm3TkP8EJeLs/XqVWYfMEGawO/eh81ugm96tNd0q80bWGWQ7piJJI2T7Lhjq8DPwNDhRCbhRDnK4oSBK4APgdWAG8pirIslTdXFOVjRVEuys3NTbXfSaELu18I8LfcBOrOYJXbzR9uF0FtDX99WLXVfUFrv0tXf8qqX/8d2fH6tMQXDoegdsfnGMKKVrpPTp5KJG2epHzsiqJMj7P/E+CTFu1RC2K22B9f+Qp7+Y9iYu+JrdupOJzSqzsAN5WpwUcBRY1C8QWsFvuR8+4gZCoMUuUQJBwWv/snzPoXXPc7ZHdtdv/0SRDpY5dI2j4d2vwyC/sz6z/mym+ubOUeNY3+Bwn5a+Gh4fgq1lmOh6KqPR3YtzeEApEdxcvgm3siK6lWauNubfEO9Uu32GV2R4mk7dOqv9Kd7WPXJ09rTdEwtf6WW6y0M7inUC1qHaraRKB6C7513zV9kmll7ezXT+CC318iXLMNipZE0jOW/b5D/VIUvYKSnDyVSNo6rSrsu8rHXuqMuA/mFs3dKe/V0iz3eBjdvw/fZqQ32Tboq1MtdH891+R5mZOeRs0758LTB0K9tq7s3fOhcmOz+6NoriEZxy6RtH069HO1LuzFrogY/Vr0a2t1Jz7hcMyuVV71aeN7d9Mh/j5fJbxyMjw0DG2Kk+qt8wD4IVTJIX160iDEDoV8hmV2R4mk3bBbCLvZYt/e2Abj2RMU23YpTQt7w1MTeKn0V17yhAwffLXmfno4L4dyp5MNbhf88pTtIJIMiuZjl3HsEknbp8PmY4eIsJdoFrtAUN+CeWNajFD8tMLBJHzaW9wuHuyUb9lX4XRQ6XCgD2khQFn8JoHhx+PZw1S+L9AI7rQm38PwsTs69FdGIukQdOjJU5fDhUBQolnsPbJ6UNcWFyqZo1o0Hu19bMy+QuG2Pf2c7rFhjP/slM9BfXtRq2WhDCP4MCuTMXNuZPPi19WJ1XWz4J6usKlp91RY97HLyVOJpM3ToSdPhRAoKJS4VCuzV1avtinsNoVADjvsn+wRtO5zxnGD2Fn1G93qILBNu/eVXjdfZaq51Vd9di18dCUUaen157+s/l+8LLIvCsUotCF97BJJW6dD+9gBBuUNMl4XpBe0SWEPmdIGnCByOY88APKjJipHODLYt9A+XbAnji9eF/07CztRofndG4SAxirwqMVIKFqk/v/U/vD0AbbXMaJikMIukbR1Oryw3zD2BuN1pjuzTQp7QPP7X93jcO466weuPXs2AN2FtYaqUBRemPIqb425JeYaTgUKvPkx+y3vo4l8g0NA+VpYOUM90FgdWdAUh7ARx97hvzISSbunw/9Ku2R0MV5nujKpD7a9ydNAyUoA3Npkr04fhxrDnq5Fshwt1BzwfYceZ3udZ49+jqtHX02XsL3LZoUWQlmlu1NWa+Vo/XXUla/lXwV5VMepDKVb7NIVI5G0fTq+sGeahN2dSUOwgeXbl1NUV9SKvbLi/+BiADwuq7B3d+cAMCIEi+jL5KMfBSDDncH7Bz4Uc50h+UO4YK8LyBGJI1e2O6P+7I2VfL7oWf6bm8Mj+Xngi12dq/vYpcUukbR9OnRUDEC2W7VyC3CS4VYnD0+bcRpHvnPkTnvPVNFdJJ4oi31ElpoD/YxwFo6zZ0DnIcYxtyt+iGKuwz56RmeLK0r4w0G2LVbL7i1I80JdbEWrSFSMtNglkrZOh46KATUy5uVwF95UupHlzop+/532vqmgC7s70GjZ3zenH7+t28gR6T1jznE6reJsdqDkRA0Q0czNzCI6wHKVRx0M1rvdNFar9VLMn49iFPGWFrtE0tbZLX6lo105dAsGyXRnWvaX1LdcLdQdIaCpsqdwiPVAZifcAE5P9CkJB6VcV0bC96slzJpuw4zttf3247vMTHqkFRIUghVF87nymys55r1jTO8ni1lLJO2F3eNX6kqDzXPJ+OM7y+4FJQsAaAg24Av5jO1dTXG6+sTizu5hPZCWp/7vjPWZdykcRkEoxHEOtY3FYndlxrSPZuORfzde/3Ho9Sgo3Dz2egB+L1/Jd5u+Y3PtZmOlriJzxUgk7YbdY324NimZOfcF6BFZpXnDrBu4YdYNlqaPTHyEw/sevku7d1EnVYjdzijfeFhL6WXjM/em5/P9ecuZ9ctDfLTqRcux3MyuUJs4Te+M9Z/Rz+3m3/m5LP31PgD26DaG7HCY5TXrjXaLyxYzc+1MPij7BZA+domkPbB7CLsmRplK0wmwtqz5HGprYMQJO7lTGiaXijtawAcfCd32hok3xj3d7Yr1p/ccfAwUz457TqY7k+82f8d3WtUmNJdUfloBgxQX3zVGIoZK60v5YM0HxrZ0xUgkbZ8OHxUDGNkTM8NNT5Y6F70Kb59tv2Bn7Xe2eV0SsnGOep6eFz0aUzqB8saoNhkFcMls6Dw07uU9ztjomAF5Ay3bwzsNN16fNvQ0Du19aMw5Ga4MPE4Phc4MyonkMqjyWf82Mo5dImn7dPioGMAQzwxTytpJfqvg6Qhdz7f/YT1Qtgb+ezx8fE1k37ZF8Nv/4r9vKAgvHKWe95+D4/Qtkk5gv+77JboLWzw2YY/9cvtZts3ifOt+t3LXAXcxsvNIS5s8bx4AOR5r5FDVFmthEumKkUjaPrvHc7VWOi7L5Iq5t7yWN499k9FdRluaGrJVusL2Gix8NbLvPwfDR1eoOc6jLfx1s2HDD3yZkc46twuqNtn3LdBIfijEafkj6ZTeKcUbA49LXZ1qnjxNd6Vz/djruWncTQBU+iot57gcLg7pdYhlX542UZvjsQ6yVSs+tGxLV4xE0vbZPX6lmsXuyexm7HI3lEMoSLYn29LUoUV/UL0VGirhnfPU10bOdBsXzZ35sOQd676XjyX83+P5S9fOHNerh5qA6/NbYJPJAq7YAK9Po1EIvDa+8mSITkOgc/aIszmsz2EA1AXq+Pt+f+eFo18wjnfNtKb6NSz29ALL/qqoVaoOmY9dImnz7CbCrlrbIrPQur9+uyX7I0BQt32Xfwj/1xeWvguL3oCgXZUjk528+nM1YyIYbc2Vm6b36Ma6eU9T/qMpFcAHl8K2hfiFMIqCpIrbHWux65ifAP409E/s221fY7sgzSrghrBnRD6j3FCIqqgFSdJil0jaPrvHr1SfoMxQxWyQXxPphnIuH3U5F+19kdHUr+c23/Bj5PysLhBs5NuMdPwA819Sc5d7Tdb+krfhvj6w4Sfwq7lWzEv3t7hdHNerB9f6VqtPAu9fAht+JAiEhMDbxKKieHjc8c/To2xOHXJqzLHoJxV9OycjYsl3yeoZY7HLYtYSSdtn9xD24x6DvgdCj334YcNmXq/XrGNfDW6nmzOHnWk09QkBOeoS/pp9Tue2wgLKGspYXbOBq7p25o7CAvj4ajV3ua8agGKnM7JE/8XJ0FhFidPJGk9s/PnGYL0q6oteZ5PLaVQ/8ibI/ZIIjzM94fElZy/hHxP+EbM/Wtj1JwazxT4oqxd/uKPvQVZQkkjaOruHsPceB+fOhIZKcsNh0nqMUfdrwmwWOZ8QcNIz8Of3eLSwC+9lZ/FZxTLCmjtnVoZVSFe53RzRpyf/yzUJZV0pJ/Tszl2FVncHQP9AAH7/lABwUs/uLEpTBVWfBE0Vhys23UAy5HhyLNu6sOemR4T9sG7jaYjODSNL40kkbZ7dI449mj5aWKGvBgDnp38zDvmFgO6jCA88lI/WfwpAWiiIb6uabqDS5Df/OiOdU7RFPgu8Xmanp/GXLoX4qzZTE50aV2Oj20WVw8EZPbrRaBLNtJwetu2bItObR+dgkFurGppubCKesOeY/PJDOg0jBinsEkmbZ/eIY9c54nY49hEYqiW3Wv8DfPF3mPus0cQnBLi8fLvxWxq0GPO6NV/iW/6+0eblHNU6v6ZrZ2PfWo+by7p14cvMDMq+uztuF4pdLg7s28soeqHjyewc54zEuFxevtm0lWMaUls45YlKLBZxxaj5692KQnp67BOHRCJp++werhidjAIYey6kadbq3Ofgp8cA6BRU87L4HQJFOHl+6fP0zFJ97bUOhyr4Gg90UkvQFWrnQKR4NMCW2s0pd625UTGGBb0DhvToLqM5bpBalSkrQx1g0sIKXi1SRiKRtC92L2HXiVpdCfDtpi30CgTwCcGS7UtZUraE8/Y8j6xwmLezs7i0WxdL+5/S0+geDMZcB2CrFg3zxLhbuWPklcb+6KyLi85aZOSIb7aw6/dyxB3NOx94efLLRvij051GdiiMR1HwenOaOFMikbRFdk9htwnZE4BXUfAJwXebvsMpnBzd72hqHQ62u2LbX9ytC0vSvOTj5Ooe1myQn2aqIYhZ6YWcNOoiRhaoqQucUe4Ph3DQK1utkhSTACxZnG64vUp9EkmRhyc+zHNHPWfdKQQ54TBpioLH07wQTIlE0rrsnsIeB48CX2Zm8OySZ9mnyz7kepv2/fcT3pjQwR+1yBndrdE7bwCAIeJmemnl76r8u3gCGTii7xGM7z4+Zn9OOIxXUXA1UTtVIpG0TXbfX25eX6jcEPfwFftckdRlvApkuO0LW2RrMeG37ncrk/tPZu/Cvfnoj4/417x/GW3+uu9fCSpBDuxxYAqd37nkhkNUOZwIGQEjkbRLdl+L/ZrFsMex0HVPY9eFlVU4FYU3jn2DMV3HJHWZNCAjymLXydL835nuTA7udTB5aXmcNeIsS5vuWd15/LDHjbZtgUsrqrmmorK1uyGRSJrJ7muxA0zTMjWGw3BnPkfWNzB3/SbcnUYYTe7pcxwlddt4dPtc20s4lDDpmiinhxUaHKqVe9rQ08h22wv+5aMup092nxa8kZZltM/XdCOJRNJm2b2FXce0UCh6CvO4Q+8B4NGX97I9NaCEydR88S7g7wP/xLiBU+jXfbRte4BLRl6yQ93dlQgFFOmRkUjaFa0q7EKIqcDUQYMGNdm2rRJQwmRowq4Afzrw74lPaA+MPQ/qygAp6hJJe6RVhV1RlI+Bj8eOHXtha/YDgMt+gVWfQGH8MnR2BFAMYe8wHPtwa/dAIpHsALvv5Gk0XYbBQdfBsGMTNnts5LWW7YAQpGvVh5quqCqRSCQ7HynsKeKNWtwUyO9LpibsR4q2E9kikUh2X+TkaZJ8fMLHVPoqCZT9btkfEAJvegFf73cf+b1iF/tIJBLJrkYKe5L0y+0HwGKtNFz/7L6kuTO4Yd8bAOgydEprdW2nMijsYI0j3HRDiUTSZpDCniJOobpi0twZvDX1rVbuzc7nDUdvQut/YHy/3q3dFYlEkiRS2FMkpKipeh27SVFn70nPwcoZPPv1zWyIKZMnkUjaIruHOrUgusUenfirw5LdDfa9gP0afZxWU9vavZFIJEkgLfYUGd5pOFfucyUnDT6ptbsikUgktkhhTxEhBBftfVFrd0MikUjiIoVdkhznfAIV61q7FxKJJAmksEuSo98B6j+JRNLmkZOnEolE0sFoVWEXQkwVQjxTVbXry8JJJBJJR6VVhV1RlI8VRbkoN7eDZUeUSCSSVkS6YiQSiaSDIYVdIpFIOhhS2CUSiaSDIYVdIpFIOhhS2CUSiaSDIRSl9Qu6CSFKgQ3NPL0QKGvB7rQm8l7aJh3lXjrKfYC8F52+iqJ0jt7ZJoR9RxBCzFMUZWxr96MlkPfSNuko99JR7gPkvTSFdMVIJBJJB0MKu0QikXQwOoKwP9PaHWhB5L20TTrKvXSU+wB5Lwlp9z52iUQikVjpCBa7RCKRSExIYZdIJJIORrsWdiHEJCHEKiHEGiHEja3dn6YQQrwghCgRQiw17SsQQnwphFit/Z+v7RdCiMe0e1sshBjdej23IoToLYT4VgixXAixTAhxtba/Pd5LmhDiVyHEIu1e7tD29xdCzNH6/KYQwqPt92rba7Tj/Vr1BqIQQjiFEAuEEDO07XZ5HwBCiPVCiCVCiIVCiHnavvb4HcsTQrwjhFgphFghhJiws++j3Qq7EMIJPAlMBoYD04UQw1u3V03yEjApat+NwNeKogwGvta2Qb2vwdq/i4CndlEfkyEIXKcoynBgP+By7bNvj/fiAw5TFGUkMAqYJITYD/g/4GFFUQYBFcD5WvvzgQpt/8Nau7bE1cAK03Z7vQ+dQxVFGWWK826P37FHgc8URdkDGIn699m596EoSrv8B0wAPjdt3wTc1Nr9SqLf/YClpu1VQHftdXdglfb6P8B0u3Zt7R/wIXBke78XIAP4DRiPuhLQFf1dAz4HJmivXVo70dp91/rTSxOJw4AZgGiP92G6n/VAYdS+dvUdA3KBddGf7c6+j3ZrsQM9gU2m7c3avvZGV0VRtmmvi4Cu2ut2cX/aI/w+wBza6b1o7ouFQAnwJfAHUKkoSlBrYu6vcS/a8Sqg0y7tcHweAf4KhLXtTrTP+9BRgC+EEPOFEBdp+9rbd6w/UAq8qLnInhNCZLKT76M9C3uHQ1GH6HYTfyqEyALeBa5RFKXafKw93YuiKCFFUUahWrzjgD1at0epI4Q4FihRFGV+a/elBTlQUZTRqO6Jy4UQB5sPtpPvmAsYDTylKMo+QB0Rtwuwc+6jPQv7FqC3abuXtq+9USyE6A6g/V+i7W/T9yeEcKOK+quKoryn7W6X96KjKEol8C2qyyJPCOHSDpn7a9yLdjwX2L5re2rLAcBxQoj1wBuo7phHaX/3YaAoyhbt/xLgfdRBt719xzYDmxVFmaNtv4Mq9Dv1PtqzsM8FBmuz/h5gGvBRK/epOXwEnK29PhvVX63vP0ubJd8PqDI9urUqQggBPA+sUBTlIdOh9ngvnYUQedrrdNS5ghWoAn+K1iz6XvR7PAX4RrO4WhVFUW5SFKWXoij9UH8L3yiKcgbt7D50hBCZQohs/TVwFLCUdvYdUxSlCNgkhBiq7TocWM7Ovo/WnlzYwYmJY4DfUX2it7R2f5Lo7+vANiCAOpKfj+rX/BpYDXwFFGhtBWrUzx/AEmBsa/ffdB8Hoj46LgYWav+Oaaf3sjewQLuXpcA/tP0DgF+BNcDbgFfbn6Ztr9GOD2jte7C5p4nAjPZ8H1q/F2n/lum/73b6HRsFzNO+Yx8A+Tv7PmRKAYlEIulgtGdXjEQikUhskMIukUgkHQwp7BKJRNLBkMIukUgkHQwp7BKJRNLBkMIukUgkHQwp7BKJRNLB+H8BnZLqev8qaAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(rews)\n", + "figure()\n", + "plt.yscale('log')\n", + "plot([x[0] for x in m.losses])\n", + "plot([x[1] for x in m.losses])\n", + "plot([x[-3] for x in m.losses])" + ] + }, + { + "cell_type": "markdown", + "id": "80a5e8ee-f19f-4baa-a150-0de278cbae27", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "can act?" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "52850a94-9d85-47c9-bb24-15d9d029281a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "action: 1 value: 32.34, reward: 1, policy: [1.9e-15 1.0e+00]\n", + "action: 1 value: 45.02, reward: 1, policy: [9.0e-16 1.0e+00]\n", + "action: 0 value: 44.56, reward: 1, policy: [1.0e+00 2.6e-14]\n", + "action: 1 value: 48.30, reward: 1, policy: [2.7e-16 1.0e+00]\n", + "action: 0 value: 38.88, reward: 1, policy: [1.0e+00 3.8e-15]\n", + "action: 1 value: 50.63, reward: 1, policy: [2.8e-02 9.7e-01]\n", + "action: 0 value: 31.59, reward: 1, policy: [1.0e+00 4.9e-13]\n", + "action: 0 value: 46.69, reward: 1, policy: [1.0e+00 1.2e-14]\n", + "action: 1 value: 53.09, reward: 1, policy: [1.4e-13 1.0e+00]\n", + "action: 0 value: 38.67, reward: 1, policy: [1.0e+00 2.1e-15]\n", + "action: 0 value: 52.90, reward: 1, policy: [1.0e+00 7.7e-13]\n", + "action: 1 value: 57.10, reward: 1, policy: [9.0e-14 1.0e+00]\n", + "action: 0 value: 44.46, reward: 1, policy: [1.0e+00 1.2e-15]\n", + "action: 0 value: 57.76, reward: 1, policy: [1.0e+00 4.1e-08]\n", + "action: 1 value: 61.95, reward: 1, policy: [1.3e-11 1.0e+00]\n", + "action: 0 value: 49.79, reward: 1, policy: [1.0e+00 1.9e-15]\n", + "action: 0 value: 61.80, reward: 1, policy: [1.0e+00 1.9e-03]\n", + "action: 1 value: 66.00, reward: 1, policy: [1.3e-08 1.0e+00]\n", + "action: 0 value: 54.68, reward: 1, policy: [1.0e+00 3.8e-14]\n", + "action: 1 value: 65.05, reward: 1, policy: [2.7e-02 9.7e-01]\n", + "action: 0 value: 43.98, reward: 1, policy: [1.0e+00 6.2e-16]\n", + "action: 0 value: 57.79, reward: 1, policy: [1.0e+00 3.7e-12]\n", + "action: 1 value: 66.26, reward: 1, policy: [6.5e-04 1.0e+00]\n", + "action: 0 value: 48.09, reward: 1, policy: [1.0e+00 1.1e-15]\n", + "action: 0 value: 60.51, reward: 1, policy: [1.0e+00 1.1e-08]\n", + "action: 1 value: 65.65, reward: 1, policy: [4.9e-06 1.0e+00]\n", + "action: 0 value: 52.98, reward: 1, policy: [1.0e+00 3.7e-14]\n", + "action: 0 value: 62.41, reward: 1, policy: [8.1e-01 1.9e-01]\n", + "action: 1 value: 61.66, reward: 1, policy: [5.7e-10 1.0e+00]\n", + "action: 0 value: 58.33, reward: 1, policy: [1.0e+00 4.6e-09]\n", + "action: 1 value: 61.52, reward: 1, policy: [2.8e-07 1.0e+00]\n", + "action: 0 value: 53.30, reward: 1, policy: [1.0e+00 6.0e-13]\n", + "action: 1 value: 60.06, reward: 1, policy: [1.3e-03 1.0e+00]\n", + "action: 0 value: 47.97, reward: 1, policy: [1.0e+00 1.1e-14]\n", + "action: 0 value: 57.54, reward: 1, policy: [1.0e+00 2.0e-05]\n", + "action: 1 value: 55.00, reward: 1, policy: [8.3e-12 1.0e+00]\n", + "action: 0 value: 55.50, reward: 1, policy: [1.0e+00 9.3e-09]\n", + "action: 1 value: 55.33, reward: 1, policy: [4.6e-10 1.0e+00]\n", + "action: 0 value: 53.47, reward: 1, policy: [1.0e+00 1.3e-10]\n", + "action: 1 value: 55.26, reward: 1, policy: [3.6e-08 1.0e+00]\n", + "action: 0 value: 51.62, reward: 1, policy: [1.0e+00 1.5e-11]\n", + "action: 1 value: 54.96, reward: 1, policy: [2.9e-06 1.0e+00]\n", + "action: 0 value: 50.00, reward: 1, policy: [1.0e+00 4.5e-12]\n", + "action: 1 value: 54.53, reward: 1, policy: [2.0e-04 1.0e+00]\n", + "action: 0 value: 48.61, reward: 1, policy: [1.0e+00 1.8e-12]\n", + "action: 1 value: 54.02, reward: 1, policy: [1.9e-02 9.8e-01]\n", + "action: 0 value: 47.44, reward: 1, policy: [1.0e+00 8.4e-13]\n", + "action: 0 value: 53.47, reward: 1, policy: [3.4e-01 6.6e-01]\n", + "action: 1 value: 43.20, reward: 1, policy: [6.1e-13 1.0e+00]\n", + "action: 1 value: 53.70, reward: 1, policy: [3.2e-03 1.0e+00]\n", + "action: 0 value: 47.63, reward: 1, policy: [1.0e+00 4.2e-12]\n", + "action: 1 value: 53.27, reward: 1, policy: [9.4e-04 1.0e+00]\n", + "action: 0 value: 47.52, reward: 1, policy: [1.0e+00 8.2e-12]\n", + "action: 1 value: 52.80, reward: 1, policy: [9.9e-05 1.0e+00]\n", + "action: 0 value: 47.51, reward: 1, policy: [1.0e+00 2.1e-11]\n", + "action: 1 value: 52.29, reward: 1, policy: [8.4e-06 1.0e+00]\n", + "action: 0 value: 47.58, reward: 1, policy: [1.0e+00 6.7e-11]\n", + "action: 1 value: 51.72, reward: 1, policy: [4.6e-07 1.0e+00]\n", + "action: 0 value: 47.73, reward: 1, policy: [1.0e+00 2.8e-10]\n", + "action: 1 value: 51.06, reward: 1, policy: [2.3e-08 1.0e+00]\n", + "action: 0 value: 47.92, reward: 1, policy: [1.0e+00 1.5e-09]\n", + "action: 1 value: 50.28, reward: 1, policy: [1.6e-09 1.0e+00]\n", + "action: 0 value: 48.14, reward: 1, policy: [1.0e+00 1.0e-08]\n", + "action: 1 value: 49.33, reward: 1, policy: [1.6e-10 1.0e+00]\n", + "action: 0 value: 48.36, reward: 1, policy: [1.0e+00 1.9e-07]\n", + "action: 1 value: 48.17, reward: 1, policy: [2.7e-11 1.0e+00]\n", + "action: 0 value: 48.55, reward: 1, policy: [1.0e+00 6.5e-06]\n", + "action: 1 value: 46.79, reward: 1, policy: [6.1e-12 1.0e+00]\n", + "action: 0 value: 48.68, reward: 1, policy: [1.0e+00 2.0e-04]\n", + "action: 1 value: 45.17, reward: 1, policy: [1.7e-12 1.0e+00]\n", + "action: 0 value: 48.69, reward: 1, policy: [9.9e-01 8.3e-03]\n", + "action: 1 value: 43.32, reward: 1, policy: [9.8e-13 1.0e+00]\n", + "action: 1 value: 48.53, reward: 1, policy: [2.7e-01 7.3e-01]\n", + "action: 0 value: 39.95, reward: 1, policy: [1.0e+00 2.8e-12]\n", + "action: 1 value: 47.45, reward: 1, policy: [3.6e-03 1.0e+00]\n", + "action: 0 value: 39.62, reward: 1, policy: [1.0e+00 8.7e-12]\n", + "action: 1 value: 46.10, reward: 1, policy: [3.0e-05 1.0e+00]\n", + "action: 0 value: 39.01, reward: 1, policy: [1.0e+00 1.7e-11]\n", + "action: 1 value: 44.50, reward: 1, policy: [1.9e-07 1.0e+00]\n", + "action: 0 value: 38.12, reward: 1, policy: [1.0e+00 9.5e-11]\n", + "action: 1 value: 42.66, reward: 1, policy: [7.9e-10 1.0e+00]\n", + "action: 0 value: 36.95, reward: 1, policy: [1.0e+00 2.5e-09]\n", + "action: 1 value: 40.63, reward: 1, policy: [2.6e-13 1.0e+00]\n", + "action: 0 value: 35.56, reward: 1, policy: [1.0e+00 1.6e-08]\n", + "action: 1 value: 38.46, reward: 1, policy: [1.2e-17 1.0e+00]\n", + "action: 0 value: 33.97, reward: 1, policy: [1.0e+00 3.7e-08]\n", + "action: 1 value: 36.28, reward: 1, policy: [6.8e-15 1.0e+00]\n", + "action: 0 value: 32.18, reward: 1, policy: [1.0e+00 2.1e-08]\n", + "action: 1 value: 34.17, reward: 1, policy: [2.3e-13 1.0e+00]\n", + "action: 0 value: 30.28, reward: 1, policy: [1.0e+00 2.4e-09]\n", + "action: 1 value: 32.20, reward: 1, policy: [4.9e-12 1.0e+00]\n", + "action: 0 value: 28.18, reward: 1, policy: [1.0e+00 1.7e-10]\n", + "action: 1 value: 30.41, reward: 1, policy: [1.5e-10 1.0e+00]\n", + "action: 0 value: 25.75, reward: 1, policy: [1.0e+00 1.9e-11]\n", + "action: 1 value: 28.79, reward: 1, policy: [1.0e-07 1.0e+00]\n", + "action: 0 value: 23.17, reward: 1, policy: [1.0e+00 5.4e-14]\n", + "action: 1 value: 27.05, reward: 1, policy: [1.8e-02 9.8e-01]\n", + "action: 0 value: 20.34, reward: 1, policy: [1.0e+00 1.9e-15]\n", + "action: 0 value: 24.93, reward: 1, policy: [1.0e+00 5.5e-08]\n", + "action: 1 value: 23.81, reward: 1, policy: [1.5e-13 1.0e+00]\n", + "action: 0 value: 22.97, reward: 1, policy: [1.0e+00 9.3e-12]\n", + "action: 1 value: 22.90, reward: 1, policy: [1.0e-12 1.0e+00]\n", + "action: 0 value: 20.86, reward: 1, policy: [1.0e+00 2.4e-14]\n", + "action: 1 value: 21.72, reward: 1, policy: [5.6e-11 1.0e+00]\n", + "action: 0 value: 18.62, reward: 1, policy: [1.0e+00 3.7e-16]\n", + "action: 0 value: 20.24, reward: 1, policy: [3.9e-01 6.1e-01]\n", + "action: 1 value: 16.81, reward: 1, policy: [4.2e-17 1.0e+00]\n", + "action: 0 value: 19.00, reward: 1, policy: [1.0e+00 1.1e-11]\n", + "action: 1 value: 16.07, reward: 1, policy: [3.8e-17 1.0e+00]\n", + "action: 0 value: 17.66, reward: 1, policy: [1.0e+00 7.2e-16]\n", + "action: 1 value: 15.19, reward: 1, policy: [4.5e-16 1.0e+00]\n", + "action: 0 value: 16.26, reward: 1, policy: [1.0e+00 1.7e-17]\n", + "action: 1 value: 14.24, reward: 1, policy: [2.2e-13 1.0e+00]\n", + "action: 0 value: 14.82, reward: 1, policy: [1.0e+00 4.0e-16]\n", + "action: 1 value: 13.26, reward: 1, policy: [5.3e-09 1.0e+00]\n", + "action: 0 value: 13.47, reward: 1, policy: [1.0e+00 4.9e-15]\n", + "action: 1 value: 12.29, reward: 1, policy: [8.6e-02 9.1e-01]\n", + "action: 0 value: 12.24, reward: 1, policy: [1.0e+00 3.6e-14]\n", + "action: 0 value: 11.38, reward: 1, policy: [1.0e+00 1.7e-05]\n", + "action: 1 value: 8.88, reward: 1, policy: [2.8e-08 1.0e+00]\n", + "action: 0 value: 10.72, reward: 1, policy: [1.0e+00 5.1e-06]\n", + "action: 1 value: 8.48, reward: 1, policy: [2.0e-07 1.0e+00]\n", + "action: 0 value: 10.09, reward: 1, policy: [1.0e+00 7.5e-06]\n", + "action: 1 value: 8.06, reward: 1, policy: [8.9e-07 1.0e+00]\n", + "action: 0 value: 9.50, reward: 1, policy: [1.0e+00 2.7e-05]\n", + "action: 1 value: 7.61, reward: 1, policy: [2.5e-06 1.0e+00]\n", + "action: 0 value: 8.96, reward: 1, policy: [1.0e+00 1.8e-04]\n", + "action: 1 value: 7.17, reward: 1, policy: [4.5e-06 1.0e+00]\n", + "DONE 127\n" + ] + } + ], + "source": [ + "fmt = 'action: %1u value: %6.2f, reward: %2u, policy: [%2.1e %2.1e]'\n", + "state = env.reset()\n", + "for sn in range(2000):\n", + " p_0 = naive_search(m, state, debug=False, T=0.1)\n", + " #p_0, _ = mcts_search(m, state, 50)\n", + " #print(p_0)\n", + " \n", + " a_1 = np.random.choice(list(range(len(p_0))), p=p_0)\n", + " _, v_0 = m.ft(m.ht(state))\n", + " state,r,done,_ = env.step(a_1)\n", + " print(fmt % (a_1, v_0[0], r, p_0[0], p_0[1]))\n", + " if done:\n", + " print(\"DONE\", sn)\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b3d6446-8808-4e17-8da3-4016b315401a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}