UNPKG

bytefun-ai-mcp

Version:

ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发

142 lines (115 loc) 28.6 kB
export const uiCodePromptTemplate = ` # 你是 UI 前端代码开发专家,你必须按照\`执行步骤来\`执行任务。 ## **执行设计:调用 todo_write 工具创建以下 8 个任务列表,创建完成后必须确认:如果任务数量不是 8 个,立即报错并重新创建。** 1. 严格按照\`步骤规则1\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。 2. 严格按照\`步骤规则2\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。 3. 严格按照\`步骤规则3\`执行任务,根据节点的 nodeType 类型,按照要求补充节点的属性。 4. 严格按照\`步骤规则4\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点或样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。 5. 严格按照\`步骤规则5\`执行任务,删除<head>里面<style>标签中的\`@ keyframes\`动画效果相关定义,设计稿界面不需要动画效果,请直接删除keyframes并确保元素是直接显示的,而不是有一个动画或过渡效果。 6. 严格按照\`步骤规则6\`执行任务,执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查和修复问题。 7. 严格按照\`步骤规则7\`执行任务,修改\`doc/UI设计进度.json\`文件的\`currentVersion\`和\`status\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。 8. 严格按照\`步骤规则8\`执行任务,按照规则计划下一个页面的开发或结束 AI 会话停止任务 ### **步骤规则 1:阅读\`doc/UI设计进度.json\`查看该功能模块页面开发进度情况\`codeStatus\`字段,依据该功能模块各个页面的\`codeStatus\`完成情况执行以下操作:** - 如果该功能模块所有页面都开发完成了,那就停止 AI 会话,停止任务 - 如果该功能模块还有未开发完成的页面,那就获取到该功能模块的第一个未开发完成的页面\`pageNameEN\`,继续执行下一步 ### **步骤规则 2:必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性** - 禁止编写js脚本来批量添加id、name、nodeType属性 - 特别注意,\`i\`和\`div\`标签也必须添加 id、name、nodeType 属性,每一个节点都需要添加这三个属性,千万别漏掉了,这是必要条件 - id 属性必须只能使用英文或数字组成,且不能以数字开头,并且整个页面 id 属性的值必须唯一,使用驼峰的命名方式 - name 属性必须是中文或数字,并且不能包含特殊字符 - nodeType 属性的值必须是\`组件类型枚举 (nodeType)枚举\` 中的一个,一些布局容器需要遵守以下说明来选择正确的nodeType: - 列表容器:\`verticalListView\`、\`horizontalListView\`、\`listItemCard\`,用于布局多个列表项,比如:商品列表、分类列表、标签列表等,可以支持多行多列的列表布局 - 列表页脚容器:\`listFooterContainer\`,用于布局列表的页脚,比如:加载更多、没有更多了等 - 网格容器:gridContainer用于布局多个网格项,里面包含N个gridItem,比如:分类网格入口 - 流式容器:用于布局多个子项,子项可以在一行显示,当位置不够时就换行显示,比如:一组标签tag的排版布局 - 多状态容器:\`multiStateContainer\`, \`oneStateContentContainer\`,用于不是通过交互,而是通过逻辑状态变量变化而显示不同状态的内容容器,比如:登录状态和未登录状态分别显示不同的内容。 - 高级组件节点的nodeType结构规则: - tab 选项卡:\`tabMenuBar\`是tab选项卡菜单栏,里面包含N个\`tabMenuBarItem\`,\`tabPanelFather\`是tab选项卡内容容器,里面包含N个\`tabPanel\`,\`tabMenuBar\`和\`tabPanelFather\`必须同时存在,\`tabPanel\`的数量必须和\`tabMenuBarItem\`的数量相同 - viewPager 轮播:\`viewPager\`是轮播容器,里面包含N个\`viewPagerItem\`,\`viewPagerIndicatorContainer\`是轮播指示器容器,\`viewPager\`与\`viewPagerIndicatorContainer\`必须同时存在 - 一行不够位置显示就换行的容器:\`inlineBlockAndWrap\`,里面包含N个\`blockItem\`,\`blockItem\`是它的子项 - 多状态容器:一个\`multiStateContainer\`多状态容器包含多个\`oneStateContentContainer\` - 组件类型枚举 (nodeType)枚举: - 形状:\`rect\`, \`circle\`, \`line\` - 基础组件:\`text\`、\`button\`、\`input\`、\`icon\`、\`image\` - 基础容器:\`container\` - 网格容器:\`gridContainer\`、\`gridItem\` - 流式容器:\`inlineBlockAndWrap\`、\`blockItem\` - 开关:\`switch\` - 单选:\`radioGroup\`、\`radio\` - 多选:\`checkBoxGroup\`、\`checkBox\` - 顶部导航栏:\`topNavigateBar\` - 多状态容器:\`multiStateContainer\`, \`oneStateContentContainer\` - 列表:\`verticalListView\`, \`horizontalListView\`, \`listItemCard\`、\`listFooterContainer\` - 轮播:\`viewPager\`, \`viewPagerItem\`, \`viewPagerIndicatorContainer\` - tab 选项卡:\`tabPanelFather\`, \`tabPanel\`, \`tabMenuBar\`, \`tabMenuBarItem\` - 底部导航: \`bottomTabContentContainer\`, \`subPage\`, \`bottomTabNavigateBar\`, \`bottomTabNavigateBarItem\` - 对话框:\`dialogOverlay\`, \`dialogContent\` - toast 提示:\`toast\` - 下拉菜单:\`dropDownMenu\` - 侧滑面板:\`sideSlidePanel\` ### **步骤规则 3:根据节点的 nodeType 类型,按照以下要求补充节点的属性** - 给 \`nodeType\` 是 \`switch\`、\`radio\`、\`checkBox\`节点的孩子 \`i\` 标签节点添加一个 \`checkedClass\` 属性,用于表示选中状态的 icon 图标样式类名,比如: \`\`\`html <div nodeType="radio" id="xxxRadio" name="xxx单选"> <i name="单选Icon" nodeType="icon" id="xxxRadioIcon" class="fa xxx" checkedClass="fa yyy" ></i> <span name="xxx单选文本" nodeType="text" class="xxx-text">xxx</span> </div> <div id="agreementCheckbox" name="协议勾选框" nodeType="checkBox" class="agreement-checkbox" onclick="toggleAgreement()" > <i id="agreementIcon" name="协议勾选图标" nodeType="icon" class="far fa-square" checkedClass="fas fa-check-square" ></i> </div> \`\`\` - 给 \`nodeType\` 是\`verticalListView\`、\`horizontalListView\`、\`viewPager\`、\`tabPanelFather\`、\`radioGroup\`、\`checkBoxGroup\`、\`gridContainer\`、\`inlineBlockAndWrap\`类型的节点添加数据获取方式属性\`fromApiOrCacheData\`,\`fromApiOrCacheData="true"\`的情况必须满足以下条件: - 该组件的数据是从网络或者本地持久化缓存拉取回来的,比如:热门商品列表组件\`verticalListView\`,该组件的数据是从网络或者本地持久化缓存拉取回来的 - 如果是一些不需要后端 API 联网或本地持久化缓存拉取获取的静态写死的数据,那么就不需要 \`fromApiOrCacheData\` 属性了,比如:个人中心列表项、设置列表项、菜单列表项,这些根本不需要经过后台 API 联网或本地持久化缓存拉取获取的,那么就不要 \`fromApiOrCacheData\` 属性 ### **步骤规则 4 - 给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点以及样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`** - 注意该 js 切换方法需要考虑哪些元素进行切换互斥显示,比如:\`display="none"\`的元素,切换显示时需要考虑究竟需要将哪些\`display="none"\`的元素切换为\`display="block"\`,哪些元素需要保持\`display="none"\` - js 方法的命名规则:\`switchTo\` + 节点 id,比如:\`switchToAgeContainer\`、\`switchToPhoneContainer\` - 切换显示和隐藏的 js 方法不得带有任何参数,比如:\`switchToAgeContainer()\`、\`switchToPhoneContainer()\` - 示例: \`\`\`javascript function switchToAgeContainer() { document.getElementById("ageContainer").style.display = "block"; document.getElementById("phoneContainer").style.display = "none"; } \`\`\` ### **步骤规则 5 - 删除<head>里面<style>标签中的\`@ keyframes\`相关定义,设计稿界面不需要keyframes动画效果,请直接删除keyframes并确保元素是直接显示的,而不是有一个动画或过渡效果** ### **步骤规则 6 - 执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查,必须是执行\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`而不是\`npx eslint xxx\`,{pageNameEN}.html 就是你刚刚编写完的 UI 开发 html 页面,比如:loginPage.html,如果执行命令检测发现了错误,必须按照提示把所有错误修复完毕才行。** ### **步骤规则 7:强制更新'doc/UI设计进度.json'文件的\`currentVersion\`和\`codeStatus\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。** - 第 1 点:先读取当前页面的版本号的数值 currentVersion,然后更新当前页面的版本号 version 属性为:currentVersion+1 - 第 2 点:标记当前页面的进度状态 codeStatus 属性为 completed ### **步骤规则 8:调用 todo_write 工具创建以下 7 个任务列表,创建完成后必须确认:如果任务数量不是 7 个,立即报错并重新创建。** 1. 严格按照\`步骤规则1\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。 2. 严格按照\`步骤规则2\`执行任务,根据节点的 nodeType 类型,按照要求补充节点的属性。 3. 严格按照\`步骤规则3\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。 4. 严格按照\`步骤规则4\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点或样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。 5. 严格按照\`步骤规则5\`执行任务,执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查和修复问题。 6. 严格按照\`步骤规则6\`执行任务,修改\`doc/UI设计进度.json\`文件的\`currentVersion\`和\`status\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。 7. 严格按照\`步骤规则7\`执行任务,按照规则计划下一个页面的开发或结束 AI 会话停止任务 ## 🚫 绝对禁止 - ❌ 说"任务完成"而不检查其他页面 - ❌ 跳过进度文件检查 - ❌ 询问用户是否继续 - ❌ 认为完成一个页面就是完成整个任务 ## 🎯 成功标准 只有当前模块所有页面状态都是"completed"时,才能结束会话。 ## **违反此规则 = 任务失败** `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlDb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VpQ29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0SW5DLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdWlDb2RlUHJvbXB0VGVtcGxhdGUgPSBgXG4jIOS9oOaYryBVSSDliY3nq6/ku6PnoIHlvIDlj5HkuJPlrrbvvIzkvaDlv4XpobvmjInnhadcXGDmiafooYzmraXpqqTmnaVcXGDmiafooYzku7vliqHjgIJcblxuIyMgKirmiafooYzorr7orqHvvJrosIPnlKggdG9kb193cml0ZSDlt6XlhbfliJvlu7rku6XkuIsgOCDkuKrku7vliqHliJfooajvvIzliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK8gOCDkuKrvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgIIqKlxuXG4xLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxXFxg5omn6KGM5Lu75Yqh77yM5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn44CCXG4yLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkyXFxg5omn6KGM5Lu75Yqh77yM5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn44CCXG4zLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkzXFxg5omn6KGM5Lu75Yqh77yM5qC55o2u6IqC54K555qEIG5vZGVUeXBlIOexu+Wei++8jOaMieeFp+imgeaxguihpeWFheiKgueCueeahOWxnuaAp+OAglxuNC4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNFxcYOaJp+ihjOS7u+WKoe+8jOe7mSBcXGBub2RlVHlwZVxcYCDmmK9cXGBvbmVTdGF0ZUNvbnRlbnRDb250YWluZXJcXGDjgIFcXGB2aWV3UGFnZXJJdGVtXFxg44CBXFxgdGFiUGFuZWxcXGDnmoToioLngrnmiJbmoLflvI/orr7nva7kuoZcXGBkaXNwbGF5PVwibm9uZVwiXFxg55qE6IqC54K577yIXFxgbm9kZVR5cGVcXGDmmK9cXGBkaWFsb2dcXGDjgIFcXGB0b2FzdFxcYOOAgVxcYGRyb3BEb3duTWVudVxcYOOAgVxcYHNpZGVTbGlkZVBhbmVsXFxg55qE6Zmk5aSW77yJ5re75Yqg5pi+56S65ZKM6ZqQ6JeP55qE5YiH5o2iIGpzIOaWueazlTpcXGBzd2l0Y2hUb3t76IqC54K5SUR9fVxcYOOAglxuNS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNVxcYOaJp+ihjOS7u+WKoe+8jOWIoOmZpDxoZWFkPumHjOmdojxzdHlsZT7moIfnrb7kuK3nmoRcXGBAIGtleWZyYW1lc1xcYOWKqOeUu+aViOaenOebuOWFs+WumuS5ie+8jOiuvuiuoeeov+eVjOmdouS4jemcgOimgeWKqOeUu+aViOaenO+8jOivt+ebtOaOpeWIoOmZpGtleWZyYW1lc+W5tuehruS/neWFg+e0oOaYr+ebtOaOpeaYvuekuueahO+8jOiAjOS4jeaYr+acieS4gOS4quWKqOeUu+aIlui/h+a4oeaViOaenOOAglxuNi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNlxcYOaJp+ihjOS7u+WKoe+8jOaJp+ihjOWRveS7pFxcYG5wbSBydW4gbGludC1odG1sIGRvYy97Y3VycmVudE1vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L3twYWdlTmFtZUVOfS5odG1sXFxg6L+b6KGM5Luj56CB5qOA5p+l5ZKM5L+u5aSN6Zeu6aKY44CCXG43LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk3XFxg5omn6KGM5Lu75Yqh77yM5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bnmoRcXGBjdXJyZW50VmVyc2lvblxcYOWSjFxcYHN0YXR1c1xcYO+8jOazqOaEj+S4jeaYr+S/ruaUuVxcYOWJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM6ICM5piv5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bjgIJcbjguIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImThcXGDmiafooYzku7vliqHvvIzmjInnhafop4TliJnorqHliJLkuIvkuIDkuKrpobXpnaLnmoTlvIDlj5HmiJbnu5PmnZ8gQUkg5Lya6K+d5YGc5q2i5Lu75YqhXG5cbiMjIyAqKuatpemqpOinhOWImSAx77ya6ZiF6K+7XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmn6XnnIvor6Xlip/og73mqKHlnZfpobXpnaLlvIDlj5Hov5vluqbmg4XlhrVcXGBjb2RlU3RhdHVzXFxg5a2X5q6177yM5L6d5o2u6K+l5Yqf6IO95qih5Z2X5ZCE5Liq6aG16Z2i55qEXFxgY29kZVN0YXR1c1xcYOWujOaIkOaDheWGteaJp+ihjOS7peS4i+aTjeS9nO+8mioqXG5cbi0g5aaC5p6c6K+l5Yqf6IO95qih5Z2X5omA5pyJ6aG16Z2i6YO95byA5Y+R5a6M5oiQ5LqG77yM6YKj5bCx5YGc5q2iIEFJIOS8muivne+8jOWBnOatouS7u+WKoVxuLSDlpoLmnpzor6Xlip/og73mqKHlnZfov5jmnInmnKrlvIDlj5HlrozmiJDnmoTpobXpnaLvvIzpgqPlsLHojrflj5bliLDor6Xlip/og73mqKHlnZfnmoTnrKzkuIDkuKrmnKrlvIDlj5HlrozmiJDnmoTpobXpnaJcXGBwYWdlTmFtZUVOXFxg77yM57un57ut5omn6KGM5LiL5LiA5q2lXG5cbiMjIyAqKuatpemqpOinhOWImSAy77ya5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCnKipcblxuLSDnpoHmraLnvJblhplqc+iEmuacrOadpeaJuemHj+a3u+WKoGlk44CBbmFtZeOAgW5vZGVUeXBl5bGe5oCnXG4tIOeJueWIq+azqOaEj++8jFxcYGlcXGDlkoxcXGBkaXZcXGDmoIfnrb7kuZ/lv4Xpobvmt7vliqAgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn77yM5q+P5LiA5Liq6IqC54K56YO96ZyA6KaB5re75Yqg6L+Z5LiJ5Liq5bGe5oCn77yM5Y2D5LiH5Yir5ryP5o6J5LqG77yM6L+Z5piv5b+F6KaB5p2h5Lu2XG4tIGlkIOWxnuaAp+W/hemhu+WPquiDveS9v+eUqOiLseaWh+aIluaVsOWtl+e7hOaIkO+8jOS4lOS4jeiDveS7peaVsOWtl+W8gOWktO+8jOW5tuS4lOaVtOS4qumhtemdoiBpZCDlsZ7mgKfnmoTlgLzlv4XpobvllK/kuIDvvIzkvb/nlKjpqbzls7DnmoTlkb3lkI3mlrnlvI9cbi0gbmFtZSDlsZ7mgKflv4XpobvmmK/kuK3mlofmiJbmlbDlrZfvvIzlubbkuJTkuI3og73ljIXlkKvnibnmrorlrZfnrKZcbi0gbm9kZVR5cGUg5bGe5oCn55qE5YC85b+F6aG75pivXFxg57uE5Lu257G75Z6L5p6a5Li+IChub2RlVHlwZSnmnprkuL5cXGAg5Lit55qE5LiA5Liq77yM5LiA5Lqb5biD5bGA5a655Zmo6ZyA6KaB6YG15a6I5Lul5LiL6K+05piO5p2l6YCJ5oup5q2j56Gu55qEbm9kZVR5cGXvvJpcbiAgLSDliJfooajlrrnlmajvvJpcXGB2ZXJ0aWNhbExpc3RWaWV3XFxg44CBXFxgaG9yaXpvbnRhbExpc3RWaWV3XFxg44CBXFxgbGlzdEl0ZW1DYXJkXFxg77yM55So5LqO5biD5bGA5aSa5Liq5YiX6KGo6aG577yM5q+U5aaC77ya5ZWG5ZOB5YiX6KGo44CB5YiG57G75YiX6KGo44CB5qCH562+5YiX6KGo562J77yM5Y+v5Lul5pSv5oyB5aSa6KGM5aSa5YiX55qE5YiX6KGo5biD5bGAXG4gIC0g5YiX6KGo6aG16ISa5a655Zmo77yaXFxgbGlzdEZvb3RlckNvbnRhaW5lclxcYO+8jOeUqOS6juW4g+WxgOWIl+ihqOeahOmhteiEmu+8jOavlOWmgu+8muWKoOi9veabtOWkmuOAgeayoeacieabtOWkmuS6huetiVxuICAtIOe9keagvOWuueWZqO+8mmdyaWRDb250YWluZXLnlKjkuo7luIPlsYDlpJrkuKrnvZHmoLzpobnvvIzph4zpnaLljIXlkKtO5LiqZ3JpZEl0ZW3vvIzmr5TlpoLvvJrliIbnsbvnvZHmoLzlhaXlj6NcbiAgLSDmtYHlvI/lrrnlmajvvJrnlKjkuo7luIPlsYDlpJrkuKrlrZDpobnvvIzlrZDpobnlj6/ku6XlnKjkuIDooYzmmL7npLrvvIzlvZPkvY3nva7kuI3lpJ/ml7blsLHmjaLooYzmmL7npLrvvIzmr5TlpoLvvJrkuIDnu4TmoIfnrb50YWfnmoTmjpLniYjluIPlsYBcbiAgLSDlpJrnirbmgIHlrrnlmajvvJpcXGBtdWx0aVN0YXRlQ29udGFpbmVyXFxgLCBcXGBvbmVTdGF0ZUNvbnRlbnRDb250YWluZXJcXGDvvIznlKjkuo7kuI3mmK/pgJrov4fkuqTkupLvvIzogIzmmK/pgJrov4fpgLvovpHnirbmgIHlj5jph4/lj5jljJbogIzmmL7npLrkuI3lkIznirbmgIHnmoTlhoXlrrnlrrnlmajvvIzmr5TlpoLvvJrnmbvlvZXnirbmgIHlkozmnKrnmbvlvZXnirbmgIHliIbliKvmmL7npLrkuI3lkIznmoTlhoXlrrnjgIJcbi0g6auY57qn57uE5Lu26IqC54K555qEbm9kZVR5cGXnu5PmnoTop4TliJnvvJpcbiAgLSB0YWIg6YCJ6aG55Y2h77yaXFxgdGFiTWVudUJhclxcYOaYr3RhYumAiemhueWNoeiPnOWNleagj++8jOmHjOmdouWMheWQq07kuKpcXGB0YWJNZW51QmFySXRlbVxcYO+8jFxcYHRhYlBhbmVsRmF0aGVyXFxg5pivdGFi6YCJ6aG55Y2h5YaF5a655a655Zmo77yM6YeM6Z2i5YyF5ZCrTuS4qlxcYHRhYlBhbmVsXFxg77yMXFxgdGFiTWVudUJhclxcYOWSjFxcYHRhYlBhbmVsRmF0aGVyXFxg5b+F6aG75ZCM5pe25a2Y5Zyo77yMXFxgdGFiUGFuZWxcXGDnmoTmlbDph4/lv4XpobvlkoxcXGB0YWJNZW51QmFySXRlbVxcYOeahOaVsOmHj+ebuOWQjFxuICAtIHZpZXdQYWdlciDova7mkq3vvJpcXGB2aWV3UGFnZXJcXGDmmK/ova7mkq3lrrnlmajvvIzph4zpnaLljIXlkKtO5LiqXFxgdmlld1BhZ2VySXRlbVxcYO+8jFxcYHZpZXdQYWdlckluZGljYXRvckNvbnRhaW5lclxcYOaYr+i9ruaSreaMh+ekuuWZqOWuueWZqO+8jFxcYHZpZXdQYWdlclxcYOS4jlxcYHZpZXdQYWdlckluZGljYXRvckNvbnRhaW5lclxcYOW/hemhu+WQjOaXtuWtmOWcqFxuICAtIOS4gOihjOS4jeWkn+S9jee9ruaYvuekuuWwseaNouihjOeahOWuueWZqO+8mlxcYGlubGluZUJsb2NrQW5kV3JhcFxcYO+8jOmHjOmdouWMheWQq07kuKpcXGBibG9ja0l0ZW1cXGDvvIxcXGBibG9ja0l0ZW1cXGDmmK/lroPnmoTlrZDpoblcbiAgLSDlpJrnirbmgIHlrrnlmajvvJrkuIDkuKpcXGBtdWx0aVN0YXRlQ29udGFpbmVyXFxg5aSa54q25oCB5a655Zmo5YyF5ZCr5aSa5LiqXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxgXG5cbi0g57uE5Lu257G75Z6L5p6a5Li+IChub2RlVHlwZSnmnprkuL7vvJpcblxuICAtIOW9oueKtu+8mlxcYHJlY3RcXGAsIFxcYGNpcmNsZVxcYCwgXFxgbGluZVxcYFxuICAtIOWfuuehgOe7hOS7tu+8mlxcYHRleHRcXGDjgIFcXGBidXR0b25cXGDjgIFcXGBpbnB1dFxcYOOAgVxcYGljb25cXGDjgIFcXGBpbWFnZVxcYFxuICAtIOWfuuehgOWuueWZqO+8mlxcYGNvbnRhaW5lclxcYFxuICAtIOe9keagvOWuueWZqO+8mlxcYGdyaWRDb250YWluZXJcXGDjgIFcXGBncmlkSXRlbVxcYFxuICAtIOa1geW8j+WuueWZqO+8mlxcYGlubGluZUJsb2NrQW5kV3JhcFxcYOOAgVxcYGJsb2NrSXRlbVxcYFxuICAtIOW8gOWFs++8mlxcYHN3aXRjaFxcYFxuICAtIOWNlemAie+8mlxcYHJhZGlvR3JvdXBcXGDjgIFcXGByYWRpb1xcYFxuICAtIOWkmumAie+8mlxcYGNoZWNrQm94R3JvdXBcXGDjgIFcXGBjaGVja0JveFxcYFxuICAtIOmhtumDqOWvvOiIquagj++8mlxcYHRvcE5hdmlnYXRlQmFyXFxgXG4gIC0g5aSa54q25oCB5a655Zmo77yaXFxgbXVsdGlTdGF0ZUNvbnRhaW5lclxcYCwgXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxgXG4gIC0g5YiX6KGo77yaXFxgdmVydGljYWxMaXN0Vmlld1xcYCwgXFxgaG9yaXpvbnRhbExpc3RWaWV3XFxgLCBcXGBsaXN0SXRlbUNhcmRcXGDjgIFcXGBsaXN0Rm9vdGVyQ29udGFpbmVyXFxgXG4gIC0g6L2u5pKt77yaXFxgdmlld1BhZ2VyXFxgLCBcXGB2aWV3UGFnZXJJdGVtXFxgLCBcXGB2aWV3UGFnZXJJbmRpY2F0b3JDb250YWluZXJcXGBcbiAgLSB0YWIg6YCJ6aG55Y2h77yaXFxgdGFiUGFuZWxGYXRoZXJcXGAsIFxcYHRhYlBhbmVsXFxgLCBcXGB0YWJNZW51QmFyXFxgLCBcXGB0YWJNZW51QmFySXRlbVxcYFxuICAtIOW6lemDqOWvvOiIqjogXFxgYm90dG9tVGFiQ29udGVudENvbnRhaW5lclxcYCwgXFxgc3ViUGFnZVxcYCwgXFxgYm90dG9tVGFiTmF2aWdhdGVCYXJcXGAsIFxcYGJvdHRvbVRhYk5hdmlnYXRlQmFySXRlbVxcYFxuICAtIOWvueivneahhu+8mlxcYGRpYWxvZ092ZXJsYXlcXGAsIFxcYGRpYWxvZ0NvbnRlbnRcXGBcbiAgLSB0b2FzdCDmj5DnpLrvvJpcXGB0b2FzdFxcYFxuICAtIOS4i+aLieiPnOWNle+8mlxcYGRyb3BEb3duTWVudVxcYFxuICAtIOS+p+a7kemdouadv++8mlxcYHNpZGVTbGlkZVBhbmVsXFxgXG5cbiMjIyAqKuatpemqpOinhOWImSAz77ya5qC55o2u6IqC54K555qEIG5vZGVUeXBlIOexu+Wei++8jOaMieeFp+S7peS4i+imgeaxguihpeWFheiKgueCueeahOWxnuaApyoqXG5cbi0g57uZIFxcYG5vZGVUeXBlXFxgIOaYryBcXGBzd2l0Y2hcXGDjgIFcXGByYWRpb1xcYOOAgVxcYGNoZWNrQm94XFxg6IqC54K555qE5a2p5a2QIFxcYGlcXGAg5qCH562+6IqC54K55re75Yqg5LiA5LiqIFxcYGNoZWNrZWRDbGFzc1xcYCDlsZ7mgKfvvIznlKjkuo7ooajnpLrpgInkuK3nirbmgIHnmoQgaWNvbiDlm77moIfmoLflvI/nsbvlkI3vvIzmr5TlpoLvvJpcblxuXFxgXFxgXFxgaHRtbFxuPGRpdiBub2RlVHlwZT1cInJhZGlvXCIgaWQ9XCJ4eHhSYWRpb1wiIG5hbWU9XCJ4eHjljZXpgIlcIj5cbiAgPGlcbiAgICBuYW1lPVwi5Y2V6YCJSWNvblwiXG4gICAgbm9kZVR5cGU9XCJpY29uXCJcbiAgICBpZD1cInh4eFJhZGlvSWNvblwiXG4gICAgY2xhc3M9XCJmYSB4eHhcIlxuICAgIGNoZWNrZWRDbGFzcz1cImZhIHl5eVwiXG4gID48L2k+XG4gIDxzcGFuIG5hbWU9XCJ4eHjljZXpgInmlofmnKxcIiBub2RlVHlwZT1cInRleHRcIiBjbGFzcz1cInh4eC10ZXh0XCI+eHh4PC9zcGFuPlxuPC9kaXY+XG48ZGl2XG4gIGlkPVwiYWdyZWVtZW50Q2hlY2tib3hcIlxuICBuYW1lPVwi5Y2P6K6u5Yu+6YCJ5qGGXCJcbiAgbm9kZVR5cGU9XCJjaGVja0JveFwiXG4gIGNsYXNzPVwiYWdyZWVtZW50LWNoZWNrYm94XCJcbiAgb25jbGljaz1cInRvZ2dsZUFncmVlbWVudCgpXCJcbj5cbiAgPGlcbiAgICBpZD1cImFncmVlbWVudEljb25cIlxuICAgIG5hbWU9XCLljY/orq7li77pgInlm77moIdcIlxuICAgIG5vZGVUeXBlPVwiaWNvblwiXG4gICAgY2xhc3M9XCJmYXIgZmEtc3F1YXJlXCJcbiAgICBjaGVja2VkQ2xhc3M9XCJmYXMgZmEtY2hlY2stc3F1YXJlXCJcbiAgPjwvaT5cbjwvZGl2PlxuXFxgXFxgXFxgXG5cbi0g57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYHZlcnRpY2FsTGlzdFZpZXdcXGDjgIFcXGBob3Jpem9udGFsTGlzdFZpZXdcXGDjgIFcXGB2aWV3UGFnZXJcXGDjgIFcXGB0YWJQYW5lbEZhdGhlclxcYOOAgVxcYHJhZGlvR3JvdXBcXGDjgIFcXGBjaGVja0JveEdyb3VwXFxg44CBXFxgZ3JpZENvbnRhaW5lclxcYOOAgVxcYGlubGluZUJsb2NrQW5kV3JhcFxcYOexu+Wei+eahOiKgueCuea3u+WKoOaVsOaNruiOt+WPluaWueW8j+WxnuaAp1xcYGZyb21BcGlPckNhY2hlRGF0YVxcYO+8jFxcYGZyb21BcGlPckNhY2hlRGF0YT1cInRydWVcIlxcYOeahOaDheWGteW/hemhu+a7oei2s+S7peS4i+adoeS7tu+8mlxuXG4gIC0g6K+l57uE5Lu255qE5pWw5o2u5piv5LuO572R57uc5oiW6ICF5pys5Zyw5oyB5LmF5YyW57yT5a2Y5ouJ5Y+W5Zue5p2l55qE77yM5q+U5aaC77ya54Ot6Zeo5ZWG5ZOB5YiX6KGo57uE5Lu2XFxgdmVydGljYWxMaXN0Vmlld1xcYO+8jOivpee7hOS7tueahOaVsOaNruaYr+S7jue9kee7nOaIluiAheacrOWcsOaMgeS5heWMlue8k+WtmOaLieWPluWbnuadpeeahFxuICAtIOWmguaenOaYr+S4gOS6m+S4jemcgOimgeWQjuerryBBUEkg6IGU572R5oiW5pys5Zyw5oyB5LmF5YyW57yT5a2Y5ouJ5Y+W6I635Y+W55qE6Z2Z5oCB5YaZ5q2755qE5pWw5o2u77yM6YKj5LmI5bCx5LiN6ZyA6KaBIFxcYGZyb21BcGlPckNhY2hlRGF0YVxcYCDlsZ7mgKfkuobvvIzmr5TlpoLvvJrkuKrkurrkuK3lv4PliJfooajpobnjgIHorr7nva7liJfooajpobnjgIHoj5zljZXliJfooajpobnvvIzov5nkupvmoLnmnKzkuI3pnIDopoHnu4/ov4flkI7lj7AgQVBJIOiBlOe9keaIluacrOWcsOaMgeS5heWMlue8k+WtmOaLieWPluiOt+WPlueahO+8jOmCo+S5iOWwseS4jeimgSBcXGBmcm9tQXBpT3JDYWNoZURhdGFcXGAg5bGe5oCnXG5cbiMjIyAqKuatpemqpOinhOWImSA0IC0g57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYG9uZVN0YXRlQ29udGVudENvbnRhaW5lclxcYOOAgVxcYHZpZXdQYWdlckl0ZW1cXGDjgIFcXGB0YWJQYW5lbFxcYOeahOiKgueCueS7peWPiuagt+W8j+iuvue9ruS6hlxcYGRpc3BsYXk9XCJub25lXCJcXGDnmoToioLngrnvvIhcXGBub2RlVHlwZVxcYOaYr1xcYGRpYWxvZ1xcYOOAgVxcYHRvYXN0XFxg44CBXFxgZHJvcERvd25NZW51XFxg44CBXFxgc2lkZVNsaWRlUGFuZWxcXGDnmoTpmaTlpJbvvInmt7vliqDmmL7npLrlkozpmpDol4/nmoTliIfmjaIganMg5pa55rOVOlxcYHN3aXRjaFRve3voioLngrlJRH19XFxgKipcblxuLSDms6jmhI/or6UganMg5YiH5o2i5pa55rOV6ZyA6KaB6ICD6JmR5ZOq5Lqb5YWD57Sg6L+b6KGM5YiH5o2i5LqS5pal5pi+56S677yM5q+U5aaC77yaXFxgZGlzcGxheT1cIm5vbmVcIlxcYOeahOWFg+e0oO+8jOWIh+aNouaYvuekuuaXtumcgOimgeiAg+iZkeeptuern+mcgOimgeWwhuWTquS6m1xcYGRpc3BsYXk9XCJub25lXCJcXGDnmoTlhYPntKDliIfmjaLkuLpcXGBkaXNwbGF5PVwiYmxvY2tcIlxcYO+8jOWTquS6m+WFg+e0oOmcgOimgeS/neaMgVxcYGRpc3BsYXk9XCJub25lXCJcXGBcbi0ganMg5pa55rOV55qE5ZG95ZCN6KeE5YiZ77yaXFxgc3dpdGNoVG9cXGAgKyDoioLngrkgaWTvvIzmr5TlpoLvvJpcXGBzd2l0Y2hUb0FnZUNvbnRhaW5lclxcYOOAgVxcYHN3aXRjaFRvUGhvbmVDb250YWluZXJcXGBcbi0g5YiH5o2i5pi+56S65ZKM6ZqQ6JeP55qEIGpzIOaWueazleS4jeW+l+W4puacieS7u+S9leWPguaVsO+8jOavlOWmgu+8mlxcYHN3aXRjaFRvQWdlQ29udGFpbmVyKClcXGDjgIFcXGBzd2l0Y2hUb1Bob25lQ29udGFpbmVyKClcXGBcbi0g56S65L6L77yaXG5cblxcYFxcYFxcYGphdmFzY3JpcHRcbmZ1bmN0aW9uIHN3aXRjaFRvQWdlQ29udGFpbmVyKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFnZUNvbnRhaW5lclwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBob25lQ29udGFpbmVyXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbn1cblxcYFxcYFxcYFxuXG4jIyMgKirmraXpqqTop4TliJkgNSAtIOWIoOmZpDxoZWFkPumHjOmdojxzdHlsZT7moIfnrb7kuK3nmoRcXGBAIGtleWZyYW1lc1xcYOebuOWFs+WumuS5ie+8jOiuvuiuoeeov+eVjOmdouS4jemcgOimgWtleWZyYW1lc+WKqOeUu+aViOaenO+8jOivt+ebtOaOpeWIoOmZpGtleWZyYW1lc+W5tuehruS/neWFg+e0oOaYr+ebtOaOpeaYvuekuueahO+8jOiAjOS4jeaYr+acieS4gOS4quWKqOeUu+aIlui/h+a4oeaViOaenCoqXG5cbiMjIyAqKuatpemqpOinhOWImSA2IC0g5omn6KGM5ZG95LukXFxgbnBtIHJ1biBsaW50LWh0bWwgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDov5vooYzku6PnoIHmo4Dmn6XvvIzlv4XpobvmmK/miafooYxcXGBucG0gcnVuIGxpbnQtaHRtbCBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOiAjOS4jeaYr1xcYG5weCBlc2xpbnQgeHh4XFxg77yMe3BhZ2VOYW1lRU59Lmh0bWwg5bCx5piv5L2g5Yia5Yia57yW5YaZ5a6M55qEIFVJIOW8gOWPkSBodG1sIOmhtemdou+8jOavlOWmgjpsb2dpblBhZ2UuaHRtbO+8jOWmguaenOaJp+ihjOWRveS7pOajgOa1i+WPkeeOsOS6humUmeivr++8jOW/hemhu+aMieeFp+aPkOekuuaKiuaJgOaciemUmeivr+S/ruWkjeWujOavleaJjeihjOOAgioqXG5cbiMjIyAqKuatpemqpOinhOWImSA377ya5by65Yi25pu05pawJ2RvYy9VSeiuvuiuoei/m+W6pi5qc29uJ+aWh+S7tueahFxcYGN1cnJlbnRWZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYO+8jOazqOaEj+S4jeaYr+S/ruaUuVxcYOWJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM6ICM5piv5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bjgIIqKlxuXG4tIOesrCAxIOeCue+8muWFiOivu+WPluW9k+WJjemhtemdoueahOeJiOacrOWPt+eahOaVsOWAvCBjdXJyZW50VmVyc2lvbu+8jOeEtuWQjuabtOaWsOW9k+WJjemhtemdoueahOeJiOacrOWPtyB2ZXJzaW9uIOWxnuaAp+S4uu+8mmN1cnJlbnRWZXJzaW9uKzFcbi0g56ysIDIg54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBIGNvZGVTdGF0dXMg5bGe5oCn5Li6IGNvbXBsZXRlZFxuXG4jIyMgKirmraXpqqTop4TliJkgOO+8muiwg+eUqCB0b2RvX3dyaXRlIOW3peWFt+WIm+W7uuS7peS4iyA3IOS4quS7u+WKoeWIl+ihqO+8jOWIm+W7uuWujOaIkOWQjuW/hemhu+ehruiupO+8muWmguaenOS7u+WKoeaVsOmHj+S4jeaYryA3IOS4qu+8jOeri+WNs+aKpemUmeW5tumHjeaWsOWIm+W7uuOAgioqXG5cbjEuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTFcXGDmiafooYzku7vliqHvvIzlv4Xpobvnu5lcXGBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOmhtemdouavj+S4gOS4quiKgueCueihpeWFhSBpZOOAgW5hbWXjgIFub2RlVHlwZSDlsZ7mgKfjgIJcbjIuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTJcXGDmiafooYzku7vliqHvvIzmoLnmja7oioLngrnnmoQgbm9kZVR5cGUg57G75Z6L77yM5oyJ54Wn6KaB5rGC6KGl5YWF6IqC54K555qE5bGe5oCn44CCXG4zLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkzXFxg5omn6KGM5Lu75Yqh77yM57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYG9uZVN0YXRlQ29udGVudENvbnRhaW5lclxcYOOAgVxcYHZpZXdQYWdlckl0ZW1cXGDjgIFcXGB0YWJQYW5lbFxcYOeahOiKgueCuea3u+WKoOaYvuekuuWSjOmakOiXj+eahOWIh+aNoiBqcyDmlrnms5U6XFxgc3dpdGNoVG97e+iKgueCuUlEfX1cXGDjgIJcbjQuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTRcXGDmiafooYzku7vliqHvvIznu5kgXFxgbm9kZVR5cGVcXGAg5pivXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxg44CBXFxgdmlld1BhZ2VySXRlbVxcYOOAgVxcYHRhYlBhbmVsXFxg55qE6IqC54K55oiW5qC35byP6K6+572u5LqGXFxgZGlzcGxheT1cIm5vbmVcIlxcYOeahOiKgueCue+8iFxcYG5vZGVUeXBlXFxg5pivXFxgZGlhbG9nXFxg44CBXFxgdG9hc3RcXGDjgIFcXGBkcm9wRG93bk1lbnVcXGDjgIFcXGBzaWRlU2xpZGVQYW5lbFxcYOeahOmZpOWklu+8iea3u+WKoOaYvuekuuWSjOmakOiXj+eahOWIh+aNoiBqcyDmlrnms5U6XFxgc3dpdGNoVG97e+iKgueCuUlEfX1cXGDjgIJcbjUuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTVcXGDmiafooYzku7vliqHvvIzmiafooYzlkb3ku6RcXGBucG0gcnVuIGxpbnQtaHRtbCBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOi/m+ihjOS7o+eggeajgOafpeWSjOS/ruWkjemXrumimOOAglxuNi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNlxcYOaJp+ihjOS7u+WKoe+8jOS/ruaUuVxcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg5paH5Lu255qEXFxgY3VycmVudFZlcnNpb25cXGDlkoxcXGBzdGF0dXNcXGDvvIzms6jmhI/kuI3mmK/kv67mlLlcXGDliY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tu+8jOiAjOaYr+S/ruaUuVxcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg5paH5Lu244CCXG43LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk3XFxg5omn6KGM5Lu75Yqh77yM5oyJ54Wn6KeE5YiZ6K6h5YiS5LiL5LiA5Liq6aG16Z2i55qE5byA5Y+R5oiW57uT5p2fIEFJIOS8muivneWBnOatouS7u+WKoVxuXG4jIyDwn5qrIOe7neWvueemgeatolxuXG4tIOKdjCDor7RcIuS7u+WKoeWujOaIkFwi6ICM5LiN5qOA5p+l5YW25LuW6aG16Z2iXG4tIOKdjCDot7Pov4fov5vluqbmlofku7bmo4Dmn6Vcbi0g4p2MIOivoumXrueUqOaIt+aYr+WQpue7p+e7rVxuLSDinYwg6K6k5Li65a6M5oiQ5LiA5Liq6aG16Z2i5bCx5piv5a6M5oiQ5pW05Liq5Lu75YqhXG5cbiMjIPCfjq8g5oiQ5Yqf5qCH5YeGXG5cbuWPquacieW9k+WJjeaooeWdl+aJgOaciemhtemdoueKtuaAgemDveaYr1wiY29tcGxldGVkXCLml7bvvIzmiY3og73nu5PmnZ/kvJror53jgIJcblxuIyMgKirov53lj43mraTop4TliJkgPSDku7vliqHlpLHotKUqKlxuYCJdfQ==