Planar data classification with one hidden layer

你会学习到如何:

  • 用单隐层实现一个二分类神经网络

  • 使用一个非线性激励函数,如 tanh

  • 计算交叉熵的损失值

  • 实现前向传播和后向传播

1 - Packages(导入包)

需要导入的包:

  • numpy:Python中的常用的科学计算库
  • sklearn:提供简单而高效的数据挖掘和数据分析工具
  • matplotlib:Python中绘图库
  • testCases: 提供了一些测试例子来评估函数的正确性
  • planar_utils: 提供各种有用的在这个任务中使用的函数
# Package imports
import numpy as np
import matplotlib.pyplot as plt
from testCases import *
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset, load_extra_datasets %matplotlib inline np.random.seed(1) # set a seed so that the results are consistent
% testCases.py 保存在本地

```python
import numpy as np def layer_sizes_test_case():
np.random.seed(1)
X_assess = np.random.randn(5, 3)
Y_assess = np.random.randn(2, 3)
return X_assess, Y_assess def initialize_parameters_test_case():
n_x, n_h, n_y = 2, 4, 1
return n_x, n_h, n_y def forward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3) parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} return X_assess, parameters def compute_cost_test_case():
np.random.seed(1)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} a2 = (np.array([[ 0.5002307 , 0.49985831, 0.50023963]])) return a2, Y_assess, parameters def backward_propagation_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
parameters = {'W1': np.array([[-0.00416758, -0.00056267],
[-0.02136196, 0.01640271],
[-0.01793436, -0.00841747],
[ 0.00502881, -0.01245288]]),
'W2': np.array([[-0.01057952, -0.00909008, 0.00551454, 0.02292208]]),
'b1': np.array([[ 0.],
[ 0.],
[ 0.],
[ 0.]]),
'b2': np.array([[ 0.]])} cache = {'A1': np.array([[-0.00616578, 0.0020626 , 0.00349619],
[-0.05225116, 0.02725659, -0.02646251],
[-0.02009721, 0.0036869 , 0.02883756],
[ 0.02152675, -0.01385234, 0.02599885]]),
'A2': np.array([[ 0.5002307 , 0.49985831, 0.50023963]]),
'Z1': np.array([[-0.00616586, 0.0020626 , 0.0034962 ],
[-0.05229879, 0.02726335, -0.02646869],
[-0.02009991, 0.00368692, 0.02884556],
[ 0.02153007, -0.01385322, 0.02600471]]),
'Z2': np.array([[ 0.00092281, -0.00056678, 0.00095853]])}
return parameters, cache, X_assess, Y_assess def update_parameters_test_case():
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])} grads = {'dW1': np.array([[ 0.00023322, -0.00205423],
[ 0.00082222, -0.00700776],
[-0.00031831, 0.0028636 ],
[-0.00092857, 0.00809933]]),
'dW2': np.array([[ -1.75740039e-05, 3.70231337e-03, -1.25683095e-03,
-2.55715317e-03]]),
'db1': np.array([[ 1.05570087e-07],
[ -3.81814487e-06],
[ -1.90155145e-07],
[ 5.46467802e-07]]),
'db2': np.array([[ -1.08923140e-05]])}
return parameters, grads def nn_model_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
Y_assess = np.random.randn(1, 3)
return X_assess, Y_assess def predict_test_case():
np.random.seed(1)
X_assess = np.random.randn(2, 3)
parameters = {'W1': np.array([[-0.00615039, 0.0169021 ],
[-0.02311792, 0.03137121],
[-0.0169217 , -0.01752545],
[ 0.00935436, -0.05018221]]),
'W2': np.array([[-0.0104319 , -0.04019007, 0.01607211, 0.04440255]]),
'b1': np.array([[ -8.97523455e-07],
[ 8.15562092e-06],
[ 6.04810633e-07],
[ -2.54560700e-06]]),
'b2': np.array([[ 9.14954378e-05]])}
return parameters, X_assess ```
% planar_utils.py 保存在本地

```python
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import sklearn.datasets
import sklearn.linear_model def plot_decision_boundary(model, X, y):
# Set min and max values and give it some padding
x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
h = 0.01
# Generate a grid of points with distance h between them
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole grid
Z = model(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.ylabel('x2')
plt.xlabel('x1')
plt.scatter(X[0, :], X[1, :], c=y.ravel(), cmap=plt.cm.Spectral) def sigmoid(x):
"""
Compute the sigmoid of x Arguments:
x -- A scalar or numpy array of any size. Return:
s -- sigmoid(x)
"""
s = 1/(1+np.exp(-x))
return s def load_planar_dataset():
np.random.seed(1)
m = 400 # number of examples
N = int(m/2) # number of points per class
D = 2 # dimensionality
X = np.zeros((m,D)) # data matrix where each row is a single example
Y = np.zeros((m,1), dtype='uint8') # labels vector (0 for red, 1 for blue)
a = 4 # maximum ray of the flower for j in range(2):
ix = range(N*j,N*(j+1))
t = np.linspace(j*3.12,(j+1)*3.12,N) + np.random.randn(N)*0.2 # theta
r = a*np.sin(4*t) + np.random.randn(N)*0.2 # radius
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
Y[ix] = j X = X.T
Y = Y.T return X, Y def load_extra_datasets():
N = 200
noisy_circles = sklearn.datasets.make_circles(n_samples=N, factor=.5, noise=.3)
noisy_moons = sklearn.datasets.make_moons(n_samples=N, noise=.2)
blobs = sklearn.datasets.make_blobs(n_samples=N, random_state=5, n_features=2, centers=6)
gaussian_quantiles = sklearn.datasets.make_gaussian_quantiles(mean=None, cov=0.5, n_samples=N, n_features=2, n_classes=2, shuffle=True, random_state=None)
no_structure = np.random.rand(N, 2), np.random.rand(N, 2) return noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure
```

2 - Dataset(导入数据集)

首先,我们导入需要工作的数据。下面的代码将导入一个 "flower"二分类数据集到变量 X 和 Y.

X, Y = load_planar_dataset()

使用matplotlib可视化数据集。数据看起来像一朵“花”,上面有一些红色(标签y=0)和一些蓝色(y=1)点。您的目标是建立一个适合这些数据的模型。

# Visualize the data: c: 颜色;s:线宽; cmap:模块pyplot内置了一组颜色映射
plt.scatter(X[0, :], X[1, :], c=Y.reshape(400), s=40, cmap=plt.cm.Spectral);

你有:

  • 一个 numpy-array (矩阵)X: 包含你的特征(x1, x2)
  • 一个 numpy-array (向量)Y: 包含你的标签(red:0,  blue:1).

来第一次得到更好的数据是什么样子的感觉:

Exercise: 你有多少训练样本?另外,X和Y的维度是什么?

### START CODE HERE ### (≈ 3 lines of code)
shape_X = X.shape
shape_Y = Y.shape
m = shape_X[1] # training set size
### END CODE HERE ### print ('The shape of X is: ' + str(shape_X))
print ('The shape of Y is: ' + str(shape_Y))
print ('I have m = %d training examples!' % (m))
The shape of X is: (2, 400)
The shape of Y is: (1, 400)
I have m = 400 training examples!

Expected Output:

shape of X (2, 400)
shape of Y (1, 400)
m 400

3 - Simple Logistic Regression(简单的逻辑回归)

在建立一个完整的神经网络之前,让我们先看看逻辑回归在这个问题上的表现。可以使用sklearn的内置函数来实现这一点。运行下面的代码来训练数据集上的逻辑回归分类器。

# Train the logistic regression classifier
clf = sklearn.linear_model.LogisticRegressionCV();
clf.fit(X.T, Y.T);

3.1 绘制这些模型的决策边界

