'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Pin = exports.PinD = exports.Block = exports.Graph = exports.Forge = void 0; const block_1 = require("../block"); const graphWeakMap = new WeakMap(); const blockWeakMap = new WeakMap(); const pinWeakMap = new WeakMap(); class Forge { constructor(graph) { this.rootGraphData = graph; } get details() { return this.rootGraphData.details; } getGraph() { const graphData = this.rootGraphData; if (!graphWeakMap.has(graphData)) { graphWeakMap.set(graphData, new Graph(graphData)); } return graphWeakMap.get(graphData); } } exports.Forge = Forge; class Graph { constructor(graph) { this.graph = graph; // 生成数据 this.getBlockMap(); // 整理 line 数据 const nodeMap = this.graph.nodes; const lineMap = this.graph.lines; for (const uuid in lineMap) { const line = lineMap[uuid]; const inputNode = nodeMap[line.input.node]; const outputNode = nodeMap[line.output.node]; const inputBlock = blockWeakMap.get(inputNode); const outputBlock = blockWeakMap.get(outputNode); inputBlock?.getOutputPinsList(); outputBlock?.getInputPinsList(); const inputPin = inputBlock?.getOutputPin(line.input.param); const outPin = outputBlock?.getInputPin(line.output.param); if (outPin) { inputPin.connectPins.push(outPin); } if (inputPin) { outPin.connectPins.push(inputPin); } } } get details() { return this.graph.details; } getSubGraphMap() { const data = {}; for (const uuid in this.graph.graphs) { const graphData = this.graph.graphs[uuid]; if (!graphWeakMap.has(graphData)) { graphWeakMap.set(graphData, new Graph(graphData)); } const graph = graphWeakMap.get(graphData); data[uuid] = graph; } return data; } getBlockMap() { const data = {}; for (const uuid in this.graph.nodes) { const blockData = this.graph.nodes[uuid]; if (!blockWeakMap.has(blockData)) { blockWeakMap.set(blockData, new Block(this, uuid, blockData)); } const block = blockWeakMap.get(blockData); data[uuid] = block; } return data; } } exports.Graph = Graph; class Block { constructor(graph, uuid, block) { this.graph = graph; this.uuid = uuid; this.block = block; this.desc = block_1.blockMap.get(this.block.type); this.getInputPinsList(); this.getOutputPinsList(); } get details() { return this.block.details; } getInputPin(tag) { const inputPins = this.desc?.inputPins || []; for (let index = 0; index < inputPins.length; index++) { const pinDesc = inputPins[index]; if (pinDesc.tag === tag) { const pin = this.block.details.inputPins[index]; return pinWeakMap.get(pin); } } } getOutputPin(tag) { const outputPins = this.desc?.outputPins || []; for (let index = 0; index < outputPins.length; index++) { const pin = outputPins[index]; if (pin.tag === tag) { const pin = this.block.details.outputPins[index]; return pinWeakMap.get(pin); } } } getInputPinsList() { const inputPins = this.block.details.inputPins || []; const blockDesc = this.desc || { inputPins: [] }; return inputPins.map((pinData, index) => { if (!pinWeakMap.has(pinData)) { pinWeakMap.set(pinData, new Pin(PinD.input, this, pinData, blockDesc.inputPins[index])); } return pinWeakMap.get(pinData); }); } getOutputPinsList() { const outputPins = this.block.details.outputPins || []; const blockDesc = this.desc || { outputPins: [] }; return outputPins.map((pinData, index) => { if (!pinWeakMap.has(pinData)) { pinWeakMap.set(pinData, new Pin(PinD.output, this, pinData, blockDesc.outputPins[index])); } return pinWeakMap.get(pinData); }); } } exports.Block = Block; var PinD; (function (PinD) { PinD[PinD["input"] = 0] = "input"; PinD[PinD["output"] = 1] = "output"; })(PinD = exports.PinD || (exports.PinD = {})); class Pin { constructor(dir, block, pin, desc) { this.connectPins = []; this.type = dir; this.block = block; this.desc = desc; this.value = pin; } } exports.Pin = Pin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2stZm9yZ2UvbW9kdWxlL2ZvcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBSWIsb0NBQW9DO0FBRXBDLE1BQU0sWUFBWSxHQUE4QixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQzlELE1BQU0sWUFBWSxHQUE4QixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQzlELE1BQU0sVUFBVSxHQUEwQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRXhELE1BQWEsS0FBSztJQUdkLFlBQVksS0FBZ0I7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDdEMsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlCLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFFLENBQUM7SUFDeEMsQ0FBQztDQUNKO0FBbEJELHNCQWtCQztBQUVELE1BQWEsS0FBSztJQUdkLFlBQVksS0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsT0FBTztRQUNQLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixhQUFhO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFD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QUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0Y7WUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFsRUQsc0JBa0VDO0FBRUQsSUFBWSxJQUdYO0FBSEQsV0FBWSxJQUFJO0lBQ1osaUNBQU8sQ0FBQTtJQUNQLG1DQUFRLENBQUE7QUFDWixDQUFDLEVBSFcsSUFBSSxHQUFKLFlBQUksS0FBSixZQUFJLFFBR2Y7QUFFRCxNQUFhLEdBQUc7SUFTWixZQUFZLEdBQVMsRUFBRSxLQUFZLEVBQUUsR0FBWSxFQUFFLElBQXFCO1FBRnhFLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBR3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLENBQUM7Q0FDSjtBQWZELGtCQWVDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEJsb2NrRGF0YSwgR3JhcGhEYXRhLCBQaW5EYXRhLCBJUGluRGVzY3JpcHRpb24sIElCbG9ja0Rlc2NyaXB0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgYmxvY2tNYXAgfSBmcm9tICcuLi9ibG9jayc7XG5cbmNvbnN0IGdyYXBoV2Vha01hcDogV2Vha01hcDxHcmFwaERhdGEsIEdyYXBoPiA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBibG9ja1dlYWtNYXA6IFdlYWtNYXA8QmxvY2tEYXRhLCBCbG9jaz4gPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgcGluV2Vha01hcDogV2Vha01hcDxQaW5EYXRhLCBQaW4+ID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGNsYXNzIEZvcmdlIHtcbiAgICByb290R3JhcGhEYXRhOiBHcmFwaERhdGE7XG5cbiAgICBjb25zdHJ1Y3RvcihncmFwaDogR3JhcGhEYXRhKSB7XG4gICAgICAgIHRoaXMucm9vdEdyYXBoRGF0YSA9IGdyYXBoO1xuICAgIH1cblxuICAgIGdldCBkZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290R3JhcGhEYXRhLmRldGFpbHM7XG4gICAgfVxuXG4gICAgZ2V0R3JhcGgoKSB7XG4gICAgICAgIGNvbnN0IGdyYXBoRGF0YSA9IHRoaXMucm9vdEdyYXBoRGF0YTtcbiAgICAgICAgaWYgKCFncmFwaFdlYWtNYXAuaGFzKGdyYXBoRGF0YSkpIHtcbiAgICAgICAgICAgIGdyYXBoV2Vha01hcC5zZXQoZ3JhcGhEYXRhLCBuZXcgR3JhcGgoZ3JhcGhEYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyYXBoV2Vha01hcC5nZXQoZ3JhcGhEYXRhKSE7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR3JhcGgge1xuICAgIGdyYXBoOiBHcmFwaERhdGE7XG5cbiAgICBjb25zdHJ1Y3RvcihncmFwaDogR3JhcGhEYXRhKSB7XG4gICAgICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcblxuICAgICAgICAvLyDnlJ/miJDmlbDmja5cbiAgICAgICAgdGhpcy5nZXRCbG9ja01hcCgpO1xuXG4gICAgICAgIC8vIOaVtOeQhiBsaW5lIOaVsOaNrlxuICAgICAgICBjb25zdCBub2RlTWFwID0gdGhpcy5ncmFwaC5ub2RlcztcbiAgICAgICAgY29uc3QgbGluZU1hcCA9IHRoaXMuZ3JhcGgubGluZXM7XG4gICAgICAgIGZvciAoY29uc3QgdXVpZCBpbiBsaW5lTWFwKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZU1hcFt1dWlkXTtcblxuICAgICAgICAgICAgY29uc3QgaW5wdXROb2RlID0gbm9kZU1hcFtsaW5lLmlucHV0Lm5vZGVdO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0Tm9kZSA9IG5vZGVNYXBbbGluZS5vdXRwdXQubm9kZV07XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0QmxvY2sgPSBibG9ja1dlYWtNYXAuZ2V0KGlucHV0Tm9kZSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRCbG9jayA9IGJsb2NrV2Vha01hcC5nZXQob3V0cHV0Tm9kZSk7XG5cbiAgICAgICAgICAgIGlucHV0QmxvY2s/LmdldE91dHB1dFBpbnNMaXN0KCk7XG4gICAgICAgICAgICBvdXRwdXRCbG9jaz8uZ2V0SW5wdXRQaW5zTGlzdCgpO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRQaW4gPSBpbnB1dEJsb2NrPy5nZXRPdXRwdXRQaW4obGluZS5pbnB1dC5wYXJhbSk7XG4gICAgICAgICAgICBjb25zdCBvdXRQaW4gPSBvdXRwdXRCbG9jaz8uZ2V0SW5wdXRQaW4obGluZS5vdXRwdXQucGFyYW0pO1xuXG4gICAgICAgICAgICBpZiAob3V0UGluKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRQaW4hLmNvbm5lY3RQaW5zLnB1c2gob3V0UGluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dFBpbikge1xuICAgICAgICAgICAgICAgIG91dFBpbiEuY29ubmVjdFBpbnMucHVzaChpbnB1dFBpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZGV0YWlscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JhcGguZGV0YWlscztcbiAgICB9XG5cbiAgICBnZXRTdWJHcmFwaE1hcCgpIHtcbiAgICAgICAgY29uc3QgZGF0YTogeyBbdXVpZDogc3RyaW5nXTogR3JhcGggfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHV1aWQgaW4gdGhpcy5ncmFwaC5ncmFwaHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyYXBoRGF0YSA9IHRoaXMuZ3JhcGguZ3JhcGhzW3V1aWRdO1xuICAgICAgICAgICAgaWYgKCFncmFwaFdlYWtNYXAuaGFzKGdyYXBoRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBncmFwaFdlYWtNYXAuc2V0KGdyYXBoRGF0YSwgbmV3IEdyYXBoKGdyYXBoRGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JhcGggPSBncmFwaFdlYWtNYXAuZ2V0KGdyYXBoRGF0YSkhO1xuICAgICAgICAgICAgZGF0YVt1dWlkXSA9IGdyYXBoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGdldEJsb2NrTWFwKCkge1xuICAgICAgICBjb25zdCBkYXRhOiB7IFt1dWlkOiBzdHJpbmddOiBCbG9jayB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdXVpZCBpbiB0aGlzLmdyYXBoLm5vZGVzKSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0RhdGEgPSB0aGlzLmdyYXBoLm5vZGVzW3V1aWRdO1xuICAgICAgICAgICAgaWYgKCFibG9ja1dlYWtNYXAuaGFzKGJsb2NrRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBibG9ja1dlYWtNYXAuc2V0KGJsb2NrRGF0YSwgbmV3IEJsb2NrKHRoaXMsIHV1aWQsIGJsb2NrRGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBibG9ja1dlYWtNYXAuZ2V0KGJsb2NrRGF0YSkhO1xuICAgICAgICAgICAgZGF0YVt1dWlkXSA9IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrIHtcbiAgICB1dWlkOiBzdHJpbmc7XG4gICAgZ3JhcGg6IEdyYXBoO1xuICAgIGJsb2NrOiBCbG9ja0RhdGE7XG4gICAgZGVzYz86IElCbG9ja0Rlc2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoZ3JhcGg6IEdyYXBoLCB1dWlkOiBzdHJpbmcsIGJsb2NrOiBCbG9ja0RhdGEpIHtcbiAgICAgICAgdGhpcy5ncmFwaCA9IGdyYXBoO1xuICAgICAgICB0aGlzLnV1aWQgPSB1dWlkO1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIHRoaXMuZGVzYyA9IGJsb2NrTWFwLmdldCh0aGlzLmJsb2NrLnR5cGUpO1xuXG4gICAgICAgIHRoaXMuZ2V0SW5wdXRQaW5zTGlzdCgpO1xuICAgICAgICB0aGlzLmdldE91dHB1dFBpbnNMaXN0KCk7XG4gICAgfVxuXG4gICAgZ2V0IGRldGFpbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrLmRldGFpbHM7XG4gICAgfVxuXG4gICAgZ2V0SW5wdXRQaW4odGFnOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW5wdXRQaW5zID0gdGhpcy5kZXNjPy5pbnB1dFBpbnMgfHwgW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0UGlucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpbkRlc2MgPSBpbnB1dFBpbnNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHBpbkRlc2MudGFnID09PSB0YWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaW4gPSB0aGlzLmJsb2NrLmRldGFpbHMuaW5wdXRQaW5zIVtpbmRleF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBpbldlYWtNYXAuZ2V0KHBpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdXRwdXRQaW4odGFnOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0UGlucyA9IHRoaXMuZGVzYz8ub3V0cHV0UGlucyB8fCBbXTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb3V0cHV0UGlucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpbiA9IG91dHB1dFBpbnNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHBpbi50YWcgPT09IHRhZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpbiA9IHRoaXMuYmxvY2suZGV0YWlscy5vdXRwdXRQaW5zIVtpbmRleF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBpbldlYWtNYXAuZ2V0KHBpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbnB1dFBpbnNMaXN0KCkge1xuICAgICAgICBjb25zdCBpbnB1dFBpbnMgPSB0aGlzLmJsb2NrLmRldGFpbHMuaW5wdXRQaW5zIHx8IFtdO1xuICAgICAgICBjb25zdCBibG9ja0Rlc2MgPSB0aGlzLmRlc2MgfHwge2lucHV0UGluczogW119O1xuXG4gICAgICAgIHJldHVybiBpbnB1dFBpbnMubWFwKChwaW5EYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwaW5XZWFrTWFwLmhhcyhwaW5EYXRhKSkge1xuICAgICAgICAgICAgICAgIHBpbldlYWtNYXAuc2V0KHBpbkRhdGEsIG5ldyBQaW4oUGluRC5pbnB1dCwgdGhpcywgcGluRGF0YSwgYmxvY2tEZXNjLmlucHV0UGluc1tpbmRleF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwaW5XZWFrTWFwLmdldChwaW5EYXRhKSE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE91dHB1dFBpbnNMaXN0KCkge1xuICAgICAgICBjb25zdCBvdXRwdXRQaW5zID0gdGhpcy5ibG9jay5kZXRhaWxzLm91dHB1dFBpbnMgfHwgW107XG4gICAgICAgIGNvbnN0IGJsb2NrRGVzYyA9IHRoaXMuZGVzYyB8fCB7b3V0cHV0UGluczogW119O1xuICAgICAgICByZXR1cm4gb3V0cHV0UGlucy5tYXAoKHBpbkRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXBpbldlYWtNYXAuaGFzKHBpbkRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcGluV2Vha01hcC5zZXQocGluRGF0YSwgbmV3IFBpbihQaW5ELm91dHB1dCwgdGhpcywgcGluRGF0YSwgYmxvY2tEZXNjLm91dHB1dFBpbnNbaW5kZXhdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGluV2Vha01hcC5nZXQocGluRGF0YSkhO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIFBpbkQge1xuICAgICdpbnB1dCcsXG4gICAgJ291dHB1dCcsXG59XG5cbmV4cG9ydCBjbGFzcyBQaW4ge1xuICAgIGJsb2NrOiBCbG9jaztcbiAgICB2YWx1ZTogUGluRGF0YTtcbiAgICBkZXNjOiBJUGluRGVzY3JpcHRpb247XG5cbiAgICB0eXBlOiBQaW5EO1xuXG4gICAgY29ubmVjdFBpbnM6IFBpbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihkaXI6IFBpbkQsIGJsb2NrOiBCbG9jaywgcGluOiBQaW5EYXRhLCBkZXNjOiBJUGluRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gZGlyO1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIHRoaXMuZGVzYyA9IGRlc2M7XG4gICAgICAgIHRoaXMudmFsdWUgPSBwaW47XG4gICAgfVxufVxuXG4vLyBzZXRUaW1lb3V0KCgpID0+IHtcblxuLy8gICAgIGNvbnN0IGZvcmdlID0gbmV3IEZvcmdlKGpzb24pO1xuXG4vLyAgICAgY29uc3QgaWdyYXBoID0gZm9yZ2UuZ2V0R3JhcGgoKTtcbi8vICAgICBjb25zdCBpYmxvY2tNYXAgPSBpZ3JhcGguZ2V0QmxvY2tNYXAoKTtcbi8vICAgICBjb25zdCBpaW5wdXRMaXN0ID0gaWJsb2NrTWFwW09iamVjdC5rZXlzKGlibG9ja01hcClbMF1dLmdldElucHV0UGluc0xpc3QoKTtcbi8vICAgICBpaW5wdXRMaXN0O1xuXG4vLyAgICAgY29uc3QgY29ubmVjdFBpbiA9IGlpbnB1dExpc3RbMF0uY29ubmVjdFBpbjtcblxuLy8gfSwgMjAwMCk7XG4iXX0=