From 394d5c605c576b8f568a7e1e0c35373b7834c817 Mon Sep 17 00:00:00 2001 From: benjobs Date: Wed, 4 Oct 2023 12:46:59 +0800 Subject: [PATCH] docs improvement --- ...37\344\272\247\345\256\236\350\267\265.md" | 131 +++--------------- ...37\344\272\247\345\256\236\350\267\265.md" | 6 + ...20\347\273\264\345\256\236\350\267\265.md" | 6 + docs/components/TableData.jsx | 49 ++++++- docs/components/data.js | 27 ++-- docs/user-guide/1-deployment.md | 10 +- ...opmentAndDebugging.md => 3-development.md} | 21 ++- .../current/components/TableData.jsx | 48 ++++++- .../current/components/data.js | 26 +++- .../current/user-guide/1-deployment.md | 10 +- ...opmentAndDebugging.md => 3-development.md} | 23 ++- package.json | 18 +-- static/doc/image/streampark_build_success.png | Bin 61813 -> 0 bytes 13 files changed, 194 insertions(+), 181 deletions(-) rename docs/user-guide/{3-localDevelopmentAndDebugging.md => 3-development.md} (71%) rename i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/{3-localDevelopmentAndDebugging.md => 3-development.md} (64%) delete mode 100644 static/doc/image/streampark_build_success.png diff --git "a/blog/StreamPark \345\234\250 Joyme \347\232\204\347\224\237\344\272\247\345\256\236\350\267\265.md" "b/blog/StreamPark \345\234\250 Joyme \347\232\204\347\224\237\344\272\247\345\256\236\350\267\265.md" index 310c83282..5d143500e 100644 --- "a/blog/StreamPark \345\234\250 Joyme \347\232\204\347\224\237\344\272\247\345\256\236\350\267\265.md" +++ "b/blog/StreamPark \345\234\250 Joyme \347\232\204\347\224\237\344\272\247\345\256\236\350\267\265.md" @@ -1,18 +1,22 @@ -# StreamPark 在 Joyme 的生产实践! +--- +slug: streampark-usercase-joyme +title: StreamPark 在 Joyme 的生产实践 +tags: [StreamPark, 生产实践, FlinkSQL] +--- -**摘要:**本文带来 StreamPark 在 Joyme 中的生产实践, 作者是 Joyme 的大数据工程师秦基勇, 主要内容为: +
-1. 遇见StreamPark -2. Flink Sql 作业开发 -3. Custom code 作业开发 -4. 监控告警 -5. 常见问题 -6. 社区印象 -7. 总结 +**摘要:** 本文带来 StreamPark 在 Joyme 中的生产实践, 作者是 Joyme 的大数据工程师秦基勇, 主要内容为: +- 遇见StreamPark +- Flink Sql 作业开发 +- Custom code 作业开发 +- 监控告警 +- 常见问题 +- 社区印象 +- 总结 - -## 01 遇见 StreamPark +## 1 遇见 StreamPark 遇见 StreamPark 是必然的,基于我们现有的实时作业开发模式,不得不寻找一个开源的平台来支撑我司的实时业务。我们的现状如下: @@ -25,7 +29,7 @@ 第一次遇见 StreamPark 就基本确定了,我们根据官网的文档快速进行了部署安装,搭建以后进行了一些操作,界面友好,Flink 多版本支持,权限管理,作业监控等一系列功能已能较好的满足我们的需求,进一步了解到其社区也很活跃,从 1.1.0 版本开始见证了 StreamPark 功能完善的过程,开发团队是非常有追求的,相信会不断的完善。 -## 02 Flink SQL 作业开发 +## 2 Flink SQL 作业开发 Flink Sql 开发模式带来了很大的便利,对于一些简单的指标开发,只需要简单的 Sql 就可以完成,不需要写一行代码。Flink Sql 方便了很多同学的开发工作,毕竟一些做仓库的同学在编写代码方面还是有些难度。 @@ -33,7 +37,7 @@ Flink Sql 开发模式带来了很大的便利,对于一些简单的指标开 Flink Sql 部分,按照 Flink 官网的文档逐步编写逻辑 Sql 即可,对于我司来说,一般就三部分: 接入 Source ,中间逻辑处理,最后 Sink。基本上 Source 都是消费 kafka 的数据,逻辑处理层会有关联 MySQL 去做维表查询,最后 Sink 部分大多是 Es,Redis,MySQL。 -#### **1. 编写SQL** +### **1. 编写SQL** ```sql -- 连接kafka @@ -96,7 +100,7 @@ SELECT Data.uid FROM source_table; ![](/blog/Joyme/application_job.png) -## 03 Custom code 作业开发 +## 3 Custom Code 作业开发 Streaming 作业我们是使用 Flink java 进行开发,将之前 Spark scala,Flink scala,Flink java 的作业进行了重构,然后工程整合到了一起,目的就是为了维护起来方便。Custom code 作业需要提交代码到 Git,然后配置项目: @@ -114,7 +118,7 @@ Streaming 作业我们是使用 Flink java 进行开发,将之前 Spark scala ![](/blog/Joyme/application_interface.png) -## 04 监控告警 +## 4 监控告警 StreamPark 的监控需要在 setting 模块去配置发送邮件的基本信息。 @@ -130,96 +134,7 @@ StreamPark 的监控需要在 setting 模块去配置发送邮件的基本信息 关于报警这一块目前我们基于 StreamPark 的 t_flink_app 表进行了一个定时任务的开发。为什么要这么做?因为发送邮件这种通知,大部分人可能不会去及时去看。所以我们选择监控每个任务的状态去把对应的监控信息发送我们的飞书报警群,这样可以及时发现问题去解决任务。一个简单的 python 脚本,然后配置了 crontab 去定时执行。 -```python - -import MySQLdb -import json -import requests - - -def connect_mysql(): - db = MySQLdb.connect("mysqlhost", "database", "password", "dstream", charset='utf8') - - cursor = db.cursor() - - cursor.execute("select STATE,JOB_NAME,ALERT_EMAIL from t_flink_app where state in (-9,15,8,9)") - - data = cursor.fetchall() - - db.close() - return data - - -def alert( data): - for row in data: - send(row) - - -def send(row): - webhook = '飞书机器人的hook地址' - payload_mes = {undefined - "msg_type": "text", - "content": {undefined - "text": '作业:' + row[1].encode('utf-8') + ',状态:' + row[0].encode('utf-8') - } - } - - state='KILLED' - - if int(row[0].encode('utf-8')) == 8: - state='FAILING' - elif int(row[0].encode('utf-8')) == 9: - state='FAILED' - elif int(row[0].encode('utf-8')) == 15: - state='LOST' - else: - state='KILLED' - - email=row[2] - - if email is None: - email='-' - - payload_mes = {undefined - "msg_type": "post", - "content": {undefined - "post": {undefined - "zh_cn": {undefined - "title": "flink实时作业告警", - "content": [ - [{undefined - "tag": "text", - "text": "作业名称: " + row[1].encode('utf-8') - }], - [ {undefined - "tag": "text", - "text": "作业状态: " + state - }], - [{undefined - "tag": "text", - "text": "报警邮件: " + email.encode('utf-8') - }] - ] - } - } - } - } - headers = {undefined - 'Content-Type': 'application/json' - } - - res = requests.request('POST', webhook, headers=headers, data=json.dumps(payload_mes)) - - print(res.text) - -if __name__ == '__main__': - data = connect_mysql() - alert(data) - print(data) - -``` - -## 05 常见问题 +## 5 常见问题 关于作业的异常问题,我们归纳分析了基本分为这么几种情况: @@ -235,12 +150,12 @@ if __name__ == '__main__': ![](/blog/Joyme/yarn_log.png) -## 06 社区印象 +## 6 社区印象 很多时候我们在 StreamPark 用户群里讨论问题,都会得到社区小伙伴的即时响应。提交的一些 issue 在当下不能解决的,基本也会在下一个版本或者最新的代码分支中进行修复。在群里,我们也看到很多不是社区的小伙伴,也在积极互相帮助去解决问题。群里也有很多其他社区的大佬,很多小伙伴也积极加入了社区的开发工作。整个社区给我的感觉还是很活跃! -## 07 总结 +## 7 总结 -目前我司线上运行 60个实时作业,Flink sql 与 Custom-code 差不多各一半。后续也会有更多的实时任务进行上线。很多同学都会担心 StreamPark 稳不稳定的问题,就我司根据几个月的生产实践而言,StreamPark 只是一个帮助你开发作业,部署,监控和管理的一个平台。到底稳不稳,还是要看自家的 Hadoop yarn 集群稳不稳定(我们用的onyan模式),其实已经跟 StreamPark关系不大了。还有就是你写的 Flink Sql 或者是代码健不健壮。更多的是这两方面应该是大家要考虑的,这两方面没问题再充分利用 StreamPark 的灵活性才能让作业更好的运行,单从一方面说 StreamPark 稳不稳定,实属偏激。 +目前我司线上运行 60 个实时作业,Flink sql 与 Custom-code 差不多各一半。后续也会有更多的实时任务进行上线。很多同学都会担心 StreamPark 稳不稳定的问题,就我司根据几个月的生产实践而言,StreamPark 只是一个帮助你开发作业,部署,监控和管理的一个平台。到底稳不稳,还是要看自家的 Hadoop yarn 集群稳不稳定(我们用的onyan模式),其实已经跟 StreamPark关系不大了。还有就是你写的 Flink Sql 或者是代码健不健壮。更多的是这两方面应该是大家要考虑的,这两方面没问题再充分利用 StreamPark 的灵活性才能让作业更好的运行,单从一方面说 StreamPark 稳不稳定,实属偏激。 以上就是 StreamPark 在乐我无限的全部分享内容,感谢大家看到这里。非常感谢 StreamPark 提供给我们这么优秀的产品,这就是做的利他人之事。从1.0 到 1.2.1 平时遇到那些bug都会被即时的修复,每一个issue都被认真对待。目前我们还是 onyarn的部署模式,重启yarn还是会导致作业的lost状态,重启yarn也不是天天都干的事,关于这个社区也会尽早的会去修复这个问题。相信 StreamPark 会越来越好,未来可期。 \ No newline at end of file diff --git "a/blog/StreamPark \345\234\250\351\241\272\347\275\221\347\247\221\346\212\200\347\232\204\345\244\247\350\247\204\346\250\241\347\224\237\344\272\247\345\256\236\350\267\265.md" "b/blog/StreamPark \345\234\250\351\241\272\347\275\221\347\247\221\346\212\200\347\232\204\345\244\247\350\247\204\346\250\241\347\224\237\344\272\247\345\256\236\350\267\265.md" index e2832fcd9..4d9d330fc 100644 --- "a/blog/StreamPark \345\234\250\351\241\272\347\275\221\347\247\221\346\212\200\347\232\204\345\244\247\350\247\204\346\250\241\347\224\237\344\272\247\345\256\236\350\267\265.md" +++ "b/blog/StreamPark \345\234\250\351\241\272\347\275\221\347\247\221\346\212\200\347\232\204\345\244\247\350\247\204\346\250\241\347\224\237\344\272\247\345\256\236\350\267\265.md" @@ -1,3 +1,9 @@ +--- +slug: streampark-usercase-shunwang +title: StreamPark 在顺网科技的大规模生产实践 +tags: [StreamPark, 生产实践, FlinkSQL] +--- + # StreamPark 在顺网科技的大规模生产实践 ![](/blog/SF/autor.png) diff --git "a/blog/\350\201\224\351\200\232 Flink \345\256\236\346\227\266\350\256\241\347\256\227\345\271\263\345\217\260\345\214\226\350\277\220\347\273\264\345\256\236\350\267\265.md" "b/blog/\350\201\224\351\200\232 Flink \345\256\236\346\227\266\350\256\241\347\256\227\345\271\263\345\217\260\345\214\226\350\277\220\347\273\264\345\256\236\350\267\265.md" index 0ad770c84..c4056d0ed 100644 --- "a/blog/\350\201\224\351\200\232 Flink \345\256\236\346\227\266\350\256\241\347\256\227\345\271\263\345\217\260\345\214\226\350\277\220\347\273\264\345\256\236\350\267\265.md" +++ "b/blog/\350\201\224\351\200\232 Flink \345\256\236\346\227\266\350\256\241\347\256\227\345\271\263\345\217\260\345\214\226\350\277\220\347\273\264\345\256\236\350\267\265.md" @@ -1,3 +1,9 @@ +--- +slug: streampark-usercase-chinaunion +title: 联通 Flink 实时计算平台化运维实践 +tags: [StreamPark, 生产实践, FlinkSQL] +--- + # 联通 Flink 实时计算平台化运维实践 **摘要:**本文整理自联通数科实时计算团队负责人、Apache StreamPark Committer 穆纯进在 Flink Forward Asia 2022 平台建设专场的分享,本篇内容主要分为四个部分: diff --git a/docs/components/TableData.jsx b/docs/components/TableData.jsx index 968be013a..0c47035f6 100644 --- a/docs/components/TableData.jsx +++ b/docs/components/TableData.jsx @@ -326,7 +326,49 @@ const ClientTables = () => { }; -const ClientEnvs = () => { + +const DeploymentEnvs = () => { + return ( + +
+ + + + + + + + + + + { + dataSource.deploymentEnvs.map((item, i) => ( + + + + + + + )) + } + +
ItemVersionRequiredOther
+ {item.name} + {item.version} + { + item.required + ? + + : + + } + {item.other}
+
+ + ); +}; + +const DevelopmentEnvs = () => { return (
@@ -341,7 +383,7 @@ const ClientEnvs = () => { { - dataSource.envs.map((item, i) => ( + dataSource.developmentEnvs.map((item, i) => ( {item.name} @@ -378,5 +420,6 @@ export { ClientFixedDelay, ClientFailureRate, ClientTables, - ClientEnvs + DevelopmentEnvs, + DeploymentEnvs }; diff --git a/docs/components/data.js b/docs/components/data.js index 1caac99df..eff55c88b 100644 --- a/docs/components/data.js +++ b/docs/components/data.js @@ -92,13 +92,24 @@ export default { {name: 'catalog', desc: 'Catalog,Specifies that the will be used during initialization', value: ''}, {name: 'database', desc: 'Database,Specifies that the will be used during initialization', value: ''}, ], - envs: [ - {name: 'Operating System', version: 'Linux', required: true, other: 'UnSupport Windows'}, + + deploymentEnvs: [ + {name: 'OS', version: 'Linux', required: true, other: 'UnSupport Windows'}, {name: 'JAVA', version: '1.8+', required: true, other: null}, - {name: 'Maven', version: '3+', required: false, other: 'Optionally install Maven'}, - {name: 'Node.js', version: '', required: true, other: 'Node environment'}, - {name: 'Flink', version: '1.12.0+', required: true, other: 'The version must be 1.12+'}, - {name: 'Hadoop', version: '2+', required: false, other: 'Optional, If on yarn, hadoop environment is required.'}, - {name: 'MySQL', version: '5.6+', required: false, other: 'Optionally install MySQL'} - ] + {name: 'MySQL', version: '5.6+', required: true, other: null}, + {name: 'Flink', version: '1.12.0+', required: true, other: 'Flink version >= 1.12'}, + {name: 'Hadoop', version: '2+', required: false, other: 'Optional, If on yarn, hadoop envs is required.'}, + ], + + developmentEnvs: [ + {name: 'OS', version: 'Linux', required: false, other: 'Supports Windows, recommended to use Mac/Linux.'}, + {name: 'IDE', version: 'Intellij IDEA', required: false, other: 'Recommended to use Intellij IDEA'}, + {name: 'JAVA', version: '1.8 +', required: true, other: null}, + {name: 'Scala', version: '2.12.x', required: true, other: null}, + {name: 'Nodejs', version: '5.6 +', required: true, other: 'Node >=16.15.1 <= 18, https://nodejs.org'}, + {name: 'pnpm', version: '7.11.2', required: true, other: 'npm install -g pnpm'}, + {name: 'Flink', version: '1.12.0 +', required: true, other: 'Flink >= 1.12, just download and unpack it.'}, + {name: 'MySQL', version: '5.6 +', required: false, other: null}, + {name: 'Hadoop', version: '2 +', required: false, other: 'Optional, If on yarn, hadoop envs is required.'}, + ], } diff --git a/docs/user-guide/1-deployment.md b/docs/user-guide/1-deployment.md index 191f9b2ed..90b576664 100755 --- a/docs/user-guide/1-deployment.md +++ b/docs/user-guide/1-deployment.md @@ -4,7 +4,7 @@ title: 'Platform Deployment' sidebar_position: 1 --- -import { ClientEnvs } from '../components/TableData.jsx'; +import { DeploymentEnvs } from '../components/TableData.jsx'; The overall component stack structure of StreamPark is as follows. It consists of two major parts: streampark-core and streampark-console. streampark-console is a very important module, positioned as a **integrated real-time data platform**, ** streaming data warehouse Platform**, **Low Code**, **Flink & Spark task hosting platform**, can better manage Flink tasks, integrate project compilation, publishing, parameter configuration, startup, savepoint, flame graph ( flame graph ), Flink SQL, monitoring and many other functions are integrated into one, which greatly simplifies the daily operation and maintenance of Flink tasks and integrates many best practices. Its ultimate goal is to create a one-stop big data solution that integrates real-time data warehouses and batches @@ -14,13 +14,7 @@ streampark-console provides an out-of-the-box installation package. Before insta ## Environmental requirements - - -:::tip Notice -The versions before (including) StreamPark 1.2.2 only support `scala 2.11`. Do not check the corresponding `scala` version when using `flink` -Versions after (including) 1.2.3, support both `scala 2.11` and `scala 2.12` versions -::: - + At present, StreamPark has released tasks for Flink, and supports both `Flink on YARN` and `Flink on Kubernetes` modes. diff --git a/docs/user-guide/3-localDevelopmentAndDebugging.md b/docs/user-guide/3-development.md similarity index 71% rename from docs/user-guide/3-localDevelopmentAndDebugging.md rename to docs/user-guide/3-development.md index fa2fbaf3b..d397e3911 100755 --- a/docs/user-guide/3-localDevelopmentAndDebugging.md +++ b/docs/user-guide/3-development.md @@ -1,17 +1,14 @@ --- -id: 'local development and debugging' -title: 'Local Development and Debugging' +id: 'development' +title: 'Development Guide' sidebar_position: 3 --- ### Environment Requirements -- Maven 3.6+ -- nodejs (version >= 16.14) -- npm 7.11.2 ( https://nodejs.org/en/ ) -- pnpm (npm install -g pnpm) -- JDK 1.8+ -- Scala 2.12.x +import { DevelopmentEnvs } from '../components/TableData.jsx'; + + ### Clone the Source Code @@ -26,8 +23,6 @@ cd incubator-streampark/ ./build.sh ``` -![Build Success](/doc/image/streampark_build_success.png) - ### Open the Project Here, we are using `idea` to open the project. @@ -40,12 +35,12 @@ open -a /Applications/IntelliJ\ IDEA\ CE.app/ ./ ```bash cd ./dist -tar -zxvf apache-streampark-2.2.0-SNAPSHOT-incubating-bin.tar.gz +tar -zxvf apache-streampark-2.2.0-incubating-bin.tar.gz ``` ### Copy the Path -Copy the path of the extracted directory, for example: `/Users/user/IdeaProjects/incubator-streampark/dist/apache-streampark_2.12-2.2.0-SNAPSHOT-incubating-bin` +Copy the path of the extracted directory, for example: `${workspace}/incubator-streampark/dist/apache-streampark-2.2.0-incubating-bin` ### Start the Backend Service @@ -58,7 +53,7 @@ Modify the launch configuration Check `Add VM options`, and input the parameter `-Dapp.home=$path`, where `$path` is the path we just copied. ```bash --Dapp.home=/Users/user/IdeaProjects/incubator-streampark/dist/apache-streampark_2.12-2.2.0-SNAPSHOT-incubating-bin +-Dapp.home=${workspace}/incubator-streampark/dist/apache-streampark-2.2.0-incubating-bin ``` ![Streampark Run Config](/doc/image/streampark_run_config.jpeg) diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/TableData.jsx b/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/TableData.jsx index 06a1037e1..0cc6f20ce 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/TableData.jsx +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/TableData.jsx @@ -326,7 +326,7 @@ const ClientTables = () => { }; -const ClientEnvs = () => { +const DeploymentEnvs = () => { return (
@@ -341,7 +341,48 @@ const ClientEnvs = () => { { - dataSource.envs.map((item, i) => ( + dataSource.deploymentEnvs.map((item, i) => ( + + + {item.name} + + {item.version} + + { + item.required + ? + + : + + } + + {item.other} + + )) + } + + +
+ + ); +}; + +const DevelopmentEnvs = () => { + return ( + +
+ + + + + + + + + + + { + dataSource.developmentEnvs.map((item, i) => (
要求版本是否必须其他事项
{item.name} @@ -378,5 +419,6 @@ export { ClientFixedDelay, ClientFailureRate, ClientTables, - ClientEnvs + DevelopmentEnvs, + DeploymentEnvs }; diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/data.js b/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/data.js index 944ac2092..5bce52d93 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/data.js +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/components/data.js @@ -96,13 +96,25 @@ export default { {name: 'catalog', desc: '指定catalog,如指定初始化时会使用到', value: ''}, {name: 'database', desc: '指定database,如指定初始化时会使用到', value: ''}, ], - envs: [ + + deploymentEnvs: [ {name: '操作系统', version: 'Linux', required: true, other: '不支持Window系统'}, {name: 'JAVA', version: '1.8+', required: true, other: null}, - {name: 'Maven', version: '3+', required: false, other: '部署机器可选安装Maven(项目编译会用到)'}, - {name: 'Node.js', version: '', required: true, other: 'NodeJs相关环境'}, - {name: 'Flink', version: '1.12.0+', required: true, other: '版本必须是1.12.x或以上版本,scala版本必须是2.11'}, - {name: 'Hadoop', version: '2+', required: false, other: '可选,如果on yarn则需要hadoop环境,并且配置好相关环境变量'}, - {name: 'MySQL', version: '5.6+', required: false, other: '部署机器或者其他机器安装MySQL'} - ] + {name: 'MySQL', version: '5.6+', required: true, other: '默认使用H2数据库,推荐使用 MySQL'}, + {name: 'Flink', version: '1.12.0+', required: true, other: 'Flink version >= 1.12'}, + {name: 'Hadoop', version: '2+', required: false, other: '可选,如果部署flink on yarn 则需要hadoop环境.'}, + ], + + developmentEnvs: [ + {name: '操作系统', version: 'Linux', required: false, other: '支持 Windows, 推荐使用 Mac/Linux.'}, + {name: 'IDE', version: 'Intellij IDEA', required: false, other: '推荐使用 Intellij IDEA'}, + {name: 'JAVA', version: '1.8 +', required: true, other: null}, + {name: 'Scala', version: '2.12.x', required: true, other: null}, + {name: 'Nodejs', version: '5.6 +', required: true, other: 'Node >=16.15.1 <= 18, https://nodejs.org'}, + {name: 'pnpm', version: '7.11.2', required: true, other: 'npm install -g pnpm'}, + {name: 'Flink', version: '1.12.0 +', required: true, other: 'Flink >= 1.12, 只需要从Flink官网下载解绑即可'}, + {name: 'MySQL', version: '5.6 +', required: false, other: null}, + {name: 'Hadoop', version: '2 +', required: false, other: '可选,如果部署flink on yarn 需要配置hadoop环境变量.'}, + ], + } diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/1-deployment.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/1-deployment.md index a9833c431..5856cd3bf 100755 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/1-deployment.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/1-deployment.md @@ -4,7 +4,7 @@ title: '安装部署' sidebar_position: 1 --- -import { ClientEnvs } from '../components/TableData.jsx'; +import { DeploymentEnvs } from '../components/TableData.jsx'; StreamPark 总体组件栈架构如下, 由 streampark-core 和 streampark-console 两个大的部分组成 , streampark-console 是一个非常重要的模块, 定位是一个**综合实时数据平台**,**流式数仓平台**, **低代码 ( Low Code )**, **Flink & Spark 任务托管平台**,可以较好的管理 Flink 任务,集成了项目编译、发布、参数配置、启动、savepoint,火焰图 ( flame graph ),Flink SQL,监控等诸多功能于一体,大大简化了 Flink 任务的日常操作和维护,融合了诸多最佳实践。其最终目标是打造成一个实时数仓,流批一体的一站式大数据解决方案 @@ -14,13 +14,7 @@ streampark-console 提供了开箱即用的安装包,安装之前对环境有 ## 环境要求 - - -:::tip 注意 -StreamPark 1.2.2之前(包含)的版本,只支持`scala 2.11`,切忌使用`flink`时要检查对应的`scala`版本 -1.2.3之后(包含)的版本,支持 `scala 2.11` 和 `scala 2.12` 两个版本 -::: - + 目前 StreamPark 对 Flink 的任务发布,同时支持 `Flink on YARN` 和 `Flink on Kubernetes` 两种模式。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-localDevelopmentAndDebugging.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-development.md similarity index 64% rename from i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-localDevelopmentAndDebugging.md rename to i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-development.md index 279924473..069431026 100755 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-localDevelopmentAndDebugging.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/user-guide/3-development.md @@ -1,17 +1,14 @@ --- -id: 'local development and debugging' -title: '本地开发调试' +id: 'development' +title: '开发指南' sidebar_position: 3 --- ### 环境要求 -- Maven 3.6+ -- nodejs (version >= 16.14) -- npm 7.11.2 ( https://nodejs.org/en/ ) -- pnpm (npm install -g pnpm) -- JDK 1.8+ -- Scala 2.12.x +import { DevelopmentEnvs } from '../components/TableData.jsx'; + + ### clone源码 @@ -26,8 +23,6 @@ cd incubator-streampark/ ./build.sh ``` -![Build Success](/doc/image/streampark_build_success.png) - ### 打开项目 此处使用`idea`打开项目 @@ -40,16 +35,16 @@ open -a /Applications/IntelliJ\ IDEA\ CE.app/ ./ ```bash cd ./dist -tar -zxvf apache-streampark-2.2.0-SNAPSHOT-incubating-bin.tar.gz +tar -zxvf apache-streampark-2.2.0-incubating-bin.tar.gz ``` ### 复制路径 -复制解压后的目录路径,例:`/Users/user/IdeaProjects/incubator-streampark/dist/apache-streampark_2.12-2.2.0-SNAPSHOT-incubating-bin` +复制解压后的目录路径,例:`${workspace}/incubator-streampark/dist/apache-streampark-2.2.0-incubating-bin` ### 启动后台服务 -找到`streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/StreamParkConsoleBootstrap.java` +找到 `streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/StreamParkConsoleBootstrap.java` 修改启动配置 @@ -58,7 +53,7 @@ tar -zxvf apache-streampark-2.2.0-SNAPSHOT-incubating-bin.tar.gz 勾选`Add VM options`,填写参数`-Dapp.home=$path`,`$path`是我们刚刚复制的路径 ```bash --Dapp.home=/Users/user/IdeaProjects/incubator-streampark/dist/apache-streampark_2.12-2.2.0-SNAPSHOT-incubating-bin +-Dapp.home=${workspace}/incubator-streampark/dist/apache-streampark-2.2.0-incubating-bin ``` ![Streampark Run Config](/doc/image/streampark_run_config.jpeg) diff --git a/package.json b/package.json index 8cc202533..51282403e 100644 --- a/package.json +++ b/package.json @@ -16,25 +16,25 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/plugin-content-docs": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", - "@easyops-cn/docusaurus-search-local": "^0.33.5", + "@docusaurus/core": "2.4.3", + "@docusaurus/plugin-content-docs": "^2.4.3", + "@docusaurus/preset-classic": "2.4.3", + "@easyops-cn/docusaurus-search-local": "^0.36.0", "@mdx-js/react": "^1.6.22", "@svgr/webpack": "^6.2.1", "aos": "^2.3.4", - "clsx": "^1.1.1", + "clsx": "^1.2.1", "file-loader": "^6.2.0", "prism-react-renderer": "^1.3.1", - "react": "^17.0.2", + "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", - "react-dom": "^17.0.2", - "react-tsparticles": "^2.1.4", + "react-dom": "^18.2.0", + "react-tsparticles": "^2.12.2", "sass-loader": "^13.0.2", "url-loader": "^4.1.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", + "@docusaurus/module-type-aliases": "2.4.3", "@tsconfig/docusaurus": "^1.0.4", "docusaurus-plugin-less": "^2.0.2", "less": "^4.1.2", diff --git a/static/doc/image/streampark_build_success.png b/static/doc/image/streampark_build_success.png deleted file mode 100644 index 4b927598461bc14486a4f189453d278952aaeae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61813 zcmZ_0Wk6fc+P90ll+xl53I$4$KyZgbp?E39y%40h2lrCExLdJOthl>taEe>8;0}Sn zoBsE+pS{m{&q+RH*7%w=Yt23P?^+3auOdf?M}>!ifW2g5>2SqcTEG6w(N1QU5oZ~E?oG75?(GYX1-FbWDB8Rfr=g5t`Bf&w!}K@mc6l6`v4|)#je^PVM z{+)`(n}h!EFe?4ujL*UqJdhm)S$))Y(NUP1m=X;I{eLmA_@^k25rGE zCiDaxsYG(bLn5I+>XZ ze~^*=pW?_PF$PN)7YAV=(B0jg)18OY-pK;UEhHoa4rdQL7ZV7FoipRV zD*1OkGGJ#@Co2aRD|OU>nIseaTAx{waHwDPe z$p!rXD&}Hk{{K_#Z_2-l{c~RbYEJZTWy0^RAYdCE87o_`oinm);ygTjqW?7Wf2I7V zqyH)?ZEs`mr0!s13Kr-7pCbPi_5aTOPdnQGX-5Dg_}}gPSIU2t{M&C~RVOPja!CIU z+~0=&uekroFADrSs{b|0|GI?##3HYuIG!l*f9HcZ9`0IhjnfO)LmpWQjsH8@+SzzvA(_~)OsBf==2fOj zky57cW#^FGsg0Rg{^a_N_T=d+qQ=9Y|E}zT+%ad*zDOzcgZD!{xwzjYY$lPA^b+BN zPW6?4*=4F~MpJKwe&gZp7#Kmu0Rsua6i%%Ya3HXxnRfyxuQSz5ruToSXS)*q!c#Zd zG$%cNCGIkk##eIitDA@~N4N6R+s5@T)Zuxk(OMmMuNJPme(bjj(2a#Qx5;nP3$rX* zIFH1K7$jd&-te2;oi^)8Oq{#Ms>K%(lhf`Rkn47o={HX1DrJke(g8~Rl-rd0jKz~2 zly7sT2Za{B%Az^>O_r=Dk3F@0s>{j!fJe+Le=N?k+NyX@w_C3SafyO=r}lZ3B@%yR z8Bfz*7^1_lwY=y)&NXB|p!Cs&uab9wxx zx7i8yk;rIu{_|ph1tJY_-We-v0}Ma`XVX8L4^E2unx1l zj*9!rv!A39c+^05MpD&-_`;R6iA7I3Jg0D3^oNsyem$YmM1z|LBibi^gKYh?&>Wt?qPi9^(ZuSTobBOZIqN!ViXoX?kDVQ@A^0E?xzw`8f6TYv>FiHLIS_Zf>Zi zh?D?S{O;iF(B7{ZUSZc(PjcbxFBU{fN-E7%A^mfq?*ISjnI@{w-YSorquIupdP{|nQ@Yt}gqCJ5aF`kiDxvW2Bw_#r^HhZP8ZC<8yCN+bZJ7eMZns)Be5R=v|OyF3&1_wjL%U zCpS46JnH3;6RPGhTb-p5)QmhW0n_yX;7=G!miFy!Y>an4)=zt%eZ2_B4A)tm z+86`(<=U1*Tl*4cgmd=Y5(ROL#KTS1VclZ%XeA~-*~iSPrz=)PnM2k_cMDZpNqV!~ zh^zYcGQg|}*5NlC_^O#W4E`G+{u59RS-7sf!f1jY~C#7o@93qyA=DJ?S8eBo2s znl#1r+eQA{$mwS` z<23MM3lj+GY;YqQ%cXV|22~Q)Bz-&iiMf-UsFiI{IM623QMvIQkjO{UlE6AOoFGJ< zT%2yBRd{$`^E0emq&m+afz?@{>{?Ub(No89CKcS9Sd^?GVDLeB$~-|QluobEuF*@! zah-VRCpG759%6`EYTXXWItfD%kAif0*Xt_B2a+B&Ia-a>`!H4S@7|XsMjY655M!a6 zwIDX}A%?Z}oKpI-U1t##Mjr~sH(kaz&*Ux|i2EswWcO>-`ooH+$mkks-CdUTJHsq1 z+TgIWRH%2M@CvQ_Qsrx`-v{I>cnN}+=yUYKtd&;|H(Wo;)pa_EUoUK8FO7vhhuF7X z&Ypz;y>orX-EX&&=PK`a<#NgM?gK5JK;xjWTJ%jrb=kgnUcx-=1MYqrbrXrJ$`}po z*D3T~oyupVkL&Khi2Z~_c)plbrEU&z*Jd(K@NN)C#gsu$bSOt5I|!~m*Hdhu4jrIf z^|_dzR{hob_R$R3u-5UoDe;hZf735fUeYOcz2wZXr2IR$`pr{)mZexZI-M__odJc( ztp{MfukmVIyV<9a7Sn4rLP_R+W0$wz$yQq5n}O_zAF<16-IOchP0tkFm>NVWMj|HIiakzJWg8L(k5$ zA6rCsgrLO`A*RmhzH(^B#mXA@;04@p83lW+XRvrdO)At+I&md5n&^6jTmIec=sS>n)~H02Ri$a0UgX1F`=gf-;$mtTc{caL z+2iIaDR*RP7Fm?yqMy)vMIpm_D<4i*orXDF+b&;}9CKX!0&nY19es{096V#};c6+} z!jM+P;8G`hC{)URoUZzO>I&WiJ``awWfIoo;dQM8+uM~^PvyZ|$9~V&T`b=|(NMHZ z@30tzK32Ohh)AQ0I961z&w^oni^vtuj{hH_p-$4Y>;KHRc(k#@=3xn^3gkU;`?~FTH!+#%syR^+;{c@ zum85DNX#};JlbTX#iKUn94gT+I~>gZ>1}pf-Ky`MLJ`5UqAf$;R}qm>ZJ2I-d|#6j z@Hr{TOSEMvv!o7}liidS%DyXqj{vqc2-{q0?n1sCTYgjFqg-3|J|B&kX*n|9vt=CdKTes~_+_A76P{rG!t{kw4<%9rr3 znukIJXY>}Gq(bqTzRu#~>2*pO=pSXCaEqZudXdXManxkx5n$bVpjOcF)tVEsROflf zvou(Q$F`={Iu+#z|Hs*%YhRLv;; z(!a?IBvg8MB_JMF|`zP5$8ZT2~MeOX`5ev;lahtYk z((OP@;#I5koq4FQTdm_!iG|;Y$-MbFN~?>3S4@HEbtAOwJV$;i=lnu|&Q^+NVHDt^ z`jT;#`1qx^7#`=dOe#P~eqmoY6BAjGp6mV$ct}>S_e$;0wxwngj+=0`z-t~ip&F&t zt+g8(szZk3q9@;X?A|!bzS)%hv{+1v1@^(q`&7ULG1<*8rv!L~P4-cQTG3Fk$QuU- zRc1Wt26oJQ9k)hk6xYcCd|Z@SotuJ(_Buv!N&d8WoWtS_D;fHVgJ!7PO`J@0&iDqt$7vr>m5G;)+?D!Vi? zhwqN`B`l_8t)}B!c+s4Y9L*kcOZ1Jsx8=xfj{UWh_)CsM$4@kCnwlYc+I0;HQQOH? z=M&3iS$d47PEgl%&M!TowdGUG-#4l>m$ZglCD^vg*}B0xs@KKMBCw7S%l)LOS=FP2 zvW@EAfEQB(@KORA#bW|px1&jhj>gNtSf^t`sh!Cm%_XYK-#dib2Gb~{nSZ}_O^y~v z?5S3u4*t5u<`Anjjx}gOntHHWAsP2uwuY>;graGoF1M8I)YII%tXtFy1aiK26%CCc zw_!%bZduR_0KYKew~QmWIqW*?iF9=4z#7D@kQ5bqkx7il>_Vu48Ah`*J-Uf{96K)`WcSnt3T}R?G;NMZX#z#0Hac^H*RNwS7xv3(`g|5fmao zlqyQ0XN{%{RGeX}o)!-B1jKi}a9}`_a)2{2ww$nIQR;ByWG^x6jvt}3=+mUyU@t#; zvO#%|MjR52;~=CMpUkKkN_PL!kJs}(9mfr3vgf>ix?NK-)=x7GBIuwj%8Qgk4!CrT zvAkaup7A(t7TtsvD!$lo4s`{F|4q+C+#LiHuuEld^-b*lB6N(HO<7QGpzQ$rNk2{9hVg^L-rQfWt3nZ^n%!uAjt6a-A{-(c|Ek3A2M{OfF-_lsPszdD z#tGtTa!UnLo>meek`D%Xl7k5!W5W!C)eZ}dR-hbGXCSI8F|c2>`|5D_Iz;H6>8t&6Ce_caEP zmi&Up!7Xw`wLjaBD@^@N%4I|$*h3U|`_j3-qW zvHcM*%~$c1B;!O2`Be zrxj##rUKA%NmT@Mv49}p0w|SXa8}j@5}>B&yQg$zO*rwj&m6BaN;Wz49TN8w9U1 z%AZ5cJFJ+H4;9QIPunC!yO& zy@RjW{I$573u%O2LPu{9n9%Z9^X}@hqo;GSQGRWXum9q-&JGMe6KJ;xy zRC*>2P1FaM*6iw$-JD?9gCK95yC@gsB;XTm4uK!I#1+n-9fH#StVuKX(Wh{QR^=@F z$WFfgc9cd6c@2(+nib{5PsBS0O!@q}=%@MC+9~Z5)D5^Hm*s!GlX7)p=2s<2CbDgB z?{|{7$f5|N%vvKCl~=6OnPY59yLZV1Gq?t-@G6sWZVBi#m>`tvIQvuk9q_@L-pOXe z6Qv`x{e!y6aTP-_5ePXtjmz13_`px3E4qpP zsHy5>C!bFk z+|ENaWuMYtwndBC_M=N%zX^IL)^=C}ud^P8H8b{P(&^y|y|6Z*h{Mr7+q_MWWpYoR ziKvLFusc>ampHB%I@WI)AGS9cK5er!>$`p$a_} z4q@!ztrIe5d*})4OL)5xs1?BC*cE_X*CqJ2*sBDQUyXk{{+KX1boF?j{ir?_1s`~z zTY%@fUl7YWn!PMwJ5};$-n=09J0;g(zL6KN;+afkaJsiA18wAdkiA{gu2w#$L7*|r z6GArzGJcDo{S2+);KTx<|iPB1yi<$0~0>L;Pn zPznoJsrL<*nEUP4xE63^4a%%hhT3`?d#+#bmFB1$%UKB7gRX4w#WdxBqRD5(k0->J zI!|w+UaV)`^so?xctO2Z)WNAW+<|m5&oXlKBsq4;wLb?L!n3k@J$EIO%Q()TOLWFk zQvhr+MbJQ^ZyAN~3~kznaBd-2VMISv8<0NUiGXaE7k7C;$m9XAKfy&LO)n5s6IXfa zh~Ywe#6GWT7~{_S;BmgKAvB=GD)czLj!Q{c!jt6d@OTsRsIAo%U(DDn<)AYclN2_s zlPF+SOy2s~m4G9Q!F8UsKgB9SM-nZJmdsS& z*d^P29#a3q%dqI+A_F20suIba1^2ct?>P0rvcz-+n(8LZ$C3)V4j^XaZrz!0j2H&y z&0-oJTd+9Rp@0UfgfVf~Yq@1JJddIg7W8D>y^I`b2R}2>JNayz)hfl?5gLOy?#CiO zc+qF_D%GaLVLW5@*Dq0ie{c@WkkTG?L>vmY&uwik^O z{Ur$Ezn%jO>$zSwf?=|Y39;Z@S2bC>ulB3#%|$LSjZGtrH;Pbk*1-JD;gRJm5@L)B z_F>K&SsjmFD=A6$bSy$mNmAC}u2|naMWdf8Ir$x({*u_Gq$ZM0OP6}; zdc`Aiq!UKkAlX-|(Qf+`flKr133ksKp6`+cFDnJz!iEE}*yJf5(;!C{4Pc1?guYB% z#QmKV>C(qkK}BP#WEl(tHE9+nGy(`{b~o->3vdI7E>vqMNDGwiqd$a4vKJ9#hw2x+ z%G_+nEm-Yoc*J0V6 zGCE_ovX6c%mNvMU^yMLn4e)BGLD@S#Yv~l_7>t`vT#?oQ!qOB!vC!qaeBrU<5yuP_ z&5tDCrFTD!ACvO7T#*B&QsvR3(%paSj9&@CR}qyD+At)Iu2vPK6rfDX&m|wLjm+V` z-!ggtk5UZi56%9$x1QXg;WRzJPqF_#fy;~AVfOYi6J!zr;_8;}TlkHkbg~a zcnDcA8u(Huh}cT)*|2)#W%TL-(a$=jb5uVi#c`0#CgqdzIP zHW&EDaRQ9=u5295Ma+0}Ft!LdUvDv*g3yd(K|pW8b{wC|`rOx|5o8 zm_1MUZh9G_X=Y63%FQm!2P4`~P`<|V{C@PsC~`V9Q0Rs0;^k~F=@T>t9s1Pg4&m%k zULYRJ`KugktJ6hZUvjy%nR?FMk)qd4zp)-!$lIcQr;1%UjBVfI^K+=|v3r4iQ{-Uk zb!G{@OO^h-Kn$r}N7d~(-}B;ayi7U9?0)fcN*e>tv)$xA$4D)@oc_zMTLVTo5Z z?1Ef_#C0y;3#N{37r$=pzBQ$xHXR%PXeuMjTc%@X!SK6y)i+#z9I@e3lPa9{sBQ#B z|N6%(!n1QYV}P+d+Fpnw>WMJ?EBmMU*K`oktKX(018VgAeRLOvGQ>yF`=x?~#_I{N+vM$=iR_St{<}|rj&*DG2PLdK_ z2FO~FvMgD0t9TDMUSB27!OHkC4VmAZvF(S_rX$QnYGB#Yy+MUEk=fmys;)Olhn;zE zA0e<5kirrodXO5Co1LfV%VIbG%$3G+_HwdZ_0T85w3QHh4;vG$t`ICp^otq?AoRI@<>GfU<^VB|rE2D_v9CnKcYw z7k)}Wbl)|{jx-?4-n^K4e@ zN+2@H*Oj<)u0aYLT*@A4)9odw*&#|Pw<4*fx@Q5GKn=gOi00iI9&27r5Xsa?I~-3I zwpaP(?!rKhyKq(QYTQA@2E%l8NR!*nMw?A$#gN^L5kCna{+Mn{6Qr=}|7GG=)dl@G zRIX`FfPsv`W($88fy4AxBiZPFu=T7!rHl{Xy_ylD-s`L@`Irl+I1-;s!F#^`y^)Un|#Urdk#|Dw_#@9&6Cu(zcuoF&jG-NYxd zpXa3Y-bFP)E0sX3yKlUrJo##6UqSMIUry24M!CTz{g(%Cw7JN&SH-gRhHI;M0f3|R zo~9>x#g_#QTQ*y$+%Uy3V{~82A&hO2zao97^%AKQMdiV5rt*1?!Hd3g9u>F(KYUgI z$G`uMd%t1w=7AT@#+#I{FdcYf@(Tx3Vyx?+eZ`*L(NGc=+Nv_sh*ZLa%;ZB_Gvd(L znbIKl6yK{Urb92q3cCt6ec(!qim<^>%5psYFQ4L*+csrBL;q=koB)&wTpLNs#$qqt zhyXqY^O_57(5z(s*nf-u z4-`W5{#HRLwM@;NZGI=_(+drYCI6-Y{-ytSY$l=GN}e}7S60;i4=G?N#HB`5gE}fB zG*f5&A5H+Nebm!fqNnwjS?YHEB?|tRAqaEIA+%&3Dy}p5?@CS@wj`;?MeW{BJ)QkG zYw#CEP)b0y$)l!Hd-(sTq@M$O!GGJ4EiLKSe|OUOI}OE6x2JC{mtW&J@sg;f1blN2 zExld)UVDOD?MvN%RnlQ5IDSzdlMJZMBtXQ-EV`cl!z8o_Iq#R%m$#E0^jgmuxEow2 z2eoGIzW`q#6m@nI3lv(9iuY$D9{^<~wwtt1C+vM*$YH!!8Rxd1Ev=eT5t(Ug<%NoH zGQ%fjPQ=4=Mv8Q%FITK*C8&0ksV?VY#s()RXwJ<{=4ySMX^`5_Y)CXS;ToXasOhNp zPCKe%kd#+h(>;ANg}|Opv4Oe5IUup7*=}}IwcSe@Ub`1!H7l_1>3C@qE#?EZ z+8FgZbbLxf;YxfjJr&7wJo7Uq?P|sP_%qDYzjpmIGzdm@9p7aRc+Qe9Ruj2S^D%kA zGuoxkE2D)ki_YW4g|fhM&B|3taYS*pn89@`4OV@*tB(kkle&aqWK%bh$h4+mum=L! zb0!_EfGa}F77;6?Xi;L1@_a&Z2^@c<7ep)B`xw)Rd~{ZBlsE0k2#f1QZUg2yt1OzmI4EfUBR=HJU;kNOKtm|kA3 z$>pt;bWG`~Wp46?c-P$SmzAx&FR>Tp#ig06Un?5PIi<+1cd4j|oJ~ebBxK7jQLzK{ z-||dEMfcI==-{TRyFD^@`!fZ9_z(5fuIHF_-G3~+TM-3EUBt;A z81B^)4v4-TK8_m#IWp0{pnQ?z`u;FSt7P}aC>LHQ) zc;`1Jv@;!Y2XCK?71CEkQ{3A&!#UbLl(uQOX4VNIZA2M?7PUj7u$zUlod zXK%LIHrq?)kpcr+Hlsy`Ld7p~g-P~@S+y#VK)`u9$hNta(Gs^TTuI4dJEQ8NR5e*+ zE<8w2gxea1-j(NBfP9N#>)kU9o|Tg?0@L*= zAkM(53ZFyk#1|>G$8C2>NOgN~Yv1V6)76`Rtb2-A#_D&PY`e~COH788>*$?4zqU)u z!(~N<{WIk}ZzQmiVDG(24L;rIo%zadl8)dz7ST!;jM58!{1;=e$iE&R?b|S6z6Crh>K4@nkt=^f-ROVdn+#hZ!(xcl7? z`&<-OPfk>Bf>~}FBUX2S+>Op~?JCyAMIIp)Y;H=X%pgme3SSEScwf)6ziQ<{>-9=v zKaD%=D93Sa6ba4f7~T$PX@*w(m9eyt*97pfjqlEGb{mcE_2)+1MN1V`Nu&;v4FfPaisRkRX|XS6(Xt5soN-hSrc9bT?r>UE}&anUUd;vPDe7p6V;`T(ZlM zfmU<^^&8A>*?&NRjflL5me{J!s{$K8?V^$SrUZ@3?Y8sD4|We=b~gsWRO;*5pUp2} zW5-yz4kHVK!hmJVU+WITw`u@E0V49tC%R*V8I^8J4!+a03pwXioV1J^hmL_%53cK7 zAt82CQ)lgRRAoYRm}Z`%>My7Ofu`SX&fYD^?#xG_qXr}{0?IgKMmtU zW!QDkyaH?c?S2@UGQ9f=m^1XU^*Hug)w6};8=eFPxVTrkJjR5VdhB;PXL9A>lrp_+ zhAlV`hqFQ1)y+fr-y%7JEk&y2WC~HcR&%0?g2$NodJG(I zp~x~Sz~~aYmLDz*`B|<5mEg}9JZ!$#%T=EzLcrS({RviHbZUzd!C$ZksUcs&hX`ZapNGkTU6y>y&j@F(CfF%!E%PjwX#%AJOU&TvK zxlLCI$Io65w>!zIzGv}U7gMSgsY2IjOzU@p74zlS8PWP~^I#3xzjV$JQu7-6OBz@y zXYASx(MFqq6dHVMUK-KNSVsW+Oj|N|(7%@#H@CVpV-=15g>9%_KK_-y`QC>Dd?EA5 z8*p}Vomo_H6V)9Fz>zz!WP3YN5)%=*v|SVcIjWjLKWPvzLTNsblZ*;Y9RQ(57vITe zPJJ)(0A=T$8MP-Up>&JTKwMGzm4Y!G=G|ca?Zmr_;Cs%tn~m2JH8|eU;_zKv)o6$P z7@LV=3D1QdVq(hp;99#nW1s2oDEmX1)#nf5URb?W7(aox;&WTkBA67+x+to6P9rvZAhLp5B|iAjRr zw;uArF)E`NV);kkcI}}ZLNIabe(8q^tp|SF?r(+CCA+)BMh|CBNULQwI5;H2gKdD4 z|M7QvFpoVZs7f{tcRLXi525M4U{#d3Bk_1ULw5EY?eE=QiDkByby;c=wU{lH6H3e_ zcNtr!VsK_kF}lDv+(Dqs4~p$qupA7J@cU4xf87i+-6=}cAQ@m6+a%?CwP(|y@&3sd z_jv>uu7aJENS;YE{lzW#+h<%`J?EWE@E}y;>0$S)_ZR6 zA;GnFyfCRA?K}6Z`PlhJLm^$3wGn3McN$^zv2P!^|NaU&jeZKFq%tVH*)=Z3 zqx|z1+IpKEZZoo#++W2QZqq-Nbyf3PKYAAo^wK$0r48j^NHQm{q{7d|4>ThjXSH54 z^o?8&CmGRdhtCL?OWo%SI_RW^N4F!VoQ7!7Lf&A5nR%&=5TQcj?RI)h!Q5#t#r9~r zmX+XsY4vO91(OKo3QVin=n+2W`ZRY2Zy68$F|zk(TK5ZV*FkdIvS(w0n~_LzqyD2u z!IYE{nc#)A>>mX(OVmZ`o0m%Guk=zuXzh;=cXN^f@zRPzT|>d=8&5DjkpjN$jFD5X zdTJ(8V6KlQr}3pm*Y$oTg^_kpoR_+^hffE3?J~DRdkm4AF>rv>@Y>m4Dr@cW(0Z?& zXK8t`rO#HZX-PEfh+j8Kua8il2NO}Sp%09Uou@)eO_ei4B@|)FjK51N+M05P?-K%s zlqfPC?Hrwu%L9&$j+bN5iH#9j6Q|A3$^npqLfCO%=JdDmx zkAwy6dP}ZE8c}o~3%=*4zzO0)4ei1Uki+x0MqZiG?rsg zVO?O6^O)t|mU&UIjX0y6AT+AFFA@h@yB=M*@J^ipf752O`}uaj<4wP-_@cPam~)o8 zEw_X{==ELF%g zYo?6AwhXo%%KeOjYXroq=|w=d{xq5(L{jeJHG???rsRS;=*^#uGEsF8$^illHzd=j zz!P@W=S<$=l1lmN}0-2 zF5rc4N%ck_kD3U0tA~fD<8*CxFIJ5NW#dIrunL=DXC#NzSr@iLAJI;W!;vPPgD$QA zlz?0y(ywRK(aC69B;jyFxC3DVzf1wqc}+6Y3gxN)VmirTv^|G=O(2 za9Klp!oIKJC$HD~nxYnY7qiQ>ovJKK*sjk6Z4n772%FpdZ&nzZY)5S1y-X>^2L76n zmG6oXIp!Lo*;5tela!kf-iXFH=kTK{RhI-iBDPkCZ9GA^^#tM;>eq%Pbn;8?NRK{M zjx6EtdbvC+e$=oDLvQgup>GZ*f*jg~@v&fM-gFR2ku{U8}|EP&Q|yi!9C!%j%1on1sZ+jJek6&fX_-63cq~a6q0A zx@>m5D3ZH};So$xh_LB?dDqeD&uv#eMIWYem`GYE8E|U$ggXs=i=uQ0=Nk%!T=0u; z0Y<#T?{t}*!~;pYmXS>HXOvG{thG@p(Z@*q_p>VqBZ5dJn4313bTpw8HaC>P9U_t~ zk~5+?hbBy<#noBdC03f#{~3;aj2ji;6K*O88hS76^l+(kF3nqH8*IH;q;E(AL^EpP zWvRUfN_Jz5#vh{MlRsE8qU8Re;m$C7b(kuM$(*6y9te=f*NFwBS_o@Ma+U5T#}@$W zUPMCw^kpL55)Ph{|_C@2? z6GHgx=UMPY-J(<}KdzbLKR+K`GF=_1G;s(zX_RQFH+he~|K{_l{^-w;cFw75(W=GQ zUrU&}{>-==7$s$%hYYlRJ4&d6UzIekS7X&0)Qp;9>el;FFns=F!xdJ2y_Vh4=Zr!? zi|wDA5nzqQ7Sf;d0Yy)I(r5waNzL^ka7-Pruq)@7Em^iOnIaHnbX5e%E_EJzmq(gW zQRo=Cpf`~x=TyhHujo(DoHzr$K7TAY+aJ~_|vmE{Bw&RX6P z9oL-QOA%*&SY;HD7CHNuj9*AFRqdbc3DZ>ZX~E4QZm`wDc{33vkh-Ac38%eeNsnEm z(PWxzfFoarK(}_lBlqD-jVFgoQ~Qo{6DxGTO{VG8-LtemkdLr#L1WYoq2}ZYa;XO_ zk9t{>8vj=5;Za#^HKz|A`{UQeoPlkPB%(B>Hveu;(vZ}F6G2~6K)RQvU$`@z9^X~P zW@jzNRxV&}uhRJa$vb1YXtQvwwY4HsO>fQoD!xAJyLYWhh4fR90afAU-|2`{oZ3*^An*<&;w)>fL_M~PC8l*T%@Ni_4JBCi9slDh;t~8frG7r-97U$L9pN#~j&KPZTQoezwm2FP z_7cpF*>K(!6B!lP&cQW1VED~H2TT_l;NLgmUrmaalUS=74`lRtAHNcop(>n1sq>sI zIq`HrQ28|R;AX+q;!9DLtfFPd5N10k4-rH@6=bTSz~WoxA|4SWXuz`CoKAAv8YV73(<^=jP%q6FZKwZiHjv-_511v^W0TUgb?=j= zRN<1#Ax^-MvG)XQf)i)D-Xcg%!Y2K?q?@Gs(%tXc-I}ufp#J*ZsTsj|%9sN6p17bG z4|>Iem*dqW?wA+?|6A#an1xAtP#kY&avdVP(up8p4!h0dtrx(@sjY7<^#!UwJ9>de zsOs$+d5g|dzvx~cQEp15*HwQ?y(1K^f~tc^CD#7bVBjccICLaeg+LnvSwNa=gHXij z4H`MiZ#G61b*#wlYP_c?e*sBD#Umk3IUTW1DeW{`jnH=JZJL5f^g*8e1EPrQW--s`T_iMQ#+h3HD z9|nHaOWaIkn!Z8zechKJoKiC#et8qhdH*tq;DmJfFX+M(^Yk9Xq(}FAbZE&}js4B1 zearae?zc7{mt}2*U6ZiwH;0LH#{x-^xPkuk$MTnj;-YPtNW%{D3!+vZTG@2tmSE4a zTPb5j z><4HD+&~P`*|R_81@Z_{OENf^0u{xpQ2g_PMq%x1t@9ER+lMv532 zn?JAbirVS|i6_Y*zv%2DM8dG!y7j>l%z9XQooY&0airScxX)Sty4NmeaXxJ)S?L{W zZqr=WgBMg(VOaF};;x=%hUHNF=Dg{b{v$sJ<=wXs>{P zyWP)@{?x0WGJVkHb*Usos5*d{>2ebK>J7LgK8#P^>6qbBoD?B5ABcFkF$wC#hnPyB|l5jAMU2Vs6&l3 z@auayREOx3zrh)QCB74P0b^8*rloy$$6@cG=qe0}A;)9P791RNe(QiIxOTQqAV|IF zsd-x$zDDmi$4oEu@K+N>q}fjCFma4BHhF^c>Fm7)W!WI6^?~wPxlG{ith1xU{rNgh1Dzm2vt zwd|4y5(oYR9_;9z0emza{!ZGhikwbC4$e513o!|+lW~)E6W37kn=sk4K6HTXs5B*+ zw_Kiwi3;8W<$|goe2UNV`#FrX+&wy#vF_X~pi07p|8AI@ZwqDYrUTY}Gved2#}?sy zLdwwxRf$DUOPDUWEW7LXyYCk+@^YlQHdV9GSjjIiym-K$oj;m4tN-BUX~%k=y^5p_ zDF4z1*mmXVsNi{n0^dZ>2eox=M&ot!q$M&avFxu(-lu+T=3>A#WD!w7qt*$}$X5%K zq+aQEQ&%Wu8MT20u9jE{x_Oa>yNN&sxdb7}KBRM61!_J1RQx(1y-7;Fz3C3%B7}7P zcqy;2p0^S9HOlX>cX4F>HaT-O%RZYIXzBqzOi3WreG1k5E~XhK(bfiVWOq%vaJhbS zJWOlWmkuKxH9sHHf!k>5ePsJkmAB3-L=2Q=EHZt+Kk<=cZ(CO@B>|SVj7g<8^+Uh& zz7xV&;Idt0nO%+2IhV|L%Jc2B3r*syHzJi9>8jd(5P{Wa+<#m7Spwxy7g#8aWN)qi zMB_oPS)_Q(N}Rev@{&XBE+6DIbPDd{JgtSzRKB^toEsiuQ^8jhF9R*$E%~#2z`-hO z%Vktwb7vg~>M_C;H}@KGWz$Y@A~tu-@^jK<+3$Mr*&M%YLmv*HKi31N@ILx!E;!)k z3u*!0Z0Ee9km9~L5-Ji6|Eh`CW_5GXYn)dcHud^xOWkg8Gj4JXvx-`yg|f_$X3evB z&~*@Mgev64xM|J=H;DysQ)(W;`Sq&mqp!P+zd6&G)U7Rv4|TkxqQtI}?>;~kG&67t zmwjr;#++xtJwUADbV6?dRI$ZWYHT9MfnSlX%!|uJtde%3^Tq*mza$z8*J7drS%z|P zzYVmoGA=5^_qOV-p^+5b%`2DX+`6JW3EuLV^rYVMjU{qC%jez-u!52JbKhPc5Fe3L zmbG_HS&-qyZfIVgYHw@slpm>zQTN)ef246Vv7z@H_px?E;Y+!{uMhw~GAbTfGB^|W zP`kshsmktcI3~!Eq`|I0=9GjXp34a8Iq>rJ-ROfT{+86G6rzA;L=Na zCfaYK(7t79N-SK0Md98f{dzP{ZL|#}ZkhC}$2`-Fm7kc&X^pA+uT(x@P9=C3w zEUZ3DFn1q5V?gN%P`B(ATMi8rh&sTRck2=@#Sw6W))su!C4x;pE&r)F3|{sxv^TJM zKR~6N{|(=7ID3tj)*$)Kqb=*AceMQAE9M7xtx02RsO(X=UOMN=Di|67IP|S#*WHj@>0i37*DT1yiN$ zndp`X$EUpbWcic(4AU?2Xl$NSTd9i*9=&xZn^#)=LOy=+ibSwrRddp^b+wGOx#na zENdT+c}jWrV7Ayrm6Y+0)+J^}9)|Y(56D-Jbv^I)TlwjFZ=N-He|awG**_l~6u(5t zeLq%58bazYQ4t(OU3!Yk4B{GqOVz|7slz-!Wu(i;J~~^)x?;^Qt9dr&%F+pADn@Sf z0l7wWU+~5oZVI>68TL!1^0h`ra)T_@0wb0!6HxE=E=3sO*drc=vd3^1x`?AStS2MOrR zUrnF*O}VSAUPp{Dh0DO$O(*+^ndL-m$xN*=w!U#B=qoP#y(gxIJ<*K-4vW5c5S+^2 zZud|QZD*V)&&dFS#?rQCDq%=eLM@{jZQvu36&>n4E{HW~|AcmPSylLMLXhqNVoHG} zVd))YT;(%+J;b_?y`0USakUR>`?EuDpdcJbg=qQre*x4e>Zb1?-&@~AYLvb8F$&ghLG-V1d)=?p*v;h?(UAEyF*}Tcpui@ zYrFp6-%oQK_c8O#)AtqU`MU{T#DAERFAFan@d#q=DJDhfdXh4h!mD|-{AH@KOE~)1 zM-8}rimXb5UXoy*=M_qQUsNXtI*ZLC{sRSgYT>V-hyAT8;EQ{Jop#pb9&evrKb-cr z;v^)Ejk`#Y^tnCno4g^PlMiY52LYgk#)m`n^Mgxq)QgBN7wYlt`m2YwWJRpqa?6Q- zxB4rIT!?G{Z2$?Pu&Lz#7#_sag*+ElHGl(F#nwtdek9i zc^oGlC}+=D#LWH=XBHb-f>!>N7Kg>od(*IyhJhII^>|3~dh)Af613XBlZrV#EJj>C z$%cJnegU-lJVt4z!CwzamhQHHs|%VAM#_WpTwD09ZG7DI`zQEA)#`9-#2y`?Y-LSy zzeqnLkSeG{Bi2SbZq{V@?!(Xh%AU-0MT`qT>vOZ4(3+@1Pqs-?M~Y9AQ`VE1ScjM+NRy(dDl!p?+_fYQI=C zcB$m%(ePc7?6Wu@Ezs&$rcXfg&rsX;r3h1OT!Xi>6i?V)4~fcXHnN8Fm{^9?hq5{- zT7xba?z<7KmE)&tB6M9E-H+_kw3j~uEy!({nqcuvx3~!&hFH&lY3%7nyv-8Yp=@2W zZ!)WioM#c6P7A<tAve6|&NHD2O4&9ltsUkJYM`RC>7MbZD{(i|UuAoIz5VN< z^@)3seDBLDa5wn^{G*1tp)7&)C5id^P`Bmoh_4OuMcCYgv1*NiS}25eRyTL3lrgvX zH15!2->LX{?VJ5wn$^Nwe-t9R`0#Fi16a^h+uT0EG=*Fxynyv(VD$cge%?5Ddg)_t zz4Ip>x+Rtj8|S)8IySrRAVxfa^&)4wP)Z4y_oz0@189gBhiAy$xLDt& zY~P6{)-MWxj9g7sjlS?;ey8W(p8!pL-P*7o}svL2g@n+=6Z z($4N$7?nAoyKTNQU_~`Xt`_?1Rl#^OD4^UXb^4N6zgc?fcC`uGoZ5~7nRw^Qgb9qE zJY2T49F+HvY+kKLcw=}WAtJj0PE4A=2?ZNPyP$X-wdR|tGBy8inm}90+O=OfRjC

?uf0bJ?;6DGpbSi88qRiWK4!G5OAaa}wHlMD$Ihz%G zO2Vp<1(EXH*lt?Q7C4tZ?60S5npM>=k(Y_Y>=g4}|-3RQqwug<}&5iMvb{?{`RC4P;H8M>H^?8zv&*Q`KV<}dCFs=+1 z<0&dnd(}M*s-8-aW;Z5^tJ);l!-bT0tLb(-xNqEKzdlLb!}nZaf1Y(?4}vQA{eIG$k{@HJKVqC)67hJ-eGVj41H{=}nCdnU~h(j*H;< zUo8$qJTlC{MWAlSLl#+iK*Pr6FLZVL!SV5S>zd@C8!V~0iyW}s3^w^@AggpD;YCAZ zzVcCRZA|hoF%98?LO(1BVL`2Y39Ys(KF;pUm7IMxu|ZaTky7z;;K*ZfGeIuV%+l(N z%nCWiid%5+`8HKUEX0zDVHCx_@fO|DMbfsG84ysx_V!Q}SDtmdq`=0W46&$;i{*R#HjUjnwd3^#PpRkDrM)ZlcfSV)0DGGj>I$9i>5sx} zfI~uU?tO0)g}}3VW;Py-Q`9=Bl0Va8jy8MYf*{cN(OfP-=!47ecHHJ)u+y;!ugVwf zF0%L|d}o8@8G+I@*}iNrd+k# zT!_)D&^i0O+`Vn;ky5Y{woYCVV=0(&E}y2ayj2=DHOsX|U+T#<5VI(`>e81^6SRew zl9x(35{l2DUpza?nNOkf8hQ7tgkEGYS7$`LKZ zs_SZonG15cj8d=DCTF$0QsQ##w#OivH4Nv@4c{jxy_T2*+QjBRB}d>Ht{MP27mhDV z)^f^oeFVk%9eEBwWNiF^EHezyX=t^57std&b%56HNGxvCj;Jb0)BV_fX9VuasHmM| zxLo~%^&`w0G{S#L&*VNg@Rdx|O~_nZj2k2O>sKRTCl@t< z)}+{fVbaOb>6Bw(uaHNtvp{pnKtRK~<-|(Ge)4@+V9~KPz@3JdNU?uV;s)i*mKAYZ z_ggUJt`y0I5g)&(fo3l?oe?e)i>K)J+b|$;RKZ2u z*;OAjbLytvok34732zbgzaHL#Xqzg|@>EN?Tejt&NqU(Ij@I#%cC%_M~vI-N%#= z)oOjej2c`SX6$D^$N@}7Hq)9Ws;RpJ8}RaK^OB-ksHW6}U$B`@*l?l;v#Aj8+sy9f z?LM?zbusOAQZq$o)!=bn+cNSV{Q3kIF@45s;j!1+M#pNXgz}1CJvV$|R|Jb1F~m50 zXitw<-0AMjNZM*1Jo@@35wwF7s_qb$|gRD&$h6rMu`|K=r3 zZ>HGzlruIz-YCT}9PtDd(xMki_fnoyFASfb99M9J9}KBNxN`=V_^MM#kP=1HS;+lT ziW>?PO|)qyi@o9&Fm1-ts%qYm`F{G#am4QhLx^7-lpN{D?fqUHA~-lJ#O%u3O)g@G zDOmy$#5CvZ=C%6_fRVYQx^$O#a{eKpLFW zN5O{qFuk4~-S!d{gz(&9HW}ky6P#Vs>0L{K)yv!$_xqm&i?_I~0}o&Kqnm@lxH09L zc`0^Mo6mGN?v7`iTiov%bXwwEBaHI8#oy9AX&;a@9QRd0{ejwXH07Que~TZ;X+!9T zLitlQbC10=5=nY!l0|BDq>*f0EyU!4$xD7TelhXElyg`oW&*TXb}PP!(<`F$;mn4w z4v|wme)oy;cc(eco3Wp)aD9kS{#iE`_fFG*Sz`Y6d?S(*7i9rxSAb5rdzX8}RgPUN zg)zhCr9M7wxcbQ#P=3kO&Xa`hHmfm(LUgSdX=yLgPEjRr6o&fEZ$jfe=Js|<8-SK- z(KgFX2rY&yYhHjpHK`vfR>+2Tj0LPrPTEd(Gx->fa(iQ;f=L3f z79yXS1P1Mm25(;(DE-70u#xIU%R^4#LZDeW2Uk*iy0Rs<*}~x1?|s)>SBO+rvgxR* z2VW5s7x#VW399zu+I@|WUn6-?$Mzz)Twi4;uet95P-ogLZhdglrg4!#JV8SJK@PT; z|44?lnuLWr%WaY{`tAz*>VuencTYw#IzUv3-~05v`x6NZUy3cyo$k`Pe+RCOU$v0U zi4n0YAMlbd3mjSKzn#yPIn#_4SQ|9h}u6q9nYcDAd zbsQV-T0A6zO4=JPdO*LCZ!RHG@O=8x>L6L|S6du=84uZ+RC-RtD7{wBDWkN=mD~N$yVYUgCb6 zY3GBdU7B3^t)C0eWEtB9!v%|NyR>sM7sA0F0`5sNmfx#0)>ZdgUvWDh)Hk0Kz2O`k z$`iNnwL1fOYw(7c+qyWf@;R4{#8*v+N0tPFbS?o6!S}b00AiuI*MwZKOk9xSDOsB>t1eDZtCx(>Zd)BzW=6O1j;qtqjlNYzHo=wBrk<0mFO?-nR#Tg@)%b1>N1aItZDTZ{V(g@px4+~1Y#1FLSM zPsHjpu5P41+5JfedYQfY^cY`GgK0MtT{qizo8%zVcUZqO>9#5aCI#2=NAe+U@|W~R zkd{fT`!OL+h5NP7d=mPh&zGv@76*fG>yELyDt7hS=;0W{CTCoBnh95VS#%wxAjN7^76^jngV18J{ z9XUPEQr0mF6q_<2OZ2DR!3W1xfsO|w>Ca0G>|K|~JU$#hE zC73(0&1ya4TQo*D3Z9KQ-C`rmCcf?UYKuQZlk2_oB_c`z`ps{vyy#0b zvAku3WTsR&dG-629u* z|Ita1YhhRJ#6QPSuxSQ>GI0oxQCpvpcV-GfV}GV;z@+B9X5r33nUUb9BzP8-ukqs8H!r?RnZicObH!qhyUGBu*3)xqA&q%6g?jnjmthW{5PR=Qt zAc3^)8gFo2C`iz^Y4`ekbv3wtW?Ayu2PvxcDp9Es>$W{Z^SUv)0MG%Z9J)mkl}J2& z9e6n~Pt0fXW8-Cl;i64m3^-gtE!W8{n&t~PYD8y^OBy5I_ZvUoKjQ7#(Hr)B5V{nN zTkkJ(PV=8*^Gjm5JdR;N`yS+Be;@S^l%dO3g#vvVHud zD;eZREwgK_(btKYLogap2-2_W1wlBlp2%WmdPR*@OFl2_x$~741Ztc1cpfcq;DzSIA+{n}iD zOXX+ez%cqcY7$xj6ANDCRWNEbl8OPnNl&+N`oWdJLTK-?sF;b)OR9c{S>4`}XCsm} zBx=fMvSJK)gU_vbet&?F0I0LpsYNfTo(Wk85-F-{{}TANpLh=g|e)WYju4IcG{iSB+v`*-8bq#5=zVi+0k}F^~5Km zOyNHXz#=FyEp%WZgdU8u z0u-ws6P{eV=y^Z!8P5Ie(O)gGZ>PE6L?eHNQ5U^L)A>QJGyHItdW-Y1o5F^rId@on z#qlbrluA&?@gk_*Td&?95M!iM zPD7Fp@KI`9x)Hsg%Bf`q4&l=o_Bu0L+{Z)M&uUzg?7uZm$c+l}Y|lq}nMm?G2pSMo zmD`xEv8lu3LLMv@{+3L-)k8ZIYpLA^xg!FzCsO26b`*beDK_5E^K`l=e2F~^7#fI4JS9Z0`OMAHn*G+Go0kQ~LNjhml5Z4> zU-hKwGfXFq7%tH<*%VnKeF*vopgdIkS8K(aca~`??>;mkyz)ORDu#H2>H0Jx+y`TY7u@3YMp`ftKMIuh;-h3t=fFOhjQJ<2Jj*d^Q@9CveQ?7IC8{c zsn=1KV-r(ixH;4EcUWc8#?V-<%!!Tu(S z`R(@PuCW3Ko@Wyqus5L5;Z8Pn#O)mRq3q!AS<2teGj0Xw| z_=cz~T)>xA7d?}673ekbtkV6yzZu{OA=ciPl-48ZbO_gbNke%2I&D$PqoY9idCFB+ z#P8OjQyFPKJ@TCsnSr~k^~5-ah9l!X%eO80MI%e_3wK#?jBw$oPPCgxMbD3#^FxBX zIF&B_@}VA;M}>^o?W%egsh106t$H%64W+@&M|i*=5L9;NjlbsVSd6{3ew7?H?B&RL zK|I%*?0_S`6V%1FY&7;I(ts|u#4vddnMclfPG!#Be)(OnrT(YgkTha4#1X=A>n&iBU?p=B^ zo}q5kl?}R}c;;C)nIu;0;DsO_6-U7=^Vn;2@P!8bAX`h&HEp>|(P?8>&CUJA)1kb` zoJG=IE&Io{{E#v!n9>`e@h4Dl#hUNRF0UX1-$p;=KwXc4u8fPJScJ2S@ki(P;5VTn zMTq41do_)l45|_-3D)h|HU~`oUuMrbEDAtkJ#pXR&7$EBZ1Nj&N@PF$KTs{dqXCJd3Cl zM@p4-2F*s-+ep%sjh|c>Od9^m%!(GANnH3cb@7!p!#g+$QF`sFE8T+Y;^;aoZGa=> zvGO;PW$G=nK)8k&@JNw=%1hT2yuaE>C6oBIW}e{3dfDoF6inXDgz$(*%F~)iSYw?z zMn1>uhBOR&-+XtS_UPIL_`&hn1Zu~6@YeWs>jDR=(NZ&l(NHLgP?7L1E2F!1zIDV0 ze9~hg`V1#vD4geZ6UFyQ*?KIEyZu?zb8vdmd0WqwlJg2RXvtDD-2SW_&rl!ORwpAP>I$+`uNjD*h5ImpG3sNpYv!y=@P3z(3RZA8 zHZ>0O*qD+F9`-U0kZT5|dfiikn;a#TNrFXAY!Ca$yVR>V7wO=FY(9CR8<)#S8GR`g zWFQ$1Urw5HxJ2^GJnFvsT2n#_8Y@u51$-H!NiJMh0D%l};)#i_5Er4;me(Vh!ZXpW zY2u?J_$%`msKo^lHcZBCrM=V`03eYayrcU1$es7 zG%TrZ4lEh{Y?DK>sZ_q=4Z*F?r4Xq8oMAq%wLvZCCZwkP{V@Z0A(8fj;CE!w6@}9~1H>nZv5BwH`}EsOxXWW9MjN zhR)oZ;!n2Ro@CT$MwuLOn|$91sEe_j!5+p7jkLgL zeI_dSS=KFubJGW>QI4x8rlIs#S<1yU;w}V)`1} z!11%DH8>OvcLLq2q<)M`UayH#gA~j^yZk}xX6j3^LPdE`!IN*U%2H zBH9ItU!8!KZe*51;+;MItjK}P@)H36VhdOkw zLtD3gK3&QBNMWQ`t%%)s;%mG7fPb6}_gb=i&&MC9jr%yxY8(BXwBe3dYSCen7e?kW z{vo^`J4?Dh8fNMwPcB~eP7L!tn8Ne4OSWA)5dACb+^xS&=FGN`fGp10C#c|SF4Fmd zdFS&2nV24A{_jkCK~t0-$ILxPUV^EmC~~zV$hD4L!Ksck9XEt(HH@CVn(AOYz~Js6 z2QSwWJ+&;M{fp z_|~g-@0E;0BBlDG>mtb??LsRl3*wcQfVwOF{o#6WknFOxZTn?}`itsTm9(CEyzeEs z)&Bw}2#TRe;PI(R`uETY&U9T0!Y~KcW0M(l{)jTtH(NR_xz;5`%a`67}G%SdxSQSwH?{WVporOQw z#FF)&?=m1h=syj6f5-&9fd3wUVXMD_zJEQ{ezz$sXmh4hRRZ`<|>#Sm|O`Bit@)o;VL*s_s`96G7@ z{-{}HG?}Ampsx(aojILTj<;G!mgN`!|Jh?;)rn)ddFN%%{r%pigx>(1mu}{>y(}s% z0DldQmo2`h^^3%o-ZPg2T4M!7#F|cJHFL4UDK3b&d#a+ICQd2t>rNG&MT+8af*4HU zKRB<36O@;$`B`3D2Q)tp6D+t?eX9v=2I}6W;zC1DFnQ!A%Z52w_oaX9T<&b`)2%-m z_EtMJUYzLx?(Y5lp8b#vwK979)caBv#|BSw30E=*#VL{;{5$E98x>8*3vSR6^P}GG z;9~LL4ezNC+_*aNrUsxXZU8jJ{hpfQi!{2=N#}^HX~7&>#h-1wG=KYF#sZyjZDYZ+ zP8P=yoq^uHO%P~B%W2xAe{%CO9%|jvbT`m)C;jBL?MJ3g88tS3sJ$pB{uh`-gBtDC zD^vZ7iPh_uo%>jami#E2JPFs2XlMK!@6I=X%LG{ZvrT>sWX7F@jZ}is!(+eegDOSRSwI!8prbMG?P|+}+(aYVHrw;B@%T-kiwqQRpzf7)UazLkE zN)Kc)^}wP8MNjAo(yX%|bfx(Ye(sg~Pl&v@C%{82&hXXm0VdL{oSNZyZGp$@k(pEe z)IAu`^8Yor^2^UOP5>obRc( zxD~fNG0i=m&}{dpg@*F1ii)V7>&qPkqrH_eE*dVtnjrD`?)pT-h%6zO?+A1dA zj4W)nEh2$bsTDM~EphXVO5v`bBZjE_H{Wm@ZL_eDFg`p2AZxC^Lh@x+2&B>MxG5{6 z!OWBo$@k}9>~d&711=@z1;uWiOt#I`DjMXE!=ArIHZx{pL5dhe;!X+pd9nnBEjd>? zgX&o-?A8f6BV38nVjR!rTxTj{v18%Q?``P}%`)C)nsLlWio(QBfE~=ZYQCZ+q{?b{C`zc0sGO;MJMUu&Gy!v*E` zM(zVu*w7+>B#B9u>HSR8@I$SmU0mv<&TW@sq!XdIIjH4g{DySJt@!=BxB6YmiG3!9 z?@|g@Q-SiV)t$Yj@TY{v^766o2-0YAv%DTZRKioJzzu9{*+w~1#}ZOy$xIM~0*50F zrnze3DA~hmBx#6Q!s|H8Y2Cb~wITGQ!{Fzeg9`1Fusa>4qOqhxxBS>)31@ zz8oO`pYMM0+M|gJF5HKF1?le(g;%~&(sCwX$GFcftKT4&P>$Oi{iqm;`hM}xu<^J7 z&vH|lBYwL~7W&(hmyt;>nKq*tk)#_iy3U(*PuPCj4R_W>AUYw{jOiE9;Tti>>)4r3-B4zgt@&kN7x-gqr`e=5?wasxR68 zgZ`V}&cDbvPW8p>9BcdyvTAn!b6`)$hluN&iAf;i*Gcp;5~DYS!IAiLN~7aH+iJz+ z3c&0wAt!FfsW>|K}vFAQ9alab<9y_w+J2JRQ{Ed*jQ9VIw?& z@R8B!&(J5*XVh##4|sLo{%mj*0Zz`e{;%GyKSMS<XKvV!xoJ^*S&W*Ggh|b=qwVeO8I5O4 zisiekT|z(u*;!dx13jb(h5A%OJ9KZ1V9Yg453XfybuZQ84XaX#wJA!m%i;wE*k-3V z^5Q$-h#DiHst5MJ5H%Y~(xm&=oaSwBteM=UXTS8sMI(Tk9sfBsXmD_%$g(`(xI|Wy z{w`cS3v~Y!UguJJ-NsoY+04=w3CLF_<-^@sd`kQae~T7=BPD*5Os{l-H?)@WBh{C6 zL2_GkdAuss1L2aBY&#Rxi0_ZbwmA;xv(XZfA|;fSqd(iUA;2mvGg+TxAx4Y!j+^9S zQUZm0FfLbip>fOk!lNKM)#)NPPb*_%=Z(R`3X%?!BK4D5T9|WgWvLUdCf4rDg`u0* z*7D$HVa(mYtB(QwZw@}1U~`yx^S(i={uo`{o808x5?{E*Yy(Na#oR&$fBq6(Dr`cXL-MnOh_ zy&@1TqqREZ0>Wa{f?#|~c;2|+VoycMxYyrk(xfHK?bYJ$HG$^&jM06geNOL>o(h)h zGh{QOSaJ#svZ<=QzG4dxaibN?cZMSpy=#I-IiM0JQAeS7g)u*6cm&_F7orG{l`9(! zz(t~3=l_!N#bXP@#J>*?V0*=`OAU=Pb(b#!f4zKDl>^dIi!;oFA@DlWt6yVj7LXQH zE6CSiR9l9Ks0rqw|5jO36Z~v6xGQS(qvJ}RI@_x=)xd|#(uH@=um!nLd4Fo#Vy>{d z*o%sehEh{@{iRWeD$HW~d#0#M|M`UIKTlYzuUI-oMutILYHt>@e0{gSGrfma6m&*% z=$w_Z!q7i^$yJ1hvv9j8KSsndOXZx9Di%vVYOp&8me`AuBTUXar;_Y2=&b~YdZli;r8n1D8kZ`_t@gwa{9|nf3(ERE&E= zdVj6IzTtkGyfh${BWC@bh2lyxAJd(|fP*C}$c5~EBX`v5U6Cr2 zh;dowg(=enEktu4Jt0X!I3tqC(tCpM(0%n(Wx5)h1>ZC2^;=XoA)>Fbm9GQ^-X20< zLrxD9z(k}K(U*pmB%MZ!1DZvGcN$gB?!wbeF|lK$Obiw8BgBlR&09o}u{#SKvtW9X z_&i0on-=())$ffPrf?j#KvLCTV^0!fpxU>7QDqPl%x-tv|2?+!aQyb7QX)$Br167$ z&N(-~lw*GawOiaHr64u(U@rn31-KZ?Wg6A>2F zs_-RcOzX!ls$=2Tj$7mH1FTDF&Jj#p(rDvNP<1r__g^O(~m z#ITx|jcA#iedf2S>Lm;7{%ADah{5gtjz4A;yrX>3GHp2no91JJcxtMlwNSjhr+V+J zOPYcy)6vpc0>^P!Ve)rj(a1OF zQ+xf(w?+&+@L#hYXij~Rb_prj4tz8+vb6TAH!TWO{KVfB8oE!%b-VUPHgVaxR`$*!d;%#>&!oUl;_hlTUf` z`rQYNzf$<2TxIXgUiQ$bOPi_p&XvDc2=*WAV=f^Sc_H&!TduvC;mi?VJU)<&GUta- z)azBJk1Y0*fAN};sh zEIKgS7zF-*y{mEH_^H`I^xyI^swCg<79=@9c;tous>>9~5w_pUt(DqXm-Z) zX${g$*T~Tn*~(af4DjudPDCW?dN}CFO9TcZD6Yg@dpYPPIm<4Q$lDY~lRd8?N?2b@ zHaHehn$CaSr#FN!eiZ)hL4V^p9pxv65nn48jC7duX`k@=v|C=11 z2Yie`mW|UcQLaz*McKqLmp!K}=hT~Q$cb;FV(;3BQQ4jp5Tm$RLop;;8(@YqSp&Gnq7tb{F<#Rh_0u9_4hRt1eCY zHpRSWLs&taH}*<t z@B)~2$b`A8>mXZJZP&pZx!FQ>B!TsOn4yXM>zO;H(S8NwA-0#`M!em=H^cYfS0{qx zTuwEc`8#&Z65okTQ#8o|a(TtXwb^24tG9#!GKUTIY(qGm1uV65OX%Pm#nMuK zPRe)|>8!;WAEo&Du!WAUvp;6r%1}U?V<=PB)GE^WaIG+dI)N*$?LhN=V?p*<%$2KT zmRsm>QoFqsZS%+9^SyVd>gjgOAz3kk>- z4n`ET=&5ef`9!qWM0;NIC8`5GdKg@^D)CQ`+8@4p!FFyy;GO)U!qIZrU!;GiPMx)I!^eN~@sCraKf#CYSlREI-tXiwjr3 z3ibPUq-0bJt0I%n5W&*{>UOF&!#{trkBG!-{CKCCpdC@e5bB}^evM)k6nM3ge|?Yb zl@$p0%xsxxb8GUITAdwSh{Is;kB@O2bOav}%IUTpEN$DvNYu z6ysX+@v9m~BmS=LS+P|W(>;|4gnguFSQOLxbI$$lfs90SwK%^QmT~mF(CahWp>H%X zmTLH($FrrF#0U+Nw{pHFzq35Fw}R=t*~}yHDk!n%Ac~SGig}w~sTGqN4`Pwz_x?4( zali%Riw}+K87fC$XAu;rNDcFy$<*y+h8)EEZI7feT`sv>pRc>&*eO_B#9t~*~?7Tyf5_mVQ5JIeww|_RDMtQRS?l%5iQ=X`c1Ur;=d=P_fn=;Z<~CdBlh=3k~8ph zRHUdCYhVs|a(|>+S3IrV8k=e>B(AEeVlilkzuo-u9mnZJhFTjAs?KT`-jW@?tbWg5 z5W!%p^rlREc(`;gb{v03@9N>>4!uQ(An!j(<1Ho-&%U_dC^5P+;A5b_B|6Bn4AP^6 zaVop3Y5f&sjxvb!z2Y8D`-w)~7tJ{xNm4Ql0wF|DVWW1?gNB{>SU2N`cdx zUh;?-pzftnZM8@XFo0u4LvUy^#;Cu{pnoS>A6!o?p`d8cP74Q5BZ^I8usg{P)CuG+*(nNb=0aNINa89C*g zcR;qP$?ci5wA~I6AiHEf1;~Zr#&hTO0ohyWWDn;j&l$)glhogz!ah5#*w9e4*cR*H z#04YA9B~T*YubEs?H>s?)%|_kk@4t>G^jFET~%iS?b##$p= zT6&#=+vCS(+Xmre_VSNzAtnC%gU`T3!ZL*77)+BBWJ)3@o=kj6z<4&nvjJ2ib=Ie66iH;2FRML?LwGDr{5HQu;d7h5F z=9=G+NB+8xCe(6axYP)kL$2*Je=Uits;R1iTL2tG*40J53ji_XtQi-a0_D^ zgQB#4E1heC<&R{optq>QrVF*UcI#oB^Aw@1x>a9epIDA!EH6Po)jB5a{=kHaP|(Xm zKt0Hu{aO{cbDnaE|EIrn;=cN8KSP1ScXqi5YZ(Xu%ZpUfZwHw$S2 zRXQ&^&R|=XQ3IutxW2=hWvggagQi-G-y3~)hgCCMP`VfclHxa+VBGV!ynFds8&T4XeKnUrZ=oOX^w^u1#n6BLJSU=iV%_qZ;2lGzD@y^W z%#37kPEmP}tXM^bc1|;+ui5!)K;TY@m@G%xXueD_miPQWEP!EnUbzTVZHEiUugU-{ zW2N=NsF7q2OGsbPNN+*{&0=hqBXDx5$P@8bE=9!xf&>D9;`e2IXy>uMNrs%!n-9Dg zEboj@AJ{oL<1NYnpNUhPIXb>vaC<@*biagNALoQ&QgYef;{N91x*3rdJFF^9YE?MbE`o{-VFg zP;M3Ey33n(^|--|bR^6UpNZmAJvi?@PS3hV;`x!zVYk1;JC=_7UlXK!Y4N%rzuh_m@UFc7v}Z%e=I+T_YW=w8`)Cb=AB-Fg5LHQd0XcH+X#5*VA5?O zq7uV%?#SdnW10$ggJ!)#aytcjK;Ne5^Tf<+_Q~J8uM;s~(KWsGMI`yv$!q6cZ3$J= z51Bgg{u4c&V2Y)i2E5?w)n0X$fB!S_h+=iV?e?1Vns*lSx67}N_*58cZ|U$q2f4G3 z^d@X{lv-kNNiorXLb-P!HK)|y(7$HyPgy#M1J3=(P@wYAVgH|W_bEPm9}E=Nqeg50 zThM>{xOoW_$Zz^3>cD??NZ~aQ;!$SU`u=m&KvaYc#DV9rk#@X)x(n$Pz)z)w*Wv!e zXFGIHkslrTrqiFv`lBT9)0lv6gg<{Us*dsgy2I^G=>yYCK`ZB9K$!Q}9uV;TJSq9} zm+(LwMnJ;)!C^-MpVc_@Uh4#Q2z?^+k1-+cE03bsHhe; zY*?kcq-5xp?h;TK8tIglM!FkmknR@glnzPhmhMg&T43mU_nhZB&pF>(-@o_A`;Rq? znAv-?_kCUW73eTPLZZF6P-PUj448>0XJ-k76=eox9@6}%0fJq^wb7B0RYi~OXl(gE zW9khsrbYo{>IQ5~Eda(;KIazsMYUD-JG+99e}Wj|jWN{ZtQLkRZ^xhFhaCE)SLoZR z1}X7qGxlPk@hRmBDnKRjzo*pJ(>~TL0!-)WVr565!D0N%0%_PF@TPYFt7I)QR?Rx| zmNH4^0$^Weq5tZhdk;826K7{<+o&+7!{_qafIgM?Kq{u<{Nv@N>&*t1pT)e3d0O

EnbEe`tw9#8k@W4n2(otT;S5V=|##yuBc;}T=RjKantc~p(oDubrQD`obnEIvJ-Mb5=mk2bvYLy7PX zY6%g$?4m)d;%mg{_;l*AIA{p%3B;x%;K1*;WR}7MeIf1Z$n&t_iTMRVzy4gwjm7|c!uRJPr z(rPOtq87pa5*4!6pNzDUMod2+(KHgP|QeK(KzU#553Pur`n{lK`8tQV`Gx z27vx+Gaqr$hR{ z5Fe84bwLVm_@>wcG36e9V6HYa`MAZpM9|My4DY1m1u`GGz zI*p_I&T}fD?d#Jmmaey6tzuqaB#RR?gX;hZbP7G}AehOa@au9Ro6nxy@9T-cyijIC zG#5$}py?xSL2d;QlE{$x-8+;Go8LanRQk?@kxgJAE7@goT~L6;L(r=mG%NLOws*>F zM>!)q>{nYoUiik!hi%>LX500P%T^(vw*x&C^VhI3*Fz_)=QGN%4YSv(Lq91&TR`gD zo>75a5HY{~w`HJaLUPEWObx}y?2tmvuutIma|H9l7N9SIg|okU9z8s$W4s@buk@^n z^CMxrq5&-J%`@H6tLqv=3Tr3-c{q-H!F&2H@p`Zehg)&YpfqG71~MbdGy}(Hod5&^2@MZphbaD zU@MZ#S{r^h@?6}{4Xr<3vFmJD$F9wk23TVs9k^j=Z6t-zaU zMvZx_Gz6|c6l+Lg;?AK35`6(-I9lSEor3xuj)(KrXMmFuElwnva1X8FZ!V9Y8ylh> zREU;==jo;zVoF0Rte&8ty!%S7bjHNM(PH2H$smq^R>DT{QAs78%~&E!9e|51Pkj8m z726I9V3sg5Y@-eb$9jbxg#M6jYEih4oo6phf(ex|k(B@}&=!k>@y^b^XQe)U%i+2% z6azp~e49OIN)%GVDQu0VsnpT@UC3JF@Ab~o!xlk)_op=3I-cD+L>AVqtRfR`< z^wwg)<{jTeeuiE90*DiwU(|pk)I~sAhgR(l6n|VfLa_;@k@<1d#T1~C4|Q@hg{dsD z=($#~I2>C6@SK5P+p_1ucQc_Ip6NTFPsqwgg6)O}{COx&_AI9ZeG`e5c@O}X4k3e+ z1#(gAap&T>4o3ddV(itV@%VjhfB2sc|8oV}+hfmH21y!IQ;~j;|L~YDVOTD=QQDLX z<3TKHPDo#k`?o?!*>AO-pT2HEQH4M;6>v)S?)<8`c)InqZ-Te_C$e zFoAyQ$GcIA6z1CMd!(HGWB!-jk+w))5ILiFeDLwr9j*peufYTVVJhwa;6Ma&CUz)n zCp3N=HENiv+9c0soP1%$FGw1n2Hhc)6k8_N{qECJMoO|-qTR!t`%i^-k*JQi?z(dJ|)w^hmp!fI4Efee;vI)Ee8)^}Bx%Nc{ zcmt?il9@6Eih|q!=)+jo$rR0V+jSknfx6^lIehTnsrS$izL|#GD4;Q1*N?yQcOnxY zYr^qFQq5C~PN&1jzRQkJzY1FUY9m@)Bqx&=HOzfmBm26Kv`n8(O8>gLE!HoAo_qh> zV#6Nkd%2_0;#;&wav5H96{`GE*OmJ>)g6fXZH)Z+KUBLWDs-DBb6LR82FfVR0}9}8 z!;DQB!`Ip7}L*uo1zegWj{OspVmtA*N4E%Z# zl;C4DHE|LxRwmO85%aDgq4EomP+^qPFTDGr$LQtr^FQG0 z?HG>q2)|YGs_0S<&y^BJCfqO+zr?^ZWklPP-W%5zNKYk~?-gdF6rDw4j)s#8=e`m* zR;YzyAy*luPpW_!F292}jo)U+iyMeOoELepYBxu40bQp3auf9yKFGEh!+*Vh%c5o8 zu0;uHMY#UEnpe)sSKDg;7brbu$cjc!T{YNeJ}x6U!hOihlvt;iLko&)5evA^lSl*H zyC#YbEOQmZ|3$STy0C=+KXLNgFwFH-`&BUc<;;-sTB)F_z-9Dg{HnmRUG*}J zwC-i{hHu%EczSIm#!;Xkza489`h)K!vDj6IC|~P>Sqk<+$UJ zi`c_siWuK?v>amm1ByFBF#wEB-hgxQ_`jtH`8xn8d&48GwEXu`v5xFL56IlkjYyPF zV*Uoke{jGZD8Hoa$J>Vg2GsvozwFyKV3%M+@Pi*iJgNEnkBm#<0Q)TW<&G+&Zj(bT zpPGip4}Spa;xK&ta=265=a11bvGk1yJ@&of4Yw*(B53z1K@qdGZ`<4`3(~C#YOv<4U}JRo;TAM6kSvW zH(XuBVcf}K`5^&Tx4_+UMp!I%X=NeJ5?!JqvF z)LEOQdF@tVJZu7h1|aYy3Qb0_G_T8MsDBF<-BT|$sMc8ebUFT{Y^bd@MI%#vogT6` zRjV3rvql+Sm;=M>H=eRuDn}pOGUBqpHlj1a0Al(f|;qx$Ir!aGEbMuFG zAVc5vz;fx0Zf#+qStZVA>{IBUb!#B^5R@Q#+JkpOE$XEn>GRE2@c;wFKTcNO^l7fb zdx;}y#Z#^&5DBZHNV~D2;qn7k6heOx+&nqL?qEVgXKP-bIIrz;D!u%G`$t})xA1WY z<~mw-Q-$w6COb|e`4B>f&_2G;ax5sjbng;${WzS=qGPSQ315(EYrjb(EwUB`EYEha zn9O!(zw1POp29>}Vq8~f$svEZyCT$I=|m?fUd!ro5D&%V*(4ur;-57FHRsjpu2pA+ z_J@dx?g0EVh6Wjd~ z>FNM704f=`cTx;aiQ3xs_SMp{ zY|*t*q|p-<9|S3B?8{6b@u+W~bejB19B!nQA3j-!So zHsxB?V!nWdVi7^S^~A3Irtto<@n`)xw$L725Xc7@4dP(@hF8|7f<9y+7-f=T;M=qe z0B^A;OTw%aT}K)HT>#jb`yd^RUx{Twu{duR#(XsZ-v&5h@(}<<)hC2CXl$+HeGHIq zN3f8w$>rrt@;tGub#|M@y89ckr>fvb4$KYRkC9aeD{gD`r(16rOwGq-o+vsY`DAM@ z&I;KgE4TU#5eLk!A~zxcF$K{o zF6*b0PUP^FHS-E0(|2O*f|D@mGia%Lrg+28sRGrvIkOpwuB!$NZPkBrc0+<=A68Q?eT%w^Fu z@Tte40XS&}jSgHf*&etS;-7|aM=-=2-%swhY~MRNQ>ICx9r*U0H-ECoR-J+S210kb zLr-!NljhKg-;);!+P;{`s{0lOHMXw&cqoT)-vD5&`D6nGSe|H%UOI}3|}E7J07c@iwqd;3+^Q677g z;9{zLs#wXxPJ+JYI(;$Zb`9S`Im8e{V5A2+xri=|T8qFWTpVm7Mn(~&OpeuSp9&V- z;v7}H1^1*y1Ri^5iy8d&mwJ@jinz-Z-<N!*7Jyvf+n z22vFP*JOavVNW?}7^4`sP$(i>yIjs1GN;;&8}~t>s{w{xCHZ65fPWd@Q*jFW8h>{{Ti%n4p)0^e$;AOn z!#ODnr8W|HQ53Y5x4xdH>mZLE0-&>DAhgZ}MKBy_+`g92pq7f}R(VOqKF?{p%s&;L z@S(vv?SeWsU*(%2TJ*ClY~;*^gUX+_(RjN9CZkEB;O$Qacj*@-Qg^_EalX24(3c7a zurIoad{8YFcHRgx@Z6(yQo-gN07awkj$Hy_XWZt2c*Zxe?VHo#Zh?>a#9(j==9!}`8*+-GuI#(Q6s8SqfOat`2G!|H=&Y|JYKjmhz%w6und9eHG_N+9p8fu})K35M(Nn83=U+KzhA!@mulLK$}Vrt>G+ebMg!_9Gr9&b@3VemAYxkAz zH3@b{{7bIu-yZdL4CQ^=Bb}DyVvVd|5>)NIhy;E7JboltKZ8~35Dbo*-_Ar@L5C#?XOFA$z0{D4XM}8kz{#sZ+b-Bqi1Ztn;4x{hzMfzi( zu=n4|Zw7nn%82PEA0!Ffkagm)muyB3CQwWQkB^tZgJi;TDOO+O6ejsKLBhOSFT-zv zhA^xSbtcT$A|CxqSSN8$Kz?*RlPc(CbY?M%W*KBNI4btlZ8*BMJ%6h`;`V1lp=b*J zwr@Y@lRf!gCD#m~JvY8ZdDn?j&F#-+Bvg=e zZj#+~M-?PeOlGU%t3%R&)J!y)I&p#fl`IjEm2! z{RSwc=Ot}%hvi`FZ-GrmWBgl%{Lk(7w)Va_Hs7%3kp%pu2|xD5j{sq+fTxbg;ka5C zjsX0T&SE?K@mqouDk+2}pgUgQ%^8td_980+E|&|N;r5+cEC=GJ+$1QDfjbLTF%Is^rNv z`$>M3WO8>!qmL#kCRE#~Rf*mHx)l8~{guCqb;`*+$-E9ZB1W(=I-8g^`-kK4;Qeu( zIVVEO`oBfc$Ye4lIB9u?FO4|Ncj7ZQq%aMLURK8}oFO+`VC{D1lij`-WvIikMivyH zo1atH$-%UF8(%R;qlJtsz>yLz=vOwN*6l>mfGw% zZxl*g0qMq38JEb|@G(K)4ra{h>jNJ4TIv4wMG*5Q?rhS&de zzRY?8;!Z3DJ6khH$2Ce=cx%u@eZ#oG+vri~xHH?r`QgS|tHCB5A(6DMRoSPQ4TgN4 z6z%i9)v+?tbh|I}_W7FecZzMPsbXiwMH0(xcZAnq@{xKh@Ay7E1vH$ z-?!7erfIu(DG|67D=D@~gr;9n#VK?xthCUyo&5sk7&QvM(hCt&%>AmPdr?bA;Iy0Q zT$t;5_a_?yKZ;oN-Y8%TLAjGM2qpW_1w?-P@>W&a zN-V>HlhBU-k<7~;jE#@#_Qzg`n}!k^W6G5Y!eKo0PfaQf%>pz2Sfrl>pV2*hEN57c z2&6{EL4C;4w}|0IUD_hDhyO(7W(dyZ^y!)XD7c`A!XJDdJT^^jfGVU-*NI|GU+HKZ zB(iOYZU*vOvS~~UENZi7MI0e=TP2Lw-ZzHpSFMV2%5sV(Z0-nZKy^UbRT0Pv-j#+3 z9p$ir2|J^ZvA4P+UO2#(1m!ll@{tJO2*F4e+DIIoTciynMSbrWitpQl*!48IeeR*B z42MFO@L6D?i9s}P*+JAhTh#k(07pYDVf?1NN$UvZe$3X4_u=ajkVDXF{WMKdUZG6) z?o&$sZ(-X;OC8(D)uhCUmT#Oo7pN}F)%(JEGOY2IPTOnSbRw}^ZWfayJlc+vgOh*K zo)iK7v<2=AM*Iho9ZGxoD*vk$7Ws;KP_{+Mu(=~wDp-4;f<~bo0gs2$f$of*1ISeA z64~caR*4A%7x%|w#}U&R$8$LRnKlwDc)9plL0`Ufm?vJG|0^vcG+y*s(*|maDV+(k zs6(&JsFZ-YOoseA6hRNqd0_*R7t^rw-CY=jd6}J~In7U#OdCeyfUbE-qqj+9&ukd8 zs)8WkV}29ujdo}vfaU{c4pSS)^m)e@#}J*z;=9W*O?`zJDm4m!89N-5*`oI&DW#Q0 z8cyq@B1MTqi+uod|67fLIe#r&4nu85C}k||A3DKqekIwx9tHM%A8YzWiFWjD|3?nG zP6c1Y&*xtrf_Ihfxl-Q+h2`6)yd(;0uN?`;3q_7?9VX&T2B%cvyy$5svHj6`NG}^; zdwU1V-F8La?dS=|V_AIn)Pa!2e2R@BrXfqe`$4Ncug!imklM!_CAnRkTW0?Eop^vy zexTEr>Ta?Dq6H~fWls6d%pa>pQ zTrxzga>Q*ir*;J3fxCR^)NPMUbNd)KDeSwp{bE%ErcArcIJdP-_+|9v>k9Ujk@|bG z*sU#7kWumx%%jB3C;K|#v*aJ;kL8!mf&L&WI`e>*XohK{7ybSrx@Bc;0VoI1UE2pIPlVzckv8~=&2 z|9LPcCwm+Gc6MAQp6elOuG`YV6ca}bYXT8O3&we&Qoe?$aZG+8=9S5{tOr+E*YEMm zF5cd@wr6U_BS`jE(H6BKq|EnlQ&=wD5H*C~vkJ|%FC2F(Mh`@CXzpEw(oe!3_-smw z-FUe(@;qJ|UqBDiLnaL`K!^RT4_Wwd7qsDRjP@>I+=v?Ie_@G4B|5ZbwgZPO!6nDC{FR zO5F82BR#w$h(3rKtvC!C;E-(HH2##ud{&vsvXR-XaI1Id%{Y7IC^$U$C3Uw2AgsT| zz!+tAe+TuE8FV}~WbM$w)6W;`OZB-40<`kWx+O+P3Q=V&bj@(K5!&PDenw}9B|e>& zFUvy9=N}zslcqE)$ZA&W=18+ZQyIR{I?SU(xu=q~sk3*+vrCsl8=qnTV7 zUX~64?>}@l?T3BA`DFKhI|quXV9tS@FOf?-{~^l%at*G80@a{gw*KT|8A`p1iw@BVzLi^}=;(jWE?Ltnx4^f4ss;jM4P!=*6(IR6Gn zU+_;*=1f0jkU4AcD$QSHwxClCL$S0Zu1GDpM=W5E4~)DjOp#*Qj@Bf0{i9~_wLOCL zO|dP|s?>1NPyQ^O@ShL&3}!W^M;uG#5NBOp zyVu#ISj%STF8dXiP8SiMESj8s@$J6YTVPC}zr|41S1mXb#`-qmT32RW2C&L{elpzX zlUJ5|%c~%pi*Z2pcms5Lm|_i=mz2bv_+GW#?N}~3ul~=70;~-9v0=RHt1*W~K$7JR z6c!}^k9ZZm;EM-wspjYLe5q2Kle^<;l(CvPSMgirD-c6b9PWOiNsE%pe_XbMxR%rj zpQ{3`hHJ9D>nO^kucTq5tK8%*jC4imm-~x!4I8SDnx0H4INHmWuCWQlDTVFUbGczm z=zV9R;co9gXYW!B@C2hsRo5jLtin74qj@ShCIzm)o8lMR^#uvu(5AVZCw)_s&282| z`9%Tf&2vq7nQO)l^8o7v;P=vV9lNRBpQ2^dOWp^(2Ds`jDsE>xV%$X!O+p19*DXo} z_Pu5J*pj2?PWU!!Q!qN&|37YlSaHBDP)n%tsva=5X}q3giA}f6jvr~LpL{&4%+D>A z#FdpE_`Ww?EW7i=IDhjflxHzlfSYnn^4vnOasPB|r9e(&ra?3(pN_*YKQ3(~U7+-U zFdihRT}qezIw`P!*jCSR5+HN%&+OcL<=j1g41-ea^{)jwH79;DZFn0V>;`4y9SdE0 zQ)Bj?bdw!i`py9c0X@JV5U)$bBC8Ua84LZCjrU4h+r)%M;GX?KV>>=5&T`UDVhcN> z9Xl(>)@=C`(G!yE+5IfUGDulVqOOP5QfTlM28^WX}(N zK7{oJz4s2T0jNqXVY*(5I~Wn|0aP?795z_@e!-t5yO9dMXlBX)Sej+`ttbznt&7VP z>zlKkv#IRI>08ZWJmS=eP#E(C*z98)cis*F>y6~b;7f>5umhyR8X!r{%&R^11}$R3 z<1PWO&+En&*NlrS&tOjWPj+@Gjy2twLL=7U2j~~5rgF*5)tBQQ6eg-g3P}JnCbIU^ z-7C1JH-c~&D9_rJOod72dqgU|0K^b|2ikj# zyc~%6B6WdU2@fHxpvVj*823e82t;w@>$=RS-(1QLQltTDLKeU=u#hR>v<)~9YA(%2 zGZ}$RMnSz)8yw4DMgSlQh+$Db=MWGKCbXQiFCD(YuE~oL`M~<~{;ZYd^wN{c>uSYq z=d0H-hY;F9uW7B>ulQls7Us28KzT<=r~zHCfuQYR3adw{=MprYkf9e2})xvW_qe1M8_JBbF+-Z z8<5H2E|;6*^U23Vo8=$X`J+D~nOqOi8$j~fl&te&&r`&NWQatuYq}heZN~N8Okge+ zRMTI-etBdKT%UyiC$P(*cc1ii&Bejo?wzbs`Pf&MqOYE%Fy*UjQo82kMBxo*cmCd_4sE?zMctb}EWdI}lE6O(PXhhO@9(hnmIHt ziuOc9dj44I#>1jKRK5>&Jsf>MOj~POpeE0+&?d?HGo&>w)-P{FFwuI6SH@1OJiMbw zy4(CIRE-;bS}1#;w%)Zu02GbJ8zi{0uvsn}N0x$59~d36rEF5iiMnBW!5#B#dz-KZ9b!8{DNuwnOPGIOI&Es9?^AxJ3yA-IKG>^u^Ort8c6 zc%{M5H=PUrf8K!G#7DuCU_yNhH^jIgi2$r{tJw4_e4WWjzk#z8@p)Ods^9qg_&QHD z{bZ08lzWZ$bl*MrCrB03M$03KIF{odZm&-4em$-uiT*J_^<8^*jrsQou$~tM=)k*Q zQNe$lXZO+d$Hm4a7gw2o9?YZ=R!4cb?to<67g-I@?r2#R*g{z~{I7>L{|gFWG^7aI z{hp}9w>=N1O~JEVN`yLWs9^Tu)j#0?py${OY2xC?sFi_w6l@LCE>#$(m;VUz*JCBt z*SV6#310F2SC0DsQsEEe^Jq#A9sMh_Cmxvo7*V3o{;?!{tE2#?y2{AJrGF&{(c;*P zsp7sO{GTu)`mF(MAT%ImY@GUMq>!Zoew2or^&gL^e|rEha<+4-*cSaQWB^R1fL!9e zjD_yMEvyLssDoyAU%vnQ`}ki-;QT>;udL<$uOEie!fX!(6OKCn9OZ8ez|{GrYxCbu z2sYSo$`+Np^e+#F1ngtHBv|{`C-XspjmegE%Nl=QGk_=K3-F$EtF9IPc?lv18>zW0ur2%NAitFORs+#rSy)(L zOq1{H!N-M_>4x90uiUj3d1H-u1!?VrDIzYbFe*bh-lM#i3Q^=BBbHoKGo z38#t_yc#uG>|{9iE@I&dIa{;0CrfVYcQtNkS+N}T-Ctg%D=ncNjmWgLy`vW#$7fns zH!xs>`Ray-WGz2^f(bdKy}Vk;Rxwoa%w90MFK(<9<9>RC^Z0bx`(csXHP^`x5}sCX zup7gHS{Ppz|FV0iMNFVtKWuxeeKBP;y{Gq)z+(3Cv0AWhV3HB^TY= z??4T1*-5)pn$mr$u|ye}-O=|{dn;7s#5HFQ1PTohq@$u%DpJp*>q%B8eLpN6PglCcEMdvsjuQlQ)pZDr-egW#QWX#- z?R%*QZfcjEak_J2XkdjoUs!?euzhVysqKqlH!(xd1ku3AFTOQv93(0%?9}bpa22=T za|OAUVZIwKo4P-h7QbF&xtuLQmok!J`i%={ZT`{VQ=+w01X)7F`Zn7qXohVHYcLL; zS?DsYS58X4Erqm$815x;xC!zt!FVIRUou|N9reCt!_^bLAaPW>^b80H5>jwE{y<-ITu`o7 ztnjMwGVpoM$BpDbN7{KJk&J*J=z0jZvJ2s?!s_{!ARpO*-yX6boqWViCp_uGZY6~r z$|jV&8@Y4N}BJkPpbpHah5Fczqw^mw&@X`K!|0lqpDIiA|>tlUKFbh8`)@6CsuI zHIsN|2Hk3?@pwu9p{bm%d5-+STZN9y6Dk`!o&4QPF2PGf#TBC2I^k<%AJP){(l_5# zLGEJD&fQC+^Y=5)7J}Fj5AfxLeopMbU>_#Yi_?-C3u^v@YZcXtYJ+i^8gbW$%M+OG zCvN*scmDn#MXeR^!!ww#Z0qk;)k&A{kbXg9m%I=H~Kp>eckYFYmnLaYCVWCEsh-$;swvAxv@keL! z7Sebzj|j*&zDT#GDA1Y}s+v=>%b{ z`rt8geY?Bw!Z;;fo#4CZk;TPn7a^H~YQxAl#f!o^cThLMFUv+lHarw?hhH>D^+Ier z@too1B7DX#K+CfBdPD6E#?xE(F8^i(Bz6RH*j@imCk6Ihvuou$WU%X;B#;kKx;7gG z1Q95{3ZE!QqQuL8EPpEG`Vk+Q?rF(?MRFUZFm&7$Gkl!l$I8>M%aF7coowAK9v|2z zyL;*KYT-t4Nlas3#5YR~eLBs+JOCQMTkuf7MqCZk=~yYY=$jhP?9tJ-L1`_$9$9H6 zs0)rGEBBVm@fy=to7%KrODU#YYCg&du6j)iicd4NnHJEfnOi+3sQ7FPG@}>v$jV3` z?I8#nv}%Iylzqw<1%5M7+YG*gNsM1b@R~M!k1}KYU>u?*rr~$_M7fa6GI@D8){LYd zmuDY9Dg<71mMHfb{#w@NxnsLEHog7PSL3Zk@SuW*K;S02Z{3%nyHYrJRviUpf3oW4-#;u z;1a5jnP13pMWpXb4)^O4K$*!-s%I-M4@>Akghoy@M6xsRGRGWhQP$jQ+prZJF}~{& zm^cxn4g9{i`r3Yi7C!j`LQNBBxSlMKtBl<%u@)mFezp69rNP==)nuzh8E~-ne~r$I z45M?m_GStx+K1Py7;j{lHJts{9A>rCuUI)7XXh=%M6z04iMYb}fe5%^;ZFK}oc?Je zr(P6|^Tzvr0cD}|8dsP~h4*m^g#<0RU-D~W>~mGMf`(e-rpr6VdV?6s*Hbz3(jBx#ev?T6q%W20|)qUhed37byyj@9EHl{bQa|N^bKqiTQeGAN+t2? zKA?m>$cq6LRBxE38cOs$i_=pDH~zzQq}qFa{r#~!FIcb_ZU*gSlSk7|F^p^5OT7wm zZfKNVinx+lQWfQW@d8I?`YL5;L-o7wl0iG$U?*O_=j?9c`eE|o*3V*i(;sz@r*yQU zKNHinvo%#5^5edgTAHUz*?AqdOg>JwHD_K}mVktY&APTbI3^$a$ekxEG(J{q!(tAt zA_zDN_Q1Il$*8ozFWxF}+(e0AX;Kz+Ym`o64G#jTsXlwgDkcMdr`CzP_!v2Qm+#rP zpu%%WWTSW<2)!P{vDytNDmbdN+8vis@qwD>Eua*qYG2e;{3fb*n8v9gIqMmj84fUh zWuK~*`tu3ih2a-Yb>~K}%zLYcR-Y!`{JcI~^{oNvcHPPW5=n-^w4|zV zkDhS;pde-+{x95-{O_`o1wH7FI;UO=x@ZlP{TgacspW)1!hWo4*+T(y1MA6rT$0Uj zji>i^&z`Q66k7UxbMjM`zfnu(+E0p!=v9^>*(rr}_SQ zqL(iqmhZq{g{5FYVNtSaNM<|!x_6~|NQ!G&_bOmj4(HS3mmBuxJ^v3oSXGRm_1_o4?9pVA>U`Wg&R);?3}nNbrL zXMOQ;sjs+ksQX4};7BJjDq}#QJ9LeoRN@15N^IbRAkUN$agG`%%41}f?ncaRy&1lG zN4a_DuP-a`h8S(1q(qr&&>VJy2j=;4#&1XxZ1rKzb#*7Pi(9P8RkiklR=I zo&xd+%1{1D2P`pY@FNV=sAoKEb?naaCCvrhY?2R;^(IRMh1{&;M+$d5lMHAFC#3dG z64a#9lJ}`aEGLrTQ)1H-Coix4Ao&&1^Uk=4Z+8XvtQQDa0-pyDP5nZfX{T3PW+auh zww6Il8=VHCbCRC@(ujBRuM>6)b+*+lbv-y-ju4~y%+%rBqOeR4=_%Db71EH9L)2A2 zQR;d|3CU!xaZ(49QE>6o>Fd4^g`jxaJ44FJD{AUd+tQOJnbgi4D4q$a^Tmah_A#8j ztwX5kNwPcWgZLbTFnpYDmbqZ`$RV?N_aa*;!LO3@hSmnt#L3enoDMuvC~#j&wFR@s%mTH8{P-OL$xfMj2hWXZqNK9Yt5Ew z#g;U-o3Rf_hc$cU(Cn82TleowSFw{yRL<&7zeBvK=uIFT6F-tm%&0PXcagUX^p^CY zcLVImI;$0#xOe6Kp$-&OwQ^(1qm61hi4h2KIoV(n`NCb3QkR&>FytTe{D*3~_==bQ z!VPalC=?uYh6)B4mTjyT|U zq!aYWs3y~x+s;__QqNOK*GdLE7I-hX1y$9_3k0!5yBEWqG3VvXO^R4?AZOFZn!ctF zpPA#V{GAi9hb^8a(Z3k(8*%a0+gNso*pK+Mr#bos5u{}~|xk4RH7+XrQ zG!aKZ(QM<#uzj`Vp8OM$O#g%VvO;n$1g!`qy70*aH~Zp?7PT<{pK*g*rHZ#b^x$IToiX8wEBg0GiW_nZAgV zGEcMu2b0!|MV7`UEz~Ir_Yh6zvc$%<9lsO(g)Qv>RJ>!#(GPn5IUG!vhbab{lKtA* z=lB)XTKmSN4!$Ktera8-!^9h@ie0Z#gtcgEIKRpE(#t*OLQw>GoI!(VaVgGa0uFfXKe z6RH%cDbKSfTSAYgw|Fd5w+$R^xI2IRhMX5X1bdlY>0p&66ekzT`C)s+2+KzNR3#DQ zIiYR4SEr>BjNs7u)WU2t0}38(QQsAh8y)ujmOyo;gnBfsosgz=0^Lt75_o4POc6!+ z7%>fU%Yg;8CiNU3lImHzbQ!-O|9->F%;exU6}=<4P!V zD)!@faVFcNcc>e(8J-@;10~$f0mq(4c&KX?O$q z_aU_`c#@U zWvf=d@F*9>FfkvD4;h^kOt}`(Wcpn7DW;4M5nkTbJXopTXXe=4_Bc>3N{N=f(n^k? z3Xo(TS1t?^u`eRI{Q+k?v^%&lA(Zb-Ja{w!nN@ zJc}jZyxxD-ZEz_&CTEzbWsNhd^YO=M!Lu`MqF6y)TvG+-b81h zJ<5+jPig3!B)p-bX+730$(J!W<)wP>^~iPqK({}0J8co}Z%Udx!cef-ohJ4w^bS~gXC(%hL^<1*ewqqBS!3CVZK7EXAy2GgHuE8*#vCCEY z^dMPl-Tj&=PGq!NuPm>CAJ+sWEWn?I!z##TS5}yfx5S5wS{Qt(#X6E^FeFBe2{y9` zmBye!0|}|q8{5fwE{e!W(X5`~n-C{de^MU_-*-7w8-cb`_J0~AS1W7?pjYm>8ic+P zC%jRzN#7OEWfM#mC16pEngu)LM*V8mRWDgfF+?K`8!p}C?E4(OKRfDyIf{R1txdur zH);D5#k1md1GF=GE^4FXp&v8(F6`B$-R+p0YY?5~$)v*~*wN!qDB)8VA22*sW#dR= zl89{Tcm%|%MjL3wKFc~nb&o{RP5Ze>a3 zrVBEexL7ij^=n$rwEl$k3^gjT#ITk;LB2A=X`Ud|hl!twxRJ6m-K4U_v}!jCLD~ul z0ov`HSqX}>ro~5A=e&c~y5*IomqJ1inaXMJZ$GjG&*P?-n~d8`(s^(`xFo!_=7mgZ zs0cd&l?0|x$ONZxAG!w+N?|%zq331m!NzGnkzb;j*v!ohJ{PbL1HX{gGOaL;-#G@2 z{MI;@bTQ=jJ6l7Voa~qZ!{`T zvTUP6@T&xgDrgQ6X_*!CG#Zz8;>N=TwDazg;}c)KU*zu^C$quP@XH=`bxAEvFl9_` zqY#!{fPMIFUZZ_3q@&giz?A)StTe`l9I5 z|I^f2M@9L4`=4?E=?@6f2+D|bNDf0Oij;y9(w#$h4JC*mDK*4^w6w%XcgN7k4Ba*K z&~f?P@4dg@J%2rGuYLB}>#Vicdd~BD&U^b~ib_}iIBiU`JtK&vPii5RNum6hDPOpzy~^V;%tAO29$qd|2p2O77uwM?}4(FIhW30a4$h?Tenm@ z#+r2(x1iepVW7&y4CH`id0O+#3Nq=|Q`}W*lMxBdj!cZtCQX5!2*`vrtSCSyh;{og+)b`>O~;)%LlVj^PgKyV1m~ z?J~P0MT*1GiX-5fOj9?eXp_j(_uIlIqly>4vf}EuD|7NR;DK~7OKVR&uO4}S?Ne@@ zu@@z|b8AA>gSbyqDrOJQJ}opiJ|=G^2!32~MVT&j=Ao^9^Q-=TSamOQx{=6?xi<(O z5ZHyh#weALoqz_V$ud!Kkat`}Gz2WXco}qtKCA_*sko*ORWnr8)wRnTkKSSLFC*2% zV6bnF4{v8Tz;s4CtT~BP=r$5J=9>V8WaZ@D>xmMrFuK=4$5Lw7ua5pjAQ6_4;0IiMJQgX%k7ed>$owZD*WZ znt!e`rSnKniRk#@hskp;;Ffuf6%4n4awLD!e*&_%MyP5v0S{T%_d6Z?u@T$!y5Ve0 z5_wCOfDEFE?etLT9_;TQR+gzj8$Cs}zRq-oE-#sApi`b4uOI_{_O-rnN?5n|vV_&# z&bIgK45%F_ph>N}B{PSPj1GtmcHVKHBm+BPbeOIsy1$w|@#s8H?A@64*5G9-osoYM zHumcGn)G3j{*MZSO;Nuok*@lsgq;$!B8BOcI$*mVGjYXZMz1HcJktL8X0U&N3HdXw zx>L$5{p~Z54O%^{{@uafNUMDMvurd7`MuvxE{pBpE#)TTh!=~Axq0rrq-95CC2F1f z8pz4HT))Kb+jhZJS~WJYGUAFB7K;LHc3qFslrJqU+4e*;$HfV<(eN7`Yt0(e@kH;J zQR=ou>=-~*Xg91S)#E&w_lun2@5Y2zD$gipejDdG#9DRt9Lt_rph!wvzU-A#cnp=+ zd3n-QWG0XfLAc-{eCUQG9` zy>8r-Nb#N>q|mvGqhg~JzRGaH~I?fO^ni6bqTT0c(5RC6RQ72`H%UZ5gNw-=W@T~ zB9)G4%R;l%ffo(#|D^G+`~4;3cVU)sT)Y7-VUBGEyLkt7e_vJ~Tz^qL$AsqHm*PJ` zrpgq=i`1y=2x9Byo*kcb2q^=!#Icg*{Fp9PJEo0tx(RgF47Inn0*e8`tUqGj@WuG; zt%n2cz&DDAC~1aXH1Ld-5+{0LkbvOtGRO={iJDmcfM z>Gx3Z-wVHe79KY5di4_29}|3xznZ!c+qS@D+gCBtDCT#BA6L92oIZdrG|IhzAHRj> zIoCH@Q3`yXsj$e6EGBkZj=8G3`LpI{TLB-j)h zICbe6MW@nNxmsSiv0R?JfBzBu<>|cI<(HG|tVXai5f3I10E7{CW-jb}WIPqD6f|zH zJF>@kXdOtM_xpaZmYS_Ma7Zg{|I}Ka@d6AynqyW zF!eh=>M37IL3(9j^S?#|#*g;;6!_sq?l&dLbPLnaoAVYrSdQ-!E)OS#La~Kh)lvL~ z{h{exLF*{7gqHSpo_ZZC46|N~W`ke*cpOAh!I$e4WzbIC#*+)uIfyfV)(No_w zj*FzvchDTZpOJ->jn(FFzmMHDAtyF8Tjq*R?<@*X$5)N01$b?GwcB>fW=k^PzOM~R z(>&G7lC3t=ejdi_DR~%x2_De3{?_svjD5&D5LiZw>Eo;H$CT|e|; zQNP_RSh2u}ZoACUY!1aXdA~PWy)Bu3(PYLwKaFH&WQ3=7Bw1z`?V^tN)Sm&Y5}U%4 z2cazdhs|9(>B*_dETEdn4^ATQYX%p)Zg*Pf&vGn%rp}s?uFzUXy8USp*Nkhg+N%ri zvV|!*&`#d;wkEXpaIQwC%4M(R3G964D?GDV;31a&rX~Qlb{ARal#~^ouo@osLW6-lJJvD}kmVW!N70!?jVm2n;OQCvC zW2P%bG19rohT&;bsU7lCtg3C=zS6*CkebgkBr{Dd_GNP7M1-$co#yx;a@{8p{+)my zAS_n!Px*k>{Q6AoVWv;g;5aFGNn64%zobKD3gPtE(Ma`d?G3|dX1#)4{0h-Ukqq6? z#0wJ+cry7IEx7B~9DI72*~`*!(K}`LD|w+eplvX+#jQ!+kZ-za)uV>g-{xpADzXu= zwle@c8rVo>)t;=IuBX!1KmUY~JgyQUj!g6?U^PGdtv_RkI+~N89yL;?px>eQYyW!c zdAl*UeNr5u&3t(pqcz#aKgs=RTl`5Op)(bHFtS|1Jf*tS1IoR~e;&MmxJ@+j+6b3S z{xCgu(AR%Tdphl~Aq-I&MEM+qi+7aum53{qgwnyKMmJkz ztUpoq?fI+koTELfHJ+X_Lp9>YFEup>#4k}y8GtTt}AQ$6`Z zbn3c@D`gNK(ow(gSBKG7SdN%*ReE4oTl2oUSMMvAy@I*z)fl!eJ;L5*nVpZCz?AA+ zYS{Wg?me z1x|?eA}_^PcXM4z{^Wl7X0d1&guY2r^1x2@5>h1DTvow%t~2f|5UAG97JF|5>d2+w zvog*Tf2f7t_%EQakyYFcUIM&U-I;tvb{d;ZT5y!F23k0_f0=Ke+gY%LQBl< z@d*X7JhVN9hA~t5{{OXWk)@yW2=)bric0HnZDelc&+nfeP8Woh(XXIV!JR(SHU&`U zU9rZ(a2Q<=M)z{=b~N=yb%yoSbOeTRT|?!b9hbLlsK?LeG5)4zDlT{J-TV8o+=1|O zXRqMiYQRa_ob8eE^5_)+-*b_R@9*_H>lYmtMjt2p_Q&Bqca-Sp6C0}JqH$unD$k`T zKb(N&reqA3yQhA#^Xv)!-Zs=cd4-g@$s3(CWoBf`ad&xCA!uC~4rxic4nM2rxC!^* zv+oYXW_5JKhyc`Md0idX|*{(h{VB$PsA3{bAH-efgdZq=c<)kD<# z{2W-#1js%HhpZiF3mj<9*?yIqX0cu&kSfzKxM8{FCo z)Z;Cn$}{Eq`=!9h%!0bJF^sRpSt)ZYFr&B$%Lr~Ef)kjZmaj~4*;~a@EX|T%leEze z+wFv>q@;lS*KIp_an=Mjg;X2X{Ke(H7LGJvf98MLY|9=6eZH_cCx{GFXX?q{_y=Js z-S$fGwppZ4$(1l#XT$$Md2YMYGqraCKDI5X>|Tkt;hvtg@)X%^Sb{!OfxUfn>3T#D zSG+q9-|i4H#9Rss?%h{4wI>;BtI$-gXxW9nu|5(8hbmXzq7>Z?PkPM zm{=W^t4)rot-8j$Pi~o8LIGrI+iFgzxzTcE=`G>Fc=bw_FeH@ou}SdEDb;x{#f96^ zx5GddHTDqECDG9uqW2Zy)0I11_^syC32#~-%63iK|KorVS&f+%-GKm+?^_wH zJ)E)H(vLsxom(?VEf?K(o(>kmf;_sRU-zs0grcfw2;(?{0C3j1h1a3ObhX! zb5=b`O&&O4&qtY!v-(gbRMKfcw`;3PG@C9S;0Xp-Vpv1+S`!n*LZ2$lkUin4tsNX)USjRQ* zPF%93UP4xgRp`&l2%B&F4E5h-v;i4_4X=(=vKq;m@JOfgwB2wR5Zre7G1_OU#FzJcSZVpa;Wc@&kgJN zSC@)8&Fp%7h?@~%ff9-arpAB?nu&=9Z4R!D<6d(5p}HT1lXvmNaZ`ryX9UR&u0DC* zmYniutR~%;7rS4RV3TA(m}UcTI3jK$JMca&;A-NAgQad1nE4+4X(pa3V<2P8Fke+K zfIbLt`-mu8dDY5g-9FHTZ`@a9w?SM8jz#sYkisUkqkH*e$6GNXBK$1Bd539x_I@3V znQXR)%@7<`8;y?y72pkPq{~WA_?!YIJ@7O*5zbz56!3_RHICjE&OT1n!$y}uoRHcb z0`N?#-;0L&5pTv^FTQpR)%Y6qf~s3hOcAmDiF^IhHL?`5eR49K@ zJ!FD&p;@t`{%Z|&B4l+u3)R}E^xj`eLP>bX>Zm8Cj*OfT?Ot_#C3|Ek@l;kYVkvbxpq1v*)K=R*I^L%#n>^ zH%}^V&&j9r#uP6qIV>A-*K>l zM}^h`;EickMw+frpo{(IH}JywE-f^Ty1V&^P-7h7VxkQSfn=hH9(o8`ty!X;$EQ0V zeBA<4lijMtW<%9+zdW`<0wOGD)Fx72LOx4Bc2e~N9=^D%O@0$8I@4sq7S>0e=X(LI z6eTHSDL0F8yw-#?R6nw#qp@6)-$&8jSk$K~dNcD72=qPE5ztXRgK(-7eo@OG$SUrU zb?Ii{k1jOubNn^;X^&iMO>K{A2wLj#t5kFhTmIz56RE6~*%-v0mcDoNA`Y1?C}d}^_b6Kfy zM%=vJYB+++X_DH)rV^o7qkUiaym&Hm#4R%Pj6imm!iKrTm~KO-P?YkI`j)tYjHhFa zz}JT#wH>7GXOX^mUllzratjM03G0_8{PQ*4+503#aVnzK(1Ti;ZxuF7lh(#Px>R5@ zmYAG%-aS`LX`J*y-AiewH16TZ2?(C>=GzrK>WcF(hTFblkpZ?SgY7y=qh`Fc!YV~= zby$%Kb(|2y>qSkSo4{xyo$>+K9Bs^&((-t#=-IQ3=XGWEHN0YIKSgHms@3TezIm&g z)V{IqwYJ+ifMB5;9wMWbdB~ggNV7andc4@X&tqyNv|OLzCMZXbSr>{5!$ox6DiAi- z8`y+d&m5_l|6J|J(gLlO^7Gd!=dusboW@_R=&CF?zF4Sd)_-3uTm|WGx#_sqsxGzI zNX6Q@D6R8Im1h@U$7&;MdlN2+K~Ef+gIc8~&&uwL*NTw~q7)NoIoXAC@EU^Xd0#>Z<3qN1H|-MCcb4_2lm zn9Uadd_&#QZ6zo=_`WJ4TR0sZ4qB2X`2-93R^5_}YpOZkC@HEf;{)+pQMx1QCLKj!HpJp zC@D(rmKT>nW6};3MNE5LO1kNdAruI}nFJpP!mCj`QpQhyI6{w zov5@8Y0Qz{nxNF$46*P(M?ddt-sXtMI(XdW{D7NeP}15H6W^m4^#B!7u;sILb?DmD z(S38zyk=M|X0FpW*oZcXav=%I`3Z-Sl^O%A?zR%H{zk5IVd?@0QK7moE`AX91PP_C zz3+ZZAsUuxmCm%kyyhk5x>!50o-AG-qv_VgiMqeX2ebYSj2{U5>JLH&lK$}*YC&@lzX4RURn|9&9L{TarYW+YDJyIE%p@kEX@A6XZ-)rY5}{qW2vY zZ|UpEj9ENjj&7|+xHIXL{i@1t$XEtfE|i+Aub}$S^rQ&+>)TLn@x=}!2iRZ80y|u7 zKHz#vDTh99Y8^v^=3-1u2gX!(wf)iqmg$p&k;>;8tZhK@H{l25ev%cc&M}qn{pLU9 zb3DOqZFwCB6PX`(3s_o@Of40|*Su*dWc0+$!}E(wk)~HXh<+Wu6)N3* z!H%4=esk*o^;pWXg8>X&a#csI$5KQd6($pryCs#zTRK7%>O*9SGm zjn}{YDfC4ADWevsf4SUdhNL$L%ft=ZFIaNLh_*l@FcbW;IqQ>?wQV*NOP?7%u0|$H zaWk!4K>I%+@>0hFRn%Yn2cP#YC&A5n1Wn%WJsww^ttFfBJt<@U=6*ojJg&XyD&-eI z1eQSxV~4$*&^?ltY;%TKrxNN+%-npvUwX$B`Y%J6Ho~o19cTfu@p;HBc$z58*$T74 zr$iJ?6pM%M(oyqUdd^DfMK(PaPpcUu`3CX`R#9fz?+Mi(cQg#-BF~ZU!7mH~x-%o> zA~)J1Mf1xJUiQ!0kJg%$U1@?tJVWq%;9yn815lb?I@qX%`}-rL(-#Bf@YC(Kf6AL3 z=f?RI&t{+~L$U?@Oj8>iHq|P7vY}TmwrVNhm;fd_pm+lZEua1B!lK&z5K$O72e?~ob0gD`RHx!Qw3JwvWnutWr-PM%NfI8W;*K>B9gXJ?HD2_;IG)x8yYAY^1M z*KZl!_o14w>I&WAXKIn&H=#~RZ{3@daZyCT9B>d(MGjVSRn{z!detC^M~t6cl|FQ+ z$$Iq1wyIdiJh26p?JV_;J4eyOhUM*sQF^sOVkswEYOMMt(FUO$bEsPD?g)S>pE}M; zij>q%7GT_wb08mR;k4GdS(`A}+cG><_0Q4o=(D4;%ub2%MsJBx5$g|7mJ=+se*d1i zjn?+j(&`F`ppJolNUf-f5=O_I5-!>k*YU9)Z3?iiP3unWEAaW7d#}Be^4DoyZ97v> zH;+_>W=c?xV?Hz6)_fsye(hM2+JU!0=a<6Sg>Plj8$>^B9}?7~->EjJUuk(EZ)BVw z;J)6!^3;QQH=R;tZeZge42I<0DoH?xsI>xK6^l*zwAM9XsYKg^-Ra@xE1w%^>3~#N zAbB)CzTKMhr+_fwj{sK7^ zQMe_cwAHhW+%plAa-H#_=;OZU_?GyJSQo4a3C?+PCT@u2!>d;SNY~^A8D72Ky()u; zLmmohPLO3nN&7oT7_rl-av@JqoEqAKX`2a6M%SS}G=_IK(R`#0u%2@`c!gNDnd%j` zSq3@?d(Fh{Y8YyTq;6DQVhfr|=6_s=`ek$*rEZNh>j&D5Up}LI)b9|uCk)vgdxA2J z)b5IFZRKS^OB#0hhCcY#X1wSvurxDbo;^C!3FsPs9f_1SM%x_&#-fEW+W@G-NjZG1 z7SWjgTfn(nC99(ExjtHvWugO1@^Y`b63)!3U5?mc+=SI+glf|3B+ z@Wg*y54zP-|4e|A4%)AdL`h<=RD^pav>M??E9j?5mFQ0fbK1F6OI=D& z3$iv=tLBF7ELu(U@aPP$$WV3GurhZSaCg#2et0Usb3MLYW#HM2x%G4;b2;u|5fzhJfrcdeO{&wW~Jn^vSN< zax9o~Ue>>oODTy7RzO3CZR1ZcLWE`VV@}L_lw$F~LX{7#ZB$)Rbgf z?%eN(>{PY8sRJ@HMyuf`Y?_`ftYT(*j zBtl%$p(S6C;W&<&Fa{l;zmukvR5KltX0dyGyLTa`)FhGpW1GC>b7>D&9G|?a%=;qi zy><2h$dTNf75S+>UC5~9+M@X(oIaxG%vSP_cH_Beo03xk0*8g}&Hd~c61d!+XSQ&9 zR}x_6GcCpbvn*Xu{quAhg1zX#pusu2M1}`J;R;!gXF8U&Kg-Y(fF5eS`yZJ2KLAnj zUw~NJ-0t^(%