bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
192 lines (179 loc) • 32.2 kB
JavaScript
export const backendCodePromptTemplate = `# 代码生成规则
## 🔥 非常重要!!非常核心的规则!!
非常重要!!非常核心的规则!!这是特殊的代码编写,不是常规的代码编写,会有很多特别的规则,因此你绝对不能以你已有的经验和知识库来自以为是地跳过省略提示词里提到的各种执行步骤,必须使用调用todo_write工具创建任务列表,你必须严格按照提示词给出的执行步骤,一步一步来执行,每执行完一步都必须输出该步骤已执行,准备执行下一步:xxx。
## 第1步
分析理解整个项目的代码结构,参考这里面的'项目概述',注意,无需分析admin端的代码,你要编写的是C端代码。
## 第2步
分析理解工程根目录'.bytefun/globalApiInterfaceList.md'这个文件,重点分析从文件末尾往上找到的第一份json数据,提取出来后你自己必须缓存好,这非常重要,因为这是接口清单,是代码生成的依据。
## 第3步
根据提取出来的接口清单里的接口描述,检查内置的API接口是否满足接口列表里的接口功能,不要创建内置的API接口已经满足的接口。内置的API接口:账号密码登录接口,发送短信验证码接口,手机号登录接口,退出(注销)接口,手机号注册接口。
## 第4步
根据提取出来的接口清单里的接口描述,判断目前的数据库表结构是否支持接口清单里的接口功能和业务逻辑,不支持的情况下修改库表结构,并把修改后的SQL语句放在工程根目录'backend/doc/'目录下。特别注意判断现有的表字段是否满足接口所需的返回数据。
## 第5步
根据提取出来的接口清单里的接口描述,查找需要用到的数据库表,根据工程根目录"backend/doc/bytefun-boot-simple.sql"文件里的建表语句和修改后的SQL语句,严格按照'db.json文件内容格式规范',在工程根目录'backend/doc/db.json'文件,文件中添加对应的表结构,必须包含整张表的所有字段,如果没有修改后的SQL语句,则'db.json'的文件内容为'[]'。
## 第6步
重新分析理解这份代码生成规则的内容,必须逐行阅读分析!根据'继承BaseServiceImpl的Service实现类','继承BaseService的Service接口类'这些条目的内容,掌握Service层代码的写法。分析下面提到的'项目概述'和'业务模块标准目录结构',特别是'业务模块标准目录结构',这些业务模块是'bytefun-boot-biz-common'的子模块。
## 第7步
工程根目录'backend/bytefun-boot-biz-common'存在需要创建的子模块后,检查工程根目录'backend/bytefun-boot-biz-common'的'pom.xml'文件,确保对应的子模块已经添加到'modules'中。
## 第8步
根据提取出来的接口清单里的接口描述,修改工程根目录'backend/bytefun-boot-biz-common'的子模块的代码,实现接口的功能,注意,SQL语句必须写在dao.xml映射文件里,禁止在java文件中拼装SQL语句,禁止在java文件中使用MyBaits的Wrapper相关类。如果提取出来的接口清单里,存在'auth'对应的值为false的情况下,需要修改配置文件'auth.yml',在ignore_urls增加里增加忽略认证的路径,对应为工程根目录".bytefun/globalApiInterfaceList.md"匹配到的json数据中的path,注意必须以'/'开头,"auth.yml"这个文件在"bytefun-server-simple"模块下的"src/main/resources"目录下。如果编写的java文件不在'dao'或'entity'这两个package或子package下,文件名称需要以'Client'开头。如果'bytefun-boot-biz-common'模块下的子模块存在相互依赖,必须要修改子模块的pom.xml文件,引入对应的依赖模块。
## 第9步
需要更新\`doc/后端代码开发进度.json\`里面该页面对应的json的codeStatus字段为completed。
## 第10步
所有代码编写完毕后,需要在整个项目执行 'mvn clean compile' 命令编译项目,禁止单个模块单独编译,遇到编译失败时需要修改错误代码。
## 项目概述
本项目基于 Spring Boot 2.7.6,采用多模块架构设计,使用了 Lombok 进行简化代码,MyBatis Plus 进行数据持久化,MapStruct 进行对象转换。
### 项目整体架构
\`\`\`
bytefun-boot/
├── bytefun-boot-api/ # 定义内部service接口
├── bytefun-boot-biz/ # 业务模块,包含具体业务实现
├── bytefun-boot-framework/ # 框架核心模块,提供基础功能
├── bytefun-boot-module/ # 功能模块集合
│ ├── bytefun-module-message/ # 消息模块
│ ├── bytefun-module-monitor/ # 监控模块
│ └── bytefun-module-quartz/ # 定时任务模块
├── bytefun-boot-system/ # 系统管理模块
└── bytefun-server-simple/ # 启动模块
├── doc/ # 说明文档
│ └── apiDoc/ # 已有模块的接口文档
│ ├── BackendApiCodeDescription.md/ # 后端接口代码描述
│ └── bytefun-boot-simple.sql/ # 数据库表结构
\`\`\`
#### bytefun-boot-system 系统管理模块详细说明
- **com/bytefun/system/controller/client/**:C端控制层,负责接收和响应前端请求。
- **com/bytefun/system/convert/**:对象转换层,负责 Entity/VO/DTO 之间的属性拷贝和转换,便于分离数据结构。
- **com/bytefun/system/dao/**:数据访问层,定义 Mapper 接口,配合 MyBatis/MyBatisPlus 进行数据库操作。
- **com/bytefun/system/entity/**:实体类,通常与数据库表一一对应,常用 Lombok 注解(如 @Data)简化代码。
- **com/bytefun/system/query/**:查询参数对象,封装接口请求的查询条件,分 admin/client。
- **com/bytefun/system/service/**:业务逻辑层,定义服务接口及其实现,分 admin/client。
- **com/bytefun/system/vo/**:视图对象,封装返回给前端的数据结构,分 admin/client。
- **resources/mapper/**:MyBatis 的 XML 映射文件,定义 SQL 语句和结果映射。
注意,在bytefun-boot-system中已经包含了用户基础信息的功能代码。
对应实体类为\`com.bytefun.system.entity.SysUserEntity\`;
对应controller为\`com.bytefun.system.controller.client.ClientSysAuthController\`;
对应的数据表为\`sys_user\`;
#### bytefun-boot-framework 框架核心模块概要说明
- **com.bytefun.framework.factory.ServiceFactory**:服务工厂类,用于创建业务服务实例。
- **com.bytefun.framework.common.result.PageResult**:分页结果类,用于封装分页查询的结果。
- **com.bytefun.framework.common.result.Result**:通用结果类,用于封装接口调用的结果,包括成功、失败、异常等情况。
### 模块目录结构与功能
#### 业务模块标准目录结构
\`\`\`
src/main/
├── java/
│ └── com/bytefun/biz/
│ ├── config/ # 配置类,如工厂配置、Bean 定义等
│ ├── controller/ # 控制器,分为 admin 和 client 两端,处理前端请求
│ │ ├── admin/ # 后台管理端相关接口
│ │ └── client/ # C端用户相关接口
│ ├── convert/ # VO/Entity/DTO 之间的转换器
│ │ ├── admin/ # 后台管理端转换器
│ │ └── client/ # C端用户转换器
│ ├── dao/ # MyBatis/MyBatisPlus 持久层接口(Mapper)
│ ├── entity/ # 实体类,对应数据库表,常用 Lombok 简化
│ ├── query/ # 查询参数对象
│ │ ├── admin/ # 后台管理端查询参数
│ │ └── client/ # C端用户查询参数
│ ├── service/ # 业务服务接口与实现,分 admin/client
│ │ ├── admin/ # 后台管理端服务接口
│ │ │ └── impl/ # 后台管理端服务实现
│ │ └── client/ # C端用户服务接口
│ │ └── impl/ # C端用户服务实现
│ └── vo/ # 返回前端的视图对象(VO)
│ ├── admin/ # 后台管理端 VO
│ └── client/ # C端用户 VO
└── resources/
└── mapper/
│ └── biz/
│ └── CommonCollectDao.xml # MyBatis 映射文件
└───auth.yml # 配置无需登录认证的接口请求路径
\`\`\`
##### 详细说明
- **config/**:存放配置类,如服务工厂、Bean 配置等。
- **controller/**:控制层,负责接收和响应前端请求,分为 admin(后台管理)和 client(C端用户)。
- **convert/**:对象转换层,负责 Entity/VO/DTO 之间的属性拷贝和转换,便于分离数据结构。
- **dao/**:数据访问层,定义 Mapper 接口,配合 MyBatis/MyBatisPlus 进行数据库操作。
- **entity/**:实体类,通常与数据库表一一对应,常用 Lombok 注解(如 @Data)简化代码。
- **query/**:查询参数对象,封装接口请求的查询条件,分 admin/client。
- **service/**:业务逻辑层,定义服务接口及其实现,分 admin/client。
- **vo/**:视图对象,封装返回给前端的数据结构,分 admin/client。
- **resources/mapper/biz/**:MyBatis 的 XML 映射文件,定义 SQL 语句和结果映射。
### 技术栈说明
#### 核心框架
- **Spring Boot 2.7.6**:主框架,提供自动配置、内嵌服务器等特性
- **Spring Security**:安全框架,提供认证、授权、会话管理等功能
- **Spring Data Redis**:Redis缓存支持
#### 数据持久化
- **MyBatis Plus 3.5.2**:增强的MyBatis框架,提供CRUD操作、分页、条件构造器等
- **达梦数据库**:支持达梦数据库驱动
#### 代码简化
- **Lombok**:通过注解自动生成getter/setter、构造方法、toString等样板代码
- **MapStruct 1.4.2**:对象映射框架,自动生成Entity/VO/DTO之间的转换代码
#### 工具库
- **Hutool 5.7.22**:Java工具类库,提供丰富的工具方法
- **FastJSON 2.0.47**:JSON处理库
- **EasyExcel 3.1.1**:Excel导入导出库
- **EasyTrans 2.0.12**:数据翻译框架
#### API文档工具
- **Knife4j 4.4.0**:基于OpenAPI 3的API文档生成工具
#### 其他特性
- **多租户支持**:支持多租户架构
- **XSS防护**:防止XSS攻击
- **验证码支持**:集成验证码功能
- **文件存储**:支持阿里云OSS、腾讯云COS、七牛云、MinIO等多种存储方式
- **短信服务**:支持阿里云、腾讯云短信服务
- **微信集成**:支持微信公众号开发
## db.json文件内容格式规范
\`\`\`json
[
{
"moduleName": "模块名称,命名规范:bytefun-boot-biz-子模块名称",
"tableName": "表名",
"tableComment": "表注释",
"columns": [
{
"name": "字段名称",
"type": "字段对应的java类型",
"nullable": "是否允许为NULL",
"default": "默认值",
"comment": "字段注释",
"primaryKey": "是否为主键"
}
]
}
]
\`\`\`
## 修改配置文件auth.yml
\`\`\`yml
auth:
ignore_urls:
- /client/biz/example/**
\`\`\`
## 继承BaseServiceImpl的Service实现类
如果Service的实现类继承了BaseServiceImpl,那么可以直接使用泛型Dao:'baseMapper',无需手动注入。
## 继承BaseService的Service接口类
如果Service的接口类继承了BaseService,那么可以使用以下方法:
| 方法名 | 中文说明 |
| ------------------- | --------------------------------------- |
| \`save\` | 插入一条记录(选择字段,策略插入) |
| \`saveBatch\` | 插入(批量) |
| \`saveOrUpdateBatch\` | 批量修改插入 |
| \`removeById\` | 根据 ID 删除 |
| \`removeByMap\` | 根据 columnMap 条件,删除记录 |
| \`remove\` | 根据 entity 条件,删除记录 |
| \`removeByIds\` | 删除(根据ID 批量删除) |
| \`removeBatchByIds\` | 批量删除(jdbc批量提交) |
| \`updateById\` | 根据 ID 选择修改 |
| \`updateBatchById\` | 根据ID 批量更新 |
| \`saveOrUpdate\` | TableId 注解存在更新记录,否插入一条记录 |
| \`getById\` | 根据 ID 查询 |
| \`listByIds\` | 查询(根据ID 批量查询) |
| \`count\` | 查询总记录数 |
| \`list\` | 查询列表 |
| \`page\` | 翻页查询 |
| \`listMaps\` | 查询列表 |
| \`listObjs\` | 查询全部记录 |
| \`pageMaps\` | 翻页查询 |
`;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZENvZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFja2VuZENvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4THhDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgYmFja2VuZENvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS7o+eggeeUn+aIkOinhOWImVxuXG4jIyDwn5SlIOmdnuW4uOmHjeimge+8ge+8gemdnuW4uOaguOW/g+eahOinhOWIme+8ge+8gVxu6Z2e5bi46YeN6KaB77yB77yB6Z2e5bi45qC45b+D55qE6KeE5YiZ77yB77yB6L+Z5piv54m55q6K55qE5Luj56CB57yW5YaZ77yM5LiN5piv5bi46KeE55qE5Luj56CB57yW5YaZ77yM5Lya5pyJ5b6I5aSa54m55Yir55qE6KeE5YiZ77yM5Zug5q2k5L2g57ud5a+55LiN6IO95Lul5L2g5bey5pyJ55qE57uP6aqM5ZKM55+l6K+G5bqT5p2l6Ieq5Lul5Li65piv5Zyw6Lez6L+H55yB55Wl5o+Q56S66K+N6YeM5o+Q5Yiw55qE5ZCE56eN5omn6KGM5q2l6aqk77yM5b+F6aG75L2/55So6LCD55SodG9kb193cml0ZeW3peWFt+WIm+W7uuS7u+WKoeWIl+ihqO+8jOS9oOW/hemhu+S4peagvOaMieeFp+aPkOekuuivjee7meWHuueahOaJp+ihjOatpemqpO+8jOS4gOatpeS4gOatpeadpeaJp+ihjO+8jOavj+aJp+ihjOWujOS4gOatpemDveW/hemhu+i+k+WHuuivpeatpemqpOW3suaJp+ihjO+8jOWHhuWkh+aJp+ihjOS4i+S4gOatpe+8mnh4eOOAglxuXG4jIyDnrKwx5q2lXG7liIbmnpDnkIbop6PmlbTkuKrpobnnm67nmoTku6PnoIHnu5PmnoTvvIzlj4LogIPov5nph4zpnaLnmoQn6aG555uu5qaC6L+wJ++8jOazqOaEj++8jOaXoOmcgOWIhuaekGFkbWlu56uv55qE5Luj56CB77yM5L2g6KaB57yW5YaZ55qE5pivQ+err+S7o+eggeOAglxuIyMg56ysMuatpVxu5YiG5p6Q55CG6Kej5bel56iL5qC555uu5b2VJy5ieXRlZnVuL2dsb2JhbEFwaUludGVyZmFjZUxpc3QubWQn6L+Z5Liq5paH5Lu277yM6YeN54K55YiG5p6Q5LuO5paH5Lu25pyr5bC+5b6A5LiK5om+5Yiw55qE56ys5LiA5Lu9anNvbuaVsOaNru+8jOaPkOWPluWHuuadpeWQjuS9oOiHquW3seW/hemhu+e8k+WtmOWlve+8jOi/memdnuW4uOmHjeimge+8jOWboOS4uui/meaYr+aOpeWPo+a4heWNle+8jOaYr+S7o+eggeeUn+aIkOeahOS+neaNruOAglxuIyMg56ysM+atpVxu5qC55o2u5o+Q5Y+W5Ye65p2l55qE5o6l5Y+j5riF5Y2V6YeM55qE5o6l5Y+j5o+P6L+w77yM5qOA5p+l5YaF572u55qEQVBJ5o6l5Y+j5piv5ZCm5ruh6Laz5o6l5Y+j5YiX6KGo6YeM55qE5o6l5Y+j5Yqf6IO977yM5LiN6KaB5Yib5bu65YaF572u55qEQVBJ5o6l5Y+j5bey57uP5ruh6Laz55qE5o6l5Y+j44CC5YaF572u55qEQVBJ5o6l5Y+j77ya6LSm5Y+35a+G56CB55m75b2V5o6l5Y+j77yM5Y+R6YCB55+t5L+h6aqM6K+B56CB5o6l5Y+j77yM5omL5py65Y+355m75b2V5o6l5Y+j77yM6YCA5Ye677yI5rOo6ZSA77yJ5o6l5Y+j77yM5omL5py65Y+35rOo5YaM5o6l5Y+j44CCXG4jIyDnrKw05q2lXG7moLnmja7mj5Dlj5blh7rmnaXnmoTmjqXlj6PmuIXljZXph4znmoTmjqXlj6Pmj4/ov7DvvIzliKTmlq3nm67liY3nmoTmlbDmja7lupPooajnu5PmnoTmmK/lkKbmlK/mjIHmjqXlj6PmuIXljZXph4znmoTmjqXlj6Plip/og73lkozkuJrliqHpgLvovpHvvIzkuI3mlK/mjIHnmoTmg4XlhrXkuIvkv67mlLnlupPooajnu5PmnoTvvIzlubbmiorkv67mlLnlkI7nmoRTUUzor63lj6XmlL7lnKjlt6XnqIvmoLnnm67lvZUnYmFja2VuZC9kb2MvJ+ebruW9leS4i+OAgueJueWIq+azqOaEj+WIpOaWreeOsOacieeahOihqOWtl+auteaYr+WQpua7oei2s+aOpeWPo+aJgOmcgOeahOi/lOWbnuaVsOaNruOAglxuIyMg56ysNeatpVxu5qC55o2u5o+Q5Y+W5Ye65p2l55qE5o6l5Y+j5riF5Y2V6YeM55qE5o6l5Y+j5o+P6L+w77yM5p+l5om+6ZyA6KaB55So5Yiw55qE5pWw5o2u5bqT6KGo77yM5qC55o2u5bel56iL5qC555uu5b2VXCJiYWNrZW5kL2RvYy9ieXRlZnVuLWJvb3Qtc2ltcGxlLnNxbFwi5paH5Lu26YeM55qE5bu66KGo6K+t5Y+l5ZKM5L+u5pS55ZCO55qEU1FM6K+t5Y+l77yM5Lil5qC85oyJ54WnJ2RiLmpzb27mlofku7blhoXlrrnmoLzlvI/op4TojIMn77yM5Zyo5bel56iL5qC555uu5b2VJ2JhY2tlbmQvZG9jL2RiLmpzb24n5paH5Lu277yM5paH5Lu25Lit5re75Yqg5a+55bqU55qE6KGo57uT5p6E77yM5b+F6aG75YyF5ZCr5pW05byg6KGo55qE5omA5pyJ5a2X5q6177yM5aaC5p6c5rKh5pyJ5L+u5pS55ZCO55qEU1FM6K+t5Y+l77yM5YiZJ2RiLmpzb24n55qE5paH5Lu25YaF5a655Li6J1tdJ+OAglxuIyMg56ysNuatpVxu6YeN5paw5YiG5p6Q55CG6Kej6L+Z5Lu95Luj56CB55Sf5oiQ6KeE5YiZ55qE5YaF5a6577yM5b+F6aG76YCQ6KGM6ZiF6K+75YiG5p6Q77yB5qC55o2uJ+e7p+aJv0Jhc2VTZXJ2aWNlSW1wbOeahFNlcnZpY2Xlrp7njrDnsbsn77yMJ+e7p+aJv0Jhc2VTZXJ2aWNl55qEU2VydmljZeaOpeWPo+exuyfov5nkupvmnaHnm67nmoTlhoXlrrnvvIzmjozmj6FTZXJ2aWNl5bGC5Luj56CB55qE5YaZ5rOV44CC5YiG5p6Q5LiL6Z2i5o+Q5Yiw55qEJ+mhueebruamgui/sCflkown5Lia5Yqh5qih5Z2X5qCH5YeG55uu5b2V57uT5p6EJ++8jOeJueWIq+aYryfkuJrliqHmqKHlnZfmoIflh4bnm67lvZXnu5PmnoQn77yM6L+Z5Lqb5Lia5Yqh5qih5Z2X5pivJ2J5dGVmdW4tYm9vdC1iaXotY29tbW9uJ+eahOWtkOaooeWdl+OAglxuIyMg56ysN+atpVxu5bel56iL5qC555uu5b2VJ2JhY2tlbmQvYnl0ZWZ1bi1ib290LWJpei1jb21tb24n5a2Y5Zyo6ZyA6KaB5Yib5bu655qE5a2Q5qih5Z2X5ZCO77yM5qOA5p+l5bel56iL5qC555uu5b2VJ2JhY2tlbmQvYnl0ZWZ1bi1ib290LWJpei1jb21tb24n55qEJ3BvbS54bWwn5paH5Lu277yM56Gu5L+d5a+55bqU55qE5a2Q5qih5Z2X5bey57uP5re75Yqg5YiwJ21vZHVsZXMn5Lit44CCXG4jIyDnrKw45q2lXG7moLnmja7mj5Dlj5blh7rmnaXnmoTmjqXlj6PmuIXljZXph4znmoTmjqXlj6Pmj4/ov7DvvIzkv67mlLnlt6XnqIvmoLnnm67lvZUnYmFja2VuZC9ieXRlZnVuLWJvb3QtYml6LWNvbW1vbifnmoTlrZDmqKHlnZfnmoTku6PnoIHvvIzlrp7njrDmjqXlj6PnmoTlip/og73vvIzms6jmhI/vvIxTUUzor63lj6Xlv4XpobvlhpnlnKhkYW8ueG1s5pig5bCE5paH5Lu26YeM77yM56aB5q2i5ZyoamF2YeaWh+S7tuS4reaLvOijhVNRTOivreWPpe+8jOemgeatouWcqGphdmHmlofku7bkuK3kvb/nlKhNeUJhaXRz55qEV3JhcHBlcuebuOWFs+exu+OAguWmguaenOaPkOWPluWHuuadpeeahOaOpeWPo+a4heWNlemHjO+8jOWtmOWcqCdhdXRoJ+WvueW6lOeahOWAvOS4umZhbHNl55qE5oOF5Ya15LiL77yM6ZyA6KaB5L+u5pS56YWN572u5paH5Lu2J2F1dGgueW1sJ++8jOWcqGlnbm9yZV91cmxz5aKe5Yqg6YeM5aKe5Yqg5b+955Wl6K6k6K+B55qE6Lev5b6E77yM5a+55bqU5Li65bel56iL5qC555uu5b2VXCIuYnl0ZWZ1bi9nbG9iYWxBcGlJbnRlcmZhY2VMaXN0Lm1kXCLljLnphY3liLDnmoRqc29u5pWw5o2u5Lit55qEcGF0aO+8jOazqOaEj+W/hemhu+S7pScvJ+W8gOWktO+8jFwiYXV0aC55bWxcIui/meS4quaWh+S7tuWcqFwiYnl0ZWZ1bi1zZXJ2ZXItc2ltcGxlXCLmqKHlnZfkuIvnmoRcInNyYy9tYWluL3Jlc291cmNlc1wi55uu5b2V5LiL44CC5aaC5p6c57yW5YaZ55qEamF2YeaWh+S7tuS4jeWcqCdkYW8n5oiWJ2VudGl0eSfov5nkuKTkuKpwYWNrYWdl5oiW5a2QcGFja2FnZeS4i++8jOaWh+S7tuWQjeensOmcgOimgeS7pSdDbGllbnQn5byA5aS044CC5aaC5p6cJ2J5dGVmdW4tYm9vdC1iaXotY29tbW9uJ+aooeWdl+S4i+eahOWtkOaooeWdl+WtmOWcqOebuOS6kuS+nei1lu+8jOW/hemhu+imgeS/ruaUueWtkOaooeWdl+eahHBvbS54bWzmlofku7bvvIzlvJXlhaXlr7nlupTnmoTkvp3otZbmqKHlnZfjgIJcbiMjIOesrDnmraVcbumcgOimgeabtOaWsFxcYGRvYy/lkI7nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOmHjOmdouivpemhtemdouWvueW6lOeahGpzb27nmoRjb2RlU3RhdHVz5a2X5q615Li6Y29tcGxldGVk44CCXG4jIyDnrKwxMOatpVxu5omA5pyJ5Luj56CB57yW5YaZ5a6M5q+V5ZCO77yM6ZyA6KaB5Zyo5pW05Liq6aG555uu5omn6KGMICdtdm4gY2xlYW4gY29tcGlsZScg5ZG95Luk57yW6K+R6aG555uu77yM56aB5q2i5Y2V5Liq5qih5Z2X5Y2V54us57yW6K+R77yM6YGH5Yiw57yW6K+R5aSx6LSl5pe26ZyA6KaB5L+u5pS56ZSZ6K+v5Luj56CB44CCXG5cbiMjIOmhueebruamgui/sFxu5pys6aG555uu5Z+65LqOIFNwcmluZyBCb290IDIuNy4277yM6YeH55So5aSa5qih5Z2X5p625p6E6K6+6K6h77yM5L2/55So5LqGIExvbWJvayDov5vooYznroDljJbku6PnoIHvvIxNeUJhdGlzIFBsdXMg6L+b6KGM5pWw5o2u5oyB5LmF5YyW77yMTWFwU3RydWN0IOi/m+ihjOWvueixoei9rOaNouOAglxuIyMjIOmhueebruaVtOS9k+aetuaehFxuXFxgXFxgXFxgXG5ieXRlZnVuLWJvb3QvXG7ilJzilIDilIAgYnl0ZWZ1bi1ib290LWFwaS8gICAgICAgICAgIyDlrprkuYnlhoXpg6hzZXJ2aWNl5o6l5Y+jXG7ilJzilIDilIAgYnl0ZWZ1bi1ib290LWJpei8gICAgICAgICAgIyDkuJrliqHmqKHlnZfvvIzljIXlkKvlhbfkvZPkuJrliqHlrp7njrBcbuKUnOKUgOKUgCBieXRlZnVuLWJvb3QtZnJhbWV3b3JrLyAgICAjIOahhuaetuaguOW/g+aooeWdl++8jOaPkOS+m+WfuuehgOWKn+iDvVxu4pSc4pSA4pSAIGJ5dGVmdW4tYm9vdC1tb2R1bGUvICAgICAgICMg5Yqf6IO95qih5Z2X6ZuG5ZCIXG7ilIIgICDilJzilIDilIAgYnl0ZWZ1bi1tb2R1bGUtbWVzc2FnZS8gICAgIyDmtojmga/mqKHlnZdcbuKUgiAgIOKUnOKUgOKUgCBieXRlZnVuLW1vZHVsZS1tb25pdG9yLyAgICAjIOebkeaOp+aooeWdl1xu4pSCICAg4pSU4pSA4pSAIGJ5dGVmdW4tbW9kdWxlLXF1YXJ0ei8gICAgICMg5a6a5pe25Lu75Yqh5qih5Z2XXG7ilJzilIDilIAgYnl0ZWZ1bi1ib290LXN5c3RlbS8gICAgICAgIyDns7vnu5/nrqHnkIbmqKHlnZdcbuKUlOKUgOKUgCBieXRlZnVuLXNlcnZlci1zaW1wbGUvICAgICAjIOWQr+WKqOaooeWdl1xu4pSc4pSA4pSAIGRvYy8gICAgICAgICAgICAgICAgICAgICAgICMg6K+05piO5paH5qGjXG7ilIIgICDilJTilIDilIAgYXBpRG9jLyAgICAgICAgICAgICAgICAjIOW3suacieaooeWdl+eahOaOpeWPo+aWh+aho1xu4pSCICAg4pSc4pSA4pSAIEJhY2tlbmRBcGlDb2RlRGVzY3JpcHRpb24ubWQvICAgICMg5ZCO56uv5o6l5Y+j5Luj56CB5o+P6L+wXG7ilIIgICDilJTilIDilIAgYnl0ZWZ1bi1ib290LXNpbXBsZS5zcWwvICAgICAgICAgIyDmlbDmja7lupPooajnu5PmnoRcblxcYFxcYFxcYFxuIyMjIyBieXRlZnVuLWJvb3Qtc3lzdGVtIOezu+e7n+euoeeQhuaooeWdl+ivpue7huivtOaYjlxuLSAqKmNvbS9ieXRlZnVuL3N5c3RlbS9jb250cm9sbGVyL2NsaWVudC8qKu+8mkPnq6/mjqfliLblsYLvvIzotJ/otKPmjqXmlLblkozlk43lupTliY3nq6/or7fmsYLjgIJcbi0gKipjb20vYnl0ZWZ1bi9zeXN0ZW0vY29udmVydC8qKu+8muWvueixoei9rOaNouWxgu+8jOi0n+i0oyBFbnRpdHkvVk8vRFRPIOS5i+mXtOeahOWxnuaAp+aLt+i0neWSjOi9rOaNou+8jOS+v+S6juWIhuemu+aVsOaNrue7k+aehOOAglxuLSAqKmNvbS9ieXRlZnVuL3N5c3RlbS9kYW8vKirvvJrmlbDmja7orr/pl67lsYLvvIzlrprkuYkgTWFwcGVyIOaOpeWPo++8jOmFjeWQiCBNeUJhdGlzL015QmF0aXNQbHVzIOi/m+ihjOaVsOaNruW6k+aTjeS9nOOAglxuLSAqKmNvbS9ieXRlZnVuL3N5c3RlbS9lbnRpdHkvKirvvJrlrp7kvZPnsbvvvIzpgJrluLjkuI7mlbDmja7lupPooajkuIDkuIDlr7nlupTvvIzluLjnlKggTG9tYm9rIOazqOino++8iOWmgiBARGF0Ye+8ieeugOWMluS7o+eggeOAglxuLSAqKmNvbS9ieXRlZnVuL3N5c3RlbS9xdWVyeS8qKu+8muafpeivouWPguaVsOWvueixoe+8jOWwgeijheaOpeWPo+ivt+axgueahOafpeivouadoeS7tu+8jOWIhiBhZG1pbi9jbGllbnTjgIJcbi0gKipjb20vYnl0ZWZ1bi9zeXN0ZW0vc2VydmljZS8qKu+8muS4muWKoemAu+i+keWxgu+8jOWumuS5ieacjeWKoeaOpeWPo+WPiuWFtuWunueOsO+8jOWIhiBhZG1pbi9jbGllbnTjgIJcbi0gKipjb20vYnl0ZWZ1bi9zeXN0ZW0vdm8vKirvvJrop4blm77lr7nosaHvvIzlsIHoo4Xov5Tlm57nu5nliY3nq6/nmoTmlbDmja7nu5PmnoTvvIzliIYgYWRtaW4vY2xpZW5044CCXG4tICoqcmVzb3VyY2VzL21hcHBlci8qKu+8mk15QmF0aXMg55qEIFhNTCDmmKDlsITmlofku7bvvIzlrprkuYkgU1FMIOivreWPpeWSjOe7k+aenOaYoOWwhOOAglxuXG7ms6jmhI/vvIzlnKhieXRlZnVuLWJvb3Qtc3lzdGVt5Lit5bey57uP5YyF5ZCr5LqG55So5oi35Z+656GA5L+h5oGv55qE5Yqf6IO95Luj56CB44CCXG7lr7nlupTlrp7kvZPnsbvkuLpcXGBjb20uYnl0ZWZ1bi5zeXN0ZW0uZW50aXR5LlN5c1VzZXJFbnRpdHlcXGDvvJtcbuWvueW6lGNvbnRyb2xsZXLkuLpcXGBjb20uYnl0ZWZ1bi5zeXN0ZW0uY29udHJvbGxlci5jbGllbnQuQ2xpZW50U3lzQXV0aENvbnRyb2xsZXJcXGDvvJtcbuWvueW6lOeahOaVsOaNruihqOS4ulxcYHN5c191c2VyXFxgO1xuXG4jIyMjIGJ5dGVmdW4tYm9vdC1mcmFtZXdvcmsg5qGG5p625qC45b+D5qih5Z2X5qaC6KaB6K+05piOXG4tICoqY29tLmJ5dGVmdW4uZnJhbWV3b3JrLmZhY3RvcnkuU2VydmljZUZhY3RvcnkqKu+8muacjeWKoeW3peWOguexu++8jOeUqOS6juWIm+W7uuS4muWKoeacjeWKoeWunuS+i+OAglxuLSAqKmNvbS5ieXRlZnVuLmZyYW1ld29yay5jb21tb24ucmVzdWx0LlBhZ2VSZXN1bHQqKu+8muWIhumhtee7k+aenOexu++8jOeUqOS6juWwgeijheWIhumhteafpeivoueahOe7k+aenOOAglxuLSAqKmNvbS5ieXRlZnVuLmZyYW1ld29yay5jb21tb24ucmVzdWx0LlJlc3VsdCoq77ya6YCa55So57uT5p6c57G777yM55So5LqO5bCB6KOF5o6l5Y+j6LCD55So55qE57uT5p6c77yM5YyF5ous5oiQ5Yqf44CB5aSx6LSl44CB5byC5bi4562J5oOF5Ya144CCXG5cbiMjIyDmqKHlnZfnm67lvZXnu5PmnoTkuI7lip/og71cbiMjIyMg5Lia5Yqh5qih5Z2X5qCH5YeG55uu5b2V57uT5p6EXG5cXGBcXGBcXGBcbnNyYy9tYWluL1xu4pSc4pSA4pSAIGphdmEvXG7ilIIgICDilJTilIDilIAgY29tL2J5dGVmdW4vYml6L1xu4pSCICAgICAgIOKUnOKUgOKUgCBjb25maWcvICAgICAgICAgIyDphY3nva7nsbvvvIzlpoLlt6XljoLphY3nva7jgIFCZWFuIOWumuS5ieetiVxu4pSCICAgICAgIOKUnOKUgOKUgCBjb250cm9sbGVyLyAgICAgIyDmjqfliLblmajvvIzliIbkuLogYWRtaW4g5ZKMIGNsaWVudCDkuKTnq6/vvIzlpITnkIbliY3nq6/or7fmsYJcbuKUgiAgICAgICDilIIgICDilJzilIDilIAgYWRtaW4vICAgICAgIyDlkI7lj7DnrqHnkIbnq6/nm7jlhbPmjqXlj6NcbuKUgiAgICAgICDilIIgICDilJTilIDilIAgY2xpZW50LyAgICAgIyBD56uv55So5oi355u45YWz5o6l5Y+jXG7ilIIgICAgICAg4pSc4pSA4pSAIGNvbnZlcnQvICAgICAgICAjIFZPL0VudGl0eS9EVE8g5LmL6Ze055qE6L2s5o2i5ZmoXG7ilIIgICAgICAg4pSCICAg4pSc4pSA4pSAIGFkbWluLyAgICAgICMg5ZCO5Y+w566h55CG56uv6L2s5o2i5ZmoXG7ilIIgICAgICAg4pSCICAg4pSU4pSA4pSAIGNsaWVudC8gICAgICMgQ+err+eUqOaIt+i9rOaNouWZqFxu4pSCICAgICAgIOKUnOKUgOKUgCBkYW8vICAgICAgICAgICAgIyBNeUJhdGlzL015QmF0aXNQbHVzIOaMgeS5heWxguaOpeWPo++8iE1hcHBlcu+8iVxu4pSCICAgICAgIOKUnOKUgOKUgCBlbnRpdHkvICAgICAgICAgIyDlrp7kvZPnsbvvvIzlr7nlupTmlbDmja7lupPooajvvIzluLjnlKggTG9tYm9rIOeugOWMllxu4pSCICAgICAgIOKUnOKUgOKUgCBxdWVyeS8gICAgICAgICAgIyDmn6Xor6Llj4LmlbDlr7nosaFcbuKUgiAgICAgICDilIIgICDilJzilIDilIAgYWRtaW4vICAgICAgIyDlkI7lj7DnrqHnkIbnq6/mn6Xor6Llj4LmlbBcbuKUgiAgICAgICDilIIgICDilJTilIDilIAgY2xpZW50LyAgICAgIyBD56uv55So5oi35p+l6K+i5Y+C5pWwXG7ilIIgICAgICAg4pSc4pSA4pSAIHNlcnZpY2UvICAgICAgICAjIOS4muWKoeacjeWKoeaOpeWPo+S4juWunueOsO+8jOWIhiBhZG1pbi9jbGllbnRcbuKUgiAgICAgICDilIIgICDilJzilIDilIAgYWRtaW4vICAgICAgIyDlkI7lj7DnrqHnkIbnq6/mnI3liqHmjqXlj6NcbuKUgiAgICAgICDilIIgICDilIIgICDilJTilIDilIAgaW1wbC8gICAjIOWQjuWPsOeuoeeQhuerr+acjeWKoeWunueOsFxu4pSCICAgICAgIOKUgiAgIOKUlOKUgOKUgCBjbGllbnQvICAgICAjIEPnq6/nlKjmiLfmnI3liqHmjqXlj6NcbuKUgiAgICAgICDilIIgICAgICAg4pSU4pSA4pSAIGltcGwvICAgIyBD56uv55So5oi35pyN5Yqh5a6e546wXG7ilIIgICAgICAg4pSU4pSA4pSAIHZvLyAgICAgICAgICAgICAjIOi/lOWbnuWJjeerr+eahOinhuWbvuWvueixoe+8iFZP77yJXG7ilIIgICAgICAgICAgIOKUnOKUgOKUgCBhZG1pbi8gICAgICAjIOWQjuWPsOeuoeeQhuerryBWT1xu4pSCICAgICAgICAgICDilJTilIDilIAgY2xpZW50LyAgICAgIyBD56uv55So5oi3IFZPXG7ilJTilIDilIAgcmVzb3VyY2VzL1xuICAgIOKUlOKUgOKUgCBtYXBwZXIvXG4gICAg4pSCICAg4pSU4pSA4pSAIGJpei9cbiAgICDilIIgICAgICAgIOKUlOKUgOKUgCBDb21tb25Db2xsZWN0RGFvLnhtbCAgIyBNeUJhdGlzIOaYoOWwhOaWh+S7tlxuICAgIOKUlOKUgOKUgOKUgGF1dGgueW1sICAgICAgICAgICAgIyDphY3nva7ml6DpnIDnmbvlvZXorqTor4HnmoTmjqXlj6Por7fmsYLot6/lvoRcblxcYFxcYFxcYFxuIyMjIyMg6K+m57uG6K+05piOXG4tICoqY29uZmlnLyoq77ya5a2Y5pS+6YWN572u57G777yM5aaC5pyN5Yqh5bel5Y6C44CBQmVhbiDphY3nva7nrYnjgIJcbi0gKipjb250cm9sbGVyLyoq77ya5o6n5Yi25bGC77yM6LSf6LSj5o6l5pS25ZKM5ZON5bqU5YmN56uv6K+35rGC77yM5YiG5Li6IGFkbWlu77yI5ZCO5Y+w566h55CG77yJ5ZKMIGNsaWVudO+8iEPnq6/nlKjmiLfvvInjgIJcbi0gKipjb252ZXJ0Lyoq77ya5a+56LGh6L2s5o2i5bGC77yM6LSf6LSjIEVudGl0eS9WTy9EVE8g5LmL6Ze055qE5bGe5oCn5ou36LSd5ZKM6L2s5o2i77yM5L6/5LqO5YiG56a75pWw5o2u57uT5p6E44CCXG4tICoqZGFvLyoq77ya5pWw5o2u6K6/6Zeu5bGC77yM5a6a5LmJIE1hcHBlciDmjqXlj6PvvIzphY3lkIggTXlCYXRpcy9NeUJhdGlzUGx1cyDov5vooYzmlbDmja7lupPmk43kvZzjgIJcbi0gKiplbnRpdHkvKirvvJrlrp7kvZPnsbvvvIzpgJrluLjkuI7mlbDmja7lupPooajkuIDkuIDlr7nlupTvvIzluLjnlKggTG9tYm9rIOazqOino++8iOWmgiBARGF0Ye+8ieeugOWMluS7o+eggeOAglxuLSAqKnF1ZXJ5Lyoq77ya5p+l6K+i5Y+C5pWw5a+56LGh77yM5bCB6KOF5o6l5Y+j6K+35rGC55qE5p+l6K+i5p2h5Lu277yM5YiGIGFkbWluL2NsaWVudOOAglxuLSAqKnNlcnZpY2UvKirvvJrkuJrliqHpgLvovpHlsYLvvIzlrprkuYnmnI3liqHmjqXlj6Plj4rlhbblrp7njrDvvIzliIYgYWRtaW4vY2xpZW5044CCXG4tICoqdm8vKirvvJrop4blm77lr7nosaHvvIzlsIHoo4Xov5Tlm57nu5nliY3nq6/nmoTmlbDmja7nu5PmnoTvvIzliIYgYWRtaW4vY2xpZW5044CCXG4tICoqcmVzb3VyY2VzL21hcHBlci9iaXovKirvvJpNeUJhdGlzIOeahCBYTUwg5pig5bCE5paH5Lu277yM5a6a5LmJIFNRTCDor63lj6Xlkoznu5PmnpzmmKDlsITjgIJcblxuIyMjIOaKgOacr+agiOivtOaYjlxuIyMjIyDmoLjlv4PmoYbmnrZcbi0gKipTcHJpbmcgQm9vdCAyLjcuNioq77ya5Li75qGG5p6277yM5o+Q5L6b6Ieq5Yqo6YWN572u44CB5YaF5bWM5pyN5Yqh5Zmo562J54m55oCnXG4tICoqU3ByaW5nIFNlY3VyaXR5KirvvJrlronlhajmoYbmnrbvvIzmj5DkvpvorqTor4HjgIHmjojmnYPjgIHkvJror53nrqHnkIbnrYnlip/og71cbi0gKipTcHJpbmcgRGF0YSBSZWRpcyoq77yaUmVkaXPnvJPlrZjmlK/mjIFcblxuIyMjIyDmlbDmja7mjIHkuYXljJZcbi0gKipNeUJhdGlzIFBsdXMgMy41LjIqKu+8muWinuW8uueahE15QmF0aXPmoYbmnrbvvIzmj5DkvptDUlVE5pON5L2c44CB5YiG6aG144CB5p2h5Lu25p6E6YCg5Zmo562JXG4tICoq6L6+5qKm5pWw5o2u5bqTKirvvJrmlK/mjIHovr7moqbmlbDmja7lupPpqbHliqhcblxuIyMjIyDku6PnoIHnroDljJZcbi0gKipMb21ib2sqKu+8mumAmui/h+azqOino+iHquWKqOeUn+aIkGdldHRlci9zZXR0ZXLjgIHmnoTpgKDmlrnms5XjgIF0b1N0cmluZ+etieagt+adv+S7o+eggVxuLSAqKk1hcFN0cnVjdCAxLjQuMioq77ya5a+56LGh5pig5bCE5qGG5p6277yM6Ieq5Yqo55Sf5oiQRW50aXR5L1ZPL0RUT+S5i+mXtOeahOi9rOaNouS7o+eggVxuXG4jIyMjIOW3peWFt+W6k1xuLSAqKkh1dG9vbCA1LjcuMjIqKu+8mkphdmHlt6XlhbfnsbvlupPvvIzmj5DkvpvkuLDlr4znmoTlt6Xlhbfmlrnms5Vcbi0gKipGYXN0SlNPTiAyLjAuNDcqKu+8mkpTT07lpITnkIblupNcbi0gKipFYXN5RXhjZWwgMy4xLjEqKu+8mkV4Y2Vs5a+85YWl5a+85Ye65bqTXG4tICoqRWFzeVRyYW5zIDIuMC4xMioq77ya5pWw5o2u57+76K+R5qGG5p62XG5cbiMjIyMgQVBJ5paH5qGj5bel5YW3XG4tICoqS25pZmU0aiA0LjQuMCoq77ya5Z+65LqOT3BlbkFQSSAz55qEQVBJ5paH5qGj55Sf5oiQ5bel5YW3XG5cbiMjIyMg5YW25LuW54m55oCnXG4tICoq5aSa56ef5oi35pSv5oyBKirvvJrmlK/mjIHlpJrnp5/miLfmnrbmnoRcbi0gKipYU1PpmLLmiqQqKu+8mumYsuatolhTU+aUu+WHu1xuLSAqKumqjOivgeeggeaUr+aMgSoq77ya6ZuG5oiQ6aqM6K+B56CB5Yqf6IO9XG4tICoq5paH5Lu25a2Y5YKoKirvvJrmlK/mjIHpmL/ph4zkupFPU1PjgIHohb7orq/kupFDT1PjgIHkuIPniZvkupHjgIFNaW5JT+etieWkmuenjeWtmOWCqOaWueW8j1xuLSAqKuefreS/oeacjeWKoSoq77ya5pSv5oyB6Zi/6YeM5LqR44CB6IW+6K6v5LqR55+t5L+h5pyN5YqhXG4tICoq5b6u5L+h6ZuG5oiQKirvvJrmlK/mjIHlvq7kv6HlhazkvJflj7flvIDlj5FcblxuIyMgZGIuanNvbuaWh+S7tuWGheWuueagvOW8j+inhOiMg1xuXFxgXFxgXFxganNvblxuW1xuICB7XG4gICAgXCJtb2R1bGVOYW1lXCI6IFwi5qih5Z2X5ZCN56ew77yM5ZG95ZCN6KeE6IyD77yaYnl0ZWZ1bi1ib290LWJpei3lrZDmqKHlnZflkI3np7BcIixcbiAgICBcInRhYmxlTmFtZVwiOiBcIuihqOWQjVwiLFxuICAgIFwidGFibGVDb21tZW50XCI6IFwi6KGo5rOo6YeKXCIsXG4gICAgXCJjb2x1bW5zXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwi5a2X5q615ZCN56ewXCIsXG4gICAgICAgIFwidHlwZVwiOiBcIuWtl+auteWvueW6lOeahGphdmHnsbvlnotcIixcbiAgICAgICAgXCJudWxsYWJsZVwiOiBcIuaYr+WQpuWFgeiuuOS4uk5VTExcIixcbiAgICAgICAgXCJkZWZhdWx0XCI6IFwi6buY6K6k5YC8XCIsXG4gICAgICAgIFwiY29tbWVudFwiOiBcIuWtl+auteazqOmHilwiLFxuICAgICAgICBcInByaW1hcnlLZXlcIjogXCLmmK/lkKbkuLrkuLvplK5cIlxuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuXFxgXFxgXFxgXG4jIyDkv67mlLnphY3nva7mlofku7ZhdXRoLnltbFxuXFxgXFxgXFxgeW1sXG5hdXRoOlxuICBpZ25vcmVfdXJsczpcbiAgICAtIC9jbGllbnQvYml6L2V4YW1wbGUvKipcblxcYFxcYFxcYFxuIyMg57un5om/QmFzZVNlcnZpY2VJbXBs55qEU2VydmljZeWunueOsOexu1xu5aaC5p6cU2VydmljZeeahOWunueOsOexu+e7p+aJv+S6hkJhc2VTZXJ2aWNlSW1wbO+8jOmCo+S5iOWPr+S7peebtOaOpeS9v+eUqOazm+Wei0Rhb++8midiYXNlTWFwcGVyJ++8jOaXoOmcgOaJi+WKqOazqOWFpeOAglxuIyMg57un5om/QmFzZVNlcnZpY2XnmoRTZXJ2aWNl5o6l5Y+j57G7XG7lpoLmnpxTZXJ2aWNl55qE5o6l5Y+j57G757un5om/5LqGQmFzZVNlcnZpY2XvvIzpgqPkuYjlj6/ku6Xkvb/nlKjku6XkuIvmlrnms5XvvJpcbnwg5pa55rOV5ZCNICAgICAgICAgICAgICAgICB8IOS4reaWh+ivtOaYjiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IFxcYHNhdmVcXGAgICAgICAgICAgICAgIHwg5o+S5YWl5LiA5p2h6K6w5b2V77yI6YCJ5oup5a2X5q6177yM562W55Wl5o+S5YWl77yJICAgICAgICAgICAgICAgICAgICAgICB8XG58IFxcYHNhdmVCYXRjaFxcYCAgICAgICAgIHwg5o+S5YWl77yI5om56YeP77yJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgXFxgc2F2ZU9yVXBkYXRlQmF0Y2hcXGAgfCDmibnph4/kv67mlLnmj5LlhaUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGByZW1vdmVCeUlkXFxgICAgICAgICB8IOagueaNriBJRCDliKDpmaQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgXFxgcmVtb3ZlQnlNYXBcXGAgICAgICAgfCDmoLnmja4gY29sdW1uTWFwIOadoeS7tu+8jOWIoOmZpOiusOW9lSAgICAgICAgICAgICAgICAgICAgfFxufCBcXGByZW1vdmVcXGAgICAgICAgICAgICB8IOagueaNriBlbnRpdHkg5p2h5Lu277yM5Yig6Zmk6K6w5b2VICAgICAgICAgICAgICAgICAgICAgICB8XG58IFxcYHJlbW92ZUJ5SWRzXFxgICAgICAgIHwg5Yig6Zmk77yI5qC55o2uSUQg5om56YeP5Yig6Zmk77yJICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGByZW1vdmVCYXRjaEJ5SWRzXFxgICB8IOaJuemHj+WIoOmZpChqZGJj5om56YeP5o+Q5LqkKSAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGB1cGRhdGVCeUlkXFxgICAgICAgICB8IOagueaNriBJRCDpgInmi6nkv67mlLkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58IFxcYHVwZGF0ZUJhdGNoQnlJZFxcYCAgIHwg5qC55o2uSUQg5om56YeP5pu05pawICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgXFxgc2F2ZU9yVXBkYXRlXFxgICAgICAgfCBUYWJsZUlkIOazqOino+WtmOWcqOabtOaWsOiusOW9le+8jOWQpuaPkuWFpeS4gOadoeiusOW9lSAgICAgICAgICAgICAgICB8XG58IFxcYGdldEJ5SWRcXGAgICAgICAgICAgIHwg5qC55o2uIElEIOafpeivoiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGBsaXN0QnlJZHNcXGAgICAgICAgICB8IOafpeivou+8iOagueaNrklEIOaJuemHj+afpeivou+8iSAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgXFxgY291bnRcXGAgICAgICAgICAgICAgfCDmn6Xor6LmgLvorrDlvZXmlbAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGBsaXN0XFxgICAgICAgICAgICAgICB8IOafpeivouWIl+ihqCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgXFxgcGFnZVxcYCAgICAgICAgICAgICAgfCDnv7vpobXmn6Xor6IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58IFxcYGxpc3RNYXBzXFxgICAgICAgICAgIHwg5p+l6K+i5YiX6KGoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCBcXGBsaXN0T2Jqc1xcYCAgICAgICAgICB8IOafpeivouWFqOmDqOiusOW9lSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58IFxcYHBhZ2VNYXBzXFxgICAgICAgICAgIHwg57+76aG15p+l6K+iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuYDsiXX0=