"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Finder = void 0; const Path = __importStar(require("path")); const logger_1 = require("./logger"); const object_util_1 = require("./object-util"); const parser_1 = require("./parser"); const FileUtil = require('./lib/eazax/file-util'); var Finder; (function (Finder) { /** * 使用 uuid 进行查找 * @param {string} uuid */ async function findByUuid(assetInfo) { // let uuid = assetInfo.uuid; // 记录子资源 uuid const subAssetUuids = []; // 资源类型检查 if (assetInfo.type === 'cc.ImageAsset') { // 纹理子资源 const subAssetInfos = assetInfo.subAssets; for (const key in subAssetInfos) { const subAssetInfo = subAssetInfos[key]; subAssetUuids.push(subAssetInfo.uuid); } } else if (assetInfo.type === 'cc.Script') { // 脚本资源 uuid = Editor.Utils.UUID.compressUUID(uuid, false); } // 项目assets目录路径 const assetsFsPath = await Editor.Message.request('asset-db', 'query-path', 'db://assets'); (0, logger_1.print)('log', `assetsFsPath: ${assetsFsPath}`); // 查找资源引用 const results = []; const selfResults = await findRefs(uuid, assetsFsPath); for (let i = 0, l = selfResults.length; i < l; i++) { results.push(selfResults[i]); } // 查找子资源的引用 if (subAssetUuids.length > 0) { for (let i = 0; i < subAssetUuids.length; i++) { const subResults = await findRefs(subAssetUuids[i], assetsFsPath); for (let j = 0; j < subResults.length; j++) { results.push(subResults[j]); } } } return results; } Finder.findByUuid = findByUuid; /** 扩展名对应文件类型 */ const ASSET_TYPE_MAP = { // 场景 '.fire': 'scene', '.scene': 'scene', // 预制体 '.prefab': 'prefab', // 动画 '.anim': 'animation', // 材质 '.mtl': 'material', // 字体 '.fnt.meta': 'font', }; /** * 查找引用 * @param {string} uuid * @returns {Promise<{ type: string, url: string, refs?: object[]}[]>} */ async function findRefs(uuid, assetsFsPath) { const result = []; // 文件处理函数 const handler = async (fsPath) => { // 获取文件后缀 const ext = Path.extname(fsPath); // 绝对路径转资源url const url = await Editor.Message.request('asset-db', 'query-url', fsPath); if (ext === '.fire' || ext === '.scene' || ext === '.prefab') { // 场景和预制体资源(转为节点树) const tree = await parser_1.Parser.getNodeTree(fsPath); if (!tree) { return; } // 遍历第一层节点查找引用 const refs = []; for (let children = tree.children, i = 0, l = children.length; i < l; i++) { await findRefsInNode(tree, children[i], uuid, refs); } // 保存当前文件引用结果 if (refs.length > 0) { result.push({ type: ASSET_TYPE_MAP[ext], url, refs, }); } } else if (ext === '.anim') { // 动画资源 const data = JSON.parse(await FileUtil.readFile(fsPath)), curveData = data['curveData'], contains = object_util_1.ObjectUtil.containsValue(curveData, uuid); if (contains) { result.push({ type: ASSET_TYPE_MAP[ext], url }); } } else if (ext === '.mtl' || fsPath.endsWith('.fnt.meta')) { // 材质和字体资源 const data = JSON.parse(await FileUtil.readFile(fsPath)); // 需排除自己 if ((data['uuid'] === uuid)) { return; } // 是否引用 const contains = object_util_1.ObjectUtil.containsValue(data, uuid); if (contains) { const _ext = (ext === '.mtl') ? '.mtl' : '.fnt.meta'; result.push({ type: ASSET_TYPE_MAP[_ext], url, }); } } }; // 遍历资源目录下的文件 await FileUtil.map(assetsFsPath, handler); return result; } /** * 查找节点中的引用 * @param {object} tree 节点树 * @param {object} node 目标节点 * @param {string} uuid 查找的 uuid * @param {object[]} result 结果 */ async function findRefsInNode(tree, node, uuid, result) { // 检查节点上的组件是否有引用 const components = node.components; if (components && components.length > 0) { for (let i = 0, l = components.length; i < l; i++) { // 获取包含uuid的字段 const properties = getContainsUuidProperties(components[i], uuid); if (properties.length === 0) { continue; } // 资源类型 let type = components[i].__type__; // 是否为脚本资源(自定义脚本) if (Editor.Utils.UUID.isUUID(type)) { const scriptUuid = Editor.Utils.UUID.decompressUUID(type); const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', scriptUuid); if (assetInfo) { // 获取脚本名称 type = Path.basename(assetInfo.url); } } // 遍历相关属性名 for (let i = 0; i < properties.length; i++) { let property = properties[i]; if (property === '__type__') { property = null; } else { // 处理属性名称(Label 组件需要特殊处理) if (type === 'cc.Label' && property === '_N$file') { property = 'font'; } // 去除属性名的前缀 if (property.startsWith('_N$')) { property = property.replace('_N$', ''); } else if (property[0] === '_') { property = property.substring(1); } } // 保存结果 result.push({ type: 'node', node: node.path, component: type, property, }); } } } // 检查预制体是否有引用 const prefab = node.prefab; if (prefab) { // 排除预制体自己 // if (uuid !== tree.uuid) { const contains = object_util_1.ObjectUtil.containsValue(prefab, uuid); if (contains) { result.push({ node: node.path, }); } // } } // 遍历子节点 const children = node.children; if (children && children.length > 0) { for (let i = 0, l = children.length; i < l; i++) { await findRefsInNode(tree, children[i], uuid, result); } } } /** * 获取对象包含指定 uuid 的属性 * @param {object} object 对象 * @param {string} uuid 值 * @returns {string[]} */ function getContainsUuidProperties(object, uuid) { const properties = []; const search = (target, path) => { if (Object.prototype.toString.call(target) === '[object Object]') { for (const key in target) { const curPath = (path != null) ? `${path}.${key}` : key; if (target[key] === uuid) { properties.push(path || key); } search(target[key], curPath); } } else if (Array.isArray(target)) { for (let i = 0, l = target.length; i < l; i++) { const curPath = (path != null) ? `${path}[${i}]` : `[${i}]`; if (target[i] === uuid) { properties.push(path || `[${i}]`); } search(target[i], curPath); } } }; search(object, null); return properties; } })(Finder || (exports.Finder = Finder = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2ZpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyQ0FBNkI7QUFDN0IscUNBQWlDO0FBQ2pDLCtDQUEyQztBQUMzQyxxQ0FBZ0Q7QUFFaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFFbEQsSUFBaUIsTUFBTSxDQW9QdEI7QUFwUEQsV0FBaUIsTUFBTTtJQUVuQjs7O09BR0c7SUFDSSxLQUFLLFVBQVUsVUFBVSxDQUFDLFNBQW9CO1FBRWpELEVBQUU7UUFDRixJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzFCLGFBQWE7UUFDYixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsU0FBUztRQUNULElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztZQUNyQyxRQUFRO1lBQ1IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztZQUMxQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLE9BQU87WUFDUCxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsZUFBZTtRQUNmLE1BQU0sWUFBWSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFB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LENBQUM7b0JBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxFQUFFLElBQVcsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7QUFDTCxDQUFDLEVBcFBnQixNQUFNLHNCQUFOLE1BQU0sUUFvUHRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNzZXRJbmZvIH0gZnJvbSAnQGNvY29zL2NyZWF0b3ItdHlwZXMvZWRpdG9yL3BhY2thZ2VzL2Fzc2V0LWRiL0B0eXBlcy9wdWJsaWMnO1xyXG5pbXBvcnQgKiBhcyBQYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4vbG9nZ2VyJztcclxuaW1wb3J0IHsgT2JqZWN0VXRpbCB9IGZyb20gJy4vb2JqZWN0LXV0aWwnO1xyXG5pbXBvcnQgeyBQYXJzZXIsIFRyZWVOb2RlSW5mbyB9IGZyb20gJy4vcGFyc2VyJztcclxuaW1wb3J0IHsgSVJlZiB9IGZyb20gJy4vdHlwZXMnO1xyXG5jb25zdCBGaWxlVXRpbCA9IHJlcXVpcmUoJy4vbGliL2VhemF4L2ZpbGUtdXRpbCcpO1xyXG5cclxuZXhwb3J0IG5hbWVzcGFjZSBGaW5kZXIge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L2/55SoIHV1aWQg6L+b6KGM5p+l5om+XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXVpZFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEJ5VXVpZChhc3NldEluZm86IEFzc2V0SW5mbyk6IFByb21pc2U8SVJlZltdPiB7XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgbGV0IHV1aWQgPSBhc3NldEluZm8udXVpZDtcclxuICAgICAgICAvLyDorrDlvZXlrZDotYTmupAgdXVpZFxyXG4gICAgICAgIGNvbnN0IHN1YkFzc2V0VXVpZHMgPSBbXTtcclxuICAgICAgICAvLyDotYTmupDnsbvlnovmo4Dmn6VcclxuICAgICAgICBpZiAoYXNzZXRJbmZvLnR5cGUgPT09ICdjYy5JbWFnZUFzc2V0Jykge1xyXG4gICAgICAgICAgICAvLyDnurnnkIblrZDotYTmupBcclxuICAgICAgICAgICAgY29uc3Qgc3ViQXNzZXRJbmZvcyA9IGFzc2V0SW5mby5zdWJBc3NldHM7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHN1YkFzc2V0SW5mb3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFzc2V0SW5mbyA9IHN1YkFzc2V0SW5mb3Nba2V5XTtcclxuICAgICAgICAgICAgICAgIHN1YkFzc2V0VXVpZHMucHVzaChzdWJBc3NldEluZm8udXVpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGFzc2V0SW5mby50eXBlID09PSAnY2MuU2NyaXB0Jykge1xyXG4gICAgICAgICAgICAvLyDohJrmnKzotYTmupBcclxuICAgICAgICAgICAgdXVpZCA9IEVkaXRvci5VdGlscy5VVUlELmNvbXByZXNzVVVJRCh1dWlkLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDpobnnm65hc3NldHPnm67lvZXot6/lvoRcclxuICAgICAgICBjb25zdCBhc3NldHNGc1BhdGggPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1wYXRoJywgJ2RiOi8vYXNzZXRzJykgYXMgc3RyaW5nO1xyXG4gICAgICAgIHByaW50KCdsb2cnLCBgYXNzZXRzRnNQYXRoOiAke2Fzc2V0c0ZzUGF0aH1gKTtcclxuXHJcbiAgICAgICAgLy8g5p+l5om+6LWE5rqQ5byV55SoXHJcbiAgICAgICAgY29uc3QgcmVzdWx0czogSVJlZltdID0gW107XHJcbiAgICAgICAgY29uc3Qgc2VsZlJlc3VsdHMgPSBhd2FpdCBmaW5kUmVmcyh1dWlkLCBhc3NldHNGc1BhdGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2VsZlJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzZWxmUmVzdWx0c1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOafpeaJvuWtkOi1hOa6kOeahOW8leeUqFxyXG4gICAgICAgIGlmIChzdWJBc3NldFV1aWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJBc3NldFV1aWRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJSZXN1bHRzID0gYXdhaXQgZmluZFJlZnMoc3ViQXNzZXRVdWlkc1tpXSwgYXNzZXRzRnNQYXRoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3ViUmVzdWx0cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdWJSZXN1bHRzW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiDmianlsZXlkI3lr7nlupTmlofku7bnsbvlnosgKi9cclxuICAgIGNvbnN0IEFTU0VUX1RZUEVfTUFQID0ge1xyXG4gICAgICAgIC8vIOWcuuaZr1xyXG4gICAgICAgICcuZmlyZSc6ICdzY2VuZScsXHJcbiAgICAgICAgJy5zY2VuZSc6ICdzY2VuZScsXHJcbiAgICAgICAgLy8g6aKE5Yi25L2TXHJcbiAgICAgICAgJy5wcmVmYWInOiAncHJlZmFiJyxcclxuICAgICAgICAvLyDliqjnlLtcclxuICAgICAgICAnLmFuaW0nOiAnYW5pbWF0aW9uJyxcclxuICAgICAgICAvLyDmnZDotKhcclxuICAgICAgICAnLm10bCc6ICdtYXRlcmlhbCcsXHJcbiAgICAgICAgLy8g5a2X5L2TXHJcbiAgICAgICAgJy5mbnQubWV0YSc6ICdmb250JyxcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xmib7lvJXnlKhcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dWlkXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHR5cGU6IHN0cmluZywgdXJsOiBzdHJpbmcsIHJlZnM/OiBvYmplY3RbXX1bXT59XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGZ1bmN0aW9uIGZpbmRSZWZzKHV1aWQ6IHN0cmluZywgYXNzZXRzRnNQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElSZWZbXT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogSVJlZltdID0gW107XHJcbiAgICAgICAgLy8g5paH5Lu25aSE55CG5Ye95pWwXHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGFzeW5jIChmc1BhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAvLyDojrflj5bmlofku7blkI7nvIBcclxuICAgICAgICAgICAgY29uc3QgZXh0ID0gUGF0aC5leHRuYW1lKGZzUGF0aCk7XHJcbiAgICAgICAgICAgIC8vIOe7neWvuei3r+W+hOi9rOi1hOa6kHVybFxyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS11cmwnLCBmc1BhdGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV4dCA9PT0gJy5maXJlJyB8fCBleHQgPT09ICcuc2NlbmUnIHx8IGV4dCA9PT0gJy5wcmVmYWInKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDlnLrmma/lkozpooTliLbkvZPotYTmupDvvIjovazkuLroioLngrnmoJHvvIlcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBhd2FpdCBQYXJzZXIuZ2V0Tm9kZVRyZWUoZnNQYXRoKTtcclxuICAgICAgICAgICAgICAgIGlmICghdHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIOmBjeWOhuesrOS4gOWxguiKgueCueafpeaJvuW8leeUqFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmczogSVJlZltdID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGlsZHJlbiA9IHRyZWUuY2hpbGRyZW4sIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmluZFJlZnNJbk5vZGUodHJlZSwgY2hpbGRyZW5baV0sIHV1aWQsIHJlZnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8g5L+d5a2Y5b2T5YmN5paH5Lu25byV55So57uT5p6cXHJcbiAgICAgICAgICAgICAgICBpZiAocmVmcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBU1NFVF9UWVBFX01BUFtleHRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0ID09PSAnLmFuaW0nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDliqjnlLvotYTmupBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGF3YWl0IEZpbGVVdGlsLnJlYWRGaWxlKGZzUGF0aCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnZlRGF0YSA9IGRhdGFbJ2N1cnZlRGF0YSddLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gT2JqZWN0VXRpbC5jb250YWluc1ZhbHVlKGN1cnZlRGF0YSwgdXVpZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFTU0VUX1RZUEVfTUFQW2V4dF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dCA9PT0gJy5tdGwnIHx8IGZzUGF0aC5lbmRzV2l0aCgnLmZudC5tZXRhJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIOadkOi0qOWSjOWtl+S9k+i1hOa6kFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoYXdhaXQgRmlsZVV0aWwucmVhZEZpbGUoZnNQYXRoKSk7XHJcbiAgICAgICAgICAgICAgICAvLyDpnIDmjpLpmaToh6rlt7FcclxuICAgICAgICAgICAgICAgIGlmICgoZGF0YVsndXVpZCddID09PSB1dWlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIOaYr+WQpuW8leeUqFxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbnMgPSBPYmplY3RVdGlsLmNvbnRhaW5zVmFsdWUoZGF0YSwgdXVpZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfZXh0ID0gKGV4dCA9PT0gJy5tdGwnKSA/ICcubXRsJyA6ICcuZm50Lm1ldGEnO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVNTRVRfVFlQRV9NQVBbX2V4dF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8g6YGN5Y6G6LWE5rqQ55uu5b2V5LiL55qE5paH5Lu2XHJcbiAgICAgICAgYXdhaXQgRmlsZVV0aWwubWFwKGFzc2V0c0ZzUGF0aCwgaGFuZGxlcik7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmn6Xmib7oioLngrnkuK3nmoTlvJXnlKhcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0cmVlIOiKgueCueagkVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5vZGUg55uu5qCH6IqC54K5XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXVpZCDmn6Xmib7nmoQgdXVpZFxyXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gcmVzdWx0IOe7k+aenFxyXG4gICAgICovXHJcbiAgICBhc3luYyBmdW5jdGlvbiBmaW5kUmVmc0luTm9kZSh0cmVlOiBUcmVlTm9kZUluZm8sIG5vZGU6IFRyZWVOb2RlSW5mbywgdXVpZDogc3RyaW5nLCByZXN1bHQ6IElSZWZbXSkge1xyXG5cclxuICAgICAgICAvLyDmo4Dmn6XoioLngrnkuIrnmoTnu4Tku7bmmK/lkKbmnInlvJXnlKhcclxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gbm9kZS5jb21wb25lbnRzO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRzICYmIGNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDojrflj5bljIXlkKt1dWlk55qE5a2X5q61XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gZ2V0Q29udGFpbnNVdWlkUHJvcGVydGllcyhjb21wb25lbnRzW2ldLCB1dWlkKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8g6LWE5rqQ57G75Z6LXHJcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGNvbXBvbmVudHNbaV0uX190eXBlX187XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5piv5ZCm5Li66ISa5pys6LWE5rqQ77yI6Ieq5a6a5LmJ6ISa5pys77yJXHJcbiAgICAgICAgICAgICAgICBpZiAoRWRpdG9yLlV0aWxzLlVVSUQuaXNVVUlEKHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0VXVpZCA9IEVkaXRvci5VdGlscy5VVUlELmRlY29tcHJlc3NVVUlEKHR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0SW5mbyA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ2Fzc2V0LWRiJywgJ3F1ZXJ5LWFzc2V0LWluZm8nLCBzY3JpcHRVdWlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXRJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOiOt+WPluiEmuacrOWQjeensFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUGF0aC5iYXNlbmFtZShhc3NldEluZm8udXJsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g6YGN5Y6G55u45YWz5bGe5oCn5ZCNXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ19fdHlwZV9fJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aSE55CG5bGe5oCn5ZCN56ew77yITGFiZWwg57uE5Lu26ZyA6KaB54m55q6K5aSE55CG77yJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnY2MuTGFiZWwnICYmIHByb3BlcnR5ID09PSAnX04kZmlsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gJ2ZvbnQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWOu+mZpOWxnuaAp+WQjeeahOWJjee8gFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aCgnX04kJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkucmVwbGFjZSgnX04kJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5WzBdID09PSAnXycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOe7k+aenFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vZGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLnBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOajgOafpemihOWItuS9k+aYr+WQpuacieW8leeUqFxyXG4gICAgICAgIGNvbnN0IHByZWZhYiA9IG5vZGUucHJlZmFiO1xyXG4gICAgICAgIGlmIChwcmVmYWIpIHtcclxuICAgICAgICAgICAgLy8g5o6S6Zmk6aKE5Yi25L2T6Ieq5bexXHJcbiAgICAgICAgICAgIC8vIGlmICh1dWlkICE9PSB0cmVlLnV1aWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbnMgPSBPYmplY3RVdGlsLmNvbnRhaW5zVmFsdWUocHJlZmFiLCB1dWlkKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5zKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZS5wYXRoLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g6YGN5Y6G5a2Q6IqC54K5XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBmaW5kUmVmc0luTm9kZSh0cmVlLCBjaGlsZHJlbltpXSwgdXVpZCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWvueixoeWMheWQq+aMh+WumiB1dWlkIOeahOWxnuaAp1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCDlr7nosaFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1dWlkIOWAvFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRDb250YWluc1V1aWRQcm9wZXJ0aWVzKG9iamVjdDogYW55LCB1dWlkOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9ICh0YXJnZXQ6IGFueSwgcGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGFyZ2V0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1clBhdGggPSAocGF0aCAhPSBudWxsKSA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFtrZXldID09PSB1dWlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChwYXRoIHx8IGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaCh0YXJnZXRba2V5XSwgY3VyUGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhcmdldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQYXRoID0gKHBhdGggIT0gbnVsbCkgPyBgJHtwYXRofVske2l9XWAgOiBgWyR7aX1dYDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0W2ldID09PSB1dWlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChwYXRoIHx8IGBbJHtpfV1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoKHRhcmdldFtpXSwgY3VyUGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHNlYXJjaChvYmplY3QsIG51bGwgYXMgYW55KTtcclxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcclxuICAgIH1cclxufSJdfQ==