# Plot the decision boundary for logistic regression
plot_decision_boundary(lambda x: clf.predict(x), X, Y)
plt.title("Logistic Regression") # Print accuracy
LR_predictions = clf.predict(X.T)
print ('Accuracy of logistic regression: %d ' % float((np.dot(Y,LR_predictions) + np.dot(1-Y,1-LR_predictions))/float(Y.size)*100) +
'% ' + "(percentage of correctly labelled datapoints)")
Accuracy of logistic regression: 47 % (percentage of correctly labelled datapoints)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhoAAAGBCAYAAAAg8Bg7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz%0AAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo%0AdHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzsvXmQJOd5n/m8mXWffV/T19wDzOAk%0AQIAACYAgRZEgRVKmLNG2di17Y3clr72ODa8ty+G1tGt5FXY4vFbI8h5erWRbDlm2ZIn3BZIAQYAk%0AAILA4Jh7pu/7qq77yPz2j6zu6equq3u6uqt6vgdRMeisLzO/yqrM/OV7ilIKjUaj0Wg0mkZgHPYE%0ANBqNRqPRHF200NBoNBqNRtMwtNDQaDQajUbTMLTQ0Gg0Go1G0zC00NBoNBqNRtMwtNDQaDQajUbT%0AMLTQ0Gg0Go1G0zC00NBoNBqNRtMwtNDQaDQajUbTMLTQ0Gj2ERH5JRFRIvLIAe/3N0RkV2V+RSRQ%0AXO+ZMu9tfI7RfZjbM8VtbbwsEVkUkS8d9HE6bLYci2cOey4azUGhhYZGczT4f4EP7HKdAPDrwDNl%0A3vtKcXuzdzatEv5BcZvPAP8YeAJ4UURO7+M+mp03cI7BG4c9EY3moHAd9gQ0Gs2do5SaAqb2cXuL%0AwOJ+ba/INaXUD4v//5KIrAH/FvhFHMFzYIiIAD6lVPog96uUWgd+WHOgRnOE0BYNjeYQEJFhEflD%0AEVkQkayIXBKRvyMixrZxgyLyJyISF5E1EfkPIvJo0fz+S1vG7XCdiMizIvKCiCyLSFpEJkTkT4su%0Ak1FuC4lf3+LW+IPiumVdJyLycRH5tojERCRVnPev7fEwvF78t7fM8flocT/rxf28LCIfKTPuMyJy%0AsXgMb4rI365wLJSI/CsR+WURuQRkgb9afM8jIv9QRC4Xt7MoIr8vIt3btlHxeG4Z8ysi8paIJIrf%0A2WUR+d+3vF/WdSIinxaRHxQ/a1xEviUiH9g25jeK654XkT8qfgfzIvL/iUi03oOu0Rw02qKh0Rww%0AxRvYK4AH+F+AMeBTwD8HTgJ/ozguCHwX6AB+FbgOfBz44zr2MYrj/ngJ+OvAGnCsuL4HxyXyceDr%0AwO/huF6gihVDRP4b4N8ALwK/DCwAZ4AL9XzuMhwv/nt1235+Efh3wBdwxEAe+O+Bb4jITyulvl0c%0A93HgvwDfA34B53r2P1NGuBT5LPAh4H8D5oCForD7QnH5P8P5XkaA/xV4QUQeUUql6zieKRH5PPCv%0Agd8pzsMGTgH3VjsIIvKXgf8AfBP4S4AX+HvF/X9EKfX9bav8Kc5v4PeA+4DfKi7/69X2o9EcGkop%0A/dIv/dqnF/BLgAIeqTLmt4pj3r9t+b/GuTmdKf79N4rjPr5t3P9VXP5LW5b9hnM6b/79ueKYB6rM%0Ao6s45jeqfI7R4t8hIIZzo5VdHpNnitv6eRwx4MeJz7gMvAu0bRkbAJaBL27bhgG8Cfxoy7JXgQnA%0As2VZCFjaeiyKyxWOOGjftvzzxff+wrbljxSX/8oujufvAKt1HotntnyuaeAiYGz7HPPAy9u/Y+Dv%0Abtvm7wLp3X4v+qVfB/XSrhON5uB5FnhPKfXqtuV/AEjxfYCngbhS6uvbxv1RHft4E8gB/4+I/FUR%0AOXEH8wVHGESAf62U2lV2yxb+GMc6kQJeLm7vk0qptW376QD+rYi4Nl44N+SvA4+KSLBo7XkE+HOl%0AVG5jZaVUAvhShf1/Rym1um3Zp3AEyJe27e9NHKvHM8Vx9RzPV4G2olvjMyLSVccxOQsMAP9eKWVv%0A+xx/Cjy+1TVT5Ivb/r4I+ICeOvan0Rw4WmhoNAdPJ+WzOWa2vL/x73yZceWWlaCUugF8FMe98bvA%0ADRG5ISJ/e/fTBWAjXuFOAk5/FXgUR0D9ExwXx5+LiHfLmA23x5/giJKtr1/FEWIdQHvx/3dzfMod%0A816gDUdEbN9fH47Vp67jqZT69zjuixEckbAgIj8SkZ+qMB+4/V1X+j0YOJ91K8vb/s4W//VX2Y9G%0Ac2joGA2N5uBZBvrLLB8o/ru0Zdz7y4zrq2cnSqmXcLI7TJyn/78F/EsRmVdK/cfdTXkzdmNwl+tt%0A5aZSaiMA9HsikgZ+szivf15cvvHZ/xaVszPmATeOG6FcPEal41POErOEc5w/XmGd+ObKdRxPpdTv%0AA79ftLg8hRPr8WUROaOUGi+z/Q3RUOn3YAPbrTAaTUuhLRoazcHzbeBeEXl42/L/Gudm+N3i3y8C%0AYRH5xLZxn9/NzpRSllLqR8D/UFy0sd/dPAm/ghOj8csiIrvZfxX+GU6A698XkXBx2cs4rox7lVKv%0AV3jllFJJnKyVz4qIZ2ODIhLCcYfUy5dxrApmhX1d2b5CleO5dUxSKfU1HMuNBzhfYf9XcGI0/vLW%0A41oUKp8DfqCUSu3i82g0TYe2aGg0jeHZ7amhRb4K/B84ouIrIvKPgHHgkzjBn/+nUmojC+PfAv8T%0A8Ici8g9xbsqfAH66+L5NBUTkl3FiPb6CEzDp43ZWwvMASqm4iIwDnxGRbwMrwJJSamz79pRSCRH5%0AOzjZKc+LyL/BsSycwgmQ/Ju1DkiZbeZF5B8A/wn428BvFvfzt3BiNDpwXCgLOK6bB4BupdSvFDfx%0Aj4qf7xsi8tuACfxdIIHjXqmH/wj8FeCrxW28iuM2GQQ+DHxBKfVn9RzP4jFJ44ilWRzLyq/hCLTX%0AKhwDW0T+Hk7WyZdF5P/GyTr5uzgunb9f5+fQaJqXw45G1S/9OkovbmdrVHqNFscN49xclnDiAy7j%0ApEQa27Y3hOPvjwPrODfeTxS39ekt436D0qyTx3FSP8eATHE/LwA/s237H8GpUpkpbvMPtn2O0W3j%0AP1HcTgJI4mSN/L0ax+SZ4rZ+rsL7P8QROdEty57CsTYsF4/PVPHvn9u27mdxgiGzOILtV4HfBla2%0AjVPAv6qwfxfwd3ACPtPFY30JJ7vnVL3HE0c8fgcniDSLY6n4Y+C+MsfimW1z+EzxOKSLx/Z54Ilt%0AY36juG5Xhd/caLnPp1/6ddgvUWqvAeQajeYwKFoBfhMYVk5FUE0REXHjCIZppdTHDns+Go1Gu040%0AmqZGRDZcEpdxAiCfBf5H4A+1yAAR+T3gW9x2VfwycA+OK0aj0TQBWmhoNM1NCidOYxTHdz8B/FMc%0Ai4YGwjgZK904sRVvAM8ppZ4/1FlpNJpNtOtEo9FoNBpNw9DprRqNRqPRaBqGFhoajUaj0WgahhYa%0AGo1Go9FoGsZdFQxarLw3wJaywhqNRqPRaOomDMyoXQR43lVCA0dk3PUpgRqNRqPR3AGDOAXp6uJu%0AExpxgD878yxB82776BqNRqPR7J2kVeBnr34HdukVuCvvtkHTRdB0H/Y0NBqNRqM58uhgUI1Go9Fo%0ANA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1G%0Ao9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUML%0ADY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0%0ADUMLDY1Go9FoNA1DCw2NRqPRaDQNQwsNjUaj0Wg0DcN12BPQaDQaTXlyORurAC634HbLYU9Ho9kT%0AWmhoNBpNk5FKWizM5clm1OayQNCgu8+Nz6cN0ZrWQv9iNRqNpolIxC0mx3IlIgMglbSZuJklk7YP%0AaWYazd5oWaEhIr8mIkpE/uVhz0Wj0Wj2A6UUczO5Ku/D/Gzl9zWaZqQlhYaIPAr8d8DFw56LRqPR%0A7BeppBOTUY1MWpHLaquGpnVoOaEhIiHgPwD/LbB6yNPRaDSafSOXU7UH7WKcRtMMtGIw6O8CX1FK%0APS8i/7DaQBHxAt4ti8INnZlGcwisuiO8Ez3NeHAAG6E3s8SF2HWOZRYOe2qaXWKa9Y7TGSia1qGl%0AhIaIfB54H/BInav8GvDrjZuR5m6hkFesrRZIJiyUAn/AoK3Dhdd7uEbBW4FjfKvvCQCUOHMZDx5j%0ALDTEwyvv8Ojqu4c5Pc0uCYVMRPKoKgYLlxt8fi00NK1DywgNERkCfhv4mFIqU+dqvwX8iy1/h4Gp%0A/Z6b5miTSlpMjedKLv7ZjMXaikVvv5u2jsM5jZKmj+f7PoBCQG7feDYExxsdF+jNLDOcnjuU+d1N%0AZLM2+azCMB0RKiIopUgmbOIxC8tSuD1CtN1VNT3VMIVgyCARrxyD0dHpRkQLDU3r0DJCA8eS0QP8%0AeMtJZgJPicjfBLxKKWvrCkqpLJDd+FufnJrdUiioHSJjK/Ozebw+wR/YafO2LEVstUBs1aJgKVwu%0Aoa3dRbTdxDDK/xYLBUU8ZlEoKExTiERNXBUKNV2KnNwhMrYiyubttjNaaDSQTNpmfjZHJn37B2Ka%0A0NHtIh6zSpYDrK1YtHeadPeWFwuWpaqKDHBEjUbTSrSS0Pg2cN+2Zb8PXAb+6XaRodHsB7HVQlUz%0ANsDqcmGH0CjkFRNjWfJbgvZylmJhLs/aaoHhUS+ma4sVQilWlwsszpemHCzO5+noctHV49pxY5rz%0AdW1aL8qhxGDO113rI2r2SDZjM3Eru+P3YVmwOFc5dWR12cLlEjxeg2TCuWz5/AbhiMn6Wu3L2Pqa%0ARSTqjPN4jIpCVKNpFlpGaCil4sA7W5eJSBJYVkq9U34tjebOSCZrPz0mEzvHzE7nSkTGVnJZxfxs%0AjoGh23HKsVVrh8jYYGWpgAh09bhLlgvKKaxQw1KnAH0r2n8W56vHUlRfd/t37VQCDQZrx/woBZNj%0At2tpBEIGvf1uPJ6WSyLU3CXoX6ZGU406biTbh+SyNqkaAiW+blPIO2sqpVhayJcdlwqGmRs6yXu+%0AYdbFX/LesfR8jYkpCoaLLw48S9rwVB+r2RWFgiorMO8E23J+F7sllbAZu54lk9EuFU1z0jIWjXIo%0ApZ457DlojjaBgEE6Vf0CHgiU6vV0nSWi02mbsNsknbKxtlnMs14/lx98ktXewc1ll5TieHKKpxdf%0Aw2vnObt+izfaz1PALO9CKVo65n2dfL3/KT47/by2bOwThUJz1bFQCiZuZTl5xqdTXzVNh7ZoaDRV%0AiHbULmzQ3lmq1+u9zG94POxtIqNgunjzyY+z1j2wY4VbgWP8afuHuHkzR3YpxU/PfA9T2VSz4Ssx%0AWPB1Mu3vrXNmmlq4mvBmrmxYXS5vGdNoDhMtNDSaKrjdBgODld0Ond0ugqFSMRII1lF1ScDvN1BK%0AYdulImF25AzpYARllDk9DYN4WzdTHcPMz+YpXJriL976CrV8PGLb3AgOVh2jqR+XWwjUEU9x0Kyu%0A6Jh4TfPRfGeKRtNkhKMmoye9RNtNTJeTvhgKGwyNenYEaIJzEwpHq59a0TYTMWByLMvsdOlT6NzQ%0AqeoTUvbmmExasT6XgirZJ+DIkNWE6M6f+0hXj7vpomxty4n50WiaiZaO0dBoDgqvz6BvoP6Ayr5+%0AD/lcdkcdBYBA0KCz28XNa5myDbRyPn/1TBIxyPkCm38mV7L4C2nSpq/yegL+eIzJsSzHT/twuZrs%0ADtmC+AMGQyMe5qbz5PO3v2cRx9IVihisrTiF3Q4MgXxe4XbrukGa5kELDY2mARimMDTqIb5ubxbg%0AcrmFYNDA7YGp8VzFLp3edJK8p4posG28qcTtvxWcWbrGxd77qjpQ+ieuY9tObZDO7p2WGM3uCQRN%0Ajp92AoZzOYVpOJU9jWIMR3uHHKzQUHDrWhbTdGKHOrp21l/RaA4aLTQ0mn1EKcXaSoHVZWvzKdfl%0AhmDIyS5ZiNfoAQ70j1/j2v2dlQcYBv0T10oW3bN4ianIMZZ97bA1tsO2wTA49fareDMpAOLrlhYa%0A+4iIEAiaBII736s3O0UE2jtNVpb2R5RYFiwtFEinbI4Ne7TY0BwqOkZDo9kn8nnFzWsZFuYKJab0%0AQt4pyJXL1nfT6Zu8Tii24oiE7SibtsUZOucnNxeJAUahwD0vfI3hG+/gym1W3SccW+HCq99mcOzy%0A7U1oF/6BUW/VTqWgrX3/n/uSCZv4ug4Q1Rwu2qKh0ewDtq2YuJWlsA/ZhaZt8cAr3+D6fY+xMHh8%0As0aGWBb9E9c4+e5rGFvUQlu7ydx0HpcNJy69wejlN8n5/Bi2hSe7s/+g17tjkaZBeDwGXh+U+Rp2%0AkIjbBENGzUJgPr+Ujf2pxNqKRSSqL/Waw0P/+jSafWA9Zm1W+twP3IUc9/zkJS6M/RjrWA/rqwX8%0ACwu487mSccGQgccrJcYPQ9n40smK204lFStLedo7y/vvCwVFIa8wTXDrstZ3TFePh+mJXM1x2axN%0Ad5+b1I2d/VM2aO80MU0hk67tgtsgp5uwaQ4ZLTQ0mn0gHmuMedpaTcHqGPcMu7F7ILZmYBVutxwP%0AhoyKPVIqbtNyem1k0jb9g7f997mszeJ8vqR7qM8vdPe666sNoinL9sqxlTAEvF6D4RNe5qZzZDNb%0AMlkMaGszyWVtkondCdpKnYI1moNCCw2NZh+wrMYGPszN5Dl5xkekbecpu9c4v/i6TThuE444N7Dx%0Am9kdYSGZtGJyLMexYQ+hsBYbe8EwBX/QIF2j/00o4hxfn89g9KSPTMYml7UxDMEwFVNje2viFo4a%0AxNct1tcKFAoKt9sRqYGgoYNENQeCtotqNPuAx9vYC7ZVKN8lFrgjAbC24lhD5ufyZWNPN5ibzulC%0AUHdAZ1f1ZzqfX/Bvs3z4fAaRqAvTlD2LDBFIJixmJnMk4jaZtCK+bjM1nmNmUn+nmoNBCw2NZh+4%0Ak4yBtjr6qQAVs1bK3aTqJZe1yaRtUjUCEC2LEpeKZncEQyZ9x9xlrU8+vzA47C1rXchkbCZuVY7Z%0AqIXLVTkQNRG3WVrYndtNo9kL2nWi0ewD/oBBpM1kfa3+WA3DgJ5+N16vUVdRJ6OCHhERBoY8TI1n%0AS/z69aCA8ZvZmuMA8jkb0O6TvRJtcxEKmazHLLJZG0Mcd4k/UNmFsTR/Z2lM+Rqrry4X6Ox26TgO%0ATUPRQkOj2QdEhL4BN16vsLJcKKn6GQgK/QMexBQSccsJ5nQbBMMGhiEo5VQNrZW1Us1F4nIJIye8%0ApIp1E2zbiRtJ1YgLqFSdtBx3280ok7ZJJR0B6A+Y+PxyxzENpkt2dPuthGWpmqmu1XB7IF8j2UUp%0A53PqYF9NI9FCQ6O5A2xLkc8rxAC3W+joctPe6SKXU6DA7ZGSG3S0bDCn0NXjYm668uNnW4dZsz+J%0AiBAMmwSLgsSyFLeul++nshc2ghWPIkopEus2q8t50mmFArK+ALbpwZtOYdpZvD7HcuQ5oJRfq86q%0AopWoJTI20GEamkajhYZGswesgmJpIU9szdq8UHu8Qme3i0jUhXeXwaHRNhe2BQvz+R0d36PtJj19%0Auy8ZbprC8KiXqYkc+VzpRl1udlVcrL3TdWQbsSmlWJjLb7qvFvpHGD/zAMloBwBmPkf/xFVGL7/J%0A5K0so6d8mGbjj4V5QMfb69OheprGooWGRrNLLEsxfiu74+adyypmp/IUCtBRp3l8K+2dLiJRx4ef%0ALxbMikTNOyqa5fEaHD/luFRSSRuF0z3W5xduXKkvNqOtw6S79+heKpIJe1NkTJ64lxsX3l/ymG+5%0APUwdv5e1zn4efPlrxFYLdHQ1vleMaQqhsFEzCHe3onErkahxZAWkpnk4ulcPjaZBrCwWdoiMrSzO%0A5YlEzLr7XGxlNz78etnuUgHnKd7lgkINt0pnl4uuXuemalmKeFEEGSZEIncmgpqF1WXnIGR8AW6c%0Af8RZuD0WwzBIRNuZOnmewPjFAxEaAF29blLJnfVNNmjvMIntIgB5K16v0NPvuYPZaTT10fpXCY3m%0AAFFKsbZaO+ghttbcaYMiQltHdUEjAm1F0bO2UuDGlQzzs3lWlgoszRe4eS3L3Ezr12LIZJy7+Nzw%0A6R1uqxLEYHr0XMOLs23F6zUYPu7F5y8VPoYJPX1uuvvcdcVYuNxOgzcxwOMRevrcDJ/wHogLSKPR%0AFg2NZhfYVvmmqtvJVbF4NAvtnS6SCZt0qvwH6htw43IJ67EC87PlbfOxVQsR6G3hJ+MN40UqFIEa%0A9928z4/hO9jP6vUZjJzwkc3Y5HIKw3DSqTeCjH1+o+J3uEEk6qK792CsMBrNdrTQ0Gh2gdRpAzRb%0AwFZoGMLgiIe1lQKry4VNN0owZNDR5SIQNFFK1SzqtLZi0dml9uQqOmwsDHIDvcSTILaNKFBVPobY%0ANh3Rg5vfVrw+pxPsdto7XaRT1VNM2tqPbsaQpvnRQkOj2QWGUV+AXrhF2nIbxu2UXKWcp/uttSJy%0AWVU1HmWDRNyq6YppJhTwZts53mo7R9b0Ogtty6miVgGxbfoWJ4hGm0tFhsIG0XaT2Gr5WI2+Y+4j%0AEUujaV1a58qg0TQJnd1uEvHKGRsbWR2thIiULY9t2fW5gA4ybmE/eKnrfVyKnCwN+jTM29km2w+G%0AUoDi8ezlpmtEJiL09rsJBk1Wl/NkMgoEQiGD9k73nsvTazT7hRYaGs0u8fkNBkc8zEzlsLc9RAZD%0ABgPF1uu2rYivW6RTNiIQCJqEwq3VMdPjru8m1Upuk0VPO5eip8q/KbIpNsS2AYUyTFz5HB+Ze4We%0AfOzgJroLRIRw1CQc1S4STfOhhYZGsweCIZOTZ3wk4hbZjBOgFwqbm8WP0imLqYlSIbK2YuF2O3ER%0AHm9rPGW63ILXJzV7qNQqn95MXI4cR5SNqhJw486kGBi/im2aBNdX6Z4Zp73fgDKVXZuBdNpmdSlP%0AMmGjlBMs2t7pIhhqLWGrOZo051mj0bQAhiFEoi7YFhyYz9lMjuXKph3m84qJsSzHD6i65H5QJWxh%0Ak9iaRWd3a2Q1xF3BqiIDEfJeH8evvFm6XDWnOIytFXaUr08lbVLJHO0dJt19bi02NIdKc545Gk0L%0As7piVa1tYBXYVZfXw6aedN477ctxkPjsHKJqVNss0/bU14SxDvmcXbVHzuqKdUeN2TSa/aD5zhyN%0ApsWJx2oX64qvt47QcNcRf9FKMRqn4+PVLRq2Td/k9ZJF/oCBtwndXWsVMk22slH5VKM5LJrvzNFo%0AWpx6EjXsOrM5moFoe20Pa1sdY5qFwfQc/emF8lYN28ZVyDN4493NRS439A82X0GybNZmvY4KtLWK%0AeWk0jaZ1rg4aTYvg9dau1NhKHTODIYNAyCBVwQTv9QrRFioIpRCGk9MsetspbFg2ikVEIpl1Lrzx%0AIr5cCtMjRNtM2jpcTRFPo5QilbRJxB13SD31TWBnpq5Gc9BooaHR7DNtHWZNodFKxa1EhGNDHpbm%0A86ytlsafhKMGvf2ezXLYzY6N8HzvB7gVHNz2jgKE86mb3NefgX7/YUyvIvm8zdR4jlx295awYLh1%0ARK3maNI6VzuNpkUIR0wSEYv4enmx0dHlwu9vrYu/YTidPjt7FJm0k0Lp87dei/Gr4VFHZGx/zC9a%0ANn7Q+RAjyVmihcQhzK48ylZMjuXqtmBsp72zNbKBNEeX1rraaTQtgIjQP+ihp89dEkjp8Qr9x9x0%0A9bSuvjdNIRgyCYXNlhIZqlg87a3gKaq1aBUUlyInDm5idRBft/YsMnoHWk/Uao4erXvF02iaGBGh%0AvdNFW4eJZTlNQQ0TXc/gEIivW8zP5LAsiD0QrdoZT4nBsrftAGdXm7U7SIUOBFsndkZzdNFCQ6Np%0AICKC6y45ywoFRWLdwrIUbrcQipiHHruRTFhMT+aIdfSS9QcQ20YZVW6+SuHaXlf+ELEKinRy71kj%0A9dRA0WgazV1yCdRomhPbUmSzChEne0NaJKhyK0oplhcKLC+Vploas3l6+t1ED6lst1KKd61e3vvo%0AY2QDoa1vVE7FEGE0NX0wE6yDWB3pq5UQqa8GikbTaLTQ0GgOAdtSLC7kiW3J4jBNaO900dHlaikX%0Ay/LiTpEBztP03HQewxDCkYM34d/09POTh56qe7wom2AhzcnEZANntTsSd1DYLRw1myItV6PRQkOj%0AOWBsWzE5niWTLg3wsyxYWiiQyyn6BlqjP4VlKVbKiIycx8ty7xC26SKeWeNhtYZxgJ9HAT/sfdj5%0AY0eGye0OrSiFAMowCBVSfHLmRVyqeVwn1UrZV8PtFrp7dbaJpjnQQkOjOWBiq9YOkbGV9TWLaJvZ%0AEoF8iXhpXQ1bhBvnH2Vm9BzKMDbdFFezcZ5d/BF92eUDmde8t5OEN1x5QFF8tC3N0ikpThTmGEnO%0AYFbJSDkMfAGDTKa68BEDNoqcigHRNpPObndLZQVpjjZaaGg0B8zaam2/e2zVagmhYW37KFfvf4K5%0A4VO3rQjFf+OeIF8aeIa/MP08nblYw+eVcvnqGtc/fZMPBqcOPWi1EsGQydpKdaExMOghEDCwbcf9%0A1opxPpqjjU6w1mgOmHpqImSzrZEu4PbcvqklQ1HmRk6XD7QUA1tMXg6eP5B5BQqZusb1BHNNKzLy%0AeZu56VzVMW0dJsGQgWEKLndrBhNrjj5aaGg0B4xZh6Eim1Ek4s0TK1CJUMjY/DwLx45XDyoQYbZ9%0AkHim8TfD3uwykXy88nyUwpdPc8ZYavhc9srSQgGrxk+go7O1Aoc1dydaaGg0B0ykznTPmckc+Xxz%0AxQxsRwyhd8DpbJrxB+tYQZjIhWqPu0MEeGLpJ84f28VGMW7kyZWfYDRZTMYGtq2Ix2oLzfU7yErR%0AaA4KLTQ0mgOmvcNFtZpRGygFsTriOQ6bcMRkcMSD4ZK6WoWuuCL7un/LUqSSFqmkUyxsg5HULD89%0A931ChVTJ+ICV5qNzr3CqidJYt2NZqq6Mk8IeS5NrNAeJDgbVaA4Yl1sYPu5l7Hq25thUwoKe5k9T%0ADIZMzpjLzHKq5lhT7U/8iW0rFudLa5GIQLTdpLvXjWEIo6kZRiZmmPV1k3L58Rcy9GcWm9aSsYFZ%0AZ6yFqTNLNC2AFhoazSFQr1vdtpv7hriVkdRs9aqbAEpxLLcEdXhZqqGUYmo8Rzplb1sOaysW2Yxi%0AaNSDiCDAQGbxznZ4wBimEAobJOLVRVkk2vyZSRqNdp1oNIdAtkodja24Pa1zivrtLKdiNysHYNo2%0A3bPjDARrW3JqEV+3doiMraSDceaSAAAgAElEQVRTNvEWj1/o7HFX1WyRNhOPt3V+H5q7F/0r1WgO%0AgXotGoFQaz2xPrXyJt3JovVgo6NX0VUSWl/lmZXX9kU8ra3WFhH1jGlmfD6DwVEPrjL9Sto6TPoG%0Amt+lptFAC7lOROTXgL8AnAPSwCvAryqlrhzqxDSaPeAPGiWVsCsROYQeIXeCWxX4zPwLXF8f5N3g%0AcZLuIL5sihPLN7lgT+H1748rqJ4gyKMQKBkImJw4bZBK2uSyCsOAYNjUVT81LUXLCA3gaeB3gddw%0A5v1PgG+KyL1KqeShzqwB5MXkZmiIJU87BjYjyRn6M4voy8vRwDSFaHv1qo/RdrMlg/1MFGfTk5xN%0Ab8nqEGAfNZPpgny+9phmxbYVybhNPm9jmkIoXPm7FhGCIZNg47OCNZqG0MSnYilKqY9v/VtE/hqw%0AALwP+N6hTKpBTPl7+VbvE+QMNwY2CuFi2zm6Mit8Yu4lAlZ9VQ81zU1Pr5tCXpUN+HO5IJ2ymLiV%0AJRwxibTpTpxbiba5yKSrK43Dak9fi/VYgfmZ/KZnCQDJ09nlorNbF+DSHD1aOUYjWvx3pdIAEfGK%0ASGTjBVTpstQcLHuifK3/Q+QMN4hgi4kS52ta9rbx5f6nsbVd40gghjAw5GFo1EOkzSQQNPB6ne+2%0AUIBc1glqXJjLc+tapmXKkh8EkTazpPz5dtweIdLWfG6nRNxidmqbyABQsLxYYHmx+eumaDS7pTkl%0Afw3Ekfz/Avi+UuqdKkN/Dfj1g5nV/vBW21kU5QsfKTFY9bYxEehnNDWz7/vOiYtr4RGm/H0oEXoz%0AS5xbv4XfvvMsAU15RIRA0OnUuh4rMDtV/indsmBqPMuJ0767+olXKcflkMvZRKIG6zGL/LZ2IIGg%0AQf+gp+l6mCjl1P2oxvJSgfZOl7ZeVSDuCpA2fQQLaYJWuuwYG+FGaJh3o6dYdUdwqQKnEpNciF0l%0AvK1428b4q+FR3omeZtUTxVAWx5NTPLB2ZbMBYNZwcy00ypyvE0ExmJ7nZGISl2rtgOODQlQ95eea%0ADBH5XeCTwAeVUlNVxnkB75ZFYWDqm/d8jKDZfBHbCvi945/DMirrP1E2JxMTfGThR/u67wVvB1/t%0Af4qs4bm9L8BQNh+df2XXwkYB6+4QeXERLiTx2jUc6hrGbmTIZqqfjwODHsJ3ae0ExxqQ22kN2EIo%0AbDAw5GlKMZbN2IzdqC3ao+0mfQOemuPuJuZ8Xfyw437m/d2by46l5nh8+S26cmuby2yEb/U+wVho%0AEFH2pjVYlI2pbD418wK92eWd44PHnAXF340ox27803Pfx1A23+h7koK4kGKhNyUG/kKG52ZfLNn/%0AUSdp5fnYpW8CRJVS6/Wu13IWDRH5HeDTwFPVRAaAUioLbJ7ZzXjx2U41kQGgEAo1xuyWjOHhK/1P%0AkzdcJZYUBVgYfLPvSf7i5Ddoz9f3u7oeGuL19gvEPE6paUNZnIqPM5yaJekK4LYLDKdmCOpYk01s%0AS9UUGQDJpNWyQqNQUMRWC8TXnUqePp/Q1uHGH6jtwU0lLaYnSk0XCii4PRi2jVnsV5+I28zP5pvy%0ARr21PHo1YqsWwZBFuMUyjhrFlL+Hr/Y/vaOW67S/lz8d/BijiSkeWXuXzlyMn7Sd2xQNGyJj4/8t%0A4Ot9H+QXx7+EiaNW342ecsZvuzcoMVBK8c3eJwDBEgNEHGtzkYzp4csDz/D5ia/is6t32b3baRmh%0AUXSX/A7ws8AzSqlbhzylfUeASD7OuitUsdCCoGjL1S0k6+JK+PhmTMjOHTo5mG9Hz/Doytu83XaG%0Ay+HjZEwvfivDufWb3Be7hs/OoYAXux7hSvRkSd6mLSZXw8e5GjmBKLXxTMDZ9Vt8aOmNzZP+bqZu%0Au2LrGSABJ9ZkajxbYo3IZRXrsSyd3S66apRZn5+9fSG3xWDq5L1MH7+HbLGRW3RplpFrb9OxOENs%0A1aKzW+EuU3/iMNnNfBbn84TCRks8HDUSBXyn5/Hy7uTi32OhQcZCg7Rn11j1tlW8dioxyLh83AoN%0AcioxgQJ+0nau8s5FsDZSpSq4srOGh6vhUe6PXd3Dp7t7aBmhgZPa+peBzwBxEekrLo8ppco761qQ%0A87Hr/KDzwYrvK4R71m/u6z7HgwNV31dicDN4jPFgP2nTt/mkkHIF+En7vVyOnOCR5be5Gj7OXKDH%0AWanCRUFtLheuRE4w4+/h2YVX6cyt4VbOU+myJ8o70dNMBvqxEfozi1yIXaM/07wtve8Uw3ACGPM1%0Aaj/U8/TfbNiW2iEytrK8WMDrMyo+wefzilzRLmmLwduPfYTV7tLfbKyjl4sf6Of0Wz/g2PgVEusW%0A7Z3NdXlzewwCQacmRi3yOcfC5fMfXaFhYTAV6CVp+glYGYZSczseOt5sO0fa5a++oeI1ZdXXXnOf%0AhrKZ93ZyKjHBmitM2hWoPdEaYu9W8JgWGjVorjOxOr9S/PeFbcv/GvAHBzqTBnI+dp2x4DHmfN1b%0Absps+hsfW3mLSGF/y4ZsmAWrkTWLoS5lTIwpV4Dv9T62+x2LEPeE+cLgRzDsAvfEb9GVXeF73Y9u%0AbhvgVnCQm6FhHlt+iwfXLu9+Py2AiNDe6WJhtnIsi2FAOGpi24pUwsayFR6Pgc8vTf3kux6zqsZV%0AAKwu5SsKjVzu9sozo2cdkbH98xrOb+Xa/Y/ROT+JZTWnKbunz83YzWxdlqlCoUXNV3VwLTTCK10P%0AkjF9m8u8VpbHl9/iXNwxVivgzWgVi8MeULAZZ3ElcvzONyhCQVrpNno4tMwRUko175V0HzGxeW72%0ARd5su4d3o6c2T8SO3BoPr17iRLJqWMqe6MmssOjtKPFp7qDBNzLbcPFe5CRqo/vn1liR4rx+1PkA%0APZnllmuQVS9t7SbplEU8tvOuLAIDQ25WV5wUyK0NUD1eoW/A07TWjnqe4NNphVKqrGDaumj6eI0b%0Aj4K54dMcT72322keCF6fQU+vi4W52mmszeb6KYcCEq4ACiFUSNXVFfd6cIjv9D6+oyxu1vDwYs/7%0AWfK24bYLJF1+ci5vha3scb5iMJieB2CihiUXqOu6t+YOczF6hvOxa5it6ttsMC0jNO4mXMrmkdV3%0AeXj1PVKmDxMbv9W4FNN716/zTvR0w7ZfL0qMqt0/Rdm8HT1dIjQUEHcFyRsuwvkknqL7Zd0VZN7X%0ABSj604uEKqTCNRMiQv8xD+GwzepKgWzWxhDHitHW4WJ1uVC2kmguq5gcyzJ83IvP35xi407wFhuH%0A2SKkQ9Hqg0VIRtsJmc0bSNnW4WJ5sYBVJTPS6xO8vub9LhVwKXKSN9vOEXc7JUv9hQwXYld5YO1y%0AxRuujfDDrgfLn+fFeLB3o2cwlL3vt2xRNpF8gqHULFC05O4DBcPFDzofZDLQx8dnX9JiowxaaDQx%0ABupAbpDt+ThPLr3By93vK0kJq9nyuxFU2Z8Sg1l/z+bfN4ODvN5xgVWPc/MxbYvjyQkypo8pf9+W%0AVDXF8cQkTy293vRptiJCOGruyCxJxK2q5cqVcgIIh0b39wlwP/AHjJqdVKu5f0xTCAQNkkkbsW2U%0AUeUGoRRBr8JINa81QETo7fcwM1XZvdPb33zp91t5pfNB3mk7W2KVSLt8vNZxHxOBfn5m5rtlb7hz%0Avi6S1eIiir8Be59EwCZK4S+keW72e5t5I92ZFeKuYGVLbr3Xv+KYKX8flyKnuLB+bX/mfIRoXsms%0AOVAurF/nUzPfZTA1h6GsYh558ylzKV7Y3omc4lt9T7Lqjmy+Zxkm10OjJSIDnADUW6FBvtL/NFYL%0A/uRtWzEzWTvmIJW0m9KvH2kzqaYNgJqBm739bgwDumbHqRrwYRicyU3vYZYHSzhqcmzIs6O6qdcn%0ADB334A80r0Vm3tvpiAwoa5WY93fzH4c/ycqWc3ODtHk4QthA8fnJr5XEt51fv77v7uJmsAw3I9qi%0AodnkWHqBY+kFwDGN/rvRz5QEax02omyG0nOkTC+vdD1UXFg+u2U7SgwWfZ3cDA1yOjHR4JnuL4li%0A3Yl6yKQtQuHmOq1NUzg27GFqPFf2c7R3umrWjPB4DUaOe8lMv8di/0jZp80N0/hIcv+r5jaCUMQk%0AGDbIZhRWQeFyN7e7ZIP3IidKLZ9lSLgCfPHYs3xu6psl1TiDhUNwYSrFycQE7m1VPPszSzy88i5v%0AdJzfUdyrlhu3LCLEPGH+aOg5vHaeU4lxzsZvNb0V9SBoriuSpmkQYCQ5w9XwaHXVXy8bd5haJ26l%0AcUqhEO5bu8rV8GhxhrtDlM2V8PGWExrpVP11RtIpm1ATdvQJBE2On/KytmIRj1soW+HzG7R1uAiG%0A6nt69/oM7vcl8E9/nxePPYGFWVKpsS0f57mZF+sKSGwWRORQU1jnvZ28HT3NTNEl2Zde4HRigsH0%0A/I4b8warnmjta4IIOcPNW23n+ODSG5uLe7PLRHJx1t2VawVVZePmX68IUAoDxQNrV8q+/ejqO3Rl%0AV7nYdpY5X5czx8wyw6lpXq1SZqDa/tY9YVCKRW87b7Wd49PT3ya6z5mCrYYWGkeUBW8H70ZOsejr%0AwLQtRlPT3LN+c1edX++PFW/qu1X228cXxUNbbp01b7SimBBlYyiF859R8oQBwlOLr9GdW+W96EkE%0AVVKlr65piUGyVk5+M7KrQ9+8sQluj0F3n0F3397iDxa8HbwXOcmSt53O7BpBK41LWbjtAiOpaYZS%0Ac7rd4C54O3qaV7oeLjlfb4VHuBUeAWVzNj7Goytv76jg67HzdV0TlBhcDY/y5NIbm9+LAB9c+jFf%0A638KpRRsFSw1AsEHU3MMpedIG15uhIadG/rWdeG2CCniUgU+Ov8DOquUCT+emuZ4anpTnm7MIGt4%0Aeav9nt1d/zbGFf9NmT7+dPBjfHb6eeLuEG9HzzDv60SUYjg1x32xK/RmK/YFPTJooXEE+XH7vbze%0AcV+JCXDZ28Zb0XN8cvaFun/YHbkYH5t7med7nyiNbah20ikbj10gZ94uAR0qJHly6SeMpGaY83Vx%0ANTTKRKCflDsAxZ4CSgz8VoafmnuFcCHFe5GTTAb6sMWgP73I+fXrtOXjgHOh28szqyibUJmmSlvJ%0AGm6uhI8zXXzC688scbbOxnJ5MckaHrx2ruLT4F4IBs2qgaBbqdbRtJV5rf1CqYm7eDPxW1k+NfNd%0AOuosj69xWPB2OCIDKlQENrgSHmUq0MfPTn2rRGycTEwy7e+taz95w42NlASGDqXneW72e7zc9RBr%0AnhpZREWUGHxg+a3NNgiPrr7DoreDlOkja7jJmF4UgoEi5g5ji0FXdoXT8fHNTLRabD8Kj61cpCMX%0A46XuR/ZeK0OEvOnhT4Z+GiVmiYvmZmiQG6Ehnll8lbPxsb1tv0VoyaZqe6XYKj7WrE3V9oOxwADf%0A6P9Q2fdE2bjtAr84/qXNKpz1kDa9XA6fYMbXzUygB5syBb6UwlQ2n5v8Bm2FOHO+LlKmj4CVoS+z%0AVPZJc8UTZSLQT0FMurKrDKdm6zJ7L3rb+S+DH6t7/lv56NzLnKxQi2TG183X+z9EfttFxVQWH5t7%0AmeH0XNn11txhXm8/z83QEEqMzcZ3j6y+SzSf2NM8t6KU4ta1LPl89WMjAifP+pq+86dtK9ZjFqmE%0A4xLyBQyibWbFeV8PDvHtvifKvifKJmBl+EvjX9ZphThp3ddDw2RML6FCitPx8bIi+Vs9j3MzNFzz%0ASV2UzanEBM9uaeKYF5P/PPRx4q5gzfW9VpZfGvvzsu8pYMnTTsrlw2vl+GHnAyz4OkvdMkVrwkOr%0A7/L+lWqNuhvDuivIH418qnE7UI5d9hcmvtIS7pW7pqmapjoX285WDNRSYpAz3FwLj3Dv+o0d7xfE%0AJG+48Fi5kou238ry0NolHuISy542vtL/FGmXv+jScLbrtXN8fPYl2guO1aGecuEduRgdxTbMu6E7%0Au8pwcobJQN/Oz1nFLdObWeJ4snxGQtL08bX+p8pWSbUw+UbfB/n5ya8TLZQKh2VPG1849iwFMTfn%0AosTgRmiYscAx7l2/jqlsovk4J5JTe7J0iAiDIx7Gb2Wxq6ze0+duepGRSTs9T7bWkIivWyzN5zk2%0A7Ckbr/Fm2zlQdqmZvYjjDgswFhzkZHKykVNvamyEl7se4r3IKZzWXwobgx92PsD7Vy7y4LYYhe2Z%0AWZXY+C0/ufTGZlCjW1n8zMx3+XL/M6Xui22IsrmnzHVm832gO7cKxYSqT86+yBvt9/Je5NSmRTSa%0AT/Dg2iXOxg+ntVWq0cHwIqBsLkVO8vjKxcbu6xDRQuMIYSPM+rprXkBea7/A6+3n8dh5TifG6U0v%0A8V70FGPBQZQILjvPufVbPLz63o6noc7cGn9l/MvcDA0y4+9BFXuRnExM4tpHd0EtPjr/Ct/teYxb%0AoaHNls62GHjsHJ25GHO+rs0bv6FszsRv8cTSTypaTN6LnMQSo3yQW7Fr47vRUzyx/GbJW9/tebRE%0AZGygxKBgCBfb7ykuULykHuVDi69xNjG+68/r8RqcPO1jZaXA6nKhRHB4PEJXj7vpu7paBaewWLns%0AVKVgeiLH6EkvHu/tY5m2TZZ9HVW3K8pm2t97VwuNH3Xez3uRU5u/1Y1fuUL4UeeDeK0898Rv90ja%0ATYC3LQYJVxDvljiHcCHF5ye/ytd7P+hU2Cwj7IOFNPdXCMIsh1tZPLbyNo+svEvcHcRQNuFC8lDj%0AbuqKabvDekNKjM1A1KOKFhpHjVo/eBEyphdESCsfr7efh3ZxgiuL6xYMN+9ET/Nu9BT3rN/godVL%0AJYXDTGxOJyYONXvDrSw+Nv8KqythxoLHKIiL9nyM44lpTGySpo9Fr3OD6s0s4a/Rxnk8eKzqxVeJ%0AwVjwWInQWPK0seytchPc+l2IYGHwQu/jeOw8x1O7T8E0TKGr201Xt5tCQZHPKQzTERrN3Otkg9ha%0AoazIKJgu0sEIhm2xspKgr/92fM/SYgHqKE3QxDGwDSdjeHgneqbyua8Ur3ec52z81qbQjuQTLBuV%0AO51ux10mRVOAj89/n5+03cNbbec2rRCiFCPJGT649OOa5105TOzNeKzDJlJI0pteYsFXuUWDKBtV%0Azp1cL8XMmKOMFhpHCANFT2ap/r4lIoATpb1jfPHJ6L3IKa6HRvj0zHfo3IObo9G05+O0l2m0FrQy%0ABHdxM6+nEuH2MauenQWJqlI87t/veh+jEzN39KTmcgkuV2vdXRPbqoPm3R5u3fMwc0OnsE3nUuRL%0AxXks4ZjKlaVILWfwJ2Kkg5HKNVIQejPLDZ9/szIRGKj++xUh5Qqw6O2gN+scpwdiV5x+I7VQio7c%0AGuEK8QMCPLx2iftjV1jwdmKJSUcuRrAFSv7Xy+Mrb/HFgQ9XtFw8tnKROV83Y6HBPe9jeA8PHq1E%0A81eH0eyK+9eu7L7uRTUlLkLecPHNviePtObuySxvxpyUQ5RNz7abmduuP6B2Kyl3gDV3Exa7aDD2%0Alh9QweXmJ09+gpnhM5siAyDjD/Fiz/v5cft5cnkFCoZuvFt5o8rGXchxssVqo+wnOcO1o0FZOfLG%0A7eN8KjFOWy5Wfb3ijfXRlXdqimKXshnILDKUnjtSIgOgL7PEp2Ze2BHY7bWyfHDxdR6IXeVj8y9z%0Aer1KHIlS5Y91MUD/XLV1jwDaonHEOJGc4v61y1xsO1ezel+9KDFYd4eZ8vcyVOx8eNQ4H7vOlciJ%0Aiu8rMbgQK+1hcCy9gMsuUDB2fxplDU/tQUcMn98gm3GsGpMnz5MKR3cGeBZF7487LjC6fAvI0j9+%0AlVh7D/PDp5zy4xv1zG0bw7Z48uoLuH0HFx90UKy5Qyx52ymIScwdYiw4RM5w0Z5b5971GxxPTiHg%0AuBnqMNtHt7gjBPjM9Hf4cv8zLPvaSwthFTGVzQcXf8zoEX/aroeBzCK/MPlV5r2dxN0hvHaWY6kF%0ATJyHEwE+vPgqQSvDm23nigG5TmaNQhhKzTAV6L9tPS4eZ7dt8dzsi/j24GJqJbTQOGII8IHltxhK%0AzfJu5DSLvg5EKRLu4J1tV9ks+Do3hcayJ7qZS9+XWaKnxYvOdOdWeXzpTX7Y9WDZcsQPr7yzoz29%0AWxV4YO0yP24/v+uCZpVM0ZtDgBlfD2ueCG67wHBqpuUvRm0dLmKrlvPZRs6WzSLZQJTNjc6TdHtW%0AyOcU5978Pl1zE0wfP0cy0oFhFeiZGWPg1mVGB/IcJeNs3BXghe73MxPYUqtii9k+bfqYDvRxPDHJ%0AR+d/wLH0PKF8koQrUPZ3KMrmWHq+pBQ4gM/O8bnpbzLj7+FmcIiky09BTCL5OJ25GKcSE7p89hYE%0A6Msu05ct76YTHDfK+dg1roVHSbr8BAppTifGCRdSJEw/70VPMu/twkAxmJrjbPxWy5/X9aCFxhFl%0AML3AYLFviY3whyM/Q9r03VF0tKEUKdPL8z1PMBvo2cwBVyJ0Z5b5qflXdlzMWokHYlfozK1xMXrW%0AKdgl0Jde4v7YFUaKraW3877Vd8kZbt6OnilWKwWQqoF5wUJqR7XFrcx5O/lO7+NO++3iDcZQNhdi%0AV3ls+WLLBo75fAbdvS7mFhV5X/UKrQpY94Q41+1ibjrvpELOTdA9V+oiCYYMvL7m61i7V9Kmlz8/%0A9hHnXN1KSZNAR1TdCg5yse0sD65d5sMLP+IrA0+jlJRYMUXZeOx8SRnwks1S2uNIc+eErDQPrV0q%0Au/wwaoE0A1po3AUYKO6PXeFHHQ/seRtKDPrTC3xp4MPENuIL5HYa3ZK3nS8MPMtfnPpGSz8FDabn%0AGdyFe0iAJ5bf5ELsGtdDI8Rdfq6FRrAMV9miZgAfWny94vaWPW18eeDD2NtKGdticDF6lpy4eHrp%0Ax7v6TM1ER5cbt9fCsC1so3I6rgBeK0+0zUUhr1ha2BkP4w8Y9A8eLRfUxegZ0qavbpfnxegZ7l+7%0AwkBmkc9OfZvXOi4wGegHkc3CcY+uvFPStVSzN5Y9USYD/Vhi0J1ddTpdt6joP2i00LhLeGDtCq+3%0AX8DaQyndjWJXa54Ia+7y0f8bhZMuRU7yYJkskKNOpJDk4bX3AHggdpUvDDxLxrXlqVQ53tqnFl5n%0ApEKFUYDX2s9ji1Ss53E5eoq2fJwHYlfveM7ZjE0+rzBNp7HXQaXIhsMmpxITXAuPVLyhKjE2Azw7%0Au91EoiaxNYtcTmEaTpt1f8BoibTe3XA5fKL+uCoR0i4/cVeAaCFJd26V5+ZeImN4yBoe/Fam7vLb%0AmspkDA/P936A6UBfSZHCUD7Jx+Zfpju7esgzbH600LhLcBJZ96a+PXYen5XhRx331xx7NTx6VwqN%0ArbTl4/zi+BcZCx7jZnCIgmHSm17iwvr1qhf+nLgYDx6r0UtG8cOuh1BibB7njOFBieCzsnWlzKZT%0ANvOzObKZ278Ht1vo7j24ol8Prl3iRmgImzLFo5Qikk/QsaVAlNtj0NVzdOIwyqHAqXGzS7Z/5z47%0Ad1f4/e8UG2EsOMCMvxeF0JdZ5ERiajPAc2PMV/ufYsnbDpT+VpMuP18a+DA/N/kNbTGqgRYadxGR%0AfJIVT3TXgYtZ08t4cNCJo66RCpu5C7MpymGiOJmcqthXpRxZ01NXwTWAVzvux2XnuRw5yXLxIhjK%0AJ7kvdpULsWsVTbrptM3kWHZHpl0+r5iZytGn3ETbGn9ZaM/H+dTsi3yr5wPF5nqlNQrW3SH+cOTT%0APL34Gmf2UEm1FRGccv9pV51lr5UiaKVrNgrU7GTVHeYr/U+TdAc3rRTvRU/xSmeGT8y9tBncPhHo%0AZ9HXWXYbSgwKOG0fKsXAaByO9iOCpoTz69f3vK4q0wNkO6JsrezvAJ+VxaizjLsCXu5+hOUt3S8T%0ArgA/6HyQb/U+gV3BtrEwm6taOmFhNo9tH4zfuTe9yBMv/An++FppjQFxBK0tBt/teYypYifdu4Gz%0A8Zt11cTY4IG1yzpOYJdkDTd/fuwjJF0BwLm2bVgqMqaHLw88Q8J0gpVvFFscVEKJwbXQSOMn3eJo%0Ai8ZdxNn1W1wLjTBfoUNiWXZh/VBiVG2ipKmOW1mcik9wNTxSNfUT2FLd1dixbCw0yDd5gmVvO1nT%0AQzif5N716xxfukEmXf2mZNswOZalq8dNINjYGIhE3GbJ30063FZ+QLGuw9f7PsS96zc4H7t2YB0u%0Ac1mb1ZUC8XULFHh9Bu2dLoKhxh6T+9euciV8nLSrSlZO8Xw9G7+1o7aLpjavtt9HzqhgPRSDPI51%0A4/0rb5M1PDVjZvLG0ewEvp9oi8ZdhInNc7Mvcl/satneBTvYxZOVKEV/eoFT8bvDzN0oHll9x8na%0AqXXsa1R0HA8eI+EOkjfcrHiifL/rffznU5/m2oX3s9bRU/UZOJNWTI3nmJ7INdS6sb5WYKl/GCnX%0AAGUDESzDxTvR0/ynoU8w4e9r2Hw2SMYtbt3IsrZiYRXAsiCVtJmeyLEwl0ft4rzYLX47y89OP08w%0AX0FQKYWpLD4y9wpPL752qA3HWpWrkdHqA8TgemgYcLrHVrNooBQhbcWtiRYadxluZfGB5bf4r8a+%0AwOcmv8HPTX6dk0UfeMkJtYuOhC67wIXYVZ6b/V5Je3nN7gkXUvzs1PP4rUx1MVEjVmZ7QzdEyLh8%0ATB+/hzc/+Bw/efIT5N3V42mSCZul+calKlsFhWW6oI7fjBIDWwy+2fckaaNxdTOsgmJ6MldxSmsr%0AlmPlaCDhQoq/MvFl7l+9hLm1zL1SDKdm+fzEVzmVnNQiYw+suiMUDHfNa1u2aKU4F79Z06JxPrZ3%0Al/Tdgnad3KW4lUVXMar/Iws/YiQ1yzvR0yx72jCVTaiQYtUTqXySKZv2XJynFl+jMxfDrdPo9o1o%0AIcFzs9/jzwZ/yukPUqEex66Lr20Ntmzv5u33f4SHXv5a1RvW2qpFZ4+TArvfuD0GwfjqrtI5LUwu%0AR47zUIMym2JrhZrGpNXlApFoYy+dAnxg5SLvX3mHeV8nBTFpz6+3dEG8g0YBBTExlb0Zx5KsJ9BW%0AKfxWFoDOXGyzpcP2h0ukd98AACAASURBVC9RNp3ZNe69g9i3uwUtNDQI7Gj7vu4K8kfDn6yyksFD%0Aa5cqluPV3BlduTWem32R53s+QMblw1C20zdBDDqzayx7K8Q11IthsN7Zy6sf/iwj19+md/Jm2fRn%0ApSCTsgmG9z/tNdph0jt1k5v3PuIU76pTOM36unmIxgiNdLqKmbxIJq1QSh1IDQ8Te0fpe81t8mKS%0AMn147PxmS/qcuLjYdpb3IidJu/wYyuJEYpKH1i4TKFSuyLuJCCPJ2/1dHl9+i3A+yZvt92wGkLrs%0AAufWb/Loytu46wzgvpvRQkNTlkghyQeX3uD73e8rbc5WfNw7lRjn1F2SdnhYHEsv8IvjX2Q8eIwV%0ATxSXshhJThMqpPjjoU+QcvnL1qDYjaUjHYpy+aEPsdQ7xPnXXywrNuZmc8is4PYInd0uAsH9ER1+%0Av4FPZTj75stcevip0oZpVWjk7V20Q6IlSJo+Xu+4wNXQ6GaF2YHUPA+sXeaHnQ+wtsUaa4vJjdAw%0At4JDfGL2RTqzqyx72iqeJ4ayeWT1dqlwAS6sX+fe9RusucPYYhDNJ7QVdxdooaGpyPn160Tz67zV%0Ado4pfx+I0J6LcX/sKmfjt+74kpwXk5zhwWPn9FNBBUwUJ5JTnNhWj+NnZr7L1/qfJuYJYxRja+w6%0AUpB3UBy/1D/C9OhZBsd2WgoKeQBFPq9IJXP4A8LgiBfDuLNfQD6vsArQO30LTybNxOn7WO05VnO9%0AgQb25QgEjc0YDAWs9BxjevQciWgHpmXRPTPGyYWriOjf62GRNH382eBPkdpWqn3W383MRir0tvNA%0AiYGNzbd7n+DD8z/gawNPO89MW8cVRfoTS2+UvR4ZKDry6434SEceLTQ0VdlozmYXn3X3I9gz5g7x%0Aevt5boaGscXAKPZkeN/Ku0QLCcC5yC96O5gI9KMQurMrDKdmdc2AItFCkp+f/BqTgT4mi8eoJ7vM%0AldAoc/7u+uMetjB18l6OjV2uKSDTKcXkWJbh4947ch9srUzavjxH+/IcSz2DvPP4R8uvoGzcyuJs%0A/Nae91myOaU2jSgbnyPSZrK4kMey4Np9jzNz/FyJpWXi1AVmTt5DZPZF7TY8JH7Y+cAOkQHcbr9e%0A4TepxCDt8pE3PTw3+z1e6n4f6xt9m3Dq2Dy2cpFz/z977x0kx5Un6H0vs7xr770DuuE9YQjaoZ0Z%0AupnZ8Tu7O7eru5VCurjQhbQX0unuD0kRd6vTRuhipVVIG9qd3eFyHDkcDi1IgCQIkIRHo9Fwjfbe%0Al3eZT39UdaELXa4b3SDQqC8Cga7Mly9fZWXm+72fXaX7K88t8oJGnpxYrQl+2lTAb6ufJKqoi1Sb%0AsXCyfls1L458hEUL8n7lw4xbShEylnpKFwr2iI9n8rUFEihIGvyjSZVl632jvFX9KDPmouWZUYQg%0AaHehqQYMWnaVcDAgGRuJUFltXLGwkcpKUjoxRHPXKW5u3ovQdWS8kZA6itR5dvTTO06vrWmSmako%0Ac7NR9PjC1elSKC4zYrEo1DWY+SJaFxMybh+ooqBJeLfqMD/s/11eE3eXCSnGWOhpOkE6y72oSJ1p%0AUyF7Zy/xvYG3GbeU4jHYsGghqgMT+ai5RViOvpL4+1/9ZSysPBryQ/f7y+4rL2jkuat8XLY3SchY%0AQAqFiGLgWNleokJlzuRKbF949P3x2gLfGXw3732fBqse4pWhI/Q6auLajXKiIndHy+UIlO45DUWB%0A8gojYgVmFKtNQVFiCoPF1Pd0UTQ1ynBjO+7icixGSaN/hE3uHuxaYNnnWYwWlfT3hoiEk7+nx63j%0A9YSobTBhs6uM125JK6hJoRBSTPQ46vOr37uIjuBY2d7syewyIAE1LhwKoDI4xdpnZrl32PFclOeV%0A/zq3xn+5eufNCxp57hrTpsK0dQMg9gLPtj8CdBZs4OD0+TUY4fpARafVO0ird5CIMHCuqINOVxtR%0ANX0Gw1iF3mk62k3cvB4gkqPSYG5GwzOvUV1nWraTqKIIikoMTE8u1aA452dov3CCwmKViqrVq58z%0APhJeImQsICWMDIapb3cwmyWqRyAZs5TmBY27yPnCdvrstdkbZjGfNPhHUu67Hznwt7cKXT7+64e/%0AwpFkJi9o5LlrzMa1FFmRegbVqMI1Z0NWQUMC/bZqugpamTEVYpBRmr2DbJ6/geMOV8X3E0YZZd9M%0AJ7tmunit/nl8qSJViL2At8dzU1htCpFw9jDPBTQNhvrDNLaYMZmXt9osKTMQjUrmZ5eaIJwFCuWV%0Aq5fe2e/T8Hgyfy9NA583bw6514gKhQuF7blp5tK0EVKn1j9OSXh+lUe3+qQyW6Tk13dhMKtAXtDI%0Ac9cw6DmGg2VRjYayVIiVwLGyvVxzNSeF5l4obKeroI1vjBxLVGd8UDCg843RY/yu6rF4LgAJQold%0AHwT7py/QGF/pFZcYcc+FltW/lDAzHaWyennaByEEldUmiop13HMakajEYABXgQGLdfUSF0sZq06b%0AC5o/QklohhlTYVqnWimUNY1+uV+JCBUBGFbZd2XSXExYzeHekjIWvmouSgrVlkKhMjjFkxMnV3Vc%0Ay+GrMlvcC+QFjTx3jZrARHJOjhUj8KrWtJqJblcL15xNAEnnWijr/E7lYX448DsMmWoYrEMKIl6+%0AO/gOPY56+uw1RIRKaXieDncPhRFPol2sgJjK7PTyJgvPvEZl9crGZrYolFWuXUUEv08nBx9XIOb7%0AuWPuKh9WHEi5X0gdixaixTu4iiO8f5HAVWcTFws3MhuvJlwenGb73JUlYdkrRc/xnVEamuGl4Y/w%0AGaxcdTYxb3Rg0iO0eAepDk6sapaU+8VscS+QFzTy3DWMMkpJaI4pc9Hy8z0sRgjGrGW0LspkuoAE%0ALhZsTHuoFApBg4Wb9jo2ePsZNxfT7Wph1uTCpEVo8Q3S6h1Y9RXZvYJRarR7erP6FpRXmjAaI0yM%0A5Z6UKFNttFyRUhIMSNzzUaJRidEgcBUZsFiWJ4RIKfF6dAI+DUnMJJIrDqdKkXeAaVMB54s23RKO%0A48nqTHokXtfnwRJUUyGBT8r2cMXVklSbZ9JcxAeVh9g9c4k9s113fJ7i0HxOi5RDU+dQ0XFFfexd%0AlHRrOaw3s8W9QF7QyHNX2TJ/jWMV+9M3yDEkM11sREgxMW9yptkbQ0idMUspU+YiOgs3LppIdIbs%0AVZwr6uCbw0cfKF+OVBSVGLHaVAb7QjkJEUbTrd8tFNSJRmM1UswWkVMIrK5LRofDeN3JJ5ud0Sgo%0AVKnIMZTWPR9lbDiynOLDCaw2kfAzeWimkwbfCF0FrUybizDoGs2+QTa6bybSXT/o9NuqY0IGJD23%0ACwLBmeItNPhH7jgk3arHNEg9jrqUwoaQOkVhNxUZcpv8m6//eW4nW2dmi3uBvKCR567S4hvki+gO%0AAqoptS+GEJmdQQGkpDI4lXJXqhTaS9vEHFPH4lkEEy+u+P8eg513qw7zraH3H/iE1BarQlObhZmp%0ASFZTSmGxAb9PY2IskpSMy2QSlFUacWSplzIxFlkiZCwwP6dhMApKyzM7h46PhpmbWaE2SkBNXbIf%0AQGVomsqJfGIuiAn3Q9YKbjgaCKomnFE/k6aijM+rkDpdrlYemzx1x+c/OHWWSXMRbqMDKQQLyegl%0AoBlUOpsbOLc9R2Eiz10lL2jkuasYpM5zo5/wVvVjRBRDYpJf0CpsmbtGQDVzM8PKpd43mjaPhkmP%0AUByaY8ZUkFYzoguFOaMzY56EaXMRo5ayfEErwGAQlFeaUJRIylBUAKtVYDYLBvturfRDZiuewhKE%0AlPhHJqiv0nC6Ugsb6SJPFjMzHaW41JA29fn0ZGTlQgZQVm5ANaydn8j9TFgYeLfqMKPW8sSzmosp%0AQwolZirNkWxmC6HpOGeDOOdCqFEdXRH4Csy4iy1oxtUv/JdndcgLGnnuOmXhWb47+DZXnC30OOqI%0ACpWS8Byb3TeoDkwQVozMmVyxwkcQ13LEVsiFYQ+PTn6Ztm8BbJ+7wtE05pkFR76AwZpxjELqDNkq%0A84LGIkrLjRhNgpnJKOF4LgpFiWkyiktVBnrj1TNNZq5v3c9kdUNipatoUfoHrvK01oVBLNU6+X3Z%0ABQSpQ8CvY3csnVCiEcnUxMqLXBUVqxSVrJ/XoYZCr6OWXnsNUaFSHJ6nw30TV9S3ov6Ole9jzFIK%0A3NIA5uTULSUGPbpqZgupKrhLbbhLbbn1l+eeYP08WXnuK2xaiF1zl9k1d3nJPrMe4aXhD7nuaOCK%0AqxmvwYY9GqDdc5M2T1/WtM9t3n6mzYVcLGxf4shn1sM8OvEl71Y/mrEPAcgH3nCylIJCA64ClWhE%0AIiUYjQKhCIJBnXBIElUNnD/0HH67K0mdrqsGBhs38Z67gOenPltyZbVobg4V6QKF5mZzFzIUFex2%0AFU2TmEyCgqLVDaX9qvEYbLxV/RhuozMRvjxoq+J8YQcHp8+xdf76svqbN9jpddStaCxSCLobGlZ0%0AbJ71Q17QyHNPYpAaHZ6bdHhuLvtYARyYvkCTb5guVwvTpkKMMkqzd4iNnl6MegSLFiSoWtL2oQuF%0A8mButvmwMDBgryKkmHFGvdT6x9d18TchRJLjJ8Q0CgAjjRvxO9KYrYRgqKCWYV8FtYHxpF2RSG7X%0Ay2xJLfwF/LlHgFitCtV1q5dt9F5CR/B21SN4DHZgkfYhLtqdKN2FK+JNqo+zQDqzhWM2SPG4b0Vi%0At66Ar8C8giPzrCfygkaedUtlcCqt0+jm+RucKdqcckIUUsemBbOmKpbA6aLNnCvsQCpqwufDpIV5%0AbOILmtZRquNsqGrsOo42bMjYTkidK86mJYKG35ddUFAUMJoUZo1ObjrqCCtGCiJeWrwDQO4JxoqK%0A1+9rb9BWyVw8l0UqJPBG8xOMN6Rok8ZsIVYSvhNnrtSGrq4fbVGelbF+n7g8eTKwc7abcUsJQ7aq%0AJK95IXWMepRnRo9n1UqcLN5OZ1H7rQ1xoSWsmni/8mGeHf2UhsDSlWM2okIhIoyY9PB9U03SYhUY%0AjBCy2DKGJ0uh4DXal2zPxXQijSpHyvfT42yIV/WV6CicKNnBTu1LHJevZe3D4VKwOe7fiS9bkqji%0AMS+OuVBa7YMALIEoQpfIHAvhhS2GFRsRQ7bVSyGf5/4lL2jkeSBR0Xlu9FOuOxvocrUxZ3RgklFa%0APf1smb+eNYdGUDHSWZg+MRjAx+V7+cP+N3Me07SpgLNFm+i11yKFgkGP0O7uZefcZWza8lKC322E%0AEJRXmDCFggRVQ8Z6E7Zo8rXVdYnBIIhmETaubjvIqKMeSK7qq6FyuvUgW6f9lIynz0RpdypU15pW%0AXNZ+LVm1JFE5yqVCypx9kEJWA2GTgjGs5yxwSCBiUomY85EgefKCRp4HGAXJRk8fGz19yz72QkGW%0AAk9CEDBYmTIVUJpDEadRSym/r3oMXYiEXT2qGOkqaKXXXsPLw0ewa0Eg9hIfN5cQUC3YtQBloZl7%0Awm3VWaDSNneTTttWSDMiKRQ2xK+3pslYSOqsltbJcwG/3clIVUvqnUIgpM7w1p2UTgylTNRVXKpS%0AVrF2fhkaCkO2CoKqGWfER1VwEsHdTxIVthhgPr1QGss5oaDnqM0AQAimqp1UDLhR9FviiWTBaTr5%0A1164/LMVmbVbeR4c8oJGnjwrYMZcmFMW00lzSVZBQ0fwYfl+NCGWJD6SQsFvsHKyZCdfmzhJr72G%0AEyU78BodiTYFYTcPT51d4vcAsZf+dUcjnQVtTJsLUaSkwT/M9rmra1JYblf4Jr3R1pRVYoXUqQxO%0AUe8fRdMkAzdDiTDZbMw3NGbM2yCFwoythLKOYrRJN16PBjJWibaw2IB5GSnMdUSS2SwiVOaMTsx/%0AvB1NFxQ4ovyP3VuRaizsumjch2M+hLLoq0SMCjOVS01Ea43PZaJowhermZemjbvIsmwBIGIxMNpU%0AgGsmiH0+hKJLNINCyGLA4g+jLhIUo0aFmQo7Qfv6dLjNs3zygkaePCvApIdzellbc0hjPmSrwJfC%0Ab2EBKRRuOmrp9jfxSfneJfvnjQ7ernqE50c/SRI2JPBR+UPccDYm/FA0Ab32WnrtdTwxcZLWDIXB%0AdAQDtirmjU6MMkqDbzihVdERDFkr8BrtmLUQ9f5RjFLDood5cfhDjpY/xIitYtGXkDR7B3lk4hRo%0AOlMTkSQhQxcKYbMFVdMASdRgwhQKoOqxUOYwhrhgl/laXizbTJVzgorgNB6jA7dqRo/6qQxOpT3U%0AcvQVJgfgo5+pjPYqiVV60KqiGVVs7jAKwJFbq/VaMUPAYcLqDScJGAsYIjrlgx7G61yE7HfPT0Gq%0ACpM1TsqHPEmahoUhBuxGPMXpo60yoRlVZivszFbYk4VsKbH4IyhRiWZUCFnTm87yPJgsS9AQQmwH%0AvgnMAL+QUk4t2ucC/kpK+SerO8Q8ee49Ns/fiE3gGRBST6lluJ0ZU0HWLItSKHxRuj3e8W0vcaEg%0Apc5npTv5g8F3E5PLVWcTNxwNiTaL+0JKjpY/RHVgEltceFjMkLWCj8ofImCwJnIxHC/dRYe7hxr/%0AGMfL9sSSnsUnHIMeYc9MF9vmr+LQAjzZ8yHnTU1cr9tC0OYEIei11RBQAzReP4cpHBMgogYj/Ru2%0AMdKwEc142wpYStRIiNreK5i8vuwJoqTkSkELVwqWmlgiC6tsx9JVtuXfhSkfilWvXbh2MadJDQJa%0AkoCS2C/B7klf72RBWCma8DHWVJh53KtM0GFitLEA10wAmyeMkDF/CU+RBW+heXWEgMV9CJHXXuTJ%0ASM76RCHE08CXwPeA/w7oFkI8vqiJFfjJ6g4v5Tj+XAjRK4QICiHOCCEOr/U58+S5ncrQNK6wJ30D%0AKWl338ypFL1R13JyzAupGSYJoTBnKmDKdCvd86WCtvSdCYFE4YqzacmucXMxb1c9QkCN5T+QQom1%0AFwqXXa18UPkwgYUcJPHxRBUjn5fu4ELBRibHI3wZradz4wGC1luaGl01MFK/gXMPf52I0UxUNXDu%0A0HMMNm9eKmTE+9ZMFvo37uDG1n0ILUrGSmkZJlBDRKd8yIPFd5twICVlw8lCRqK7FNuWgwDMIQ1D%0A6O5XAo5YDExXOxncWMLAxmJGmwvxrsBkkifParCcOK9/B/yllHIL0Aj8B+BNIcSzazCulAghvgv8%0AFfA/AzuBT4F3hBD1d2sMefIs8MLIR7EIihSTX3VgnENTZ3Pqp8E3nLmBlJiiuUWd3JgwcO1ygBtX%0AA7EU7plCTYFJc/GS7aeLt8T+SFf0buFfCk4VbWHEa+batgNxbcdtfSgKAZuDvo3bGWjbis9VGEuQ%0AkQWpqEhD3ASxgnr0C6MtGvcn/V72uG/FWk6/ajQ2XqHr1F27zuHf/Z5H33iTDefOo0Yia3jmOHnh%0AIs9XzHJMJ5uBHwNIKSXwH4UQQ8CvhBDfJ6btWGv+FfD/Sin/n/jnfymEeAb4F8Bf3IXz58mTwK4F%0A+d7A77nhqOeyq5WgaqYg4mHb/DXq/KM5T14OLcAGTx/XnY3xqpS3IQRt3n66CjMnwwJQ/QGkhGg0%0AHsKYaZKREqEnr7aDiimWW2SF6IrKzY6dSEVJP8EpCqP1bQg9S5XexSzqyzE/g7eodNljE4AprGEM%0AaUQssVef1bv2E71mVHDOzPLcz1/F6r/ls9N47Tr7PjrGRy+9wEhL85qPI0+er4rlaDRCQJKxUUr5%0AKvBT4J+Al1dxXEsQQpiA3cD7t+16HziY5hizEMK18A9wruUY8zx4GKVGh6eXbw1/wA8H3uIbox9T%0AvwwhY4Ht1z+ndLQPiK18ha7HVu5Ssmf6IgemL2DWQulNB1Ji8blxzcaKwAmgeHwo8+pfUZbknQgp%0Ad+i4KCVBW6zGRiZ0gxHNtJLU1JKi6TEOvvdPCG1lJokFDQOAXMPFvgSCFhXQ+Mbf/0OSkLGAoml8%0A7devUzie2ZfHEA7jmp7B4l1ZUbQ8eb5KlqPROA88DpxZvFFK+ZoQQgH+bjUHloJSQAVufyLHgXQZ%0Abv4C+J/WclB58mQjGpHMzUbxezV0KTGbVZwuBbtTRQiBez7K5HCEzcMf43F1MlHbRMRoxuL3Ujl4%0Ag1pXGLXMyP7pC3xcvm9pWG1c+GjtOpUk4NT1XGK6si51GK6uYwoFME6O8NobP+DCm7E1hNAldddn%0ASFFgNTcUBWM4SE7GiBzCg5cgFLyuYkyhIJaAl4Ddtew+tEWl4H0FZhwZnDozkmH8C5dvrtxOx5kz%0AGMOpz7HgNHrwvSO8/Yc/XLLf6vGy8/hxmi9fiUfkwFhtDRcOHWSsIW8xznN/sBxB4/8EHkm1Q0r5%0Aajzb3p+txqCycPsrUKTYtsD/CvynRZ+dQPrUgXnyrDI+r8bwQDhJEREKarjnNRQlQnGpgdmZW5VH%0Ane4ZnJeT81tMh2L1Odo9vQB8XrI95hgaxxQK0Nb5BaVjyaGqhTMTtJ8/zpXth5InRSEwhQJsP/k+%0AhkAgIWQASEXgc5qwu8PpRYV0E6yUqNEwddc7ma7KULFz4fiV+A5IiaLFrld1/zV6Nu3J/VAgYk7O%0AVhm0G4mqAlVbZq3ehe+Q5lpEDQrT1Q5CNiNtFzszdiWA0rGxJX1ZPV6+/rN/xOrzoSy6gcqHR3j6%0AF7/i2IvfZGBDBoffLAhNo+5GDyXjE2iqylBLMzOVFdkPzJNnmeQsaEgpXwdeF0J8TUp5JMX+V+Pm%0AibViCtBYqr0oZ6mWY2FMIRZVW7oXUw/nuf8IBjQ8bh2QOF0qFmvqNMuRiFwiZCxG12FqInt5cymh%0A6oe1/NTzYmKD1RdBieoUT4yx/4PfJE1Ei6kc7KFwcpTRhg14CkpQdI2S8SHKh3tRdA1vwdLiWnNl%0Atlj/t02+C3kZhJRIKZOdOOOTZNOVsxTOTVEyNsh0eU1qR887fA5LxwYAqOq7ymhdK35nZqfX2Nhj%0Ao58tty8JzRxrcFHdO4+QKbJdLtTBuU0IcMxPUzw+zHBzO5rxltAXNQjmS2xJYaTGUAahbWEYgCES%0AIWq6FX2z++NPlggZAIqMfZtD77zLcFMjmnEZ5i4pqb9+g22fnaR4cjLxXaUQ7PzsBKP1dXz84jcJ%0AWa2595knTxZWkrDr90KI/wz8hZQyDCCEKAP+FjgE/M0qji+BlDIshDgDPAW8vmjXU8Bv1+KcefIs%0AJhzWGeoLJ5U0n5nSMBigrsmMyZQ8qc7PRjNGY+aKBP7DJw2xOCuIpTeP54OImCtiDp8ZTmQJ+mm6%0Aen5pv0Jwdce2Jds1o8poQwHFEz6s3khikowaFcJmnf0ffEBf+y48RWWJY8wBL82Xz3DxwE5mywvY%0AdPpjLu86HNNsZFn954yuYw4FKB3tR1MUDFqUjrPHuL5lH+6SqluOpSnOEzWqzFTaCaZInqWZDAy1%0AFeOa9uOYDyN0HV1V8DsVnnn1Z8yV1uB3FqKpCg73LAUzE9h8sZDYqzs3MF/qQo3qRI0qYYu65NwB%0Aux1zMJhR2IilBr/1OjYGgzRduZpWgBSAKRSm4dp1bm7elPXSxU4i2fvRMTadOZuUzGtBeASoGBjk%0Aa7/8NW//6Acxh948eVaBlQgajwA/A74mhPgBsVDXvwUuA9tXb2gp+U/Az4QQp4GTxEw19cD/tcbn%0AzfOAo2mSvp5Qypoc0Sj03QjRvMHMv33xv0psf/7v/4Gy1Mq2ZSEgpeYBIGy1cm37NtrPX1hWOW9d%0ACNzFxVzdsSPlfs2kMlkbm0ANYQ1dETGTgxB88sIz7PrkOBvPf0bIascYDuFzmDn76MNM1NUy0tJM%0AxGCgpvcmPmcRQUdc0blSISMuOESNKppR49qObQgpmS0tZefx4+w4eQTNYGKuuBxPUSmGSBir103A%0AZuXyvn3MlRVnzVYpFcF8mZ35suQMrcdefpEnf/0bykd6E5O+LgQS+OKpJ5mor806/Mt7dnPovdt9%0A2JOZqK5Omtgdbg9KljBeTVFwzcxmPf8CdTd62HQmFnKd7kooQOnYOFs+/4LOgwdy7jtPnkwsW9CQ%0AUn4hhNhJbHI/Q+ze/B+A/xgPe10z4o6nJcC/BaqAS8DzUsr+tTxvngeTxSW5/9v/MsIWPX1eDCnh%0ACMl+CYqe++Nwe2GqxdsDdjsjjel9Hk4//igOt5u6npvoxB7IdP0B6IpCb/tGvnzycaLmzBkdNYOS%0A5DwJ4C4p4djLL2L2+7F5vIRsVvzOWwFd9VeuYwib6d7zeOYEW7kiBBKJ32FitqqJobZYkrE9Hx3D%0A4g+gSIkSCVE2PkjZeLKfytnHD95RqfLx+jpe/9Of0nahk9qeHlRNZ6Kmmqs7dzBXlluI7Y1tW9j2%0A+ec4591L9sn4v8+f/lrS9ogpe6ZNISWRLL/fYtrPnkvcH5mQwM7jJ3AXF9PfHqtQbHe7MfsD+B0O%0Ago67X8Mlz/3NSmudbAT2EnOsrAbaARuw5rFXUsq/Bv56rc+T5/5EypihXcSrU0ajEvecRjQqUVVw%0AFag4P/s2f3ctltlysSPkEhaV5P5e53/OOHlLoP5GT9K28boaiiYn06q/F9DjK20JSW11AQLByWee%0AyqjG1g0GPnrlJSoHBmi9eInC6Rmcs7OYIpEkn4PRhnou7dvLTEU5IZst45hyIWSzLenHNh9E0VzM%0AVMUTga2SX5RAYPdGSKzfpaTtYmfGa6srgtbOS5x5/NE7OnfA4eDioQNcPLTCFb4QvPlHP+Hp135B%0A2ViyhitiMvHhyy8yV16WtN1b4GKmvIzCyan05hMp6V+GM2jp6FhO+QwW7pcD731AyGJh5/ETlI+M%0AQHz7cFMjZx57NCZoLYwt7/+WJwPLFjSEEP898O+B/xv410AL8A/ARSHEj6SUJ1d3iHnyZMfj1jgf%0ALaF8dBSAqfJyPMVFNFy7hiA2mQspmZyIMrrnU6itxu90Ymy3EjFnz+dgiEQy2tgFxMIPF/kHXN2x%0AnY4z57L2rUjJqccfpbbnJlUDt1bkM+XlnHnsEcYaMkRwJAYgGGtouNVWSiqGhimcmiJqMDDU0rwq%0AwkUmisa8OOeCSbRamAAAIABJREFUSCW1c2xGcvDfUKO38mYYIlFMaUJGAdyFpQw1dTBXUk1V7xx+%0AhwlvoRnNuIKxrQJRs4m3//BHuKZnaOy+gkGLMllVxVBrS2ohUgjOPXyIJ3/zRkoBVwpBz6YOvIW5%0A11HRl+FzEUufHuKpX/wq6XcRQHVvH1X9AwQcdhxuD5qqMtDWGhNi81EreVKwEo3GfwO8JKV8J/65%0ASwixD/hfgGPASrLw5MmTxGKzxeO/fjjxtzkQoPXiJcqHh0EIRuvrsHs8bOk6TakYS7QrnpigdGIi%0A8VldtCqsGhigcmAAAew78hFnH32E7j27Mo4najKiBEMZhQ39tpBNd0kJJ559moPvxuzzqY7VhWCm%0Aopzu3bu4vHcP9nk3No+HkM2Ku3hpevCcEYLxulrG67L7EKwGrmk/rrkQIJafz1vqseN0PX06cl3H%0AFPYBsZV/1GggajBgiC6N2ulr20Zfx65Ef6aQhjEUwDUTYKLO9ZVWF3WXFHPx4ZT5BZcw1NrC8eee%0AYf8HH6JGo+iKgpASRUpudrRz8pmnlnXuoZZmmi93Z9WwLbA4ymgxCiB1Hbs75hCrahoNV6/RcO06%0AR196gaHWpUXt8jzYrETQ2Lq4aiuAlDIC/GshxFurM6w865XX/uYHib9zNVssUN3bx+Ov/xZ10eRS%0Ad/1GYl5b/ALNtHZbXCzLoGns++goEZORG9u2pj3mZkcHHeeWRm4sZripccm2G9u2MltWxrbPTlDb%0A25cITVwYx0hjA59+4/nEqtZX4MJXsJZR4quPY9pP4WQgo2kpLVISsijsOH6U7r2Pp2+nKFj808R8%0AzwEh6NmymbYLF5N+9+ny2piQET9mAUEsGVn1zWn2f/BLVC3KfEkxI42NXNuxDU/RrWJ09xI9W7cw%0AsKGNxu6ruOZmCZvN9G3ciKd4+eO9vGc3zZe7c/6dsmnwFqPEQ54f+d1b/PLP/3lOWsI8Dw4rcQad%0AyrDv4zsbTp77lX/z9T/PreGbK+vfOTvLE795A0XTlqqRubOiWBLY+elxerZsTusLcebRw7Re6kpp%0AQlnIQ/Dlk6knyumqSo5++5WYOWNwiNLRMXRVYaSpkfmSkjsY+VeLIaRRMurBHFz6m2QkXoNFV2C8%0ArgCpQun4IM1dp7i5eW+yGSX+txoJM1mVnEKn86G9NHZfwRgOJ4SNwZbN6TUjQqCrBiZqm6ntvULR%0A5BRFk1NsOXWa8eoqPnrlJcJrbF5aCRGzmespwpCXy2xFOZ988+s88tbbSF3P6jS83OcqlgskSvPl%0Abq7uTB3NlOfBZKXOoHnWMenMFl8VQtfZ8vmXiBRCBtx55U0B2Hx+yodH0poaNJOJ1//kj3j+56/i%0A8HiT9kVMJj74zrfwZlsVC8F4fR3j9XV3OOKvHkNYo7J/HkVffkZNKWCuzIqn0IJUlZhWQtep6+li%0AoroJb+Ei4SsucGiqAWNYwRDSiMYze/oKCnjnh9/n8FtvUzIxgQTmSiqyVoOdK6mktvdK0rgrRkb5%0Ag7/+G04890zueSnuQ/rbN/Krmho2XLxI3fUeiuPXbbWEd6koFI9PZG8ImP1+NlzopLnrMqZQEHdR%0AEdd2bKevfWM+h8c6Iy9oPEDcidniq0CJRtny5Wnaz57D6vev+flMwWDG/YECF7/+F/8FpcMjtF7q%0AQkidwZaWmE36AfO6L5rwrVDIkIw1FBK23go5re25CcB8cXn6qqyKgpBQMO1nuvpWKO18aQlv/dGP%0AKR4bp2hiIrffIU0bVdc5/Pt3qL96jQuHDjJbUZ77d7uPCDgdXDh0kAuHDtLcdZn97x/BEImgK0pC%0AM3Rt6xZaui5jWEHhOl3N7nDrmpnh2Z+/hiUQiFURBiz+AJVDwzR3XeboKy/l1E+e+4O8oLEOWGuz%0Axd1AjUQwB4OELBY0oxFF03jyV7+hanBoWYmo7gRPUW4e/FM11UzVVK/xaO5dlKielDE0GxKJQOCz%0AG5mucSLV5NWqGo0igImaJoSup13NCsDuCTOdIkJlprKCmcoKKvrnMQeiGcdWMJ0+idpCmHLDjR6G%0AGxv4+MVvrmt/g5ubNzHQ1kb9tWs45+YIWyz0b9yA3+nE73Ky8/iJZfWn6DqD2UreS8njr/8WcyCQ%0A9GwvCDk1fX1sO/E55w8fWvb3yXNvkhc07jHuNbPFWuKcmWXP0WPU3uxFxFc1EhhubGSqqpKqgcE7%0ANovkwkLkx1xpbgmY1jOu6WlsXh9+hx13Gv8RQ1Rf5u8imCuxMl+W2v9hurKCqv4BokZz2uqIiZ5k%0A7F+68u7uYivlw57UO6WOqmlUDt7IMNJbVPUP8Phvfsv73/vOutZYRU1Gbm7ZvGT7xQP7UTSdrV98%0AmRAAhZ7+t9eFiDnYNjVmPF/lwCCF0zNp9wsZSy528cBD6Ib8FLUeyP+Kd4n7zWyx1lQMDPLUL365%0ARP0ugNq+Pmr6+lbtXIuTVi2cYwFdCHRV5eTTywsVXG9UDAyy5+gxShfZ16cqKjj9xGNL/FZ0JbdJ%0Ad+F6T9Q4CDrTawWubd/Gli9OYfZ707ZZQFNEWiEDIOA0MVdipXD6tigYXUfRdbZ88SHGSG5l4RUp%0AqRocpHx4mInauxMmfE8hBOcPH6J7904ar17D4vfjc7kwBYLs/viTWJO4Y68iJZ6iQo5851tZhbLy%0A4RH0+DHpMIdCFMzMMntbIrM89yd5QeMOWQ9mi7uNGonwxOtvZLTx566Wz95WAOcP7meyupqtX3xJ%0A5eBQ4tiRxgbOPnqY2fL1aY/Phcr+fp76xVIJt3higqf/6Rd88AffZqyhPrE9alIJWVRMGaJNFqaQ%0A6arMQgbEnDrPHT5Ex5kLDG5IH10hAW+RJetENl9mI2g34pwNYg5EUfQoDde7qO67gjWwvOTFuqLQ%0AcPXagyloxAnZbEuiSPrbN9B2oTOWEM5oZGBDG4Mtzcgc/CoyCYoraZfn3icvaCziQTJbfJU0Xrma%0AU+nsTKTSTqRqI4ArO7Zz4dBBEIKR5iZsHg8Wn5+Aw07A4biDUawDpOTAe0cA0pYj3//+Ed74Z3+c%0ANMHPldkoH/SkjViIGBWmqx1JTp/pELpO28VOLH4v9dcuMLBhe8pMoVKAtyC32h4hmzGpxokhUkHT%0AlbM53TfJJ5WYQrlpQB4kfC7Xin0oxurrUeRnGdsEbFbmV5CwTmga9Td6KBkdQ1dVhpsamaypXtem%0Ar/uBB1LQ+PfP/CkGcwp78QNitrjbqJEI5cMjqNEos2WllI2OZT8oCwI49sI3sHm97PvoWJIqNqGy%0Ar67mzOOPMFlTk3Ss3+lMKgL2IFM2PIJrbi7tfgEUzM5SOjrKVPUtB9ig3cRkjZOSMS+qJpN8K9zF%0AFubKbDm/3Otu9OCamwegfLiXwdatyBTHCgmlI17GGgqWPXH0bu5gvL6WjWfPx4SaQCBnYWM+Q3Is%0AoesUTUyi6BrzJSXr2nF0tZisrmKqooLiiYmU5hNJLLlYRu2IlDjm3ajRKGGzCZvXh3N2lv0fHMEc%0ACifux+0nP2emrIwPvvOtfDG4r5AHUtDIc+eokQiNV65Sf/0GhkiEmfJypqoqqBgaxhwI4iks5MaW%0AzTR3d7P5y9OJuhQS8Llyn+RTrZh1IXAXFTHQ1opUVaaqqug4c5bKgUGkgJHGRrp378rXXcgBh3tp%0ARdGU7ebdSYIGxPwhhhxFWL1hjGEdXRX4HSZ0w/JyINTc7E0IioMtW2KTRCpBAzAHNSy+CEFH7lVL%0AF/A7nZx79DDnHj1M4+Vu9h49hs2XPWz6xpYtSzdKyaZTp9n2+ReYgyEANFWhZ/NmTj/2CBGLZdnj%0Ae2AQgqMvv8Czr/4Cx3xMwFyoR6RISW9HO1379qY9vLH7CttPfE7h9DSQ+h2x+HPR5CTf+LufMdrY%0AQMn4OFGDkYENrVzftnXN6//kiZEXNPIsG+fMLE+/9kvsnph3vyDmob/wslhg28nPE/sXEIDN7clp%0ANakLiBpNGMPhWJ0HYuFzc2WlfPitlxMrnsma6ph6NM+yCVmtd9ZOCAJOM4EVnl+JRqm5eTNhppmo%0AacqYcEsSC3FdiaCxmL5NHfR1tFPd28eBd9/H5vUm0tbrQjBZVY+voISRxgZ01bTElHP4rbdp7r6S%0A1KeqxUxAZSOjvP2j7xPNodT7g4rf5eLNP/4JzZcv03S5G3PwVsKukcaGtBqrTadOs/fox0katFx8%0AtOw+X6LOiwRKx8fZ8sUp3v/ud/ILkrtAXtDIsyyEpvHUL36FzetdIkDAUjt/KhZSHy8+7nYkcH3b%0AVk498ThNV65SMjaOpqoMtTQxVl+ft7muEmP1dQSt1ljipBRIIGizMbZGxdl2fHYSmzfmoCmFyMmZ%0AUOirlFcl7rPz5p/8hB2fnaTtYid+RyFdex8nbLEh42vlqn43EYPCXKkVf4GZ2hs9S4SMRJdA4dQU%0A7efOc+mhfbimZ6i/fh1DJFZbpX9DWz5kM07UZOTaju1c27E9p/Y2j4fdx+LRLis438K7SQBIiTEc%0A5qlf/ppf/fM/RTNm9yXKs3Lyd3yeZVF//QbOHNXtmVgIN00lcEhgtL6ez59+CoTgxtYt3NiaQn2d%0A547RVZUzjx7mULzC7O0I4OwjD+ckACwXNRJh47nzSUKqOeAjZEnv3yGkTtS4uumpIxYLp558nAsH%0ADlI5EAuxjRXeuzUGQ1SnbMyHNuGjrfNqxmgnAWw/foLtn53EEI0iiWlJVCkJWSx8+vXnGM6W1CrP%0AElo7L61qf7H7LUBT95WMBRXz3Dn5hPJ5lkVNbx/6KtUhEMC5QwfwOR1oioKmKMwWF3PkWy/zwTpP%0AknQvcWPbVj5/6kkiptiqbsH8FTaZOPn019bsJVwwPZPw3Vmguje1puAWAotvek3G43BH4mdIddYY%0Aig69HfuYL84cDq1qWqKEvQDU+GraFAzyxG/eoHRkZJVG/eDgmpld9T6lEFQODK56v3mSyWs08iwL%0ARdNi9upVIGow0HnwAJ2HDq5Kf3mWiZRYfBGcc0E8rgaOvvBjTCE3Nu8MAYeVwdaWtVUpp5jRa3u7%0AmaxuwOsqTvbViPtINFw9T8SiM9ZUv/TgO8Tmzh5yvaCJ62vfyY4T72Vsl+n47Sc+58Nvv7KicT6o%0ARMzm2OJjlUsS3K0SBw8yeY1GnmUxVVW5Kg+mLgQ9WzbntRZfFVJSMualYsiD1RvBGNExhnWkcOAp%0AbGCouXXN7dZzpaWEbovOULUoOz57l9rebtRoJLHd6nPTfvZTGq5fxBgKrcl4lFx9PxSFudIqQubc%0AHGmXHC4lNTd7MeTzcyyLvvaNKLq+qn0KKZmorcneMM8dkddo5FkWPZs3sfvjTxOFsLKRLjw1YjLR%0A+VD6ELY8a4tzNoh9PjbRLfw+CfOAJikf8jDSXLimgqCuqlzevYsdn50gYHcRsDkxRoI456Zp7TpF%0AU/dZgjYHiq5h8XsTUU2eovR5Le6EqFHBEMm9jkvUaMIcWlm8jQCM4TBRcz4yJVfGa2sYraujYmgo%0Ao9P54ndOJl8aXQiiRiM9mzat8kjz3E5e0MizLCIWCx+/8A0ee+NNhJRJSbJSCRRRkxE1HEnYqAFm%0Ayss4/vXn8RUU3L2B57mFlLhmgml3C8AYiVVoDTjXdiK8snM3AVslYasrsc3i89DcfYbykT7s3vnk%0AsUnJ9W1r4xjsKbJQNJE9rwYAuo4puNKgXogYjYRsK9OIPLAIwdFXXuSRN9+itrcPnQWnXZLCXT0F%0ALkCgGQ30bWjD7vGyofNSUlK/hRpHH73yUl7YuwvkBY08ICXF4xO4ZmcJWyyM1dZgjETQVTVlpsOh%0A1hbe+smP2HTqDA3XrqNqGu7CQsJmM6Wjo3HvejPXtm/j0r69CCmp7uuPZwYtY7qq8iv4knkWUKM6%0AhmhmFbQEzIG1FTSMwSgVgx5CVleSkBq0Obi85zG0c8epildaXRBkzx0+hLcwQ1HCO8BTaMHmCWct%0AMy+BsFVhsqaS6v6BxHZdCAQSkcUCowvB9W1b0dcgkme9EzGb+fA736JwcpL66z2o4TCqrhExmYmY%0AzQy0teItvG0BIyX9GzfQfu58LEzeYKB/YxtXdu5Iu9gpmJ6mcmAwZlqprs7n2rhDhHyAHGGEEC5g%0A/tC//GXqFOQPIKWjoxx4932KJ6cS2xZrJyarKuncv4/Btrac+hO6jhqJEjUZ8/4X9yhqRKO2J33a%0AcYjdA54iC7MVa5e2uermHMZwmsJsUqJGIxx87zVUXWO+qIiLB/dzc/PaqrmFLimYDuCcCaCkeDVK%0AYtVrxxoLiJpUnLNz8cJiBsImM8//46sImb5YoE6siNzvf/yDJVkpC6amaT93Lh4FIRhuauTqzu1r%0AZirKsxSz38/ht96mpq8/KfR+oqqKT178Bj6XK9Ph655oyM9nf/UdgAIpZc55DvKCxgNM0fgEz//j%0AqyialtbmuaBuPP3YIxnTAue5Q6TE7okVKfM7nWsrpElJTc8cajSzP8JEjXPNNBpmX5jKQU/Wdn67%0ARtBhwlO4/Pomd4Qucc4Fcc4EMEZvmQcDdiOzFXaiptTaiOauyxx6+11gafI6TVHo2bKJs48cXiJk%0AtHZe4uA77yVKrkM8zFgIPn7hGwxsSC/oG8JhyodHUDSNmYryfB2fFaJEo3z9Z/9I4dT0kt9OFwK/%0A08Hv/ugPCa9CenlF0zCGQoTN5jXJUbNWrFTQyJtOHmB2f/xJRiEDbr0sdx/7hIHWVjwZCkzlWT5C%0A1+k4c5ZNp89g98SSRXldLrr27ubKrp13NLmqEQ1jSAMhCFkNSCXelxC4i9P7I0hijpEBx9pFnTjn%0AcogckRLHvI/Jusw5K9YEReAptuIpsmAMaSi6JGpU0IyZJ4WbmzcxVVnJxvPnqewfBAGTVVUMbGhl%0AsqYmpSmyaHyCg+/EQmUXP4uKlEgpefTNt3j9n/3xEpOR0HV2HP+MjjPnMEZiEToSGGht4fOnn8oX%0AEbuNwskpNp4/T/nQMFJRGGpu5tqObQnBrOnK1STN7mIUKbF7vLRd6KQr7sRe1ddP+9lzlMYrxQ60%0AtXJl146MGijn7CzbTn5BU3c3qqYTNRjo2byJiwcewr+OtSV5QeMBxeL1Ud3Xn7OHvRSCDRcucubx%0AR9d0XA8UUvLw79+h6bZ01na3m30fHqVocpKTzzy9bGFDjWgUj/uweiOJ31dXwF1sZb7ECkLgKbJg%0ACkZxuMMJU9nCFKergsnatdWqmAKR7I2AysF+pqorcc4GMUR0pCLwuUy4i61ptQqrihBELMt7TbpL%0Aijn15BM5t+84ezZJk5F0ekBKycZzF5KfvUX3zu2lAOp6blL8j6/y1h/+kHCOtWzWOxvPneehDz5M%0Aus5FE5NsPnWaD7/1EmMNDTR3XU5yGF2ClLReukTXvj3s/vgTtnx5Oql9+9lzbDx/gY9eeYmRpsYl%0AhxdNTPLsz/8JQySSOMYQjdJ2sZOGa9d5+0c/wFO0Nv5HXzX5PBoPKFa/b1n1AhQpKZxKLe3nWRl1%0A8ZoZC57zCyx83nDxElWLnA1zQYloVPbNJwkZEMtoWTAVoHjMFz+JYLrKwUStk4DdSNSgEDGrzJXZ%0AGGkqJGJe2zWIyPHumy+upmjCl/DlUHSJYy5IVe9czsLKvU5130BWrWJ1f3/StrKR0cS9k6q93e2m%0A4+y5VR7p/UnZ0DD7P/gwdv/cpjFSo1Ge+M0bWHx+LD5/xt9BAGZ/gPrrN9jy5elEH4v7UzSNx1//%0ALabbawdJycNvv5MkZCw+zhQMsv+91GUA1gN5QeMBJWBbnlp1IeY8z+qx8dz5pGq3t6MLwYbzF3Lu%0AzxCMUnNzDoOW2hlRAM75EMZgNL5BEHCYmKxzMdxaxGhTIe4S67LLvK+EoM0AMnPkizEUwOcqigkl%0Ai66TQKDokrIhz6pnifxKyOU73NaktfNSxlIAipS0Xei8w4GtDzadPpP2OROAIarR2tmJp7Ag6/Po%0ALShg06nTGftTo1FaL3UlbS8ZG6d4YjKtIKNISfXAIM7Z1U+zfi+QN508ACiaxobzF9h47gKu2Vk0%0Ag4G+9g1MVFVROjaWW8VVKRnIMfLkQcU+P0/HmXM0dV/BEIkwX1LMlZ076N3UgUwxKRROz2RdyRbl%0AqEVSIzpV/fNZQysl4JgPMbtMc8Bq43eacLgzZMaUEs1gBJFmMhUCgybvSq6PtWa0oZ7m7u60mUl1%0AIRhtSE65bvN4smbJtPp8qzbG+5nqvv7M77h4+H3X3j003OhJ20xIybXtWznw/pGs78zyoWEu792T%0A+Jzrc1w4Nb0uo4zygsY6xhQMYnO72f/Bh5QPx4o4CUCJRGjtvCVx62RWbcUkeRf9G/OCRjpKR0Z4%0A+rVfoUajiZdQydg4h99+l8ar1zj60gtLvMvDJhM20mculPE2uVAw5U8ZjpkKNbK6aZxXgnM2lDFr%0AoyngI2xzZOxD6DpWb/C+FzS6d++ipetyyn0LP+nV20qpB+32zP4EkDI6whgKUXvjJuZQEE9BASNN%0AjSmF4AeJWNl4GG5uYqC1hbqeniUCuy4EU1VV3NzUwYH3j2TtU96m8Ygacptq16vWOC9orENc09Ps%0A+uQ4dTd6Yp7rLH2hL07Re/trRnLrQVGkxF1UxJHvfAs9x4flQUPRNJ74zW+ThAy4Zb+t7bnJ5lOn%0AubT/oaTj+jo2sv2zkxlrx/R1tOc0Brs79/ofuuGrzW9iCGtY/Zn9K7IJGRC7T+0eNzNV97e3/kxl%0ABZ8/9TX2f3BkaXgrcPzrzy2J9urZvGmJen4xsaRgizKoSsm2k1+w9fMvEqXrBeC32znx7NPrumz9%0AeG0NNb19GUP4x+tqQQhOPPs0j7/xJuVDw7ccqYWgt6Odz59+Ct1oZKy+jsqBwYxC3lh9XdLnkaZG%0ANFVF1bS0x4RNJsbXad2V/MyxziicnOS5f/wnDOFwQoDINK0sfpi8BQWceeQQFn+AkolJdFVlqLnp%0AwVv1SEn50DDFk5Noqspwc1PG3AT1165j9WdOXd1x5hxd+/YmXcdr27fTceYspmAoZdx+0Gbjxtbc%0A0m1nM5kk2gHegqUhlncTYyiaY7sAEZMlffSLoiDk+ihMdm3ndqaqK2k/e46q/kGkiCXsurJrJ/Ol%0AJUvaj9XXMdTUmNIsoAtByGrl8u7diW3bPzvJjhMnE58XrqjV5+PJX7/OB9/5FqNNjav+ve4Fuvfs%0Apu5mb8p9EpCK4Pr2rZiCQZ559RcUzMzc1khSd6OHy3t2M1NZQde+vUkZYRezUMdpcWI5JRpFiWpc%0A2bGdTWfOpn0fd+7ft24Xc+vzWz3AHHjvSJKQkSuKlLjm5gg4XQy057aKXo8UTUzwyO9+T+H0zC3/%0AOyHo2byJs4cPUTo2jpCSqcqKRNx72cgomqKgprGZC8Dm82H1epNi5YN2G+9977s8+evXcbjdCec+%0ARdfxFhTw4bdezpocSInqOGdjdUsymSIW9gfsRsJfsX9GrmGzpSP9jDaluRd1nYKZCcbr109yqpmK%0ACk4892xujYXg2Esv8NCRj2i51JUkbExVVXL8688n8miYAwG2fv5F6m7i/z/xmzf47U//eGn67nXA%0AaGMDZw8fYtenny2pd7KQEM3vdHLg3fcomFnqN6UAhkiEx377O37zZz9lpKmR048eZs/Hnyb6W9AC%0AR41GjnznFUyhEFtPfE7dzZu4ZmZRpERTBO7CQgrm5pKcSRUp6dqzm0sP7bt7F+Uukxc07nOMoRD1%0A129g9XqRQPnIyIr70hVBzc1eJmuqUaJRSsYnEFJntqwsZaKhrxKz3091bz+GaISZ8nKmKyuWTGCu%0A6Wk2nTlHY9w5M2yxMFpfz6knHiXoWKqad8zN8ezPX8MQT36U6E1KWi510XKpK8nkNNDWyslnnkIq%0AuQVrptIKzZWV8ps/+ym1PTepGBpCIhirr2O4uSnrhKzGQ1nVNFEmtxNVBZM1a5x1NAc0JbfzqxEP%0AddcvMti2DaHrseun66AoONyzbDp9lJ0nQlw4sJ/zDx/8yr/X3UYzGjnx3DOcPfww1f39KJrGdGUl%0As+VlSe3qr17P6jhq0DSefvU1Xv+zn+aUqdIQCmMOBQlarWj3gV9B54H9jNfW0n72HBXDw+iKwlBL%0AC927duAuKcEYDNLS1Z0xKsQ5P09V/wCjjQ10PbSP0cYGNp47T+noGJpqYLCthetbt7L1iy/pOHM2%0AcezCXanqsT7CRiN9He0IqeN3OOnZsmldOoAuJi9o3K9IyabTZ9n56XHUaBQpREZbf05dIlC1KNuP%0An2DTmbOYQjG7v6aq3Ni6hdOPPvKVVzpUNI09Hx1j44WLSS/PmfIyPv3688yVlQKxrH1P/vp1FO1W%0ALQ2L30/zlSs0XbnCqccfpXuRVzjAli9OpYxzh9Q+LnU3eiicnubMI4fZfOpM2jFLYL64mIA9dUix%0AVBQG21oZbGvN9vWTqBhwY9Cy/+Yy/m+8wQU5TvJrSbaCbgtcfmg/T7z+C8qHehmrbyNgdyLjVTe9%0ABSV88dR3sM/PUtPXTevFTm5s37bGI783CTrsGWvAWAJ+pKIgsggbTo+HhmvXMQeDbDx7HtfcLFGj%0Akd72di7v3Y2nqIiiiUm2f3Yi4f+lqQq9HR2cP3QQX8G97SszUVfLRF1tyn0FMzMZ/ScgpgEpHh9n%0AtLEBiGmgTj77TFKbnZ8cpyODeUSREkM0SuHUNO/86PvL/g73K3lB4z5l4/kL7D16LPH5ToUMAFXX%0AKRseoXx4JOlBUTWNtgsXKR4f593vf/crtSMeevtdmq5cWeKTUDg5xbM//yfe+smPCVqtPPbGm0lC%0ABtwSFgSw7+jHBO12ejd1xDZKSUvX5ZxCfRdQpMQ1M4tzdo65khJcKdSuC+e79NDeVV1xO2aDGHOI%0AHllIJz5R60Qz3RuP++0e+ekI2mz87ic/ZsfxE3Sc+5LJynou73ks1kdcO+QpLOHKrkcoGh9IaDvy%0AJONzubIKGRCLPtv70VGsvpi/kQBULcSG8xfYcP4CPpcLu8eNkItW6ZpOy6Uu6q7f4Pd/+MP7dmWe%0ASyVdAei30IFjAAAgAElEQVRq+mfIFAyy+dTprNpFRUrKR0YomJpO6X+zHsk/lfchSjTKzk+Pr2qf%0AuhCELBYqbhMyEueUktLRMdo6L63qeZdD8dh4LBtiCllAkRJjOMyWL76kubsbYzic1V9h+/HPEsmS%0AFE3DEM3NSfF2Nlzs5Mi3X8bndCa0B0DC56Jz3156tmxeUd/pcM4EsjcCZsqsjLQUEV3jTJ/LIWgz%0AoGd5G+sCgjYjYasVv8tJyGShe/cjSCGSTVDxv2fL6ygbuX+SHRlDUYrGfZQNuSkZ8WLxhtcs+dhA%0AW1tOYZMCsPr8SzLVKvHPTneykLH4OFMoxCO/+/1qDfmuUxl37sz0CwgpGWpuSru/pqc3q1ZkMQ9S%0ApuV75+2TJ2eq+gcwB3MPZ1zM4gdpccSJZjAwVVlBVX/mdMgbzl/g6s4dKzixxOrzIePRFCtZ3bdk%0AqUWgxLUSqqZlNSUJoGBunoKZGeZLStBVlZDFgjkYXNaYBGDzevEVFPDbn/4RTd1XaLx6DWMoxFxp%0AKVd3bGemsmJZfaZCjWg45kMYgxqqpmPKMRfGvaLFWIxUFTxFFlwzwZTCoAQ8xVakGg+xjmqM17ei%0AK2rG+8bsvw+yhEpJ0YQf12ww6Vl0uEMErQYmap1IdXXXf1GTkS+ffJxD776f1WE43T6Rw/6SsXFc%0AU9O477NVeunIKHuPfQKk/346MNjakrGopDEcznp9F7Nec2ak4t57C+XJynInw8UsFM9a7NQoheDj%0AF77O9hOfZ83175jPrTKwORCgqfsK9vl5CmZmKRkbxxbPVDhfXMSlfXtjoZvLEDgsWUJIIVakqPpm%0Ab86mJEM4ns9BCK5t38bmL08ty3wigUDcu18zGrmxbSs3tm3N+fhccMwGKR5ffpZHSTzV9z3IXJkN%0ANaonirotsBB+O1d6qxjYbHkZpqAxtuJPd78IgaqTuc09gHM2iCseJXT7KM2BKKUjXibrVt/X4ca2%0ArZQPDafNvbGcCTIdAmi9dImzj61t4UWz30/7ufO0dnZhDgTwOxxc376Vq9u3r8iHrP3suazJz4J2%0AG927d7H5iy8RUjJRU8NEbU3SveYuLsr5GoZNpiW5NtYz9+ZbKE9GPAV3FoK2pICXlOw5+kki13+m%0ABy5qNHLwnXdxzcwStljo7Winf+OGJBvnplNn2PXxJyi6nvIF5pqZ5dC771M4Nc3pJx7Ledy+DLks%0AFpCA1e/P6YHXFQXPonC+rn17aLxyFbvbnbuwIQTXV1mwWIzVG6ZkhUKGLlj11fGqIQTT1U7cxVEc%0A86F4yWwFn8u8pFrqUEszZcPns3Z5z+szpMQ1HUg7qcfCoCMYQhpR8+pXpj357NNY/H5q4zklFms0%0AV8PHC3JfiKwU+7yb537+KlavL/GMumZn2f3xJ7R0dvHeD75LaJkVayuGhrM+76ZgiGdf+2UiLFWR%0AktnSUo6+/ELCL2Wsvg5P3I8lU5ZeScxn636I1lkt7tG3UJ5MTNZUM19UmPbFqhOTmBfHamd6jBQp%0AKZyZYbqyMuMDJ4nlg2jpukzF8Ag1N3t55K23+cbf/QOWuLai9WIne48eQ9X1WLpzWGLzXfh78+kz%0AlA0PZ/u6CXq2bs46vtvPlQ4d6N24IamMdshq5e0ffp+BDW1J105XFFIZKnQh8LpcXF3DaAfXlH9F%0AE6gANPXeWtkLXaf1Yiff+P/+nh/9b/873/+r/4O9R48g1QBT1U7myu0pS7JLRWGksTqjo2dMe2O8%0Ap7UZxpCWtuDdAhKw+tYmCZlUFI6+8hJfPPUk7rgJQBeCoZZm3vnBd5kvLrojYU0CXtfaRp4cfuv3%0ASUIGLCyWYpEj+458tOw+9RwisRZ8LxQpE+cumJ7m2Z+/hnmhUqsQfPb8s0hFWVJ0TS76d3nPbjpv%0AyxK83slrNO5HhODzp5/iqV/+GrnoxofYi0MKwYfffpn54mIKp6YpGh/noaMfZ+wyVp3VwHRFOUUp%0Aqgwu/rRQ/GnxA/fob3/H+9/7A3YcP5GzGlYXgo3nLjBZk1va3fmSErp37aD97Pkl/Wc65+37dMDv%0AdHLm8aUq3qDDzscvfhOL10fh9DSaQWW+uIS9R4/RfFtUymhDPZ899yyRLEm1VoohGMESzN25bDES%0ACNvunRWT0HUee/1N6npiRatiEQ1hWi5dpvlyNx+98jIjTY1pjx+rr6DuxgyKlto0IgB3ydr8DqtF%0ArlqDXLO8rgSpKFzduYOrO3cgNC3mWPv/t3efwZFd14HH/+e9zhEZmDzDTJESh1lMokRZFCVTtlVK%0Alu11Kpe8VpW93rJdtdryru0PWtXuB5Vcttaqkl2rsi2VbNmW5CAqWMEUKUpiGqZhEIecDAyAAdA5%0Av7sfXncPQqO7gelGhzm/qqkBGt2Ni0bjvfPuPfec6uv53Jtv5+6vfX3bzy3Q1VLmIwsLTJ/ZvE6Q%0AZQwHX3qZx+97K/lNtpI3cuayy4g8fWTTi5jNji2WMQSzWa585tl6e4Fz+/fx0C98mMOPPMqe14/X%0Al6pT8TinLzvEi7feTHpkpO2xDQsNNAbU3IH9fP3nP8gt3/sPps7O1m9f2L2bJ972FhZ378ZbKHDo%0A6ItNeyLUiDGUvV6+954Hec9f/y2+dYlNtT+YRixjmDl9hkMvHCWcTrf9M1jGMLqwSCiZ5LKjLxJK%0AZ8hG3C2nmU2ujH789vvIhSNc/+PH63U+Wh2XV+ellGybY296I8/c+eamB6N8JMxc5MLXH333Azz5%0AlnuYOXUKcQyLu2e6tpXPU6wwNpdp2Q+kGQFSo/1z4r32yafdZlXrbreMwVQM9371X/jSR3+T8mZN%0A5Cxh9kCc6VNJ7LL7G1/9nlyaDpMP93dztZLPxkjzQEKAYqDzyyaNrC/Mdey6NxBdXuGGx35Yb7TY%0A9kUDsDQ15fYM6ZKJ2bmW97GMYfzcvFvwrk0v3XSYq488gzEbZ5taxnzGcPnzR9f0MTq/a4Zvf+B9%0A+LNZ/Lk8uXCoaxcjg0IDjQG2sHcPD/3SLxBZWSGYyZALR+olhD3FIg984e8YWVxsO9/g7KFD3Pad%0A726sjFnV7IDjiDBz+vSWxm8Afz7H+z/zWXfbYnWt+KaHH+GF227hyXvfsvHqVYTn7ridF269makz%0AZ7DLFd74wx81vdIBt+jYP33kNygEA9uuA5KPhNtucrZddqnCzImEe+W+DbUTQ2I8SDHYJzMaxqyp%0AlLie4GbsX3b0RV5Z16V0tbLfw9nLRgknCwTTRcQxFAMe0iMByr6dOTlfDGNbpGN+IonCprttyl7L%0AXQLqBRGO3HMXx6+5miuffdbt9zO/4DZerB5Dau+v2rvT4AYkiYlxvvP+93Z16ardfkvtLIWslhwb%0A4+EH3+1uz10VbNRyV1rt0vEVGifnF0IhCqHQlsYyrDTQGALpkZEN03FXP32E0cXFtqZrHRFOXXE5%0AYNh37LVtj6Po33rUHk65MyBizJo6Atf/+AlKPj/P3vnmho9zPB7mDrgV+iZmZ5k8O9u0O+PCnt3k%0Aoq07gvbayGIWq82S4o0UAzbJsSDZWP+UjPfl80SSzZMEjWUxPjsHTQIN935CeiRAemQwrxCXp0L4%0Ac2W8RXdJbM3uL0tY7IMS8SuTEzz+9vsAtyz/tU8+zcGXX8YulVmemuTElVcSTiWJLy1T8vk4cfVV%0AnLri8q43Xpzdv6/lDEvZ42Fh9+4tPe/kmbPc/u/fwTKmnoslQCEQYGV8nOkzmyeLOiKkLsGlkK3S%0AQGNIXX3k2ZYFgGp/tPN79vDoux/g0IsvbXubm2UMZw8dZHRhoWULZWgv0/36H/2Yo7fcTNnX/Arv%0AJze8iTf98McNpz5rY3vx5pta/AS9J44hnGxeaKyR2jbWhb0xTB+UGF9v36vH2rpfO9UZB52xLeYO%0AxIku54iuFPCUHRxLyMR8JMeCfTczkx4Z4fG3v43H3/62Xg+FbCzG69dczcGXX2l4fDG4yyCbLr81%0AEFlJ8I6//wfsarG+1aGSP59v2GRtNcuYprNwyqW7ToZUOJlsecLKhsN86wPv4xsf/iAlv3/bW9wc%0AEZIjcc4ePMCPfurtlNbteKkx1fuCW1661fi8pRIzJxu3Y14tG43y/Z9+l9sHY/VukerHz996S3XG%0Apr9ZFWdbiYACrEyF+zLIuOyFo9z90DdarnVbjrOldfVBZmwhORHizBWjnLh6jFNXjbE0E+m7IKMf%0APfbO++szFrW/79r/J6+8gqfvuXtLz3ftk09hl8sNgwnLGELZLAsz0w3fv44IZw/s5/UuL6cOA53R%0AGFJFv59Ak8Jejgjn9u9bk+k/v3t3y5N/7Q9u9Tpmye/nu+/9WRAhOT7Gv/3yL3Lj9x/lwKorj6XJ%0ACRLjY+TCEWYP7MdTLHLvv36t5c/hLba31e/4tdeQGBvj2iefYt+xY1iOw8KuXbx4801dzYTvJMe2%0A2mr1Lus+XpoK9b71ewNWucxt3/5Oy5/JnX6OXzKBxhp9vB23H5X9Pr7x4Q+y99hrXPbCUYKZDOlY%0AjFffdD1z+/dv+fU89OJLTWcsHBEKwSBH7r6Ta594qn5MLfp8vHzjDRy5686uLxkNg/47OqmOeO26%0AN3DNU083Ldf9Wq2hWNXy9BTzu3cxMTvX8HEOsLBnF95iiehKgqLfx2vXvYGXbrqR7KpiWqnRUR7+%0AmQfx5vMEMxkKweCGpKjR+YW2fo6V8fbLGS9PT/GDdz/Q9v37jbGEbMRLKF1qWurZEUCEfMhDcixI%0AoY+2sa6297XX2yqVnwuH+PcPvF8P2Kot2+123Egt8X0zbg+lEs/eeQfP334b8cXziDEkxscuqYJb%0AF2sgAg0ROQj8D+A+YAY4C/wt8HFjTHeq2wy4o7fezOXPv4C3WNwQNDgiLM7MNKxb8PB7fpp3feGL%0ABNOZesb1hS2EU3z7/e+j5G8v0bAUCGy6rWt5apLFmWnGzs03DmpEWJ6cZHl6qq3vNSwSE0FC6VLD%0AWQCDW557aVf/J7WC2wOmnZyfx+5/R323VCfYpRIji+cxIqxMjPe027Dqb4mxMcbmGx+DwD0OrVR7%0Atzi2fckdjzplUP4Cr8HNJ/lN4FXgeuCzQBj4/R6Oq29lYjG+8eEPce9X/4X48rKbfIm7u+PMoYN8%0A/8F3N7yCzMTj/POv/jJXH3mWK55/Hn82RyYW5ZXDN/Dq9dd1NIr/wQPv5IEvfBFPqbSh6FjF4+HR%0Ad72zY99rIBhDdLmwac2Sot9maab9QkS9lmsjDwcgG2tdWr4ddqnE4Ud+wNVHnsFbvVItBAIcvfkm%0Anrvj9oGbMfHmy4STBayKoeK1SMf9VLyax9FJL990mDsf+samX7eM4ZUuVv69VIjpUmvibhORPwB+%0AyxjT9gK8iMSAxF2/+yU8/ktkf7MxzJw8xfjcHI5tc+bQQZJbWI7ottj5JQ4/+oN6Pocjwomrr+LI%0AXXf01Th3QjBVZOpMqul9Zg/E+qc+Rgt2qcSHPv0XeIuNp6cNbrXXr/76r1x0roJUKrzty/+MY4XI%0AxMYQx2H83Ckm5k4ixnD86qt4+GceHIycCMcwMZsmnCpuCDgTE0ES48HB+DkGgDgO9/3TV9izrv9L%0AbSbuudtv46l77+nV8PpOuZDl0U99ACBujGm7sc2gzGg0EgeWmt1BRPzA6nn+zlw6DRIR5g7sZ+7A%0A/l6PpKHk+BgP/8yDeApF/PkchUBwWx0Yh0FkJd+ylHp0Oc/5AQk0Kl4vT77lHt7coP9E7QT6+Nvu%0A7chJ88BLx3nt2rvcWYvqxdO5/VcQyCS54bFvcujlV3j1+ImmZc77xdi5DKGUuyK8/pUZWcxR8VgD%0AW0ek3xjL4jvv/Vmu//ETXPPUU4QybofoxPgYz992K8euv67HIxwOAxloiMjlwG8Dv9firh8D/qj7%0AI1IXq+z3XbIBRo0/X25dhXCbvU965eWbbgQRbnz4EfyFC4mh2UiEH97/U5ztwE4TX66Esao5HiJr%0AApd8MMIzd9zPLd/9Klc+82zfBxp2qbJp5VBwA7T4Yo503K+zGh1ibJvn7rid52+/lWA6jbEscuGw%0Avr4d1NNAQ0T+mNaBwK3GmCdWPWY38HXgS8aYv2zx2E8An1z1eRTYWp1spXaIYwl2k9Ljhq2XV+4H%0AL994mJ+88Xr2vH4cf87N+Znbv79jOROx8zl3FqPR81kW+XCMpZl9xJeWO/L9uimYbr4LQgBP2cFX%0AqPTlluZBZiyLbJe7z16qev1O/XPgiy3uc7z2QTXI+C7wGPCRVk9ujCkA9cso0QhV9bFs1EdsKd90%0AViMbHcxZH8fj6ch2xA2MIZQuNW0hj+OwOLOP0YXjnf/+HSZOmx1e27yfUv2gp4GGMWYRWGznviKy%0ABzfIeBL4NWOM0+IhSg2U1GiA6HIeTOOtrY4tZEb6p4dJv2h5+SCCY9m8dt21re7ZcyW/3VbRvJJW%0AEVUDZCD2e1VnMr4HnMLdzjopIjMiMtPTgSnVQRWvzfy+GI4lbpMtLiRNVmzh3L4Yjj0Qf7I7R4Si%0Az25R4tzgLeYGolR0PuylUv39N1K7fe+xZSZPJ/Fnmy+1KNUPer100q77gSuq/9bnWOh6iBoahZCX%0AM1eMEkoWCOTKbsO0sNddMunjpT+r4hBOFPDn3OZU+bCXTMy/I/1XUqMBxs5lGn+xugPluTtuGIxK%0AjiJUPBZWsXHSb/3VNG4+Ryhd4vx0mPSo7kJR/WsgAg1jzOeAz/V4GErtCGMJmZEAmQHpPh1IF5k8%0Ak1rTEC6UKjIyn2V+X4xisLuHmfSIn2C6SDDjXt1fOBkbjMD5mSiZ+GCciO1SBd8mQcZ6tZ9z7FyG%0AfNirTdlU39J5WKXUtnmKFaaqQYaw9p/lGKZOJbEqXU6nEmFhb5Sl6TBlr3tIM0A24uPc/jiZAao5%0AYTXZdbQZAUbms50fjFIdooGGUmrbokuNk1fhQrARWWndWO2iiZAe8bMyGSIb9lDw2zh2dVQDVP24%0A4rVa5Js0FshqyyfVvwZi6UQp1WeMIZAtEUk0344Lbmn15Hiwq8Oxyg7Tp5L4CpV6dVVTqBBJFknF%0A/W6PmD7OcalxbIts1EcoVdxS8pmle/BUH9NAQym1JXapwtSpFL5ipeXVd62RX7dNnE3hLVTq33P1%0A/5FEAccWjAh2xaHiscjE/H2b07AyGSKQKWE5RjPd1VDQQEMp1TZxDNMnk3hK7iV0OzUfup0M6s2X%0ACWbLm35dgPhSfk1QFF/MkRwLsDIZ6ruZjrLPZu5gnNFzGYKZUlvBxuAsDqlLkeZoKKXaFk4W8JSc%0Atq+0BUh1ORkzmCm1daJdn6waX8q75cv7UNlns7AvxpnLRyj4WudtlAL9OTujFGigoVTvGEMgXSS+%0AmCV2Poc3v/lVeb+odRVtpXZiXJ4MUerjnhzxpXxfl/OueG0Sk6GWgd1Kl3NglLoY/XsEUGqI+XJl%0AJs+k8JSd+kl5dAFyIS+LeyJ9WwFUKq3zBgyQD3lIjgXJR7rfm6UQ8Gw7l8FyDP5saUfGuV25iI9M%0ANUEULixX1d43mai3r8evVH8ezZQaYp5ihelTCezyhTyH2skjkC0xdSrZt1syS/7m5b4NUPRbzO+P%0A79jJrxDyUGpjeWEzVh/PaAAgwuLuCCuTISr2hZCq4hGWJ0Oc3x3tuzwTpVbTGQ2ldlh0KYc4m9ee%0A8OcrBDMlcn14lZoPeYkmNq+LIUBqLLRzAwK3YNeeKNMnk1irZlxq21xbKfkHIL9BhOR4kORYoJ6I%0AW/ZaGmCogaAzGkrtsHCyeY0Eg5t02W/sssPYuUzDmYNaA7hsyEMmtvMBUsnvYfbQCMnxIGWPhSNu%0AAFH2bD7TYYB8wEPJP0DXWyKUfba7NVeDDDUgBugvTKnh0GqqXnBzIfpNZDm/aW0HwT1x53rY/K3i%0AsViZDLlbVqu8+TIzJxOwbgbJAI7AyoQmUSrVbRpoKNVBnmKF6HKecLKAOIaS3yY1EiAT99dPwGWv%0A1XSLqIG+LCYVThZaLkWEUkXSo/1z8i4FPMweHCG+mK3PJNWWVGwD06dT5MJelnZFqHh0glepbtC/%0ALKU6xJ8tsev1FaLLeeyKwTLgy1cYn8sweTpVT/BMt6grIUA67t+BEW9Nq4Zf0sZ9eqHsszm/K0Iu%0A5N2QtyG4dTimTyS63/xNqUuUBhpKdYJj6q3S15/Iaiez2FIegNRogGKD3Ru1zxNjgb6sPVHytd5x%0AUurDmRhwd/OEso2rbArgKTlElvM7PSylLgn9dzRTagCFU0XsFlfz0SW37LWxhHP744wsZoms5LGq%0AD6t4LBLjQdIj/TebAZAeDRCYTW/6danepx9FVgotd6FEEwWSEzu8Y2YrjCGcKBBdyeMpOji2kIn7%0ASY0EcHTZR/UxDTSU6gBfvtz0RCaAp2Kwyw4Vr42xheXpMCuTITzFCkh1NqCPdxJkYj5CSe+G/hu1%0AnzsV91Pocl+T7bLLzcumC24H2H4ljmHqVBJ/zq0eK4DtGOKLOaLLeeb2x/CUHCzHUPZaFAOevn4v%0AqUtLfx4VlBpSZt3B31jSl8skDYmwsDdK/HyunocC7kxMcixAajTQtye3SnWba7ME3H6txgoQX8zi%0Az5U3jL+WF7P79cSarzkW5EI+kuMBDTpUzw3IEU6p/paLeIk1WeOv5S849oAf8EVITIRIjAfxFN09%0Ao4NQOCod9xNu0aelvmRlzJrZgV4HIOIYosv5prNlGx8DoXSRcLpINuxlcU8UY/X370gNLw00lOqA%0AfMhL0WfjLVY2TThMjgf7/oTcNhHKg1BRsyof9pINb1z2gep2Yq9FajRAMFVkZDGLr1Cpfy0b9bE8%0AFaLi7c3P6y1U6nk87Vr9MwYzJcZm05zfE+3ouJRqV//OFSo1SESY3xd1r+65sIOk9v/KeLAnFTM7%0Axhh2HT/O1U89zWXPv4A/15/t1TclwuKeKOm4f8POmXzIy7n9MYKpIlNnUnirQQa4J+xQqsiu4wns%0AUoVeMBcZmwpusrKn2JvxK6UzGkp1SMVrM3tohFCqSChZwFpVsGtg8jAamD55iru/9hCRZKqe51Cx%0ALI7echNPv+UejDUY1yvGEpZ2uc3JAtkSAMWAh7LPRiqmXl59szyIkYWs28Bsh5X8NhVLsC+y+Vt0%0AKcfyTKRDo1KqfYNxhFBqAFgVh+hS7kLinmMo+j19W1uixlsoMLKwQDiR2NA1dnx2jnf8/T8QSrnb%0AWmsnYdtxuP7HT3Drd767w6O9eI7HIhvzk4356xVYw6nChhooqwnVHjW9KOolQiHo2XZ32proSgF/%0AptSRISm1FYN7maVUH/HmS0yfTNX7mAhgFSqMncsQSeQ5ty+O6bNE0GA6zU3/8X0OvfgStuOeQJem%0AJjly152cuvIKAA4/8ihiDFaDtvUCXPPUEV649VYy8dhODr3j2llWEMBTdij1IDm07Lm4906t9Pro%0AQoa58EhHxqRUu3RGQ6mL5M2X2XU8WW84Vjsl1D725SuMzmfqMx4j8xli53M9XTMPpDP89N98nsuO%0AvlgPMgBGFha578tf5Yrnnsefy7Hn9eMNg4waI8KhF1/ciSF3Vbs7S5weLROZDgQ3AvjzFTwFzdVQ%0AO0tnNJS6COIYpk8mWhaDiiQKRBJrW7+PLGRJj/hZmg7v+G6UGx95lGA6syGIsIzBALd/69ssTU62%0AbKJmRAhkBywxtIFs1MfIQnbTrxugEPRQ8fYm0MhG/cSXmm+fbvcdZFccyvT3cp4aLjqjodRFCCUL%0A2G0s28sm/yIrBUbnM90c4gaeYonLXji66UyFAHa5zMypUzgtAiDLGDKxwV42AbfxWqMdKbCqB00P%0Ay5MXg556U7j1arelI+1dN2qXWrXTdEZDqYsQyJa2dDW5ngDR5QKJ8VB3+1UYQyhVJJwo4CuUeOnw%0A3fjzWRLj0+RDEbzFAjOnXmX38Vfwlgo4lkUoleb4NVdz8KWXNw1KHBFee8M13Rv3DlqaCQOsmXkS%0AwLGE87vC5MPeHo3MtbAnwuSZNMHqe67GCJzfFSEf8hJ+dblp9dNCdZeNUjtJAw2lLkKnFjxC6WLL%0A9vHbZVUcpk4m8Rcq9aBocfdBd7nGGLf4ltfP69fcxJmD13Djow/hz2Uo+v28dNNh9rx+HG+hsCbY%0AqD3P02+5m0KojxuRbYW4218TE0FCqaK7Pdlnk434oA+qahrbYn5/DF+uTChVQBx362sm5sPYFqPn%0ANp8Zq/3mlqeH5HelBorOoSl1ETrVREwuskZCM+Nn0/VKl/XTZW1JZPX/IhT9QY7e/FYsYzh+zVWk%0AR0b42i99mLn9+9Y8ZzYS4dEH7ueF227t2rh7peK1SY0FSUyEyMb8fRFkrFYMeliZCrM8EyY9GsDY%0AFlJxiK40L1Mu9Hc/FzW8dEZDqYuQjvkZmc9CkxoMrQi0P51tDMF0ya37UDGUfTapET9lf+M/ZU+x%0AQmgrtRMsi9ToBC8evpnk+DgAybExvvWhDxBOJIgtL1Py+Tk/Mz0whbouBf58GWkjVg1kS6R16UTt%0AMA00lLoIxrZY2Btl8nRqW8GGASoeIRf2Qm1WY5MraKvsMH0qia+6BAJApkRsOc/KeJDExMZeKoHM%0ANnJIjOGlmzbOVGTicTLx+FaeaWiMzZ3jDU88yb5Xj2E5Duenp3jx5ps4cfVVA9O/pntzZko1p4GG%0AUhcpH/Yxe2iE6HKeULKAp9LeIb12r0zMz67jifryRiFgkxwLutP2q0yu6sOx/tQ2cj5H2WuR6UCe%0AhxHR2YpVDrz0Mm/5l38DoV6QbfLsLNNn/pVX3vRGHnvnOxoHG8bgLVSwK24X2O0kYXrzZaLLefy5%0AEkaEXMRHeiRAxSPYFVNtby8UA56WAaUA+Q4t9Sm1FfquU6oDyj6b5ekw+ZCHqTPpth6TD3pwbCG+%0AlF9ztenLV5g8m2alUCEx6Sbv+XJlArnyps9lgPj5HJm4f81Jrxj0bHmWRcCdYVEE0hnu+devIcas%0AWZqoJcZe9exzzO3fx+tvuHbN40LJAiMLWbylC3ufcyEPy9NhSpssc61hDGOzaaLJ4poAwlfIET+f%0Ao3mpzaQAABDtSURBVGJLPaAt+myS40HScR+RRLHh79sA+ZBn0yU2pbpJL1uU6iDTZuLgyliA5HiQ%0AcNrNn1j9qNrHI+dz+HLu14PpYtOpbwG8JQdPaW1Rj2LAQyFgtz1tboBcyKsnpKorn3vODTI2+boj%0AwrVPPLXmtvBKnsmz6Q2/i0C2zMzxBN7CuoDRGKyyU08I9ubL7P3JMtFkEWj83rBXzZp5ixUmZtM4%0AtlX/Xa/uHmyAstfqSUM4pUBnNJTqqHzQiyNgNTmzGyA5FmRiNt10utsA0eU854Pe9mclGnzfxd1R%0AZo6vtFVYrOSzWNytHT5rJmbnkCYl2C1jGD93rr5NWJzmXWAxMDKfZWFfDKviEF/MEUnksZxakOch%0AkC8jTX5XDZ8XiC/lOXsghq9QIbJSwFOqUPFYZOJ+0vFA3/XaUZcODTSU6iRLSEyEGN2knLUBEmMB%0AjMfCly+3XFP35d2cjKLfbhlsOJZQblAiu+yzSY8EiC1tvv2xZnFXpLuFwwZMO71NjCX15apQqtiy%0AC2wwU8KTLzN1JoWn5KzpjRPMlusfb5UBookCSzORjuTqKNUpekRRqsOSYwE3mIAN/1Kj/nreRatl%0AFgOY6l9oNuqjYsumSyAGSI24yaN2qYK1rp25024tiD6rGdFrZw8dbPp1R4Qzhw7VP/eU2usCOz6b%0AXhNkrP7axWyT9ua1YZrqPzqjoVSnibAyFSY1GiCcKOApO+4Udsy/ZudBNuprOcuQjfrrz7mwJ8rU%0AqeSabbS1wKPot7EqDvteWapfPRR9FkvTYQphH/mwD1ls3vysYgslrbGwxuvXXsuN338Ufy63oQy7%0AAcQYXrj1lvptlTYLYvkLlY5VlV09nvryiDHYZQdxoOK12s4dUqobdEZDqS6peG2SEyGWZiIkJkIb%0AtjemRgMYaVzfwODOQqTjF7a4FkJeZg+NkB7x41gXkvwS40GscoVIorjmD9pXdJg+lWLkXIZi0EO+%0AugWykVreyKDUhNgpZZ+Xb33w/RQDgTVJlo4IRoTH3vkO5vftrd8/G/W19bzdepWzUR+hZIFdxxPs%0APbbCntdX2PuTJUbPZZBKG0k6SnWBzmgo1WXiGHx5d+296Lcx1aveitdmYU+UyTOpNdGGWypamN8X%0A25AvUfbZLM1EWJqJ1BMQx2bTeCqbn7ziy3mKAQ+Le6JMn0rgLTr1ZMXa/5mYj+SYrus3sjw1yT9+%0A5De4/OhR9h57DbtcZnHXDK/ccAPpkY0FzLJRn5ursYNjdAu/WVgVw/hcZk1AaRk3qTiQKTF3IFZ/%0A/ym1UzTQUKpbjGFkIUt0OV/fhWLELVu+PB3GqjiMncvU6zPUTvwABb9N0b9xGUMcd0rciBuoSMUh%0Akig0TT4EGJvPcPqKUWYPjhBKFggni1gVp1rCPEAh5NHZjCbKfh8v33iYl2883PDrVsVh9FyGcLK4%0AYVkLujeDUR+f12JxV4SZk8mG309wt8HGlvL1HCGldooGGkp1gzFMnkkRTJfW1kEwbhvyWi2F9QmB%0AtY+D2TIjC1lWptzW5VbFIb5Q3QpZPYMV/DbpuL+tk5hdMfgKFYoBD5mRgO5K6CBxDNMnkniLlQ2/%0Ay+2U/XaXzcBymgcoq7fQektOPcjYdJxAdCXfsFS9Ut2kc2hKdUEgUyK0LsioEcCfrxDIb54QWDsp%0AiGOwKg4zJxJEV/Jr6nP4ChXG5xtvo21k/U4U1RmR5fyGIKNmO7tI8gEPJV/riq6b1dNoxq6YrnYK%0AVqoRDTSU6oLISr7l1Wyrr1sOeAtlYudzeIqNt0KuTlBspezVHSXdEF3JN/36Vn5HBvAXypsmCbfS%0AKthwt0zrbIbaWRpoKNUF3gY1ElbbSqXP6ErrHIzqXTd7CvIBz7aaeqnW7HJ7v+t2AgfBXV4L5poX%0Ac9sOA2QjXl02UTtOAw2luqBiW01PLO20bncEcEy9Y2gzRZ9Vf97138cILM+EWz6H2h6nxS4Og9uR%0Atxiw19y2mVbB43bzPgCSE5oIqnaeBhpKdUGmjSTNkqd5pU/LwK7TqbZOLLmIj8XdESrr+lkUQh7m%0ADsQpBjTvu1vScX/LwCE5HmLu4AhnD8YobmFmabsJpbB2ycaxhPm9UX0fqJ7Qd51SXZCJ+ogt2Xgb%0AVICs1TyY3xth6syFLp+r61psZXJbcCuIFoMeslEfnmIFu2IoeywqulzSdanRAJFEHru8scurAQpB%0AD7mIF0+xwtSplJuQuYXnr70vMlEfmZiP6TPpth+bjvsphLxkoj4tL696ZuBmNETELyJHRMSISONN%0A7Ur1miWc2xcjH/YCa68uCwGbuQMxygEvswfjLE+FKPptd6mkgWZr/LW27sVg9ZpBhLLfQyHk1SBj%0Ahzgei7n9cQrV2YLVLdqzUR/ze6MgwsTZrQcZqxlbyEf9FH2OW6yt2X2BXNjL0q4ImbhfgwzVU4M4%0Ao/F/gLPADb0eiFLNOB6L+X0xPIUKgWwJMYZCyLtm+trYFqmxIOmRAPt+stTWroEawT2ZLO6OdmP4%0AagsqPptzB+N482X8+bKbgBv2Uqnu9PHlyvgvsuGZEWHq1Gnu+8o/cvyqGzhz6FqMvfYQXpsRKwZs%0Azu+OXNT3U6pTBirQEJF3AfcD7wPe1ePhKNWWst8m3aDK52p22alXCG0mH/JSDNgYS8hGfJR0zb2v%0AlAKehr8Tf67UVgLwZgR3x8iDf/MQVqXMFUef5MArz7E0uYv06ASp2Bhlnx/HEk5cc8DtuaK7S1Sf%0AGJijlIhMA58Ffg5oq0qRiPgB/6qb9NJP9SXHbu+kUAh5SOjOgYFj2jzpNwpG3F0rHsbmzxJJXqj+%0A6S0XmZ49wfTsiTX3PXHtR0D8KNUvBiJHQ0QE+BzwGWPME1t46MeAxKp/pzs/OqUunmNb5ELelrsX%0AMlE9gQyifNjb3nZmLuTzXMjp8bCwL8rI+aWWAYsAsaXlixusUh3W0xkNEflj4I9a3O1W4E4gBnxi%0Ai9/iE8AnV30eRYMN1acSE0ECJxtPsRvcDqvlFkswqj+VfTbZsJdgpnFZegMkx4KkxgKEEwW8hYq7%0APBb1UQi6De9KPm/LJFD3e3k7Pn6lLkavl07+HPhii/scB/4QeDNQkLUR/RMi8nljzK80eqAxpgAU%0Aap+LrlmqPlYIeVnYG2V8No1dMWtmNzIxH+dnNLlvkJ3fHWHqVBJ/vlIPJmv/Z6O+erOz1Fiw4eNP%0AX34ZRgTZJNhwK39GOD893aWfQKnt6WmgYYxZBBZb3U9Efgc32KjZDXwD+BDwo+6MTqmdl4v4OH3F%0AKKFUEW+xglO9qq1on5KB59gWcwfihFJFwskCdtlQ9lqkRwLkQ56WyZv5cJiXD9/ANU8f2bSB2zN3%0A3YGxBmJFXF1Cej2j0RZjzMnVn4tIrWLNMWOMLoWo4SJCNqa5GEOp+rvd7u/38fveiqdU4srnX8AR%0AWTPD8fQ9d/GTG97UwcEq1RkDEWgopZQCY9v84N0P8Pybb+PQ0Zfw53NkojGOXfcG8hHtZ6P600AG%0AGsaY42x/S7pSSg205NgYz9x9Z6+HoVRbdDFPKaWUUl2jgYZSSimlukYDDaWUUkp1jQYaSimllOoa%0ADTSUUkop1TUaaCillFKqazTQUEoppVTXaKChlFJKqa7RQEMppZRSXaOBhlJKKaW6RgMNpZRSSnWN%0ABhpKKaWU6hoNNJRSSinVNRpoKKWUUqprNNBQSimlVNdooKGUUkqprtFAQymllFJdo4GGUkoppbpG%0AAw2llFJKdY0GGkoppZTqGg00lFJKKdU1GmgopZRSqms00FBKKaVU13h6PYBeKBeyvR6CUkopNVC2%0Ae+4UY0yHh9K/RGQPcLrX41BKKaUG2F5jzJl273ypBRoC7AZSvR5Lh0VxA6i9DN/P1m/0td4Z+jrv%0AHH2td8awvM5R4KzZQvBwSS2dVF+YtqOwQeHGTwCkjDHJXo5l2OlrvTP0dd45+lrvjCF6nbc8dk0G%0AVUoppVTXaKChlFJKqa7RQGM4FIA/qf6vuktf652hr/PO0dd6Z1yyr/MllQyqlFJKqZ2lMxpKKaWU%0A6hoNNJRSSinVNRpoKKWUUqprNNBQSimlVNdooDHERMQvIkdExIjI4V6PZ5iIyEER+SsReV1EciJy%0ATET+RER8vR7bMBCRj1Zf27yIPCki9/R6TMNERD4mIo+LSEpE5kXkKyJyda/HNeyqr7sRkU/1eiw7%0ASQON4fZ/gLO9HsSQugb37+c3geuA/wr8Z+B/9XJQw0BEPgR8Cvg4cCPwfeAhEdnf04ENl3uBTwNv%0ABt6BWyX6myIS7umohpiI3Ap8BHi212PZabq9dUiJyLuATwLvA14AbjTGHOntqIabiPwB8FvGmMt6%0APZZBJiI/Ap4yxvzWqtteBL5ijPlY70Y2vERkEpgH7jXGPNzr8QwbEYkATwEfBf4QOGKM+d3ejmrn%0A6IzGEBKRaeCzwH8CttfXV21HHFjq9SAGWXXp6Wbgm+u+9E3gzp0f0SUjXv1f37/d8Wng34wx/97r%0AgfTCJdVU7VJQ7VD7OeAzxpgnRORgTwd0iRCRy4HfBn6v12MZcBOADZxbd/s5YGbnhzP8qseMTwKP%0AGGOe7/V4ho2I/Dxu8HxLr8fSKzqjMSBE5I+rSUTN/t2Ce7KLAZ/o8ZAH0hZe59WP2Q18HfiSMeYv%0AezPyobN+TVca3KY648+BNwEf7vVAho2I7AP+FPhFY0y+1+PpFc3RGBAiMoF7tdfMceCLwHtYe1C2%0AgQrweWPMr3RlgEOi3de5dtCoBhnfBX4E/KoxxunyEIdadekkC3zAGPPlVbf/KXDYGHNvzwY3hETk%0Az4CfA95ijHm91+MZNiLyc8CXcY+/NTbu8dkB/MaYSqPHDhMNNIZMNTM/tuqm3cA3gPcDPzLGnO7J%0AwIaQiOzBDTKeBH7pUjhg7IRqMuiTxpiPrrrtKPBVTQbtjOpyyZ8B7wXeaoz5SY+HNJREJAocWHfz%0A/wNeAv73pbJUpTkaQ8YYc3L15yKSrn54TIOMzqnOZHwPOAn8PjDpHrvBGDPXu5ENhU8CfyMiTwCP%0A4W4J3A98pqejGi6fBn4B+FkgJSK1/JeEMSbXu2ENF2NMClgTTIhIBjh/qQQZoIGGUtt1P3BF9d/6%0AAE52fjjDwxjzdyIyDvxPYBfugfrdxpgTvR3ZUKltHf7eutt/DTeZXKmO0aUTpZRSSnWN7jpRSiml%0AVNdooKGUUkqprtFAQymllFJdo4GGUkoppbpGAw2llFJKdY0GGkoppZTqGg00lFJKKdU1GmgopZRS%0Aqms00FBKKaVU12igoZTqGyKyS0S+ICIvi4gjIp/q9ZiUUhdHAw2lVD/xAwvAx4FnejwWpVQHaKCh%0AlNoxIjIpInMi8t9X3Xa7iBRF5H5jzHFjzH8xxvw1kOjhUJVSHaLdW5VSO8YYsyAivw58RUS+CbwE%0A/C3wf40x3+zt6JRS3aCBhlJqRxljviYinwU+DzwO5IH/1ttRKaW6RZdOlFK98Pu4FzofBH7RGJPv%0A8XiUUl2igYZSqhcuA3bjHoMO9HgsSqku0qUTpdSOEhEf7rLJ3+HmaPyViLzRGHOutyNTSnWDBhpK%0AqZ32cSAO/A6QBt4F/BXwIICIHK7eLwJMVj8vGmOO9mCsSqmLJMaYXo9BKXWJEJG3At8C3maMeaR6%0A237gWeBjxpi/EJFGB6UTxpiDOzZQpVTHaKChlFJKqa7RZFCllFJKdY0GGkoppZTqGg00lFJKKdU1%0AGmgopZRSqms00FBKKaVU12igoZRSSqmu0UBDKaWUUl2jgYZSSimlukYDDaWUUkp1jQYaSimllOoa%0ADTSUUkop1TX/H3aC+2hmHJy5AAAAAElFTkSuQmCC" alt="" />

