mirror of
https://github.com/google-deepmind/deepmind-research.git
synced 2026-02-05 19:26:22 +08:00
625 lines
121 KiB
Plaintext
625 lines
121 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "N1EHYIqxd80m"
|
|
},
|
|
"source": [
|
|
"##### Copyright 2020 DeepMind Technologies Limited.\n",
|
|
"\n",
|
|
"Licensed under the Apache License, Version 2.0 (the \"License\");"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "jK5pMeB_eIyJ"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
|
|
"# you may not use this file except in compliance with the License.\n",
|
|
"# You may obtain a copy of the License at\n",
|
|
"#\n",
|
|
"# https://www.apache.org/licenses/LICENSE-2.0\n",
|
|
"#\n",
|
|
"# Unless required by applicable law or agreed to in writing, software\n",
|
|
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
|
|
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
|
|
"# See the License for the specific language governing permissions and\n",
|
|
"# limitations under the License."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "IRX0BA2KosLs"
|
|
},
|
|
"source": [
|
|
"# **V**ariational **I**ntrinsic **S**uccessor Featu**R**es\n",
|
|
"This is a minimal TensorFlow-v1 implementation of the VISR algorithm from [Fast Task Inference with Variational Intrinsic Successor Features](https://arxiv.org/abs/1906.05030) aimed at ease of understanding and usage rather than performance.\n",
|
|
"\n",
|
|
"\n",
|
|
"* The (self-contained) environment is a 2D grid-world with 4 actions corresponding to the cardinal directions\n",
|
|
"* VISR is trained here using batched environments and 1-step Q-learning\n",
|
|
"* Should train in \u003c 1 hour without a GPU\n",
|
|
"* After training, fast inference can be performed in \u003c 1 second on arbitrary reward functions\n",
|
|
"* The code should be easily modifiable, but it advised to switch to a distributed training setup if attempting more complex environments (e.g. Atari)\n",
|
|
"* The hyper-parameters and network architecture where chosen for simplicity, and could certainly be improved upon if performance on more complex grid-worlds is desired.\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"cellView": "both",
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "932Onq6lRtyd"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"#@title Imports\n",
|
|
"%tensorflow_version 1.x\n",
|
|
"!pip install \"dm-sonnet\u003c2\"\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import tensorflow as tf\n",
|
|
"import sonnet as snt\n",
|
|
"from IPython.display import clear_output\n",
|
|
"from IPython.display import display\n",
|
|
"from IPython.display import HTML\n",
|
|
"%matplotlib inline"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "sZSfOaYrsDnm"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"#@title Environmental Constants and Algorithm Hyperparameters\n",
|
|
"#constants\n",
|
|
"grid_size = 10\n",
|
|
"num_states = grid_size**2\n",
|
|
"num_a = 4\n",
|
|
"#hyper parameters\n",
|
|
"num_gpi_samples = 10\n",
|
|
"traj_len = 40\n",
|
|
"mb_size = 32\n",
|
|
"hid_dim = 100\n",
|
|
"phi_dim = 5\n",
|
|
"gamma = .95\n",
|
|
"epsilon = .1\n",
|
|
"lr = 1e-4"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "M3x2g6zdR2pa"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"#@title Environment Definition and Helper Functions\n",
|
|
"def progress(value, max=100):\n",
|
|
" return HTML(\"\"\"\n",
|
|
" \u003cprogress\n",
|
|
" value='{value}'\n",
|
|
" max='{max}',\n",
|
|
" style='width: 100%'\n",
|
|
" \u003e\n",
|
|
" {value}\n",
|
|
" \u003c/progress\u003e\n",
|
|
" \"\"\".format(value=value, max=max))\n",
|
|
"\n",
|
|
"def sample_sphere(num_dim=phi_dim, size=None):\n",
|
|
" if size is None:\n",
|
|
" size = [traj_len, mb_size]\n",
|
|
" unnormed = np.random.randn(*(size+[num_dim]))\n",
|
|
" return unnormed / np.linalg.norm(unnormed, axis=-1, keepdims=True)\n",
|
|
"\n",
|
|
"def reset(size=mb_size, start_state=None):\n",
|
|
" if start_state is None:\n",
|
|
" state = np.random.randint(num_states, size=size)\n",
|
|
" else:\n",
|
|
" state = start_state*np.ones([size], dtype=np.int)\n",
|
|
" return state\n",
|
|
"\n",
|
|
"def get_obs(state):\n",
|
|
" return np.eye(num_states)[state]\n",
|
|
"\n",
|
|
"def get_rc(state):\n",
|
|
" row = state//grid_size\n",
|
|
" col = state % grid_size\n",
|
|
" return row, col\n",
|
|
"\n",
|
|
"def get_s(row, col):\n",
|
|
" return row*grid_size+col\n",
|
|
"\n",
|
|
"def step(state, action):\n",
|
|
" row, col = get_rc(state)\n",
|
|
" #a0:up\n",
|
|
" new_r = np.where(action == 0, row-1, row)\n",
|
|
" #a1:left\n",
|
|
" new_c = np.where(action == 1, col-1, col)\n",
|
|
" #a2:down\n",
|
|
" new_r = np.where(action == 2, new_r+1, new_r)\n",
|
|
" #a3:right\n",
|
|
" new_c = np.where(action == 3, new_c+1, new_c)\n",
|
|
" #clip\n",
|
|
" new_r[new_r \u003e= grid_size] = grid_size-1\n",
|
|
" new_r[new_r \u003c 0] = 0\n",
|
|
" new_c[new_c \u003e= grid_size] = grid_size-1\n",
|
|
" new_c[new_c \u003c 0] = 0\n",
|
|
" return get_s(new_r, new_c)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "A6njffC_VpjR"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"#@title Define Computational Graph\n",
|
|
"tf.disable_v2_behavior()\n",
|
|
"tf.reset_default_graph()\n",
|
|
"#Time x Batch\n",
|
|
"s_ph = tf.placeholder(tf.int64, shape=[None, None], name='state_inds')\n",
|
|
"#Time-1 x Batch\n",
|
|
"a_ph = tf.placeholder(tf.int64, shape=[None, None], name='actions')\n",
|
|
"#Time x Batch (constant across time)\n",
|
|
"w_ph = tf.placeholder(tf.float32, shape=[None, None, phi_dim], name='options')\n",
|
|
"cur_batch_shape = tf.shape(s_ph)\n",
|
|
"obs = tf.one_hot(s_ph, num_states)\n",
|
|
"psi_net = snt.nets.MLP([hid_dim, hid_dim, phi_dim*num_a])\n",
|
|
"phi_net = snt.Sequential([snt.nets.MLP([hid_dim, phi_dim]),\n",
|
|
" lambda x: tf.nn.l2_normalize(x, axis=-1)])\n",
|
|
"phi = snt.BatchApply(phi_net)(obs)\n",
|
|
"#assumes z=w, since GPI is only done out of graph\n",
|
|
"psi = tf.reshape(snt.BatchApply(psi_net)(tf.concat([obs, w_ph], -1)),\n",
|
|
" [cur_batch_shape[0], cur_batch_shape[1], phi_dim, num_a])\n",
|
|
"q = tf.einsum('tbpa,tbp-\u003etba', psi, w_ph)\n",
|
|
"#GPI (only for acting)\n",
|
|
"gpi_z_shape = tf.concat([[num_gpi_samples], tf.shape(w_ph)[1:]], -1)\n",
|
|
"gpi_z = tf.nn.l2_normalize(tf.random_normal(gpi_z_shape), axis=-1)\n",
|
|
"#only care about time=0, since only for acting\n",
|
|
"gpi_obs = tf.tile(obs[0][tf.newaxis], [num_gpi_samples, 1, 1])\n",
|
|
"gpi_psi = tf.reshape(snt.BatchApply(psi_net)(tf.concat([gpi_obs, gpi_z], -1)),\n",
|
|
" [num_gpi_samples, cur_batch_shape[1], phi_dim, num_a])\n",
|
|
"gpi_q = tf.einsum('zbpa,bp-\u003ezba', gpi_psi, w_ph[0])\n",
|
|
"gpi_q = tf.concat([q[0][tf.newaxis], gpi_q], 0)\n",
|
|
"gpi_q = tf.reduce_max(gpi_q, axis=0)[tf.newaxis]\n",
|
|
"\n",
|
|
"psi_losses = []\n",
|
|
"a_t = tf.argmax(q[1:], axis=-1)\n",
|
|
"for i in range(phi_dim):\n",
|
|
" q_tm1 = tf.squeeze(\n",
|
|
" tf.gather(psi[:-1, :, i],\n",
|
|
" a_ph[:, :, tf.newaxis], axis=-1, batch_dims=2), -1)\n",
|
|
" q_t = tf.squeeze(\n",
|
|
" tf.gather(psi[1:, :, i],\n",
|
|
" a_t[:, :, tf.newaxis], axis=-1, batch_dims=2), -1)\n",
|
|
" y = phi[1:, :, i] + gamma*q_t #reward based on state after action\n",
|
|
" psi_losses.append(tf.losses.mean_squared_error(tf.stop_gradient(y), q_tm1))\n",
|
|
"psi_loss = tf.add_n(psi_losses)/float(phi_dim)\n",
|
|
"phi_loss = tf.reduce_mean(1.0-tf.reduce_sum(phi[1:]*w_ph[1:], -1))\n",
|
|
"train_step = tf.train.AdamOptimizer(lr, epsilon=1e-5).minimize(psi_loss)\n",
|
|
"with tf.control_dependencies([train_step]):\n",
|
|
" train_step = tf.train.AdamOptimizer(10.*lr).minimize(phi_loss)\n",
|
|
"sess = tf.train.SingularMonitoredSession()\n",
|
|
"phi_hist = []\n",
|
|
"psi_hist = []"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "cn7ElUK7PC2_"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"#@title Unsupervised Pre-Training\n",
|
|
"num_steps = int(3e4)\n",
|
|
"feed_dict = {}\n",
|
|
"s = np.zeros([traj_len, mb_size], dtype=np.int)\n",
|
|
"a = np.zeros([traj_len-1, mb_size], dtype=np.int)\n",
|
|
"w = np.zeros([traj_len, mb_size, phi_dim])\n",
|
|
"s[0, :] = reset()\n",
|
|
"out = display(progress(0, num_steps), display_id=True)\n",
|
|
"for e in range(num_steps):\n",
|
|
" out.update(progress(e, num_steps))\n",
|
|
" uniform_sphere = np.random.randn(1, mb_size, phi_dim)\n",
|
|
" uniform_sphere /= np.linalg.norm(uniform_sphere, axis=-1, keepdims=True)\n",
|
|
" w[:, :] = uniform_sphere\n",
|
|
" pos_starts = [0, grid_size-1, num_states-grid_size, num_states-1]\n",
|
|
" for t in range(traj_len-1):\n",
|
|
" a[t, :] = np.random.randint(num_a, size=mb_size)\n",
|
|
" cur_q = sess.run(gpi_q, feed_dict={\n",
|
|
" s_ph: s[t, :][np.newaxis], w_ph: w[t, :][np.newaxis]})[0]\n",
|
|
" greedy_a = np.argmax(cur_q, -1)\n",
|
|
" a[t, :] = np.where(np.random.rand(mb_size) \u003e epsilon, greedy_a, a[t])\n",
|
|
" s[t+1, :] = step(s[t], a[t])\n",
|
|
" feed_dict[s_ph] = s\n",
|
|
" feed_dict[a_ph] = a\n",
|
|
" feed_dict[w_ph] = w\n",
|
|
" _, cur_phi_loss, cur_psi_loss = sess.run([train_step, phi_loss, psi_loss],\n",
|
|
" feed_dict=feed_dict)\n",
|
|
" phi_hist.append(cur_phi_loss)\n",
|
|
" psi_hist.append(cur_psi_loss)\n",
|
|
"plt.subplot(121)\n",
|
|
"plt.plot(phi_hist)\n",
|
|
"plt.subplot(122)\n",
|
|
"plt.plot(psi_hist)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"cellView": "both",
|
|
"colab": {
|
|
"height": 281
|
|
},
|
|
"colab_type": "code",
|
|
"executionInfo": {
|
|
"elapsed": 58,
|
|
"status": "ok",
|
|
"timestamp": 1583246926586,
|
|
"user": {
|
|
"displayName": "",
|
|
"photoUrl": "",
|
|
"userId": ""
|
|
},
|
|
"user_tz": 0
|
|
},
|
|
"id": "7wHoB-mbWpYc",
|
|
"outputId": "3698a1a4-4400-4cbb-ed89-fbc9b3c75df5"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\nP6VJoHNxdXWJAAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"\u003cFigure size 600x400 with 5 Axes\u003e"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"#@title animated visualization of intrinsic rewards and value function, sweeping over 2D w's\n",
|
|
"w_gran = 50\n",
|
|
"def pol2cart(rho, angle):\n",
|
|
" x_coord = rho * np.cos(angle)\n",
|
|
" y_coord = rho * np.sin(angle)\n",
|
|
" return(x_coord, y_coord)\n",
|
|
"eval_feed_dict = {}\n",
|
|
"eval_feed_dict[s_ph] = np.arange(num_states)[np.newaxis]\n",
|
|
"x, y = pol2cart(1, np.linspace(0, 2*np.pi, w_gran))\n",
|
|
"all_w = np.dstack((x, y))[0]\n",
|
|
"if phi_dim \u003e 2:\n",
|
|
" all_w = np.concatenate([all_w, np.zeros([w_gran, phi_dim-2])], -1)\n",
|
|
"per_state_phi = sess.run(phi, feed_dict=eval_feed_dict)[0]\n",
|
|
"for i in range(w_gran):\n",
|
|
" eval_feed_dict[w_ph] = np.tile(all_w[i][np.newaxis, np.newaxis],\n",
|
|
" [1, num_states, 1])\n",
|
|
" per_state_q = sess.run(gpi_q, feed_dict=eval_feed_dict)[0]\n",
|
|
" max_value_img = np.mean(per_state_q, -1).reshape([grid_size, grid_size])\n",
|
|
" policy = np.argmax(per_state_q, -1)\n",
|
|
" state_visit = np.ones([num_states])\n",
|
|
" s = reset(size=1000)\n",
|
|
" for t in range(traj_len):\n",
|
|
" s = step(s, policy[s])\n",
|
|
" visit, count = np.unique(s, return_counts=True)\n",
|
|
" state_visit[visit] += count\n",
|
|
" clear_output(wait=True)\n",
|
|
" plt.figure(0)\n",
|
|
" plt.subplot(231)\n",
|
|
" plt.title('reward')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(np.dot(per_state_phi, all_w[i]).reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')\n",
|
|
" plt.subplot(232)\n",
|
|
" plt.title('max q value')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(max_value_img, interpolation='none', aspect='equal')\n",
|
|
" plt.subplot(233)\n",
|
|
" plt.title('log visitation')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(np.log(state_visit.reshape(\n",
|
|
" [grid_size, grid_size])), interpolation='none', aspect='equal')\n",
|
|
" plt.subplot(234)\n",
|
|
" plt.title('current w')\n",
|
|
" plt.plot([0, all_w[i, 0]], [0, all_w[i, 1]])\n",
|
|
" plt.xlim([-1, 1])\n",
|
|
" plt.ylim([-1, 1])\n",
|
|
" plt.subplot(235)\n",
|
|
" plt.title('policy')\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(policy.reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')\n",
|
|
" plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"cellView": "both",
|
|
"colab": {
|
|
"height": 571
|
|
},
|
|
"colab_type": "code",
|
|
"executionInfo": {
|
|
"elapsed": 7016,
|
|
"status": "ok",
|
|
"timestamp": 1582738554892,
|
|
"user": {
|
|
"displayName": "Steven Hansen",
|
|
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAdwCIvEbi7Cs-rjSAqUHjUTuBXdF5DAZmwS69Z=s64",
|
|
"userId": "12398999399819072329"
|
|
},
|
|
"user_tz": 0
|
|
},
|
|
"id": "79qku0qGWslw",
|
|
"outputId": "1f26c2a3-d81e-45d2-e269-b65ed8972d42"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAAEVCAYAAACsQV2IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXeUXVd59//c3u/0rmnSqBdLsi0j\nucjGGBdswBhIYloIhARIqHkhCcQhFPM6gUAgQCCUBBvjFww2toUt2bItVxWrd41mNL23O7f33x/P\nmf3dI42irMU9h99aPJ+1vLy1587cffbZZ5+n7eexFYvFIgmCIAimY/99D0AQBOEPBdlwBUEQLEI2\nXEEQBIuQDVcQBMEiZMMVBEGwCNlwBUEQLEI2XOEPnra2NnrmmWd+38MQ/gCQDVcQBMEiZMMVfi/k\ncrk/iO8UBB3ZcAXLaGtro/vuu4/WrVtHgUCA+vr66K677qKamhpqb2+nb33rW0RElEqlyOfz0cTE\nBBERffnLXyan00mzs7NERPT5z3+ePvGJTxAR0bZt22jDhg0UDoepubmZvvCFL6jv6+npIZvNRj/6\n0Y+opaWFXv/61xMR0f3330+tra1UVVVFX/nKVyycAeEPHdlwBUv5+c9/Ttu2baOpqSm688476bLL\nLqPBwUHauXMnffOb36Tt27eT1+ulK6+8knbt2kVERC+88AK1trbSyy+/rP69detWIiIKBAL005/+\nlGZmZmjbtm30ve99jx599NF537lr1y46efIkbd++nU6cOEEf/vCH6f7776ehoSGanJykgYEBaydB\n+INFNlzBUj72sY9Rc3MzHTt2jMbHx+mee+4ht9tNixcvpj//8z+nhx56iIiItm7dSrt27aJcLkdH\njhyhj33sY7Rr1y5KpVK0b98+uvbaa4mI6Prrr6e1a9eS3W6ndevW0Z/8yZ+ojXqOL3zhCxQIBMjn\n89HDDz9Mt99+O1133XXk8XjoS1/6Etnt8hgI1iArTbCU5uZmIiLq7e2loaEhKi8vV//de++9NDo6\nSkS84T7//PN04MABWrt2Ld100020a9cu2r17N3V0dFB1dTUREe3Zs4duuOEGqqmpobKyMvqP//gP\nZYo4/zuJiIaGhub9OxAIUFVVldmXLQhEJBuuYDE2m42IeBNsb2+nmZkZ9V80GqXf/va3RES0ZcsW\nOn36ND3yyCO0detWWrVqFfX19dG2bduUOYGI6O6776Y3v/nN1N/fT5FIhP7yL/+Szk+AN/edREQN\nDQ3U39+v/p1IJGhyctLMSxYEhWy4wu+FTZs2UTgcpvvuu4+SySTl83k6duwY7du3j4iI/H4/XX75\n5fSd73xHbbBbtmyh73//+/M23Gg0SpWVleT1emnv3r304IMP/o/f+/a3v52eeOIJeumllyiTydA9\n99xDhULBvAsVBA3ZcIXfCw6Hgx5//HE6dOgQtbe3U3V1NX3wgx+kSCSiPrN161bKZrO0adMm9e9o\nNErXXXed+sx3v/tduueeeygUCtEXv/hFeuc73/k/fu/q1avpO9/5Dt19993U0NBAFRUVtGjRInMu\nUhDOwyYJyAVBEKxBJFxBEASLkA1XEATBImTDFQRBsAjZcAVBECxCNlxBEASLkA1XEATBImTDFQRB\nsAjZcAVBECxCNlxBEASLkA1XEATBImTDFQRBsAjZcAVBECxCNlxBEASLkA1XEATBImTDFQRBsAjZ\ncAVBECxCNlxBEASLcJrxR5d87V9Vu24v14uKNThUX1H71mQNF5wId6OvZt+MatsnZ1U7vq6RiIgS\nH8XPX7v13tIM+jxuWfl3qm1LpPj71zSovpkOF8a1OUFERNcv6URfzq3ax3+5UrUbn5smIqLC4ZOq\n7+nCL0s17Hncsuwzqj3wZh77NX9yQPVdHcZ4Z/J+IiJ6dWaJ6nv5yDLVDnbjpvlH+J7lcYl04Aef\nKtGo57Pyc99Q7aIhHmRWJ1RfPolxufxZIiLKznhUn28AP68+llPtZBWvx1Q1Ckwe/7+fLNGo57Py\n87gG5ya+/z++7L9VX7TgVe0vnbudiIiGd6HsT93ejGpPL8ekR1bx9Xxgywuq7541j5dq2PNY/NBX\n8I9BHxERtf02rbrsqTzGtZTX0sRNKdX3z1f9SrV/O7VOtXd1LSUioiX/hnvz9O57SjTq+bQ98FXV\n9nTxnDtwCZTHsiHnet5j3thyCr9jxxh//tpVqu3v5r0g3IvaeHse+PSCYxAJVxAEwSJkwxUEQbAI\nU0wKOvH3cBXW2YgfnTNQx4tuVk9jWQyl4CxX7cBoWLXHNvL74dvLH9W+wRyTwqmPVKv2sgfiRETk\nmYSKlLgO480Zau2rg22qL5XU9O0m1OlMNQSJiMhZvqGk412IYtCn2pWnWN3e9euNqu/ptStUOz/N\n+pS/H6afqnGMu7wb1+7pHCUioulrmks84gupuWFItVM5nueW8LTqCzihbp+brSIiotHTjarPFcPf\nmm3FPYsb96RpA/6+WbRsw3gHrmQTxteHblZ9r56EGcffxeumfh90Xc84TCiNA1HVdqQqiYho78q2\n0g54Af77dT9W7Q888FEiIppcDVNIshZrJV3L5oVljeOq73QK5ri/rtup2pEs/43x2sUlHvGFPLX1\n26p92xir/OkqjPsvbnhWta/ws40zq9k/ZzXTT3oj+rdXsclwvBJ71cUQCVcQBMEizJFwC1qzyG/0\nUDiJL62A2NEQ4jf2UCPeDjF3pWqnqiFx0TL+Pa89W9LhLsSa9T2q3dPLb9+iNpSCGxfZ2jxBRETr\nKgdV35GpJtUedYdUe6aD286E6coFzazEnIZ6ef5zAU2TGMEbO3yO3721ByBNOeKQHm0x3D9y8GfL\njsF5aRZvrIdzcSjNms/7q19UfXUOjPGR0GoiIvrWMmhIhS5I+bkQpBlvM6+7co92XRaQO8hjO3UF\nnEw2F9ZSRSf3u188pvoKaUi7zoZ6/K0AS/RHT7bgC64t7XjnaHViXdReNUJERCMHMZa8B3Pb3M6S\n7adbt6u+jR6slWpHQLXn9oeRzdrDZRJLnFgLZcuniIjI5cDcT+Uwrht9fB/yRew1+zPYt444MOfJ\nOGslhRDu6cUQCVcQBMEiZMMVBEGwCFP0Wt8YYhtj3jIiInLUQXW7Y9lR1X5HxT4iIqpz4Ofvdr9X\ntYdHKlS7pYJjci9zm68GbijvV+2jSw31AZdFrYvHVHtOLR1JQYV/Qz3i936ZgIMstohVr6ILKphZ\nzLbhfVpwsdMyW67Ze7TrccV4PK6+CXQ6tdjpKNSpYqWhsjvNf1/r5iOfYT4IaX2LnEHVrnOx2hoO\nQf2dqtGcl3bMuc249rAFaylVH7igz6GNpZjGPKdDPKfhjjbVlz9xBp8NQC02tHFyzpqvjuvfsKZy\nmIiI+stqVJ8tg7UwPMnP/A8D16m++5p/o9qJItZSwQiuzoa0dWkSL6aw3aWz7LifjcKBT/Dr0d40\nr7H+bJXqy2o2xZ4E+gsx4284L/1Mi4QrCIJgEbLhCoIgWIQ5JgUtfjNdyXpPsQ4/H06VqXajk1W6\nFk01zBfwHnD5oD5mjX6vzXwPf4t7EmOo4BjUVQ2jqu+WGniRQw7++fap1aovkoPq11qBOMzjizgy\noFjQ9HmTSDbAa5rz89w1diA2Mp6Guh0fNiJDHJj7ota2hRFpkalj00k2ZP59GEwj4mA0zd87U8C4\nYwXEBzuIf55IaUd7BzFGm+ZEjtvYxBKr1s5zmkQmDFU01cjHQ1v9cdU3YcPzMPe85EMYl7MV8c6F\nACJLCoYmmwtf2jv+u5LQtOWuWY5Rtye1taJFKeSMCJyhGK6rMwvTYFYzUGQK3HYmzJf9jqYwj6lz\nvJ4LXox7KgPTzzPRNURElNbicHcOL1ftiVl81jvKn9EjNS6GSLiCIAgWYYqIEhxEbGS8kd/U8VlI\nJa8e71Dtpyo5QUqbC5KX24E3dn4AJ9RiHpZ2p/KIS0S0a2kJaU48u+HgGE/irVbphOH/Jh87Ed4V\nglR8MgPHzbNevBmHoyyFVfrwc7MItSDxz+woaxDrqxArvC4Ix+DXkm8gIqLOD2FGy5DbhvIQrMgQ\n6CldYb6U/vwQ1krB0HAecG9RfTeXwwF7MsUnzMqDmNtoFpK5A8Iw2dL8t0YT+LlZxBoh0QVq+eTl\nHfVHVN9oFGNIjLEkOL4ea62iE46dZDXaqWpel55K8x1/+9NYFwMzLLkG+yGvJeoh3eUN/9fwBCTc\nx6pwwrHeE1HtwQh/xhUxfy39v/7LVTvQx2N3pjDuk0ughs+dgJtM4T7o12MbxgMRMvznBdelr0Ek\nXEEQBIuQDVcQBMEiTDEpeA6cVe3GZBsREY2mNSPzFMT4Z1dzAhWnDblXhybgKPGOa2pLnvtfXAX1\n5o9LNObzeWB4s2pnB3nsI0O4hr8duwvj2vQEEREtdY+ovlQRauLjI8j/ORtnVcTpMN/R0RCGSWFu\nxlt9iLP9UBkStwyu3E9ERHtq21TfuSKOL+b8WtyokXCo6DY/djJ6HPGOnilW2R5fjHjnJ7yY22KS\nVXfPOFT4yh6M0ZHGNfgm+G+NxzRv7htLNOjzSGmJXRpDbIq6LYAjy5ev7VHtfwy+hYiIOhfV4g/Y\n4ECbWYG/Vd3B93JTbV9Jx7sQr0SXqnZiltdw/Qjmtqwb7aKD5zbWAMfxC0Ekp0mnteRV5/iZajiK\nXLNmMTiAlAHNvfx9/n44L0fcOKp8tILbBS1e3p2HyaD6CJ7fYBc/ZwWfFtN7EUTCFQRBsAjZcAVB\nECzCFJNCfgZeSEecIwoCI74FP3toJ3vw3ZqXsnxGy+o0A9F9ehmriv/ZjyODfwwndkk5+zRUoOaD\nHB2R8+L9NHol1Lwv7riTiIiu2AhTyqAWgxh7CqpKwPCKTrZoxz2RGrWkRNLwpMZmONqjPwW1ajoP\nD7/LCFLtn4Y5J1OPGGjHFNQlVxOrYc1V5mcLK8OpVvJEeIwFB5ZtshHrpqyT10fta1ATnZNo5zvP\nqbbtMjZl2fLmRylkaqAuNwX42WhxIvomS4gyqPLyePu6cO+yCFEnqkCEzt8s3UFERFu8g2Q227tR\nJso9wBFH/jFEI5EWgjpXCilyvdY3jeud+30ioqaXeW58u7UbbRL2GNaNM5Ez+rRMbElcRNJ4ZPXY\n2oJm9XDFsC/NlcuyeS4d0y0SriAIgkXIhisIgmARppgU7OtXqfbMKvYoR5Zgb0+2aAnEbSyyZ9sh\nome6YX5wJaAyzuWaHpk1Xw2sPYgx+l/r5YaWCNo7ibIoE+tY/TvdjQMOeo50b1TzLD/LHuV0h+Yd\n/9uSDPkCZl7Fd1SM8hgeTyFz2dhazOOhQY788D8L/TWgHRSIN+A+2Mf497rWXNor+7uSCWvB5Iau\nqld9tmX1n/P/8j5NdRzDYRQqYI3ZE3wvQ33mX4NrCuM5McH35Hgj1PF1bpiXuiMclTEvx76uricR\ngfH0NB8/vbbBfJOC3Y4ohLwxBHsa8+nYh6iLzNa1RETkH9KyoFVqsp3WTJfzZ9yaGdIs3E0wL0Xa\njXVegOnPrT2nmSq+XkdYS8Lfh30pG8C1eVfzc1/s6r3kGETCFQRBsAhTJNxoBySnkRv4LfiBq55X\nfbeGcKxxuVFepD+HN+jXliIg8tkaSMtzp23/dMmBko53IWKNmJqAn99shTo4nJI1kIyyhoBi0yQR\nvcZ9YETPQcsSmfvkQAlHuzCVp/C9oS4uKZMpwxt9XxKxzyGjxE7dS1Oqr3AMOX2rvHDi5DfyGz06\noDlC31OiQZ9HukL7hzF3Wa1UTlkHEgNNB1ibckfhlHGkWvHr2UWqnazgG5SoNV/CrTmA8Y618Jxl\ni5B1tiUwtxMzLHkFtJPfFWcg7gaGIVk9F+LY2J9osdWfxyWWlK0tXar9zGnWktz90B6KPlyDPWtI\nh1AIqbgIjsGglq94OsOJcCracZ/M4s6Ow6q9Y/vVRETknsEgJ9fgoXWEDfWuCA0qWwWv2chVuprF\njmZvxcKBAToi4QqCIFiEbLiCIAgWYSsWi+bXehEEQRBEwhUEQbAK2XAFQRAsQjZcQRAEi5ANVxAE\nwSJMicP94rE7VHuumGK1CyVp9s0g5m4iyXGH/WNawOUY4uGKWj7KUDPnnVxdg7yzD23+QYlGPZ+2\n+7+q2o4RHk/9HsS1xuoRDznbwf03X3tI9X269hnVPp5BbtNP7XsnERHVPoa4xd0PfrpUw55H2/e+\nptp1izlW8+6W11Tf1sBp1a438vPWOnDqaUcCMarPR5G85OFTHIeZH0bc4blPmHMNh/pQ+K/VyWvh\nutf+TPXFuxBXHD7LMZOJesROrrge8aPfav+Vas8VLb18/ztV38E3faVUw57HTfZ34B+b+BTWwBu0\nsjqLcZqpvonjipeWo+TUcALXOPgc5qN+L/+e7yhiup8c/HaJRj2ft738YdV+d/1uIiLy2hAfXOnA\n870jyteYyCMeejKLdfWBmhdUe1+Sk0SdjDeqvu9e/kCphj2PkUF8x9w6/4sB5L1+rhs5f327eX34\nxvHMR1sgn15z50HV/lIDP+vxAvaqJc3DC45BJFxBEASLkA1XEATBIkwxKazxQcWZNcq9Xu/vUX0f\nKscRu8MZFt0/V3ir6pv2IndmoQD1cOsizje7JYS8s2bhD2mVgb/DqpNDy505vh6lX5xNfFTxQ9W7\nVN8SF5LATBaQmCOf4Cmv2I3yNmZRdEEdyv6KzRrfXHWr6mu9A2rruFEJeS4vLhHRVB7X8Mo48gPb\nz7A6Fhw2P4T7QAplfu5PcIKdjfVYX89PQlWdWcVmnqIP1xDPQa0d0c5be22cyGS6G8e1zSJzy5Wq\n7evi47DNT+PnI5thXoif5OQ2+0JIPGTXjsj6JrUyQSfZtFYMabmVTeLIy1C3P0Pczjchu9GVi5G4\nJWNkt1kSxJHjGjdMDl/ug8nx5CAnnrV3acdiUVy3pNx66P2q/dWVjxAR0RvLj6u+HYnVql1s4HnO\nlEEmTVdhXR2falDtU9U8/w9Nvk71/QcsP/MQCVcQBMEiTJFwT6caLujz2vAGrHBAgrXbWApLpCGJ\npOJoF7N4Jxyf4b+bLmDYd5dgvAsRn9FSsRlFEBzdkErbHoFDqfO9LKE8HLlC9eXL9qv2t4aRjKdq\nN/9e0Qmnm2loAqh/nN/OsRi+9+O7MHvhapb4ZqcgLTm9SNbhPop71rSHRS73BNLdmcWOSUgdDV7W\nFA6NooiozakViTScfPl5mQAxCa8kIKXtKhrScFjPg2gOw1uwXuucnKwlUbvw/ddypSxIqgofiK/h\n58E9a/41hFAsg7zTPKexUTwjx46tUO25vDydOcx3vAXSYaBPK/JppA31j5p/DdGj0Ep/XHktERH1\nR1HhRM8+5R03kkzNahUf3FhYg0PQjH5WyY63nij+/sUQCVcQBMEiZMMVBEGwCFNMCs+OofJBpsDq\nQ6IAM8ESz6hqD2RYDE+k8HPXAJwbuQBE+u5z7EgYq9aq6kGLLyn2GUxNwYhRzU8iV6wzhDGUneY8\nrD8LwmjetwZxxfsHYUGvMLLK2wrmO5xsGbxPDQ2a/Jqvzqbdk4xR2K+2C+PKBmE2CYxAJfR2jfHf\nnDY/S38qj/uQN+SDeALrI3gE8cxuo/ho3guV9YwdsZdlHuRknU6zicTTd+nCf78r7nUotjnsYhU2\nW4b5JIfmCBvgOXfCx0TxNm3uR3Ft08uNzyZNeYzn4YphjO5ZHk95QjPnpDDGooPVcVcUZoLMCc1M\nqKvuY3xPHOcQW28WnmmYYw4PsVkqNYP1U3YE632u+oNu4glrvvrJEO7DywPsUI6PaM7LGxYeg0i4\ngiAIFiEbriAIgkWYooucG4O3LjfJIvuD41CxlzaMqXb/jKFiTcDjWX9EU7c1kT5ZySJ/dEm4pONd\nCP1IsVKNtNTBhRDG659g1WomjffXREozOQSgyuZ83F+MazVUTEKPR7UZrnubVu0n78H1BAZ4or0z\n+B3fFH7uSOIXizGOTsjPzpZ2wAuQ0OJoj06zecB5AqpbcBDjCvbyPEfbcG90s8r+HsT0GtV6qGzQ\nfNPO5sYe1T7o4ho4b2jEserxDOJw9zfwz5P7tTjvKsS7pjRVNmlE8Dgi5psUcn48iLZxnjPPJI4k\nkx0/dw3x8WT9GXF4NROd5u13RPna8hOI2TUL3SwSH2OTUsUxjKXiNAKeXREe16xWLiwbwDX6B7X7\nkOfP+CYvLb+KhCsIgmARprwancchgXiMl3N2EnGcXY5q1S708Ger8MKn8oOQgG05SFzuFTX89y1w\nEhS9mkTnuvC9lGrEmy8T4J97xvAGjC2FMyaTw9vQkzacZrZLBFyWAIcfcbR5D2saBSe+17cSBRiT\nGdZA7FmM1a1JBBTWykK7Weq0ecx3OE0lsW6yxjw6oDDMc2q4BvgUV+U5OGuK9nbVnrwMDpKCocGU\nn9WkNJP4UA1OIP63nYsXXh06o/pqHFHVvqXCkGwR1kpxzblZ0GSkX49uLPVQL0qyGhPtMSTqjLYm\n4nVo16V53dlnEKdtK2r3MYhr8NmNtgWFZ5yaUmlP8fXMOfiIiBxJPC+2kxx4HNqPX3KsQtHV2VXQ\n2IsOvvaybk19vAgi4QqCIFiEbLiCIAgWYY5JQVP5/CMsZmdnIbrPhKFeNBo5ZgO9CDzMn0EOU5sT\nQ/RPcBysvwmJPcyiuQVG/KFr+Ahl6zj0vFgjxpUu52vLVEKlKPdiEgbHcXzQZ+TULGuCWcUsbljS\nqdrPbuYcpY4UVLe/X7FTtb8UexMREU3VIhYx2I1rdGqneCNbWo2fX/oo4+/KikrEbOeMmO699ZjP\ngmbuCf8cSW3mcMeRe5kKUHtds4YZqH/6/F8pOT1Z3Gu7EYM6mYNTNaWZDG7187rz29HXl8Oz0aP9\n3t31e/j3i7hnZlGxFXGyY+vYnDbnECciuu0qHGXfWc3ZZ5xJOLf19ZPSlk2kjf9RV2u+eSTapjn+\nGvj5nHXgGjJaEqDWbp5ne0EzE2hmwLh+NNt4pBzpS5tFRMIVBEGwCNlwBUEQLMIUk0K0A96+nJ+/\nIu/VYlh9ENOHruE9f8mINpTNl6Gd10T6OHuUdc+iWWys7lftx+o5l2yiDSqSVj2EspvZy/zzK36s\n+pY64Sn/YdVa1f7xmZuJiCjeoh1PNol/aNiu2gc6+ChjUsvKVuNEHO2erf9OREQ/iaxTfYktiELY\nMQxzytghNunMLEXpF7O4ufL4BX0nl8KkFM/AWzz1Z5y1Sb83CZzsJd8KHLFNnOWx52oQbWIWn913\nl2oXJnhOdzRhPt/QhhCdr3XdRETzSyGdTtSr9vZOlDpqq+OojHXlgyUe8YW8tO7Xqv1onNfu3hhy\nJK/2Ywwf+7NniYjop9M46l7nwlrb6EPqsa8P8PNwcKVm+jGJuqtxrv2uJi6R8/LMEtW3bx+iEHo/\n0EFERBVnECWVqIF8mn8jTFH5DO9dU3TptSQSriAIgkXIhisIgmARppgU3rLpgGq/MsKB5yEPjs05\ntfOlc4Htne/Xqq+egNe1vBPmick1LLL7LSjtEslqx0OzbMKwaR7LMi24PufiMfZn4X5d7ETVzkoH\nXLSpJv692IT5nuVTmrodifI8F7WSRT8fg8rX1vgkERE5tITd+pFTh5bhKVvN15ALmp9E/WZ/n2on\njOD4bdWIXNhfxDWmjOD8VKVmvtLKwNT7ETmyZjN73U/0QUU3i8Zf4F57J3g8iXp4xJ9dihI8c9P/\nswGUQkqXa3JRK65t9kk+BvzY2kWq7xsbSjLk/5FUga+n1r3w0e6QsVbeXIZ9oN6B5z+rPb4fa+JI\nmefKzL8Pf932rGrfFeSx3xw8ofo+k3ubah/u4gx/qVUwKfgDuIbmMmTK+9vW3xIR0efL7rzkGETC\nFQRBsAhTJNw2L2JYdyTZOTAxAWlpy9Ju1XbYWWqcyOuxlfhbI1dBisoF+LPxdi2XqEmsCCDu8GA3\nO738r55e+MNr+O18n+tm1XW25ZBqT+UgzdiTfD2+qUsfA/xdOZhsU+3KHSyxu+L43v2rVqn27Yu4\nHIpzCkvCOwFpWKu/SCFDULSbfyqWIlre4KfiPM+vvQCHU+VJLZfsuKE9NGEBTYTRvnwVpOV6D0so\ne5u1M7Qm4ZmCNuSc5qOi+RbEf/pHcA1OI07aOwXNzjuF+1BzAJNuz/G9rDilfdnflGbM5/PTWcQS\nf3E/F4EsjmNR6EesPx/gsdvc2vH4PD7Q2ACHU5WP52MsDifyl+BjLilHkshLfaWXY5i/P3Gd6jsz\nXqPajkleNwU/9p+UHfdpfRtivpscHCf9jkWQ6C+GSLiCIAgWIRuuIAiCRdiKRQvS9AiCIAgi4QqC\nIFiFbLiCIAgWIRuuIAiCRciGKwiCYBGmxOGu/sw3VNsTYZ+cfxyxs94x7dRJmDONpCoQ7xZZgvdA\nQCvylzHyzpadQ4ziS7/+P6Ua9jxuvOFe1R69gmNYi9cg+UlVAKU3FgW5v9qj5S2N4dTZiZeR5CPU\nw/+v2Y9TOjv2faEkYz6fDds+p9ofX8qnbOqdOCGzM7patX/54lVERFR9AHOvx+wO34FY0jtXc4zx\nzWVHVd8ti3Fip5S0/uBfVLviEK+R+geR0EYvZOmo4TjK9FoUixy6FrGiOR/WUtFYboFBxIce/ddP\nlmjU82n796+p9u1bOFbzW437VF+2iGfjFzFOlLR9CvdmT1+bans9uA9zuXX1Ek4n7/xCaQZ9Hm33\nf1W1nUM8p21P4OSeqwsnK4s5fj7zi5E5qP8mrRhjGPchV8PXEz6qFQv9ujn34bKPYV+aS3CUuhKn\nQD1ezO0NzZxL2udA367hDtVO/7ZWtX3j/Jzoz8uLjy28L4mEKwiCYBGy4QqCIFiEKSaF4I1ILhI3\n8q9ODkOlqDqAEjtzx0O9M1CrynDylybXQOXL1vGHo4vNT5rS9TaoomXGid7YGSTYyV6GpCgHhjh5\nSLoPxxOdSYzbmULbHWW1Y3ap+XlYPT+rVO0n/opzDHcExlXfw88heU1ZF797/aNaxVutwm/Fy5iP\nRwqcIWVfA3KY3gKrSUmxBzGemdU8HufboG5Xv4y1lm3k+zOxFmPV8zA7FsPk43LxesvEcaTcLNzT\nWK+Pv8ZzN7YW9//aCpRC2jmTQkOLAAAgAElEQVTBR40PnmpTffaEdrw0qpWJMS5NV9HNor0Jx/Wz\n9Tyes37kJV78aJNqF41SNOkKbC9uFCam3Fqo8Zc18P07EkV1ZbPY9N6Dqr3zBX4eXE6YAb6+9peq\nHS2wGfEb3W9QfRPTuGfFxfi9dBk/OylYGS6KSLiCIAgWYYqE+9ZFR1S71c1vxsdq1qu+oSWQFAcn\nWMJwueEIS0Yhody6Bg6S1QHOKt+TMr8A47r1yEp/PMXiW9VaSIcNAThrZpOciETLOkn2DCQR3VmT\nqOV3nHfafKkk2Aunxv7XODnNoTqk8tPHW3OInYC2V+EIc7Yh2YcjjTmfWc6JPfqTSPZhFno6yerF\nXEQ0ewrfO30lxIroXIHO65F4qFkr5nlt1VnVHkzzujseaijxiC+kqCU98ffyIzfUjmfgsRQqnJw9\nwveneRdujl7Bwp69ULKy5c2vgBJywdH91kUsKX554k2q79wdeGadcR5PYQnm3u/H7392+XOqvdTD\n9+rxkPl5JT9c87xqv9rRRkREH1n2gupb5UZSHQdx+zdlkOzHNAk3G4RGns3+7+dfJFxBEASLkA1X\nEATBIkwxKdygZVFfZTgn2lwQzV9JLFXtl7xcxM2vFV1s80+q9qZAl2qvdY8REdGUT9OxTOJtdftV\ne3A1q39X18GbZ9cqIBzo5rjPsh68v3Srh+5AyxtpUNNl5quBeR9uryPB35eNIz9sxVmMwZ7g+bf5\nkKc1192D329GZQXPFM+/I23++9ru0NRxF49xuEGL4wxgDPEWNku9tR5OqOuCSBZb7kDs9JCXr6fC\nhT6zyGNKyW4s89EZqKeZKNZzeSdfT2gfcveSVmmkUAMnn6eKnc/2lPn5oVsCU6q9ws0xt2sWoSjj\n4QxMVZkQX8PyepjgrquGOed6P9p1Dl6jI0HNU24BlUb1j7wmc9Y4YBbZk+bn5NQUHINFLemvTVv7\nc47/XNmlc1yLhCsIgmARsuEKgiBYhCkmhUQBonnQKKGz2IXYuy4XjpdeV8Xq39EoVBK9hv1UHrGt\nNQ5WawJ2mB/MYrUH6tLSClaNbis/rPryRbyrdlXzkb9CCtft0uMlNU0ja1xO1oJXXd6LL8kbkRLO\nKZgUfFNQze0xVrGKdvyOswlHM3NJRJE4DS3cZkEm5XzmwokqaBalghaS7SjjdbHIDfX3Rh+84w4b\nrv2cnb3jg1mYSsyi4NdMAim+nmxKe/RyuEbvNH82PwGzWjGNa7BH8Gy48xxFUnSYb56a0Yqqpoo8\nj6n8wtfgDPB98DqwZjb6e7Tfx00L2tne4rWZ/0xPFhD/Px7lsldZbSwebX3M5PmzUxGUx/Icw+87\nsZ0RGdOfC176oRYJVxAEwSJMkXCPphC/2ehkB9qhNKSl34wjJrfVz9JIux9OteEMYhRJk2ayRePt\nb0GRinKtQqLTzk6JkRwcFu8KQQL5bT3H7O58E96Qye6waucDkHDsSSN20vwakpSswu0thFmCsPsg\ndSR68MYuM04HUVY7aZZAHGUuiBsxV+TTab6/iUiLMU3nWRqxaT6icA8mcqSVB7ZjAsUxt/jhdNXJ\nFt3G/80/tVj0YsAFF99/pwf3oXURnEsTR/jZKVuDRCn2k4gJt7VBEyz4+HptGfwtsxhO4JnsybJH\neDQKx5//nLb2G/gaT7sQI/2EH8/8FSFcT6WdnWW9GZxaNItfTaEcfWKUJdcHveh7XxjO/miBk0+1\n1+E5HzyhnZDV1qAtz/uRI3lpTUMkXEEQBIuQDVcQBMEiTDEp/NvhG1T7x4HNRERU0GLY7M/AUXGg\nlcXxgheqYagZjoEKP9Ta7eOsKpa70fcgNKySsjsFFac7wirUdkLSFAfhCOyhSR5ELrewemrTjv7N\nqcOOtPmOjumVaC9rYyfR+soB1Xe8Ecdah3NtREQUGkTCG88knDXDV8MhmGxhs4NzypTlMw/PIEwZ\nIwUeWyCCuavcgzyss21stjpoa1N9u6qWq3YkD8dPJMftwaT5yWsWt46p9lCYVfPWKjj2vr74YdW+\ns+VTREQ0noNJqjaN/L6RlVDt8x6eB9+4+SaFs51YK99NbSUiopkhjLHjBdiXYi3sCEtWw+TwggvZ\njUaq0L/Dzs/U6Skc1/64tm5LyTNdy1S74gg/q7EhfO+N+fer9swMmxxsk1h/VQMwZYZ78Ww4Y4aT\ncBoOtoshEq4gCIJFyIYrCIJgEabohI2/gBgebWLPXlE73ugfhYuv4f+xlzK5ESq8La97A6EGDq7m\nP9KLLqLXkSl8s/NG1Z45zh7LkUVQ5xq8MHv0DvLP7dPw1LriWi5ZnBKmVAW/43L6NZhE5Xp4vz/U\nzFmRrvVBBf+X4jWqffK6eiIisj2HGxVpw/UErkIUyftaOVvUnum20g54AaqPYK1Mp3g8Zd0wPxXj\nUGVbf82qe+f7oSZ+49lb8Fmf5lo2oh/0XLO0uTRjPp/3LXpFtZ/yrSUiousrT6u+Ru348jtveYmI\niH7xJO5NTDtWnffjswUPt10R3CezqNmNeZqeZRNbaETL+RxFwtvwg1yCyfXWTaov/SuYbk434HrS\n5XwNvnHNxIYkZCWl2AOVv+wcmwEcaczdVAT7Dk3zHlZ2Rs9rjbl37cGR8WKWTTplyUsnhRYJVxAE\nwSJkwxUEQbAIU0wKzhhUN0eKVRE3NHAKDKA8TX6c1V7P8/iA3Q/RvqBV/qwycpE7kuZ7ZSNHUXW3\n6hirEskh2AEe6Yf+GZxgtaN+D6InnFF4MdO12gGDTu7PBc1XA71OzFPeOH9Y64Ba9dZy2DoesXMS\n7FiLljhdO7BRbUf7Cj+bgZZ7YZ4wi4JW5qewwJTZ/LgnBSOLnHcCvxP3LRwN4ojyuvRMmi9z9GWQ\nOm4ozmap4SBU7Be11HI9CV53Bbemvqa0I9r6oR/jMEvGb/415BGkosZm05LDU14bl53n1jeE5yHf\nimfAlod5wmlksQsOmn8SqOjUzDFunjNHVpvnbqyluaPw2vknKjuFPWrOjMBt/pCtW8vwdhFEwhUE\nQbAIUyTc2CI4zabW85vLkbRrP4eUFW5jr5cjgzdNrBFvwIWkGivehvoxvXA3O2a807guex4DCw6x\nRO86ipye+Rkk6PFWwElgq2AJx34acZhmMXCkXrVfqODihIXiGdX30AicGs5OlkACg1pCGy1+eMIG\nKeyp+nVERNTgxjWaxVzZHCIi3xV8zHKkHPOZCUADSlfyePOvgyTyVyvgsJorq0NE9Nwg52Se6TU/\nDvc3fetUO7aX5/Gn5bg3P629SrXdnSxltb4EDcnbDYdlbA3ys45fxg7Oovnh0JSow1roWNtPRESd\nLhSOHI/jnvg7Liciokg7BhbbCGm3rAyOzlyGn6NpQkyvWRRqIa66Zw0pPYcxZjfis0XDIenU4uXn\nimMSEdm1I9Y0zc+BLaA53S6CSLiCIAgWIRuuIAiCRdiKRQtSbwmCIAgi4QqCIFiFbLiCIAgWIRuu\nIAiCRciGKwiCYBGmRPC9cdM/qXa8hWNuJ9Yhtra4Coku3rtiLxER/X01knlM5xGnd91rH1TtwMMc\nq1fxKHLRbo/+V4lGPZ83Pv8J1f7rlp1ERPRCdIXq+/VJlAypfYSP4ZTvHlR92UU4qdb5PhzT+ex1\n24iIKOTAabv3LN1dqmHP44r3/6tqT2zi2GU9gUugHLGRLgf339V+SPXdGjqi2tuja1X7hwc4sUrH\n93Ha5pmXP1+qYc9j03u+rtrRVpYPPvLux1XfEjdyzbY6p4mI6HsTW1XfU09fodqNL2mng+wcUzmy\nCeuy83OfKtWw53H37j9X7WvKuWhqZxLxtI93rlHtyic4lrPyMZR7KSSxVvr/Btez5a1c1PTfmp5T\nfcHG3lINex4d/4y1lC3ntVK9B3Onl4wKDvMJuNlmxKpPbkbppqtXnVXt4QQ/0wN7ENPb+Xfm3Ifd\nvW2q3ebkmNyrX/yo6vMeRBxt03Mcy11w4Rp7b8fP7759l2r/Yw3fq48MIpPWf1x+/4JjEAlXEATB\nIkyRcM+9FRndF3+ZU/mFTiFrfefn8aZ4ehRS4xzTOfw8k8EQ6wb5rVTMmZ9LYfC3SBdZ/hGWuG8M\nHVd923dvUe3AEP88Pzyi+vQDcuVHce2PLeecBdXemOp7T2mGfAF6XoSOn7GUlGhE+sWRq3C6J2mk\nCLw/hdNn28KocJEv4N1cto8ldtvuAyUe8YVMaKd/Ck4Wo7aNQtr+9uJfqPZclY7Hj+Jkl39WOylk\n1/JEeI0z/OtRJNAsTvwUJQw+/JlniYholRfa0JNHIRm54oYG4sN9cpThPlV0QkM5Oc1S8pMVOAX4\njhKN+Xzq9kKEjdex1BcYxXPoex7Phi3AWm2sAYUwvf04pfmqpx1/eJzXUvszOFlHf1eaMZ/PvX23\nq/bftzxBRETvX/Oq6vvFbqRknV0S5IaWLsKunTrrSmDOJ/JcM/3lQe26Ll94DCLhCoIgWIQpEq59\nOaS34uolREQUawmqPu9B2EUGN7JktaMIKUCvf5adQAYf1xSfWS5kzZdwfeM4D/LzSc4Mli5gumY3\n4o1c/zLbp3TJu+iBjKtnWmoLcg6F2ayWkd0kUnWQhjIVLGHkXZjbcuRQpoKb+1OTuE8jLRi4LYd3\nc5ORO4IsODPjaYO9P9XHmtM7G15Tfdrl0HiOf+4chzQVnJcbAu1sFa/BmU7UcDOLqpOwwX6+604i\nIgq5sX6Si3HG3/MyS5L5MSSPd1RhjPo1kI3bL0ZRq8ssCdelZQC0V/Ja8J9Bjod8An4XMtrO9BL8\nXFvuxTzW0lwSumiz9pCYxLFB1GUbb+K1omvYkZV4ft0RXh/ZABZYuhZzEHTinkULfB821qNe4MUQ\nCVcQBMEiZMMVBEGwCFNMCi2V06o9eVkzEREVtdJR6SotEfAgmwyGz2qpzZbFVdMzil/MB1ntcLWa\nVBtdI1mjJb42LOeVbozLpTkB8kaolbsdjjY9lZtuUhhLscp+ZhJ1t8yivGUG37uew9RcsPaQf1wr\nTX+K1V5HFOrvwC1QZYu682DOpGNbOLl3KbHbLzRbDGQwLm/gnGpHDGerHqKkq+C2HH7gSBsJpnPm\nX4Mti+/tHeL7UF6BteTvwlrKlPHc+q5EqBidQqhXVks2PjXDavGzyaX47IbSjPl89BCveBPPWWIZ\nHEfe3sELfmdujonmJ5KfM4UQEeUr+HqzfvMT8judMAmkCjznTi2xfqgT26HbcF7mPZhvZwztpJae\n9UCaU4QeHkOq0IshEq4gCIJFyIYrCIJgEaaYFNZXwlv3RB3HoKZqIboH2lEpIDbDaqCrG3p3KgYV\ny1GG34s1s/khnDW/4oP+Kqpxs6f8pXF4XX1jWvb3OVVVU7GTS3DSzDMDFWo4zjGVuZxmYzGJy+tw\nH3Y2cGWDrKYW5TT11DvJS8E5Cu95QRtiUZuPZLURh1lmQZZ+vW6WMY1B7ZSex4aBuWysBjoSWiTG\nCZhV7FGcrCO7oQ4vVFKkxDgSOGVVzPL3RbpQIaGuC+vZO87zX3RoE96EU2neKXjSs2P8POQrzV9L\nyVrMaaqVPfSxQcxdYBEiAIouXkvpMK5h0WWof9cYwPM/lebnv+8czHFmoT9zvUadubOdGHdTH0wO\n/kFeY1mtvuLcCTsioiPj+L0GD1/PzAwq2VwMkXAFQRAswhQJ9+og6mY9EuIYVr1i5h8vxgmlrgQ7\nj+JLIdXqcbhjCZxam+5jo3Teg1hRs9AdXWUOloxWlo2qvpeLcNw5pjnusDgFZ6GvF2//SDucC3Ok\nYubHHd5VhXjV5yvZsZJzYp49mnNyIse11pwdeHOnaiB5uRbhs8kM35NCR3OJR3whiWnEYbsNyfXA\nLE7ufaKiR7XLnMZ9WIPY3eR+Lf5bd8AaVVstETkKF2pkhXJIvZ6IJqWf4zWWG8Fa0yv1et2IV3ck\nWWspjJq/llKroR201XEsed8qrJWyc1jjBRdfT6oKz3GLD97aN1cjX8e+GJ/OOt2EXApmUcjg/k/l\nLpRGXVFIsM5ulsir+7V4ehfW3aS9TLVPlbEG4uq/9H0QCVcQBMEiZMMVBEGwCFNMCmE7nBq5JsMJ\nE4ForienWRZg1anCCZV1MAOHwrkZOJ+ii1k1y42Y/57IlEMNtBuBnbdWHFZ9T161SrWrD7OK7c5A\nTcwHoF7MrMLfChoxiFZUkrvFDwfY3av3ERHRb/uRkOamJpztfWiQTT/6K9hZiftYXw41vW+t4fgZ\nMN+045zAugkZ4aivdMN5+bNKJE15dYb7deeILafF4WahMrojfK9cs+bXGE81aPNkJAlqbpxSXYPX\noWR6W8RQT7UFUohCHZ9cj7LuyvJmfigxrVyExEwfbHqRiIh+6LpW9Z1Jt13wO9k6HH+9tfqYav9x\nCKa3NxvPf+eq2pKN9WJ4g3ge5sxP4Xqs68hizK17O9J+qr44TGh2P5yXZ6fYnOIbufSNEAlXEATB\nImTDFQRBsAhT9KlfTyMZpLuXVWtHSsslGYNH0xViNe+d4YOqr1+LQvh5FBnuPZP8fijA0W4a+TKo\nDKs8fGxxowcxnX5NPYk3cjyq+xx+x5bRModpERqba/koaixt/kWcy0IV7YpfeJQ4poViVLWzmre5\nHkdlgw5c44lZeKT7DbNItMX897UdVgByxfl781GYGUaz8BZnjMDh4G4tdjKkxVaehtkqV89e6qIF\nIsf4BtzrzctOEhHR1RWoevC1nltUe3Itj71OyzBmr4SJbWY5/m77Ro6zHo2ab9qZTiFaZDLH36dH\nE+lH950x7r9ieZfqG85CXc8WcQy4QGxuWx5CVIZZVIdw/6/08To/WofoiANhzDNt4pzLBR+2SD3T\nns+vZXgzjgxn/hfh0CLhCoIgWIRsuIIgCBZhiknh8b1IWdRmJOd2RyCCn4sgu9Hx61hVfSh5peqz\nOeDVL8ShPjYcZDU9EzT/PeHUvJABO6vW1Q4ES29q6FPtEw7O7JRrRBareLOW/YxgUljiZe9nf5Wm\nvpjEh7v+SLU7D7OH1TuGudtJMO1kynmMz7yKvmQz5qCmGZ5lxyBnk3bPmh9qYdNMCnPTaNMyfPWk\nEMUynmRVVz+0MndEk4iI0liD7mm+p55p80078Q5871zQv+6pz17ztGp/f+g2IiIaeweiYLS895T3\naQeIGjnyZCKHw0FmMXICUQT/WeAioqP9WMNlA7gnzgSP8bUXkdw7tQUXMVyOAznPJhYTEdFU5tLH\nYn9X5sx5RESbvXz/z5TDtPNKNSJ4UnVsQklUw04QQZ53qvTC3PanbVym5587UMLnYoiEKwiCYBGm\nByF6X+QSwgWtBEddHkUAxw0DPF1EWPJqiV8CJ9mw7uvpxwd+VqKBnofzNCRU12YWs05mIC2dmsEb\nf04KK7oWtprbsnj7u20sNTb7pxf8bCnpHoP017SLtYbQYSQRIa38tkq844ZGkVyOpCkziyH5ho1w\n47qntJLc3ynBgBdAl2b9YywpOmILS6V2w5nnimHNOM8OqXZuHGVrnEaRRkfafIeT7xzG2/z6uaKV\nkHXSWgKdjJGsyZnUytBAQKaCpnm5jLV0ZxhHZc3Cr8W+Zzp4nduy6Ks4rWkPhjabqsbc9s9CGv7S\n8M2qHXCypPjcaU18RB3TktKfwBicxNfwxBgKjrojWGuOJD/UNi2DU7YC6tatTShjf3vwNBER3d9x\n1SXHIBKuIAiCRciGKwiCYBG2YtGKQ6aCIAiCSLiCIAgWIRuuIAiCRciGKwiCYBGy4QqCIFiEbLiC\nIAgWYcrBh8UPfUW179n4BBERjeaQ1WnHKI4tDrxgHDlFTDolmhA40b4ZR2jvqD9CREQP9uEY8Ktv\nvK9Eo57P6t/8o2rPVY5178Q1VB/BQQ7nwU4iIrJ5caZ04g6kdZrYoB3tXcOZkvRqob0f+j+lGvY8\n7t7956q9t5erotY/hDEGT0zgw8bBh9l1OOAweCsCvb1hHGWsCXMWsqnncA0n7v1kiUY9n47/+6+q\n7TKyUCXrcPTbkdYORgxzu+EFVIUt7keCctsVa1R78HrO8Pb29zyv+v5p7W9KNOr53N/5OtV+V4gP\nPjwURRD+09M4UvrsUa5ZZtMOPrjqUE/svo2/Vu2rPJwU/IHZy1TfZ1c9Vaphz6Ptga+q9p+tf4WI\niBJ5HOjIaunCnunntR/w4DDE8nIk9P6j6j2q/ZpxtPeHB65RfT3v/dtSDXse193xz6o9uZoPm9i3\nLHwAKdbDz3oNTiFTxRFkC0zX4ijy9Ap+phLXIjtf5zv+YcG/KxKuIAiCRZgi4foO4ljsg/V83K3a\nq5XQeR6lKirOsLQSGIIElRzDm7PbgUqZ317MyWGyA1qiizeWaNDnkUpiDO9evZeIiB5zQ0KyHUJ+\nUFsDH/O15SARBodQbmd8E95rLQF+o3YHL6zkW2r+qn6nan/ffj0REb38x4tVn28PSrvMJUjJzTvp\niuu5aymOj14R4CQgn+y+u2RjvRgtO7AuYp+ZJSKi7CzWV9l2rAVvhMdbdGC+nYvbVLs4C0mx6GAJ\nt84Fadgs7j2GfLfPNLHG1uabVH1HJhpV2+bi56GYX7hcy0+HN6v24TLWlu4/jrOwn111wa+UBP8J\nr2o/2Pl6IiJK1WJ9FN1aSao4S7szYRxDnoziPunXOzHAeXIbntdkv/eWaNDn4X8Z1cT7b2JNojCC\nxD/VeyGlt/axdO47iaPw+TFohJ4uHMeusPPfim65tPwqEq4gCIJFmCLh2vFio54JlkpHPXiT6G/G\n4E5OoOI6h4zveQ+ysDtjsDnOvUPtOfOr5hW1bPabA2yjfcq5UvWd/SNIuDWvscSVqsTvpKpht716\n/UnV/mzDdiIiWh1EUhWivy/NoM8jVcRb+G/qdxARUefMu1TfxBZIJXO5ay5vQmKgJQEY1j9RuU+1\ns0amobdt0gxcJuGahlQ62mukv9Ru/ywEdrKdZfnBUQNpzFbAfUhX457FF7MGolciMItUL9b+K7l2\nIiLa54LmFo9gvIFTvN69Uxh3ZAmkw4PT7ap9qtpILjSM3zcLrcarSg7kikIitGvlDoLDxvNtQ9/k\nKsxBzI52uSE0hnpg/zSNaqRP9Q/xWok3Y55jzVhY5WcMbSmOCy9mYZO2ty1S7clVrA3nZ0XCFQRB\n+P8NsuEKgiBYhCkmhVgrVNWOKnYSuRwwI2QHINo7J1lkz41CffXUImTGkYJJIZVg0T0wYb5JobEa\nISAr3HwNNzbA6P5gN5xeiQZ+byVrNRW9EblmrypDpvklTlZrK53mq1AZLVQnZFRjbAzCSTQ2Aw+Z\ny8U/t9twDat9A6pd4YCjajjHY69wITTONPJQ+byjvFxTDXBIZisx3omNvC6KHqyPqv1QX3M+rQhg\nFTvggg4tJ7BJ2LV8yJkEm3kyaZgByo/iMQwO8X3wTkB99WpVKSZX4bPZCF9beWeJB7wAGUREUt6Y\nX63GKFWewj+8ZzhcrTCNZ8g1i+oP8QZcjyvJ989xbqSk412IxFI8s9kgrytPPdZwmrDGp5fzcxoM\nI0+vbxDPbLoan03W89+yabmKL4ZIuIIgCBYhG64gCIJFmGJSKJRB5VtTzt74/ZPwyupRDDQXM1mA\nySHRDDXQFYdKOZe5t/C/qP/+u5It4F3kN1z4wynoVfYEfp4znN9apRRa14T4vUge3nGHjX/Pb9f0\nMZM4nUa841COzTRHh9GXnYZam/Xy/E9VwSOe0i5oZxKT7iCOYT0VQxyvWdiyWCzZgKG6ebFWbJMY\nl62O59Tlxu9EW2A2KTqwlsp9/NnlHq3kkAXYEvzIBc4t4NUnotAxNq0VPVC77VW4D4FBXEOmjNdl\nYOTSquzvSroaphtnlL/XPwpTSd6D56E4GyUiooLm4c/7tPukpeAuOIy/kderhZpDugJjyHdw9Mvm\nRSgT9VKyQ7Ujy9mUac9hi8yE8fxnNfNUtpb3u8WN2snNiyASriAIgkWYIuFW10RVe7mfjeFzBf6I\niB5phGSUK2fpz9WK02fOhCbt1mOILh+/SYp2rQ62SWRyeBtGjVjOghYAGhhC26jlR7Yc3l/HBiBJ\nVnnwpo8U+M16Lo1S8WaxfRzHjmq8bPDP9kKCDQ1hvNkgz/OpqVbV982lYdXuqMTbe1mQz8XvH8Q9\nM4uiD5JePsDroqYa6yt+qka1E2GjuKG21gohraBkDPcs5GEJt9aBv2UWxQXEGr2Ue7IKHwjH2ImT\n7+xWfcE81kp2PQqDFo1HwzesBcmahK9Fm/NRXkN60dR0BaTwljFeF84pOJnybsz9bKumPY4YWkvI\n/GKe+vcuruP1fHcN8jocHEFs7ZxiPR7G/uMdQTunlatvapwiIqI31iHe/mKIhCsIgmARsuEKgiBY\nhCkmhY21OB56k59jV6/1nVV9s9fCWXPo0HoiIvKHoTqmKjUHzRrEjXZUseh+uk9LXmMSUyMwkP+o\nmROGjKeg9vhH4UTwTbBNIefD+2uwGjpjtBXtb05eTkREO0eQvvHvkJ2vpJzoRfrEOWtIqB9jbHpa\nM/IbiXdyNXBY9tyBeOl9VTAvvJZm50L4jOa9vKsUI74QW0KL7xzlY7j2NqhzuYCm2i3i9ZHMYllP\nzWJdZYK4Zx4H37OVbsS7mkXFSiSqqQmwmt1ZUav6khu1uOJjfFzXGcIaz1Ug5jPagvs3l3Ao79O8\ntSbxsZXPqfZEB6+RFybgZLqiEmlUf5O8loiInEnNyYRlRZlVOK6dXMJryDNrvgNWJ5blddHsRKzw\ntYtgxnEbnv0zs7hPJ+1IOVDThN+7qeEUERG9t+zgJb9XJFxBEASLkA1XEATBIkwxKdS44Z0st/Oe\nrh8N1X8e6WBdt+DS4t1CWhZ/D9St11XyEdmzbebnkg2dhJr2TBOr/9NRXEN1FqqsawdnzfJchmxi\nbU/gs4djOB54dAVHL2R7NK/sTSUa9Hl4O7U4W8Nb75vUjh+noE7nunuIiCi/6HLVV3MA15iqwP3x\nzHB/+SFk8TeLohf3oS3MQ/QAAB1RSURBVODk742nYSYoait49BCr43oESWVKy7q1XPNSB1nNT2jx\n3zhQXlq+suIR1S53cBTCSzUwKT0zjmOvpz7MqrX3dJ3qy1Tgni27vEe1ByOssg8VzBo5+FAZstud\nyXJUxGIP7r+emW7lW08TEdF4Emu8zo8oh9uqjqj27iibJZ7MrCvxiC9kbt0SEY1OsYnsxQTMIsk8\nruHJY2zn83XDHBjSgkEmsjC3tS/heWhwXjrSQiRcQRAEi5ANVxAEwSJMMSkcmEZA/G99rIo0u7SS\nIhF4+3xGkrDgIEwHkXaI9om01jaK1oUD5md40o/pOuys0hXyeD/lPRdmLLNPIKKiUA8vs10rl5LN\n8JS7I+ZnPEs2Y06dIW4nRmHqqHQiysC5iO9JohxLIh3Wj26iHW3hdvlBqGhmkQ/BLJI3gs3rw1BP\ny66GWnvgAKuHCZw5IftFghCOTXMEx1QN5qBp4Y/+zlzpwbqwz2V6D5xWfSfjiCYZNI6PJlbDjFAR\nRkarOh+u/b2NrxIR0b2EEj5m8Vgc6+ZIkk0g/SmYMrqjMPNNJfgw0/Q0VGxnE64nUYCaXufmrG3V\ni+D1Nws9o1minq/n0fr1qq81OKXann7eaypPwORUcOEZSGuHVe49cisREQXWowjpOy4yBpFwBUEQ\nLMIUCffUcUi429wcc6fHsPbsxxG6Ja/y29/eB0nFFYOs0deI+M9TNexIGB/VknOahSaA3t3C5WUe\nc6EcdX8rkvGErt1ARESzNXDmjGqFI93LIOG8rpHjFZ9PwmliFs1tiLOtNZwWJ4/CgRdZj2OxNiPv\nbGSJdlxzI5yby+qRr7hnih0Gwwk4dszCEYU207qeJZCnVz6u+g6lIbX8l/9qIiIaSKBszrFhSI+F\ncUhpBaOEUqPDfCn9N/E21T6X5jl/+Cwkq+Qgno1gL8+/dnKUZiuR/KjrSmgtvQGWKr0u85PX/GBw\nq2ofP8PPr68PaqB/GAMOjrJUGNB2l8l6PPP3rcc9CdXzukyd0Eod3VaaMZ+P+xDyUmffws/fOxr2\nq76DMRxrz4b5ehK1eI4DI5DSa1/D9Q75WZv9Se3Vqu8d8MXNQyRcQRAEi5ANVxAEwSJsxWLRfJ1K\nEARBEAlXEATBKmTDFQRBsAjZcAVBECxCNlxBEASLMCUOt/VH/6zawWrO+HD/+p+ovmoHYgkPZziW\n8B9OvEX12bYhMUQ2iIDYZC379z59x2Oq7yMrni/RqOfz1eMIBrw5eIyIiN5z6P2qLzamlao5zfGI\nyTr4HzdcfUa1f7F4p2qni3zt1xx8l+rbf9tXSjXseSSH21TbbrxbE0UcvdqTQozzY9MbiYjohcHF\nqi86giSmG1YhhvHNtYeJiOhPw4idttd3lmjU87n67V9TbUea4yB778Q8v37NKdX+eP0zREQ0lEOc\n9kd3363aoT2IZ605yKe3Bt6A2NzT93yyVMOex0f2v1u1D01yjPngINa4/yzit+cSrPgmtWKRATwD\nqSrttNPl/GxVliGryt5bvlqqYc/ji8fuUO0PlHOyJq8N8lpnDjG53x+9gYiITs0gl+xMHHP/rqWv\nqXarh2PFp3KIRf74ymdKNex5bNj2OdVO7uZ9p/EVxHm7h2ZV2zbLMei54RHV56xH3HnkmjbVHnkd\n35NNm3F68KHNP1hwDCLhCoIgWIRsuIIgCBZhikmh/DDUi9mrOFHFv44g6ettlUdV+0iCjwFHY1A5\nbO34W1WHcZyu6OD3w9zxSDP50bEtaBO3c2lMl36scS7RTa4MiS5G4lDXfxRB+ZDhLB9hzO7Qcvqa\ndJTxnrErVXtTgMuH3OrHcd8bfFCn6p27iIjIacc1TNVB3R5N4HrmeDmFe3NtCca7EHq11+BZPgba\n9CRMBuNLoYo+EmGzSKUTKnZLHRKSzORxZNw5y9duy+IazWJzGOWlPl3L5qWhZfjeTze8U7UnptmM\nkz2M50Gv+htvhznur9e+SEREHR6ovUTmmBT+6+hm1X6qiqtBz5WWIZo/53PMHZ8mIqoIoKzOo/3I\nfVvh5f7+aRzt/TjSSpeU2BFUPN5wG499TzPO4C7/EeY8X8PrKrsBaQriWgmt2RYcgS9bzs/UqtDw\nJccgEq4gCIJFmCLheqc0qXQvvzWOhpEzbzCOt1nfGDsPyp7F2yUwCikreFxzzOTYaP3wc69Tff+C\nfDIlpdgLCSQX5vEEz2kS7jicGp4IX69dK144UgaJ8AH7Vao9NstvTvPL/hE9egaSxKvlrDZ0NyHb\nfsgOCfdgjJPx7DiiVbTUXsfOCYz4vilOy1cTRnKbl9pKMuQLyGlpIW2DxlpYBgm3azucfAOv4/5Y\nAun/CgO4j20ncL3F0+wEbKixoCCp5hBqd3G70gGJ7werHlDtH06wrrDDhSoQ6QhSVLa14XnYGmAp\nrdUJqdcs7L0Yw8gQtx9Oehf8bLyP137ZGSyglKaUOpFtkiJGJRJXTMsW9bbfdbQL4x/EdyRy7Kh0\nRiCpDm8JXfA7sVbsZY4Mfj/XgLX0npbjRET0zjIkwrkYIuEKgiBYhGy4giAIFmGKSSEwhFhP7xSL\n7ANNyA4fbdGy+Cd5CLpzJHAGjo5iFMb4wCCL8cE+89XAokvL6WO09eoBVQeRod4eZfXQM43YymEP\nxti7AmoLxVg1r+yH2cQsbKcxhiEft783gvvg9CCPqtPJqpNuOiiDr4eyWmHPbIRVr5GQ+YUw/RMY\nY36S14V/EOrc2BWa08sw6eRSuAZvBDKFMw7V22ZUXsi7zZc5TiaQ/3W3j52XegxrVxb6dr1RAWFV\nPRxhx4v4fb0YY2eGTWx5gpkBka+lZV6FEqOZzsO0457RCndO8PNSeVKzHRTwPCUbtOffqKLgnbxI\naY4S4p2GeeDEoOHI1m5/ugpjzLbzGnvvuj2qb+cIcljXBxCzuynQRURErU7EU18MkXAFQRAsQjZc\nQRAEizDFpGBPQ1225ViMd0eg5iWn4UV2xnjPt+cgzhf7h1S7kEIJFZeXf8+12vzYybwP6gcZTb3E\nhj0CU0euh8vmOKvg5cyGcY3FFEwKdsPT6ZmxQIUah5rnivP8Fs5iXMlaqHZznmOHZv3QVcKCSy+g\nye1Yo/mxFrrKb/Pw2GOLMO5sBUwOQaPUTMqJ++RB7VJKNCESJjTAkTJ5n/kyx4FxlJdx2jjCJprD\nNcRzUEVjWb7G2bR2jRMY954oojJiHfzZrdU4Ro74ndJi0x4H96xx/BiWjHnPb8UJNnvYI1g/tgzM\nOY4oTF1Fj+OCz5qFb1IzTyV46/PG8Yy4p/HZ4nLewy7z96m+dC22S79DM5va+No8tks/DyLhCoIg\nWIQ5Em5Ge5P4+e2tlx0v+vFz2yz/XH+D2isQp1sYhLRLRnEKB4Re03CU4w1WNMqcpyq1EuJtOCnm\n6BskIiL76V7VF+xDPOt0Bd6icxKuM2q+hBvu0+bZmN+cV0t+Ug5xtryLPxs8jdd8/nS3ajs10dfT\nzDHV3uGF4zBLSVZL3GIvZydNTpNKg7VwIq2qHiUiolQF7tP+GCRCRxbXEKw0YnYbNJHeJCaPwin2\n3DJe70ktVjgfxcNhy/L1uqdxjZUQsijvwXhP+dlpNhiB8+qzq0o06PMpXtjWn+lkreY0O8BrKd/Z\nTQvhbEexxmKar6fQO1iacf4PuGa1Zy7La7dox4XV74HW2t3AUvg9HiTtaSmHo3wsDodx7WJ2oLU5\noWksvcgYRMIVBEGwCNlwBUEQLMIUk0KsDeJ20cGqRrYMNoPXr0TeyFeCfOR0xg1DevVhJJlwhNGf\nrmOnVKJeiwk0iTtXHFbtWiM28nuFrapvZgUcHcunlxERUd4HHSutmRHC9VB7k2X8e6laOELMItKO\n2+tMsuo0LxHKCthmqk6walf0aHpiAc5Pu3ZUmQwHiH0aJguzSFViwLkONmXktXDH+jDm9u8an+Tf\nKULtfv/k+/D7XsQgT1zBMdORlebHQ+vxzOkJNpd5tCcv3ItnYy6G3TWjHUO2aWYgbd14p1ktTtRq\nTmRowCUlcRmOIscMh5NNcwavWw/zwURnGxERBYI4Wu4cgPcysRzRwnPrMZAy38Tm7EfipvCZNiIi\n0nyX5DiH2GdXjJPaxLthrult14725nDtj41yfoGqRhx1F5OCIAjC7xnZcAVBECzCFJPC4I3w/Dni\nvKdXrxxXfcsCo6r9jg37iIjor3r+TPX13qpl7bGjnQmz6hVYrAXMmcRfVr2o2tWGh/7MCuS13Xka\nx/w6381qYqEWKnpjHdSTf1r6G9X+yShngzq43ix3Mlj+dphuzs2wmSalZTSr92K8dZ9lD+zph3Fd\nhTciJ3CyFmqvf4jvqWdad12bQ3wRviMxyJ79nH9hk9JqN6vbep7e93TsVe3vTt6g2u4RNp00dGBd\nmoUD1gEVLaJH5ejMHT8uHDqB33Fq8Z8tWkxvgk0kgSHzTWw/2vLfqr0nsYSIiMYyeDYrXIijHfrb\nCBERPf3cBtWX92kx0M04FjtrlHEKrWwp8YgvpBjXcvYay8oFK8C8eV70LH820gFzTf4EzAuJVViX\nPQ6+mT+hq1XfO5Bmdx4i4QqCIFiEbLiCIAgWYYpJwV8H0T0ZZzXw9Q0ICv5sFSq8DudYpr9x6yHV\nt/Ms1FpbH1QR1yL+u7e3Hi/xiC8kT1DTooa33qWVnynGMHVFp5FNzAk1Y10VDmyU2+Hh/XD9s0RE\n9Kdr2ko74AXQqwXPqdkB28LJql2Gjnvow7gPvxlfr9oHeqHyXXkN3799Iyg/YhauWe14cozn356B\nnJDNw1scKfA8OwhhDP0pZHCjgnaM08hulS+YL3OMbca6cVWmLvj5RAUicQpOjvCxd+CQbnBIO+kT\ngzd/fAM/GyELMs9drx91J86OZQ+gbyYP1bvayZEjE1twXZE0nuOC9my9yXiWn2o0qa6ORnoj9PzZ\nZRxhY9PKAOX/pE215woMTK3FM533a3OgWXH8Hr4ndtulTWwi4QqCIFiEKRJuYhxvtrkSFmcX43jj\n/jTe0iN5PiJ7bAo5P72H8bbUjdpRB7/9E0sunXfyd+XZ+DLVnitaqTsBFu3WEqRM8/VMrsZbfHsR\nb+x2HxwzrW6OBcylTJn6eUzn4cj45fR1RETUHcOR5OurzlzwO69M4yjsoX44aBqrZy747LuWvFaS\ncf6PaJKEb4Alp+nliNOeSmDOdyW5/3Qaa2nbyTWqXX5Iy/XbzZJ+f5NWzPOW0gz5fHSNb0MDH2E9\nNwvJ2315RLV76ng8rlGs8emVCBbNlOFIMJWztBxZb77c9Fgcz+S9nVz1dGwCsdlOF6TsbITH6J6A\n9uHUksQklkFi1wtNmk2iDvf/b67fRkRES91wbn938PWqncrz8/nxpt2qb4kL2XpeTGB/mOO24DHt\nX99ecAwi4QqCIFiEbLiCIAgWYSsWi+YHUwqCIAgi4QqCIFiFbLiCIAgWIRuuIAiCRciGKwiCYBGm\nBIOufOQLql0wTvLUPIB4yUAXklfYYxwrOr61SfVVvLdftdeU48RWLM/xfYe/dZnq2/vTT5do1PNZ\n8tBXVNt9jGMQm7cjXtJ2qke1Cwm+BpsTcX65qxH/GWlH7OTcyZWCdnKn9y/+T4lGPZ/Hu9eq9mSO\nY5h/PXo5xpJCbGU8w2Ov9iN2t86P+7SlrAu/Z/ytlyaXqL6ntv5bqYY9jw3bPqfaqVc5RrX5SdyH\nolZyJl1lFJlsxLKONyLOM9WglRwyStkU/Ygf7X3/Z0s17Hm8by8SMz1/iOOzV34Lcc35ExfGQ9vX\nrVDtnjsRs5tqQwxrdY0Rl3wKP+/+lDnPw2Uf+4ZqZ41014lF2gk6rSSQy4i5DQ5gjbtjWjuC+zC5\nimOMk0iRS2f+4ZOlGfR5xIZQ2uefxjcREdFTP0WCporTOIXpNmLrU3V4doeuxlpbcWWPat9ay/G3\nOydwzx695rsLjkEkXEEQBIuQDVcQBMEiTDEpvK4J1Wtf7uMSOqObII63zMC8UKxhtVavztp5CuaF\nm7ciL+jEnC5jQeRwQUt0svZNp4iIaE8Lkl8s/8821bYZJVDmldipRDui1dtoWTtMRPOTrpjF6VSj\nat/fxSpUbRBnpd+26KBq++2sQgXsWtkdBz47mUfZpDmTwunBuhKP+EJmuqAuz1lhYkswFn0tRNp5\nTrObUHanPIjEQe4M7knCqJpr6zG/1FGZC2NYu5JL8B7/UJvqa3sMZp5MGT+SkcWaqaQS6vjmZShl\nc2PlSSIi+vLY7aUd8AJE2zGGJesHiIgop9Vr6n8Nz6zDuNyyMzjSbE9AXU+040hwop5vYN0mHLE1\ni9cyOC69xMvHdJve3KP6zu6ByaHg4vnPV8D80diIEj1vr9+v2n8a5r+1bRQmvIshEq4gCIJFmCLh\n1nngbHn3Cq7o8OMRFGAc2gKpwmn4aBJXwVmzdTEcNB+tQNWCV1MslfziNkgEZlFIQ8K4toLTEe71\ntam+7ru0xB2GkyDZoqU+1A7wbViFKoIfbeL0jAGbXjTvvlIM+QIeH8Ybd2aKEwrNRjH3P5qFw6C5\nnJ04iSykgPYwCv8dHoO0PD3BWfpdY1rBSZMIn4FMUDCGFjoLCVYvsDjTwRn5Q35I6ZU+rKuzs0hU\nUxhlZ43NY766dDaKxE131rFWccwOaWp4Cxwz2TCPZ8kV0BKXhZE05YPVqEQSsrH0NbXpOe3bzHH8\nuVogra6vZAl3TkokIuqshKP74QP8fBZcqAgRHIKEPLkW96x9E//e5ZV9JR7xhfz70I2q/ZYaTkN6\nbgKJkLLVeH4dfp7b1Y2oTrO+fEC1yx1YV4fSvN6uqcK+dTFEwhUEQbAI2XAFQRAswhSTwpvKUDVg\nsWEz2LEc+WEnxpGvdK6YXi4CVXZVELG3HhvU1lYnmyoqyrRicBYwkWXVqKoKTqSJDEwOhTZWRd6y\nHPkw4zmoiTdVoP8aL+cwtVvwruvphSrrHuV5dMagzuU8MC+crDUqDaQwrj4HimaSHap3sJ+v3Tth\nvjpe3g01L+/lsdsGtcKPjZqZwFhCVX6sD72ig9MJtTZvYcqm2TTy2UaMygjFIGJYCzMYY66Kr/eq\nqh7Vd3UAcbrr3PhbsQKvpWbXVGkHvABLauAwWunj5/O2wDnVt08bw74WNpf0FrH+UjXYavL1MPms\nLGdn2Wr/YIlHfCGHBpou6EuPIhbdO45nOmVYfJxatc++ZIVqr/HBvDCXG/fQLPJHXwyRcAVBECxC\nNlxBEASLMMWkUK7FclY6PBf8PO/WCrP5DDVRi3vdGjil2mlN9WtxsvjvdJhfNM8+i6mZzvH3xlMw\ne9ijUD/8NWxqaPJMq766AI6fhu0oHOgk/j2Hzfx3nT2KawgbgRKBEajosSb8PNjH40rU4z44ET46\nj3APz793PL3wB0qIK5LR2vz//DhMCk4/VGx3hFW+sBvzrZdwaa7AcdqzA2xCccTNL/EyPou44UNh\nVjudWoTHXEFLIqJ0Na8Llw1rfIUb6ypRwBpMFPkzI7myEo/4QnKaaabZxdErtQ6U0nIRxnt5FUcc\n9A0hAqCgRYMUExduO3N/00zyIzAf7Evw+YDavbguRxrmg2iC53miEdeoxx1vn8bR/dEkmxzPjmrl\nmi6CSLiCIAgWYYqE69XezinjxZbK4ascKbzR5z5qT2Dvf3QGcbaravbibxHHxqWz5hdgdGuOjIFE\nOX9/AtJFzUFcw7iTY3IfoE2qb3UNTs4EnJDSltZvJyKijPa2XF2qQZ+HZwLf4ZviufOOQ2yNNutx\nkvxzPYFHNgQprODC9fqG2Cll74LjwCzsWa00vd0Ygx3aRa4PY/BNsFPk0Eso8BdcBWfOXPwwEZEn\nwnPjuLBqeclJTcI52R1iKcijSbU1h6ApFO2sEf7Ica3q698AZ02zF9LuSi87r16YxFHGT5Vq0Ocx\nmYCkN5Lj56Evp50ojV+l2jNZliQb6zHWIS0WmZyaA9bB1+4m87XWYA+eh1QNr+3gAJ5NzwA0IP8Y\naw2JPmTVObsa9+xkENdQKONnx39WK277zoXHIBKuIAiCRciGKwiCYBGm6OaH0jgG2uRktUI3AwQH\nIY4HhlmF9U5CfT10BeLZ9oSPq3ZXhpOlzPSXl3jEF1JxCgb0gxWctMaZgEpR/SzUqbybg/bSA1D9\nXtuI6wkFoLd+MvV2IiJqC8BJ8O8tpRr1fJLNSLwxk+L5t+XhOIhp31vReaFKZ89gDmz4U2Qzgljz\nM5Hzf6XkZMvgdM352ZQQbEIcdzGKY76ZoOGA1caqJwmyaU7EohFXXHCb7zTzDeJ7B4lNCpVTeAac\nzx1Q7cYEH8eODuA+7apA0qSwtpZ+lVtPREQzwzhmTteUaNDnMXMMDrB/inKynDd04Nj9k8dgGFOn\nrSN4BjxTkO3Smm/pV518DVP/X3t38xNXFcZx/DIwwwwdKAyZIh3AATrSYGxiNU1rQmyMRhP1D9CF\nbrSLunDp2j/AnYkrExNdujC60HTTRmusNrKwoYmNjYD0RajOMC90YF5w8dze34mEdCH3xMX3s7qZ\ndmDuC8+c55znnFNUl8UzxYP4xHs5PZ3RdPwedw/dDXU/9d6wabrDeXWFtDO6D9sjOp+e360rYfim\nM7V/H7RwAcATAi4AeBJLl8L711+OjufzttpO7ZbSnuyWmvGZn2164MZbc9FrNxaV676z8Xp0vNO0\nFCW3GP/3xPCiVkKqF2yKa7Lh1BI2ldqNfvxDEARB0H32yei11jWlwpWS6jCXira+61KiGL324ckD\n+tD/8saZ76Pjz/OWut3J6z60hpRjrb9r1Qv1NSc9zbr9CDr33Hc2gpvLaKujuGzOaOS3NWBpYKqs\nnDT1h1PDOmLHvce1Wl02rQqAkeNa+en2tXAt331qjQ9SdlXXrn0onBZdcVJZN6298ksQBEHQnT0d\nvZS+rOqK8oSepQdpcX7Zef+5A/nIe4xf0bNSDlee+6Y1H72WcLoPChetK2pgVd09iboudHdIVRsr\nr9iz9HXFWUs2psUAtwq6Tq2cPduVdf2dHnG7KkvWrVkrqGunrZLvoFFQd9vQb3Yf+u89vOSFFi4A\neELABQBPYulSqJXVDL/ZZ+lf5pZGi4d/UrF6+56N1hcuaSWuu2eUNtXHnJHlcEpg9q6T6sakOa2t\nXbbGLRVxp2A2n5qJjjNLlmvUh5RW3R/V+e46u+n0dOxnJDfjHx1/b1Rb6HTCiRYX0tpZtLalHOmF\nSRtxLpZUPbG6rWtw6baK69uv2gpwa+P697hUp3XcCffY6WsqJe2f0ApQjWl7Lt5+7Gr02rG0JqB8\nsaG+m8qx8J5V9KzGpTate707ZdeutqHfe7g0s+c9zVG1hRpOKtxJK5Vth8X3gyvxb9fU29RnSDyY\nK+B0I7iVIf1/22h9Ylmr/nXKmgTR65zvyK/WXdKoxr+Y/ckFVVXMZa176bPMKed/aHW8VljxUn9a\nXSGZAU2S6NbVFdEzZ7HrzyRTewHgfyOWFm4yo3q08UEbwFhpONHf2RYliDZg1Eepzunr8onJO9Fx\nJWzZ7AzGv3lhbULfuC+dtTrJ5YZadNfHNbCXXLA63NajGqCZn9KWI24taDew8/2rEX/LaiChAaev\nlm2xjfaPqhVuH1ar5cvWCXuPsz1Nwhkom81pPdTVqv2MyuTD6w7/q9YR/Y7kITuu3de123HqO7Nj\n9qw9P6j1h0/16z4OJy5Hxx80XwyCIAi2B+IfNdsu6pq++bhNVf+kqoLZ9bN6njv9YcvqtLZwOX/i\n2+j4aFItxYublq1c6NNCKnFxZqIHtVkbQDta0iJCHWeRoLWqnU8+p6woVdXf9E7Kab0/Ysfb8ZfW\nB8/ltCjWbMpauJ92NSW5PqlzaA1ZJjE1ptrc1yaUOS1ktG3W1abFgo/6tI3YfmjhAoAnBFwA8KRn\nd9ctAgQAxIUWLgB4QsAFAE8IuADgCQEXADwh4AKAJwRcAPCEgAsAnhBwAcATAi4AeELABQBPCLgA\n4AkBFwA8IeACgCcEXADwhIALAJ4QcAHAEwIuAHhCwAUATwi4AOAJARcAPCHgAoAnBFwA8ISACwCe\n/APi61tC3EKemAAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"\u003cFigure size 600x400 with 49 Axes\u003e"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAVwAAAEVCAYAAACsQV2IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJztvXmQJXd173nuzbvvta/dXb2rW7uE\nhNBmgREgFmHLCD+EnwHjcRAmYrDemGd2CLAZMGB7ZMYzMc+PBxgbHsYYGQMGCaN9ay2tbvXeXV1L\n177dfc+b88fJm99TXdVuGN1MO4bziVDo11m36v4y85e/PPvxWZZlkaIoiuI6/n/vCSiKovyyoBuu\noiiKR+iGqyiK4hG64SqKoniEbriKoigeoRuuoiiKR+iGqyg2n/rUp+i3fuu3/r2nofz/GN1wFUVR\nPEI3XEVRFI/QDVf5uRkbG6MvfOELdMUVV1A8Hqf3vve9tLCwQHfccQclk0l67WtfS2tra87n7777\nbhocHKR0Ok233norHTlyhIiI6vU6XXXVVfSXf/mXRERkmibddNNN9OlPf3rT711ZWaE777yTUqkU\nXX/99fTxj3+cbr755k0/+4Y3vIG+/OUvrzt25ZVX0ne/+10iIvrABz5AW7ZsoVQqRddeey09+uij\nm/6dhx56iEZHRzec/4MPPkhERK1Wiz73uc/Rzp07qaenh97+9rfT6urqxS6h8kuObrjKL8Q//MM/\n0AMPPEAnT56k73//+3THHXfQZz/7WVpeXqZWq0X33Xef89k77riDTp06RYuLi3TNNdfQO9/5TiIi\nCoVC9I1vfIM+8YlP0LFjx+hzn/scmaZJH/3oRzf9zve///0UiURobm6OvvKVr9BXvvKVC87vnnvu\noW9+85vOv48ePUqTk5P0pje9iYiIrrvuOjp48CCtrq7SPffcQ3fffTdVq9Vf+Drcd9999L3vfY8e\nfvhhmp2dpa6uLnr/+9//C/8d5ZcMS1F+TrZt22Z94xvfcP591113We973/ucf993333WW9/61k1/\nd21tzSIiK5vNOse++MUvWnv37rUymYx18uTJTX+v2WxagUDAOnbsmHPswx/+sHXTTTdt+vl8Pm/F\nYjFrYmLCsizL+shHPmK95z3vueA5ZTIZ6+DBg5ZlWdYnP/lJ653vfKdlWZb1s5/9zBoZGdlw/g88\n8IBlWZZ1ySWXWA8++KDzs9nZWSsQCFiNRuOC36UoKuEqvxADAwPOOBqNbvh3sVgkIjYTfOhDH6Kd\nO3dSKpWisbExIiJaXl52Pv+ud72LJiYm6I1vfCPt3r170+9bWlqiZrNJW7ZscY5t27btgvNLJpP0\npje9ib71rW8REdG3vvUtR7ImIvrSl75E+/bto3Q6TZlMhnK53Lo5/bxMTk7Sr//6r1Mmk6FMJkP7\n9u0jwzBoYWHhF/5byi8PuuEqrvB3f/d3dP/999ODDz5IuVyOJiYmiIjIEsXpfv/3f5/e/OY3049/\n/GN67LHHNv07fX19FAgEaHp62jk2NTX1b373O97xDvrmN79JTz75JFUqFXr1q19NRESPPvooff7z\nn6dvf/vbtLa2RtlsltLp9Lo5tYnH41Qul51/m6ZJS0tLzr+3bNlCP/rRjyibzTr/VatVGhkZufjF\nUX5p0Q1XcYVCoUDhcJh6enqoXC7TRz7ykXU//5u/+Rt67rnn6Ktf/Srdd9999K53vcuRjiWGYdBd\nd91Fn/rUp6hcLtPRo0fpa1/72r/53W984xtpcnKSPvGJT9Bv/uZvkt/vd+YUCASor6+Pms0mffrT\nn6Z8Pr/p39izZw9Vq1X6wQ9+QI1Gg/74j/+YarWa8/P3ve999NGPfpQmJyeJiCXx+++//xe6Rsov\nH7rhKq7w27/927Rt2zYaGRmh/fv30w033OD8bGpqiv7gD/6Avv71r1MikaB77rmHXvGKV9C99967\n6d/68pe/TMVikQYHB+nd7343vec97/k3vzscDtNdd91FDz74IN1zzz3O8de//vV0xx130J49e2jb\ntm0UiUTWmSok6XSa/uqv/op+93d/l0ZGRigej6+LWvjABz5Ad955J73uda+jZDJJN9xwAz399NO/\nyCVSfgnxWZvpU4ryH5ivfvWr9Nd//dcXNEMoyn9UVMJVFEXxCN1wFUVRPEJNCoqiKB6hEq6iKIpH\n6IarKIriEbrhKoqieIRuuIqiKB6hG66iKIpH6IarKIriEbrhKoqieIRuuIqiKB6hG66iKIpH6Iar\nKIriEbrhKoqieIRuuIqiKB6hG66iKIpH6IarKIriEQE3/ujtN3zaGdd6I0REVO7DV9W6fGLM//eJ\nIpHRBfyjGROfzfDxep/pHJv8vQ92ZtLn8fqrPu6Mi7vSRERU7sX7qZHEvCr9PK9mCvMKrhnOOHUG\nfzc13SAiosj4inPsX07+aYdmvZ7XJ9/tjI9/8VIiIhrbha6yO5KYQ6EZJiKiUyt9zrHsTMoZdx3C\n+fQ/WyAiIuvZl5xjD7T+vkOzXs+uP/0zZ9xz5SIREUUCTedYpRHEuM7jQjbmHDMWQ844fRJ/N2nf\nh0AZ9+ynD6/vu9Ypbvff7YynPnEjERHV91ScY60yno3MIT6HniNV51jo0IQzbuzb6ozzO6JERFQc\nwVo89iebtyl6udz4kz9yxotrSSIiMueizjF/A3PwbSsREdFrd+KC74vNOeODBbQ1emR8FxERDX8T\n9+nR+915pt/1zO844+4gz3GhhjUe9GMt7I7xWusOoM/eoZKY9/ROZ1xa5vUWncRaPP6Zze+DSriK\noigeoRuuoiiKR7hiUmibEYiIVi5lMbs80nKOtSIQ3WN9LNpn4lCxZme7nbERxmfTKf7sQGJjO+1O\ns3ZFxhkXtvB7qbwVqiwZMHv47PPxC7tIswUVK7dXmCJSrDrFegc6O+FN8Pf1OGOjxHMICbWpYgY3\n/E7LwryNCuYdqIrPhNi8EBjo79hcL8T266ad8esHjhIR0XBwzTk23cBaWayzenimu9c5djg04ozz\nTajAtQzfh3DO/YYngaFBZ+xnSwb5fJt/tmpPPTcWdo511WFG8LUwX6Nm2X/zAn+sg7xn2xPO+Hj/\nEBERPdm13Tm2nI874z0DS0RENBrGfeoLoB39K9PjznhuiO/ZxFVjnZ3wJvxu/8POeKbJtsz+TME5\nVrXwPOwIrhIRkSmeh4aF7dIcFWacON/faQPP24VQCVdRFMUjXJFwG3Hs43Xb0ZXZueocu6IPBvTL\nEzNERLQjvOgcOzEy5IxfzI86494wS7Z7Y/MdnvFGlq/G2OyqExFRpgeSdXe87IzHEnxubccTEdFa\nDY6bsnDszGb4LdiIb5QuO83sm3HtrABrGMtlzGs4nnPGLVvaNfxSE4E0Ve2R95Slw2AIjg63eO+W\nR51xys9i9pUhOPsoCgn4VDNBRERHI5BqWxbmfTwAiby0xNfBmoYz0C3yN2xzxqat/EVjNedYNIN1\ntRyxHVJhrKVGAvcsuoL7U0/YUpYHYtNdCUilP/bz3P0DWB+LmaQzHolkiYhoVNyn3SE4a02CdHgq\nzZresSGsVbe4KYILdaTOe0jEB42v24+fx/y8tpdM3Kcro5Ob/t2VGkv3083eTX8uUQlXURTFI3TD\nVRRF8QhXTArBItQeM8R7+lV9s86xu3qfdcY3R9iw3rCEqmQJNQ9hcuT38WcyBtR5twhtg5oXDLDa\ncWkfTBn7EzCL7Irw8aUmJrvcgIpVNKEePm/HkI4b7juc2vHBRESBIb5myXDdOdZW/Ygwx4Uo5r0W\nkvcR96SW5nEsBueoW/QbcGokbZNCxAc5ocuIiU/zPZsXsZM94ZIzjkehHtbjrDJK85dbCKsG1QbZ\na7YtBSfSaBz34aht0pkvwgFTF3G6ZnTjfBsJ9x1/8jonDXZwGyTWh7XRcZcy4GltiGe6/RwTEcUM\nXo/+mvv3YdnEWphpZjb8vGBg3QwYvFYKLcxrvpl2xjkTDth6y74/P8cpqISrKIriEbrhKoqieIQr\nJgWjBpUhlGVVQ3rwDRKxhLbHMuKHx1uqkcda8DgnbRUl7odq6BZpERfcjq+9JAGTwjWxCWd8a4Tn\ne7KBSIuZENSPF8vwUg/FWJWcjm9UaTpNI4Xr3Jdkk8L2FDzHuyLwHGdNVhlbIu26WMM9y89DxW3Y\n6daNQZgf3OJgFTGoO0J8fTN+XOeEiCtujyK+hnMsHsBaWVtNOGOrzCquUXM/hrWegFwTTPO6ek3/\nCefYaAgRPO21Vmvg0czGMO/gDJ4TM8yfNeN43txCquPVFpvOVhqIvc3XRYxzmJ+HUgvrpySe76UG\nTG/zIrXWbX5cxlpatSNaZMREI4zn2yR+TicaiDyYrGN8KI99aanM18FfunjEi0q4iqIoHuGKhBta\nxtvQMvgtl6vhDfh8ecwZ9xmHiWi9AX7RhOQUFHFyYTtNpy2NuYmUMPrifD5+IZkn/ZCA2zF7l4ZE\n8ZoGsmyyYUgCZyv8lkwnROqWW/RCuhtOcMzt/gScl9dFEFfYsD07fQFoFyWhlTy1H3HDxRZL70bd\nfafZj+Yvc8Z3Dr1IROs1HD8hlni1xfeh0MJak+cQT+GaFyss4ViuPAHrqfRDihruZsnp6uiEc2ws\nCKfZYC+PhyOXOMeeTow549oIJrxUsM/BfZ8Z/Wtl2Bm3Jb12/CkR0dk1ZPzFAuwIazvEiIhmDWh0\n0qF8Os/FkgJl9zWNf1xEcH1XiJ/fqJjjXB1zHA3x81swscaPFpEfMFOEBruwwL8Xyl1cflUJV1EU\nxSN0w1UURfEIdxQqYcNvJFnfWSpB/YgMwKmR8bNIf7iOAh8nqxDdZ2sQ88u2yihrWKLCZWfJne5y\nxqURVkvHklCbpsNwIp0LcHrpkIhVlMZ4aS4pNfkcVrO4Hm6RSsLsMRxlVXZHaMk5dmkIqveayU61\nbAumkHYqNRFRfwrjqRSrhD73fTU0tYr7cCLNa6S9DoiIqpEZZzzf4LXyQhFOyqdnMW6n8xIRhRd4\n6afG3dfHq334jiu6eb6XhHCdBwyYPcotvg87w3Bo5tK4T7Lg0L4MPuM2j+X3OOPVOq/dcwU8m9Ua\n5nVsmdN16y04kapi3rLI0/QS398UModd46U57Csj3bkNP48GsC/NhXmPkc5AaTYplWBqCMzxekyc\nu/haUglXURTFI3TDVRRF8QhXTAqtl4474/AatxRJR+EhlmlxR+qc4iojD9YaGC9WExvGcyX3Y/eG\nHod6sPBKVqGOZWD2MHwb1QdTvL9OV1Hv9kgBqsyJZT5fY9p9D3+5CtV7scbXzhB2gIaFqIqqnVot\na4LOVKAyzqzAK+uv23G4uDWu4TsIj/bzSW5xEhQtluZrmFc7ffSFFcRIVibw+6lJUQ1qic83fQoR\nNW7RCmGttKuXdfvx6IV9uOYrthq+LNLECw2sFWlSuD5zloiIrhERD25xYAkxrG2TQK6E57ixjHE2\nyuvuedHqKNOF67y2iHsSWOXzyZxxP7a+LkxKWTvNOx6CGWG1hJ+vhHhcqODal9ZwjpFJPFuRZf5/\n/8MXN/GohKsoiuIRuuEqiqJ4hOth3+1COl1hVPi6NnbWGV9up2tOm/j52Ro6xxZEcH2pwWK8+yHS\nROnnUA2s2s0q6nQaqX2lOlS71TqrHyE/WvCcyeGzc/PwtPvW+PdSM+6fRegAdP5nK2NERFRuQhUq\nDT3jjGdtD/9MDXM9OA/V3JpAVEVsgeceXYZq7xaxeajjM+fYS/y0+HkiBFW0bK+P+WWYGcIrkCnS\nk7g/oSyPjaWN3upO03VEFNy+nNf20V548OM+RJNMNziqYqoGj/ipHJ4HWZUrbicYdBvut5xayW60\nHzUKWEtGGdfZ9Nv3rIFzXCvjnrTbPREh9T982oOIC2EFXF1ik00hhsQHS1QGqzd57uUszAhGFttl\nBNnYlJjn58A8KdpzXwCVcBVFUTzCneI1orlgM8avlXQITrO2VEtEtD3Ib86gD2/p7zZlrUm8JaNB\nNnAvFtz31jQnppxx6ixLGJZPxH9OQII9GOWY3JbomhMoCUlEZPGGCnw9ZDNAt9jyIxSqWcyyxHRs\nDXGpf1EUtW/zdsuZeWgUqXHhZCpgvvF5O3XzBO6jW8RWIEWXJ/j6z1iiWZ+J6+y3m15GljDv5CSc\nhOEVOEhC4yxRNWeQ6uwWAw/iO07uYsfff0/e6hy7OoG19tWJVxER0eJpnGOgiPORvtoHh/iePpbc\n4Rx7N8JlO0qzjufQatpp4E9g+wiWRe1lW2CvpXFvahn8vnikqfsE35PmOcRTu4W/G9qQWbBbSh3F\nXuJvbPgViood0oAiQoGSSPM/xuJuK3jxllMq4SqKoniEbriKoige4bMsL2oNKYqiKCrhKoqieIRu\nuIqiKB6hG66iKIpH6IarKIriEa7E4f7xS292xq+MnyYiohUT8W6yGdvJEheEmSoiw2l8AT9viTjL\naJzjP+siJvD02z/eqWmv446tf+CMS1dwe5FqF743vwPvqtbl3JbmU1f+s3PslZFpZzwtzv0zZ99C\nRET1v0BBm0fv/2Cnpr2O17zmf3fG9Q9z/dXf3faoc+y6COI/9wQ5/tbw4bweqmAsmzl+5RTHijae\nF7VqP3Vvp6a9jpUZZLs9YWdf/dnE65xj42dQJCi4wsu5mULsbf8OxCL/yd5/dMa7g5xh9oZn3ucc\nO37XJzs17XXc7r/bGRd+8wYiIqplNs80bBl8XLb+sYRYJGNFjSr7uxPzyKB75Pv/9eVOd1NuetsX\nnfHitTyh+jCytCKJ+obfMZuYeEIEo986goysqRKvoUMHdjrHxu/93zow44287Qnc60Oz/ExbJ/Bs\nDj+Gixt98iQREZn5vHOsdfNVznj1j5AZ+49XfoWIiLYGREzv4KlN56ASrqIoikfohqsoiuIRrpgU\nrolNOONBu7DGq8IiLy6GNi+TCe7a+2Bin3PsR/5LnXGuhlTTkMFpnvkqWpK4Rasbaa+NOL+XClvx\nfqqKmqzXDHGhm+Eg2qa0U5aJiAoW1Kl2wZG1wYv3sH+51DO4vefsAjq5URShqVmYQ5P4fIotpD+u\nmFDXJ6ow81TKfP1j7td9oQcqoi1KgK/vr/afcI5lRb3SfJLTk30tqOstUexlSdSYPVVjU5ZluV9E\nSKqipWFeQ6JzFDWECSRoN002qmJeIlLehBXHqeLUCrrfejg+hXq28X5+NhopfG+1LtKpB/iZN0Xt\n3rVlPE+P+pCKnM3xehx6QpykO9YpOnAYZotgFz+TzRS+N7cD8/VZnCMdKMFcUxoRdYlrOP4vJf7s\nSBAVbd5ygTmohKsoiuIRrrwanyztcsaRxDEiItoWgJE54cebot1EsjuA4jXdopRjXki4DZMlsrU1\n94vXmEkhWRdYAvE3RQGPMKSS40ssCf40Bcm8ZR1zxoere53xqWWWFPtm8IZ0i0q3mK/tYPmHmaud\nY1O9KAE4EmbpsWxCe5ANPB+dgVRinObiQoNPu18W8Ehl1BkvBVlClU0ku2PQnKp2yczyAqT45RYk\nq++mr3HGXSFeY/Vp95t5Tr1eFGOyG6j6o7j/Usr2jfLPywWhxVWl10z8YWcJuq8t+U/DCZwc5PXc\nSGL7MCOYQyHA19RXwrGgKMBTWERhntgqn3v6Cfe7SI4+gOu8cB3PMSgqjLaC+HlhhNdSJCeeIXHt\na+ewBz0yzBJuuQkJ+S14XNahEq6iKIpH6IarKIriEa6YFL539gpnfKqPa+NO9Bxxju0Q9XCrLfYC\nTNbglCk2oE6VRWeFWsOebkEUnnWJWjfU1lCW1bzUhKhLKorfFgxWGQ90odbsbBXquHTclJfZsROb\nRHyfWzQj+N7AGl+7yRZqFVebuP29MXaKLJagKmXzaKrXXIaJJW13fPBX3TeLnCjCcXfWz6qo7Kax\nJDoRNFf4PgTzuE/NJq7B85OIJY7bcaGxOfdljuZ2OE0He/i+98XghBqNZZ1x3m4YuVrDtZ/OYi2Z\npn/DuBa+eB3Wl4s1hnhoM2x3aViFw6ku4ooDS7Y6voJjoRw+24zjeGqCdfrm3HyHZ7yR1PPo4lLu\n4/OpdgtzjjAvxOxuJu1nn4got0OYGbP4vacmxoiIqNUQa+nmzeegEq6iKIpH6IarKIriEa6YFIoT\naBj3bIXVnYUKvMV70zApdAdZtTpZhKo7lYMKlZ0QAYv26yF2zgOvbL0l/sH/q/Ti/SRbbJCtSpxd\nhve11oVLWxOqe2iZx41eqIxuYUbEP2wNyNeAKrQqTAbtpnntSBAiomYN847N4HigYrcJarjfRHK2\nKJoP+vmezC1gTfiXhOnHbk7YjmUlIgoIT3nVj8/mq3x8YFbcZ5e4dgwp1H67R86uOGLRL4uec8al\nFpvT5ho4x7NRmFDW6oh4CNjXY0ZcI7eojCCao9LD11l69UVIN4VyfLy5LgAEn5WmiIZtXjC6ZICx\nO1ghmAGD9vMrU6Wjop1TO/bZZ2J9hIoyXhonXFvmexZZvPi+pBKuoiiKR7gi4SbOipg7g8WsyRak\nv/kcpN14hONwqw1MpZjHW9xfEy2V8/w2jM2536SiNIi3od+WUC1DGNiblhjz8VAQTiTZ6LJchBMw\nUuTPBtZE5p1LNHCZyUzw29mKYY6maGNt2i2ia0KqtcS1lwlZATum11dBVppb+EXXxPYcrYrQGHJC\nZmgLIOKQIaYYmcP5+uxOht1Pw5HiFlelIME2bFFwW3jZObY7hBbhOwJ8f7ItSFPTCayl6Qaeo7aj\nWV4jt8hvEVllfXaBHXGdfUJRqHXZ/xA/bwhHWTMqGqzavSN9abFYXaLZIxys9hzk+pASO9mPf2UQ\naqJfPPN+UasnvMr3ND1+cW1JJVxFURSP0A1XURTFI1wxKQSLEL2DWd7TmyJltCyM1xVb7/WLkM7I\nGt4D0UXxt8ossscW3Y//LG4RcYUVW/1AOCUZQqXwZfgfyQj0E+koa8Xwt/wmm0tah453dL6bUd8F\ns0XMriW8Lo5T1Cttq+st4TTz1aXOKIa25tRagOPHLXamoHrPlG3nkCHMDBGh5tV4kj5hrQmvCdOP\n0PjaY3McDi23OJhHevJghONwe4VnzxDVafw+PgdZ/CjpF4VjfFh4bQfbSARxvG7RfAO+o1W3Hb/C\n/NQqisIvcX4+QxHhkRJURdpyK8i/1x91vyBVcStMlZVe2wwoCjAFUVGAqpmNsqiM0zXxpxwTSitw\n8UJIKuEqiqJ4hG64iqIoHuGKScEUKaVmzPaOCzXQKIt93nZ/y1S55BQ+m5iFChXMscpuPftSZye8\nCQ1RJ9Nnt/mp9uJYS1y5HcOs9m6Nox7uJQl4v787LVpzpLnilS/gfg3TwT7oS10R1rNLDcSiluoi\nhtWuNSyV01IQamJLZo/al8GfcT/+83f6H3HGDxe5ZvJKGQGe2RV47W1tfZ0ZQcaH1tMibrQ9bLkf\nS3zg1Jgz3rGFzTBBoZ8aKPtFfh+3n5ltQsU2CZ7yrIlzD/lYdS+a7qvjX7/yq874eJ1rCX93CdXX\nTiwjjn4wyeaSegsXPx2CPW5gDGntDwT5ns79al9nJ7wJi68QdZIHeD7lEp5D3yFhTrNvj4xiqPbg\n94vbYdYMpHmPasSEneECqISrKIriEbrhKoqieIQrem1pRARibxKT3YoK80JhYwCy0RBe26ZQt/Ks\nFps+99uiSBOI306HbcaEqpqESjFk95rZKVoH9QXghR5JQLUvFOzqVz7333UymWS2zqaMuoie8Ptx\nbQtlVltrFZHwIbr2ynTZdrSIVd/cC91JbopgDismF8F+IHyJc2w1LKMQ7IB8YUYw6qKilUhc8dvr\nLbBtS0fnuxldT8Mec7bILYOWt8A0MN2LtNYHV1jFDvlhcpBp8bLCW9tMNJtH6yC3uCoMs8XJBt//\npQoiKUpl/LxtTAsHcA5hA89LoQETSTJlm7qG3TeLDFyOBJM9GX5Wj62iGt1yGSnUITtSSqb+SsuN\nL4pzy6Q4vGFl/8XPQSVcRVEUj3BFwm10Y/cPZlncMCrCYSHL2doCiCgvSw2R+teIYYqBGL9BAgMw\n0LtFQtS+jS/wGz1zRsR/hjCvJxe5tc5TY2P4/RhE9nwBRWKGTvK1sRoikNclVmdQAMWwW5xEF0QB\nHhEvTfY1jxdwLJQXmkgd9zRxhIsPNZfcj8MttuBsmW6wNHru+WHn2MALmGNyglv+yKI6pa2Qwqro\nKORoUa20+y12hu4/i++tbyciovIspNoD2yDBBu00URkzHJvD8yB6edJCkj9kJt13/H12GW2ivjPB\nTuDmw3BYjpyEBFvuY+eRlAhnRQGeU6M4uUDJTtdfdF9rbTuGiYhM22uaK8HRZZQxh8gyr4/EHH4n\nv1WkN1egRqUivEbNsYvHQ6uEqyiK4hG64SqKoniEz7Is90sNKYqiKCrhKoqieIVuuIqiKB6hG66i\nKIpH6IarKIriEa7E4d7wji854/wY7+ntuDYiot7nUbyi0c1ZJ7KFi9FAnF4rILKdVjnezWciNu7H\nBz/ToVmv54oP/Lkzrt3KaVbDXcgYC4hAyXaRjmwZMX3ZOWT/dB1EzF7vi5yV4nvqkHPsAfPbnZr2\nOm562xed8eytdhZWBqkz8aMIlBz5V/uevHjSOSZjhWf/8EZn/KH/5X8SEdFYEHG4t4yd6dCs1/Mr\nb/xTZ1wc4uUqi4jIRpmVnRz7HI5j3rWs+IDIHgyf4+yvYBE/PvL5ezsy5/O55c4vOOPIvbNERPSF\nnd9xjl0RwhznmjyhH5d3OMe+Nv0qZzy7KgoGneQY4gxuGR342n/pzKTP47p3/ZkzrvTz9ZdFgmQD\nxnI/r/d6cvPY2npG3IfVjX/r2f/hzjls/9vPOuPX7OGLFg8gXr5fpFNG7BSz0xXE/B/LIitt8sSg\nM45P8vlmzuAaPP6dP9x0DirhKoqieIRuuIqiKB7hiklh/o1Q6RJpLk6xsooUyuJWqEWRFf6/rC8r\n2+3IGrTNKKuBstWNWxR2wmQwlOQWJzf3QW1eayBdd7nG6aPF2ubFK5qixU6thz+TGB3p3GQvQGwW\nvWYMu4as1Q+1p9qDa7u2n9NL06F9zrHAElQsmeb7sSd+jYiIrtyBbrS3jHVo0uexths53+VhnkMz\nhntjpWAiSXaxuWY0DdOP2QNwhZouAAAgAElEQVSZYiAGU9bEKKelLuWR+usWPhPXbmqVU3qfGobJ\noNA6J8Y8r8MltOVZLuLZqeewxpJ2Delg2f3U3uVrRC1ou/NzJYuHtlATFYNs+2BtAA+yL4I5jg6t\nOuNchc0pK0Vh+nGJN+1DHe1rEpNERHRjFGnXDWuj/DkQxFrKi6I7M73Yw8pN3guMqrgGF0AlXEVR\nFI9wRcL9naufcMZdAZYOxyuo6P708JgzXsqxhGG1IAUaAUgw/Sl4NXqjPF6tul9w5PU3HXTGDdsp\nFhPN6Lcn4DCaDbHUIivcF0S5usoApKhgkT8TPy4r+LiDkYcqYFR5DpE4jmX7cPtzu3g+kVXMu5kQ\njQFFPqI/y8cPTQgp/ZbOzPl8aqLgTKOLpaRYH5oqjmYggYzGuXjIdSlILcNBdOGI++Egmenie3a4\n7H55xqyQ0ht1lvqezkHCNdJY71W7stOR3JBzrFJBecfoFP5Wcpp/L3XI/SJCka3QdlIxXkPFfrHG\nxXoPBPkcR1K4T7cNnnLGr4jj/kR8rKE8UkBxHLf42MBDzniiydd01MD1jPlxncstftaXTKyfy5Mz\nzniuF07x8XZJU5+WZ1QURfkPg264iqIoHuGKSeF9Xc9tOHY0Mu2MR8KoG3k4w2rpWg1OqJCoDn9V\nCg6FHWGuw7piuu/o+DVxDrNNVj/7AnC6jBi5Db9z0AdHRzQMZ04uKmJ2U2xSaHW5fw4k6hKZER4H\nDMwlGIOJpBVitagpaxEnAmIsYyr5b1kl9xthmqI7SNvxkonDGbg1AZXv0gSrfJeLtXZ1CGvJEJ1C\nJgOTnZ/sBWiK3oJmnWWcM3nUh90eW3bGfvvaFuqiiWQV19kQZZT97c4oQffvgzTdtJ2Py1Ws4eUQ\nzHztThT7MvPOsVcnjzrjV4Zhagj6DPv/Rzo84430G6L5aIvnsNrC+pImhZbd2FPuNTlxI9Mh4ZAO\n8WfrKGt8QVTCVRRF8QjdcBVFUTzCFV0k4oO3PuHn2LXLqewcK0fg7avavXUWg5DHDYLaGxPdJXeE\n2KQw2Nqoznea/SGoqoadxtvjxzkMB6CqzpisYu1LQoXK1aB+5JtoddNuJVTrcT/usDoCT2ozweeQ\nCON6+kTowXKc55vbgXsnmzHKZnq+ph3/Wbt43OHLRbZmamvQyRDOoS8E73nG4PvT7UckRswPU5Wk\nzz6hkM/9GNZGAtc5EObvS4Uxx7C4uGmDVdVLMovOsWJVeL/rUHt9tsnIVxEdWF1CRuAE7echYmDe\n3VE8GxHbJBgWAfXGZt1kiSjs4weizyht+vNOcqyOOU7bz6SMXOkT51O1+D5FRGSSKeTTE0tI+TVz\nfA7Bn+MUVMJVFEXxCFck3MeqyMK4MsSpZFXxgstISdGWJGsWpmKKjI9uA3G47RhFv+yw5xJx0cY8\n42epIyykIWmA3x3kc8xGcOxsDA32zg7jfBt2DHG1y33psDgCaSjQz6/fkbjInBFFUyqjfG2Lwvnh\nF43yWmm8/dtOApp0X0pfd6ubfE8sUekoLxwZQfv+5FqQCGsW5m0KJ2LVcn8NtWnG8b3t5qJ9Yazr\nLUFkXrWl9LU47sN4HGtpcge0lrDdoDURcj+meyEHDbTdwl1qSNLJl4jzOdZE+mhdqEtlC8+R3453\nLbSwVt3inwpXOuPeAGtGUsLdEoCztf30N8S+VGhivUdCWFcVO4dgk0S1DaiEqyiK4hG64SqKoniE\nKyaFL597jTN+2yDHs0ozQc6EI2OmxsbrmSocS9UmVCRD6JSFFquPP1tBGuBtYx2a9HmcaEBFyrZ4\nvn0GHDSmJefF8y0JVbbcFCqSUIEDthMonBMVelyiMIbvvX7rFBERva4bBTyeKex0xrUmL4Vl4Qxs\nmlADY2E4D67t5djofw3v7vCMNxKGtk3VXp7PuSxMVoYf92HYju9up4sSEdUJsdM9fsROLpmsmj9V\nxDW4p0NzPp/ACExK+/oWiIjo0sSsc2x3aMEZlyxeNzKNPODf3PzRdsCSB31g65OIR52y17NfzKvV\nEs+3XRe62YP185AfRZGIjjmjtkr/9eWbnGNuFUJ6chXp1PtTc0RE1CsKIh81cJ9mGhx7f7Q87Bw7\nsLDVGa8uwbQTm+XzTE1d3AGrEq6iKIpH6IarKIriEa6YFMYf3O6Mv3c7qx0yXfdsFl7XdlzofBYi\neqMBVaQizAvtWMCpBVFCCppIR7lv7rX4iq7TREQUEem6B+uIozzT4EpoB/I470PnRCWtszChhO36\nvwEPapg290JFuqPnMBERvT2xuOlnz5XZpBMN4j75hSf2qh6kWN9lpz1fkYBXl+iTL3u+m9H3PIIb\nW3YERV5EUpysYX2kQnxP5utYSzKNfG9kzhk/mt9DRERPL27r8Iw3MtYLu8iWKEflyDqrGWE+mG/w\n3Auid9DMmjChVIWMZFsSrIj7UQo9B2GeWvbx9W9FYFII5PHM1ob5mT7ZQoVA+fxLNX6iynvBk7Nj\nnZ3wJrw4jtR7sq0Lu5N4HhYaKTqfp5fGnPHKGew78Vnch/RZu2rbEWH/ugAq4SqKoniEbriKoige\n4YpJYfRnUGVfyrCa7RuGCt4sQAVatjUVfxEqSUCkc56dQIHo5girKoHZixf6fbk8MzHmjOfKrGo8\nm8SxkQhU1Tk70ePwCopGm3MIyO8SDW2jq2xKCC0g4sELeuwEkqBIuy6LqIqmHUVSF5EJ1QaWx2od\narxJfH9+KznhylwlxqHTzjg1eBkRra9iVhWF64/FuKtqMYPzWqwhYP/RlV3OuGGf5/w8omPcYnoN\n39E2iy2IeRXSMB+0veJy3rWKKJK95BNjVtP9a6L1sEv0PA91udLHZoBmHPKabHtVb/L1r8URqXOg\nMOaMD0Zhbhvs4uegfFp0I3YJYwXX8WiEu+4udWFdy5TxdnLN/ArmFSzi2ifOwZwSn+bol9bpi1eg\nUwlXURTFI1yRcH2Poz1N9+5XERFRZUE4jrKIG+w+wtJw4CScMr6AqMO6Hf3fS1vs+D73BVyKH4CE\nOrmdJdfJAOYSHYRUUZnnGMXwEqTD4UNwioWycD6Fp1hSME+jzYhbxJ/ENf9c7x1ERJTd9rBz7MEV\nxEaeeGqMiIi6juP3rT680R+/BJJA0E7tfDaOYj0fRrhiR2mV4DSLLLEEEsqKgjSiqEq5xJLk8VEs\nkK4UtC1R+tSJo/TnPKjpewzS6kQvz33CGnCOPTcALc6w6xUXlsX1XhQS7jxOIj7B0mFzGs+OW5hH\nTjjjntFXEBFRI4FrH1nBGg8u8zU3U7gPa3txz0rD4nidn52EB41hZSGkdjPOuRVoF7MBUXu5bsfL\nL+Mco4v4eTgn6kovsAO02RDFii+ASriKoigeoRuuoiiKR/gsy4O8QEVRFEUlXEVRFK/QDVdRFMUj\ndMNVFEXxCN1wFUVRPMKVIMTb/Xc745X3chxuTpZO3Yq6pLftPEVERG/pfsE51i/qzt574u3OePkQ\nN27b+R3EwP7k6U90ZtLnsevzf4b5XM31Sisi88r8Sa8zHvke15q9UDzk7B/e6Iyvf9shIiL671sf\nc475B091YMYb+dVb/8QZ53baMcwIL6ZGCnGJTTtMsr4T9+bSrSj2cmYZBYfqpzmGdfdfo47rv5z4\nfGcmfR77PvrnzvjaO7mW75t7XnSO3SIakho+Pp+jdcS9Plba44z/afpyZ5x/lgurDD6D+NFHvv9f\nOzXtdVzySZxDI8k+6lAW177vRcwh9swEERGZS0vOscA2xOmOvwfjN9/5JBERfWEQz45ba+l1oXfg\nO5L29e3tco41+1H4pbCNY1uLw5DnmggrpvourLFWiWOMM4fwbL345Xs7M+nzWJxBsPhL9hp57xPv\nco4NfQ+ZcalHxomIyKoiQLhyyyXOuPfDiKP/zs4HiYjo63nsCe/e8+Smc1AJV1EUxSNckXAD21Hy\nbu1SfqO3YsjMiASRhRUPcPbQC+Ux/Fy0jY7IDgRdPM7tEq9Ll0hMYbxif18iilzrtd3iHG7g3PBk\nL/Ku/UW8xQNIdqKHxzmf/9vdh51j/6kzU95AM4EMpeIWlqjMiIwCxLjex9fWl8Vb/nBTlJgUDSWj\n7ZzyrPv1ICqDWDeJAGfyXBeGVNttIGupYTcnHBCNR9vNAomIhhPo/rA0zFlp+S3uZ5rJrhWmPV3Z\nM7E4iDkELmMJ1ighq7EW37z84qE1vj+PZCDh3vYy53ohrKZ4Dvfbz7eIKM3tgOpUHuL1UU+K9TWI\n3+/rxv0pRFgarnVDK3GLj4qSq7emTxIR0W27oRH86+37nXE9wc9p8hyyx2oZPANzJUj0Pynz/cmZ\nF9+XVMJVFEXxCFde7/Ovg60kNsdvu+J2SCo9SVFU2q7KI1sqS+JBvGGCq/yZ5FRl0892kugy5pur\n8vemulA0ejmKnzfi/PN6H97y5ohoN97Em94s8tvw2wvXOcf+E4pYdZSF6yAZtVt1N+OiP5aotOWz\nW5D7mjhGefx+sIDjkWX7fH6O3PGXy+7LYBf32xL5eBOaxHahLS2ZrIGULYiPSVHGKhXCugkmeO6R\nNffb1fcfgJS9eD1LcsLMTKLbuFMJrRWELFTLiGdD3L7FItch+GnhUufYbR2Y72aYr77GGZeG+PqK\nVn1UT+IfZVsrkb3cdvWuOePdKdin24XvD48I54JLPPDMFc64dR1f35KJtRJMQ4MtDfPzGy6Iui5x\nnOPKORQjf2SQbbsHVqDZf0C2cBOohKsoiuIRuuEqiqJ4hCsmhbXLRK+jIu/pRgV7uyxyXbFF+ooQ\n7SUzOaiPjQyrj7K8m1sEizgHnz11v9D9fCGosg3bqdGM4hzNkFDXhRroC/E/ji+hPJ9bNC+Fc6JZ\n5TlaDfGOld23bfOCIX7uE53cw2s4n7aJxMzCxOIFLbvw+XwTBb3PNFD0uV0Y/VQd1/ahLEJ5Fspw\ndDTtvnmW+xYF8r2A0obG5dfyQKjg66xp9hLzCTNUM7L5WiqV+Tl4emWsY3O9EKVBPJ/VzEY5rYr2\nZWT1sLmmN431d2PvuDPeGlpxxt1B/sWTPeIPuERkHjd7qsghbXMF2HZk04DuKb7Q4TU48FsBXIPI\nFMaPb+MGaRMT/fiyV28+B5VwFUVRPEI3XEVRFI9wxaQQG4EqUS6w2mPVN9fdwn7WWxuWyEoRVfwz\nMXiWs34W/xtx9/XAelp8h4/VirBo9WzV8PMGO4up3Itjlriy4tTIl2XVvlxyP/7zljGocSeyrO7M\nzIoW841/+30rveebqd5GT/fGgx1mrQo1r2ZHg5RELzZ5BlX7QmcMeMdTAayf07PIOiO7r55fmE3c\nwuhBRpZhB3aIaa0bt4J2vLQwT8n1I+fbKLBaO+5DFqBbNGKiW4Jt5WuJ8OBat4iXTvMJ7UwvO8f6\ng4iB7gtg3GZLT3bDsU4jr/PEMq/dxjLWV3ocFzpYYZOhvwbTYWwWES/FEXSwmJhic0jmxYu3q1cJ\nV1EUxSNcEbOuGJh1xrMJfh0uFxGXenUfYitfleKurBkDsblSgvmuea0znvCxlFbtFgGALiHf6H12\nZ9FUEG+4tvOLCDGuVR9+JyiSsMpDG2u8B/Luv+vu7j3gjP/JuJrnUsdbOF/AW9q0M8lMcd4tEZPr\nr4luse1wxYb74uHyiuhe28Xxm0UTfagahHl1273WJsQx6ejsERlOSxV2vNVS7msaVg+cfO2aFWKK\nTvYZEREV28ewPgIVnIMl1pjPvmeNJq6HW5RGRN0Ne723gmJeEUiC3bZWuie+6By7KgLn5haRejkf\nYMfrU4mdHZ7xRqSm0DL5H/I5DBZxPq2AnS2XhnMsvIY4XScWnYhax/gzA09tlNzPRyVcRVEUj9AN\nV1EUxSNc16dqdsxtSBSheVXqjDN+TZRVjaFAwjl2rglje7UHKvAz4TEiIkpNuv+eKA9AhdoWYRVp\nKCLiTv1CpbCnKFVD6VCQDieri70mrYb7scRviEEFerHCsY/zGajoqxH8fLXMzoNqFRM3m8IxKE6u\nHQvaqrjf29oqY4nmG6w6l0Xll+kmYmuTfp7PRB0xnWeKKJmXL0H1Dthp4vEFqMJuURvA2m6nwDZx\niIKwdFA9aadYi57utZRwKCeEGp+0nynTfRNbMybiglP2NRNf6wvDxJYK833YFUb5zkHhyNwqnnW/\nbUPZFkVsrlvUunAOoTA7whsWnGYyVdnf4M8aNZyXvyLKaC5hP2un9vtPT190DirhKoqieIRuuIqi\nKB7hiknhxCpUuoZtUoiHUVlqoYF03V5jY5WgkG9zFclne5x9G53+HafWjS/ZEudKR7enjzjHDgyg\nMtDcHNcubQh1T8b8Se9oNGFXtDLdf9edaUBXTdhVs7pExaxCAyp2LMTqUjGP++ETF7oVEhXP7EpW\nxghqtrpFaBlmjekse/tvEKqhNB8Ytq3jSAl1fF+cGnXG1grMIt0cHEPRc4iOcYtKH8w0lSGeY6sX\nz4Plw32IrLSPibhXBDlQIwMVN9nNcy8V3Y9SCFRF9EqE779lCPNGQPzc1s2XhLnnQqu9z65nPBR0\nPw6XduBe7+3jCIqTsuLZAvalxCybTQJlmBFk/d9qN9alGeY/4utGvPWFUAlXURTFI3TDVRRF8QhX\nTArFg0g1bKe4FofhEX8hhUZ4n7Xd+d0BiPsvlVDA/JFJVOdOPMfqbuq5i3sDXy4tUWB8b4y9ra8M\niyLKaRRRnu5iT3hwBZdTVoBqpuEJD7T4HTcw6L4K9X+v3OKMJ8ucyjhbhNpUqsHbn13g6AUjD1XJ\nqMlEDlGAPMvnY5XcLwQfWcb35rKcNfDTxb3Oscu7kGTTVmXbRa2JiCxRZD02C/kinLNTN6vuF1Ev\njookhi2cESNTWc9YqDLVbosUKAkVXUa8RLGWwgEej44gGsAt4tNQp/01/4Z51USxr3YFrnNpqNiH\n6zjHqoUopDaGLIPmEtdsQcLVG3u4mev36Grn2OEhmECiy3bkgajaVhlDopBskFnr5c+U9l684plK\nuIqiKB7hioQ7/BgMzY0kS0y+Z/A6PLQfNUqP1HhcT4sYuRze7sLXRgNPsXRgVSEtu0ViHJLes1ez\ng+xX4sedYys1pConTvG59T+HeVV7cb5ru0WbjhT/3Ur94oUuXi7ffeSVzrhlpyInJjAX0auTRqZY\nWorNI7Y2sAqto7wDUmN0mu+DbOXtFvF50croFDuHxquod1vaAim9LeGu5XBvfCv4uXS2tiVc85g7\nbcUlPhHqGwpx/ObWOLSl+TRio5tn2YmUGhcNGEXt3KJPrBtbaOwOiy6lLtH/8LwzLu9lja7Sg7VU\nFZpRbYZ//u1dkBif3w6t9uZexOG3NVup1f5OpyZ9HieWIWUPRsaIiOjI3JBzTNZ87n6az9c8jXbo\niZuucsbZ3ZB2W1tZ01u5DMcuhEq4iqIoHqEbrqIoikf4LMvyIKpVURRFUQlXURTFI3TDVRRF8Qjd\ncBVFUTxCN1xFURSP0A1XURTFI1xJfHjdKz/tjMfv4mLDjS5Ef0en8bXDT3CgfWgRQfbmkRPO2H/l\nPmdcGeG/FcohYv/BRz/aqWmvY/t9X3LGiTEuPJ6fR4B65hDOoV1g3KjLouQIos7vQvC+1e4DJTIZ\nJ97/hx2Z8/m84eEPOON2b6+jL6LKWc9BzLFm94lrbizeRkREjZRITLEDxIefQGrvT3/2kZc/4U14\nw2W4v62o3Wm3iAQT69wcxnVeF1YD2TLGHvTKmn8NAt9Lr+b1duM2BLZ/7fqvdGra67j9Z/c643YF\ntqUSkjOyp9H9OGEX14+s4HpnRbPh//U3/tkZvzVxjIiI/nLlZufYF678+w7Nej2vfu3nnPHitZyc\nUc/IdF9ZjZz/14yKouU9KNi9dyfSsU/P8T0Z/EckqDzxbXeeh9v9dzvj2puuIyKiwiieY9nTLDXO\nazt4bvPC6OVLkTCR3cXrUraWO/Kn957/K0SkEq6iKIpnuCLh+o6OO+PGey/lY6KrZ2Ur3iQrOX4t\nDOQhtfjjePv7c5B843k7hbHlfqGLLfuRyri/i8dHY6j/OhWFVGLMb2yXY8Zxvr3bV53xWJrHLcv9\ntiifHftHZ3ymwYU1/tYPSeOFJKRdX8FeChmRSy3m2N+P9kLttOSz3aJQq0s0MxC52x1U/T04Fkpt\nFMkbotNqWXTlLWzHZ0a6uMPqmAetXU4fRk3ent38fUEDa1gWSqp12bWGRfeioChk882p65zxkymW\n3p88gxP7wpUdmvR5hOfQkbYV4LUk6z/7w0K7s8dB0RHXyOI+nDyH1Gz/Et+r5CnRvsolAltwH7Ld\nPJ+WqOMrtbtaDz/TVgAFaZpxkcrcJdpP2R2DpMR/IVTCVRRF8QhXJNz59+A1G+3lN2MiCgm2LMoC\nVvq4XGB5C6TacAxGq+Cy6LBnsiRgnkTxC7cYjOON/oYMl3K7Io6ykA/FUSLwUJwLb1TyMOJ09+H3\nXz2MAinvyDxNREQzJsokusW+EN6nowG2dTYGnnWODUYLzjhb59d7uYl7MxpDCcF9cdjd2k0c/z54\nTYdnvJHAEuZYT3PZz1oGy9YM4xwrdhX+aq/oliCKIskymcNxlqgGgu5LVpljmM9SxC5ZGMZcjBLO\noWXb+ANCwg3M4xwWX4B0OJPmIjGZo+IxfmdHpryB7JUouWq2l/m6jiD4rBWwjwuBzxD1powpaIRx\nu2KibwoapVsUrkWBnNKw7bOIY5JGRawbWzMyauLaCqW0JpS7yihrjUbq4qU+VcJVFEXxCN1wFUVR\nPMIVk0JhDE6Ay/q4Zuru5KJz7EQBatHhfjYl5LZjKlLZ9rVgamjZzQuDc0lym+vTE874V2zHyksG\nzBunIjiHMxFW7SzhZOqLw9k3GkLt06vCrE5tM+FIc4uwqJ1a9bHaMxiACj0c3th1oj8CFX53FJ0E\ndoeg8i2ZXOe0O+p+HVZZj9Sy67DW0rjO5T6sm6a9VKQZod4tum0IlS9qcAhZUnqnXEI2FA2usdmj\nmcA5GGWM25ab2CKcm4045KLYHJw11jyfe/qMKGzsErkdmEMjzc+3JRqLSqe4sczrzpCNJ8VnA+J8\ng2U+bq7hGXGLWkrU7LUbkTZTmLfPxLzaYW6yq4WsH2124f4kuvk5SEcvvpZUwlUURfEI3XAVRVE8\nwhWTAg3BJfmKrkkiIuoPwmvfsCDajw+w97NcQDsOM4Rpdfkg5vtarAaEIiKlwyXCQn+I+Hg+QdEr\nJSXcyPa0KB2H7lgzRSsb0SCvZrmv/rV5pobvCtnv1uM1ZMjMClfrap3bgwTEXHuDMKHM+2HoWWjy\nuFjfGH/caYz+jY35zBDWRDsGkgimhGZCxGkLVbe3C+aSgTCvx5GA+6pspU/GXNtreE00lhQqtr/B\nP7cMHJPjcBaquWlHBsQm3G9IWh6FCh3s5rVvXcCD34q078PmcanWJpq3LxjaeLDDmOIrzDivkfa5\nEBH5/Zhvwz43qy5MOCKypCsFc9qubm6KuSt+8ZZTKuEqiqJ4hCsS7mAPHDM3x08SEVHSjzdJzkRK\nx55edqadFL9fCcIp1kjgnZC2w28TGfedZs/mx5zxXXbOerkFKTwvEqfjIZYkV4poIme2MO/FBn5v\ntsnSvyi1QIhw7Cz/bfE2Z7wvznG4E1V826EVxCUGDX57B/ybZ/E14njTny3z35hfcT+WmDK4duV+\nnkND3H4ptVj2JXfiQM8jKM5ta5gdoftDhU0/20lqIgOpmbIlqyzWh1+Eb1Z72jUt8GgGqps3lGw7\ndLxohDkwBidv21m6XIZDW8bW+5L8rDebWDOmcEhVlkWmYJY/449foIhHBzEjQmuw10gyjn2pKhq7\nhuxzMESscSQEjfGSLgQBXJ6YISKia6ITF52DSriKoigeoRuuoiiKR7hiUtibgbjdVtliPqgXzxlw\nLnWFeJyIiNTfLqjrrYZMA7bVrX6omW5xNg/V++GuLUREtGLCQyNjiedXeT6NKi5nI4LxbBXOqckm\nf/aJ0m7n2MdQU6OjPDq5wxmvDbHKNpXvco5VG5hjqcDXPBCCY2CK8NnVfphLJla4cE/4iAdqYBe+\ntxnl+7/O+RETTqR2OUBhUghG4OzpjcIJOBxkZ1mP3/1z8F+C700GeT75GM7LL5yP7YIwosYQBfMi\nZleYH9qfMfo2OhY7zQd3/cQZLzXZpnOotMU5Nl7A8xKyzVMl8ewWajjH5aqID+/jfcEnClZ5gu0g\nM4SjzCcdf7ZJ0CfMUIkQLn5vCPf0sgin/F8f1jhcRVGU/zDohqsoiuIRrpgUSkLnW7G9k/0h4dX3\nw3wwUWT1tGEKr+0Sfl+qU6atlZQH3Y//nDoJk8EPk5cTEVGfUCNOL/Y640aO5+Ori/jQBs6nfY5E\nRH9RvZ2IiHJ1XI+PXdapWa/HOgkTyFE/1/I1xXW2zgo1zq5hajbF9U5Drz3dgtrammU1fPSg+zHF\njRTWQt0Oiqj1wezhdNAgIp89d18IamA0CjWwL4L712OnaRs+92WOD1/+I2dctfh8HlpFtbknKzAv\nBW2vfbCweb3k4lacW7u6VWu0f9PPdpLfSCCO/lyT848zBmJRa+alzniuwmazWhPbSySAtSRrKy/a\nprvi1S7Z1QSBkqjfW+HrXBGRCXURV2w2eV2Eo1jj0ixSa+Gzhh27HvNfPJZYJVxFURSP0A1XURTF\nI1wxKTxzZswZ/238lURE9KoEgrMPFNESZPwsq+6+Cvb+xDzUqXVqADRJ10kfRVTFgQFuRdOdRAWw\n2iq825FZvowhaF3USOD3J1egLrW2sifTLLmTVS2JLohGlik2H8ikgGhRVG3K8Vh6x1trolSShbFl\nTz1+3P2i0YECVLpqP39xdBimARlcb7XrXoukE5mAMlNGtMiZOqvhe4OTzjG3FPPfTi0742N1VsMn\nYjBJPemDScGwzVIi+31dpS0SXvV20e/8HvcTgY7UEVnUrhb3QhktmmSUwuQcj2MJmA6lKavZwMn5\na3y8gsvhGl0ncQ6lYRp6DakAABmsSURBVI4SKSYRLULCnNY2OdQIZoSFMD77L3mMWzvtc+tGcf/b\nLzAHlXAVRVE8wp3U3h/CePy3xVcREdGDY3ASLEwjvnPgUX6TZE5AejRWkG7Z7MXb24yzlBWacb8t\nSv/zkKImB3gO8yk4mdJn8a4aeMb+7FOHnGOB7Xj7569C88niNEvGVff9HBQoQxpKn7Cvs6idGpkT\nhVtOTxERkS+Bc2zuEi1JRuDkS47z+TbHJzo6303xi1TWKKs4W7pQrKUd80lENLHG66og2tk3C5DM\nT4j4zx8GryAiokvCaLPu1i2RRYR+VuT2U9888Ep87xOQ+KLL/NnIIhxSOSHB5nbis+3iMKb7PmT6\nz4fe7YwLRV7DvgloeSnR9WpkjZ1IgTLmWhe1aHPb8eyE8naK7fTF29O8XPxPv+SMkzu5GWetF1ug\nZeB5ic3yHGOivZFPSOmVPjikf5Dle3pkJ57z20XD0nVz+P8ycUVRFOUXRzdcRVEUj/BZlrV5aSVF\nURSlo6iEqyiK4hG64SqKoniEbriKoigeoRuuoiiKR7gSh3v7jZ9xxqf+M8fq7b90yjl2Q/dZZ1y2\nC938y/Q+59jaCmLcAouI6W33dZRN94798b0dmvV69n/4z51xu5diZBWFQ2Tbk0CZY0FX92Gu1m2I\ncb3/6v/mjJN2XOl1P8C8J3/vgx2a9Xp+OI6qOPtD3FKm0EI85OEa4my/u3QNERG9ODPiHGvMI5vm\nFdciU/D/2Ho/ERENBXCf/IPutHl5feJdznjig1cREZF5CWK2rxidccZ7ElyHeaqCYkGHF9E0s3IM\nmWZpe7rJKcR/PvSTD3Vo1uv5tcd+3xlfnubCLz+dQ1z64kEUSrJ7TFJ4VTSOXMVaK4j4znoPr7tw\nDzKoTr7tEx2Z8/ns/ns807+x5yAREd2WPOYcWxW1og+VuU7ugVXEoq+UsJZ+b9djzngsxFl4T5Z2\nOcc+c/n3OjXtddz6lj91xiU7azF9FtlwoTmkilbGeK1cqJnn7C14jhJ7+Vm/e/sLzrGPXfbPm85B\nJVxFURSP0A1XURTFI1wxKRjLSM0NL7GqIdttTFeR2tuyW60OpyDOlyqi5UgE6ZiBst/+f4cnvAnd\nx1HFZfkKu0e9H++n+ALMC8URe46ihGkxj7TH7xSu3PD342fdL17zjcVXOeM7eg4TEdFV4XPOsdfG\nMN49skBERF/yvd459nRjzBk3RRGYB8p8fGcIrZRu6cyUN9Aq42a373tUdFptWbjoZbuaSyqIn4eD\nuI/5LqQBV7v5+vvMi9cwfbl8auv3nfGwnYp8bQxmtYf7LnHGz61sJSKifBXPwMosuiMHUjCBXG2b\nUwaj7ncetsaR8v1wmtX/sKx0JPDbnW4bJtTuchXX+Z8W8Dy0iwudnEBa7Gcu78CEN6EuCkq12zVl\nd4q86F2o+WyG+OcyBd8Mw7Sz49ppZ3zn0ItERPSa2ImLzkElXEVRFI9wRczyVWCIjs3xW2F6CVLt\nlgQcSnW7cnq+huIojQqkWtEWnny2gJKadL9OYzMiOlDYQsW6knlybE9XCFvkW8Eb/Zvjr3DGlRof\nH3jJ/W4JR/52vzM+cQe/qm8bhnMrJjoSJgyWCsdzKLPnP4d7cjCHhpSnhlkSKK7AETL5O52a9XqM\nfShd2L4P+SK0h1gvrmPC4HW3Kqrxx4L4eTADybcyxHNPQlBxjdkmJNQrQjzHO+OQ3HcGH3fGV8bZ\nuXy8Aofm8wk0a5Tc3H1m0+Nu0P8cNLqZLq6l+BO6ZNPP9kXZqTk1i7UUmMXzcPoMHGztZ2r4AP4+\nvedlT3dTUmdQkKqW5oJAlQHx0Iq9pt7F/7BG4ZDcMwSNbksce9jt8eNERLQzcPGGpCrhKoqieIRu\nuIqiKB7hikmhOTPrjH0tjsUz81AppgqIk8yEWWQ/twCTg29NOsog8tsaIwVL7psUSoPiXWRPwS+s\nAGZ447ykmUHOOzuN+M92o8nY+ErnJnsBBv4fVKBfrl9LRETfuRG1VeNpqNjVCt+f0DFR43QJOlYz\nImqbLvL5ZNDIwDWa3XDWtDsctJq4N3Vx0RvS5tP+feHsCwaxbspJHmd3BTf8Tqd5urTTGXcb7GAZ\nNGB2K7Q2qqJB0d4kYsA55fdB9W47CcN+981T4VXMITHOjqZZC20ajBTmMGvHQcfG8cxHF7GW5LMT\nzvH5tGssu4n/NOxH/ivY3NaMYV6NjDBrJPh8e1Iw/WRCMC9sicCk0LAd/z9PQ1KVcBVFUTxCN1xF\nURSPcCcOdy/S9Cq9rD74olBJDD9E95atr3d1QaXI+qBGBo9A3WprUy2RYucW1T6oGu2miUZ18+9t\ntzgxGvgd+dmGsIBc6G+4gdUUHvxzfP0rJxF3aIkGeUFbs44t4ByCRYwzpxHRUO7nD2eOia6ZLlHt\ng1ratJdFIIS11BtGmu9QiFvvJA1EV+RTYlxFmi/ZzTSbSffLQf/g3KXOuDbMi2kohDZRq02s96K9\nmKYrMLHNl2AGWs3hs1WT70Ms4H57mnpGbBX2JQtmhTlHfLZ9XEbtNGP4R3xeqO52OW5j1n0Tm5nF\nNQ8VeA4+YXKSLXYCIX5ou6MwKfhFyFQ7qoeIKGhvTA0LD/qFuh6phKsoiuIRrki4tVHEHbYdHVHR\nMrknAqlkOMpvHencaIoMlfxujMMz/Eavdm90jnSa+gikBiPEb7BaDdJ2oCI+m+K3dz0tWlgHheQk\nXvXBPI/NY+4Ue5H4QpAOzejGLL1GSnzWnm47w4aIKLWyuTMmcY7vZevg0Q7N9ML4hdZQt50afcKR\nsT265Iwvj7BTpGGJOFw/7uNqDXHD7ZI3xRAkYLdYPY541KfDY0RENBJHI8yFMm5Ezo5HL4pMs1J2\n8/jO8SX+uz4PlKbSgHg+7emYUdFgUbQYbwzwujEjuA9Skqyl8dmQnSTXnJvv6Hw3w8hgX2rH2YuQ\nbfJXxTkG+QezedybpoWfz0XhCK/aztpcC1LvhRqSqoSrKIriEbrhKoqieIQrJoVKH2Ibq2Osfu7J\nwGC9PQ4D+b4ox+zWhWwfEE6141X8rXqaP9MuPOEmd1x2xBln66xDPVlAmqlliEIYCZ5vKwFnji8g\nnG7CutB2dPhjUG/donI7ioSs7uX5tkStFhHSSY2E7bwQTr1qF+5JsIwPm7YDJRF0v/BLuU+opf1s\nx+mPw8G6NzznjK8MsRNPlC1e/7d6MN/nDU6XfWF52+Yf7iDxc5BrpofZGTa7BvU2EoLpJjvHKmwg\nj/UVy+KetETYcM0uwBMsuv885G+Guty2PwUMXOhGTZhx4vzMlxtY49Jp1oyIGrP2MDNwISW8c/gS\nSCmuZfiLZQhzQxQ3ak+s2RTmzSrMTxUTN2LJZEfmvIgPf8MF5qASrqIoikfohqsoiuIR7pgUerGP\nRxLsJb6xd9w59trkS8647VGuxiGi5xsQ3WU6ZtNW02sZ998THx940Bk/X+cUxqUqVJIzNbSiaavm\nRhaXM7oTMar7+hac8fFlVp2a16HFiltMvQW2jN4RzsOt1HGdK2Wo2K0qq041oSpJVVVGhli2Wzzd\nixRtt/A3RUpozq53Owb1Nu5H9EuvEbf/j98flyqjSP1tx1RGRQUxt0hOYw3n93L0QTOCYzXRyqhd\n81m22ImsyogXDCMr/NnU5OZ1aTvJx679gTNeanJc8NEiKppNFRE3vJC344Zbm5s6ittgiogs8TlY\nfe6vJauKe90OOKgNCDNgA/MNdPFnfSL2VsbkbomsOuOJOlfPO1fHOahJQVEU5d8Z3XAVRVE8whWT\nQgOaNyVjLJqPhiCCXxkSha/ttjUlC5ELQT+KXa8jyfphcZf76ZiyI22wvrE6mRUUrnBbdWqlNq9i\nFhepl6kIq8Ar+zKbfraT/NEtP3TGy7YaKNXq2SrmUGiyqvtMcMw5Vm4i+D5Q2qgeFq7f2rG5XojI\nKq6pUea5S5NTxCeTM3gtLZtIrCm1ELguu8gul9n8UKu4Xy3MqIl06VU+h4ZIHQ9UREWzAl/nyDJ+\nnjyHcwytwYRSHeDomfhTaNfjFu9Oofj2Tyv8rB4uwKxWbWIrqdf5HGUyhBTtjBqOt5sKlHaJLBy3\nEJFFdTtIJDWI9kTJCK5t23wQMXDt5bghoqqMAO8FMVEB7kKohKsoiuIRrki46XFIf7NjbEx/rAcx\nrLfHT+PntjRytIqaoS8uwhhfmYOkGV7mN1TQ/Zop9L0Svvf+lauJiGj+x2h1suNZvM18dqCtGcYb\ndPkySI+PXyscUXbhlYj7QjpFRJDhYp0l3MfntjvHBhKIZ10o8vlaDVnMA39L9gtsOwmzO91vhBk7\nMOGMo/t5DR0+Neoc+0r4Vmc8332IiIhmG5Bk/3keHQlPnUOsZ3CKpfdYwf0Y1lZQpHbb3xcsYk20\n21ARESWneV1Fz6DYcPPspDP2J0U94+N2Yahu97Wln1awGP7HArcMfeJ5OH4j8/h5xE57j6xsvsgb\ncSnh8mf8dQ8eiAyk6Ho3L+JXj0A7kLG1NZPX9o447kOttfl67wvwhnRJaG7Tn0tUwlUURfEI3XAV\nRVE8wmdZlgeyvKIoiqISrqIoikfohqsoiuIRuuEqiqJ4hG64iqIoHuFKIOXl/+XPnXE7dC0zjoyh\nyBIyryr9XJBkbQ/i+Go9iOP1i2yVhB2O2Pd/Pekce6D1952Z9Hnc+PYvOuPiMM9NtnuJihjD3A67\nXYeMWxVJZ6UxUSDDtM8njmMTv/2hjsz5fL4/jhjUrF2z88k8GnxmGxtbt6SCKPAREsG3b8m84Iyr\nFscrfmEcJToeee0XOjDjjdzyVvzd6DmO2fa1NjYhJCJq2g0jq/3IkDNqomGpiIdtr0ErgGM//dlH\nOjTr9ez/iHge7DUSRoeddZloOfv2mHHMO5iFXFQfEllnc3wfIqLQzeEv3duROZ/PTb+B52HmV/n/\nRhHzSqE2FUWyfD7hLNZPaAU9qYwZxLa2+wOZw2hD9JMDn+rElDfQmkcuwGeXOYb4qz98jXNs4BlR\n39eu3ytrRjfDuM75NyCbcXsfZ95NLKN4zcm3fWLTOaiEqyiK4hG64SqKoniEKyaFwk7o01acx/UM\n0uYSUyg+0k4fla1DzJiQ4zMwPxT8rAL3/MrVnZzupqxeIkwcvTwfowKVorhFtD0J88+tflG8QmSM\nXr31nDPuCXNRjExQtM91iRfLSHHdH+U+tcNCl02J1sNDIW6BVDBxbwyhT803kT46WeP6wCsl99sE\nxcfRmsm3yuPKpSiaUukX7Zy6WH6oo3sNBcrCziMizlu2KSGUdb+WbGUA17Fdh7U6JCeDoRW1OxMP\n4z41RJuX14+cccbzl3CqarvGspu0zQhERL3buRCVIVphLQzjohuzbNIJFlFvObooUpm3Im2+ate2\nbiTcT7GW6cnbwmzWiF6C6zxnYI0H7WJNjaTs14R7dsOWKWf85p4XiYjoqfROuhgq4SqKoniEKxLu\nNVfhLdyym7EdTw04x1a7IRkZJX7rmMKJ1LdtzRnv6Vpyxme72Si9PDXY4RlvRLSgp1badlQIZ16r\nIZr8pVlS3NYt5i3K2V0Vx9vw8jCkXbf5yfw+Z3wqxVKQ7FqRr0Ga7Y1yIZtyE1JJtgqnWjQoStOZ\nfO7Ng6Joyls7NOnzMI+ccMaBIb7vraBwIgnJqMl+Qar2i/sUwji0gnvWLolo+dwvwCMdL60Ea3zh\nNJyThmjGuLOXHTD7UvPOsWvjKLByaQjHq7Z6+EQXnEFusf8yrOFf6T1JRETDQUiHj/TsccYv9HBx\noWIFzsu1+bgzLq2K+9dla4dB9xNeP3z8LmfcLr/oFx0dWlHch2qSj/tEZ47+fmhbA2FU0BoLsrT8\nkoGiShdCJVxFURSP0A1XURTFI1zRpz48ik4D8yYb9v/GuNE59mwNzhzT3vKNFJxjo0moKvsTqDEZ\ntuNCn+hx36Qg/ElOj/p2ZXciolAEJpDhDKsX0oxwQwJmld0hNJHcZTfFjHigyk6dghlnKmnHCObg\nvHBigonoXIBNDlYAKpa/LGrjhoXKZ8dGD5ySDgV38AVwnawuXkvFERyrdeEcGrYaaBlirmJsxkTM\nbpTPLTTl/jkEC7iOpt0VJCDWUiaGxdYXZtPO1THUwL0tOuuM+w2o5sUWmyWmQ+iW4hav7TvmjG+P\n87hbBJvLZp4t2x43XkBs7XgB5oWaH6adYDefQ08aca1uUXmozxmfHOXrL8094exG+bO6RZinLKy1\n6QqaZv4ocAX/fxomvM9esfkcVMJVFEXxCN1wFUVRPMIVvfbaMDzd55rswXs8hnS+yW6I4/NlVnUj\nEXjBAyK+L2nAmxs2WI03w+57NEN5fIfPjuVsSpNCeGP8piECKuuiP41s3BixUxnDPvebF8qU0GaN\n70lkCcek2cS0NT4ZndGMi0aHSxvfzYkp92OJjSGYj1pBvo7VHhGZIEKBm7bJwErg3vjFPWs1hYnE\nXvn1lIjTdYkILE3USNjnEBf3X5gUWnYAdzt9mojIFOnLDQtqfNkel1pQ190iJy60345HlY1Wt5ho\nEjsa4WiduQpa2kQSMBlWm4iOSSf4+R6Iod2TW3Qfw7oIlHkB+Ju4tjLFuh0X3IzhPiyH0N5IxkbP\nFjkGOXsaqb0XQiVcRVEUj3BFws218MYO2RKdjHdLiDbpsW6WkmTWSn8YbztTpGzJ9thuE84K6c52\nejRieD+VhROgEOGxNKT3BOEEiPuFQzDADpBuv7genZr0eQSKuHbmJl0rgyV5zH6ji3o24TX8fiiH\nz4YKPA4en+7QTC+M2Y8MpvIoO4xMIdC1RPxm27FnhCEFrpNqxfFmjCWUlvsCLiXm8b3VXlvC7caj\nN7uIeOb+GLftbmfzERE9H0DM54iBWNBsiyWuI2Vk3rnFizl8xyviXKmmz4CzrmTBmdduFy6LH8m+\nMu1nngjx3SHD/Yy/+OOnMJ8Axy63DKzx8BrmUBpmybbtXCUiqomFly3i/hXsXIL+5y+ueauEqyiK\n4hG64SqKoniEKyaFSVHDdsmOw12owYCerUBvrdVYdA8nYIY4lUe8nCywMlNi9TK66H6hi8gKnHjh\nNVYlzAguVysCE8jSCqt2DRPvr6rscZ/B77XjFacaiFF8X6cmfR7lnTBlkK1at/Kbv2PbxYOE5Wdd\njKJP1Pc1Q3YN02X34z+rA3DWlHs36v8t4UD12bHcsRhiQsMBTDxXhEmqnrJVxogXawn3IZTjtd8U\nxVya3VBlz6yyKSFkYN4LdTw7l8ZnnPFcnU0R/zx5qXPsc1d2atbrOb0KE8czdpGWdo1lHuM+HS8O\nERHRdB4mtpowwRlRnO+aXZBqpeh+ISSyRI3hPF/f4Bqc8vUerI/IGv9cmhwsv1grPhFLnOfjXc8J\n7+gFUAlXURTFI3TDVRRF8QhXTAqfm7nDGe+Ic/xtTkQYLM/A8+yzVd21LGJ3CxmYHNZExaqlOf69\noTn30zGjJ5COGx3dQkREZki8n3zCfNDL41VRQUxqH6MxxO/9z8r1RESUq+N6vG9vZ+Z8Pu+9/jFn\n/Owap1O/GNziHDNquOZtk4EIqFjnwZcptIGKXUkp4H56cqAC1doMsxpe6xX2jRTU0+1DbOIYisGr\nXxcnMeFDnORSF597PYVr4BbB4zADxAd3EBGRKbzfIZFunbdTd49YiD/ekkGqe0DYdh6dYdW+ckJU\nbXOJ5gGYBx6OsYe/2od5T5ZxbRfKvN6lCcdYw1oxZvF75Th/xvIgtr65f8wZl4Z4Dn5xDqlxRBYV\nt7KJQ8Z5mzJISkw3ZC838+QZuhgq4SqKoniEbriKoige4YpO+NQLKEZ8YhtHHOTy8GiGF4R6UWVV\nVbbYaRahBi4vCbXE1h7j86KVjUs0p1EoPFTgoG+jinmJbF3HS2k2cF7LNah5P1qElznTw0kduZzQ\nVW7uzJzP54M9h53x/2nbCk6vwNtcE22PDNuU4K/BdLAuYkFo8Zb9GZl26xbNqGyFbH9/EmaEy7dD\nXb+thwtjXxlFpS1T5Co/nsS6/G6d3fmFHe6bRcwFeK+jS2zSyY/Bay/jJPwFnk8lgp9PWVDnx5cQ\n3dK011t81v1Ii+HH4c0/M8KV5WSyUraC5zSb42fdt4BzSEzhPkSX8HuVPj4u02rdYu5m7EFtU4Eh\n0tsLW2D6a9rZSNJ8ZUUxjooC8rkE/93BK1Et7EKohKsoiuIRrrzehx7GePkqfiP3HsMbLHUGqX3G\nS3ZDe1O8SS5FM7bV/Uh8DZX4zRhYk8Vq3cHogROgLSQFi1LkwzBqdwEyRd/6ekrUbO3G7+XztuTr\nQUsRWSDndIWlktopSNt9L4hasaF2aq84FpExiPi70WW+D61uSARuYVRF7GT7+jcwmUwIa2kgyGmv\nrwzD+ZHwQ/JK+Q854yO9HCt6uO6+hOtP4joFiqxK9B7COZQGMYd27dxSFfMuifhjQ0hZrWX3i9Y4\n3/vQ8864b9uriIhosjLsHPM1sFZ67NK53S/BeWk9fxSfDcFR2ZVhR3jjEvfTk4s7oBm1a0EnzghH\nN0LvHe2uOoz1t2MbNJWeCNbYMYPrTk++GZrIhVAJV1EUxSN0w1UURfEIn2VZ7uu2iqIoikq4iqIo\nXqEbrqIoikfohqsoiuIRuuEqiqJ4hG64iqIoHqEbrqIoikfohqsoiuIRuuEqiqJ4hG64iqIoHqEb\nrqIoikfohqsoiuIRuuEqiqJ4hG64iqIoHqEbrqIoikfohqsoiuIRuuEqiqJ4hG64iqIoHqEbrqIo\nikfohqsoiuIRuuEqiqJ4hG64iqIoHqEbrqIoikfohqsoiuIR/y9+JXFB57REfQAAAABJRU5ErkJg\ngg==\n",
|
|
"text/plain": [
|
|
"\u003cFigure size 600x400 with 49 Axes\u003e"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"#@title static visualization of intrinsic rewards and value function, sweeping over 2D w's\n",
|
|
"plot_size = 7\n",
|
|
"w_gran = int(plot_size**2)\n",
|
|
"eval_feed_dict = {}\n",
|
|
"eval_feed_dict[s_ph] = np.arange(num_states)[np.newaxis]\n",
|
|
"x, y = pol2cart(1, np.linspace(0, 2*np.pi, w_gran))\n",
|
|
"all_w = np.dstack((x, y))[0]\n",
|
|
"if phi_dim \u003e 2:\n",
|
|
" all_w = np.concatenate([all_w, np.zeros([w_gran, phi_dim-2])], -1)\n",
|
|
"per_state_phi = sess.run(phi, feed_dict=eval_feed_dict)[0]\n",
|
|
"for i in range(w_gran):\n",
|
|
" cur_w = sample_sphere(size=[1])\n",
|
|
" eval_feed_dict[w_ph] = np.tile(cur_w[np.newaxis], [1, num_states, 1])\n",
|
|
" per_state_q = sess.run(gpi_q, feed_dict=eval_feed_dict)[0]\n",
|
|
" max_value_img = np.mean(per_state_q, -1).reshape([grid_size, grid_size])\n",
|
|
" plt.figure(0)\n",
|
|
" plt.suptitle('reward')\n",
|
|
" plt.subplot(plot_size, plot_size, i+1)\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(np.dot(per_state_phi, cur_w[0]).reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')\n",
|
|
" plt.figure(1)\n",
|
|
" plt.suptitle('max q value')\n",
|
|
" plt.subplot(plot_size, plot_size, i+1)\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(max_value_img, interpolation='none', aspect='equal')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"cellView": "both",
|
|
"colab": {
|
|
"height": 214
|
|
},
|
|
"colab_type": "code",
|
|
"executionInfo": {
|
|
"elapsed": 673,
|
|
"status": "ok",
|
|
"timestamp": 1582738531949,
|
|
"user": {
|
|
"displayName": "Steven Hansen",
|
|
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAdwCIvEbi7Cs-rjSAqUHjUTuBXdF5DAZmwS69Z=s64",
|
|
"userId": "12398999399819072329"
|
|
},
|
|
"user_tz": 0
|
|
},
|
|
"id": "1-OxbpHjkMAM",
|
|
"outputId": "77be8746-7229-43c4-f5be-c8a205073fab"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"\u003cFigure size 600x400 with 5 Axes\u003e"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"#@title visualize each feature dimensions per state\n",
|
|
"plt.figure()\n",
|
|
"plt.suptitle('per dim phi values')\n",
|
|
"for j in range(phi_dim):\n",
|
|
" plt.subplot(1, phi_dim, j+1)\n",
|
|
" plt.axis('off')\n",
|
|
" plt.imshow(per_state_phi[:, j].reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 0,
|
|
"metadata": {
|
|
"cellView": "both",
|
|
"colab": {
|
|
"height": 298
|
|
},
|
|
"colab_type": "code",
|
|
"executionInfo": {
|
|
"elapsed": 872,
|
|
"status": "ok",
|
|
"timestamp": 1582748609805,
|
|
"user": {
|
|
"displayName": "Steven Hansen",
|
|
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAdwCIvEbi7Cs-rjSAqUHjUTuBXdF5DAZmwS69Z=s64",
|
|
"userId": "12398999399819072329"
|
|
},
|
|
"user_tz": 0
|
|
},
|
|
"id": "qNZtbgo8E6bW",
|
|
"outputId": "0b0099d8-75dd-486b-e2eb-d9f04db06caf"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"\u003cmatplotlib.image.AxesImage at 0x7fa7caf85940\u003e"
|
|
]
|
|
},
|
|
"execution_count": 116,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"\u003cFigure size 600x400 with 6 Axes\u003e"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"#@title fast inference on a random reward function\n",
|
|
"r = np.zeros([grid_size, grid_size])\n",
|
|
"num_boxes = 2 # @param {type: 'integer'}\n",
|
|
"box_size = 4 # @param {type: 'integer'}\n",
|
|
"for _ in range(num_boxes):\n",
|
|
" box_c = np.random.randint(grid_size-box_size)\n",
|
|
" box_r = np.random.randint(grid_size-box_size)\n",
|
|
" r[box_r: box_r+box_size, box_c: box_c+box_size] += 1.0\n",
|
|
"r = np.reshape(r, [num_states])\n",
|
|
"sol, res, _, _ = np.linalg.lstsq(per_state_phi, r)\n",
|
|
"sol /= np.linalg.norm(sol)\n",
|
|
"eval_feed_dict[w_ph] = np.tile(sol[np.newaxis, np.newaxis], [1, num_states, 1])\n",
|
|
"per_state_q = sess.run(gpi_q, feed_dict=eval_feed_dict)[0]\n",
|
|
"max_value_img = np.mean(per_state_q, -1).reshape([grid_size, grid_size])\n",
|
|
"policy = np.argmax(per_state_q, -1)\n",
|
|
"state_visit = np.ones([num_states])\n",
|
|
"s = reset(size=1000)\n",
|
|
"for t in range(traj_len):\n",
|
|
" s = step(s, policy[s])\n",
|
|
" visit, count = np.unique(s, return_counts=True)\n",
|
|
" state_visit[visit] += count\n",
|
|
"plt.figure(0)\n",
|
|
"plt.subplot(231)\n",
|
|
"plt.title('true reward')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.imshow(r.reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')\n",
|
|
"plt.subplot(232)\n",
|
|
"plt.title('pred reward')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.imshow(np.dot(per_state_phi, sol).reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')\n",
|
|
"plt.subplot(233)\n",
|
|
"plt.title('max q value')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.imshow(max_value_img, interpolation='none', aspect='equal')\n",
|
|
"plt.subplot(234)\n",
|
|
"plt.title('log visitation')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.imshow(np.log(state_visit.reshape(\n",
|
|
" [grid_size, grid_size])), interpolation='none', aspect='equal')\n",
|
|
"plt.subplot(235)\n",
|
|
"plt.title('current w')\n",
|
|
"plt.plot([0, sol[0]], [0, sol[1]])\n",
|
|
"plt.xlim([-1, 1])\n",
|
|
"plt.ylim([-1, 1])\n",
|
|
"plt.subplot(236)\n",
|
|
"plt.title('policy')\n",
|
|
"plt.axis('off')\n",
|
|
"plt.imshow(policy.reshape(\n",
|
|
" [grid_size, grid_size]), interpolation='none', aspect='equal')"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"collapsed_sections": [
|
|
"N1EHYIqxd80m"
|
|
],
|
|
"last_runtime": {
|
|
"build_target": "//learning/deepmind/dm_python:dm_notebook3",
|
|
"kind": "private"
|
|
},
|
|
"name": "VISR_ICLR2020.ipynb",
|
|
"provenance": [
|
|
{
|
|
"file_id": "1dt9q7MLDsmWfP4KMeCqAarQWpK1AcB10",
|
|
"timestamp": 1582748793791
|
|
}
|
|
],
|
|
"toc_visible": true
|
|
},
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"name": "python3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0
|
|
}
|