消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

218 lines
25 KiB

"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.Parser = void 0;
const logger_1 = require("./logger");
const object_util_1 = require("./object-util");
const FileUtil = require('./lib/eazax/file-util');
const Path = __importStar(require("path"));
/**
* 用来解析预制体/场景
*/
var Parser;
(function (Parser) {
/**
* 节点树缓存
* @type {{ [key: string]: object }}
*/
const caches = {};
/**
* 获取节点树
* @param {string} path 路径
* @returns {Promise<object>}
*/
async function getNodeTree(path) {
path = Path.normalize(path);
if (!caches[path]) {
const file = await FileUtil.readFile(path);
let data = null;
try {
data = JSON.parse(file);
}
catch (error) {
(0, logger_1.print)('warn', '文件解析失败', path);
(0, logger_1.print)('warn', error);
}
if (!data) {
return null;
}
caches[path] = convert(data);
}
return caches[path];
}
Parser.getNodeTree = getNodeTree;
/**
* 更新缓存
* @param {string} path 路径
*/
async function updateCache(path) {
path = Path.normalize(path);
if (!caches[path]) {
// 本来就没有缓存
return;
}
caches[path] = null;
await getNodeTree(path);
}
Parser.updateCache = updateCache;
/**
* 将资源解析为节点树
* @param {object} source 源数据
* @returns {object}
*/
function convert(source) {
const tree = Object.create(null);
// 第一个元素
const firstElement = source[0];
// 最后一个元素
const lastElement = source[source.length - 1];
// 类型存储在这
const type = firstElement.__type__;
if (type === 'cc.SceneAsset') {
// 场景资源
const id = firstElement.scene.__id__;
// 获取子节点列表
const children = source[id]._children;
// 类型
tree.type = 'cc.Scene';
// ID
tree.id = id;
// 场景下可以有多个一级节点
tree.children = [];
for (let i = 0, l = children.length; i < l; i++) {
const nodeId = children[i].__id__;
convertNode(source, nodeId, tree);
}
}
else if (type === 'cc.Prefab') {
// 预制体资源
const id = firstElement.data.__id__;
// 类型
tree.type = 'cc.Prefab';
// ID
tree.id = id;
// 预制体本身就是一个节点
tree.children = [];
convertNode(source, id, tree);
}
return tree;
}
/**
* 解析节点
* @param {NodeInfo[]} source 源数据
* @param {number} nodeId 节点 ID
* @param {TreeNodeInfo} parent 父节点
*/
function convertNode(source, nodeId, parent) {
// 获取节点数据
const srcNode = source[nodeId];
const node = Object.create(null);
// 基本信息
node.name = srcNode._name;
node.id = nodeId;
// TODO 更多类型
node.type = srcNode.__type__;
// 路径
const parentPath = parent.path || null;
node.path = parentPath ? `${parentPath}/${node.name}` : node.name;
// 预制体引用
const srcPrefab = srcNode._prefab;
if (srcPrefab) {
// 读取prefab数据
const id = srcPrefab.__id__;
node.prefab = extractValidInfo(source[id]);
// 预制体名称特殊一点,节点信息并不包含 _name
try {
const overrideInfo = source[id + 2];
if (overrideInfo.__type__ === 'CCPropertyOverrideInfo') {
node.path = parentPath ? `${parentPath}/${overrideInfo.value}` : overrideInfo.value;
}
}
catch (error) {
}
}
// 组件
node.components = [];
const srcComponents = srcNode._components;
if (srcComponents && srcComponents.length > 0) {
for (let i = 0, l = srcComponents.length; i < l; i++) {
const compId = srcComponents[i].__id__;
const component = extractValidInfo(source[compId]);
node.components.push(component);
}
}
// 子节点
node.children = [];
const srcChildren = srcNode._children;
if (srcChildren && srcChildren.length > 0) {
for (let i = 0, l = srcChildren.length; i < l; i++) {
const nodeId = srcChildren[i].__id__;
convertNode(source, nodeId, node);
}
}
// 保存到父节点
parent.children.push(node);
}
/**
* 提取有效信息(含有 uuid)
* @param {ExtraInfo} source 源数据
* @returns {{ __type__: string, _name: string, fileId?: string }}
*/
function extractValidInfo(source) {
const result = Object.create(null);
// 记录有用的属性
if (source.__type__ !== undefined) {
// 如果是component , 那么这个就是组件名
// 如果是自定义component,那么这个就是脚本的uuid(压缩过后)
result.__type__ = source.__type__;
}
if (source._name !== undefined) {
result._name = source._name;
}
if (source.fileId !== undefined) {
result.fileId = source.fileId;
}
// 记录包含 uuid 的属性
for (const key in source) {
const val = source[key];
const contains = object_util_1.ObjectUtil.containsProperty(val, '__uuid__');
if (contains) {
result[key] = val;
}
}
return result;
}
})(Parser || (exports.Parser = Parser = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUM7QUFDakMsK0NBQTJDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2xELDJDQUE2QjtBQUU3Qjs7R0FFRztBQUNILElBQWlCLE1BQU0sQ0FvTHRCO0FBcExELFdBQWlCLE1BQU07SUFDbkI7OztPQUdHO0lBQ0gsTUFBTSxNQUFNLEdBQW9DLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ksS0FBSyxVQUFVLFdBQVcsQ0FBQyxJQUFZO1FBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQztnQkFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM5QixJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDUixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFD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R0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxnQkFBZ0I7UUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLEdBQUcsR0FBSSxNQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsd0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDVixNQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQy9CLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztBQUNMLENBQUMsRUFwTGdCLE1BQU0sc0JBQU4sTUFBTSxRQW9MdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcmludCB9IGZyb20gJy4vbG9nZ2VyJztcclxuaW1wb3J0IHsgT2JqZWN0VXRpbCB9IGZyb20gJy4vb2JqZWN0LXV0aWwnO1xyXG5jb25zdCBGaWxlVXRpbCA9IHJlcXVpcmUoJy4vbGliL2VhemF4L2ZpbGUtdXRpbCcpO1xyXG5pbXBvcnQgKiBhcyBQYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuLyoqXHJcbiAqIOeUqOadpeino+aekOmihOWItuS9ky/lnLrmma9cclxuICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUGFyc2VyIHtcclxuICAgIC8qKlxyXG4gICAgICog6IqC54K55qCR57yT5a2YXHJcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3QgfX1cclxuICAgICAqL1xyXG4gICAgY29uc3QgY2FjaGVzOiB7IFtrZXk6IHN0cmluZ106IFRyZWVOb2RlSW5mbyB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5boioLngrnmoJFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIOi3r+W+hFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5vZGVUcmVlKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHBhdGggPSBQYXRoLm5vcm1hbGl6ZShwYXRoKTtcclxuICAgICAgICBpZiAoIWNhY2hlc1twYXRoXSkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgRmlsZVV0aWwucmVhZEZpbGUocGF0aCk7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGZpbGUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcHJpbnQoJ3dhcm4nLCAn5paH5Lu26Kej5p6Q5aSx6LSlJywgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICBwcmludCgnd2FybicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhY2hlc1twYXRoXSA9IGNvbnZlcnQoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYWNoZXNbcGF0aF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmm7TmlrDnvJPlrZhcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIOi3r+W+hFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2FjaGUocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgcGF0aCA9IFBhdGgubm9ybWFsaXplKHBhdGgpO1xyXG4gICAgICAgIGlmICghY2FjaGVzW3BhdGhdKSB7XHJcbiAgICAgICAgICAgIC8vIOacrOadpeWwseayoeaciee8k+WtmFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhY2hlc1twYXRoXSA9IG51bGwgYXMgYW55O1xyXG4gICAgICAgIGF3YWl0IGdldE5vZGVUcmVlKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5bCG6LWE5rqQ6Kej5p6Q5Li66IqC54K55qCRXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc291cmNlIOa6kOaVsOaNrlxyXG4gICAgICogQHJldHVybnMge29iamVjdH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gY29udmVydChzb3VyY2U6IE5vZGVJbmZvW10pIHtcclxuICAgICAgICBjb25zdCB0cmVlOiBUcmVlTm9kZUluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIC8vIOesrOS4gOS4quWFg+e0oFxyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHNvdXJjZVswXTtcclxuICAgICAgICAvLyDmnIDlkI7kuIDkuKrlhYPntKBcclxuICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgIC8vIOexu+Wei+WtmOWCqOWcqOi/mVxyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBmaXJzdEVsZW1lbnQuX190eXBlX187XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdjYy5TY2VuZUFzc2V0Jykge1xyXG4gICAgICAgICAgICAvLyDlnLrmma/otYTmupBcclxuICAgICAgICAgICAgY29uc3QgaWQgPSAoZmlyc3RFbGVtZW50IGFzIFNjZW5lTm9kZVJvb3QpLnNjZW5lLl9faWRfXztcclxuICAgICAgICAgICAgLy8g6I635Y+W5a2Q6IqC54K55YiX6KGoXHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc291cmNlW2lkXS5fY2hpbGRyZW47XHJcbiAgICAgICAgICAgIC8vIOexu+Wei1xyXG4gICAgICAgICAgICB0cmVlLnR5cGUgPSAnY2MuU2NlbmUnO1xyXG4gICAgICAgICAgICAvLyBJRFxyXG4gICAgICAgICAgICB0cmVlLmlkID0gaWQ7XHJcbiAgICAgICAgICAgIC8vIOWcuuaZr+S4i+WPr+S7peacieWkmuS4quS4gOe6p+iKgueCuVxyXG4gICAgICAgICAgICB0cmVlLmNoaWxkcmVuID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlSWQgPSBjaGlsZHJlbltpXS5fX2lkX187XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0Tm9kZShzb3VyY2UsIG5vZGVJZCwgdHJlZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjYy5QcmVmYWInKSB7XHJcbiAgICAgICAgICAgIC8vIOmihOWItuS9k+i1hOa6kFxyXG4gICAgICAgICAgICBjb25zdCBpZCA9IChmaXJzdEVsZW1lbnQgYXMgUHJlZmFiTm9kZVJvb3QpLmRhdGEuX19pZF9fO1xyXG4gICAgICAgICAgICAvLyDnsbvlnotcclxuICAgICAgICAgICAgdHJlZS50eXBlID0gJ2NjLlByZWZhYic7XHJcbiAgICAgICAgICAgIC8vIElEXHJcbiAgICAgICAgICAgIHRyZWUuaWQgPSBpZDtcclxuICAgICAgICAgICAgLy8g6aKE5Yi25L2T5pys6Lqr5bCx5piv5LiA5Liq6IqC54K5XHJcbiAgICAgICAgICAgIHRyZWUuY2hpbGRyZW4gPSBbXTtcclxuICAgICAgICAgICAgY29udmVydE5vZGUoc291cmNlLCBpZCwgdHJlZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kej5p6Q6IqC54K5XHJcbiAgICAgKiBAcGFyYW0ge05vZGVJbmZvW119IHNvdXJjZSDmupDmlbDmja5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSWQg6IqC54K5IElEXHJcbiAgICAgKiBAcGFyYW0ge1RyZWVOb2RlSW5mb30gcGFyZW50IOeItuiKgueCuVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBjb252ZXJ0Tm9kZShzb3VyY2U6IE5vZGVJbmZvW10sIG5vZGVJZDogbnVtYmVyLCBwYXJlbnQ6IFRyZWVOb2RlSW5mbykge1xyXG4gICAgICAgIC8vIOiOt+WPluiKgueCueaVsOaNrlxyXG4gICAgICAgIGNvbnN0IHNyY05vZGUgPSBzb3VyY2Vbbm9kZUlkXTtcclxuICAgICAgICBjb25zdCBub2RlOiBUcmVlTm9kZUluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIC8vIOWfuuacrOS/oeaBr1xyXG4gICAgICAgIG5vZGUubmFtZSA9IHNyY05vZGUuX25hbWU7XHJcbiAgICAgICAgbm9kZS5pZCA9IG5vZGVJZDtcclxuICAgICAgICAvLyBUT0RPIOabtOWkmuexu+Wei1xyXG4gICAgICAgIG5vZGUudHlwZSA9IHNyY05vZGUuX190eXBlX18gYXMgYW55O1xyXG5cclxuICAgICAgICAvLyDot6/lvoRcclxuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGggfHwgbnVsbDtcclxuICAgICAgICBub2RlLnBhdGggPSBwYXJlbnRQYXRoID8gYCR7cGFyZW50UGF0aH0vJHtub2RlLm5hbWV9YCA6IG5vZGUubmFtZTtcclxuXHJcbiAgICAgICAgLy8g6aKE5Yi25L2T5byV55SoXHJcbiAgICAgICAgY29uc3Qgc3JjUHJlZmFiID0gc3JjTm9kZS5fcHJlZmFiO1xyXG4gICAgICAgIGlmIChzcmNQcmVmYWIpIHtcclxuICAgICAgICAgICAgLy8g6K+75Y+WcHJlZmFi5pWw5o2uXHJcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc3JjUHJlZmFiLl9faWRfXztcclxuICAgICAgICAgICAgbm9kZS5wcmVmYWIgPSBleHRyYWN0VmFsaWRJbmZvKHNvdXJjZVtpZF0gYXMgRXh0cmFJbmZvKTtcclxuICAgICAgICAgICAgLy8g6aKE5Yi25L2T5ZCN56ew54m55q6K5LiA54K577yM6IqC54K55L+h5oGv5bm25LiN5YyF5ZCrIF9uYW1lXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZUluZm8gPSBzb3VyY2VbaWQgKyAyXSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVJbmZvLl9fdHlwZV9fID09PSAnQ0NQcm9wZXJ0eU92ZXJyaWRlSW5mbycpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnBhdGggPSBwYXJlbnRQYXRoID8gYCR7cGFyZW50UGF0aH0vJHtvdmVycmlkZUluZm8udmFsdWV9YCA6IG92ZXJyaWRlSW5mby52YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g57uE5Lu2XHJcbiAgICAgICAgbm9kZS5jb21wb25lbnRzID0gW107XHJcbiAgICAgICAgY29uc3Qgc3JjQ29tcG9uZW50cyA9IHNyY05vZGUuX2NvbXBvbmVudHM7XHJcbiAgICAgICAgaWYgKHNyY0NvbXBvbmVudHMgJiYgc3JjQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3JjQ29tcG9uZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBJZCA9IHNyY0NvbXBvbmVudHNbaV0uX19pZF9fO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZXh0cmFjdFZhbGlkSW5mbyhzb3VyY2VbY29tcElkXSBhcyBFeHRyYUluZm8pO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5a2Q6IqC54K5XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHNyY0NoaWxkcmVuID0gc3JjTm9kZS5fY2hpbGRyZW47XHJcbiAgICAgICAgaWYgKHNyY0NoaWxkcmVuICYmIHNyY0NoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzcmNDaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHNyY0NoaWxkcmVuW2ldLl9faWRfXztcclxuICAgICAgICAgICAgICAgIGNvbnZlcnROb2RlKHNvdXJjZSwgbm9kZUlkLCBub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5L+d5a2Y5Yiw54i26IqC54K5XHJcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Dlj5bmnInmlYjkv6Hmga/vvIjlkKvmnIkgdXVpZO+8iVxyXG4gICAgICogQHBhcmFtIHtFeHRyYUluZm99IHNvdXJjZSDmupDmlbDmja5cclxuICAgICAqIEByZXR1cm5zIHt7IF9fdHlwZV9fOiBzdHJpbmcsIF9uYW1lOiBzdHJpbmcsIGZpbGVJZD86IHN0cmluZyB9fVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBleHRyYWN0VmFsaWRJbmZvKHNvdXJjZTogRXh0cmFJbmZvKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBUcmVlTm9kZUV4dHJhSW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgICAgICAgLy8g6K6w5b2V5pyJ55So55qE5bGe5oCnXHJcbiAgICAgICAgaWYgKHNvdXJjZS5fX3R5cGVfXyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIOWmguaenOaYr2NvbXBvbmVudCDvvIwg6YKj5LmI6L+Z5Liq5bCx5piv57uE5Lu25ZCNXHJcbiAgICAgICAgICAgIC8vIOWmguaenOaYr+iHquWumuS5iWNvbXBvbmVudO+8jOmCo+S5iOi/meS4quWwseaYr+iEmuacrOeahHV1aWTvvIjljovnvKnov4flkI7vvIlcclxuICAgICAgICAgICAgcmVzdWx0Ll9fdHlwZV9fID0gc291cmNlLl9fdHlwZV9fO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc291cmNlLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmVzdWx0Ll9uYW1lID0gc291cmNlLl9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc291cmNlLmZpbGVJZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5maWxlSWQgPSBzb3VyY2UuZmlsZUlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g6K6w5b2V5YyF5ZCrIHV1aWQg55qE5bGe5oCnXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChzb3VyY2UgYXMgYW55KVtrZXldO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IE9iamVjdFV0aWwuY29udGFpbnNQcm9wZXJ0eSh2YWwsICdfX3V1aWRfXycpO1xyXG4gICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcclxuICAgICAgICAgICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyDihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpPihpNcclxuaW50ZXJmYWNlIE5vZGVCYXNlIHtcclxuICAgIC8vXHJcbiAgICBfbmFtZTogc3RyaW5nO1xyXG4gICAgLy8g6K6w5b2V5a2Q6IqC54K555qE5bqP5Y+3XHJcbiAgICBfY2hpbGRyZW46IHsgX19pZF9fOiBudW1iZXI7IH1bXTtcclxuICAgIC8vID9cclxuICAgIF9wcmVmYWI6IHtcclxuICAgICAgICBfX2lkX186IG51bWJlcjtcclxuICAgIH1cclxuICAgIGluc3RhbmNlOiB7XHJcbiAgICAgICAgX19pZF9fOiBudW1iZXI7XHJcbiAgICB9XHJcbiAgICAvLyDnu4Tku7ZcclxuICAgIF9jb21wb25lbnRzOiB7IF9faWRfXzogbnVtYmVyIH1bXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIFByZWZhYk5vZGVSb290IGV4dGVuZHMgTm9kZUJhc2Uge1xyXG4gICAgX190eXBlX186ICdjYy5QcmVmYWInO1xyXG4gICAgZGF0YToge1xyXG4gICAgICAgIF9faWRfXzogbnVtYmVyO1xyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgU2NlbmVOb2RlUm9vdCBleHRlbmRzIE5vZGVCYXNlIHtcclxuICAgIF9fdHlwZV9fOiAnY2MuU2NlbmVBc3NldCc7XHJcbiAgICBzY2VuZToge1xyXG4gICAgICAgIF9faWRfXzogbnVtYmVyO1xyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgU2NlbmVOb2RlU2Vjb25kIGV4dGVuZHMgTm9kZUJhc2Uge1xyXG4gICAgX190eXBlX186ICdjYy5TY2VuZSc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBPcmlnaW5hbE5vZGUgZXh0ZW5kcyBOb2RlQmFzZSB7XHJcbiAgICBfX3R5cGVfXzogJ2NjLk5vZGUnO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRXh0cmFJbmZvIGV4dGVuZHMgTm9kZUJhc2Uge1xyXG4gICAgX190eXBlX186IHN0cmluZztcclxuICAgIGZpbGVJZDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIE5vZGVJbmZvID0gU2NlbmVOb2RlUm9vdCB8IFNjZW5lTm9kZVNlY29uZCB8IFByZWZhYk5vZGVSb290IHwgT3JpZ2luYWxOb2RlIHwgRXh0cmFJbmZvO1xyXG5cclxuXHJcbi8vIOKGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk+KGk1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlSW5mbyB7XHJcbiAgICBpZDogbnVtYmVyO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZTogJ2NjLlByZWZhYicgfCAnY2MuU2NlbmUnO1xyXG4gICAgY2hpbGRyZW46IFRyZWVOb2RlSW5mb1tdO1xyXG4gICAgLy8g5a6M5pW055qE6IqC54K56Lev5b6EXHJcbiAgICBwYXRoPzogc3RyaW5nO1xyXG4gICAgLy9cclxuICAgIHByZWZhYjogVHJlZU5vZGVFeHRyYUluZm87XHJcbiAgICBjb21wb25lbnRzOiBUcmVlTm9kZUV4dHJhSW5mb1tdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVHJlZU5vZGVFeHRyYUluZm8ge1xyXG4gICAgX190eXBlX186IHN0cmluZztcclxuICAgIF9uYW1lOiBzdHJpbmc7XHJcbiAgICBmaWxlSWQ6IHN0cmluZztcclxufSJdfQ==