解释:数据集不是线性可分的,所以逻辑回归不表现良好。希望一个神经网络能做得更好。现在让我们试试这个!

4 - Neural Network model(神经网络模型)

Logistic回归在“flower dataset”上效果不佳。你要训练一个只有一个隐藏层的神经网络

Here is our model:

Mathematically:

For one example x(i):

Given the predictions on all the examples, you can also compute the cost as follows:

提醒:建立神经网络的一般方法是:

  1.  定义神经网络结构(神经网络的输入单元,隐藏单元,输出单元等)
  2. 随机初始化模型的参数
  3. 循环:
    • 实现前向传播
    • 计算损失值
    • 实现后向传播来获得梯度值
    • 更新参数(梯度下降)

构建helper函数来计算步骤1-3,然后融合他们为一个 nn_model()函数。学习正确的参数,你可以在新数据上做出预测。

4.1 - Defining the neural network structure

Exercise: Define three variables:

  • n_x: 输入层的大小
  • n_h: 隐藏层的大小(设置为4)
  • n_y: 输出层的大小

Hint: 使用X 和 Y 的维度来计算 n_x, n_y。隐藏层大小设置为4

# GRADED FUNCTION: layer_sizes

def layer_sizes(X, Y):
"""
Arguments:
X -- input dataset of shape (input size, number of examples)
Y -- labels of shape (output size, number of examples) Returns:
n_x -- the size of the input layer
n_h -- the size of the hidden layer
n_y -- the size of the output layer
"""
### START CODE HERE ### (≈ 3 lines of code) n_x = X.shape[0] # size of input layer
n_h = 4
n_y = Y.shape[0] # size of output layer ### END CODE HERE ###
return (n_x, n_h, n_y)
X_assess, Y_assess = layer_sizes_test_case()
(n_x, n_h, n_y) = layer_sizes(X_assess, Y_assess)
print("The size of the input layer is: n_x = " + str(n_x))
print("The size of the hidden layer is: n_h = " + str(n_h))
print("The size of the output layer is: n_y = " + str(n_y))
The size of the input layer is: n_x = 5
The size of the hidden layer is: n_h = 4
The size of the output layer is: n_y = 2

