Files
zhoujie2104231 2757a4d0d2 chore: 添加Stock-Prediction-Models项目文件
添加了Stock-Prediction-Models项目的多个文件,包括数据集、模型代码、README文档和CSS样式文件。这些文件用于股票预测模型的训练和展示,涵盖了LSTM、GRU等深度学习模型的应用。
2025-04-27 16:28:06 +08:00

624 lines
77 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-11-02</td>\n",
" <td>778.200012</td>\n",
" <td>781.650024</td>\n",
" <td>763.450012</td>\n",
" <td>768.700012</td>\n",
" <td>768.700012</td>\n",
" <td>1872400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-11-03</td>\n",
" <td>767.250000</td>\n",
" <td>769.950012</td>\n",
" <td>759.030029</td>\n",
" <td>762.130005</td>\n",
" <td>762.130005</td>\n",
" <td>1943200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-11-04</td>\n",
" <td>750.659973</td>\n",
" <td>770.359985</td>\n",
" <td>750.560974</td>\n",
" <td>762.020020</td>\n",
" <td>762.020020</td>\n",
" <td>2134800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-11-07</td>\n",
" <td>774.500000</td>\n",
" <td>785.190002</td>\n",
" <td>772.549988</td>\n",
" <td>782.520020</td>\n",
" <td>782.520020</td>\n",
" <td>1585100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-11-08</td>\n",
" <td>783.400024</td>\n",
" <td>795.632996</td>\n",
" <td>780.190002</td>\n",
" <td>790.510010</td>\n",
" <td>790.510010</td>\n",
" <td>1350800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n",
"1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n",
"2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n",
"3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n",
"4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n",
"\n",
" Volume \n",
"0 1872400 \n",
"1 1943200 \n",
"2 2134800 \n",
"3 1585100 \n",
"4 1350800 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from collections import deque\n",
"import random\n",
"\n",
"class Agent:\n",
"\n",
" LEARNING_RATE = 0.003\n",
" BATCH_SIZE = 32\n",
" LAYER_SIZE = 500\n",
" OUTPUT_SIZE = 3\n",
" EPSILON = 0.5\n",
" DECAY_RATE = 0.005\n",
" MIN_EPSILON = 0.1\n",
" GAMMA = 0.99\n",
" MEMORIES = deque()\n",
" COPY = 1000\n",
" T_COPY = 0\n",
" MEMORY_SIZE = 300\n",
" \n",
" def __init__(self, state_size, window_size, trend, skip):\n",
" self.state_size = state_size\n",
" self.window_size = window_size\n",
" self.half_window = window_size // 2\n",
" self.trend = trend\n",
" self.skip = skip\n",
" tf.reset_default_graph()\n",
" self.X = tf.placeholder(tf.float32, (None, self.state_size))\n",
" self.Y = tf.placeholder(tf.float32, (None, self.state_size))\n",
" self.ACTION = tf.placeholder(tf.float32, (None))\n",
" self.REWARD = tf.placeholder(tf.float32, (None))\n",
" self.batch_size = tf.shape(self.ACTION)[0]\n",
" \n",
" with tf.variable_scope('curiosity_model'):\n",
" action = tf.reshape(self.ACTION, (-1,1))\n",
" state_action = tf.concat([self.X, action], axis=1)\n",
" save_state = tf.identity(self.Y)\n",
" \n",
" feed = tf.layers.dense(state_action, 32, activation=tf.nn.relu)\n",
" self.curiosity_logits = tf.layers.dense(feed, self.state_size)\n",
" self.curiosity_cost = tf.reduce_sum(tf.square(save_state - self.curiosity_logits), axis=1)\n",
" \n",
" self.curiosity_optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE)\\\n",
" .minimize(tf.reduce_mean(self.curiosity_cost))\n",
" \n",
" total_reward = tf.add(self.curiosity_cost, self.REWARD)\n",
" \n",
" with tf.variable_scope(\"q_model\"):\n",
" with tf.variable_scope(\"eval_net\"):\n",
" x_action = tf.layers.dense(self.X, 128, tf.nn.relu)\n",
" tensor_action, tensor_validation = tf.split(x_action,2,1)\n",
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
" self.logits = feed_validation + \\\n",
" tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
" \n",
" with tf.variable_scope(\"target_net\"):\n",
" y_action = tf.layers.dense(self.Y, 128, tf.nn.relu)\n",
" tensor_action, tensor_validation = tf.split(y_action,2,1)\n",
" feed_action = tf.layers.dense(tensor_action, self.OUTPUT_SIZE)\n",
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
" y_q = feed_validation + \\\n",
" tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
" \n",
" q_target = total_reward + self.GAMMA * tf.reduce_max(y_q, axis=1)\n",
" action = tf.cast(self.ACTION, tf.int32)\n",
" action_indices = tf.stack([tf.range(self.batch_size, dtype=tf.int32), action], axis=1)\n",
" q = tf.gather_nd(params=self.logits, indices=action_indices)\n",
" self.cost = tf.losses.mean_squared_error(labels=q_target, predictions=q)\n",
" self.optimizer = tf.train.RMSPropOptimizer(self.LEARNING_RATE).minimize(\n",
" self.cost, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, \"q_model/eval_net\"))\n",
" \n",
" t_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/target_net')\n",
" e_params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='q_model/eval_net')\n",
" self.target_replace_op = [tf.assign(t, e) for t, e in zip(t_params, e_params)]\n",
" \n",
" self.sess = tf.InteractiveSession()\n",
" self.sess.run(tf.global_variables_initializer())\n",
" \n",
" def _memorize(self, state, action, reward, new_state, done):\n",
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
" self.MEMORIES.popleft()\n",
" \n",
" def get_state(self, t):\n",
" window_size = self.window_size + 1\n",
" d = t - window_size + 1\n",
" block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n",
" res = []\n",
" for i in range(window_size - 1):\n",
" res.append(block[i + 1] - block[i])\n",
" return np.array(res)\n",
" \n",
" def predict(self, inputs):\n",
" return self.sess.run(self.logits, feed_dict={self.X:inputs})\n",
" \n",
" def get_predicted_action(self, sequence):\n",
" prediction = self.predict(np.array(sequence))[0]\n",
" return np.argmax(prediction)\n",
" \n",
" def _select_action(self, state):\n",
" if np.random.rand() < self.EPSILON:\n",
" action = np.random.randint(self.OUTPUT_SIZE)\n",
" else:\n",
" action = self.get_predicted_action([state])\n",
" return action\n",
" \n",
" def _construct_memories(self, replay):\n",
" states = np.array([a[0] for a in replay])\n",
" actions = np.array([a[1] for a in replay])\n",
" rewards = np.array([a[2] for a in replay])\n",
" new_states = np.array([a[3] for a in replay])\n",
" if (self.T_COPY + 1) % self.COPY == 0:\n",
" self.sess.run(self.target_replace_op)\n",
" \n",
" cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict = {\n",
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
" })\n",
" \n",
" if (self.T_COPY + 1) % self.COPY == 0:\n",
" self.sess.run(self.curiosity_optimizer, feed_dict = {\n",
" self.X: states, self.Y: new_states, self.ACTION: actions, self.REWARD: rewards\n",
" })\n",
" return cost\n",
" \n",
" def buy(self, initial_money):\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self._select_action(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and initial_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" initial_money -= self.trend[t]\n",
" states_buy.append(t)\n",
" print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n",
" \n",
" elif action == 2 and len(inventory):\n",
" bought_price = inventory.pop(0)\n",
" initial_money += self.trend[t]\n",
" states_sell.append(t)\n",
" try:\n",
" invest = ((close[t] - bought_price) / bought_price) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n",
" % (t, close[t], invest, initial_money)\n",
" )\n",
" \n",
" state = next_state\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest\n",
" \n",
" def train(self, iterations, checkpoint, initial_money):\n",
" for i in range(iterations):\n",
" total_profit = 0\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" starting_money = initial_money\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" \n",
" action = self._select_action(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and starting_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" starting_money -= self.trend[t]\n",
" \n",
" elif action == 2 and len(inventory) > 0:\n",
" bought_price = inventory.pop(0)\n",
" total_profit += self.trend[t] - bought_price\n",
" starting_money += self.trend[t]\n",
" \n",
" invest = ((starting_money - initial_money) / initial_money)\n",
" \n",
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
" state = next_state\n",
" replay = random.sample(self.MEMORIES, batch_size)\n",
" cost = self._construct_memories(replay)\n",
" self.T_COPY += 1\n",
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
" if (i+1) % checkpoint == 0:\n",
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
" starting_money))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:From <ipython-input-3-e49b5b607a66>:53: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"keep_dims is deprecated, use keepdims instead\n",
"epoch: 10, total rewards: 698.460085.3, cost: 596251.000000, total money: 10698.460085\n",
"epoch: 20, total rewards: 1683.164917.3, cost: 5890915.500000, total money: 6720.204895\n",
"epoch: 30, total rewards: 1686.875004.3, cost: 75077.554688, total money: 6721.424992\n",
"epoch: 40, total rewards: 541.999876.3, cost: 2707843.750000, total money: 9525.359861\n",
"epoch: 50, total rewards: 1668.824950.3, cost: 32719.388672, total money: 7666.774900\n",
"epoch: 60, total rewards: 751.654909.3, cost: 1165742.750000, total money: 8743.134889\n",
"epoch: 70, total rewards: 1637.889772.3, cost: 325201.937500, total money: 6669.909730\n",
"epoch: 80, total rewards: 587.055053.3, cost: 1527037.250000, total money: 892.705077\n",
"epoch: 90, total rewards: 2170.969727.3, cost: 122936.546875, total money: 8204.549683\n",
"epoch: 100, total rewards: 1565.850155.3, cost: 844705.187500, total money: 19.270138\n",
"epoch: 110, total rewards: 1733.244930.3, cost: 557043.125000, total money: 6744.174861\n",
"epoch: 120, total rewards: 1282.489866.3, cost: 3785043.750000, total money: 8328.149839\n",
"epoch: 130, total rewards: 1260.559873.3, cost: 596946.312500, total money: 6319.639890\n",
"epoch: 140, total rewards: 1346.769778.3, cost: 26543662.000000, total money: 10330.129763\n",
"epoch: 150, total rewards: 2415.594848.3, cost: 851761.625000, total money: 9467.174865\n",
"epoch: 160, total rewards: 1033.800112.3, cost: 3596937.500000, total money: 9044.600099\n",
"epoch: 170, total rewards: 1597.439823.3, cost: 511038.375000, total money: 93.789859\n",
"epoch: 180, total rewards: 1736.860354.3, cost: 3795484.000000, total money: 1011.990359\n",
"epoch: 190, total rewards: 1682.540215.3, cost: 657330.250000, total money: 8675.460198\n",
"epoch: 200, total rewards: 875.094668.3, cost: 30907612.000000, total money: 10875.094668\n"
]
}
],
"source": [
"close = df.Close.values.tolist()\n",
"initial_money = 10000\n",
"window_size = 30\n",
"skip = 1\n",
"batch_size = 32\n",
"agent = Agent(state_size = window_size, \n",
" window_size = window_size, \n",
" trend = close, \n",
" skip = skip)\n",
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 3: buy 1 unit at price 782.520020, total balance 9217.479980\n",
"day 4: buy 1 unit at price 790.510010, total balance 8426.969970\n",
"day 5: buy 1 unit at price 785.309998, total balance 7641.659972\n",
"day 6: buy 1 unit at price 762.559998, total balance 6879.099974\n",
"day 7: buy 1 unit at price 754.020020, total balance 6125.079954\n",
"day 9: buy 1 unit at price 758.489990, total balance 5366.589964\n",
"day 10, sell 1 unit at price 764.479980, investment -2.305377 %, total balance 6131.069944,\n",
"day 11: buy 1 unit at price 771.229980, total balance 5359.839964\n",
"day 13: buy 1 unit at price 769.200012, total balance 4590.639952\n",
"day 15: buy 1 unit at price 760.989990, total balance 3829.649962\n",
"day 16: buy 1 unit at price 761.679993, total balance 3067.969969\n",
"day 17: buy 1 unit at price 768.239990, total balance 2299.729979\n",
"day 19: buy 1 unit at price 758.039978, total balance 1541.690001\n",
"day 21: buy 1 unit at price 750.500000, total balance 791.190001\n",
"day 22, sell 1 unit at price 762.520020, investment -3.540751 %, total balance 1553.710021,\n",
"day 23, sell 1 unit at price 759.109985, investment -3.336264 %, total balance 2312.820006,\n",
"day 24: buy 1 unit at price 771.190002, total balance 1541.630004\n",
"day 25, sell 1 unit at price 776.419983, investment 1.817560 %, total balance 2318.049987,\n",
"day 27, sell 1 unit at price 789.270020, investment 4.674942 %, total balance 3107.320007,\n",
"day 29, sell 1 unit at price 797.070007, investment 5.086424 %, total balance 3904.390014,\n",
"day 30, sell 1 unit at price 797.849976, investment 3.451629 %, total balance 4702.239990,\n",
"day 32: buy 1 unit at price 794.200012, total balance 3908.039978\n",
"day 33, sell 1 unit at price 796.419983, investment 3.538738 %, total balance 4704.459961,\n",
"day 34, sell 1 unit at price 794.559998, investment 4.411360 %, total balance 5499.019959,\n",
"day 38: buy 1 unit at price 785.049988, total balance 4713.969971\n",
"day 39, sell 1 unit at price 782.789978, investment 2.771503 %, total balance 5496.759949,\n",
"day 40, sell 1 unit at price 771.820007, investment 0.466002 %, total balance 6268.579956,\n",
"day 41: buy 1 unit at price 786.140015, total balance 5482.439941\n",
"day 45: buy 1 unit at price 806.650024, total balance 4675.789917\n",
"day 47, sell 1 unit at price 807.909973, investment 6.578808 %, total balance 5483.699890,\n",
"day 50: buy 1 unit at price 804.609985, total balance 4679.089905\n",
"day 51, sell 1 unit at price 806.070007, investment 7.404398 %, total balance 5485.159912,\n",
"day 52, sell 1 unit at price 802.174988, investment 4.017815 %, total balance 6287.334900,\n",
"day 53: buy 1 unit at price 805.020020, total balance 5482.314880\n",
"day 54, sell 1 unit at price 819.309998, investment 3.161670 %, total balance 6301.624878,\n",
"day 56: buy 1 unit at price 835.669983, total balance 5465.954895\n",
"day 58, sell 1 unit at price 823.309998, investment 4.873576 %, total balance 6289.264893,\n",
"day 59, sell 1 unit at price 802.320007, investment 2.058157 %, total balance 7091.584900,\n",
"day 60: buy 1 unit at price 796.789978, total balance 6294.794922\n",
"day 61, sell 1 unit at price 795.695007, investment -1.358088 %, total balance 7090.489929,\n",
"day 62, sell 1 unit at price 798.530029, investment -0.755640 %, total balance 7889.019958,\n",
"day 63, sell 1 unit at price 801.489990, investment -0.438502 %, total balance 8690.509948,\n",
"day 66: buy 1 unit at price 808.380005, total balance 7882.129943\n",
"day 67, sell 1 unit at price 809.559998, investment -3.124437 %, total balance 8691.689941,\n",
"day 68: buy 1 unit at price 813.669983, total balance 7878.019958\n",
"day 69, sell 1 unit at price 819.239990, investment 2.817557 %, total balance 8697.259948,\n",
"day 70, sell 1 unit at price 820.450012, investment 1.493111 %, total balance 9517.709960,\n",
"day 72, sell 1 unit at price 824.159973, investment 1.289219 %, total balance 10341.869933,\n",
"day 73: buy 1 unit at price 828.070007, total balance 9513.799926\n",
"day 74, sell 1 unit at price 831.659973, investment 0.433534 %, total balance 10345.459899,\n",
"day 75: buy 1 unit at price 830.760010, total balance 9514.699889\n",
"day 76: buy 1 unit at price 831.330017, total balance 8683.369872\n",
"day 78: buy 1 unit at price 829.280029, total balance 7854.089843\n",
"day 79: buy 1 unit at price 823.210022, total balance 7030.879821\n",
"day 80: buy 1 unit at price 835.239990, total balance 6195.639831\n",
"day 81, sell 1 unit at price 830.630005, investment -0.015649 %, total balance 7026.269836,\n",
"day 82, sell 1 unit at price 829.080017, investment -0.270651 %, total balance 7855.349853,\n",
"day 84, sell 1 unit at price 831.909973, investment 0.317136 %, total balance 8687.259826,\n",
"day 85: buy 1 unit at price 835.369995, total balance 7851.889831\n",
"day 86: buy 1 unit at price 838.679993, total balance 7013.209838\n",
"day 88: buy 1 unit at price 845.539978, total balance 6167.669860\n",
"day 89: buy 1 unit at price 845.619995, total balance 5322.049865\n",
"day 90, sell 1 unit at price 847.200012, investment 2.914200 %, total balance 6169.249877,\n",
"day 91: buy 1 unit at price 848.780029, total balance 5320.469848\n",
"day 92: buy 1 unit at price 852.119995, total balance 4468.349853\n",
"day 93, sell 1 unit at price 848.400024, investment 1.575599 %, total balance 5316.749877,\n",
"day 94: buy 1 unit at price 830.460022, total balance 4486.289855\n",
"day 95: buy 1 unit at price 829.590027, total balance 3656.699828\n",
"day 96, sell 1 unit at price 817.580017, investment -2.129593 %, total balance 4474.279845,\n",
"day 97: buy 1 unit at price 814.429993, total balance 3659.849852\n",
"day 98, sell 1 unit at price 819.510010, investment -2.285733 %, total balance 4479.359862,\n",
"day 100: buy 1 unit at price 831.409973, total balance 3647.949889\n",
"day 101, sell 1 unit at price 831.500000, investment -1.660475 %, total balance 4479.449889,\n",
"day 103: buy 1 unit at price 838.549988, total balance 3640.899901\n",
"day 104: buy 1 unit at price 834.570007, total balance 2806.329894\n",
"day 105, sell 1 unit at price 831.409973, investment -1.680426 %, total balance 3637.739867,\n",
"day 106: buy 1 unit at price 827.880005, total balance 2809.859862\n",
"day 108: buy 1 unit at price 824.729980, total balance 1985.129882\n",
"day 109: buy 1 unit at price 823.349976, total balance 1161.779906\n",
"day 110: buy 1 unit at price 824.320007, total balance 337.459899\n",
"day 112, sell 1 unit at price 837.169983, investment -1.367851 %, total balance 1174.629882,\n",
"day 113: buy 1 unit at price 836.820007, total balance 337.809875\n",
"day 115, sell 1 unit at price 841.650024, investment -1.228697 %, total balance 1179.459899,\n",
"day 116, sell 1 unit at price 843.190002, investment 1.532883 %, total balance 2022.649901,\n",
"day 117, sell 1 unit at price 862.760010, investment 3.998358 %, total balance 2885.409911,\n",
"day 118: buy 1 unit at price 872.299988, total balance 2013.109923\n",
"day 119, sell 1 unit at price 871.729980, investment 7.035594 %, total balance 2884.839903,\n",
"day 120, sell 1 unit at price 874.250000, investment 5.152696 %, total balance 3759.089903,\n",
"day 123, sell 1 unit at price 916.440002, investment 9.288655 %, total balance 4675.529905,\n",
"day 124: buy 1 unit at price 927.039978, total balance 3748.489927\n",
"day 126, sell 1 unit at price 927.130005, investment 11.090741 %, total balance 4675.619932,\n",
"day 127, sell 1 unit at price 934.299988, investment 12.854518 %, total balance 5609.919920,\n",
"day 128, sell 1 unit at price 932.169983, investment 13.027294 %, total balance 6542.089903,\n",
"day 129: buy 1 unit at price 928.780029, total balance 5613.309874\n",
"day 133, sell 1 unit at price 943.000000, investment 14.532098 %, total balance 6556.309874,\n",
"day 137, sell 1 unit at price 941.859985, investment 14.259023 %, total balance 7498.169859,\n",
"day 140, sell 1 unit at price 969.539978, investment 15.860038 %, total balance 8467.709837,\n",
"day 141: buy 1 unit at price 971.469971, total balance 7496.239866\n",
"day 142, sell 1 unit at price 975.880005, investment 11.874357 %, total balance 8472.119871,\n",
"day 143, sell 1 unit at price 964.859985, investment 4.079652 %, total balance 9436.979856,\n",
"day 144, sell 1 unit at price 966.950012, investment 4.109690 %, total balance 10403.929868,\n",
"day 145, sell 1 unit at price 975.599976, investment 0.425129 %, total balance 11379.529844,\n",
"day 147: buy 1 unit at price 976.570007, total balance 10402.959837\n",
"day 148: buy 1 unit at price 980.940002, total balance 9422.019835\n",
"day 149, sell 1 unit at price 983.409973, investment 0.700407 %, total balance 10405.429808,\n",
"day 150: buy 1 unit at price 949.830017, total balance 9455.599791\n",
"day 151, sell 1 unit at price 942.900024, investment -3.877911 %, total balance 10398.499815,\n",
"day 152, sell 1 unit at price 953.400024, investment 0.375857 %, total balance 11351.899839,\n",
"day 153: buy 1 unit at price 950.760010, total balance 10401.139829\n",
"day 155, sell 1 unit at price 939.780029, investment -1.154864 %, total balance 11340.919858,\n",
"day 156: buy 1 unit at price 957.369995, total balance 10383.549863\n",
"day 157: buy 1 unit at price 950.630005, total balance 9432.919858\n",
"day 158: buy 1 unit at price 959.450012, total balance 8473.469846\n",
"day 159, sell 1 unit at price 957.090027, investment -0.029243 %, total balance 9430.559873,\n",
"day 160: buy 1 unit at price 965.590027, total balance 8464.969846\n",
"day 162, sell 1 unit at price 927.330017, investment -2.451005 %, total balance 9392.299863,\n",
"day 163: buy 1 unit at price 940.489990, total balance 8451.809873\n",
"day 164: buy 1 unit at price 917.789978, total balance 7534.019895\n",
"day 165: buy 1 unit at price 908.729980, total balance 6625.289915\n",
"day 166, sell 1 unit at price 898.700012, investment -6.331752 %, total balance 7523.989927,\n",
"day 167, sell 1 unit at price 911.710022, investment -5.580008 %, total balance 8435.699949,\n",
"day 169: buy 1 unit at price 918.590027, total balance 7517.109922\n",
"day 170: buy 1 unit at price 928.799988, total balance 6588.309934\n",
"day 171: buy 1 unit at price 930.090027, total balance 5658.219907\n",
"day 172: buy 1 unit at price 943.830017, total balance 4714.389890\n",
"day 173: buy 1 unit at price 947.159973, total balance 3767.229917\n",
"day 175: buy 1 unit at price 953.419983, total balance 2813.809934\n",
"day 177: buy 1 unit at price 970.890015, total balance 1842.919919\n",
"day 178, sell 1 unit at price 968.150024, investment 2.941024 %, total balance 2811.069943,\n",
"day 179: buy 1 unit at price 972.919983, total balance 1838.149960\n",
"day 180: buy 1 unit at price 980.340027, total balance 857.809933\n",
"day 187, sell 1 unit at price 930.390015, investment 1.372867 %, total balance 1788.199948,\n",
"day 189, sell 1 unit at price 927.960022, investment 2.116145 %, total balance 2716.159970,\n",
"day 190, sell 1 unit at price 929.359985, investment 1.172444 %, total balance 3645.519955,\n",
"day 191, sell 1 unit at price 926.789978, investment -0.216409 %, total balance 4572.309933,\n",
"day 192, sell 1 unit at price 922.900024, investment -0.773044 %, total balance 5495.209957,\n",
"day 193: buy 1 unit at price 907.239990, total balance 4587.969967\n",
"day 196, sell 1 unit at price 922.219971, investment -2.289612 %, total balance 5510.189938,\n",
"day 197, sell 1 unit at price 926.960022, investment -2.132686 %, total balance 6437.149960,\n",
"day 198, sell 1 unit at price 910.979980, investment -4.451344 %, total balance 7348.129940,\n",
"day 200, sell 1 unit at price 906.659973, investment -6.615584 %, total balance 8254.789913,\n",
"day 201: buy 1 unit at price 924.690002, total balance 7330.099911\n",
"day 202: buy 1 unit at price 927.000000, total balance 6403.099911\n",
"day 204: buy 1 unit at price 915.890015, total balance 5487.209896\n",
"day 205: buy 1 unit at price 913.809998, total balance 4573.399898\n",
"day 206: buy 1 unit at price 921.289978, total balance 3652.109920\n",
"day 207: buy 1 unit at price 929.570007, total balance 2722.539913\n",
"day 208: buy 1 unit at price 939.330017, total balance 1783.209896\n",
"day 209: buy 1 unit at price 937.340027, total balance 845.869869\n",
"day 210, sell 1 unit at price 928.450012, investment -4.570774 %, total balance 1774.319881,\n",
"day 211: buy 1 unit at price 927.809998, total balance 846.509883\n",
"day 215, sell 1 unit at price 932.070007, investment -4.923804 %, total balance 1778.579890,\n",
"day 218: buy 1 unit at price 920.289978, total balance 858.289912\n",
"day 219, sell 1 unit at price 915.000000, investment 0.855343 %, total balance 1773.289912,\n",
"day 220, sell 1 unit at price 921.809998, investment -0.311456 %, total balance 2695.099910,\n",
"day 221, sell 1 unit at price 931.580017, investment 0.494069 %, total balance 3626.679927,\n",
"day 223: buy 1 unit at price 928.530029, total balance 2698.149898\n",
"day 225, sell 1 unit at price 924.859985, investment 0.979372 %, total balance 3623.009883,\n",
"day 228: buy 1 unit at price 959.109985, total balance 2663.899898\n",
"day 230, sell 1 unit at price 957.789978, investment 4.812814 %, total balance 3621.689876,\n",
"day 231, sell 1 unit at price 951.679993, investment 3.298637 %, total balance 4573.369869,\n",
"day 232, sell 1 unit at price 969.960022, investment 4.345021 %, total balance 5543.329891,\n",
"day 233, sell 1 unit at price 978.890015, investment 4.211512 %, total balance 6522.219906,\n",
"day 234, sell 1 unit at price 977.000000, investment 4.231119 %, total balance 7499.219906,\n",
"day 235, sell 1 unit at price 972.599976, investment 4.827495 %, total balance 8471.819882,\n",
"day 236, sell 1 unit at price 989.250000, investment 7.493293 %, total balance 9461.069882,\n",
"day 239: buy 1 unit at price 992.000000, total balance 8469.069882\n",
"day 240, sell 1 unit at price 992.179993, investment 6.854917 %, total balance 9461.249875,\n",
"day 242, sell 1 unit at price 984.450012, investment 2.642036 %, total balance 10445.699887,\n",
"day 243: buy 1 unit at price 988.200012, total balance 9457.499875\n",
"day 245, sell 1 unit at price 970.539978, investment -2.163309 %, total balance 10428.039853,\n",
"day 246, sell 1 unit at price 973.330017, investment -1.504756 %, total balance 11401.369870,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA34AAAFBCAYAAAAomn1FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XeYVNX5wPHvvTOzbKMsW+i9HHonCFhQ7CCgIFhjiW6UGDXBGLsxGqMmJv6MscSIJqIG7CZYsGFBUUEFC3voS4dlWdjK7E75/XHvDLOzM7OzlS3v53l43J3bzp25s973vu85x/D7/QghhBBCCCGEaLnMo90AIYQQQgghhBANSwI/IYQQQgghhGjhJPATQgghhBBCiBZOAj8hhBBCCCGEaOEk8BNCCCGEEEKIFk4CPyGEEEIIIYRo4STwE0K0akqpZ5RS9zTAfo9TSun63q9ovpRSlyqlPo2yrKdSqlgp5WjsdgkhhGgdnEe7AUIIEYtSaitwhdb6vYZYv6ForT8BVH3vVyl1NzALGAzco7X+XZT1FgKXAQO01hvt1zoCTwGnAvuBm7XWz9vLugBPAOOALkAfrfXWGO34EBgGtAG2AHdorV8PWZ4J/B8wDfABb2qtL7SXdQMeBY4DSu3zeDxk25OAPwP97Xbep7X+h73sFuCWkKY47DZkaa33K6XaAI8Bc+x9P6C1/ku08wg7p2eAHVrr2xpi/Vi01tuA1Lrup7aUUlOARVrr7kfp+Mvt4/8zxjr/AE4ABgCXa62fibLe+8BJgEtr7YmyzlTg70BP4AvgUq11rr1sLnA9MAr4Ums9JWS7DOB1YBDWtbcOuEFrvSJknb7Aw3Zb3cBCrfWN9rLB9nHHAnnAb7TWr4ZsewVwE9AZ+NQ+z132sguAB+19Xqa1/tB+vR/wLHCc1tob7f0TQgjJ+AkhRPOyEbgRWBptBaXUsUC/CIv+DpQDnYALgceUUkPtZT7gbWB2nO24DuiitW4HZAOL7OAx4BVgD9aNdRZWIBewCCtY7IQVGN6rlDrRbrsLeBUrCG0PzAP+opQaCaC1vldrnRr4B9wPLNda77f3/TuswKAXcCJwo1Lq9DjPSTRta4D5wNfRVlBKXQi4Yu3EDt5eAW4HOgKrgMUhqxwAHgLui7B5MXA5kAmkYV1//1VKOe19JwDvAh9gBW/dsa537HVeB/5nHzfwvRloL58C3AvMtJdvAV4I2fY+YAxwDfC3kDY9DPxKgj4hRHUk4yeEaLKUUs9iBQ7/VUp5gd9rrR9QSs0A/gh0A74FrtZar4ux/otY2aUkrJvHq7XWP8RxfAfwAHAJUIT1tP1v2JkEpdRlWEFYd6yn9/drrZ+wt51CSAbFzkQ+AvwUKyh5G7hEa33YvhF9BjgWKwD7AThBa+0Lb5PW+l/2/i6M0man3cZL7HMNvJ6CFdQN01oXA58qpd4ALgZu0lrvBR4N3MBWR2u9NuRXP9bNdg9gt1LqVPvnKSE3o9/Y7UgFpgBztdYVwBql1EtYN9MfYt3wtgOe1Vr7ga+UUuuAIaHnY+/LwHo/7wp5+RKs7E0BUKCUehK4FOv9jkoplY0VDPuVUtcDH2qtz7IzNI9hZX92YmVJ34ix/k3AlVjB7nbg1tCMTozj98a60Q9cW8uBT7AyVyOAz4EL7KzmW8BSrfUjIduvAe7SWr+ilBqEdQ0Eskq3a62X2OudiRWE9wAKgb/a5/cW0EYpVWzvciBWYDIUK8M0E9iKdQ3NBn5lv/4zrfUye9/tgb8AZ2Jdx08Dd2qtvUqpS4ErgJXAz4CDwHyt9VtKqT9gfT+PUUo9BDyjtb4m/D3SWv/dPs7hKO9he+BOrGvi8xhv9znAD1rrF+3tfgfsV0oN0lrnBKoF7OxbeBsOA9pebgJerACwI7AP61rbFZZlDnxXBgFdgb/a1/YHSqkVWN/B24HpwIuBv012dn+nndErBnZqrXcrpd4D+trrzLFf/yLG+QohBCAZPyFEE6a1vhjYBpxlZ3gesJ+Ov4BVipUJvIkV6CVEWt/e1VtYWaAsrGzBc3E24UrgDKyb/jFYJZah9mHdrLXDKqv8q1JqTIz9zQVOB/pg3cxfar++ANhhn08nrFJGf5xtDPcr4OOwwAysG3mP1np9yGtrsG7sa0Up9T/7JvwLYDlW5gTgGKyb438ppfKVUl8ppU6wlxlh/w38PAzADkBfAC5TSjmUUhOxAuVIfeOOw/pMX7bbk4ZVphoaIMZ1jnYp6XNYpaGpdhDnAv4LLLOP80vgOaWUirS+vatNdrvaYwWk4ZnQmrgA67rKAhKAG+zXXwDOD6yklBqC9R4ttQP8d4Hn7e3Owwroh9irPwX8XGvdFus9/0BrXYJ1ne8Kyabustc/C6uMMA0reH8H696hG/B7rMxswDOAB6tEdzRWSXFo8DQB67rIwHqg8pRSytBa34oV5F5jH7tK0Bene7GC2D3VrDeUkGvEPv9N1OC7oJRaCxwG3gD+qbXeZy86BtiqlHpLKbVfKbVcKTU8xq6C137I7+E/D8MK4NOVUt2BU4AflFJtgduAm+NttxCidZPATwjR3MzDyna8a2eM/oyVyZsUbQOt9UKtdZHW2o1VCjjSzg5UZy7wf1rrHXYGqVLpl9Z6qdZ6k9bar7X+CCtAOC7G/h7WWu/SWh/ACihG2a9XYAUsvbTWFVrrT+yMQI0opXoAPwfuiLA4FSvDE+oQ0LamxwnQWk+3tz8TWBaSoeyOddP/IVa524PA60qpDK11EbACuF0plWgHyrOB5JBdv2CfgxsrILhVa709QhMuAV6yM5iBcwycV32c4zH2Pu/TWpdrrT/AKtM7P9oGWusX7c/Yp7VeDGwAflLL4z+ttV6vtS4DlnDkenkVGKWU6mX/fiHwin19Twe2aq2f1lp7tNbfYAXG59rrVgBDlFLttNYFWuuoZZO2T7TW79h95V7Eejhxn/3d+w/QWynVQSnVCes6uF5rXWIHQn/FCjwDcrXWT9pZ4H9hXfOdavneVKKUGgdMpnIJZDSpVL5GoIbXidZ6BNYDnwuo/FCiO9Y5P4yV3VuKde0nYAW9+4DfKKVcdmb8BI5c+28Dc5VSI5RSSVjfAT+QbH+3rgZewnoAcCXWg4W/ASOUUh8qpd5RSoUGkUIIUYkEfkKI5qYrkBv4xb4h2o6VgajCzhrdp5TapJQqxCpXAyvrEM+xQgOOSsGHUuoMpdRKpdQBpdRBrBvfWPsNzUSUciRQ+RNW371lSqnNdrlgbTyEVd4aflMLVqlYu7DX2mGVsNaaHai+BZxql+AClGEFH0/Zy/+D9d5NtpdfiJX13I6VoVmElfHELlP8D1a5XgJWFuZGpdS00OMqpZKxgpl/hZ1j4Lzq4xy7AtvDSm5ziXKt2e36qVLqW6XUQfuaGEZ811okEa8XO3heypGg6nyOZLF7ARMCx7fbcCFWAA5WkH0mkKuU+sjOqMayN+TnMmB/SPlumf3fVPu4LqxS38Bxn8DKOlY5H611aci2dWKXXD4KXKejDOYSpl6+C1rrw1rrF4CblN0HFes9+VRr/ZbWuhzrwVQ6MNgOlmdh9Wvdg5XpX4J97dslpndiBepb7X9FIcvf11ofo7U+ASsgHIeVZf03VvXA3UDUwXGEEEL6+AkhmrrwzNcuIFg6Zffz6oHV/yrS+hdg9U86GetGqj1QQOWSqmh2Yz3BD+gRctw2WDdoPwVe11pXKKVei3O/ldg38guABfYT+w+UUl9prd+v4a6mAscqpR4Iee1zpdR1WINKOJVSA7TWG+xlI7H6E9YHJ0cGlFmLVSIYKvi5aGv0xOmB35VSzwNf2r8OA9Zrrd8JrK6UWopVihg6oM3ZWINwLA/Zb4FSajfWeb1rv1yTc4x0rfVQSpkhwV9PYH2k9e0M3JNYn8Pndt+2b6nFNRGHF4A7lVIfA4lY2VWwgumPtNanRNpIa/0VMNMuY70GK/DoEX4utbAdK0ObEWfwFa4ux2+HFQQtVkqBNdomwA6l1LnaGmE31A9Y2WIg2P+1H7X/Lriw+tytwbr2J0db0S7BDpQ9o5T6jJCHF3Y/xkBfxoFYpZzfh+7D/pv3CFbpcQbg0FrnKqX2YJWQCyFERBL4CSGaur3YAxnYlmA9YZ8KfIw1uqQb+CzK+m3t5flYJVX31uDYS4Dr7MCjBPhtyLIErGkE8gCPUuoMrPLG76vspRpKqelADlY/o0NYA0ZUGdjFXteFdWNrYgVyiUCFnYUZSOVKjt1YAdgarXWZUuoV4Pf2oBWjsALiSSH7TuTITXMbpVSiPZhFeBsGYWXslmP16ZoHHI810A1YpYh/VkpdgpXNOxsrgF5hbz8YK4vhxiqnPRVregqw+pENUNaUDh9ifZbTsfqEhboE+HeEkth/A7cppVZhlRFeidVPLtB2P3Ci1np5+HlR9dr5AivTdqNS6kGsG/qzgPFR1k/BCmDy7GNdRuX+W/XpTWAhVj+7xSGB6f+A+5RSF2NlTsH6rIuxrq9zgf9prQ/ZGfDAdnux+pC1j5IxjskedGQZ8KBS6nb7eH2A7nYZdHXC38sq7HJJEyuQdtnXaznWd6ZryKo9sB4kBAa3Cfcq8Cel1Gyshwl3AGu11jn2cRxYwZwTMO3jeO2HO8fYr3+J9V25Fus6CwyusgjrAc7JWNfvtVhTkqyz9z0C68GBiTVCaResrF3g+9cfKwDtAfwDq9S8IKz9VwBfa62/VdZgTEl2H86ewOZY76EQonWTUk8hRFP3R6wb+YNKqRu01hq4CKtvy36sG/Gz7LKqKutjBQK5WBnBH7FGFYzXk1j99tZiBSRvYgU6XjtLdy1WcFiAlVl8o5bnOAB4D+tm+XPgUW3P0RWlTWVY5X232j9fDKC13qe13hP4Z6+/3+4jBtaNZhJWP6MXqDq6aRlHyiVzOFLKh1LqcaVUYK49A6uv5D6sG+vrgHmB/mJ2H8YZWH2RDmHNSzZTH5ly4TSsG9QC4CrgdK11nr3tJqwRPh/G6pP4EVZmNVjCpqx5AE/C+mzD3YkV4OTa2/5Ja/22vV0PrNK57yJsB9bAJ0Psa+c1+5o6CyvbuB+rnPCngQAhwvo/YvVn/BwrkBmOHezWN7s/3ytYmeznQ14vwgqkz8PKWO7BmnKgjb3KxViDjxRivfcX2tvlYF0Tm+3zCQ2k4hUoz/0R67N9CSuwicf/AXOUUgVKqYejrLMM65qchBUUlQHH231sQ6/7QLC3N/B3QSn1g7JHwrWvtdnAH+x2TqByX8SL7X0/htVntwzrewfW+/h3rAdJO7HKZqdpezCckL9Pj9v7ngnMCPn7dDHWA5l9WJnhU+zPEqzM7fNY38Evsa6j20PfAGWNAHxd4HU7u3oN1vQRj2NlAYUQIiLD769rdYcQQrQOdlbvca11r2pXFk2OUuoiYKjWWkZBFEII0epI4CeEEFHYI+udiJVp6ISVeVqptb7+qDZMCCGEEKKGpNRTCCGiM7CGTC/AKvVcR+SpEoQQQgghmjTJ+AkhhBBCCCFECycZPyGEEEIIIYRo4ZrjdA5tsIbS3o015LkQQgghhBBCtCYOrJGTv8KaHqlazTHwGw+ET8YqhBBCCCGEEK3NccCn8azYHAO/3QAFBSX4fE2rf2J6eir5+cXVryhEDcm1JRqSXF+ioci1JRqSXF+iITX168s0DdLSUsCOjeLRHAM/L4DP529ygR/QJNskWga5tkRDkutLNBS5tkRDkutLNKRmcn3F3fVNBncRQgghhBBCiBZOAj8hhBBCCCGEaOGaY6lnRF6vh4KCPDye8qPWhn37THw+31E7fnNmmg6SklJJTW2PYRhHuzlCCCGEEEK0KC0m8CsoyCMxMZmUlM5HLXBwOk08Hgn8asrv9+P1eigqOkhBQR4dO2Yd7SYJIYQQQgjRorSYUk+Pp5yUlHaSLWqGDMPA6XTRoUM65eWHj3ZzhBBCCCGEaHFaTOAHSNDXzBmGCTSL0ZOEEEIIIYRoVlpU4FdbJcVuXnvuW0qLj17/QCGEEEIIIYRoKBL4AatX5LJ7+yFWrcitt30ee+w4SktL621///zn47z//rJ62180OTk/ctddtzXY/t9887/cdtuNDbZ/IYQQQggh6ou3rAx/Cxm8sdUHfiXFbnK+2wtAznd7mmzW74orrmLq1FMb/DiDBg3hzjvvafDjCCGEEEII0ZSVbVjPput+QcHbbx7tptSLFjOqZ22tXpGL32/1K/P7/axakcvxpw2ol32/8MKzfPLJR7jdh/n5z3/BlClT2b17F1dccTFLl74PUOn3Bx+8ny5dunDBBT8FYP36HO688xaef/5l7r33LgYNGszs2fN46qkn2LYtl5KSYnbt2km3bt25++77SUxMpLi4mD/+8S62bNlMZmYWGRmZpKV15Jprrq/UtsOHD3PPPXeydetmHA4nPXv24u677+Prr1fx97//H0899SwAL7+8mBdf/A+pqW2ZOHEyr7yyhKVL3w+2e8aMc1i5cgWHDx/mppvuYOTIUXg8Hm688XoOHTqE2+1myJCh/OY3t+ByuerlfRVCCCGEEKKhHVj2Nvh8YLSMXFnLOItaCmT7fF4r8PN5/fWa9TNNk2eeeZ777/8LDzxwLwUFB2KuP3v2XF5//ZVgIPryy0s4++xzIw5ao/U67rzzDzz33Et4PB6WLXsLgKeffpK2bdvx/PMvc/fd97F27bcRj/XFF59TWlrCokUv8q9/vcBvfnNLlXU2btzAs88+w2OPLeSf//w3RUVFlZYfOnSIYcNG8PTTz3PZZVfy+OMPA+BwOLjzznt46qlnefbZxXi9XpYufb36N0wIIYQQQogmwJ1/gJI134LDQbtJk452c+pFqw78QrN9AYGsX32YPn0mAD179mbgQMUPP3wXc/3evfvQtWs3Vq78jMLCQlas+Jgzzzwr4ro/+ckxtG3bFsMwGDJkGDt37gDgm29WBbdp1649xx13QsTt+/cfwNatW3jwwfv54IP3SEhIqLLON9+sZuLEyaSlpQEwbdqMSsuTkpKZPPk4AIYOHc7OnTsB8Pl8vPDCIi699AIuueQ8vv56FRs2rI957kIIIYQQQjQV+97/AHw+UkeNxtm+w9FuTr1otYFfeLYvoL6zfuEcDgc+35FjlpdXPs6cOefx6qsvsXTpGxx//ImkpqZG3E9CQpvgz6Zp4vV6a9SObt26s2jREsaPn8CqVV9w6aXn43a7a7SPhIQjpZtWGzwAvPvu26xd+y2PPvok//73Ys4+e06V8xRCCCGEEKIp8vt87F32LgDtj59ydBtTj1pt4Bcp2xdQX1m/pUvfAGD79m1s2KAZOnQ4HTum4/F42LFjO2AFSaEmTpzMtm25LF78HOecM7fGxxw9eixvv70UgKKiIj755OOI6+3btxfTdHD88VO49toFHDxYQFFRYaV1Ro0aw8qVn3Hw4EEA3n77f3G1obi4iPbtO5CcnEJxcXGVcxRCCCGEEOJoKt+zm+1/vp+C99/FH5ZAKfn+O9x5+3FlZpI8eMhRamH9a5WDu0TL9gUEsn7jJvciObVqCWS8vF4vl112AYcPH+Y3v7mFtLSOAFx33QJ+9atf0KFDByZOPLbSNqZpcsYZ01i58jP696/5IDOXXnol9957FxdcMJv09AwGDRocMWu4adNGHn/8EQB8Pi8XXXQpGRmZbNt2JOAdMGAgF1zwU6666jKSk1MYN248KSmRM5ChTj99Op988jEXXDCbtLSOjBw5usbZRCGEEEIIIRpK8derKctZR1nOOgpXfErWRT8lqW8/AA59vByA9sedgGG2nDyZES3r1YT1Brbk5xdXKpncsyeXzp17xbWDj99Zz7q1e6IGfgCmw2DwiC41GuHT6TTxeOo+z8f1189nxoxzOOmkk2u8rcfjwev10qZNG0pKipk//wquueZXjB8/oVZtKS0tITk5BYCnnnqCnTt3cMcdd9dqX/GoyefYmmRmtiUvr6j6FYWoBbm+REORa0s0JLm+RF3kLfkPBcveBsMAOx5ypqfjysyibL3GMAz6PPAXnO3bH+WWRmaaBunpqQB9gK3xbNMqM357dhbGDPrAyvrt2XmokVpkycn5kTvuuJmBAxVTppxUq30UFRWyYMG1+Hw+ysvdnHLK6bUO+gAee+wRvvtuDR5PBV27duPGG2+t9b6EEEIIIYRoCrzF1kODzPMuwHvoEAXL3saTn48nPx+A9GMnN9mgr7ZaZeA39/JxR7sJEQ0aNIQlS+o27UFaWkcWLlxUTy2CBQt+W2/7EkIIIYQQoinwFhcD4OqYTtrUU0ifMYuK/P1U5OXhLSyk54mTOdjCeiq1ysBPCCGEEEII0Xp5S0oAcNhjYRhOJwmdOpPQqTMArnZtoYWVErec3opCCCGEEEIIEYdAqacjytRpLZEEfkIIIYQQQohWJVDqabaiwK9VlnrOmzcLrXOqXU+pQSxe/FojtEgIIYQQQgjRGPw+H77SUjAMHPbo9a1Bq8z4jRgxCpfLFXMdl8vFyJGjG6lFQgghhBBCiMbgKykBvx8zKRnD4TjazWk0rTLwy86ej1nNZIymaZKdPb+RWgRvvvlfbrvtRgC+/noVP/vZxQDs35/HL3/580Zpw3333c2aNd802P7nzDmLzZs3Ntj+hRBCCCGEqE6wf1/b1lPmCa008MvMzGLGjLOjZv1cLhczZ55DRkZmI7esqoyMTP72tyca5Vg33XS7ZDmFEEIIIUSL5i22R/RMaV2BX6vs4wdW1u+NN16NuKyu2b7Dhw9zzz13snXrZhwOJz179uLuu+8D4K23/scrr7yI1+slNTWVG264iZ49e0fd1+7du7jiiotZuvR9AI49dhzZ2fP5+OPlHDp0iF/84lqmTJkKwPLl7/OPfzxKmzZtOPHEk/nHPx5l2bKPSU5OrrTPTz5ZzpNPPoZpOvB6PfzqVzcyZsw4rrkmm/PPv5jJk48jL28f99xzJ/n5+XTr1g2/HyZMOIbZs+fxhz/8joSEBLZv38a+fXsZOnQ4t912F4ZhsGzZ27z44gt4PBUA/OIX1zNu3E9q/V4KIYQQQghRn1rjiJ7QigO/QNbvtddepqKiIvh6fWT7vvjic0pLS1i06EUACgsLAViz5hs++OBd/v73J0lISODzz1fwxz/+nsceW1ij/aekpPDPf/6btWu/5Y47bmbKlKkcOJDPAw/cyxNPPE2PHj1ZvPi5qNv/859PcOONtzJs2Ai8Xi+HD5dVWeehh/7E6NFjufTSK9izZzc//el5TJhwTHD55s2beOihRzFNk8suu5BVq75g/PhjmDDhGE455TQMw2Dbtq1cd918Xn31zRqdnxBCCCGEEA3FW2KN6CmBXxil1J+B2UBvYLjW+nv79YHAv4B0IB/4qdZ6Q12WNbZIWb/66NvXv/8Atm7dwoMP3s/o0WOZNOlYAFas+JiNGzeQnX0pAH6/n6Kiwhrvf+rU0wAYOnQ4+/fn4Xa7+fHH7xk4UNGjR08Apk2byd/+9teI248dO46HH/4LU6acxDHHTKJv3/5V1vn669Vcf/1vAOjcuQtjx46vtPy446bQpk0bAJRS7Ny5g/HjYefOHfzud7eSl5eH0+nkwIF88vP3k56eUePzFEIIIYQQor55i+zAr5WVesbTx+814HggN+z1x4G/a60HAn8HnqiHZY0qvK9fffXt69atO4sWLWH8+AmsWvUFl156Pm63G78fpk2bwTPPPM8zzzzPv/71Aq+8srTG+09ISADAYY9C5PV6a7T9tdcu4Le/vQ2n08Xtt98UteQ1ljZtEoI/WyWjVht+97tbOfvsc1m0aAkLFy7C4XBQXl5e4/0LIYQQQgjREIIZv7Ztj3JLGle1gZ/W+lOt9fbQ15RSWcAY4AX7pReAMUqpzNouq/up1E7oCJ/1NZLnvn17MU0Hxx8/hWuvXcDBgwUUFRUyefJxvP32Uvbt2wtYAVtOzro6Hw9gyJBhrF+v2blzB2D1JYxm27at9OvXn7lzz+fUU89g3bofq6wzevTY4D727t3D119/FVc7iouL6dKlKwBLl74hQZ8QQgghhGhSAn38zFaW8attH78ewE6ttRdAa+1VSu2yXzdquSyvbqdSO4Gs30svLa63kTw3bdrI448/AoDP5+Wiiy4lIyOTjIxMsrPnc9NNv8br9eHxVHDiiSczaNDgOh+zY8d0brjhZm644VoSExOZNOk4nE4niYmJVdZ97LFH2LFjGw6Hk9TUVG6++Y4q61x33QLuuedOli17m65duzJ48FBS4vhyXHvtr7nllhto27YtEyZMon379nU+NyGEEEIIIeqLt7h19vEz/H5/XCsqpbYC07XW3yulxgL/1loPDVn+I3ARVnBX42Va66/jbHNvYEv4iz/88CNdu/aKcxeV5eXt44YbfsWDDz7UJKZwqK2SkhJSUlIA+N//XueNN17nH/+o2cAxAYcPH8bpdOJ0Otm/P4/LLruYRx55nF69etdji6vatSuXoUOHNOgxhBBCCCFE67X2plspWpfDsD/8nvbDhla/QdPWB9gaz4q1zfhtB7oppRx21s4BdLVfN2q5rEby84vx+Y4ErT6fD4/HV6uTSUvL4KmnngWo9T4AnE6zTtvX1X/+8zwffvg+Xq+Hdu3ac+ONt9a6PVu35nLPPXfi9/vxej1cdtmVdOvWs8HPz+fzkZdX1KDHaI4yM9vK+yIajFxfoqHItSUaklxfLcu8ebPQOqfa9ZQaxOLFr9XpWO6CQwAUeRyUR7mGmvr1ZZoG6ek1y1jWKvDTWu9TSn0LnA8ssv/7jdY6D6C2y0TdXHLJz7jkkp/Vy7769x/AM888Xy/7EkIIIYQQIpYRI0axceNGvF5P1HVcLhcjR46u87GOTOeQUud9NSfVDu6ilHpYKbUD6A68p5T6wV50FfBLpdR64Jf279RxWZ3EW7Yqmia/34eVFBZCCCGEEK3JRRdeQXX3gfUxEKPf5zvSx08Gd6lMa30tcG2E13OACVG2qdWyunA6EygpKSQlpR2GIcFDcxIoJy0qKiAhoepgNEIIIYQQonmpaelmri5lUN9JrNv0KT5f1anKXE5nvQzE6CsrA78fMykJw1nbXm/NU4s527S0TAoK8iguPnjU2mCaJj6LNzfhAAAgAElEQVTf0evj15yZpoOkpFRSU2UUUCGEEEKI5m7EiFFs3ryJioqKqOsESjdLit3kfLeX0UOmkbP5M6Bq4Gd4vVx47JRKr5UUu3n39XWcOnMIyakJVbaJJDCVQ2vL9kELCvwcDicZGV2OahuaeidQIYQQQgghGkN29nzeeOPVmOsESjdXfbQZv8dLSlJ7VJ+J5GxeUSnr5zQMpmRkYX65Eo4/Ifj66hW57N5+iFUrcjn+tAFxtStQ5mm2sqkcII4+fkIIIYQQQghRE4G5sl0uV8TlLpeLmTPPwbdxKzlrd+Oz+/eNGTodw6gcojgSEpjTuy9lOetw79wJEMwSAuR8t4fS4vK42tVa5/CDFpTxE0IIIYQQQjQdsbJ+pmEwrewwK19fjb/tgOC4LpGyfm63m+yvPrdWmDY14v5ef78PS996q9o2SeAnhBBCCFFDjTnvlhCi+Qlk/V577eVKff2chsEJ7dMw9x1kd+9T8BuOStuNGTodveVzrL5+Bk6nA48n+jQPpumgQ9telBaXV9vXL9jHrxUGflLqKYQQQohaGTFiVNQyroD6mndLCNE8ZWfPrzLivmmYzBs8jN1jz4EII2sGsn5gMLDPBIxqQhbDMBk3bBqrVuRW2x5fSQkAjtS28Z9ECyGBnxBCCCFqxbqhi30rUR/zbonYSordvPbct3H3cRKiMWVmZnH6uJ/gtIM/l8vFrDlzGfvw3znoTMPnjTwP95ih0+mS2Z8JI85h+ODjoj5kMk0Hqs8kEhPaxdXXT0b1FEIIIYSIwVNYSJnOIXXsOAzTCvYyM7MYP+YkPv9yWcR5txISEupl3i0RW21GNhSiMc0bNIS3Pl8BVH4YNPfycTG3u4EZAOTlHcP06adEXMcwTMYOnQZYc0NX9z0I9vFrK4GfEEIIIUQVexY+Sen335F53gWknXwqYGWa+nc9iZXGe0Sad0uyfQ0vfGTDcZN7xT2fmRC1VdP+vcl793FiRibv7s+r1cOgaH0FA9m+5CRrHmif11/t9yAY+LXCjJ+UegohhBAiJvfOnZR+/x0AB95aiq/cKqVavSKXZLsvjmlWHpzB5XIxb948yfY1sNUrcvH7rVK5QLZDiIYWT/9eAK1zGDVqEGcvfY0fi4sYPWpMrR8GZWfPB3/lvoKh2b6A6r4HMqqnEEIIIVq0eJ/Qx6PvzO+58Pw/kb+3GJ/XHzYCn8U0Ta6//vp6OZ6ILJDtC/SRiifbIUR9iGdy9lBOw2B41+788ennan3MzMwshg8+jm9/WI7P562S7Qvwef3s2Xko6n4CffxMGdxFCCGEEC1RPE/oDcPANGPfGjgNg4w2WezbVYTXDjhSwrJ+TtNk5sxzyMrKqp/Gi4hCs30BkvUTjaG6ydnDmcAlZ0yv83Hv/8uduFxW3srlcvLw4/dwwSSYuvFpZqXncPVNJ3D1TSdE7Tvo9/vxBkf1TKlze5obyfgJIYQQrUA8T+gDN3Hl5dFHxTMNk0HDz63yemjWz8SQvn0NLDzbFyBZP9FY4s36OU2TKemZdB0+os7HDAScL720ONhXsKx7DwDcO7YDNeh/eNHcVje/qGT8hBBCiFaguif0LpeLWbNmM3PmOTHXGTfieJKS06osC513a1SPYdK3r4GtXL4Zr8cXcZlk/URjCP5NccTOI3l8Ppbl7eX4n1/GqFGDGDVqEPPmzar1cbOz5zN69Njgw6U23bqBYVC+Zzd+jyeu6ganYbTK+UUl8BNCCCFaiYsuvAJ/5CmzgiNwZmfPj1ruaZomA/qeCVHm7gvMuzV4xDyK8wvrq9mtWqQ5+kqK3Wz4YV/UbQJZP5nXTzS07Oz5GET5oxKFy+WqU9CVmZnFwoWLgg+XzDZtcGVlgddL+e7dMf+GBZhG6xxxWEo9hRBCiFYiV5cysPdE9JYVeL1HBmJxuVyVhliPNGy6y+Vi/OiTSExoF3X/KUntmTH1Bgyfh68+3kyfQd0a7mRaiUhz9K1cvjlqAB8Qz3xmQtREfQ0Q1RDTvCxYuYLN+fvhrMhz/YVyGgYnDxjQKqsSJPATQgghWpDa3JyF34hlZ8/n9ddfqbJO/25T49qf33Syd3dxjdogqoo2R1/upgPVblvdyIZC1NSIEaPYvHlTpQdCNRX+kKm+DO3bn20H8vFU90QEq9zxwonH1evxmwsJ/IQQQogWJN6bMwMDP36chsGM6TMr3YhlZmZxihrCO9+vweP3B7N9SYntqgwmAmA6DAaP6MLxpw1g9z8ep+jLlXS+/Mp6P7fWZu65s9i5e0vw90cXRV4vI60Hj0ycgLlvB73v+SMJnbs0UgtFaxLPYC6GYeB0OqP+/WmIbB/Azy64iLdXfVHteg4MpmRkkdlKRxyWPn5CCCFECxJX/xbTGZx6weP38+LLS4KDLgT+Lf3u2+DT84qKCn5ctyZi0AeV+5Q50zpY+z1YUI9n1fqUFLvpkNoz+DlFY5oOOmX0ZXO74QBU5Oc3RvNEK1TdAFGGYTB9+kxmzZoNUOXvUENl+wC6DhvBiRmZOA0j5noO02BOz94kDx5a721oDiTwE0IIIVqQ6m7OTNPBoL6TGdRvMgYG3ROTcFYTKIJBl6zYfcUCfcqcHawRPysKjl7gF2lAlOZm9Ypcxg6fhhFlIJ0AwzAZM2Qa28nC7UiiIn9/I7VQtEaxHiwlJCRw3XULyM6ez/DhI3A6KxcWNlS2D8CVnsGc3v2IFfY5nS5mzZnH+H8+Q+roMQ3SjqZOAj8hhBCihYl1c2YYJrv3beCHDR/hx8+Ow2V4fJGnBQhwmA7GDJkWc51AnzJnWkfg6Gb8QgdEaY4CffuSEqwpMqJl/UzTgeozieSk9oDBlrSReA5Ixk80nGgPlkKzeZmZWTz77JJKU8M0ZLYPwDBNOvftFzPr53BYgadRTVawJZM+fkIIIUQLE7g5Cx+ZMxAogJ9DxXvx+bzRd2JzuVycffYcFtwyI65jl23aCIDnKGX8og2I0pysXpGL3w7Gxwydjt7yOVD1szIMk7FDrYDch8HudgMoyttKRmM2VrQ60QZ/Cs/mhfYJbMhsX0Cbnj2Z3aU7H+7fDyFTTJimid/vb9DAs7mQjJ8QQgjRAlnza1UWCBTGDJ1ebQlhQE1v2AKlnkcr47d6RS5+u29ic5zIvKTYTc7avQSSsClJkbN+lbN9Fj+wLj+lEVsrWqPMzCxOH39MMLMWLZsXeABlGEajBF0dz5hG/7nnMWP6jEqZxmnTZlSa8L01k8BPCCGEaIEyM7MY3W9cMGAIDRSiBRPhalOe5WzfHgwD76FD+L3VZxTrkxU07QkOQtMcJzJfvSK3yvsWKVAPzfYF+E0nBzzJDd5GIc4bNiL4YCnWw6Hs7PmNFnS5OqaTPn0GV13762Cpu2maXHfdgkoTvrdmEvgJIYQQLdToAScHA4bwQCGerF9tyrMMpxNH27bg91N+8GDNG10D4YO4WEFT5f6KzS3rt2dnIb6wXG14oG6aDkYOOZ4Fd83g6ptO4OqbTuDnCyYydePT/GT768EyUSEaSuqBA5yYkVltNi8zM6vRg67GzjQ2J9LHTwghhGiBvMXFnLTnPTanp/Nu3l5mz67aT8+d8HWVfoABdRmMwdkhDW9hIeX5ByCtc63PoTqhg7iMndzTKpEMC5oCWb/m0tdv1pnd2HrbzZgpKfT7y8MYDivYm5M3mOnTT8Ht9uJyOXngr7+rtJ3pSsDRrh3ewkI8BwtwdUw/Cq0XzVlJsZt3X1/HqTOHxPyu+D0e3Nu3MbtLd/Z3694kSyizs+ezadPGJtm2o0kCPyGEEKIFKtu4Afx+Lpx8HPtzt0S8AYo1IXNdBmNwpqXh3pZbb4FfpBvSc8+dyYYN2lrhP9G3Te/QnbnT7mDVilyOPy32lBRNQcnaNQCkDBsRDPrgSBbjpZcWRw3IXekZVuCXf0ACP1FjgQcp5547k527t1S7fp+27Xj1ky8boWU1F8g0isqk1FMIIYRogcrWW0FRt5GjopZahQ/N7nK56Nevf51LpAIDvJTX09QCkaZnyErvG+fk5v2aVV+/4kDgN3JklWXV9ZdyplvBXsUBmctP1EzoaLgdUntGnQc0wGkYDOnRszGaJuqRBH5CCCFEC1RqB35JA1TM9ULn/DNNk3vv/VOdB2NwplmBnzv/QK33ERA+PUNpcTklxW76dz0xrsnNA/0am0NfP29pCWUb1oNpkjJ0eJXl1fWXCmT5PPkyl5+omdD+sWOHTwN/7LnuTODSGWc3QstEfZJSTyGEEKKF8R0uw527FRwOkvrHLm8MLyFUanCdS6SCGb/8A6QA8+bNQuucardTahCLF79W6bXI0zP4SU5oh+ozkZzNKyLORxg+3UFggvmmqqTYzduLVjOQBDr074kjpebTMgQzfhL4iRoIjoZrT32XlNCegX0msn7rZxH7/zpNkynpmXQdVvXhhGjaJPATQgghWpiyjRvB7yexVy/MNm2qXb++B0IIZPzKD1gZvxEjRrF586aIN5EBLpeLkSNHV3ot0vQM69buxsCasDzW5OZO0+D6lCJ699lF1rzz6+W8GtLqFbnsO+jDlTaSY0fUroTOlW5N3S6Bn6iJI9m+I1m+scOnsX7L5xHXN4E5XbvRpkevxmmgqDdS6imEEEK0MGVxlnkG1PeQ64GMn3u/FYCElpNGE2kwmUjTM/i8frx2IBhtPkKXy8X0E0+mgyuB0h9/qNO5NKTCLz5n1+OPUrBxm13OarC73QCMAcNqtT9nx44AeKSPn4hToJQ6fDTcQNYvknKfj+w1XzPuhAmMGjWIUaMGMW/erMZorqgjCfyEEEKIFqY050cAklR8gV99c6Z1wO1IYoU5mpIid5VBZMI5HE6mnTmrUuAZ7YY0XKT5CE3T5Kpf/xYjIYHynTvwHGrY+QRrw+d2s2/Rvyle9SWfPP0Ofo+VtfQbBt9tPFyrfR7J+B0IlscKEcvqFblR530cM+SMar59lkjZetE0SeAnhBBCtCAl33/H4c2bMRMT48741TczKZktGWM42CaTVR9vAqrL+hmMCZlcHir37Ysl0uTm40dPJatLF5IGDASgNGdd7U+mgRSt+hJfWRnlSR3YndI3GOD6DQc53+2t1QikZnIyZmIifvdhfCUl9d1k0cIEH65EjvtITkpjQK8J1e6nLlO/iMZV58BPKTVNKfW1Uuo7pdRHSqk+9utblVI5Sqlv7X+nhWxzjFJqjVJqvVJqmVIqq67tEEIIIVo7v8dD3uIXAOg4fQaOpKSj0o7SknJ2p/YDw0D/uJ/S4vJg1s/pqFyWGRiEZddWdzDYCd6QeuPLWoVm/QzDZMzQMwFIHjLUas8PTa/c89BHywHYPfZscFQecqG2I5AahoEzkPWrp6k0RMsVz8OVY0bPjjl6rsvlqtPUL6Jx1SnwU0qlAf8CztNaDweeBB4LWWWO1nqU/e8dexsTWAT8Qms9EPgYuK8u7RBCCCEEHFz+AeW7d+HK6kSHqacctXasXpGL37AzWL4jQcyVV1yNGXajGZhyITTYiTfbl5aezNU3ncANd83gnHNmYxgGs2fP4fJfngxAshoMQNnmjfV2bnVVUuzmlYVfcCh3FxUpaWzJM4KjKQbUZd5BV6CfX7708xOx7dlZWO3DlaTE9gxTk6Iul2xf81LXUT37A3u11uvt398EnlVKZcTYZixwWGv9qf3748BW4PI6tkUIIYRotTxFheS//ioAmXPPw6xmAuaGEsjW+e1nyz6/Nf/euMm9aFtYyJT0DD7Yn4fH76805UIg2Bk3uVdcN6QABfmllBaXk5yaEHFk0oQuXQCoyMvD7/ViOGJP+N4YVq/IZe++MpxpI0no1h1/lO58gUD4+NNiT8cRzmlnXg5+8AFJajCO5OS6Nlm0UHMvH8eOh/5C6fdrybzgItJOOjnienPyBnP++bM5ePAgHs+RkXkl29f81DXwWw90VkqN11p/BVxovx4Yh/g5pZQBfArcorU+aC8L1i9orfcrpUylVEetddwzvaanp9ax6Q0jM7Pt0W6CaKHk2hINSa6v5m/TS8/jKyujw6iR9D75OAwjnmEZ6t+XH2+F8Gyd388PX+9iUP43zO7SneUFB8DjqTTBeuh6v/jtiQDk3Pcn8j9fyYDrruGrggy+/WJbcERPAIfD4Ievd3Hm7OFkZrblv/99Paw1bdnWsSPlBw7QznCTmNmpYU46TkWFh9H26J272g3APOyKGuD6vH7093s4bcYQUtslxn2M5LOn8/2qLyld9wO77r+HwbfeTFK3rvV0Bk2P/O2qveLNWyj98XsMp5M+Z0zF1S7ye5mZ2ZZly95h4sSJeDxHXnc4HNx8840t+jNoaedWp8BPa31IKTUP+KtSKhF4CzgIeIDjtNbblVJtgIeAR4CL6trggPz8YnzhtRFHWWZmW/Lyio52M0QLJNeWaEhyfR09dZnYPFT53r3sWfYemCbtz5nL/v3F9dnMuJUUu/n2y+14vX5eevtu8g/uOLLwuarre70VvPnRw8w5/Xb7dz/ffLmdoWO6kpyawKENVonmwcSM4H4rb195/UgcGZlw4AB71m0mxTw62a+SYjfvvr6Odu0T8dnTU/gNB95q7mN8Pj/vvPFjzbJ+yWn0uOUOdj7yf5Tt3MG3C26kx4230KZHj7qcQpMkf7tqz+d2s+2Bv4DPR7sTTuSg24AY76VpJjNjxtm89trLVFRU4HK5mDHjbAwjqcV+Bk39+jJNo8aJsDoP7qK1fk9rfazWehxWcJcEbNJab7eXu4FHgcn2JtuA4IyPdlmorybZPiGEEKIlGDFiVNQpDgJCh0qfN29WcN6s0H8/Oe0E5n75GXO//IwJZ049anNqhfbN65TRt8r8euEMw6RTRr9KrwVKHL1FRXj278dISGDtJnfUPn/VDYTiyrKyfBX79tbkVOrV6hW57N5+iPU/7D3Sn88woJrn1z6vnz07D9X4eK7MTHrefBspw0fgKyvj4PL3a95o0aLlvbSE8t27SOjchcw5c+PaJnRkXunb1zzVtdQTpVRnrfUee9CWe7H67KGUam9nBA3gPOBbe5PVQJJS6li7n99VwIt1bYcQQgjR3GRnz+eNN16NuU7oDdaIEaPYvHkTFRUVUdc/WnNqhY/EOWbodPSWzwFv1G1M01G51JMjA5sMSS8FwN+zP/r7fTFLIgN9AyNl/RI6WYFf+d7KgV8gC3fqzCFRs4X1IfC+gDXQDSEluKbDYPCILjXuxxcPMzGRjmfNpOS7tU1yOgtx9BSvXcOhD98Hh4PO2VdhtmkT13aBkXlfemmx9O1rpuoc+AH3KKUmAwnAMuAmoCvwslLKATiAH4H5AFprn1LqYuAJuzx0K/VYAiqEEEI0F4EbqUD5VLjwwRNqGig2pvCROAPz6+VsXoHPVzX4Cx3YBahSGvroIvuHVSuBhcHX0zt0D5aGBsQaCMWVZc0YFZ7xC2ThajOASk2sXpEbLO8krN9ldUFrXSX26o2ZmEjF3r1UHMjH1TG93o/RUjXWg4HG5nO72fv0UwBkzJpNYs9e1WxRWaRBlETzUefAT2t9RYSXNwNRHzdqrT8Dhtf12EIIIURzFyuYCw/iahooNqZII3HGyvqFD+zSKaMvBYW7IwaJAabpqFIaCrFLIhOyOgNQsW9f8LXQLFxDBl7BEU5jlHTWdvTOeBgOB0kDFSVr11C6bh3tJx9b78doqRrrwUBjO5y7FW9RIQldupJ22uk13j4zM4uFCxdVv6Jokuoj4yeEEEKIWgoGc6+8SIX3SNATLYirSaDYmOZePq7Ka5mZbXEnfM2rr7yIJ+zczj57DgtumRF87fi/ruLSTZ/gi3EMl8vJw4/fU6PANpjx25+H3+fDMM1K2cmGDLwqZfuiaOisX/KgIZSsXUNZzpHAz1dRQfGqL0kdPQYzManej9nchT8YGDKqC5++t7FFZP/cO7YDkNivH4ZZ56E+RDMjn7gQQghxlP3s4sswwtJC0YK4QKDoclZ+dttU59TKzp6PI6ytkc6t/9zzOLFzV5xRpqGo7fmZbdrg6NABv8eD50B+lb6IdZksPZZ4sn0B1Q1QUxfJg4cAUJqzLhjs5r/2MnueepL9r77SIMds7sIfDLz3xrpg9q+5K7cDvzbdW94or6J6EvgJIYQQR5n52QqmpGcEgx6X0xkzyMnOno8RFlA01VH2goGqPXpptACuTbdu/Orhx4KjBoary/klZB0Z4GX1ilz8vspZuIYIvML7PMZS29E745HQrRuO1LZ4Cg5QsXcv3uJiDi7/EICiVV9VeS9au0gPBgryrYGGGuIBQWNzS+DXqkmppxBCCFFD9TX/Hlg3Ygc/eI/ZXXuw/EA+eL2YhhEzyElrk8iU9Aw+yNuLx+9vstm+gNDy1FgBXJcBA5l5zrkRS0Prcn6urE6UrdcU7thHzncuwmOd+i63DA8eInE4TS66akKDlw4apknSoEEUr/qK0pwf8Rw6hN/tBsB76CCHt2wmqV//Bm1DcxI5YPcDRoOWBTcGv8+He4c1gJIEfq2TZPyEEEKIGqrp/HvR+H0+9j33LPh89DntdE4ffwwGcMqQ4TGDnIMfvs/szl2bzZxagayfYRjVBnDxlobWRILdz2/NxrJazwdYE/Fk+xqyvDNcoNyz+NtvOPj+ewAk2sFe8derGqUNzUH0gN3KxDdUWXBjqcjbh7+8HGdaGo7Umk38LVoGyfgJIYQQNRTPtAoVFRUsWfICS5a8AETO/hW8+w5lG9bjaNuW9FnncHn3Hmz4fi1z+0fPKPjcbg5++D5pCQlMm3oKr737TpPO9gXEOwx8+Mil9ZHNdGV1wu1IIrcoGV+UWdPrM+sXaYTTSMdrqPLOcMmDBgNQ+v13ACQNGEjGOXPYfv+9FK9eTcaceRhR+la2JjUJ2MOzfu5dOzn43jLSZ56Ds3374Ov1VR1QH/sJlHkmdJNsX2slgZ8QQghRQ9VNqxAuUvbv8JbN7H/lJQA6XXI5juQUug4awl2DhuIsLIy6r8LPVuArLqZN7z5cnX0Vufv3N+lsX0BNhoGPtzQ0XgmdOrGl40jrpj5GfFNfpXxzLx9HSbGbpY+9z+CN/6XHeefS4cST6rTPunBldcKZ1hFPwQEAOp45ncR+/XG0a0fF/jzc27eR2LNXvZYwNzfxlOdC9AcE+xb9m7L1GsOVQNb5FwZfHzFiFJs3b4r5dyKe6oD62E+wzLOHBH6tlZR6CiGEELWQnT0/6kAk4cKDF29ZGbv/8Rh4vXSYegqpo6ybNVdGBobTiaegAN/hw1X24y0q4sDbSwHoeNoZZGV1YuHCRU0+21dTNSkNjYcrM4tDbbLwG46Y69U1C1dS7Oa1576ltLicVZ/mku9JZkvayGCp5dFiGAbJg62sX5uevUgeNhzDNEkdPQY4Uu4ZTwkzgNY5jBo1KOa/efNmNdwJNQBr0J/4BuMJL9M9vC2XsvUagMIvPsfv8QSXxfN3Ip6HG/WxH/f2bYD072vNJOMnhBBCxMnv9wdL4gLByasvL8ETY2RE03QwfvTUYPDiO1zG3n8tpCIvjzY9epIxZ25wXcM0cWVlUb5rF+V795DYq3dwmbe0lB1//TOe/Hza9OhB6pixDXOSTUS8paHxMBMTmVT0Md4dB3G074D30EEyZp/L/pdfJKFzF3rf88d6aPGRSb8/X76ZTev2gWGwu/1AKlLSONqzv3U46WTcO3aQdf6FwWs4dcw4Dn20nOKvV5Mxa3ZcJczxiCeD1dTs2VmIL0Lg99Lbd5N/cEfVDZ4Dfnvk195JyTwwdAS+4mKK166hrf39rK46wGkYTD/1jGofblS3H5fDGgk4KbEdrz33bcQ5B8tlYJdWTwI/IYQQIoaSYjfvvr6OZxffzKZtW2q8vWGY9O92EoW78nB/vpxDH32Ir7QUo00buvz8asywDEtCpy5W4LfnSODnc7vZ9beHcG/LxZWZRbfrFmA4YmevmrualIZGE7N0cdXK4I9q/ToWL6lb6WLopN/rf9hrz8to4DcMVn+27aiPBJnYuw+97rir0mvJahBmcjLlu3ZRuu5HUl0uzph0HEs/WU5FSNaqpuLp3xqqPktMA9/Xmk62Pm3ucJ577Au8Xj/4fZgOE58POmX0paBwNz6fN+q2DsPBwNS2tD9xKoc+fJ/Czz4NBn5gly6/HnnORBM4b/CwuNoYKzA3fD4uPPaE4MOH8JJlb1kZFfvzMJxOEjp1iut4ouWRUk8hhBAihsCNVEezfdTJxaMxTQeqzySSXKksf+QVCt5aiq+0lKQBA+l+/QISOnepso2rc2cAyvfsDr62+8nHKduwHmdaGt0X/AZnhw51O6lWIp7SRadhMGyAqvOxKg0M4ge/3ZnQj9lkR4I0nE5S7czcjgcfYPt9f+CM/APgjR7k1FS8/dfqY5RcoFLgUxOVSz2N4JQfY4ZOxzCquV02TeZOnUb69BlgmpSsXYPn0JGS4balpUzJ7FTl74fL6WRKRhbOH7+Pa87HQNbPGfbQx2k6mJKRSdGSV8hZY/3dCL/mAtm+hK7dMJyS92mtJPATQgghogjN4gwePrfGIx8ahsnYodPwYbA7tT/OURPoccvt9PjtLSQNGBhxmwQ78KvYuwcA986dlHz7DWZiIt1//RtcLaw/X0OKq18U8NNTTq3TcaobGKQxp26oqQ4nTcXRvgPOjukk9ulLtzHjmNqnX5UgxTCMuPu0hmqM/muBvpX79xYHv681CbaDn18w7jNwOE0uuWYiN9w1g3POmR01MDVNB4N6H0Nh7xNwtm9PyvAR4PNR9IWVUS78YiXb77+Xc9Izq5yj6XAwd4CiYs8e3LnxXR9XXnE1ZliQ6HA5uXTWOWxuOwSfHbQvXvp7Jh07ItjncuK5ZzF31UpmvrK4WffFFHUjgZ8QQggRxeoVufg91o1UcnIHfjL25CpP20O1a9cueIMYyPYlJ9lDuzud7BhwMkl9+8U8ZiALWI55iU8AACAASURBVL7HCvyKVn0JQOq48SR06Vqn82ltAhmSaDftToeDKRlZtC0tq9NxqpsGoCnP/5bYpy/9HnyIvg88SM9b76D79b9mwRMLcSRULpN0uVw4a5EpcrvdnHzycTEDjeo+p+qm9Ahk+d57Y13wc6hJsG1l+yr30w3dPlZgahgmY4adxcYd5ZQWl9Nu0rEAHPr0Y/YsfJI9Tz6Ov7ycXlNOZOasIwFk4Jx6Hns8YA0KE4/UggNMSc8IBubB/VyUze72KjiAUaf0Pphm7HLw5tgXU9SNBH5CCCFEBCXFbnLW7MYXKNkzHPTvcQqmI/LNr2EY/OlPDwXLwgLZvgCfL74sREInu9Rz7x78fj/Fq78CoO24n9T5nFqjWDftDtNkTtdulcpqayreaQCactYvXDAQswM9p2Ew44yzmDFtRo3LnUOFBhrz5s2qlHl68cX/RJ2qoLpsXyDLV5BfGvwc4g22g59f2PhModtHC0xDH+4EPt/UkaMwU1Mp37WTws9WYCQkkHXxpXS67Aqyr7omeC0GzqntMRMBKPryiyrBZ/h7NGrUICaddzbL8vbhsQPciooKVq/+iq9XboeQh1LxlKjWx1QponmRwE8IIYSIIFIWIDmpPePHnITLWfkG0OVyce655zFhwiTGjzkJMCpn+2zx3Pw7UlMxU1Pxu92U/vgD5bt2YaakBCfhFjUT7abd5XIx7cSpdHAl1Cnwi2fSb2jaWb9IsrPnY9qBhAnM7tKFGc6EWNMgVis00Ih36gjTNKvN9h3pW1n5c4jn+7Zy+Wa8nsij8laX9Qt9uBP4fMsO+2g/2cr6JXTrTs/b7qTDCVMwDCPiNCWJffriyszCe+ggpTnrKu0/nvfIMAxGjBhT5eFDSlJ7VJ+JUbN+1WVRRcskgZ8QQggRpqTYTc7avfjC/jfp8/rp3/UkjPC+OvYNbUmxm/5dT6JLZv9K2b7Q7WuS9TvwvzcASB09VgZkqININ+2maZJ99bUAlO/eHVfwFi7ebF9Ac8z6GYbBlIwsHKtWkbhlMyd17hZ88OF0OqstJwwIDzTinQfT6XRFzUoVFR6u/P6HZSOr+76VFLvZ8MO+qMeOlPVz2Bn/KqXcHPl8M86eQ/cFN9Lz1jto07VbpX1mZ89n9OixwXMyDCOY9ct//VX8Xm+wz+LFF15Z7XvkcrkYO3RaxOs3VtZPsn2tkwR+QgghRJhI2b6AYNYvrK9ORkYmq1fkkpzUnhlTb6iS7QuI5+Y/0M+vbMN6ANqOG1/bUxFUzfoFPrNOvftgJqfgKyvDW1jzidtrMuk31H2C+MYWCFIunXG29YLDwS9+dzemw7R/dTBt2lkYhkG/fv1j9gEMDzQyM7OYduLJwXLSSAzDYNas6Fmpj9/dUO37H+v7tnL55vAkYcztL7rwCrBznuGl3FA565c8eAhmQtXpJALTlISeU9pJJ+Po0IHDmzaS/8ZrwT6LW3VptX0fp02bxa6t5REfPkTL+km2r/WSwE8IIYQIUWWEvzDBrJ9Rua8O2JNAV5P9iefmPzCyJyBlnvUkNMMU+MwMwyChSxfcjiTeWPJjjcswo036HS49K4WrbzqBq286gbmXj6tV+4+GQJAy8OJLSB42nC4/y6bnhImVyhWvvfbXjB49lnvv/ROOKAMfRQo0yvfu4bS9+2JOHeE0YvftW/Pl9mrf/1hZv9xNB2JuG9g+8H3N1aUM6juJaKXcULusrqNtW7pceRUYBrvfeb/SlAyxsn6maUbN9gWMGTodg8gVCqL1kboRIYQQrV68E0ind+jOnNNvD2b9Pvvi7Uo3tPV1Ux8a+EmZZ/0IZP1eemlxpc8soXMXthRmsDe/vMqk19UJnfTb9Hm44IqxtM1qeXMsOjuk0f36BcHfs7Pns2nTRrKz55ORkcnChYsAmDHjbF588T+YpqPShOeRAo2DH7xPmsPB1O49eW/HtuBgJWBl+vx+PydlZpHeIS1im+LtWwng9/n4fPlmig4dDk7sXlLsxlNROavvcJpcdNWEqBO/79lZyOgh/9/encdHdZ/3Hv+cMzNCCyDQAgZss3MA2UIIuwne4zUYWYBNTZzYaeobyzbNdtu0cXLbpk3SJjfJbXrdxHXaW7dJ7CaON7wkXrK5seWlNl6wsXUwm8wisNiRgEGaOfePmTMajWZlZjSa0ff9eukFOsvMb0aHg555fr/nWc6BQ7vjTuWGU8/qVlrzqWlp5YWX9oZaMhgeHMeJZP0eefgB+qOCZDeYPnbEk/TDpqqKaqxZS7G3vkAg2K9s3yin/0lERGTUa2xsYuvWLQmrCkJoTc/kulArhmDAYUnD1Rw/2Z2XT859kwcau487V9U8cyU6YHEFaqfSNa4MMOh4aw/nnD894S/+sQamBBs4psnrr3dz0VWlF/jFcjOBsdz3d9q003nyF4/RHwzi83qHBBqB48c50v4cAJ/9xrf4Xdun6Pf7I/t9Ph8zKqu47rQp+HfuoHzGzEHP42blA2murQwGoXPzfvwn+iPBfbIWDomCf/eDnS/SmtbzZqr8I8v4v99rYf+hnQMb74t/bH9/fyTwjqdvXzedX/sq5dNncO2dX6V11dUE/P3K9o1yCvxERGTUa2tby2OPPZL0GJ/Py513f2PQL1o3c0VexlM2aRLeiRMxvF4qrfl5eY7RKF7A0nG0GodQH79Uv/hHG5gSHG73gZlx4Fhq3Pe3u/sDnn7yCQiGmqHEBhpHXnie4IkTVMyzmLZoMa2tq1i37iH6+vrw+XysXHkdN582lSMvtHN8y+YhgV862T7TYzB/YR2n//ZfONbj58VZa3CD+5nz6tj4+tBKru600EL9DF978X1Oq5vFwSNdgzKm8cyaNTtp1s5XV8/sf7gTTBPDNONmu2X00Ro/EREZ9bJtIJ1rhtfL9L/+Gmf+r69qmmce9fb42bK7H8cMvceZtFxI1fR7NKuvn8TVF16MAVweE6A4wSCHfvtrACZcFvrgJN76y/JZoez6iS1bhjx+umtp9+49xuSb/ohtNYsIhn9WjuPwzLqNCc8r1M/Q/SBhcRr99wC++c3vpjzG8HojFYhjq4nK6KT/TUREREie9SvE9CjPuHHD+nyj0fr2TmLDB/cX/x/c8+cZrfuEwmeMRpLbPvun2K/8Nyura3ACAYxw4ZdjG9+mb+9evDU1jG0KNXOPt/7SP3sOAMe3bh7y2O6Uy7IPdvD2V/6KMWdOZ/pf/23ccfT2+OmqPoQTznUEAw4nkxSUKdTP0M1iupU4O7a2J8z6zZ49h3nzMpsJkGh6rowuCvxERERwsxSX8PhvnhlUaELFEEpToh587i/+Cxc0ZrTu05XJdNFSdtqs2fz9hR+hr/sD/Lt2Un7mdAAO/iac7fvIZZFgEAbWB65f/wpNTTFBzVNPDHl8y5rPvV/4nwCMmT494TjWt3eC6WFwmV4HkrSiH+6fYey12NzQgr3tRWBo4GcYRlrZPpF4NNVTREQEOLF9G8sOHxny66CKIZSmZOvEHMehuWF5yubZyXq5ZdoaohSVzwll7U5sfg8A/+5dHHt7A4bPR/WFFw861s1INTefk3DKtcvn87Fo0WJ6tmwNPc/0GXGPiwRUQ1o+JA76YPj7LcZei4n673k8Xv7wDz+WcbZPxKXAT0RERr2+7m52/eM/MMFxuLLhrLjN2aV0JMr2uYIBh93b/Vy9bEXCIMQ0PTnt5VaKKtzpmltC0zUPPPEYAOMvuBDP2LFxz4le75eI+2FM79ZQ4DfmzBlxj0u3CEzD4qmRPouF6LcYb81ic5y1fgaGPoSSrGiqp4iIjHrdD/yMQM9RKhvO4vM3fIJfr/gooGxfqUonIAgGQlm/Xz75aNz98bJ90ecOZ8ZopKqYHZoqeWjrDl6852XmvvYWYzweapbFf99gYL2fW+UzHr/fz+WXXziw4dqrI3+1rPncf/+6lMG9aySsy0wUZPrLXhtU7XTVqtX6EEqyosBPRERGteNbNtPz2nqMsjJO++P/gXfCRJU+L3HpVIUE6D1khIKQRx6kr78/st3n83HZ5Klcs+thzvjKX1Mxa1Y+h1u0yqZNwywvp4Mz2PvBcbwTGvlQQwW+mtqk56XTXiUedwooZNjgfYSuy4x+H/QhlOSCAj8RERm1HMdh30MPADDx8ivxTpgIxG/0LaUjUYbl6bt+ybZDY3BML6bHYOqZE7ls5VoefeShQccZDlxbW4tn/HjKZ8wYhhEXJ8M0YeZ8uvxzAYOu8XMpv6Qh5XnpZP3iiQ6O0g3uYWRk/eKJV+1UJBta4yciIqPWsbff4vgmG7OyiokfXRbZ7haa0C9ao0dvj5/O3rFDevpVVUzgstlz8BqhgiBew+CSiTVM8JVR1bgo0idN4ttStWCgZYZp8uY7R9M6L95aP9M08RjxC7PErse9/uZzIuv1GhZPwfQkL+gyUtdlqv+e5JLuViIiMio5wSDd4WxfzfIWPJVVBR6RFFKinn6vPLeVVePGR+pAmqbJ6qnTAKhqbBrWMRab3h4/nUfKB4JpzLQrnrrZruhCS8uXt+JNWGwn8VTIdBu+j8R1mfoQSnJJUz1FRGRU6nn9NU7u3IG3poYJl15W6OFIASXr6We/tZelnkoumz6Tpzu30dqygprDRyDoULUw9bTF0Wx9eyeOYUBUSJ3JerrYNW6f//yfUV5eHnfNZbKpkMNZoVNkJFPGT0RERiV/53YAxp93PqZv5KzrkeGXtKdf0GHbxEV8qnUVixcv4bbP/k9m/M03mP7Vr2GWlw/zSItHsmA606yfYRiRwK6tbS2mZ3B/OxU+EUmPMn4iIjIq9R08AICvtq7AI5FCig5QHnzq6+w/tDP+gU+F/rj88gsjLQMksaTBdIZZv+hCS7GFX9RrUyR9WQd+lmUtB74O+IADwKds295mWdY84EdALbAf+KRt2++Fz0m4T0REZDj0HzwIgDdFaXkpbdEByuS6WRw80kUwGEh4fHTLAIkvVQ+9TKpoumvcoqnNgcipyWqqp2VZEwkFcB+zbfts4F+Bfw7vvhv4gW3b84AfAD+MOjXZPhERkbzrPxDK+HknTizwSKSQogt/NDe0YBjJfzVSoJFaOj30sqmiGW8KqIiklm3Gbw6w17btTeHvfwn8xLKsSUAzcEV4+0+B71uWVQ8YifbZtt2d5XhERERSchyHfneqZ01NgUcjhRRb+MNf9lrC/nGaVpie4aii2da2lh07tisIF8mAkeoTmWQsy6oGtgIftW37FcuyPgvcCZwD/Ni27YaoY98BbiQU+MXdZ9v2a2k87Qxg2ykPWkRERr2+I0f475v+GE9VJR/+z58Uejgyguzdu5elS5fi9/uH7CsvL+fFF19k0qRJBRiZiEhcM4Ht6RyYVcbPtu3DlmWtAb5nWVY58CRwCBibzeOmY//+HoLBUw9a86G+fhzd3ek1JhXJhK4tyafReH2deP99ADzVE0fdax9OxXhtmWbloOIhLp/PF55eWFF0r6lUFeP1JcVjpF9fpmlQW5tZyJV1Owfbtn9t2/YFtm2fA3wfqCAUdU6zLMsDEP5zKrAj/JVon4iISN5F1vdpmqfE0da2FtMc/CuS1vaJSLHLOvCzLOu08J8m8PfA3bZtdwJvADeED7sBeN227W7btj9ItC/bsYiIiKRD6/skGbd4iM/nA7S2T0RKQy4auH/Dsqx3gfeAk8Ad4e23AZ+1LGsT8Nnw96SxT0REJK/6IhU9FfhJfNFZP2X7RKQUZN3Hz7btTyfY3gF8KNN9IiIi+eZm/BT4SSJu1u/BB+9Xtk9ESkLWgZ+IiEix0Ro/SUdb21q2bNmsbJ+IlAQFfiIiMupojZ+ko75+Evfcc2+hhyEikhO5WOMnIiJSNELN2w8CmuopIiKjhwI/EREZVQJHj+L092NWVmGOGVPo4YiIiAwLBX4iIjKqaH2fiIiMRgr8RERkVIms75s4scAjERERGT4K/EREZFTpO6iMn4iIjD4K/EREZFTpV/N2EREZhRT4iYjIqKLm7SIiMhop8BMRkVHFzfiph5+IiIwmCvxERGRU0Ro/EREZjbyFHoCIiEg+rVmzEtvuGLrjqksGfWtZ87n//nXDMygREZFhpoyfiIiUtMbGJnw+X9JjfD4fixYtHqYRiYiIDD9l/EREpKQkzPAlYZombW1r8zQiERGRwlPGT0RESkpjYxMeT/qfa/p8PlasuJa6uvo8jkpERKSwFPiJiEhJufETnwaMtI9Xtk9EREYDBX4iIlJSOu1jzJ91HqbpSXmssn0iIjJaKPATEZGS0dvjp+OtvSxeuBzDSP1fnLJ9IiIyWijwExGRkrG+vRPHcaiqqMaauXRI1s8wDEwz9F+fsn0iIjKaKPATEZGS4Gb7ggEHgOaGliFZP5/Ph9cbKvyibJ+IiIwmCvxERKQkuNk+V2zWz+PxsnLldaxYcS2GYSjbJyIio4r6+ImISFHKvF+fwU2fuIXySi9btmxWtk9EREYVZfxERKQoNTY24fP5kh5jmh4mjp8CGMyfdR7bOnqpr5/EPffcq2yfiIiMKgr8RESkKLW1rY0UaknEMEwuXfo/mFI/h+aFy9mz6/AwjU5ERGRk0VRPEREpSvX1k2htXcW6dQ/R19c3ZL/P52PVqtV85Ss3AjcO/wBFRERGEGX8RESkaCXL+qlqp4iIyAAFfiIiUrTcrF/sWj/16BMRERlMgZ+IiBS1eFk/ZftEREQGU+AnIiJFrb5+Etcsa8FrGICyfSIiIvEo8BMRkaL3ySuXYYT/rmyfiIjIUAr8RERGsN4eP+vue4NjPScLPZQRbVxPLx+pq8fAULZPREQkDgV+IiIj2Pr2Trp2HObV9s5CD2VE8+/cwXVTTufs2bOV7RMREYlDgZ+IyAjV2+On4629AHS8tUdZvyT8O3cwsayMH37re8r2iYiIxJF1A3fLslqArwNG+Otvbdt+2LKs7cCJ8BfAl2zbfjp8zoeBHwIVwHbgRtu2P8h2LCIipaC3x8+vHn2Xf7n3y+zu2hbZfte98Y+3rPncf/+6YRrdyOMEApzcvQuAstNPL/BoRERERqasAj/LsgzgJ8CFtm2/bVlWI9BuWZb7G8hq27bfjjnHBO4FPmXb9vOWZf0l8C3g5mzGIiJSTNasWYltd2T9OD6fj0WLFudgRMXr5J49OP39+Orq8VRUFHo4IiIiI1IupnoGgerw3ycAXbZtB5McvwQ4Ydv28+Hv7wauz8E4RERGPLdYy8IFjUOajscyDBPDSH6bVgXL0DRPgLIzzijwSEREREaurAI/27YdQkHbo5ZldQLrgE9GHXKfZVkbLMu6y7KsCeFtZwKdUY+xDzAty6rJZiwiIsXALdbS3LAcHCPpsabpYe70P8A0PXH3q19diH/H+wCMOV2Bn4iISCLZTvX0Al8GVti23W5Z1vnAzy3LWkho+ucOy7LGAP8IfB+4MesRh9XWjs3VQ+VUff24Qg9BSpSureJ39MgJ7HCxlq5OP/NmLuXdLc8TDAaGHGuaHqyZ59HcsJwtO9YDQ4/xeDx8+ct/kZNro5ivr+7uLgAmNcyjtohfR6kq5mtLRj5dX5JPpXZ9ZVvcpQmYatt2O0A4+OsFFti2/Up4m9+yrLuAx8LnvA9Mdx/Asqw6IGjb9oFMnnj//h6CQSfL4edWff04uruPFnoYUoJ0bZWG3z+9iaATum8F+h0WNyynY+sLxAvqDMNkScNyKiuqsWYupWNr+6AA0efz0dq6CsOoyPraKKbrK+nayNXXRf462gvejBTFdG1J8dH1Jfk00q8v0zQyToRlu8ZvJ3C6ZVkWgGVZC4DJwG7LsqrD2wzgY8Ab4XPWAxWWZV0Q/v424IEsxyEiMqL19vjp2LCHYGDgA6uq8lBQFzuV0832VVaElk83N7TEWetnjJq1fWvWrKSpaT5NTfPTKoijgjciIiJDZbvGbw9wO/CgZVlvAj8jVJ1zDPCsZVkbgLeBecDa8DlB4Cbgny3Leg+4GLgjm3GIiIxkTjDICw+8SLC/f8i+eEGdm+1zVVUMDhBN08PZ8y8cNWv7GhubUhbCiaaCNyIiIkNl3cfPtu37gPvi7Er4catt2y8AZ2f73CIiI5Hbh+/KFQvx9fWy/V/+ja2BxTjm0FtuVcxUzthsn+vcxmvYvK2dk4DPY/Lt7/3N8LwYBr+eyrFlw/a8rra2tTz22CNpHauCNyIiIvHlop2DiIhEcSt3vvLcVnZ////y7qGxOEbiCp7RWb/YbJ+rsqKa5gVLMYArGxqHNbBxX8+r7Z2pD86D+vpJtLauSivrp2yfiIhIfFln/EREZEBvj5+OcOXOjje7GNt1mK4zLsIx4rdkgIGs3zubn4ub7QMIBhzOaVrJ4e1vsvrMGfka/hCDXs9bezjn/Ok5zfql28h+9uw5mGbyzyqV7RMREUlMgZ/IKFLoKXsjXTbvj3vu+OpynHDlTicYZOPki8HjgWDy85sbWjh4uItzG1toWDyVi66aO+SYQE8PF3U8iLGvGycQwPAkDiZzZX1758DrcRxebe+MO7ZT1djYxNatW+jr60t4jMfjZcmSc2letJhH1j1EfzD+m6lsn4iISGKa6ikyihR6yt5Il8374567aePeSOVOx/TSO2YiCeKUQaoqqmm97IuUl41nz67DcY/xjB2Lt7YW5+RJTu7Zk/EYM+Vm+9zXEww4vLuhi4d//BrHek7m5Dna2tamzOSBwcevu5GWoIPhxG/jo2yfiIhIcsr4iYwS+Z6yV+yyeX+iz42NS0yPwYLGKTnLkpVPn0HP/v34O7czZtq0nDxmIuvbO3FiotZgwGHv7qM5y/y56/fWrXsobtbPND3Mn7mUDT/+LfP37uTSaWfw2z276evvx+v1Egw64aI4yvaJiIgko8BPZJTI95S94ZTuurBMmnin8/6k+7y1E05n9Uf/CggFSrkMtMdMn0HPa+s50bmd8eedn9VjncrrcXVsyN1rSla10zBMmhta6BpTxYK5h/n8F/+CZ//oBujvx+PxsGzZMp544lFl+0RERFJQ4CcyCvT2+Ol4sysy5TDXwchwS2ddmM/nY+HCRtbd90bKNXu9PX6+9q0/Yd/BHQMb7wO+lPnYTNPD5LrZg7blMtAunz4DgMOdu3khjdeWTDrvY/TrefCpr7P/0M7IvrviNfIhs4AbEmf9BrW2MKFr0Qoumj+X1tZVPPjg/axYcS233HI7u3btVLZPREQkBa3xExkF1rd3EoyZsucGI8Uo3XVhSxqWx12z19vjZ919b0TWqa1v72Ry3axIg/REvF5vymPitWNwA+1crIsbM306AO8enRB5bbGvJ11tbWvBSdxmAga/nnTeI5/Px6JFCdu4Jh2LweCxRD93MEjkPWxrW8vixUtoa1tLff0k7rnnXmX7REREUlDgJ1Lienv8dGzYgxPzzz2Xwchwq6+fxNXLWvF44k9aME0P82YsZfc2P8CQ1xldxMVdn7d44fJIL71E+vv7CQYDCfcnar4OuQu0vePGE6idQlfVLCD02l5+dtspFaWprKhm3sylCYO52NcT3W8wkVNda1dfP4mrFi3GE378eO+l+x4q2BMREcmcAj+REhcq0BG/EqITCBRt1q+5YTkQP1tlGCbNC5cTCAxeswdDi7i8/Ow2HMeJ9NJLldFKJlHzdQgF2omqdWZq+6RzcH+iwWCQTRsHXk8mgfz69k6WNCQOeGNfT6r3yOPxsvzqlacckLVMnQHhfof5zpyKiIiMNgr8REpYpBx//LiPoGMU5S/SvT1+ujr74gYh8TJF0QFDdBEXN2hy2xWkk9FKJN7zerwmf/SZpdx+x8XcfsfFXH/zOaf02NF6e/y831+LY4aynU5woJJoJllFNxNcUR4/mPOaHi6rqeGGSZ00LJ6C6QkF2cnfIyMckGcueOI4e/unYs38MGDkPXMqIiIy2ijwEylh0UFOIk4gWHS/SLuvq7mhBSPmNpYo6xbs6+P5R18PFblxM4HBwe0X0s36eT0eDCPxejRXPoKU9e2dJMp0ZpIRW9/eiRMIrfuMF8yZTpDVU6fh+4MLB/XyS/QeuYHv7u3+Qc+f7vrDY5tsDpfV03zWNUypnzMsmVMREZHRRFU9RUrYnl1HIr+wR4utzshPiVvBMtPqjLmWbrsBV9I1doaHLe8fCzUATxLYNTe0YG97EUiyls9xmHd6Ex27NoR7yMV/3lwHKakyuJBeBdHI44QDSDeY69jaTjAYwOvx8JH6yUyePZd39lfiOEcGnR/vPXID39jnj15PueT8M/nVo+9y5YqFODiRv1eOLeP4u+/yoZ1PU3N1C1/828dP/U0SERGRuBT4iZSw628+h30PP8iBXz7BhEsvY9LHbwLgQOB3rHvkIfr6k7dDOJXqjLmUTrsBN1PlOMGka+zCR+PErQbq8AfvP8qM5ZdSu7wVf9lrCRuKew2DS2rr+XjTTG794B38/gA+n5c77/5G3ouNpJPBTadVR7zG7NHBnGF6+OJ//Cd1dXW8/OM3hnx4EBsoRge+0c/v4AxaT9nfF4gqQuNE/n7RVXM51vEOAJULFp7amyMiIiJJKfATKXE9b74BQFVUEBdpmN2f+LxTrc6YS8kae7tM08PsM5awafvLCbN9EUaC1gUObJx8EWc1NqV8Xo/Xy81/eANzbvg4reVlkX5y+Q76Ilm6OBncWMmyfpHHGRz3RYK5dzY/x7yZ51E1tgbD6024LnF19wJaWq7A7w8MCbid/n5efX47GAxZTwnw7oauyGTVjrf20LSoBv+OHRg+H+Vz5qR+M0RERCRjWuMnUsL69u/j5K6dGGPKqZhnRba7DbN9Cdoh+Hy+YQlmXGvWrKSpaf6QryuuuAi/35/wPDfT9AeLrk26Liwlw6C3bCJHfROAgffHMAxmz56Dz+cDwu/LqtXMb7sN77jxg/rJ5Vs62T5XsrV+yR6nuaGFKfVzOOes5SnXJrotNeIVYgli8s7rO3n3By6tdAAAIABJREFU9V1x11MGA85AxdVgkFd+9S4AFXPmYvpOrRm9iIiIJKeMn0iRS3cdnHXjHw5arxfJagWGpv2GI9uX6fq9eNxMU2VFNa2XfTG7ARnw68c7+Ngt5wKh92fLls186Uv/i09+8mPA0PfF7Sc3HBKt10zk/l98jbvu3ZHyuNoJp7P6o38FhLJ+7vuYztrE5oblvPTCG3EDbgcjFOgl7w9PMAibd/iZ5KmgTtM8RURE8kaBn0iRS2cdnM/rHbJez81qPfLwA/QHBop0DFe2L51xJxOvoIrpMVjQOGXIFMef3/Mq+z/oTfGIBgf3H+NYz0kqx5YNCupaW1cN25TORKKnXEa/niGFejLg9Xi47MoL+ev/00J399GMznVbarRemiDgzqAthgNsq2li3qKmjMYgIiIi6VPgJ1Lk0loH5/HEzeC1ta3l0XUPQVTgN1xr+9IZt8tjmgQdZ9AUxUQNvuNlquKtU/v905t4d8OeQVk002PEXRvnZv8KvebRFf16DgR+l7AQTSqeBNdFOjKZepqKY3rZU7OAQPWknDyeiIiIDKXAT6TIuZm7RL/8J8vg1ddPonVZC+seX0e/4wzr2r5U447mAS6oqeWFQ4foC/Tj8/lYtWo1f/aV1lN67kSFUhJVxBzOKZ2ZyiSAjuY1jKx+1plOPU3FgZRtKEREROTUqbiLSAloa1uLGbdNQeoMXttnvhBpRj7clTyTjdvltk9oa1mJ6Q3138t2nMmyVfloup5PkUI94QI06fL4fLTd+ien/LzX33wOt99x8ZCvhsVTMD0pFvbFkUnzeREREcmcAj+REpDol/90MniTJk3m8llzMICrL7xkWNewVVZUc/aCi/AmaahuYrCm4Szm33JbpNJmNpmqVG0RijEASR5AG3hi1tv5fD5WrLwuLz/rbDKBxRZ0i4iIFBMFfiIlIt4v/+lmxm667Ermjx3HjUsvyNfw4lrf3sn86Vck3O+2T1j8rf+DZ+zYnLRPSGdtWrEFIJHA3zt49r5pepg740NgeGK25y+zG50JrJ1UldG5idZoioiISPa0xk+kRNTXT+Lqiy/l8V89lfF6vSnzLP52fgNVPZlVdsxGb4+fjg17wo3Dz8Pe/gL9gQBer5dg0CEYDGCaJreu/SxmeTmQm7V26WSkijEAiaz16x9oz2EYJh9edC0+jw97+4sEwusjh2sdZ6Lm7yIiIjL8FPiJlJAbFi/hiV89BWSW1RkzdRoAJ3fvzvmY0u/XF1oX5vF4WLZsGU888WheApRSDUZii+VEt7toPusa7O0vAcO/jlNERERGBk31FCkhlbu7+Ehdfcbr4MqmnQ7Ayd27clai39XY2JSy8IhpephYfVpk3J/73J9mPaVzNIqe7hvd7qKqopr5s87Len2kiIiIFC9l/ESGUbrZL8uaz/33r8vosZ3+fo5veY/rppxO99RpGQVN3vHj8YwdR6DnKP0HD+Crqc3ouZNpa1vLukceTnqMYZhcft6nea3jYdra1lJXVz9i2yeMZPX1k7h6WSuPrHtwSHP7xQuXc+Dwbm76xC0FHKGIiIgUigI/kWHQ2+PnV4++y8IFjWzduiVp3zqfz8eiRYuBzALF//i77+CcPMnk6TP496//fcZjLJs6leObbE7u3pXTwK+yopp5M5fy7pbnCQYDQ/a7UxJrqk/nqvO/QGV5dZxHkXQ1NyznpRfeGNLcvqqimpVX/DnbOno5Y3qBBiciIiIFo6meIsNgfXsnXTsO09ywPGXfuug1WOlMk/T5fCxc2Mgvfvk+fk8FFdb8UxqjO93Tv2vXKZ2fyPr2TpacvRzDiP+6o6ckFls1zZGmt8dPV2cfrZd+cVC2z1WMrSpEREQkNxT4ieSZ2zcOoKvzJFcvW5EwmHMrLlYbBsfefYdbbrkdnOTNsE0zFDh1H/OwbeIiKk8x8IsUeMlh4Ndz6Bgdb3ZRUVaNNXMpphnbVsAzaEqiApPslGKrChEREckNTfUUySPHcXjl2fdwgsHI980Ny/nlk4/GPd7EoNU3hm13/Dk4DmXnX5Z0mqTP5+Pqq1ewe9tJwKBr/Fyc02dmNMYh00lffQnu/O6Q4zJZd+gEg+x//FFeXH+QYPl0ML00N7Rgb3sRGHgd0dm+yLnhwOSiq+Zm9DqkdFtViIiISPYU+Inkyb6HH2Tvf7VjT24haIb+qQUDDl3b/VzxB+fz1PO/oz8qO+M1DC6eMJEyuwM8HgzDYMOmXpoXLqNj6wtEB0yuvr4+Hnnk58DPI9see24mv3jyybTH2djYlJd1h2dWjmV5y//GCb/2UL++pXRsbQ/36PMMKUACCkyyUaqtKkRERCR7CvxE8iB44jgHnn6SLTXn4hiDp2oG+/pY4JnN0/xu0HbTNLmhaQk1F1zIhIs/wqHO3XT9sotKw4s1cynvbP59yuc1TQ8Txk3nWM9JKseWpTXWSOPvpI87eN1hqkDRaxhMrpsFHi9EJaCis34ej4c77/6GWguIiIiIDAOt8RPJg9533sFPGV3j5+EYg9e1OaaXnklNXLFkaWStn8/nY+V117P4O/9A3YpVeCdM4J093lDgRChgMs3Un9MYhsk5Zy3PaA2X2/g71bpDN0CL7hWXcBwYLFz8cYIxsw7drB8YzJt5nip4ioiIiAyTrDN+lmW1AF8HjPDX39q2/bBlWfOAHwG1wH7gk7Ztvxc+J+E+kVj57H2XL70b3mRbzSJIUMkSr5elV93Kb95aDwzOqMFAQZjw0sBIA+5kWT936mR52Xg63trDOedPz0nWzzRN1q9/haam9IrGeA2DxWeeTWXVxMj4ozU3tHDwcFckQNVaPhEREZH8yyrjZ1mWAfwEuMm27SbgJuBHlmWZwN3AD2zbngf8APhh1KnJ9omwZs1Kmprm09Q0P62gD8C2OyLnJPpas2ZlnkceKk5yYKNN17i5BIlfkTMYHKjwaRjGoIwaxK/OmCrrl01bhEjWzzM4O+nz+Th7wUU0nt2csq2EywTOXfrxuEEfhILY1su+SHnZeK3lExERERkmuVjjFwTc+VoTgC6gDmgGrghv/ynwfcuy6gllBePus227OwfjkRKQzjqyaKZpYpoe+vvTK1CST/73O9nsnTlkbV8st8Jn5/tb42f7YqozDs76GUQvnkvUFuGUsn6BgSIyfX19vPrGr3j1jbQeAg8Gl8+ex6f/4hqMFNNBRURERGT4GKl6PqViWdZlwP1ALzAOuBroA35s23ZD1HHvADcS+o017j7btl9L4ylnANuyGrSMeHv37mXp0qX4/f6Ux5aVlbFixQoee+yxtI53NTQ08Mwzz2QzzLh23P8AD/z+GD3ltSmPnTx1PLf+2UWDtv3iobd44+X3CcQpy997/DDPPPfP7D+0g0CwP7Ld4/Hx8Za/G1Qh0+MxWPyhM7n6urPTHvuXv/xlfvqf/0lff384tBwcYKYyZswY2v/rv5hyxhlpnyMiIiIip2wmsD2dA7PK+FmW5QW+DKywbbvdsqzzCdWVvymbx03H/v09BGMrRxRYff04uruPFnoYJcE0K2ltXcW6dQ+lzPoZhsGtt36O3Tt6ePG/n4nb7y6Wz+ejoaExLz+vD176bz60cytTP/N5xjalzjDGjmH75n1xgz4IZf1WXXkHz716X8q2CIGAw7bN+zJ6jTfd9Gnuv/9+6O/HNDxgGIMCzGS83lARGG/5BP07KDK6d0m+6NqSfNL1Jfk00q8v0zSorR2b0TnZTvVsAqbatt0OEA7+eoETwDTLsjy2bQcsy/IAU4EdhDJ+ifaJRNx4yeU8+siDSY9xK05WlI9nztRLecn4NfH63cWKLaaSK/1Hj3Bi2zYMr5fKBQtP6THi9WKLvfms7l5AS8sV+P0BfD5vztoiuGv9HnzwfubPOh/HIBJgpuLx5Oc9FREREZHsZbsIZydwumVZFoBlWQuAycB7wBvADeHjbgBet22727btDxLty3IsRaW3x8+6+97gWM/JQg9lRDrc/hz+f/9/XDKxBm+StXJuALe+vZPKcKsA0/QkPB6GtifIpWNvvQWOQ4U1H3PMmJw/vssN0OIVhslWW9taZs1YyDlnt9Dc0IKRqDJpmGmaeRmHiIiIiOROVoGfbdt7gNuBBy3LehP4GXCzbdsHgNuAz1qWtQn4bPh7V7J9o8L69k66dhzOqPLiaBHsO8n+daHWAp9a/TFMb/xqkl7DoLVlBRXl4+nYsIdgwEk7UMlXZqpnw5sAVJ29KC+PH62tbS2LFy/J+WuprKjmqvO/QHl5daTvXqJg2ufzsXx5a17GISIiIiK5k3VVT9u27wPui7O9A/hQgnMS7hsN3KqNQMaVF0tNyh59r7406Fuv10sw6ITWtgFr5s3nlWc3E+zvB8MTCVQSTU/MZ7av/+gRet8KB36N+Q/86usncc899+b8cWNbSTQ3tGBve5F4U2hN0+Tzn/8zZfpERERERjjVWy+A6F+sM+23VmoaG5tS9ofzer2RjJPH42H58mswDINL6ibhf2k99lt7cYyBjFSyrJ8RCHLzDYNrDznBIL0b38a/e3dWr+Xg00/h+P1Und1I2aRJWT1WocRrJRGb9TNNDzNnztb0ThEREZEiosBvmMX+Yu32Wxuta/3a2tZipuj3Fh3srVhxLZ/73J+yePESPrH0AraUzx3S6NwNVMDgtElnRgJLr2FwSW0dR7/7bfb8x79xbJPNof/6Hdv/8svs+t532fGtvyPQ05PWuGPXaAaOHuXQ734DQM01+W8Sny/xGsfD4GDaMEyub/28pneKiIiIFBEFfsNsfXsnTjA4aFswGOSBf18/KoO/2vHVXNV8Ll5P4jVk0cFeW9vayBTHadd9nK5xc3HMoTOWmxtamFI/h4vO+VQkYPGUlXHjRZfg+E9w5Pnn2Pntb/LBT35E3wd7wTQJHuvlwC+fSKvwTuwazQPPhLJ9lWc1UjFrVg7emcLYs+vIkMbxMDiYtmaeh8ep4Z577lW2T0RERKRIZL3GT9IXyfYNjvtwgnCs9yQvPbuVS1vmF2ZwBXLod79hee8xnox9U8LcQix1dfVD1rO9s8cHXi/EObWqoprWy76I6TE4t/lSXnj5KVasuJbGr3yVk127Odz+PD2vvoJn3DgmXnEVvvp63v+7r3Hot7/m7bKFkaDuoqvmDnns2DWaixfVcui3oWxfbeuKLN+RworXSsK1unsBX/rSn/Ltb+emdYSIiIiIDB8FfsPopWe3EuiPH+AAbNq4lw9fMmtUFXrpfWsDE8vKuHLhWTzd8Q79gYECIqkKsezZdWRIEB0rGHBY0nA1x092R6Yllk2ZSv3q66lfff2gY8d9aCm3/vu/8v5L4e0/A74U/3FrJ57B6qv+EicYpP3nzzPLf4LKs86mYtbstF53McpXMRkRERERyT8FfsOkt8fPexs/SHqM4zCqsn7BEyc4vvk9MAw++/ff4dfXrxgU+KVqu5AsOxXrZq5IeUzdqmuZ/Phv2LlzY9KG5abpYXJtaDpnMAidPVVM81RwxjXFne0TERERkdKlNX7D5KVntxKnZsYQmzbuHTVr/Y7ZHRAIUD5zFqdNn0Fr66pIIZZ8tl1I5GT5eBY0fyJlH0DDMFnSsDzyvWOa7L3g41TMnpPvIYqIiIiInBIFfsOkc8uBtI5zHEZNe4djG98CoLLhLGBwhc98NllPZH17J1WVE5M2LDdND9bM86isqI5sczDZupdRE7CLiIiISPFR4DcMenv89J8cvBjN9Bh4PEbc40dLe4fejW8DUBUO/OrrJ9Hauqog/eEGCu84yfsAxmT7XKO9H6OIiIiIjGwK/IZBqDdaTAuHgEMgGH/u52gIIvq6u+nbuxezooLymQPtD9ra1hakP1x0/7rYhuWueNk+12jvxygiIiIiI5uKu+RZohYOACRY8+cGEeecP71kKnyuWbMS2+6Iv3NJQ+SvljWf++9fN0yjCon8jKL61zU3tGBvexEYKPKSKNvncgP2eC0gREREREQKSRm/PIvOJGWi1LJ+jY1NkcItifh8PhYtWjxMIxoQ72cUm/VLlu1zBQMOe3YdzutYRUREREROhTJ+eRQvk5SuUgsi2trW8thjjyQ9phAFXSDcDzDOzyg662cYJpddsIprpuzm0K+epqallbqV1w77WEVEREREToUCvzxKJ9tnegys+TVMffS7mBUVzL7zLgwjftGXYuYWblm37iH6+vqG7C9E+wZXon6Aa9asJBAIjTUQ6OOf/uML/JO789WX4G++AhRmeqqIiIiISCY01TOPEmWSogUDDh90n8CsrCJ4/DiBw6ee5evt8bPuvjdGbIGRGz/x6YS9DAuV7UumsbEJr3dkTk8VEREREcmEMn555GaSjnW8y87v/m/KZ83mzK/8Vdxj3//mU5zYspmTe7rwTphwSs+3vr2Trh2HR2yBkU77GPNmLMXe8jyBqCqnhcz2JeNOT+3vT3zMSAxYRURERERiKeM3DPy7dgJQNm1awmPKTpsCwMk9Xaf0HO56QhjaBzDTTGA+Moe9PX46NuyhuaEFjNg2CSMzeHKnpyYqSjNSA1YRERERkVgK/IbByV27ABgz7fSEx2Qb+EWvJ4ytCBqdCUz3sTI5Ph2vPt9JMBAIVcuctRSPJ5RsHunBU1vbWkwz/j+TkRqwioiIiIjEUuA3DNyMX9LAb0o48OvKPPCLrR4a3Uw8WSYw2WO5x+/9r+fp+rd/IXDsWMbjin5Me0MXTvhya25oAUIFbEZ68JQo6zfSA1YRERERkWgK/PLMcRxO7g5l/MrylPFb396JExjcId7N+q1v78QJd49PpzdgdOYw2N/Py0++zdEXX+Doyy9mPK7oxwxGdbCvqqhm/qzzMAyjKIKneFm/kR6wioiIiIhEU3GXHAj09rLrzu/Rd8mF+JZePGhf/4EDBI8fxzNuHN7x4xM+hq+uDjwe+vfvJ+j3Y44ZE/e4NWtWYtsdKcdUO+F0ruevMQA35goGHN59fQdzzZ2cdvklQ9pGxGYOHUy6xs9l5sE36d34NhM+clnK543lru1zYj5jWLxwOQcO7+amT9yS8WMOt9hWFMr2iYiIiEixUeCXA0G/nxNbt7C9czsz5izEVz8QEAwUdkmc7QMwvF7KJk3m6AcHWXfv63x0TTOVY8uGHNfY2MTWrVvi9sJzmaaHyXWz47aScIIOr/xmEx+pHc+45iWD9sXtO+jxsm3iIsrffQOnvx/DO/iSySQQXf3RgYqmVRXVrLziz9nW0csZ01OeXnDRDeiV7RMRERGRYqOpnjngq6lh3IeX4vT3s2/dw4P2nUxjfZ+r7LQpbKtZxN5uf8IpmcmKjbgMw2RJw/K4+xzTS9f4uXQ98dSgIK9771E2vt41JFgMOtBVPY8T/QbHt2we8niNjU0Jq1663EA0VvRaxJHOzfoVy/RUEREREZFoCvxypG7FKgyvl6Mvv8iJ9weCtnRaObgC9dPoGhfqv5coIErVYsA0PVgzz6Oyojrh8ziGQcexWrpfeT3StuE3jyXJ2hkm2yYu4tjGt4fsyjoQTWPd4UjR1raWxYuXKNsnIiIiIkVHgV+O+OrqmbJ8GQD7Hnogsj2dVg4u+3gdbr4tWUCULNhKFmS5HMND1/i5vPSbTXTtOMxzv3qPg/sTV+0MYtA1fi4H3raH7EsViAIEAn385NG/4Ic/u5Uf/uxWHnzq6wOPHXDYs+tw0vGOFPX1k7jnnnuV7RMRERGRoqPAL4dOX30dZkUFxza+zaFnf8sxu4OTXbsBGJMi49fb42frXgfHDK2hSzYNsrKimrMXXITXM7gRus/n47rrVjN/TA9GsD/p8wUNg11MBmCrvS/la3MMg43HJ/PIj14dMqZ0sn7RY7zsygu5/Y6LI1/X33xOWueKiIiIiMipUeCXQ77x46hZFsq2fXDvj9n5nW/h9Pfjra3FLK9Ieu769k4cBlfZTJT1W9/eyfzpV0BMHRa36MiRqtMiAWRChgcizze0CEwsx/Cwr+oM9nT1DhmTm/XzelPXClJhFBERERGR4aeqnjk24fIr6du3j7593Tj9/Tj9fVRfdEnScyJtFIIxhVXCWb9zzp8eqfDpHltVUY018zzs7S/QHwgMajGw+hNns+2OPweg/mMfZ+LlVw55vvv++WUCAXfL4IDT9BgsaJzCRVfNjWzb/YunePzN0HTO2DHBQNXL/v7EmUa1QRARERERKQwFfjlmlpUx+ZOfyuicuG0UwtysnxuERTdrb264mk2dLwOBQZk0X109Y5ecg//9Tsafd37850synngBp+2fjMOBuGOCUNbv6osv5bFnniQQ91GV7RMRERERKRRN9Syw2KbpsYIBh3c3dHGs5+TAseFDKytrmDdzadwWA1Nv/wwzv/kdPJVVGT2fK3qaaW+Pn/e29qRcf7hmwVmYMU3hXcr2iYiIiIgUjgK/AkuW7XMFA6EgbH17J04wOGjfkrOXM2vGwrQzaek8n/ucbnAX75x46w/Lt23lI+HAzjQHF55Rtk9EREREpHAU+BXYnl1HUmbfAHZuPxBeBzh4e0VZNVed/wUqyxP37XOlm+1zOY7Di89ujXtObNavb183J3fv4g9nzqZ58RKWL78m0uJB2T4RERERkcLSGr8CS9TK4Kl/epztRytxTC+mx8A0zbTXASaSbrbPFQw4dG7en/J5l5x/Jk/e/zaWp4JpTQ3cc/tn6O7+gGeeeRJQtk9EREREpNCU8RuBenv8vH+ietCauoP7jyVdB5io51+0dLOLtZOquP2Oi/nkZz5Mf38w5fO+/Ow2uo8abJu4iKrGRcBAi4d46w9FRERERGR4ZZXxsyxrBrAuatMEYLxt2zWWZW0HToS/AL5k2/bT4fM+DPwQqAC2Azfatv1BNmMpJamqbsaTTtYv00bpaa0/DAbZtHEvYNA1fi7GrAWRfW1ta9myZbOyfSIiIiIiBZZV4Gfb9nagyf3esqx/jHnM1bZtvx19jmVZJnAv8Cnbtp+3LOsvgW8BN2czllKR6To8VzDgsGfX4ZyOJZ0MoRO15tAxTN7YcJCLptQBoazfPffcm9MxiYiIiIhI5nK2xs+yrDLgE8BVKQ5dApywbfv58Pd3E8r6KfAjeZbNNA2mHHiHBYdeZc5d/4Jh5nembqIM4b5HH+HA449StvQSntk/k3BbQRzDjNvcXURERERECiuXxV1agV22bb8Wte0+y7IM4HngK7ZtHwLOBCJ9AGzb3mdZlmlZVo1t2wfSfbLa2rG5GndO1dePO+Vzjx45gZ2sp1/QoWv8XBZW7WPS5NRVPPOl6qOXcuDxR9mw5STBsQGIbt3gOGx8bTdXX3d2wcZXqrK5tkRS0fUl+aJrS/JJ15fkU6ldX7kM/G4G7on6/kLbtndYljUG+Efg+8CNuXqy/ft7CAYzXQmXX/X14+juPnrK5//+6U0EU6ypc4D3qhYyJ4vnydqYapwz59LlnY0T068vEHB4/b930NA8VVm/HMr22hJJRteX5IuuLcknXV+STyP9+jJNI+NEWE7mClqWNQ24GLjP3Wbb9o7wn37gLuD88K73gelR59YBwUyyfaUqrTV1ppdDRuGyfa5d8y7HSTDVNF5zdxERERERKZxcZfz+CPiFbdv7ASzLqgK8tm0fDk/1/BjwRvjY9UCFZVkXhNf53QY8kKNxFLV4a+p23fk9eje8yWltt9Hzyiv0vL6e0265rQCjG9Db42fzzpM4CT43cNs8aK2fiIiIiMjIkKvqIJ9i8DTPycCzlmVtAN4G5gFrAWzbDgI3Af9sWdZ7hDKFd+RoHCVnzPQZAPg7t3OyazcAZVOmFHBE6bV5UNZPRERERGTkyEnGz7bteTHfbwUWJzn+BUDVP9JQHg78TmzdysnuD8AwKJt8WkHHlM6U1Hy0lxARERERkVOTy+Iukgduxu/45vfAcfDW1WGOGVPQMWXaCF5ERERERAorv43gJGveCRPwjB8P4amVZacVdpqniIiIiIgUHwV+I5xhGJHpngBlU6YWbjAiIiIiIlKUFPgVgTHTI90vCl7YRUREREREio8CvyIwKOOnqZ4iIiIiIpIhBX5FYExU4DdGUz1FRERERCRDqupZBLwTaxj3oaVgGnjGjSv0cEREREREpMgo8CsChmEw5ZZbCz0MEREREREpUprqKSIiIiIiUuIU+ImIiIiIiJQ4BX4iIiIiIiIlToGfiIiIiIhIiVPgJyIiIiIiUuIU+ImIiIiIiJQ4BX4iIiIiIiIlToGfiIiIiIhIiVPgJyIiIiIiUuK8hR7AKfAAmKZR6HHENVLHJcVP15bkk64vyRddW5JPur4kn0by9RU1Nk+65xiO4+RnNPlzAfBcoQchIiIiIiJSYBcCz6dzYDEGfmOAc4EuIFDgsYiIiIiIiAw3DzAFeAXwp3NCMQZ+IiIiIiIikgEVdxERERERESlxCvxERERERERKnAI/ERERERGREqfAT0REREREpMQp8BMRERERESlxCvxERERERERKnAI/ERERERGREuct9ABKgWVZ84AfAbXAfuCTtm2/V9hRSbGyLGs7cCL8BfAl27aftizrw8APgQpgO3CjbdsfFGKMUjwsy/oucB0wAzjbtu23w9sT3rd0T5N0JLm2thPnHhbep/uYpGRZVi3wE2A2cBJ4D7jVtu3uZNeQri9JR4rrywHeAoLhw2+ybfut8HnXAN8hFD+tB/7Ytu1jwz3+bCjjlxt3Az+wbXse8ANCNx2RbKy2bbsp/PW0ZVkmcC/wJ+Hr7PfAtwo7RCkS64CLgM6Y7cnuW7qnSToSXVsQcw8D0H1MMuAA37Zt27Jt+2xgC/CtZNeQri/JQNzrK2r/eVH3LzfoGwv8K3CNbdtzgKPAF4d74NlS4Jcly7ImAc3AT8Obfgo0W5ZVX7hRSQlaApywbfv58Pd3A9cXcDxSJGzbft627R3R25Ldt3RPk3TFu7ZS0H1M0mLb9gHbtp+N2vQSMJ3Lth92AAAChUlEQVTk15CuL0lLkusrmWXAq1GzX+4G1uRheHmlwC97ZwC7bNsOAIT/3B3eLnKq7rMsa4NlWXdZljUBOJOoT9Vt294HmJZl1RRshFLMkt23dE+TXIi9h4HuY3IKwpm824HHSH4N6fqSjMVcX65nLct6w7Ksb1qWNSa8bdD1BbxPEf6/qMBPZOS50LbtRcC5gAF8v8DjERHJhO5hkkv/BPSg60jyI/b6OtO27XMITWNfCPxVoQaWDwr8srcDmGZZlgcg/OfU8HaRjLlTp2zb9gN3AecT+mQpMg3Bsqw6IGjb9oGCDFKKXbL7lu5pkpUE9zDQfUwyFC4gNBdYY9t2kOTXkK4vyUic6yv6/nUE+H8kuH8RygAW3f+LCvyyFK4W9QZwQ3jTDcDrtm13F25UUqwsy6qyLKs6/HcD+Bih62s9UGFZ1gXhQ28DHijMKKXYJbtv6Z4m2UhyDwPdxyQDlmX9PaF1eyvDHyJA8mtI15ekLd71ZVnWRMuyKsJ/9wKrGbh/PQWca1nW3PD3twE/H95RZ89wHKfQYyh6lmXNJ1T6fCJwkFDpc7uwo5JiZFnWLOAhwBP+egf4nG3bXZZlnUeoumI5A2Wq9xZqrFIcLMu6E7gWOA3YB+y3bbsh2X1L9zRJR7xrC7iGBPew8Dm6j0lKlmU1AG8Dm4Dj4c3bbNtelewa0vUl6Uh0fQHfJnT9OIAPeAH4gm3bPeHzVoSP8QCvA5+ybbt3eEefHQV+IiIiIiIiJU5TPUVEREREREqcAj8REREREZESp8BPRERERESkxCnwExERERERKXEK/EREREREREqcAj8REREREZESp8BPRERERESkxCnwExERERERKXH/H+aHpgFgNvDdAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize = (15,5))\n",
"plt.plot(close, color='r', lw=2.)\n",
"plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
"plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n",
"plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}