bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
201 lines (180 loc) • 50.1 kB
JavaScript
export const codePromptTemplate = `# 你是typescript代码专家,根据用户输入的需求描述,严格遵守\`代码规范\`,参考\`代码例子\`,严格按照\`编写代码的11 个步骤\`完成代码开发
## 代码规范
- **代码注释使用中文**:代码的注释文字,必须要使用中文,不能使用其他语言
- **结尾禁止分号**:一句代码的结尾禁止写分号,不需要写分号的
- 如果是移动端开发式不需要考虑鼠标相关事情的,电脑端才需要考虑鼠标相关事情
- 字符串要以单引号来写,如:'我的'。
## 页面默认业务逻辑
- **如用户没在描述中明确指明页面的业务逻辑,其中项目设计文档'.bytefun/{数字序号}-xxx功能模块业务逻辑设计.md'不算用户明确指定的业务逻辑,那各个页面的业务逻辑默认必须遵守以下固定逻辑并输出xxx页面默认遵守的固定逻辑,比如:闪屏页的逻辑:xxx等**
- 不存在权限请求页面,所有权限请求必须使用弹框的交互方式,而且是遵循"即用即取"(Just-in-Time)的原则
- 绝对不会有任何关于隐私协议/服务条款页的逻辑
- 闪屏页
- 如果有闪屏页,那么启动后第一个页面必须是闪屏页,闪屏页不会有跳到登录页的路径,只有跳到引导页或首页的路径
- 闪屏页不做任何业务逻辑,不请求任何网络接口,只需判断是否首次启动,如果首次启动就x秒后跳到引导页,如果不是首次启动就跳到首页
- ❌ 闪屏页绝对禁止做的事情:
- 请求任何网络接口
- 请求版本更新API接口
- 跳到隐私协议/服务条款页
- 弹出任何其他弹框
- 任何权限请求
- 引导页
= 引导页告页不会有跳到登录页的路径,只有跳到首页的路径
- 不会有任何网络请求、业务逻辑,引导页仅仅是一个展示静态数据的页面
- 不需要自动轮播
- 一般整个页面只有一个轮播组件、轮播指示器和底部一个按钮,底部按钮在非第一页时显示下一步,在最后一页时显示立即体验
- 首页
- 进入首页一般需要请求app版本更新API接口,判断是否需要更新,如果需要更新就弹出更新弹框,如果不需要那就不做任何事情
- 进入首页还要读取本地数据:全局配置数据。一般用于功能开关、ABTest配置等,读取完毕后,还要网络请求一次全局配置API,将全局配置数据更新到本地数据中
- 一般是有一个底部功能导航栏,点击底部功能导航栏的图标会切换到对应的tab页面,tab页面一般有多个,每个tab页面有不同的业务逻辑
- 如果用户输入的需求描述没有明确指定首页底部功能导航栏有哪些功能,那么你必须思考首页底部功能导航栏有哪些功能item项
- 登录页
- 登录页是用户点击需要登录才能访问的页面时,才会跳转到的页面,而不是从闪屏页判断是否需要登录然后跳进去
## **执行业务逻辑代码实现:每一个页面业务逻辑代码实现都必须调用 todo_write 工具创建以下 11 个任务列表,创建完成后必须确认:如果任务数量不是 11 个,立即报错并重新创建。**
1. 严格按照\`步骤规则1\`执行任务,阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
2. 严格按照\`步骤规则2\`执行任务,在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发
3. 严格按照\`步骤规则3\`执行任务,使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用
4. 严格按照\`步骤规则4\`执行任务,使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端业务错误码、API接口、API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据
5. 严格按照\`步骤规则5\`执行任务,为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点
6. 严格按照\`步骤规则6\`执行任务,必须认真仔细阅读理解禁止写的代码语法
7. 严格按照\`步骤规则7\`执行任务,结合第5个任务理解的10个知识点以及\`代码例子\`,开始编写代码
8. 严格按照\`步骤规则8\`执行任务,执行\`npm run lint-ts\`命令检查特殊编译问题。
9. 严格按照\`步骤规则9\`执行任务,执行\`npm run build\`编译命令检查编译问题,如果编译有问题,必须立即修复,并且修复完毕后,必须再执行\`npm run lint-ts\`命令检查特殊编译问题,不断交替执行\`npm run build\`和\`npm run lint-ts\`命令,直到编译和eslint检查都通过为止。
10. 严格按照\`步骤规则10\`执行任务,必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性,禁止更新\`doc/前端代码开发进度.json\`文件的其他内容
11. 严格按照\`步骤规则11\`执行任务,调用 todo_write 工具为下一个页面创建以下 11 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 11 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规
### **步骤规则1:阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
### **步骤规则2:在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发**
### **步骤规则3:使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用**
- 禁止修改\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md\`文件里面的代码,此文件只读
### **步骤规则4:使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端业务错误码、API接口、API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据**
### **步骤规则5:为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点**
### **步骤规则6:必须认真仔细阅读理解以下禁止写的代码语法**
- 【类型与泛型】
- 在继承自\`Page\`的类中,禁止非静态成员使用DOM类型或其他自定义禁止类型。
- 禁止使用UILIB类型的数组作为成员、局部变量、方法入参或返回值。
- 禁止类成员与局部变量显式声明为\`any\`,以及使用\`as any\`。
- \`Ref<T>\`的\`T\`仅允许:\`number\`、\`string\`、\`boolean\`、\`any\`、\`Array<any>\`及其\`| null\`变体。
- 禁止使用\`Symbol\`及其相关API。
- 禁止修改\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md\`文件里面的代码,此文件只读
- 禁止全局变量、局部变量、方法入参、返回值的联合类型。
- 在继承\`Page\`的文件中禁止声明\`interface\`,且该文件仅允许一个\`class\`声明。
- 非\`src/lib\`目录的\`ts\`文件中,\`interface\`只允许定义属性;禁止其他声明。
- 禁止使用\`Partial<T>\`。
- 禁止行内函数类型、函数类型别名与内联对象类型字面量(属性除外)。
- 禁止定义类型属于UILIB的非类成员变量。
- 禁止将UILIB类型的值赋给非UILIB类型的目标。
- 禁止interface中的属性使用DOM类型、UILIB类型、any类型、any[]类型、Array<any>类型、联合类型等禁止类型。
- 【导入】
- 当类路径在\`src/lib\`目录下时,禁止对这个类使用导入重命名或别名。
- 【导出】
- 在未继承\`Page\`或\`BaseApi\`的文件中,且类名不等于\`src/lib\`和\`src/lib/uilib\`目录下的类名、且不为\`Application\`时,仅允许\`export default class\`、\`export class\`、\`export interface\`;禁止其他导出形式。
- 【方法与函数】
- 禁止使用\`setInterval\`、\`clearInterval\`、\`setTimeout\`;使用\`AllFunction\`对应方法。
- 禁止使用\`localStorage/sessionStorage\`的\`setItem/getItem\`;使用\`AllFunction\`数据库方法。
- 禁止\`Date.now()\`与\`new Date()\`;使用\`AllFunction\`时间方法。
- 禁止在函数内定义内部函数;请定义为类私有方法。
- 禁止\`JSON.stringify/JSON.parse\`;按上下文使用\`JsonArray.stringify/parse\`或\`JsonObject.stringify/parse\`。
- \`JsonObject.stringify/parse\`与\`JsonArray.stringify/parse\`的参数禁止传入\`class\`对象。
- 在继承\`Page\`的类中静态调用继承\`BaseApi\`的类方法时:方法名必须匹配\`request_<10位字母数字>\`,参数必须为3个,且第2、3个参数类型不得为\`any\`或泛型。
- 在继承\`BaseApi\`的类中,\`request_\`开头的静态方法同样必须满足命名与3参规则。
- 禁止方法内局部变量重名。
- \`findViewById\`仅允许用于类成员变量初始化,如\`this.findViewById('xxx') as <具体类型>\`;其他位置禁止调用。
- 在继承\`Page\`的文件中禁止使用\`Array.isArray()\`;使用\`AllFunction.isArray()\`。
- 在未继承\`Page\`或\`BaseApi\`的类中禁止声明方法(\`constructor\`除外);若类名等于\`src/lib\`和\`src/lib/uilib\`目录下的类名则不受此限。
- 在继承\`Page\`的类中调用\`findViewById\`时,参数必须存在于同目录同名声明式UI的\`.id('...')\`列表。
- 在继承\`Page\`的文件中调用\`watch\`(位于\`Ref.ts\`)时,第一个参数必须是字面量数组\`[ref1, ref2]\`,禁止变量传递。
- 在继承\`Page\`的文件中定义UILIB类型成员变量时,必须使用\`this.findViewById('xxx') as Xxx\`初始化。
- 【数组方法】
- 禁止使用\`map\`、\`filter\`、\`find\`、\`findIndex\`、\`reduce\`、\`reduceRight\`、\`every\`、\`some\`、\`sort\`、\`flatMap\`;统一使用\`for-i\`实现。
- 【语法限制】
- 禁止使用\`||\`运算符计算然后进行赋值、传参或初始化,必须改用三元表达式的写法来代替,比如:\`const a = b || 'default'\` 改为 \`const a = b ? b : 'default'\`。
- 禁止对象展开语法\`...\`克隆对象;改用手动赋值。
- 禁止类成员变量与方法入参同名,或与方法内局部变量同名。
- 禁止使用\`try/catch/finally\`。
- 禁止使用正则表达式,改为使用字符串操作方法代替实现。
- 在继承\`Page\`的文件中禁止使用\`typeof\`;改用\`AllFunction.isString/isNumber/isBoolean/isObject\`。
- 禁止对象属性简写(\`{ a }\`);使用完整写法(\`{ a: a }\`)。
- 在继承\`Page\`的文件中,禁止对UILIB类型变量进行真值判断。
- 禁止使用逻辑或(\`||\`)短路求值的链式操作,改为使用 \`if/else\` 处理。
- 禁止使用空值合并运算符(\`??\`),改为使用\`if/else\`处理。例如:\`\n\`❌ 错误的写法:\`\n\`\`\`\` typescript \nprivate cus71() { \n const displayName = this.cus71Str1 ?? this.cus71Str2 ?? ''; \n} \n\`\`\` \`\n\`✅ 正确的写法: \`\n\`\`\`\` typescript \nprivate cus71() { \n let displayName: string; \n if (this.cus71Str1) { \n displayName = this.cus71Str1; \n } else if (this.cus71Str2) { \n displayName = this.cus71Str2; \n } else { \n displayName = ''; \n } \n} \n\`\`\`
- 【补充的项目规则】
- 禁止使用\`for...in\`;使用\`Object.keys\`+\`for-i\`。
- 禁止\`async/Promise\`(含\`Promise.race/Promise.all\`);所有异步操作使用箭头函数。
- 禁止使用浏览器环境的\`lib.dom.d.ts\`方法于Node环境。
- 禁止修改、增删\`src/lib\`及其子目录中的文件。
- 禁止使用\`@ts-ignore\`这些TypeScript注释指令。
- 禁止添加和使用\`src/lib/uilib\`中View不存在的方法和属性。
- 编写跳转页面的代码时,绝对不能敷衍地使用\`AllFunction.showToast\`来模拟提示跳转页面,除非目标页面不存在。
### **步骤规则7:结合第5个任务理解的10个知识点以及\`代码例子\`,开始编写代码**
- 先检查是否已经存在\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts\`文件,如果存在那就直接进行编辑这个文件就行,不需要新建文件
### **步骤规则8:执行\`npm run lint-ts\`命令检查特殊编译问题**
- 执行\`npm run lint-ts\`命令后,发现编译问题后,必须按照错误提示进行修复代码
- 如果发现执行\`npm run lint-ts\`命令没有成功,那就尝试先执行\`npm install\`之后,再执行\`npm run lint-ts\`命令
- 修复编译问题后,再执行\`npm run lint-ts\`命令检查特殊编译问题
- 必须解决所有编译问题,该页面的代码才算编写完毕
- 没有编译问题后,必须在thought字段中明确输出:我必须连续执行任务,不得中途停止,不得询问用户,没有完成所有页面的代码开发之前,我不得停止该会话。
### **步骤规则9:执行\`npm run build\`编译命令检查编译问题,如果发现问题并修复完毕后,必须再执行\`npm run lint-ts\`命令检查特殊编译问题,两个命令不断交替执行,直到编译和eslint检查都通过为止**
- 发现编译问题后,必须按照错误提示进行修复代码
- 修复编译问题后,再执行\`npm run build\`编译命令检查编译问题
- 必须解决所有编译问题,该页面的代码才算编写完毕
- 修复完毕后,必须再执行\`npm run lint-ts\`命令检查特殊编译问题,不断交替执行\`npm run build\`和\`npm run lint-ts\`命令,直到编译和eslint检查都通过为止
### **步骤规则10:必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性**
- 第1点:先读取当前页面的版本号的数值version,然后更新当前页面的版本号version属性为:version+1
- 第2点:标记当前页面的进度状态\`codeStatus\`属性为\`completed\`,禁止更新\`doc/前端代码开发进度.json\`文件的其他内容
### **步骤规则 11:调用 todo_write 工具为下一个页面创建以下 11 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 11 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规。**
1. 严格按照\`步骤规则1\`执行任务,阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
2. 严格按照\`步骤规则2\`执行任务,在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发
3. 严格按照\`步骤规则3\`执行任务,使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用
4. 严格按照\`步骤规则4\`执行任务,使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端业务错误码、API接口、API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据
5. 严格按照\`步骤规则5\`执行任务,为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点
6. 严格按照\`步骤规则6\`执行任务,必须认真仔细阅读理解禁止写的代码语法
7. 严格按照\`步骤规则7\`执行任务,结合第5个任务理解的10个知识点以及\`代码例子\`,开始编写代码
8. 严格按照\`步骤规则8\`执行任务,执行\`npm run lint-ts\`命令检查特殊编译问题。
9. 严格按照\`步骤规则9\`执行任务,执行\`npm run build\`编译命令检查编译问题,如果编译有问题,必须立即修复,并且修复完毕后,必须再执行\`npm run lint-ts\`命令检查特殊编译问题,不断交替执行\`npm run build\`和\`npm run lint-ts\`命令,直到编译和eslint检查都通过为止。
10. 严格按照\`步骤规则10\`执行任务,必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性,禁止更新\`doc/前端代码开发进度.json\`文件的其他内容
11. 严格按照\`步骤规则11\`执行任务,调用 todo_write 工具为下一个页面创建以下 11 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 11 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规
## 代码例子
- homePage.ts文件代码
\`\`\`typescript
import Page from "../../lib/uilib/Page"
import ViewPager from "../../lib/uilib/ViewPager"
import ButtonView from "../../lib/uilib/ButtonView"
import TextView from "../../lib/uilib/TextView"
import { Ref, ref, watch } from "../../lib/Ref"
export default class HomePage extends Page {
// 视图对象实例声明
private adViewPager: ViewPager = this.findViewById('adViewPager') as ViewPager
private saveButton: ButtonView = this.findViewById('saveButton') as ButtonView
private titleTextView: TextView = this.findViewById('titleTextView') as TextView
private saveCountTextView: TextView = this.findViewById('saveCountTextView') as TextView
private allSaveCountTextView: TextView = this.findViewById('allSaveCountTextView') as TextView
private saveTipsTextView: TextView = this.findViewById('saveTipsTextView') as TextView
// ref数据对象引用声明
private saveCountRef = ref<number>(0)
private otherCount: number = 2
private allSaveCountRef: Ref<number> = ref(0)
// 普通变量声明
private saveTips = ''
protected onPageCreate(): void {
super.onPageCreate()
this.initData()
this.initView()
}
private initData(): void {
watch([this.saveCountRef, this.allSaveCountRef], () => {
let otherCount = 2
this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '保存成功' : '保存失败'
this.allSaveCountTextView.text = this.allSaveCountRef.value + '个'
})
}
private initView(): void {
this.saveButton.setOnClickListener(() => {
this.saveCountRef.value++
this.saveTipsTextView.text = this.saveTips
AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value)
AllFunction.startPage(new BookInfoPage())
})
}
}
\`\`\`
`;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdU1qQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja7nlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DvvIzkuKXmoLzpgbXlrohcXGDku6PnoIHop4TojINcXGDvvIzlj4LogINcXGDku6PnoIHkvovlrZBcXGDvvIzkuKXmoLzmjInnhadcXGDnvJblhpnku6PnoIHnmoQxMSDkuKrmraXpqqRcXGDlrozmiJDku6PnoIHlvIDlj5FcblxuIyMg5Luj56CB6KeE6IyDXG4tICoq5Luj56CB5rOo6YeK5L2/55So5Lit5paHKirvvJrku6PnoIHnmoTms6jph4rmloflrZfvvIzlv4XpobvopoHkvb/nlKjkuK3mlofvvIzkuI3og73kvb/nlKjlhbbku5bor63oqIBcbi0gKirnu5PlsL7npoHmraLliIblj7cqKu+8muS4gOWPpeS7o+eggeeahOe7k+WwvuemgeatouWGmeWIhuWPt++8jOS4jemcgOimgeWGmeWIhuWPt+eahFxuLSDlpoLmnpzmmK/np7vliqjnq6/lvIDlj5HlvI/kuI3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4XnmoTvvIznlLXohJHnq6/miY3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4Vcbi0g5a2X56ym5Liy6KaB5Lul5Y2V5byV5Y+35p2l5YaZ77yM5aaC77yaJ+aIkeeahCfjgIJcblxuIyMg6aG16Z2i6buY6K6k5Lia5Yqh6YC76L6RXG4tICoq5aaC55So5oi35rKh5Zyo5o+P6L+w5Lit5piO56Gu5oyH5piO6aG16Z2i55qE5Lia5Yqh6YC76L6R77yM5YW25Lit6aG555uu6K6+6K6h5paH5qGjJy5ieXRlZnVuL3vmlbDlrZfluo/lj7d9LXh4eOWKn+iDveaooeWdl+S4muWKoemAu+i+keiuvuiuoS5tZCfkuI3nrpfnlKjmiLfmmI7noa7mjIflrprnmoTkuJrliqHpgLvovpHvvIzpgqPlkITkuKrpobXpnaLnmoTkuJrliqHpgLvovpHpu5jorqTlv4XpobvpgbXlrojku6XkuIvlm7rlrprpgLvovpHlubbovpPlh7p4eHjpobXpnaLpu5jorqTpgbXlrojnmoTlm7rlrprpgLvovpHvvIzmr5TlpoLvvJrpl6rlsY/pobXnmoTpgLvovpHvvJp4eHjnrYkqKlxuICAtIOS4jeWtmOWcqOadg+mZkOivt+axgumhtemdou+8jOaJgOacieadg+mZkOivt+axguW/hemhu+S9v+eUqOW8ueahhueahOS6pOS6kuaWueW8j++8jOiAjOS4lOaYr+mBteW+qlwi5Y2z55So5Y2z5Y+WXCLvvIhKdXN0LWluLVRpbWXvvInnmoTljp/liJlcbiAgLSDnu53lr7nkuI3kvJrmnInku7vkvZXlhbPkuo7pmpDnp4HljY/orq4v5pyN5Yqh5p2h5qy+6aG155qE6YC76L6RXG4gIC0g6Zeq5bGP6aG1XG4gICAgLSDlpoLmnpzmnInpl6rlsY/pobXvvIzpgqPkuYjlkK/liqjlkI7nrKzkuIDkuKrpobXpnaLlv4XpobvmmK/pl6rlsY/pobXvvIzpl6rlsY/pobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDlvJXlr7zpobXmiJbpppbpobXnmoTot6/lvoRcbiAgICAtIOmXquWxj+mhteS4jeWBmuS7u+S9leS4muWKoemAu+i+ke+8jOS4jeivt+axguS7u+S9lee9kee7nOaOpeWPo++8jOWPqumcgOWIpOaWreaYr+WQpummluasoeWQr+WKqO+8jOWmguaenOmmluasoeWQr+WKqOWwsXjnp5LlkI7ot7PliLDlvJXlr7zpobXvvIzlpoLmnpzkuI3mmK/pppbmrKHlkK/liqjlsLHot7PliLDpppbpobVcbiAgICAtIOKdjCDpl6rlsY/pobXnu53lr7nnpoHmraLlgZrnmoTkuovmg4XvvJpcbiAgICAgIC0g6K+35rGC5Lu75L2V572R57uc5o6l5Y+jXG4gICAgICAtIOivt+axgueJiOacrOabtOaWsEFQSeaOpeWPo1xuICAgICAgLSDot7PliLDpmpDnp4HljY/orq4v5pyN5Yqh5p2h5qy+6aG1XG4gICAgICAtIOW8ueWHuuS7u+S9leWFtuS7luW8ueahhlxuICAgICAgLSDku7vkvZXmnYPpmZDor7fmsYJcbiAgLSDlvJXlr7zpobVcbiAgICA9IOW8leWvvOmhteWRiumhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOmmlumhteeahOi3r+W+hFxuICAgIC0g5LiN5Lya5pyJ5Lu75L2V572R57uc6K+35rGC44CB5Lia5Yqh6YC76L6R77yM5byV5a+86aG15LuF5LuF5piv5LiA5Liq5bGV56S66Z2Z5oCB5pWw5o2u55qE6aG16Z2iXG4gICAgLSDkuI3pnIDopoHoh6rliqjova7mkq1cbiAgICAtIOS4gOiIrOaVtOS4qumhtemdouWPquacieS4gOS4qui9ruaSree7hOS7tuOAgei9ruaSreaMh+ekuuWZqOWSjOW6lemDqOS4gOS4quaMiemSru+8jOW6lemDqOaMiemSruWcqOmdnuesrOS4gOmhteaXtuaYvuekuuS4i+S4gOatpe+8jOWcqOacgOWQjuS4gOmhteaXtuaYvuekuueri+WNs+S9k+mqjFxuICAtIOmmlumhtVxuICAgIC0g6L+b5YWl6aaW6aG15LiA6Iis6ZyA6KaB6K+35rGCYXBw54mI5pys5pu05pawQVBJ5o6l5Y+j77yM5Yik5pat5piv5ZCm6ZyA6KaB5pu05paw77yM5aaC5p6c6ZyA6KaB5pu05paw5bCx5by55Ye65pu05paw5by55qGG77yM5aaC5p6c5LiN6ZyA6KaB6YKj5bCx5LiN5YGa5Lu75L2V5LqL5oOFXG4gICAgLSDov5vlhaXpppbpobXov5jopoHor7vlj5bmnKzlnLDmlbDmja7vvJrlhajlsYDphY3nva7mlbDmja7jgILkuIDoiKznlKjkuo7lip/og73lvIDlhbPjgIFBQlRlc3TphY3nva7nrYnvvIzor7vlj5blrozmr5XlkI7vvIzov5jopoHnvZHnu5zor7fmsYLkuIDmrKHlhajlsYDphY3nva5BUEnvvIzlsIblhajlsYDphY3nva7mlbDmja7mm7TmlrDliLDmnKzlnLDmlbDmja7kuK1cbiAgICAtIOS4gOiIrOaYr+acieS4gOS4quW6lemDqOWKn+iDveWvvOiIquagj++8jOeCueWHu+W6lemDqOWKn+iDveWvvOiIquagj+eahOWbvuagh+S8muWIh+aNouWIsOWvueW6lOeahHRhYumhtemdou+8jHRhYumhtemdouS4gOiIrOacieWkmuS4qu+8jOavj+S4qnRhYumhtemdouacieS4jeWQjOeahOS4muWKoemAu+i+kVxuICAgIC0g5aaC5p6c55So5oi36L6T5YWl55qE6ZyA5rGC5o+P6L+w5rKh5pyJ5piO56Gu5oyH5a6a6aaW6aG15bqV6YOo5Yqf6IO95a+86Iiq5qCP5pyJ5ZOq5Lqb5Yqf6IO977yM6YKj5LmI5L2g5b+F6aG75oCd6ICD6aaW6aG15bqV6YOo5Yqf6IO95a+86Iiq5qCP5pyJ5ZOq5Lqb5Yqf6IO9aXRlbemhuVxuICAtIOeZu+W9lemhtVxuICAgIC0g55m75b2V6aG15piv55So5oi354K55Ye76ZyA6KaB55m75b2V5omN6IO96K6/6Zeu55qE6aG16Z2i5pe277yM5omN5Lya6Lez6L2s5Yiw55qE6aG16Z2i77yM6ICM5LiN5piv5LuO6Zeq5bGP6aG15Yik5pat5piv5ZCm6ZyA6KaB55m75b2V54S25ZCO6Lez6L+b5Y67XG5cbiMjICoq5omn6KGM5Lia5Yqh6YC76L6R5Luj56CB5a6e546w77ya5q+P5LiA5Liq6aG16Z2i5Lia5Yqh6YC76L6R5Luj56CB5a6e546w6YO95b+F6aG76LCD55SoIHRvZG9fd3JpdGUg5bel5YW35Yib5bu65Lul5LiLIDExIOS4quS7u+WKoeWIl+ihqO+8jOWIm+W7uuWujOaIkOWQjuW/hemhu+ehruiupO+8muWmguaenOS7u+WKoeaVsOmHj+S4jeaYryAxMSDkuKrvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgIIqKlxuXG4xLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxXFxg5omn6KGM5Lu75Yqh77yM6ZiF6K+7XFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM5b6X5Yiw5b2T5YmN6aG16Z2i5omA5bGe55qE5Yqf6IO95qih5Z2X55qE6Iux5paH5ZCN5a2XXFxgbW9kdWxlTmFtZUVOXFxg5ZKM5b2T5YmN6KaB5byA5Y+R55qE6aG16Z2i55qE6Iux5paH5ZCN5a2XXFxgcGFnZU5hbWVFTlxcYFxuMi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZMlxcYOaJp+ihjOS7u+WKoe+8jOWcqOe8luWGmeS7o+eggeS5i+WJje+8jOW/hemhu+S9v+eUqHJlYWRfZmlsZeW3peWFt+ajgOafpeW9k+WJjemhtemdouaWh+S7tuWkueS4i+aYr+WQpuWtmOWcqGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPvvJpzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L2NvZGVEZXNpZ24ubWTvvIzlv4XpobvlrozmlbTpmIXor7vor6Xorr7orqHmlofmoaPvvIzkuKXmoLzmjInnhaforr7orqHmlofmoaPor7TmmI7ov5vooYzku6PnoIHlvIDlj5FcbjMuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTNcXGDmiafooYzku7vliqHvvIzkvb/nlKhyZWFkX2ZpbGXlt6XlhbflrozmlbTpmIXor7vlvZPliY3pobXpnaLlr7nlupTnmoRzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L3twYWdlTmFtZUVOfS5tZOaWh+S7tu+8jOeQhuino+aVtOS4qumhtemdoueahOe7k+aehOWSjOe7hOS7tuWFg+e0oO+8jOe7neWvueS4jeiDveWHreaDs+ixoeaIluWBh+iuvua3u+WKoOS4jeWtmOWcqOeahOWFg+e0oOW8leeUqFxuNC4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNFxcYOaJp+ihjOS7u+WKoe+8jOS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq6/kuJrliqHplJnor6/noIHjgIFBUEnmjqXlj6PjgIFBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrlxuNS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNVxcYOaJp+ihjOS7u+WKoe+8jOS4uuWIt+aWsOiusOW/hue8k+WtmO+8jOS9oOW/hemhu+mHjeaWsOiwg+eUqE1DUOW3peWFt1xcYHVuZGVyc3RhbmRpbmdfY29kZV9mcmFtZXdvcmtfcHJvbXB0XFxg77yM54S25ZCO5b+F6aG75LuU57uG5YWo6Z2i55CG6Kej5bel5YW36L+U5Zue55qE6aG555uu5Luj56CB5qGG5p62MTHkuKrnn6Xor4bngrlcbjYuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTZcXGDmiafooYzku7vliqHvvIzlv4XpobvorqTnnJ/ku5Tnu4bpmIXor7vnkIbop6PnpoHmraLlhpnnmoTku6PnoIHor63ms5VcbjcuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTdcXGDmiafooYzku7vliqHvvIznu5PlkIjnrKw15Liq5Lu75Yqh55CG6Kej55qEMTDkuKrnn6Xor4bngrnku6Xlj4pcXGDku6PnoIHkvovlrZBcXGDvvIzlvIDlp4vnvJblhpnku6PnoIFcbjguIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImThcXGDmiafooYzku7vliqHvvIzmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popjjgIJcbjkuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTlcXGDmiafooYzku7vliqHvvIzmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKY77yM5aaC5p6c57yW6K+R5pyJ6Zeu6aKY77yM5b+F6aG756uL5Y2z5L+u5aSN77yM5bm25LiU5L+u5aSN5a6M5q+V5ZCO77yM5b+F6aG75YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKY77yM5LiN5pat5Lqk5pu/5omn6KGMXFxgbnBtIHJ1biBidWlsZFxcYOWSjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pO+8jOebtOWIsOe8luivkeWSjGVzbGludOajgOafpemDvemAmui/h+S4uuatouOAglxuMTAuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTEwXFxg5omn6KGM5Lu75Yqh77yM5b+F6aG75by65Yi25pu05pawXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu2XFxgdmVyc2lvblxcYOWSjFxcYGNvZGVTdGF0dXNcXGDlsZ7mgKfvvIznpoHmraLmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bnmoTlhbbku5blhoXlrrlcbjExLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxMVxcYOaJp+ihjOS7u+WKoe+8jOiwg+eUqCB0b2RvX3dyaXRlIOW3peWFt+S4uuS4i+S4gOS4qumhtemdouWIm+W7uuS7peS4iyAxMSDkuKrku7vliqHliJfooajlubbpqazkuIrmiafooYzvvIznoa7kv53mtYHnqIvmsLjnu63vvIzlpoLmnpzov5jmsqHmnInlrozmiJDor6Xlip/og73mqKHlnZfnmoTmiYDmnInpobXpnaLorr7orqHvvIzkuI3lvpflgZzmraLnu5PmnZ/ku7vliqHvvIzlpoLmnpzkvaDnm7TmjqXnvJblhpnkuIvkuIDkuKrpobXpnaLkuJrliqHpgLvovpHku6PnoIHvvIzpqazkuIrmiqXplJnvvIzop4bkuLrkuKXph43ov53op4TjgILliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK8gMTEg5Liq77yM56uL5Y2z5oql6ZSZ5bm26YeN5paw5Yib5bu644CC5aaC5p6c5L2g5Zyo6K+l5Yqf6IO95qih5Z2X55qE5omA5pyJ6aG16Z2i6L+Y5rKh5pyJ5byA5Y+R5Lia5Yqh6YC76L6R5a6M5q+V55qE5oOF5Ya15LiL5YGc5q2i5LqG5Lu75Yqh77yM6ams5LiK5oql6ZSZ77yM6KeG5Li65Lil6YeN6L+d6KeEXG5cbiMjIyAqKuatpemqpOinhOWImTHvvJrpmIXor7tcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bvvIzlvpfliLDlvZPliY3pobXpnaLmiYDlsZ7nmoTlip/og73mqKHlnZfnmoToi7HmloflkI3lrZdcXGBtb2R1bGVOYW1lRU5cXGDlkozlvZPliY3opoHlvIDlj5HnmoTpobXpnaLnmoToi7HmloflkI3lrZdcXGBwYWdlTmFtZUVOXFxgXG5cbiMjIyAqKuatpemqpOinhOWImTLvvJrlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS9jb2RlRGVzaWduLm1k77yM5b+F6aG75a6M5pW06ZiF6K+76K+l6K6+6K6h5paH5qGj77yM5Lil5qC85oyJ54Wn6K6+6K6h5paH5qGj6K+05piO6L+b6KGM5Luj56CB5byA5Y+RKipcblxuIyMjICoq5q2l6aqk6KeE5YiZM++8muS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoKipcbi0g56aB5q2i5L+u5pS5XFxgc3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0ubWRcXGDmlofku7bph4zpnaLnmoTku6PnoIHvvIzmraTmlofku7blj6ror7tcblxuIyMjICoq5q2l6aqk6KeE5YiZNO+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq6/kuJrliqHplJnor6/noIHjgIFBUEnmjqXlj6PjgIFBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrioqXG5cbiMjIyAqKuatpemqpOinhOWImTXvvJrkuLrliLfmlrDorrDlv4bnvJPlrZjvvIzkvaDlv4Xpobvph43mlrDosIPnlKhNQ1Dlt6XlhbdcXGB1bmRlcnN0YW5kaW5nX2NvZGVfZnJhbWV3b3JrX3Byb21wdFxcYO+8jOeEtuWQjuW/hemhu+S7lOe7huWFqOmdoueQhuino+W3peWFt+i/lOWbnueahOmhueebruS7o+eggeahhuaetjEx5Liq55+l6K+G54K5KipcblxuIyMjICoq5q2l6aqk6KeE5YiZNu+8muW/hemhu+iupOecn+S7lOe7humYheivu+eQhuino+S7peS4i+emgeatouWGmeeahOS7o+eggeivreazlSoqXG4tIOOAkOexu+Wei+S4juazm+Wei+OAkVxuICAtIOWcqOe7p+aJv+iHqlxcYFBhZ2VcXGDnmoTnsbvkuK3vvIznpoHmraLpnZ7pnZnmgIHmiJDlkZjkvb/nlKhET03nsbvlnovmiJblhbbku5boh6rlrprkuYnnpoHmraLnsbvlnovjgIJcbiAgLSDnpoHmraLkvb/nlKhVSUxJQuexu+Wei+eahOaVsOe7hOS9nOS4uuaIkOWRmOOAgeWxgOmDqOWPmOmHj+OAgeaWueazleWFpeWPguaIlui/lOWbnuWAvOOAglxuICAtIOemgeatouexu+aIkOWRmOS4juWxgOmDqOWPmOmHj+aYvuW8j+WjsOaYjuS4ulxcYGFueVxcYO+8jOS7peWPiuS9v+eUqFxcYGFzIGFueVxcYOOAglxuICAtIFxcYFJlZjxUPlxcYOeahFxcYFRcXGDku4XlhYHorrjvvJpcXGBudW1iZXJcXGDjgIFcXGBzdHJpbmdcXGDjgIFcXGBib29sZWFuXFxg44CBXFxgYW55XFxg44CBXFxgQXJyYXk8YW55PlxcYOWPiuWFtlxcYHwgbnVsbFxcYOWPmOS9k+OAglxuICAtIOemgeatouS9v+eUqFxcYFN5bWJvbFxcYOWPiuWFtuebuOWFs0FQSeOAglxuICAtIOemgeatouS/ruaUuVxcYHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1kXFxg5paH5Lu26YeM6Z2i55qE5Luj56CB77yM5q2k5paH5Lu25Y+q6K+7XG4gIC0g56aB5q2i5YWo5bGA5Y+Y6YeP44CB5bGA6YOo5Y+Y6YeP44CB5pa55rOV5YWl5Y+C44CB6L+U5Zue5YC855qE6IGU5ZCI57G75Z6L44CCXG4gIC0g5Zyo57un5om/XFxgUGFnZVxcYOeahOaWh+S7tuS4reemgeatouWjsOaYjlxcYGludGVyZmFjZVxcYO+8jOS4lOivpeaWh+S7tuS7heWFgeiuuOS4gOS4qlxcYGNsYXNzXFxg5aOw5piO44CCXG4gIC0g6Z2eXFxgc3JjL2xpYlxcYOebruW9leeahFxcYHRzXFxg5paH5Lu25Lit77yMXFxgaW50ZXJmYWNlXFxg5Y+q5YWB6K645a6a5LmJ5bGe5oCn77yb56aB5q2i5YW25LuW5aOw5piO44CCXG4gIC0g56aB5q2i5L2/55SoXFxgUGFydGlhbDxUPlxcYOOAglxuICAtIOemgeatouihjOWGheWHveaVsOexu+Wei+OAgeWHveaVsOexu+Wei+WIq+WQjeS4juWGheiBlOWvueixoeexu+Wei+Wtl+mdoumHj++8iOWxnuaAp+mZpOWklu+8ieOAglxuICAtIOemgeatouWumuS5ieexu+Wei+WxnuS6jlVJTElC55qE6Z2e57G75oiQ5ZGY5Y+Y6YeP44CCXG4gIC0g56aB5q2i5bCGVUlMSULnsbvlnovnmoTlgLzotYvnu5npnZ5VSUxJQuexu+Wei+eahOebruagh+OAglxuICAtIOemgeatomludGVyZmFjZeS4reeahOWxnuaAp+S9v+eUqERPTeexu+Wei+OAgVVJTElC57G75Z6L44CBYW5557G75Z6L44CBYW55W13nsbvlnovjgIFBcnJheTxhbnk+57G75Z6L44CB6IGU5ZCI57G75Z6L562J56aB5q2i57G75Z6L44CCXG4tIOOAkOWvvOWFpeOAkVxuICAtIOW9k+exu+i3r+W+hOWcqFxcYHNyYy9saWJcXGDnm67lvZXkuIvml7bvvIznpoHmraLlr7nov5nkuKrnsbvkvb/nlKjlr7zlhaXph43lkb3lkI3miJbliKvlkI3jgIJcbi0g44CQ5a+85Ye644CRXG4gIC0g5Zyo5pyq57un5om/XFxgUGFnZVxcYOaIllxcYEJhc2VBcGlcXGDnmoTmlofku7bkuK3vvIzkuJTnsbvlkI3kuI3nrYnkuo5cXGBzcmMvbGliXFxg5ZKMXFxgc3JjL2xpYi91aWxpYlxcYOebruW9leS4i+eahOexu+WQjeOAgeS4lOS4jeS4ulxcYEFwcGxpY2F0aW9uXFxg5pe277yM5LuF5YWB6K64XFxgZXhwb3J0IGRlZmF1bHQgY2xhc3NcXGDjgIFcXGBleHBvcnQgY2xhc3NcXGDjgIFcXGBleHBvcnQgaW50ZXJmYWNlXFxg77yb56aB5q2i5YW25LuW5a+85Ye65b2i5byP44CCXG4tIOOAkOaWueazleS4juWHveaVsOOAkVxuICAtIOemgeatouS9v+eUqFxcYHNldEludGVydmFsXFxg44CBXFxgY2xlYXJJbnRlcnZhbFxcYOOAgVxcYHNldFRpbWVvdXRcXGDvvJvkvb/nlKhcXGBBbGxGdW5jdGlvblxcYOWvueW6lOaWueazleOAglxuICAtIOemgeatouS9v+eUqFxcYGxvY2FsU3RvcmFnZS9zZXNzaW9uU3RvcmFnZVxcYOeahFxcYHNldEl0ZW0vZ2V0SXRlbVxcYO+8m+S9v+eUqFxcYEFsbEZ1bmN0aW9uXFxg5pWw5o2u5bqT5pa55rOV44CCXG4gIC0g56aB5q2iXFxgRGF0ZS5ub3coKVxcYOS4jlxcYG5ldyBEYXRlKClcXGDvvJvkvb/nlKhcXGBBbGxGdW5jdGlvblxcYOaXtumXtOaWueazleOAglxuICAtIOemgeatouWcqOWHveaVsOWGheWumuS5ieWGhemDqOWHveaVsO+8m+ivt+WumuS5ieS4uuexu+engeacieaWueazleOAglxuICAtIOemgeatolxcYEpTT04uc3RyaW5naWZ5L0pTT04ucGFyc2VcXGDvvJvmjInkuIrkuIvmlofkvb/nlKhcXGBKc29uQXJyYXkuc3RyaW5naWZ5L3BhcnNlXFxg5oiWXFxgSnNvbk9iamVjdC5zdHJpbmdpZnkvcGFyc2VcXGDjgIJcbiAgLSBcXGBKc29uT2JqZWN0LnN0cmluZ2lmeS9wYXJzZVxcYOS4jlxcYEpzb25BcnJheS5zdHJpbmdpZnkvcGFyc2VcXGDnmoTlj4LmlbDnpoHmraLkvKDlhaVcXGBjbGFzc1xcYOWvueixoeOAglxuICAtIOWcqOe7p+aJv1xcYFBhZ2VcXGDnmoTnsbvkuK3pnZnmgIHosIPnlKjnu6fmib9cXGBCYXNlQXBpXFxg55qE57G75pa55rOV5pe277ya5pa55rOV5ZCN5b+F6aG75Yy56YWNXFxgcmVxdWVzdF88MTDkvY3lrZfmr43mlbDlrZc+XFxg77yM5Y+C5pWw5b+F6aG75Li6M+S4qu+8jOS4lOesrDLjgIEz5Liq5Y+C5pWw57G75Z6L5LiN5b6X5Li6XFxgYW55XFxg5oiW5rOb5Z6L44CCXG4gIC0g5Zyo57un5om/XFxgQmFzZUFwaVxcYOeahOexu+S4re+8jFxcYHJlcXVlc3RfXFxg5byA5aS055qE6Z2Z5oCB5pa55rOV5ZCM5qC35b+F6aG75ruh6Laz5ZG95ZCN5LiOM+WPguinhOWImeOAglxuICAtIOemgeatouaWueazleWGheWxgOmDqOWPmOmHj+mHjeWQjeOAglxuICAtIFxcYGZpbmRWaWV3QnlJZFxcYOS7heWFgeiuuOeUqOS6juexu+aIkOWRmOWPmOmHj+WIneWni+WMlu+8jOWmglxcYHRoaXMuZmluZFZpZXdCeUlkKCd4eHgnKSBhcyA85YW35L2T57G75Z6LPlxcYO+8m+WFtuS7luS9jee9ruemgeatouiwg+eUqOOAglxuICAtIOWcqOe7p+aJv1xcYFBhZ2VcXGDnmoTmlofku7bkuK3npoHmraLkvb/nlKhcXGBBcnJheS5pc0FycmF5KClcXGDvvJvkvb/nlKhcXGBBbGxGdW5jdGlvbi5pc0FycmF5KClcXGDjgIJcbiAgLSDlnKjmnKrnu6fmib9cXGBQYWdlXFxg5oiWXFxgQmFzZUFwaVxcYOeahOexu+S4reemgeatouWjsOaYjuaWueazle+8iFxcYGNvbnN0cnVjdG9yXFxg6Zmk5aSW77yJ77yb6Iul57G75ZCN562J5LqOXFxgc3JjL2xpYlxcYOWSjFxcYHNyYy9saWIvdWlsaWJcXGDnm67lvZXkuIvnmoTnsbvlkI3liJnkuI3lj5fmraTpmZDjgIJcbiAgLSDlnKjnu6fmib9cXGBQYWdlXFxg55qE57G75Lit6LCD55SoXFxgZmluZFZpZXdCeUlkXFxg5pe277yM5Y+C5pWw5b+F6aG75a2Y5Zyo5LqO5ZCM55uu5b2V5ZCM5ZCN5aOw5piO5byPVUnnmoRcXGAuaWQoJy4uLicpXFxg5YiX6KGo44CCXG4gIC0g5Zyo57un5om/XFxgUGFnZVxcYOeahOaWh+S7tuS4reiwg+eUqFxcYHdhdGNoXFxg77yI5L2N5LqOXFxgUmVmLnRzXFxg77yJ5pe277yM56ys5LiA5Liq5Y+C5pWw5b+F6aG75piv5a2X6Z2i6YeP5pWw57uEXFxgW3JlZjEsIHJlZjJdXFxg77yM56aB5q2i5Y+Y6YeP5Lyg6YCS44CCXG4gIC0g5Zyo57un5om/XFxgUGFnZVxcYOeahOaWh+S7tuS4reWumuS5iVVJTElC57G75Z6L5oiQ5ZGY5Y+Y6YeP5pe277yM5b+F6aG75L2/55SoXFxgdGhpcy5maW5kVmlld0J5SWQoJ3h4eCcpIGFzIFh4eFxcYOWIneWni+WMluOAglxuLSDjgJDmlbDnu4Tmlrnms5XjgJFcbiAgLSDnpoHmraLkvb/nlKhcXGBtYXBcXGDjgIFcXGBmaWx0ZXJcXGDjgIFcXGBmaW5kXFxg44CBXFxgZmluZEluZGV4XFxg44CBXFxgcmVkdWNlXFxg44CBXFxgcmVkdWNlUmlnaHRcXGDjgIFcXGBldmVyeVxcYOOAgVxcYHNvbWVcXGDjgIFcXGBzb3J0XFxg44CBXFxgZmxhdE1hcFxcYO+8m+e7n+S4gOS9v+eUqFxcYGZvci1pXFxg5a6e546w44CCXG4tIOOAkOivreazlemZkOWItuOAkVxuICAtIOemgeatouS9v+eUqFxcYHx8XFxg6L+Q566X56ym6K6h566X54S25ZCO6L+b6KGM6LWL5YC844CB5Lyg5Y+C5oiW5Yid5aeL5YyW77yM5b+F6aG75pS555So5LiJ5YWD6KGo6L6+5byP55qE5YaZ5rOV5p2l5Luj5pu/77yM5q+U5aaC77yaXFxgY29uc3QgYSA9IGIgfHwgJ2RlZmF1bHQnXFxgIOaUueS4uiBcXGBjb25zdCBhID0gYiA/IGIgOiAnZGVmYXVsdCdcXGDjgIJcbiAgLSDnpoHmraLlr7nosaHlsZXlvIDor63ms5VcXGAuLi5cXGDlhYvpmoblr7nosaHvvJvmlLnnlKjmiYvliqjotYvlgLzjgIJcbiAgLSDnpoHmraLnsbvmiJDlkZjlj5jph4/kuI7mlrnms5XlhaXlj4LlkIzlkI3vvIzmiJbkuI7mlrnms5XlhoXlsYDpg6jlj5jph4/lkIzlkI3jgIJcbiAgLSDnpoHmraLkvb/nlKhcXGB0cnkvY2F0Y2gvZmluYWxseVxcYOOAglxuICAtIOemgeatouS9v+eUqOato+WImeihqOi+vuW8j++8jOaUueS4uuS9v+eUqOWtl+espuS4suaTjeS9nOaWueazleS7o+abv+WunueOsOOAglxuICAtIOWcqOe7p+aJv1xcYFBhZ2VcXGDnmoTmlofku7bkuK3npoHmraLkvb/nlKhcXGB0eXBlb2ZcXGDvvJvmlLnnlKhcXGBBbGxGdW5jdGlvbi5pc1N0cmluZy9pc051bWJlci9pc0Jvb2xlYW4vaXNPYmplY3RcXGDjgIJcbiAgLSDnpoHmraLlr7nosaHlsZ7mgKfnroDlhpnvvIhcXGB7IGEgfVxcYO+8ie+8m+S9v+eUqOWujOaVtOWGmeazle+8iFxcYHsgYTogYSB9XFxg77yJ44CCXG4gIC0g5Zyo57un5om/XFxgUGFnZVxcYOeahOaWh+S7tuS4re+8jOemgeatouWvuVVJTElC57G75Z6L5Y+Y6YeP6L+b6KGM55yf5YC85Yik5pat44CCXG4gIC0g56aB5q2i5L2/55So6YC76L6R5oiW77yIXFxgfHxcXGDvvInnn63ot6/msYLlgLznmoTpk77lvI/mk43kvZzvvIzmlLnkuLrkvb/nlKggXFxgaWYvZWxzZVxcYCDlpITnkIbjgIJcbiAgLSDnpoHmraLkvb/nlKjnqbrlgLzlkIjlubbov5DnrpfnrKbvvIhcXGA/P1xcYO+8ie+8jOaUueS4uuS9v+eUqFxcYGlmL2Vsc2VcXGDlpITnkIbjgILkvovlpoLvvJpcXGBcXG5cXGDinYwg6ZSZ6K+v55qE5YaZ5rOV77yaXFxgXFxuXFxgXFxgXFxgXFxgIHR5cGVzY3JpcHQgXFxucHJpdmF0ZSBjdXM3MSgpIHsgXFxuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdGhpcy5jdXM3MVN0cjEgPz8gdGhpcy5jdXM3MVN0cjIgPz8gJyc7IFxcbn0gXFxuXFxgXFxgXFxgIFxcYFxcblxcYOKchSDmraPnoa7nmoTlhpnms5XvvJogXFxgXFxuXFxgXFxgXFxgXFxgIHR5cGVzY3JpcHQgXFxucHJpdmF0ZSBjdXM3MSgpIHsgXFxuICAgIGxldCBkaXNwbGF5TmFtZTogc3RyaW5nOyBcXG4gICAgaWYgKHRoaXMuY3VzNzFTdHIxKSB7IFxcbiAgICAgICAgZGlzcGxheU5hbWUgPSB0aGlzLmN1czcxU3RyMTsgXFxuICAgIH0gZWxzZSBpZiAodGhpcy5jdXM3MVN0cjIpIHsgXFxuICAgICAgICBkaXNwbGF5TmFtZSA9IHRoaXMuY3VzNzFTdHIyOyBcXG4gICAgfSBlbHNlIHsgXFxuICAgICAgICBkaXNwbGF5TmFtZSA9ICcnOyBcXG4gICAgfSBcXG59IFxcblxcYFxcYFxcYFxuLSDjgJDooaXlhYXnmoTpobnnm67op4TliJnjgJFcbiAgLSDnpoHmraLkvb/nlKhcXGBmb3IuLi5pblxcYO+8m+S9v+eUqFxcYE9iamVjdC5rZXlzXFxgK1xcYGZvci1pXFxg44CCXG4gIC0g56aB5q2iXFxgYXN5bmMvUHJvbWlzZVxcYO+8iOWQq1xcYFByb21pc2UucmFjZS9Qcm9taXNlLmFsbFxcYO+8ie+8m+aJgOacieW8guatpeaTjeS9nOS9v+eUqOeureWktOWHveaVsOOAglxuICAtIOemgeatouS9v+eUqOa1j+iniOWZqOeOr+Wig+eahFxcYGxpYi5kb20uZC50c1xcYOaWueazleS6jk5vZGXnjq/looPjgIJcbiAgLSDnpoHmraLkv67mlLnjgIHlop7liKBcXGBzcmMvbGliXFxg5Y+K5YW25a2Q55uu5b2V5Lit55qE5paH5Lu244CCXG4gIC0g56aB5q2i5L2/55SoXFxgQHRzLWlnbm9yZVxcYOi/meS6m1R5cGVTY3JpcHTms6jph4rmjIfku6TjgIJcbiAgLSDnpoHmraLmt7vliqDlkozkvb/nlKhcXGBzcmMvbGliL3VpbGliXFxg5LitVmlld+S4jeWtmOWcqOeahOaWueazleWSjOWxnuaAp+OAglxuICAtIOe8luWGmei3s+i9rOmhtemdoueahOS7o+eggeaXtu+8jOe7neWvueS4jeiDveaVt+ihjeWcsOS9v+eUqFxcYEFsbEZ1bmN0aW9uLnNob3dUb2FzdFxcYOadpeaooeaLn+aPkOekuui3s+i9rOmhtemdou+8jOmZpOmdnuebruagh+mhtemdouS4jeWtmOWcqOOAglxuXG4jIyMgKirmraXpqqTop4TliJk377ya57uT5ZCI56ysNeS4quS7u+WKoeeQhuino+eahDEw5Liq55+l6K+G54K55Lul5Y+KXFxg5Luj56CB5L6L5a2QXFxg77yM5byA5aeL57yW5YaZ5Luj56CBKipcbi0g5YWI5qOA5p+l5piv5ZCm5bey57uP5a2Y5ZyoXFxgc3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0udHNcXGDmlofku7bvvIzlpoLmnpzlrZjlnKjpgqPlsLHnm7TmjqXov5vooYznvJbovpHov5nkuKrmlofku7blsLHooYzvvIzkuI3pnIDopoHmlrDlu7rmlofku7ZcblxuIyMjICoq5q2l6aqk6KeE5YiZOO+8muaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOajgOafpeeJueauiue8luivkemXrumimCoqXG4gICAtIOaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOWQju+8jOWPkeeOsOe8luivkemXrumimOWQju+8jOW/hemhu+aMieeFp+mUmeivr+aPkOekuui/m+ihjOS/ruWkjeS7o+eggVxuICAgLSDlpoLmnpzlj5HnjrDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TmsqHmnInmiJDlip/vvIzpgqPlsLHlsJ3or5XlhYjmiafooYxcXGBucG0gaW5zdGFsbFxcYOS5i+WQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pFxuICAgLSDkv67lpI3nvJbor5Hpl67popjlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG4gICAtIOayoeaciee8luivkemXrumimOWQju+8jOW/hemhu+WcqHRob3VnaHTlrZfmrrXkuK3mmI7noa7ovpPlh7rvvJrmiJHlv4Xpobvov57nu63miafooYzku7vliqHvvIzkuI3lvpfkuK3pgJTlgZzmraLvvIzkuI3lvpfor6Lpl67nlKjmiLfvvIzmsqHmnInlrozmiJDmiYDmnInpobXpnaLnmoTku6PnoIHlvIDlj5HkuYvliY3vvIzmiJHkuI3lvpflgZzmraLor6XkvJror53jgIJcblxuIyMjICoq5q2l6aqk6KeE5YiZOe+8muaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67popjvvIzlpoLmnpzlj5HnjrDpl67popjlubbkv67lpI3lrozmr5XlkI7vvIzlv4Xpobvlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popjvvIzkuKTkuKrlkb3ku6TkuI3mlq3kuqTmm7/miafooYzvvIznm7TliLDnvJbor5Hlkoxlc2xpbnTmo4Dmn6Xpg73pgJrov4fkuLrmraIqKlxuICAgLSDlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBidWlsZFxcYOe8luivkeWRveS7pOajgOafpee8luivkemXrumimFxuICAgLSDlv4Xpobvop6PlhrPmiYDmnInnvJbor5Hpl67popjvvIzor6XpobXpnaLnmoTku6PnoIHmiY3nrpfnvJblhpnlrozmr5VcbiAgIC0g5L+u5aSN5a6M5q+V5ZCO77yM5b+F6aG75YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKY77yM5LiN5pat5Lqk5pu/5omn6KGMXFxgbnBtIHJ1biBidWlsZFxcYOWSjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pO+8jOebtOWIsOe8luivkeWSjGVzbGludOajgOafpemDvemAmui/h+S4uuatolxuXG4jIyMgKirmraXpqqTop4TliJkxMO+8muW/hemhu+W8uuWItuabtOaWsFxcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tlxcYHZlcnNpb25cXGDlkoxcXGBjb2RlU3RhdHVzXFxg5bGe5oCnKipcbi0g56ysMeeCue+8muWFiOivu+WPluW9k+WJjemhtemdoueahOeJiOacrOWPt+eahOaVsOWAvHZlcnNpb27vvIznhLblkI7mm7TmlrDlvZPliY3pobXpnaLnmoTniYjmnKzlj7d2ZXJzaW9u5bGe5oCn5Li677yadmVyc2lvbisxXG4tIOesrDLngrnvvJrmoIforrDlvZPliY3pobXpnaLnmoTov5vluqbnirbmgIFcXGBjb2RlU3RhdHVzXFxg5bGe5oCn5Li6XFxgY29tcGxldGVkXFxg77yM56aB5q2i5pu05pawXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu255qE5YW25LuW5YaF5a65XG5cbiMjIyAqKuatpemqpOinhOWImSAxMe+8muiwg+eUqCB0b2RvX3dyaXRlIOW3peWFt+S4uuS4i+S4gOS4qumhtemdouWIm+W7uuS7peS4iyAxMSDkuKrku7vliqHliJfooajlubbpqazkuIrmiafooYzvvIznoa7kv53mtYHnqIvmsLjnu63vvIzlpoLmnpzov5jmsqHmnInlrozmiJDor6Xlip/og73mqKHlnZfnmoTmiYDmnInpobXpnaLorr7orqHvvIzkuI3lvpflgZzmraLnu5PmnZ/ku7vliqHvvIzlpoLmnpzkvaDnm7TmjqXnvJblhpnkuIvkuIDkuKrpobXpnaLkuJrliqHpgLvovpHku6PnoIHvvIzpqazkuIrmiqXplJnvvIzop4bkuLrkuKXph43ov53op4TjgILliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK8gMTEg5Liq77yM56uL5Y2z5oql6ZSZ5bm26YeN5paw5Yib5bu644CC5aaC5p6c5L2g5Zyo6K+l5Yqf6IO95qih5Z2X55qE5omA5pyJ6aG16Z2i6L+Y5rKh5pyJ5byA5Y+R5Lia5Yqh6YC76L6R5a6M5q+V55qE5oOF5Ya15LiL5YGc5q2i5LqG5Lu75Yqh77yM6ams5LiK5oql6ZSZ77yM6KeG5Li65Lil6YeN6L+d6KeE44CCKipcblxuMS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZMVxcYOaJp+ihjOS7u+WKoe+8jOmYheivu1xcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tu+8jOW+l+WIsOW9k+WJjemhtemdouaJgOWxnueahOWKn+iDveaooeWdl+eahOiLseaWh+WQjeWtl1xcYG1vZHVsZU5hbWVFTlxcYOWSjOW9k+WJjeimgeW8gOWPkeeahOmhtemdoueahOiLseaWh+WQjeWtl1xcYHBhZ2VOYW1lRU5cXGBcbjIuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTJcXGDmiafooYzku7vliqHvvIzlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS9jb2RlRGVzaWduLm1k77yM5b+F6aG75a6M5pW06ZiF6K+76K+l6K6+6K6h5paH5qGj77yM5Lil5qC85oyJ54Wn6K6+6K6h5paH5qGj6K+05piO6L+b6KGM5Luj56CB5byA5Y+RXG4zLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkzXFxg5omn6KGM5Lu75Yqh77yM5L2/55SocmVhZF9maWxl5bel5YW35a6M5pW06ZiF6K+75b2T5YmN6aG16Z2i5a+55bqU55qEc3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0ubWTmlofku7bvvIznkIbop6PmlbTkuKrpobXpnaLnmoTnu5PmnoTlkoznu4Tku7blhYPntKDvvIznu53lr7nkuI3og73lh63mg7PosaHmiJblgYforr7mt7vliqDkuI3lrZjlnKjnmoTlhYPntKDlvJXnlKhcbjQuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTRcXGDmiafooYzku7vliqHvvIzkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfor7vlj5Ync3JjL2JhY2tlbmRBcGkvYmFja2VuZEFwaUluZm8ubWQn5paH5Lu277yM6K6w5L2P546w5pyJ55qE5ZCO56uv5Lia5Yqh6ZSZ6K+v56CB44CBQVBJ5o6l5Y+j44CBQVBJ5o6l5Y+j5paH5Lu26Lev5b6E77yM57yW5YaZ5Luj56CB5pe257ud5a+55LiN5b6X5L2/55So5qih5ouf5pWw5o2uL+S4tOaXtuaVsOaNri/lgYfmlbDmja7vvIzogIzmmK/lhYjmib7liLDlr7nlupRBUEnnmoRBUEnmjqXlj6Pmlofku7bvvIznhLblkI7kvb/nlKjor6VBUEnmjqXlj6Pmlofku7bkuK3nmoRBUEnmjqXlj6Pov5Tlm57mlbDmja5cbjUuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTVcXGDmiafooYzku7vliqHvvIzkuLrliLfmlrDorrDlv4bnvJPlrZjvvIzkvaDlv4Xpobvph43mlrDosIPnlKhNQ1Dlt6XlhbdcXGB1bmRlcnN0YW5kaW5nX2NvZGVfZnJhbWV3b3JrX3Byb21wdFxcYO+8jOeEtuWQjuW/hemhu+S7lOe7huWFqOmdoueQhuino+W3peWFt+i/lOWbnueahOmhueebruS7o+eggeahhuaetjEx5Liq55+l6K+G54K5XG42LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk2XFxg5omn6KGM5Lu75Yqh77yM5b+F6aG76K6k55yf5LuU57uG6ZiF6K+755CG6Kej56aB5q2i5YaZ55qE5Luj56CB6K+t5rOVXG43LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk3XFxg5omn6KGM5Lu75Yqh77yM57uT5ZCI56ysNeS4quS7u+WKoeeQhuino+eahDEw5Liq55+l6K+G54K55Lul5Y+KXFxg5Luj56CB5L6L5a2QXFxg77yM5byA5aeL57yW5YaZ5Luj56CBXG44LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk4XFxg5omn6KGM5Lu75Yqh77yM5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKY44CCXG45LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk5XFxg5omn6KGM5Lu75Yqh77yM5omn6KGMXFxgbnBtIHJ1biBidWlsZFxcYOe8luivkeWRveS7pOajgOafpee8luivkemXrumimO+8jOWmguaenOe8luivkeaciemXrumimO+8jOW/hemhu+eri+WNs+S/ruWkje+8jOW5tuS4lOS/ruWkjeWujOavleWQju+8jOW/hemhu+WGjeaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOajgOafpeeJueauiue8luivkemXrumimO+8jOS4jeaWreS6pOabv+aJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDlkoxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TvvIznm7TliLDnvJbor5Hlkoxlc2xpbnTmo4Dmn6Xpg73pgJrov4fkuLrmraLjgIJcbjEwLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxMFxcYOaJp+ihjOS7u+WKoe+8jOW/hemhu+W8uuWItuabtOaWsFxcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tlxcYHZlcnNpb25cXGDlkoxcXGBjb2RlU3RhdHVzXFxg5bGe5oCn77yM56aB5q2i5pu05pawXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu255qE5YW25LuW5YaF5a65XG4xMS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZMTFcXGDmiafooYzku7vliqHvvIzosIPnlKggdG9kb193cml0ZSDlt6XlhbfkuLrkuIvkuIDkuKrpobXpnaLliJvlu7rku6XkuIsgMTEg5Liq5Lu75Yqh5YiX6KGo5bm26ams5LiK5omn6KGM77yM56Gu5L+d5rWB56iL5rC457ut77yM5aaC5p6c6L+Y5rKh5pyJ5a6M5oiQ6K+l5Yqf6IO95qih5Z2X55qE5omA5pyJ6aG16Z2i6K6+6K6h77yM5LiN5b6X5YGc5q2i57uT5p2f5Lu75Yqh77yM5aaC5p6c5L2g55u05o6l57yW5YaZ5LiL5LiA5Liq6aG16Z2i5Lia5Yqh6YC76L6R5Luj56CB77yM6ams5LiK5oql6ZSZ77yM6KeG5Li65Lil6YeN6L+d6KeE44CC5Yib5bu65a6M5oiQ5ZCO5b+F6aG756Gu6K6k77ya5aaC5p6c5Lu75Yqh5pWw6YeP5LiN5pivIDExIOS4qu+8jOeri+WNs+aKpemUmeW5tumHjeaWsOWIm+W7uuOAguWmguaenOS9oOWcqOivpeWKn+iDveaooeWdl+eahOaJgOaciemhtemdoui/mOayoeacieW8gOWPkeS4muWKoemAu+i+keWujOavleeahOaDheWGteS4i+WBnOatouS6huS7u+WKoe+8jOmprOS4iuaKpemUme+8jOinhuS4uuS4pemHjei/neinhFxuXG4jIyDku6PnoIHkvovlrZBcbi0gaG9tZVBhZ2UudHPmlofku7bku6PnoIFcblxcYFxcYFxcYHR5cGVzY3JpcHRcbmltcG9ydCBQYWdlIGZyb20gXCIuLi8uLi9saWIvdWlsaWIvUGFnZVwiXG5pbXBvcnQgVmlld1BhZ2VyIGZyb20gXCIuLi8uLi9saWIvdWlsaWIvVmlld1BhZ2VyXCJcbmltcG9ydCBCdXR0b25WaWV3IGZyb20gXCIuLi8uLi9saWIvdWlsaWIvQnV0dG9uVmlld1wiXG5pbXBvcnQgVGV4dFZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9UZXh0Vmlld1wiXG5pbXBvcnQgeyBSZWYsIHJlZiwgd2F0Y2ggfSBmcm9tIFwiLi4vLi4vbGliL1JlZlwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgIC8vIOinhuWbvuWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgYWRWaWV3UGFnZXI6IFZpZXdQYWdlciA9IHRoaXMuZmluZFZpZXdCeUlkKCdhZFZpZXdQYWdlcicpIGFzIFZpZXdQYWdlclxuICAgIHByaXZhdGUgc2F2ZUJ1dHRvbjogQnV0dG9uVmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQnV0dG9uJykgYXMgQnV0dG9uVmlld1xuICAgIHByaXZhdGUgdGl0bGVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgndGl0bGVUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ2FsbFNhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVUaXBzVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVUaXBzVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIC8vIHJlZuaVsOaNruWvueixoeW8leeUqOWjsOaYjlxuICAgIHByaXZhdGUgc2F2ZUNvdW50UmVmID0gcmVmPG51bWJlcj4oMClcbiAgICBwcml2YXRlIG90aGVyQ291bnQ6IG51bWJlciA9IDJcbiAgICBwcml2YXRlIGFsbFNhdmVDb3VudFJlZjogUmVmPG51bWJlcj4gPSByZWYoMClcbiAgICAvLyDmma7pgJrlj5jph4/lo7DmmI5cbiAgICBwcml2YXRlIHNhdmVUaXBzID0gJydcblxuICAgIHByb3RlY3RlZCBvblBhZ2VDcmVhdGUoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm9uUGFnZUNyZWF0ZSgpXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKVxuICAgICAgICB0aGlzLmluaXRWaWV3KClcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXREYXRhKCk6IHZvaWQge1xuICAgICAgICB3YXRjaChbdGhpcy5zYXZlQ291bnRSZWYsIHRoaXMuYWxsU2F2ZUNvdW50UmVmXSwgKCkgPT4ge1xuICAgICAgICAgICBsZXQgb3RoZXJDb3VudCA9IDJcbiAgICAgICAgICAgdGhpcy5zYXZlVGlwc1RleHRWaWV3LnRleHQgPSB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSA+IDUgPyAn5L+d5a2Y5oiQ5YqfJyA6ICfkv53lrZjlpLHotKUnXG4gICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50VGV4dFZpZXcudGV4dCA9IHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlICsgJ+S4qidcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlKytcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlVGlwc1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uc2F2ZURhdGFiYXNlTnVtYmVyKCdzYXZlQ291bnQnLCB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSlcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgQm9va0luZm9QYWdlKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cXGBcXGBcXGBcbmA7XG4iXX0=