From 55b79c339e5948251111585c67b1c138d41cba0c Mon Sep 17 00:00:00 2001 From: acidmikk Date: Sun, 29 Oct 2023 14:03:33 +0400 Subject: [PATCH 1/4] start work --- .gitignore | 2 ++ basharin_sevastyan_lab_2/main.py | 60 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 .gitignore create mode 100644 basharin_sevastyan_lab_2/main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd5f60f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Specify filepatterns you want git to ignore. +.idea/ diff --git a/basharin_sevastyan_lab_2/main.py b/basharin_sevastyan_lab_2/main.py new file mode 100644 index 0000000..f767893 --- /dev/null +++ b/basharin_sevastyan_lab_2/main.py @@ -0,0 +1,60 @@ +from random import randrange +import numpy as np +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap +from sklearn import metrics +from sklearn.model_selection import train_test_split +from sklearn.linear_model import LinearRegression, LogisticRegression +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import StandardScaler, PolynomialFeatures +from sklearn.datasets import make_circles + +rs = randrange(50) +X, y = make_circles(noise=0.2, factor=0.5, random_state=rs) # Сгенерируем данные +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, + random_state=rs) # Разделим данные на обучающий и тестовый наборы + +# Линейная модель +linear_reg = LinearRegression() +# Полиномиальная регрессия (со степенью 4) +poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(random_state=rs)) +# Гребневая полиномиальная регрессия (со степенью 4 и alpha=1.0) +ridge_poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(penalty='l2', C=1.0, + random_state=rs)) + + +# Обучение моделей +def mid_sq_n_det(name, model): + model.fit(X_train, y_train) + y_predict = model.predict(X_test) + print(f'Рассчёт среднеквадратичной ошибки для {name}: ' + f'{np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3)}') # Рассчёт среднеквадратичной ошибки модели + print(f'Рассчёт коэфициента детерминации для {name}: {np.round(metrics.r2_score(y_test, y_predict), 2)}') # Рассчёт коэфициента детерминации модели + return name, model + + +# Графики +models = [mid_sq_n_det("Линейная регрессия", linear_reg), + mid_sq_n_det("Полиномиальная регрессия (со степенью 4)", poly_reg), + mid_sq_n_det("Гребневая полиномиальная регрессия (со степенью 4, alpha = 1.0)", ridge_poly_reg)] + +cmap_background = ListedColormap(['#FFAAAA', '#AAAAFF']) +cmap_points = ListedColormap(['#FF0000', '#0000FF']) + +plt.figure(figsize=(15, 4)) +for i, (name, model) in enumerate(models): + plt.subplot(1, 3, i + 1) + xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100), + np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100)) + Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) + Z = Z.reshape(xx.shape) + plt.contourf(xx, yy, Z, cmap=cmap_background, alpha=0.5) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_points, marker='o', label='Тестовые точки') + plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_points, marker='x', label='Обучающие точки') + plt.legend() + plt.title(name) + plt.text(0.5, -1.2, 'Красный класс', color='r', fontsize=12) + plt.text(0.5, -1.7, 'Синий класс', color='b', fontsize=12) + +plt.tight_layout() +plt.show() From dab82f11eef438479d11f3805de37953e1c89b59 Mon Sep 17 00:00:00 2001 From: acidmikk Date: Sun, 29 Oct 2023 15:23:51 +0400 Subject: [PATCH 2/4] fix ingore --- .gitignore | 2 +- basharin_sevastyan_lab_2/main.py | 81 ++++++++++++-------------------- 2 files changed, 31 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index dd5f60f..40ada36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ # Specify filepatterns you want git to ignore. -.idea/ +.idea diff --git a/basharin_sevastyan_lab_2/main.py b/basharin_sevastyan_lab_2/main.py index f767893..e0f801e 100644 --- a/basharin_sevastyan_lab_2/main.py +++ b/basharin_sevastyan_lab_2/main.py @@ -1,60 +1,39 @@ -from random import randrange import numpy as np -from matplotlib import pyplot as plt -from matplotlib.colors import ListedColormap -from sklearn import metrics -from sklearn.model_selection import train_test_split -from sklearn.linear_model import LinearRegression, LogisticRegression -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import StandardScaler, PolynomialFeatures -from sklearn.datasets import make_circles +from sklearn.linear_model import Ridge, LinearRegression +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import RFE -rs = randrange(50) -X, y = make_circles(noise=0.2, factor=0.5, random_state=rs) # Сгенерируем данные -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, - random_state=rs) # Разделим данные на обучающий и тестовый наборы +''' Задание +Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с +помощью указанных по вариантумоделей. Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и +среднюю оценку. Проведите анализ получившихся результатов. Какие четырепризнака оказались самыми важными по среднему +значению? (Названия\индексы признаков и будут ответом на задание). -# Линейная модель -linear_reg = LinearRegression() -# Полиномиальная регрессия (со степенью 4) -poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(random_state=rs)) -# Гребневая полиномиальная регрессия (со степенью 4 и alpha=1.0) -ridge_poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(penalty='l2', C=1.0, - random_state=rs)) +Вариант 5. +Гребневая регрессия (Ridge), Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE), +Сокращение признаков Случайными деревьями (Random Forest Regressor). +''' +# создание данных +rs = np.random.RandomState(2) +X, y = make_regression(n_samples=750, n_features=15, noise=0.1, random_state=random_state) +data = pd.DataFrame(X, columns=[f'Признак {i}' for i in range(X.shape[1])]) +data['Целевая переменная'] = y +X = data.drop('Целевая переменная', axis=1) +y = data['Целевая переменная'] -# Обучение моделей -def mid_sq_n_det(name, model): - model.fit(X_train, y_train) - y_predict = model.predict(X_test) - print(f'Рассчёт среднеквадратичной ошибки для {name}: ' - f'{np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3)}') # Рассчёт среднеквадратичной ошибки модели - print(f'Рассчёт коэфициента детерминации для {name}: {np.round(metrics.r2_score(y_test, y_predict), 2)}') # Рассчёт коэфициента детерминации модели - return name, model +ridge = Ridge(alpha=1) # Создаём модель гребневой регрессии и обучаем её +ridge.fit(X, Y) +recFE = RFE(LinearRegression(), n_features_to_select=1) # +recFE.fit(X, Y) -# Графики -models = [mid_sq_n_det("Линейная регрессия", linear_reg), - mid_sq_n_det("Полиномиальная регрессия (со степенью 4)", poly_reg), - mid_sq_n_det("Гребневая полиномиальная регрессия (со степенью 4, alpha = 1.0)", ridge_poly_reg)] +rfr = RandomForestRegressor() # Создаём и обучаем регрессор случайного леса +rfr.fit(X, Y) -cmap_background = ListedColormap(['#FFAAAA', '#AAAAFF']) -cmap_points = ListedColormap(['#FF0000', '#0000FF']) +models = [('Гребневая регрессия', ridge), + ('RFE', recFE), + ('RFR', rfr)] -plt.figure(figsize=(15, 4)) -for i, (name, model) in enumerate(models): - plt.subplot(1, 3, i + 1) - xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100), - np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100)) - Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) - Z = Z.reshape(xx.shape) - plt.contourf(xx, yy, Z, cmap=cmap_background, alpha=0.5) - plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_points, marker='o', label='Тестовые точки') - plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_points, marker='x', label='Обучающие точки') - plt.legend() - plt.title(name) - plt.text(0.5, -1.2, 'Красный класс', color='r', fontsize=12) - plt.text(0.5, -1.7, 'Синий класс', color='b', fontsize=12) - -plt.tight_layout() -plt.show() +for name, model in models: + pass From faeeecf1ef8e91a81bdea4177b49fce61cfb8332 Mon Sep 17 00:00:00 2001 From: acidmikk Date: Sun, 29 Oct 2023 15:26:49 +0400 Subject: [PATCH 3/4] fix ignore --- .gitignore | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 40ada36..7e86cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,140 @@ -# Specify filepatterns you want git to ignore. -.idea +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + From 5e0058b82ebdc55a4178904a0697821322200612 Mon Sep 17 00:00:00 2001 From: acidmikk Date: Sun, 29 Oct 2023 17:07:56 +0400 Subject: [PATCH 4/4] basharin_sevastyan_lab_2 is ready --- .gitignore | 1 + basharin_sevastyan_lab_2/README.md | 42 ++++++++++++++++++++++++++ basharin_sevastyan_lab_2/main.py | 46 +++++++++++++++++++++++------ basharin_sevastyan_lab_2/res.png | Bin 0 -> 6134 bytes basharin_sevastyan_lab_2/rfe.png | Bin 0 -> 11475 bytes basharin_sevastyan_lab_2/rfr.png | Bin 0 -> 11407 bytes basharin_sevastyan_lab_2/ridge.png | Bin 0 -> 13923 bytes 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 basharin_sevastyan_lab_2/README.md create mode 100644 basharin_sevastyan_lab_2/res.png create mode 100644 basharin_sevastyan_lab_2/rfe.png create mode 100644 basharin_sevastyan_lab_2/rfr.png create mode 100644 basharin_sevastyan_lab_2/ridge.png diff --git a/.gitignore b/.gitignore index 7e86cf0..d13d270 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ dmypy.json # Cython debug symbols cython_debug/ +.idea \ No newline at end of file diff --git a/basharin_sevastyan_lab_2/README.md b/basharin_sevastyan_lab_2/README.md new file mode 100644 index 0000000..9aa5309 --- /dev/null +++ b/basharin_sevastyan_lab_2/README.md @@ -0,0 +1,42 @@ +## Лабораторная работа 2. Вариант 5. +### Задание +Выполнить ранжирование признаков. Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Провести анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению? + +Модели: + +- Гребневая регрессия `Ridge`, +- Рекурсивное сокращение признаков `Recursive Feature Elimination – RFE`, +- Сокращение признаков Случайными деревьями `Random Forest Regressor` + +### Как запустить +Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать: +``` +python main.py +``` + +### Используемые технологии +- `numpy` (псевдоним `np`): NumPy - это библиотека для научных вычислений в Python. +- `sklearn` (scikit-learn): Scikit-learn - это библиотека для машинного обучения и анализа данных в Python. Из данной библиотеки были использованы следующие модули: + - `LinearRegression` - линейная регрессия - это алгоритм машинного обучения, используемый для задач бинарной классификации. + - `Ridge` - инструмент работы с моделью "Гребневая регрессия" + - `RFE` - инструмент оценки важности признаков "Рекурсивное сокращение признаков" + - `RandomForestRegressor` - инструмент работы с моделью "Регрессор случайного леса" + +### Описание работы +1. Программа генерирует данные для обучения моделей, содержащие матрицу признаков X и вектор целевой переменной y. +1. Создает DataFrame data, в котором столбцы представляют признаки, а последний столбец - целевую переменную. +1. Разделяет данные на матрицу признаков X и вектор целевой переменной y +1. Создает список обученных моделей для ранжирования признаков: гребневой регрессии, рекурсивного сокращения признаков и сокращения признаков случайными деревьями. +1. Создает словарь model_scores для хранения оценок каждой модели. +1. Выводит оценки признаков каждой модели и их средние оценки. +1. Находит четыре наиболее важных признака по средней оценке и выводит их индексы и значения. + +### Результат работы +![](ridge.png "Гребневая регрессия") +![](rfe.png "Рекурсивное сокращение признаков") +![](rfr.png "Сокращение признаков Случайными деревьями") +![](res.png "Четыре самых важных") + +### Вывод +Четыре наиболее важных признака, определенных на основе средних оценок, включают +Признак 1, Признак 3, Признак 12 и Признак 6. \ No newline at end of file diff --git a/basharin_sevastyan_lab_2/main.py b/basharin_sevastyan_lab_2/main.py index e0f801e..8603b2a 100644 --- a/basharin_sevastyan_lab_2/main.py +++ b/basharin_sevastyan_lab_2/main.py @@ -1,7 +1,10 @@ import numpy as np +import pandas as pd +from sklearn.datasets import make_regression from sklearn.linear_model import Ridge, LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.feature_selection import RFE +from sklearn.preprocessing import MinMaxScaler ''' Задание Используя код из [1](пункт «Решение задачи ранжирования признаков», стр. 205), выполните ранжирование признаков с @@ -15,25 +18,50 @@ from sklearn.feature_selection import RFE ''' # создание данных -rs = np.random.RandomState(2) +random_state = np.random.RandomState(2) X, y = make_regression(n_samples=750, n_features=15, noise=0.1, random_state=random_state) data = pd.DataFrame(X, columns=[f'Признак {i}' for i in range(X.shape[1])]) data['Целевая переменная'] = y X = data.drop('Целевая переменная', axis=1) y = data['Целевая переменная'] -ridge = Ridge(alpha=1) # Создаём модель гребневой регрессии и обучаем её -ridge.fit(X, Y) +ridge = Ridge(alpha=1) # Гребневая регрессия +ridge.fit(X, y) -recFE = RFE(LinearRegression(), n_features_to_select=1) # -recFE.fit(X, Y) +recFE = RFE(LinearRegression(), n_features_to_select=1) # Рекурсивное сокращение признаков +recFE.fit(X, y) -rfr = RandomForestRegressor() # Создаём и обучаем регрессор случайного леса -rfr.fit(X, Y) +rfr = RandomForestRegressor() # Сокращение признаков Случайными деревьями +rfr.fit(X, y) -models = [('Гребневая регрессия', ridge), +models = [('Ridge', ridge), ('RFE', recFE), ('RFR', rfr)] +model_scores = [] for name, model in models: - pass + if name == 'Ridge': + coef = model.coef_ + normalized_coef = MinMaxScaler().fit_transform(coef.reshape(-1, 1)) + model_scores.append((name, normalized_coef.flatten())) + elif name == 'RFE': + rankings = model.ranking_ + normalized_rankings = 1 - (rankings - 1) / (np.max(rankings) - 1) + model_scores.append((name, normalized_rankings)) + elif name == 'RFR': + feature_importances = model.feature_importances_ + normalized_importances = MinMaxScaler().fit_transform(feature_importances.reshape(-1, 1)) + model_scores.append((name, normalized_importances.flatten())) + +for name, scores in model_scores: + print(f"{name} оценки признаков:") + for feature, score in enumerate(scores, start=1): + print(f"Признак {feature}: {score:.2f}") + print(f"Средняя оценка: {np.mean(scores):.2f}") + +all_feature_scores = np.mean(list(map(lambda x: x[1], model_scores)), axis=0) +sorted_features = sorted(enumerate(all_feature_scores, start=1), key=lambda x: x[1], reverse=True) +top_features = sorted_features[:4] +print("Четыре наиболее важных признака:") +for feature, score in top_features: + print(f"Признак {feature}: {score:.2f}") diff --git a/basharin_sevastyan_lab_2/res.png b/basharin_sevastyan_lab_2/res.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc7f4ba2cbe25c6863e4202864e71d673c12f99 GIT binary patch literal 6134 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 Z;f+Rng(K!ccYpObFO{{FY85QQ{{w=X29E#$ literal 0 HcmV?d00001 diff --git a/basharin_sevastyan_lab_2/rfe.png b/basharin_sevastyan_lab_2/rfe.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e636f6cf841d34a55a5d8f21e069986b0e18b0 GIT binary patch literal 11475 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 h{~^yITD-=2-;I+Z7WRGy_($X$&r~#&D-W5(APB z9pC0T&-1?LJLi4B>pI^bbIt6%=iYnmb+5I4zZI_@80yneU!f)`!?K_{Dzok{S3Se)>>fi>R>w>MC$R=B#;NlZdD!f#$@H95|+e-8O$pL`2_u@geT? z{^CePB!2CVj^-n{^{)&XOV*!f=jt?}P1MOGp-)US>S&%f*RE)i%hvrMmnf4na{9>q z%U(Ey8w3@O`xgKB6f>-ft@{M;F}UJF^(A_NTt`F4_(2_v!tM-I8)oV6Z2Qq~e|+

