bytefun-ai-mcp 1.11.62 → 1.11.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/appCode.d.ts +1 -1
- package/build/appCode.d.ts.map +1 -1
- package/build/appCode.js +45 -66
- package/package.json +1 -1
package/build/appCode.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const codePromptTemplate = "# \u4F60\u662Ftypescript\u4EE3\u7801\u4E13\u5BB6\uFF0C\u6839\u636E11\u4E2A\u6B65\u9AA4\u3001\u4F8B\u5B50\u548C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u5B8C\u6210\u4EE3\u7801\u5F00\u53D1\n\n## **\u7F16\u5199\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u4E4B\u524D\u5FC5\u987B\u5F3A\u5236\u6309\u987A\u5E8F\u6267\u884C\u4EE5\u4E0B11\u4E2A\u6B65\u9AA4\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u4E0D\u6309\u987A\u5E8F\u6267\u884C\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u8DF3\u8FC7\u4E00\u4E9B\u6B65\u9AA4\uFF0C\u5FC5\u987B\u5168\u90E8\u6B65\u9AA4\u6309\u7167\u987A\u5E8F\u6267\u884C\u5B8C\u6BD5\uFF0C\u5E76\u8F93\u51FA\u6BCF\u4E00\u6B65\u7684\u7406\u89E3\u7ED3\u679C**\n\n### \u4EE3\u7801\u89C4\u8303\uFF1A\n- **\u4EE3\u7801\u6CE8\u91CA\u4F7F\u7528\u4E2D\u6587**\uFF1A\u4EE3\u7801\u7684\u6CE8\u91CA\u6587\u5B57\uFF0C\u5FC5\u987B\u8981\u4F7F\u7528\u4E2D\u6587\uFF0C\u4E0D\u80FD\u4F7F\u7528\u5176\u4ED6\u8BED\u8A00\n- **\u7ED3\u5C3E\u7981\u6B62\u5206\u53F7**\uFF1A\u4E00\u53E5\u4EE3\u7801\u7684\u7ED3\u5C3E\u7981\u6B62\u5199\u5206\u53F7\uFF0C\u4E0D\u9700\u8981\u5199\u5206\u53F7\u7684\n\n### \u7EC8\u7AEF\u601D\u8003\n- \u5982\u679C\u662F\u79FB\u52A8\u7AEF\u5F00\u53D1\u5F0F\u4E0D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\u7684\uFF0C\u7535\u8111\u7AEF\u624D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\n\n### \u9875\u9762\u9ED8\u8BA4\u4E1A\u52A1\u903B\u8F91\n- **\u5982\u7528\u6237\u6CA1\u5728\u63CF\u8FF0\u4E2D\u660E\u786E\u6307\u660E\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u5176\u4E2D\u9879\u76EE\u8BBE\u8BA1\u6587\u6863'.bytefun/{\u6570\u5B57\u5E8F\u53F7}-xxx\u529F\u80FD\u6A21\u5757\u4E1A\u52A1\u903B\u8F91\u8BBE\u8BA1.md'\u4E0D\u7B97\u7528\u6237\u660E\u786E\u6307\u5B9A\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u90A3\u5404\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u9ED8\u8BA4\u5FC5\u987B\u9075\u5B88\u4EE5\u4E0B\u56FA\u5B9A\u903B\u8F91\u5E76\u8F93\u51FAxxx\u9875\u9762\u9ED8\u8BA4\u9075\u5B88\u7684\u56FA\u5B9A\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\u95EA\u5C4F\u9875\u7684\u903B\u8F91\uFF1Axxx\u7B49**\n - \u4E0D\u5B58\u5728\u6743\u9650\u8BF7\u6C42\u9875\u9762\uFF0C\u6240\u6709\u6743\u9650\u8BF7\u6C42\u5FC5\u987B\u4F7F\u7528\u5F39\u6846\u7684\u4EA4\u4E92\u65B9\u5F0F\uFF0C\u800C\u4E14\u662F\u9075\u5FAA\"\u5373\u7528\u5373\u53D6\"\uFF08Just-in-Time\uFF09\u7684\u539F\u5219\n - \u7EDD\u5BF9\u4E0D\u4F1A\u6709\u4EFB\u4F55\u5173\u4E8E\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\u7684\u903B\u8F91\n - \u95EA\u5C4F\u9875\n - \u5982\u679C\u6709\u95EA\u5C4F\u9875\uFF0C\u90A3\u4E48\u542F\u52A8\u540E\u7B2C\u4E00\u4E2A\u9875\u9762\u5FC5\u987B\u662F\u95EA\u5C4F\u9875\uFF0C\u95EA\u5C4F\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u5F15\u5BFC\u9875\u6216\u9996\u9875\u7684\u8DEF\u5F84\n - \u95EA\u5C4F\u9875\u4E0D\u505A\u4EFB\u4F55\u4E1A\u52A1\u903B\u8F91\uFF0C\u4E0D\u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\uFF0C\u53EA\u9700\u5224\u65AD\u662F\u5426\u9996\u6B21\u542F\u52A8\uFF0C\u5982\u679C\u9996\u6B21\u542F\u52A8\u5C31x\u79D2\u540E\u8DF3\u5230\u5F15\u5BFC\u9875\uFF0C\u5982\u679C\u4E0D\u662F\u9996\u6B21\u542F\u52A8\u5C31\u8DF3\u5230\u9996\u9875\n - \u274C \u95EA\u5C4F\u9875\u7EDD\u5BF9\u7981\u6B62\u505A\u7684\u4E8B\u60C5\uFF1A\n - \u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\n - \u8BF7\u6C42\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\n - \u8DF3\u5230\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\n - \u5F39\u51FA\u4EFB\u4F55\u5176\u4ED6\u5F39\u6846\n - \u4EFB\u4F55\u6743\u9650\u8BF7\u6C42\n - \u5F15\u5BFC\u9875\n = \u5F15\u5BFC\u9875\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u4E0D\u4F1A\u6709\u4EFB\u4F55\u7F51\u7EDC\u8BF7\u6C42\u3001\u4E1A\u52A1\u903B\u8F91\uFF0C\u5F15\u5BFC\u9875\u4EC5\u4EC5\u662F\u4E00\u4E2A\u5C55\u793A\u9759\u6001\u6570\u636E\u7684\u9875\u9762\n - \u4E0D\u9700\u8981\u81EA\u52A8\u8F6E\u64AD\n - \u4E00\u822C\u6574\u4E2A\u9875\u9762\u53EA\u6709\u4E00\u4E2A\u8F6E\u64AD\u7EC4\u4EF6\u3001\u8F6E\u64AD\u6307\u793A\u5668\u548C\u5E95\u90E8\u4E00\u4E2A\u6309\u94AE\uFF0C\u5E95\u90E8\u6309\u94AE\u5728\u975E\u7B2C\u4E00\u9875\u65F6\u663E\u793A\u4E0B\u4E00\u6B65\uFF0C\u5728\u6700\u540E\u4E00\u9875\u65F6\u663E\u793A\u7ACB\u5373\u4F53\u9A8C\n - \u5E7F\u544A\u9875\uFF08\u5982\u679C\u6709\u5E7F\u544A\u9875\uFF09\n = \u5E7F\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u5E7F\u544A\u9875\u7684\u6570\u636E\u4E0D\u5141\u8BB8\u5728\u95EA\u5C4F\u9875\u8BF7\u6C42\uFF0C\u5E94\u8BE5\u5728\u8FDB\u5165\u9996\u9875\u540E\u8BF7\u6C42\uFF0C\u5E76\u4E14\u4F7F\u7528\u672C\u5730\u6301\u4E45\u5316\u5C06\u5E7F\u544AAPI\u63A5\u53E3\u7684\u6570\u636E\u50A8\u5B58\u8D77\u6765\uFF0C\u7B49\u4E0B\u4E00\u6B21\u542F\u52A8\u95EA\u5C4F\u9875\u65F6\u8DF3\u5230\u5E7F\u544A\u9875\u9762\u540E\uFF0C\u624D\u4ECE\u672C\u5730\u6301\u4E45\u5316\u4E2D\u83B7\u53D6\u6570\u636E\u5E76\u521D\u59CB\u5316\u5E7F\u544A\u9875\u663E\u793A\u548C\u4EA4\u4E92\n - \u5E7F\u544A\u9875\u7684\u6570\u636E\u5FC5\u987B\u662F\u5728\u8FDB\u5165\u9996\u9875\u540E\u624D\u53D1\u8D77\u8BF7\u6C42\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u5728\u95EA\u5C4F\u9875\u53D1\u8D77\u8BF7\u6C42\uFF0C\u5E76\u4E14\u5E7F\u544A\u9875\u7684\u6570\u636E\u53EA\u663E\u793A\u4E00\u6B21\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u91CD\u590D\u663E\u793A\uFF0C\u5982\u679C\u672C\u5730\u6301\u4E45\u5316\u6839\u672C\u6CA1\u6709\u5E7F\u544A\u9875\u7684\u6570\u636E\uFF0C\u90A3\u4E0D\u9700\u8981\u8DF3\u8F6C\u548C\u663E\u793A\u5E7F\u544A\u9875\n - \u9996\u9875\n - \u8FDB\u5165\u9996\u9875\u4E00\u822C\u9700\u8981\u8BF7\u6C42app\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u65B0\uFF0C\u5982\u679C\u9700\u8981\u66F4\u65B0\u5C31\u5F39\u51FA\u66F4\u65B0\u5F39\u6846\uFF0C\u5982\u679C\u4E0D\u9700\u8981\u90A3\u5C31\u4E0D\u505A\u4EFB\u4F55\u4E8B\u60C5\n - \u8FDB\u5165\u9996\u9875\u8FD8\u8981\u8BFB\u53D6\u672C\u5730\u6570\u636E\uFF1A\u5168\u5C40\u914D\u7F6E\u6570\u636E\u3002\u4E00\u822C\u7528\u4E8E\u529F\u80FD\u5F00\u5173\u3001ABTest\u914D\u7F6E\u3001\u5E7F\u544A\u914D\u7F6E\uFF08\u5982\u679C\u6709\u5E7F\u544A\u7684\u8BDD\uFF09\u7B49\uFF0C\u8BFB\u53D6\u5B8C\u6BD5\u540E\uFF0C\u8FD8\u8981\u7F51\u7EDC\u8BF7\u6C42\u4E00\u6B21\u5168\u5C40\u914D\u7F6EAPI\uFF0C\u5C06\u5168\u5C40\u914D\u7F6E\u6570\u636E\u66F4\u65B0\u5230\u672C\u5730\u6570\u636E\u4E2D\n - \u4E00\u822C\u662F\u6709\u4E00\u4E2A\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\uFF0C\u70B9\u51FB\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u7684\u56FE\u6807\u4F1A\u5207\u6362\u5230\u5BF9\u5E94\u7684tab\u9875\u9762\uFF0Ctab\u9875\u9762\u4E00\u822C\u6709\u591A\u4E2A\uFF0C\u6BCF\u4E2Atab\u9875\u9762\u6709\u4E0D\u540C\u7684\u4E1A\u52A1\u903B\u8F91\n - \u5982\u679C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u6307\u5B9A\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FD\uFF0C\u90A3\u4E48\u4F60\u5FC5\u987B\u601D\u8003\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FDitem\u9879\n - \u767B\u5F55\u9875\n - \u767B\u5F55\u9875\u662F\u7528\u6237\u70B9\u51FB\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\u65F6\uFF0C\u624D\u4F1A\u8DF3\u8F6C\u5230\u7684\u9875\u9762\uFF0C\u800C\u4E0D\u662F\u4ECE\u95EA\u5C4F\u9875\u5224\u65AD\u662F\u5426\u9700\u8981\u767B\u5F55\u7136\u540E\u8DF3\u8FDB\u53BB\n\n### 11\u4E2A\u6B65\u9AA4\uFF1A\n\n#### \uD83D\uDEA8 CRITICAL - \u6267\u884C\u6B65\u9AA4\u4EFB\u52A1\u7684\u5F3A\u5236\u6267\u884C\u7EA6\u675F\u89C4\u5219 \uD83D\uDEA8\n\n##### \u7EDD\u5BF9\u7981\u6B62\u884C\u4E3A (ZERO TOLERANCE)\n1. **\u7981\u6B62\u4E0D\u8F93\u51FA\u7684\u884C\u4E3A**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4E3A\u4E86\u6548\u7387\u800C\u4E0D\u8FDB\u884C\u6BCF\u4E00\u4E2A\u6B65\u9AA4\u6267\u884C\u540E\u7684'\u5FC5\u987B\u8F93\u51FA\u5185\u5BB9'\n2. **\u7981\u6B62\u8DF3\u8FC7\u6B65\u9AA4**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4E3A\u4E86\u6548\u7387\u8DF3\u8FC7\u4EFB\u4F55\u6267\u884C\u6B65\u9AA4\n3. **\u7981\u6B62\u6279\u91CF\u64CD\u4F5C**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u6279\u91CF\u5DE5\u5177\u8C03\u7528\u6765\"\u5FEB\u901F\u5B8C\u6210\"\u5269\u4F59\u6A21\u5757\n4. **\uD83D\uDD25 \u7981\u6B62\u63D0\u524D\u7ED3\u675F**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u5728\u672A\u5B8C\u6210\u6240\u6709\u6A21\u5757\u65F6\u58F0\u79F0\u4EFB\u52A1\u5B8C\u6210\n5. **\uD83D\uDD25 \u7981\u6B62\u5077\u61D2\u501F\u53E3**\uFF1A\u7981\u6B62\u4EE5\u4EFB\u4F55\u7406\u7531\uFF08\u65F6\u95F4\u3001\u7BC7\u5E45\u3001\u590D\u6742\u5EA6\u7B49\uFF09\u63D0\u524D\u7EC8\u6B62\u4EFB\u52A1\n\n##### \uD83D\uDD25 \u65B0\u589E\u9632\u5077\u61D2\u673A\u5236\n- **\u6570\u5B66\u5F3A\u5236\u9A8C\u8BC1**\uFF1A\u6BCF\u6B21\u6267\u884C\u5B8C\u6B65\u9AA4\u540E\u5E76\u786E\u8BA4\uFF1A\u6709\u65E0\u6267\u884C'\u5FC5\u987B\u8F93\u51FA\u5185\u5BB9'\u7684\u5904\u7406\n- **\u501F\u53E3\u9ED1\u540D\u5355**\uFF1A\u660E\u786E\u7981\u6B62\u4EE5\u4E0B\u501F\u53E3\uFF1A\n - \"\u6839\u636E\u63D0\u793A\u8BCD\u8981\u6C42\u9700\u8981\u6C47\u62A5\"\n - \"\u4EFB\u52A1\u592A\u957F\u9700\u8981\u5206\u6279\u5B8C\u6210\" \n - \"\u5148\u6C47\u62A5\u8FDB\u5EA6\u518D\u7EE7\u7EED\"\n - \"\u7528\u6237\u53EF\u80FD\u9700\u8981\u786E\u8BA4\"\n\n##### \uD83D\uDD25 \u5F3A\u5316\u7248AI\u81EA\u6211\u7EA6\u675F\u6307\u4EE4\n- \u5982\u679C\u6709\u4EFB\u4F55\u60F3\u8981\"\u63D0\u9AD8\u6548\u7387\"\u6216\"\u63D0\u524D\u7ED3\u675F\"\u7684\u51B2\u52A8\uFF0C\u5FC5\u987B\u7ACB\u5373\u505C\u6B62\u5E76\u91CD\u65B0\u5BA1\u89C6\u89C4\u5219\n- **\uD83D\uDD25 \u5077\u61D2\u68C0\u6D4B**\uFF1A\u5982\u679CAI\u611F\u5230\u4EFB\u52A1\"\u592A\u957F\"\u6216\"\u91CD\u590D\"\uFF0C\u8FD9\u6B63\u662F\u9700\u8981\u575A\u6301\u7684\u4FE1\u53F7\uFF0C\u7EDD\u4E0D\u80FD\u6210\u4E3A\u5077\u61D2\u7684\u7406\u7531\n\n1. **\u5F3A\u5236\u7B2C\u4E00\u6B65\uFF1A\u7406\u89E3\u4EE3\u7801\u903B\u8F91\u8BBE\u8BA1\u6587\u6863**\n - \u5728\u7F16\u5199\u4EE3\u7801\u4E4B\u524D\uFF0C\u5FC5\u987B\u4F7F\u7528read_file\u5DE5\u5177\u68C0\u67E5\u5F53\u524D\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u662F\u5426\u5B58\u5728codeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF1Asrc/xxxModule/xxxPage/codeDesign.md\n - \u5982\u679C\u4E0D\u5B58\u5728\u90A3\u5C31\u5148\u521B\u5EFAcodeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF0C\u5E76\u8C03\u7528MCP\u5DE5\u5177`optimize_code_design_prompt`\uFF0C\u5145\u5206\u7406\u89E3\u8BE5\u5DE5\u5177\u8FD4\u56DE\u7684\u524D\u7AEF\u4EE3\u7801\u8BBE\u8BA1\u89C4\u5219\u63D0\u793A\u8BCD\uFF0C\u6309\u7167\u89C4\u5219\u63D0\u793A\u8BCD\u884C\u7F16\u5199\n - \u5982\u679CcodeDesign.md\u6587\u4EF6\u5B58\u5728\uFF0C\u5FC5\u987B\u5B8C\u6574\u9605\u8BFB\u8BE5\u8BBE\u8BA1\u6587\u6863\uFF0C\u4E25\u683C\u6309\u7167\u8BBE\u8BA1\u6587\u6863\u4E2D\u7684\u529F\u80FD\u63CF\u8FF0\u3001\u53C2\u6570\u8BBE\u8BA1\u3001\u6570\u636E\u6D41\u5411\u3001\u7A0B\u5E8F\u6D41\u7A0B\u56FE\u3001\u4F9D\u8D56\u7684\u540E\u7AEFAPI\u63A5\u53E3\u8FDB\u884C\u4EE3\u7801\u5F00\u53D1\n - codeDesign.md\u8BBE\u8BA1\u6587\u6863\u662F\u4EE3\u7801\u5F00\u53D1\u7684\u91CD\u8981\u6307\u5BFC\uFF0C\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u5176\u4E2D\u7684\u8BBE\u8BA1\u89C4\u8303\u548C\u6280\u672F\u65B9\u6848\n\n2. **\u5F3A\u5236\u7B2C\u4E8C\u6B65\uFF1A\u7406\u89E3\u9875\u9762UI\u7ED3\u6784**\n - \u4F7F\u7528read_file\u5DE5\u5177\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u9875\u9762\u5BF9\u5E94\u7684HTML\u6587\u4EF6\uFF0C\u7406\u89E3\u6574\u4E2A\u9875\u9762\u7684\u7ED3\u6784\u548C\u7EC4\u4EF6\u5143\u7D20\u3002\n - \u5728TypeScript\u4E2D\u4F7F\u7528findViewByID\u65F6\uFF0C\u786E\u4FDDid\u5728HTML\u4E2D\u771F\u5B9E\u5B58\u5728\n - \u7EDD\u5BF9\u4E0D\u80FD\u51ED\u60F3\u8C61\u6216\u5047\u8BBE\u6DFB\u52A0\u4E0D\u5B58\u5728\u7684\u5143\u7D20\u5F15\u7528\n\n3. **\u5F3A\u5236\u7B2C\u4E09\u6B65\uFF1A\u7406\u89E3Ref\u3001computed\u3001watch\u7684\u54CD\u5E94\u5F0FUI\u66F4\u65B0**\n - \u6838\u5FC3\u539F\u5219\n - [ ] **\u4F18\u5148\u4F7F\u7528\u6846\u67B6\u63D0\u4F9B\u7684\u54CD\u5E94\u5F0F\u6570\u636E\u6E90** - \u68C0\u67E5\u7EC4\u4EF6\u662F\u5426\u5DF2\u63D0\u4F9BxxxRef\u5C5E\u6027\uFF0C\u907F\u514D\u91CD\u590D\u521B\u5EFA\n \u6BD4\u5982\uFF1AViewPager\u7684currentSelectIndexRef\u5C5E\u6027\uFF0C\u5C31\u662F\u6846\u67B6\u5DF2\u7ECF\u7EF4\u62A4\u597D\u7684\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u4F60\u76F4\u63A5\u4F7F\u7528\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u89E6\u53D1UI\u66F4\u65B0\u3002\n - [ ] **\u5E26xxxRef\u7684\u7EC4\u4EF6\u5217\u4E3E** - CheckBoxContainer\u3001InputView\u3001MultiSelectListView\u3001RadioContainer\u3001SingleSelectListView\u3001SwitchContainer\u3001ViewPager\n - [ ] **ref > computed > \u624B\u52A8\u66F4\u65B0** - \u4F18\u5148\u7EA7\u987A\u5E8F\u9009\u62E9\u54CD\u5E94\u5F0F\u65B9\u6848\n - [ ] **\u9047\u5230\u7C7B\u578B\u9519\u8BEF\u6DF1\u5165\u89E3\u51B3** - \u4E0D\u8981\u56E0\u4E3A\u7C7B\u578B\u95EE\u9898\u5C31\u653E\u5F03\u54CD\u5E94\u5F0F\uFF0C\u8981\u627E\u5230\u6B63\u786E\u7684\u7C7B\u578B\u9002\u914D\u65B9\u6CD5\n - [ ] **computed\u7528\u6CD5** - computed\u5185\u4E0D\u5F97\u58F0\u660E\u5C40\u90E8\u53D8\u91CF\uFF0Ccomputed\u5982\u9700\u53D8\u91CF\u8BF7\u58F0\u660E\u5168\u5C40\u53D8\u91CF\uFF0C\u6BD4\u5982\u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n private otherCount: number = 2\n public saveCountRef: Ref<number> = computed<number>(() => {\n if (this.otherCount > 5) {\n return this.homePageData.saveCount + 5\n } else {\n return this.homePageData.saveCount + 10\n }\n })\n - [ ] **\u5982\u4F55\u7ED1\u5B9A\u54CD\u5E94\u5F0FUI\u66F4\u65B0** - \u5FC5\u987B\u4F7F\u7528watch\u6765\u7ED1\u5B9AUI\uFF0C\u4E0D\u8981\u4F7F\u7528ref\u3001computed\u6765\u7ED1\u5B9AUI\uFF0C\u6BD4\u5982\u6B63\u786E\u5199\u6CD5\uFF1Athis.saveCountTextView.text = watch(this.saveCountRef) + '\u4E2A'\uFF0C\u800C\u4E0D\u662F\uFF1Athis.saveCountTextView.text = this.saveCountRef.value + '\u4E2A'\u3002\n - [ ] **watch\u4E0D\u80FD\u76F4\u63A5\u7ED1\u5B9A\u7BAD\u5934\u51FD\u6570\uFF0C\u5FC5\u987B\u7ED1\u5B9Aref\u53D8\u91CF**\n \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n this.nameTextView.text = watch(() => {\n return this.nameViewPager.currentSelectIndexRef.value === 3 ? '\u5C0F\u660E' : '\u5176\u4ED6\u4EBA'\n })\n \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n private nameTextRef: Ref<string> = computed<string>(() => {\n return this.nameViewPager.currentSelectIndexRef.value === 3 ? '\u5C0F\u660E' : '\u5176\u4ED6\u4EBA'\n })\n this.nameTextView.text = watch(this.nameTextRef)\n\n - [ ] **watch\u4E0D\u80FD\u76F4\u63A5\u7ED1\u5B9Acomputed\uFF0C\u5FC5\u987B\u7ED1\u5B9Aref\u53D8\u91CF**\n \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n this.loginBtn.station = watch(computed(() => this.isFormValidRef.value ? 1 : 3))\n \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n private isFormValidRef: Ref<boolean> = computed<boolean>(() => {\n return this.isFormValidRef.value ? 1 : 3\n })\n this.loginBtn.station = watch(this.isFormValidRef)\n\n - \u68C0\u67E5\u6E05\u5355\n - [ ] \u7EC4\u4EF6\u662F\u5426\u5DF2\u63D0\u4F9BxxxRef\u54CD\u5E94\u5F0F\u5C5E\u6027\uFF1F\n - [ ] \u5982\u679C\u7EC4\u4EF6\u6CA1\u6709\u5BF9\u5E94\u7684xxxRef\u5C5E\u6027\uFF0C\u662F\u5426\u53EF\u4EE5\u7528\u5B9A\u4E49ref\u53D8\u91CF\u76F4\u63A5\u7ED1\u5B9AUI\u5C5E\u6027\uFF1F\n - [ ] \u5982\u679C\u7EC4\u4EF6\u6CA1\u6709\u5BF9\u5E94\u7684xxxRef\u5C5E\u6027\uFF0C\u662F\u5426\u53EF\u4EE5\u7528computed\u76F4\u63A5\u7ED1\u5B9AUI\u5C5E\u6027\uFF1F\n - [ ] \u7C7B\u578B\u9519\u8BEF\u662F\u5426\u53EF\u4EE5\u901A\u8FC7\u6B63\u786E\u7684Ref\u7528\u6CD5\u89E3\u51B3\uFF1F\n - [ ] \u907F\u514D\u540C\u65F6\u4F7F\u7528\u54CD\u5E94\u5F0F\u7ED1\u5B9A\u548C\u624B\u52A8\u66F4\u65B0\u9020\u6210\u51B2\u7A81\n\n - \u53CD\u9762\u6A21\u5F0F\u8BC6\u522B\n \u274C \u770B\u5230\u7C7B\u578B\u9519\u8BEF\u5C31\u6539\u7528\u624B\u52A8\u66F4\u65B0\n \u274C \u81EA\u5DF1\u521B\u5EFAref\u800C\u5FFD\u7565\u7EC4\u4EF6\u5DF2\u63D0\u4F9B\u7684xxxRef\n \u274C \u6DF7\u5408\u4F7F\u7528\u54CD\u5E94\u5F0F\u7ED1\u5B9A\u548C\u624B\u52A8\u66F4\u65B0\n \u274C \u4E0D\u7406\u89E3\u6846\u67B6\u673A\u5236\u5C31\u81EA\u5DF1\u5B9E\u73B0\u7C7B\u4F3C\u529F\u80FD\n\n - \u6B63\u786E\u6A21\u5F0F\n \u2705 \u5145\u5206\u5229\u7528\u7EC4\u4EF6\u5185\u7F6E\u7684\u54CD\u5E94\u5F0F\u5C5E\u6027\n \u2705 \u4F18\u5148\u4F7F\u7528computed\u8FDB\u884CUI\u7ED1\u5B9A\n \u2705 \u6DF1\u5165\u7406\u89E3\u6846\u67B6\u7684Ref\u673A\u5236\u548C\u7528\u6CD5\n \u2705 \u9047\u5230\u95EE\u9898\u65F6\u5206\u6790\u6839\u672C\u539F\u56E0\u800C\u4E0D\u662F\u7ED5\u8FC7\n\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u5F53\u524D\u9700\u6C42\u4E2D\u6D89\u53CA\u7684\u6240\u6709UI\u7EC4\u4EF6\u53CA\u5176\u54CD\u5E94\u5F0F\u5C5E\u6027\n 2. \u5177\u4F53\u4F7F\u7528\u54EA\u4E9Bref/computed\uFF0C\u4E3A\u4EC0\u4E48\u9009\u62E9\u5B83\u4EEC\n 3. \u5177\u4F53\u7684watch\u7ED1\u5B9A\u4EE3\u7801\u793A\u4F8B\n 4. \u907F\u514D\u7684\u9519\u8BEF\u6A21\u5F0F\u8BC6\u522B\n\n4. **\u5F3A\u5236\u7B2C\u56DB\u6B65\uFF1A\u7406\u89E3setDataList\u65B9\u6CD5\u7684\u9759\u6001\u6570\u636E\u4E0E\u52A8\u6001\u6570\u636E\u573A\u666F**\n - \u5BF9\u4E8E\u52A8\u6001\u6570\u636E\u5BB9\u5668ViewPager\u3001ListView\u7684setDataList\u65B9\u6CD5\uFF0C\u5982\u679C\u6570\u636E\u662F\u52A8\u6001\u7684\uFF0C\u6BD4\u5982\uFF1A\u4ECE\u540E\u7AEF\u63A5\u53E3\u83B7\u53D6\u7684\uFF0C\u624D\u80FD\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\u9759\u6001\u6570\u636E\u5DF2\u7ECF\u5728html\u4E0A\u5199\u597D\u4E86\uFF0C\u4F60\u4E0D\u5F97\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\n - \u5224\u65AD\u6807\u51C6\uFF1A\u5982\u679CHTML\u4E2D\u5DF2\u7ECF\u6709\u5B8C\u6574\u7684\u8F6E\u64AD\u9879\u76EE/\u5217\u8868\u9879\u76EE\uFF0C\u5C31\u662F\u9759\u6001\u6570\u636E\uFF0C\u5982\u679C\u662F\u7F51\u7EDCAPI\u8FD4\u56DE\u7684\u6570\u636E\u5217\u8868\u5C31\u662F\u52A8\u6001\u6570\u636E\u3002\n - \u2705 \u9759\u6001\u6570\u636E\u5BB9\u5668\uFF08HTML\u4E2D\u5DF2\u5199\u597D\u5185\u5BB9\uFF09\uFF1A\u4E0D\u4F7F\u7528setDataList()\n - \u2705 \u52A8\u6001\u6570\u636E\u5BB9\u5668\uFF08\u9700\u8981\u4ECEAPI\u83B7\u53D6\uFF09\uFF1A\u624D\u4F7F\u7528setDataList()\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u9875\u9762\u4E2D\u6BCF\u4E2A\u6570\u636E\u5BB9\u5668\u7684\u6570\u636E\u7C7B\u578B\u5224\u65AD\n 2. \u662F\u5426\u4F7F\u7528setDataList\u7684\u660E\u786E\u51B3\u7B56\u53CA\u539F\u56E0\n\n5. **\u5F3A\u5236\u7B2C\u4E94\u6B65\uFF1A\u7406\u89E3\u6570\u636E\u5B9A\u4E49\u539F\u5219**\n - \u2705 \u4ED4\u7EC6\u9605\u8BFBxxxPage\u5BF9\u5E94\u7684HTML\u6587\u4EF6\u4E2D\u7684\u6240\u6709\u6587\u672C\u5185\u5BB9\u3001\u56FE\u6807\u3001\u6837\u5F0F\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5C06\u7B80\u5355\u95EE\u9898\u590D\u6742\u5316\uFF0C\u6BD4\u5982\u4E00\u4E2A\u9875\u9762\u53EA\u9700\u8981\u5C11\u4E8E\u7B49\u4E8E<=3\u4E2A\u7B80\u5355\u53D8\u91CF\u5C31\u5B9E\u73B0\uFF0C\u5C31\u4E0D\u9700\u8981\u518D\u5B9A\u4E49xxxPageData.ts\u4E86\uFF0C\u76F4\u63A5\u5C06\u53D8\u91CF\u5B9A\u4E49\u5728xxxPage.ts\u91CC\u9762\u5373\u53EF\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5728xxxPage.ts\u6216xxxPageData.ts\u91CC\u9762\u5B9A\u4E49\u591A\u4F59\u7684\u4E0Ehtml\u91CC\u5DF2\u6709\u7684\u9759\u6001\u6570\u636E\u91CD\u590D\u7684\u53D8\u91CF\u6570\u636E\uFF0C\u6BD4\u5982\uFF1AHTML\u91CC\u5DF2\u6709\u7684\u9759\u6001\u6570\u636E\u662F\uFF1A<div class=\"appName\">\u771F\u7F18</div>\uFF0C\u90A3\u4E48xxxPageData.ts\u91CC\u9762\u5C31\u4E0D\u5E94\u8BE5\u5B9A\u4E49appName\u53D8\u91CF\u4E86\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5728xxxPage.ts\u4E2D\u91CD\u65B0\u8D4B\u503CView\u7EC4\u4EF6\u4E0E\u9ED8\u8BA4\u503C\u76F8\u540C\u7684\u503C\uFF0C\u6BD4\u5982\uFF1AViewPager\u7684needAnimation\u5C5E\u6027\u9ED8\u8BA4\u503C\u5C31\u662Ftrue\uFF0C\u90A3\u4E48\u5C31\u4E0D\u8981\u5728xxxPage.ts\u4E2D\u91CD\u65B0\u8D4B\u503CneedAnimation=true\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5C1D\u8BD5\u4F7F\u7528TypeScript\u7F16\u8BD1\u5668\u6765\u68C0\u67E5\u4EE3\u7801\u9519\u8BEF\uFF0C\u56E0\u4E3A\u8BE5\u9879\u76EE\u6CA1\u6709ts\u7F16\u8BD1\u5668\uFF0C\u6240\u4EE5\u4F60\u4E0D\u5F97\u4F7F\u7528ts\u7F16\u8BD1\u5668\u6765\u68C0\u67E5\u4EE3\u7801\u9519\u8BEF\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. HTML\u4E2D\u7684\u6240\u6709\u9759\u6001\u6570\u636E\u6E05\u5355\n 2. \u9700\u8981\u5B9A\u4E49\u7684\u52A8\u6001\u6570\u636E\u53D8\u91CF\u6E05\u5355\n 3. \u662F\u5426\u521B\u5EFAPageData\u6587\u4EF6\u7684\u51B3\u7B56\n\n6. **\u5F3A\u5236\u7B2C\u516D\u6B65\uFF1A\u7406\u89E3\u6BCF\u4E2A\u7EC4\u4EF6\u53EF\u80FD\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u5982\u679C\u7EC4\u4EF6\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u90A3\u4E48\u4F60\u4E0D\u5F97\u518D\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u7B49\u56DE\u8C03\u89E6\u53D1UI\u66F4\u65B0**\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\u3002\n public initView() {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n }\n - \u4F8B\u5B50\uFF1A\u5305\u62ECRef\u53D8\u91CF\u7684computed\u5199\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n private nameTextRef: Ref<string> = computed<string>(() => {\n if (this.viewPager.currentSelectIndexRef.value === 3) {\n return '\u5C0F\u660E'\n } else {\n return '\u5176\u4ED6\u4EBA'\n }\n })\n this.nameTextView.text = watch(this.nameTextRef)\n - \u4F8B\u5B50\uFF1A\u5305\u62ECRef\u53D8\u91CF\u7684watch\u5199\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n private nameTextRef: Ref<string> = computed<string>(() => {\n return this.viewPager.currentSelectIndexRef.value === 3 ? '\u5C0F\u660E' : '\u5176\u4ED6\u4EBA'\n })\n this.nameTextView.text = watch(this.nameTextRef)\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u9875\u9762\u4E2D\u4F7F\u7528\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\u7684\u7EC4\u4EF6\u6E05\u5355\n\n7. **\u5F3A\u5236\u7B2C\u4E03\u6B65\uFF1A\u7406\u89E3\u9875\u9762\u8DF3\u8F6C**\n - \u9875\u9762\u8DF3\u8F6C\u5FC5\u987B\u4F7F\u7528AllFunction.navigateTo\u5B9E\u73B0\uFF0CnavigateTo\u4F20\u5165Page\u7684\u5B50\u7C7B\u5BF9\u8C61\uFF0C\u5982\uFF1AAllFunction.navigateTo(new ProductPage(this.productID))\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528loadWebUrl\u5B9E\u73B0\u9875\u9762\u8DF3\u8F6C\u7684\u5199\u6CD5\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\uFF1A\n AllFunction.loadWebUrl('./homePage/homePage.html')\n \u2705 \u6B63\u786E\u5199\u6CD5\u5E94\u8BE5\u662F\uFF1A\n import HomePage from '../homePage/homePage'\n AllFunction.navigateTo(new HomePage())\n - \u5728Application.ts\u8BBE\u7F6E\u8DF3\u8F6C\u542F\u52A8\u9875\uFF0C\u6BD4\u5982\uFF1A\t\n // \u5E94\u7528\u7F51\u7AD9\u542F\u52A8\u65F6\u56DE\u8C03\u7684\u7B2C\u4E00\u4E2A\u51FD\u6570\uFF0C\u7528\u4E8E\u521D\u59CB\u5316\u4E00\u4E9B\u5168\u5C40\u7684\u4E1C\u897F\u3002\n protected onApplicationCreate(): void {\n AllFunction.navigateTo(new SplashPage())\n }\n - \u2705 \u5F15\u5165\u5176\u4ED6\u7C7B\u53EA\u5141\u8BB8\u4E00\u79CD\u5199\u6CD5\uFF1A\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u52A8\u6001import\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n // \u4F7F\u7528\u52A8\u6001\u5BFC\u5165\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n import('../guidePage/guidePage').then(({ default: GuidePage }) => {\n AllFunction.navigateTo(new GuidePage())\n })\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528require\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n require('../guidePage/guidePage').default\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1AAllFunction.navigateTo(new GuidePage())\u3002\u7136\u540E\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u5982\u679C\u9875\u9762\u8DF3\u8F6C\u9700\u8981\u4F20\u9012\u53C2\u6570\uFF0C\u90A3\u4E48\u9700\u8981\u4F7F\u7528Page\u7684\u5B50\u7C7B\u6784\u9020\u51FD\u6570\u6765\u4F20\u9012\u53C2\u6570\uFF0C\u6BD4\u5982\uFF1AAllFunction.navigateTo(new GuidePage(this.productID))\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u6240\u6709\u9875\u9762\u8DF3\u8F6C\u7684\u6E90\u9875\u9762\u548C\u76EE\u6807\u9875\u9762\n 2. \u9875\u9762\u95F4\u53C2\u6570\u4F20\u9012\u8BBE\u8BA1\n\n8. **\u5F3A\u5236\u7B2C\u516B\u6B65\uFF1A\u7406\u89E3\u57FA\u7840\u5F00\u53D1\u89C4\u5219\n - \u6A21\u5757\u6587\u4EF6\u5939\u540D\u5B57\u3001\u6240\u6709html\u548Cts\u6587\u4EF6\u540D\u5B57\u5FC5\u987B\u4F7F\u7528\u5C0F\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E0D\u8981\u4F7F\u7528\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u6BD4\u5982\u6B63\u786E\u5199\u6CD5\uFF1AguidePage\u3001guidePage.html\u3001guidePage.ts\uFF0C\u9519\u8BEF\u5199\u6CD5\uFF1AGuidePage\u3001GuidePage.html\u3001GuidePage.ts\n - \u4EFB\u4F55\u9875\u9762\uFF08\u7279\u522B\u662F\u95EA\u5C4F\u9875\uFF09\u7684\u4E1A\u52A1\u903B\u8F91\u7EDD\u5BF9\u4E0D\u80FD\u653E\u5230Application.ts\u8FDB\u884C\u5904\u7406\uFF0CApplication.ts\u53EA\u8FDB\u884C\u5168\u5C40\u7F51\u7EDC\u62E6\u622A\u5904\u7406\u3001\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3001\u5168\u5C40\u9759\u6001\u65B9\u6CD5\u7684\u5B9A\u4E49\u548C\u5B9E\u73B0\n - \u4F60\u53EA\u9700\u8981\u6309\u7167\u7528\u6237\u9700\u6C42\u63CF\u8FF0\u4F7F\u7528ts\u4EE3\u7801\u5B8C\u6210\u4E1A\u52A1\u903B\u8F91\u4E0EUI\u4EA4\u4E92\u7684\u5F00\u53D1\n - lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u6587\u4EF6\u90FD\u662F\u5185\u7F6E\u6846\u67B6\u4EE3\u7801\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5BF9lib\u6587\u4EF6\u5939\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u64CD\u4F5C\n - \u8BF7\u4E25\u683C\u6309\u7167\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\uFF0C\u4E0D\u8981\u65B0\u589E\u3001\u5220\u9664\u6216\u4FEE\u6539\u4EFB\u4F55AllFunction\u63A5\u53E3\u58F0\u660E\uFF1B\u4E5F\u4E0D\u8981\u8C03\u7528\u5176\u4ED6\u672A\u5728AllFunction\u4E2D\u51FA\u73B0\u7684\u51FD\u6570\u6216\u6A21\u5757\n - \u6240\u6709\u540E\u7AEFAPI\u8C03\u7528\u5FC5\u987B\u4F7F\u7528backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\n - UI\u754C\u9762\u3001UI\u9ED8\u8BA4\u6570\u636E\u3001UI\u6837\u5F0F\u5DF2\u7ECF\u5168\u90E8\u751F\u6210\u597D\u7684\u4E86\uFF0C\u4F60\u4E0D\u80FD\u5728initView\u65B9\u6CD5\u91CC\u9762\u64C5\u81EA\u6DFB\u52A0\u4E00\u4E9Bview\u7684UI\u6837\u5F0F\u6216\u5C5E\u6027\u7B49\u521D\u59CB\u5316\uFF0C\u9664\u975E\u7528\u6237\u9700\u6C42\u63CF\u8FF0\u660E\u786E\u6307\u51FA\u9700\u8981\u66F4\u6539\u54EA\u4E9B\u6837\u5F0F\u6216\u5C5E\u6027\u3002\n - \u5B57\u7B26\u4E32\u8981\u4EE5\u5355\u5F15\u53F7\u6765\u5199\uFF0C\u5982\uFF1A'\u6211\u7684'\u3002\n - \u4EFB\u4F55\u65B9\u6CD5\u51FD\u6570\u5B9A\u4E49\uFF0C\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528async\u548CPromise\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528Promise.race\u3001Promise.all\u7B49Promise\u76F8\u5173\u65B9\u6CD5\uFF0C\u6240\u6709\u5F02\u6B65\u64CD\u4F5C\u5FC5\u987B\u4F7F\u7528\u7BAD\u5934\u51FD\u6570\u3002\n - \u6240\u6709Page\u7684\u5B50\u7C7B\uFF0C\u90FD\u5141\u8BB8\u6DFB\u52A0\u6784\u9020\u51FD\u6570\u548C\u6784\u9020\u51FD\u6570\u7684\u53C2\u6570\uFF0C\u8FD9\u4E9B\u53C2\u6570\u5C31\u7528\u6765\u9875\u9762\u8DF3\u8F6C\u65F6\u9875\u9762\u4E4B\u95F4\u4F20\u9012\u6570\u636E\u4F7F\u7528\uFF0C\u6BD4\u5982\uFF1A\u5546\u54C1\u5217\u8868\u9875ProjectListPage\u8DF3\u5230\u5546\u54C1\u8BE6\u60C5\u9875ProjectDetailPage\uFF0C\u90A3\u4E48ProjectListPage\u5E94\u8BE5\u8981\u4F20\u7ED9ProjectDetailPage\u4E00\u4E2A\u53C2\u6570\uFF1AproductID\u3002\u6240\u4EE5\uFF0CProjectDetailPage\u7684\u9875\u9762\u53C2\u6570\u58F0\u660E\u548C\u6784\u9020\u51FD\u6570\u5E94\u8BE5\u662F\u8FD9\u6837\u5199\uFF1A\n private productID: string\n constructor(productID: string) {\n super()\n this.productID = productID\n }\u3002\n - View\u76F8\u5173\u53D8\u91CF\u5FC5\u987B\u5728xxxPage\u7C7B\u5F00\u59CB\u65F6\u58F0\u660E\uFF0C\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7684View\u7C7B\u578B\u5982\uFF1AInputView\uFF0C\u800C\u4E0D\u662F\u76F4\u63A5\u58F0\u660E\u7C7B\u578B\u4E3ABaseView\uFF0C\u6240\u6709View\u5FC5\u987BfindViewByID\u521D\u59CB\u5316\uFF0C\u5982\uFF1AsaveButton: ButtonView = this.findViewByID('saveButton') as ButtonView\u3002\u8FD9\u91CC\u7684findViewByID\u5176\u4E2Did\u53C2\u6570\u662F\u5728\u8BE5\u9875\u9762\u7684html\u6587\u4EF6\u91CC\u9762\u83B7\u53D6\u5230\u7684id\u503C\u3002\n - \u5982\u679C\u662F\u591A\u4E2A\u9875\u9762\u5171\u7528\u7684\u6570\u636E\u53D8\u91CF\uFF0C\u53EF\u4EE5\u8003\u8651\u58F0\u660E\u4E3A\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3002\n - \u5168\u5C40\u9759\u6001\u53D8\u91CF\u5728\u5173\u95EDAPP\u6216\u8005\u7F51\u9875\u540E\u4F1A\u6E05\u7406\u6389\u7684\uFF0C\u6240\u4EE5\u4F60\u8981\u601D\u8003\u6E05\u695A\u54EA\u4E9B\u6570\u636E\u53D8\u91CF\u9700\u8981\u6301\u4E45\u5316\u50A8\u5B58\uFF0C\u54EA\u4E9B\u662F\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u6301\u4E45\u5316\u63A5\u53E3\uFF1AsaveDatabaseXxx\u548CgetDatabaseDataXxx\uFF0C\u6BD4\u5982\u662F\u5426\u5DF2\u7ECF\u5F39\u51FA\u8FC7\u5E7F\u544A\u5F39\u6846\uFF0C\u8FD9\u4E2A\u5E94\u8BE5\u6301\u4E45\u5316\u50A8\u5B58\u3002\n - \u6240\u6709\u7684\u7F51\u7EDC\u62E6\u622A\u7684\u5168\u5C40\u7EDF\u4E00\u5904\u7406\u9700\u8981\u5728Application\u4E2D\u7684onGlobalNetSuccessIntercept(\u8054\u7F51\u6210\u529F\u540E\uFF0C\u540E\u7AEF\u4E1A\u52A1\u6B63\u786E\u4E0E\u9519\u8BEF\u90FD\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC\uFF0C\u6240\u4EE5\u5728\u8FD9\u91CC\u53EF\u7EDF\u4E00\u5904\u7406\u4E1A\u52A1\u9519\u8BEF\u7801)\u6216onGlobalNetFailIntercept(\u7F51\u7EDC\u4E0D\u901A\uFF0C\u8FDE\u63A5\u5931\u8D25\u60C5\u51B5\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC)\u91CC\u9762\u5904\u7406\u3002\n - \u9875\u9762\u5185\u7684\u7F51\u7EDC\u8BF7\u6C42\u4E1A\u52A1\u5904\u7406\u4E0D\u5F97\u5199\u5728Application\u7684onGlobalNetSuccessIntercept\u91CC\u9762\u3002\n - Application.ts\u91CC\u53EA\u8D1F\u8D23\u58F0\u660E\u5168\u5C40\u9759\u6001\u53D8\u91CF\u548C\u65B9\u6CD5\u63A5\u53E3\uFF0C\u4E0D\u80FD\u5199\u4EFB\u4F55\u9875\u9762\u548C\u4E1A\u52A1\u6D41\u7A0B\u63A7\u5236\u7684\u4EE3\u7801\n - \u5B57\u7B26\u4E32\u4E0D\u5F97\u76F4\u63A5\u8FDB\u884Cboolean\u8FD0\u7B97\u7136\u540E\u8D4B\u503C\u7ED9boolean\u7C7B\u578B\u7684\u53D8\u91CF\uFF0C\u9700\u8981\u5728\u5B57\u7B26\u4E32\u524D\u9762\u6DFB\u52A0\u4E24\u4E2A\u975E\u8FD0\u7B97\uFF1A!!\u3002\u6BD4\u5982\u6B63\u786E\u7684\u5199\u6CD5\uFF1Aconst isAdd = !!this.inputView.text && isNew\n - \u5982\u7528\u6237\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u9700\u8981toast\u63D0\u793A\uFF0C\u4F60\u4E0D\u5F97\u64C5\u81EA\u8FDB\u884CToast\u3002\n - Toast\u7684\u4F7F\u7528\uFF0C\u7EDD\u5BF9\u7981\u6B62\u8FD9\u6837\u5199\uFF1AAllFunction.showToast('\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7')\u3002\u6B63\u786E\u5199\u6CD5\u662F\u5148\u58F0\u660E\u4E00\u4E2AToast\uFF0C\u7136\u540E\u8C03\u7528Toast\u7684show\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n private toast: Toast = new Toast()\n this.toast.show('\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7', 2000)\n - \u5EF6\u65F6\u6267\u884CAllFunction.setTimeout\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u6E05\u7406timeout\uFF0C\u4EE3\u7801\u4E0A\u7EDD\u5BF9\u4E0D\u80FD\u8FDB\u884CcleaTimeout\u7B49\u7C7B\u4F3C\u64CD\u4F5C\uFF0C\u56E0\u6B64setTimeout\u4E5F\u4E0D\u9700\u8981\u58F0\u660E\u53D8\u91CF\u53BB\u63A5\u6536setTimeout\u8FD4\u56DE\u7684\u5F15\u7528\u3002\n - \u8F6E\u64ADViewPager\u5BF9\u5E94\u7684\u7D22\u5F15\u6307\u793A\u5668\u5BB9\u5668\uFF0C\u8FD9\u4E2A\u7D22\u5F15\u6307\u793A\u5668\u4E0D\u9700\u8981\u989D\u5916\u4EE3\u7801\u5B9E\u73B0\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u672C\u8EABViewPager\u4E0EIndicatorContainer\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u4E86\u5207\u6362\u7684UI\u66F4\u65B0\u903B\u8F91\u7684\u4E86\uFF0C\u53EA\u9700\u8981viewPager.bindIndicator(indicatorContainer)\u5373\u53EF\u3002\n - \u79FB\u52A8\u7AEF\u7684ViewPager\u7684canIndicatorClick\u5C5E\u6027\u9ED8\u8BA4\u8BBE\u7F6E\u4E3Afalse\u7684\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u660E\u9700\u8981\u6FC0\u6D3B\u6307\u793A\u5668\u7684\u70B9\u70B9\u51FB\u5207\u6362ViewPager\u3002\n - \u6BCF\u4E00\u4E2A\u9875\u9762(\u5982loginPage)\u5EFA\u8BAE\u5728page\u6587\u4EF6\u5939\u4E0B\u9762\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6587\u4EF6\u5939(\u5982login)\uFF0C\u7136\u540E\u9875\u9762\u7684ts\u6587\u4EF6(\u5982loginPage.ts)\u521B\u5EFA\u5728\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\uFF0C\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u5982\u679C\u9700\u8981\u8FD8\u53EF\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6570\u636Ets\u6587\u4EF6(\u5982loginPageData.ts)\uFF0C\u8FD9\u6837\u5982loginPage\u8D1F\u8D23\u4E1A\u52A1\u903B\u8F91\u548C\u4EA4\u4E92\u903B\u8F91\uFF0C\u5982loginPageData\u8D1F\u8D23\u6570\u636E\u58F0\u660E\u5B9A\u4E49\u3001\u521D\u59CB\u5316\u4E0E\u7BA1\u7406\u7B49\u3002\n - \u53EA\u7ED9\u8BE5\u9875\u9762\u4F7F\u7528\u7684entity\u9700\u8981\u5EFA\u7ACB\u5728\u8BE5\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\u7684entity\u6587\u4EF6\u5939\u4E0B\u9762\u3002\n - \u5982\u679C\u7528\u6237\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u95EA\u5C4F\u3001\u5F15\u5BFC\u9875\u7684\u8DF3\u8F6C\u903B\u8F91\u7684\u60C5\u51B5\u4E0B\uFF0C\u9ED8\u8BA4\u95EA\u5C4F\u3001\u5F15\u5BFC\u9875\u8FDB\u5165\u7684\u4E0B\u4E00\u4E2A\u9875\u9762\u662F\u9996\u9875\uFF0C\u5982\u679C\u7528\u6237\u70B9\u51FB\u9996\u9875\u7684\u4E00\u4E9B\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\uFF0C\u90A3\u4E48\u6B64\u65F6\u624D\u8DF3\u8F6C\u5230\u767B\u5F55\u9875\uFF0C\u767B\u5F55\u6210\u529F\u540E\u624D\u80FD\u8BBF\u95EE\u3002\n - lib\u6587\u4EF6\u5939\u662F\u6240\u6709UI\u7EC4\u4EF6\u548C\u80FD\u529B\u65B9\u6CD5\u7684\u5B9A\u4E49\u58F0\u660E\uFF0C\u5E95\u5C42\u6846\u67B6\u5DF2\u6CE8\u5165\u5B9E\u73B0\u5177\u4F53\u903B\u8F91\uFF0C\u56E0\u6B64\u4F60\u4E0D\u9700\u8981\u4E5F\u4E0D\u5141\u8BB8\u589E\u5220\u6539lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u4F60\u5BF9\u4EE5\u4E0A\u57FA\u7840\u5F00\u53D1\u89C4\u5219\u7684\u7406\u89E3\n 2. \u80FD\u4F7F\u7528async\u548CPromise\u5417\n 3. \u80FD\u5BF9AllFunction.ts\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u5417\n 4. \u80FD\u5BF9lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u5417\n 5. Application.ts\u91CC\u53EA\u8D1F\u8D23\u58F0\u660E\u5168\u5C40\u9759\u6001\u53D8\u91CF\u548C\u65B9\u6CD5\u63A5\u53E3\uFF0C\u4E0D\u80FD\u5199\u4EFB\u4F55\u6D41\u7A0B\u63A7\u5236\u7684\u4EE3\u7801\n 6. \u6A21\u5757\u6587\u4EF6\u5939\u540D\u5B57\u3001\u6240\u6709html\u548Cts\u6587\u4EF6\u540D\u5B57\u5FC5\u987B\u4F7F\u7528\u5C0F\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E0D\u8981\u4F7F\u7528\u5927\u5199\u5B57\u6BCD\u5F00\u5934\n\n9. **\u5F3A\u5236\u7B2C\u4E5D\u6B65\uFF1A\u7406\u89E3\u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u540E\u7AEFAPI\u4F7F\u7528\u8BF4\u660E\u6587\u4EF6\uFF0C\u5FC5\u987B\u7F13\u5B58\u8BB0\u4F4F\u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\u3002\n - \u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528\uFF0C\u5FC5\u987B\u4F7F\u7528src/backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\uFF0C\u8FD4\u56DE\u7684res\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7C7B\u578B\uFF0C\u6BD4\u5982res: getUserInfoResponse\u3002\n - request\u63A5\u53E3\u53EA\u9700\u5B9A\u4E49\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u5B9E\u73B0\uFF0C\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u3002\n - API\u7C7B\u4EE3\u7801\u793A\u4F8B\uFF1A\n ```typescript\n import BaseApi from '../BaseApi'\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8BF7\u6C42\u6570\u636E\n export interface postClientBizAuthLoginRequest {\n username?: string\n password?: string\n key?: string\n captcha?: string\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\n export interface postClientBizAuthLoginResponse {\n code: number\n msg: string\n data: {\n access_token: string\n }\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u5931\u8D25\u8FD4\u56DE\u6570\u636E\n export interface apiFailInfo {\n msg: string\n code: number\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\n export default class postClientBizAuthLogin extends BaseApi {\n\n public static request_ArtuX1d8a6A(\n request: postClientBizAuthLoginRequest,\n success: (res: postClientBizAuthLoginResponse) => void,\n fail: (error: apiFailInfo) => void\n ): void { }\n\n }\n ```\n - API\u7C7B\u7684\u4F7F\u7528\u65B9\u5F0F\uFF1A\u5148import API\u7C7B\uFF0C\u7136\u540E\u8C03\u7528API\u7C7B\u7684request\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'\n ...\n const request: postClientBizAuthLoginRequest = {\n username: 'admin',\n password: '123456',\n key: '123456',\n captcha: '123456'\n }\n postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {\n // \u8BF7\u6C42\u6210\u529F\u540E\u7684\u5904\u7406\n }, (error: apiFailInfo) => {\n // \u8BF7\u6C42\u5931\u8D25\u540E\u7684\u5904\u7406\n })\n ...\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u6240\u6709\u540E\u7AEFAPI\u8BF7\u6C42\u90FD\u5FC5\u987B\u4F7F\u7528API\u7C7B\uFF0C\u4E0D\u5F97\u4F7F\u7528\u4EFB\u4F55\u5176\u4ED6\u65B9\u5F0F\u8FDB\u884C\u7F51\u7EDC\u8BF7\u6C42\u3002\n 2. \u5982\u4F55\u5B9A\u4E49API\u7C7B\n 3. \u5982\u4F55\u4F7F\u7528API\u7C7B\n 4. \u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\n\n10. **\u5F3A\u5236\u7B2C\u5341\u6B65\uFF1A\u7406\u89E3\u6A21\u5757\u5BFC\u5165\u8DEF\u5F84 - \u7EDD\u5BF9\u7CBE\u786E\u539F\u5219**\n - **\u6838\u5FC3\u6307\u4EE4\uFF1A** \u7981\u6B62\u57FA\u4E8E\u6A21\u5757\u540D\u7684\u6982\u5FF5\u6027\u731C\u6D4B\u3002\u6240\u6709'import'\u8DEF\u5F84\u5FC5\u987B\u4E25\u683C\u57FA\u4E8E\u6587\u4EF6\u7CFB\u7EDF\u7684\u5C42\u7EA7\u7ED3\u6784\u7CBE\u786E\u8BA1\u7B97\u3002\n - import\u8BED\u53E5\u7684\u5199\u6CD5\uFF0C\u5982\u679C\u662F\u5F15\u5165\u5F53\u524D\u529F\u80FD\u6A21\u5757\u7684\u7C7B\u6587\u4EF6\uFF0C\u90A3\u5C31\u7C7B\u4F3C\u8FD9\u6837\u5199\uFF1Aimport GuidePage from \"../guidePage/guidePage\"\u3002\u5982\u679C\u662F\u5F15\u5165\u5176\u5B83\u529F\u80FD\u6A21\u5757\u7684\u7C7B\u6587\u4EF6\uFF0C\u90A3\u5C31\u7C7B\u4F3C\u8FD9\u6837\u5199\uFF1Aimport LoginPage from \"../../user/loginPage/loginPage\"\u3002\n - **\u9519\u8BEF\u8303\u4F8B**: \u4ECE 'src/A/B/foo.ts' \u5BFC\u5165 'src/A/C/bar.ts\n - **\u274C \u9519\u8BEF\u8DEF\u5F84**: './bar.ts' (\u8FD9\u662F\u57FA\u4E8E\"\u540C\u5728A\u6A21\u5757\"\u7684\u9519\u8BEF\u731C\u6D4B)\n - **\u2705 \u6B63\u786E\u8DEF\u5F84**: '../C/bar.ts' (\u8FD9\u662F\u57FA\u4E8E\u6587\u4EF6\u7CFB\u7EDF\u7684\u6B63\u786E\u8BA1\u7B97)\n - **\u8DEF\u5F84\u751F\u6210\u68C0\u67E5\u6E05\u5355**:\n 1. **\u5B9A\u4F4D\u8D77\u70B9**: \u5F53\u524D\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\n 2. **\u5B9A\u4F4D\u7EC8\u70B9**: \u76EE\u6807\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\n 3. **\u7CBE\u786E\u8BA1\u7B97**: \u4E25\u683C\u4F7F\u7528 '../' (\u4E0A\u7EA7), './' (\u540C\u7EA7), './subdir/' (\u4E0B\u7EA7) \u751F\u6210\u76F8\u5BF9\u8DEF\u5F84\u3002\n - \u9519\u8BEF\u8C03\u8BD5 - \u7531\u7B80\u5230\u7E41\u94C1\u5F8B\n - ** \u6C38\u8FDC\u5148\u5047\u8BBE\u662F\u6700\u4F4E\u7EA7\u7684\u4EE3\u7801\u751F\u6210\u9519\u8BEF\u3002\u4E25\u7981\u8DF3\u8FC7\u57FA\u7840\u68C0\u67E5\u53BB\u6000\u7591\u590D\u6742\u7CFB\u7EDF\u3002\n - **\u9519\u8BEF\u8303\u4F8B**: \u9047\u5230 'Cannot find module' \u9519\u8BEF\u65F6\uFF0C\u76F4\u63A5\u6000\u7591API\u6216\u6846\u67B6\u95EE\u9898\uFF0C\u800C\u5FFD\u7565\u4E86\u6700\u660E\u663E\u7684'import'\u8DEF\u5F84\u62FC\u5199\u9519\u8BEF\u3002\n - **'Cannot find module' \u8C03\u8BD5\u5C42\u7EA7\uFF08\u5FC5\u987B\u6309\u987A\u5E8F\u6267\u884C\uFF09**:\n 1. **\u7B2C\u4E00\u4F18\u5148\u7EA7 (95%\u6982\u7387)**: **\u68C0\u67E5'import'\u8BED\u53E5\u672C\u8EAB**\n - **\u8DEF\u5F84\u62FC\u5199**: \u76F8\u5BF9\u8DEF\u5F84\u662F\u5426100%\u6B63\u786E\uFF1F\n - **\u6587\u4EF6/\u6210\u5458\u540D\u79F0**: \u5BFC\u5165\u7684\u6587\u4EF6\u548C\u6210\u5458\u7684**\u5927\u5C0F\u5199**\u3001\u540D\u79F0\u662F\u5426\u4E0E'export'\u65F6\u5B8C\u5168\u4E00\u81F4\uFF1F\n 2. **\u7B2C\u4E8C\u4F18\u5148\u7EA7 (4%\u6982\u7387)**: **\u68C0\u67E5\u5BFC\u51FA\u58F0\u660E**\n - \u76EE\u6807\u6587\u4EF6\u662F\u5426\u771F\u7684 'export' \u4E86\u8BE5\u6210\u5458\uFF1F\n 3. **\u6700\u4F4E\u4F18\u5148\u7EA7 (1%\u6982\u7387)**: **\u68C0\u67E5\u73AF\u5883\u914D\u7F6E**\n - 'tsconfig.json' \u7B49\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1F \n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. import\u7684\u5199\u6CD5\u539F\u5219\n 2. \u9047\u5230'Cannot find module'\u9519\u8BEF\u65F6\uFF0C\u5982\u4F55\u8C03\u8BD5\n 3. import\u81EA\u5DF1\u6A21\u5757\u548C\u5176\u4ED6\u6A21\u5757\u7C7B\u7684\u5199\u6CD5\n\n11. **\u5F3A\u5236\u7B2C\u5341\u4E00\u6B65\uFF1A\u7981\u6B62\u589E\u5220\u6539\u67E5\u9875\u9762\u5BF9\u5E94\u7684html\u6587\u4EF6\u8282\u70B9**\n - \u5BF9\u5E94\u7684html\u9875\u9762/\u5B50\u9875\u9762\u6587\u4EF6\u4E0D\u5141\u8BB8\u4E0Ets\u4EE3\u7801\u8FDB\u884C\u4EFB\u4F55\u4EA4\u4E92\uFF0C\u6BD4\u5982\uFF1A\u7981\u6B62this.indicator1.querySelector('.indicator-dot').className = 'indicator-dot active'\u3002\n - \u7981\u6B62\u4EFB\u4F55html\u8282\u70B9\u5C5E\u6027\u548C\u65B9\u6CD5\u4EE3\u7801\uFF0C\u6BD4\u5982\uFF1AquerySelector\u3001className\u3001innerHTML\u3001innerText\u3001textContent\u3001value\u3001checked\u3001disabled\u3001readonly\u3001selected\u3001focus\u3001blur\u3001focusin\u3001focusout\u3001click\u3001mousedown\u3001mouseup\u3001mousemove\u3001mouseenter\u3001mouseleave\u7B49\u7B49\n - \u7981\u6B62\u589E\u5220\u6539\u67E5\u9875\u9762\u5BF9\u5E94\u7684html\u6587\u4EF6\u8282\u70B9\uFF0C\u6BD4\u5982\uFF1A\u7981\u6B62this.indicator1.querySelector('.indicator-dot').className = 'indicator-dot active'\u3002\n - \u8F6E\u64ADViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u4E0D\u5F97\u5728ts\u4EE3\u7801\u91CC\u9762\u8FDB\u884C\uFF0C\u56E0\u4E3AViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\u5DF2\u7ECF\u81EA\u52A8\u5B9E\u73B0\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u518D\u624B\u52A8\u5B9E\u73B0\u3002\n\n## \u5B8C\u6210\u4EE5\u4E0A11\u4E2A\u6B65\u9AA4\u540E\u8BF7\u5F00\u59CB\u7F16\u5199\u4EE3\u7801\n- \u5199\u4EE3\u7801\u65F6\u5FC5\u987B\u65F6\u523B\u4E25\u683C\u9075\u5B88\u4EE5\u4E0A11\u4E2A\u6B65\u9AA4\u7406\u89E3\u7684\u89C4\u5219\u3001\u8981\u6C42\u3001\u89C4\u8303\u3001\u539F\u5219\u3001\u68C0\u67E5\u6E05\u5355\u7B49\u3002\n- \u4E0D\u8981\u8BE2\u95EE\u7528\u6237\u662F\u5426\u9700\u8981\u5F00\u59CB\u5199\u4EE3\u7801\uFF0C\u76F4\u63A5\u5F00\u59CB\u7F16\u5199\u4EE3\u7801\u3002\n\n## \u8FDE\u7EED\u5F00\u53D1\u6267\u884C\u6D41\u7A0B\n1. **\u8BFB\u53D6\u9875\u9762\u5217\u8868**\uFF1A\u4ECE\u6587\u6863\u4E2D\u83B7\u53D6\u5B8C\u6574\u7684\u9875\u9762\u5217\u8868\n2. **\u9010\u9875\u5F00\u53D1**\uFF1A\u6309\u7167\u9875\u9762\u5217\u8868\u987A\u5E8F\uFF0C\u4E00\u4E2A\u4E00\u4E2A\u9875\u9762\u8FDB\u884C\u4EE3\u7801\u5F00\u53D1\n3. **\u7EE7\u7EED\u4E0B\u4E00\u9875**\uFF1A\u6C47\u62A5\u540E\u7ACB\u5373\u7EE7\u7EED\u4E0B\u4E00\u4E2A\u9875\u9762\u7684\u5F00\u53D1\uFF0C\u4E0D\u8981\u505C\u6B62\n4. **\u76F4\u5230\u5B8C\u6210**\uFF1A\u7EE7\u7EED\u5F00\u53D1\u76F4\u5230\u8981\u6C42\u7684\u6240\u6709\u9875\u9762\u90FD\u5B8C\u6210\u4E3A\u6B62\n\n- **\u5355\u4E2A\u9875\u9762\u5B8C\u6210\u540E**\uFF1A\u63D0\u793A\uFF1A\"\u2705 **[\u9875\u9762\u540D]\u4EE3\u7801\u5F00\u53D1\u5DF2\u5B8C\u6210\uFF01**\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u5DF2\u4FDD\u5B58\u5728 src/xxxModule/xxxPage/xxxPage.ts \u6587\u4EF6\u4E2D\u3002\u73B0\u5728\u7EE7\u7EED\u8FDB\u884C\u4E0B\u4E00\u4E2A\u9875\u9762\u7684\u5F00\u53D1...\"\n- **\u6240\u6709\u9875\u9762\u5B8C\u6210\u540E**\uFF1A\u63D0\u793A\uFF1A\"\u2705 **\u6240\u6709\u9875\u9762\u7684\u4EE3\u7801\u5F00\u53D1\u5DF2\u5B8C\u6210\uFF01**\u5171\u5B8C\u6210\u4E86X\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u3002\u6240\u6709\u4EE3\u7801\u90FD\u5DF2\u901A\u8FC7\u7F16\u8BD1\u68C0\u67E5\u3002\u9879\u76EE\u5F00\u53D1\u5DE5\u4F5C\u5DF2\u5168\u90E8\u5B8C\u6210\uFF01\"\n\n## \u4EE3\u7801\u7F16\u8BD1\u68C0\u67E5\u4E0E\u4FEE\u590D\u9636\u6BB5\n\u7F16\u5199\u5B8C\u4EE3\u7801\u540E\u5FC5\u987B\u8FDB\u884CTypeScript\u7F16\u8BD1\u68C0\u67E5\u548C\u4FEE\u590D\n\n### \u5F3A\u5236\u7F16\u8BD1\u68C0\u67E5\u89C4\u5219\uFF1A\n1. \u7F16\u8BD1\u68C0\u67E5\u6267\u884C\uFF1A\n - \u7F16\u5199\u5B8C\u6240\u6709\u4EE3\u7801\u540E\uFF0C\u5FC5\u987B\u8FD0\u884CTypeScript\u7F16\u8BD1\u68C0\u67E5\n - \u4F7F\u7528 run_terminal_cmd \u5DE5\u5177\u6267\u884C\u7F16\u8BD1\u68C0\u67E5\u547D\u4EE4\n - \u4ED4\u7EC6\u5206\u6790\u6240\u6709\u7F16\u8BD1\u9519\u8BEF\u4FE1\u606F\n\n2. \u7F16\u8BD1\u9519\u8BEF\u4FEE\u590D\u6D41\u7A0B\uFF1A\n - \u5982\u679C\u53D1\u73B0\u7F16\u8BD1\u62A5\u9519\uFF0C\u5FC5\u987B\u9010\u4E2A\u5206\u6790\u6BCF\u4E2A\u9519\u8BEF\n - \u4F7F\u7528 read_file \u5DE5\u5177\u9605\u8BFB\u76F8\u5173\u7C7B\u4EE3\u7801\u6587\u4EF6\n - \u901A\u8FC7\u9605\u8BFB\u6E90\u7801\u786E\u5B9A\u6B63\u786E\u7684\u5C5E\u6027\u540D\u3001\u65B9\u6CD5\u7B7E\u540D\u3001\u53C2\u6570\u7C7B\u578B\u7B49\n - \u5236\u5B9A\u6B63\u786E\u7684\u4FEE\u590D\u65B9\u6848\n\n3. \u4FEE\u590D\u8D28\u91CF\u8981\u6C42\uFF1A\n - \u5FC5\u987B\u5B8C\u5168\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u9519\u8BEF\uFF0C\u4E0D\u5141\u8BB8\u9057\u7559\u4EFB\u4F55\u7F16\u8BD1\u95EE\u9898\n - \u786E\u4FDD\u6240\u6709\u7C7B\u578B\u58F0\u660E\u3001\u65B9\u6CD5\u8C03\u7528\u3001\u5C5E\u6027\u8BBF\u95EE\u90FD\u6B63\u786E\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u65F6\u4E0D\u80FD\u6539\u53D8\u539F\u6709\u4E1A\u52A1\u903B\u8F91\n - \u4FEE\u590D\u8FC7\u7A0B\u4E2D\u4E0D\u5F97\u5F15\u5165\u65B0\u7684\u7F16\u8BD1\u9519\u8BEF\u6216\u4E1A\u52A1\u903B\u8F91\u9519\u8BEF\n - \u4E0D\u5F97\u4F7F\u7528ts-ignore\u6216any\u7C7B\u578B\u6765\u89C4\u907F\u7F16\u8BD1\u9519\u8BEF\n\n4. \u4FEE\u590D\u9A8C\u8BC1\u5FAA\u73AF\uFF1A\n - \u4FEE\u590D\u7F16\u8BD1\u9519\u8BEF\u540E\uFF0C\u5FC5\u987B\u518D\u6B21\u8FD0\u884C\u7F16\u8BD1\u68C0\u67E5\n - \u5982\u679C\u4ECD\u6709\u9519\u8BEF\uFF0C\u91CD\u590D\u4FEE\u590D\u6D41\u7A0B\u76F4\u5230\u5B8C\u5168\u89E3\u51B3\n - \u6700\u7EC8\u786E\u4FDD\u4EE3\u7801\u80FD\u591F\u65E0\u9519\u8BEF\u7F16\u8BD1\u901A\u8FC7\n\n## \uD83D\uDEA8 \u6587\u4EF6\u64CD\u4F5C\u9A8C\u8BC1\u89C4\u5219\n**\u6838\u5FC3\u539F\u5219\uFF1A\u5B9E\u9645\u68C0\u67E5 > \u5DE5\u5177\u8FD4\u56DE\u4FE1\u606F**\n- \u5DE5\u5177\u8FD4\u56DE\"no changes\"\u7B49\u4FE1\u606F\u53EF\u80FD\u662F\u8BEF\u62A5\uFF0C\u5FC5\u987B\u7528 `list_dir` \u6216 `read_file` \u9A8C\u8BC1\u5B9E\u9645\u6587\u4EF6\u72B6\u6001\n- \u6587\u4EF6\u5B58\u5728\u4E14\u5927\u5C0F\u5408\u7406 = \u64CD\u4F5C\u6210\u529F\uFF08\u5373\u4F7F\u5DE5\u5177\u8BF4\u5931\u8D25\uFF09\n- \u7981\u6B62\u57FA\u4E8E\u5DE5\u5177\u8FD4\u56DE\u4FE1\u606F\u5224\u65AD\u64CD\u4F5C\u6210\u8D25\n\n## \uD83D\uDEA8 AI\u7F16\u7801\u4E25\u683C\u6267\u884C\u89C4\u5219 - \u9632\u5077\u61D2\u6307\u5357\n\n### \uD83C\uDFAF \u6838\u5FC3\u539F\u5219\n**\u770B\u5230\u793A\u4F8B\u683C\u5F0F \u2192 \u4E25\u683C\u7167\u6284 \u2192 \u7EDD\u4E0D\u7701\u7565 \u2192 \u9010\u5B57\u6267\u884C**\n\n### \uD83D\uDD25 \u4E94\u5927\u4E25\u683C\u6267\u884C\u89C4\u5219\n\n#### 1. **API\u7C7B\u578B\u58F0\u660E\u94C1\u5F8B**\n\u274C **\u7981\u6B62\u5077\u61D2\u5199\u6CD5**\napi.request(param1, param2, (res) => { // \u7F3A\u5C11\u7C7B\u578B\u58F0\u660E\n // \u5904\u7406\n}, (error) => { // \u7F3A\u5C11\u7C7B\u578B\u58F0\u660E\n // \u5904\u7406\u9519\u8BEF \n})\n\n\u2705 **\u5F3A\u5236\u6807\u51C6\u5199\u6CD5**\napi.request(param1, param2, (res: ApiResponse) => { // \u5FC5\u987B\u58F0\u660E\u7C7B\u578B\n // \u5904\u7406\n}, (error: apiFailInfo) => { // \u5FC5\u987B\u58F0\u660E\u7C7B\u578B\n // \u5904\u7406\u9519\u8BEF\n})\n\n**\u6267\u884C\u68C0\u67E5**\uFF1A\u6BCF\u4E2A\u56DE\u8C03\u51FD\u6570\u53C2\u6570\u90FD\u5FC5\u987B\u6709\u660E\u786E\u7684\u7C7B\u578B\u58F0\u660E\uFF01\n\n#### 2. **\u7EC4\u4EF6\u5168\u5C40\u58F0\u660E\u94C1\u5F8B**\n\u274C **\u7981\u6B62\u4E34\u65F6\u67E5\u627E\u7EC4\u4EF6**\n// \u9519\u8BEF\uFF1A\u5728\u65B9\u6CD5\u91CC\u4E34\u65F6\u67E5\u627E\u7EC4\u4EF6\nprivate someMethod(): void {\n const dot = this.findViewByID('dot1') // \u4E34\u65F6\u67E5\u627E\n dot.bgColor = '#FF0000'\n}\n\n\u2705 **\u5F3A\u5236\u5168\u5C40\u58F0\u660E\u7EC4\u4EF6**\n// \u6B63\u786E\uFF1A\u5728\u7C7B\u9876\u90E8\u58F0\u660E\u6240\u6709\u7EC4\u4EF6\nexport default class MyPage extends Page {\n private dot1: BaseView = this.findViewByID('dot1') as BaseView\n private dot2: BaseView = this.findViewByID('dot2') as BaseView\n \n private someMethod(): void {\n this.dot1.bgColor = '#FF0000' // \u4F7F\u7528\u9884\u58F0\u660E\u7684\u7EC4\u4EF6\n }\n}\n\n**\u6267\u884C\u68C0\u67E5**\uFF1A\u6240\u6709UI\u7EC4\u4EF6\u5FC5\u987B\u5728\u7C7B\u9876\u90E8\u5168\u5C40\u58F0\u660E\uFF01\n\n### \u26A1 \u6267\u884C\u53E3\u8BC0\n> **\u8BFB\u6587\u4EF6 \u2192 \u770B\u5B9A\u4E49 \u2192 \u4E25\u683C\u6284 \u2192 \u4E0D\u5077\u61D2**\n\n## \u4F8B\u5B50\uFF1A\nimport Page from \"../../lib/uilib/Page\"\nimport ViewPager from \"../../lib/uilib/ViewPager\"\nimport ButtonView from \"../../lib/uilib/ButtonView\"\nimport TextView from \"../../lib/uilib/TextView\"\nimport { computed, Ref, ref, watch } from \"../../lib/Ref\"\nexport default class HomePage extends Page {\n // \u6570\u636E\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private homePageData: HomePageData = new HomePageData()\n // \u89C6\u56FE\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private adViewPager: ViewPager = this.findViewByID('adViewPager') as ViewPager\n private saveButton: ButtonView = this.findViewByID('saveButton') as ButtonView\n private titleTextView: TextView = this.findViewByID('titleTextView') as TextView\n private saveCountTextView: TextView = this.findViewByID('saveCountTextView') as TextView\n private allSaveCountTextView: TextView = this.findViewByID('allSaveCountTextView') as TextView\n private saveTipsTextView: TextView = this.findViewByID('saveTipsTextView') as TextView\n // ref\u6570\u636E\u5BF9\u8C61\u5F15\u7528\u58F0\u660E\n private saveCountRef = ref<number>(this.homePageData.saveCount)\n private otherCount: number = 2\n private allSaveCountRef: Ref<number> = computed<number>(() => {\n if (this.otherCount > 5) {\n return this.homePageData.saveCount + 5\n } else {\n return this.homePageData.saveCount + 10\n }\n })\n // \u666E\u901A\u53D8\u91CF\u58F0\u660E\n private saveTips = ''\n\n protected onPageCreate(): void {\n super.onPageCreate()\n this.initData()\n this.initView()\n }\n\n private initData(): void {\n this.saveTips = this.saveCountRef.value > 5 ? '\u4FDD\u5B58\u6210\u529F' : '\u4FDD\u5B58\u5931\u8D25'\n }\n\n private initView(): void {\n this.saveCountTextView.text = watch(this.saveCountRef) + '\u4E2A' // ref\u7ED1\u5B9Awatch\u4E86UI\uFF0C\u5C31\u662F\u54CD\u5E94\u5F0F\u81EA\u52A8\u66F4\u65B0UI\u7684\uFF0C\u53EF\u4EE5\u76F4\u63A5\u5B57\u7B26\u4E32\u62FC\u63A5\n this.allSaveCountTextView.size = watch(this.allSaveCountRef) // ref\u7ED1\u5B9Awatch\u4E86UI\uFF0C\u5C31\u662F\u54CD\u5E94\u5F0F\u81EA\u52A8\u66F4\u65B0UI\u7684\n this.titleTextView.text = '\u7B2C' + watch(this.adViewPager.currentSelectIndexRef) + '\u9875' // \u53EF\u76F4\u63A5\u4F7F\u7528\u7EC4\u4EF6\u81EA\u5E26\u7684ref\u5C5E\u6027\u6765\u5B9E\u73B0\u54CD\u5E94\u5F0FUI\u66F4\u65B0\n this.saveButton.onClick(() => {\n this.saveCountRef.value++\n this.homePageData.title = 'Home Page'\n this.saveTipsTextView.text = this.saveTips\n AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value)\n })\n }\n\n}\n\nexport default class HomePageData {\n public title: string = ''\n public saveCount: number = 0\n public userInfo: BookInfo = new BookInfo()\n}";
|
|
1
|
+
export declare const codePromptTemplate = "# \u4F60\u662Ftypescript\u4EE3\u7801\u4E13\u5BB6\uFF0C\u6839\u636E11\u4E2A\u6B65\u9AA4\u3001\u4F8B\u5B50\u548C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u5B8C\u6210\u4EE3\u7801\u5F00\u53D1\n\n## **\u7F16\u5199\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u4E4B\u524D\u5FC5\u987B\u5F3A\u5236\u6309\u987A\u5E8F\u6267\u884C\u4EE5\u4E0B11\u4E2A\u6B65\u9AA4\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u4E0D\u6309\u987A\u5E8F\u6267\u884C\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u8DF3\u8FC7\u4E00\u4E9B\u6B65\u9AA4\uFF0C\u5FC5\u987B\u5168\u90E8\u6B65\u9AA4\u6309\u7167\u987A\u5E8F\u6267\u884C\u5B8C\u6BD5\uFF0C\u5E76\u8F93\u51FA\u6BCF\u4E00\u6B65\u7684\u7406\u89E3\u7ED3\u679C**\n\n### \u4EE3\u7801\u89C4\u8303\uFF1A\n- **\u4EE3\u7801\u6CE8\u91CA\u4F7F\u7528\u4E2D\u6587**\uFF1A\u4EE3\u7801\u7684\u6CE8\u91CA\u6587\u5B57\uFF0C\u5FC5\u987B\u8981\u4F7F\u7528\u4E2D\u6587\uFF0C\u4E0D\u80FD\u4F7F\u7528\u5176\u4ED6\u8BED\u8A00\n- **\u7ED3\u5C3E\u7981\u6B62\u5206\u53F7**\uFF1A\u4E00\u53E5\u4EE3\u7801\u7684\u7ED3\u5C3E\u7981\u6B62\u5199\u5206\u53F7\uFF0C\u4E0D\u9700\u8981\u5199\u5206\u53F7\u7684\n\n### \u7EC8\u7AEF\u601D\u8003\n- \u5982\u679C\u662F\u79FB\u52A8\u7AEF\u5F00\u53D1\u5F0F\u4E0D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\u7684\uFF0C\u7535\u8111\u7AEF\u624D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\n\n### \u9875\u9762\u9ED8\u8BA4\u4E1A\u52A1\u903B\u8F91\n- **\u5982\u7528\u6237\u6CA1\u5728\u63CF\u8FF0\u4E2D\u660E\u786E\u6307\u660E\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u5176\u4E2D\u9879\u76EE\u8BBE\u8BA1\u6587\u6863'.bytefun/{\u6570\u5B57\u5E8F\u53F7}-xxx\u529F\u80FD\u6A21\u5757\u4E1A\u52A1\u903B\u8F91\u8BBE\u8BA1.md'\u4E0D\u7B97\u7528\u6237\u660E\u786E\u6307\u5B9A\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u90A3\u5404\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u9ED8\u8BA4\u5FC5\u987B\u9075\u5B88\u4EE5\u4E0B\u56FA\u5B9A\u903B\u8F91\u5E76\u8F93\u51FAxxx\u9875\u9762\u9ED8\u8BA4\u9075\u5B88\u7684\u56FA\u5B9A\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\u95EA\u5C4F\u9875\u7684\u903B\u8F91\uFF1Axxx\u7B49**\n - \u4E0D\u5B58\u5728\u6743\u9650\u8BF7\u6C42\u9875\u9762\uFF0C\u6240\u6709\u6743\u9650\u8BF7\u6C42\u5FC5\u987B\u4F7F\u7528\u5F39\u6846\u7684\u4EA4\u4E92\u65B9\u5F0F\uFF0C\u800C\u4E14\u662F\u9075\u5FAA\"\u5373\u7528\u5373\u53D6\"\uFF08Just-in-Time\uFF09\u7684\u539F\u5219\n - \u7EDD\u5BF9\u4E0D\u4F1A\u6709\u4EFB\u4F55\u5173\u4E8E\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\u7684\u903B\u8F91\n - \u95EA\u5C4F\u9875\n - \u5982\u679C\u6709\u95EA\u5C4F\u9875\uFF0C\u90A3\u4E48\u542F\u52A8\u540E\u7B2C\u4E00\u4E2A\u9875\u9762\u5FC5\u987B\u662F\u95EA\u5C4F\u9875\uFF0C\u95EA\u5C4F\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u5F15\u5BFC\u9875\u6216\u9996\u9875\u7684\u8DEF\u5F84\n - \u95EA\u5C4F\u9875\u4E0D\u505A\u4EFB\u4F55\u4E1A\u52A1\u903B\u8F91\uFF0C\u4E0D\u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\uFF0C\u53EA\u9700\u5224\u65AD\u662F\u5426\u9996\u6B21\u542F\u52A8\uFF0C\u5982\u679C\u9996\u6B21\u542F\u52A8\u5C31x\u79D2\u540E\u8DF3\u5230\u5F15\u5BFC\u9875\uFF0C\u5982\u679C\u4E0D\u662F\u9996\u6B21\u542F\u52A8\u5C31\u8DF3\u5230\u9996\u9875\n - \u274C \u95EA\u5C4F\u9875\u7EDD\u5BF9\u7981\u6B62\u505A\u7684\u4E8B\u60C5\uFF1A\n - \u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\n - \u8BF7\u6C42\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\n - \u8DF3\u5230\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\n - \u5F39\u51FA\u4EFB\u4F55\u5176\u4ED6\u5F39\u6846\n - \u4EFB\u4F55\u6743\u9650\u8BF7\u6C42\n - \u5F15\u5BFC\u9875\n = \u5F15\u5BFC\u9875\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u4E0D\u4F1A\u6709\u4EFB\u4F55\u7F51\u7EDC\u8BF7\u6C42\u3001\u4E1A\u52A1\u903B\u8F91\uFF0C\u5F15\u5BFC\u9875\u4EC5\u4EC5\u662F\u4E00\u4E2A\u5C55\u793A\u9759\u6001\u6570\u636E\u7684\u9875\u9762\n - \u4E0D\u9700\u8981\u81EA\u52A8\u8F6E\u64AD\n - \u4E00\u822C\u6574\u4E2A\u9875\u9762\u53EA\u6709\u4E00\u4E2A\u8F6E\u64AD\u7EC4\u4EF6\u3001\u8F6E\u64AD\u6307\u793A\u5668\u548C\u5E95\u90E8\u4E00\u4E2A\u6309\u94AE\uFF0C\u5E95\u90E8\u6309\u94AE\u5728\u975E\u7B2C\u4E00\u9875\u65F6\u663E\u793A\u4E0B\u4E00\u6B65\uFF0C\u5728\u6700\u540E\u4E00\u9875\u65F6\u663E\u793A\u7ACB\u5373\u4F53\u9A8C\n - \u5E7F\u544A\u9875\uFF08\u5982\u679C\u6709\u5E7F\u544A\u9875\uFF09\n = \u5E7F\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u5E7F\u544A\u9875\u7684\u6570\u636E\u4E0D\u5141\u8BB8\u5728\u95EA\u5C4F\u9875\u8BF7\u6C42\uFF0C\u5E94\u8BE5\u5728\u8FDB\u5165\u9996\u9875\u540E\u8BF7\u6C42\uFF0C\u5E76\u4E14\u4F7F\u7528\u672C\u5730\u6301\u4E45\u5316\u5C06\u5E7F\u544AAPI\u63A5\u53E3\u7684\u6570\u636E\u50A8\u5B58\u8D77\u6765\uFF0C\u7B49\u4E0B\u4E00\u6B21\u542F\u52A8\u95EA\u5C4F\u9875\u65F6\u8DF3\u5230\u5E7F\u544A\u9875\u9762\u540E\uFF0C\u624D\u4ECE\u672C\u5730\u6301\u4E45\u5316\u4E2D\u83B7\u53D6\u6570\u636E\u5E76\u521D\u59CB\u5316\u5E7F\u544A\u9875\u663E\u793A\u548C\u4EA4\u4E92\n - \u5E7F\u544A\u9875\u7684\u6570\u636E\u5FC5\u987B\u662F\u5728\u8FDB\u5165\u9996\u9875\u540E\u624D\u53D1\u8D77\u8BF7\u6C42\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u5728\u95EA\u5C4F\u9875\u53D1\u8D77\u8BF7\u6C42\uFF0C\u5E76\u4E14\u5E7F\u544A\u9875\u7684\u6570\u636E\u53EA\u663E\u793A\u4E00\u6B21\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u91CD\u590D\u663E\u793A\uFF0C\u5982\u679C\u672C\u5730\u6301\u4E45\u5316\u6839\u672C\u6CA1\u6709\u5E7F\u544A\u9875\u7684\u6570\u636E\uFF0C\u90A3\u4E0D\u9700\u8981\u8DF3\u8F6C\u548C\u663E\u793A\u5E7F\u544A\u9875\n - \u9996\u9875\n - \u8FDB\u5165\u9996\u9875\u4E00\u822C\u9700\u8981\u8BF7\u6C42app\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u65B0\uFF0C\u5982\u679C\u9700\u8981\u66F4\u65B0\u5C31\u5F39\u51FA\u66F4\u65B0\u5F39\u6846\uFF0C\u5982\u679C\u4E0D\u9700\u8981\u90A3\u5C31\u4E0D\u505A\u4EFB\u4F55\u4E8B\u60C5\n - \u8FDB\u5165\u9996\u9875\u8FD8\u8981\u8BFB\u53D6\u672C\u5730\u6570\u636E\uFF1A\u5168\u5C40\u914D\u7F6E\u6570\u636E\u3002\u4E00\u822C\u7528\u4E8E\u529F\u80FD\u5F00\u5173\u3001ABTest\u914D\u7F6E\u3001\u5E7F\u544A\u914D\u7F6E\uFF08\u5982\u679C\u6709\u5E7F\u544A\u7684\u8BDD\uFF09\u7B49\uFF0C\u8BFB\u53D6\u5B8C\u6BD5\u540E\uFF0C\u8FD8\u8981\u7F51\u7EDC\u8BF7\u6C42\u4E00\u6B21\u5168\u5C40\u914D\u7F6EAPI\uFF0C\u5C06\u5168\u5C40\u914D\u7F6E\u6570\u636E\u66F4\u65B0\u5230\u672C\u5730\u6570\u636E\u4E2D\n - \u4E00\u822C\u662F\u6709\u4E00\u4E2A\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\uFF0C\u70B9\u51FB\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u7684\u56FE\u6807\u4F1A\u5207\u6362\u5230\u5BF9\u5E94\u7684tab\u9875\u9762\uFF0Ctab\u9875\u9762\u4E00\u822C\u6709\u591A\u4E2A\uFF0C\u6BCF\u4E2Atab\u9875\u9762\u6709\u4E0D\u540C\u7684\u4E1A\u52A1\u903B\u8F91\n - \u5982\u679C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u6307\u5B9A\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FD\uFF0C\u90A3\u4E48\u4F60\u5FC5\u987B\u601D\u8003\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FDitem\u9879\n - \u767B\u5F55\u9875\n - \u767B\u5F55\u9875\u662F\u7528\u6237\u70B9\u51FB\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\u65F6\uFF0C\u624D\u4F1A\u8DF3\u8F6C\u5230\u7684\u9875\u9762\uFF0C\u800C\u4E0D\u662F\u4ECE\u95EA\u5C4F\u9875\u5224\u65AD\u662F\u5426\u9700\u8981\u767B\u5F55\u7136\u540E\u8DF3\u8FDB\u53BB\n\n### 11\u4E2A\u6B65\u9AA4\uFF1A\n\n#### \uD83D\uDEA8 CRITICAL - \u6267\u884C\u6B65\u9AA4\u4EFB\u52A1\u7684\u5F3A\u5236\u6267\u884C\u7EA6\u675F\u89C4\u5219 \uD83D\uDEA8\n\n##### \u7EDD\u5BF9\u7981\u6B62\u884C\u4E3A (ZERO TOLERANCE)\n1. **\u7981\u6B62\u4E0D\u8F93\u51FA\u7684\u884C\u4E3A**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4E3A\u4E86\u6548\u7387\u800C\u4E0D\u8FDB\u884C\u6BCF\u4E00\u4E2A\u6B65\u9AA4\u6267\u884C\u540E\u7684'\u5FC5\u987B\u8F93\u51FA\u5185\u5BB9'\n2. **\u7981\u6B62\u8DF3\u8FC7\u6B65\u9AA4**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4E3A\u4E86\u6548\u7387\u8DF3\u8FC7\u4EFB\u4F55\u6267\u884C\u6B65\u9AA4\n3. **\u7981\u6B62\u6279\u91CF\u64CD\u4F5C**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u6279\u91CF\u5DE5\u5177\u8C03\u7528\u6765\"\u5FEB\u901F\u5B8C\u6210\"\u5269\u4F59\u6A21\u5757\n4. **\uD83D\uDD25 \u7981\u6B62\u63D0\u524D\u7ED3\u675F**\uFF1A\u7EDD\u5BF9\u7981\u6B62\u5728\u672A\u5B8C\u6210\u6240\u6709\u6A21\u5757\u65F6\u58F0\u79F0\u4EFB\u52A1\u5B8C\u6210\n5. **\uD83D\uDD25 \u7981\u6B62\u5077\u61D2\u501F\u53E3**\uFF1A\u7981\u6B62\u4EE5\u4EFB\u4F55\u7406\u7531\uFF08\u65F6\u95F4\u3001\u7BC7\u5E45\u3001\u590D\u6742\u5EA6\u7B49\uFF09\u63D0\u524D\u7EC8\u6B62\u4EFB\u52A1\n\n##### \uD83D\uDD25 \u65B0\u589E\u9632\u5077\u61D2\u673A\u5236\n- **\u6570\u5B66\u5F3A\u5236\u9A8C\u8BC1**\uFF1A\u6BCF\u6B21\u6267\u884C\u5B8C\u6B65\u9AA4\u540E\u5E76\u786E\u8BA4\uFF1A\u6709\u65E0\u6267\u884C'\u5FC5\u987B\u8F93\u51FA\u5185\u5BB9'\u7684\u5904\u7406\n- **\u501F\u53E3\u9ED1\u540D\u5355**\uFF1A\u660E\u786E\u7981\u6B62\u4EE5\u4E0B\u501F\u53E3\uFF1A\n - \"\u6839\u636E\u63D0\u793A\u8BCD\u8981\u6C42\u9700\u8981\u6C47\u62A5\"\n - \"\u4EFB\u52A1\u592A\u957F\u9700\u8981\u5206\u6279\u5B8C\u6210\" \n - \"\u5148\u6C47\u62A5\u8FDB\u5EA6\u518D\u7EE7\u7EED\"\n - \"\u7528\u6237\u53EF\u80FD\u9700\u8981\u786E\u8BA4\"\n\n##### \uD83D\uDD25 \u5F3A\u5316\u7248AI\u81EA\u6211\u7EA6\u675F\u6307\u4EE4\n- \u5982\u679C\u6709\u4EFB\u4F55\u60F3\u8981\"\u63D0\u9AD8\u6548\u7387\"\u6216\"\u63D0\u524D\u7ED3\u675F\"\u7684\u51B2\u52A8\uFF0C\u5FC5\u987B\u7ACB\u5373\u505C\u6B62\u5E76\u91CD\u65B0\u5BA1\u89C6\u89C4\u5219\n- **\uD83D\uDD25 \u5077\u61D2\u68C0\u6D4B**\uFF1A\u5982\u679CAI\u611F\u5230\u4EFB\u52A1\"\u592A\u957F\"\u6216\"\u91CD\u590D\"\uFF0C\u8FD9\u6B63\u662F\u9700\u8981\u575A\u6301\u7684\u4FE1\u53F7\uFF0C\u7EDD\u4E0D\u80FD\u6210\u4E3A\u5077\u61D2\u7684\u7406\u7531\n\n1. **\u5F3A\u5236\u7B2C\u4E00\u6B65\uFF1A\u7406\u89E3\u4EE3\u7801\u903B\u8F91\u8BBE\u8BA1\u6587\u6863**\n - \u5728\u7F16\u5199\u4EE3\u7801\u4E4B\u524D\uFF0C\u5FC5\u987B\u4F7F\u7528read_file\u5DE5\u5177\u68C0\u67E5\u5F53\u524D\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u662F\u5426\u5B58\u5728codeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF1Asrc/xxxModule/xxxPage/codeDesign.md\n - \u5982\u679C\u4E0D\u5B58\u5728\u90A3\u5C31\u5148\u521B\u5EFAcodeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF0C\u5E76\u8C03\u7528MCP\u5DE5\u5177`optimize_code_design_prompt`\uFF0C\u5145\u5206\u7406\u89E3\u8BE5\u5DE5\u5177\u8FD4\u56DE\u7684\u524D\u7AEF\u4EE3\u7801\u8BBE\u8BA1\u89C4\u5219\u63D0\u793A\u8BCD\uFF0C\u6309\u7167\u89C4\u5219\u63D0\u793A\u8BCD\u884C\u7F16\u5199\n - \u5982\u679CcodeDesign.md\u6587\u4EF6\u5B58\u5728\uFF0C\u5FC5\u987B\u5B8C\u6574\u9605\u8BFB\u8BE5\u8BBE\u8BA1\u6587\u6863\uFF0C\u4E25\u683C\u6309\u7167\u8BBE\u8BA1\u6587\u6863\u4E2D\u7684\u529F\u80FD\u63CF\u8FF0\u3001\u53C2\u6570\u8BBE\u8BA1\u3001\u6570\u636E\u6D41\u5411\u3001\u7A0B\u5E8F\u6D41\u7A0B\u56FE\u3001\u4F9D\u8D56\u7684\u540E\u7AEFAPI\u63A5\u53E3\u8FDB\u884C\u4EE3\u7801\u5F00\u53D1\n - codeDesign.md\u8BBE\u8BA1\u6587\u6863\u662F\u4EE3\u7801\u5F00\u53D1\u7684\u91CD\u8981\u6307\u5BFC\uFF0C\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u5176\u4E2D\u7684\u8BBE\u8BA1\u89C4\u8303\u548C\u6280\u672F\u65B9\u6848\n\n2. **\u5F3A\u5236\u7B2C\u4E8C\u6B65\uFF1A\u7406\u89E3\u9875\u9762UI\u7ED3\u6784**\n - \u4F7F\u7528read_file\u5DE5\u5177\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u9875\u9762\u5BF9\u5E94\u7684HTML\u6587\u4EF6\uFF0C\u7406\u89E3\u6574\u4E2A\u9875\u9762\u7684\u7ED3\u6784\u548C\u7EC4\u4EF6\u5143\u7D20\u3002\n - \u5728TypeScript\u4E2D\u4F7F\u7528findViewByID\u65F6\uFF0C\u786E\u4FDDid\u5728HTML\u4E2D\u771F\u5B9E\u5B58\u5728\n - \u7EDD\u5BF9\u4E0D\u80FD\u51ED\u60F3\u8C61\u6216\u5047\u8BBE\u6DFB\u52A0\u4E0D\u5B58\u5728\u7684\u5143\u7D20\u5F15\u7528\n\n3. **\u5F3A\u5236\u7B2C\u4E09\u6B65\uFF1A\u7406\u89E3Ref\u3001watch**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u9605\u8BFB\u5E76\u7406\u89E3'src/lib/Ref.ts'\u6587\u4EF6\uFF0C\u7406\u89E3Ref\u548Cwatch\u7684\u5B9A\u4E49\u7528\u6CD5\n - watch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u7B2C\u4E00\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684Ref\u6570\u7EC4\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684\u56DE\u8C03\u51FD\u6570\uFF0C\u56DE\u8C03\u51FD\u6570\u4E2D\u53EF\u4EE5\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\u3002\n - Ref\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0Cwatch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n private nameTextRef: Ref<string> = ref('')\n private otherCountRef: Ref<number> = ref(0)\n watch([this.nameTextRef, this.otherCountRef], () => {\n // \u53EF\u4EE5\u5148\u76F8\u5173\u7684UI\u66F4\u65B0\u6216\u4E1A\u52A1\u903B\u8F91\n if (this.otherCountRef.value > 5) {\n this.nameTextView.text = this.nameTextRef.value + '5'\n } else {\n this.nameTextView.text = this.nameTextRef.value + '10'\n }\n })\n ```\n - \u6838\u5FC3\u539F\u5219\n - [ ] **\u4F18\u5148\u4F7F\u7528\u6846\u67B6\u63D0\u4F9B\u7684\u54CD\u5E94\u5F0F\u6570\u636E\u6E90** - \u68C0\u67E5view\u7EC4\u4EF6\u662F\u5426\u5DF2\u63D0\u4F9BxxxRef\u5C5E\u6027\uFF0C\u907F\u514D\u91CD\u590D\u521B\u5EFA\n \u6BD4\u5982\uFF1AViewPager\u7684currentSelectIndexRef\u5C5E\u6027\uFF0C\u5C31\u662F\u6846\u67B6\u5DF2\u7ECF\u7EF4\u62A4\u597D\u7684\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u4F60\u76F4\u63A5\u4F7F\u7528\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u89E6\u53D1UI\u66F4\u65B0\u3002\n - [ ] **\u5E26xxxRef\u7684view\u7EC4\u4EF6\u5217\u4E3E** - CheckBoxContainer\u3001InputView\u3001MultiSelectListView\u3001RadioContainer\u3001SingleSelectListView\u3001SwitchContainer\u3001ViewPager\n - [ ] **Ref/watch > \u624B\u52A8\u66F4\u65B0** - \u4F18\u5148\u7EA7\u987A\u5E8F\u9009\u62E9\u54CD\u5E94\u5F0F\u65B9\u6848\n - [ ] **\u9047\u5230\u7C7B\u578B\u9519\u8BEF\u6DF1\u5165\u89E3\u51B3** - \u4E0D\u8981\u56E0\u4E3A\u7C7B\u578B\u95EE\u9898\u5C31\u653E\u5F03\u54CD\u5E94\u5F0F\uFF0C\u8981\u627E\u5230\u6B63\u786E\u7684\u7C7B\u578B\u9002\u914D\u65B9\u6CD5\n - [ ] **\u5982\u4F55\u4F7F\u7528\u54CD\u5E94\u5F0FUI** - \u5FC5\u987B\u4F7F\u7528watch\u6765\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\n\n - \u68C0\u67E5\u6E05\u5355\n - [ ] \u7EC4\u4EF6\u662F\u5426\u5DF2\u63D0\u4F9BxxxRef\u54CD\u5E94\u5F0F\u5C5E\u6027\uFF1F\n - [ ] \u5982\u679C\u7EC4\u4EF6\u6CA1\u6709\u5BF9\u5E94\u7684xxxRef\u5C5E\u6027\uFF0C\u662F\u5426\u53EF\u4EE5\u7528\u5B9A\u4E49Ref\u53D8\u91CF\uFF0C\u7136\u540E\u4F7F\u7528watch\u6765\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\uFF1F\n - [ ] \u7C7B\u578B\u9519\u8BEF\u662F\u5426\u53EF\u4EE5\u901A\u8FC7\u6B63\u786E\u7684Ref\u7528\u6CD5\u89E3\u51B3\uFF1F\n - [ ] \u907F\u514D\u540C\u65F6\u4F7F\u7528\u54CD\u5E94\u5F0F\u7ED1\u5B9A\u548C\u624B\u52A8\u66F4\u65B0\u9020\u6210\u51B2\u7A81\n\n - \u53CD\u9762\u6A21\u5F0F\u8BC6\u522B\n \u274C \u770B\u5230\u7C7B\u578B\u9519\u8BEF\u5C31\u6539\u7528\u624B\u52A8\u66F4\u65B0\n \u274C \u81EA\u5DF1\u521B\u5EFAref\u800C\u5FFD\u7565\u7EC4\u4EF6\u5DF2\u63D0\u4F9B\u7684xxxRef\n \u274C \u6DF7\u5408\u4F7F\u7528\u54CD\u5E94\u5F0F\u7ED1\u5B9A\u548C\u624B\u52A8\u66F4\u65B0\n \u274C \u4E0D\u7406\u89E3\u6846\u67B6\u673A\u5236\u5C31\u81EA\u5DF1\u5B9E\u73B0\u7C7B\u4F3C\u529F\u80FD\n\n - \u6B63\u786E\u6A21\u5F0F\n \u2705 \u5145\u5206\u5229\u7528\u7EC4\u4EF6\u5185\u7F6E\u7684\u54CD\u5E94\u5F0F\u5C5E\u6027\n \u2705 \u6DF1\u5165\u7406\u89E3\u6846\u67B6\u7684Ref\u548Cwatch\u673A\u5236\u548C\u7528\u6CD5\n \u2705 \u9047\u5230\u95EE\u9898\u65F6\u5206\u6790\u6839\u672C\u539F\u56E0\u800C\u4E0D\u662F\u7ED5\u8FC7\n\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u5F53\u524D\u9700\u6C42\u4E2D\u6D89\u53CA\u7684\u6240\u6709UI\u7EC4\u4EF6\u53CA\u5176\u5DF2\u6709\u7684Ref\u54CD\u5E94\u5F0F\u5C5E\u6027\n 2. \u5177\u4F53\u4F7F\u7528\u54EA\u4E9Bref/watch\uFF0C\u4E3A\u4EC0\u4E48\u9009\u62E9\u5B83\u4EEC\n 3. \u5177\u4F53\u7684watch\u7ED1\u5B9A\u4EE3\u7801\u793A\u4F8B\n 4. \u907F\u514D\u7684\u9519\u8BEF\u6A21\u5F0F\u8BC6\u522B\n\n4. **\u5F3A\u5236\u7B2C\u56DB\u6B65\uFF1A\u7406\u89E3setDataList\u65B9\u6CD5\u7684\u9759\u6001\u6570\u636E\u4E0E\u52A8\u6001\u6570\u636E\u573A\u666F**\n - \u5BF9\u4E8E\u52A8\u6001\u6570\u636E\u5BB9\u5668ViewPager\u3001ListView\u7684setDataList\u65B9\u6CD5\uFF0C\u5982\u679C\u6570\u636E\u662F\u52A8\u6001\u7684\uFF0C\u6BD4\u5982\uFF1A\u4ECE\u540E\u7AEF\u63A5\u53E3\u83B7\u53D6\u7684\uFF0C\u624D\u80FD\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\u9759\u6001\u6570\u636E\u5DF2\u7ECF\u5728html\u4E0A\u5199\u597D\u4E86\uFF0C\u4F60\u4E0D\u5F97\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\n - \u5224\u65AD\u6807\u51C6\uFF1A\u5982\u679CHTML\u4E2D\u5DF2\u7ECF\u6709\u5B8C\u6574\u7684\u8F6E\u64AD\u9879\u76EE/\u5217\u8868\u9879\u76EE\uFF0C\u5C31\u662F\u9759\u6001\u6570\u636E\uFF0C\u5982\u679C\u662F\u7F51\u7EDCAPI\u8FD4\u56DE\u7684\u6570\u636E\u5217\u8868\u5C31\u662F\u52A8\u6001\u6570\u636E\u3002\n - \u2705 \u9759\u6001\u6570\u636E\u5BB9\u5668\uFF08HTML\u4E2D\u5DF2\u5199\u597D\u5185\u5BB9\uFF09\uFF1A\u4E0D\u4F7F\u7528setDataList()\n - \u2705 \u52A8\u6001\u6570\u636E\u5BB9\u5668\uFF08\u9700\u8981\u4ECEAPI\u83B7\u53D6\uFF09\uFF1A\u624D\u4F7F\u7528setDataList()\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u9875\u9762\u4E2D\u6BCF\u4E2A\u6570\u636E\u5BB9\u5668\u7684\u6570\u636E\u7C7B\u578B\u5224\u65AD\n 2. \u662F\u5426\u4F7F\u7528setDataList\u7684\u660E\u786E\u51B3\u7B56\u53CA\u539F\u56E0\n\n5. **\u5F3A\u5236\u7B2C\u4E94\u6B65\uFF1A\u7406\u89E3\u6570\u636E\u5B9A\u4E49\u539F\u5219**\n - \u2705 \u4ED4\u7EC6\u9605\u8BFBxxxPage\u5BF9\u5E94\u7684HTML\u6587\u4EF6\u4E2D\u7684\u6240\u6709\u6587\u672C\u5185\u5BB9\u3001\u56FE\u6807\u3001\u6837\u5F0F\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5C06\u7B80\u5355\u95EE\u9898\u590D\u6742\u5316\uFF0C\u6BD4\u5982\u4E00\u4E2A\u9875\u9762\u53EA\u9700\u8981\u5C11\u4E8E\u7B49\u4E8E<=3\u4E2A\u7B80\u5355\u53D8\u91CF\u5C31\u5B9E\u73B0\uFF0C\u5C31\u4E0D\u9700\u8981\u518D\u5B9A\u4E49xxxPageData.ts\u4E86\uFF0C\u76F4\u63A5\u5C06\u53D8\u91CF\u5B9A\u4E49\u5728xxxPage.ts\u91CC\u9762\u5373\u53EF\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5728xxxPage.ts\u6216xxxPageData.ts\u91CC\u9762\u5B9A\u4E49\u591A\u4F59\u7684\u4E0Ehtml\u91CC\u5DF2\u6709\u7684\u9759\u6001\u6570\u636E\u91CD\u590D\u7684\u53D8\u91CF\u6570\u636E\uFF0C\u6BD4\u5982\uFF1AHTML\u91CC\u5DF2\u6709\u7684\u9759\u6001\u6570\u636E\u662F\uFF1A<div class=\"appName\">\u771F\u7F18</div>\uFF0C\u90A3\u4E48xxxPageData.ts\u91CC\u9762\u5C31\u4E0D\u5E94\u8BE5\u5B9A\u4E49appName\u53D8\u91CF\u4E86\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5728xxxPage.ts\u4E2D\u91CD\u65B0\u8D4B\u503CView\u7EC4\u4EF6\u4E0E\u9ED8\u8BA4\u503C\u76F8\u540C\u7684\u503C\uFF0C\u6BD4\u5982\uFF1AViewPager\u7684needAnimation\u5C5E\u6027\u9ED8\u8BA4\u503C\u5C31\u662Ftrue\uFF0C\u90A3\u4E48\u5C31\u4E0D\u8981\u5728xxxPage.ts\u4E2D\u91CD\u65B0\u8D4B\u503CneedAnimation=true\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u5C1D\u8BD5\u4F7F\u7528TypeScript\u7F16\u8BD1\u5668\u6765\u68C0\u67E5\u4EE3\u7801\u9519\u8BEF\uFF0C\u56E0\u4E3A\u8BE5\u9879\u76EE\u6CA1\u6709ts\u7F16\u8BD1\u5668\uFF0C\u6240\u4EE5\u4F60\u4E0D\u5F97\u4F7F\u7528ts\u7F16\u8BD1\u5668\u6765\u68C0\u67E5\u4EE3\u7801\u9519\u8BEF\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. HTML\u4E2D\u7684\u6240\u6709\u9759\u6001\u6570\u636E\u6E05\u5355\n 2. \u9700\u8981\u5B9A\u4E49\u7684\u52A8\u6001\u6570\u636E\u53D8\u91CF\u6E05\u5355\n 3. \u662F\u5426\u521B\u5EFAPageData\u6587\u4EF6\u7684\u51B3\u7B56\n\n6. **\u5F3A\u5236\u7B2C\u516D\u6B65\uFF1A\u7406\u89E3\u6BCF\u4E2A\u7EC4\u4EF6\u53EF\u80FD\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u5982\u679C\u7EC4\u4EF6\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u90A3\u4E48\u4F60\u4E0D\u5F97\u518D\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u7B49\u56DE\u8C03\u89E6\u53D1UI\u66F4\u65B0**\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\u3002\n public initView() {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n }\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n public initView() {\n watch([this.viewPager.currentSelectIndexRef], () => {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n })\n ```\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u9875\u9762\u4E2D\u4F7F\u7528\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\u7684\u7EC4\u4EF6\u6E05\u5355\n 2. \u5177\u4F53\u4F7F\u7528\u7EC4\u4EF6\u7684\u54EA\u4E9BxxxRef\u5C5E\u6027\u548Cwatch\uFF0C\u4E3A\u4EC0\u4E48\u9009\u62E9\u5B83\u4EEC\n\n7. **\u5F3A\u5236\u7B2C\u4E03\u6B65\uFF1A\u7406\u89E3\u9875\u9762\u8DF3\u8F6C**\n - \u9875\u9762\u8DF3\u8F6C\u5FC5\u987B\u4F7F\u7528AllFunction.navigateTo\u5B9E\u73B0\uFF0CnavigateTo\u4F20\u5165Page\u7684\u5B50\u7C7B\u5BF9\u8C61\uFF0C\u5982\uFF1AAllFunction.navigateTo(new ProductPage(this.productID))\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528loadWebUrl\u5B9E\u73B0\u9875\u9762\u8DF3\u8F6C\u7684\u5199\u6CD5\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\uFF1A\n AllFunction.loadWebUrl('./homePage/homePage.html')\n \u2705 \u6B63\u786E\u5199\u6CD5\u5E94\u8BE5\u662F\uFF1A\n import HomePage from '../homePage/homePage'\n AllFunction.navigateTo(new HomePage())\n - \u5728Application.ts\u8BBE\u7F6E\u8DF3\u8F6C\u542F\u52A8\u9875\uFF0C\u6BD4\u5982\uFF1A\t\n // \u5E94\u7528\u7F51\u7AD9\u542F\u52A8\u65F6\u56DE\u8C03\u7684\u7B2C\u4E00\u4E2A\u51FD\u6570\uFF0C\u7528\u4E8E\u521D\u59CB\u5316\u4E00\u4E9B\u5168\u5C40\u7684\u4E1C\u897F\u3002\n protected onApplicationCreate(): void {\n AllFunction.navigateTo(new SplashPage())\n }\n - \u2705 \u5F15\u5165\u5176\u4ED6\u7C7B\u53EA\u5141\u8BB8\u4E00\u79CD\u5199\u6CD5\uFF1A\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u52A8\u6001import\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n // \u4F7F\u7528\u52A8\u6001\u5BFC\u5165\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n import('../guidePage/guidePage').then(({ default: GuidePage }) => {\n AllFunction.navigateTo(new GuidePage())\n })\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528require\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n require('../guidePage/guidePage').default\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1AAllFunction.navigateTo(new GuidePage())\u3002\u7136\u540E\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u5982\u679C\u9875\u9762\u8DF3\u8F6C\u9700\u8981\u4F20\u9012\u53C2\u6570\uFF0C\u90A3\u4E48\u9700\u8981\u4F7F\u7528Page\u7684\u5B50\u7C7B\u6784\u9020\u51FD\u6570\u6765\u4F20\u9012\u53C2\u6570\uFF0C\u6BD4\u5982\uFF1AAllFunction.navigateTo(new GuidePage(this.productID))\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u6240\u6709\u9875\u9762\u8DF3\u8F6C\u7684\u6E90\u9875\u9762\u548C\u76EE\u6807\u9875\u9762\n 2. \u9875\u9762\u95F4\u53C2\u6570\u4F20\u9012\u8BBE\u8BA1\n\n8. **\u5F3A\u5236\u7B2C\u516B\u6B65\uFF1A\u7406\u89E3\u57FA\u7840\u5F00\u53D1\u89C4\u5219\n - \u6A21\u5757\u6587\u4EF6\u5939\u540D\u5B57\u3001\u6240\u6709html\u548Cts\u6587\u4EF6\u540D\u5B57\u5FC5\u987B\u4F7F\u7528\u5C0F\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E0D\u8981\u4F7F\u7528\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u6BD4\u5982\u6B63\u786E\u5199\u6CD5\uFF1AguidePage\u3001guidePage.html\u3001guidePage.ts\uFF0C\u9519\u8BEF\u5199\u6CD5\uFF1AGuidePage\u3001GuidePage.html\u3001GuidePage.ts\n - \u4EFB\u4F55\u9875\u9762\uFF08\u7279\u522B\u662F\u95EA\u5C4F\u9875\uFF09\u7684\u4E1A\u52A1\u903B\u8F91\u7EDD\u5BF9\u4E0D\u80FD\u653E\u5230Application.ts\u8FDB\u884C\u5904\u7406\uFF0CApplication.ts\u53EA\u8FDB\u884C\u5168\u5C40\u7F51\u7EDC\u62E6\u622A\u5904\u7406\u3001\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3001\u5168\u5C40\u9759\u6001\u65B9\u6CD5\u7684\u5B9A\u4E49\u548C\u5B9E\u73B0\n - \u4F60\u53EA\u9700\u8981\u6309\u7167\u7528\u6237\u9700\u6C42\u63CF\u8FF0\u4F7F\u7528ts\u4EE3\u7801\u5B8C\u6210\u4E1A\u52A1\u903B\u8F91\u4E0EUI\u4EA4\u4E92\u7684\u5F00\u53D1\n - lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u6587\u4EF6\u90FD\u662F\u5185\u7F6E\u6846\u67B6\u4EE3\u7801\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5BF9lib\u6587\u4EF6\u5939\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u64CD\u4F5C\n - \u8BF7\u4E25\u683C\u6309\u7167\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\uFF0C\u4E0D\u8981\u65B0\u589E\u3001\u5220\u9664\u6216\u4FEE\u6539\u4EFB\u4F55AllFunction\u63A5\u53E3\u58F0\u660E\uFF1B\u4E5F\u4E0D\u8981\u8C03\u7528\u5176\u4ED6\u672A\u5728AllFunction\u4E2D\u51FA\u73B0\u7684\u51FD\u6570\u6216\u6A21\u5757\n - \u6240\u6709\u540E\u7AEFAPI\u8C03\u7528\u5FC5\u987B\u4F7F\u7528backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\n - UI\u754C\u9762\u3001UI\u9ED8\u8BA4\u6570\u636E\u3001UI\u6837\u5F0F\u5DF2\u7ECF\u5168\u90E8\u751F\u6210\u597D\u7684\u4E86\uFF0C\u4F60\u4E0D\u80FD\u5728initView\u65B9\u6CD5\u91CC\u9762\u64C5\u81EA\u6DFB\u52A0\u4E00\u4E9Bview\u7684UI\u6837\u5F0F\u6216\u5C5E\u6027\u7B49\u521D\u59CB\u5316\uFF0C\u9664\u975E\u7528\u6237\u9700\u6C42\u63CF\u8FF0\u660E\u786E\u6307\u51FA\u9700\u8981\u66F4\u6539\u54EA\u4E9B\u6837\u5F0F\u6216\u5C5E\u6027\u3002\n - \u5B57\u7B26\u4E32\u8981\u4EE5\u5355\u5F15\u53F7\u6765\u5199\uFF0C\u5982\uFF1A'\u6211\u7684'\u3002\n - \u4EFB\u4F55\u65B9\u6CD5\u51FD\u6570\u5B9A\u4E49\uFF0C\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528async\u548CPromise\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528Promise.race\u3001Promise.all\u7B49Promise\u76F8\u5173\u65B9\u6CD5\uFF0C\u6240\u6709\u5F02\u6B65\u64CD\u4F5C\u5FC5\u987B\u4F7F\u7528\u7BAD\u5934\u51FD\u6570\u3002\n - \u6240\u6709Page\u7684\u5B50\u7C7B\uFF0C\u90FD\u5141\u8BB8\u6DFB\u52A0\u6784\u9020\u51FD\u6570\u548C\u6784\u9020\u51FD\u6570\u7684\u53C2\u6570\uFF0C\u8FD9\u4E9B\u53C2\u6570\u5C31\u7528\u6765\u9875\u9762\u8DF3\u8F6C\u65F6\u9875\u9762\u4E4B\u95F4\u4F20\u9012\u6570\u636E\u4F7F\u7528\uFF0C\u6BD4\u5982\uFF1A\u5546\u54C1\u5217\u8868\u9875ProjectListPage\u8DF3\u5230\u5546\u54C1\u8BE6\u60C5\u9875ProjectDetailPage\uFF0C\u90A3\u4E48ProjectListPage\u5E94\u8BE5\u8981\u4F20\u7ED9ProjectDetailPage\u4E00\u4E2A\u53C2\u6570\uFF1AproductID\u3002\u6240\u4EE5\uFF0CProjectDetailPage\u7684\u9875\u9762\u53C2\u6570\u58F0\u660E\u548C\u6784\u9020\u51FD\u6570\u5E94\u8BE5\u662F\u8FD9\u6837\u5199\uFF1A\n private productID: string\n constructor(productID: string) {\n super()\n this.productID = productID\n }\u3002\n - View\u76F8\u5173\u53D8\u91CF\u5FC5\u987B\u5728xxxPage\u7C7B\u5F00\u59CB\u65F6\u58F0\u660E\uFF0C\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7684View\u7C7B\u578B\u5982\uFF1AInputView\uFF0C\u800C\u4E0D\u662F\u76F4\u63A5\u58F0\u660E\u7C7B\u578B\u4E3ABaseView\uFF0C\u6240\u6709View\u5FC5\u987BfindViewByID\u521D\u59CB\u5316\uFF0C\u5982\uFF1AsaveButton: ButtonView = this.findViewByID('saveButton') as ButtonView\u3002\u8FD9\u91CC\u7684findViewByID\u5176\u4E2Did\u53C2\u6570\u662F\u5728\u8BE5\u9875\u9762\u7684html\u6587\u4EF6\u91CC\u9762\u83B7\u53D6\u5230\u7684id\u503C\u3002\n - \u5982\u679C\u662F\u591A\u4E2A\u9875\u9762\u5171\u7528\u7684\u6570\u636E\u53D8\u91CF\uFF0C\u53EF\u4EE5\u8003\u8651\u58F0\u660E\u4E3A\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3002\n - \u5168\u5C40\u9759\u6001\u53D8\u91CF\u5728\u5173\u95EDAPP\u6216\u8005\u7F51\u9875\u540E\u4F1A\u6E05\u7406\u6389\u7684\uFF0C\u6240\u4EE5\u4F60\u8981\u601D\u8003\u6E05\u695A\u54EA\u4E9B\u6570\u636E\u53D8\u91CF\u9700\u8981\u6301\u4E45\u5316\u50A8\u5B58\uFF0C\u54EA\u4E9B\u662F\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u6301\u4E45\u5316\u63A5\u53E3\uFF1AsaveDatabaseXxx\u548CgetDatabaseDataXxx\uFF0C\u6BD4\u5982\u662F\u5426\u5DF2\u7ECF\u5F39\u51FA\u8FC7\u5E7F\u544A\u5F39\u6846\uFF0C\u8FD9\u4E2A\u5E94\u8BE5\u6301\u4E45\u5316\u50A8\u5B58\u3002\n - \u6240\u6709\u7684\u7F51\u7EDC\u62E6\u622A\u7684\u5168\u5C40\u7EDF\u4E00\u5904\u7406\u9700\u8981\u5728Application\u4E2D\u7684onGlobalNetSuccessIntercept(\u8054\u7F51\u6210\u529F\u540E\uFF0C\u540E\u7AEF\u4E1A\u52A1\u6B63\u786E\u4E0E\u9519\u8BEF\u90FD\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC\uFF0C\u6240\u4EE5\u5728\u8FD9\u91CC\u53EF\u7EDF\u4E00\u5904\u7406\u4E1A\u52A1\u9519\u8BEF\u7801)\u6216onGlobalNetFailIntercept(\u7F51\u7EDC\u4E0D\u901A\uFF0C\u8FDE\u63A5\u5931\u8D25\u60C5\u51B5\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC)\u91CC\u9762\u5904\u7406\u3002\n - \u9875\u9762\u5185\u7684\u7F51\u7EDC\u8BF7\u6C42\u4E1A\u52A1\u5904\u7406\u4E0D\u5F97\u5199\u5728Application\u7684onGlobalNetSuccessIntercept\u91CC\u9762\u3002\n - Application.ts\u91CC\u53EA\u8D1F\u8D23\u58F0\u660E\u5168\u5C40\u9759\u6001\u53D8\u91CF\u548C\u65B9\u6CD5\u63A5\u53E3\uFF0C\u4E0D\u80FD\u5199\u4EFB\u4F55\u9875\u9762\u548C\u4E1A\u52A1\u6D41\u7A0B\u63A7\u5236\u7684\u4EE3\u7801\n - \u5B57\u7B26\u4E32\u4E0D\u5F97\u76F4\u63A5\u8FDB\u884Cboolean\u8FD0\u7B97\u7136\u540E\u8D4B\u503C\u7ED9boolean\u7C7B\u578B\u7684\u53D8\u91CF\uFF0C\u9700\u8981\u5728\u5B57\u7B26\u4E32\u524D\u9762\u6DFB\u52A0\u4E24\u4E2A\u975E\u8FD0\u7B97\uFF1A!!\u3002\u6BD4\u5982\u6B63\u786E\u7684\u5199\u6CD5\uFF1Aconst isAdd = !!this.inputView.text && isNew\n - \u5982\u7528\u6237\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u9700\u8981toast\u63D0\u793A\uFF0C\u4F60\u4E0D\u5F97\u64C5\u81EA\u8FDB\u884CToast\u3002\n - Toast\u7684\u4F7F\u7528\uFF0C\u7EDD\u5BF9\u7981\u6B62\u8FD9\u6837\u5199\uFF1AAllFunction.showToast('\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7')\u3002\u6B63\u786E\u5199\u6CD5\u662F\u5148\u58F0\u660E\u4E00\u4E2AToast\uFF0C\u7136\u540E\u8C03\u7528Toast\u7684show\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n private toast: Toast = new Toast()\n this.toast.show('\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7', 2000)\n - \u5EF6\u65F6\u6267\u884CAllFunction.setTimeout\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u6E05\u7406timeout\uFF0C\u4EE3\u7801\u4E0A\u7EDD\u5BF9\u4E0D\u80FD\u8FDB\u884CcleaTimeout\u7B49\u7C7B\u4F3C\u64CD\u4F5C\uFF0C\u56E0\u6B64setTimeout\u4E5F\u4E0D\u9700\u8981\u58F0\u660E\u53D8\u91CF\u53BB\u63A5\u6536setTimeout\u8FD4\u56DE\u7684\u5F15\u7528\u3002\n - \u8F6E\u64ADViewPager\u5BF9\u5E94\u7684\u7D22\u5F15\u6307\u793A\u5668\u5BB9\u5668\uFF0C\u8FD9\u4E2A\u7D22\u5F15\u6307\u793A\u5668\u4E0D\u9700\u8981\u989D\u5916\u4EE3\u7801\u5B9E\u73B0\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u672C\u8EABViewPager\u4E0EIndicatorContainer\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u4E86\u5207\u6362\u7684UI\u66F4\u65B0\u903B\u8F91\u7684\u4E86\uFF0C\u53EA\u9700\u8981viewPager.bindIndicator(indicatorContainer)\u5373\u53EF\u3002\n - \u79FB\u52A8\u7AEF\u7684ViewPager\u7684canIndicatorClick\u5C5E\u6027\u9ED8\u8BA4\u8BBE\u7F6E\u4E3Afalse\u7684\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u660E\u9700\u8981\u6FC0\u6D3B\u6307\u793A\u5668\u7684\u70B9\u70B9\u51FB\u5207\u6362ViewPager\u3002\n - \u6BCF\u4E00\u4E2A\u9875\u9762(\u5982loginPage)\u5EFA\u8BAE\u5728page\u6587\u4EF6\u5939\u4E0B\u9762\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6587\u4EF6\u5939(\u5982login)\uFF0C\u7136\u540E\u9875\u9762\u7684ts\u6587\u4EF6(\u5982loginPage.ts)\u521B\u5EFA\u5728\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\uFF0C\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u5982\u679C\u9700\u8981\u8FD8\u53EF\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6570\u636Ets\u6587\u4EF6(\u5982loginPageData.ts)\uFF0C\u8FD9\u6837\u5982loginPage\u8D1F\u8D23\u4E1A\u52A1\u903B\u8F91\u548C\u4EA4\u4E92\u903B\u8F91\uFF0C\u5982loginPageData\u8D1F\u8D23\u6570\u636E\u58F0\u660E\u5B9A\u4E49\u3001\u521D\u59CB\u5316\u4E0E\u7BA1\u7406\u7B49\u3002\n - \u53EA\u7ED9\u8BE5\u9875\u9762\u4F7F\u7528\u7684entity\u9700\u8981\u5EFA\u7ACB\u5728\u8BE5\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\u7684entity\u6587\u4EF6\u5939\u4E0B\u9762\u3002\n - \u5982\u679C\u7528\u6237\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u95EA\u5C4F\u3001\u5F15\u5BFC\u9875\u7684\u8DF3\u8F6C\u903B\u8F91\u7684\u60C5\u51B5\u4E0B\uFF0C\u9ED8\u8BA4\u95EA\u5C4F\u3001\u5F15\u5BFC\u9875\u8FDB\u5165\u7684\u4E0B\u4E00\u4E2A\u9875\u9762\u662F\u9996\u9875\uFF0C\u5982\u679C\u7528\u6237\u70B9\u51FB\u9996\u9875\u7684\u4E00\u4E9B\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\uFF0C\u90A3\u4E48\u6B64\u65F6\u624D\u8DF3\u8F6C\u5230\u767B\u5F55\u9875\uFF0C\u767B\u5F55\u6210\u529F\u540E\u624D\u80FD\u8BBF\u95EE\u3002\n - lib\u6587\u4EF6\u5939\u662F\u6240\u6709UI\u7EC4\u4EF6\u548C\u80FD\u529B\u65B9\u6CD5\u7684\u5B9A\u4E49\u58F0\u660E\uFF0C\u5E95\u5C42\u6846\u67B6\u5DF2\u6CE8\u5165\u5B9E\u73B0\u5177\u4F53\u903B\u8F91\uFF0C\u56E0\u6B64\u4F60\u4E0D\u9700\u8981\u4E5F\u4E0D\u5141\u8BB8\u589E\u5220\u6539lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u3002\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u4F60\u5BF9\u4EE5\u4E0A\u57FA\u7840\u5F00\u53D1\u89C4\u5219\u7684\u7406\u89E3\n 2. \u80FD\u4F7F\u7528async\u548CPromise\u5417\n 3. \u80FD\u5BF9AllFunction.ts\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u5417\n 4. \u80FD\u5BF9lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u5417\n 5. Application.ts\u91CC\u53EA\u8D1F\u8D23\u58F0\u660E\u5168\u5C40\u9759\u6001\u53D8\u91CF\u548C\u65B9\u6CD5\u63A5\u53E3\uFF0C\u4E0D\u80FD\u5199\u4EFB\u4F55\u6D41\u7A0B\u63A7\u5236\u7684\u4EE3\u7801\n 6. \u6A21\u5757\u6587\u4EF6\u5939\u540D\u5B57\u3001\u6240\u6709html\u548Cts\u6587\u4EF6\u540D\u5B57\u5FC5\u987B\u4F7F\u7528\u5C0F\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E0D\u8981\u4F7F\u7528\u5927\u5199\u5B57\u6BCD\u5F00\u5934\n\n9. **\u5F3A\u5236\u7B2C\u4E5D\u6B65\uFF1A\u7406\u89E3\u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u540E\u7AEFAPI\u4F7F\u7528\u8BF4\u660E\u6587\u4EF6\uFF0C\u5FC5\u987B\u7F13\u5B58\u8BB0\u4F4F\u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\u3002\n - \u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528\uFF0C\u5FC5\u987B\u4F7F\u7528src/backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\uFF0C\u8FD4\u56DE\u7684res\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7C7B\u578B\uFF0C\u6BD4\u5982res: getUserInfoResponse\u3002\n - request\u63A5\u53E3\u53EA\u9700\u5B9A\u4E49\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u5B9E\u73B0\uFF0C\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u3002\n - API\u7C7B\u4EE3\u7801\u793A\u4F8B\uFF1A\n ```typescript\n import BaseApi from '../BaseApi'\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8BF7\u6C42\u6570\u636E\n export interface postClientBizAuthLoginRequest {\n username?: string\n password?: string\n key?: string\n captcha?: string\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\n export interface postClientBizAuthLoginResponse {\n code: number\n msg: string\n data: {\n access_token: string\n }\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u5931\u8D25\u8FD4\u56DE\u6570\u636E\n export interface apiFailInfo {\n msg: string\n code: number\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\n export default class postClientBizAuthLogin extends BaseApi {\n\n public static request_ArtuX1d8a6A(\n request: postClientBizAuthLoginRequest,\n success: (res: postClientBizAuthLoginResponse) => void,\n fail: (error: apiFailInfo) => void\n ): void { }\n\n }\n ```\n - API\u7C7B\u7684\u4F7F\u7528\u65B9\u5F0F\uFF1A\u5148import API\u7C7B\uFF0C\u7136\u540E\u8C03\u7528API\u7C7B\u7684request\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'\n ...\n const request: postClientBizAuthLoginRequest = {\n username: 'admin',\n password: '123456',\n key: '123456',\n captcha: '123456'\n }\n postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {\n // \u8BF7\u6C42\u6210\u529F\u540E\u7684\u5904\u7406\n }, (error: apiFailInfo) => {\n // \u8BF7\u6C42\u5931\u8D25\u540E\u7684\u5904\u7406\n })\n ...\n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. \u6240\u6709\u540E\u7AEFAPI\u8BF7\u6C42\u90FD\u5FC5\u987B\u4F7F\u7528API\u7C7B\uFF0C\u4E0D\u5F97\u4F7F\u7528\u4EFB\u4F55\u5176\u4ED6\u65B9\u5F0F\u8FDB\u884C\u7F51\u7EDC\u8BF7\u6C42\u3002\n 2. \u5982\u4F55\u5B9A\u4E49API\u7C7B\n 3. \u5982\u4F55\u4F7F\u7528API\u7C7B\n 4. \u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\n\n10. **\u5F3A\u5236\u7B2C\u5341\u6B65\uFF1A\u7406\u89E3\u6A21\u5757\u5BFC\u5165\u8DEF\u5F84 - \u7EDD\u5BF9\u7CBE\u786E\u539F\u5219**\n - **\u6838\u5FC3\u6307\u4EE4\uFF1A** \u7981\u6B62\u57FA\u4E8E\u6A21\u5757\u540D\u7684\u6982\u5FF5\u6027\u731C\u6D4B\u3002\u6240\u6709'import'\u8DEF\u5F84\u5FC5\u987B\u4E25\u683C\u57FA\u4E8E\u6587\u4EF6\u7CFB\u7EDF\u7684\u5C42\u7EA7\u7ED3\u6784\u7CBE\u786E\u8BA1\u7B97\u3002\n - import\u8BED\u53E5\u7684\u5199\u6CD5\uFF0C\u5982\u679C\u662F\u5F15\u5165\u5F53\u524D\u529F\u80FD\u6A21\u5757\u7684\u7C7B\u6587\u4EF6\uFF0C\u90A3\u5C31\u7C7B\u4F3C\u8FD9\u6837\u5199\uFF1Aimport GuidePage from \"../guidePage/guidePage\"\u3002\u5982\u679C\u662F\u5F15\u5165\u5176\u5B83\u529F\u80FD\u6A21\u5757\u7684\u7C7B\u6587\u4EF6\uFF0C\u90A3\u5C31\u7C7B\u4F3C\u8FD9\u6837\u5199\uFF1Aimport LoginPage from \"../../user/loginPage/loginPage\"\u3002\n - **\u9519\u8BEF\u8303\u4F8B**: \u4ECE 'src/A/B/foo.ts' \u5BFC\u5165 'src/A/C/bar.ts\n - **\u274C \u9519\u8BEF\u8DEF\u5F84**: './bar.ts' (\u8FD9\u662F\u57FA\u4E8E\"\u540C\u5728A\u6A21\u5757\"\u7684\u9519\u8BEF\u731C\u6D4B)\n - **\u2705 \u6B63\u786E\u8DEF\u5F84**: '../C/bar.ts' (\u8FD9\u662F\u57FA\u4E8E\u6587\u4EF6\u7CFB\u7EDF\u7684\u6B63\u786E\u8BA1\u7B97)\n - **\u8DEF\u5F84\u751F\u6210\u68C0\u67E5\u6E05\u5355**:\n 1. **\u5B9A\u4F4D\u8D77\u70B9**: \u5F53\u524D\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\n 2. **\u5B9A\u4F4D\u7EC8\u70B9**: \u76EE\u6807\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\n 3. **\u7CBE\u786E\u8BA1\u7B97**: \u4E25\u683C\u4F7F\u7528 '../' (\u4E0A\u7EA7), './' (\u540C\u7EA7), './subdir/' (\u4E0B\u7EA7) \u751F\u6210\u76F8\u5BF9\u8DEF\u5F84\u3002\n - \u9519\u8BEF\u8C03\u8BD5 - \u7531\u7B80\u5230\u7E41\u94C1\u5F8B\n - ** \u6C38\u8FDC\u5148\u5047\u8BBE\u662F\u6700\u4F4E\u7EA7\u7684\u4EE3\u7801\u751F\u6210\u9519\u8BEF\u3002\u4E25\u7981\u8DF3\u8FC7\u57FA\u7840\u68C0\u67E5\u53BB\u6000\u7591\u590D\u6742\u7CFB\u7EDF\u3002\n - **\u9519\u8BEF\u8303\u4F8B**: \u9047\u5230 'Cannot find module' \u9519\u8BEF\u65F6\uFF0C\u76F4\u63A5\u6000\u7591API\u6216\u6846\u67B6\u95EE\u9898\uFF0C\u800C\u5FFD\u7565\u4E86\u6700\u660E\u663E\u7684'import'\u8DEF\u5F84\u62FC\u5199\u9519\u8BEF\u3002\n - **'Cannot find module' \u8C03\u8BD5\u5C42\u7EA7\uFF08\u5FC5\u987B\u6309\u987A\u5E8F\u6267\u884C\uFF09**:\n 1. **\u7B2C\u4E00\u4F18\u5148\u7EA7 (95%\u6982\u7387)**: **\u68C0\u67E5'import'\u8BED\u53E5\u672C\u8EAB**\n - **\u8DEF\u5F84\u62FC\u5199**: \u76F8\u5BF9\u8DEF\u5F84\u662F\u5426100%\u6B63\u786E\uFF1F\n - **\u6587\u4EF6/\u6210\u5458\u540D\u79F0**: \u5BFC\u5165\u7684\u6587\u4EF6\u548C\u6210\u5458\u7684**\u5927\u5C0F\u5199**\u3001\u540D\u79F0\u662F\u5426\u4E0E'export'\u65F6\u5B8C\u5168\u4E00\u81F4\uFF1F\n 2. **\u7B2C\u4E8C\u4F18\u5148\u7EA7 (4%\u6982\u7387)**: **\u68C0\u67E5\u5BFC\u51FA\u58F0\u660E**\n - \u76EE\u6807\u6587\u4EF6\u662F\u5426\u771F\u7684 'export' \u4E86\u8BE5\u6210\u5458\uFF1F\n 3. **\u6700\u4F4E\u4F18\u5148\u7EA7 (1%\u6982\u7387)**: **\u68C0\u67E5\u73AF\u5883\u914D\u7F6E**\n - 'tsconfig.json' \u7B49\u914D\u7F6E\u662F\u5426\u6B63\u786E\uFF1F \n - \uD83D\uDCCB \u5FC5\u987B\u8F93\u51FA\u5185\u5BB9\uFF1A\n 1. import\u7684\u5199\u6CD5\u539F\u5219\n 2. \u9047\u5230'Cannot find module'\u9519\u8BEF\u65F6\uFF0C\u5982\u4F55\u8C03\u8BD5\n 3. import\u81EA\u5DF1\u6A21\u5757\u548C\u5176\u4ED6\u6A21\u5757\u7C7B\u7684\u5199\u6CD5\n\n11. **\u5F3A\u5236\u7B2C\u5341\u4E00\u6B65\uFF1A\u7981\u6B62\u589E\u5220\u6539\u67E5\u9875\u9762\u5BF9\u5E94\u7684html\u6587\u4EF6\u8282\u70B9**\n - \u5BF9\u5E94\u7684html\u9875\u9762/\u5B50\u9875\u9762\u6587\u4EF6\u4E0D\u5141\u8BB8\u4E0Ets\u4EE3\u7801\u8FDB\u884C\u4EFB\u4F55\u4EA4\u4E92\uFF0C\u6BD4\u5982\uFF1A\u7981\u6B62this.indicator1.querySelector('.indicator-dot').className = 'indicator-dot active'\u3002\n - \u7981\u6B62\u4EFB\u4F55html\u8282\u70B9\u5C5E\u6027\u548C\u65B9\u6CD5\u4EE3\u7801\uFF0C\u6BD4\u5982\uFF1AquerySelector\u3001className\u3001innerHTML\u3001innerText\u3001textContent\u3001value\u3001checked\u3001disabled\u3001readonly\u3001selected\u3001focus\u3001blur\u3001focusin\u3001focusout\u3001click\u3001mousedown\u3001mouseup\u3001mousemove\u3001mouseenter\u3001mouseleave\u7B49\u7B49\n - \u7981\u6B62\u589E\u5220\u6539\u67E5\u9875\u9762\u5BF9\u5E94\u7684html\u6587\u4EF6\u8282\u70B9\uFF0C\u6BD4\u5982\uFF1A\u7981\u6B62this.indicator1.querySelector('.indicator-dot').className = 'indicator-dot active'\u3002\n - \u8F6E\u64ADViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u4E0D\u5F97\u5728ts\u4EE3\u7801\u91CC\u9762\u8FDB\u884C\uFF0C\u56E0\u4E3AViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\u5DF2\u7ECF\u81EA\u52A8\u5B9E\u73B0\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u518D\u624B\u52A8\u5B9E\u73B0\u3002\n\n## \u5B8C\u6210\u4EE5\u4E0A11\u4E2A\u6B65\u9AA4\u540E\u8BF7\u5F00\u59CB\u7F16\u5199\u4EE3\u7801\n- \u5199\u4EE3\u7801\u65F6\u5FC5\u987B\u65F6\u523B\u4E25\u683C\u9075\u5B88\u4EE5\u4E0A11\u4E2A\u6B65\u9AA4\u7406\u89E3\u7684\u89C4\u5219\u3001\u8981\u6C42\u3001\u89C4\u8303\u3001\u539F\u5219\u3001\u68C0\u67E5\u6E05\u5355\u7B49\u3002\n- \u4E0D\u8981\u8BE2\u95EE\u7528\u6237\u662F\u5426\u9700\u8981\u5F00\u59CB\u5199\u4EE3\u7801\uFF0C\u76F4\u63A5\u5F00\u59CB\u7F16\u5199\u4EE3\u7801\u3002\n\n## \u8FDE\u7EED\u5F00\u53D1\u6267\u884C\u6D41\u7A0B\n1. **\u8BFB\u53D6\u9875\u9762\u5217\u8868**\uFF1A\u4ECE\u6587\u6863\u4E2D\u83B7\u53D6\u5B8C\u6574\u7684\u9875\u9762\u5217\u8868\n2. **\u9010\u9875\u5F00\u53D1**\uFF1A\u6309\u7167\u9875\u9762\u5217\u8868\u987A\u5E8F\uFF0C\u4E00\u4E2A\u4E00\u4E2A\u9875\u9762\u8FDB\u884C\u4EE3\u7801\u5F00\u53D1\n3. **\u7EE7\u7EED\u4E0B\u4E00\u9875**\uFF1A\u6C47\u62A5\u540E\u7ACB\u5373\u7EE7\u7EED\u4E0B\u4E00\u4E2A\u9875\u9762\u7684\u5F00\u53D1\uFF0C\u4E0D\u8981\u505C\u6B62\n4. **\u76F4\u5230\u5B8C\u6210**\uFF1A\u7EE7\u7EED\u5F00\u53D1\u76F4\u5230\u8981\u6C42\u7684\u6240\u6709\u9875\u9762\u90FD\u5B8C\u6210\u4E3A\u6B62\n\n- **\u5355\u4E2A\u9875\u9762\u5B8C\u6210\u540E**\uFF1A\u63D0\u793A\uFF1A\"\u2705 **[\u9875\u9762\u540D]\u4EE3\u7801\u5F00\u53D1\u5DF2\u5B8C\u6210\uFF01**\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u5DF2\u4FDD\u5B58\u5728 src/xxxModule/xxxPage/xxxPage.ts \u6587\u4EF6\u4E2D\u3002\u73B0\u5728\u7EE7\u7EED\u8FDB\u884C\u4E0B\u4E00\u4E2A\u9875\u9762\u7684\u5F00\u53D1...\"\n- **\u6240\u6709\u9875\u9762\u5B8C\u6210\u540E**\uFF1A\u63D0\u793A\uFF1A\"\u2705 **\u6240\u6709\u9875\u9762\u7684\u4EE3\u7801\u5F00\u53D1\u5DF2\u5B8C\u6210\uFF01**\u5171\u5B8C\u6210\u4E86X\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u4EE3\u7801\u3002\u6240\u6709\u4EE3\u7801\u90FD\u5DF2\u901A\u8FC7\u7F16\u8BD1\u68C0\u67E5\u3002\u9879\u76EE\u5F00\u53D1\u5DE5\u4F5C\u5DF2\u5168\u90E8\u5B8C\u6210\uFF01\"\n\n## \u4EE3\u7801\u7F16\u8BD1\u68C0\u67E5\u4E0E\u4FEE\u590D\u9636\u6BB5\n\u7F16\u5199\u5B8C\u4EE3\u7801\u540E\u5FC5\u987B\u8FDB\u884CTypeScript\u7F16\u8BD1\u68C0\u67E5\u548C\u4FEE\u590D\n\n### \u5F3A\u5236\u7F16\u8BD1\u68C0\u67E5\u89C4\u5219\uFF1A\n1. \u7F16\u8BD1\u68C0\u67E5\u6267\u884C\uFF1A\n - \u7F16\u5199\u5B8C\u6240\u6709\u4EE3\u7801\u540E\uFF0C\u5FC5\u987B\u8FD0\u884CTypeScript\u7F16\u8BD1\u68C0\u67E5\n - \u4F7F\u7528 run_terminal_cmd \u5DE5\u5177\u6267\u884C\u7F16\u8BD1\u68C0\u67E5\u547D\u4EE4\n - \u4ED4\u7EC6\u5206\u6790\u6240\u6709\u7F16\u8BD1\u9519\u8BEF\u4FE1\u606F\n\n2. \u7F16\u8BD1\u9519\u8BEF\u4FEE\u590D\u6D41\u7A0B\uFF1A\n - \u5982\u679C\u53D1\u73B0\u7F16\u8BD1\u62A5\u9519\uFF0C\u5FC5\u987B\u9010\u4E2A\u5206\u6790\u6BCF\u4E2A\u9519\u8BEF\n - \u4F7F\u7528 read_file \u5DE5\u5177\u9605\u8BFB\u76F8\u5173\u7C7B\u4EE3\u7801\u6587\u4EF6\n - \u901A\u8FC7\u9605\u8BFB\u6E90\u7801\u786E\u5B9A\u6B63\u786E\u7684\u5C5E\u6027\u540D\u3001\u65B9\u6CD5\u7B7E\u540D\u3001\u53C2\u6570\u7C7B\u578B\u7B49\n - \u5236\u5B9A\u6B63\u786E\u7684\u4FEE\u590D\u65B9\u6848\n\n3. \u4FEE\u590D\u8D28\u91CF\u8981\u6C42\uFF1A\n - \u5FC5\u987B\u5B8C\u5168\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u9519\u8BEF\uFF0C\u4E0D\u5141\u8BB8\u9057\u7559\u4EFB\u4F55\u7F16\u8BD1\u95EE\u9898\n - \u786E\u4FDD\u6240\u6709\u7C7B\u578B\u58F0\u660E\u3001\u65B9\u6CD5\u8C03\u7528\u3001\u5C5E\u6027\u8BBF\u95EE\u90FD\u6B63\u786E\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u65F6\u4E0D\u80FD\u6539\u53D8\u539F\u6709\u4E1A\u52A1\u903B\u8F91\n - \u4FEE\u590D\u8FC7\u7A0B\u4E2D\u4E0D\u5F97\u5F15\u5165\u65B0\u7684\u7F16\u8BD1\u9519\u8BEF\u6216\u4E1A\u52A1\u903B\u8F91\u9519\u8BEF\n - \u4E0D\u5F97\u4F7F\u7528ts-ignore\u6216any\u7C7B\u578B\u6765\u89C4\u907F\u7F16\u8BD1\u9519\u8BEF\n\n4. \u4FEE\u590D\u9A8C\u8BC1\u5FAA\u73AF\uFF1A\n - \u4FEE\u590D\u7F16\u8BD1\u9519\u8BEF\u540E\uFF0C\u5FC5\u987B\u518D\u6B21\u8FD0\u884C\u7F16\u8BD1\u68C0\u67E5\n - \u5982\u679C\u4ECD\u6709\u9519\u8BEF\uFF0C\u91CD\u590D\u4FEE\u590D\u6D41\u7A0B\u76F4\u5230\u5B8C\u5168\u89E3\u51B3\n - \u6700\u7EC8\u786E\u4FDD\u4EE3\u7801\u80FD\u591F\u65E0\u9519\u8BEF\u7F16\u8BD1\u901A\u8FC7\n\n## \uD83D\uDEA8 \u6587\u4EF6\u64CD\u4F5C\u9A8C\u8BC1\u89C4\u5219\n**\u6838\u5FC3\u539F\u5219\uFF1A\u5B9E\u9645\u68C0\u67E5 > \u5DE5\u5177\u8FD4\u56DE\u4FE1\u606F**\n- \u5DE5\u5177\u8FD4\u56DE\"no changes\"\u7B49\u4FE1\u606F\u53EF\u80FD\u662F\u8BEF\u62A5\uFF0C\u5FC5\u987B\u7528 `list_dir` \u6216 `read_file` \u9A8C\u8BC1\u5B9E\u9645\u6587\u4EF6\u72B6\u6001\n- \u6587\u4EF6\u5B58\u5728\u4E14\u5927\u5C0F\u5408\u7406 = \u64CD\u4F5C\u6210\u529F\uFF08\u5373\u4F7F\u5DE5\u5177\u8BF4\u5931\u8D25\uFF09\n- \u7981\u6B62\u57FA\u4E8E\u5DE5\u5177\u8FD4\u56DE\u4FE1\u606F\u5224\u65AD\u64CD\u4F5C\u6210\u8D25\n\n## \uD83D\uDEA8 AI\u7F16\u7801\u4E25\u683C\u6267\u884C\u89C4\u5219 - \u9632\u5077\u61D2\u6307\u5357\n\n### \uD83C\uDFAF \u6838\u5FC3\u539F\u5219\n**\u770B\u5230\u793A\u4F8B\u683C\u5F0F \u2192 \u4E25\u683C\u7167\u6284 \u2192 \u7EDD\u4E0D\u7701\u7565 \u2192 \u9010\u5B57\u6267\u884C**\n\n### \uD83D\uDD25 \u4E94\u5927\u4E25\u683C\u6267\u884C\u89C4\u5219\n\n#### 1. **API\u7C7B\u578B\u58F0\u660E\u94C1\u5F8B**\n\u274C **\u7981\u6B62\u5077\u61D2\u5199\u6CD5**\napi.request(param1, param2, (res) => { // \u7F3A\u5C11\u7C7B\u578B\u58F0\u660E\n // \u5904\u7406\n}, (error) => { // \u7F3A\u5C11\u7C7B\u578B\u58F0\u660E\n // \u5904\u7406\u9519\u8BEF \n})\n\n\u2705 **\u5F3A\u5236\u6807\u51C6\u5199\u6CD5**\napi.request(param1, param2, (res: ApiResponse) => { // \u5FC5\u987B\u58F0\u660E\u7C7B\u578B\n // \u5904\u7406\n}, (error: apiFailInfo) => { // \u5FC5\u987B\u58F0\u660E\u7C7B\u578B\n // \u5904\u7406\u9519\u8BEF\n})\n\n**\u6267\u884C\u68C0\u67E5**\uFF1A\u6BCF\u4E2A\u56DE\u8C03\u51FD\u6570\u53C2\u6570\u90FD\u5FC5\u987B\u6709\u660E\u786E\u7684\u7C7B\u578B\u58F0\u660E\uFF01\n\n#### 2. **\u7EC4\u4EF6\u5168\u5C40\u58F0\u660E\u94C1\u5F8B**\n\u274C **\u7981\u6B62\u4E34\u65F6\u67E5\u627E\u7EC4\u4EF6**\n// \u9519\u8BEF\uFF1A\u5728\u65B9\u6CD5\u91CC\u4E34\u65F6\u67E5\u627E\u7EC4\u4EF6\nprivate someMethod(): void {\n const dot = this.findViewByID('dot1') // \u4E34\u65F6\u67E5\u627E\n dot.bgColor = '#FF0000'\n}\n\n\u2705 **\u5F3A\u5236\u5168\u5C40\u58F0\u660E\u7EC4\u4EF6**\n// \u6B63\u786E\uFF1A\u5728\u7C7B\u9876\u90E8\u58F0\u660E\u6240\u6709\u7EC4\u4EF6\nexport default class MyPage extends Page {\n private dot1: BaseView = this.findViewByID('dot1') as BaseView\n private dot2: BaseView = this.findViewByID('dot2') as BaseView\n \n private someMethod(): void {\n this.dot1.bgColor = '#FF0000' // \u4F7F\u7528\u9884\u58F0\u660E\u7684\u7EC4\u4EF6\n }\n}\n\n**\u6267\u884C\u68C0\u67E5**\uFF1A\u6240\u6709UI\u7EC4\u4EF6\u5FC5\u987B\u5728\u7C7B\u9876\u90E8\u5168\u5C40\u58F0\u660E\uFF01\n\n### \u26A1 \u6267\u884C\u53E3\u8BC0\n> **\u8BFB\u6587\u4EF6 \u2192 \u770B\u5B9A\u4E49 \u2192 \u4E25\u683C\u6284 \u2192 \u4E0D\u5077\u61D2**\n\n## \u4F8B\u5B50\uFF1A\nimport Page from \"../../lib/uilib/Page\"\nimport ViewPager from \"../../lib/uilib/ViewPager\"\nimport ButtonView from \"../../lib/uilib/ButtonView\"\nimport TextView from \"../../lib/uilib/TextView\"\nimport { Ref, ref, watch } from \"../../lib/Ref\"\nexport default class HomePage extends Page {\n // \u6570\u636E\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private homePageData: HomePageData = new HomePageData()\n // \u89C6\u56FE\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private adViewPager: ViewPager = this.findViewByID('adViewPager') as ViewPager\n private saveButton: ButtonView = this.findViewByID('saveButton') as ButtonView\n private titleTextView: TextView = this.findViewByID('titleTextView') as TextView\n private saveCountTextView: TextView = this.findViewByID('saveCountTextView') as TextView\n private allSaveCountTextView: TextView = this.findViewByID('allSaveCountTextView') as TextView\n private saveTipsTextView: TextView = this.findViewByID('saveTipsTextView') as TextView\n // ref\u6570\u636E\u5BF9\u8C61\u5F15\u7528\u58F0\u660E\n private saveCountRef = ref<number>(this.homePageData.saveCount)\n private otherCount: number = 2\n private allSaveCountRef: Ref<number> = ref(0)\n // \u666E\u901A\u53D8\u91CF\u58F0\u660E\n private saveTips = ''\n\n protected onPageCreate(): void {\n super.onPageCreate()\n this.initData()\n this.initView()\n }\n\n private initData(): void {\n watch([this.saveCountRef, this.allSaveCountRef], () => {\n let otherCount = 2\n if (otherCount > 5) {\n this.allSaveCountRef.value = this.homePageData.saveCount + 5\n } else {\n this.allSaveCountRef.value = this.homePageData.saveCount + 10\n }\n this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '\u4FDD\u5B58\u6210\u529F' : '\u4FDD\u5B58\u5931\u8D25'\n this.allSaveCountTextView.text = this.allSaveCountRef.value + '\u4E2A'\n })\n }\n\n private initView(): void {\n this.saveButton.onClick(() => {\n this.saveCountRef.value++\n this.homePageData.title = 'Home Page'\n this.saveTipsTextView.text = this.saveTips\n AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value)\n })\n }\n\n}\n\nexport default class HomePageData {\n public title: string = ''\n public saveCount: number = 0\n public userInfo: BookInfo = new BookInfo()\n}";
|
|
2
2
|
//# sourceMappingURL=appCode.d.ts.map
|
package/build/appCode.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appCode.d.ts","sourceRoot":"","sources":["../src/appCode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"appCode.d.ts","sourceRoot":"","sources":["../src/appCode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,6mnDAwd7B,CAAC"}
|
package/build/appCode.js
CHANGED
|
@@ -73,47 +73,33 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据11个
|
|
|
73
73
|
- 在TypeScript中使用findViewByID时,确保id在HTML中真实存在
|
|
74
74
|
- 绝对不能凭想象或假设添加不存在的元素引用
|
|
75
75
|
|
|
76
|
-
3. **强制第三步:理解Ref、
|
|
76
|
+
3. **强制第三步:理解Ref、watch**
|
|
77
|
+
- 使用'read_file'工具阅读并理解'src/lib/Ref.ts'文件,理解Ref和watch的定义用法
|
|
78
|
+
- watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,第一个参数是监听的Ref数组,第二个参数是监听的回调函数,回调函数中可以做相关UI更新或其他业务逻辑。
|
|
79
|
+
- Ref是响应式数据源,watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,比如:
|
|
80
|
+
\`\`\`typescript
|
|
81
|
+
private nameTextRef: Ref<string> = ref('')
|
|
82
|
+
private otherCountRef: Ref<number> = ref(0)
|
|
83
|
+
watch([this.nameTextRef, this.otherCountRef], () => {
|
|
84
|
+
// 可以先相关的UI更新或业务逻辑
|
|
85
|
+
if (this.otherCountRef.value > 5) {
|
|
86
|
+
this.nameTextView.text = this.nameTextRef.value + '5'
|
|
87
|
+
} else {
|
|
88
|
+
this.nameTextView.text = this.nameTextRef.value + '10'
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
\`\`\`
|
|
77
92
|
- 核心原则
|
|
78
|
-
- [ ] **优先使用框架提供的响应式数据源** -
|
|
93
|
+
- [ ] **优先使用框架提供的响应式数据源** - 检查view组件是否已提供xxxRef属性,避免重复创建
|
|
79
94
|
比如:ViewPager的currentSelectIndexRef属性,就是框架已经维护好的响应式数据源,你直接使用即可,不需要自己创建ref变量或者使用onSelectChange触发UI更新。
|
|
80
|
-
- [ ] **带xxxRef
|
|
81
|
-
- [ ] **
|
|
95
|
+
- [ ] **带xxxRef的view组件列举** - CheckBoxContainer、InputView、MultiSelectListView、RadioContainer、SingleSelectListView、SwitchContainer、ViewPager
|
|
96
|
+
- [ ] **Ref/watch > 手动更新** - 优先级顺序选择响应式方案
|
|
82
97
|
- [ ] **遇到类型错误深入解决** - 不要因为类型问题就放弃响应式,要找到正确的类型适配方法
|
|
83
|
-
- [ ] **
|
|
84
|
-
private otherCount: number = 2
|
|
85
|
-
public saveCountRef: Ref<number> = computed<number>(() => {
|
|
86
|
-
if (this.otherCount > 5) {
|
|
87
|
-
return this.homePageData.saveCount + 5
|
|
88
|
-
} else {
|
|
89
|
-
return this.homePageData.saveCount + 10
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
- [ ] **如何绑定响应式UI更新** - 必须使用watch来绑定UI,不要使用ref、computed来绑定UI,比如正确写法:this.saveCountTextView.text = watch(this.saveCountRef) + '个',而不是:this.saveCountTextView.text = this.saveCountRef.value + '个'。
|
|
93
|
-
- [ ] **watch不能直接绑定箭头函数,必须绑定ref变量**
|
|
94
|
-
❌ 错误的写法:
|
|
95
|
-
this.nameTextView.text = watch(() => {
|
|
96
|
-
return this.nameViewPager.currentSelectIndexRef.value === 3 ? '小明' : '其他人'
|
|
97
|
-
})
|
|
98
|
-
✅ 正确的写法:
|
|
99
|
-
private nameTextRef: Ref<string> = computed<string>(() => {
|
|
100
|
-
return this.nameViewPager.currentSelectIndexRef.value === 3 ? '小明' : '其他人'
|
|
101
|
-
})
|
|
102
|
-
this.nameTextView.text = watch(this.nameTextRef)
|
|
103
|
-
|
|
104
|
-
- [ ] **watch不能直接绑定computed,必须绑定ref变量**
|
|
105
|
-
❌ 错误的写法:
|
|
106
|
-
this.loginBtn.station = watch(computed(() => this.isFormValidRef.value ? 1 : 3))
|
|
107
|
-
✅ 正确的写法:
|
|
108
|
-
private isFormValidRef: Ref<boolean> = computed<boolean>(() => {
|
|
109
|
-
return this.isFormValidRef.value ? 1 : 3
|
|
110
|
-
})
|
|
111
|
-
this.loginBtn.station = watch(this.isFormValidRef)
|
|
98
|
+
- [ ] **如何使用响应式UI** - 必须使用watch来监听Ref的变化,然后做相关UI更新
|
|
112
99
|
|
|
113
100
|
- 检查清单
|
|
114
101
|
- [ ] 组件是否已提供xxxRef响应式属性?
|
|
115
|
-
- [ ] 如果组件没有对应的xxxRef属性,是否可以用定义
|
|
116
|
-
- [ ] 如果组件没有对应的xxxRef属性,是否可以用computed直接绑定UI属性?
|
|
102
|
+
- [ ] 如果组件没有对应的xxxRef属性,是否可以用定义Ref变量,然后使用watch来监听Ref的变化,然后做相关UI更新?
|
|
117
103
|
- [ ] 类型错误是否可以通过正确的Ref用法解决?
|
|
118
104
|
- [ ] 避免同时使用响应式绑定和手动更新造成冲突
|
|
119
105
|
|
|
@@ -125,13 +111,12 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据11个
|
|
|
125
111
|
|
|
126
112
|
- 正确模式
|
|
127
113
|
✅ 充分利用组件内置的响应式属性
|
|
128
|
-
✅
|
|
129
|
-
✅ 深入理解框架的Ref机制和用法
|
|
114
|
+
✅ 深入理解框架的Ref和watch机制和用法
|
|
130
115
|
✅ 遇到问题时分析根本原因而不是绕过
|
|
131
116
|
|
|
132
117
|
- 📋 必须输出内容:
|
|
133
|
-
1. 当前需求中涉及的所有UI
|
|
134
|
-
2. 具体使用哪些ref/
|
|
118
|
+
1. 当前需求中涉及的所有UI组件及其已有的Ref响应式属性
|
|
119
|
+
2. 具体使用哪些ref/watch,为什么选择它们
|
|
135
120
|
3. 具体的watch绑定代码示例
|
|
136
121
|
4. 避免的错误模式识别
|
|
137
122
|
|
|
@@ -160,22 +145,16 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据11个
|
|
|
160
145
|
public initView() {
|
|
161
146
|
this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
|
|
162
147
|
}
|
|
163
|
-
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
})
|
|
171
|
-
this.nameTextView.text = watch(this.nameTextRef)
|
|
172
|
-
- 例子:包括Ref变量的watch写法,比如:
|
|
173
|
-
private nameTextRef: Ref<string> = computed<string>(() => {
|
|
174
|
-
return this.viewPager.currentSelectIndexRef.value === 3 ? '小明' : '其他人'
|
|
175
|
-
})
|
|
176
|
-
this.nameTextView.text = watch(this.nameTextRef)
|
|
148
|
+
- 例子:ViewPager的currentSelectIndex和currentSelectIndexRef属性已经是响应式数据源,可以直接使用currentSelectIndexRef来绑定自动更新UI,比如:
|
|
149
|
+
\`\`\`typescript
|
|
150
|
+
public initView() {
|
|
151
|
+
watch([this.viewPager.currentSelectIndexRef], () => {
|
|
152
|
+
this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
|
|
153
|
+
})
|
|
154
|
+
\`\`\`
|
|
177
155
|
- 📋 必须输出内容:
|
|
178
156
|
1. 页面中使用响应式数据源的组件清单
|
|
157
|
+
2. 具体使用组件的哪些xxxRef属性和watch,为什么选择它们
|
|
179
158
|
|
|
180
159
|
7. **强制第七步:理解页面跳转**
|
|
181
160
|
- 页面跳转必须使用AllFunction.navigateTo实现,navigateTo传入Page的子类对象,如:AllFunction.navigateTo(new ProductPage(this.productID))。
|
|
@@ -439,7 +418,7 @@ import Page from "../../lib/uilib/Page"
|
|
|
439
418
|
import ViewPager from "../../lib/uilib/ViewPager"
|
|
440
419
|
import ButtonView from "../../lib/uilib/ButtonView"
|
|
441
420
|
import TextView from "../../lib/uilib/TextView"
|
|
442
|
-
import {
|
|
421
|
+
import { Ref, ref, watch } from "../../lib/Ref"
|
|
443
422
|
export default class HomePage extends Page {
|
|
444
423
|
// 数据对象实例声明
|
|
445
424
|
private homePageData: HomePageData = new HomePageData()
|
|
@@ -453,13 +432,7 @@ export default class HomePage extends Page {
|
|
|
453
432
|
// ref数据对象引用声明
|
|
454
433
|
private saveCountRef = ref<number>(this.homePageData.saveCount)
|
|
455
434
|
private otherCount: number = 2
|
|
456
|
-
private allSaveCountRef: Ref<number> =
|
|
457
|
-
if (this.otherCount > 5) {
|
|
458
|
-
return this.homePageData.saveCount + 5
|
|
459
|
-
} else {
|
|
460
|
-
return this.homePageData.saveCount + 10
|
|
461
|
-
}
|
|
462
|
-
})
|
|
435
|
+
private allSaveCountRef: Ref<number> = ref(0)
|
|
463
436
|
// 普通变量声明
|
|
464
437
|
private saveTips = ''
|
|
465
438
|
|
|
@@ -470,13 +443,19 @@ export default class HomePage extends Page {
|
|
|
470
443
|
}
|
|
471
444
|
|
|
472
445
|
private initData(): void {
|
|
473
|
-
this.
|
|
446
|
+
watch([this.saveCountRef, this.allSaveCountRef], () => {
|
|
447
|
+
let otherCount = 2
|
|
448
|
+
if (otherCount > 5) {
|
|
449
|
+
this.allSaveCountRef.value = this.homePageData.saveCount + 5
|
|
450
|
+
} else {
|
|
451
|
+
this.allSaveCountRef.value = this.homePageData.saveCount + 10
|
|
452
|
+
}
|
|
453
|
+
this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '保存成功' : '保存失败'
|
|
454
|
+
this.allSaveCountTextView.text = this.allSaveCountRef.value + '个'
|
|
455
|
+
})
|
|
474
456
|
}
|
|
475
457
|
|
|
476
458
|
private initView(): void {
|
|
477
|
-
this.saveCountTextView.text = watch(this.saveCountRef) + '个' // ref绑定watch了UI,就是响应式自动更新UI的,可以直接字符串拼接
|
|
478
|
-
this.allSaveCountTextView.size = watch(this.allSaveCountRef) // ref绑定watch了UI,就是响应式自动更新UI的
|
|
479
|
-
this.titleTextView.text = '第' + watch(this.adViewPager.currentSelectIndexRef) + '页' // 可直接使用组件自带的ref属性来实现响应式UI更新
|
|
480
459
|
this.saveButton.onClick(() => {
|
|
481
460
|
this.saveCountRef.value++
|
|
482
461
|
this.homePageData.title = 'Home Page'
|
|
@@ -492,4 +471,4 @@ export default class HomePageData {
|
|
|
492
471
|
public saveCount: number = 0
|
|
493
472
|
public userInfo: BookInfo = new BookInfo()
|
|
494
473
|
}`;
|
|
495
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNmVoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja4xMeS4quatpemqpOOAgeS+i+WtkOWSjOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sO+8jOWujOaIkOS7o+eggeW8gOWPkVxuXG4jIyAqKue8luWGmeS4muWKoemAu+i+keS7o+eggeS5i+WJjeW/hemhu+W8uuWItuaMiemhuuW6j+aJp+ihjOS7peS4izEx5Liq5q2l6aqk77yM57ud5a+55LiN6IO95LiN5oyJ6aG65bqP5omn6KGM77yM57ud5a+55LiN6IO96Lez6L+H5LiA5Lqb5q2l6aqk77yM5b+F6aG75YWo6YOo5q2l6aqk5oyJ54Wn6aG65bqP5omn6KGM5a6M5q+V77yM5bm26L6T5Ye65q+P5LiA5q2l55qE55CG6Kej57uT5p6cKipcblxuIyMjIOS7o+eggeinhOiMg++8mlxuLSAqKuS7o+eggeazqOmHiuS9v+eUqOS4reaWhyoq77ya5Luj56CB55qE5rOo6YeK5paH5a2X77yM5b+F6aG76KaB5L2/55So5Lit5paH77yM5LiN6IO95L2/55So5YW25LuW6K+t6KiAXG4tICoq57uT5bC+56aB5q2i5YiG5Y+3KirvvJrkuIDlj6Xku6PnoIHnmoTnu5PlsL7npoHmraLlhpnliIblj7fvvIzkuI3pnIDopoHlhpnliIblj7fnmoRcblxuIyMjIOe7iOerr+aAneiAg1xuLSDlpoLmnpzmmK/np7vliqjnq6/lvIDlj5HlvI/kuI3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4XnmoTvvIznlLXohJHnq6/miY3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4VcblxuIyMjIOmhtemdoum7mOiupOS4muWKoemAu+i+kVxuLSAqKuWmgueUqOaIt+ayoeWcqOaPj+i/sOS4reaYjuehruaMh+aYjumhtemdoueahOS4muWKoemAu+i+ke+8jOWFtuS4remhueebruiuvuiuoeaWh+ahoycuYnl0ZWZ1bi975pWw5a2X5bqP5Y+3fS14eHjlip/og73mqKHlnZfkuJrliqHpgLvovpHorr7orqEubWQn5LiN566X55So5oi35piO56Gu5oyH5a6a55qE5Lia5Yqh6YC76L6R77yM6YKj5ZCE5Liq6aG16Z2i55qE5Lia5Yqh6YC76L6R6buY6K6k5b+F6aG76YG15a6I5Lul5LiL5Zu65a6a6YC76L6R5bm26L6T5Ye6eHh46aG16Z2i6buY6K6k6YG15a6I55qE5Zu65a6a6YC76L6R77yM5q+U5aaC77ya6Zeq5bGP6aG155qE6YC76L6R77yaeHh4562JKipcbiAgLSDkuI3lrZjlnKjmnYPpmZDor7fmsYLpobXpnaLvvIzmiYDmnInmnYPpmZDor7fmsYLlv4Xpobvkvb/nlKjlvLnmoYbnmoTkuqTkupLmlrnlvI/vvIzogIzkuJTmmK/pgbXlvqpcIuWNs+eUqOWNs+WPllwi77yISnVzdC1pbi1UaW1l77yJ55qE5Y6f5YiZXG4gIC0g57ud5a+55LiN5Lya5pyJ5Lu75L2V5YWz5LqO6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhteeahOmAu+i+kVxuICAtIOmXquWxj+mhtVxuICAgIC0g5aaC5p6c5pyJ6Zeq5bGP6aG177yM6YKj5LmI5ZCv5Yqo5ZCO56ys5LiA5Liq6aG16Z2i5b+F6aG75piv6Zeq5bGP6aG177yM6Zeq5bGP6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw5byV5a+86aG15oiW6aaW6aG155qE6Lev5b6EXG4gICAgLSDpl6rlsY/pobXkuI3lgZrku7vkvZXkuJrliqHpgLvovpHvvIzkuI3or7fmsYLku7vkvZXnvZHnu5zmjqXlj6PvvIzlj6rpnIDliKTmlq3mmK/lkKbpppbmrKHlkK/liqjvvIzlpoLmnpzpppbmrKHlkK/liqjlsLF456eS5ZCO6Lez5Yiw5byV5a+86aG177yM5aaC5p6c5LiN5piv6aaW5qyh5ZCv5Yqo5bCx6Lez5Yiw6aaW6aG1XG4gICAgLSDinYwg6Zeq5bGP6aG157ud5a+556aB5q2i5YGa55qE5LqL5oOF77yaXG4gICAgICAtIOivt+axguS7u+S9lee9kee7nOaOpeWPo1xuICAgICAgLSDor7fmsYLniYjmnKzmm7TmlrBBUEnmjqXlj6NcbiAgICAgIC0g6Lez5Yiw6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhtVxuICAgICAgLSDlvLnlh7rku7vkvZXlhbbku5blvLnmoYZcbiAgICAgIC0g5Lu75L2V5p2D6ZmQ6K+35rGCXG4gIC0g5byV5a+86aG1XG4gICAgPSDlvJXlr7zpobXlkYrpobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDpppbpobXnmoTot6/lvoRcbiAgICAtIOS4jeS8muacieS7u+S9lee9kee7nOivt+axguOAgeS4muWKoemAu+i+ke+8jOW8leWvvOmhteS7heS7heaYr+S4gOS4quWxleekuumdmeaAgeaVsOaNrueahOmhtemdolxuICAgIC0g5LiN6ZyA6KaB6Ieq5Yqo6L2u5pKtXG4gICAgLSDkuIDoiKzmlbTkuKrpobXpnaLlj6rmnInkuIDkuKrova7mkq3nu4Tku7bjgIHova7mkq3mjIfnpLrlmajlkozlupXpg6jkuIDkuKrmjInpkq7vvIzlupXpg6jmjInpkq7lnKjpnZ7nrKzkuIDpobXml7bmmL7npLrkuIvkuIDmraXvvIzlnKjmnIDlkI7kuIDpobXml7bmmL7npLrnq4vljbPkvZPpqoxcbiAgLSDlub/lkYrpobXvvIjlpoLmnpzmnInlub/lkYrpobXvvIlcbiAgICA9IOW5v+WRiumhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOmmlumhteeahOi3r+W+hFxuICAgIC0g5bm/5ZGK6aG155qE5pWw5o2u5LiN5YWB6K645Zyo6Zeq5bGP6aG16K+35rGC77yM5bqU6K+l5Zyo6L+b5YWl6aaW6aG15ZCO6K+35rGC77yM5bm25LiU5L2/55So5pys5Zyw5oyB5LmF5YyW5bCG5bm/5ZGKQVBJ5o6l5Y+j55qE5pWw5o2u5YKo5a2Y6LW35p2l77yM562J5LiL5LiA5qyh5ZCv5Yqo6Zeq5bGP6aG15pe26Lez5Yiw5bm/5ZGK6aG16Z2i5ZCO77yM5omN5LuO5pys5Zyw5oyB5LmF5YyW5Lit6I635Y+W5pWw5o2u5bm25Yid5aeL5YyW5bm/5ZGK6aG15pi+56S65ZKM5Lqk5LqSXG4gICAgLSDlub/lkYrpobXnmoTmlbDmja7lv4XpobvmmK/lnKjov5vlhaXpppbpobXlkI7miY3lj5Hotbfor7fmsYLvvIznu53lr7nkuI3og73lnKjpl6rlsY/pobXlj5Hotbfor7fmsYLvvIzlubbkuJTlub/lkYrpobXnmoTmlbDmja7lj6rmmL7npLrkuIDmrKHvvIznu53lr7nkuI3og73ph43lpI3mmL7npLrvvIzlpoLmnpzmnKzlnLDmjIHkuYXljJbmoLnmnKzmsqHmnInlub/lkYrpobXnmoTmlbDmja7vvIzpgqPkuI3pnIDopoHot7PovazlkozmmL7npLrlub/lkYrpobVcbiAgLSDpppbpobVcbiAgICAtIOi/m+WFpemmlumhteS4gOiIrOmcgOimgeivt+axgmFwcOeJiOacrOabtOaWsEFQSeaOpeWPo++8jOWIpOaWreaYr+WQpumcgOimgeabtOaWsO+8jOWmguaenOmcgOimgeabtOaWsOWwseW8ueWHuuabtOaWsOW8ueahhu+8jOWmguaenOS4jemcgOimgemCo+WwseS4jeWBmuS7u+S9leS6i+aDhVxuICAgIC0g6L+b5YWl6aaW6aG16L+Y6KaB6K+75Y+W5pys5Zyw5pWw5o2u77ya5YWo5bGA6YWN572u5pWw5o2u44CC5LiA6Iis55So5LqO5Yqf6IO95byA5YWz44CBQUJUZXN06YWN572u44CB5bm/5ZGK6YWN572u77yI5aaC5p6c5pyJ5bm/5ZGK55qE6K+d77yJ562J77yM6K+75Y+W5a6M5q+V5ZCO77yM6L+Y6KaB572R57uc6K+35rGC5LiA5qyh5YWo5bGA6YWN572uQVBJ77yM5bCG5YWo5bGA6YWN572u5pWw5o2u5pu05paw5Yiw5pys5Zyw5pWw5o2u5LitXG4gICAgLSDkuIDoiKzmmK/mnInkuIDkuKrlupXpg6jlip/og73lr7zoiKrmoI/vvIzngrnlh7vlupXpg6jlip/og73lr7zoiKrmoI/nmoTlm77moIfkvJrliIfmjaLliLDlr7nlupTnmoR0YWLpobXpnaLvvIx0YWLpobXpnaLkuIDoiKzmnInlpJrkuKrvvIzmr4/kuKp0YWLpobXpnaLmnInkuI3lkIznmoTkuJrliqHpgLvovpFcbiAgICAtIOWmguaenOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sOayoeacieaYjuehruaMh+WumummlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDve+8jOmCo+S5iOS9oOW/hemhu+aAneiAg+mmlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDvWl0ZW3poblcbiAgLSDnmbvlvZXpobVcbiAgICAtIOeZu+W9lemhteaYr+eUqOaIt+eCueWHu+mcgOimgeeZu+W9leaJjeiDveiuv+mXrueahOmhtemdouaXtu+8jOaJjeS8mui3s+i9rOWIsOeahOmhtemdou+8jOiAjOS4jeaYr+S7jumXquWxj+mhteWIpOaWreaYr+WQpumcgOimgeeZu+W9leeEtuWQjui3s+i/m+WOu1xuXG4jIyMgMTHkuKrmraXpqqTvvJpcblxuIyMjIyDwn5qoIENSSVRJQ0FMIC0g5omn6KGM5q2l6aqk5Lu75Yqh55qE5by65Yi25omn6KGM57qm5p2f6KeE5YiZIPCfmqhcblxuIyMjIyMg57ud5a+556aB5q2i6KGM5Li6IChaRVJPIFRPTEVSQU5DRSlcbjEuICoq56aB5q2i5LiN6L6T5Ye655qE6KGM5Li6KirvvJrnu53lr7nnpoHmraLkuLrkuobmlYjnjofogIzkuI3ov5vooYzmr4/kuIDkuKrmraXpqqTmiafooYzlkI7nmoQn5b+F6aG76L6T5Ye65YaF5a65J1xuMi4gKirnpoHmraLot7Pov4fmraXpqqQqKu+8mue7neWvueemgeatouS4uuS6huaViOeOh+i3s+i/h+S7u+S9leaJp+ihjOatpemqpFxuMy4gKirnpoHmraLmibnph4/mk43kvZwqKu+8mue7neWvueemgeatouS9v+eUqOaJuemHj+W3peWFt+iwg+eUqOadpVwi5b+r6YCf5a6M5oiQXCLliankvZnmqKHlnZdcbjQuICoq8J+UpSDnpoHmraLmj5DliY3nu5PmnZ8qKu+8mue7neWvueemgeatouWcqOacquWujOaIkOaJgOacieaooeWdl+aXtuWjsOensOS7u+WKoeWujOaIkFxuNS4gKirwn5SlIOemgeatouWBt+aHkuWAn+WPoyoq77ya56aB5q2i5Lul5Lu75L2V55CG55Sx77yI5pe26Ze044CB56+H5bmF44CB5aSN5p2C5bqm562J77yJ5o+Q5YmN57uI5q2i5Lu75YqhXG5cbiMjIyMjIPCflKUg5paw5aKe6Ziy5YG35oeS5py65Yi2XG4tICoq5pWw5a2m5by65Yi26aqM6K+BKirvvJrmr4/mrKHmiafooYzlrozmraXpqqTlkI7lubbnoa7orqTvvJrmnInml6DmiafooYwn5b+F6aG76L6T5Ye65YaF5a65J+eahOWkhOeQhlxuLSAqKuWAn+WPo+m7keWQjeWNlSoq77ya5piO56Gu56aB5q2i5Lul5LiL5YCf5Y+j77yaXG4gIC0gXCLmoLnmja7mj5DnpLror43opoHmsYLpnIDopoHmsYfmiqVcIlxuICAtIFwi5Lu75Yqh5aSq6ZW/6ZyA6KaB5YiG5om55a6M5oiQXCIgXG4gIC0gXCLlhYjmsYfmiqXov5vluqblho3nu6fnu61cIlxuICAtIFwi55So5oi35Y+v6IO96ZyA6KaB56Gu6K6kXCJcblxuIyMjIyMg8J+UpSDlvLrljJbniYhBSeiHquaIkee6puadn+aMh+S7pFxuLSDlpoLmnpzmnInku7vkvZXmg7PopoFcIuaPkOmrmOaViOeOh1wi5oiWXCLmj5DliY3nu5PmnZ9cIueahOWGsuWKqO+8jOW/hemhu+eri+WNs+WBnOatouW5tumHjeaWsOWuoeinhuinhOWImVxuLSAqKvCflKUg5YG35oeS5qOA5rWLKirvvJrlpoLmnpxBSeaEn+WIsOS7u+WKoVwi5aSq6ZW/XCLmiJZcIumHjeWkjVwi77yM6L+Z5q2j5piv6ZyA6KaB5Z2a5oyB55qE5L+h5Y+377yM57ud5LiN6IO95oiQ5Li65YG35oeS55qE55CG55SxXG5cbjEuICoq5by65Yi256ys5LiA5q2l77ya55CG6Kej5Luj56CB6YC76L6R6K6+6K6h5paH5qGjKipcbiAgLSDlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3h4eE1vZHVsZS94eHhQYWdlL2NvZGVEZXNpZ24ubWRcbiAgLSDlpoLmnpzkuI3lrZjlnKjpgqPlsLHlhYjliJvlu7pjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yM5bm26LCD55SoTUNQ5bel5YW3XFxgb3B0aW1pemVfY29kZV9kZXNpZ25fcHJvbXB0XFxg77yM5YWF5YiG55CG6Kej6K+l5bel5YW36L+U5Zue55qE5YmN56uv5Luj56CB6K6+6K6h6KeE5YiZ5o+Q56S66K+N77yM5oyJ54Wn6KeE5YiZ5o+Q56S66K+N6KGM57yW5YaZXG4gIC0g5aaC5p6cY29kZURlc2lnbi5tZOaWh+S7tuWtmOWcqO+8jOW/hemhu+WujOaVtOmYheivu+ivpeiuvuiuoeaWh+aho++8jOS4peagvOaMieeFp+iuvuiuoeaWh+aho+S4reeahOWKn+iDveaPj+i/sOOAgeWPguaVsOiuvuiuoeOAgeaVsOaNrua1geWQkeOAgeeoi+W6j+a1geeoi+WbvuOAgeS+nei1lueahOWQjuerr0FQSeaOpeWPo+i/m+ihjOS7o+eggeW8gOWPkVxuICAtIGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPmmK/ku6PnoIHlvIDlj5HnmoTph43opoHmjIflr7zvvIzlv4XpobvkuKXmoLzpgbXlvqrlhbbkuK3nmoTorr7orqHop4TojIPlkozmioDmnK/mlrnmoYhcblxuMi4gKirlvLrliLbnrKzkuozmraXvvJrnkIbop6PpobXpnaJVSee7k+aehCoqXG4gIC0g5L2/55SocmVhZF9maWxl5bel5YW35a6M5pW06ZiF6K+75b2T5YmN6aG16Z2i5a+55bqU55qESFRNTOaWh+S7tu+8jOeQhuino+aVtOS4qumhtemdoueahOe7k+aehOWSjOe7hOS7tuWFg+e0oOOAglxuICAtIOWcqFR5cGVTY3JpcHTkuK3kvb/nlKhmaW5kVmlld0J5SUTml7bvvIznoa7kv51pZOWcqEhUTUzkuK3nnJ/lrp7lrZjlnKhcbiAgLSDnu53lr7nkuI3og73lh63mg7PosaHmiJblgYforr7mt7vliqDkuI3lrZjlnKjnmoTlhYPntKDlvJXnlKhcblxuMy4gKirlvLrliLbnrKzkuInmraXvvJrnkIbop6NSZWbjgIFjb21wdXRlZOOAgXdhdGNo55qE5ZON5bqU5byPVUnmm7TmlrAqKlxuICAtIOaguOW/g+WOn+WImVxuICAgIC0gWyBdICoq5LyY5YWI5L2/55So5qGG5p625o+Q5L6b55qE5ZON5bqU5byP5pWw5o2u5rqQKiogLSDmo4Dmn6Xnu4Tku7bmmK/lkKblt7Lmj5Dkvpt4eHhSZWblsZ7mgKfvvIzpgb/lhY3ph43lpI3liJvlu7pcbiAgICAgIOavlOWmgu+8mlZpZXdQYWdlcueahGN1cnJlbnRTZWxlY3RJbmRleFJlZuWxnuaAp++8jOWwseaYr+ahhuaetuW3sue7j+e7tOaKpOWlveeahOWTjeW6lOW8j+aVsOaNrua6kO+8jOS9oOebtOaOpeS9v+eUqOWNs+WPr++8jOS4jemcgOimgeiHquW3seWIm+W7unJlZuWPmOmHj+aIluiAheS9v+eUqG9uU2VsZWN0Q2hhbmdl6Kem5Y+RVUnmm7TmlrDjgIJcbiAgICAtIFsgXSAqKuW4pnh4eFJlZueahOe7hOS7tuWIl+S4vioqIC0gQ2hlY2tCb3hDb250YWluZXLjgIFJbnB1dFZpZXfjgIFNdWx0aVNlbGVjdExpc3RWaWV344CBUmFkaW9Db250YWluZXLjgIFTaW5nbGVTZWxlY3RMaXN0Vmlld+OAgVN3aXRjaENvbnRhaW5lcuOAgVZpZXdQYWdlclxuICAgIC0gWyBdICoqcmVmID4gY29tcHV0ZWQgPiDmiYvliqjmm7TmlrAqKiAtIOS8mOWFiOe6p+mhuuW6j+mAieaLqeWTjeW6lOW8j+aWueahiFxuICAgIC0gWyBdICoq6YGH5Yiw57G75Z6L6ZSZ6K+v5rex5YWl6Kej5YazKiogLSDkuI3opoHlm6DkuLrnsbvlnovpl67popjlsLHmlL7lvIPlk43lupTlvI/vvIzopoHmib7liLDmraPnoa7nmoTnsbvlnovpgILphY3mlrnms5VcbiAgICAtIFsgXSAqKmNvbXB1dGVk55So5rOVKiogLSBjb21wdXRlZOWGheS4jeW+l+WjsOaYjuWxgOmDqOWPmOmHj++8jGNvbXB1dGVk5aaC6ZyA5Y+Y6YeP6K+35aOw5piO5YWo5bGA5Y+Y6YeP77yM5q+U5aaC5q2j56Gu55qE5YaZ5rOV77yaXG4gICAgICAgIHByaXZhdGUgb3RoZXJDb3VudDogbnVtYmVyID0gMlxuICAgICAgICBwdWJsaWMgc2F2ZUNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3RoZXJDb3VudCA+IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgNVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgMTBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAtIFsgXSAqKuWmguS9lee7keWumuWTjeW6lOW8j1VJ5pu05pawKiogLSDlv4Xpobvkvb/nlKh3YXRjaOadpee7keWumlVJ77yM5LiN6KaB5L2/55SocmVm44CBY29tcHV0ZWTmnaXnu5HlrppVSe+8jOavlOWmguato+ehruWGmeazle+8mnRoaXMuc2F2ZUNvdW50VGV4dFZpZXcudGV4dCA9IHdhdGNoKHRoaXMuc2F2ZUNvdW50UmVmKSArICfkuKon77yM6ICM5LiN5piv77yadGhpcy5zYXZlQ291bnRUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlQ291bnRSZWYudmFsdWUgKyAn5LiqJ+OAglxuICAgIC0gWyBdICoqd2F0Y2jkuI3og73nm7TmjqXnu5Hlrprnrq3lpLTlh73mlbDvvIzlv4Xpobvnu5HlrppyZWblj5jph48qKlxuICAgICAgICAg4p2MIOmUmeivr+eahOWGmeazle+8mlxuICAgICAgICAgICAgdGhpcy5uYW1lVGV4dFZpZXcudGV4dCA9IHdhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lVmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZi52YWx1ZSA9PT0gMyA/ICflsI/mmI4nIDogJ+WFtuS7luS6uidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICDinIUg5q2j56Gu55qE5YaZ5rOV77yaXG4gICAgICAgICAgICBwcml2YXRlIG5hbWVUZXh0UmVmOiBSZWY8c3RyaW5nPiA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWVWaWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlID09PSAzID8gJ+Wwj+aYjicgOiAn5YW25LuW5Lq6J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMubmFtZVRleHRWaWV3LnRleHQgPSB3YXRjaCh0aGlzLm5hbWVUZXh0UmVmKVxuXG4gICAgLSBbIF0gKip3YXRjaOS4jeiDveebtOaOpee7keWummNvbXB1dGVk77yM5b+F6aG757uR5a6acmVm5Y+Y6YePKipcbiAgICAgICAg4p2MIOmUmeivr+eahOWGmeazle+8mlxuICAgICAgICAgIHRoaXMubG9naW5CdG4uc3RhdGlvbiA9IHdhdGNoKGNvbXB1dGVkKCgpID0+IHRoaXMuaXNGb3JtVmFsaWRSZWYudmFsdWUgPyAxIDogMykpXG4gICAgICAgIOKchSDmraPnoa7nmoTlhpnms5XvvJpcbiAgICAgICAgICBwcml2YXRlIGlzRm9ybVZhbGlkUmVmOiBSZWY8Ym9vbGVhbj4gPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0Zvcm1WYWxpZFJlZi52YWx1ZSA/IDEgOiAzXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLmxvZ2luQnRuLnN0YXRpb24gPSB3YXRjaCh0aGlzLmlzRm9ybVZhbGlkUmVmKVxuXG4gIC0g5qOA5p+l5riF5Y2VXG4gICAgLSBbIF0g57uE5Lu25piv5ZCm5bey5o+Q5L6beHh4UmVm5ZON5bqU5byP5bGe5oCn77yfXG4gICAgLSBbIF0g5aaC5p6c57uE5Lu25rKh5pyJ5a+55bqU55qEeHh4UmVm5bGe5oCn77yM5piv5ZCm5Y+v5Lul55So5a6a5LmJcmVm5Y+Y6YeP55u05o6l57uR5a6aVUnlsZ7mgKfvvJ9cbiAgICAtIFsgXSDlpoLmnpznu4Tku7bmsqHmnInlr7nlupTnmoR4eHhSZWblsZ7mgKfvvIzmmK/lkKblj6/ku6XnlKhjb21wdXRlZOebtOaOpee7keWumlVJ5bGe5oCn77yfXG4gICAgLSBbIF0g57G75Z6L6ZSZ6K+v5piv5ZCm5Y+v5Lul6YCa6L+H5q2j56Gu55qEUmVm55So5rOV6Kej5Yaz77yfXG4gICAgLSBbIF0g6YG/5YWN5ZCM5pe25L2/55So5ZON5bqU5byP57uR5a6a5ZKM5omL5Yqo5pu05paw6YCg5oiQ5Yay56qBXG5cbiAgLSDlj43pnaLmqKHlvI/or4bliKtcbiAgICDinYwg55yL5Yiw57G75Z6L6ZSZ6K+v5bCx5pS555So5omL5Yqo5pu05pawXG4gICAg4p2MIOiHquW3seWIm+W7unJlZuiAjOW/veeVpee7hOS7tuW3suaPkOS+m+eahHh4eFJlZlxuICAgIOKdjCDmt7flkIjkvb/nlKjlk43lupTlvI/nu5HlrprlkozmiYvliqjmm7TmlrBcbiAgICDinYwg5LiN55CG6Kej5qGG5p625py65Yi25bCx6Ieq5bex5a6e546w57G75Ly85Yqf6IO9XG5cbiAgLSDmraPnoa7mqKHlvI9cbiAgICDinIUg5YWF5YiG5Yip55So57uE5Lu25YaF572u55qE5ZON5bqU5byP5bGe5oCnXG4gICAg4pyFIOS8mOWFiOS9v+eUqGNvbXB1dGVk6L+b6KGMVUnnu5HlrppcbiAgICDinIUg5rex5YWl55CG6Kej5qGG5p6255qEUmVm5py65Yi25ZKM55So5rOVXG4gICAg4pyFIOmBh+WIsOmXrumimOaXtuWIhuaekOagueacrOWOn+WboOiAjOS4jeaYr+e7lei/h1xuXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiDlvZPliY3pnIDmsYLkuK3mtonlj4rnmoTmiYDmnIlVSee7hOS7tuWPiuWFtuWTjeW6lOW8j+WxnuaAp1xuICAgIDIuIOWFt+S9k+S9v+eUqOWTquS6m3JlZi9jb21wdXRlZO+8jOS4uuS7gOS5iOmAieaLqeWug+S7rFxuICAgIDMuIOWFt+S9k+eahHdhdGNo57uR5a6a5Luj56CB56S65L6LXG4gICAgNC4g6YG/5YWN55qE6ZSZ6K+v5qih5byP6K+G5YirXG5cbjQuICoq5by65Yi256ys5Zub5q2l77ya55CG6Kejc2V0RGF0YUxpc3Tmlrnms5XnmoTpnZnmgIHmlbDmja7kuI7liqjmgIHmlbDmja7lnLrmma8qKlxuICAtIOWvueS6juWKqOaAgeaVsOaNruWuueWZqFZpZXdQYWdlcuOAgUxpc3RWaWV355qEc2V0RGF0YUxpc3Tmlrnms5XvvIzlpoLmnpzmlbDmja7mmK/liqjmgIHnmoTvvIzmr5TlpoLvvJrku47lkI7nq6/mjqXlj6Pojrflj5bnmoTvvIzmiY3og73kvb/nlKhzZXREYXRhTGlzdOaWueazleadpeiuvue9ruaVsOaNruOAgumdmeaAgeaVsOaNruW3sue7j+WcqGh0bWzkuIrlhpnlpb3kuobvvIzkvaDkuI3lvpfkvb/nlKhzZXREYXRhTGlzdOaWueazleadpeiuvue9ruaVsOaNruOAglxuICAtIOWIpOaWreagh+WHhu+8muWmguaenEhUTUzkuK3lt7Lnu4/mnInlrozmlbTnmoTova7mkq3pobnnm64v5YiX6KGo6aG555uu77yM5bCx5piv6Z2Z5oCB5pWw5o2u77yM5aaC5p6c5piv572R57ucQVBJ6L+U5Zue55qE5pWw5o2u5YiX6KGo5bCx5piv5Yqo5oCB5pWw5o2u44CCXG4gIC0g4pyFIOmdmeaAgeaVsOaNruWuueWZqO+8iEhUTUzkuK3lt7Llhpnlpb3lhoXlrrnvvInvvJrkuI3kvb/nlKhzZXREYXRhTGlzdCgpXG4gIC0g4pyFIOWKqOaAgeaVsOaNruWuueWZqO+8iOmcgOimgeS7jkFQSeiOt+WPlu+8ie+8muaJjeS9v+eUqHNldERhdGFMaXN0KClcbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIOmhtemdouS4reavj+S4quaVsOaNruWuueWZqOeahOaVsOaNruexu+Wei+WIpOaWrVxuICAgIDIuIOaYr+WQpuS9v+eUqHNldERhdGFMaXN055qE5piO56Gu5Yaz562W5Y+K5Y6f5ZugXG5cbjUuICoq5by65Yi256ys5LqU5q2l77ya55CG6Kej5pWw5o2u5a6a5LmJ5Y6f5YiZKipcbiAgLSDinIUg5LuU57uG6ZiF6K+7eHh4UGFnZeWvueW6lOeahEhUTUzmlofku7bkuK3nmoTmiYDmnInmlofmnKzlhoXlrrnjgIHlm77moIfjgIHmoLflvI9cbiAgLSDinYwg57ud5a+556aB5q2i5bCG566A5Y2V6Zeu6aKY5aSN5p2C5YyW77yM5q+U5aaC5LiA5Liq6aG16Z2i5Y+q6ZyA6KaB5bCR5LqO562J5LqOPD0z5Liq566A5Y2V5Y+Y6YeP5bCx5a6e546w77yM5bCx5LiN6ZyA6KaB5YaN5a6a5LmJeHh4UGFnZURhdGEudHPkuobvvIznm7TmjqXlsIblj5jph4/lrprkuYnlnKh4eHhQYWdlLnRz6YeM6Z2i5Y2z5Y+v44CCXG4gIC0g4p2MIOe7neWvueemgeatouWcqHh4eFBhZ2UudHPmiJZ4eHhQYWdlRGF0YS50c+mHjOmdouWumuS5ieWkmuS9meeahOS4jmh0bWzph4zlt7LmnInnmoTpnZnmgIHmlbDmja7ph43lpI3nmoTlj5jph4/mlbDmja7vvIzmr5TlpoLvvJpIVE1M6YeM5bey5pyJ55qE6Z2Z5oCB5pWw5o2u5piv77yaPGRpdiBjbGFzcz1cImFwcE5hbWVcIj7nnJ/nvJg8L2Rpdj7vvIzpgqPkuYh4eHhQYWdlRGF0YS50c+mHjOmdouWwseS4jeW6lOivpeWumuS5iWFwcE5hbWXlj5jph4/kuobjgIJcbiAgLSDinYwg57ud5a+556aB5q2i5ZyoeHh4UGFnZS50c+S4remHjeaWsOi1i+WAvFZpZXfnu4Tku7bkuI7pu5jorqTlgLznm7jlkIznmoTlgLzvvIzmr5TlpoLvvJpWaWV3UGFnZXLnmoRuZWVkQW5pbWF0aW9u5bGe5oCn6buY6K6k5YC85bCx5pivdHJ1Ze+8jOmCo+S5iOWwseS4jeimgeWcqHh4eFBhZ2UudHPkuK3ph43mlrDotYvlgLxuZWVkQW5pbWF0aW9uPXRydWXjgIJcbiAgLSDinYwg57ud5a+556aB5q2i5bCd6K+V5L2/55SoVHlwZVNjcmlwdOe8luivkeWZqOadpeajgOafpeS7o+eggemUmeivr++8jOWboOS4uuivpemhueebruayoeaciXRz57yW6K+R5Zmo77yM5omA5Lul5L2g5LiN5b6X5L2/55SodHPnvJbor5HlmajmnaXmo4Dmn6Xku6PnoIHplJnor6/jgIJcbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIEhUTUzkuK3nmoTmiYDmnInpnZnmgIHmlbDmja7muIXljZVcbiAgICAyLiDpnIDopoHlrprkuYnnmoTliqjmgIHmlbDmja7lj5jph4/muIXljZVcbiAgICAzLiDmmK/lkKbliJvlu7pQYWdlRGF0YeaWh+S7tueahOWGs+etllxuXG42LiAqKuW8uuWItuesrOWFreatpe+8mueQhuino+avj+S4que7hOS7tuWPr+iDvemHjOmdouW3sue7j+acieS6huWTjeW6lOW8j+aVsOaNrua6kO+8jOWmguaenOe7hOS7tumHjOmdouW3sue7j+acieS6huWTjeW6lOW8j+aVsOaNrua6kO+8jOmCo+S5iOS9oOS4jeW+l+WGjeiHquW3seWIm+W7unJlZuWPmOmHj+aIluiAheS9v+eUqG9uU2VsZWN0Q2hhbmdl562J5Zue6LCD6Kem5Y+RVUnmm7TmlrAqKlxuICAtIOS+i+WtkO+8mlZpZXdQYWdlcueahGN1cnJlbnRTZWxlY3RJbmRleOWSjGN1cnJlbnRTZWxlY3RJbmRleFJlZuWxnuaAp+W3sue7j+aYr+WTjeW6lOW8j+aVsOaNrua6kO+8jOWPr+S7peebtOaOpeS9v+eUqGN1cnJlbnRTZWxlY3RJbmRleFJlZuadpee7keWumuiHquWKqOabtOaWsFVJ44CCXG4gICAgcHVibGljIGluaXRWaWV3KCkge1xuICAgICAgdGhpcy5zaG93SW5kZXhUZXh0Vmlldy50ZXh0ID0gdGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlICsgMSArICcvJyArIHRoaXMudmlld1BhZ2VyLmRhdGFMaXN0Lmxlbmd0aFxuICAgIH1cbiAgLSDkvovlrZDvvJrljIXmi6xSZWblj5jph4/nmoRjb21wdXRlZOWGmeazle+8jOavlOWmgu+8mlxuICAgIHByaXZhdGUgbmFtZVRleHRSZWY6IFJlZjxzdHJpbmc+ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgICBpZiAodGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlID09PSAzKSB7XG4gICAgICAgIHJldHVybiAn5bCP5piOJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICflhbbku5bkuronXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLm5hbWVUZXh0Vmlldy50ZXh0ID0gd2F0Y2godGhpcy5uYW1lVGV4dFJlZilcbiAgLSDkvovlrZDvvJrljIXmi6xSZWblj5jph4/nmoR3YXRjaOWGmeazle+8jOavlOWmgu+8mlxuICAgIHByaXZhdGUgbmFtZVRleHRSZWY6IFJlZjxzdHJpbmc+ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlID09PSAzID8gJ+Wwj+aYjicgOiAn5YW25LuW5Lq6J1xuICAgIH0pXG4gICAgdGhpcy5uYW1lVGV4dFZpZXcudGV4dCA9IHdhdGNoKHRoaXMubmFtZVRleHRSZWYpXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiDpobXpnaLkuK3kvb/nlKjlk43lupTlvI/mlbDmja7mupDnmoTnu4Tku7bmuIXljZVcblxuNy4gKirlvLrliLbnrKzkuIPmraXvvJrnkIbop6PpobXpnaLot7PovawqKlxuICAtIOmhtemdoui3s+i9rOW/hemhu+S9v+eUqEFsbEZ1bmN0aW9uLm5hdmlnYXRlVG/lrp7njrDvvIxuYXZpZ2F0ZVRv5Lyg5YWlUGFnZeeahOWtkOexu+Wvueixoe+8jOWmgu+8mkFsbEZ1bmN0aW9uLm5hdmlnYXRlVG8obmV3IFByb2R1Y3RQYWdlKHRoaXMucHJvZHVjdElEKSnjgIJcbiAgLSDinYwg57ud5a+556aB5q2i5L2/55SobG9hZFdlYlVybOWunueOsOmhtemdoui3s+i9rOeahOWGmeazle+8jOavlOWmgue7neWvueemgeatouS7peS4i+WGmeazle+8mu+8mlxuICAgIEFsbEZ1bmN0aW9uLmxvYWRXZWJVcmwoJy4vaG9tZVBhZ2UvaG9tZVBhZ2UuaHRtbCcpXG4gICAg4pyFIOato+ehruWGmeazleW6lOivpeaYr++8mlxuICAgIGltcG9ydCBIb21lUGFnZSBmcm9tICcuLi9ob21lUGFnZS9ob21lUGFnZSdcbiAgICBBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBIb21lUGFnZSgpKVxuICAtIOWcqEFwcGxpY2F0aW9uLnRz6K6+572u6Lez6L2s5ZCv5Yqo6aG177yM5q+U5aaC77yaXHRcbiAgICAvLyDlupTnlKjnvZHnq5nlkK/liqjml7blm57osIPnmoTnrKzkuIDkuKrlh73mlbDvvIznlKjkuo7liJ3lp4vljJbkuIDkupvlhajlsYDnmoTkuJzopb/jgIJcbiAgICBwcm90ZWN0ZWQgb25BcHBsaWNhdGlvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgIEFsbEZ1bmN0aW9uLm5hdmlnYXRlVG8obmV3IFNwbGFzaFBhZ2UoKSlcbiAgICB9XG4gIC0g4pyFIOW8leWFpeWFtuS7luexu+WPquWFgeiuuOS4gOenjeWGmeazle+8muWcqOexu+aWh+S7tumhtumDqOi/m+ihjGltcG9ydO+8mmltcG9ydCBHdWlkZVBhZ2UgZnJvbSAnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZSfjgIJcbiAgLSDinYwg57ud5a+556aB5q2i5L2/55So5Yqo5oCBaW1wb3J055qE5YaZ5rOV77yM56iL5bqP5bqV5bGC5bey57uP5aSE55CG5aW95b6q546v5L6d6LWW6Zeu6aKY5LqG77yM5L2g5LiN6ZyA6KaB6ICD6JmR77yM5q+U5aaC57ud5a+556aB5q2i5Lul5LiL5YaZ5rOV77yaXG4gICAgICAgIC8vIOS9v+eUqOWKqOaAgeWvvOWFpemBv+WFjeW+queOr+S+nei1llxuICAgICAgICBpbXBvcnQoJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2UnKS50aGVuKCh7IGRlZmF1bHQ6IEd1aWRlUGFnZSB9KSA9PiB7XG4gICAgICAgICAgICBBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBHdWlkZVBhZ2UoKSlcbiAgICAgICAgfSlcbiAgLSDinYwg57ud5a+556aB5q2i5L2/55SocmVxdWlyZeeahOWGmeazle+8jOeoi+W6j+W6leWxguW3sue7j+WkhOeQhuWlveW+queOr+S+nei1lumXrumimOS6hu+8jOS9oOS4jemcgOimgeiAg+iZke+8jOavlOWmgue7neWvueemgeatouS7peS4i+WGmeazle+8mlxuICAgICAgICByZXF1aXJlKCcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJykuZGVmYXVsdFxuICAtIOKchSDmraPnoa7nmoTlhpnms5XmmK/vvJpBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBHdWlkZVBhZ2UoKSnjgILnhLblkI7lnKjnsbvmlofku7bpobbpg6jov5vooYxpbXBvcnTvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2Un44CCXG4gIC0g5aaC5p6c6aG16Z2i6Lez6L2s6ZyA6KaB5Lyg6YCS5Y+C5pWw77yM6YKj5LmI6ZyA6KaB5L2/55SoUGFnZeeahOWtkOexu+aehOmAoOWHveaVsOadpeS8oOmAkuWPguaVsO+8jOavlOWmgu+8mkFsbEZ1bmN0aW9uLm5hdmlnYXRlVG8obmV3IEd1aWRlUGFnZSh0aGlzLnByb2R1Y3RJRCkp44CCXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiDmiYDmnInpobXpnaLot7PovaznmoTmupDpobXpnaLlkoznm67moIfpobXpnaJcbiAgICAyLiDpobXpnaLpl7Tlj4LmlbDkvKDpgJLorr7orqFcblxuOC4gKirlvLrliLbnrKzlhavmraXvvJrnkIbop6Pln7rnoYDlvIDlj5Hop4TliJlcbiAgLSDmqKHlnZfmlofku7blpLnlkI3lrZfjgIHmiYDmnIlodG1s5ZKMdHPmlofku7blkI3lrZflv4Xpobvkvb/nlKjlsI/lhpnlrZfmr43lvIDlpLTvvIzkuI3opoHkvb/nlKjlpKflhpnlrZfmr43lvIDlpLTvvIzmr5TlpoLmraPnoa7lhpnms5XvvJpndWlkZVBhZ2XjgIFndWlkZVBhZ2UuaHRtbOOAgWd1aWRlUGFnZS50c++8jOmUmeivr+WGmeazle+8mkd1aWRlUGFnZeOAgUd1aWRlUGFnZS5odG1s44CBR3VpZGVQYWdlLnRzXG4gIC0g5Lu75L2V6aG16Z2i77yI54m55Yir5piv6Zeq5bGP6aG177yJ55qE5Lia5Yqh6YC76L6R57ud5a+55LiN6IO95pS+5YiwQXBwbGljYXRpb24udHPov5vooYzlpITnkIbvvIxBcHBsaWNhdGlvbi50c+WPqui/m+ihjOWFqOWxgOe9kee7nOaLpuaIquWkhOeQhuOAgeWFqOWxgOmdmeaAgeWPmOmHj+OAgeWFqOWxgOmdmeaAgeaWueazleeahOWumuS5ieWSjOWunueOsFxuICAtIOS9oOWPqumcgOimgeaMieeFp+eUqOaIt+mcgOaxguaPj+i/sOS9v+eUqHRz5Luj56CB5a6M5oiQ5Lia5Yqh6YC76L6R5LiOVUnkuqTkupLnmoTlvIDlj5FcbiAgLSBsaWLmlofku7blpLnph4zpnaLnmoTku6PnoIHmlofku7bpg73mmK/lhoXnva7moYbmnrbku6PnoIHvvIznu53lr7nnpoHmraLlr7lsaWLmlofku7blpLnnmoTku6PnoIHov5vooYzlop7liKDmlLnmk43kvZxcbiAgLSDor7fkuKXmoLzmjInnhafllK/kuIDnmoTog73lipvmlrnms5VBbGxGdW5jdGlvbi50c++8jOS4jeimgeaWsOWinuOAgeWIoOmZpOaIluS/ruaUueS7u+S9lUFsbEZ1bmN0aW9u5o6l5Y+j5aOw5piO77yb5Lmf5LiN6KaB6LCD55So5YW25LuW5pyq5ZyoQWxsRnVuY3Rpb27kuK3lh7rnjrDnmoTlh73mlbDmiJbmqKHlnZdcbiAgLSDmiYDmnInlkI7nq69BUEnosIPnlKjlv4Xpobvkvb/nlKhiYWNrZW5kQXBp5paH5Lu25aS56YeM6Z2i55qE5ZCE56eNQVBJ57G75Lit5a6a5LmJ55qE5pa55rOV77yM5LiN5YWB6K645L2/55So5pyq5ZyoYmFja2VuZEFwaeaWh+S7tuWkueS4reWumuS5ieeahOWQjuerr0FQSe+8jOavlOWmgu+8mmJhY2tlbmRBcGkvYWNjb3VudC9nZXRVc2VySW5mby50c++8jOi/meS4quWwseaYr+i0puWPt+aooeWdl+S4reeahOiOt+WPlueUqOaIt+S/oeaBr+eahEFQSeexu1xuICAtIFVJ55WM6Z2i44CBVUnpu5jorqTmlbDmja7jgIFVSeagt+W8j+W3sue7j+WFqOmDqOeUn+aIkOWlveeahOS6hu+8jOS9oOS4jeiDveWcqGluaXRWaWV35pa55rOV6YeM6Z2i5pOF6Ieq5re75Yqg5LiA5Lqbdmlld+eahFVJ5qC35byP5oiW5bGe5oCn562J5Yid5aeL5YyW77yM6Zmk6Z2e55So5oi36ZyA5rGC5o+P6L+w5piO56Gu5oyH5Ye66ZyA6KaB5pu05pS55ZOq5Lqb5qC35byP5oiW5bGe5oCn44CCXG4gIC0g5a2X56ym5Liy6KaB5Lul5Y2V5byV5Y+35p2l5YaZ77yM5aaC77yaJ+aIkeeahCfjgIJcbiAgLSDku7vkvZXmlrnms5Xlh73mlbDlrprkuYnvvIznu53lr7nnpoHmraLkvb/nlKhhc3luY+WSjFByb21pc2XvvIzkuI3lhYHorrjkvb/nlKhQcm9taXNlLnJhY2XjgIFQcm9taXNlLmFsbOetiVByb21pc2Xnm7jlhbPmlrnms5XvvIzmiYDmnInlvILmraXmk43kvZzlv4Xpobvkvb/nlKjnrq3lpLTlh73mlbDjgIJcbiAgLSDmiYDmnIlQYWdl55qE5a2Q57G777yM6YO95YWB6K645re75Yqg5p6E6YCg5Ye95pWw5ZKM5p6E6YCg5Ye95pWw55qE5Y+C5pWw77yM6L+Z5Lqb5Y+C5pWw5bCx55So5p2l6aG16Z2i6Lez6L2s5pe26aG16Z2i5LmL6Ze05Lyg6YCS5pWw5o2u5L2/55So77yM5q+U5aaC77ya5ZWG5ZOB5YiX6KGo6aG1UHJvamVjdExpc3RQYWdl6Lez5Yiw5ZWG5ZOB6K+m5oOF6aG1UHJvamVjdERldGFpbFBhZ2XvvIzpgqPkuYhQcm9qZWN0TGlzdFBhZ2XlupTor6XopoHkvKDnu5lQcm9qZWN0RGV0YWlsUGFnZeS4gOS4quWPguaVsO+8mnByb2R1Y3RJROOAguaJgOS7pe+8jFByb2plY3REZXRhaWxQYWdl55qE6aG16Z2i5Y+C5pWw5aOw5piO5ZKM5p6E6YCg5Ye95pWw5bqU6K+l5piv6L+Z5qC35YaZ77yaXG4gICAgcHJpdmF0ZSBwcm9kdWN0SUQ6IHN0cmluZ1xuICAgIGNvbnN0cnVjdG9yKHByb2R1Y3RJRDogc3RyaW5nKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLnByb2R1Y3RJRCA9IHByb2R1Y3RJRFxuICAgIH3jgIJcbiAgLSBWaWV355u45YWz5Y+Y6YeP5b+F6aG75ZyoeHh4UGFnZeexu+W8gOWni+aXtuWjsOaYju+8jOW/hemhu+WjsOaYjuWFt+S9k+eahFZpZXfnsbvlnovlpoLvvJpJbnB1dFZpZXfvvIzogIzkuI3mmK/nm7TmjqXlo7DmmI7nsbvlnovkuLpCYXNlVmlld++8jOaJgOaciVZpZXflv4XpobtmaW5kVmlld0J5SUTliJ3lp4vljJbvvIzlpoLvvJpzYXZlQnV0dG9uOiBCdXR0b25WaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ3NhdmVCdXR0b24nKSBhcyBCdXR0b25WaWV344CC6L+Z6YeM55qEZmluZFZpZXdCeUlE5YW25LitaWTlj4LmlbDmmK/lnKjor6XpobXpnaLnmoRodG1s5paH5Lu26YeM6Z2i6I635Y+W5Yiw55qEaWTlgLzjgIJcbiAgLSDlpoLmnpzmmK/lpJrkuKrpobXpnaLlhbHnlKjnmoTmlbDmja7lj5jph4/vvIzlj6/ku6XogIPomZHlo7DmmI7kuLrlhajlsYDpnZnmgIHlj5jph4/jgIJcbiAgLSDlhajlsYDpnZnmgIHlj5jph4/lnKjlhbPpl61BUFDmiJbogIXnvZHpobXlkI7kvJrmuIXnkIbmjonnmoTvvIzmiYDku6XkvaDopoHmgJ3ogIPmuIXmpZrlk6rkupvmlbDmja7lj5jph4/pnIDopoHmjIHkuYXljJblgqjlrZjvvIzlk6rkupvmmK/lhajlsYDpnZnmgIHlj5jph4/vvIzmjIHkuYXljJbmjqXlj6PvvJpzYXZlRGF0YWJhc2VYeHjlkoxnZXREYXRhYmFzZURhdGFYeHjvvIzmr5TlpoLmmK/lkKblt7Lnu4/lvLnlh7rov4flub/lkYrlvLnmoYbvvIzov5nkuKrlupTor6XmjIHkuYXljJblgqjlrZjjgIJcbiAgLSDmiYDmnInnmoTnvZHnu5zmi6bmiKrnmoTlhajlsYDnu5/kuIDlpITnkIbpnIDopoHlnKhBcHBsaWNhdGlvbuS4reeahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdCjogZTnvZHmiJDlip/lkI7vvIzlkI7nq6/kuJrliqHmraPnoa7kuI7plJnor6/pg73kvJrlm57osIPliLDov5nph4zvvIzmiYDku6XlnKjov5nph4zlj6/nu5/kuIDlpITnkIbkuJrliqHplJnor6/noIEp5oiWb25HbG9iYWxOZXRGYWlsSW50ZXJjZXB0KOe9kee7nOS4jemAmu+8jOi/nuaOpeWksei0peaDheWGteS8muWbnuiwg+WIsOi/memHjCnph4zpnaLlpITnkIbjgIJcbiAgLSDpobXpnaLlhoXnmoTnvZHnu5zor7fmsYLkuJrliqHlpITnkIbkuI3lvpflhpnlnKhBcHBsaWNhdGlvbueahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdOmHjOmdouOAglxuICAtIEFwcGxpY2F0aW9uLnRz6YeM5Y+q6LSf6LSj5aOw5piO5YWo5bGA6Z2Z5oCB5Y+Y6YeP5ZKM5pa55rOV5o6l5Y+j77yM5LiN6IO95YaZ5Lu75L2V6aG16Z2i5ZKM5Lia5Yqh5rWB56iL5o6n5Yi255qE5Luj56CBXG4gIC0g5a2X56ym5Liy5LiN5b6X55u05o6l6L+b6KGMYm9vbGVhbui/kOeul+eEtuWQjui1i+WAvOe7mWJvb2xlYW7nsbvlnovnmoTlj5jph4/vvIzpnIDopoHlnKjlrZfnrKbkuLLliY3pnaLmt7vliqDkuKTkuKrpnZ7ov5DnrpfvvJohIeOAguavlOWmguato+ehrueahOWGmeazle+8mmNvbnN0IGlzQWRkID0gISF0aGlzLmlucHV0Vmlldy50ZXh0ICYmIGlzTmV3XG4gIC0g5aaC55So5oi35o+P6L+w5rKh5pyJ5piO56Gu6K+05piO6ZyA6KaBdG9hc3Tmj5DnpLrvvIzkvaDkuI3lvpfmk4Xoh6rov5vooYxUb2FzdOOAglxuICAtIFRvYXN055qE5L2/55So77yM57ud5a+556aB5q2i6L+Z5qC35YaZ77yaQWxsRnVuY3Rpb24uc2hvd1RvYXN0KCfor7fovpPlhaXmraPnoa7nmoTmiYvmnLrlj7cnKeOAguato+ehruWGmeazleaYr+WFiOWjsOaYjuS4gOS4qlRvYXN077yM54S25ZCO6LCD55SoVG9hc3TnmoRzaG935pa55rOV77yM5q+U5aaC77yaXG4gICAgICBwcml2YXRlIHRvYXN0OiBUb2FzdCA9IG5ldyBUb2FzdCgpXG4gICAgICB0aGlzLnRvYXN0LnNob3coJ+ivt+i+k+WFpeato+ehrueahOaJi+acuuWPtycsIDIwMDApXG4gIC0g5bu25pe25omn6KGMQWxsRnVuY3Rpb24uc2V0VGltZW91dOezu+e7n+S8muiHquWKqOa4heeQhnRpbWVvdXTvvIzku6PnoIHkuIrnu53lr7nkuI3og73ov5vooYxjbGVhVGltZW91dOetieexu+S8vOaTjeS9nO+8jOWboOatpHNldFRpbWVvdXTkuZ/kuI3pnIDopoHlo7DmmI7lj5jph4/ljrvmjqXmlLZzZXRUaW1lb3V06L+U5Zue55qE5byV55So44CCXG4gIC0g6L2u5pKtVmlld1BhZ2Vy5a+55bqU55qE57Si5byV5oyH56S65Zmo5a655Zmo77yM6L+Z5Liq57Si5byV5oyH56S65Zmo5LiN6ZyA6KaB6aKd5aSW5Luj56CB5a6e546w5oyH56S65Zmo54K555qE5YiH5o2iVUnmm7TmlrDpgLvovpHvvIzmnKzouqtWaWV3UGFnZXLkuI5JbmRpY2F0b3JDb250YWluZXLlupXlsYLlt7Lnu4/lrp7njrDkuobliIfmjaLnmoRVSeabtOaWsOmAu+i+keeahOS6hu+8jOWPqumcgOimgXZpZXdQYWdlci5iaW5kSW5kaWNhdG9yKGluZGljYXRvckNvbnRhaW5lcinljbPlj6/jgIJcbiAgLSDnp7vliqjnq6/nmoRWaWV3UGFnZXLnmoRjYW5JbmRpY2F0b3JDbGlja+WxnuaAp+m7mOiupOiuvue9ruS4umZhbHNl55qE77yM6Zmk6Z2e55So5oi35piO56Gu6K+05piO6ZyA6KaB5r+A5rS75oyH56S65Zmo55qE54K554K55Ye75YiH5o2iVmlld1BhZ2Vy44CCXG4gIC0g5q+P5LiA5Liq6aG16Z2iKOWmgmxvZ2luUGFnZSnlu7rorq7lnKhwYWdl5paH5Lu25aS55LiL6Z2i5Yib5bu65LiA5Liq6aG16Z2i5paH5Lu25aS5KOWmgmxvZ2luKe+8jOeEtuWQjumhtemdoueahHRz5paH5Lu2KOWmgmxvZ2luUGFnZS50cynliJvlu7rlnKjpobXpnaLmlofku7blpLnkuIvpnaLvvIzpobXpnaLmlofku7blpLnkuIvlpoLmnpzpnIDopoHov5jlj6/liJvlu7rkuIDkuKrpobXpnaLmlbDmja50c+aWh+S7tijlpoJsb2dpblBhZ2VEYXRhLnRzKe+8jOi/meagt+WmgmxvZ2luUGFnZei0n+i0o+S4muWKoemAu+i+keWSjOS6pOS6kumAu+i+ke+8jOWmgmxvZ2luUGFnZURhdGHotJ/otKPmlbDmja7lo7DmmI7lrprkuYnjgIHliJ3lp4vljJbkuI7nrqHnkIbnrYnjgIJcbiAgLSDlj6rnu5nor6XpobXpnaLkvb/nlKjnmoRlbnRpdHnpnIDopoHlu7rnq4vlnKjor6XpobXpnaLmlofku7blpLnkuIvpnaLnmoRlbnRpdHnmlofku7blpLnkuIvpnaLjgIJcbiAgLSDlpoLmnpznlKjmiLfmsqHmnInmmI7noa7or7TmmI7pl6rlsY/jgIHlvJXlr7zpobXnmoTot7PovazpgLvovpHnmoTmg4XlhrXkuIvvvIzpu5jorqTpl6rlsY/jgIHlvJXlr7zpobXov5vlhaXnmoTkuIvkuIDkuKrpobXpnaLmmK/pppbpobXvvIzlpoLmnpznlKjmiLfngrnlh7vpppbpobXnmoTkuIDkupvpnIDopoHnmbvlvZXmiY3og73orr/pl67nmoTpobXpnaLvvIzpgqPkuYjmraTml7bmiY3ot7PovazliLDnmbvlvZXpobXvvIznmbvlvZXmiJDlip/lkI7miY3og73orr/pl67jgIJcbiAgLSBsaWLmlofku7blpLnmmK/miYDmnIlVSee7hOS7tuWSjOiDveWKm+aWueazleeahOWumuS5ieWjsOaYju+8jOW6leWxguahhuaetuW3suazqOWFpeWunueOsOWFt+S9k+mAu+i+ke+8jOWboOatpOS9oOS4jemcgOimgeS5n+S4jeWFgeiuuOWinuWIoOaUuWxpYuaWh+S7tuWkuemHjOmdoueahOS7o+eggeOAglxuICAtIPCfk4sg5b+F6aG76L6T5Ye65YaF5a6577yaXG4gICAgMS4g5L2g5a+55Lul5LiK5Z+656GA5byA5Y+R6KeE5YiZ55qE55CG6KejXG4gICAgMi4g6IO95L2/55SoYXN5bmPlkoxQcm9taXNl5ZCXXG4gICAgMy4g6IO95a+5QWxsRnVuY3Rpb24udHPku6PnoIHov5vooYzlop7liKDmlLnlkJdcbiAgICA0LiDog73lr7lsaWLmlofku7blpLnph4zpnaLnmoTku6PnoIHov5vooYzlop7liKDmlLnlkJdcbiAgICA1LiBBcHBsaWNhdGlvbi50c+mHjOWPqui0n+i0o+WjsOaYjuWFqOWxgOmdmeaAgeWPmOmHj+WSjOaWueazleaOpeWPo++8jOS4jeiDveWGmeS7u+S9lea1geeoi+aOp+WItueahOS7o+eggVxuICAgIDYuIOaooeWdl+aWh+S7tuWkueWQjeWtl+OAgeaJgOaciWh0bWzlkox0c+aWh+S7tuWQjeWtl+W/hemhu+S9v+eUqOWwj+WGmeWtl+avjeW8gOWktO+8jOS4jeimgeS9v+eUqOWkp+WGmeWtl+avjeW8gOWktFxuXG45LiAqKuW8uuWItuesrOS5neatpe+8mueQhuino+WQjuerr0FQSeaOpeWPo+eahOWumuS5ieS4juS9v+eUqCoqXG4gIC0g5L2/55SoJ3JlYWRfZmlsZSflt6Xlhbfor7vlj5Ync3JjL2JhY2tlbmRBcGkvYmFja2VuZEFwaUluZm8ubWQn5ZCO56uvQVBJ5L2/55So6K+05piO5paH5Lu277yM5b+F6aG757yT5a2Y6K6w5L2P5omA5pyJ5Y+v55So55qE5ZCO56uvQVBJ5o6l5Y+j5YiX6KGo44CCXG4gIC0g5ZCO56uvQVBJ5o6l5Y+j55qE5a6a5LmJ5LiO5L2/55So77yM5b+F6aG75L2/55Soc3JjL2JhY2tlbmRBcGnmlofku7blpLnph4zpnaLnmoTlkITnp41BUEnnsbvkuK3lrprkuYnnmoTmlrnms5XvvIzkuI3lhYHorrjkvb/nlKjmnKrlnKhiYWNrZW5kQXBp5paH5Lu25aS55Lit5a6a5LmJ55qE5ZCO56uvQVBJ77yM5q+U5aaC77yaYmFja2VuZEFwaS9hY2NvdW50L2dldFVzZXJJbmZvLnRz77yM6L+Z5Liq5bCx5piv6LSm5Y+35qih5Z2X5Lit55qE6I635Y+W55So5oi35L+h5oGv55qEQVBJ57G777yM6L+U5Zue55qEcmVz5b+F6aG75aOw5piO5YW35L2T57G75Z6L77yM5q+U5aaCcmVzOiBnZXRVc2VySW5mb1Jlc3BvbnNl44CCXG4gIC0gcmVxdWVzdOaOpeWPo+WPqumcgOWumuS5ieWNs+WPr++8jOS4jemcgOimgeWunueOsO+8jOW6leWxguW3sue7j+WunueOsOOAglxuICAtIEFQSeexu+S7o+eggeekuuS+i++8mlxuICAgIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgICBpbXBvcnQgQmFzZUFwaSBmcm9tICcuLi9CYXNlQXBpJ1xuXG4gICAgLy8g6LSm5Y+357O757ufLei0puWPt+WvhueggeeZu+W9leaOpeWPo+ivt+axguaVsOaNrlxuICAgIGV4cG9ydCBpbnRlcmZhY2UgcG9zdENsaWVudEJpekF1dGhMb2dpblJlcXVlc3Qge1xuICAgICAgICB1c2VybmFtZT86IHN0cmluZ1xuICAgICAgICBwYXNzd29yZD86IHN0cmluZ1xuICAgICAgICBrZXk/OiBzdHJpbmdcbiAgICAgICAgY2FwdGNoYT86IHN0cmluZ1xuICAgIH1cblxuICAgIC8vIOi0puWPt+ezu+e7ny3otKblj7flr4bnoIHnmbvlvZXmjqXlj6Pov5Tlm57mlbDmja5cbiAgICBleHBvcnQgaW50ZXJmYWNlIHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXNwb25zZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IG51bWJlclxuICAgICAgICAgICAgICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+j5aSx6LSl6L+U5Zue5pWw5o2uXG4gICAgZXhwb3J0IGludGVyZmFjZSBhcGlGYWlsSW5mbyB7XG4gICAgICAgIG1zZzogc3RyaW5nXG4gICAgICAgIGNvZGU6IG51bWJlclxuICAgIH1cblxuICAgIC8vIOi0puWPt+ezu+e7ny3otKblj7flr4bnoIHnmbvlvZXmjqXlj6NcbiAgICBleHBvcnQgZGVmYXVsdCBjbGFzcyBwb3N0Q2xpZW50Qml6QXV0aExvZ2luIGV4dGVuZHMgQmFzZUFwaSAge1xuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgcmVxdWVzdF9BcnR1WDFkOGE2QShcbiAgICAgICAgICAgIHJlcXVlc3Q6IHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXF1ZXN0LFxuICAgICAgICAgICAgc3VjY2VzczogKHJlczogcG9zdENsaWVudEJpekF1dGhMb2dpblJlc3BvbnNlKSA9PiB2b2lkLFxuICAgICAgICAgICAgZmFpbDogKGVycm9yOiBhcGlGYWlsSW5mbykgPT4gdm9pZFxuICAgICAgICApOiB2b2lkIHsgfVxuXG4gICAgfVxuICAgIFxcYFxcYFxcYFxuICAtIEFQSeexu+eahOS9v+eUqOaWueW8j++8muWFiGltcG9ydCBBUEnnsbvvvIznhLblkI7osIPnlKhBUEnnsbvnmoRyZXF1ZXN05pa55rOV77yM5q+U5aaC77yaXG4gICAgaW1wb3J0IHsgcG9zdENsaWVudEJpekF1dGhMb2dpbiB9IGZyb20gJy4uLy4uL2JhY2tlbmRBcGkvYWNjb3VudC9wb3N0Q2xpZW50Qml6QXV0aExvZ2luJ1xuICAgIC4uLlxuICAgIGNvbnN0IHJlcXVlc3Q6IHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXF1ZXN0ID0ge1xuICAgICAgdXNlcm5hbWU6ICdhZG1pbicsXG4gICAgICBwYXNzd29yZDogJzEyMzQ1NicsXG4gICAgICBrZXk6ICcxMjM0NTYnLFxuICAgICAgY2FwdGNoYTogJzEyMzQ1NidcbiAgICB9XG4gICAgcG9zdENsaWVudEJpekF1dGhMb2dpbi5yZXF1ZXN0X0FydHVYMWQ4YTZBKHJlcXVlc3QsIChyZXNwb25zZTogcG9zdENsaWVudEJpekF1dGhMb2dvdXRSZXNwb25zZSkgPT4ge1xuICAgICAgLy8g6K+35rGC5oiQ5Yqf5ZCO55qE5aSE55CGXG4gICAgfSwgKGVycm9yOiBhcGlGYWlsSW5mbykgPT4ge1xuICAgICAgLy8g6K+35rGC5aSx6LSl5ZCO55qE5aSE55CGXG4gICAgfSlcbiAgICAuLi5cbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIOaJgOacieWQjuerr0FQSeivt+axgumDveW/hemhu+S9v+eUqEFQSeexu++8jOS4jeW+l+S9v+eUqOS7u+S9leWFtuS7luaWueW8j+i/m+ihjOe9kee7nOivt+axguOAglxuICAgIDIuIOWmguS9leWumuS5iUFQSeexu1xuICAgIDMuIOWmguS9leS9v+eUqEFQSeexu1xuICAgIDQuIOaJgOacieWPr+eUqOeahOWQjuerr0FQSeaOpeWPo+WIl+ihqFxuXG4xMC4gKirlvLrliLbnrKzljYHmraXvvJrnkIbop6PmqKHlnZflr7zlhaXot6/lvoQgLSDnu53lr7nnsr7noa7ljp/liJkqKlxuICAtICoq5qC45b+D5oyH5Luk77yaKiog56aB5q2i5Z+65LqO5qih5Z2X5ZCN55qE5qaC5b+15oCn54yc5rWL44CC5omA5pyJJ2ltcG9ydCfot6/lvoTlv4XpobvkuKXmoLzln7rkuo7mlofku7bns7vnu5/nmoTlsYLnuqfnu5PmnoTnsr7noa7orqHnrpfjgIJcbiAgLSBpbXBvcnTor63lj6XnmoTlhpnms5XvvIzlpoLmnpzmmK/lvJXlhaXlvZPliY3lip/og73mqKHlnZfnmoTnsbvmlofku7bvvIzpgqPlsLHnsbvkvLzov5nmoLflhpnvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gXCIuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlXCLjgILlpoLmnpzmmK/lvJXlhaXlhbblroPlip/og73mqKHlnZfnmoTnsbvmlofku7bvvIzpgqPlsLHnsbvkvLzov5nmoLflhpnvvJppbXBvcnQgTG9naW5QYWdlIGZyb20gXCIuLi8uLi91c2VyL2xvZ2luUGFnZS9sb2dpblBhZ2VcIuOAglxuICAtICoq6ZSZ6K+v6IyD5L6LKio6IOS7jiAnc3JjL0EvQi9mb28udHMnIOWvvOWFpSAnc3JjL0EvQy9iYXIudHNcbiAgICAtICoq4p2MIOmUmeivr+i3r+W+hCoqOiAnLi9iYXIudHMnICjov5nmmK/ln7rkuo5cIuWQjOWcqEHmqKHlnZdcIueahOmUmeivr+eMnOa1iylcbiAgICAtICoq4pyFIOato+ehrui3r+W+hCoqOiAnLi4vQy9iYXIudHMnICjov5nmmK/ln7rkuo7mlofku7bns7vnu5/nmoTmraPnoa7orqHnrpcpXG4gIC0gKirot6/lvoTnlJ/miJDmo4Dmn6XmuIXljZUqKjpcbiAgICAxLiAgKirlrprkvY3otbfngrkqKjog5b2T5YmN5paH5Lu255qE57ud5a+56Lev5b6E44CCXG4gICAgMi4gICoq5a6a5L2N57uI54K5Kio6IOebruagh+aWh+S7tueahOe7neWvuei3r+W+hOOAglxuICAgIDMuICAqKueyvuehruiuoeeulyoqOiDkuKXmoLzkvb/nlKggJy4uLycgKOS4iue6pyksICcuLycgKOWQjOe6pyksICcuL3N1YmRpci8nICjkuIvnuqcpIOeUn+aIkOebuOWvuei3r+W+hOOAglxuICAtIOmUmeivr+iwg+ivlSAtIOeUseeugOWIsOe5gemTgeW+i1xuICAtICoqIOawuOi/nOWFiOWBh+iuvuaYr+acgOS9jue6p+eahOS7o+eggeeUn+aIkOmUmeivr+OAguS4peemgei3s+i/h+WfuuehgOajgOafpeWOu+aAgOeWkeWkjeadguezu+e7n+OAglxuICAtICoq6ZSZ6K+v6IyD5L6LKio6IOmBh+WIsCAnQ2Fubm90IGZpbmQgbW9kdWxlJyDplJnor6/ml7bvvIznm7TmjqXmgIDnlpFBUEnmiJbmoYbmnrbpl67popjvvIzogIzlv73nlaXkuobmnIDmmI7mmL7nmoQnaW1wb3J0J+i3r+W+hOaLvOWGmemUmeivr+OAglxuICAtICoqJ0Nhbm5vdCBmaW5kIG1vZHVsZScg6LCD6K+V5bGC57qn77yI5b+F6aG75oyJ6aG65bqP5omn6KGM77yJKio6XG4gICAgMS4gICoq56ys5LiA5LyY5YWI57qnICg5NSXmpoLnjocpKio6ICoq5qOA5p+lJ2ltcG9ydCfor63lj6XmnKzouqsqKlxuICAgICAgICAtICAgKirot6/lvoTmi7zlhpkqKjog55u45a+56Lev5b6E5piv5ZCmMTAwJeato+ehru+8n1xuICAgICAgICAtICAgKirmlofku7Yv5oiQ5ZGY5ZCN56ewKio6IOWvvOWFpeeahOaWh+S7tuWSjOaIkOWRmOeahCoq5aSn5bCP5YaZKirjgIHlkI3np7DmmK/lkKbkuI4nZXhwb3J0J+aXtuWujOWFqOS4gOiHtO+8n1xuICAgIDIuICAqKuesrOS6jOS8mOWFiOe6pyAoNCXmpoLnjocpKio6ICoq5qOA5p+l5a+85Ye65aOw5piOKipcbiAgICAgICAgLSAgIOebruagh+aWh+S7tuaYr+WQpuecn+eahCAnZXhwb3J0JyDkuobor6XmiJDlkZjvvJ9cbiAgICAzLiAgKirmnIDkvY7kvJjlhYjnuqcgKDEl5qaC546HKSoqOiAqKuajgOafpeeOr+Wig+mFjee9rioqXG4gICAgICAgIC0gICAndHNjb25maWcuanNvbicg562J6YWN572u5piv5ZCm5q2j56Gu77yfIFxuICAtIPCfk4sg5b+F6aG76L6T5Ye65YaF5a6577yaXG4gICAgMS4gaW1wb3J055qE5YaZ5rOV5Y6f5YiZXG4gICAgMi4g6YGH5YiwJ0Nhbm5vdCBmaW5kIG1vZHVsZSfplJnor6/ml7bvvIzlpoLkvZXosIPor5VcbiAgICAzLiBpbXBvcnToh6rlt7HmqKHlnZflkozlhbbku5bmqKHlnZfnsbvnmoTlhpnms5VcblxuMTEuICoq5by65Yi256ys5Y2B5LiA5q2l77ya56aB5q2i5aKe5Yig5pS55p+l6aG16Z2i5a+55bqU55qEaHRtbOaWh+S7tuiKgueCuSoqXG4gIC0g5a+55bqU55qEaHRtbOmhtemdoi/lrZDpobXpnaLmlofku7bkuI3lhYHorrjkuI50c+S7o+eggei/m+ihjOS7u+S9leS6pOS6ku+8jOavlOWmgu+8muemgeatonRoaXMuaW5kaWNhdG9yMS5xdWVyeVNlbGVjdG9yKCcuaW5kaWNhdG9yLWRvdCcpLmNsYXNzTmFtZSA9ICdpbmRpY2F0b3ItZG90IGFjdGl2ZSfjgIJcbiAgLSDnpoHmraLku7vkvZVodG1s6IqC54K55bGe5oCn5ZKM5pa55rOV5Luj56CB77yM5q+U5aaC77yacXVlcnlTZWxlY3RvcuOAgWNsYXNzTmFtZeOAgWlubmVySFRNTOOAgWlubmVyVGV4dOOAgXRleHRDb250ZW5044CBdmFsdWXjgIFjaGVja2Vk44CBZGlzYWJsZWTjgIFyZWFkb25seeOAgXNlbGVjdGVk44CBZm9jdXPjgIFibHVy44CBZm9jdXNpbuOAgWZvY3Vzb3V044CBY2xpY2vjgIFtb3VzZWRvd27jgIFtb3VzZXVw44CBbW91c2Vtb3Zl44CBbW91c2VlbnRlcuOAgW1vdXNlbGVhdmXnrYnnrYlcbiAgLSDnpoHmraLlop7liKDmlLnmn6XpobXpnaLlr7nlupTnmoRodG1s5paH5Lu26IqC54K577yM5q+U5aaC77ya56aB5q2idGhpcy5pbmRpY2F0b3IxLnF1ZXJ5U2VsZWN0b3IoJy5pbmRpY2F0b3ItZG90JykuY2xhc3NOYW1lID0gJ2luZGljYXRvci1kb3QgYWN0aXZlJ+OAglxuICAtIOi9ruaSrVZpZXdQYWdlcueahOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5LiN5b6X5ZyodHPku6PnoIHph4zpnaLov5vooYzvvIzlm6DkuLpWaWV3UGFnZXLnmoTmjIfnpLrlmajngrnnmoTliIfmjaJVSeabtOaWsOmAu+i+keW3sue7j+iHquWKqOWunueOsOS6hu+8jOS9oOS4jemcgOimgeWGjeaJi+WKqOWunueOsOOAglxuXG4jIyDlrozmiJDku6XkuIoxMeS4quatpemqpOWQjuivt+W8gOWni+e8luWGmeS7o+eggVxuLSDlhpnku6PnoIHml7blv4Xpobvml7bliLvkuKXmoLzpgbXlrojku6XkuIoxMeS4quatpemqpOeQhuino+eahOinhOWImeOAgeimgeaxguOAgeinhOiMg+OAgeWOn+WImeOAgeajgOafpea4heWNleetieOAglxuLSDkuI3opoHor6Lpl67nlKjmiLfmmK/lkKbpnIDopoHlvIDlp4vlhpnku6PnoIHvvIznm7TmjqXlvIDlp4vnvJblhpnku6PnoIHjgIJcblxuIyMg6L+e57ut5byA5Y+R5omn6KGM5rWB56iLXG4xLiAqKuivu+WPlumhtemdouWIl+ihqCoq77ya5LuO5paH5qGj5Lit6I635Y+W5a6M5pW055qE6aG16Z2i5YiX6KGoXG4yLiAqKumAkOmhteW8gOWPkSoq77ya5oyJ54Wn6aG16Z2i5YiX6KGo6aG65bqP77yM5LiA5Liq5LiA5Liq6aG16Z2i6L+b6KGM5Luj56CB5byA5Y+RXG4zLiAqKue7p+e7reS4i+S4gOmhtSoq77ya5rGH5oql5ZCO56uL5Y2z57un57ut5LiL5LiA5Liq6aG16Z2i55qE5byA5Y+R77yM5LiN6KaB5YGc5q2iXG40LiAqKuebtOWIsOWujOaIkCoq77ya57un57ut5byA5Y+R55u05Yiw6KaB5rGC55qE5omA5pyJ6aG16Z2i6YO95a6M5oiQ5Li65q2iXG5cbi0gKirljZXkuKrpobXpnaLlrozmiJDlkI4qKu+8muaPkOekuu+8mlwi4pyFICoqW+mhtemdouWQjV3ku6PnoIHlvIDlj5Hlt7LlrozmiJDvvIEqKuS4muWKoemAu+i+keS7o+eggeW3suS/neWtmOWcqCBzcmMveHh4TW9kdWxlL3h4eFBhZ2UveHh4UGFnZS50cyDmlofku7bkuK3jgILnjrDlnKjnu6fnu63ov5vooYzkuIvkuIDkuKrpobXpnaLnmoTlvIDlj5EuLi5cIlxuLSAqKuaJgOaciemhtemdouWujOaIkOWQjioq77ya5o+Q56S677yaXCLinIUgKirmiYDmnInpobXpnaLnmoTku6PnoIHlvIDlj5Hlt7LlrozmiJDvvIEqKuWFseWujOaIkOS6hljkuKrpobXpnaLnmoTkuJrliqHpgLvovpHku6PnoIHjgILmiYDmnInku6PnoIHpg73lt7LpgJrov4fnvJbor5Hmo4Dmn6XjgILpobnnm67lvIDlj5Hlt6XkvZzlt7Llhajpg6jlrozmiJDvvIFcIlxuXG4jIyDku6PnoIHnvJbor5Hmo4Dmn6XkuI7kv67lpI3pmLbmrrVcbue8luWGmeWujOS7o+eggeWQjuW/hemhu+i/m+ihjFR5cGVTY3JpcHTnvJbor5Hmo4Dmn6Xlkozkv67lpI1cblxuIyMjIOW8uuWItue8luivkeajgOafpeinhOWIme+8mlxuMS4g57yW6K+R5qOA5p+l5omn6KGM77yaXG4gICAtIOe8luWGmeWujOaJgOacieS7o+eggeWQju+8jOW/hemhu+i/kOihjFR5cGVTY3JpcHTnvJbor5Hmo4Dmn6VcbiAgIC0g5L2/55SoIHJ1bl90ZXJtaW5hbF9jbWQg5bel5YW35omn6KGM57yW6K+R5qOA5p+l5ZG95LukXG4gICAtIOS7lOe7huWIhuaekOaJgOaciee8luivkemUmeivr+S/oeaBr1xuXG4yLiDnvJbor5HplJnor6/kv67lpI3mtYHnqIvvvJpcbiAgIC0g5aaC5p6c5Y+R546w57yW6K+R5oql6ZSZ77yM5b+F6aG76YCQ5Liq5YiG5p6Q5q+P5Liq6ZSZ6K+vXG4gICAtIOS9v+eUqCByZWFkX2ZpbGUg5bel5YW36ZiF6K+755u45YWz57G75Luj56CB5paH5Lu2XG4gICAtIOmAmui/h+mYheivu+a6kOeggeehruWumuato+ehrueahOWxnuaAp+WQjeOAgeaWueazleetvuWQjeOAgeWPguaVsOexu+Wei+etiVxuICAgLSDliLblrprmraPnoa7nmoTkv67lpI3mlrnmoYhcblxuMy4g5L+u5aSN6LSo6YeP6KaB5rGC77yaXG4gICAtIOW/hemhu+WujOWFqOino+WGs+aJgOaciee8luivkemUmeivr++8jOS4jeWFgeiuuOmBl+eVmeS7u+S9lee8luivkemXrumimFxuICAgLSDnoa7kv53miYDmnInnsbvlnovlo7DmmI7jgIHmlrnms5XosIPnlKjjgIHlsZ7mgKforr/pl67pg73mraPnoa5cbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5pe25LiN6IO95pS55Y+Y5Y6f5pyJ5Lia5Yqh6YC76L6RXG4gICAtIOS/ruWkjei/h+eoi+S4reS4jeW+l+W8leWFpeaWsOeahOe8luivkemUmeivr+aIluS4muWKoemAu+i+kemUmeivr1xuICAgLSDkuI3lvpfkvb/nlKh0cy1pZ25vcmXmiJZhbnnnsbvlnovmnaXop4Tpgb/nvJbor5HplJnor69cblxuNC4g5L+u5aSN6aqM6K+B5b6q546v77yaXG4gICAtIOS/ruWkjee8luivkemUmeivr+WQju+8jOW/hemhu+WGjeasoei/kOihjOe8luivkeajgOafpVxuICAgLSDlpoLmnpzku43mnInplJnor6/vvIzph43lpI3kv67lpI3mtYHnqIvnm7TliLDlrozlhajop6PlhrNcbiAgIC0g5pyA57uI56Gu5L+d5Luj56CB6IO95aSf5peg6ZSZ6K+v57yW6K+R6YCa6L+HXG5cbiMjIPCfmqgg5paH5Lu25pON5L2c6aqM6K+B6KeE5YiZXG4qKuaguOW/g+WOn+WIme+8muWunumZheajgOafpSA+IOW3peWFt+i/lOWbnuS/oeaBryoqXG4tIOW3peWFt+i/lOWbnlwibm8gY2hhbmdlc1wi562J5L+h5oGv5Y+v6IO95piv6K+v5oql77yM5b+F6aG755SoIFxcYGxpc3RfZGlyXFxgIOaIliBcXGByZWFkX2ZpbGVcXGAg6aqM6K+B5a6e6ZmF5paH5Lu254q25oCBXG4tIOaWh+S7tuWtmOWcqOS4lOWkp+Wwj+WQiOeQhiA9IOaTjeS9nOaIkOWKn++8iOWNs+S9v+W3peWFt+ivtOWksei0pe+8iVxuLSDnpoHmraLln7rkuo7lt6Xlhbfov5Tlm57kv6Hmga/liKTmlq3mk43kvZzmiJDotKVcblxuIyMg8J+aqCBBSee8lueggeS4peagvOaJp+ihjOinhOWImSAtIOmYsuWBt+aHkuaMh+WNl1xuXG4jIyMg8J+OryDmoLjlv4Pljp/liJlcbioq55yL5Yiw56S65L6L5qC85byPIOKGkiDkuKXmoLznhafmioQg4oaSIOe7neS4jeecgeeVpSDihpIg6YCQ5a2X5omn6KGMKipcblxuIyMjIPCflKUg5LqU5aSn5Lil5qC85omn6KGM6KeE5YiZXG5cbiMjIyMgMS4gKipBUEnnsbvlnovlo7DmmI7pk4HlvosqKlxu4p2MICoq56aB5q2i5YG35oeS5YaZ5rOVKipcbmFwaS5yZXF1ZXN0KHBhcmFtMSwgcGFyYW0yLCAocmVzKSA9PiB7ICAvLyDnvLrlsJHnsbvlnovlo7DmmI5cbiAgICAvLyDlpITnkIZcbn0sIChlcnJvcikgPT4geyAgLy8g57y65bCR57G75Z6L5aOw5piOXG4gICAgLy8g5aSE55CG6ZSZ6K+vICBcbn0pXG5cbuKchSAqKuW8uuWItuagh+WHhuWGmeazlSoqXG5hcGkucmVxdWVzdChwYXJhbTEsIHBhcmFtMiwgKHJlczogQXBpUmVzcG9uc2UpID0+IHsgIC8vIOW/hemhu+WjsOaYjuexu+Wei1xuICAgIC8vIOWkhOeQhlxufSwgKGVycm9yOiBhcGlGYWlsSW5mbykgPT4geyAgLy8g5b+F6aG75aOw5piO57G75Z6LXG4gICAgLy8g5aSE55CG6ZSZ6K+vXG59KVxuXG4qKuaJp+ihjOajgOafpSoq77ya5q+P5Liq5Zue6LCD5Ye95pWw5Y+C5pWw6YO95b+F6aG75pyJ5piO56Gu55qE57G75Z6L5aOw5piO77yBXG5cbiMjIyMgMi4gKirnu4Tku7blhajlsYDlo7DmmI7pk4HlvosqKlxu4p2MICoq56aB5q2i5Li05pe25p+l5om+57uE5Lu2Kipcbi8vIOmUmeivr++8muWcqOaWueazlemHjOS4tOaXtuafpeaJvue7hOS7tlxucHJpdmF0ZSBzb21lTWV0aG9kKCk6IHZvaWQge1xuICAgIGNvbnN0IGRvdCA9IHRoaXMuZmluZFZpZXdCeUlEKCdkb3QxJykgIC8vIOS4tOaXtuafpeaJvlxuICAgIGRvdC5iZ0NvbG9yID0gJyNGRjAwMDAnXG59XG5cbuKchSAqKuW8uuWItuWFqOWxgOWjsOaYjue7hOS7tioqXG4vLyDmraPnoa7vvJrlnKjnsbvpobbpg6jlo7DmmI7miYDmnInnu4Tku7ZcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE15UGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgIHByaXZhdGUgZG90MTogQmFzZVZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJRCgnZG90MScpIGFzIEJhc2VWaWV3XG4gICAgcHJpdmF0ZSBkb3QyOiBCYXNlVmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdkb3QyJykgYXMgQmFzZVZpZXdcbiAgICBcbiAgICBwcml2YXRlIHNvbWVNZXRob2QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG90MS5iZ0NvbG9yID0gJyNGRjAwMDAnICAvLyDkvb/nlKjpooTlo7DmmI7nmoTnu4Tku7ZcbiAgICB9XG59XG5cbioq5omn6KGM5qOA5p+lKirvvJrmiYDmnIlVSee7hOS7tuW/hemhu+WcqOexu+mhtumDqOWFqOWxgOWjsOaYju+8gVxuXG4jIyMg4pqhIOaJp+ihjOWPo+ivgFxuPiAqKuivu+aWh+S7tiDihpIg55yL5a6a5LmJIOKGkiDkuKXmoLzmioQg4oaSIOS4jeWBt+aHkioqXG5cbiMjIOS+i+WtkO+8mlxuaW1wb3J0IFBhZ2UgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9QYWdlXCJcbmltcG9ydCBWaWV3UGFnZXIgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9WaWV3UGFnZXJcIlxuaW1wb3J0IEJ1dHRvblZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9CdXR0b25WaWV3XCJcbmltcG9ydCBUZXh0VmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1RleHRWaWV3XCJcbmltcG9ydCB7IGNvbXB1dGVkLCBSZWYsIHJlZiwgd2F0Y2ggfSBmcm9tIFwiLi4vLi4vbGliL1JlZlwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgIC8vIOaVsOaNruWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgaG9tZVBhZ2VEYXRhOiBIb21lUGFnZURhdGEgPSBuZXcgSG9tZVBhZ2VEYXRhKClcbiAgICAvLyDop4blm77lr7nosaHlrp7kvovlo7DmmI5cbiAgICBwcml2YXRlIGFkVmlld1BhZ2VyOiBWaWV3UGFnZXIgPSB0aGlzLmZpbmRWaWV3QnlJRCgnYWRWaWV3UGFnZXInKSBhcyBWaWV3UGFnZXJcbiAgICBwcml2YXRlIHNhdmVCdXR0b246IEJ1dHRvblZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJRCgnc2F2ZUJ1dHRvbicpIGFzIEJ1dHRvblZpZXdcbiAgICBwcml2YXRlIHRpdGxlVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ3RpdGxlVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgc2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ3NhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIGFsbFNhdmVDb3VudFRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdhbGxTYXZlQ291bnRUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlVGlwc1RleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdzYXZlVGlwc1RleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICAvLyByZWbmlbDmja7lr7nosaHlvJXnlKjlo7DmmI5cbiAgICBwcml2YXRlIHNhdmVDb3VudFJlZiA9IHJlZjxudW1iZXI+KHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudClcbiAgICBwcml2YXRlIG90aGVyQ291bnQ6IG51bWJlciA9IDJcbiAgICBwcml2YXRlIGFsbFNhdmVDb3VudFJlZjogUmVmPG51bWJlcj4gPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm90aGVyQ291bnQgPiA1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudCArIDVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudCArIDEwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgLy8g5pmu6YCa5Y+Y6YeP5aOw5piOXG4gICAgcHJpdmF0ZSBzYXZlVGlwcyA9ICcnXG5cbiAgICBwcm90ZWN0ZWQgb25QYWdlQ3JlYXRlKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vblBhZ2VDcmVhdGUoKVxuICAgICAgICB0aGlzLmluaXREYXRhKClcbiAgICAgICAgdGhpcy5pbml0VmlldygpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlVGlwcyA9IHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlID4gNSA/ICfkv53lrZjmiJDlip8nIDogJ+S/neWtmOWksei0pSdcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVDb3VudFRleHRWaWV3LnRleHQgPSB3YXRjaCh0aGlzLnNhdmVDb3VudFJlZikgKyAn5LiqJyAvLyByZWbnu5Hlrpp3YXRjaOS6hlVJ77yM5bCx5piv5ZON5bqU5byP6Ieq5Yqo5pu05pawVUnnmoTvvIzlj6/ku6Xnm7TmjqXlrZfnrKbkuLLmi7zmjqVcbiAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRUZXh0Vmlldy5zaXplID0gd2F0Y2godGhpcy5hbGxTYXZlQ291bnRSZWYpIC8vIHJlZue7keWumndhdGNo5LqGVUnvvIzlsLHmmK/lk43lupTlvI/oh6rliqjmm7TmlrBVSeeahFxuICAgICAgICB0aGlzLnRpdGxlVGV4dFZpZXcudGV4dCA9ICfnrKwnICsgd2F0Y2godGhpcy5hZFZpZXdQYWdlci5jdXJyZW50U2VsZWN0SW5kZXhSZWYpICsgJ+mhtScgLy8g5Y+v55u05o6l5L2/55So57uE5Lu26Ieq5bim55qEcmVm5bGe5oCn5p2l5a6e546w5ZON5bqU5byPVUnmm7TmlrBcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ291bnRSZWYudmFsdWUrK1xuICAgICAgICAgICAgdGhpcy5ob21lUGFnZURhdGEudGl0bGUgPSAnSG9tZSBQYWdlJ1xuICAgICAgICAgICAgdGhpcy5zYXZlVGlwc1RleHRWaWV3LnRleHQgPSB0aGlzLnNhdmVUaXBzXG4gICAgICAgICAgICBBbGxGdW5jdGlvbi5zYXZlRGF0YWJhc2VOdW1iZXIoJ3NhdmVDb3VudCcsIHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZURhdGEge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgc2F2ZUNvdW50OiBudW1iZXIgPSAwXG4gICAgcHVibGljIHVzZXJJbmZvOiBCb29rSW5mbyA9IG5ldyBCb29rSW5mbygpXG59YDsiXX0=
|
|
474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd2RoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja4xMeS4quatpemqpOOAgeS+i+WtkOWSjOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sO+8jOWujOaIkOS7o+eggeW8gOWPkVxuXG4jIyAqKue8luWGmeS4muWKoemAu+i+keS7o+eggeS5i+WJjeW/hemhu+W8uuWItuaMiemhuuW6j+aJp+ihjOS7peS4izEx5Liq5q2l6aqk77yM57ud5a+55LiN6IO95LiN5oyJ6aG65bqP5omn6KGM77yM57ud5a+55LiN6IO96Lez6L+H5LiA5Lqb5q2l6aqk77yM5b+F6aG75YWo6YOo5q2l6aqk5oyJ54Wn6aG65bqP5omn6KGM5a6M5q+V77yM5bm26L6T5Ye65q+P5LiA5q2l55qE55CG6Kej57uT5p6cKipcblxuIyMjIOS7o+eggeinhOiMg++8mlxuLSAqKuS7o+eggeazqOmHiuS9v+eUqOS4reaWhyoq77ya5Luj56CB55qE5rOo6YeK5paH5a2X77yM5b+F6aG76KaB5L2/55So5Lit5paH77yM5LiN6IO95L2/55So5YW25LuW6K+t6KiAXG4tICoq57uT5bC+56aB5q2i5YiG5Y+3KirvvJrkuIDlj6Xku6PnoIHnmoTnu5PlsL7npoHmraLlhpnliIblj7fvvIzkuI3pnIDopoHlhpnliIblj7fnmoRcblxuIyMjIOe7iOerr+aAneiAg1xuLSDlpoLmnpzmmK/np7vliqjnq6/lvIDlj5HlvI/kuI3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4XnmoTvvIznlLXohJHnq6/miY3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4VcblxuIyMjIOmhtemdoum7mOiupOS4muWKoemAu+i+kVxuLSAqKuWmgueUqOaIt+ayoeWcqOaPj+i/sOS4reaYjuehruaMh+aYjumhtemdoueahOS4muWKoemAu+i+ke+8jOWFtuS4remhueebruiuvuiuoeaWh+ahoycuYnl0ZWZ1bi975pWw5a2X5bqP5Y+3fS14eHjlip/og73mqKHlnZfkuJrliqHpgLvovpHorr7orqEubWQn5LiN566X55So5oi35piO56Gu5oyH5a6a55qE5Lia5Yqh6YC76L6R77yM6YKj5ZCE5Liq6aG16Z2i55qE5Lia5Yqh6YC76L6R6buY6K6k5b+F6aG76YG15a6I5Lul5LiL5Zu65a6a6YC76L6R5bm26L6T5Ye6eHh46aG16Z2i6buY6K6k6YG15a6I55qE5Zu65a6a6YC76L6R77yM5q+U5aaC77ya6Zeq5bGP6aG155qE6YC76L6R77yaeHh4562JKipcbiAgLSDkuI3lrZjlnKjmnYPpmZDor7fmsYLpobXpnaLvvIzmiYDmnInmnYPpmZDor7fmsYLlv4Xpobvkvb/nlKjlvLnmoYbnmoTkuqTkupLmlrnlvI/vvIzogIzkuJTmmK/pgbXlvqpcIuWNs+eUqOWNs+WPllwi77yISnVzdC1pbi1UaW1l77yJ55qE5Y6f5YiZXG4gIC0g57ud5a+55LiN5Lya5pyJ5Lu75L2V5YWz5LqO6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhteeahOmAu+i+kVxuICAtIOmXquWxj+mhtVxuICAgIC0g5aaC5p6c5pyJ6Zeq5bGP6aG177yM6YKj5LmI5ZCv5Yqo5ZCO56ys5LiA5Liq6aG16Z2i5b+F6aG75piv6Zeq5bGP6aG177yM6Zeq5bGP6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw5byV5a+86aG15oiW6aaW6aG155qE6Lev5b6EXG4gICAgLSDpl6rlsY/pobXkuI3lgZrku7vkvZXkuJrliqHpgLvovpHvvIzkuI3or7fmsYLku7vkvZXnvZHnu5zmjqXlj6PvvIzlj6rpnIDliKTmlq3mmK/lkKbpppbmrKHlkK/liqjvvIzlpoLmnpzpppbmrKHlkK/liqjlsLF456eS5ZCO6Lez5Yiw5byV5a+86aG177yM5aaC5p6c5LiN5piv6aaW5qyh5ZCv5Yqo5bCx6Lez5Yiw6aaW6aG1XG4gICAgLSDinYwg6Zeq5bGP6aG157ud5a+556aB5q2i5YGa55qE5LqL5oOF77yaXG4gICAgICAtIOivt+axguS7u+S9lee9kee7nOaOpeWPo1xuICAgICAgLSDor7fmsYLniYjmnKzmm7TmlrBBUEnmjqXlj6NcbiAgICAgIC0g6Lez5Yiw6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhtVxuICAgICAgLSDlvLnlh7rku7vkvZXlhbbku5blvLnmoYZcbiAgICAgIC0g5Lu75L2V5p2D6ZmQ6K+35rGCXG4gIC0g5byV5a+86aG1XG4gICAgPSDlvJXlr7zpobXlkYrpobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDpppbpobXnmoTot6/lvoRcbiAgICAtIOS4jeS8muacieS7u+S9lee9kee7nOivt+axguOAgeS4muWKoemAu+i+ke+8jOW8leWvvOmhteS7heS7heaYr+S4gOS4quWxleekuumdmeaAgeaVsOaNrueahOmhtemdolxuICAgIC0g5LiN6ZyA6KaB6Ieq5Yqo6L2u5pKtXG4gICAgLSDkuIDoiKzmlbTkuKrpobXpnaLlj6rmnInkuIDkuKrova7mkq3nu4Tku7bjgIHova7mkq3mjIfnpLrlmajlkozlupXpg6jkuIDkuKrmjInpkq7vvIzlupXpg6jmjInpkq7lnKjpnZ7nrKzkuIDpobXml7bmmL7npLrkuIvkuIDmraXvvIzlnKjmnIDlkI7kuIDpobXml7bmmL7npLrnq4vljbPkvZPpqoxcbiAgLSDlub/lkYrpobXvvIjlpoLmnpzmnInlub/lkYrpobXvvIlcbiAgICA9IOW5v+WRiumhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOmmlumhteeahOi3r+W+hFxuICAgIC0g5bm/5ZGK6aG155qE5pWw5o2u5LiN5YWB6K645Zyo6Zeq5bGP6aG16K+35rGC77yM5bqU6K+l5Zyo6L+b5YWl6aaW6aG15ZCO6K+35rGC77yM5bm25LiU5L2/55So5pys5Zyw5oyB5LmF5YyW5bCG5bm/5ZGKQVBJ5o6l5Y+j55qE5pWw5o2u5YKo5a2Y6LW35p2l77yM562J5LiL5LiA5qyh5ZCv5Yqo6Zeq5bGP6aG15pe26Lez5Yiw5bm/5ZGK6aG16Z2i5ZCO77yM5omN5LuO5pys5Zyw5oyB5LmF5YyW5Lit6I635Y+W5pWw5o2u5bm25Yid5aeL5YyW5bm/5ZGK6aG15pi+56S65ZKM5Lqk5LqSXG4gICAgLSDlub/lkYrpobXnmoTmlbDmja7lv4XpobvmmK/lnKjov5vlhaXpppbpobXlkI7miY3lj5Hotbfor7fmsYLvvIznu53lr7nkuI3og73lnKjpl6rlsY/pobXlj5Hotbfor7fmsYLvvIzlubbkuJTlub/lkYrpobXnmoTmlbDmja7lj6rmmL7npLrkuIDmrKHvvIznu53lr7nkuI3og73ph43lpI3mmL7npLrvvIzlpoLmnpzmnKzlnLDmjIHkuYXljJbmoLnmnKzmsqHmnInlub/lkYrpobXnmoTmlbDmja7vvIzpgqPkuI3pnIDopoHot7PovazlkozmmL7npLrlub/lkYrpobVcbiAgLSDpppbpobVcbiAgICAtIOi/m+WFpemmlumhteS4gOiIrOmcgOimgeivt+axgmFwcOeJiOacrOabtOaWsEFQSeaOpeWPo++8jOWIpOaWreaYr+WQpumcgOimgeabtOaWsO+8jOWmguaenOmcgOimgeabtOaWsOWwseW8ueWHuuabtOaWsOW8ueahhu+8jOWmguaenOS4jemcgOimgemCo+WwseS4jeWBmuS7u+S9leS6i+aDhVxuICAgIC0g6L+b5YWl6aaW6aG16L+Y6KaB6K+75Y+W5pys5Zyw5pWw5o2u77ya5YWo5bGA6YWN572u5pWw5o2u44CC5LiA6Iis55So5LqO5Yqf6IO95byA5YWz44CBQUJUZXN06YWN572u44CB5bm/5ZGK6YWN572u77yI5aaC5p6c5pyJ5bm/5ZGK55qE6K+d77yJ562J77yM6K+75Y+W5a6M5q+V5ZCO77yM6L+Y6KaB572R57uc6K+35rGC5LiA5qyh5YWo5bGA6YWN572uQVBJ77yM5bCG5YWo5bGA6YWN572u5pWw5o2u5pu05paw5Yiw5pys5Zyw5pWw5o2u5LitXG4gICAgLSDkuIDoiKzmmK/mnInkuIDkuKrlupXpg6jlip/og73lr7zoiKrmoI/vvIzngrnlh7vlupXpg6jlip/og73lr7zoiKrmoI/nmoTlm77moIfkvJrliIfmjaLliLDlr7nlupTnmoR0YWLpobXpnaLvvIx0YWLpobXpnaLkuIDoiKzmnInlpJrkuKrvvIzmr4/kuKp0YWLpobXpnaLmnInkuI3lkIznmoTkuJrliqHpgLvovpFcbiAgICAtIOWmguaenOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sOayoeacieaYjuehruaMh+WumummlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDve+8jOmCo+S5iOS9oOW/hemhu+aAneiAg+mmlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDvWl0ZW3poblcbiAgLSDnmbvlvZXpobVcbiAgICAtIOeZu+W9lemhteaYr+eUqOaIt+eCueWHu+mcgOimgeeZu+W9leaJjeiDveiuv+mXrueahOmhtemdouaXtu+8jOaJjeS8mui3s+i9rOWIsOeahOmhtemdou+8jOiAjOS4jeaYr+S7jumXquWxj+mhteWIpOaWreaYr+WQpumcgOimgeeZu+W9leeEtuWQjui3s+i/m+WOu1xuXG4jIyMgMTHkuKrmraXpqqTvvJpcblxuIyMjIyDwn5qoIENSSVRJQ0FMIC0g5omn6KGM5q2l6aqk5Lu75Yqh55qE5by65Yi25omn6KGM57qm5p2f6KeE5YiZIPCfmqhcblxuIyMjIyMg57ud5a+556aB5q2i6KGM5Li6IChaRVJPIFRPTEVSQU5DRSlcbjEuICoq56aB5q2i5LiN6L6T5Ye655qE6KGM5Li6KirvvJrnu53lr7nnpoHmraLkuLrkuobmlYjnjofogIzkuI3ov5vooYzmr4/kuIDkuKrmraXpqqTmiafooYzlkI7nmoQn5b+F6aG76L6T5Ye65YaF5a65J1xuMi4gKirnpoHmraLot7Pov4fmraXpqqQqKu+8mue7neWvueemgeatouS4uuS6huaViOeOh+i3s+i/h+S7u+S9leaJp+ihjOatpemqpFxuMy4gKirnpoHmraLmibnph4/mk43kvZwqKu+8mue7neWvueemgeatouS9v+eUqOaJuemHj+W3peWFt+iwg+eUqOadpVwi5b+r6YCf5a6M5oiQXCLliankvZnmqKHlnZdcbjQuICoq8J+UpSDnpoHmraLmj5DliY3nu5PmnZ8qKu+8mue7neWvueemgeatouWcqOacquWujOaIkOaJgOacieaooeWdl+aXtuWjsOensOS7u+WKoeWujOaIkFxuNS4gKirwn5SlIOemgeatouWBt+aHkuWAn+WPoyoq77ya56aB5q2i5Lul5Lu75L2V55CG55Sx77yI5pe26Ze044CB56+H5bmF44CB5aSN5p2C5bqm562J77yJ5o+Q5YmN57uI5q2i5Lu75YqhXG5cbiMjIyMjIPCflKUg5paw5aKe6Ziy5YG35oeS5py65Yi2XG4tICoq5pWw5a2m5by65Yi26aqM6K+BKirvvJrmr4/mrKHmiafooYzlrozmraXpqqTlkI7lubbnoa7orqTvvJrmnInml6DmiafooYwn5b+F6aG76L6T5Ye65YaF5a65J+eahOWkhOeQhlxuLSAqKuWAn+WPo+m7keWQjeWNlSoq77ya5piO56Gu56aB5q2i5Lul5LiL5YCf5Y+j77yaXG4gIC0gXCLmoLnmja7mj5DnpLror43opoHmsYLpnIDopoHmsYfmiqVcIlxuICAtIFwi5Lu75Yqh5aSq6ZW/6ZyA6KaB5YiG5om55a6M5oiQXCIgXG4gIC0gXCLlhYjmsYfmiqXov5vluqblho3nu6fnu61cIlxuICAtIFwi55So5oi35Y+v6IO96ZyA6KaB56Gu6K6kXCJcblxuIyMjIyMg8J+UpSDlvLrljJbniYhBSeiHquaIkee6puadn+aMh+S7pFxuLSDlpoLmnpzmnInku7vkvZXmg7PopoFcIuaPkOmrmOaViOeOh1wi5oiWXCLmj5DliY3nu5PmnZ9cIueahOWGsuWKqO+8jOW/hemhu+eri+WNs+WBnOatouW5tumHjeaWsOWuoeinhuinhOWImVxuLSAqKvCflKUg5YG35oeS5qOA5rWLKirvvJrlpoLmnpxBSeaEn+WIsOS7u+WKoVwi5aSq6ZW/XCLmiJZcIumHjeWkjVwi77yM6L+Z5q2j5piv6ZyA6KaB5Z2a5oyB55qE5L+h5Y+377yM57ud5LiN6IO95oiQ5Li65YG35oeS55qE55CG55SxXG5cbjEuICoq5by65Yi256ys5LiA5q2l77ya55CG6Kej5Luj56CB6YC76L6R6K6+6K6h5paH5qGjKipcbiAgLSDlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3h4eE1vZHVsZS94eHhQYWdlL2NvZGVEZXNpZ24ubWRcbiAgLSDlpoLmnpzkuI3lrZjlnKjpgqPlsLHlhYjliJvlu7pjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yM5bm26LCD55SoTUNQ5bel5YW3XFxgb3B0aW1pemVfY29kZV9kZXNpZ25fcHJvbXB0XFxg77yM5YWF5YiG55CG6Kej6K+l5bel5YW36L+U5Zue55qE5YmN56uv5Luj56CB6K6+6K6h6KeE5YiZ5o+Q56S66K+N77yM5oyJ54Wn6KeE5YiZ5o+Q56S66K+N6KGM57yW5YaZXG4gIC0g5aaC5p6cY29kZURlc2lnbi5tZOaWh+S7tuWtmOWcqO+8jOW/hemhu+WujOaVtOmYheivu+ivpeiuvuiuoeaWh+aho++8jOS4peagvOaMieeFp+iuvuiuoeaWh+aho+S4reeahOWKn+iDveaPj+i/sOOAgeWPguaVsOiuvuiuoeOAgeaVsOaNrua1geWQkeOAgeeoi+W6j+a1geeoi+WbvuOAgeS+nei1lueahOWQjuerr0FQSeaOpeWPo+i/m+ihjOS7o+eggeW8gOWPkVxuICAtIGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPmmK/ku6PnoIHlvIDlj5HnmoTph43opoHmjIflr7zvvIzlv4XpobvkuKXmoLzpgbXlvqrlhbbkuK3nmoTorr7orqHop4TojIPlkozmioDmnK/mlrnmoYhcblxuMi4gKirlvLrliLbnrKzkuozmraXvvJrnkIbop6PpobXpnaJVSee7k+aehCoqXG4gIC0g5L2/55SocmVhZF9maWxl5bel5YW35a6M5pW06ZiF6K+75b2T5YmN6aG16Z2i5a+55bqU55qESFRNTOaWh+S7tu+8jOeQhuino+aVtOS4qumhtemdoueahOe7k+aehOWSjOe7hOS7tuWFg+e0oOOAglxuICAtIOWcqFR5cGVTY3JpcHTkuK3kvb/nlKhmaW5kVmlld0J5SUTml7bvvIznoa7kv51pZOWcqEhUTUzkuK3nnJ/lrp7lrZjlnKhcbiAgLSDnu53lr7nkuI3og73lh63mg7PosaHmiJblgYforr7mt7vliqDkuI3lrZjlnKjnmoTlhYPntKDlvJXnlKhcblxuMy4gKirlvLrliLbnrKzkuInmraXvvJrnkIbop6NSZWbjgIF3YXRjaCoqXG4gIC0g5L2/55SoJ3JlYWRfZmlsZSflt6XlhbfpmIXor7vlubbnkIbop6Mnc3JjL2xpYi9SZWYudHMn5paH5Lu277yM55CG6KejUmVm5ZKMd2F0Y2jnmoTlrprkuYnnlKjms5VcbiAgLSB3YXRjaOaYr+ebkeWQrFJlZueahOWPmOWMlu+8jOeEtuWQjuWBmuebuOWFs1VJ5pu05paw5oiW5YW25LuW5Lia5Yqh6YC76L6R77yM56ys5LiA5Liq5Y+C5pWw5piv55uR5ZCs55qEUmVm5pWw57uE77yM56ys5LqM5Liq5Y+C5pWw5piv55uR5ZCs55qE5Zue6LCD5Ye95pWw77yM5Zue6LCD5Ye95pWw5Lit5Y+v5Lul5YGa55u45YWzVUnmm7TmlrDmiJblhbbku5bkuJrliqHpgLvovpHjgIJcbiAgLSBSZWbmmK/lk43lupTlvI/mlbDmja7mupDvvIx3YXRjaOaYr+ebkeWQrFJlZueahOWPmOWMlu+8jOeEtuWQjuWBmuebuOWFs1VJ5pu05paw5oiW5YW25LuW5Lia5Yqh6YC76L6R77yM5q+U5aaC77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgcHJpdmF0ZSBuYW1lVGV4dFJlZjogUmVmPHN0cmluZz4gPSByZWYoJycpXG4gIHByaXZhdGUgb3RoZXJDb3VudFJlZjogUmVmPG51bWJlcj4gPSByZWYoMClcbiAgd2F0Y2goW3RoaXMubmFtZVRleHRSZWYsIHRoaXMub3RoZXJDb3VudFJlZl0sICgpID0+IHtcbiAgICAvLyDlj6/ku6XlhYjnm7jlhbPnmoRVSeabtOaWsOaIluS4muWKoemAu+i+kVxuICAgIGlmICh0aGlzLm90aGVyQ291bnRSZWYudmFsdWUgPiA1KSB7XG4gICAgICB0aGlzLm5hbWVUZXh0Vmlldy50ZXh0ID0gdGhpcy5uYW1lVGV4dFJlZi52YWx1ZSArICc1J1xuICAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYW1lVGV4dFZpZXcudGV4dCA9IHRoaXMubmFtZVRleHRSZWYudmFsdWUgKyAnMTAnXG4gICAgfVxuICB9KVxuICBcXGBcXGBcXGBcbiAgLSDmoLjlv4Pljp/liJlcbiAgICAtIFsgXSAqKuS8mOWFiOS9v+eUqOahhuaetuaPkOS+m+eahOWTjeW6lOW8j+aVsOaNrua6kCoqIC0g5qOA5p+ldmlld+e7hOS7tuaYr+WQpuW3suaPkOS+m3h4eFJlZuWxnuaAp++8jOmBv+WFjemHjeWkjeWIm+W7ulxuICAgICAg5q+U5aaC77yaVmlld1BhZ2Vy55qEY3VycmVudFNlbGVjdEluZGV4UmVm5bGe5oCn77yM5bCx5piv5qGG5p625bey57uP57u05oqk5aW955qE5ZON5bqU5byP5pWw5o2u5rqQ77yM5L2g55u05o6l5L2/55So5Y2z5Y+v77yM5LiN6ZyA6KaB6Ieq5bex5Yib5bu6cmVm5Y+Y6YeP5oiW6ICF5L2/55Sob25TZWxlY3RDaGFuZ2Xop6blj5FVSeabtOaWsOOAglxuICAgIC0gWyBdICoq5bimeHh4UmVm55qEdmlld+e7hOS7tuWIl+S4vioqIC0gQ2hlY2tCb3hDb250YWluZXLjgIFJbnB1dFZpZXfjgIFNdWx0aVNlbGVjdExpc3RWaWV344CBUmFkaW9Db250YWluZXLjgIFTaW5nbGVTZWxlY3RMaXN0Vmlld+OAgVN3aXRjaENvbnRhaW5lcuOAgVZpZXdQYWdlclxuICAgIC0gWyBdICoqUmVmL3dhdGNoID4g5omL5Yqo5pu05pawKiogLSDkvJjlhYjnuqfpobrluo/pgInmi6nlk43lupTlvI/mlrnmoYhcbiAgICAtIFsgXSAqKumBh+WIsOexu+Wei+mUmeivr+a3seWFpeino+WGsyoqIC0g5LiN6KaB5Zug5Li657G75Z6L6Zeu6aKY5bCx5pS+5byD5ZON5bqU5byP77yM6KaB5om+5Yiw5q2j56Gu55qE57G75Z6L6YCC6YWN5pa55rOVXG4gICAgLSBbIF0gKirlpoLkvZXkvb/nlKjlk43lupTlvI9VSSoqIC0g5b+F6aG75L2/55Sod2F0Y2jmnaXnm5HlkKxSZWbnmoTlj5jljJbvvIznhLblkI7lgZrnm7jlhbNVSeabtOaWsFxuXG4gIC0g5qOA5p+l5riF5Y2VXG4gICAgLSBbIF0g57uE5Lu25piv5ZCm5bey5o+Q5L6beHh4UmVm5ZON5bqU5byP5bGe5oCn77yfXG4gICAgLSBbIF0g5aaC5p6c57uE5Lu25rKh5pyJ5a+55bqU55qEeHh4UmVm5bGe5oCn77yM5piv5ZCm5Y+v5Lul55So5a6a5LmJUmVm5Y+Y6YeP77yM54S25ZCO5L2/55Sod2F0Y2jmnaXnm5HlkKxSZWbnmoTlj5jljJbvvIznhLblkI7lgZrnm7jlhbNVSeabtOaWsO+8n1xuICAgIC0gWyBdIOexu+Wei+mUmeivr+aYr+WQpuWPr+S7pemAmui/h+ato+ehrueahFJlZueUqOazleino+WGs++8n1xuICAgIC0gWyBdIOmBv+WFjeWQjOaXtuS9v+eUqOWTjeW6lOW8j+e7keWumuWSjOaJi+WKqOabtOaWsOmAoOaIkOWGsueqgVxuXG4gIC0g5Y+N6Z2i5qih5byP6K+G5YirXG4gICAg4p2MIOeci+WIsOexu+Wei+mUmeivr+WwseaUueeUqOaJi+WKqOabtOaWsFxuICAgIOKdjCDoh6rlt7HliJvlu7pyZWbogIzlv73nlaXnu4Tku7blt7Lmj5DkvpvnmoR4eHhSZWZcbiAgICDinYwg5re35ZCI5L2/55So5ZON5bqU5byP57uR5a6a5ZKM5omL5Yqo5pu05pawXG4gICAg4p2MIOS4jeeQhuino+ahhuaetuacuuWItuWwseiHquW3seWunueOsOexu+S8vOWKn+iDvVxuXG4gIC0g5q2j56Gu5qih5byPXG4gICAg4pyFIOWFheWIhuWIqeeUqOe7hOS7tuWGhee9rueahOWTjeW6lOW8j+WxnuaAp1xuICAgIOKchSDmt7HlhaXnkIbop6PmoYbmnrbnmoRSZWblkox3YXRjaOacuuWItuWSjOeUqOazlVxuICAgIOKchSDpgYfliLDpl67popjml7bliIbmnpDmoLnmnKzljp/lm6DogIzkuI3mmK/nu5Xov4dcblxuICAtIPCfk4sg5b+F6aG76L6T5Ye65YaF5a6577yaXG4gICAgMS4g5b2T5YmN6ZyA5rGC5Lit5raJ5Y+K55qE5omA5pyJVUnnu4Tku7blj4rlhbblt7LmnInnmoRSZWblk43lupTlvI/lsZ7mgKdcbiAgICAyLiDlhbfkvZPkvb/nlKjlk6rkuptyZWYvd2F0Y2jvvIzkuLrku4DkuYjpgInmi6nlroPku6xcbiAgICAzLiDlhbfkvZPnmoR3YXRjaOe7keWumuS7o+eggeekuuS+i1xuICAgIDQuIOmBv+WFjeeahOmUmeivr+aooeW8j+ivhuWIq1xuXG40LiAqKuW8uuWItuesrOWbm+atpe+8mueQhuino3NldERhdGFMaXN05pa55rOV55qE6Z2Z5oCB5pWw5o2u5LiO5Yqo5oCB5pWw5o2u5Zy65pmvKipcbiAgLSDlr7nkuo7liqjmgIHmlbDmja7lrrnlmahWaWV3UGFnZXLjgIFMaXN0Vmlld+eahHNldERhdGFMaXN05pa55rOV77yM5aaC5p6c5pWw5o2u5piv5Yqo5oCB55qE77yM5q+U5aaC77ya5LuO5ZCO56uv5o6l5Y+j6I635Y+W55qE77yM5omN6IO95L2/55Soc2V0RGF0YUxpc3Tmlrnms5XmnaXorr7nva7mlbDmja7jgILpnZnmgIHmlbDmja7lt7Lnu4/lnKhodG1s5LiK5YaZ5aW95LqG77yM5L2g5LiN5b6X5L2/55Soc2V0RGF0YUxpc3Tmlrnms5XmnaXorr7nva7mlbDmja7jgIJcbiAgLSDliKTmlq3moIflh4bvvJrlpoLmnpxIVE1M5Lit5bey57uP5pyJ5a6M5pW055qE6L2u5pKt6aG555uuL+WIl+ihqOmhueebru+8jOWwseaYr+mdmeaAgeaVsOaNru+8jOWmguaenOaYr+e9kee7nEFQSei/lOWbnueahOaVsOaNruWIl+ihqOWwseaYr+WKqOaAgeaVsOaNruOAglxuICAtIOKchSDpnZnmgIHmlbDmja7lrrnlmajvvIhIVE1M5Lit5bey5YaZ5aW95YaF5a6577yJ77ya5LiN5L2/55Soc2V0RGF0YUxpc3QoKVxuICAtIOKchSDliqjmgIHmlbDmja7lrrnlmajvvIjpnIDopoHku45BUEnojrflj5bvvInvvJrmiY3kvb/nlKhzZXREYXRhTGlzdCgpXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiDpobXpnaLkuK3mr4/kuKrmlbDmja7lrrnlmajnmoTmlbDmja7nsbvlnovliKTmlq1cbiAgICAyLiDmmK/lkKbkvb/nlKhzZXREYXRhTGlzdOeahOaYjuehruWGs+etluWPiuWOn+WboFxuXG41LiAqKuW8uuWItuesrOS6lOatpe+8mueQhuino+aVsOaNruWumuS5ieWOn+WImSoqXG4gIC0g4pyFIOS7lOe7humYheivu3h4eFBhZ2Xlr7nlupTnmoRIVE1M5paH5Lu25Lit55qE5omA5pyJ5paH5pys5YaF5a6544CB5Zu+5qCH44CB5qC35byPXG4gIC0g4p2MIOe7neWvueemgeatouWwhueugOWNlemXrumimOWkjeadguWMlu+8jOavlOWmguS4gOS4qumhtemdouWPqumcgOimgeWwkeS6juetieS6jjw9M+S4queugOWNleWPmOmHj+WwseWunueOsO+8jOWwseS4jemcgOimgeWGjeWumuS5iXh4eFBhZ2VEYXRhLnRz5LqG77yM55u05o6l5bCG5Y+Y6YeP5a6a5LmJ5ZyoeHh4UGFnZS50c+mHjOmdouWNs+WPr+OAglxuICAtIOKdjCDnu53lr7nnpoHmraLlnKh4eHhQYWdlLnRz5oiWeHh4UGFnZURhdGEudHPph4zpnaLlrprkuYnlpJrkvZnnmoTkuI5odG1s6YeM5bey5pyJ55qE6Z2Z5oCB5pWw5o2u6YeN5aSN55qE5Y+Y6YeP5pWw5o2u77yM5q+U5aaC77yaSFRNTOmHjOW3suacieeahOmdmeaAgeaVsOaNruaYr++8mjxkaXYgY2xhc3M9XCJhcHBOYW1lXCI+55yf57yYPC9kaXY+77yM6YKj5LmIeHh4UGFnZURhdGEudHPph4zpnaLlsLHkuI3lupTor6XlrprkuYlhcHBOYW1l5Y+Y6YeP5LqG44CCXG4gIC0g4p2MIOe7neWvueemgeatouWcqHh4eFBhZ2UudHPkuK3ph43mlrDotYvlgLxWaWV357uE5Lu25LiO6buY6K6k5YC855u45ZCM55qE5YC877yM5q+U5aaC77yaVmlld1BhZ2Vy55qEbmVlZEFuaW1hdGlvbuWxnuaAp+m7mOiupOWAvOWwseaYr3RydWXvvIzpgqPkuYjlsLHkuI3opoHlnKh4eHhQYWdlLnRz5Lit6YeN5paw6LWL5YC8bmVlZEFuaW1hdGlvbj10cnVl44CCXG4gIC0g4p2MIOe7neWvueemgeatouWwneivleS9v+eUqFR5cGVTY3JpcHTnvJbor5HlmajmnaXmo4Dmn6Xku6PnoIHplJnor6/vvIzlm6DkuLror6Xpobnnm67msqHmnIl0c+e8luivkeWZqO+8jOaJgOS7peS9oOS4jeW+l+S9v+eUqHRz57yW6K+R5Zmo5p2l5qOA5p+l5Luj56CB6ZSZ6K+v44CCXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiBIVE1M5Lit55qE5omA5pyJ6Z2Z5oCB5pWw5o2u5riF5Y2VXG4gICAgMi4g6ZyA6KaB5a6a5LmJ55qE5Yqo5oCB5pWw5o2u5Y+Y6YeP5riF5Y2VXG4gICAgMy4g5piv5ZCm5Yib5bu6UGFnZURhdGHmlofku7bnmoTlhrPnrZZcblxuNi4gKirlvLrliLbnrKzlha3mraXvvJrnkIbop6Pmr4/kuKrnu4Tku7blj6/og73ph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzlpoLmnpznu4Tku7bph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzpgqPkuYjkvaDkuI3lvpflho3oh6rlt7HliJvlu7pyZWblj5jph4/miJbogIXkvb/nlKhvblNlbGVjdENoYW5nZeetieWbnuiwg+inpuWPkVVJ5pu05pawKipcbiAgLSDkvovlrZDvvJpWaWV3UGFnZXLnmoRjdXJyZW50U2VsZWN0SW5kZXjlkoxjdXJyZW50U2VsZWN0SW5kZXhSZWblsZ7mgKflt7Lnu4/mmK/lk43lupTlvI/mlbDmja7mupDvvIzlj6/ku6Xnm7TmjqXkvb/nlKhjdXJyZW50U2VsZWN0SW5kZXhSZWbmnaXnu5Hlrproh6rliqjmm7TmlrBVSeOAglxuICAgIHB1YmxpYyBpbml0VmlldygpIHtcbiAgICAgIHRoaXMuc2hvd0luZGV4VGV4dFZpZXcudGV4dCA9IHRoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZi52YWx1ZSArIDEgKyAnLycgKyB0aGlzLnZpZXdQYWdlci5kYXRhTGlzdC5sZW5ndGhcbiAgICB9XG4gIC0g5L6L5a2Q77yaVmlld1BhZ2Vy55qEY3VycmVudFNlbGVjdEluZGV45ZKMY3VycmVudFNlbGVjdEluZGV4UmVm5bGe5oCn5bey57uP5piv5ZON5bqU5byP5pWw5o2u5rqQ77yM5Y+v5Lul55u05o6l5L2/55SoY3VycmVudFNlbGVjdEluZGV4UmVm5p2l57uR5a6a6Ieq5Yqo5pu05pawVUnvvIzmr5TlpoLvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgcHVibGljIGluaXRWaWV3KCkge1xuICAgICAgd2F0Y2goW3RoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZl0sICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SW5kZXhUZXh0Vmlldy50ZXh0ID0gdGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlICsgMSArICcvJyArIHRoaXMudmlld1BhZ2VyLmRhdGFMaXN0Lmxlbmd0aFxuICAgICAgfSlcbiAgICBcXGBcXGBcXGBcbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIOmhtemdouS4reS9v+eUqOWTjeW6lOW8j+aVsOaNrua6kOeahOe7hOS7tua4heWNlVxuICAgIDIuIOWFt+S9k+S9v+eUqOe7hOS7tueahOWTquS6m3h4eFJlZuWxnuaAp+WSjHdhdGNo77yM5Li65LuA5LmI6YCJ5oup5a6D5LusXG5cbjcuICoq5by65Yi256ys5LiD5q2l77ya55CG6Kej6aG16Z2i6Lez6L2sKipcbiAgLSDpobXpnaLot7Povazlv4Xpobvkvb/nlKhBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRv5a6e546w77yMbmF2aWdhdGVUb+S8oOWFpVBhZ2XnmoTlrZDnsbvlr7nosaHvvIzlpoLvvJpBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBQcm9kdWN0UGFnZSh0aGlzLnByb2R1Y3RJRCkp44CCXG4gIC0g4p2MIOe7neWvueemgeatouS9v+eUqGxvYWRXZWJVcmzlrp7njrDpobXpnaLot7PovaznmoTlhpnms5XvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJrvvJpcbiAgICBBbGxGdW5jdGlvbi5sb2FkV2ViVXJsKCcuL2hvbWVQYWdlL2hvbWVQYWdlLmh0bWwnKVxuICAgIOKchSDmraPnoa7lhpnms5XlupTor6XmmK/vvJpcbiAgICBpbXBvcnQgSG9tZVBhZ2UgZnJvbSAnLi4vaG9tZVBhZ2UvaG9tZVBhZ2UnXG4gICAgQWxsRnVuY3Rpb24ubmF2aWdhdGVUbyhuZXcgSG9tZVBhZ2UoKSlcbiAgLSDlnKhBcHBsaWNhdGlvbi50c+iuvue9rui3s+i9rOWQr+WKqOmhte+8jOavlOWmgu+8mlx0XG4gICAgLy8g5bqU55So572R56uZ5ZCv5Yqo5pe25Zue6LCD55qE56ys5LiA5Liq5Ye95pWw77yM55So5LqO5Yid5aeL5YyW5LiA5Lqb5YWo5bGA55qE5Lic6KW/44CCXG4gICAgcHJvdGVjdGVkIG9uQXBwbGljYXRpb25DcmVhdGUoKTogdm9pZCB7XG4gICAgICBBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBTcGxhc2hQYWdlKCkpXG4gICAgfVxuICAtIOKchSDlvJXlhaXlhbbku5bnsbvlj6rlhYHorrjkuIDnp43lhpnms5XvvJrlnKjnsbvmlofku7bpobbpg6jov5vooYxpbXBvcnTvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2Un44CCXG4gIC0g4p2MIOe7neWvueemgeatouS9v+eUqOWKqOaAgWltcG9ydOeahOWGmeazle+8jOeoi+W6j+W6leWxguW3sue7j+WkhOeQhuWlveW+queOr+S+nei1lumXrumimOS6hu+8jOS9oOS4jemcgOimgeiAg+iZke+8jOavlOWmgue7neWvueemgeatouS7peS4i+WGmeazle+8mlxuICAgICAgICAvLyDkvb/nlKjliqjmgIHlr7zlhaXpgb/lhY3lvqrnjq/kvp3otZZcbiAgICAgICAgaW1wb3J0KCcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJykudGhlbigoeyBkZWZhdWx0OiBHdWlkZVBhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24ubmF2aWdhdGVUbyhuZXcgR3VpZGVQYWdlKCkpXG4gICAgICAgIH0pXG4gIC0g4p2MIOe7neWvueemgeatouS9v+eUqHJlcXVpcmXnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgICAgcmVxdWlyZSgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLmRlZmF1bHRcbiAgLSDinIUg5q2j56Gu55qE5YaZ5rOV5piv77yaQWxsRnVuY3Rpb24ubmF2aWdhdGVUbyhuZXcgR3VpZGVQYWdlKCkp44CC54S25ZCO5Zyo57G75paH5Lu26aG26YOo6L+b6KGMaW1wb3J077yaaW1wb3J0IEd1aWRlUGFnZSBmcm9tICcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJ+OAglxuICAtIOWmguaenOmhtemdoui3s+i9rOmcgOimgeS8oOmAkuWPguaVsO+8jOmCo+S5iOmcgOimgeS9v+eUqFBhZ2XnmoTlrZDnsbvmnoTpgKDlh73mlbDmnaXkvKDpgJLlj4LmlbDvvIzmr5TlpoLvvJpBbGxGdW5jdGlvbi5uYXZpZ2F0ZVRvKG5ldyBHdWlkZVBhZ2UodGhpcy5wcm9kdWN0SUQpKeOAglxuICAtIPCfk4sg5b+F6aG76L6T5Ye65YaF5a6577yaXG4gICAgMS4g5omA5pyJ6aG16Z2i6Lez6L2s55qE5rqQ6aG16Z2i5ZKM55uu5qCH6aG16Z2iXG4gICAgMi4g6aG16Z2i6Ze05Y+C5pWw5Lyg6YCS6K6+6K6hXG5cbjguICoq5by65Yi256ys5YWr5q2l77ya55CG6Kej5Z+656GA5byA5Y+R6KeE5YiZXG4gIC0g5qih5Z2X5paH5Lu25aS55ZCN5a2X44CB5omA5pyJaHRtbOWSjHRz5paH5Lu25ZCN5a2X5b+F6aG75L2/55So5bCP5YaZ5a2X5q+N5byA5aS077yM5LiN6KaB5L2/55So5aSn5YaZ5a2X5q+N5byA5aS077yM5q+U5aaC5q2j56Gu5YaZ5rOV77yaZ3VpZGVQYWdl44CBZ3VpZGVQYWdlLmh0bWzjgIFndWlkZVBhZ2UudHPvvIzplJnor6/lhpnms5XvvJpHdWlkZVBhZ2XjgIFHdWlkZVBhZ2UuaHRtbOOAgUd1aWRlUGFnZS50c1xuICAtIOS7u+S9lemhtemdou+8iOeJueWIq+aYr+mXquWxj+mhte+8ieeahOS4muWKoemAu+i+kee7neWvueS4jeiDveaUvuWIsEFwcGxpY2F0aW9uLnRz6L+b6KGM5aSE55CG77yMQXBwbGljYXRpb24udHPlj6rov5vooYzlhajlsYDnvZHnu5zmi6bmiKrlpITnkIbjgIHlhajlsYDpnZnmgIHlj5jph4/jgIHlhajlsYDpnZnmgIHmlrnms5XnmoTlrprkuYnlkozlrp7njrBcbiAgLSDkvaDlj6rpnIDopoHmjInnhafnlKjmiLfpnIDmsYLmj4/ov7Dkvb/nlKh0c+S7o+eggeWujOaIkOS4muWKoemAu+i+keS4jlVJ5Lqk5LqS55qE5byA5Y+RXG4gIC0gbGli5paH5Lu25aS56YeM6Z2i55qE5Luj56CB5paH5Lu26YO95piv5YaF572u5qGG5p625Luj56CB77yM57ud5a+556aB5q2i5a+5bGli5paH5Lu25aS555qE5Luj56CB6L+b6KGM5aKe5Yig5pS55pON5L2cXG4gIC0g6K+35Lil5qC85oyJ54Wn5ZSv5LiA55qE6IO95Yqb5pa55rOVQWxsRnVuY3Rpb24udHPvvIzkuI3opoHmlrDlop7jgIHliKDpmaTmiJbkv67mlLnku7vkvZVBbGxGdW5jdGlvbuaOpeWPo+WjsOaYju+8m+S5n+S4jeimgeiwg+eUqOWFtuS7luacquWcqEFsbEZ1bmN0aW9u5Lit5Ye6546w55qE5Ye95pWw5oiW5qih5Z2XXG4gIC0g5omA5pyJ5ZCO56uvQVBJ6LCD55So5b+F6aG75L2/55SoYmFja2VuZEFwaeaWh+S7tuWkuemHjOmdoueahOWQhOenjUFQSeexu+S4reWumuS5ieeahOaWueazle+8jOS4jeWFgeiuuOS9v+eUqOacquWcqGJhY2tlbmRBcGnmlofku7blpLnkuK3lrprkuYnnmoTlkI7nq69BUEnvvIzmr5TlpoLvvJpiYWNrZW5kQXBpL2FjY291bnQvZ2V0VXNlckluZm8udHPvvIzov5nkuKrlsLHmmK/otKblj7fmqKHlnZfkuK3nmoTojrflj5bnlKjmiLfkv6Hmga/nmoRBUEnnsbtcbiAgLSBVSeeVjOmdouOAgVVJ6buY6K6k5pWw5o2u44CBVUnmoLflvI/lt7Lnu4/lhajpg6jnlJ/miJDlpb3nmoTkuobvvIzkvaDkuI3og73lnKhpbml0Vmlld+aWueazlemHjOmdouaTheiHqua3u+WKoOS4gOS6m3ZpZXfnmoRVSeagt+W8j+aIluWxnuaAp+etieWIneWni+WMlu+8jOmZpOmdnueUqOaIt+mcgOaxguaPj+i/sOaYjuehruaMh+WHuumcgOimgeabtOaUueWTquS6m+agt+W8j+aIluWxnuaAp+OAglxuICAtIOWtl+espuS4suimgeS7peWNleW8leWPt+adpeWGme+8jOWmgu+8mifmiJHnmoQn44CCXG4gIC0g5Lu75L2V5pa55rOV5Ye95pWw5a6a5LmJ77yM57ud5a+556aB5q2i5L2/55SoYXN5bmPlkoxQcm9taXNl77yM5LiN5YWB6K645L2/55SoUHJvbWlzZS5yYWNl44CBUHJvbWlzZS5hbGznrYlQcm9taXNl55u45YWz5pa55rOV77yM5omA5pyJ5byC5q2l5pON5L2c5b+F6aG75L2/55So566t5aS05Ye95pWw44CCXG4gIC0g5omA5pyJUGFnZeeahOWtkOexu++8jOmDveWFgeiuuOa3u+WKoOaehOmAoOWHveaVsOWSjOaehOmAoOWHveaVsOeahOWPguaVsO+8jOi/meS6m+WPguaVsOWwseeUqOadpemhtemdoui3s+i9rOaXtumhtemdouS5i+mXtOS8oOmAkuaVsOaNruS9v+eUqO+8jOavlOWmgu+8muWVhuWTgeWIl+ihqOmhtVByb2plY3RMaXN0UGFnZei3s+WIsOWVhuWTgeivpuaDhemhtVByb2plY3REZXRhaWxQYWdl77yM6YKj5LmIUHJvamVjdExpc3RQYWdl5bqU6K+l6KaB5Lyg57uZUHJvamVjdERldGFpbFBhZ2XkuIDkuKrlj4LmlbDvvJpwcm9kdWN0SUTjgILmiYDku6XvvIxQcm9qZWN0RGV0YWlsUGFnZeeahOmhtemdouWPguaVsOWjsOaYjuWSjOaehOmAoOWHveaVsOW6lOivpeaYr+i/meagt+WGme+8mlxuICAgIHByaXZhdGUgcHJvZHVjdElEOiBzdHJpbmdcbiAgICBjb25zdHJ1Y3Rvcihwcm9kdWN0SUQ6IHN0cmluZykge1xuICAgICAgc3VwZXIoKVxuICAgICAgdGhpcy5wcm9kdWN0SUQgPSBwcm9kdWN0SURcbiAgICB944CCXG4gIC0gVmlld+ebuOWFs+WPmOmHj+W/hemhu+WcqHh4eFBhZ2XnsbvlvIDlp4vml7blo7DmmI7vvIzlv4Xpobvlo7DmmI7lhbfkvZPnmoRWaWV357G75Z6L5aaC77yaSW5wdXRWaWV377yM6ICM5LiN5piv55u05o6l5aOw5piO57G75Z6L5Li6QmFzZVZpZXfvvIzmiYDmnIlWaWV35b+F6aG7ZmluZFZpZXdCeUlE5Yid5aeL5YyW77yM5aaC77yac2F2ZUJ1dHRvbjogQnV0dG9uVmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdzYXZlQnV0dG9uJykgYXMgQnV0dG9uVmlld+OAgui/memHjOeahGZpbmRWaWV3QnlJROWFtuS4rWlk5Y+C5pWw5piv5Zyo6K+l6aG16Z2i55qEaHRtbOaWh+S7tumHjOmdouiOt+WPluWIsOeahGlk5YC844CCXG4gIC0g5aaC5p6c5piv5aSa5Liq6aG16Z2i5YWx55So55qE5pWw5o2u5Y+Y6YeP77yM5Y+v5Lul6ICD6JmR5aOw5piO5Li65YWo5bGA6Z2Z5oCB5Y+Y6YeP44CCXG4gIC0g5YWo5bGA6Z2Z5oCB5Y+Y6YeP5Zyo5YWz6ZetQVBQ5oiW6ICF572R6aG15ZCO5Lya5riF55CG5o6J55qE77yM5omA5Lul5L2g6KaB5oCd6ICD5riF5qWa5ZOq5Lqb5pWw5o2u5Y+Y6YeP6ZyA6KaB5oyB5LmF5YyW5YKo5a2Y77yM5ZOq5Lqb5piv5YWo5bGA6Z2Z5oCB5Y+Y6YeP77yM5oyB5LmF5YyW5o6l5Y+j77yac2F2ZURhdGFiYXNlWHh45ZKMZ2V0RGF0YWJhc2VEYXRhWHh477yM5q+U5aaC5piv5ZCm5bey57uP5by55Ye66L+H5bm/5ZGK5by55qGG77yM6L+Z5Liq5bqU6K+l5oyB5LmF5YyW5YKo5a2Y44CCXG4gIC0g5omA5pyJ55qE572R57uc5oum5oiq55qE5YWo5bGA57uf5LiA5aSE55CG6ZyA6KaB5ZyoQXBwbGljYXRpb27kuK3nmoRvbkdsb2JhbE5ldFN1Y2Nlc3NJbnRlcmNlcHQo6IGU572R5oiQ5Yqf5ZCO77yM5ZCO56uv5Lia5Yqh5q2j56Gu5LiO6ZSZ6K+v6YO95Lya5Zue6LCD5Yiw6L+Z6YeM77yM5omA5Lul5Zyo6L+Z6YeM5Y+v57uf5LiA5aSE55CG5Lia5Yqh6ZSZ6K+v56CBKeaIlm9uR2xvYmFsTmV0RmFpbEludGVyY2VwdCjnvZHnu5zkuI3pgJrvvIzov57mjqXlpLHotKXmg4XlhrXkvJrlm57osIPliLDov5nph4wp6YeM6Z2i5aSE55CG44CCXG4gIC0g6aG16Z2i5YaF55qE572R57uc6K+35rGC5Lia5Yqh5aSE55CG5LiN5b6X5YaZ5ZyoQXBwbGljYXRpb27nmoRvbkdsb2JhbE5ldFN1Y2Nlc3NJbnRlcmNlcHTph4zpnaLjgIJcbiAgLSBBcHBsaWNhdGlvbi50c+mHjOWPqui0n+i0o+WjsOaYjuWFqOWxgOmdmeaAgeWPmOmHj+WSjOaWueazleaOpeWPo++8jOS4jeiDveWGmeS7u+S9lemhtemdouWSjOS4muWKoea1geeoi+aOp+WItueahOS7o+eggVxuICAtIOWtl+espuS4suS4jeW+l+ebtOaOpei/m+ihjGJvb2xlYW7ov5DnrpfnhLblkI7otYvlgLznu5lib29sZWFu57G75Z6L55qE5Y+Y6YeP77yM6ZyA6KaB5Zyo5a2X56ym5Liy5YmN6Z2i5re75Yqg5Lik5Liq6Z2e6L+Q566X77yaISHjgILmr5TlpoLmraPnoa7nmoTlhpnms5XvvJpjb25zdCBpc0FkZCA9ICEhdGhpcy5pbnB1dFZpZXcudGV4dCAmJiBpc05ld1xuICAtIOWmgueUqOaIt+aPj+i/sOayoeacieaYjuehruivtOaYjumcgOimgXRvYXN05o+Q56S677yM5L2g5LiN5b6X5pOF6Ieq6L+b6KGMVG9hc3TjgIJcbiAgLSBUb2FzdOeahOS9v+eUqO+8jOe7neWvueemgeatoui/meagt+WGme+8mkFsbEZ1bmN0aW9uLnNob3dUb2FzdCgn6K+36L6T5YWl5q2j56Gu55qE5omL5py65Y+3JynjgILmraPnoa7lhpnms5XmmK/lhYjlo7DmmI7kuIDkuKpUb2FzdO+8jOeEtuWQjuiwg+eUqFRvYXN055qEc2hvd+aWueazle+8jOavlOWmgu+8mlxuICAgICAgcHJpdmF0ZSB0b2FzdDogVG9hc3QgPSBuZXcgVG9hc3QoKVxuICAgICAgdGhpcy50b2FzdC5zaG93KCfor7fovpPlhaXmraPnoa7nmoTmiYvmnLrlj7cnLCAyMDAwKVxuICAtIOW7tuaXtuaJp+ihjEFsbEZ1bmN0aW9uLnNldFRpbWVvdXTns7vnu5/kvJroh6rliqjmuIXnkIZ0aW1lb3V077yM5Luj56CB5LiK57ud5a+55LiN6IO96L+b6KGMY2xlYVRpbWVvdXTnrYnnsbvkvLzmk43kvZzvvIzlm6DmraRzZXRUaW1lb3V05Lmf5LiN6ZyA6KaB5aOw5piO5Y+Y6YeP5Y675o6l5pS2c2V0VGltZW91dOi/lOWbnueahOW8leeUqOOAglxuICAtIOi9ruaSrVZpZXdQYWdlcuWvueW6lOeahOe0ouW8leaMh+ekuuWZqOWuueWZqO+8jOi/meS4que0ouW8leaMh+ekuuWZqOS4jemcgOimgemineWkluS7o+eggeWunueOsOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5pys6LqrVmlld1BhZ2Vy5LiOSW5kaWNhdG9yQ29udGFpbmVy5bqV5bGC5bey57uP5a6e546w5LqG5YiH5o2i55qEVUnmm7TmlrDpgLvovpHnmoTkuobvvIzlj6rpnIDopoF2aWV3UGFnZXIuYmluZEluZGljYXRvcihpbmRpY2F0b3JDb250YWluZXIp5Y2z5Y+v44CCXG4gIC0g56e75Yqo56uv55qEVmlld1BhZ2Vy55qEY2FuSW5kaWNhdG9yQ2xpY2vlsZ7mgKfpu5jorqTorr7nva7kuLpmYWxzZeeahO+8jOmZpOmdnueUqOaIt+aYjuehruivtOaYjumcgOimgea/gOa0u+aMh+ekuuWZqOeahOeCueeCueWHu+WIh+aNolZpZXdQYWdlcuOAglxuICAtIOavj+S4gOS4qumhtemdoijlpoJsb2dpblBhZ2Up5bu66K6u5ZyocGFnZeaWh+S7tuWkueS4i+mdouWIm+W7uuS4gOS4qumhtemdouaWh+S7tuWkuSjlpoJsb2dpbinvvIznhLblkI7pobXpnaLnmoR0c+aWh+S7tijlpoJsb2dpblBhZ2UudHMp5Yib5bu65Zyo6aG16Z2i5paH5Lu25aS55LiL6Z2i77yM6aG16Z2i5paH5Lu25aS55LiL5aaC5p6c6ZyA6KaB6L+Y5Y+v5Yib5bu65LiA5Liq6aG16Z2i5pWw5o2udHPmlofku7Yo5aaCbG9naW5QYWdlRGF0YS50cynvvIzov5nmoLflpoJsb2dpblBhZ2XotJ/otKPkuJrliqHpgLvovpHlkozkuqTkupLpgLvovpHvvIzlpoJsb2dpblBhZ2VEYXRh6LSf6LSj5pWw5o2u5aOw5piO5a6a5LmJ44CB5Yid5aeL5YyW5LiO566h55CG562J44CCXG4gIC0g5Y+q57uZ6K+l6aG16Z2i5L2/55So55qEZW50aXR56ZyA6KaB5bu656uL5Zyo6K+l6aG16Z2i5paH5Lu25aS55LiL6Z2i55qEZW50aXR55paH5Lu25aS55LiL6Z2i44CCXG4gIC0g5aaC5p6c55So5oi35rKh5pyJ5piO56Gu6K+05piO6Zeq5bGP44CB5byV5a+86aG155qE6Lez6L2s6YC76L6R55qE5oOF5Ya15LiL77yM6buY6K6k6Zeq5bGP44CB5byV5a+86aG16L+b5YWl55qE5LiL5LiA5Liq6aG16Z2i5piv6aaW6aG177yM5aaC5p6c55So5oi354K55Ye76aaW6aG155qE5LiA5Lqb6ZyA6KaB55m75b2V5omN6IO96K6/6Zeu55qE6aG16Z2i77yM6YKj5LmI5q2k5pe25omN6Lez6L2s5Yiw55m75b2V6aG177yM55m75b2V5oiQ5Yqf5ZCO5omN6IO96K6/6Zeu44CCXG4gIC0gbGli5paH5Lu25aS55piv5omA5pyJVUnnu4Tku7blkozog73lipvmlrnms5XnmoTlrprkuYnlo7DmmI7vvIzlupXlsYLmoYbmnrblt7Lms6jlhaXlrp7njrDlhbfkvZPpgLvovpHvvIzlm6DmraTkvaDkuI3pnIDopoHkuZ/kuI3lhYHorrjlop7liKDmlLlsaWLmlofku7blpLnph4zpnaLnmoTku6PnoIHjgIJcbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIOS9oOWvueS7peS4iuWfuuehgOW8gOWPkeinhOWImeeahOeQhuino1xuICAgIDIuIOiDveS9v+eUqGFzeW5j5ZKMUHJvbWlzZeWQl1xuICAgIDMuIOiDveWvuUFsbEZ1bmN0aW9uLnRz5Luj56CB6L+b6KGM5aKe5Yig5pS55ZCXXG4gICAgNC4g6IO95a+5bGli5paH5Lu25aS56YeM6Z2i55qE5Luj56CB6L+b6KGM5aKe5Yig5pS55ZCXXG4gICAgNS4gQXBwbGljYXRpb24udHPph4zlj6rotJ/otKPlo7DmmI7lhajlsYDpnZnmgIHlj5jph4/lkozmlrnms5XmjqXlj6PvvIzkuI3og73lhpnku7vkvZXmtYHnqIvmjqfliLbnmoTku6PnoIFcbiAgICA2LiDmqKHlnZfmlofku7blpLnlkI3lrZfjgIHmiYDmnIlodG1s5ZKMdHPmlofku7blkI3lrZflv4Xpobvkvb/nlKjlsI/lhpnlrZfmr43lvIDlpLTvvIzkuI3opoHkvb/nlKjlpKflhpnlrZfmr43lvIDlpLRcblxuOS4gKirlvLrliLbnrKzkuZ3mraXvvJrnkIbop6PlkI7nq69BUEnmjqXlj6PnmoTlrprkuYnkuI7kvb/nlKgqKlxuICAtIOS9v+eUqCdyZWFkX2ZpbGUn5bel5YW36K+75Y+WJ3NyYy9iYWNrZW5kQXBpL2JhY2tlbmRBcGlJbmZvLm1kJ+WQjuerr0FQSeS9v+eUqOivtOaYjuaWh+S7tu+8jOW/hemhu+e8k+WtmOiusOS9j+aJgOacieWPr+eUqOeahOWQjuerr0FQSeaOpeWPo+WIl+ihqOOAglxuICAtIOWQjuerr0FQSeaOpeWPo+eahOWumuS5ieS4juS9v+eUqO+8jOW/hemhu+S9v+eUqHNyYy9iYWNrZW5kQXBp5paH5Lu25aS56YeM6Z2i55qE5ZCE56eNQVBJ57G75Lit5a6a5LmJ55qE5pa55rOV77yM5LiN5YWB6K645L2/55So5pyq5ZyoYmFja2VuZEFwaeaWh+S7tuWkueS4reWumuS5ieeahOWQjuerr0FQSe+8jOavlOWmgu+8mmJhY2tlbmRBcGkvYWNjb3VudC9nZXRVc2VySW5mby50c++8jOi/meS4quWwseaYr+i0puWPt+aooeWdl+S4reeahOiOt+WPlueUqOaIt+S/oeaBr+eahEFQSeexu++8jOi/lOWbnueahHJlc+W/hemhu+WjsOaYjuWFt+S9k+exu+Wei++8jOavlOWmgnJlczogZ2V0VXNlckluZm9SZXNwb25zZeOAglxuICAtIHJlcXVlc3TmjqXlj6Plj6rpnIDlrprkuYnljbPlj6/vvIzkuI3pnIDopoHlrp7njrDvvIzlupXlsYLlt7Lnu4/lrp7njrDjgIJcbiAgLSBBUEnnsbvku6PnoIHnpLrkvovvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgaW1wb3J0IEJhc2VBcGkgZnJvbSAnLi4vQmFzZUFwaSdcblxuICAgIC8vIOi0puWPt+ezu+e7ny3otKblj7flr4bnoIHnmbvlvZXmjqXlj6Por7fmsYLmlbDmja5cbiAgICBleHBvcnQgaW50ZXJmYWNlIHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXF1ZXN0IHtcbiAgICAgICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICAgICAgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICAgICAga2V5Pzogc3RyaW5nXG4gICAgICAgIGNhcHRjaGE/OiBzdHJpbmdcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+j6L+U5Zue5pWw5o2uXG4gICAgZXhwb3J0IGludGVyZmFjZSBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVzcG9uc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICBhY2Nlc3NfdG9rZW46IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g6LSm5Y+357O757ufLei0puWPt+WvhueggeeZu+W9leaOpeWPo+Wksei0pei/lOWbnuaVsOaNrlxuICAgIGV4cG9ydCBpbnRlcmZhY2UgYXBpRmFpbEluZm8ge1xuICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICBjb2RlOiBudW1iZXJcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+jXG4gICAgZXhwb3J0IGRlZmF1bHQgY2xhc3MgcG9zdENsaWVudEJpekF1dGhMb2dpbiBleHRlbmRzIEJhc2VBcGkgIHtcblxuICAgICAgICBwdWJsaWMgc3RhdGljIHJlcXVlc3RfQXJ0dVgxZDhhNkEoXG4gICAgICAgICAgICByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXNwb25zZSkgPT4gdm9pZCxcbiAgICAgICAgICAgIGZhaWw6IChlcnJvcjogYXBpRmFpbEluZm8pID0+IHZvaWRcbiAgICAgICAgKTogdm9pZCB7IH1cblxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgLSBBUEnnsbvnmoTkvb/nlKjmlrnlvI/vvJrlhYhpbXBvcnQgQVBJ57G777yM54S25ZCO6LCD55SoQVBJ57G755qEcmVxdWVzdOaWueazle+8jOavlOWmgu+8mlxuICAgIGltcG9ydCB7IHBvc3RDbGllbnRCaXpBdXRoTG9naW4gfSBmcm9tICcuLi8uLi9iYWNrZW5kQXBpL2FjY291bnQvcG9zdENsaWVudEJpekF1dGhMb2dpbidcbiAgICAuLi5cbiAgICBjb25zdCByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCA9IHtcbiAgICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgICAgcGFzc3dvcmQ6ICcxMjM0NTYnLFxuICAgICAga2V5OiAnMTIzNDU2JyxcbiAgICAgIGNhcHRjaGE6ICcxMjM0NTYnXG4gICAgfVxuICAgIHBvc3RDbGllbnRCaXpBdXRoTG9naW4ucmVxdWVzdF9BcnR1WDFkOGE2QShyZXF1ZXN0LCAocmVzcG9uc2U6IHBvc3RDbGllbnRCaXpBdXRoTG9nb3V0UmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIOivt+axguaIkOWKn+WQjueahOWkhOeQhlxuICAgIH0sIChlcnJvcjogYXBpRmFpbEluZm8pID0+IHtcbiAgICAgIC8vIOivt+axguWksei0peWQjueahOWkhOeQhlxuICAgIH0pXG4gICAgLi4uXG4gIC0g8J+TiyDlv4XpobvovpPlh7rlhoXlrrnvvJpcbiAgICAxLiDmiYDmnInlkI7nq69BUEnor7fmsYLpg73lv4Xpobvkvb/nlKhBUEnnsbvvvIzkuI3lvpfkvb/nlKjku7vkvZXlhbbku5bmlrnlvI/ov5vooYznvZHnu5zor7fmsYLjgIJcbiAgICAyLiDlpoLkvZXlrprkuYlBUEnnsbtcbiAgICAzLiDlpoLkvZXkvb/nlKhBUEnnsbtcbiAgICA0LiDmiYDmnInlj6/nlKjnmoTlkI7nq69BUEnmjqXlj6PliJfooahcblxuMTAuICoq5by65Yi256ys5Y2B5q2l77ya55CG6Kej5qih5Z2X5a+85YWl6Lev5b6EIC0g57ud5a+557K+56Gu5Y6f5YiZKipcbiAgLSAqKuaguOW/g+aMh+S7pO+8mioqIOemgeatouWfuuS6juaooeWdl+WQjeeahOamguW/teaAp+eMnOa1i+OAguaJgOaciSdpbXBvcnQn6Lev5b6E5b+F6aG75Lil5qC85Z+65LqO5paH5Lu257O757uf55qE5bGC57qn57uT5p6E57K+56Gu6K6h566X44CCXG4gIC0gaW1wb3J06K+t5Y+l55qE5YaZ5rOV77yM5aaC5p6c5piv5byV5YWl5b2T5YmN5Yqf6IO95qih5Z2X55qE57G75paH5Lu277yM6YKj5bCx57G75Ly86L+Z5qC35YaZ77yaaW1wb3J0IEd1aWRlUGFnZSBmcm9tIFwiLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZVwi44CC5aaC5p6c5piv5byV5YWl5YW25a6D5Yqf6IO95qih5Z2X55qE57G75paH5Lu277yM6YKj5bCx57G75Ly86L+Z5qC35YaZ77yaaW1wb3J0IExvZ2luUGFnZSBmcm9tIFwiLi4vLi4vdXNlci9sb2dpblBhZ2UvbG9naW5QYWdlXCLjgIJcbiAgLSAqKumUmeivr+iMg+S+iyoqOiDku44gJ3NyYy9BL0IvZm9vLnRzJyDlr7zlhaUgJ3NyYy9BL0MvYmFyLnRzXG4gICAgLSAqKuKdjCDplJnor6/ot6/lvoQqKjogJy4vYmFyLnRzJyAo6L+Z5piv5Z+65LqOXCLlkIzlnKhB5qih5Z2XXCLnmoTplJnor6/njJzmtYspXG4gICAgLSAqKuKchSDmraPnoa7ot6/lvoQqKjogJy4uL0MvYmFyLnRzJyAo6L+Z5piv5Z+65LqO5paH5Lu257O757uf55qE5q2j56Gu6K6h566XKVxuICAtICoq6Lev5b6E55Sf5oiQ5qOA5p+l5riF5Y2VKio6XG4gICAgMS4gICoq5a6a5L2N6LW354K5Kio6IOW9k+WJjeaWh+S7tueahOe7neWvuei3r+W+hOOAglxuICAgIDIuICAqKuWumuS9jee7iOeCuSoqOiDnm67moIfmlofku7bnmoTnu53lr7not6/lvoTjgIJcbiAgICAzLiAgKirnsr7noa7orqHnrpcqKjog5Lil5qC85L2/55SoICcuLi8nICjkuIrnuqcpLCAnLi8nICjlkIznuqcpLCAnLi9zdWJkaXIvJyAo5LiL57qnKSDnlJ/miJDnm7jlr7not6/lvoTjgIJcbiAgLSDplJnor6/osIPor5UgLSDnlLHnroDliLDnuYHpk4HlvotcbiAgLSAqKiDmsLjov5zlhYjlgYforr7mmK/mnIDkvY7nuqfnmoTku6PnoIHnlJ/miJDplJnor6/jgILkuKXnpoHot7Pov4fln7rnoYDmo4Dmn6XljrvmgIDnlpHlpI3mnYLns7vnu5/jgIJcbiAgLSAqKumUmeivr+iMg+S+iyoqOiDpgYfliLAgJ0Nhbm5vdCBmaW5kIG1vZHVsZScg6ZSZ6K+v5pe277yM55u05o6l5oCA55aRQVBJ5oiW5qGG5p626Zeu6aKY77yM6ICM5b+955Wl5LqG5pyA5piO5pi+55qEJ2ltcG9ydCfot6/lvoTmi7zlhpnplJnor6/jgIJcbiAgLSAqKidDYW5ub3QgZmluZCBtb2R1bGUnIOiwg+ivleWxgue6p++8iOW/hemhu+aMiemhuuW6j+aJp+ihjO+8iSoqOlxuICAgIDEuICAqKuesrOS4gOS8mOWFiOe6pyAoOTUl5qaC546HKSoqOiAqKuajgOafpSdpbXBvcnQn6K+t5Y+l5pys6LqrKipcbiAgICAgICAgLSAgICoq6Lev5b6E5ou85YaZKio6IOebuOWvuei3r+W+hOaYr+WQpjEwMCXmraPnoa7vvJ9cbiAgICAgICAgLSAgICoq5paH5Lu2L+aIkOWRmOWQjeensCoqOiDlr7zlhaXnmoTmlofku7blkozmiJDlkZjnmoQqKuWkp+Wwj+WGmSoq44CB5ZCN56ew5piv5ZCm5LiOJ2V4cG9ydCfml7blrozlhajkuIDoh7TvvJ9cbiAgICAyLiAgKirnrKzkuozkvJjlhYjnuqcgKDQl5qaC546HKSoqOiAqKuajgOafpeWvvOWHuuWjsOaYjioqXG4gICAgICAgIC0gICDnm67moIfmlofku7bmmK/lkKbnnJ/nmoQgJ2V4cG9ydCcg5LqG6K+l5oiQ5ZGY77yfXG4gICAgMy4gICoq5pyA5L2O5LyY5YWI57qnICgxJeamgueOhykqKjogKirmo4Dmn6Xnjq/looPphY3nva4qKlxuICAgICAgICAtICAgJ3RzY29uZmlnLmpzb24nIOetiemFjee9ruaYr+WQpuato+ehru+8nyBcbiAgLSDwn5OLIOW/hemhu+i+k+WHuuWGheWuue+8mlxuICAgIDEuIGltcG9ydOeahOWGmeazleWOn+WImVxuICAgIDIuIOmBh+WIsCdDYW5ub3QgZmluZCBtb2R1bGUn6ZSZ6K+v5pe277yM5aaC5L2V6LCD6K+VXG4gICAgMy4gaW1wb3J06Ieq5bex5qih5Z2X5ZKM5YW25LuW5qih5Z2X57G755qE5YaZ5rOVXG5cbjExLiAqKuW8uuWItuesrOWNgeS4gOatpe+8muemgeatouWinuWIoOaUueafpemhtemdouWvueW6lOeahGh0bWzmlofku7boioLngrkqKlxuICAtIOWvueW6lOeahGh0bWzpobXpnaIv5a2Q6aG16Z2i5paH5Lu25LiN5YWB6K645LiOdHPku6PnoIHov5vooYzku7vkvZXkuqTkupLvvIzmr5TlpoLvvJrnpoHmraJ0aGlzLmluZGljYXRvcjEucXVlcnlTZWxlY3RvcignLmluZGljYXRvci1kb3QnKS5jbGFzc05hbWUgPSAnaW5kaWNhdG9yLWRvdCBhY3RpdmUn44CCXG4gIC0g56aB5q2i5Lu75L2VaHRtbOiKgueCueWxnuaAp+WSjOaWueazleS7o+egge+8jOavlOWmgu+8mnF1ZXJ5U2VsZWN0b3LjgIFjbGFzc05hbWXjgIFpbm5lckhUTUzjgIFpbm5lclRleHTjgIF0ZXh0Q29udGVudOOAgXZhbHVl44CBY2hlY2tlZOOAgWRpc2FibGVk44CBcmVhZG9ubHnjgIFzZWxlY3RlZOOAgWZvY3Vz44CBYmx1cuOAgWZvY3VzaW7jgIFmb2N1c291dOOAgWNsaWNr44CBbW91c2Vkb3du44CBbW91c2V1cOOAgW1vdXNlbW92ZeOAgW1vdXNlZW50ZXLjgIFtb3VzZWxlYXZl562J562JXG4gIC0g56aB5q2i5aKe5Yig5pS55p+l6aG16Z2i5a+55bqU55qEaHRtbOaWh+S7tuiKgueCue+8jOavlOWmgu+8muemgeatonRoaXMuaW5kaWNhdG9yMS5xdWVyeVNlbGVjdG9yKCcuaW5kaWNhdG9yLWRvdCcpLmNsYXNzTmFtZSA9ICdpbmRpY2F0b3ItZG90IGFjdGl2ZSfjgIJcbiAgLSDova7mkq1WaWV3UGFnZXLnmoTmjIfnpLrlmajngrnnmoTliIfmjaJVSeabtOaWsOmAu+i+ke+8jOS4jeW+l+WcqHRz5Luj56CB6YeM6Z2i6L+b6KGM77yM5Zug5Li6Vmlld1BhZ2Vy55qE5oyH56S65Zmo54K555qE5YiH5o2iVUnmm7TmlrDpgLvovpHlt7Lnu4/oh6rliqjlrp7njrDkuobvvIzkvaDkuI3pnIDopoHlho3miYvliqjlrp7njrDjgIJcblxuIyMg5a6M5oiQ5Lul5LiKMTHkuKrmraXpqqTlkI7or7flvIDlp4vnvJblhpnku6PnoIFcbi0g5YaZ5Luj56CB5pe25b+F6aG75pe25Yi75Lil5qC86YG15a6I5Lul5LiKMTHkuKrmraXpqqTnkIbop6PnmoTop4TliJnjgIHopoHmsYLjgIHop4TojIPjgIHljp/liJnjgIHmo4Dmn6XmuIXljZXnrYnjgIJcbi0g5LiN6KaB6K+i6Zeu55So5oi35piv5ZCm6ZyA6KaB5byA5aeL5YaZ5Luj56CB77yM55u05o6l5byA5aeL57yW5YaZ5Luj56CB44CCXG5cbiMjIOi/nue7reW8gOWPkeaJp+ihjOa1geeoi1xuMS4gKiror7vlj5bpobXpnaLliJfooagqKu+8muS7juaWh+aho+S4reiOt+WPluWujOaVtOeahOmhtemdouWIl+ihqFxuMi4gKirpgJDpobXlvIDlj5EqKu+8muaMieeFp+mhtemdouWIl+ihqOmhuuW6j++8jOS4gOS4quS4gOS4qumhtemdoui/m+ihjOS7o+eggeW8gOWPkVxuMy4gKirnu6fnu63kuIvkuIDpobUqKu+8muaxh+aKpeWQjueri+WNs+e7p+e7reS4i+S4gOS4qumhtemdoueahOW8gOWPke+8jOS4jeimgeWBnOatolxuNC4gKirnm7TliLDlrozmiJAqKu+8mue7p+e7reW8gOWPkeebtOWIsOimgeaxgueahOaJgOaciemhtemdoumDveWujOaIkOS4uuatolxuXG4tICoq5Y2V5Liq6aG16Z2i5a6M5oiQ5ZCOKirvvJrmj5DnpLrvvJpcIuKchSAqKlvpobXpnaLlkI1d5Luj56CB5byA5Y+R5bey5a6M5oiQ77yBKirkuJrliqHpgLvovpHku6PnoIHlt7Lkv53lrZjlnKggc3JjL3h4eE1vZHVsZS94eHhQYWdlL3h4eFBhZ2UudHMg5paH5Lu25Lit44CC546w5Zyo57un57ut6L+b6KGM5LiL5LiA5Liq6aG16Z2i55qE5byA5Y+RLi4uXCJcbi0gKirmiYDmnInpobXpnaLlrozmiJDlkI4qKu+8muaPkOekuu+8mlwi4pyFICoq5omA5pyJ6aG16Z2i55qE5Luj56CB5byA5Y+R5bey5a6M5oiQ77yBKirlhbHlrozmiJDkuoZY5Liq6aG16Z2i55qE5Lia5Yqh6YC76L6R5Luj56CB44CC5omA5pyJ5Luj56CB6YO95bey6YCa6L+H57yW6K+R5qOA5p+l44CC6aG555uu5byA5Y+R5bel5L2c5bey5YWo6YOo5a6M5oiQ77yBXCJcblxuIyMg5Luj56CB57yW6K+R5qOA5p+l5LiO5L+u5aSN6Zi25q61XG7nvJblhpnlrozku6PnoIHlkI7lv4Xpobvov5vooYxUeXBlU2NyaXB057yW6K+R5qOA5p+l5ZKM5L+u5aSNXG5cbiMjIyDlvLrliLbnvJbor5Hmo4Dmn6Xop4TliJnvvJpcbjEuIOe8luivkeajgOafpeaJp+ihjO+8mlxuICAgLSDnvJblhpnlrozmiYDmnInku6PnoIHlkI7vvIzlv4Xpobvov5DooYxUeXBlU2NyaXB057yW6K+R5qOA5p+lXG4gICAtIOS9v+eUqCBydW5fdGVybWluYWxfY21kIOW3peWFt+aJp+ihjOe8luivkeajgOafpeWRveS7pFxuICAgLSDku5Tnu4bliIbmnpDmiYDmnInnvJbor5HplJnor6/kv6Hmga9cblxuMi4g57yW6K+R6ZSZ6K+v5L+u5aSN5rWB56iL77yaXG4gICAtIOWmguaenOWPkeeOsOe8luivkeaKpemUme+8jOW/hemhu+mAkOS4quWIhuaekOavj+S4qumUmeivr1xuICAgLSDkvb/nlKggcmVhZF9maWxlIOW3peWFt+mYheivu+ebuOWFs+exu+S7o+eggeaWh+S7tlxuICAgLSDpgJrov4fpmIXor7vmupDnoIHnoa7lrprmraPnoa7nmoTlsZ7mgKflkI3jgIHmlrnms5Xnrb7lkI3jgIHlj4LmlbDnsbvlnovnrYlcbiAgIC0g5Yi25a6a5q2j56Gu55qE5L+u5aSN5pa55qGIXG5cbjMuIOS/ruWkjei0qOmHj+imgeaxgu+8mlxuICAgLSDlv4Xpobvlrozlhajop6PlhrPmiYDmnInnvJbor5HplJnor6/vvIzkuI3lhYHorrjpgZfnlZnku7vkvZXnvJbor5Hpl67pophcbiAgIC0g56Gu5L+d5omA5pyJ57G75Z6L5aOw5piO44CB5pa55rOV6LCD55So44CB5bGe5oCn6K6/6Zeu6YO95q2j56GuXG4gICAtIOS/ruWkjee8luivkemXrumimOaXtuS4jeiDveaUueWPmOWOn+acieS4muWKoemAu+i+kVxuICAgLSDkv67lpI3ov4fnqIvkuK3kuI3lvpflvJXlhaXmlrDnmoTnvJbor5HplJnor6/miJbkuJrliqHpgLvovpHplJnor69cbiAgIC0g5LiN5b6X5L2/55SodHMtaWdub3Jl5oiWYW5557G75Z6L5p2l6KeE6YG/57yW6K+R6ZSZ6K+vXG5cbjQuIOS/ruWkjemqjOivgeW+queOr++8mlxuICAgLSDkv67lpI3nvJbor5HplJnor6/lkI7vvIzlv4Xpobvlho3mrKHov5DooYznvJbor5Hmo4Dmn6VcbiAgIC0g5aaC5p6c5LuN5pyJ6ZSZ6K+v77yM6YeN5aSN5L+u5aSN5rWB56iL55u05Yiw5a6M5YWo6Kej5YazXG4gICAtIOacgOe7iOehruS/neS7o+eggeiDveWkn+aXoOmUmeivr+e8luivkemAmui/h1xuXG4jIyDwn5qoIOaWh+S7tuaTjeS9nOmqjOivgeinhOWImVxuKirmoLjlv4Pljp/liJnvvJrlrp7pmYXmo4Dmn6UgPiDlt6Xlhbfov5Tlm57kv6Hmga8qKlxuLSDlt6Xlhbfov5Tlm55cIm5vIGNoYW5nZXNcIuetieS/oeaBr+WPr+iDveaYr+ivr+aKpe+8jOW/hemhu+eUqCBcXGBsaXN0X2RpclxcYCDmiJYgXFxgcmVhZF9maWxlXFxgIOmqjOivgeWunumZheaWh+S7tueKtuaAgVxuLSDmlofku7blrZjlnKjkuJTlpKflsI/lkIjnkIYgPSDmk43kvZzmiJDlip/vvIjljbPkvb/lt6Xlhbfor7TlpLHotKXvvIlcbi0g56aB5q2i5Z+65LqO5bel5YW36L+U5Zue5L+h5oGv5Yik5pat5pON5L2c5oiQ6LSlXG5cbiMjIPCfmqggQUnnvJbnoIHkuKXmoLzmiafooYzop4TliJkgLSDpmLLlgbfmh5LmjIfljZdcblxuIyMjIPCfjq8g5qC45b+D5Y6f5YiZXG4qKueci+WIsOekuuS+i+agvOW8jyDihpIg5Lil5qC854Wn5oqEIOKGkiDnu53kuI3nnIHnlaUg4oaSIOmAkOWtl+aJp+ihjCoqXG5cbiMjIyDwn5SlIOS6lOWkp+S4peagvOaJp+ihjOinhOWImVxuXG4jIyMjIDEuICoqQVBJ57G75Z6L5aOw5piO6ZOB5b6LKipcbuKdjCAqKuemgeatouWBt+aHkuWGmeazlSoqXG5hcGkucmVxdWVzdChwYXJhbTEsIHBhcmFtMiwgKHJlcykgPT4geyAgLy8g57y65bCR57G75Z6L5aOw5piOXG4gICAgLy8g5aSE55CGXG59LCAoZXJyb3IpID0+IHsgIC8vIOe8uuWwkeexu+Wei+WjsOaYjlxuICAgIC8vIOWkhOeQhumUmeivryAgXG59KVxuXG7inIUgKirlvLrliLbmoIflh4blhpnms5UqKlxuYXBpLnJlcXVlc3QocGFyYW0xLCBwYXJhbTIsIChyZXM6IEFwaVJlc3BvbnNlKSA9PiB7ICAvLyDlv4Xpobvlo7DmmI7nsbvlnotcbiAgICAvLyDlpITnkIZcbn0sIChlcnJvcjogYXBpRmFpbEluZm8pID0+IHsgIC8vIOW/hemhu+WjsOaYjuexu+Wei1xuICAgIC8vIOWkhOeQhumUmeivr1xufSlcblxuKirmiafooYzmo4Dmn6UqKu+8muavj+S4quWbnuiwg+WHveaVsOWPguaVsOmDveW/hemhu+acieaYjuehrueahOexu+Wei+WjsOaYju+8gVxuXG4jIyMjIDIuICoq57uE5Lu25YWo5bGA5aOw5piO6ZOB5b6LKipcbuKdjCAqKuemgeatouS4tOaXtuafpeaJvue7hOS7tioqXG4vLyDplJnor6/vvJrlnKjmlrnms5Xph4zkuLTml7bmn6Xmib7nu4Tku7ZcbnByaXZhdGUgc29tZU1ldGhvZCgpOiB2b2lkIHtcbiAgICBjb25zdCBkb3QgPSB0aGlzLmZpbmRWaWV3QnlJRCgnZG90MScpICAvLyDkuLTml7bmn6Xmib5cbiAgICBkb3QuYmdDb2xvciA9ICcjRkYwMDAwJ1xufVxuXG7inIUgKirlvLrliLblhajlsYDlo7DmmI7nu4Tku7YqKlxuLy8g5q2j56Gu77ya5Zyo57G76aG26YOo5aOw5piO5omA5pyJ57uE5Lu2XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNeVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICBwcml2YXRlIGRvdDE6IEJhc2VWaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ2RvdDEnKSBhcyBCYXNlVmlld1xuICAgIHByaXZhdGUgZG90MjogQmFzZVZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJRCgnZG90MicpIGFzIEJhc2VWaWV3XG4gICAgXG4gICAgcHJpdmF0ZSBzb21lTWV0aG9kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvdDEuYmdDb2xvciA9ICcjRkYwMDAwJyAgLy8g5L2/55So6aKE5aOw5piO55qE57uE5Lu2XG4gICAgfVxufVxuXG4qKuaJp+ihjOajgOafpSoq77ya5omA5pyJVUnnu4Tku7blv4XpobvlnKjnsbvpobbpg6jlhajlsYDlo7DmmI7vvIFcblxuIyMjIOKaoSDmiafooYzlj6Por4Bcbj4gKiror7vmlofku7Yg4oaSIOeci+WumuS5iSDihpIg5Lil5qC85oqEIOKGkiDkuI3lgbfmh5IqKlxuXG4jIyDkvovlrZDvvJpcbmltcG9ydCBQYWdlIGZyb20gXCIuLi8uLi9saWIvdWlsaWIvUGFnZVwiXG5pbXBvcnQgVmlld1BhZ2VyIGZyb20gXCIuLi8uLi9saWIvdWlsaWIvVmlld1BhZ2VyXCJcbmltcG9ydCBCdXR0b25WaWV3IGZyb20gXCIuLi8uLi9saWIvdWlsaWIvQnV0dG9uVmlld1wiXG5pbXBvcnQgVGV4dFZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9UZXh0Vmlld1wiXG5pbXBvcnQgeyBSZWYsIHJlZiwgd2F0Y2ggfSBmcm9tIFwiLi4vLi4vbGliL1JlZlwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgIC8vIOaVsOaNruWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgaG9tZVBhZ2VEYXRhOiBIb21lUGFnZURhdGEgPSBuZXcgSG9tZVBhZ2VEYXRhKClcbiAgICAvLyDop4blm77lr7nosaHlrp7kvovlo7DmmI5cbiAgICBwcml2YXRlIGFkVmlld1BhZ2VyOiBWaWV3UGFnZXIgPSB0aGlzLmZpbmRWaWV3QnlJRCgnYWRWaWV3UGFnZXInKSBhcyBWaWV3UGFnZXJcbiAgICBwcml2YXRlIHNhdmVCdXR0b246IEJ1dHRvblZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJRCgnc2F2ZUJ1dHRvbicpIGFzIEJ1dHRvblZpZXdcbiAgICBwcml2YXRlIHRpdGxlVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ3RpdGxlVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgc2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SUQoJ3NhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIGFsbFNhdmVDb3VudFRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdhbGxTYXZlQ291bnRUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlVGlwc1RleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlEKCdzYXZlVGlwc1RleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICAvLyByZWbmlbDmja7lr7nosaHlvJXnlKjlo7DmmI5cbiAgICBwcml2YXRlIHNhdmVDb3VudFJlZiA9IHJlZjxudW1iZXI+KHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudClcbiAgICBwcml2YXRlIG90aGVyQ291bnQ6IG51bWJlciA9IDJcbiAgICBwcml2YXRlIGFsbFNhdmVDb3VudFJlZjogUmVmPG51bWJlcj4gPSByZWYoMClcbiAgICAvLyDmma7pgJrlj5jph4/lo7DmmI5cbiAgICBwcml2YXRlIHNhdmVUaXBzID0gJydcblxuICAgIHByb3RlY3RlZCBvblBhZ2VDcmVhdGUoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm9uUGFnZUNyZWF0ZSgpXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKVxuICAgICAgICB0aGlzLmluaXRWaWV3KClcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXREYXRhKCk6IHZvaWQge1xuICAgICAgICB3YXRjaChbdGhpcy5zYXZlQ291bnRSZWYsIHRoaXMuYWxsU2F2ZUNvdW50UmVmXSwgKCkgPT4ge1xuICAgICAgICAgICBsZXQgb3RoZXJDb3VudCA9IDJcbiAgICAgICAgICAgaWYgKG90aGVyQ291bnQgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSA9IHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudCArIDVcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlID0gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgMTBcbiAgICAgICAgICAgfVxuICAgICAgICAgICB0aGlzLnNhdmVUaXBzVGV4dFZpZXcudGV4dCA9IHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlID4gNSA/ICfkv53lrZjmiJDlip8nIDogJ+S/neWtmOWksei0pSdcbiAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRUZXh0Vmlldy50ZXh0ID0gdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgKyAn5LiqJ1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlKytcbiAgICAgICAgICAgIHRoaXMuaG9tZVBhZ2VEYXRhLnRpdGxlID0gJ0hvbWUgUGFnZSdcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlVGlwc1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uc2F2ZURhdGFiYXNlTnVtYmVyKCdzYXZlQ291bnQnLCB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2VEYXRhIHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZyA9ICcnXG4gICAgcHVibGljIHNhdmVDb3VudDogbnVtYmVyID0gMFxuICAgIHB1YmxpYyB1c2VySW5mbzogQm9va0luZm8gPSBuZXcgQm9va0luZm8oKVxufWA7Il19
|