Expected Output (these are not the sizes you will use for your network, they are just used to assess the function you've just coded).

n_x 5
n_h 4
n_y 2

4.2 - Initialize the model's parameters(初始化模型参数)

Exercise: Implement the function  initialize_parameters(). 

Instructions:

  • 确认你的参数正确。
  • 使用 随机值初始化权重矩阵
    • 使用:  np.random.randn(a,b) * 0.01  来随机初始化(a, b)维度的矩阵。
  • 偏置向量初始化为零
    • 使用:  np.zeros((a,b))  用 0 初始化(a, b) 维度的矩阵
# GRADED FUNCTION: initialize_parameters

def initialize_parameters(n_x, n_h, n_y):
"""
Argument:
n_x -- size of the input layer
n_h -- size of the hidden layer
n_y -- size of the output layer Returns:
params -- python dictionary containing your parameters:
W1 -- weight matrix of shape (n_h, n_x)
b1 -- bias vector of shape (n_h, 1)
W2 -- weight matrix of shape (n_y, n_h)
b2 -- bias vector of shape (n_y, 1)
""" np.random.seed(2) # we set up a seed so that your output matches ours although the initialization is random. ### START CODE HERE ### (≈ 4 lines of code) W1 = np.random.randn(n_h, n_x) * 0.01
b1 = np.zeros(shape=(n_h, 1))
W2 = np.random.randn(n_y, n_h) * 0.01
b2 = np.zeros(shape=(n_y, 1)) ### END CODE HERE ### assert (W1.shape == (n_h, n_x))
assert (b1.shape == (n_h, 1))
assert (W2.shape == (n_y, n_h))
assert (b2.shape == (n_y, 1)) parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
n_x, n_h, n_y = initialize_parameters_test_case()

parameters = initialize_parameters(n_x, n_h, n_y)

print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00416758 -0.00056267]
[-0.02136196 0.01640271]
[-0.01793436 -0.00841747]
[ 0.00502881 -0.01245288]]
b1 = [[ 0.]
[ 0.]
[ 0.]
[ 0.]]
W2 = [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 = [[ 0.]]

Expected Output:

W1 [[-0.00416758 -0.00056267] [-0.02136196 0.01640271] [-0.01793436 -0.00841747] [ 0.00502881 -0.01245288]]
b1 [[ 0.] [ 0.] [ 0.] [ 0.]]
W2 [[-0.01057952 -0.00909008 0.00551454 0.02292208]]
b2 [[ 0.]]

4.3 - The Loop

Question: 实现前向传播 forward_propagation().

Instructions:

  • 查看上面的数学公式表示你的分类器
  • 使用  sigmoid()
  • 你可以使用 function  np.tanh() . 这是 numpy库的一部分
  • 这些步骤你必须实现:
    1. 从字典 "parameters" (initialize_parameters()的输出)检索每个参数,用 parameters["..."]。
    2. 实现前向传播。计算: (所有训练集样本预测的向量)
  • 反向传播所需的值存储在“cache”。cache将作为反向传播函数的输入。
# GRADED FUNCTION: forward_propagation

def forward_propagation(X, parameters):
"""
Argument:
X -- input data of size (n_x, m)
parameters -- python dictionary containing your parameters (output of initialization function) Returns:
A2 -- The sigmoid output of the second activation
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Implement Forward Propagation to calculate A2 (probabilities)
### START CODE HERE ### (≈ 4 lines of code)
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2) # print (W1.shape)
# print (X.shape)
# print (b1.shape)
# print ("A1:", A1.shape)
# print ("Z1:",Z1.shape)
# print ("Z2:", Z2.shape)
# print ("A2:", A2.shape) ### END CODE HERE ### assert(A2.shape == (1, X.shape[1])) cache = {"Z1": Z1,
"A1": A1,
"Z2": Z2,
"A2": A2} return A2, cache
X_assess, parameters = forward_propagation_test_case()
A2, cache = forward_propagation(X_assess, parameters) # Note: we use the mean here just to make sure that your output matches ours.
print(np.mean(cache['Z1']) ,np.mean(cache['A1']),np.mean(cache['Z2']),np.mean(cache['A2']))

Expected Output:

0.262818640198 0.091999045227 -1.30766601287 0.212877681719

现在你已经计算(在Python变量“A2”中),其中包含了每个示例的,你可以如下计算代价函数

Exercise: Implement  compute_cost()  to compute the value of the cost J.

Instructions:

  • 实现交叉熵损失(cross-entropy loss)的方法有很多种。我们如何实现
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # no need to use a for loop!
# GRADED FUNCTION: compute_cost

def compute_cost(A2, Y, parameters):
"""
Computes the cross-entropy cost given in equation (13) Arguments:
A2 -- The sigmoid output of the second activation, of shape (1, number of examples)
Y -- "true" labels vector of shape (1, number of examples)
parameters -- python dictionary containing your parameters W1, b1, W2 and b2 Returns:
cost -- cross-entropy cost given equation (13)
""" m = Y.shape[1] # number of example # Compute the cross-entropy cost
### START CODE HERE ### (≈ 2 lines of code)
logprobs = np.multiply(np.log(A2), Y) + np.multiply(np.log(1 - A2), 1 - Y)
cost = - np.sum(logprobs) / m
### END CODE HERE ### cost = np.squeeze(cost) # makes sure cost is the dimension we expect.
# E.g., turns [[17]] into 17
assert(isinstance(cost, float)) return cost
A2, Y_assess, parameters = compute_cost_test_case()

print("cost = " + str(compute_cost(A2, Y_assess, parameters)))
cost = 0.692919893776

Expected Output:

cost 0.693058761...
使用前向传播期间的cache, 现在可以实现反向传播。

Question: Implement the function  backward_propagation(). 

Instructions: 下面提供6个公式矢量化的实现。

Tips: 

计算 dZ1,你需要计算 。由于是一个 tanh 激励函数,如果 

所以你可以用(1 - np.power(A1, 2)) 计算 

# GRADED FUNCTION: backward_propagation

def backward_propagation(parameters, cache, X, Y):
"""
Implement the backward propagation using the instructions above. Arguments:
parameters -- python dictionary containing our parameters
cache -- a dictionary containing "Z1", "A1", "Z2" and "A2".
X -- input data of shape (2, number of examples)
Y -- "true" labels vector of shape (1, number of examples) Returns:
grads -- python dictionary containing your gradients with respect to different parameters
"""
m = X.shape[1] # First, retrieve W1 and W2 from the dictionary "parameters".
### START CODE HERE ### (≈ 2 lines of code)
W1 = parameters["W1"]
W2 = parameters["W2"]
### END CODE HERE ### # Retrieve also A1 and A2 from dictionary "cache".
### START CODE HERE ### (≈ 2 lines of code)
A1 = cache["A1"]
A2 = cache["A2"]
### END CODE HERE ### # Backward propagation: calculate dW1, db1, dW2, db2.
### START CODE HERE ### (≈ 6 lines of code, corresponding to 6 equations on slide above)
dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
### END CODE HERE ### grads = {"dW1": dW1,
"db1": db1,
"dW2": dW2,
"db2": db2} return grads
parameters, cache, X_assess, Y_assess = backward_propagation_test_case()

grads = backward_propagation(parameters, cache, X_assess, Y_assess)
print ("dW1 = "+ str(grads["dW1"]))
print ("db1 = "+ str(grads["db1"]))
print ("dW2 = "+ str(grads["dW2"]))
print ("db2 = "+ str(grads["db2"]))
dW1 = [[ 0.01018708 -0.00708701]
[ 0.00873447 -0.0060768 ]
[-0.00530847 0.00369379]
[-0.02206365 0.01535126]]
db1 = [[-0.00069728]
[-0.00060606]
[ 0.000364 ]
[ 0.00151207]]
dW2 = [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 = [[ 0.06589489]]

Expected output:

dW1 [[ 0.01018708 -0.00708701] [ 0.00873447 -0.0060768 ] [-0.00530847 0.00369379] [-0.02206365 0.01535126]]
db1 [[-0.00069728] [-0.00060606] [ 0.000364 ] [ 0.00151207]]
dW2 [[ 0.00363613 0.03153604 0.01162914 -0.01318316]]
db2 [[ 0.06589489]]

Question: 执行更新参数规则。使用梯度下降算法。你不得不使用 (dW1, db1, dW2, db2) 来更新 (W1, b1, W2, b2).

一般梯度下降规则:。(α 是learning rate;θ 表示参数)

Illustration: 梯度下降算法具有良好的学习速率(收敛) 和 差的学习速率(发散)。图片如下:.

# GRADED FUNCTION: update_parameters

def update_parameters(parameters, grads, learning_rate = 1.2):
"""
Updates parameters using the gradient descent update rule given above Arguments:
parameters -- python dictionary containing your parameters
grads -- python dictionary containing your gradients Returns:
parameters -- python dictionary containing your updated parameters
"""
# Retrieve each parameter from the dictionary "parameters"
### START CODE HERE ### (≈ 4 lines of code)
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
### END CODE HERE ### # Retrieve each gradient from the dictionary "grads"
### START CODE HERE ### (≈ 4 lines of code)
dW1 = grads["dW1"]
db1 = grads["db1"]
dW2 = grads["dW2"]
db2 = grads["db2"]
## END CODE HERE ### # Update rule for each parameter
### START CODE HERE ### (≈ 4 lines of code)
W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2
### END CODE HERE ### parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2} return parameters
parameters, grads = update_parameters_test_case()
parameters = update_parameters(parameters, grads) print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
W1 = [[-0.00643025  0.01936718]
[-0.02410458 0.03978052]
[-0.01653973 -0.02096177]
[ 0.01046864 -0.05990141]]
b1 = [[ -1.02420756e-06]
[ 1.27373948e-05]
[ 8.32996807e-07]
[ -3.20136836e-06]]
W2 = [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 = [[ 0.00010457]]

Expected Output:

W1 [[-0.00643025 0.01936718] [-0.02410458 0.03978052] [-0.01653973 -0.02096177] [ 0.01046864 -0.05990141]]
b1 [[ -1.02420756e-06] [ 1.27373948e-05] [ 8.32996807e-07] [ -3.20136836e-06]]
W2 [[-0.01041081 -0.04463285 0.01758031 0.04747113]]
b2 [[ 0.00010457]]

4.4 - Integrate parts 4.1, 4.2 and 4.3 in nn_model()

Question: 在 nn_model() 里构建神经网络模型

Instructions: 神经网络模型必须按照正确的顺序使用前面的函数。

# GRADED FUNCTION: nn_model

def nn_model(X, Y, n_h, num_iterations=10000, print_cost=False):
"""
Arguments:
X -- dataset of shape (2, number of examples)
Y -- labels of shape (1, number of examples)
n_h -- size of the hidden layer
num_iterations -- Number of iterations in gradient descent loop
print_cost -- if True, print the cost every 1000 iterations Returns:
parameters -- parameters learnt by the model. They can then be used to predict.
""" np.random.seed(3)
n_x = layer_sizes(X, Y)[0]
n_y = layer_sizes(X, Y)[2] # Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters".
### START CODE HERE ### (≈ 5 lines of code)
parameters = initialize_parameters(n_x, n_h, n_y)
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2']
### END CODE HERE ### # Loop (gradient descent) for i in range(0, num_iterations): ### START CODE HERE ### (≈ 4 lines of code)
# Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".
A2, cache = forward_propagation(X, parameters) # Cost function. Inputs: "A2, Y, parameters". Outputs: "cost".
cost = compute_cost(A2, Y, parameters) # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".
grads = backward_propagation(parameters, cache, X, Y) # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".
parameters = update_parameters(parameters, grads) ### END CODE HERE ### # Print the cost every 1000 iterations
if print_cost and i % 1000 == 0:
print ("Cost after iteration %i: %f" % (i, cost)) return parameters
X_assess, Y_assess = nn_model_test_case()

parameters = nn_model(X_assess, Y_assess, 4, num_iterations=10000, print_cost=True)
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))

Expected Output:

W1 [[-4.18494056 5.33220609] [-7.52989382 1.24306181] [-4.1929459 5.32632331] [ 7.52983719 -1.24309422]]
b1 [[ 2.32926819] [ 3.79458998] [ 2.33002577] [-3.79468846]]
W2 [[-6033.83672146 -6008.12980822 -6033.10095287 6008.06637269]]
b2 [[-52.66607724]]

4.5 - Predictions

Question: 使用您的模型通过构建 predict()来进行预测。使用前向传播来预测结果。.

Reminder:

例如,如果要根据阈值将 matrix X 条目设置为 0 和 1,则需要执行以下操作: X_new = (X > threshold)

# GRADED FUNCTION: predict

def predict(parameters, X):
"""
Using the learned parameters, predicts a class for each example in X Arguments:
parameters -- python dictionary containing your parameters
X -- input data of size (n_x, m) Returns
predictions -- vector of predictions of our model (red: 0 / blue: 1)
""" # Computes probabilities using forward propagation, and classifies to 0/1 using 0.5 as the threshold.
### START CODE HERE ### (≈ 2 lines of code)
A2, cache = forward_propagation(X, parameters)
predictions = np.round(A2)
### END CODE HERE ### return predictions
parameters, X_assess = predict_test_case()

predictions = predict(parameters, X_assess)
print("predictions mean = " + str(np.mean(predictions)))

Expected Output:

predictions mean 0.666666666667

使用单个隐藏层,n_h个隐藏单元测试模型。

# Build a model with a n_h-dimensional hidden layer
parameters = nn_model(X, Y, n_h = 4, num_iterations = 10000, print_cost=True) # Plot the decision boundary
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
plt.title("Decision Boundary for hidden layer size " + str(4))
Cost after iteration 0: 0.693048
Cost after iteration 1000: 0.288083
Cost after iteration 2000: 0.254385
Cost after iteration 3000: 0.233864
Cost after iteration 4000: 0.226792
Cost after iteration 5000: 0.222644
Cost after iteration 6000: 0.219731
Cost after iteration 7000: 0.217504
Cost after iteration 8000: 0.219440
Cost after iteration 9000: 0.218553

Expected Output:

Cost after iteration 9000 0.218607

# Print accuracy
predictions = predict(parameters, X)
print ('Accuracy: %d' % float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100) + '%')

Expected Output:

Accuracy 90%

与Logistic回归相比,准确性很高。这个模型已经学会了花的叶子图案!与Logistic回归不同,神经网络甚至能够学习高度非线性的决策边界.现在,让我们尝试几个隐藏层的大小。

4.6 - Tuning hidden layer size (optional/ungraded exercise)(调整隐藏层大小)

您将观察不同隐藏层大小的模型的不同行为。

# This may take about 2 minutes to run

plt.figure(figsize=(16, 32))  # 设置图像大小
hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50]
for i, n_h in enumerate(hidden_layer_sizes):
plt.subplot(5, 2, i+1)
plt.title('Hidden Layer of size %d' % n_h)
parameters = nn_model(X, Y, n_h, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y)
predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print ("Accuracy for {} hidden units: {} %".format(n_h, accuracy))
Accuracy for 1 hidden units: 67.5 %
Accuracy for 2 hidden units: 67.25 %
Accuracy for 3 hidden units: 90.75 %
Accuracy for 4 hidden units: 90.5 %
Accuracy for 5 hidden units: 91.25 %
Accuracy for 20 hidden units: 90.5 %
Accuracy for 50 hidden units: 90.75 %

Interpretation:

  • 较大的模型(有更多的隐藏单元)能够更好地适应训练集。直到最终最大的模型过拟合数据。
  • 最好的隐藏层大小似乎在n_h=5左右。实际上,这里似乎与数据很好的吻合。同时也不好引起明显的过拟合。
  • 稍后你还能了解正则化(regularization),他允许你使用非常大的模型(例如n_h = 50),而且没有太多过拟合。

Optional questions:

  • 可以将tanh激活函数改成 sigmoid() 和 relu 激活函数时,会发生什么?
  • 修改学习率(learning rate)
  • 如果更改数据集怎么办?

你已经学会了:

  • 建立一个完整的隐藏神经网络
  • 充分利用一个非线性单元实现前向传播和反向传播,并训练一个神经网络
  • 看看改变隐层大小的影响,包括过拟合。

5 - Performance on other datasets

如果需要,可以为下列每个数据集重新运行整个notebook(减去DataSet部分)。

# Datasets
noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure = load_extra_datasets() datasets = {"noisy_circles": noisy_circles,
"noisy_moons": noisy_moons,
"blobs": blobs,
"gaussian_quantiles": gaussian_quantiles} ### START CODE HERE ### (choose your dataset)
dataset = "noisy_moons"
### END CODE HERE ### X, Y = datasets[dataset]
X, Y = X.T, Y.reshape(1, Y.shape[0]) # make blobs binary
if dataset == "blobs":
Y = Y % 2 # Visualize the data
plt.scatter(X[0, :], X[1, :], c=Y.reshape(200), s=40, cmap=plt.cm.Spectral);

parameters = nn_model(X, Y, n_h=5, num_iterations = 5000)
plot_decision_boundary(lambda x: predict(parameters, x.T), X, Y) predictions = predict(parameters, X)
accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)
print("Accuracy: ", accuracy)

Neural Networks and Deep Learning(week3)Planar data classification with one hidden layer(基于单隐藏层神经网络的平面数据分类)的更多相关文章

  1. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer

    Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...

  2. Coursera, Deep Learning 1, Neural Networks and Deep Learning - week3, Neural Networks Basics

    NN representation 这一课主要是讲3层神经网络 下面是常见的 activation 函数.sigmoid, tanh, ReLU, leaky ReLU. Sigmoid 只用在输出0 ...

  3. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 3 - Shallow Neural Networks(第三周测验 - 浅层神 经网络)

    Week 3 Quiz - Shallow Neural Networks(第三周测验 - 浅层神经网络) \1. Which of the following are true? (Check al ...

  4. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week1 Introduction to deep learning课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week1 Introduction to deep learn ...

  5. Neural Networks and Deep Learning

    Neural Networks and Deep Learning This is the first course of the deep learning specialization at Co ...

  6. [C3] Andrew Ng - Neural Networks and Deep Learning

    About this Course If you want to break into cutting-edge AI, this course will help you do so. Deep l ...

  7. 第四节,Neural Networks and Deep Learning 一书小节(上)

    最近花了半个多月把Mchiael Nielsen所写的Neural Networks and Deep Learning这本书看了一遍,受益匪浅. 该书英文原版地址地址:http://neuralne ...

  8. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week2 Neural Networks Basics课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week2 Neural Networks Basics 2.1 ...

  9. Neural Networks and Deep Learning学习笔记ch1 - 神经网络

    近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的. ...

随机推荐

  1. FileUtils功能概述

    https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.ht ...

  2. 关于Windows 2019 antimalware 进程占用CPU 过多的处理方法 关闭windows 病毒防护的方法

    0. 客户端打开报错 重启之后 响应速度很慢. 解决办法: 1. 打开组策略 gpedit.msc 2.  选择位置为 3. 查看 进程里面后台程序 antimalware 进程消失 即可

  3. Node fs模块异步读取验证并异步写入

    console.log("1:开始读成取文件内容...");fs.readFile('./public/2.log',function(err,data){ if(err){ co ...

  4. Fidder 网络抓包调试工具

    可参考文章:[HTTP]Fiddler(二) - 使用Fiddler做抓包分析 fiddler2抓包工具使用图文教程

  5. Java之反射举例

    package reflection; import bean.User; public class ReflectionDemo { public static void main(String[] ...

  6. python之函数(可选参数和混合参数)

    代码举例: # 函数可选参数举例,hoppy参数可传可不传 def getinfo(name, age, hoppy=''): if hoppy: print("name:", n ...

  7. IT行业­——Linux

    现在是21世纪,是科学技术大力发展的一个时代,IT行业已经成为现在的一个非常热门的一个行业,许许多多的人都想要往IT方面发展,找IT方面相关的一个工作.因此,现在也出现了很多IT培训机构,比如培训Li ...

  8. python构建bp神经网络_曲线拟合(一个隐藏层)__1.可视化数据

    1.将数据写入csv文件,应该可以python代码直接实现数据集的写入,但我对文件读取这块不太熟练,等我成功了再加上,这里我直接手写将数据集写入Excel 2.然后把后缀改成.csv就可以了,利用pa ...

  9. springmvc源码解析MvcNamespaceHandler之<mvc:view-resolvers>

    说在前面 本次主要介绍springmvc配置解析. springmvc配置解析 本次介绍MvcNamespaceHandler. 进入到这个方法org.springframework.web.serv ...

  10. BZOJ 4499: 线性函数

    4499: 线性函数 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 177  Solved: 127[Submit][Status][Discuss] ...