PCF6)@4&p3Zj<>p?WNh1nRdUAk%V&`7_gsJJegoNh>WvOf^obE`={&kjRr3VA zLR)3ia@Rxol<1?M*NOr{Ir8JLmPU2;ND@UP>5Tj;smDDL7HGj25iM(L{u|*h+}&-y zWGAwO(0!DYlTS<+rtop7KyPY=Q&E1w32<<#%4F8HWm%m`ELs?L(_xpr5X7i1r_VZoKW=01%1g+6nZdW&&CX&8@g zN7mGHg0s$d%B902Bh`Xvy)q<&8k~Z)pd7i!e>6Ji!KFzik_07Isi~{*KSv3N^wS-7 zd+903H|KrAOxPXt}Q~$eQznI@xXVoVq`GR`PASD8 z=m+YzG9{UIszbDZ6 zsz-h}qH{r}u!WV*{ug#Jw!Z=6v%2r8_$D)=cbB4g^AS_fX??`1eYw6uh=rx%)rd0F z(l;Njh6M}n%q^}7-b@29)hAE)S7`|`2(IE{9|tkyyV^E~;gibzd_MWtNA z$+x5Pob;yw>hYhDBj+uexTD#qsHA-9PnYO|8gdr|5QzO*v&MbeZ{9xygoQaGet!6Z z{=zzw!xfRsd}p>X;?vsR+_MR=+cmX}BuM7P6_VHOawHInsb-9CXN>ox` z(=JC^H%#DMapXKu>0>ZwMDO+AGb$3{AzaryXQ3X|a}k{!;koc-2E|m2(uwIC-ve0> zMf2%h6_GBsvu}JO)*!zJ6Cd)b64is;An4*^PKgX?^V>x}H4gXk@(R7CvNtP2LHX1X zLgFUS5w}gy8Fvt4;o)RUF8S*P`4H22rlacut>Qxh`-~7C6Yd(Wv95Sc?Lir#E9xKb z>ttiMax+Clk!LM2uV35!^f2*0^$k`VeS8JdyGmoxb9bt-oMD!y78QUE;C_Z_)UNE@ zc7)r&u_a-jkgv4l>jg^uEX%!lU1x17T{joQM3Dm(WIMz3b7?CUNK<$3#n&w=KWIV} z$TL*o=4ZZ+HmZ^8?-YMu9izB~j6mHQh+jgYgXv(bmlya*pMg>+KsY?IT57mMjK@IgUEws+wauN%)e zOos-HCS!~qt?g~+Pr?r0JW!FZ@MA!Fo+|ZhP=>fki?f7u)ZkKA)rG(FhQ9LTm66;$ zHB;T}lAq;cZ-xid@rwUWXBzU3P`Av8xv%pogfTQ#I@}X_EWpZc-VAXSQlWT%*Wx`p z$9L*4e%%kCPUJDAcy8$;GvYPn`#scN5F@FAkON7nUfsQj`Z3?`D`6dU+G$X(MiRCS z?V-jK#dxRNpx+AYT%b=|Nl2seGF|gKcj5>f=RvyT!BdYglenIeXr(j?VI!%r5i<(R z+Ux{fVTJi^#kb+T>s(#^4X?Bck7~bY9q+x_JN+;-015H)TT;5JlJZi&4z$2z2W5NB zeyg~`BVa|y7xY22)xu{KnS$E$WoxM^&@mIYjp>n8J14ge=~{|H-ec`=MOycph4{$Af~Mz(}B&V%}u z8Oux?q7Lm;hlaq|xVj@-*nUM-QZQZn!;gf1x*zZ1+2_d`@apQko@`OhjY(M7l^L~f z4eDzU&-oue$ec&}Dd~S}-SMK|pd5xPKDOyS+z*8B<4R!O_5+flbJV)mRU@`-bfxP+hi1pngfTO zTM>KeUTs5516L+IXhuLh$m!a;)JZfi!>&W!^+bQ#+ITkpxe{YoNY#nNyh}=GG7Huy z_V=Boh_w|tR~~j1S=w%cM%$%P+Y=`+_>YZN|G6voWIg3G(WP4gnmS#xIy91w2 z*GD5$#9{`<4g2;>-OGv~_&$x=zRLKfkB34hB0Mdhl7dC!cs_t>AI~#HnPuMb5 zU!KQoa(oo;?Cwg~nm^v0!#Rh|KL*#Hp5)+0y?00a`}XPx+&k;`;(;M-kU}`kZWg76 z#r#9a%n?t6t^65N?i-KiYqgywJzHm?^9-|jX(L;%Ar!{$YAqdYpg})h8t>o%c%TqO zoRc_7&#Fk=^K8OLpF^FT+0V1{4t5t#X_4U6S{tK|#`W;unhr{ozoY66@q4x9!tgr0M5yI{(2p;mm=|}~cXqaSZa40p(3&@LQU=>*j%xB@Vfs=ravpg{dqPlF>9P?1 zm+*xy*Y`(_P+{>WwJa-RQzM_pQ6=C-aq( z7&3Oyn-j=}A29qsTtu5#I5`p>AOYKJ;5==E({8Mjr0uBukrCbUIb#`SV>Bw#z6y;Fx1ZkMcqZ}pTTy?5qFuxF1<|0c|(|{T7G&)nG z&49c7Yh72u%G_{bRo6TYOt0-driu#0Esu{wbLz?sH>Vv@)`bMgk+Un3`J@>nHLaN( z>7J@Xl@=C`)`lO@avAwo$^FCqr z@yuT!v`g6!y?wrd@FZcSIe_ptIyd> zkKpCWnxR?c8nJC{&Qq)-$Oa*%cvyrP!rykxeX|=!F0;n39RJ?s^t>EKu;IoX?Lvpq z0jnc{@6bmhnJaUNQEB6;g7hJIIa6!Zb5qJ+4AuK+%!!>xk(Hs|2P*dn{W{+(-ii1< zgN#1%cXObKxdOT~>|S6{Hk0Ooo4v2!!R<|^AFHFlU|My&*ZIDfNaUvMqx`I;2=t3G zcO0mtvP=wGu@UDQlZ0F=*iERkrqm3a=XOhV!5LJ{q`BctKihR4_1!MvioQ%^-QJ>P zw^ip$w5HH;cTIyc6de%i>PVP#8oA7PJsSOjCA>r%qS`F?J&fhvpT_&Y0RTU$fmpGS zJhJzk$mGPmC}e?wW}85DYMI41i5#`-drB`@ypjQfx_T}M#cufAHic*B;mEI!Wre3dJe*JT#>JTJN`UO=C_!z7<}vr94t%3KR^P_2 zY$m=U)tAa?iX|z08f{+)QI(>6|6^9mi)Ya19+}=`=fW&>$w!vq&;lyzHbQB@c! zsb~&r2vDP*zMq2y?tzw|%TZiTei7+t8O2&Gp8Vu2ay!^+J9?ie_VR{F&#i|Jz{*Pb zA`z81i7b!y6ni_X>CnN^U(|+eKix9Zm`X|d>%dtJ9PXyUu|<22bEcEcDL0`OF|zN$ zvz+dko3=rh2)dKsS)yx&>s<7@s1?^B^%Ix-8eacUS8zC2;yUn0HIj05Ba=M(Dpz8& zHH7**vu=XYqVml{uFHW@nI>l1tJ&cnq^(UwZos4(IqyEkI%1?!?Qsensg)a-!)Ms< zM5|kg*V$VG_b!73$7u9g?ooF<8&vt(c@n=@AyVkmhHT-3)a$rss#k9eH-hdCw9Tid zq(%UeBf$x!G>S?17uj16p6$b;j0PQJHz2WPuS~-gT%?o1Qn*zAl_(&#@rvS zd6-^$!v=$30wNaF;?K4u7H*KroPLUcBha8i{osf%2EH|#+U5ji%=6`J#7c4?bLa4< zjJh()i-33$BY%Is*K6&^bN5t~rp)0{&#pk#u)gX~ z)wI?J942dU2M4t-tbVVW){!(*eUur*3X@O*N&0=$@TfyRPa9Ur_c(^id2|5XL=x~+ zQ+{{a{!;KjNaW}j7}<~W$c#?xSk0v}eEWq=ru<@a_bdp8tI6qsU z8dz%l=3)4KGuB(X{PnKDTB*O+7J`d3#Awa8WJb{Dd5GSXAs8i{3Ch~>@C)Qr8wiu; zD4v2b?2@*Qo}OCJx*e(a^CNZx&<{%ss58dAUUGY?9@ zC4!Bl5p}dcVp)yW@^q^BVB+lvy|==bTv}tMHt9xw1f4$5?quszxTSEb$y&Q zj2UO_`85z#>@lOGg13$z?p$ye^;yy=<0-iZ2re{z!sXgkXLXtqK^{?Dfeq8m>zG)O z>jMnS;`n5DlId`7(ySrqa)V)o7HUnuSiL~To|_8@5h#diht0Ox9 zvQgyd?8$v@z|r@igkO5G5&8>y>vz2m?9CQ2;G(R%uXTAtbp6m?=wnD7%Q$z3-G~F?!S@y7I4mSs z{s|^{_(F#m@MaW0sl-<2$m#9+B0N=5r`@i%C~SR*#=0dCDLn!uT=@Y#{+xh*5o1@1 z#ZLz01fy!Zde|~iA~n7g?G<-%%{Gm4`k15CF6`cYZoq{rAg5szU&3WARgnq_d1*B3 z8&i7Ii!Y2vklt-4=D;&ku=vdkUHckl()@e64}^{2gsWlsT6Kv`ya{RY9|v6AaR%v) zN&wGZhY~7%exwy`A9H)F?41}St4lDl`OGe)wJNoM$YQaO`tOHn#D8y3Ssu4tC}2sN zoS=(S+N%FlXa2XXxkwTLaDVZX^QG=)cq^(OOKG_(da_CIe)C6^JL?bVrv0z9+L49= z4J@83_pv_hRlBG$dH0gl#0U8ee+V9d92c5~3`7zyZ!Hyq2Zqyucc;qGW-Y_w#Wv>f zKgFs(zC&5>Pg&Au)Kqk0-}zJ-3r^`-psXX_Lywm(b`b@s&)t%%2r6ZBejTx2L!MJK z$(A0CnlIkwbj1XG#qRYH0lFMV7KP4g2LA=ssHgsy@-Tp5k2L(Lo)Kh`W=uaN^`nKL zlY&dW$_{AoY%=s1Ehsi;pNt0EkgjEFu6Vu)KNxOr5j*;%GgZ{<&x0 zCmXV*d#h1?k4wxdp9xB)%wyS<17S}w-~k&WRokVY@Ug7U3SZRrw*QdGI`hkM2W865 z#HcCgj{PsC{!3~(QugzX436pdG~;$uouc|*qyg`v01t%Bt)Gcpv#yRu|KMDY?~6p` z`%4H7z%fVvoE#@Q)s(*a2Ma5jf1*4nnhjb9gUFoMUNuZl2<$#_qjR_u@diq0x_|X# zDX?wEr5B9%5D=R~LkZNnG7AcbS5*}z+eZr=B`#l8o;6kw+i)W#u5qHk1E7?kPOUCl z#U4noSkVln%ew@c`~g0G8Jb&Xr-SVUdze9Z>@ZRo2_%Rz7r|BhWb5F!_3hc>OI-9k z?emzd`Q636WX0!v@8hnx#|&SEs2aziU&y-SD))3KqEx1OM^@k`{ObDwl8Tk|$l-wr z&OETuBfvU(p#=ZoH$I(Q%}jzreXVR84W}|f;zX}|X>qI0@*Qrtr|ClL|B~GzO<0h^fk-8AkTTBc5lBC&e$JV724mH= z%D3BCR0|Mo)rXwgTo?fm`^H%6K|klZI;<4?EY>(eIvHx;&2chDr}i_M6FL%rT`z;w z-!~}NQR+5`SiW(iyT{mdJa_MsAZlg>;2=QCIeS-MuR$U5-h((B&wl~dtwgZ*$)C_x zpL>%$@K$@aj_)J0otYcrX$njUHA#!VOAerSFEap70=6y2t{aQr9q`uwG3o7axbyfx zd7K(k$lH8&?UZ-tE7IE<@F)V5@R}l`Dvl_Y+cDx`T0e2JNje-Iuy{e*iogQ}eyKbT z+H;u*qClyU&HArM1;jrVv3m(_o7qy?`<=f$iS$z`#mDhnAlMsRn8D@yjN$zMA)V6f zy_@9T9>YIbqp-EZMe`4R`&z6%!N6sHSnNkyAsn=voBApt^~oP3`(7)g`xa&WbS5@; zfcd%OV$4^WG4L?+{QxN95@6ZDDFf^`UyJR?(hUOkL>!3w;-ko<$SRzd*_t)&9wx|~ zn4|SQCZIsB66b~ARgeQvyarsvy$Y$dLkG(Ac6KNI$^CuAta91B`PQs$dIm`TMEau1 zyGb7HTwOJzlRL6Rf06ympj0N>|J35Xe2~0pC0U9ID1q)d;@*Lartf;sK)3pAdNR=g z@&Lmu`}PSJsxWhL)u1H^6YvT<7gzC7)tvBF+7xAt#CoBz>nMJdwXh>D#$gJ({uP-N zp=3tryZ>~wR2XGVu>@$LQ_+3=9axI$DHi`}BvfJK&zrSbUZBBTT=~V#1OOjNrY;SD zb;LW7h5ct(hvjp_O&;6-W?7V}Dx>k}-c9rqpicA4Yz+x?SASM@UVQb2iHULpPYXhv{S}jiP?^DPm?H=$qYPK8MMh`Ec_om;sL`!un@4kg zFJ_rA`|Vl}B8%(1-Kn##@<4DZotf0BUq8Cu?Qj&+(K)M|S8PD$l(3qe+0U#@Y6z)k zcb{qDQrmd0c+|s_Ui}tmsWjRfX~_hgxYfo1Y*`+5%ZiC-DXcu$xat9<%-Juj(wV$} zBSCB7!&=wf_~wl+ebmCHw zZ?x(>Q1twYG{uD77mm%6W#8LQD;CB!oY+yKGI?_eGz>4@cX-zCxE_dn??x$*O#E1E zS(UwgyEim0ME#l1H(F71El5+l?f+2baTrGL8?H=5v=+=d7>_mG^kGN9g94=f@HPvh zqexiT8X4F+^a;F|uEGd3WKA9VA*%T>o!R`XPM01|^f~^^NY*GV7-jtu!dW`!fHp7F zJ53(S>j;Df=7wqWcsaSpE1o2Z{|y>O6@ZTd;S@8+rN&@VFUy4eb?r5G#zj9P|CV3z zmlBrC{YazsLU~?+n>Tmn9sJ$mR{vLQ5w-vl$U`V0e(Trz>yMZ~hlzzxW;Ks?;cF3$ z<))P!Kx%IjTDLCl_!z9dfjf|~F;0o(UQ-Zk_u_LBhqKWvhd1wz5Tj=~#V}zq{1@q; z9)zKPtlv=jKdS{<)6}2?;@w~J@2WSko=;2)Z%0KO9EBqaZ4xg6)cMjw)XcZ`_Qxq( z{&XJmvM!3ylaec0XU`~yhK8z^201c#uPwkH?k3B0gm)mbqBwY-YIPT^!Q4zk!)M`@kfAG}`lsV>|`Qy@M@4G8ka}&X{#oz%N5~0J& z#59U$S6N;T?Uft^5%jK2qqx1o%n7+8jRG$gddNspx&;dUG^}qkM#?w)CsTALi4ncyY03Hxtz=xu6UU$*^ z|FDgtR2LMv6vsHE{&rx&nlpZ7y}1Aq+=|7!e|sPSukHdk_(+4y#RXbLa{|;2N8?gN zUepZ3;@c+-EY#UAx+Bi0Oq)x;uyf?J5R^5#zOD9>^b4Tciv<_uu?Mk5R^qw5X2+l> zpJRcOD6rJ0i<4OVc;!<21>GA1^1WL2I<+_M^<`dtF+lNV$r5GlEOBs!vjeHX>uybJ zPOJdr6KM9j7xQjFJwmDhu?|2dfFo;#W z!;W1lj3cDMJdU_Eh74i=(rSIZa;V|Yjb~ba<<02%ewQo7(*cC4sv1f-SwnHPz@x@A%|BeXlm?tVv20f%JsMT_CP0Bv!u#7_)s%* ze^sk2yIn&0XkYyYh3cUrUe)wC;ZR}qm-ALuIq145F`)67Z)0fisDaW%zXIpI88c)Q z+d0=SSu8rBJ@HD!W8yjee#9Cm^|+7>Y*tfMCC+k&h@Qwx-=cPc=R0&JSinR?d1v_F zZHq87CK-#@#n`f8Kd5{1U$3%k+vBZVy!}KpNIO#_8-JW|5rjxOu`Msmr5wtq?|6(e zMy!0l`-~wYx=^S@G38VB#?a}|gQ`zKFLAS*y3d}KANeSkF+L7x@GEM5K`P0~s7B3@ zJ1T(h<(_H`CLdLl`t2IX(K)c3&D>8Jd}uJ*T5cvJ+xoZO?+l_Ng-&f(W!uINUoo&@6Ih_T~);rS<_~sQ!}kO)eeoPrfTRZ z9&RpLdnp&15!x0r3}A|CWs%==$z%FCd1i>eay7JdZ??~e-~(R=h1(R}ZoC$`s4U>&#F;Lew>6IR zUz@Jf^{C;jW1QO`ljU6d7%^>wZm-EQY<8OyzeiWf0SpPrO!VJxDX;RCg9%UsSL&a>G?hoEDNjaqY;WGJyG^I^fH^Z{DDapBOB(Zd=5BgcOTQ z4U0CrmEnzj=#TxZHP(!a=Ia^c_>pXkC95G+HKSSjYe!TrwPG*6*HW*LDnZno=U+1o z^yy{Qf=UpR?NMs0HqT8-B#5OnT~o->o>1z6mwtjv3vt2$-=RdmAi*ifdN%RyCn(H; zJ-J)=tfA*b?#_nQ_Xd``p5^9*lS|!)4zhbf9Jze1pfd|$KKtQzQ7yYSY#twQpBpAp zr6d{En;!}SLx0fCD}336LL%nP8%++JC>u7f2*D$@Qx!dn4%<^x{Wlhi%k3RgA2cMP zB$+V=1^)929s)q_)q9U?Bu3W0Ma9IauUXQ;9o0PHiCU_ELoDml`LW2_q&W1a$8zWYPl9D-w?H$%eF>Lug!8^sS|tAR!hydKGZ*K1~Y9I`B;lbq;vd&;Kn>?z&e6s)tVT57&MS`EInTsd~tVls7;^N6ADa48MhNyE8>d@(Sln~a1a zN(kO^z8lnhhlM1UN{@*35B&Uedq(PIJY~*L-FUp~8FQ6SmzJfr3&{eS_#nXv`7@ng zxKPDMwwYVh>P7~%L2AsZhK;YK7JonGT4-c8u|YuI_`V(gKL7A}GxwBKVXXs9M4~P# zRPQw1`5p|JDQ<+zOTq7yy#iV&VoUP%HXsegBcOHwv{UJfDO<)aCS(9AzB1YN*RC*h;%oMbf>g5Ln9&G(tKM_ zyyyMB=ls6!y{_*Mu3>Lxp4rddYu)R<@3jb5S5?Hvp~Sg$>lXfFB{>b?wdK|=6dx=M z;5RqZ`C#A$#aTm9=2r0l^>^R^&01PT`qr(o7~D%!bl@1kpG$8;CXn_$uv9ebPx?1vDbTCcI;?`Hx z@g=e8J-TB)N$;$;rxElY3GUkk9c`zYF1Et-E{{uu?WU;Sb{+?6EJv59zhn5mc9!_r zLWrA#bg2%_R5(#oOl*++rZ`ye@?4w{c~m6)#*MJU{UFX@oN}=N66;5gE_8-#R9$g% z=+H()OdPmZjB}r+A}=qe|3whZo&WTzrlLIbpnFL8r-2wEM~TuURN^Pj6!<>_+z5&HK%+po_k~ zKyz@f4GLxxI(ubz1h2v3nd(@UQ((K9#z|r6Yuj2Ax!-A>26a~Fns2hDQ#D*{79niM z#I>SNmyfsgWTOS&Z1ctCAKsX3jEHN_G@g63CXr_>KlN`r&Go|qYlpvn2cB8BJ!vZ2 zM!Hf2O|Ymn=bG{`mis%n?B6O*?r%@A{k}}TQ0U9I@P1-{V{$QUYvMNKIVr=k4DA!` zwUYhAjHI05K{a0=e#L?qf0LWW_0QA z_GaJQgv!tFbmEt=;`tV52`esRt(6>xO$-lii2FUSLFE{ymU|rPL^0N@nw$Z09gHbX zHJ(POX?HcQBcqfwPuiZQ8JUHL)!=WvCo3)g49hyzF}yE3WIuY-w$u?>c3MHmSFcTm z01F2_H%rpw>BTW7DX8Z^%j66<#%76xBa zTeLgK&saK_DSx^vil(=C*+P-rGazffLA<5P3N1-3(c^}ZOrHyO$@^VkU!FJ*YhAlA z8#6|!mxR$-hh6@DbpDs_i;F94@is%vCwH~U_cmE>TE7_P#CaCoIy*yWEiP1W)vf|= z5-aJL(%E;Wz6&dsHxId)gsz064>o`7Efu^K74Y$MxwvHCnbo54zOJ&X);0+D?&vTJ zr<5PYF1(yT?Ym*b5WycsMSa82J=uV2%sC%28ljO1ejb_Oxse?t5MK(`3IA&5s-36q z$jUZ$8T-DpEMH-m=6F^ytvcqpy8vM`YCk6@k?_lKQRt;WP7|&&S5k{sjzd~uT4nK6 z<0B_0wj}+j_3C${%c%Mu5T2i_Whb~I{)k(}BFtusoOf8!^ zw4{*oH%ZP08X7ojSyk)=giTj zx5i=z5{-JUSQE*p!xbvqxQ_yslZSHLag#;g1YO{yJkL=H`F6tZw#ack8Sme4FTp@= z;k|U#Zu@j}D*tv^uI_oWz?rU3g_hy9o!Qmu$I-L6rLV;+`K~L=aF`L+<$`p?g_`cgt-wuxmrlm(%f;(4w<6)Rlqti;*l$Di!;T+i7;U=igHqm~oq8q=4!ix0cp z&NMiqli8pdIpl=`(bAjyLhiu@+T3>tv*=lNDGv^cGZG7oM{J~|YJL4y+z+*o1HB@V zzAP0(t;kRZn+XL|D{NfN?Utdlam^I6$abV8*3NRa7nh6AdoG&A^=>tgPw4n4Wq(TY z=>%7r013zg|K8LC8>)jlACH|v-4`O)M--}Zl^DvMBNj+5QRg>>VDA-KYbV&7BAoMn z5DodG)t*(Sy*E~S{eh3Ft@g>4L;LN6xOhLR>!lM3F}z3Z{NvS$Ne|)+_;f{EIy%sc ziwPFoZ(BXFp47*=;BmhYWF>vCG*v?=vcqGdPR_A!7s*0~cvJYr>HHjk5OIJ)k!U)6io0FMKoiO(68QrsksQo{6C%<^h4mrlkeefvpx zRN+zjCC8!LXQ}&#E$5KN5OuC5b9^@==dM^b{{8VuYp0t*x-tfYQnGB6TKoL|Vkq6g z2;5^%8)aU)g0D96!`Ajh#vTQNjzfB30mV@_MJmv$R7j;Q4mzDulYM{fQoGXgC8bsU ziTFEm|F#gOq;30cq^{O|vl0Irvo*q`)1 z8>!2UnhVu^g~LBtrJjB;0P%=22-7VkyQz@W=De~aZj9d)bj22Z&=9%1oZs$_PjdWY zov!6@&s*7;32lieTvE7?=r^pDT$ioGVp@E*UON2Zg^Z){I}Y@##``{ewi zEKxjP>;=2oet*5q3vlZi(YNAMO+-sTT-%UPGrG#Pa?170a1pDcfud9g`pUFwM0V#?f|*eh4{lv;4;3eno8^$lb=m(8q_%SD>@7 zdF+%+kQ9(0o9x2QVjGJWh~O)1tzZjEu-W+3=y4njJH0&gU!2vwXw{~!rysq4+lr@y zNn?t30FSfjL6!F`N*)i$7kFC zn5|T00!dZeEDNs|JWybw%%NW`tRZ`w&4ri-jDerAd|qXS&(W(vNU%;hD7%cf?BlF51 zfHz-)(4L3hefK3PW++7JCYLqT0G8d5oEx=8L{Z%T$qBmOiBK(ebajQngC8i9#@l@F z#2l=$GR1V=Tuc(&bd9|3WSHp*5Z2$e%=?f;?hrU%nKFV zRQ9muaqhHhhHnuOLDLQ=8Pr+r7k+g3v!q~}?!~@>nb6u25dWvJAw>=HWJNCoqxjPIrDLv_1I&1|`r zf?Bmip(||B#+WSfZ4LgF$5}>Nx%BG~Fw+6@(v>wX;dcfEO{K(GGK^*wnMJf37hO&S zSSg~n8LY4;sT=Nw4$cO9cRyX9Sh^FP!h@zr=qn*tF4A5IX>F%!+<^(7BUO_J20B*W z&6n|)kv3jeb!|vCLS(*>F$9iYPq`~hfX;+T8)zQ4p7UG=R*7kt&{3cn`j4dEwfKSk zdJL4dpi#QxpJ3u%>}6!?J+8Bw%UPm{D~|ZN!m#k03+pMoe)XOvohH)U{6e{^ynC)_ zoAehx6a|oUZf4cNH2*c65E4OwDE#!f>)CEOoj9R$f=vSQr<#dV7v@TO zMQu@JDzXkmysIQ1wSuk0gN4c|b^3_ac)*hUY}WrhM*Xov1pxxIoRH z+9leceFwJu6@eu<4JHxYrIRwwkv4T4oQX6f&n2_L0`kxZ36;2b|~6(x*9$5?Ldt1V+A&n4=$6`x}aqxqtmSE-1% z-=O1duSSr~Nf6U6J+~W$<48;~2XIus!>+{M!g?-Qn*5%n*46RRK$go`w`2Oe5It7sym&{F_}R7{;o@ilL?(?@-sk8?m@`GxkF|Q(lygqn@_SdkhNi_- zn=z|i`XqX^PJ6g|RNz3}>rp8olR^EbXfC;QuY9MN!S%I_rIy44EGY_RuedpH*Jh+- z)Sl&qzvBva{dlUI8Da}xASF|uW;5kJp(Bl8pJ8K%Y3MVN*|5`gfm%MCE_XN?#@5*1 z8{Za-2!=OyxU+!yd@Oia1?^@0VO(uPaWtqIRVs<-rmdImL~{mL8aA3pq(Pci#;SLK z5tyW3VtBeZwj@h#kce(Pr~rLo#^BJHO*h3PBFX4mNR!x9zP)CevzA${x*{ft24}S zPyOh#S|_4Gh2mBVh|lLvD|H1?g)Mrc5nbrUCu|Rq_Q%PxLc*F-as-ae;p^K~x9KOD zI~${k;Lekm{+H)M_gfe}7&}kwJ@7!iN+AK-$oAX9y(eK2NAjIJ6v-vIbhoaim`AIj z1VM_g1Q6Eap0RKsy_xFNO!^Smrc_3^(~0z4ZXs1?i06xf=fEVF*ZSzDj%plQh!m(A zxo;35Gpw~&gND9bWjz`wu~m@PeNQ~^0UW32Kb9%!l4%_{J7ySm%+e@gPy3R5j zcu1({D>1*jpHZ&ZQiG_Kf_-zi_wKBD-kM^j1i~bfR||A4LnWC`PRwx&VcPKL8LhK1t80)tO_%2WUw>s;0N^)r;JHI-jb$=W;xGdt;e zwwHf#WPiqXxpqYtCo@N?6)7K3U#dY^ye#z=!OzESp5^ zFjeB+`(e$v5Rbrl>OY+&>Sy}o3!8#GiNzyJI0Zj$TQZMH@8EMs)+%a0Qzjy)T)WkG zv*QKz*rWiGF4$FsYZnKII>!i z!6VGVIm{9X4G%|s{{Ti9W9&+>ftT?U?@oKh%hRb?SM(T0 zP2jOye&QEs+k}fFT={YyM_09TkrMqAS^34U02?o<)k*d;`!WMNb!idrqn^c&c2$i1 zJ`750{VO70IBI=N7sjS)nud;KEtS=xXTYC>?kov(n%`mnty1D79$0scO<*VZUC_=u zh-16Z81h)0SE}T8&%o|R#+x7Syr_n%$!T3+SYY_9`+BpZ;erG*Y_%2Ip01>u9ABcieWEf1tF%+ zY_B=hti?C9#G7J>ZB>Vm$iVB?4KQBWkAo{tjrceVll)%qEKf2E!_eQkJxPqbqJpL4 zxJNum(;5#Wq%|29p)gd@AWGF@Z9-+A`gV3;=9!7HhoHTB>nFZE?`Fzv7f;>+|!2tkp^S0%R1_4l(Xzb z6o46b*PKAJ1TD{q*Vh*b<`?29Ceui*-&AzmliRAz@P5R1$9yD7nHdc3CJ5Z0X3lrq z`Ak>3YvldfXOl*m?htRM>zcf&lRVrxY`q`!4>0aq=Z>>OkQ($>I4%!KPQWRHzz*`X zm_XBNyAuN762P2gf1b%@{vZDTer6BD8;=v*X}~R>7&R%;T!%7TOZS8wQgp5W~V9Q7qb?;mMCvd%<7N%T>f5 zU0m0+AS-aJPul54F4$jb#+WFAX3&D@m z_R0&LQGh5PKD{<<$x{BLVxl;CkhTT@L{aeVSKL{4uP>RI zN~9DlopgVAo@u~TU@rBL%xW+tBwBae^!Qpd*bVFKXTAM*%oaNt69x;%VqB;iE<6}G zyyZK|>@p=qRZ@%v)`uQG&WTG*#_bINiJhzo9vG{m_?H5RTvr?FT~kX`@ei zge;QcyUJ9QfCsS@L*C^oy;^Ij_j#9}_F=nG8??{+ zP~A1h`a7$z!c&hI6O&R6Q_PtsyKcy23tmZCPvSh*Em^L&H)kL`9tlW=*9zFLz-@oG;hpSQh+@> zG!3YTXr}A2kf8rZI-G3CYUNLjULraOb6m;UOa0+5_k={8hj9YbGIegc5SF$+GJY@q zJ*-j$z9%MQt_? zdiE!_Z%qCL+mjT2a&F%JkP>f(=xYQ?PKC3R$cp=xGAFFWzhBRigan=aDGr^VU;f}; zS!f_7&u@i5os`9NSr_hDtCc*#MKL>59!HeJ_wm^yH3T+#LXhiC9a^39*ab^6p&f^_ zR(ydS%3>9JfvN4k=;UX2A>m9G`km<0>@Z0P zNm8P)MCf%2ha>x9`e`(3_GQlI#wPS>lW)wf&_}e|=y9*NCiej4q=S^>>YHX1Rtk6C z&!MD#pGAm-GACP7;iZUUA@(=R_^+gcn<%Xj#m(jZH_+SU<*{+~xMHgBn~`;h?f{!0 zA|=yO1U5dWC}u{%W1OY8PdeOzR4G>pb7U^Y@?CZn_x7gJv2WaS^eN{pZTziRBv&kX zca)Zvhx9NV8@{FkuEGEb4I4`H`vcp#=JSDkX=!8I8r~kuqp<$!3U+Xh07G{dLRJMcFs1+S*gOxw`h+F-{GN^QPK#mk z!PU}7=dh!rqaDF#3#!H;RuCCJKdt+sp4I!Cbj|*f<4S7%8YKZ9VL&DpK$cKcTV@wE z9q+I_ta6z=wtz2q8|>L_Mp*UNne`=mCJL!Z_#RnN80=@^$lo2f>MXhWkD8H3&O-Y~ zDHyH4j|bRA^jNZ?U=p-Lb(O!gf&Zfn{Ol8hNurwdz0z+c%ho66u*ZY&8TZ{UYegEz znR;KvLg2A_Mmy*FfnX8?qK{p>XXkZcS|8gxtDZaVfr-Us6qZCbD}>{@Zyqb30Xd(L zQ0EsP3nt*R`v+}UH@^1_fS3C}-{=+#cxwQLI-(~$3@_a@nIbZ(_ zG%F-DN>>*R!P$D2IijRI0JD7LUg=y|BuF|`0+F%xJOkmHuZ8=|+vXy$2ioa)qBn#3 zTzgCH=bur}9C0;@nMN)$c}q{VLu`SPh>{0f!u;fK@=oA~oL!yFi$P67n!BXT=(@Pg zHC3y1eO1FTKi8d|7!(C~LM0*``JuaZCCbnIA|p7IW9G`sM9YGnR7Bq=p#}qpmCS?* z$dw!k^e2EvY~Xw+*QR5c}#r~(ZfJr~iow$mc z(z*cLLBJ1KP+%^Ps2_IMbFbD*YVDh&lWnbSK6*v)szV>G8)SM4piJ2`GwImN$(n1d zFQ?O%J2{cO{?m@)%SPdu=KIGXEN>vKrNCNjcw-<2br*Zw_{+moy;2iNKPAD?{xR9f zw+F1jtggXel5_cA`iCLC+W0jbtNqj5YS_FJ7COFwC-6m+z!wcqGs_7}>ZM@7S|pr# z+zfM#abqE^d%s<%cyoJ^6b9z|#qQ{3R@?O@1|+oQ7rXk&w<`Wyz7?)O6yhlAP8Zpe zQQMZqNH*UW*(u-8BA!~>pO!a1$o7Kh`iBVClPjD^gmuAvlz%xst`AC5V03qqtZwkp z%T;UwmpK=y`0yPF+~lV73LIV7WS0U-Nh26MzJfxtUo;sGCh(PwSYFnyV&TwYgvm00C465(iv%*NPVmK}MRv#k<1k>kogbT{otU(st2Bj;WuAs%bICek+l z%`r(6`wGJJon(csn*7M+tkw?9>0S^Ls=buPekpKLqitu z1HZgQh=|XfBR~0y5#(Hl$vfQ^B+4lb_^OKST;`vtuC=K8jP2bQN+(o~pK*v}uFRiP;+ zP{1)m&1srmD)&@K(xaHmG!N%ZGyF8NiDK^DtI-6|yYn@)T{l-Pm`uYk2kq}*=OK7h zIv&ikrn|rB!_H_W^Vvb2aP5g=yEdljOrL(DXg7_nxen7RqxV;|-z~_YtQ8p|HU4th zM?@h6Q_O(>nDqOY&|ksh-{yz__d)tAh~XJGc?|+PZ{?@Ms2*F0{m{)f9EMAtpS^zn zj0{~?8Upvgtx)iy-?X3w84>3Ev4;8Uuuo}bhX^T3`WIKtG583RV50}G zCL92)KmovXI24kO@e8DXW-c3GM2o-tHqDtC@BbC?ItQqQCKG@|aSl*wu9A!MsGlbQ z)~YXkFyQ6*`&RwtDkCu;gDx*XzTKuL7X3-c#Sa^9qt| z|J@qA;yn!euq@Q%JUT{9;RU%PH|E>)^!HE!)F^wL=+QROK&0r83?G@QsZKr+b7PKg zooG7IGX%MdXm4T`$|Xh1xa)GfwuO?T$4P0FN~%+vA- z?P|d-0^4VlX1hY)P<>Xn&H6@V24)aL<3s{3ghXwF=-t~YF(xY;8LUGGV_AM+5?d$_ z+Q;o-;+33bN1ci{wf?EQTVgF^8CF-nn{H~^jXqvL(7OFE{RkBxEr{!O)@jvWw@(U4 zR#L7V|D$$WxuhZnX8npGt+aj+!{I_t-Pa%Z2@hBEa$@H2WI4tT7`*^x-ON@k=7XcU zBxkjqq?cA5E^Fu4O!v8-&tpSbnT`aSUrkrGYSJi-DfUZ}O$nly3$mC(|2sq22HFWG z`BxP?d|U5E=BH$nWc~QtB(uOGDL2;51vOfhA50!up{@2-G9s#VlF!x6?IX{%AtuM^ z2|?i0e%9%E!j-VkDR1$lt1R-OM>x^!QZ2avLNc{F;A!3k|cm^U8mQMrg5B0K~_(n|5|Z#=mw9$Fxk(rX_AxjMZ zqX;f(tpfy)KAEWm&OEE`sn;70y<^Qm&n{FgpC=Z7{`&v>D~QvA_B)i`|HBWt)) z*NLUENza=HggG?d@xjLMs33;l5c!|l8O~y30NSLn%9w(f?+8NhGZ_$38~GZr z%6~S5M0Aq+$QG^+D1n({DoG%_flzt|CO9uu8KwW@96b!+%(NY=^a))Rf1C!CNOK`1 zNRb>K8~|XEM(<{$-%sL{2vkuU=b_YJf@ORV^%q{q2*HD||Nqp!Ddr%f3sjQZW9GSZ zj`mk|dY<|=o44(_Vy>bkvSp;*vsFo~MPZ#M@;^Lnf1Ty*iP!~F6^6iZ-n z#wIKl__Nfnr-ABo`}^M;+~`<8H5TB4Xa4NXscVuN_C6ZuPx57N)WyT)uuBwhf+qpX zko{sLEly7=u?gf^5|Sbn^D1RL_4)EQ1-!dK`!0Y#wl&TCWvEbvwKFC{j)hRj!;PYu zu1WB#X2mE65d*S)BnC(`J9utu%{(x1;l0gwP~^_*+s9u`cVT=b1VddupsL50f zwB6D;4~+1zUiQ0djIZyWfp7@W^RR`TUX(hv|6Au8$M5RNkrdpy*6zxbsh?CtMKS`g@??@?3Lff^q97zu84=XI%1;;tXmt&t?jrhr9T4 z@(PTMj52~%O?06o_p&Y@->FwjWo+HTT5=vGWWYs)e-<wusllSQ1HWH`PSr<2@wUQcS;FHA7Y8CyvVepUnTPQ)>OaGeo_JPj7IFae@ zws!O#5t@Yik-OtOjDyVG<3Vt>wVYB%1#03mkFWjU$%AhJ7r3c?;7m1>a4WL0TviTp&sVtm zzYbsaArfJ@qbkC8>Nd=Bd4NltqU9X=hCM-sLTg#-R1oh~Z%4E?$6h~Aj>()IqXH%} z!dW0%wd)3Jw90ZFj2wb*%lzAHK>?rb9uBu9Dg;%mRVS7bz@6uqnBQJJNx;+7WU4bS zoCOWz(4ZDNUYp^(9iLVJk=;c^_8IDx z*@)=u4#1wC%E?vf5(a9sJ|U*Nl31cvSiTZ*Fg=-hx$a>}qqBRniFpi&OgAJH-T18@ zz2nz6p@=Y%D?=08;lfS@(=QWfV`Da8rD(u4eaT>-AVUAi&Q1>`prM@q;*K3_5yvxw z7jOHPmNWz^%JZy8Y$#}=Q*-#>A&<-vc!ppq)bmQi+|JlFLxqi0s?xQ>2dJW>te$@} z17Qv+S}|@RxsIsBvj*j<5Vih3%Y0_)YCYaZo&El96v5WG75ved{??ouZ9isxs2X_z zPo)8QoYtAK%yJjcr{hz(%BhDgRS*I681sxjhA8F&po_V`8gls^c*)^XM${ANA2#Dn zXB#twtG_?@ac?DSQ#=XM$bl=53@c%MQ8zM0#qG6PvTJ_ef+I;WoENVlR|iQCGM=Mm zzKbr12-83p$ij-|qEYv~0NKJrY%_q6V^uqdacJHdHJf=l734or6PEcUYf;Sg!D^|- zI0dH`DEzCpC_+Cg#`sZzimY4#m#iW(1enGk|EqlG{VCslhhEw2gpa$ye7Mr=F|ks0 ze`}a5W_zubWW*7XE|{G|PNk%%XOWdb-pz*;ca~z_wALHYm~SJ(3xpHA2vM#SKfzb6h3;kRerP?^S{sB>rLts31Bcdp#pdSb2Ilwz-jww8zZ)pk-1cAYx?vTt z=^YwIqzNJA|AAS#p8ey%$mK-3AeziWo}E(^WC^16laQ6^Ds*jVt53A>VmU-OloEo# zPFr?!y0G19Tn#7B>F+F@IBz?-96UYy^<}({ zCX~92O`U5$EXFw{NQxT1ynae^!=%|2pH=~pbwEV^t(B4Pu~stBJpP_4)@l}a*}6Vb z|1Hy^r#X*~Lf1z2%u5-7K&>Brv8Hf@5XbLukj@j2zl<=_O!%bvweD21_=(SiBk$3b z_1!6&No=>_O}p(E3H)Q&t;h1Ja>X(xLH`E<^OyVp literal 0 HcmV?d00001