"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.unload = exports.update = exports.load = exports.methods = void 0; const cc_1 = require("cc"); const path_1 = require("path"); const MembershipSet_1 = require("./MembershipSet"); const Fs = require('fs'); const Path = require('path'); // 临时在当前模块增加编辑器内的模块为搜索路径,为了能够正常 require 到 cc 模块,后续版本将优化调用方式 module.paths.push((0, path_1.join)(Editor.App.path, 'node_modules')); // 当前版本需要在 module.paths 修改后才能正常使用 cc 模块 // 并且如果希望正常显示 cc 的定义,需要手动将 engine 文件夹里的 cc.d.ts 添加到插件的 tsconfig 里 // 当前版本的 cc 定义文件可以在当前项目的 temp/declarations/cc.d.ts 找到 // 获取项目路径 const projectPath = Editor.Project.path; // 定义输出文件路径 const outputPath = cc_1.path.join(projectPath, 'assets', 'res', 'font', 'str.txt'); /** * @en * @zh 为扩展的主进程的注册方法 */ exports.methods = { log() { }, async printSpineAnim() { var _a, _b; let s = cc_1.director.getScene(); let cur = Editor.Selection.getLastSelected("node"); let node = this.getNodeByuuid(s, cur); let spAnim = node.getComponent(cc_1.sp.Skeleton); if (!spAnim) return; console.log("选中节点包含以下动画:"); //打印所有动画名 let anims = (_b = (_a = spAnim === null || spAnim === void 0 ? void 0 : spAnim.skeletonData) === null || _a === void 0 ? void 0 : _a.getRuntimeData()) === null || _b === void 0 ? void 0 : _b.animations; anims === null || anims === void 0 ? void 0 : anims.forEach(x => { console.log("动画名:" + x.name); }); console.log("选中节点当前动画已复制成功:" + (spAnim === null || spAnim === void 0 ? void 0 : spAnim.animation)); //复制动画名称 Editor.Clipboard.write('text', spAnim === null || spAnim === void 0 ? void 0 : spAnim.animation); }, async changeNodeName() { let s = cc_1.director.getScene(); let cur = Editor.Selection.getLastSelected("node"); let node = this.getNodeByuuid(s, cur); if (!node) return; console.log("选中节点:" + node.name); let name = Editor.Clipboard.read('text'); console.log("剪切板内容:" + name); //设置node的名字为剪切板内容 node.name = name + ""; }, async uiScript() { let s = cc_1.director.getScene(); let cur = Editor.Selection.getLastSelected("node"); console.log("选中节点:" + cur); let node = this.getNodeByuuid(s, cur); let autoName = "Auto_" + node.name; let nodes = this.getAllNodes(node, "node"); let funcNames = []; //console.log("得到的所有节点", nodes); let str = ""; str += ` //********************* // create by 流云 // 插件自动生成的节点脚本 // 请勿修改(自动生成会覆盖) // 请通过子类继承使用 // 如何生成可直接调用的UI节点和组件? // 1.在场景节点树中选中要生成的UI根节点 // 2.点击菜单"tool"->“生成UI脚本” 或者使用快捷键(快捷键:Ctrl+Shift+C) // 3.点击后会在script/ui/目录中生成一个以选中节点命名的文件夹,文件夹中会生成两个脚本文件,“Auto_”开头的就是本文件,不可修改,另一个是“UI”+选中节点名称命名的脚本文件,可修改,是需要挂载到选中节点的脚本文件,给用户使用的写逻辑的脚本,只会生成一次 // 4.找到第3步描述的“UI”+选中节点名称命名的脚本文件,将其挂载到选中节点上(第一生成需要挂载,后续修改场景,重复生成的时候,该脚本不会再生成,不用担心会覆盖逻辑脚本) // 下面是类型示例 // 1.按钮,节点名以“btn_”或者“Btn_”开头或者节点添加了Button组件, 例:btn_Close,会生成btn_Close节点和click_btn_Close()方法 // 2.标签,节点名以“lb_”开头, 例:lb_title,会生成lb_title的Label组件 // 3.输入框,节点名以“eb_”开头, 例:eb_input,会生成eb_input的EditBox组件 // 4.滚动视图,节点名以“sv_”开头, 例:sv_list,会生成sv_list的ScrollView组件 // 5.图片,节点名以“img_”或者sp_“”开头, 例:img_Icon,会生成img_Icon的Sprite组件 // 6.普通节点,节点名以“ui_”或者“Ui_”或者“UI_”开头, 例:ui_Content,会生成ui_Content的Node节点 //********************* import { _decorator, Component, Node, find, Sprite, Label, Button, ScrollView, EditBox, RichText } from 'cc'; import { UIBase } from '../../../mx/module/ui/UIBase'; const { ccclass } = _decorator; @ccclass('` + autoName + `') export class ` + autoName + ` extends UIBase {\r\n`; console.log("得到的所有节点", JSON.stringify(nodes)); for (let i = 0; i < nodes.length; i++) { let tName = nodes[i].nodeName; if (nodes.filter((x) => x.nodeName == tName).length > 1) { tName = nodes[i].path.replace(/\//g, "_"); } let type = nodes[i].type != "" && nodes[i].type != "Button" ? nodes[i].type : "Node"; str += " " + tName + `:${type};\r\n`; } str += ` onLoad(){ super.onLoad();\r\n`; for (let i = 0; i < nodes.length; i++) { let tName = nodes[i].nodeName; if (nodes.filter((x) => x.nodeName == tName).length > 1) { tName = nodes[i].path.replace(/\//g, "_"); } if (nodes[i].type == "Button") { funcNames.push(tName); } let lastStr = ""; if (nodes[i].type == "ScrollView") { lastStr = "?.getComponent(ScrollView)"; } if (nodes[i].type == "Label") { lastStr = "?.getComponent(Label)"; } if (nodes[i].type == "EditBox") { lastStr = "?.getComponent(EditBox)"; } if (nodes[i].type == "Sprite") { lastStr = "?.getComponent(Sprite)"; } if (nodes[i].type == "Button") { lastStr = ""; } if (nodes[i].type == "RichText") { lastStr = "?.getComponent(RichText)"; } str += ` this.${tName} = find("${nodes[i].path}",this.node)${lastStr};\r\n`; } str += ` }\r\n`; str += ` onEnable() {\r\n`; for (let i = 0; i < funcNames.length; i++) { str += ` this.${funcNames[i]}.on(Node.EventType.TOUCH_END, this.click_${funcNames[i]}, this);\r\n`; } str += ` }\r\n`; str += ` onDisable() {\r\n`; for (let i = 0; i < funcNames.length; i++) { str += ` this.${funcNames[i]}.off(Node.EventType.TOUCH_END, this.click_${funcNames[i]}, this);\r\n`; } str += ` }\r\n`; for (let i = 0; i < funcNames.length; i++) { str += ` click_${funcNames[i]}() {}\r\n`; } str += `}`; Editor.Message.send("asset-db", "create-asset", `db://assets/script/ui/${node.name}/${autoName}.ts`, str, { overwrite: true }); let className = "UI" + node.name; let path = `db://assets/script/ui/${node.name}/${className}.ts`; let r = await Editor.Message.request("asset-db", "query-asset-info", path); console.log("生成成功?", r); this.extractUsedChars(); if (r) return; let comp = node.getComponent(className); console.log("组件:", comp); if (!comp) { str = ` //********************* // create by 流云 // time: ${new Date().toDateString()} // desc: //********************* import { _decorator, Component, Node , find} from 'cc'; import { ${autoName} } from './${autoName}'; const { ccclass, property } = _decorator; @ccclass('${className}') export class ${className} extends ${autoName} { onLoad(): void { super.onLoad(); } onEnable(): void { super.onEnable(); } onDisable(): void { super.onDisable(); } onInit(): void { } } `; Editor.Message.send("asset-db", "create-asset", path, str); } //node.addComponent(className); }, getNodeByuuid(root, uuid) { let node = null; for (let i = 0; i < root.children.length; i++) { let c = root.children[i]; if (c.uuid == uuid) { node = c; break; } } if (node != null) return node; else { for (let i = 0; i < root.children.length; i++) { let c = root.children[i]; let n = this.getNodeByuuid(c, uuid); if (n) return n; } } }, getAllNodes(root, parentName, path = "") { let tempArr = []; for (let i = 0; i < root.children.length; i++) { let c = root.children[i]; let p = path == "" ? c.name : path + "/" + c.name; let typ = ""; // let sortComp = c.getComponent(Sorting2D); // if (sortComp) { // sortComp.destroy(); // } if (c.getComponent(cc_1.Label) != null && c.name.indexOf("lb_") >= 0) { typ = "Label"; } if (c.getComponent(cc_1.RichText) != null && c.name.indexOf("rt_") >= 0) { typ = "RichText"; } if (c.getComponent(cc_1.EditBox) != null && c.name.indexOf("eb_") >= 0) { typ = "EditBox"; } if (c.getComponent(cc_1.Sprite) != null && (c.name.indexOf("img_") >= 0 || c.name.indexOf("sp_") >= 0)) { typ = "Sprite"; } if (c.getComponent(cc_1.ScrollView) != null && c.name.indexOf("sv_") >= 0) { typ = "ScrollView"; } if (c.name.indexOf("ui_") >= 0 || c.name.indexOf("UI_") >= 0 || c.name.indexOf("Ui_") >= 0) { typ = "Node"; } if (c.getComponent(cc_1.Button) != null || c.name.indexOf("btn_") >= 0 || c.name.indexOf("Btn_") >= 0) { typ = "Button"; } if (!/[\u4e00-\u9fff]/.test(c.name) && !/^\d/.test(c.name) && !/-/.test(c.name) && !/\s/.test(c.name) && (typ == "Button" || typ == "Label" || typ == "Sprite" || typ == "ScrollView" || typ == "Node" || typ == "EditBox" || typ == "RichText")) tempArr.push({ nodeName: c.name, parentName: parentName, path: p, type: typ }); if (c.children.length > 0) { let arr = this.getAllNodes(c, c.name, p); tempArr = tempArr.concat(arr); } } return tempArr; }, /** * 获取节点树 * @param {string} filePath 文件路径 * @returns {object} */ getNodeTree(filePath) { // 获取缓存 let cache = this.cache; if (!cache) { cache = this.cache = Object.create(null); } // 从缓存中读取 if (!cache[filePath]) { // 将资源数据转为节点树 const data = JSON.parse(Fs.readFileSync(filePath)); cache[filePath] = this.convertToNodeTree(data); } }, // 提取所有使用的字符 extractUsedChars() { const usedChars = (0, MembershipSet_1.createMembershipSet)(); // 遍历项目中的 assets 目录 const assetsPath = cc_1.path.join(projectPath, 'assets'); if (Fs.existsSync(assetsPath)) { this.traverseDirectory(assetsPath, usedChars); } // 将字符集合转换为字符串 const charsString = (0, MembershipSet_1.membershipToArray)(usedChars).join(''); // 确保输出目录存在 const outputDir = cc_1.path.dirname(outputPath); if (!Fs.existsSync(outputDir)) { Fs.mkdirSync(outputDir, { recursive: true }); } // 写入文件 Fs.writeFileSync(outputPath, charsString); console.log(`Extracted ${usedChars.size} unique characters to ${outputPath}`); }, // 遍历目录并提取字符 traverseDirectory(dirPath, usedChars) { const files = Fs.readdirSync(dirPath); files.forEach((file) => { const filePath = cc_1.path.join(dirPath, file); const stat = Fs.statSync(filePath); if (stat.isDirectory()) { // 如果是目录,递归遍历 this.traverseDirectory(filePath, usedChars); } else if (stat.isFile()) { // 如果是文件,读取内容并提取字符 const ext = cc_1.path.extname(file).toLowerCase(); if (ext === '.js' || ext === '.ts' || ext === '.json' || ext === '.fire' || ext === '.prefab' || ext === '.csv' || ext === '.txt') { try { const content = Fs.readFileSync(filePath, 'utf-8'); for (let char of content) { (0, MembershipSet_1.membershipAdd)(usedChars, char); } } catch (err) { console.warn(`Failed to read file: ${filePath}, error: ${err}`); } } } }); } }; /** * @en Hooks triggered after extension loading is complete * @zh 扩展加载完成后触发的钩子 */ const load = function () { let id = Editor.Selection.getLastSelected("Node"); console.log("选中节点:" + id); }; exports.load = load; const update = function () { let id = Editor.Selection.getLastSelected("Node"); console.log("选中节点:" + id); }; exports.update = update; /** * @en Hooks triggered after extension uninstallation is complete * @zh 扩展卸载完成后触发的钩子 */ const unload = function () { }; exports.unload = unload; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zb3VyY2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQTJIO0FBQzNILCtCQUE0QjtBQUM1QixtREFLeUI7QUFDekIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUc3QiwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUV6RCx1Q0FBdUM7QUFDdkMsaUVBQWlFO0FBQ2pFLHFEQUFxRDtBQUVyRCxTQUFTO0FBQ1QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFFeEMsV0FBVztBQUNYLE1BQU0sVUFBVSxHQUFHLFNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRzlFOzs7R0FHRztBQUNVLFFBQUEsT0FBTyxHQUE0QztJQUM5RCxHQUFHLEtBQUssQ0FBQztJQUNULEtBQUssQ0FBQyxjQUFjOztRQUNsQixJQUFJLENBQUMsR0FBRyxhQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFTLENBQUM7UUFDOUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU07WUFB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LENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBSFcsUUFBQSxJQUFJLFFBR2Y7QUFFSyxNQUFNLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUE7QUFIWSxRQUFBLE1BQU0sVUFHbEI7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztBQUF6QixRQUFBLE1BQU0sVUFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdXR0b24sIGRpcmVjdG9yLCBFZGl0Qm94LCBMYWJlbCwgTm9kZSwgcGF0aCwgUmljaFRleHQsIFNjcm9sbFZpZXcsIFNvcnRpbmcyRCwgc3AsIFNwcml0ZSwgVUlSZW5kZXJlciB9IGZyb20gJ2NjJztcclxuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQge1xyXG4gIGNyZWF0ZU1lbWJlcnNoaXBTZXQsXHJcbiAgbWVtYmVyc2hpcEFkZCxcclxuICBtZW1iZXJzaGlwVG9BcnJheSxcclxuICB0eXBlIE1lbWJlcnNoaXBTZXQsXHJcbn0gZnJvbSAnLi9NZW1iZXJzaGlwU2V0JztcclxuY29uc3QgRnMgPSByZXF1aXJlKCdmcycpO1xyXG5jb25zdCBQYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG5cclxuXHJcbi8vIOS4tOaXtuWcqOW9k+WJjeaooeWdl+WinuWKoOe8lui+keWZqOWGheeahOaooeWdl+S4uuaQnOe0oui3r+W+hO+8jOS4uuS6huiDveWkn+ato+W4uCByZXF1aXJlIOWIsCBjYyDmqKHlnZfvvIzlkI7nu63niYjmnKzlsIbkvJjljJbosIPnlKjmlrnlvI9cclxubW9kdWxlLnBhdGhzLnB1c2goam9pbihFZGl0b3IuQXBwLnBhdGgsICdub2RlX21vZHVsZXMnKSk7XHJcblxyXG4vLyDlvZPliY3niYjmnKzpnIDopoHlnKggbW9kdWxlLnBhdGhzIOS/ruaUueWQjuaJjeiDveato+W4uOS9v+eUqCBjYyDmqKHlnZdcclxuLy8g5bm25LiU5aaC5p6c5biM5pyb5q2j5bi45pi+56S6IGNjIOeahOWumuS5ie+8jOmcgOimgeaJi+WKqOWwhiBlbmdpbmUg5paH5Lu25aS56YeM55qEIGNjLmQudHMg5re75Yqg5Yiw5o+S5Lu255qEIHRzY29uZmlnIOmHjFxyXG4vLyDlvZPliY3niYjmnKznmoQgY2Mg5a6a5LmJ5paH5Lu25Y+v5Lul5Zyo5b2T5YmN6aG555uu55qEIHRlbXAvZGVjbGFyYXRpb25zL2NjLmQudHMg5om+5YiwXHJcblxyXG4vLyDojrflj5bpobnnm67ot6/lvoRcclxuY29uc3QgcHJvamVjdFBhdGggPSBFZGl0b3IuUHJvamVjdC5wYXRoO1xyXG5cclxuLy8g5a6a5LmJ6L6T5Ye65paH5Lu26Lev5b6EXHJcbmNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdhc3NldHMnLCAncmVzJywgJ2ZvbnQnLCAnc3RyLnR4dCcpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBAZW5cclxuICogQHpoIOS4uuaJqeWxleeahOS4u+i/m+eoi+eahOazqOWGjOaWueazlVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1ldGhvZHM6IHsgW2tleTogc3RyaW5nXTogKC4uLmFueTogYW55KSA9PiBhbnkgfSA9IHtcclxuICBsb2coKSB7IH0sXHJcbiAgYXN5bmMgcHJpbnRTcGluZUFuaW0oKSB7XHJcbiAgICBsZXQgcyA9IGRpcmVjdG9yLmdldFNjZW5lKCk7XHJcbiAgICBsZXQgY3VyID0gRWRpdG9yLlNlbGVjdGlvbi5nZXRMYXN0U2VsZWN0ZWQoXCJub2RlXCIpO1xyXG4gICAgbGV0IG5vZGUgPSB0aGlzLmdldE5vZGVCeXV1aWQocywgY3VyKSBhcyBOb2RlO1xyXG4gICAgbGV0IHNwQW5pbSA9IG5vZGUuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcclxuICAgIGlmICghc3BBbmltKSByZXR1cm47XHJcbiAgICBjb25zb2xlLmxvZyhcIumAieS4reiKgueCueWMheWQq+S7peS4i+WKqOeUu++8mlwiKTtcclxuICAgIC8v5omT5Y2w5omA5pyJ5Yqo55S75ZCNXHJcbiAgICBsZXQgYW5pbXMgPSBzcEFuaW0/LnNrZWxldG9uRGF0YT8uZ2V0UnVudGltZURhdGEoKT8uYW5pbWF0aW9ucztcclxuICAgIGFuaW1zPy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuWKqOeUu+WQje+8mlwiICsgeC5uYW1lKTtcclxuICAgIH0pO1xyXG4gICAgY29uc29sZS5sb2coXCLpgInkuK3oioLngrnlvZPliY3liqjnlLvlt7LlpI3liLbmiJDlip/vvJpcIiArIHNwQW5pbT8uYW5pbWF0aW9uKTtcclxuICAgIC8v5aSN5Yi25Yqo55S75ZCN56ewXHJcbiAgICBFZGl0b3IuQ2xpcGJvYXJkLndyaXRlKCd0ZXh0Jywgc3BBbmltPy5hbmltYXRpb24pO1xyXG4gIH0sXHJcbiAgYXN5bmMgY2hhbmdlTm9kZU5hbWUoKSB7XHJcbiAgICBsZXQgcyA9IGRpcmVjdG9yLmdldFNjZW5lKCk7XHJcbiAgICBsZXQgY3VyID0gRWRpdG9yLlNlbGVjdGlvbi5nZXRMYXN0U2VsZWN0ZWQoXCJub2RlXCIpO1xyXG4gICAgbGV0IG5vZGUgPSB0aGlzLmdldE5vZGVCeXV1aWQocywgY3VyKSBhcyBOb2RlO1xyXG4gICAgaWYgKCFub2RlKSByZXR1cm47XHJcbiAgICBjb25zb2xlLmxvZyhcIumAieS4reiKgueCue+8mlwiICsgbm9kZS5uYW1lKTtcclxuICAgIGxldCBuYW1lID0gRWRpdG9yLkNsaXBib2FyZC5yZWFkKCd0ZXh0Jyk7XHJcbiAgICBjb25zb2xlLmxvZyhcIuWJquWIh+adv+WGheWuue+8mlwiICsgbmFtZSk7XHJcbiAgICAvL+iuvue9rm5vZGXnmoTlkI3lrZfkuLrliarliIfmnb/lhoXlrrlcclxuICAgIG5vZGUubmFtZSA9IG5hbWUgKyBcIlwiO1xyXG4gIH0sXHJcbiAgYXN5bmMgdWlTY3JpcHQoKSB7XHJcbiAgICBsZXQgcyA9IGRpcmVjdG9yLmdldFNjZW5lKCk7XHJcbiAgICBsZXQgY3VyID0gRWRpdG9yLlNlbGVjdGlvbi5nZXRMYXN0U2VsZWN0ZWQoXCJub2RlXCIpO1xyXG4gICAgY29uc29sZS5sb2coXCLpgInkuK3oioLngrnvvJpcIiArIGN1cik7XHJcbiAgICBsZXQgbm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5dXVpZChzLCBjdXIpIGFzIE5vZGU7XHJcbiAgICBsZXQgYXV0b05hbWUgPSBcIkF1dG9fXCIgKyBub2RlLm5hbWU7XHJcbiAgICBsZXQgbm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKG5vZGUsIFwibm9kZVwiKTtcclxuICAgIGxldCBmdW5jTmFtZXMgPSBbXTtcclxuICAgIC8vY29uc29sZS5sb2coXCLlvpfliLDnmoTmiYDmnInoioLngrlcIiwgbm9kZXMpO1xyXG4gICAgbGV0IHN0ciA9IFwiXCI7XHJcbiAgICBzdHIgKz1cclxuICAgICAgYFxyXG4vLyoqKioqKioqKioqKioqKioqKioqKlxyXG4vLyBjcmVhdGUgYnkg5rWB5LqRXHJcbi8vIOaPkuS7tuiHquWKqOeUn+aIkOeahOiKgueCueiEmuacrFxyXG4vLyDor7fli7/kv67mlLnvvIjoh6rliqjnlJ/miJDkvJropobnm5bvvIlcclxuLy8g6K+36YCa6L+H5a2Q57G757un5om/5L2/55SoXHJcbi8vIOWmguS9leeUn+aIkOWPr+ebtOaOpeiwg+eUqOeahFVJ6IqC54K55ZKM57uE5Lu277yfXHJcbi8vIDEu5Zyo5Zy65pmv6IqC54K55qCR5Lit6YCJ5Lit6KaB55Sf5oiQ55qEVUnmoLnoioLngrlcclxuLy8gMi7ngrnlh7voj5zljZVcInRvb2xcIi0+4oCc55Sf5oiQVUnohJrmnKzigJ0gIOaIluiAheS9v+eUqOW/q+aNt+mUrijlv6vmjbfplK7vvJpDdHJsK1NoaWZ0K0MpXHJcbi8vIDMu54K55Ye75ZCO5Lya5Zyoc2NyaXB0L3VpL+ebruW9leS4reeUn+aIkOS4gOS4quS7pemAieS4reiKgueCueWRveWQjeeahOaWh+S7tuWkue+8jOaWh+S7tuWkueS4reS8mueUn+aIkOS4pOS4quiEmuacrOaWh+S7tu+8jOKAnEF1dG9f4oCd5byA5aS055qE5bCx5piv5pys5paH5Lu277yM5LiN5Y+v5L+u5pS577yM5Y+m5LiA5Liq5piv4oCcVUnigJ0r6YCJ5Lit6IqC54K55ZCN56ew5ZG95ZCN55qE6ISa5pys5paH5Lu277yM5Y+v5L+u5pS577yM5piv6ZyA6KaB5oyC6L295Yiw6YCJ5Lit6IqC54K555qE6ISa5pys5paH5Lu277yM57uZ55So5oi35L2/55So55qE5YaZ6YC76L6R55qE6ISa5pys77yM5Y+q5Lya55Sf5oiQ5LiA5qyhXHJcbi8vIDQu5om+5Yiw56ysM+atpeaPj+i/sOeahOKAnFVJ4oCdK+mAieS4reiKgueCueWQjeensOWRveWQjeeahOiEmuacrOaWh+S7tu+8jOWwhuWFtuaMgui9veWIsOmAieS4reiKgueCueS4iijnrKzkuIDnlJ/miJDpnIDopoHmjILovb3vvIzlkI7nu63kv67mlLnlnLrmma/vvIzph43lpI3nlJ/miJDnmoTml7blgJnvvIzor6XohJrmnKzkuI3kvJrlho3nlJ/miJDvvIzkuI3nlKjmi4Xlv4PkvJropobnm5bpgLvovpHohJrmnKwpXHJcbi8vIOS4i+mdouaYr+exu+Wei+ekuuS+i1xyXG4vLyAxLuaMiemSru+8jOiKgueCueWQjeS7peKAnGJ0bl/igJ3miJbogIXigJxCdG5f4oCd5byA5aS05oiW6ICF6IqC54K55re75Yqg5LqGQnV0dG9u57uE5Lu277yMIOS+i++8mmJ0bl9DbG9zZe+8jOS8mueUn+aIkGJ0bl9DbG9zZeiKgueCueWSjGNsaWNrX2J0bl9DbG9zZSgp5pa55rOVXHJcbi8vIDIu5qCH562+77yM6IqC54K55ZCN5Lul4oCcbGJf4oCd5byA5aS077yMIOS+i++8mmxiX3RpdGxl77yM5Lya55Sf5oiQbGJfdGl0bGXnmoRMYWJlbOe7hOS7tlxyXG4vLyAzLui+k+WFpeahhu+8jOiKgueCueWQjeS7peKAnGViX+KAneW8gOWktO+8jCDkvovvvJplYl9pbnB1dO+8jOS8mueUn+aIkGViX2lucHV055qERWRpdEJveOe7hOS7tlxyXG4vLyA0Lua7muWKqOinhuWbvu+8jOiKgueCueWQjeS7peKAnHN2X+KAneW8gOWktO+8jCDkvovvvJpzdl9saXN077yM5Lya55Sf5oiQc3ZfbGlzdOeahFNjcm9sbFZpZXfnu4Tku7ZcclxuLy8gNS7lm77niYfvvIzoioLngrnlkI3ku6XigJxpbWdf4oCd5oiW6ICFc3Bf4oCc4oCd5byA5aS077yMIOS+i++8mmltZ19JY29u77yM5Lya55Sf5oiQaW1nX0ljb27nmoRTcHJpdGXnu4Tku7ZcclxuLy8gNi7mma7pgJroioLngrnvvIzoioLngrnlkI3ku6XigJx1aV/igJ3miJbogIXigJxVaV/igJ3miJbogIXigJxVSV/igJ3lvIDlpLTvvIwg5L6L77yadWlfQ29udGVudO+8jOS8mueUn+aIkHVpX0NvbnRlbnTnmoROb2Rl6IqC54K5XHJcbi8vKioqKioqKioqKioqKioqKioqKioqXHJcbmltcG9ydCB7IF9kZWNvcmF0b3IsIENvbXBvbmVudCwgTm9kZSwgZmluZCwgU3ByaXRlLCBMYWJlbCwgQnV0dG9uLCBTY3JvbGxWaWV3LCBFZGl0Qm94LCBSaWNoVGV4dCB9IGZyb20gJ2NjJztcclxuaW1wb3J0IHsgVUlCYXNlIH0gZnJvbSAnLi4vLi4vLi4vbXgvbW9kdWxlL3VpL1VJQmFzZSc7XHJcbmNvbnN0IHsgY2NjbGFzcyB9ID0gX2RlY29yYXRvcjtcclxuXHJcbkBjY2NsYXNzKCdgICsgYXV0b05hbWUgKyBgJylcclxuZXhwb3J0IGNsYXNzIGAgKyBhdXRvTmFtZSArIGAgZXh0ZW5kcyBVSUJhc2Uge1xcclxcbmA7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCLlvpfliLDnmoTmiYDmnInoioLngrlcIiwgSlNPTi5zdHJpbmdpZnkobm9kZXMpKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHROYW1lID0gbm9kZXNbaV0ubm9kZU5hbWU7XHJcbiAgICAgIGlmIChub2Rlcy5maWx0ZXIoKHg6IGFueSkgPT4geC5ub2RlTmFtZSA9PSB0TmFtZSkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHROYW1lID0gbm9kZXNbaV0ucGF0aC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB0eXBlID0gbm9kZXNbaV0udHlwZSAhPSBcIlwiICYmIG5vZGVzW2ldLnR5cGUgIT0gXCJCdXR0b25cIiA/IG5vZGVzW2ldLnR5cGUgOiBcIk5vZGVcIjtcclxuICAgICAgc3RyICs9IFwiICBcIiArIHROYW1lICsgYDoke3R5cGV9O1xcclxcbmA7XHJcbiAgICB9XHJcblxyXG4gICAgc3RyICs9IGAgIG9uTG9hZCgpe1xyXG4gICAgc3VwZXIub25Mb2FkKCk7XFxyXFxuYDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHROYW1lID0gbm9kZXNbaV0ubm9kZU5hbWU7XHJcbiAgICAgIGlmIChub2Rlcy5maWx0ZXIoKHg6IGFueSkgPT4geC5ub2RlTmFtZSA9PSB0TmFtZSkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHROYW1lID0gbm9kZXNbaV0ucGF0aC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiQnV0dG9uXCIpIHtcclxuICAgICAgICBmdW5jTmFtZXMucHVzaCh0TmFtZSk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxhc3RTdHIgPSBcIlwiO1xyXG4gICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSBcIlNjcm9sbFZpZXdcIikge1xyXG4gICAgICAgIGxhc3RTdHIgPSBcIj8uZ2V0Q29tcG9uZW50KFNjcm9sbFZpZXcpXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGVzW2ldLnR5cGUgPT0gXCJMYWJlbFwiKSB7XHJcbiAgICAgICAgbGFzdFN0ciA9IFwiPy5nZXRDb21wb25lbnQoTGFiZWwpXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGVzW2ldLnR5cGUgPT0gXCJFZGl0Qm94XCIpIHtcclxuICAgICAgICBsYXN0U3RyID0gXCI/LmdldENvbXBvbmVudChFZGl0Qm94KVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiU3ByaXRlXCIpIHtcclxuICAgICAgICBsYXN0U3RyID0gXCI/LmdldENvbXBvbmVudChTcHJpdGUpXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGVzW2ldLnR5cGUgPT0gXCJCdXR0b25cIikge1xyXG4gICAgICAgIGxhc3RTdHIgPSBcIlwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiUmljaFRleHRcIikge1xyXG4gICAgICAgIGxhc3RTdHIgPSBcIj8uZ2V0Q29tcG9uZW50KFJpY2hUZXh0KVwiO1xyXG4gICAgICB9XHJcbiAgICAgIHN0ciArPSBgICAgIHRoaXMuJHt0TmFtZX0gPSBmaW5kKFwiJHtub2Rlc1tpXS5wYXRofVwiLHRoaXMubm9kZSkke2xhc3RTdHJ9O1xcclxcbmA7XHJcbiAgICB9XHJcblxyXG4gICAgc3RyICs9IGAgIH1cXHJcXG5gO1xyXG5cclxuICAgIHN0ciArPSBgICBvbkVuYWJsZSgpIHtcXHJcXG5gO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdW5jTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc3RyICs9IGAgICAgdGhpcy4ke2Z1bmNOYW1lc1tpXX0ub24oTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmNsaWNrXyR7ZnVuY05hbWVzW2ldfSwgdGhpcyk7XFxyXFxuYDtcclxuICAgIH1cclxuICAgIHN0ciArPSBgICB9XFxyXFxuYDtcclxuXHJcbiAgICBzdHIgKz0gYCAgb25EaXNhYmxlKCkge1xcclxcbmA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1bmNOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBzdHIgKz0gYCAgICB0aGlzLiR7ZnVuY05hbWVzW2ldfS5vZmYoTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmNsaWNrXyR7ZnVuY05hbWVzW2ldfSwgdGhpcyk7XFxyXFxuYDtcclxuICAgIH1cclxuICAgIHN0ciArPSBgICB9XFxyXFxuYDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1bmNOYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBzdHIgKz0gYCAgY2xpY2tfJHtmdW5jTmFtZXNbaV19KCkge31cXHJcXG5gO1xyXG4gICAgfVxyXG5cclxuICAgIHN0ciArPSBgfWA7XHJcblxyXG4gICAgRWRpdG9yLk1lc3NhZ2Uuc2VuZChcclxuICAgICAgXCJhc3NldC1kYlwiLFxyXG4gICAgICBcImNyZWF0ZS1hc3NldFwiLFxyXG4gICAgICBgZGI6Ly9hc3NldHMvc2NyaXB0L3VpLyR7bm9kZS5uYW1lfS8ke2F1dG9OYW1lfS50c2AsXHJcbiAgICAgIHN0cixcclxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY2xhc3NOYW1lID0gXCJVSVwiICsgbm9kZS5uYW1lO1xyXG4gICAgbGV0IHBhdGggPSBgZGI6Ly9hc3NldHMvc2NyaXB0L3VpLyR7bm9kZS5uYW1lfS8ke2NsYXNzTmFtZX0udHNgO1xyXG4gICAgbGV0IHIgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KFxyXG4gICAgICBcImFzc2V0LWRiXCIsXHJcbiAgICAgIFwicXVlcnktYXNzZXQtaW5mb1wiLFxyXG4gICAgICBwYXRoXHJcbiAgICApO1xyXG4gICAgY29uc29sZS5sb2coXCLnlJ/miJDmiJDlip/vvJ9cIiwgcik7XHJcbiAgICB0aGlzLmV4dHJhY3RVc2VkQ2hhcnMoKTtcclxuICAgIGlmIChyKSByZXR1cm47XHJcbiAgICBsZXQgY29tcCA9IG5vZGUuZ2V0Q29tcG9uZW50KGNsYXNzTmFtZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcIue7hOS7tu+8mlwiLCBjb21wKTtcclxuICAgIGlmICghY29tcCkge1xyXG4gICAgICBzdHIgPSBgXHJcbi8vKioqKioqKioqKioqKioqKioqKioqXHJcbi8vIGNyZWF0ZSBieSDmtYHkupFcclxuLy8gdGltZTogJHtuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpfVxyXG4vLyBkZXNjOiBcclxuLy8qKioqKioqKioqKioqKioqKioqKipcclxuaW1wb3J0IHsgX2RlY29yYXRvciwgQ29tcG9uZW50LCBOb2RlICwgZmluZH0gZnJvbSAnY2MnO1xyXG5pbXBvcnQgeyAke2F1dG9OYW1lfSB9IGZyb20gJy4vJHthdXRvTmFtZX0nO1xyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBfZGVjb3JhdG9yO1xyXG4gICAgICAgICAgICBcclxuQGNjY2xhc3MoJyR7Y2xhc3NOYW1lfScpXHJcbmV4cG9ydCBjbGFzcyAke2NsYXNzTmFtZX0gZXh0ZW5kcyAke2F1dG9OYW1lfSB7XHJcblxyXG4gICAgb25Mb2FkKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm9uTG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm9uRW5hYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EaXNhYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm9uRGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG4gICAgYDtcclxuICAgICAgRWRpdG9yLk1lc3NhZ2Uuc2VuZChcclxuICAgICAgICBcImFzc2V0LWRiXCIsXHJcbiAgICAgICAgXCJjcmVhdGUtYXNzZXRcIixcclxuICAgICAgICBwYXRoLFxyXG4gICAgICAgIHN0clxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vbm9kZS5hZGRDb21wb25lbnQoY2xhc3NOYW1lKTtcclxuICB9LFxyXG5cclxuICBnZXROb2RlQnl1dWlkKHJvb3Q6IE5vZGUsIHV1aWQpIHtcclxuICAgIGxldCBub2RlID0gbnVsbDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYyA9IHJvb3QuY2hpbGRyZW5baV07XHJcbiAgICAgIGlmIChjLnV1aWQgPT0gdXVpZCkge1xyXG4gICAgICAgIG5vZGUgPSBjO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vZGUgIT0gbnVsbCkgcmV0dXJuIG5vZGU7XHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb290LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSByb290LmNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGxldCBuID0gdGhpcy5nZXROb2RlQnl1dWlkKGMsIHV1aWQpO1xyXG4gICAgICAgIGlmIChuKSByZXR1cm4gbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGdldEFsbE5vZGVzKHJvb3QsIHBhcmVudE5hbWUsIHBhdGggPSBcIlwiKSB7XHJcbiAgICBsZXQgdGVtcEFycjogQXJyYXk8e30+ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGM6IE5vZGUgPSByb290LmNoaWxkcmVuW2ldO1xyXG4gICAgICBsZXQgcCA9IHBhdGggPT0gXCJcIiA/IGMubmFtZSA6IHBhdGggKyBcIi9cIiArIGMubmFtZTtcclxuICAgICAgbGV0IHR5cCA9IFwiXCI7XHJcbiAgICAgIC8vIGxldCBzb3J0Q29tcCA9IGMuZ2V0Q29tcG9uZW50KFNvcnRpbmcyRCk7XHJcblxyXG4gICAgICAvLyBpZiAoc29ydENvbXApIHtcclxuICAgICAgLy8gICBzb3J0Q29tcC5kZXN0cm95KCk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmIChjLmdldENvbXBvbmVudChMYWJlbCkgIT0gbnVsbCAmJiBjLm5hbWUuaW5kZXhPZihcImxiX1wiKSA+PSAwKSB7XHJcbiAgICAgICAgdHlwID0gXCJMYWJlbFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLmdldENvbXBvbmVudChSaWNoVGV4dCkgIT0gbnVsbCAmJiBjLm5hbWUuaW5kZXhPZihcInJ0X1wiKSA+PSAwKSB7XHJcbiAgICAgICAgdHlwID0gXCJSaWNoVGV4dFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLmdldENvbXBvbmVudChFZGl0Qm94KSAhPSBudWxsICYmIGMubmFtZS5pbmRleE9mKFwiZWJfXCIpID49IDApIHtcclxuICAgICAgICB0eXAgPSBcIkVkaXRCb3hcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYy5nZXRDb21wb25lbnQoU3ByaXRlKSAhPSBudWxsICYmIChjLm5hbWUuaW5kZXhPZihcImltZ19cIikgPj0gMCB8fCBjLm5hbWUuaW5kZXhPZihcInNwX1wiKSA+PSAwKSkge1xyXG4gICAgICAgIHR5cCA9IFwiU3ByaXRlXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGMuZ2V0Q29tcG9uZW50KFNjcm9sbFZpZXcpICE9IG51bGwgJiYgYy5uYW1lLmluZGV4T2YoXCJzdl9cIikgPj0gMCkge1xyXG4gICAgICAgIHR5cCA9IFwiU2Nyb2xsVmlld1wiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLm5hbWUuaW5kZXhPZihcInVpX1wiKSA+PSAwIHx8IGMubmFtZS5pbmRleE9mKFwiVUlfXCIpID49IDAgfHwgYy5uYW1lLmluZGV4T2YoXCJVaV9cIikgPj0gMCkge1xyXG4gICAgICAgIHR5cCA9IFwiTm9kZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLmdldENvbXBvbmVudChCdXR0b24pICE9IG51bGwgfHwgYy5uYW1lLmluZGV4T2YoXCJidG5fXCIpID49IDAgfHwgYy5uYW1lLmluZGV4T2YoXCJCdG5fXCIpID49IDApIHtcclxuICAgICAgICB0eXAgPSBcIkJ1dHRvblwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghL1tcXHU0ZTAwLVxcdTlmZmZdLy50ZXN0KGMubmFtZSkgJiYgIS9eXFxkLy50ZXN0KGMubmFtZSkgJiYgIS8tLy50ZXN0KGMubmFtZSkgJiYgIS9cXHMvLnRlc3QoYy5uYW1lKSAmJiAodHlwID09IFwiQnV0dG9uXCIgfHwgdHlwID09IFwiTGFiZWxcIiB8fCB0eXAgPT0gXCJTcHJpdGVcIiB8fCB0eXAgPT0gXCJTY3JvbGxWaWV3XCIgfHwgdHlwID09IFwiTm9kZVwiIHx8IHR5cCA9PSBcIkVkaXRCb3hcIiB8fCB0eXAgPT0gXCJSaWNoVGV4dFwiKSlcclxuICAgICAgICB0ZW1wQXJyLnB1c2goeyBub2RlTmFtZTogYy5uYW1lLCBwYXJlbnROYW1lOiBwYXJlbnROYW1lLCBwYXRoOiBwLCB0eXBlOiB0eXAgfSk7XHJcbiAgICAgIGlmIChjLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgYXJyID0gdGhpcy5nZXRBbGxOb2RlcyhjLCBjLm5hbWUsIHApO1xyXG4gICAgICAgIHRlbXBBcnIgPSB0ZW1wQXJyLmNvbmNhdChhcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcEFycjtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgICog6I635Y+W6IqC54K55qCRXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCDmlofku7bot6/lvoRcclxuICAgICogQHJldHVybnMge29iamVjdH1cclxuICAgICovXHJcbiAgZ2V0Tm9kZVRyZWUoZmlsZVBhdGgpIHtcclxuICAgIC8vIOiOt+WPlue8k+WtmFxyXG4gICAgbGV0IGNhY2hlID0gdGhpcy5jYWNoZSBhcyBhbnk7XHJcbiAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgIGNhY2hlID0gdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgICB9XHJcbiAgICAvLyDku47nvJPlrZjkuK3or7vlj5ZcclxuICAgIGlmICghY2FjaGVbZmlsZVBhdGhdKSB7XHJcbiAgICAgIC8vIOWwhui1hOa6kOaVsOaNrui9rOS4uuiKgueCueagkVxyXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShGcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgpKTtcclxuICAgICAgY2FjaGVbZmlsZVBhdGhdID0gdGhpcy5jb252ZXJ0VG9Ob2RlVHJlZShkYXRhKTtcclxuICAgIH1cclxuICB9LFxyXG5cclxuXHJcbiAgLy8g5o+Q5Y+W5omA5pyJ5L2/55So55qE5a2X56ymXHJcbiAgZXh0cmFjdFVzZWRDaGFycygpIHtcclxuICAgIGNvbnN0IHVzZWRDaGFycyA9IGNyZWF0ZU1lbWJlcnNoaXBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAgIC8vIOmBjeWOhumhueebruS4reeahCBhc3NldHMg55uu5b2VXHJcbiAgICBjb25zdCBhc3NldHNQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnYXNzZXRzJyk7XHJcbiAgICBpZiAoRnMuZXhpc3RzU3luYyhhc3NldHNQYXRoKSkge1xyXG4gICAgICB0aGlzLnRyYXZlcnNlRGlyZWN0b3J5KGFzc2V0c1BhdGgsIHVzZWRDaGFycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCG5a2X56ym6ZuG5ZCI6L2s5o2i5Li65a2X56ym5LiyXHJcbiAgICBjb25zdCBjaGFyc1N0cmluZyA9IG1lbWJlcnNoaXBUb0FycmF5KHVzZWRDaGFycykuam9pbignJyk7XHJcblxyXG4gICAgLy8g56Gu5L+d6L6T5Ye655uu5b2V5a2Y5ZyoXHJcbiAgICBjb25zdCBvdXRwdXREaXIgPSBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCk7XHJcbiAgICBpZiAoIUZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xyXG4gICAgICBGcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlhpnlhaXmlofku7ZcclxuICAgIEZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgY2hhcnNTdHJpbmcpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGBFeHRyYWN0ZWQgJHt1c2VkQ2hhcnMuc2l6ZX0gdW5pcXVlIGNoYXJhY3RlcnMgdG8gJHtvdXRwdXRQYXRofWApO1xyXG4gIH0sXHJcblxyXG4gIC8vIOmBjeWOhuebruW9leW5tuaPkOWPluWtl+esplxyXG4gIHRyYXZlcnNlRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZywgdXNlZENoYXJzOiBNZW1iZXJzaGlwU2V0PHN0cmluZz4pIHtcclxuICAgIGNvbnN0IGZpbGVzID0gRnMucmVhZGRpclN5bmMoZGlyUGF0aCk7XHJcblxyXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xyXG4gICAgICBjb25zdCBzdGF0ID0gRnMuc3RhdFN5bmMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+ebruW9le+8jOmAkuW9kumBjeWOhlxyXG4gICAgICAgIHRoaXMudHJhdmVyc2VEaXJlY3RvcnkoZmlsZVBhdGgsIHVzZWRDaGFycyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0ZpbGUoKSkge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+aWh+S7tu+8jOivu+WPluWGheWuueW5tuaPkOWPluWtl+esplxyXG4gICAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChleHQgPT09ICcuanMnIHx8IGV4dCA9PT0gJy50cycgfHwgZXh0ID09PSAnLmpzb24nIHx8IGV4dCA9PT0gJy5maXJlJyB8fCBleHQgPT09ICcucHJlZmFiJyB8fCBleHQgPT09ICcuY3N2JyB8fCBleHQgPT09ICcudHh0Jykge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoYXIgb2YgY29udGVudCkge1xyXG4gICAgICAgICAgICAgIG1lbWJlcnNoaXBBZGQodXNlZENoYXJzLCBjaGFyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHJlYWQgZmlsZTogJHtmaWxlUGF0aH0sIGVycm9yOiAke2Vycn1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQGVuIEhvb2tzIHRyaWdnZXJlZCBhZnRlciBleHRlbnNpb24gbG9hZGluZyBpcyBjb21wbGV0ZVxyXG4gKiBAemgg5omp5bGV5Yqg6L295a6M5oiQ5ZCO6Kem5Y+R55qE6ZKp5a2QXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICBsZXQgaWQgPSBFZGl0b3IuU2VsZWN0aW9uLmdldExhc3RTZWxlY3RlZChcIk5vZGVcIik7XHJcbiAgY29uc29sZS5sb2coXCLpgInkuK3oioLngrnvvJpcIiArIGlkKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCB1cGRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgbGV0IGlkID0gRWRpdG9yLlNlbGVjdGlvbi5nZXRMYXN0U2VsZWN0ZWQoXCJOb2RlXCIpO1xyXG4gIGNvbnNvbGUubG9nKFwi6YCJ5Lit6IqC54K577yaXCIgKyBpZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZW4gSG9va3MgdHJpZ2dlcmVkIGFmdGVyIGV4dGVuc2lvbiB1bmluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZVxyXG4gKiBAemgg5omp5bGV5Y246L295a6M5oiQ5ZCO6Kem5Y+R55qE6ZKp5a2QXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdW5sb2FkID0gZnVuY3Rpb24gKCkgeyB9O1xyXG4iXX0=