diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index d261ca6e..f59f9f50 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -35,7 +35,6 @@ "metaedit", "obsidian-metatable", "obsidian-minimal-settings", - "multi-column-markdown", "nldates-obsidian", "note-refactor-obsidian", "obsidian-memos", @@ -59,5 +58,7 @@ "obsidian-read-it-later", "obsidian-full-calendar", "markdown-table-editor", - "obsidian-book-search-plugin" + "obsidian-book-search-plugin", + "obsidian-columns", + "notion-like-tables" ] \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json index f66bb261..a3091215 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -95,6 +95,6 @@ "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 0.2146842347194271, + "scale": 0.2341704597667036, "close": true } \ No newline at end of file diff --git a/.obsidian/plugins/mrj-text-expand/main.js b/.obsidian/plugins/mrj-text-expand/main.js index 69fe8505..3b4feb78 100644 --- a/.obsidian/plugins/mrj-text-expand/main.js +++ b/.obsidian/plugins/mrj-text-expand/main.js @@ -2,7 +2,7 @@ var obsidian = require('obsidian'); -/*! ***************************************************************************** +/****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any @@ -82,6 +82,18 @@ function __generator(thisArg, body) { } } +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; @@ -106,7 +118,7 @@ function __spreadArray(to, from, pack) { ar[i] = from[i]; } } - return to.concat(ar || from); + return to.concat(ar || Array.prototype.slice.call(from)); } function formatContent(content) { @@ -178,6 +190,302 @@ function trimContent(s) { return removeFrontMatter(removeEmptyLines(s)); } +function highlight(lineStart, lineEnd, matchStart, matchEnd, lineContent) { + return __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(lineContent.slice(0, matchStart - lineStart)), false), [ + '==' + ], false), __read(lineContent.slice(matchStart - lineStart, (matchStart - lineStart) + (matchEnd - matchStart))), false), [ + '==' + ], false), __read(lineContent.slice((matchStart - lineStart) + (matchEnd - matchStart))), false).join(''); +} +var sequences = [ + { + name: '\\$count', + loop: true, + format: function (_p, _s, _content, _file, _d, index) { return index ? String(index + 1) : String(1); }, + desc: 'add index number to each produced file' + }, + { + name: '\\$filename', + loop: true, + format: function (_p, _s, _content, file) { return file.basename; }, + desc: 'name of the founded file' + }, + { + name: '\\$link', + loop: true, + format: function (p, _s, _content, file) { return p.app.fileManager.generateMarkdownLink(file, file.path); }, + desc: 'link based on Obsidian settings' + }, + { + name: '\\$lines:\\d+', + loop: true, + readContent: true, + format: function (p, s, content, _file) { + var digits = Number(s.split(':')[1]); + return trimContent(content) + .split('\n') + .filter(function (_, i) { return i < digits; }) + .join('\n') + .replace(new RegExp(p.config.lineEnding, 'g'), ''); + }, + desc: 'specified count of lines from the found file' + }, + { + name: '\\$characters:\\d+', + loop: true, + readContent: true, + format: function (p, s, content, _file) { + var digits = Number(s.split(':')[1]); + return trimContent(content) + .split('') + .filter(function (_, i) { return i < digits; }) + .join('') + .replace(new RegExp(p.config.lineEnding, 'g'), ''); + }, + desc: 'specified count of lines from the found file' + }, + { + name: '\\$frontmatter:[\\p\{L\}_-]+', + loop: true, + format: function (p, s, _content, file) { return p.getFrontMatter(s, file); }, + desc: 'value from the frontmatter key in the found file' + }, + { + name: '\\$lines+', + loop: true, + readContent: true, + format: function (p, s, content, _file) { return content.replace(new RegExp(p.config.lineEnding, 'g'), ''); }, + desc: 'all content from the found file' + }, + { + name: '\\$ext', + loop: true, + format: function (_p, s, content, file) { return file.extension; }, + desc: 'return file extension' + }, + { + name: '\\$created:format:date', + loop: true, + format: function (_p, s, content, file) { return String(new Date(file.stat.ctime).toISOString()).split('T')[0]; }, + desc: 'created time formatted' + }, + { + name: '\\$created:format:time', + loop: true, + format: function (_p, s, content, file) { return String(new Date(file.stat.ctime).toISOString()).split(/([.T])/)[2]; }, + desc: 'created time formatted' + }, + { + name: '\\$created:format', + loop: true, + format: function (_p, s, content, file) { return String(new Date(file.stat.ctime).toISOString()); }, + desc: 'created time formatted' + }, + { + name: '\\$created', + loop: true, + format: function (_p, s, content, file) { return String(file.stat.ctime); }, + desc: 'created time' + }, + { + name: '\\$size', + loop: true, + format: function (_p, s, content, file) { return String(file.stat.size); }, + desc: 'size of the file' + }, + { + name: '\\$path', + loop: true, + format: function (_p, s, content, file) { return file.path; }, + desc: 'path to the found file' + }, + { + name: '\\$parent', + loop: true, + format: function (_p, s, content, file) { return file.parent.name; }, + desc: 'parent folder name' + }, + { + name: '^(.+|)\\$header:.+', + loop: true, + format: function (p, s, content, file) { + var _a; + var prefix = s.slice(0, s.indexOf('$')); + var header = s.slice(s.indexOf('$')).replace('$header:', '').replace(/"/g, ''); + var neededLevel = header.split("#").length - 1; + var neededTitle = header.replace(/^#+/g, '').trim(); + var metadata = p.app.metadataCache.getFileCache(file); + return ((_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(function (e) { + var tests = [ + [neededTitle, e.heading.includes(neededTitle)], + [neededLevel, e.level === neededLevel] + ].filter(function (e) { return e[0]; }); + if (tests.length) { + return tests.map(function (e) { return e[1]; }).every(function (e) { return e === true; }); + } + return true; + }).map(function (h) { return p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + h.heading); }).map(function (link) { return prefix + link; }).join('\n')) || ''; + }, + desc: 'headings from founded files. $header:## - return all level 2 headings. $header:Title - return all heading which match the string. Can be prepended like: - !$header:## to transclude the headings.' + }, + { + name: '^(.+|)\\$blocks', + readContent: true, + loop: true, + format: function (p, s, content, file) { + var prefix = s.slice(0, s.indexOf('$')); + return content + .split('\n') + .filter(function (e) { return /\^\w+$/.test(e); }) + .map(function (e) { + return prefix + p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + e.replace(/^.+?(\^\w+$)/, '$1')); + }) + .join('\n'); + }, + desc: 'block ids from the found files. Can be prepended.' + }, + { + name: '^(.+|)\\$match:header', loop: true, format: function (p, s, content, file, results) { + var _a; + var prefix = s.slice(0, s.indexOf('$')); + var metadata = p.app.metadataCache.getFileCache(file); + var headings = (_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(function (h) { return results.result.content.filter(function (c) { return h.position.end.offset < c[0]; }).some(function (e) { return e; }); }).slice(-1); + return headings + .map(function (h) { return p.app.fileManager.generateMarkdownLink(file, file.path, '#' + h.heading); }) + .map(function (link) { return prefix + link; }) + .join('\n') || ''; + }, desc: 'extract found selections' + }, + { + name: '^(.+|)\\$matchline:(\\+|-|)\\d+', + loop: true, + format: function (_p, s, content, file, results) { + s.slice(0, s.indexOf('$matchline')); + var value = s.slice(s.indexOf('$matchline')).split(':')[1]; + var isPlus = value.contains('+'); + var isMinus = value.contains('-'); + var isContext = !isPlus && !isMinus; + var offset = Number(value.replace(/[+-]/, '')); + var lines = results.content.split('\n'); + // Grab info about line content, index, text length and start/end character position + var lineInfos = []; + for (var i = 0; i < lines.length; i++) { + var text = lines[i]; + if (i === 0) { + lineInfos.push({ + num: 0, + start: 0, + end: text.length, + text: text + }); + continue; + } + var start = lineInfos[i - 1].end + 1; + lineInfos.push({ + num: i, + start: start, + text: text, + end: text.length + start + }); + } + return results.result.content.map(function (_a) { + var e_1, _b; + var _c = __read(_a, 2), from = _c[0], to = _c[1]; + var matchedLines = lineInfos + .filter(function (_a) { + var start = _a.start, end = _a.end; + return start <= from && end >= to; + }) + .map(function (line) { + return __assign(__assign({}, line), { text: highlight(line.start, line.end, from, to, line.text) }); + }); + var resultLines = []; + var _loop_1 = function (matchedLine) { + var prevLines = isMinus || isContext + ? lineInfos.filter(function (l) { return matchedLine.num - l.num > 0 && matchedLine.num - l.num < offset; }) + : []; + var nextLines = isPlus || isContext + ? lineInfos.filter(function (l) { return l.num - matchedLine.num > 0 && l.num - matchedLine.num < offset; }) + : []; + resultLines.push.apply(resultLines, __spreadArray(__spreadArray(__spreadArray([], __read(prevLines), false), [matchedLine], false), __read(nextLines), false)); + }; + try { + for (var matchedLines_1 = __values(matchedLines), matchedLines_1_1 = matchedLines_1.next(); !matchedLines_1_1.done; matchedLines_1_1 = matchedLines_1.next()) { + var matchedLine = matchedLines_1_1.value; + _loop_1(matchedLine); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (matchedLines_1_1 && !matchedLines_1_1.done && (_b = matchedLines_1.return)) _b.call(matchedLines_1); + } + finally { if (e_1) throw e_1.error; } + } + return resultLines.map(function (e) { return e.text; }).join('\n'); + }).join('\n'); + }, desc: 'extract line with matches' + }, + { + name: '^(.+|)\\$matchline', loop: true, format: function (_p, s, content, file, results) { + s.slice(0, s.indexOf('$')); + var lines = results.content.split('\n'); + // Grab info about line content, index, text length and start/end character position + var lineInfos = []; + for (var i = 0; i < lines.length; i++) { + var text = lines[i]; + if (i === 0) { + lineInfos.push({ + num: 0, + start: 0, + end: text.length, + text: text + }); + continue; + } + var start = lineInfos[i - 1].end + 1; + lineInfos.push({ + num: i, + start: start, + text: text, + end: text.length + start + }); + } + return results.result.content.map(function (_a) { + var _b = __read(_a, 2), from = _b[0], to = _b[1]; + return lineInfos + .filter(function (_a) { + var start = _a.start, end = _a.end; + return start <= from && end >= to; + }) + .map(function (_a) { + var start = _a.start, end = _a.end, text = _a.text; + return highlight(start, end, from, to, text); + }).join('\n'); + }).join('\n'); + }, desc: 'extract line with matches' + }, + { + name: '^(.+|)\\$match', loop: true, format: function (_p, s, content, file, results) { + if (!results.result.content) { + console.warn('There is no content in results'); + return ''; + } + function appendPrefix(prefix, line) { + return prefix + line; + } + var prefixContent = s.slice(0, s.indexOf('$')); + return results.result.content + .map(function (_a) { + var _b = __read(_a, 2), from = _b[0], to = _b[1]; + return results.content.slice(from, to); + }) + .map(function (line) { return appendPrefix(prefixContent, line); }) + .join('\n'); + }, desc: 'extract found selections' + }, +]; + var TextExpander = /** @class */ (function (_super) { __extends(TextExpander, _super); function TextExpander(app, plugin) { @@ -185,164 +493,11 @@ var TextExpander = /** @class */ (function (_super) { _this.config = { autoExpand: false, defaultTemplate: '- $link', - delay: 5000, + delay: 300, excludeCurrent: true, - lineEnding: '<--->' + lineEnding: '<-->' }; - _this.seqs = [ - { - name: '\\$count', - loop: true, - format: function (_s, _content, _file, _d, index) { return index ? String(index + 1) : String(1); }, - desc: 'add index number to each produced file' - }, - { - name: '\\$filename', - loop: true, - format: function (_s, _content, file) { return file.basename; }, - desc: 'name of the founded file' - }, - { - name: '\\$link', - loop: true, - format: function (_s, _content, file) { return _this.app.fileManager.generateMarkdownLink(file, file.path); }, - desc: 'link based on Obsidian settings' - }, - { - name: '\\$lines:\\d+', - loop: true, - readContent: true, - format: function (s, content, _file) { - var digits = Number(s.split(':')[1]); - return trimContent(content) - .split('\n') - .filter(function (_, i) { return i < digits; }) - .join('\n') - .replace(new RegExp(_this.config.lineEnding, 'g'), ''); - }, - desc: 'specified count of lines from the found file' - }, - { - name: '\\$frontmatter:[\\p\{L\}_-]+', - loop: true, - format: function (s, _content, file) { return _this.getFrontMatter(s, file); }, - desc: 'value from the frontmatter key in the found file' - }, - { - name: '\\$lines+', - loop: true, - readContent: true, - format: function (s, content, _file) { return content.replace(new RegExp(_this.config.lineEnding, 'g'), ''); }, - desc: 'all content from the found file' - }, - { - name: '\\$ext', - loop: true, - format: function (s, content, file) { return file.extension; }, - desc: 'return file extension' - }, - { - name: '\\$created:format:date', - loop: true, - format: function (s, content, file) { return String(new Date(file.stat.ctime).toISOString()).split('T')[0]; }, - desc: 'created time formatted' - }, - { - name: '\\$created:format:time', - loop: true, - format: function (s, content, file) { return String(new Date(file.stat.ctime).toISOString()).split(/([.T])/)[2]; }, - desc: 'created time formatted' - }, - { - name: '\\$created:format', - loop: true, - format: function (s, content, file) { return String(new Date(file.stat.ctime).toISOString()); }, - desc: 'created time formatted' - }, - { - name: '\\$created', - loop: true, - format: function (s, content, file) { return String(file.stat.ctime); }, - desc: 'created time' - }, - { - name: '\\$size', - loop: true, - format: function (s, content, file) { return String(file.stat.size); }, - desc: 'size of the file' - }, - { - name: '\\$path', - loop: true, - format: function (s, content, file) { return file.path; }, - desc: 'path to the found file' - }, - { - name: '\\$parent', - loop: true, - format: function (s, content, file) { return file.parent.name; }, - desc: 'parent folder name' - }, - { - name: '^(.+|)\\$header:.+', - loop: true, - format: function (s, content, file) { - var _a; - var prefix = s.slice(0, s.indexOf('$')); - var header = s.slice(s.indexOf('$')).replace('$header:', '').replace(/"/g, ''); - var neededLevel = header.split("#").length - 1; - var neededTitle = header.replace(/^#+/g, '').trim(); - var metadata = _this.app.metadataCache.getFileCache(file); - return ((_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(function (e) { - var tests = [ - [neededTitle, e.heading.includes(neededTitle)], - [neededLevel, e.level === neededLevel] - ].filter(function (e) { return e[0]; }); - if (tests.length) { - return tests.map(function (e) { return e[1]; }).every(function (e) { return e === true; }); - } - return true; - }).map(function (h) { return _this.app.fileManager.generateMarkdownLink(file, file.path, '#' + h.heading); }).map(function (link) { return prefix + link; }).join('\n')) || ''; - }, - desc: 'headings from founded files. $header:## - return all level 2 headings. $header:Title - return all heading which match the string. Can be prepended like: - !$header:## to transclude the headings.' - }, - { - name: '^(.+|)\\$blocks', - readContent: true, - loop: true, - format: function (s, content, file) { - return content - .split('\n') - .filter(function (e) { return /\^\w+$/.test(e); }) - .map(function (e) { return s - .replace('$blocks', "(" + encodeURIComponent(file.basename) + "#" + e.replace(/^.+?(\^\w+$)/, '$1') + ")"); }) - .join('\n'); - }, - desc: 'block ids from the found files. Can be prepended.' - }, - { - name: '^(.+|)\\$match:header', loop: true, format: function (s, content, file, results) { - var _a; - var prefix = s.slice(0, s.indexOf('$')); - var metadata = _this.app.metadataCache.getFileCache(file); - var headings = (_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(function (h) { return results.result.content.filter(function (c) { return h.position.end.offset < c[0]; }).some(function (e) { return e; }); }).slice(-1); - return headings - .map(function (h) { return _this.app.fileManager.generateMarkdownLink(file, file.path, '#' + h.heading); }) - .map(function (link) { return prefix + link; }) - .join('\n') || ''; - }, desc: 'extract found selections' - }, - { - name: '^(.+|)\\$match', loop: true, format: function (s, content, file, results) { - var _a; - var prefix = s.slice(0, s.indexOf('$')); - return (_a = results.result.content) === null || _a === void 0 ? void 0 : _a.map(function (t) { - var _a; - return (_a = results.content).slice.apply(_a, __spreadArray([], __read(t))); - }).map(function (t) { return prefix + t; }).join('\n'); - }, desc: 'extract found selections' - }, - ]; + _this.seqs = sequences; _this.search = _this.search.bind(_this); _this.initExpander = _this.initExpander.bind(_this); _this.reformatLinks = _this.reformatLinks.bind(_this); @@ -356,13 +511,13 @@ var TextExpander = /** @class */ (function (_super) { return ''; }; TextExpander.prototype.reformatLinks = function (links, mapFunc) { - var _a, _b, _c, _e; + var _a, _b, _c, _d; if (mapFunc === void 0) { mapFunc = function (s) { return '[[' + s + ']]'; }; } var currentView = this.app.workspace.activeLeaf.view; if (currentView instanceof obsidian.FileView) { return (_b = (_a = links === null || links === void 0 ? void 0 : links.map(function (e) { return e.basename; }).filter(function (e) { return currentView.file.basename !== e; })) === null || _a === void 0 ? void 0 : _a.map(mapFunc)) === null || _b === void 0 ? void 0 : _b.join('\n'); } - return (_e = (_c = links === null || links === void 0 ? void 0 : links.map(function (e) { return e.basename; })) === null || _c === void 0 ? void 0 : _c.map(mapFunc)) === null || _e === void 0 ? void 0 : _e.join('\n'); + return (_d = (_c = links === null || links === void 0 ? void 0 : links.map(function (e) { return e.basename; })) === null || _c === void 0 ? void 0 : _c.map(mapFunc)) === null || _d === void 0 ? void 0 : _d.join('\n'); }; TextExpander.prototype.search = function (s) { // @ts-ignore @@ -372,7 +527,7 @@ var TextExpander = /** @class */ (function (_super) { // @ts-ignore collapsed: this.app.workspace.leftSplit.collapsed, // @ts-ignore - tab: this.app.workspace.leftSplit.children[0].currentTab + tab: this.getSearchTabIndex() }; search(s); if (leftSplitState.collapsed) { @@ -385,6 +540,20 @@ var TextExpander = /** @class */ (function (_super) { this.app.workspace.leftSplit.children[0].selectTabIndex(leftSplitState.tab); } }; + TextExpander.prototype.getSearchTabIndex = function () { + var leftTabs = this.app.workspace.leftSplit.children[0].children; + var searchTabId; + this.app.workspace.iterateAllLeaves(function (leaf) { + if (leaf.getViewState().type == "search") { + searchTabId = leaf.id; + } + }); + return leftTabs.findIndex(function (item, index, array) { + if (item.id == searchTabId) { + return true; + } + }); + }; TextExpander.prototype.getFoundAfterDelay = function () { return __awaiter(this, void 0, void 0, function () { var searchLeaf, view; @@ -435,6 +604,7 @@ var TextExpander = /** @class */ (function (_super) { : files; format = function (r, template, index) { return __awaiter(_this, void 0, void 0, function () { var fileContent, _a; + var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: @@ -449,7 +619,7 @@ var TextExpander = /** @class */ (function (_super) { case 3: fileContent = _a; return [2 /*return*/, this.seqs.reduce(function (acc, seq) { - return acc.replace(new RegExp(seq.name, 'gu'), function (replace) { return seq.format(replace, fileContent, r, searchResults.get(r), index); }); + return acc.replace(new RegExp(seq.name, 'gu'), function (replace) { return seq.format(_this, replace, fileContent, r, searchResults.get(r), index); }); }, template)]; } }); @@ -500,16 +670,17 @@ var TextExpander = /** @class */ (function (_super) { TextExpander.prototype.runQuery = function (query, content) { var _a; return __awaiter(this, void 0, void 0, function () { - var lastLine, newContent; + var lineEnding, lastLine, newContent; return __generator(this, function (_b) { switch (_b.label) { case 0: + lineEnding = this.config.lineEnding; if (!query) { new Notification('Expand query not found'); return [2 /*return*/, Promise.resolve()]; } lastLine = getLastLineToReplace(content, query, this.config.lineEnding); - this.cm.replaceRange(this.config.lineEnding, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 }); + this.cm.replaceRange('\n' + lineEnding, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 }); newContent = formatContent(this.cm.getValue()); this.search(query.query); return [4 /*yield*/, this.startTemplateMode(query, getLastLineToReplace(newContent, query, this.config.lineEnding))]; @@ -630,7 +801,7 @@ var SettingTab = /** @class */ (function (_super) { .setName('Delay') .setDesc('Text expander don\' wait until search completed. It waits for a delay and paste result after that.') .addSlider(function (slider) { - slider.setLimits(1000, 10000, 1000); + slider.setLimits(100, 10000, 100); slider.setValue(_this.plugin.config.delay); slider.onChange(function (value) { _this.plugin.config.delay = value; @@ -693,4 +864,4 @@ var SettingTab = /** @class */ (function (_super) { }(obsidian.PluginSettingTab)); module.exports = TextExpander; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsImhlbHBlcnMudHMiLCJtYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgZnJvbSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJleHBvcnQgaW50ZXJmYWNlIEV4cGFuZGVyUXVlcnkge1xuICAgIHN0YXJ0OiBudW1iZXJcbiAgICBlbmQ6IG51bWJlclxuICAgIHRlbXBsYXRlOiBzdHJpbmdcbiAgICBxdWVyeTogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29udGVudC5zcGxpdCgnXFxuJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEV4cGFuZGVyc1F1ZXJ5KGNvbnRlbnQ6IHN0cmluZ1tdKTogRXhwYW5kZXJRdWVyeVtdIHtcbiAgICBsZXQgYWNjdW06IEV4cGFuZGVyUXVlcnlbXSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W2ldXG5cbiAgICAgICAgaWYgKGxpbmUgPT09ICdgYGBleHBhbmRlcicpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgY29udGVudC5sZW5ndGggLSBpOyBlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0bGluZSA9IGNvbnRlbnRbaSArIGVdIFxuICAgICAgICAgICAgICAgIGlmIChuZXh0bGluZSA9PT0gJ2BgYCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGkgKyBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBjb250ZW50W2kgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogZSA+IDIgPyBjb250ZW50LnNsaWNlKGkgKyAyLCBpICsgZSkuam9pbignXFxuJykgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY3VtXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9zZXN0UXVlcnkocXVlcmllczogRXhwYW5kZXJRdWVyeVtdLCBsaW5lTnVtYmVyOiBudW1iZXIpOiBFeHBhbmRlclF1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBxdWVyaWVzLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYi5zdGFydCAtIGxpbmVOdW1iZXIpIDwgTWF0aC5hYnMoYS5zdGFydCAtIGxpbmVOdW1iZXIpID8gYiA6IGE7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0TGluZVRvUmVwbGFjZShjb250ZW50OiBzdHJpbmdbXSwgcXVlcnk6IEV4cGFuZGVyUXVlcnksIGVuZGxpbmU6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVGcm9tID0gcXVlcnkuZW5kXG5cbiAgICBmb3IgKHZhciBpID0gbGluZUZyb20gKyAxOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29udGVudFtpXSA9PT0gZW5kbGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaW5lRnJvbSArIDFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyaW1Db250ZW50KHM6IHN0cmluZykge1xuICAgIGNvbnN0IHJlbW92ZUVtcHR5TGluZXMgPSAoczogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBzLnNwbGl0KCdcXG4nKS5tYXAoZSA9PiBlLnRyaW0oKSlcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZXMuaW5kZXhPZignJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVFbXB0eUxpbmVzKGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlRnJvbnRNYXR0ZXIgPSAoczogc3RyaW5nLCBsb29rRW5kaW5nOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBsaW5lcyA9IHMuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgaWYgKGxvb2tFbmRpbmcgJiYgbGluZXMuaW5kZXhPZignLS0tJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb2tFbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lcy5pbmRleE9mKCctLS0nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUZyb250TWF0dGVyKGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRnJvbnRNYXR0ZXIocmVtb3ZlRW1wdHlMaW5lcyhzKSlcbn0iLCJpbXBvcnQge1xuICAgIEV4cGFuZGVyUXVlcnksXG4gICAgZm9ybWF0Q29udGVudCxcbiAgICBnZXRBbGxFeHBhbmRlcnNRdWVyeSxcbiAgICBnZXRDbG9zZXN0UXVlcnksXG4gICAgZ2V0TGFzdExpbmVUb1JlcGxhY2UsXG4gICAgdHJpbUNvbnRlbnRcbn0gZnJvbSAnaGVscGVycyc7XG5pbXBvcnQge1xuICAgIEFwcCxcbiAgICBQbHVnaW4sXG4gICAgUGx1Z2luU2V0dGluZ1RhYixcbiAgICBTZXR0aW5nLFxuICAgIFRGaWxlLFxuICAgIEZpbGVWaWV3LFxuICAgIE1hcmtkb3duVmlldyxcbiAgICBQbHVnaW5NYW5pZmVzdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tICdjb2RlbWlycm9yJ1xuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3Mge1xuICAgIGRlbGF5OiBudW1iZXJcbiAgICBsaW5lRW5kaW5nOiBzdHJpbmdcbiAgICBkZWZhdWx0VGVtcGxhdGU6IHN0cmluZ1xuICAgIGV4Y2x1ZGVDdXJyZW50OiBib29sZWFuXG4gICAgYXV0b0V4cGFuZDogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgU2VxdWVuY2VzIHtcbiAgICBsb29wOiBib29sZWFuXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzPzogU2VhcmNoRGV0YWlscywgaW5kZXg/OiBudW1iZXIpID0+IHN0cmluZ1xuICAgIGRlc2M6IHN0cmluZ1xuICAgIHJlYWRDb250ZW50PzogYm9vbGVhblxuICAgIHVzaW5nU2VhcmNoPzogYm9vbGVhblxufVxuXG50eXBlIE51bWJlclR1cGxlID0gW251bWJlciwgbnVtYmVyXVxuXG5pbnRlcmZhY2UgU2VhcmNoRGV0YWlscyB7XG4gICAgYXBwOiBBcHBcbiAgICBjaGlsZHJlbjogYW55W11cbiAgICBjaGlsZHJlbkVsOiBIVE1MRWxlbWVudFxuICAgIGNvbGxhcHNlRWw6IEhUTUxFbGVtZW50XG4gICAgY29sbGFwc2VkOiBib29sZWFuXG4gICAgY29sbGFwc2libGU6IGJvb2xlYW5cbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgICBkb206IGFueVxuICAgIGVsOiBIVE1MRWxlbWVudFxuICAgIGV4dHJhQ29udGV4dDogKCkgPT4gYm9vbGVhblxuICAgIGZpbGU6IFRGaWxlXG4gICAgaW5mbzogYW55XG4gICAgb25NYXRjaFJlbmRlcjogYW55XG4gICAgcHVzaGVyRWw6IEhUTUxFbGVtZW50XG4gICAgcmVzdWx0OiB7XG4gICAgICAgIGZpbGVuYW1lPzogTnVtYmVyVHVwbGVbXVxuICAgICAgICBjb250ZW50PzogTnVtYmVyVHVwbGVbXVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dEV4cGFuZGVyIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBjbTogQ29kZU1pcnJvci5FZGl0b3JcblxuICAgIGNvbmZpZzogUGx1Z2luU2V0dGluZ3MgPSB7XG4gICAgICAgIGF1dG9FeHBhbmQ6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0VGVtcGxhdGU6ICctICRsaW5rJyxcbiAgICAgICAgZGVsYXk6IDUwMDAsXG4gICAgICAgIGV4Y2x1ZGVDdXJyZW50OiB0cnVlLFxuICAgICAgICBsaW5lRW5kaW5nOiAnPC0tLT4nXG4gICAgfVxuXG4gICAgc2VxczogU2VxdWVuY2VzW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdcXFxcJGNvdW50JyxcbiAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICBmb3JtYXQ6IChfczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUsIF9kLCBpbmRleCkgPT4gaW5kZXggPyBTdHJpbmcoaW5kZXggKyAxKSA6IFN0cmluZygxKSxcbiAgICAgICAgICAgIGRlc2M6ICdhZGQgaW5kZXggbnVtYmVyIHRvIGVhY2ggcHJvZHVjZWQgZmlsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1xcXFwkZmlsZW5hbWUnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcm1hdDogKF9zOiBzdHJpbmcsIF9jb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBmaWxlLmJhc2VuYW1lLFxuICAgICAgICAgICAgZGVzYzogJ25hbWUgb2YgdGhlIGZvdW5kZWQgZmlsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1xcXFwkbGluaycsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoX3M6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsIGZpbGUucGF0aCksXG4gICAgICAgICAgICBkZXNjOiAnbGluayBiYXNlZCBvbiBPYnNpZGlhbiBzZXR0aW5ncydcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1xcXFwkbGluZXM6XFxcXGQrJyxcbiAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICByZWFkQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcm1hdDogKHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBOdW1iZXIocy5zcGxpdCgnOicpWzFdKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyaW1Db250ZW50KGNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoXzogc3RyaW5nLCBpOiBudW1iZXIpID0+IGkgPCBkaWdpdHMpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuY29uZmlnLmxpbmVFbmRpbmcsICdnJyksICcnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc2M6ICdzcGVjaWZpZWQgY291bnQgb2YgbGluZXMgZnJvbSB0aGUgZm91bmQgZmlsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1xcXFwkZnJvbnRtYXR0ZXI6W1xcXFxwXFx7TFxcfV8tXSsnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcm1hdDogKHM6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IHRoaXMuZ2V0RnJvbnRNYXR0ZXIocywgZmlsZSksXG4gICAgICAgICAgICBkZXNjOiAndmFsdWUgZnJvbSB0aGUgZnJvbnRtYXR0ZXIga2V5IGluIHRoZSBmb3VuZCBmaWxlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXFxcXCRsaW5lcysnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIF9maWxlOiBURmlsZSkgPT4gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAodGhpcy5jb25maWcubGluZUVuZGluZywgJ2cnKSwgJycpLFxuICAgICAgICAgICAgZGVzYzogJ2FsbCBjb250ZW50IGZyb20gdGhlIGZvdW5kIGZpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdcXFxcJGV4dCcsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBmaWxlLmV4dGVuc2lvbixcbiAgICAgICAgICAgIGRlc2M6ICdyZXR1cm4gZmlsZSBleHRlbnNpb24nXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0OmRhdGUnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcm1hdDogKHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKG5ldyBEYXRlKGZpbGUuc3RhdC5jdGltZSkudG9JU09TdHJpbmcoKSkuc3BsaXQoJ1QnKVswXSxcbiAgICAgICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkOmZvcm1hdDp0aW1lJyxcbiAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICBmb3JtYXQ6IChzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhuZXcgRGF0ZShmaWxlLnN0YXQuY3RpbWUpLnRvSVNPU3RyaW5nKCkpLnNwbGl0KC8oWy5UXSkvKVsyXSxcbiAgICAgICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkOmZvcm1hdCcsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKS50b0lTT1N0cmluZygpKSxcbiAgICAgICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkJyxcbiAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICBmb3JtYXQ6IChzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhmaWxlLnN0YXQuY3RpbWUpLFxuICAgICAgICAgICAgZGVzYzogJ2NyZWF0ZWQgdGltZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1xcXFwkc2l6ZScsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcoZmlsZS5zdGF0LnNpemUpLFxuICAgICAgICAgICAgZGVzYzogJ3NpemUgb2YgdGhlIGZpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdcXFxcJHBhdGgnLFxuICAgICAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcm1hdDogKHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gZmlsZS5wYXRoLFxuICAgICAgICAgICAgZGVzYzogJ3BhdGggdG8gdGhlIGZvdW5kIGZpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdcXFxcJHBhcmVudCcsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBmaWxlLnBhcmVudC5uYW1lLFxuICAgICAgICAgICAgZGVzYzogJ3BhcmVudCBmb2xkZXIgbmFtZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkaGVhZGVyOi4rJyxcbiAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICBmb3JtYXQ6IChzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmaXggPSBzLnNsaWNlKDAsIHMuaW5kZXhPZignJCcpKVxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHMuc2xpY2Uocy5pbmRleE9mKCckJykpLnJlcGxhY2UoJyRoZWFkZXI6JywgJycpLnJlcGxhY2UoL1wiL2csICcnKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRlZExldmVsID0gaGVhZGVyLnNwbGl0KFwiI1wiKS5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZGVkVGl0bGUgPSBoZWFkZXIucmVwbGFjZSgvXiMrL2csICcnKS50cmltKClcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5oZWFkaW5ncz8uZmlsdGVyKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZWVkZWRUaXRsZSwgZS5oZWFkaW5nLmluY2x1ZGVzKG5lZWRlZFRpdGxlKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmVlZGVkTGV2ZWwsIGUubGV2ZWwgPT09IG5lZWRlZExldmVsXVxuICAgICAgICAgICAgICAgICAgICBdLmZpbHRlcihlID0+IGVbMF0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLm1hcChlID0+IGVbMV0pLmV2ZXJ5KGUgPT4gZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChoID0+IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsIGZpbGUucGF0aCwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChsaW5rID0+IHByZWZpeCArIGxpbmspXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnJ1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVzYzogJ2hlYWRpbmdzIGZyb20gZm91bmRlZCBmaWxlcy4gJGhlYWRlcjojIyAtIHJldHVybiBhbGwgbGV2ZWwgMiBoZWFkaW5ncy4gJGhlYWRlcjpUaXRsZSAtIHJldHVybiBhbGwgaGVhZGluZyB3aGljaCBtYXRjaCB0aGUgc3RyaW5nLiBDYW4gYmUgcHJlcGVuZGVkIGxpa2U6IC0gISRoZWFkZXI6IyMgdG8gdHJhbnNjbHVkZSB0aGUgaGVhZGluZ3MuJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXiguK3wpXFxcXCRibG9ja3MnLFxuICAgICAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGUgPT4gL1xcXlxcdyskLy50ZXN0KGUpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGUgPT4gc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyRibG9ja3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZS5iYXNlbmFtZSl9IyR7ZS5yZXBsYWNlKC9eLis/KFxcXlxcdyskKS8sICckMScpfSlgXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXNjOiAnYmxvY2sgaWRzIGZyb20gdGhlIGZvdW5kIGZpbGVzLiBDYW4gYmUgcHJlcGVuZGVkLidcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2g6aGVhZGVyJywgbG9vcDogdHJ1ZSwgZm9ybWF0OiAoczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkaW5ncyA9IG1ldGFkYXRhLmhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgID8uZmlsdGVyKGggPT4gcmVzdWx0cy5yZXN1bHQuY29udGVudC5maWx0ZXIoYyA9PiBoLnBvc2l0aW9uLmVuZC5vZmZzZXQgPCBjWzBdKS5zb21lKGUgPT4gZSkpXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgtMSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBoZWFkaW5nc1xuICAgICAgICAgICAgICAgICAgICAubWFwKGggPT4gdGhpcy5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5wYXRoLCAnIycgKyBoLmhlYWRpbmcpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICcnXG4gICAgICAgICAgICB9LCBkZXNjOiAnZXh0cmFjdCBmb3VuZCBzZWxlY3Rpb25zJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnXiguK3wpXFxcXCRtYXRjaCcsIGxvb3A6IHRydWUsIGZvcm1hdDogKHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHQuY29udGVudD8ubWFwKHQgPT4gcmVzdWx0cy5jb250ZW50LnNsaWNlKC4uLnQpKS5tYXAodCA9PiBwcmVmaXggKyB0KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICAgICAgfSxcbiAgICBdXG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBQbHVnaW5NYW5pZmVzdCkge1xuICAgICAgICBzdXBlcihhcHAsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpcy5zZWFyY2ggPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuaW5pdEV4cGFuZGVyID0gdGhpcy5pbml0RXhwYW5kZXIuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLnJlZm9ybWF0TGlua3MgPSB0aGlzLnJlZm9ybWF0TGlua3MuYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGdldEZyb250TWF0dGVyKHM6IHN0cmluZywgcjogVEZpbGUpIHtcbiAgICAgICAgY29uc3Qge2Zyb250bWF0dGVyID0gbnVsbH0gPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKHIucGF0aClcblxuICAgICAgICBpZiAoZnJvbnRtYXR0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9udG1hdHRlcltzLnNwbGl0KCc6JylbMV1dIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmVmb3JtYXRMaW5rcyhsaW5rczogVEZpbGVbXSwgbWFwRnVuYyA9IChzOiBzdHJpbmcpID0+ICdbWycgKyBzICsgJ11dJykge1xuICAgICAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcblxuICAgICAgICBpZiAoY3VycmVudFZpZXcgaW5zdGFuY2VvZiBGaWxlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmtzPy5tYXAoZSA9PiBlLmJhc2VuYW1lKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBjdXJyZW50Vmlldy5maWxlLmJhc2VuYW1lICE9PSBlKVxuICAgICAgICAgICAgICAgID8ubWFwKG1hcEZ1bmMpPy5qb2luKCdcXG4nKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpbmtzPy5tYXAoZSA9PiBlLmJhc2VuYW1lKT8ubWFwKG1hcEZ1bmMpPy5qb2luKCdcXG4nKVxuICAgIH1cblxuICAgIHNlYXJjaChzOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBnbG9iYWxTZWFyY2hGbiA9IHRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKCdnbG9iYWwtc2VhcmNoJykuaW5zdGFuY2Uub3Blbkdsb2JhbFNlYXJjaC5iaW5kKHRoaXMpXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiBnbG9iYWxTZWFyY2hGbihxdWVyeSlcblxuICAgICAgICBjb25zdCBsZWZ0U3BsaXRTdGF0ZSA9IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbGxhcHNlZDogdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jb2xsYXBzZWQsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YWI6IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY2hpbGRyZW5bMF0uY3VycmVudFRhYlxuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoKHMpXG4gICAgICAgIGlmIChsZWZ0U3BsaXRTdGF0ZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobGVmdFNwbGl0U3RhdGUudGFiICE9PSB0aGlzLmFwcC53b3Jrc3BhY2UubGVmdFNwbGl0LmNoaWxkcmVuWzBdLmN1cnJlbnRUYWIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY2hpbGRyZW5bMF0uc2VsZWN0VGFiSW5kZXgobGVmdFNwbGl0U3RhdGUudGFiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Rm91bmRBZnRlckRlbGF5KCk6IFByb21pc2U8TWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPj4ge1xuICAgICAgICBjb25zdCBzZWFyY2hMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSgnc2VhcmNoJylbMF1cbiAgICAgICAgY29uc3QgdmlldyA9IGF3YWl0IHNlYXJjaExlYWYub3BlbihzZWFyY2hMZWFmLnZpZXcpXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdmlldy5kb20ucmVzdWx0RG9tTG9va3VwIGFzIE1hcDxURmlsZSwgU2VhcmNoRGV0YWlscz5cblxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdHMpXG4gICAgICAgICAgICB9LCB0aGlzLmNvbmZpZy5kZWxheSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydFRlbXBsYXRlTW9kZShxdWVyeTogRXhwYW5kZXJRdWVyeSwgbGFzdExpbmU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcbiAgICAgICAgbGV0IGN1cnJlbnRGaWxlTmFtZSA9ICcnXG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50ID0gcXVlcnkudGVtcGxhdGUuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgY29uc3QgaGVhZGluZyA9IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoZSA9PiBlWzBdID09PSAnXicpLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGVtcGxhdGVDb250ZW50LmZpbHRlcihlID0+IGVbMF0gPT09ICc+JykubWFwKChzKSA9PiBzLnNsaWNlKDEpKVxuICAgICAgICBjb25zdCByZXBlYXRhYmxlQ29udGVudCA9XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGUgPT4gZVswXSAhPT0gJ14nICYmIGVbMF0gIT09ICc+JykuZmlsdGVyKGUgPT4gZSkubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBbdGhpcy5jb25maWcuZGVmYXVsdFRlbXBsYXRlXVxuICAgICAgICAgICAgICAgIDogdGVtcGxhdGVDb250ZW50LmZpbHRlcihlID0+IGVbMF0gIT09ICdeJyAmJiBlWzBdICE9PSAnPicpLmZpbHRlcihlID0+IGUpXG5cbiAgICAgICAgaWYgKGN1cnJlbnRWaWV3IGluc3RhbmNlb2YgRmlsZVZpZXcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRGaWxlTmFtZSA9IGN1cnJlbnRWaWV3LmZpbGUuYmFzZW5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEZvdW5kQWZ0ZXJEZWxheSgpXG4gICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShzZWFyY2hSZXN1bHRzLmtleXMoKSlcblxuICAgICAgICBjb25zdCBmaWx0ZXJGaWxlcyA9IHRoaXMuY29uZmlnLmV4Y2x1ZGVDdXJyZW50XG4gICAgICAgICAgICA/IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuYmFzZW5hbWUgIT09IGN1cnJlbnRGaWxlTmFtZSlcbiAgICAgICAgICAgIDogZmlsZXNcblxuICAgICAgICBjb25zdCBmb3JtYXQgPSBhc3luYyAocjogVEZpbGUsIHRlbXBsYXRlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gKG5ldyBSZWdFeHAodGhpcy5zZXFzLmZpbHRlcihlID0+IGUucmVhZENvbnRlbnQpLm1hcChlID0+IGUubmFtZSkuam9pbignfCcpKS50ZXN0KHRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQocilcbiAgICAgICAgICAgICAgICA6ICcnXG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcXMucmVkdWNlKChhY2MsIHNlcSkgPT5cbiAgICAgICAgICAgICAgICBhY2MucmVwbGFjZShuZXcgUmVnRXhwKHNlcS5uYW1lLCAnZ3UnKSwgcmVwbGFjZSA9PiBzZXEuZm9ybWF0KHJlcGxhY2UsIGZpbGVDb250ZW50LCByLCBzZWFyY2hSZXN1bHRzLmdldChyKSwgaW5kZXgpKSwgdGVtcGxhdGUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBmaWx0ZXJGaWxlc1xuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocmVwZWF0YWJsZUNvbnRlbnQubWFwKGFzeW5jIChzKSA9PiBhd2FpdCBmb3JtYXQoZmlsZSwgcywgaSkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICAgIGhlYWRpbmcuam9pbignXFxuJyksXG4gICAgICAgICAgICBjaGFuZ2VkLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgZm9vdGVyLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubGluZUVuZGluZ1xuICAgICAgICBdLmZpbHRlcihlID0+IGUpLmpvaW4oJ1xcbicpXG5cbiAgICAgICAgY29uc3Qgdmlld0JlZm9yZVJlcGxhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG4gICAgICAgIGlmICh2aWV3QmVmb3JlUmVwbGFjZSBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xuICAgICAgICAgICAgaWYgKHZpZXdCZWZvcmVSZXBsYWNlLmZpbGUuYmFzZW5hbWUgIT09IGN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNtLnJlcGxhY2VSYW5nZShyZXN1bHQsXG4gICAgICAgICAgICB7bGluZTogcXVlcnkuZW5kICsgMSwgY2g6IDB9LFxuICAgICAgICAgICAge2xpbmU6IGxhc3RMaW5lLCBjaDogdGhpcy5jbS5nZXRMaW5lKGxhc3RMaW5lKT8ubGVuZ3RoIHx8IDB9KVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIGFzeW5jIHJ1blF1ZXJ5KHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBjb250ZW50OiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCdFeHBhbmQgcXVlcnkgbm90IGZvdW5kJylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RMaW5lID0gZ2V0TGFzdExpbmVUb1JlcGxhY2UoY29udGVudCwgcXVlcnksIHRoaXMuY29uZmlnLmxpbmVFbmRpbmcpXG4gICAgICAgIHRoaXMuY20ucmVwbGFjZVJhbmdlKHRoaXMuY29uZmlnLmxpbmVFbmRpbmcsXG4gICAgICAgICAgICB7bGluZTogcXVlcnkuZW5kICsgMSwgY2g6IDB9LFxuICAgICAgICAgICAge2xpbmU6IGxhc3RMaW5lLCBjaDogdGhpcy5jbS5nZXRMaW5lKGxhc3RMaW5lKT8ubGVuZ3RoIHx8IDB9KVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmb3JtYXRDb250ZW50KHRoaXMuY20uZ2V0VmFsdWUoKSlcblxuICAgICAgICB0aGlzLnNlYXJjaChxdWVyeS5xdWVyeSlcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRUZW1wbGF0ZU1vZGUocXVlcnksIGdldExhc3RMaW5lVG9SZXBsYWNlKG5ld0NvbnRlbnQsIHF1ZXJ5LCB0aGlzLmNvbmZpZy5saW5lRW5kaW5nKSlcbiAgICB9XG5cbiAgICBpbml0RXhwYW5kZXIoYWxsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgaWYgKCEoY3VycmVudFZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNtRG9jID0gdGhpcy5jbSA9IGN1cnJlbnRWaWV3LnNvdXJjZU1vZGUuY21FZGl0b3JcbiAgICAgICAgY29uc3QgY3VyTnVtID0gY21Eb2MuZ2V0Q3Vyc29yKCkubGluZVxuICAgICAgICBjb25zdCBjb250ZW50ID0gY21Eb2MuZ2V0VmFsdWUoKVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvbnRlbnQoY29udGVudClcbiAgICAgICAgbGV0IGZpbmRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkoZm9ybWF0dGVkKVxuICAgICAgICBjb25zdCBjbG9zZXN0UXVlcnkgPSBnZXRDbG9zZXN0UXVlcnkoZmluZFF1ZXJpZXMsIGN1ck51bSlcblxuICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICBmaW5kUXVlcmllcy5yZWR1Y2UoKHByb21pc2UsIHF1ZXJ5LCBpKSA9PlxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmb3JtYXRDb250ZW50KGNtRG9jLmdldFZhbHVlKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkobmV3Q29udGVudClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5RdWVyeSh1cGRhdGVkUXVlcmllc1tpXSwgbmV3Q29udGVudClcbiAgICAgICAgICAgICAgICB9KSwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuUXVlcnkoY2xvc2VzdFF1ZXJ5LCBmb3JtYXR0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQnLFxuICAgICAgICAgICAgbmFtZTogJ2V4cGFuZCcsXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5pbml0RXhwYW5kZXIsXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQtYWxsJyxcbiAgICAgICAgICAgIG5hbWU6ICdleHBhbmQgYWxsJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmluaXRFeHBhbmRlcih0cnVlKSxcbiAgICAgICAgICAgIGhvdGtleXM6IFtdXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9FeHBhbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUxlYWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IGFjdGl2ZUxlYWYudmlld1xuICAgICAgICAgICAgY29uc3QgaXNBbGxvd2VkVmlldyA9IGFjdGl2ZVZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXdcbiAgICAgICAgICAgIGlmICghaXNBbGxvd2VkVmlldykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXRFeHBhbmRlcih0cnVlKVxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKSBhcyBQbHVnaW5TZXR0aW5nc1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luJyk7XG4gICAgfVxuXG4gICAgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNhdmVEYXRhKHRoaXMuY29uZmlnKVxuICAgIH1cbn1cblxuY2xhc3MgU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogVGV4dEV4cGFuZGVyXG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUZXh0RXhwYW5kZXIpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuXG4gICAgICAgIHRoaXMuYXBwID0gYXBwXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luXG4gICAgfVxuXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IHtjb250YWluZXJFbH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyBmb3IgVGV4dCBFeHBhbmRlcid9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdBdXRvIEV4cGFuZCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnRXhwYW5kIGFsbCBxdWVyaWVzIGluIGEgZmlsZSBvbmNlIHlvdSBvcGVuIGl0JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5hdXRvRXhwYW5kKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmF1dG9FeHBhbmQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVsYXknKVxuICAgICAgICAgICAgLnNldERlc2MoJ1RleHQgZXhwYW5kZXIgZG9uXFwnIHdhaXQgdW50aWwgc2VhcmNoIGNvbXBsZXRlZC4gSXQgd2FpdHMgZm9yIGEgZGVsYXkgYW5kIHBhc3RlIHJlc3VsdCBhZnRlciB0aGF0LicpXG4gICAgICAgICAgICAuYWRkU2xpZGVyKHNsaWRlciA9PiB7XG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldExpbWl0cygxMDAwLCAxMDAwMCwgMTAwMClcbiAgICAgICAgICAgICAgICBzbGlkZXIuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLmRlbGF5KVxuICAgICAgICAgICAgICAgIHNsaWRlci5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5kZWxheSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzbGlkZXIuc2V0RHluYW1pY1Rvb2x0aXAoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdMaW5lIGVuZGluZycpXG4gICAgICAgICAgICAuc2V0RGVzYygnWW91IGNhbiBzcGVjaWZ5IHRoZSB0ZXh0IHdoaWNoIHdpbGwgYXBwZWFyIGF0IHRoZSBib3R0b20gb2YgdGhlIGdlbmVyYXRlZCB0ZXh0LicpXG4gICAgICAgICAgICAuYWRkVGV4dCh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5saW5lRW5kaW5nKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5saW5lRW5kaW5nID0gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdEZWZhdWx0IHRlbXBsYXRlJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdZb3UgY2FuIHNwZWNpZnkgZGVmYXVsdCB0ZW1wbGF0ZScpXG4gICAgICAgICAgICAuYWRkVGV4dCh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmRlZmF1bHRUZW1wbGF0ZSA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZSBjdXJyZW50IGZpbGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSBzaG91bGQgdGV4dCBleHBhbmRlciBleGNsdWRlIHJlc3VsdHMgZnJvbSBjdXJyZW50IGZpbGUgb3Igbm90JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdTZXF1ZW5jZXMnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1JFR0VYUCAtIERFU0NSSVBUSU9OJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBmcmFnbWVudC5jcmVhdGVFbCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2Vxc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlID0+IGUubmFtZSArICcgLSAnICsgKGUuZGVzYyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnJhZ21lbnQuY3JlYXRlRWwoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0VGV4dChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRpdilcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICApXG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkZpbGVWaWV3IiwiTWFya2Rvd25WaWV3IiwiUGx1Z2luIiwiU2V0dGluZyIsIlBsdWdpblNldHRpbmdUYWIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN6QyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEYsUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMs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S0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLE1BQU0sS0FBSyxVQUFVLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdKLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDdEUsUUFBUSxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQ3RCLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekssWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNO0FBQzlDLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDeEUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7QUFDakUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVM7QUFDakUsZ0JBQWdCO0FBQ2hCLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO0FBQ2hJLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQzFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsImhlbHBlcnMudHMiLCJzcmMvc2VxdWVuY2VzL3NlcXVlbmNlcy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCJleHBvcnQgaW50ZXJmYWNlIEV4cGFuZGVyUXVlcnkge1xuICAgIHN0YXJ0OiBudW1iZXJcbiAgICBlbmQ6IG51bWJlclxuICAgIHRlbXBsYXRlOiBzdHJpbmdcbiAgICBxdWVyeTogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29udGVudC5zcGxpdCgnXFxuJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEV4cGFuZGVyc1F1ZXJ5KGNvbnRlbnQ6IHN0cmluZ1tdKTogRXhwYW5kZXJRdWVyeVtdIHtcbiAgICBsZXQgYWNjdW06IEV4cGFuZGVyUXVlcnlbXSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W2ldXG5cbiAgICAgICAgaWYgKGxpbmUgPT09ICdgYGBleHBhbmRlcicpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgY29udGVudC5sZW5ndGggLSBpOyBlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0bGluZSA9IGNvbnRlbnRbaSArIGVdIFxuICAgICAgICAgICAgICAgIGlmIChuZXh0bGluZSA9PT0gJ2BgYCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGkgKyBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBjb250ZW50W2kgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogZSA+IDIgPyBjb250ZW50LnNsaWNlKGkgKyAyLCBpICsgZSkuam9pbignXFxuJykgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY3VtXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9zZXN0UXVlcnkocXVlcmllczogRXhwYW5kZXJRdWVyeVtdLCBsaW5lTnVtYmVyOiBudW1iZXIpOiBFeHBhbmRlclF1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBxdWVyaWVzLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYi5zdGFydCAtIGxpbmVOdW1iZXIpIDwgTWF0aC5hYnMoYS5zdGFydCAtIGxpbmVOdW1iZXIpID8gYiA6IGE7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0TGluZVRvUmVwbGFjZShjb250ZW50OiBzdHJpbmdbXSwgcXVlcnk6IEV4cGFuZGVyUXVlcnksIGVuZGxpbmU6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVGcm9tID0gcXVlcnkuZW5kXG5cbiAgICBmb3IgKHZhciBpID0gbGluZUZyb20gKyAxOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29udGVudFtpXSA9PT0gZW5kbGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaW5lRnJvbSArIDFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyaW1Db250ZW50KHM6IHN0cmluZykge1xuICAgIGNvbnN0IHJlbW92ZUVtcHR5TGluZXMgPSAoczogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBzLnNwbGl0KCdcXG4nKS5tYXAoZSA9PiBlLnRyaW0oKSlcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZXMuaW5kZXhPZignJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVFbXB0eUxpbmVzKGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlRnJvbnRNYXR0ZXIgPSAoczogc3RyaW5nLCBsb29rRW5kaW5nOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBsaW5lcyA9IHMuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgaWYgKGxvb2tFbmRpbmcgJiYgbGluZXMuaW5kZXhPZignLS0tJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvb2tFbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lcy5pbmRleE9mKCctLS0nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUZyb250TWF0dGVyKGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpLCB0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRnJvbnRNYXR0ZXIocmVtb3ZlRW1wdHlMaW5lcyhzKSlcbn0iLCJpbXBvcnQge1RGaWxlfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7dHJpbUNvbnRlbnR9IGZyb20gXCIuLi8uLi9oZWxwZXJzXCI7XG5pbXBvcnQgVGV4dEV4cGFuZGVyLCB7U2VhcmNoRGV0YWlsc30gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7b2ZmfSBmcm9tIFwiY29kZW1pcnJvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlcyB7XG4gICAgbG9vcDogYm9vbGVhblxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGZvcm1hdDogKHBsdWdpbjogVGV4dEV4cGFuZGVyLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHM/OiBTZWFyY2hEZXRhaWxzLCBpbmRleD86IG51bWJlcikgPT4gc3RyaW5nXG4gICAgZGVzYzogc3RyaW5nXG4gICAgcmVhZENvbnRlbnQ/OiBib29sZWFuXG4gICAgdXNpbmdTZWFyY2g/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBMaW5lSW5mbyB7XG4gICAgdGV4dDogc3RyaW5nXG4gICAgbnVtOiBudW1iZXJcbiAgICBzdGFydDogbnVtYmVyXG4gICAgZW5kOiBudW1iZXJcbn1cblxuZnVuY3Rpb24gaGlnaGxpZ2h0KGxpbmVTdGFydDogbnVtYmVyLCBsaW5lRW5kOiBudW1iZXIsIG1hdGNoU3RhcnQ6IG51bWJlciwgbWF0Y2hFbmQ6IG51bWJlciwgbGluZUNvbnRlbnQ6IHN0cmluZykge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmxpbmVDb250ZW50LnNsaWNlKDAsIG1hdGNoU3RhcnQgLSBsaW5lU3RhcnQpLFxuICAgICAgICAnPT0nLFxuICAgICAgICAuLi5saW5lQ29udGVudC5zbGljZShtYXRjaFN0YXJ0IC0gbGluZVN0YXJ0LCAobWF0Y2hTdGFydCAtIGxpbmVTdGFydCkgKyAobWF0Y2hFbmQgLSBtYXRjaFN0YXJ0KSksXG4gICAgICAgICc9PScsXG4gICAgICAgIC4uLmxpbmVDb250ZW50LnNsaWNlKChtYXRjaFN0YXJ0IC0gbGluZVN0YXJ0KSArIChtYXRjaEVuZCAtIG1hdGNoU3RhcnQpKSxcbiAgICBdLmpvaW4oJycpXG59XG5cbmNvbnN0IHNlcXVlbmNlczogU2VxdWVuY2VzW10gPSBbXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjb3VudCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBfczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUsIF9kLCBpbmRleCkgPT4gaW5kZXggPyBTdHJpbmcoaW5kZXggKyAxKSA6IFN0cmluZygxKSxcbiAgICAgICAgZGVzYzogJ2FkZCBpbmRleCBudW1iZXIgdG8gZWFjaCBwcm9kdWNlZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRmaWxlbmFtZScsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBfczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gZmlsZS5iYXNlbmFtZSxcbiAgICAgICAgZGVzYzogJ25hbWUgb2YgdGhlIGZvdW5kZWQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkbGluaycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIF9zOiBzdHJpbmcsIF9jb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBwLmFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhmaWxlLCBmaWxlLnBhdGgpLFxuICAgICAgICBkZXNjOiAnbGluayBiYXNlZCBvbiBPYnNpZGlhbiBzZXR0aW5ncydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkbGluZXM6XFxcXGQrJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpZ2l0cyA9IE51bWJlcihzLnNwbGl0KCc6JylbMV0pXG5cbiAgICAgICAgICAgIHJldHVybiB0cmltQ29udGVudChjb250ZW50KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChfOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gaSA8IGRpZ2l0cylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHAuY29uZmlnLmxpbmVFbmRpbmcsICdnJyksICcnKVxuICAgICAgICB9LFxuICAgICAgICBkZXNjOiAnc3BlY2lmaWVkIGNvdW50IG9mIGxpbmVzIGZyb20gdGhlIGZvdW5kIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNoYXJhY3RlcnM6XFxcXGQrJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpZ2l0cyA9IE51bWJlcihzLnNwbGl0KCc6JylbMV0pXG5cbiAgICAgICAgICAgIHJldHVybiB0cmltQ29udGVudChjb250ZW50KVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChfOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gaSA8IGRpZ2l0cylcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKHAuY29uZmlnLmxpbmVFbmRpbmcsICdnJyksICcnKVxuICAgICAgICB9LFxuICAgICAgICBkZXNjOiAnc3BlY2lmaWVkIGNvdW50IG9mIGxpbmVzIGZyb20gdGhlIGZvdW5kIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGZyb250bWF0dGVyOltcXFxccFxce0xcXH1fLV0rJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAocCwgczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gcC5nZXRGcm9udE1hdHRlcihzLCBmaWxlKSxcbiAgICAgICAgZGVzYzogJ3ZhbHVlIGZyb20gdGhlIGZyb250bWF0dGVyIGtleSBpbiB0aGUgZm91bmQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkbGluZXMrJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBfZmlsZTogVEZpbGUpID0+IGNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKHAuY29uZmlnLmxpbmVFbmRpbmcsICdnJyksICcnKSxcbiAgICAgICAgZGVzYzogJ2FsbCBjb250ZW50IGZyb20gdGhlIGZvdW5kIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGV4dCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUuZXh0ZW5zaW9uLFxuICAgICAgICBkZXNjOiAncmV0dXJuIGZpbGUgZXh0ZW5zaW9uJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkOmZvcm1hdDpkYXRlJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKG5ldyBEYXRlKGZpbGUuc3RhdC5jdGltZSkudG9JU09TdHJpbmcoKSkuc3BsaXQoJ1QnKVswXSxcbiAgICAgICAgZGVzYzogJ2NyZWF0ZWQgdGltZSBmb3JtYXR0ZWQnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0OnRpbWUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKS50b0lTT1N0cmluZygpKS5zcGxpdCgvKFsuVF0pLylbMl0sXG4gICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkOmZvcm1hdCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhuZXcgRGF0ZShmaWxlLnN0YXQuY3RpbWUpLnRvSVNPU3RyaW5nKCkpLFxuICAgICAgICBkZXNjOiAnY3JlYXRlZCB0aW1lIGZvcm1hdHRlZCdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkY3JlYXRlZCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhmaWxlLnN0YXQuY3RpbWUpLFxuICAgICAgICBkZXNjOiAnY3JlYXRlZCB0aW1lJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRzaXplJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKGZpbGUuc3RhdC5zaXplKSxcbiAgICAgICAgZGVzYzogJ3NpemUgb2YgdGhlIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJHBhdGgnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBmaWxlLnBhdGgsXG4gICAgICAgIGRlc2M6ICdwYXRoIHRvIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRwYXJlbnQnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBmaWxlLnBhcmVudC5uYW1lLFxuICAgICAgICBkZXNjOiAncGFyZW50IGZvbGRlciBuYW1lJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXiguK3wpXFxcXCRoZWFkZXI6LisnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckJykpXG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBzLnNsaWNlKHMuaW5kZXhPZignJCcpKS5yZXBsYWNlKCckaGVhZGVyOicsICcnKS5yZXBsYWNlKC9cIi9nLCAnJylcbiAgICAgICAgICAgIGNvbnN0IG5lZWRlZExldmVsID0gaGVhZGVyLnNwbGl0KFwiI1wiKS5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuZWVkZWRUaXRsZSA9IGhlYWRlci5yZXBsYWNlKC9eIysvZywgJycpLnRyaW0oKVxuXG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHAuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpXG5cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5oZWFkaW5ncz8uZmlsdGVyKGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RzID0gW1xuICAgICAgICAgICAgICAgICAgICBbbmVlZGVkVGl0bGUsIGUuaGVhZGluZy5pbmNsdWRlcyhuZWVkZWRUaXRsZSldLFxuICAgICAgICAgICAgICAgICAgICBbbmVlZGVkTGV2ZWwsIGUubGV2ZWwgPT09IG5lZWRlZExldmVsXVxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKGUgPT4gZVswXSlcblxuICAgICAgICAgICAgICAgIGlmICh0ZXN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLm1hcChlID0+IGVbMV0pLmV2ZXJ5KGUgPT4gZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAubWFwKGggPT4gcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5iYXNlbmFtZSwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJydcblxuICAgICAgICB9LFxuICAgICAgICBkZXNjOiAnaGVhZGluZ3MgZnJvbSBmb3VuZGVkIGZpbGVzLiAkaGVhZGVyOiMjIC0gcmV0dXJuIGFsbCBsZXZlbCAyIGhlYWRpbmdzLiAkaGVhZGVyOlRpdGxlIC0gcmV0dXJuIGFsbCBoZWFkaW5nIHdoaWNoIG1hdGNoIHRoZSBzdHJpbmcuIENhbiBiZSBwcmVwZW5kZWQgbGlrZTogLSAhJGhlYWRlcjojIyB0byB0cmFuc2NsdWRlIHRoZSBoZWFkaW5ncy4nXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJGJsb2NrcycsXG4gICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckJykpXG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiAvXFxeXFx3KyQvLnRlc3QoZSkpXG4gICAgICAgICAgICAgICAgLm1hcChlID0+XG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHAuYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsIGZpbGUuYmFzZW5hbWUsICcjJyArIGUucmVwbGFjZSgvXi4rPyhcXF5cXHcrJCkvLCAnJDEnKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2M6ICdibG9jayBpZHMgZnJvbSB0aGUgZm91bmQgZmlsZXMuIENhbiBiZSBwcmVwZW5kZWQuJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXiguK3wpXFxcXCRtYXRjaDpoZWFkZXInLCBsb29wOiB0cnVlLCBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckJykpXG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHAuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpXG5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdzID0gbWV0YWRhdGEuaGVhZGluZ3NcbiAgICAgICAgICAgICAgICA/LmZpbHRlcihoID0+IHJlc3VsdHMucmVzdWx0LmNvbnRlbnQuZmlsdGVyKGMgPT4gaC5wb3NpdGlvbi5lbmQub2Zmc2V0IDwgY1swXSkuc29tZShlID0+IGUpKVxuICAgICAgICAgICAgICAgIC5zbGljZSgtMSlcblxuICAgICAgICAgICAgcmV0dXJuIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgLm1hcChoID0+IHAuYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsIGZpbGUucGF0aCwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJydcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2hsaW5lOihcXFxcK3wtfClcXFxcZCsnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBzLnNsaWNlKDAsIHMuaW5kZXhPZignJG1hdGNobGluZScpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcy5zbGljZShzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSkuc3BsaXQoJzonKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IGlzUGx1cyA9IHZhbHVlLmNvbnRhaW5zKCcrJyk7XG4gICAgICAgICAgICBjb25zdCBpc01pbnVzID0gdmFsdWUuY29udGFpbnMoJy0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGV4dCA9ICFpc1BsdXMgJiYgIWlzTWludXM7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgvWystXS8sICcnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0cy5jb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgLy8gR3JhYiBpbmZvIGFib3V0IGxpbmUgY29udGVudCwgaW5kZXgsIHRleHQgbGVuZ3RoIGFuZCBzdGFydC9lbmQgY2hhcmFjdGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mb3M6IEFycmF5PExpbmVJbmZvPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGxpbmVzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW06IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpbmVJbmZvc1tpLTFdLmVuZCArIDFcbiAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG51bTogaSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGggKyBzdGFydFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lm1hcCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMaW5lcyA9IGxpbmVJbmZvc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc3RhcnQgPD0gZnJvbSAmJiBlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBoaWdobGlnaHQobGluZS5zdGFydCwgbGluZS5lbmQsIGZyb20sIHRvLCBsaW5lLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRMaW5lczogTGluZUluZm9bXSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTGluZSBvZiBtYXRjaGVkTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkxpbmVzID0gaXNNaW51cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbWF0Y2hlZExpbmUubnVtIC0gbC5udW0gPiAwICYmIG1hdGNoZWRMaW5lLm51bSAtIGwubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lcyA9IGlzUGx1cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbC5udW0gLSBtYXRjaGVkTGluZS5udW0gPiAwICYmIGwubnVtIC0gbWF0Y2hlZExpbmUubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZXMucHVzaCggLi4ucHJldkxpbmVzLCBtYXRjaGVkTGluZSwgLi4ubmV4dExpbmVzIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0TGluZXMubWFwKGUgPT4gZS50ZXh0KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSkuam9pbignXFxuJylcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgbGluZSB3aXRoIG1hdGNoZXMnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNobGluZScsIGxvb3A6IHRydWUsIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHMpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0cy5jb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgLy8gR3JhYiBpbmZvIGFib3V0IGxpbmUgY29udGVudCwgaW5kZXgsIHRleHQgbGVuZ3RoIGFuZCBzdGFydC9lbmQgY2hhcmFjdGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mb3M6IEFycmF5PExpbmVJbmZvPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGxpbmVzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW06IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpbmVJbmZvc1tpLTFdLmVuZCArIDFcbiAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG51bTogaSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGggKyBzdGFydFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lm1hcCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lSW5mb3NcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoeyBzdGFydCwgZW5kIH0pID0+IHN0YXJ0IDw9IGZyb20gJiYgZW5kID49IHRvKVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh7c3RhcnQsIGVuZCwgdGV4dH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHQoc3RhcnQsIGVuZCwgZnJvbSwgdG8sIHRleHQpXG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9KS5qb2luKCdcXG4nKVxuICAgICAgICB9LCBkZXNjOiAnZXh0cmFjdCBsaW5lIHdpdGggbWF0Y2hlcydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2gnLCBsb29wOiB0cnVlLCBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzKSA9PiB7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0cy5yZXN1bHQuY29udGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlcmUgaXMgbm8gY29udGVudCBpbiByZXN1bHRzJylcbiAgICAgICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gYXBwZW5kUHJlZml4KHByZWZpeDogc3RyaW5nLCBsaW5lOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgbGluZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJlZml4Q29udGVudCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckJykpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHQuY29udGVudFxuICAgICAgICAgICAgICAgIC5tYXAoKFtmcm9tLCB0b10pID0+IHJlc3VsdHMuY29udGVudC5zbGljZShmcm9tLCB0bykpXG4gICAgICAgICAgICAgICAgLm1hcChsaW5lID0+IGFwcGVuZFByZWZpeChwcmVmaXhDb250ZW50LCBsaW5lKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICB9LFxuXVxuXG5leHBvcnQgZGVmYXVsdCBzZXF1ZW5jZXMiLCJpbXBvcnQge1xuICAgIEV4cGFuZGVyUXVlcnksXG4gICAgZm9ybWF0Q29udGVudCxcbiAgICBnZXRBbGxFeHBhbmRlcnNRdWVyeSxcbiAgICBnZXRDbG9zZXN0UXVlcnksXG4gICAgZ2V0TGFzdExpbmVUb1JlcGxhY2Vcbn0gZnJvbSAnaGVscGVycyc7XG5pbXBvcnQge1xuICAgIEFwcCxcbiAgICBQbHVnaW4sXG4gICAgUGx1Z2luU2V0dGluZ1RhYixcbiAgICBTZXR0aW5nLFxuICAgIFRGaWxlLFxuICAgIEZpbGVWaWV3LFxuICAgIE1hcmtkb3duVmlldyxcbiAgICBQbHVnaW5NYW5pZmVzdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tICdjb2RlbWlycm9yJ1xuaW1wb3J0IHNlcXVlbmNlcywge1NlcXVlbmNlc30gZnJvbSBcIi4vc2VxdWVuY2VzL3NlcXVlbmNlc1wiO1xuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3Mge1xuICAgIGRlbGF5OiBudW1iZXJcbiAgICBsaW5lRW5kaW5nOiBzdHJpbmdcbiAgICBkZWZhdWx0VGVtcGxhdGU6IHN0cmluZ1xuICAgIGV4Y2x1ZGVDdXJyZW50OiBib29sZWFuXG4gICAgYXV0b0V4cGFuZDogYm9vbGVhblxufVxuXG50eXBlIE51bWJlclR1cGxlID0gW251bWJlciwgbnVtYmVyXVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaERldGFpbHMge1xuICAgIGFwcDogQXBwXG4gICAgY2hpbGRyZW46IGFueVtdXG4gICAgY2hpbGRyZW5FbDogSFRNTEVsZW1lbnRcbiAgICBjb2xsYXBzZUVsOiBIVE1MRWxlbWVudFxuICAgIGNvbGxhcHNlZDogYm9vbGVhblxuICAgIGNvbGxhcHNpYmxlOiBib29sZWFuXG4gICAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50XG4gICAgY29udGVudDogc3RyaW5nXG4gICAgZG9tOiBhbnlcbiAgICBlbDogSFRNTEVsZW1lbnRcbiAgICBleHRyYUNvbnRleHQ6ICgpID0+IGJvb2xlYW5cbiAgICBmaWxlOiBURmlsZVxuICAgIGluZm86IGFueVxuICAgIG9uTWF0Y2hSZW5kZXI6IGFueVxuICAgIHB1c2hlckVsOiBIVE1MRWxlbWVudFxuICAgIHJlc3VsdDoge1xuICAgICAgICBmaWxlbmFtZT86IE51bWJlclR1cGxlW11cbiAgICAgICAgY29udGVudD86IE51bWJlclR1cGxlW11cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRFeHBhbmRlciBleHRlbmRzIFBsdWdpbiB7XG4gICAgY206IENvZGVNaXJyb3IuRWRpdG9yXG5cbiAgICBjb25maWc6IFBsdWdpblNldHRpbmdzID0ge1xuICAgICAgICBhdXRvRXhwYW5kOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFRlbXBsYXRlOiAnLSAkbGluaycsXG4gICAgICAgIGRlbGF5OiAzMDAsXG4gICAgICAgIGV4Y2x1ZGVDdXJyZW50OiB0cnVlLFxuICAgICAgICBsaW5lRW5kaW5nOiAnPC0tPidcbiAgICB9XG5cbiAgICBzZXFzOiBTZXF1ZW5jZXNbXSA9IHNlcXVlbmNlc1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogUGx1Z2luTWFuaWZlc3QpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKVxuICAgICAgICB0aGlzLmluaXRFeHBhbmRlciA9IHRoaXMuaW5pdEV4cGFuZGVyLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5yZWZvcm1hdExpbmtzID0gdGhpcy5yZWZvcm1hdExpbmtzLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBnZXRGcm9udE1hdHRlcihzOiBzdHJpbmcsIHI6IFRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHtmcm9udG1hdHRlciA9IG51bGx9ID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShyLnBhdGgpXG5cbiAgICAgICAgaWYgKGZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbnRtYXR0ZXJbcy5zcGxpdCgnOicpWzFdXSB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHJlZm9ybWF0TGlua3MobGlua3M6IFRGaWxlW10sIG1hcEZ1bmMgPSAoczogc3RyaW5nKSA9PiAnW1snICsgcyArICddXScpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgaWYgKGN1cnJlbnRWaWV3IGluc3RhbmNlb2YgRmlsZVZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5rcz8ubWFwKGUgPT4gZS5iYXNlbmFtZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGUgPT4gY3VycmVudFZpZXcuZmlsZS5iYXNlbmFtZSAhPT0gZSlcbiAgICAgICAgICAgICAgICA/Lm1hcChtYXBGdW5jKT8uam9pbignXFxuJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5rcz8ubWFwKGUgPT4gZS5iYXNlbmFtZSk/Lm1hcChtYXBGdW5jKT8uam9pbignXFxuJylcbiAgICB9XG5cbiAgICBzZWFyY2goczogc3RyaW5nKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoRm4gPSB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0UGx1Z2luQnlJZCgnZ2xvYmFsLXNlYXJjaCcpLmluc3RhbmNlLm9wZW5HbG9iYWxTZWFyY2guYmluZCh0aGlzKVxuICAgICAgICBjb25zdCBzZWFyY2ggPSAocXVlcnk6IHN0cmluZykgPT4gZ2xvYmFsU2VhcmNoRm4ocXVlcnkpXG5cbiAgICAgICAgY29uc3QgbGVmdFNwbGl0U3RhdGUgPSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2VkLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGFiOiB0aGlzLmdldFNlYXJjaFRhYkluZGV4KClcbiAgICAgICAgfVxuXG4gICAgICAgIHNlYXJjaChzKVxuICAgICAgICBpZiAobGVmdFNwbGl0U3RhdGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UubGVmdFNwbGl0LmNvbGxhcHNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGxlZnRTcGxpdFN0YXRlLnRhYiAhPT0gdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jaGlsZHJlblswXS5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UubGVmdFNwbGl0LmNoaWxkcmVuWzBdLnNlbGVjdFRhYkluZGV4KGxlZnRTcGxpdFN0YXRlLnRhYilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNlYXJjaFRhYkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGxldCBsZWZ0VGFicyA9IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY2hpbGRyZW5bMF0uY2hpbGRyZW47XG4gICAgICAgIGxldCBzZWFyY2hUYWJJZDogc3RyaW5nO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAobGVhZi5nZXRWaWV3U3RhdGUoKS50eXBlID09IFwic2VhcmNoXCIpIHsgc2VhcmNoVGFiSWQgPSBsZWFmLmlkOyB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGVmdFRhYnMuZmluZEluZGV4KChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uaWQgPT0gc2VhcmNoVGFiSWQpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jIGdldEZvdW5kQWZ0ZXJEZWxheSgpOiBQcm9taXNlPE1hcDxURmlsZSwgU2VhcmNoRGV0YWlscz4+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoJ3NlYXJjaCcpWzBdXG4gICAgICAgIGNvbnN0IHZpZXcgPSBhd2FpdCBzZWFyY2hMZWFmLm9wZW4oc2VhcmNoTGVhZi52aWV3KVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHZpZXcuZG9tLnJlc3VsdERvbUxvb2t1cCBhcyBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRzKVxuICAgICAgICAgICAgfSwgdGhpcy5jb25maWcuZGVsYXkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnRUZW1wbGF0ZU1vZGUocXVlcnk6IEV4cGFuZGVyUXVlcnksIGxhc3RMaW5lOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG4gICAgICAgIGxldCBjdXJyZW50RmlsZU5hbWUgPSAnJ1xuXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlQ29udGVudCA9IHF1ZXJ5LnRlbXBsYXRlLnNwbGl0KCdcXG4nKVxuXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGUgPT4gZVswXSA9PT0gJ14nKS5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoZSA9PiBlWzBdID09PSAnPicpLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgY29uc3QgcmVwZWF0YWJsZUNvbnRlbnQgPVxuICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50LmZpbHRlcihlID0+IGVbMF0gIT09ICdeJyAmJiBlWzBdICE9PSAnPicpLmZpbHRlcihlID0+IGUpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gW3RoaXMuY29uZmlnLmRlZmF1bHRUZW1wbGF0ZV1cbiAgICAgICAgICAgICAgICA6IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoZSA9PiBlWzBdICE9PSAnXicgJiYgZVswXSAhPT0gJz4nKS5maWx0ZXIoZSA9PiBlKVxuXG4gICAgICAgIGlmIChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KSB7XG4gICAgICAgICAgICBjdXJyZW50RmlsZU5hbWUgPSBjdXJyZW50Vmlldy5maWxlLmJhc2VuYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRGb3VuZEFmdGVyRGVsYXkoKVxuICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oc2VhcmNoUmVzdWx0cy5rZXlzKCkpXG5cbiAgICAgICAgY29uc3QgZmlsdGVyRmlsZXMgPSB0aGlzLmNvbmZpZy5leGNsdWRlQ3VycmVudFxuICAgICAgICAgICAgPyBmaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlLmJhc2VuYW1lICE9PSBjdXJyZW50RmlsZU5hbWUpXG4gICAgICAgICAgICA6IGZpbGVzXG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gYXN5bmMgKHI6IFRGaWxlLCB0ZW1wbGF0ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IChuZXcgUmVnRXhwKHRoaXMuc2Vxcy5maWx0ZXIoZSA9PiBlLnJlYWRDb250ZW50KS5tYXAoZSA9PiBlLm5hbWUpLmpvaW4oJ3wnKSkudGVzdCh0ZW1wbGF0ZSkpXG4gICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLmFwcC52YXVsdC5jYWNoZWRSZWFkKHIpXG4gICAgICAgICAgICAgICAgOiAnJ1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXFzLnJlZHVjZSgoYWNjLCBzZXEpID0+XG4gICAgICAgICAgICAgICAgYWNjLnJlcGxhY2UobmV3IFJlZ0V4cChzZXEubmFtZSwgJ2d1JyksIHJlcGxhY2UgPT4gc2VxLmZvcm1hdCh0aGlzLCByZXBsYWNlLCBmaWxlQ29udGVudCwgciwgc2VhcmNoUmVzdWx0cy5nZXQociksIGluZGV4KSksIHRlbXBsYXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgZmlsdGVyRmlsZXNcbiAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChmaWxlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHJlcGVhdGFibGVDb250ZW50Lm1hcChhc3luYyAocykgPT4gYXdhaXQgZm9ybWF0KGZpbGUsIHMsIGkpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXG4gICAgICAgICAgICAnICcsXG4gICAgICAgICAgICBoZWFkaW5nLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgY2hhbmdlZC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGZvb3Rlci5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmxpbmVFbmRpbmdcbiAgICAgICAgXS5maWx0ZXIoZSA9PiBlKS5qb2luKCdcXG4nKVxuXG4gICAgICAgIGNvbnN0IHZpZXdCZWZvcmVSZXBsYWNlID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlld1xuICAgICAgICBpZiAodmlld0JlZm9yZVJlcGxhY2UgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpIHtcbiAgICAgICAgICAgIGlmICh2aWV3QmVmb3JlUmVwbGFjZS5maWxlLmJhc2VuYW1lICE9PSBjdXJyZW50RmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbS5yZXBsYWNlUmFuZ2UocmVzdWx0LFxuICAgICAgICAgICAge2xpbmU6IHF1ZXJ5LmVuZCArIDEsIGNoOiAwfSxcbiAgICAgICAgICAgIHtsaW5lOiBsYXN0TGluZSwgY2g6IHRoaXMuY20uZ2V0TGluZShsYXN0TGluZSk/Lmxlbmd0aCB8fCAwfSlcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICBhc3luYyBydW5RdWVyeShxdWVyeTogRXhwYW5kZXJRdWVyeSwgY29udGVudDogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgeyBsaW5lRW5kaW5nIH0gPSB0aGlzLmNvbmZpZ1xuXG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oJ0V4cGFuZCBxdWVyeSBub3QgZm91bmQnKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0TGluZSA9IGdldExhc3RMaW5lVG9SZXBsYWNlKGNvbnRlbnQsIHF1ZXJ5LCB0aGlzLmNvbmZpZy5saW5lRW5kaW5nKVxuICAgICAgICB0aGlzLmNtLnJlcGxhY2VSYW5nZSgnXFxuJyArIGxpbmVFbmRpbmcsXG4gICAgICAgICAgICB7bGluZTogcXVlcnkuZW5kICsgMSwgY2g6IDB9LFxuICAgICAgICAgICAge2xpbmU6IGxhc3RMaW5lLCBjaDogdGhpcy5jbS5nZXRMaW5lKGxhc3RMaW5lKT8ubGVuZ3RoIHx8IDB9KVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmb3JtYXRDb250ZW50KHRoaXMuY20uZ2V0VmFsdWUoKSlcblxuICAgICAgICB0aGlzLnNlYXJjaChxdWVyeS5xdWVyeSlcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRUZW1wbGF0ZU1vZGUocXVlcnksIGdldExhc3RMaW5lVG9SZXBsYWNlKG5ld0NvbnRlbnQsIHF1ZXJ5LCB0aGlzLmNvbmZpZy5saW5lRW5kaW5nKSlcbiAgICB9XG5cbiAgICBpbml0RXhwYW5kZXIoYWxsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgaWYgKCEoY3VycmVudFZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNtRG9jID0gdGhpcy5jbSA9IGN1cnJlbnRWaWV3LnNvdXJjZU1vZGUuY21FZGl0b3JcbiAgICAgICAgY29uc3QgY3VyTnVtID0gY21Eb2MuZ2V0Q3Vyc29yKCkubGluZVxuICAgICAgICBjb25zdCBjb250ZW50ID0gY21Eb2MuZ2V0VmFsdWUoKVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvbnRlbnQoY29udGVudClcbiAgICAgICAgbGV0IGZpbmRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkoZm9ybWF0dGVkKVxuICAgICAgICBjb25zdCBjbG9zZXN0UXVlcnkgPSBnZXRDbG9zZXN0UXVlcnkoZmluZFF1ZXJpZXMsIGN1ck51bSlcblxuICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICBmaW5kUXVlcmllcy5yZWR1Y2UoKHByb21pc2UsIHF1ZXJ5LCBpKSA9PlxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmb3JtYXRDb250ZW50KGNtRG9jLmdldFZhbHVlKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkobmV3Q29udGVudClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5RdWVyeSh1cGRhdGVkUXVlcmllc1tpXSwgbmV3Q29udGVudClcbiAgICAgICAgICAgICAgICB9KSwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuUXVlcnkoY2xvc2VzdFF1ZXJ5LCBmb3JtYXR0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQnLFxuICAgICAgICAgICAgbmFtZTogJ2V4cGFuZCcsXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5pbml0RXhwYW5kZXIsXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQtYWxsJyxcbiAgICAgICAgICAgIG5hbWU6ICdleHBhbmQgYWxsJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmluaXRFeHBhbmRlcih0cnVlKSxcbiAgICAgICAgICAgIGhvdGtleXM6IFtdXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9FeHBhbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUxlYWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IGFjdGl2ZUxlYWYudmlld1xuICAgICAgICAgICAgY29uc3QgaXNBbGxvd2VkVmlldyA9IGFjdGl2ZVZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXdcbiAgICAgICAgICAgIGlmICghaXNBbGxvd2VkVmlldykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXRFeHBhbmRlcih0cnVlKVxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKSBhcyBQbHVnaW5TZXR0aW5nc1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luJyk7XG4gICAgfVxuXG4gICAgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNhdmVEYXRhKHRoaXMuY29uZmlnKVxuICAgIH1cbn1cblxuY2xhc3MgU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogVGV4dEV4cGFuZGVyXG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUZXh0RXhwYW5kZXIpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuXG4gICAgICAgIHRoaXMuYXBwID0gYXBwXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luXG4gICAgfVxuXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IHtjb250YWluZXJFbH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyBmb3IgVGV4dCBFeHBhbmRlcid9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdBdXRvIEV4cGFuZCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnRXhwYW5kIGFsbCBxdWVyaWVzIGluIGEgZmlsZSBvbmNlIHlvdSBvcGVuIGl0JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5hdXRvRXhwYW5kKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmF1dG9FeHBhbmQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVsYXknKVxuICAgICAgICAgICAgLnNldERlc2MoJ1RleHQgZXhwYW5kZXIgZG9uXFwnIHdhaXQgdW50aWwgc2VhcmNoIGNvbXBsZXRlZC4gSXQgd2FpdHMgZm9yIGEgZGVsYXkgYW5kIHBhc3RlIHJlc3VsdCBhZnRlciB0aGF0LicpXG4gICAgICAgICAgICAuYWRkU2xpZGVyKHNsaWRlciA9PiB7XG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldExpbWl0cygxMDAsIDEwMDAwLCAxMDApXG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5kZWxheSlcbiAgICAgICAgICAgICAgICBzbGlkZXIub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcuZGVsYXkgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldER5bmFtaWNUb29sdGlwKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnTGluZSBlbmRpbmcnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSB0aGUgdGV4dCB3aGljaCB3aWxsIGFwcGVhciBhdCB0aGUgYm90dG9tIG9mIHRoZSBnZW5lcmF0ZWQgdGV4dC4nKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcubGluZUVuZGluZylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcubGluZUVuZGluZyA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVmYXVsdCB0ZW1wbGF0ZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnWW91IGNhbiBzcGVjaWZ5IGRlZmF1bHQgdGVtcGxhdGUnKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZGVmYXVsdFRlbXBsYXRlKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGUgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0V4Y2x1ZGUgY3VycmVudCBmaWxlJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdZb3UgY2FuIHNwZWNpZnkgc2hvdWxkIHRleHQgZXhwYW5kZXIgZXhjbHVkZSByZXN1bHRzIGZyb20gY3VycmVudCBmaWxlIG9yIG5vdCcpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZXhjbHVkZUN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcuZXhjbHVkZUN1cnJlbnQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnU2VxdWVuY2VzJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdSRUdFWFAgLSBERVNDUklQVElPTicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gZnJhZ21lbnQuY3JlYXRlRWwoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNlcXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZSA9PiBlLm5hbWUgKyAnIC0gJyArIChlLmRlc2MgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGZyYWdtZW50LmNyZWF0ZUVsKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFRleHQoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVsKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkaXYpXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgKVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJGaWxlVmlldyIsIk1hcmtkb3duVmlldyIsIlBsdWdpbiIsIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUss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 diff --git a/.obsidian/plugins/mrj-text-expand/manifest.json b/.obsidian/plugins/mrj-text-expand/manifest.json index fec394e5..e23e86ac 100644 --- a/.obsidian/plugins/mrj-text-expand/manifest.json +++ b/.obsidian/plugins/mrj-text-expand/manifest.json @@ -1,7 +1,7 @@ { "id": "mrj-text-expand", "name": "Text expand", - "version": "0.9.2", + "version": "0.10.5", "description": "Search and paste/transclude links to located files.", "isDesktopOnly": false, "author": "MrJackphil", diff --git a/.obsidian/plugins/multi-column-markdown/main.js b/.obsidian/plugins/multi-column-markdown/main.js deleted file mode 100644 index 323f6e86..00000000 --- a/.obsidian/plugins/multi-column-markdown/main.js +++ /dev/null @@ -1,1302 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ROLLUP -if you want to view the source visit the plugins github repository -*/ - -'use strict'; - -var obsidian = require('obsidian'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -/* - * Filename: multi-column-markdown/src/regionSettings.ts - * Created Date: Tuesday, February 1st 2022, 12:23:53 pm - * Author: Cameron Robinson - * - * Copyright (c) 2022 Cameron Robinson - */ -var BorderOption; -(function (BorderOption) { - BorderOption[BorderOption["enabled"] = 0] = "enabled"; - BorderOption[BorderOption["on"] = 1] = "on"; - BorderOption[BorderOption["true"] = 2] = "true"; - BorderOption[BorderOption["disabled"] = 3] = "disabled"; - BorderOption[BorderOption["off"] = 4] = "off"; - BorderOption[BorderOption["false"] = 5] = "false"; -})(BorderOption || (BorderOption = {})); -var ShadowOption; -(function (ShadowOption) { - ShadowOption[ShadowOption["enabled"] = 0] = "enabled"; - ShadowOption[ShadowOption["on"] = 1] = "on"; - ShadowOption[ShadowOption["true"] = 2] = "true"; - ShadowOption[ShadowOption["disabled"] = 3] = "disabled"; - ShadowOption[ShadowOption["off"] = 4] = "off"; - ShadowOption[ShadowOption["false"] = 5] = "false"; -})(ShadowOption || (ShadowOption = {})); -var ColumnLayout; -(function (ColumnLayout) { - ColumnLayout[ColumnLayout["standard"] = 0] = "standard"; - ColumnLayout[ColumnLayout["left"] = 1] = "left"; - ColumnLayout[ColumnLayout["first"] = 2] = "first"; - ColumnLayout[ColumnLayout["center"] = 3] = "center"; - ColumnLayout[ColumnLayout["middle"] = 4] = "middle"; - ColumnLayout[ColumnLayout["second"] = 5] = "second"; - ColumnLayout[ColumnLayout["right"] = 6] = "right"; - ColumnLayout[ColumnLayout["third"] = 7] = "third"; - ColumnLayout[ColumnLayout["last"] = 8] = "last"; -})(ColumnLayout || (ColumnLayout = {})); - -/* - * File: multi-column-markdown/src/MultiColumnParser.ts - * Created Date: Saturday, January 22nd 2022, 6:02:46 pm - * Author: Cameron Robinson - * - * Copyright (c) 2022 Cameron Robinson - */ -const START_REGEX_STRS = ["=== *start-multi-column", - "=== *multi-column-start"]; -const START_REGEX_ARR = []; -for (let i = 0; i < START_REGEX_STRS.length; i++) { - START_REGEX_ARR.push(new RegExp(START_REGEX_STRS[i])); -} -function findStartTag(text) { - let found = false; - let startPosition = -1; - for (let i = 0; i < START_REGEX_ARR.length; i++) { - if (START_REGEX_ARR[i].test(text)) { - found = true; - startPosition = text.search(START_REGEX_STRS[i]); - break; - } - } - return { found, startPosition }; -} -function containsStartTag(text) { - return findStartTag(text).found; -} -function isStartTagWithID(text) { - let startTagData = findStartTag(text); - if (startTagData.found === true) { - let key = getStartTagKey(text); - if (key === null || key === "") { - return { isStartTag: true, hasKey: false }; - } - return { isStartTag: true, hasKey: true }; - } - return { isStartTag: false, hasKey: false }; -} -const END_REGEX_STRS = ["=== *end-multi-column", - "=== *multi-column-end"]; -const END_REGEX_ARR = []; -for (let i = 0; i < END_REGEX_STRS.length; i++) { - END_REGEX_ARR.push(new RegExp(END_REGEX_STRS[i])); -} -function findEndTag(text) { - let found = false; - let startPosition = -1; - for (let i = 0; i < END_REGEX_ARR.length; i++) { - if (END_REGEX_ARR[i].test(text)) { - found = true; - startPosition = text.search(END_REGEX_STRS[i]); - break; - } - } - return { found, startPosition }; -} -function containsEndTag(text) { - return findEndTag(text).found; -} -const COL_REGEX_STRS = ["=== *column-end *===", - "=== *end-column *===", - "=== *column-break *===", - "=== *break-column *==="]; -const COL_REGEX_ARR = []; -for (let i = 0; i < COL_REGEX_STRS.length; i++) { - COL_REGEX_ARR.push(new RegExp(COL_REGEX_STRS[i])); -} -function containsColEndTag(text) { - let found = false; - for (let i = 0; i < COL_REGEX_ARR.length; i++) { - if (COL_REGEX_ARR[i].test(text)) { - found = true; - break; - } - } - return found; -} -const COL_SETTINGS_REGEX_STRS = ["```settings", - "```column-settings", - "```multi-column-settings"]; -const COL_SETTINGS_REGEX_ARR = []; -for (let i = 0; i < COL_SETTINGS_REGEX_STRS.length; i++) { - COL_SETTINGS_REGEX_ARR.push(new RegExp(COL_SETTINGS_REGEX_STRS[i])); -} -function containsColSettingsTag(text) { - let found = false; - for (let i = 0; i < COL_SETTINGS_REGEX_ARR.length; i++) { - if (COL_SETTINGS_REGEX_ARR[i].test(text)) { - found = true; - break; - } - } - return found; -} -function parseColumnSettings(settingsStr) { - // Set the minimum number of columnds to 2. - let numberOfColumns = 2; - let columnLayout = ColumnLayout.standard; - let borderDrawn = true; - let shadowDrawn = true; - let settingsLines = settingsStr.split("\n"); - for (let i = 0; i < settingsLines.length; i++) { - if (settingsLines[i].toLowerCase().replace(/\s/g, "").contains("numberofcolumns:")) { - let userDefNumberOfCols = parseInt(settingsLines[i].split(":")[1]); - if (Number.isNaN(userDefNumberOfCols) === false) { - if (userDefNumberOfCols === 3) { - numberOfColumns = 3; - } - else if (userDefNumberOfCols === 2) { - numberOfColumns = 2; - } - } - break; - } - } - for (let i = 0; i < settingsLines.length; i++) { - if (settingsLines[i].toLowerCase().replace(/\s/g, "").contains("largestcolumn:")) { - let setting = settingsLines[i].split(":")[1].trimStart().trimEnd().toLowerCase(); - let userDefLayout = ColumnLayout[setting]; - if (userDefLayout !== undefined) { - columnLayout = userDefLayout; - } - } - } - for (let i = 0; i < settingsLines.length; i++) { - if (settingsLines[i].toLowerCase().replace(/\s/g, "").contains("border:")) { - let setting = settingsLines[i].split(":")[1].trimStart().trimEnd().toLowerCase(); - let isBorderDrawn = BorderOption[setting]; - if (isBorderDrawn !== undefined) { - switch (isBorderDrawn) { - case (BorderOption.disabled): - case (BorderOption.off): - case (BorderOption.false): - borderDrawn = false; - break; - } - } - } - } - for (let i = 0; i < settingsLines.length; i++) { - if (settingsLines[i].toLowerCase().replace(/\s/g, "").contains("shadow:")) { - let setting = settingsLines[i].split(":")[1].trimStart().trimEnd().toLowerCase(); - let isShadowDrawn = ShadowOption[setting]; - if (isShadowDrawn !== undefined) { - switch (isShadowDrawn) { - case (ShadowOption.disabled): - case (ShadowOption.off): - case (ShadowOption.false): - shadowDrawn = false; - break; - } - } - } - } - let settings = { numberOfColumns, columnLayout, drawBorder: borderDrawn, drawShadow: shadowDrawn }; - return settings; -} -function countStartTags(text) { - let keys = []; - let startTagData = findStartTag(text); - while (startTagData.found) { - // Slice off everything before the tag - text = text.slice(startTagData.startPosition); - /** - * Get just the start tag line and then set text to everything just - * after the start tag. - */ - let tag = text.split("\n")[0]; - text = text.slice(1); // This moves the text 1 character so we dont match the same tag. - // Parse out the key and append to the list. - let key = getStartTagKey(tag); - if (key === null) { - key = ""; - } - keys.push(key); - // Search again for another tag before looping. - startTagData = findStartTag(text); - } - return { numberOfTags: keys.length, keys }; -} -/** - * This function will filter a set of strings, returning all items starting - * from the closest open start tag through the last item in the set. - * - * The function filters out all end tags to make sure that the start tag we - * find is the proper start tag for the list sent. - * @param linesAboveArray - * @returns - */ -function getStartBlockAboveLine(linesAboveArray) { - // Reduce the array down into a single string so that we can - // easily RegEx over the string and find the indicies we're looking for. - let linesAboveStr = linesAboveArray.reduce((prev, current) => { - return prev + "\n" + current; - }, ""); - /* - * First thing we need to do is check if there are any end tags in the - * set of strings (which logically would close start tags and therefore - * the start tag it closes is not what we want). If there are we want to - * slowly narrow down our set of strings until the last end tag is - * removed. This makes it easier to find the closest open start tag - * in the data. - */ - let endTagSerachData = findEndTag(linesAboveStr); - while (endTagSerachData.found === true) { - // Get the index of where the first regex match in the - // string is. then we slice from 0 to index off of the string - // split it by newline, cut off the first line (which actually - // contains the regex) then reduce back down to a single string. - // - // TODO: This could be simplified if we just slice the text after - // the end tag instead of the begining. - let indexOfRegex = endTagSerachData.startPosition; - linesAboveArray = linesAboveStr.slice(indexOfRegex).split("\n").splice(1); - linesAboveStr = linesAboveArray.reduce((prev, current) => { - return prev + "\n" + current; - }, ""); - endTagSerachData = findEndTag(linesAboveStr); - } - /** - * Now we have the set of lines after all other end tags. We now - * need to check if there is still a start tag left in the data. If - * there is no start tag then we want to return an empty array and empty - * key. - */ - let startBlockKey = ""; - let startTagSearchData = findStartTag(linesAboveStr); - if (startTagSearchData.found === false) { - return null; - } - else { - /** - * Now we know there is at least 1 start key left, however there - * may be multiple start keys if the user is not closing their - * blocks. We currently dont allow recusive splitting so we - * want to get the last key in our remaining set. Same idea as - * above. - */ - while (startTagSearchData.found === true) { - // Get the index of where the first regex match in the - // string is. then we slice from 0 to index off of the string - // split it by newline, cut off the first line (which actually - // contains the regex) then reduce back down to a single string. - // - // TODO: This could be simplified if we just slice the text after - // the end tag instead of the begining. - let startIndex = startTagSearchData.startPosition; - linesAboveArray = linesAboveStr.slice(startIndex).split("\n"); - let startTag = linesAboveArray[0]; - let key = getStartTagKey(startTag); - if (key !== null) { - startBlockKey = key; - } - linesAboveArray = linesAboveArray.splice(1); - linesAboveStr = linesAboveArray.reduce((prev, current) => { - return prev + "\n" + current; - }, ""); - startTagSearchData = findStartTag(linesAboveStr); - } - } - return { startBlockKey, linesAboveArray }; -} -function getEndBlockBelow(linesBelow) { - // Reduce the array down into a single string so that we can - // easily RegEx over the string and find the indicies we're looking for. - let linesBelowStr = linesBelow.reduce((prev, current) => { - return prev + "\n" + current; - }, ""); - let endTagSerachData = findEndTag(linesBelowStr); - let startTagSearchData = findStartTag(linesBelowStr); - let sliceEndIndex = -1; // If neither start or end found we return the entire array. - if (endTagSerachData.found === true && startTagSearchData.found === false) { - sliceEndIndex = endTagSerachData.startPosition; - } - else if (endTagSerachData.found === false && startTagSearchData.found === true) { - sliceEndIndex = startTagSearchData.startPosition; - } - else if (endTagSerachData.found === true && startTagSearchData.found === true) { - sliceEndIndex = endTagSerachData.startPosition; - if (startTagSearchData.startPosition < endTagSerachData.startPosition) { - /** - * If we found a start tag before an end tag we want to use the start tag - * our current block is not properly ended and we use the next start tag - * as our limit - */ - sliceEndIndex = startTagSearchData.startPosition; - } - } - return linesBelow.slice(0, sliceEndIndex); -} -function getStartTagKey(startTag) { - let keySplit = startTag.split(":"); - if (keySplit.length > 1) { - return keySplit[1].replace(" ", ""); - } - return null; -} - -/* - * Filename: multi-column-markdown/src/utilities/utils.ts - * Created Date: Tuesday, January 30th 2022, 4:02:19 pm - * Author: Cameron Robinson - * - * Copyright (c) 2022 Cameron Robinson - */ -function getUID(length = 10) { - if (length > 10) { - length = 10; - } - let UID = Math.random().toString(36).substring(2); - UID = UID.slice(0, length); - return UID; -} - -var ElementRenderType; -(function (ElementRenderType) { - ElementRenderType[ElementRenderType["undefined"] = 0] = "undefined"; - ElementRenderType[ElementRenderType["normalRender"] = 1] = "normalRender"; - ElementRenderType[ElementRenderType["specialRender"] = 2] = "specialRender"; -})(ElementRenderType || (ElementRenderType = {})); -function getElementRenderType(element) { - /** - * Look for specific kinds of elements by their CSS class names here. These - * are going to be brittle links as they rely on other plugin definitions but - * as this is only adding in extra compatability to the plugins defined here - * it should be ok. - * - * These may be classes on one of the simple elements (such as a paragraph) - * that we search for below so need to look for these first. - */ - if (hasDiceRoller(element) === true) { - return ElementRenderType.specialRender; - } - if (hasAdmonition(element) === true) { - return ElementRenderType.normalRender; - } - /** - * If we didnt find a special element we want to check for simple elements - * such as paragraphs or lists. In the current implementation we only set up - * the special case for "specialRender" elements so this *should* be saving - * some rendering time by setting these tags properly. - */ - if (hasParagraph(element) || - hasHeader(element) || - hasList(element)) { - return ElementRenderType.normalRender; - } - // If still nothing found we return other as the default response if nothing else found. - return ElementRenderType.specialRender; -} -function hasParagraph(element) { - return element.innerHTML.startsWith("
= 0; i--) {
- if (domList[i].nodeKey === prevObj.innerText) {
- addAtIndex = i + 1;
- break;
- }
- }
- }
- let nextElIndex = addAtIndex;
- if (nextObj !== undefined) {
- for (let i = addAtIndex; i < domList.length; i++) {
- if (domList[i].nodeKey === nextObj.innerText.trim()) {
- nextElIndex = i;
- break;
- }
- }
- }
- // console.log(" Prev: ", siblingsAbove.children[siblingsAbove.children.length - 1], "Adding: ", obj.element, " Next: ", siblingsBelow.children[0], "Overwriting:", domList.slice(addAtIndex, nextElIndex));
- domList.splice(addAtIndex, nextElIndex - addAtIndex, obj);
- domObjectMap.set(obj.UID, obj);
- // /**
- // * Make a copy of the list to log, only because
- // * console log updates its references with updates in memory.
- // */
- // let x = domList.slice(0);
- // console.log(x);
- return addAtIndex;
- }
- function removeObject(objectUID) {
- // /**
- // * Make a copy of the list to log
- // */
- // let x = domList.slice(0);
- // console.log(x);
- // Get the object by key, remove it from the map and then
- // from the list.
- let obj = domObjectMap.get(objectUID);
- domObjectMap.delete(objectUID);
- if (obj === undefined) {
- return;
- }
- if (domList.contains(obj)) {
- domList.remove(obj);
- }
- // If the object is a settings object we need to remove from the
- // settings list.
- if (obj.tag === DOMObjectTag.regionSettings) {
- let settingsObj = obj;
- if (regionSettings.contains(settingsObj)) {
- regionSettings.remove(settingsObj);
- }
- }
- if (domList.length === 0) {
- fileManager.removeRegion(regionKey);
- }
- // x = domList.slice(0);
- // console.log(x);
- }
- function updateElementTag(objectUID, newTag) {
- let obj = domObjectMap.get(objectUID);
- let index = domList.indexOf(obj);
- if (index !== -1) {
- domList[index].tag = newTag;
- }
- }
- function setElementToSettingsBlock(objectUID, settingsText) {
- let obj = domObjectMap.get(objectUID);
- let index = domList.indexOf(obj);
- if (index !== -1) {
- let settings = parseColumnSettings(settingsText);
- let regionSettingsObj = new DOMRegionSettingsObject(domList[index], settings);
- domObjectMap.set(regionSettingsObj.UID, regionSettingsObj);
- domList[index] = regionSettingsObj;
- regionSettings.push(regionSettingsObj);
- }
- }
- /**
- * Creates an object containing all necessary information for the region
- * to be rendered to the preview pane.
- *
- * @returns a MultiColumnRenderData object with the root DOM element, settings object, and
- * all child objects in the order they should be rendered.
- */
- function getRegionRenderData() {
- // Set defaults before attempting to get settings.
- let settings = { numberOfColumns: 2, columnLayout: ColumnLayout.standard, drawBorder: true, drawShadow: true };
- if (regionSettings.length > 0) {
- /**
- * Since we append settings onto the end of the array we want the last
- * item in the array as that would be the most recent settings we parsed.
- */
- settings = regionSettings[regionSettings.length - 1].regionSettings;
- }
- return {
- parentRenderElement: regionParent,
- parentRenderSettings: settings,
- domObjects: domList
- };
- }
- /**
- * This fuction is called when a start tag is removed from view meaning
- * our parent element storing the multi-column region is removed. It
- * removes the CSS class from all of the elements so they will be
- * re-rendered in the preview window.
- */
- function displayOriginalElements() {
- for (let i = 0; i < domList.length; i++) {
- if (domList[i].element) {
- domList[i].element.removeClasses([MultiColumnStyleCSS.RegionEndTag,
- MultiColumnStyleCSS.ColumnEndTag,
- MultiColumnStyleCSS.RegionSettings,
- MultiColumnStyleCSS.RegionContent]);
- if (domList[i].element.parentElement) {
- domList[i].element.parentElement.removeChild(domList[i].element);
- }
- }
- }
- for (let i = 0; i < regionSettings.length; i++) {
- if (regionSettings[i].element) {
- regionSettings[i].element.removeClasses([MultiColumnStyleCSS.RegionEndTag,
- MultiColumnStyleCSS.ColumnEndTag,
- MultiColumnStyleCSS.RegionSettings,
- MultiColumnStyleCSS.RegionContent]);
- if (regionSettings[i].element.parentElement) {
- regionSettings[i].element.parentElement.removeChild(regionSettings[i].element);
- }
- }
- }
- }
- function getRootRegionElement() {
- return rootElement;
- }
- return { addObject: addObject,
- removeObject: removeObject,
- updateElementTag: updateElementTag,
- setElementToSettingsBlock: setElementToSettingsBlock,
- getRegionRenderData: getRegionRenderData,
- displayOriginalElements: displayOriginalElements,
- getRootRegionElement: getRootRegionElement
- };
-}
-
-/*
- * File: multi-column-markdown/src/main.ts
- * Created Date: Tuesday, October 5th 2021, 1:09 pm
- * Author: Cameron Robinson
- *
- * Copyright (c) 2022 Cameron Robinson
- */
-class MultiColumnMarkdown extends obsidian.Plugin {
- constructor() {
- // settings: SplitColumnMarkdownSettings;
- super(...arguments);
- this.globalManager = new GlobalDOMManager();
- }
- onload() {
- return __awaiter(this, void 0, void 0, function* () {
- console.log("Loading multi-column markdown");
- this.setupMarkdownPostProcessor();
- //TODO: Set up this as a modal to set settings automatically
- this.addCommand({
- id: `insert-multi-column-region`,
- name: `Insert Multi-Column Region`,
- editorCallback: (editor, view) => {
- try {
- editor.getDoc().replaceSelection(`
-=== multi-column-start: ID_${getUID(4)}
-\`\`\`column-settings
-Number of Columns: 2
-Largest Column: standard
-\`\`\`
-
-=== end-column ===
-
-=== multi-column-end
-
-${editor.getDoc().getSelection()}`);
- }
- catch (e) {
- new obsidian.Notice("Encountered an error inserting a multi-column region. Please try again later.");
- }
- }
- });
- this.addCommand({
- id: `add-IDs-To-multi-column-region`,
- name: `Fix Missing IDs for Multi-Column Regions`,
- editorCallback: (editor, view) => {
- try {
- /**
- * Not sure if there is an easier way to do this.
- *
- * Get all of the lines of the document split by newlines.
- */
- let lines = editor.getRange({ line: 0, ch: 0 }, { line: editor.getDoc().lineCount(), ch: 0 }).split("\n");
- /**
- * Loop through all of the lines checking if the line is a
- * start tag and if so is it missing an ID.
- */
- let linesWithoutIDs = [];
- let textWithoutIDs = [];
- for (let i = 0; i < lines.length; i++) {
- let data = isStartTagWithID(lines[i]);
- if (data.isStartTag === true && data.hasKey === false) {
- linesWithoutIDs.push(i);
- textWithoutIDs.push(lines[i]);
- }
- }
- if (linesWithoutIDs.length === 0) {
- new obsidian.Notice("Found 0 missing IDs in the current document.");
- return;
- }
- /**
- * Now loop through each line that is missing an ID and
- * generate a random ID and replace the original text.
- */
- for (let i = 0; i < linesWithoutIDs.length; i++) {
- let originalText = textWithoutIDs[i];
- let text = originalText;
- text = text.trimEnd();
- if (text.charAt(text.length - 1) === ":") {
- text = text.slice(0, text.length - 1);
- }
- text = `${text}: ID_${getUID(4)}`;
- editor.replaceRange(text, { line: linesWithoutIDs[i], ch: 0 }, { line: linesWithoutIDs[i], ch: originalText.length });
- }
- new obsidian.Notice(`Replaced ${linesWithoutIDs.length} missing ID(s) in the current document.`);
- }
- catch (e) {
- new obsidian.Notice("Encountered an error addign IDs to multi-column regions. Please try again later.");
- }
- }
- });
- this.registerInterval(window.setInterval(() => {
- this.UpdateOpenFilePreviews();
- }, 2000));
- });
- }
- UpdateOpenFilePreviews() {
- let fileManagers = this.globalManager.getAllFileManagers();
- fileManagers.forEach(element => {
- let regionalManagers = element.getAllRegionalManagers();
- regionalManagers.forEach(regionManager => {
- let parentElementData = regionManager.getRegionRenderData();
- this.updateRenderedMarkdown(parentElementData.domObjects);
- });
- });
- }
- setupMarkdownPostProcessor() {
- this.registerMarkdownPostProcessor((el, ctx) => __awaiter(this, void 0, void 0, function* () {
- // Get the info for our current context and then check
- // if the entire text contains a start tag. If there is
- // no start tag in the document we can just return and
- // ignore the rest of the parsing.
- let info = ctx.getSectionInfo(el);
- /**
- * We need the context info to properly parse so returning here
- * info is null. TODO: Set error in view if this occurs.
- */
- if (!info) {
- return;
- }
- const sourcePath = ctx.sourcePath;
- let fileDOMManager = this.globalManager.getFileManager(sourcePath);
- if (fileDOMManager === null) {
- console.log("Found null DOM manager. Could not process multi-column markdown.");
- return;
- }
- /**
- * If we encounter a start tag on the document we set the flag to start
- * parsing the rest of the document.
- */
- if (containsStartTag(el.textContent)) {
- fileDOMManager.setHasStartTag();
- }
- /**
- * If the document does not contain any start tags we ignore the
- * rest of the parsing. This is only set to true once the first
- * start tag element is parsed above.
- */
- if (fileDOMManager.getHasStartTag() === false) {
- return;
- }
- /**
- * Take the info provided and generate the required variables from
- * the line start and end values.
- */
- let docLines = info.text.split("\n");
- let linesAboveArray = docLines.slice(0, info.lineStart);
- let linesOfElement = docLines.slice(info.lineStart, info.lineEnd + 1);
- let linesBelowArray = docLines.slice(info.lineEnd + 1);
- /**
- * If the current line is a start tag we want to set up the
- * region manager. The regional manager takes care
- * of all items between it's start and end tags while the
- * file manager we got above above takes care of all regional
- * managers in each file.
- */
- let elementTextSpaced = linesOfElement.reduce((prev, curr) => {
- return prev + "\n" + curr;
- });
- if (containsStartTag(el.textContent)) {
- /**
- * Set up the current element to act as the parent for the
- * multi-column region.
- */
- el.children[0].detach();
- el.classList.add(MultiColumnLayoutCSS.RegionRootContainerDiv);
- let renderErrorRegion = el.createDiv({
- cls: `${MultiColumnLayoutCSS.RegionErrorContainerDiv}, ${MultiColumnStyleCSS.RegionErrorMessage}`,
- });
- let renderColumnRegion = el.createDiv({
- cls: MultiColumnLayoutCSS.RegionContentContainerDiv
- });
- let startBlockData = getStartBlockAboveLine(linesOfElement);
- let regionKey = startBlockData.startBlockKey;
- if (fileDOMManager.checkKeyExists(regionKey) === true) {
- let { numberOfTags, keys } = countStartTags(info.text);
- let numMatches = 0;
- for (let i = 0; i < numberOfTags; i++) {
- // Because we checked if key exists one of these has to match.
- if (keys[i] === regionKey) {
- numMatches++;
- }
- }
- // We only want to display an error if there are more than 2 of the same id across
- // the whole document. This prevents erros when obsidian reloads the whole document
- // and there are two of the same key in the map.
- if (numMatches >= 2) {
- if (regionKey === "") {
- renderErrorRegion.innerText = "Found multiple regions with empty IDs. Please set a unique ID after each start tag.\nEG: '=== multi-column-start: randomID'\nOr use 'Fix Missing IDs' in the command palette and reload the document.";
- }
- else {
- renderErrorRegion.innerText = "Region ID already exists in document, please set a unique ID.\nEG: '=== multi-column-start: randomID'";
- }
- return;
- }
- }
- el.id = `MultiColumnID:${regionKey}`;
- let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(el);
- fileDOMManager.createRegionalManager(regionKey, el, renderErrorRegion, renderColumnRegion);
- elementMarkdownRenderer.onunload = () => {
- if (fileDOMManager) {
- fileDOMManager.removeRegion(startBlockData.startBlockKey);
- }
- };
- ctx.addChild(elementMarkdownRenderer);
- /**
- * Now we have created our regional manager and defined what elements
- * need to be rendered into. So we can return without any more processing.
- */
- return;
- }
- /**
- * Check if any of the lines above us contain a start block, and if
- * so get the lines from our current element to the start block.
- */
- let startBockAbove = getStartBlockAboveLine(linesAboveArray);
- if (startBockAbove === null) {
- return;
- }
- /**
- * We now know we're within a multi-column region, so we update our
- * list of lines above to just be the items within this region.
- */
- linesAboveArray = startBockAbove.linesAboveArray;
- /**
- * We use the start block's key to get our regional manager. If this
- * lookup fails we can not continue processing this element.
- */
- let regionalManager = fileDOMManager.getRegionalManager(startBockAbove.startBlockKey);
- if (regionalManager === null) {
- return;
- }
- /**
- * To make sure we're placing the item in the right location (and
- * overwrite elements that are now gone) we now want all of the
- * lines after this element up to the end tag.
- */
- linesBelowArray = getEndBlockBelow(linesBelowArray);
- /**
- * Now we take the lines above our current element up until the
- * start region tag and render that into an HTML element. We will
- * use these elements to determine where to place our current element.
- */
- let siblingsAbove = renderMarkdownFromLines(linesAboveArray, sourcePath);
- let siblingsBelow = renderMarkdownFromLines(linesBelowArray, sourcePath);
- /**
- * Set up our dom object to be added to the manager.
- */
- let currentObject = new DOMObject(el);
- el.id = currentObject.UID;
- /**
- * Now we add the object to the manager and then setup the
- * callback for when the object is removed from view that will remove
- * the item from the manager.
- */
- regionalManager.addObject(siblingsAbove, siblingsBelow, currentObject);
- let elementMarkdownRenderer = new obsidian.MarkdownRenderChild(el);
- elementMarkdownRenderer.onunload = () => {
- if (regionalManager) {
- // We can attempt to update the view here after the item is removed
- // but need to get the item's parent element before removing object from manager.
- let regionRenderData = regionalManager.getRegionRenderData();
- regionalManager.removeObject(currentObject.UID);
- /**
- * Need to check here if element is null as this closure will be called
- * repeatedly on file change.
- */
- if (regionRenderData.parentRenderElement === null) {
- return;
- }
- this.renderColumnMarkdown(regionRenderData.parentRenderElement, regionRenderData.domObjects, regionRenderData.parentRenderSettings);
- }
- };
- ctx.addChild(elementMarkdownRenderer);
- /**
- * Now we check if our current element is a special flag so we can
- * properly set the element tag within the regional manager.
- */
- if (containsEndTag(el.textContent) === true) {
- el.addClass(MultiColumnStyleCSS.RegionEndTag);
- regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.endRegion);
- }
- else if (containsColEndTag(elementTextSpaced) === true) {
- el.addClass(MultiColumnStyleCSS.ColumnEndTag);
- regionalManager.updateElementTag(currentObject.UID, DOMObjectTag.columnBreak);
- }
- else if (containsColSettingsTag(elementTextSpaced) === true) {
- el.addClass(MultiColumnStyleCSS.RegionSettings);
- regionalManager.setElementToSettingsBlock(currentObject.UID, elementTextSpaced);
- }
- else {
- el.addClass(MultiColumnStyleCSS.RegionContent);
- }
- /**
- * Use our regional manager to get everything needed to render the region.
- */
- let parentElementData = regionalManager.getRegionRenderData();
- this.renderColumnMarkdown(parentElementData.parentRenderElement, parentElementData.domObjects, parentElementData.parentRenderSettings);
- return;
- }));
- }
- /**
- * This function takes in the data for the multi-column region and sets up the
- * user defined number of children with the proper css classes to be rendered properly.
- *
- * @param parentElement The element that the multi-column region will be rendered under.
- * @param regionElements The list of DOM objects that will be coppied under the parent object
- * @param settings The settings the user has defined for the region.
- */
- renderColumnMarkdown(parentElement, regionElements, settings) {
- let multiColumnParent = createDiv({
- cls: MultiColumnLayoutCSS.RegionColumnContainerDiv,
- });
- if (settings.drawShadow === true) {
- multiColumnParent.addClass(MultiColumnStyleCSS.RegionShadow);
- }
- /**
- * Pass our parent div and settings to parser to create the required
- * column divs as children of the parent.
- */
- let columnContentDivs = getColumnContentDivs(settings, multiColumnParent);
- for (let i = 0; i < columnContentDivs.length; i++) {
- if (settings.drawBorder === true) {
- columnContentDivs[i].addClass(MultiColumnStyleCSS.ColumnBorder);
- }
- if (settings.drawShadow === true) {
- columnContentDivs[i].addClass(MultiColumnStyleCSS.ColumnShadow);
- }
- }
- // Create markdown renderer to parse the passed markdown
- // between the tags.
- let markdownRenderChild = new obsidian.MarkdownRenderChild(multiColumnParent);
- // Remove every other child from the parent so
- // we dont end up with multiple sets of data. This should
- // really only need to loop once for i = 0 but loop just
- // in case.
- for (let i = parentElement.children.length - 1; i >= 0; i--) {
- parentElement.children[i].detach();
- }
- parentElement.appendChild(markdownRenderChild.containerEl);
- let columnIndex = 0;
- for (let i = 0; i < regionElements.length; i++) {
- if (regionElements[i].tag !== DOMObjectTag.startRegion ||
- regionElements[i].tag !== DOMObjectTag.regionSettings ||
- regionElements[i].tag !== DOMObjectTag.endRegion ||
- regionElements[i].tag !== DOMObjectTag.columnBreak) {
- // We store the elements in a wrapper container until we determine
- let element = createDiv({
- cls: MultiColumnLayoutCSS.ColumnDualElementContainer,
- });
- regionElements[i].elementContainer = element;
- // Otherwise we just make a copy of the original element to display.
- element.appendChild(regionElements[i].element.cloneNode(true));
- if (element !== null) {
- columnContentDivs[columnIndex].appendChild(element);
- }
- /**
- * If the tag is a column break we update the column index after
- * appending the item to the column div. This keeps the main DOM
- * cleaner by removing other items and placing them all within
- * a region container.
- */
- if (regionElements[i].tag === DOMObjectTag.columnBreak &&
- (columnIndex + 1) < settings.numberOfColumns) {
- columnIndex++;
- }
- }
- }
- }
- setUpDualRender(domElement) {
- /**
- * If our element is of "specialRender" type it *may* need to be rendered
- * using the original element rather than a copy. For example, an element
- * may have an onClick event that would not get coppied to the clone.
- *
- * If we just moved these elements into the region it would get
- * moved back out into the original location in the DOM by obsidian
- * when scrolling or when the file is updated. On the next refresh it
- * would be moved back but that can lead to a region jumping
- * around as the item is moved in and out.
- *
- * Here we set up the div to contain the element and create
- * a visual only clone of it. The clone will only be visible
- * when the original is not in the multi-column region so it
- * saves us from the visual noise of the region jumping around.
- */
- // Remove the old elements before we set up the dual rendered elements.
- let containerElement = domElement.elementContainer;
- let renderElement = domElement.element;
- for (let i = containerElement.children.length - 1; i >= 0; i--) {
- containerElement.children[i].detach();
- }
- containerElement.appendChild(renderElement);
- renderElement.addClass(MultiColumnLayoutCSS.OriginalElementType);
- let clonedNode = renderElement.cloneNode(true);
- clonedNode.addClass(MultiColumnLayoutCSS.ClonedElementType);
- clonedNode.removeClasses([MultiColumnStyleCSS.RegionContent, MultiColumnLayoutCSS.OriginalElementType]);
- containerElement.appendChild(clonedNode);
- }
- updateRenderedMarkdown(regionElements) {
- /**
- * Go through every node of the region looking for the "specialRender" type
- * which are the elements that may need to be rendered using the original
- * element rather than a copy.
- */
- for (let i = 0; i < regionElements.length; i++) {
- /**
- * Here we check every item again to see if they need to be updated.
- * This could be made slightly more efficient if we can truly determine
- * wether an item is a normal render item, however it seems like it
- * may take a bit of extra time in order for the classes we check for
- * to be added to the elements.
- */
- let elementType = regionElements[i].elementType;
- // If the element is not currently a special render element we check again
- // as the original element may have been updated.
- if (elementType !== ElementRenderType.specialRender) {
- // If the new result returns as a special renderer we update so
- // this wont run again for this item.
- elementType = getElementRenderType(regionElements[i].element);
- }
- if (elementType === ElementRenderType.specialRender) {
- regionElements[i].elementType = elementType;
- this.setUpDualRender(regionElements[i]);
- }
- }
- }
-}
-/**
- * Sets up the CSS classes and the number of columns based on the passed settings.
- * @param settings The user defined settings that determine what CSS is set here.
- * @param multiColumnParent The parent object that the column divs will be created under.
- * @returns The list of column divs created under the passed parent element.
- */
-function getColumnContentDivs(settings, multiColumnParent) {
- let columnContentDivs = [];
- if (settings.numberOfColumns === 2) {
- switch (settings.columnLayout) {
- case (ColumnLayout.standard):
- case (ColumnLayout.middle):
- case (ColumnLayout.center):
- case (ColumnLayout.third):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoEqualColumns_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoEqualColumns_Right`
- }));
- break;
- case (ColumnLayout.left):
- case (ColumnLayout.first):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoColumnsHeavyLeft_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoColumnsHeavyLeft_Right`
- }));
- break;
- case (ColumnLayout.right):
- case (ColumnLayout.second):
- case (ColumnLayout.last):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoColumnsHeavyRight_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent twoColumnsHeavyRight_Right`
- }));
- break;
- }
- }
- else if (settings.numberOfColumns === 3) {
- switch (settings.columnLayout) {
- case (ColumnLayout.standard):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threeEqualColumns_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threeEqualColumns_Middle`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threeEqualColumns_Right`
- }));
- break;
- case (ColumnLayout.left):
- case (ColumnLayout.first):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyLeft_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyLeft_Middle`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyLeft_Right`
- }));
- break;
- case (ColumnLayout.middle):
- case (ColumnLayout.center):
- case (ColumnLayout.second):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyMiddle_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyMiddle_Middle`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyMiddle_Right`
- }));
- break;
- case (ColumnLayout.right):
- case (ColumnLayout.third):
- case (ColumnLayout.last):
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyRight_Left`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyRight_Middle`
- }));
- columnContentDivs.push(multiColumnParent.createDiv({
- cls: `columnContent threColumnsHeavyRight_Right`
- }));
- break;
- }
- }
- return columnContentDivs;
-}
-function renderMarkdownFromLines(mdLines, sourcePath) {
- /**
- * We re-render all of the items above our element, until the start tag,
- * so we can determine where to place the new item in the manager.
- *
- * TODO: Can reduce the amount needing to be rendered by only rendering to
- * the start tag or a column-break whichever is closer.
- */
- let siblings = createDiv();
- let markdownRenderChild = new obsidian.MarkdownRenderChild(siblings);
- obsidian.MarkdownRenderer.renderMarkdown(mdLines.reduce((prev, current) => {
- return prev + "\n" + current;
- }, ""), siblings, sourcePath, markdownRenderChild);
- return siblings;
-}
-
-module.exports = MultiColumnMarkdown;
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9yZWdpb25TZXR0aW5ncy50cyIsInNyYy91dGlsaXRpZXMvdGV4dFBhcnNlci50cyIsInNyYy91dGlsaXRpZXMvdXRpbHMudHMiLCJzcmMvdXRpbGl0aWVzL2VsZW1lbnRSZW5kZXJUeXBlUGFyc2VyLnRzIiwic3JjL2RvbV9tYW5hZ2VyL2RvbU9iamVjdC50cyIsInNyYy91dGlsaXRpZXMvY3NzRGVmaW5pdGlvbnMudHMiLCJzcmMvZG9tX21hbmFnZXIvZG9tTWFuYWdlci50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiLypcbiAqIEZpbGVuYW1lOiBtdWx0aS1jb2x1bW4tbWFya2Rvd24vc3JjL3JlZ2lvblNldHRpbmdzLnRzXG4gKiBDcmVhdGVkIERhdGU6IFR1ZXNkYXksIEZlYnJ1YXJ5IDFzdCAyMDIyLCAxMjoyMzo1MyBwbVxuICogQXV0aG9yOiBDYW1lcm9uIFJvYmluc29uXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAyMiBDYW1lcm9uIFJvYmluc29uXG4gKi9cblxuZXhwb3J0IGVudW0gQm9yZGVyT3B0aW9uIHtcbiAgICBlbmFibGVkLFxuICAgIG9uLFxuICAgIHRydWUsXG4gICAgZGlzYWJsZWQsXG4gICAgb2ZmLFxuICAgIGZhbHNlXG59XG5cbmV4cG9ydCBlbnVtIFNoYWRvd09wdGlvbiB7XG4gICAgZW5hYmxlZCxcbiAgICBvbixcbiAgICB0cnVlLFxuICAgIGRpc2FibGVkLFxuICAgIG9mZixcbiAgICBmYWxzZVxufVxuXG5leHBvcnQgZW51bSBDb2x1bW5MYXlvdXQgeyBcbiAgICBzdGFuZGFyZCxcbiAgICBsZWZ0LFxuICAgIGZpcnN0LFxuICAgIGNlbnRlcixcbiAgICBtaWRkbGUsXG4gICAgc2Vjb25kLFxuICAgIHJpZ2h0LFxuICAgIHRoaXJkLFxuICAgIGxhc3Rcbn07XG5cbmV4cG9ydCB0eXBlIE11bHRpQ29sdW1uU2V0dGluZ3MgPSB7XG4gICAgbnVtYmVyT2ZDb2x1bW5zOiBudW1iZXIsXG4gICAgY29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQsXG4gICAgZHJhd0JvcmRlcjogYm9vbGVhbixcbiAgICBkcmF3U2hhZG93OiBib29sZWFuXG59IiwiLypcbiAqIEZpbGU6IG11bHRpLWNvbHVtbi1tYXJrZG93bi9zcmMvTXVsdGlDb2x1bW5QYXJzZXIudHNcbiAqIENyZWF0ZWQgRGF0ZTogU2F0dXJkYXksIEphbnVhcnkgMjJuZCAyMDIyLCA2OjAyOjQ2IHBtXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb25cbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDIyIENhbWVyb24gUm9iaW5zb25cbiAqL1xuXG5pbXBvcnQgeyBNdWx0aUNvbHVtblNldHRpbmdzLCBDb2x1bW5MYXlvdXQsIEJvcmRlck9wdGlvbiwgU2hhZG93T3B0aW9uIH0gZnJvbSBcIi4uL3JlZ2lvblNldHRpbmdzXCI7XG5cbmNvbnN0IFNUQVJUX1JFR0VYX1NUUlMgPSBbXCI9PT0gKnN0YXJ0LW11bHRpLWNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj09PSAqbXVsdGktY29sdW1uLXN0YXJ0XCJdXG5jb25zdCBTVEFSVF9SRUdFWF9BUlI6IFJlZ0V4cFtdID0gW107XG5mb3IobGV0IGkgPSAwOyBpIDwgU1RBUlRfUkVHRVhfU1RSUy5sZW5ndGg7IGkrKykge1xuICAgIFNUQVJUX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoU1RBUlRfUkVHRVhfU1RSU1tpXSkpO1xufVxuZnVuY3Rpb24gZmluZFN0YXJ0VGFnKHRleHQ6IHN0cmluZyk6IHsgZm91bmQ6IGJvb2xlYW4sIHN0YXJ0UG9zaXRpb246IG51bWJlciB9IHtcblxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvc2l0aW9uID0gLTE7XG4gICAgZm9yKGxldCBpID0gMDsgaTwgU1RBUlRfUkVHRVhfQVJSLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgaWYoU1RBUlRfUkVHRVhfQVJSW2ldLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSB0ZXh0LnNlYXJjaChTVEFSVF9SRUdFWF9TVFJTW2ldKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBmb3VuZCwgc3RhcnRQb3NpdGlvbiB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zU3RhcnRUYWcodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpbmRTdGFydFRhZyh0ZXh0KS5mb3VuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGFydFRhZ1dpdGhJRCh0ZXh0OiBzdHJpbmcpOiB7aXNTdGFydFRhZzogYm9vbGVhbiwgaGFzS2V5OiBib29sZWFufSB7XG5cbiAgICBsZXQgc3RhcnRUYWdEYXRhID0gZmluZFN0YXJ0VGFnKHRleHQpO1xuICAgIGlmKHN0YXJ0VGFnRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgIGxldCBrZXkgPSBnZXRTdGFydFRhZ0tleSh0ZXh0KVxuICAgICAgICBpZihrZXkgPT09IG51bGwgfHwga2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge2lzU3RhcnRUYWc6IHRydWUsIGhhc0tleTogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7aXNTdGFydFRhZzogdHJ1ZSwgaGFzS2V5OiB0cnVlfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2lzU3RhcnRUYWc6IGZhbHNlLCBoYXNLZXk6IGZhbHNlfTtcbn1cblxuY29uc3QgRU5EX1JFR0VYX1NUUlMgPSBbXCI9PT0gKmVuZC1tdWx0aS1jb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPT09ICptdWx0aS1jb2x1bW4tZW5kXCJdXG5jb25zdCBFTkRfUkVHRVhfQVJSOiBSZWdFeHBbXSA9IFtdO1xuZm9yKGxldCBpID0gMDsgaSA8IEVORF9SRUdFWF9TVFJTLmxlbmd0aDsgaSsrKSB7XG4gICAgRU5EX1JFR0VYX0FSUi5wdXNoKG5ldyBSZWdFeHAoRU5EX1JFR0VYX1NUUlNbaV0pKTtcbn1cbmZ1bmN0aW9uIGZpbmRFbmRUYWcodGV4dDogc3RyaW5nKTogeyBmb3VuZDogYm9vbGVhbiwgc3RhcnRQb3NpdGlvbjogbnVtYmVyIH0ge1xuXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0UG9zaXRpb24gPSAtMTtcbiAgICBmb3IobGV0IGkgPSAwOyBpPCBFTkRfUkVHRVhfQVJSLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgaWYoRU5EX1JFR0VYX0FSUltpXS50ZXN0KHRleHQpKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gdGV4dC5zZWFyY2goRU5EX1JFR0VYX1NUUlNbaV0pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGZvdW5kLCBzdGFydFBvc2l0aW9uIH07XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNFbmRUYWcodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpbmRFbmRUYWcodGV4dCkuZm91bmRcbn1cblxuY29uc3QgQ09MX1JFR0VYX1NUUlM6IHN0cmluZ1tdID0gW1wiPT09ICpjb2x1bW4tZW5kICo9PT1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj09PSAqZW5kLWNvbHVtbiAqPT09XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9PT0gKmNvbHVtbi1icmVhayAqPT09XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9PT0gKmJyZWFrLWNvbHVtbiAqPT09XCJdO1xuY29uc3QgQ09MX1JFR0VYX0FSUjogUmVnRXhwW10gPSBbXTtcbmZvcihsZXQgaSA9IDA7IGkgPCBDT0xfUkVHRVhfU1RSUy5sZW5ndGg7IGkrKykge1xuICAgIENPTF9SRUdFWF9BUlIucHVzaChuZXcgUmVnRXhwKENPTF9SRUdFWF9TVFJTW2ldKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNDb2xFbmRUYWcodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IobGV0IGkgPSAwOyBpPCBDT0xfUkVHRVhfQVJSLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgaWYoQ09MX1JFR0VYX0FSUltpXS50ZXN0KHRleHQpKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuY29uc3QgQ09MX1NFVFRJTkdTX1JFR0VYX1NUUlMgPSBbXCJgYGBzZXR0aW5nc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJgYGBjb2x1bW4tc2V0dGluZ3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYGBgbXVsdGktY29sdW1uLXNldHRpbmdzXCJdO1xuY29uc3QgQ09MX1NFVFRJTkdTX1JFR0VYX0FSUjogUmVnRXhwW10gPSBbXTtcbmZvcihsZXQgaSA9IDA7IGkgPCBDT0xfU0VUVElOR1NfUkVHRVhfU1RSUy5sZW5ndGg7IGkrKykge1xuICAgIENPTF9TRVRUSU5HU19SRUdFWF9BUlIucHVzaChuZXcgUmVnRXhwKENPTF9TRVRUSU5HU19SRUdFWF9TVFJTW2ldKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNDb2xTZXR0aW5nc1RhZyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvcihsZXQgaSA9IDA7IGk8IENPTF9TRVRUSU5HU19SRUdFWF9BUlIubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICBpZihDT0xfU0VUVElOR1NfUkVHRVhfQVJSW2ldLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2x1bW5TZXR0aW5ncyhzZXR0aW5nc1N0cjogc3RyaW5nKTogTXVsdGlDb2x1bW5TZXR0aW5ncyB7XG5cbiAgICAvLyBTZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNvbHVtbmRzIHRvIDIuXG4gICAgbGV0IG51bWJlck9mQ29sdW1ucyA9IDI7XG4gICAgbGV0IGNvbHVtbkxheW91dDogQ29sdW1uTGF5b3V0ID0gQ29sdW1uTGF5b3V0LnN0YW5kYXJkXG4gICAgbGV0IGJvcmRlckRyYXduOiBib29sZWFuID0gdHJ1ZTtcbiAgICBsZXQgc2hhZG93RHJhd246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgbGV0IHNldHRpbmdzTGluZXMgPSBzZXR0aW5nc1N0ci5zcGxpdChcIlxcblwiKTtcblxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzZXR0aW5nc0xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmKHNldHRpbmdzTGluZXNbaV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgXCJcIikuY29udGFpbnMoXCJudW1iZXJvZmNvbHVtbnM6XCIpKSB7XG4gICAgICAgICAgICBsZXQgdXNlckRlZk51bWJlck9mQ29scyA9IHBhcnNlSW50KHNldHRpbmdzTGluZXNbaV0uc3BsaXQoXCI6XCIpWzFdKVxuXG4gICAgICAgICAgICBpZihOdW1iZXIuaXNOYU4odXNlckRlZk51bWJlck9mQ29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYodXNlckRlZk51bWJlck9mQ29scyA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNvbHVtbnMgPSAzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYodXNlckRlZk51bWJlck9mQ29scyA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNvbHVtbnMgPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZihzZXR0aW5nc0xpbmVzW2ldLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpLmNvbnRhaW5zKFwibGFyZ2VzdGNvbHVtbjpcIikpIHtcblxuICAgICAgICAgICAgbGV0IHNldHRpbmcgPSBzZXR0aW5nc0xpbmVzW2ldLnNwbGl0KFwiOlwiKVsxXS50cmltU3RhcnQoKS50cmltRW5kKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGxldCB1c2VyRGVmTGF5b3V0OiBDb2x1bW5MYXlvdXQgPSAoPGFueT5Db2x1bW5MYXlvdXQpW3NldHRpbmddXG5cbiAgICAgICAgICAgIGlmKHVzZXJEZWZMYXlvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkxheW91dCA9IHVzZXJEZWZMYXlvdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZihzZXR0aW5nc0xpbmVzW2ldLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpLmNvbnRhaW5zKFwiYm9yZGVyOlwiKSkge1xuXG4gICAgICAgICAgICBsZXQgc2V0dGluZyA9IHNldHRpbmdzTGluZXNbaV0uc3BsaXQoXCI6XCIpWzFdLnRyaW1TdGFydCgpLnRyaW1FbmQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlzQm9yZGVyRHJhd246IEJvcmRlck9wdGlvbiA9ICg8YW55PkJvcmRlck9wdGlvbilbc2V0dGluZ11cblxuICAgICAgICAgICAgaWYoaXNCb3JkZXJEcmF3biAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoKGlzQm9yZGVyRHJhd24pe1xuICAgICAgICAgICAgICAgICAgICBjYXNlKEJvcmRlck9wdGlvbi5kaXNhYmxlZCk6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UoQm9yZGVyT3B0aW9uLm9mZik6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UoQm9yZGVyT3B0aW9uLmZhbHNlKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckRyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZihzZXR0aW5nc0xpbmVzW2ldLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpLmNvbnRhaW5zKFwic2hhZG93OlwiKSkge1xuXG4gICAgICAgICAgICBsZXQgc2V0dGluZyA9IHNldHRpbmdzTGluZXNbaV0uc3BsaXQoXCI6XCIpWzFdLnRyaW1TdGFydCgpLnRyaW1FbmQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlzU2hhZG93RHJhd246IFNoYWRvd09wdGlvbiA9ICg8YW55PlNoYWRvd09wdGlvbilbc2V0dGluZ11cblxuICAgICAgICAgICAgaWYoaXNTaGFkb3dEcmF3biAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoKGlzU2hhZG93RHJhd24pe1xuICAgICAgICAgICAgICAgICAgICBjYXNlKFNoYWRvd09wdGlvbi5kaXNhYmxlZCk6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UoU2hhZG93T3B0aW9uLm9mZik6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UoU2hhZG93T3B0aW9uLmZhbHNlKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvd0RyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7IG51bWJlck9mQ29sdW1ucywgY29sdW1uTGF5b3V0LCBkcmF3Qm9yZGVyOiBib3JkZXJEcmF3biwgZHJhd1NoYWRvdzogc2hhZG93RHJhd24gfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY291bnRTdGFydFRhZ3ModGV4dDogc3RyaW5nKTogeyBudW1iZXJPZlRhZ3M6IG51bWJlciwga2V5czogc3RyaW5nW10gfSB7XG5cbiAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhcnRUYWdEYXRhID0gZmluZFN0YXJ0VGFnKHRleHQpO1xuICAgIHdoaWxlKHN0YXJ0VGFnRGF0YS5mb3VuZCkge1xuICAgICAgICBcbiAgICAgICAgLy8gU2xpY2Ugb2ZmIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSB0YWdcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2Uoc3RhcnRUYWdEYXRhLnN0YXJ0UG9zaXRpb24pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQganVzdCB0aGUgc3RhcnQgdGFnIGxpbmUgYW5kIHRoZW4gc2V0IHRleHQgdG8gZXZlcnl0aGluZyBqdXN0XG4gICAgICAgICAqIGFmdGVyIHRoZSBzdGFydCB0YWcuXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgdGFnID0gdGV4dC5zcGxpdChcIlxcblwiKVswXTtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSk7IC8vIFRoaXMgbW92ZXMgdGhlIHRleHQgMSBjaGFyYWN0ZXIgc28gd2UgZG9udCBtYXRjaCB0aGUgc2FtZSB0YWcuXG5cbiAgICAgICAgLy8gUGFyc2Ugb3V0IHRoZSBrZXkgYW5kIGFwcGVuZCB0byB0aGUgbGlzdC5cbiAgICAgICAgbGV0IGtleSA9IGdldFN0YXJ0VGFnS2V5KHRhZyk7XG4gICAgICAgIGlmKGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAga2V5ID0gXCJcIlxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuXG4gICAgICAgIC8vIFNlYXJjaCBhZ2FpbiBmb3IgYW5vdGhlciB0YWcgYmVmb3JlIGxvb3BpbmcuXG4gICAgICAgIHN0YXJ0VGFnRGF0YSA9IGZpbmRTdGFydFRhZyh0ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBudW1iZXJPZlRhZ3M6IGtleXMubGVuZ3RoLCBrZXlzIH07XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGZpbHRlciBhIHNldCBvZiBzdHJpbmdzLCByZXR1cm5pbmcgYWxsIGl0ZW1zIHN0YXJ0aW5nXG4gKiBmcm9tIHRoZSBjbG9zZXN0IG9wZW4gc3RhcnQgdGFnIHRocm91Z2ggdGhlIGxhc3QgaXRlbSBpbiB0aGUgc2V0LiBcbiAqIFxuICogVGhlIGZ1bmN0aW9uIGZpbHRlcnMgb3V0IGFsbCBlbmQgdGFncyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhcnQgdGFnIHdlIFxuICogZmluZCBpcyB0aGUgcHJvcGVyIHN0YXJ0IHRhZyBmb3IgdGhlIGxpc3Qgc2VudC4gXG4gKiBAcGFyYW0gbGluZXNBYm92ZUFycmF5IFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFydEJsb2NrQWJvdmVMaW5lKGxpbmVzQWJvdmVBcnJheTogc3RyaW5nW10pOiB7IHN0YXJ0QmxvY2tLZXk6IHN0cmluZywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzQWJvdmVBcnJheTogc3RyaW5nW10gfSB8IG51bGwge1xuXG4gICAgLy8gUmVkdWNlIHRoZSBhcnJheSBkb3duIGludG8gYSBzaW5nbGUgc3RyaW5nIHNvIHRoYXQgd2UgY2FuXG4gICAgLy8gZWFzaWx5IFJlZ0V4IG92ZXIgdGhlIHN0cmluZyBhbmQgZmluZCB0aGUgaW5kaWNpZXMgd2UncmUgbG9va2luZyBmb3IuXG4gICAgbGV0IGxpbmVzQWJvdmVTdHIgPSBsaW5lc0Fib3ZlQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xuICAgIH0sIFwiXCIpO1xuXG4gICAgLypcbiAgICAgICAgKiBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZW5kIHRhZ3MgaW4gdGhlXG4gICAgICAgICogc2V0IG9mIHN0cmluZ3MgKHdoaWNoIGxvZ2ljYWxseSB3b3VsZCBjbG9zZSBzdGFydCB0YWdzIGFuZCB0aGVyZWZvcmVcbiAgICAgICAgKiB0aGUgc3RhcnQgdGFnIGl0IGNsb3NlcyBpcyBub3Qgd2hhdCB3ZSB3YW50KS4gSWYgdGhlcmUgYXJlIHdlIHdhbnQgdG8gXG4gICAgICAgICogc2xvd2x5IG5hcnJvdyBkb3duIG91ciBzZXQgb2Ygc3RyaW5ncyB1bnRpbCB0aGUgbGFzdCBlbmQgdGFnIGlzIFxuICAgICAgICAqIHJlbW92ZWQuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGZpbmQgdGhlIGNsb3Nlc3Qgb3BlbiBzdGFydCB0YWcgXG4gICAgICAgICogaW4gdGhlIGRhdGEuXG4gICAgICAgICovXG4gICAgbGV0IGVuZFRhZ1NlcmFjaERhdGEgPSBmaW5kRW5kVGFnKGxpbmVzQWJvdmVTdHIpO1xuICAgIHdoaWxlKGVuZFRhZ1NlcmFjaERhdGEuZm91bmQgPT09IHRydWUpIHtcblxuICAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHdoZXJlIHRoZSBmaXJzdCByZWdleCBtYXRjaCBpbiB0aGVcbiAgICAgICAgLy8gc3RyaW5nIGlzLiB0aGVuIHdlIHNsaWNlIGZyb20gMCB0byBpbmRleCBvZmYgb2YgdGhlIHN0cmluZ1xuICAgICAgICAvLyBzcGxpdCBpdCBieSBuZXdsaW5lLCBjdXQgb2ZmIHRoZSBmaXJzdCBsaW5lICh3aGljaCBhY3R1YWxseVxuICAgICAgICAvLyBjb250YWlucyB0aGUgcmVnZXgpIHRoZW4gcmVkdWNlIGJhY2sgZG93biB0byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgc2ltcGxpZmllZCBpZiB3ZSBqdXN0IHNsaWNlIHRoZSB0ZXh0IGFmdGVyXG4gICAgICAgIC8vIHRoZSBlbmQgdGFnIGluc3RlYWQgb2YgdGhlIGJlZ2luaW5nLlxuICAgICAgICBsZXQgaW5kZXhPZlJlZ2V4ID0gZW5kVGFnU2VyYWNoRGF0YS5zdGFydFBvc2l0aW9uO1xuICAgICAgICBsaW5lc0Fib3ZlQXJyYXkgPSBsaW5lc0Fib3ZlU3RyLnNsaWNlKGluZGV4T2ZSZWdleCkuc3BsaXQoXCJcXG5cIikuc3BsaWNlKDEpXG4gICAgICAgIGxpbmVzQWJvdmVTdHIgPSBsaW5lc0Fib3ZlQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldiArIFwiXFxuXCIgICsgY3VycmVudDtcbiAgICAgICAgfSwgXCJcIik7XG4gICAgICAgIGVuZFRhZ1NlcmFjaERhdGEgPSBmaW5kRW5kVGFnKGxpbmVzQWJvdmVTdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdyB3ZSBoYXZlIHRoZSBzZXQgb2YgbGluZXMgYWZ0ZXIgYWxsIG90aGVyIGVuZCB0YWdzLiBXZSBub3dcbiAgICAgKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIHN0aWxsIGEgc3RhcnQgdGFnIGxlZnQgaW4gdGhlIGRhdGEuIElmIFxuICAgICAqIHRoZXJlIGlzIG5vIHN0YXJ0IHRhZyB0aGVuIHdlIHdhbnQgdG8gcmV0dXJuIGFuIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBcbiAgICAgKiBrZXkuXG4gICAgICovIFxuICAgIGxldCBzdGFydEJsb2NrS2V5ID0gXCJcIjtcbiAgICBsZXQgc3RhcnRUYWdTZWFyY2hEYXRhID0gZmluZFN0YXJ0VGFnKGxpbmVzQWJvdmVTdHIpO1xuICAgIGlmKHN0YXJ0VGFnU2VhcmNoRGF0YS5mb3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3cgd2Uga25vdyB0aGVyZSBpcyBhdCBsZWFzdCAxIHN0YXJ0IGtleSBsZWZ0LCBob3dldmVyIHRoZXJlXG4gICAgICAgICAqIG1heSBiZSBtdWx0aXBsZSBzdGFydCBrZXlzIGlmIHRoZSB1c2VyIGlzIG5vdCBjbG9zaW5nIHRoZWlyXG4gICAgICAgICAqIGJsb2Nrcy4gV2UgY3VycmVudGx5IGRvbnQgYWxsb3cgcmVjdXNpdmUgc3BsaXR0aW5nIHNvIHdlIFxuICAgICAgICAgKiB3YW50IHRvIGdldCB0aGUgbGFzdCBrZXkgaW4gb3VyIHJlbWFpbmluZyBzZXQuIFNhbWUgaWRlYSBhc1xuICAgICAgICAgKiBhYm92ZS5cbiAgICAgICAgICovXG4gICAgICAgIHdoaWxlKHN0YXJ0VGFnU2VhcmNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHdoZXJlIHRoZSBmaXJzdCByZWdleCBtYXRjaCBpbiB0aGVcbiAgICAgICAgICAgIC8vIHN0cmluZyBpcy4gdGhlbiB3ZSBzbGljZSBmcm9tIDAgdG8gaW5kZXggb2ZmIG9mIHRoZSBzdHJpbmdcbiAgICAgICAgICAgIC8vIHNwbGl0IGl0IGJ5IG5ld2xpbmUsIGN1dCBvZmYgdGhlIGZpcnN0IGxpbmUgKHdoaWNoIGFjdHVhbGx5XG4gICAgICAgICAgICAvLyBjb250YWlucyB0aGUgcmVnZXgpIHRoZW4gcmVkdWNlIGJhY2sgZG93biB0byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkIGlmIHdlIGp1c3Qgc2xpY2UgdGhlIHRleHQgYWZ0ZXJcbiAgICAgICAgICAgIC8vIHRoZSBlbmQgdGFnIGluc3RlYWQgb2YgdGhlIGJlZ2luaW5nLlxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBzdGFydFRhZ1NlYXJjaERhdGEuc3RhcnRQb3NpdGlvbjtcblxuICAgICAgICAgICAgbGluZXNBYm92ZUFycmF5ID0gbGluZXNBYm92ZVN0ci5zbGljZShzdGFydEluZGV4KS5zcGxpdChcIlxcblwiKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgc3RhcnRUYWcgPSBsaW5lc0Fib3ZlQXJyYXlbMF07XG4gICAgICAgICAgICBsZXQga2V5ID0gZ2V0U3RhcnRUYWdLZXkoc3RhcnRUYWcpO1xuICAgICAgICAgICAgaWYoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRCbG9ja0tleSA9IGtleTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZXNBYm92ZUFycmF5ID0gbGluZXNBYm92ZUFycmF5LnNwbGljZSgxKVxuICAgICAgICAgICAgbGluZXNBYm92ZVN0ciA9IGxpbmVzQWJvdmVBcnJheS5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIFwiXFxuXCIgICsgY3VycmVudDtcbiAgICAgICAgICAgIH0sIFwiXCIpO1xuXG4gICAgICAgICAgICBzdGFydFRhZ1NlYXJjaERhdGEgPSBmaW5kU3RhcnRUYWcobGluZXNBYm92ZVN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydEJsb2NrS2V5LCBsaW5lc0Fib3ZlQXJyYXkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuZEJsb2NrQmVsb3cobGluZXNCZWxvdzogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cbiAgICAvLyBSZWR1Y2UgdGhlIGFycmF5IGRvd24gaW50byBhIHNpbmdsZSBzdHJpbmcgc28gdGhhdCB3ZSBjYW5cbiAgICAvLyBlYXNpbHkgUmVnRXggb3ZlciB0aGUgc3RyaW5nIGFuZCBmaW5kIHRoZSBpbmRpY2llcyB3ZSdyZSBsb29raW5nIGZvci5cbiAgICBsZXQgbGluZXNCZWxvd1N0ciA9IGxpbmVzQmVsb3cucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xuICAgIH0sIFwiXCIpO1xuICAgIGxldCBlbmRUYWdTZXJhY2hEYXRhID0gZmluZEVuZFRhZyhsaW5lc0JlbG93U3RyKTtcbiAgICBsZXQgc3RhcnRUYWdTZWFyY2hEYXRhID0gZmluZFN0YXJ0VGFnKGxpbmVzQmVsb3dTdHIpO1xuXG4gICAgbGV0IHNsaWNlRW5kSW5kZXggPSAtMTsgLy8gSWYgbmVpdGhlciBzdGFydCBvciBlbmQgZm91bmQgd2UgcmV0dXJuIHRoZSBlbnRpcmUgYXJyYXkuXG4gICAgaWYoZW5kVGFnU2VyYWNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSAmJiBzdGFydFRhZ1NlYXJjaERhdGEuZm91bmQgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgc2xpY2VFbmRJbmRleCA9IGVuZFRhZ1NlcmFjaERhdGEuc3RhcnRQb3NpdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZihlbmRUYWdTZXJhY2hEYXRhLmZvdW5kID09PSBmYWxzZSAmJiBzdGFydFRhZ1NlYXJjaERhdGEuZm91bmQgPT09IHRydWUpIHtcblxuICAgICAgICBzbGljZUVuZEluZGV4ID0gc3RhcnRUYWdTZWFyY2hEYXRhLnN0YXJ0UG9zaXRpb247XG4gICAgfVxuICAgIGVsc2UgaWYoZW5kVGFnU2VyYWNoRGF0YS5mb3VuZCA9PT0gdHJ1ZSAmJiBzdGFydFRhZ1NlYXJjaERhdGEuZm91bmQgPT09IHRydWUpIHtcblxuICAgICAgICBzbGljZUVuZEluZGV4ID0gZW5kVGFnU2VyYWNoRGF0YS5zdGFydFBvc2l0aW9uO1xuICAgICAgICBpZihzdGFydFRhZ1NlYXJjaERhdGEuc3RhcnRQb3NpdGlvbiA8IGVuZFRhZ1NlcmFjaERhdGEuc3RhcnRQb3NpdGlvbikge1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIElmIHdlIGZvdW5kIGEgc3RhcnQgdGFnIGJlZm9yZSBhbiBlbmQgdGFnIHdlIHdhbnQgdG8gdXNlIHRoZSBzdGFydCB0YWdcbiAgICAgICAgICAgICAqIG91ciBjdXJyZW50IGJsb2NrIGlzIG5vdCBwcm9wZXJseSBlbmRlZCBhbmQgd2UgdXNlIHRoZSBuZXh0IHN0YXJ0IHRhZyBcbiAgICAgICAgICAgICAqIGFzIG91ciBsaW1pdFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzbGljZUVuZEluZGV4ID0gc3RhcnRUYWdTZWFyY2hEYXRhLnN0YXJ0UG9zaXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXNCZWxvdy5zbGljZSgwLCBzbGljZUVuZEluZGV4KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRUYWdLZXkoc3RhcnRUYWc6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXG4gICAgbGV0IGtleVNwbGl0ID0gc3RhcnRUYWcuc3BsaXQoXCI6XCIpO1xuICAgIGlmKGtleVNwbGl0Lmxlbmd0aCA+IDEpe1xuICAgICAgICByZXR1cm4ga2V5U3BsaXRbMV0ucmVwbGFjZShcIiBcIiwgXCJcIilcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cbiIsIi8qXG4gKiBGaWxlbmFtZTogbXVsdGktY29sdW1uLW1hcmtkb3duL3NyYy91dGlsaXRpZXMvdXRpbHMudHNcbiAqIENyZWF0ZWQgRGF0ZTogVHVlc2RheSwgSmFudWFyeSAzMHRoIDIwMjIsIDQ6MDI6MTkgcG1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVJRChsZW5ndGg6IG51bWJlciA9IDEwKTogc3RyaW5nIHtcblxuICAgIGlmKGxlbmd0aCA+IDEwKSB7XG4gICAgICAgIGxlbmd0aCA9IDEwO1xuICAgIH1cbiAgICBsZXQgVUlEID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpO1xuICAgIFVJRCA9IFVJRC5zbGljZSgwLCBsZW5ndGgpO1xuICAgIFxuICAgIHJldHVybiBVSUQ7XG59IiwiZXhwb3J0IGVudW0gRWxlbWVudFJlbmRlclR5cGUge1xuICAgIHVuZGVmaW5lZCxcbiAgICBub3JtYWxSZW5kZXIsXG4gICAgc3BlY2lhbFJlbmRlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFJlbmRlclR5cGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBFbGVtZW50UmVuZGVyVHlwZSB7XG5cbiAgICAvKipcbiAgICAgKiBMb29rIGZvciBzcGVjaWZpYyBraW5kcyBvZiBlbGVtZW50cyBieSB0aGVpciBDU1MgY2xhc3MgbmFtZXMgaGVyZS4gVGhlc2UgXG4gICAgICogYXJlIGdvaW5nIHRvIGJlIGJyaXR0bGUgbGlua3MgYXMgdGhleSByZWx5IG9uIG90aGVyIHBsdWdpbiBkZWZpbml0aW9ucyBidXRcbiAgICAgKiBhcyB0aGlzIGlzIG9ubHkgYWRkaW5nIGluIGV4dHJhIGNvbXBhdGFiaWxpdHkgdG8gdGhlIHBsdWdpbnMgZGVmaW5lZCBoZXJlIFxuICAgICAqIGl0IHNob3VsZCBiZSBvay5cbiAgICAgKiBcbiAgICAgKiBUaGVzZSBtYXkgYmUgY2xhc3NlcyBvbiBvbmUgb2YgdGhlIHNpbXBsZSBlbGVtZW50cyAoc3VjaCBhcyBhIHBhcmFncmFwaClcbiAgICAgKiB0aGF0IHdlIHNlYXJjaCBmb3IgYmVsb3cgc28gbmVlZCB0byBsb29rIGZvciB0aGVzZSBmaXJzdC5cbiAgICAgKi9cbiAgICBpZihoYXNEaWNlUm9sbGVyKGVsZW1lbnQpID09PSB0cnVlKSB7XG5cbiAgICAgICAgcmV0dXJuIEVsZW1lbnRSZW5kZXJUeXBlLnNwZWNpYWxSZW5kZXJcbiAgICB9XG5cbiAgICBpZihoYXNBZG1vbml0aW9uKGVsZW1lbnQpID09PSB0cnVlKSB7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gRWxlbWVudFJlbmRlclR5cGUubm9ybWFsUmVuZGVyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UgZGlkbnQgZmluZCBhIHNwZWNpYWwgZWxlbWVudCB3ZSB3YW50IHRvIGNoZWNrIGZvciBzaW1wbGUgZWxlbWVudHNcbiAgICAgKiBzdWNoIGFzIHBhcmFncmFwaHMgb3IgbGlzdHMuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdlIG9ubHkgc2V0IHVwXG4gICAgICogdGhlIHNwZWNpYWwgY2FzZSBmb3IgXCJzcGVjaWFsUmVuZGVyXCIgZWxlbWVudHMgc28gdGhpcyAqc2hvdWxkKiBiZSBzYXZpbmdcbiAgICAgKiBzb21lIHJlbmRlcmluZyB0aW1lIGJ5IHNldHRpbmcgdGhlc2UgdGFncyBwcm9wZXJseS5cbiAgICAgKi9cbiAgICBpZihoYXNQYXJhZ3JhcGgoZWxlbWVudCkgfHwgXG4gICAgICAgaGFzSGVhZGVyKGVsZW1lbnQpICAgIHx8XG4gICAgICAgaGFzTGlzdChlbGVtZW50KSkge1xuXG4gICAgICAgIHJldHVybiBFbGVtZW50UmVuZGVyVHlwZS5ub3JtYWxSZW5kZXI7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RpbGwgbm90aGluZyBmb3VuZCB3ZSByZXR1cm4gb3RoZXIgYXMgdGhlIGRlZmF1bHQgcmVzcG9uc2UgaWYgbm90aGluZyBlbHNlIGZvdW5kLlxuICAgIHJldHVybiBFbGVtZW50UmVuZGVyVHlwZS5zcGVjaWFsUmVuZGVyO1xufVxuXG5mdW5jdGlvbiBoYXNQYXJhZ3JhcGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjxwXCIpO1xufVxuXG5mdW5jdGlvbiBoYXNIZWFkZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcblxuICAgIGlmKGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8aDFcIikgfHwgXG4gICAgICAgZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjxoMlwiKSB8fCBcbiAgICAgICBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPGgzXCIpIHx8IFxuICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MLnN0YXJ0c1dpdGgoXCI8aDRcIikgfHxcbiAgICAgICBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPGg1XCIpKSB7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNMaXN0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgXG4gICAgaWYoZWxlbWVudC5pbm5lckhUTUwuc3RhcnRzV2l0aChcIjx1bFwiKSB8fCBcbiAgICAgICBlbGVtZW50LmlubmVySFRNTC5zdGFydHNXaXRoKFwiPG9sXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzRGljZVJvbGxlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJkaWNlLXJvbGxlclwiKS5sZW5ndGggIT09IDA7XG59XG5cbmZ1bmN0aW9uIGhhc0FkbW9uaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYWRtb25pdGlvblwiKS5sZW5ndGggIT09IDA7XG59IiwiLypcbiAqIEZpbGVuYW1lOiBtdWx0aS1jb2x1bW4tbWFya2Rvd24vc3JjL2RvbU9iamVjdC50c1xuICogQ3JlYXRlZCBEYXRlOiBUdWVzZGF5LCBGZWJydWFyeSAxc3QgMjAyMiwgMTI6MDQ6MDAgcG1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cbmltcG9ydCB7IGdldFVJRCB9IGZyb20gXCIuLi91dGlsaXRpZXMvdXRpbHNcIjtcbmltcG9ydCB7IEVsZW1lbnRSZW5kZXJUeXBlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lbGVtZW50UmVuZGVyVHlwZVBhcnNlclwiO1xuaW1wb3J0IHsgTXVsdGlDb2x1bW5TZXR0aW5ncyB9IGZyb20gXCIuLi9yZWdpb25TZXR0aW5nc1wiO1xuXG5leHBvcnQgZW51bSBET01PYmplY3RUYWcge1xuICAgIG5vbmUsXG4gICAgc3RhcnRSZWdpb24sXG4gICAgcmVnaW9uU2V0dGluZ3MsXG4gICAgY29sdW1uQnJlYWssXG4gICAgZW5kUmVnaW9uXG59XG5cbmV4cG9ydCBjbGFzcyBET01PYmplY3Qge1xuICAgIG5vZGVLZXk6IHN0cmluZztcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBVSUQ6IHN0cmluZztcbiAgICB0YWc6IERPTU9iamVjdFRhZztcbiAgICB1c2luZ09yaWdpbmFsRWxlbWVudDogYm9vbGVhblxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50UmVuZGVyVHlwZSA9IEVsZW1lbnRSZW5kZXJUeXBlLnVuZGVmaW5lZDtcbiAgICBlbGVtZW50Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgXG4gICAgICAgICAgICAgICAgcmFuZG9tSUQ6c3RyaW5nID0gZ2V0VUlEKCksIFxuICAgICAgICAgICAgICAgIHRhZzogRE9NT2JqZWN0VGFnID0gRE9NT2JqZWN0VGFnLm5vbmUgKSB7XG4gICAgICAgIHRoaXMubm9kZUtleSA9IGVsZW1lbnQuaW5uZXJUZXh0LnRyaW0oKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5VSUQgPSByYW5kb21JRDtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMudXNpbmdPcmlnaW5hbEVsZW1lbnQgPSBmYWxzZVxuICAgIH1cblxuICAgIHNldE1haW5ET01FbGVtZW50KGRvbUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGRvbUVsZW1lbnQ7XG4gICAgICAgIHRoaXMudXNpbmdPcmlnaW5hbEVsZW1lbnQgPSB0cnVlXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRE9NU3RhcnRSZWdpb25PYmplY3QgZXh0ZW5kcyBET01PYmplY3Qge1xuXG4gICAgcmVnaW9uRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihiYXNlRE9NT2JqZWN0OiBET01PYmplY3QsIHJlZ2lvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgc3VwZXIoYmFzZURPTU9iamVjdC5lbGVtZW50LCBiYXNlRE9NT2JqZWN0LlVJRCwgRE9NT2JqZWN0VGFnLnN0YXJ0UmVnaW9uKTtcbiAgICAgICAgdGhpcy5yZWdpb25FbGVtZW50ID0gcmVnaW9uRWxlbWVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBET01SZWdpb25TZXR0aW5nc09iamVjdCBleHRlbmRzIERPTU9iamVjdCB7XG5cbiAgICByZWdpb25TZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncztcblxuICAgIGNvbnN0cnVjdG9yKGJhc2VET01PYmplY3Q6IERPTU9iamVjdCwgcmVnaW9uU2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoYmFzZURPTU9iamVjdC5lbGVtZW50LCBiYXNlRE9NT2JqZWN0LlVJRCwgRE9NT2JqZWN0VGFnLnJlZ2lvblNldHRpbmdzKTtcblxuICAgICAgICB0aGlzLnJlZ2lvblNldHRpbmdzID0gcmVnaW9uU2V0dGluZ3M7XG4gICAgfVxufSIsIi8qXG4gKiBGaWxlOiBtdWx0aS1jb2x1bW4tbWFya2Rvd24vc3JjL3V0aWxpdGllcy9jc3NEZWZpbml0aW9ucy50c1xuICogQ3JlYXRlZCBEYXRlOiBXZWRuZXNkYXksIEZlYnJ1YXJ5IDE2dGggMjAyMiwgMTE6MDk6MDYgYW1cbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQ2FtZXJvbiBSb2JpbnNvblxuICovXG5cbmV4cG9ydCBlbnVtIE11bHRpQ29sdW1uTGF5b3V0Q1NTIHtcblxuICAgIFJlZ2lvblJvb3RDb250YWluZXJEaXYgPSBcIm11bHRpQ29sdW1uQ29udGFpbmVyXCIsXG4gICAgUmVnaW9uRXJyb3JDb250YWluZXJEaXYgPSBcIm11bHRpQ29sdW1uRXJyb3JDb250YWluZXJcIixcbiAgICBSZWdpb25Db250ZW50Q29udGFpbmVyRGl2ID0gXCJSZW5kZXJDb2xSZWdpb25cIixcbiAgICBSZWdpb25Db2x1bW5Db250YWluZXJEaXYgPSBcIm11bHRpQ29sdW1uUGFyZW50XCIsXG4gICAgUmVnaW9uQ29sdW1uQ29udGVudCA9IFwiY29sdW1uQ29udGVudFwiLFxuICAgIENvbHVtbkR1YWxFbGVtZW50Q29udGFpbmVyID0gXCJNdWx0aUNvbHVtbl9FbGVtZW50Q29udGFpbmVyXCIsXG4gICAgT3JpZ2luYWxFbGVtZW50VHlwZSA9IFwiTXVsdGlDb2x1bW5fT3JpZ2luYWxFbGVtZW50XCIsXG4gICAgQ2xvbmVkRWxlbWVudFR5cGUgPSBcIk11bHRpQ29sdW1uX0Nsb25lZEVsZW1lbnRcIlxufVxuXG5leHBvcnQgZW51bSBNdWx0aUNvbHVtblN0eWxlQ1NTIHtcblxuICAgIFJlZ2lvbkVycm9yTWVzc2FnZSA9IFwibXVsdGlDb2x1bW5FcnJvck1lc3NhZ2VcIixcbiAgICBSZWdpb25TZXR0aW5ncyA9IFwibXVsdGlDb2x1bW5TZXR0aW5nc1wiLFxuICAgIFJlZ2lvbkNvbnRlbnQgPSBcIm11bHRpQ29sdW1uQ29udGVudFwiLFxuICAgIFJlZ2lvbkVuZFRhZyA9IFwibXVsdGlDb2x1bW5SZWdpb25FbmRUYWdcIixcbiAgICBDb2x1bW5FbmRUYWcgPSBcIm11bHRpQ29sdW1uQnJlYWtcIixcbiAgICBSZWdpb25TaGFkb3cgPSBcIm11bHRpQ29sdW1uUGFyZW50U2hhZG93XCIsXG4gICAgQ29sdW1uU2hhZG93ID0gXCJjb2x1bW5TaGFkb3dcIixcbiAgICBDb2x1bW5Cb3JkZXIgPSBcImNvbHVtbkJvcmRlclwiLFxufSIsIi8qXG4gKiBGaWxlOiBtdWx0aS1jb2x1bW4tbWFya2Rvd24vc3JjL2RvbU1hbmFnZXIudHNcbiAqIENyZWF0ZWQgRGF0ZTogU2F0dXJkYXksIEphbnVhcnkgMzB0aCAyMDIyLCAzOjE2OjMyIHBtXG4gKiBBdXRob3I6IENhbWVyb24gUm9iaW5zb25cbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDIyIENhbWVyb24gUm9iaW5zb25cbiAqL1xuXG5pbXBvcnQgeyBwYXJzZUNvbHVtblNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbGl0aWVzL3RleHRQYXJzZXInO1xuaW1wb3J0IHsgRE9NT2JqZWN0LCBET01SZWdpb25TZXR0aW5nc09iamVjdCwgRE9NT2JqZWN0VGFnIH0gZnJvbSAnLi9kb21PYmplY3QnO1xuaW1wb3J0IHsgTXVsdGlDb2x1bW5TZXR0aW5ncywgQ29sdW1uTGF5b3V0IH0gZnJvbSBcIi4uL3JlZ2lvblNldHRpbmdzXCI7XG5pbXBvcnQgeyBNdWx0aUNvbHVtbkxheW91dENTUywgTXVsdGlDb2x1bW5TdHlsZUNTUyB9IGZyb20gJy4uL3V0aWxpdGllcy9jc3NEZWZpbml0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxET01NYW5hZ2VyIHtcbiAgICBtYW5hZ2VyczogTWFwPHN0cmluZywgRmlsZURPTU1hbmFnZXI+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWFuYWdlcnMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpbGVNYW5hZ2VyQ2FsbGJhY2soa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYodGhpcy5tYW5hZ2Vycy5oYXMoa2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2Vycy5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWxlTWFuYWdlcihrZXk6IHN0cmluZykge1xuXG4gICAgICAgIGxldCBmaWxlTWFuYWdlciA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMubWFuYWdlcnMuaGFzKGtleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZpbGVNYW5hZ2VyID0gdGhpcy5tYW5hZ2Vycy5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpbGVNYW5hZ2VyID0gY3JlYXRlRmlsZURPTU1hbmFnZXIodGhpcywga2V5KTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlcnMuc2V0KGtleSwgZmlsZU1hbmFnZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGVNYW5hZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGxGaWxlTWFuYWdlcnMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFuYWdlcnMudmFsdWVzKCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRmlsZURPTU1hbmFnZXIgPSB7XG4gICAgcmVnaW9uTWFwOiBNYXA8c3RyaW5nLCBSZWdpb25ET01NYW5hZ2VyPixcbiAgICBoYXNTdGFydFRhZzogYm9vbGVhbixcbiAgICBjcmVhdGVSZWdpb25hbE1hbmFnZXI6IChyZWdpb25LZXk6IHN0cmluZywgcm9vdEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlcnJvckVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZW5kZXJSZWdpb25FbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gUmVnaW9uRE9NTWFuYWdlclxuICAgIGdldFJlZ2lvbmFsTWFuYWdlcjogKHJlZ2lvbktleTogc3RyaW5nKSA9PiBSZWdpb25ET01NYW5hZ2VyIHwgbnVsbCxcbiAgICBnZXRBbGxSZWdpb25hbE1hbmFnZXJzOiAoKSA9PiBSZWdpb25ET01NYW5hZ2VyW10sXG4gICAgcmVtb3ZlUmVnaW9uOiAocmVnaW9uS2V5OiBzdHJpbmcpID0+IHZvaWQsXG4gICAgc2V0SGFzU3RhcnRUYWc6ICgpID0+IHZvaWQsXG4gICAgZ2V0SGFzU3RhcnRUYWc6ICgpID0+IGJvb2xlYW4sXG4gICAgZ2V0TnVtYmVyT2ZSZWdpb25zOiAoKSA9PiBudW1iZXIsXG4gICAgY2hlY2tLZXlFeGlzdHM6IChjaGVja0tleTogc3RyaW5nKSA9PiBib29sZWFuXG59XG5mdW5jdGlvbiBjcmVhdGVGaWxlRE9NTWFuYWdlcihwYXJlbnRNYW5hZ2VyOiBHbG9iYWxET01NYW5hZ2VyLCBmaWxlS2V5OiBzdHJpbmcpOiBGaWxlRE9NTWFuYWdlciB7XG4gICAgXG4gICAgbGV0IHJlZ2lvbk1hcDogTWFwPHN0cmluZywgUmVnaW9uRE9NTWFuYWdlcj4gPSBuZXcgTWFwKCk7XG4gICAgbGV0IGhhc1N0YXJ0VGFnOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiByZW1vdmVSZWdpb24ocmVnaW9uS2V5OiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBsZXQgcmVnaW9uTWFuYWdlciA9IHJlZ2lvbk1hcC5nZXQocmVnaW9uS2V5KTtcbiAgICAgICAgaWYocmVnaW9uTWFuYWdlcikge1xuICAgICAgICAgICAgcmVnaW9uTWFuYWdlci5kaXNwbGF5T3JpZ2luYWxFbGVtZW50cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaW9uTWFwLmRlbGV0ZShyZWdpb25LZXkpO1xuICAgICAgICBcbiAgICAgICAgaWYocmVnaW9uTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHBhcmVudE1hbmFnZXIucmVtb3ZlRmlsZU1hbmFnZXJDYWxsYmFjayhmaWxlS2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlZ2lvbmFsTWFuYWdlcihyZWdpb25LZXk6IHN0cmluZywgcm9vdEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlcnJvckVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZW5kZXJSZWdpb25FbGVtZW50OiBIVE1MRWxlbWVudCkge1xuXG4gICAgICAgIC8vVE9ETzogVXNlIHRoZSBlcnJvciBlbGVtZW50IHdoZW5ldmVyIHRoZXJlIGlzIGFuIGVycm9yLlxuXG4gICAgICAgIGxldCByZWdvbmFsTWFuYWdlciA9IGNyZWF0ZVJlZ2lvbmFsRG9tTWFuYWdlcih0aGlzLCByZWdpb25LZXksIHJvb3RFbGVtZW50LCByZW5kZXJSZWdpb25FbGVtZW50KTtcbiAgICAgICAgcmVnaW9uTWFwLnNldChyZWdpb25LZXksIHJlZ29uYWxNYW5hZ2VyKTtcbiAgICAgICAgcmV0dXJuIHJlZ29uYWxNYW5hZ2VyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFJlZ2lvbmFsTWFuYWdlcihyZWdpb25LZXk6IHN0cmluZyk6IFJlZ2lvbkRPTU1hbmFnZXIgfCBudWxsIHtcblxuICAgICAgICBsZXQgcmVnb25hbE1hbmFnZXIgPSBudWxsO1xuICAgICAgICBpZihyZWdpb25NYXAuaGFzKHJlZ2lvbktleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJlZ29uYWxNYW5hZ2VyID0gcmVnaW9uTWFwLmdldChyZWdpb25LZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ29uYWxNYW5hZ2VyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEFsbFJlZ2lvbmFsTWFuYWdlcnMoKTogUmVnaW9uRE9NTWFuYWdlcltdIHtcblxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyZWdpb25NYXAudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEhhc1N0YXJ0VGFnKCkge1xuICAgICAgICBoYXNTdGFydFRhZyA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SGFzU3RhcnRUYWcoKSB7XG4gICAgICAgIHJldHVybiBoYXNTdGFydFRhZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7XG4gICAgICAgIHJldHVybiByZWdpb25NYXAuc2l6ZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrS2V5RXhpc3RzKGNoZWNrS2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lvbk1hcC5oYXMoY2hlY2tLZXkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlZ2lvbk1hcDogcmVnaW9uTWFwLCBcbiAgICAgICAgaGFzU3RhcnRUYWc6IGhhc1N0YXJ0VGFnLCAgXG4gICAgICAgIGNyZWF0ZVJlZ2lvbmFsTWFuYWdlcjogY3JlYXRlUmVnaW9uYWxNYW5hZ2VyLCBcbiAgICAgICAgZ2V0UmVnaW9uYWxNYW5hZ2VyOiBnZXRSZWdpb25hbE1hbmFnZXIsXG4gICAgICAgIGdldEFsbFJlZ2lvbmFsTWFuYWdlcnM6IGdldEFsbFJlZ2lvbmFsTWFuYWdlcnMsXG4gICAgICAgIHJlbW92ZVJlZ2lvbjogcmVtb3ZlUmVnaW9uLCBcbiAgICAgICAgc2V0SGFzU3RhcnRUYWc6IHNldEhhc1N0YXJ0VGFnLCBcbiAgICAgICAgZ2V0SGFzU3RhcnRUYWc6IGdldEhhc1N0YXJ0VGFnLFxuICAgICAgICBnZXROdW1iZXJPZlJlZ2lvbnM6IGdldE51bWJlck9mUmVnaW9ucyxcbiAgICAgICAgY2hlY2tLZXlFeGlzdHM6IGNoZWNrS2V5RXhpc3RzXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBNdWx0aUNvbHVtblJlbmRlckRhdGEgPSB7IFxuICAgIHBhcmVudFJlbmRlckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBcbiAgICBwYXJlbnRSZW5kZXJTZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncyxcbiAgICBkb21PYmplY3RzOiBET01PYmplY3RbXVxufVxuXG5leHBvcnQgdHlwZSBSZWdpb25ET01NYW5hZ2VyID0ge1xuXG4gICAgYWRkT2JqZWN0OiAoc2libGluZ3NBYm92ZTogSFRNTERpdkVsZW1lbnQsIHNpYmxpbmdzQmVsb3c6IEhUTUxEaXZFbGVtZW50LCBvYmo6IERPTU9iamVjdCkgPT4gbnVtYmVyLFxuICAgIHJlbW92ZU9iamVjdDogKG9iamVjdEtleTogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHVwZGF0ZUVsZW1lbnRUYWc6IChvYmplY3RVSUQ6IHN0cmluZywgbmV3VGFnOiBET01PYmplY3RUYWcpID0+IHZvaWQsXG4gICAgc2V0RWxlbWVudFRvU2V0dGluZ3NCbG9jazogKG9iamVjdFVJRDogc3RyaW5nLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBnZXRSZWdpb25SZW5kZXJEYXRhOiAoKSA9PiBNdWx0aUNvbHVtblJlbmRlckRhdGEsXG4gICAgZGlzcGxheU9yaWdpbmFsRWxlbWVudHM6ICgpID0+IHZvaWQsXG4gICAgZ2V0Um9vdFJlZ2lvbkVsZW1lbnQ6ICgpID0+IEhUTUxFbGVtZW50XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlZ2lvbmFsRG9tTWFuYWdlcihmaWxlTWFuYWdlcjogRmlsZURPTU1hbmFnZXIsIHJlZ2lvbktleTogc3RyaW5nLCByb290RWxlbWVudDogSFRNTEVsZW1lbnQsIHJlbmRlclJlZ2lvbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVnaW9uRE9NTWFuYWdlciB7XG5cbiAgICAvKipcbiAgICAgKiBXZSB1c2UgYSBsaXN0IGFuZCBhIG1hcCB0byBoZWxwIGtlZXAgdHJhY2sgb2YgdGhlIG9iamVjdHMuIFJlcXVpcmVzXG4gICAgICogbW9yZSBtZW1vcnkgYnV0IG1ha2VzIHByb2Nlc3NpbmcgdGhpbmdzIGEgbGl0dGxlIGNsZWFuZXIgYW5kIHByZXN1bWFibHlcbiAgICAgKiBmYXN0ZXIuXG4gICAgICogXG4gICAgICogVXNlIHRoZSBtYXAgdG8gbG9vayB1cCBvYmplY3QgYnkga2V5IGFuZCB0aGUgbGlzdCBpcyB1c2VkIHRvIHRyYWNrIG9iamVjdHNcbiAgICAgKiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGxldCBkb21MaXN0OiBET01PYmplY3RbXSA9IFtdXG4gICAgbGV0IGRvbU9iamVjdE1hcDogTWFwPHN0cmluZywgRE9NT2JqZWN0PiA9IG5ldyBNYXAoKTtcbiAgICBsZXQgcmVnaW9uUGFyZW50OiBIVE1MRWxlbWVudCA9IHJlbmRlclJlZ2lvbkVsZW1lbnQ7XG4gICAgbGV0IHJlZ2lvblNldHRpbmdzOiBET01SZWdpb25TZXR0aW5nc09iamVjdFtdID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRPYmplY3Qoc2libGluZ3NBYm92ZTogSFRNTERpdkVsZW1lbnQsIHNpYmxpbmdzQmVsb3c6IEhUTUxEaXZFbGVtZW50LCBvYmo6IERPTU9iamVjdCk6IG51bWJlciB7XG5cbiAgICAgICAgbGV0IHByZXZPYmogPSBzaWJsaW5nc0Fib3ZlLmNoaWxkcmVuW3NpYmxpbmdzQWJvdmUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBuZXh0T2JqID0gc2libGluZ3NCZWxvdy5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBsZXQgYWRkQXRJbmRleCA9IHNpYmxpbmdzQWJvdmUuY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgIGxldCBwcmV2T2JqVGV4dCA9IFwiXCJcbiAgICAgICAgaWYocHJldk9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHByZXZPYmpUZXh0ID0gcHJldk9iai5pbm5lclRleHQ7XG5cbiAgICAgICAgICAgIGZvcihsZXQgaSA9IGRvbUxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZihkb21MaXN0W2ldLm5vZGVLZXkgPT09IHByZXZPYmouaW5uZXJUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEF0SW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRFbEluZGV4ID0gYWRkQXRJbmRleDtcbiAgICAgICAgbGV0IG5leHRPYmpUZXh0ID0gXCJcIlxuICAgICAgICBpZihuZXh0T2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGZvdW5kTmV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgbmV4dE9ialRleHQgPSBuZXh0T2JqLmlubmVyVGV4dDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yKGxldCBpID0gYWRkQXRJbmRleDsgaSA8IGRvbUxpc3QubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGlmKGRvbUxpc3RbaV0ubm9kZUtleSA9PT0gbmV4dE9iai5pbm5lclRleHQudHJpbSgpKSB7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIG5leHRFbEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgZm91bmROZXh0ID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiBQcmV2OiBcIiwgc2libGluZ3NBYm92ZS5jaGlsZHJlbltzaWJsaW5nc0Fib3ZlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLCBcIkFkZGluZzogXCIsIG9iai5lbGVtZW50LCBcIiBOZXh0OiBcIiwgc2libGluZ3NCZWxvdy5jaGlsZHJlblswXSwgXCJPdmVyd3JpdGluZzpcIiwgZG9tTGlzdC5zbGljZShhZGRBdEluZGV4LCBuZXh0RWxJbmRleCkpO1xuXG4gICAgICAgIGRvbUxpc3Quc3BsaWNlKGFkZEF0SW5kZXgsIG5leHRFbEluZGV4IC0gYWRkQXRJbmRleCwgb2JqKTtcbiAgICAgICAgZG9tT2JqZWN0TWFwLnNldChvYmouVUlELCBvYmopO1xuXG4gICAgICAgIC8vIC8qKlxuICAgICAgICAvLyAgKiBNYWtlIGEgY29weSBvZiB0aGUgbGlzdCB0byBsb2csIG9ubHkgYmVjYXVzZVxuICAgICAgICAvLyAgKiBjb25zb2xlIGxvZyB1cGRhdGVzIGl0cyByZWZlcmVuY2VzIHdpdGggdXBkYXRlcyBpbiBtZW1vcnkuXG4gICAgICAgIC8vICAqL1xuICAgICAgICAvLyBsZXQgeCA9IGRvbUxpc3Quc2xpY2UoMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xuXG4gICAgICAgIHJldHVybiBhZGRBdEluZGV4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU9iamVjdChvYmplY3RVSUQ6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIC8vIC8qKlxuICAgICAgICAvLyAgKiBNYWtlIGEgY29weSBvZiB0aGUgbGlzdCB0byBsb2dcbiAgICAgICAgLy8gICovXG4gICAgICAgIC8vIGxldCB4ID0gZG9tTGlzdC5zbGljZSgwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBvYmplY3QgYnkga2V5LCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIGFuZCB0aGVuXG4gICAgICAgIC8vIGZyb20gdGhlIGxpc3QuXG4gICAgICAgIGxldCBvYmogPSBkb21PYmplY3RNYXAuZ2V0KG9iamVjdFVJRCk7XG4gICAgICAgIGRvbU9iamVjdE1hcC5kZWxldGUob2JqZWN0VUlEKTtcbiAgICAgICAgXG4gICAgICAgIGlmKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZihkb21MaXN0LmNvbnRhaW5zKG9iaikpIHtcbiAgICAgICAgICAgIGRvbUxpc3QucmVtb3ZlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGEgc2V0dGluZ3Mgb2JqZWN0IHdlIG5lZWQgdG8gcmVtb3ZlIGZyb20gdGhlIFxuICAgICAgICAvLyBzZXR0aW5ncyBsaXN0LlxuICAgICAgICBpZihvYmoudGFnID09PSBET01PYmplY3RUYWcucmVnaW9uU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGxldCBzZXR0aW5nc09iaiA9IG9iaiBhcyBET01SZWdpb25TZXR0aW5nc09iamVjdDtcbiAgICAgICAgICAgIGlmKHJlZ2lvblNldHRpbmdzLmNvbnRhaW5zKHNldHRpbmdzT2JqKSkge1xuICAgICAgICAgICAgICAgIHJlZ2lvblNldHRpbmdzLnJlbW92ZShzZXR0aW5nc09iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihkb21MaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZmlsZU1hbmFnZXIucmVtb3ZlUmVnaW9uKHJlZ2lvbktleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB4ID0gZG9tTGlzdC5zbGljZSgwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudFRhZyhvYmplY3RVSUQ6IHN0cmluZywgbmV3VGFnOiBET01PYmplY3RUYWcpOiB2b2lkIHtcblxuICAgICAgICBsZXQgb2JqID0gZG9tT2JqZWN0TWFwLmdldChvYmplY3RVSUQpO1xuICAgICAgICBsZXQgaW5kZXggPSBkb21MaXN0LmluZGV4T2Yob2JqKTtcbiAgICAgICAgaWYoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBkb21MaXN0W2luZGV4XS50YWcgPSBuZXdUYWc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRFbGVtZW50VG9TZXR0aW5nc0Jsb2NrKG9iamVjdFVJRDogc3RyaW5nLCBzZXR0aW5nc1RleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBcblxuICAgICAgICBsZXQgb2JqID0gZG9tT2JqZWN0TWFwLmdldChvYmplY3RVSUQpO1xuICAgICAgICBsZXQgaW5kZXggPSBkb21MaXN0LmluZGV4T2Yob2JqKTtcbiAgICAgICAgaWYoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3MgPSBwYXJzZUNvbHVtblNldHRpbmdzKHNldHRpbmdzVGV4dCk7XG4gICAgICAgICAgICBsZXQgcmVnaW9uU2V0dGluZ3NPYmo6IERPTVJlZ2lvblNldHRpbmdzT2JqZWN0ID0gbmV3IERPTVJlZ2lvblNldHRpbmdzT2JqZWN0KGRvbUxpc3RbaW5kZXhdLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGRvbU9iamVjdE1hcC5zZXQocmVnaW9uU2V0dGluZ3NPYmouVUlELCByZWdpb25TZXR0aW5nc09iaik7XG4gICAgICAgICAgICBkb21MaXN0W2luZGV4XSA9IHJlZ2lvblNldHRpbmdzT2JqO1xuXG4gICAgICAgICAgICByZWdpb25TZXR0aW5ncy5wdXNoKHJlZ2lvblNldHRpbmdzT2JqKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgcmVnaW9uXG4gICAgICogdG8gYmUgcmVuZGVyZWQgdG8gdGhlIHByZXZpZXcgcGFuZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBhIE11bHRpQ29sdW1uUmVuZGVyRGF0YSBvYmplY3Qgd2l0aCB0aGUgcm9vdCBET00gZWxlbWVudCwgc2V0dGluZ3Mgb2JqZWN0LCBhbmQgXG4gICAgICogYWxsIGNoaWxkIG9iamVjdHMgaW4gdGhlIG9yZGVyIHRoZXkgc2hvdWxkIGJlIHJlbmRlcmVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJlZ2lvblJlbmRlckRhdGEoKTogTXVsdGlDb2x1bW5SZW5kZXJEYXRhIHtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gZ2V0IHNldHRpbmdzLlxuICAgICAgICBsZXQgc2V0dGluZ3M6IE11bHRpQ29sdW1uU2V0dGluZ3MgPSB7bnVtYmVyT2ZDb2x1bW5zOiAyLCBjb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dC5zdGFuZGFyZCwgZHJhd0JvcmRlcjogdHJ1ZSwgZHJhd1NoYWRvdzogdHJ1ZX07XG4gICAgICAgIGlmKHJlZ2lvblNldHRpbmdzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBTaW5jZSB3ZSBhcHBlbmQgc2V0dGluZ3Mgb250byB0aGUgZW5kIG9mIHRoZSBhcnJheSB3ZSB3YW50IHRoZSBsYXN0XG4gICAgICAgICAgICAgKiBpdGVtIGluIHRoZSBhcnJheSBhcyB0aGF0IHdvdWxkIGJlIHRoZSBtb3N0IHJlY2VudCBzZXR0aW5ncyB3ZSBwYXJzZWQuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldHRpbmdzID0gcmVnaW9uU2V0dGluZ3NbcmVnaW9uU2V0dGluZ3MubGVuZ3RoIC0gMV0ucmVnaW9uU2V0dGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgcGFyZW50UmVuZGVyRWxlbWVudDogcmVnaW9uUGFyZW50LCBcbiAgICAgICAgICAgIHBhcmVudFJlbmRlclNldHRpbmdzOiBzZXR0aW5ncyxcbiAgICAgICAgICAgIGRvbU9iamVjdHM6IGRvbUxpc3RcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1Y3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBzdGFydCB0YWcgaXMgcmVtb3ZlZCBmcm9tIHZpZXcgbWVhbmluZ1xuICAgICAqIG91ciBwYXJlbnQgZWxlbWVudCBzdG9yaW5nIHRoZSBtdWx0aS1jb2x1bW4gcmVnaW9uIGlzIHJlbW92ZWQuIEl0IFxuICAgICAqIHJlbW92ZXMgdGhlIENTUyBjbGFzcyBmcm9tIGFsbCBvZiB0aGUgZWxlbWVudHMgc28gdGhleSB3aWxsIGJlXG4gICAgICogcmUtcmVuZGVyZWQgaW4gdGhlIHByZXZpZXcgd2luZG93LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRpc3BsYXlPcmlnaW5hbEVsZW1lbnRzKCkge1xuXG4gICAgICAgIFxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZG9tTGlzdC5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBpZihkb21MaXN0W2ldLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBkb21MaXN0W2ldLmVsZW1lbnQucmVtb3ZlQ2xhc3NlcyhbTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25FbmRUYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uRW5kVGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvblNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkNvbnRlbnRdKTtcbiAgICAgICAgICAgICAgICBpZihkb21MaXN0W2ldLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBkb21MaXN0W2ldLmVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChkb21MaXN0W2ldLmVsZW1lbnQpXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHJlZ2lvblNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZihyZWdpb25TZXR0aW5nc1tpXS5lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmVnaW9uU2V0dGluZ3NbaV0uZWxlbWVudC5yZW1vdmVDbGFzc2VzKFtNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVuZFRhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uRW5kVGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25TZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uQ29udGVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYocmVnaW9uU2V0dGluZ3NbaV0uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvblNldHRpbmdzW2ldLmVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChyZWdpb25TZXR0aW5nc1tpXS5lbGVtZW50KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFJvb3RSZWdpb25FbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IGFkZE9iamVjdDogYWRkT2JqZWN0LCBcbiAgICAgICAgICAgICByZW1vdmVPYmplY3Q6IHJlbW92ZU9iamVjdCwgXG4gICAgICAgICAgICAgdXBkYXRlRWxlbWVudFRhZzogdXBkYXRlRWxlbWVudFRhZywgXG4gICAgICAgICAgICAgc2V0RWxlbWVudFRvU2V0dGluZ3NCbG9jazogc2V0RWxlbWVudFRvU2V0dGluZ3NCbG9jayxcbiAgICAgICAgICAgICBnZXRSZWdpb25SZW5kZXJEYXRhOiBnZXRSZWdpb25SZW5kZXJEYXRhLFxuICAgICAgICAgICAgIGRpc3BsYXlPcmlnaW5hbEVsZW1lbnRzOiBkaXNwbGF5T3JpZ2luYWxFbGVtZW50cyxcbiAgICAgICAgICAgICBnZXRSb290UmVnaW9uRWxlbWVudDogZ2V0Um9vdFJlZ2lvbkVsZW1lbnRcbiAgICB9XG59XG4iLCIvKlxyXG4gKiBGaWxlOiBtdWx0aS1jb2x1bW4tbWFya2Rvd24vc3JjL21haW4udHNcclxuICogQ3JlYXRlZCBEYXRlOiBUdWVzZGF5LCBPY3RvYmVyIDV0aCAyMDIxLCAxOjA5IHBtXHJcbiAqIEF1dGhvcjogQ2FtZXJvbiBSb2JpbnNvblxyXG4gKiBcclxuICogQ29weXJpZ2h0IChjKSAyMDIyIENhbWVyb24gUm9iaW5zb25cclxuICovXHJcblxyXG5pbXBvcnQgeyBOb3RpY2UsIFBsdWdpbiwgIE1hcmtkb3duUmVuZGVyQ2hpbGQsIE1hcmtkb3duUmVuZGVyZXIgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCAqIGFzIG11bHRpQ29sdW1uUGFyc2VyIGZyb20gJy4vdXRpbGl0aWVzL3RleHRQYXJzZXInO1xyXG5pbXBvcnQgeyBSZWdpb25ET01NYW5hZ2VyLCBNdWx0aUNvbHVtblJlbmRlckRhdGEsIEdsb2JhbERPTU1hbmFnZXIgfSBmcm9tICcuL2RvbV9tYW5hZ2VyL2RvbU1hbmFnZXInO1xyXG5pbXBvcnQgeyBET01PYmplY3QsIERPTU9iamVjdFRhZyB9IGZyb20gJy4vZG9tX21hbmFnZXIvZG9tT2JqZWN0JztcclxuaW1wb3J0IHsgTXVsdGlDb2x1bW5TZXR0aW5ncywgQ29sdW1uTGF5b3V0IH0gZnJvbSBcIi4vcmVnaW9uU2V0dGluZ3NcIjtcclxuXHJcbmltcG9ydCB7IGdldFVJRCB9IGZyb20gJy4vdXRpbGl0aWVzL3V0aWxzJztcclxuaW1wb3J0IHsgTXVsdGlDb2x1bW5MYXlvdXRDU1MsIE11bHRpQ29sdW1uU3R5bGVDU1MgfSBmcm9tICcuL3V0aWxpdGllcy9jc3NEZWZpbml0aW9ucyc7XHJcbmltcG9ydCB7IEVsZW1lbnRSZW5kZXJUeXBlLCBnZXRFbGVtZW50UmVuZGVyVHlwZSB9IGZyb20gJy4vdXRpbGl0aWVzL2VsZW1lbnRSZW5kZXJUeXBlUGFyc2VyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11bHRpQ29sdW1uTWFya2Rvd24gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdC8vIHNldHRpbmdzOiBTcGxpdENvbHVtbk1hcmtkb3duU2V0dGluZ3M7XHJcblxyXG4gICAgZ2xvYmFsTWFuYWdlcjogR2xvYmFsRE9NTWFuYWdlciA9IG5ldyBHbG9iYWxET01NYW5hZ2VyKCk7XHJcbiAgICBcclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTG9hZGluZyBtdWx0aS1jb2x1bW4gbWFya2Rvd25cIik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBNYXJrZG93blBvc3RQcm9jZXNzb3IoKTtcclxuXHJcbiAgICAgICAgLy9UT0RPOiBTZXQgdXAgdGhpcyBhcyBhIG1vZGFsIHRvIHNldCBzZXR0aW5ncyBhdXRvbWF0aWNhbGx5XHJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWQ6IGBpbnNlcnQtbXVsdGktY29sdW1uLXJlZ2lvbmAsXHJcbiAgICAgICAgICAgIG5hbWU6IGBJbnNlcnQgTXVsdGktQ29sdW1uIFJlZ2lvbmAsXHJcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yLCB2aWV3KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0RG9jKCkucmVwbGFjZVNlbGVjdGlvbihcclxuYFxyXG49PT0gbXVsdGktY29sdW1uLXN0YXJ0OiBJRF8ke2dldFVJRCg0KX1cclxuXFxgXFxgXFxgY29sdW1uLXNldHRpbmdzXHJcbk51bWJlciBvZiBDb2x1bW5zOiAyXHJcbkxhcmdlc3QgQ29sdW1uOiBzdGFuZGFyZFxyXG5cXGBcXGBcXGBcclxuXHJcbj09PSBlbmQtY29sdW1uID09PVxyXG5cclxuPT09IG11bHRpLWNvbHVtbi1lbmRcclxuXHJcbiR7ZWRpdG9yLmdldERvYygpLmdldFNlbGVjdGlvbigpfWBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgaW5zZXJ0aW5nIGEgbXVsdGktY29sdW1uIHJlZ2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWQ6IGBhZGQtSURzLVRvLW11bHRpLWNvbHVtbi1yZWdpb25gLFxyXG4gICAgICAgICAgICBuYW1lOiBgRml4IE1pc3NpbmcgSURzIGZvciBNdWx0aS1Db2x1bW4gUmVnaW9uc2AsXHJcbiAgICAgICAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yLCB2aWV3KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICogXHJcbiAgICAgICAgICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgbGluZXMgb2YgdGhlIGRvY3VtZW50IHNwbGl0IGJ5IG5ld2xpbmVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lcyA9IGVkaXRvci5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sIHsgbGluZTogZWRpdG9yLmdldERvYygpLmxpbmVDb3VudCgpLCBjaDogMH0pLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBsaW5lcyBjaGVja2luZyBpZiB0aGUgbGluZSBpcyBhIFxyXG4gICAgICAgICAgICAgICAgICAgICAqIHN0YXJ0IHRhZyBhbmQgaWYgc28gaXMgaXQgbWlzc2luZyBhbiBJRC5cclxuICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZXNXaXRob3V0SURzID0gW11cclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFdpdGhvdXRJRHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBtdWx0aUNvbHVtblBhcnNlci5pc1N0YXJ0VGFnV2l0aElEKGxpbmVzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5pc1N0YXJ0VGFnID09PSB0cnVlICYmIGRhdGEuaGFzS2V5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNXaXRob3V0SURzLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0V2l0aG91dElEcy5wdXNoKGxpbmVzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGxpbmVzV2l0aG91dElEcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSAoXCJGb3VuZCAwIG1pc3NpbmcgSURzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgICAgICogTm93IGxvb3AgdGhyb3VnaCBlYWNoIGxpbmUgdGhhdCBpcyBtaXNzaW5nIGFuIElEIGFuZFxyXG4gICAgICAgICAgICAgICAgICAgICAqIGdlbmVyYXRlIGEgcmFuZG9tIElEIGFuZCByZXBsYWNlIHRoZSBvcmlnaW5hbCB0ZXh0LlxyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsaW5lc1dpdGhvdXRJRHMubGVuZ3RoOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbFRleHQgPSB0ZXh0V2l0aG91dElEc1tpXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IG9yaWdpbmFsVGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbUVuZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0LmNoYXJBdCh0ZXh0Lmxlbmd0aCAtIDEpID09PSBcIjpcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGAke3RleHR9OiBJRF8ke2dldFVJRCg0KX1gO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZSh0ZXh0LCB7IGxpbmU6IGxpbmVzV2l0aG91dElEc1tpXSwgY2g6IDAgfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBsaW5lOiBsaW5lc1dpdGhvdXRJRHNbaV0sIGNoOiBvcmlnaW5hbFRleHQubGVuZ3RofSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UgKGBSZXBsYWNlZCAke2xpbmVzV2l0aG91dElEcy5sZW5ndGh9IG1pc3NpbmcgSUQocykgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuYCk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFbmNvdW50ZXJlZCBhbiBlcnJvciBhZGRpZ24gSURzIHRvIG11bHRpLWNvbHVtbiByZWdpb25zLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVySW50ZXJ2YWwod2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlT3BlbkZpbGVQcmV2aWV3cygpO1xyXG4gICAgICAgIH0sIDIwMDApKTtcclxuICAgIH1cclxuXHJcbiAgICBVcGRhdGVPcGVuRmlsZVByZXZpZXdzKCkge1xyXG5cclxuICAgICAgICBsZXQgZmlsZU1hbmFnZXJzID0gdGhpcy5nbG9iYWxNYW5hZ2VyLmdldEFsbEZpbGVNYW5hZ2VycygpO1xyXG4gICAgICAgIGZpbGVNYW5hZ2Vycy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHJlZ2lvbmFsTWFuYWdlcnMgPSBlbGVtZW50LmdldEFsbFJlZ2lvbmFsTWFuYWdlcnMoKTtcclxuICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2Vycy5mb3JFYWNoKHJlZ2lvbk1hbmFnZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudERhdGE6IE11bHRpQ29sdW1uUmVuZGVyRGF0YSA9IHJlZ2lvbk1hbmFnZXIuZ2V0UmVnaW9uUmVuZGVyRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJlZE1hcmtkb3duKHBhcmVudEVsZW1lbnREYXRhLmRvbU9iamVjdHMpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNYXJrZG93blBvc3RQcm9jZXNzb3IoKSB7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IoYXN5bmMgKGVsLCBjdHgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgaW5mbyBmb3Igb3VyIGN1cnJlbnQgY29udGV4dCBhbmQgdGhlbiBjaGVja1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgZW50aXJlIHRleHQgY29udGFpbnMgYSBzdGFydCB0YWcuIElmIHRoZXJlIGlzXHJcbiAgICAgICAgICAgIC8vIG5vIHN0YXJ0IHRhZyBpbiB0aGUgZG9jdW1lbnQgd2UgY2FuIGp1c3QgcmV0dXJuIGFuZFxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIHBhcnNpbmcuXHJcbiAgICAgICAgICAgIGxldCBpbmZvID0gY3R4LmdldFNlY3Rpb25JbmZvKGVsKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBXZSBuZWVkIHRoZSBjb250ZXh0IGluZm8gdG8gcHJvcGVybHkgcGFyc2Ugc28gcmV0dXJuaW5nIGhlcmUgXHJcbiAgICAgICAgICAgICAqIGluZm8gaXMgbnVsbC4gVE9ETzogU2V0IGVycm9yIGluIHZpZXcgaWYgdGhpcyBvY2N1cnMuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZighaW5mbykge1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGN0eC5zb3VyY2VQYXRoO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbGVET01NYW5hZ2VyID0gdGhpcy5nbG9iYWxNYW5hZ2VyLmdldEZpbGVNYW5hZ2VyKHNvdXJjZVBhdGgpO1xyXG4gICAgICAgICAgICBpZihmaWxlRE9NTWFuYWdlciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBudWxsIERPTSBtYW5hZ2VyLiBDb3VsZCBub3QgcHJvY2VzcyBtdWx0aS1jb2x1bW4gbWFya2Rvd24uXCIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBzdGFydCB0YWcgb24gdGhlIGRvY3VtZW50IHdlIHNldCB0aGUgZmxhZyB0byBzdGFydFxyXG4gICAgICAgICAgICAgKiBwYXJzaW5nIHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zU3RhcnRUYWcoZWwudGV4dENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWxlRE9NTWFuYWdlci5zZXRIYXNTdGFydFRhZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogXHJcbiAgICAgICAgICAgICAqIElmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGFueSBzdGFydCB0YWdzIHdlIGlnbm9yZSB0aGVcclxuICAgICAgICAgICAgICogcmVzdCBvZiB0aGUgcGFyc2luZy4gVGhpcyBpcyBvbmx5IHNldCB0byB0cnVlIG9uY2UgdGhlIGZpcnN0XHJcbiAgICAgICAgICAgICAqIHN0YXJ0IHRhZyBlbGVtZW50IGlzIHBhcnNlZCBhYm92ZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKGZpbGVET01NYW5hZ2VyLmdldEhhc1N0YXJ0VGFnKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBUYWtlIHRoZSBpbmZvIHByb3ZpZGVkIGFuZCBnZW5lcmF0ZSB0aGUgcmVxdWlyZWQgdmFyaWFibGVzIGZyb20gXHJcbiAgICAgICAgICAgICAqIHRoZSBsaW5lIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IGRvY0xpbmVzID0gaW5mby50ZXh0LnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGluZXNBYm92ZUFycmF5ID0gZG9jTGluZXMuc2xpY2UoMCwgaW5mby5saW5lU3RhcnQpXHJcbiAgICAgICAgICAgIGxldCBsaW5lc09mRWxlbWVudCA9IGRvY0xpbmVzLnNsaWNlKGluZm8ubGluZVN0YXJ0LCBpbmZvLmxpbmVFbmQgKyAxKTtcclxuICAgICAgICAgICAgbGV0IGxpbmVzQmVsb3dBcnJheSA9IGRvY0xpbmVzLnNsaWNlKGluZm8ubGluZUVuZCArIDEpXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSWYgdGhlIGN1cnJlbnQgbGluZSBpcyBhIHN0YXJ0IHRhZyB3ZSB3YW50IHRvIHNldCB1cCB0aGVcclxuICAgICAgICAgICAgICogcmVnaW9uIG1hbmFnZXIuIFRoZSByZWdpb25hbCBtYW5hZ2VyIHRha2VzIGNhcmVcclxuICAgICAgICAgICAgICogb2YgYWxsIGl0ZW1zIGJldHdlZW4gaXQncyBzdGFydCBhbmQgZW5kIHRhZ3Mgd2hpbGUgdGhlXHJcbiAgICAgICAgICAgICAqIGZpbGUgbWFuYWdlciB3ZSBnb3QgYWJvdmUgYWJvdmUgdGFrZXMgY2FyZSBvZiBhbGwgcmVnaW9uYWwgXHJcbiAgICAgICAgICAgICAqIG1hbmFnZXJzIGluIGVhY2ggZmlsZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50VGV4dFNwYWNlZCA9IGxpbmVzT2ZFbGVtZW50LnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBcIlxcblwiICsgY3VycjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zU3RhcnRUYWcoZWwudGV4dENvbnRlbnQpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIFxyXG4gICAgICAgICAgICAgICAgICogU2V0IHVwIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gYWN0IGFzIHRoZSBwYXJlbnQgZm9yIHRoZSBcclxuICAgICAgICAgICAgICAgICAqIG11bHRpLWNvbHVtbiByZWdpb24uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuWzBdLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChNdWx0aUNvbHVtbkxheW91dENTUy5SZWdpb25Sb290Q29udGFpbmVyRGl2KVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlckVycm9yUmVnaW9uID0gZWwuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGAke011bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkVycm9yQ29udGFpbmVyRGl2fSwgJHtNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVycm9yTWVzc2FnZX1gLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyQ29sdW1uUmVnaW9uID0gZWwuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IE11bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkNvbnRlbnRDb250YWluZXJEaXZcclxuICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0QmxvY2tEYXRhID0gbXVsdGlDb2x1bW5QYXJzZXIuZ2V0U3RhcnRCbG9ja0Fib3ZlTGluZShsaW5lc09mRWxlbWVudClcclxuICAgICAgICAgICAgICAgIGxldCByZWdpb25LZXkgPSBzdGFydEJsb2NrRGF0YS5zdGFydEJsb2NrS2V5O1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZURPTU1hbmFnZXIuY2hlY2tLZXlFeGlzdHMocmVnaW9uS2V5KSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgeyBudW1iZXJPZlRhZ3MsIGtleXMgfSA9IG11bHRpQ29sdW1uUGFyc2VyLmNvdW50U3RhcnRUYWdzKGluZm8udGV4dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBudW1NYXRjaGVzID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZUYWdzOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgY2hlY2tlZCBpZiBrZXkgZXhpc3RzIG9uZSBvZiB0aGVzZSBoYXMgdG8gbWF0Y2guXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGtleXNbaV0gPT09IHJlZ2lvbktleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWF0Y2hlcysrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gZGlzcGxheSBhbiBlcnJvciBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDIgb2YgdGhlIHNhbWUgaWQgYWNyb3NzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIGRvY3VtZW50LiBUaGlzIHByZXZlbnRzIGVycm9zIHdoZW4gb2JzaWRpYW4gcmVsb2FkcyB0aGUgd2hvbGUgZG9jdW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgYXJlIHR3byBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIG1hcC5cclxuICAgICAgICAgICAgICAgICAgICBpZihudW1NYXRjaGVzID49IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVnaW9uS2V5ID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJFcnJvclJlZ2lvbi5pbm5lclRleHQgPSBcIkZvdW5kIG11bHRpcGxlIHJlZ2lvbnMgd2l0aCBlbXB0eSBJRHMuIFBsZWFzZSBzZXQgYSB1bmlxdWUgSUQgYWZ0ZXIgZWFjaCBzdGFydCB0YWcuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcXG5PciB1c2UgJ0ZpeCBNaXNzaW5nIElEcycgaW4gdGhlIGNvbW1hbmQgcGFsZXR0ZSBhbmQgcmVsb2FkIHRoZSBkb2N1bWVudC5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRXJyb3JSZWdpb24uaW5uZXJUZXh0ID0gXCJSZWdpb24gSUQgYWxyZWFkeSBleGlzdHMgaW4gZG9jdW1lbnQsIHBsZWFzZSBzZXQgYSB1bmlxdWUgSUQuXFxuRUc6ICc9PT0gbXVsdGktY29sdW1uLXN0YXJ0OiByYW5kb21JRCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbC5pZCA9IGBNdWx0aUNvbHVtbklEOiR7cmVnaW9uS2V5fWBcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE1hcmtkb3duUmVuZGVyZXIgPSBuZXcgTWFya2Rvd25SZW5kZXJDaGlsZChlbCk7XHJcbiAgICAgICAgICAgICAgICBmaWxlRE9NTWFuYWdlci5jcmVhdGVSZWdpb25hbE1hbmFnZXIocmVnaW9uS2V5LCBlbCwgcmVuZGVyRXJyb3JSZWdpb24sIHJlbmRlckNvbHVtblJlZ2lvbik7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50TWFya2Rvd25SZW5kZXJlci5vbnVubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihmaWxlRE9NTWFuYWdlcikge1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVET01NYW5hZ2VyLnJlbW92ZVJlZ2lvbihzdGFydEJsb2NrRGF0YS5zdGFydEJsb2NrS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY3R4LmFkZENoaWxkKGVsZW1lbnRNYXJrZG93blJlbmRlcmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIE5vdyB3ZSBoYXZlIGNyZWF0ZWQgb3VyIHJlZ2lvbmFsIG1hbmFnZXIgYW5kIGRlZmluZWQgd2hhdCBlbGVtZW50cyBcclxuICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgcmVuZGVyZWQgaW50by4gU28gd2UgY2FuIHJldHVybiB3aXRob3V0IGFueSBtb3JlIHByb2Nlc3NpbmcuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQ2hlY2sgaWYgYW55IG9mIHRoZSBsaW5lcyBhYm92ZSB1cyBjb250YWluIGEgc3RhcnQgYmxvY2ssIGFuZCBpZlxyXG4gICAgICAgICAgICAgKiBzbyBnZXQgdGhlIGxpbmVzIGZyb20gb3VyIGN1cnJlbnQgZWxlbWVudCB0byB0aGUgc3RhcnQgYmxvY2suXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRCb2NrQWJvdmUgPSBtdWx0aUNvbHVtblBhcnNlci5nZXRTdGFydEJsb2NrQWJvdmVMaW5lKGxpbmVzQWJvdmVBcnJheSk7XHJcbiAgICAgICAgICAgIGlmKHN0YXJ0Qm9ja0Fib3ZlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFdlIG5vdyBrbm93IHdlJ3JlIHdpdGhpbiBhIG11bHRpLWNvbHVtbiByZWdpb24sIHNvIHdlIHVwZGF0ZSBvdXJcclxuICAgICAgICAgICAgICogbGlzdCBvZiBsaW5lcyBhYm92ZSB0byBqdXN0IGJlIHRoZSBpdGVtcyB3aXRoaW4gdGhpcyByZWdpb24uXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsaW5lc0Fib3ZlQXJyYXkgPSBzdGFydEJvY2tBYm92ZS5saW5lc0Fib3ZlQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogV2UgdXNlIHRoZSBzdGFydCBibG9jaydzIGtleSB0byBnZXQgb3VyIHJlZ2lvbmFsIG1hbmFnZXIuIElmIHRoaXNcclxuICAgICAgICAgICAgICogbG9va3VwIGZhaWxzIHdlIGNhbiBub3QgY29udGludWUgcHJvY2Vzc2luZyB0aGlzIGVsZW1lbnQuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsZXQgcmVnaW9uYWxNYW5hZ2VyOiBSZWdpb25ET01NYW5hZ2VyID0gZmlsZURPTU1hbmFnZXIuZ2V0UmVnaW9uYWxNYW5hZ2VyKHN0YXJ0Qm9ja0Fib3ZlLnN0YXJ0QmxvY2tLZXkpO1xyXG4gICAgICAgICAgICBpZihyZWdpb25hbE1hbmFnZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVG8gbWFrZSBzdXJlIHdlJ3JlIHBsYWNpbmcgdGhlIGl0ZW0gaW4gdGhlIHJpZ2h0IGxvY2F0aW9uIChhbmQgXHJcbiAgICAgICAgICAgICAqIG92ZXJ3cml0ZSBlbGVtZW50cyB0aGF0IGFyZSBub3cgZ29uZSkgd2Ugbm93IHdhbnQgYWxsIG9mIHRoZVxyXG4gICAgICAgICAgICAgKiBsaW5lcyBhZnRlciB0aGlzIGVsZW1lbnQgdXAgdG8gdGhlIGVuZCB0YWcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsaW5lc0JlbG93QXJyYXkgPSAgbXVsdGlDb2x1bW5QYXJzZXIuZ2V0RW5kQmxvY2tCZWxvdyhsaW5lc0JlbG93QXJyYXkpO1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE5vdyB3ZSB0YWtlIHRoZSBsaW5lcyBhYm92ZSBvdXIgY3VycmVudCBlbGVtZW50IHVwIHVudGlsIHRoZVxyXG4gICAgICAgICAgICAgKiBzdGFydCByZWdpb24gdGFnIGFuZCByZW5kZXIgdGhhdCBpbnRvIGFuIEhUTUwgZWxlbWVudC4gV2Ugd2lsbCBcclxuICAgICAgICAgICAgICogdXNlIHRoZXNlIGVsZW1lbnRzIHRvIGRldGVybWluZSB3aGVyZSB0byBwbGFjZSBvdXIgY3VycmVudCBlbGVtZW50LlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IHNpYmxpbmdzQWJvdmU6IEhUTUxEaXZFbGVtZW50ID0gcmVuZGVyTWFya2Rvd25Gcm9tTGluZXMobGluZXNBYm92ZUFycmF5LCBzb3VyY2VQYXRoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaWJsaW5nc0JlbG93OiBIVE1MRGl2RWxlbWVudCA9IHJlbmRlck1hcmtkb3duRnJvbUxpbmVzKGxpbmVzQmVsb3dBcnJheSwgc291cmNlUGF0aCk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogU2V0IHVwIG91ciBkb20gb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBtYW5hZ2VyLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmplY3Q6IERPTU9iamVjdCA9IG5ldyBET01PYmplY3QoZWwpXHJcbiAgICAgICAgICAgIGVsLmlkID0gY3VycmVudE9iamVjdC5VSUQ7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogTm93IHdlIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyIGFuZCB0aGVuIHNldHVwIHRoZVxyXG4gICAgICAgICAgICAgKiBjYWxsYmFjayBmb3Igd2hlbiB0aGUgb2JqZWN0IGlzIHJlbW92ZWQgZnJvbSB2aWV3IHRoYXQgd2lsbCByZW1vdmUgXHJcbiAgICAgICAgICAgICAqIHRoZSBpdGVtIGZyb20gdGhlIG1hbmFnZXIuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZWdpb25hbE1hbmFnZXIuYWRkT2JqZWN0KHNpYmxpbmdzQWJvdmUsIHNpYmxpbmdzQmVsb3csIGN1cnJlbnRPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRNYXJrZG93blJlbmRlcmVyID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoZWwpO1xyXG4gICAgICAgICAgICBlbGVtZW50TWFya2Rvd25SZW5kZXJlci5vbnVubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHJlZ2lvbmFsTWFuYWdlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgdmlldyBoZXJlIGFmdGVyIHRoZSBpdGVtIGlzIHJlbW92ZWRcclxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgbmVlZCB0byBnZXQgdGhlIGl0ZW0ncyBwYXJlbnQgZWxlbWVudCBiZWZvcmUgcmVtb3Zpbmcgb2JqZWN0IGZyb20gbWFuYWdlci5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnaW9uUmVuZGVyRGF0YTogTXVsdGlDb2x1bW5SZW5kZXJEYXRhID0gcmVnaW9uYWxNYW5hZ2VyLmdldFJlZ2lvblJlbmRlckRhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLnJlbW92ZU9iamVjdChjdXJyZW50T2JqZWN0LlVJRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAqIE5lZWQgdG8gY2hlY2sgaGVyZSBpZiBlbGVtZW50IGlzIG51bGwgYXMgdGhpcyBjbG9zdXJlIHdpbGwgYmUgY2FsbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICogcmVwZWF0ZWRseSBvbiBmaWxlIGNoYW5nZS5cclxuICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZihyZWdpb25SZW5kZXJEYXRhLnBhcmVudFJlbmRlckVsZW1lbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvbHVtbk1hcmtkb3duKHJlZ2lvblJlbmRlckRhdGEucGFyZW50UmVuZGVyRWxlbWVudCwgcmVnaW9uUmVuZGVyRGF0YS5kb21PYmplY3RzLCByZWdpb25SZW5kZXJEYXRhLnBhcmVudFJlbmRlclNldHRpbmdzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY3R4LmFkZENoaWxkKGVsZW1lbnRNYXJrZG93blJlbmRlcmVyKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBOb3cgd2UgY2hlY2sgaWYgb3VyIGN1cnJlbnQgZWxlbWVudCBpcyBhIHNwZWNpYWwgZmxhZyBzbyB3ZSBjYW5cclxuICAgICAgICAgICAgICogcHJvcGVybHkgc2V0IHRoZSBlbGVtZW50IHRhZyB3aXRoaW4gdGhlIHJlZ2lvbmFsIG1hbmFnZXIuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZihtdWx0aUNvbHVtblBhcnNlci5jb250YWluc0VuZFRhZyhlbC50ZXh0Q29udGVudCkgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBlbC5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLlJlZ2lvbkVuZFRhZylcclxuICAgICAgICAgICAgICAgIHJlZ2lvbmFsTWFuYWdlci51cGRhdGVFbGVtZW50VGFnKGN1cnJlbnRPYmplY3QuVUlELCBET01PYmplY3RUYWcuZW5kUmVnaW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKG11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zQ29sRW5kVGFnKGVsZW1lbnRUZXh0U3BhY2VkKSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uRW5kVGFnKVxyXG4gICAgICAgICAgICAgICAgcmVnaW9uYWxNYW5hZ2VyLnVwZGF0ZUVsZW1lbnRUYWcoY3VycmVudE9iamVjdC5VSUQsIERPTU9iamVjdFRhZy5jb2x1bW5CcmVhayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihtdWx0aUNvbHVtblBhcnNlci5jb250YWluc0NvbFNldHRpbmdzVGFnKGVsZW1lbnRUZXh0U3BhY2VkKSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uU2V0dGluZ3MpXHJcbiAgICAgICAgICAgICAgICByZWdpb25hbE1hbmFnZXIuc2V0RWxlbWVudFRvU2V0dGluZ3NCbG9jayhjdXJyZW50T2JqZWN0LlVJRCwgZWxlbWVudFRleHRTcGFjZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25Db250ZW50KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVXNlIG91ciByZWdpb25hbCBtYW5hZ2VyIHRvIGdldCBldmVyeXRoaW5nIG5lZWRlZCB0byByZW5kZXIgdGhlIHJlZ2lvbi5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRFbGVtZW50RGF0YTogTXVsdGlDb2x1bW5SZW5kZXJEYXRhID0gcmVnaW9uYWxNYW5hZ2VyLmdldFJlZ2lvblJlbmRlckRhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2x1bW5NYXJrZG93bihwYXJlbnRFbGVtZW50RGF0YS5wYXJlbnRSZW5kZXJFbGVtZW50LCBwYXJlbnRFbGVtZW50RGF0YS5kb21PYmplY3RzLCBwYXJlbnRFbGVtZW50RGF0YS5wYXJlbnRSZW5kZXJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIHRoZSBkYXRhIGZvciB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiBhbmQgc2V0cyB1cCB0aGUgXHJcbiAgICAgKiB1c2VyIGRlZmluZWQgbnVtYmVyIG9mIGNoaWxkcmVuIHdpdGggdGhlIHByb3BlciBjc3MgY2xhc3NlcyB0byBiZSByZW5kZXJlZCBwcm9wZXJseS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiB3aWxsIGJlIHJlbmRlcmVkIHVuZGVyLlxyXG4gICAgICogQHBhcmFtIHJlZ2lvbkVsZW1lbnRzIFRoZSBsaXN0IG9mIERPTSBvYmplY3RzIHRoYXQgd2lsbCBiZSBjb3BwaWVkIHVuZGVyIHRoZSBwYXJlbnQgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIHNldHRpbmdzIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGZvciB0aGUgcmVnaW9uLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJDb2x1bW5NYXJrZG93bihwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgcmVnaW9uRWxlbWVudHM6IERPTU9iamVjdFtdLCBzZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncykge1xyXG5cclxuICAgICAgICBsZXQgbXVsdGlDb2x1bW5QYXJlbnQgPSBjcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICBjbHM6IE11bHRpQ29sdW1uTGF5b3V0Q1NTLlJlZ2lvbkNvbHVtbkNvbnRhaW5lckRpdixcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZihzZXR0aW5ncy5kcmF3U2hhZG93ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50LmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuUmVnaW9uU2hhZG93KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFBhc3Mgb3VyIHBhcmVudCBkaXYgYW5kIHNldHRpbmdzIHRvIHBhcnNlciB0byBjcmVhdGUgdGhlIHJlcXVpcmVkXHJcbiAgICAgICAgICogY29sdW1uIGRpdnMgYXMgY2hpbGRyZW4gb2YgdGhlIHBhcmVudC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBsZXQgY29sdW1uQ29udGVudERpdnMgPSBnZXRDb2x1bW5Db250ZW50RGl2cyhzZXR0aW5ncywgbXVsdGlDb2x1bW5QYXJlbnQpO1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBjb2x1bW5Db250ZW50RGl2cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZihzZXR0aW5ncy5kcmF3Qm9yZGVyID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2c1tpXS5hZGRDbGFzcyhNdWx0aUNvbHVtblN0eWxlQ1NTLkNvbHVtbkJvcmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKHNldHRpbmdzLmRyYXdTaGFkb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzW2ldLmFkZENsYXNzKE11bHRpQ29sdW1uU3R5bGVDU1MuQ29sdW1uU2hhZG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIG1hcmtkb3duIHJlbmRlcmVyIHRvIHBhcnNlIHRoZSBwYXNzZWQgbWFya2Rvd25cclxuICAgICAgICAvLyBiZXR3ZWVuIHRoZSB0YWdzLlxyXG4gICAgICAgIGxldCBtYXJrZG93blJlbmRlckNoaWxkID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoXHJcbiAgICAgICAgICAgIG11bHRpQ29sdW1uUGFyZW50XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IG90aGVyIGNoaWxkIGZyb20gdGhlIHBhcmVudCBzbyBcclxuICAgICAgICAvLyB3ZSBkb250IGVuZCB1cCB3aXRoIG11bHRpcGxlIHNldHMgb2YgZGF0YS4gVGhpcyBzaG91bGRcclxuICAgICAgICAvLyByZWFsbHkgb25seSBuZWVkIHRvIGxvb3Agb25jZSBmb3IgaSA9IDAgYnV0IGxvb3AganVzdFxyXG4gICAgICAgIC8vIGluIGNhc2UuXHJcbiAgICAgICAgZm9yKGxldCBpID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG1hcmtkb3duUmVuZGVyQ2hpbGQuY29udGFpbmVyRWwpO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSAwO1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCByZWdpb25FbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlZ2lvbkVsZW1lbnRzW2ldLnRhZyAhPT0gRE9NT2JqZWN0VGFnLnN0YXJ0UmVnaW9uICAgIHx8XHJcbiAgICAgICAgICAgICAgICByZWdpb25FbGVtZW50c1tpXS50YWcgIT09IERPTU9iamVjdFRhZy5yZWdpb25TZXR0aW5ncyB8fFxyXG4gICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0udGFnICE9PSBET01PYmplY3RUYWcuZW5kUmVnaW9uICAgICAgfHxcclxuICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLnRhZyAhPT0gRE9NT2JqZWN0VGFnLmNvbHVtbkJyZWFrICkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBlbGVtZW50cyBpbiBhIHdyYXBwZXIgY29udGFpbmVyIHVudGlsIHdlIGRldGVybWluZVxyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBjcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogTXVsdGlDb2x1bW5MYXlvdXRDU1MuQ29sdW1uRHVhbEVsZW1lbnRDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnRDb250YWluZXIgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGp1c3QgbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gZGlzcGxheS5cclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVnaW9uRWxlbWVudHNbaV0uZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTERpdkVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnNbY29sdW1uSW5kZXhdLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIHRhZyBpcyBhIGNvbHVtbiBicmVhayB3ZSB1cGRhdGUgdGhlIGNvbHVtbiBpbmRleCBhZnRlclxyXG4gICAgICAgICAgICAgICAgICogYXBwZW5kaW5nIHRoZSBpdGVtIHRvIHRoZSBjb2x1bW4gZGl2LiBUaGlzIGtlZXBzIHRoZSBtYWluIERPTVxyXG4gICAgICAgICAgICAgICAgICogY2xlYW5lciBieSByZW1vdmluZyBvdGhlciBpdGVtcyBhbmQgcGxhY2luZyB0aGVtIGFsbCB3aXRoaW5cclxuICAgICAgICAgICAgICAgICAqIGEgcmVnaW9uIGNvbnRhaW5lci5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYocmVnaW9uRWxlbWVudHNbaV0udGFnID09PSBET01PYmplY3RUYWcuY29sdW1uQnJlYWsgJiYgXHJcbiAgICAgICAgICAgICAgICAgICAoY29sdW1uSW5kZXggKyAxKSA8IHNldHRpbmdzLm51bWJlck9mQ29sdW1ucykge1xyXG4gICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRVcER1YWxSZW5kZXIoZG9tRWxlbWVudDogRE9NT2JqZWN0KSB7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIG91ciBlbGVtZW50IGlzIG9mIFwic3BlY2lhbFJlbmRlclwiIHR5cGUgaXQgKm1heSogbmVlZCB0byBiZSByZW5kZXJlZFxyXG4gICAgICAgICAqIHVzaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHJhdGhlciB0aGFuIGEgY29weS4gRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnRcclxuICAgICAgICAgKiBtYXkgaGF2ZSBhbiBvbkNsaWNrIGV2ZW50IHRoYXQgd291bGQgbm90IGdldCBjb3BwaWVkIHRvIHRoZSBjbG9uZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBJZiB3ZSBqdXN0IG1vdmVkIHRoZXNlIGVsZW1lbnRzIGludG8gdGhlIHJlZ2lvbiBpdCB3b3VsZCBnZXQgXHJcbiAgICAgICAgICogbW92ZWQgYmFjayBvdXQgaW50byB0aGUgb3JpZ2luYWwgbG9jYXRpb24gaW4gdGhlIERPTSBieSBvYnNpZGlhblxyXG4gICAgICAgICAqIHdoZW4gc2Nyb2xsaW5nIG9yIHdoZW4gdGhlIGZpbGUgaXMgdXBkYXRlZC4gT24gdGhlIG5leHQgcmVmcmVzaCBpdFxyXG4gICAgICAgICAqIHdvdWxkIGJlIG1vdmVkIGJhY2sgYnV0IHRoYXQgY2FuIGxlYWQgdG8gYSByZWdpb24ganVtcGluZ1xyXG4gICAgICAgICAqIGFyb3VuZCBhcyB0aGUgaXRlbSBpcyBtb3ZlZCBpbiBhbmQgb3V0LiBcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBIZXJlIHdlIHNldCB1cCB0aGUgZGl2IHRvIGNvbnRhaW4gdGhlIGVsZW1lbnQgYW5kIGNyZWF0ZVxyXG4gICAgICAgICAqIGEgdmlzdWFsIG9ubHkgY2xvbmUgb2YgaXQuIFRoZSBjbG9uZSB3aWxsIG9ubHkgYmUgdmlzaWJsZVxyXG4gICAgICAgICAqIHdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBpbiB0aGUgbXVsdGktY29sdW1uIHJlZ2lvbiBzbyBpdFxyXG4gICAgICAgICAqIHNhdmVzIHVzIGZyb20gdGhlIHZpc3VhbCBub2lzZSBvZiB0aGUgcmVnaW9uIGp1bXBpbmcgYXJvdW5kLlxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBlbGVtZW50cyBiZWZvcmUgd2Ugc2V0IHVwIHRoZSBkdWFsIHJlbmRlcmVkIGVsZW1lbnRzLlxyXG4gICAgICAgIGxldCBjb250YWluZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IGRvbUVsZW1lbnQuZWxlbWVudENvbnRhaW5lclxyXG4gICAgICAgIGxldCByZW5kZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IGRvbUVsZW1lbnQuZWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudFxyXG4gICAgICAgIGZvcihsZXQgaSA9IGNvbnRhaW5lckVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5jaGlsZHJlbltpXS5kZXRhY2goKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQocmVuZGVyRWxlbWVudCkgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIHJlbmRlckVsZW1lbnQuYWRkQ2xhc3MoTXVsdGlDb2x1bW5MYXlvdXRDU1MuT3JpZ2luYWxFbGVtZW50VHlwZSlcclxuXHJcbiAgICAgICAgbGV0IGNsb25lZE5vZGUgPSByZW5kZXJFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBjbG9uZWROb2RlLmFkZENsYXNzKE11bHRpQ29sdW1uTGF5b3V0Q1NTLkNsb25lZEVsZW1lbnRUeXBlKVxyXG4gICAgICAgIGNsb25lZE5vZGUucmVtb3ZlQ2xhc3NlcyhbTXVsdGlDb2x1bW5TdHlsZUNTUy5SZWdpb25Db250ZW50LCBNdWx0aUNvbHVtbkxheW91dENTUy5PcmlnaW5hbEVsZW1lbnRUeXBlXSlcclxuICAgICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGNsb25lZE5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVJlbmRlcmVkTWFya2Rvd24ocmVnaW9uRWxlbWVudHM6IERPTU9iamVjdFtdKSB7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdvIHRocm91Z2ggZXZlcnkgbm9kZSBvZiB0aGUgcmVnaW9uIGxvb2tpbmcgZm9yIHRoZSBcInNwZWNpYWxSZW5kZXJcIiB0eXBlXHJcbiAgICAgICAgICogd2hpY2ggYXJlIHRoZSBlbGVtZW50cyB0aGF0IG1heSBuZWVkIHRvIGJlIHJlbmRlcmVkIHVzaW5nIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgICAqIGVsZW1lbnQgcmF0aGVyIHRoYW4gYSBjb3B5LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCByZWdpb25FbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBIZXJlIHdlIGNoZWNrIGV2ZXJ5IGl0ZW0gYWdhaW4gdG8gc2VlIGlmIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLlxyXG4gICAgICAgICAgICAgKiBUaGlzIGNvdWxkIGJlIG1hZGUgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgaWYgd2UgY2FuIHRydWx5IGRldGVybWluZVxyXG4gICAgICAgICAgICAgKiB3ZXRoZXIgYW4gaXRlbSBpcyBhIG5vcm1hbCByZW5kZXIgaXRlbSwgaG93ZXZlciBpdCBzZWVtcyBsaWtlIGl0XHJcbiAgICAgICAgICAgICAqIG1heSB0YWtlIGEgYml0IG9mIGV4dHJhIHRpbWUgaW4gb3JkZXIgZm9yIHRoZSBjbGFzc2VzIHdlIGNoZWNrIGZvclxyXG4gICAgICAgICAgICAgKiB0byBiZSBhZGRlZCB0byB0aGUgZWxlbWVudHMuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudFR5cGUgPSByZWdpb25FbGVtZW50c1tpXS5lbGVtZW50VHlwZTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG5vdCBjdXJyZW50bHkgYSBzcGVjaWFsIHJlbmRlciBlbGVtZW50IHdlIGNoZWNrIGFnYWluXHJcbiAgICAgICAgICAgIC8vIGFzIHRoZSBvcmlnaW5hbCBlbGVtZW50IG1heSBoYXZlIGJlZW4gdXBkYXRlZC5cclxuICAgICAgICAgICAgaWYoZWxlbWVudFR5cGUgIT09IEVsZW1lbnRSZW5kZXJUeXBlLnNwZWNpYWxSZW5kZXIpIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyByZXN1bHQgcmV0dXJucyBhcyBhIHNwZWNpYWwgcmVuZGVyZXIgd2UgdXBkYXRlIHNvXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdvbnQgcnVuIGFnYWluIGZvciB0aGlzIGl0ZW0uXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSA9IGdldEVsZW1lbnRSZW5kZXJUeXBlKHJlZ2lvbkVsZW1lbnRzW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZihlbGVtZW50VHlwZSA9PT0gRWxlbWVudFJlbmRlclR5cGUuc3BlY2lhbFJlbmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVnaW9uRWxlbWVudHNbaV0uZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFVwRHVhbFJlbmRlcihyZWdpb25FbGVtZW50c1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXRzIHVwIHRoZSBDU1MgY2xhc3NlcyBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGJhc2VkIG9uIHRoZSBwYXNzZWQgc2V0dGluZ3MuXHJcbiAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgdXNlciBkZWZpbmVkIHNldHRpbmdzIHRoYXQgZGV0ZXJtaW5lIHdoYXQgQ1NTIGlzIHNldCBoZXJlLlxyXG4gKiBAcGFyYW0gbXVsdGlDb2x1bW5QYXJlbnQgVGhlIHBhcmVudCBvYmplY3QgdGhhdCB0aGUgY29sdW1uIGRpdnMgd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxyXG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBjb2x1bW4gZGl2cyBjcmVhdGVkIHVuZGVyIHRoZSBwYXNzZWQgcGFyZW50IGVsZW1lbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db250ZW50RGl2cyhzZXR0aW5nczogTXVsdGlDb2x1bW5TZXR0aW5ncywgbXVsdGlDb2x1bW5QYXJlbnQ6IEhUTUxEaXZFbGVtZW50KTogSFRNTERpdkVsZW1lbnRbXSB7XHJcblxyXG4gICAgbGV0IGNvbHVtbkNvbnRlbnREaXZzOiBIVE1MRGl2RWxlbWVudFtdID0gW11cclxuICAgIGlmKHNldHRpbmdzLm51bWJlck9mQ29sdW1ucyA9PT0gMikge1xyXG5cclxuICAgICAgICBzd2l0Y2goc2V0dGluZ3MuY29sdW1uTGF5b3V0KSB7XHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LnN0YW5kYXJkKTpcclxuICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQubWlkZGxlKTpcclxuICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQuY2VudGVyKTpcclxuICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQudGhpcmQpOlxyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdHdvRXF1YWxDb2x1bW5zX0xlZnRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0d29FcXVhbENvbHVtbnNfUmlnaHRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmxlZnQpOlxyXG4gICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5maXJzdCk6XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0d29Db2x1bW5zSGVhdnlMZWZ0X0xlZnRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0d29Db2x1bW5zSGVhdnlMZWZ0X1JpZ2h0YFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5yaWdodCk6XHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LnNlY29uZCk6XHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0Lmxhc3QpOlxyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdHdvQ29sdW1uc0hlYXZ5UmlnaHRfTGVmdGBcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGBjb2x1bW5Db250ZW50IHR3b0NvbHVtbnNIZWF2eVJpZ2h0X1JpZ2h0YFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZihzZXR0aW5ncy5udW1iZXJPZkNvbHVtbnMgPT09IDMpIHtcclxuXHJcbiAgICAgICAgc3dpdGNoKHNldHRpbmdzLmNvbHVtbkxheW91dCkge1xyXG4gICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5zdGFuZGFyZCk6XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0aHJlZUVxdWFsQ29sdW1uc19MZWZ0YFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdGhyZWVFcXVhbENvbHVtbnNfTWlkZGxlYFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdGhyZWVFcXVhbENvbHVtbnNfUmlnaHRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmxlZnQpOlxyXG4gICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5maXJzdCk6XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0aHJlQ29sdW1uc0hlYXZ5TGVmdF9MZWZ0YFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdGhyZUNvbHVtbnNIZWF2eUxlZnRfTWlkZGxlYFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdGhyZUNvbHVtbnNIZWF2eUxlZnRfUmlnaHRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0Lm1pZGRsZSk6XHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LmNlbnRlcik6XHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LnNlY29uZCk6XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0aHJlQ29sdW1uc0hlYXZ5TWlkZGxlX0xlZnRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5Db250ZW50RGl2cy5wdXNoKG11bHRpQ29sdW1uUGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xzOiBgY29sdW1uQ29udGVudCB0aHJlQ29sdW1uc0hlYXZ5TWlkZGxlX01pZGRsZWBcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGBjb2x1bW5Db250ZW50IHRocmVDb2x1bW5zSGVhdnlNaWRkbGVfUmlnaHRgXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UoQ29sdW1uTGF5b3V0LnJpZ2h0KTpcclxuICAgICAgICAgICAgY2FzZShDb2x1bW5MYXlvdXQudGhpcmQpOlxyXG4gICAgICAgICAgICBjYXNlKENvbHVtbkxheW91dC5sYXN0KTpcclxuICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGBjb2x1bW5Db250ZW50IHRocmVDb2x1bW5zSGVhdnlSaWdodF9MZWZ0YFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uQ29udGVudERpdnMucHVzaChtdWx0aUNvbHVtblBhcmVudC5jcmVhdGVEaXYoe1xyXG4gICAgICAgICAgICAgICAgICAgIGNsczogYGNvbHVtbkNvbnRlbnQgdGhyZUNvbHVtbnNIZWF2eVJpZ2h0X01pZGRsZWBcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkNvbnRlbnREaXZzLnB1c2gobXVsdGlDb2x1bW5QYXJlbnQuY3JlYXRlRGl2KHtcclxuICAgICAgICAgICAgICAgICAgICBjbHM6IGBjb2x1bW5Db250ZW50IHRocmVDb2x1bW5zSGVhdnlSaWdodF9SaWdodGBcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uQ29udGVudERpdnM7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgdHlwZSBuZWFyYnlTaWJsaW5ncyA9IHsgXHJcbiAgICBzaWJsaW5nc0Fib3ZlOiBIVE1MRGl2RWxlbWVudCxcclxuICAgIGN1cnJlbnRPYmplY3Q6IERPTU9iamVjdCwgXHJcbn1cclxuZnVuY3Rpb24gcmVuZGVyTWFya2Rvd25Gcm9tTGluZXMobWRMaW5lczogc3RyaW5nW10sIHNvdXJjZVBhdGg6IHN0cmluZyk6IEhUTUxEaXZFbGVtZW50IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdlIHJlLXJlbmRlciBhbGwgb2YgdGhlIGl0ZW1zIGFib3ZlIG91ciBlbGVtZW50LCB1bnRpbCB0aGUgc3RhcnQgdGFnLCBcclxuICAgICAqIHNvIHdlIGNhbiBkZXRlcm1pbmUgd2hlcmUgdG8gcGxhY2UgdGhlIG5ldyBpdGVtIGluIHRoZSBtYW5hZ2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBUT0RPOiBDYW4gcmVkdWNlIHRoZSBhbW91bnQgbmVlZGluZyB0byBiZSByZW5kZXJlZCBieSBvbmx5IHJlbmRlcmluZyB0b1xyXG4gICAgICogdGhlIHN0YXJ0IHRhZyBvciBhIGNvbHVtbi1icmVhayB3aGljaGV2ZXIgaXMgY2xvc2VyLlxyXG4gICAgICovXHJcbiAgICBsZXQgc2libGluZ3MgPSBjcmVhdGVEaXYoKTtcclxuICAgIGxldCBtYXJrZG93blJlbmRlckNoaWxkID0gbmV3IE1hcmtkb3duUmVuZGVyQ2hpbGQoXHJcbiAgICAgICAgc2libGluZ3NcclxuICAgICk7XHJcbiAgICBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKFxyXG4gICAgICAgIG1kTGluZXMucmVkdWNlKChwcmV2LCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2ICsgXCJcXG5cIiAgKyBjdXJyZW50O1xyXG4gICAgICAgIH0sIFwiXCIpLFxyXG4gICAgICAgIHNpYmxpbmdzLFxyXG4gICAgICAgIHNvdXJjZVBhdGgsXHJcbiAgICAgICAgbWFya2Rvd25SZW5kZXJDaGlsZFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gc2libGluZ3M7XHJcbn0iXSwibmFtZXMiOlsiUGx1Z2luIiwiTm90aWNlIiwibXVsdGlDb2x1bW5QYXJzZXIuaXNTdGFydFRhZ1dpdGhJRCIsIm11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zU3RhcnRUYWciLCJtdWx0aUNvbHVtblBhcnNlci5nZXRTdGFydEJsb2NrQWJvdmVMaW5lIiwibXVsdGlDb2x1bW5QYXJzZXIuY291bnRTdGFydFRhZ3MiLCJNYXJrZG93blJlbmRlckNoaWxkIiwibXVsdGlDb2x1bW5QYXJzZXIuZ2V0RW5kQmxvY2tCZWxvdyIsIm11bHRpQ29sdW1uUGFyc2VyLmNvbnRhaW5zRW5kVGFnIiwibXVsdGlDb2x1bW5QYXJzZXIuY29udGFpbnNDb2xFbmRUYWciLCJtdWx0aUNvbHVtblBhcnNlci5jb250YWluc0NvbFNldHRpbmdzVGFnIiwiTWFya2Rvd25SZW5kZXJlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxD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
diff --git a/.obsidian/plugins/multi-column-markdown/manifest.json b/.obsidian/plugins/multi-column-markdown/manifest.json
deleted file mode 100644
index f53a5980..00000000
--- a/.obsidian/plugins/multi-column-markdown/manifest.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "id": "multi-column-markdown",
- "name": "Multi-Column Markdown",
- "version": "0.4.3",
- "minAppVersion": "0.13.23",
- "description": "This plugin adds functionality to create markdown documents with multiple columns of content viewable within Obsidian's preview mode",
- "author": "Cameron Robinson",
- "authorUrl": "https://portfolio.ckrobinson.net",
- "isDesktopOnly": false
-}
diff --git a/.obsidian/plugins/multi-column-markdown/styles.css b/.obsidian/plugins/multi-column-markdown/styles.css
deleted file mode 100644
index 8c370cda..00000000
--- a/.obsidian/plugins/multi-column-markdown/styles.css
+++ /dev/null
@@ -1,134 +0,0 @@
-.twoEqualColumns_Left {
- width: 49.75%;
- margin-right: 0.25%;
-}
-
-.twoEqualColumns_Right {
- width: 49.75%;
- margin-left: 0.25%;
-}
-
-.twoColumnsHeavyLeft_Left {
- width: 66.75%;
- margin-right: 0.25%;
-}
-.twoColumnsHeavyLeft_Right {
- width: 32.75%;
- margin-left: 0.25%;
-}
-
-.twoColumnsHeavyRight_Left {
- width: 32.75%;
- margin-right: 0.25%;
-}
-.twoColumnsHeavyRight_Right {
- width: 66.75%;
- margin-left: 0.25%;
-}
-
-.threeEqualColumns_Left {
- width: 32.75%;
- margin-right: 0.25%;
-}
-.threeEqualColumns_Middle {
- width: 32.5%;
- margin-inline: 0.25%;
-}
-.threeEqualColumns_Right {
- width: 33.75%;
- margin-left: 0.25%;
-}
-
-.threColumnsHeavyLeft_Left {
- width: 49.75%;
- margin-right: 0.25%;
-}
-.threColumnsHeavyLeft_Middle {
- width: 24.5%;
- margin-inline: 0.25%;
-}
-.threColumnsHeavyLeft_Right {
- width: 24.75%;
- margin-left: 0.25%;
-}
-
-.threColumnsHeavyMiddle_Left {
- width: 24.75%;
- margin-right: 0.25%;
-}
-.threColumnsHeavyMiddle_Middle {
- width: 49.5%;
- margin-inline: 0.25%;
-}
-.threColumnsHeavyMiddle_Right {
- width: 24.75%;
- margin-left: 0.25%;
-}
-
-.threColumnsHeavyRight_Left {
- width: 24.75%;
- margin-right: 0.25%;
-}
-.threColumnsHeavyRight_Middle {
- width: 24.5%;
- margin-inline: 0.25%;
-}
-.threColumnsHeavyRight_Right {
- width: 49.75%;
- margin-left: 0.25%;
-}
-
-.columnContent {
- padding-inline: 10px;
-}
-
-.columnBorder {
- border: grey;
- border-style: solid;
- border-width: 0.5px;
-}
-
-.columnShadow {
- box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow);
-}
-
-.multiColumnErrorMessage {
- margin-bottom: 10px;
- color: #dc3545;
- text-align: center;
-}
-
-.multiColumnContainer {
- margin: 1.5625em 0;
-}
-
-.multiColumnParent {
- padding: 0;
- overflow: hidden;
- color: var(--text-normal);
- page-break-inside: avoid;
-
- border-radius: 0.1rem;
-
- display:flex;
- flex-direction:row;
-}
-
-.multiColumnParentShadow {
- box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow);
-}
-
-.multiColumnRegionEndTag,
-.multiColumnBreak,
-.multiColumnSettings,
-.multiColumnContent {
- display: none;
-}
-
-.columnContent .multiColumnContent {
- display: block;
-}
-
-.MultiColumn_OriginalElement + .MultiColumn_ClonedElement {
- display: none;
-}
\ No newline at end of file
diff --git a/.obsidian/plugins/notion-like-tables/main.js b/.obsidian/plugins/notion-like-tables/main.js
new file mode 100644
index 00000000..003a8723
--- /dev/null
+++ b/.obsidian/plugins/notion-like-tables/main.js
@@ -0,0 +1,51010 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var __create = Object.create;
+var __defProp = Object.defineProperty;
+var __defProps = Object.defineProperties;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __getOwnPropSymbols = Object.getOwnPropertySymbols;
+var __getProtoOf = Object.getPrototypeOf;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __propIsEnum = Object.prototype.propertyIsEnumerable;
+var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+var __spreadValues = (a, b) => {
+ for (var prop in b || (b = {}))
+ if (__hasOwnProp.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ if (__getOwnPropSymbols)
+ for (var prop of __getOwnPropSymbols(b)) {
+ if (__propIsEnum.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ }
+ return a;
+};
+var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
+var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
+var __commonJS = (cb, mod) => function __require() {
+ return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+};
+var __export = (target, all) => {
+ __markAsModule(target);
+ for (var name in all)
+ __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __reExport = (target, module2, desc) => {
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
+ for (let key of __getOwnPropNames(module2))
+ if (!__hasOwnProp.call(target, key) && key !== "default")
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
+ }
+ return target;
+};
+var __toModule = (module2) => {
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
+};
+var __async = (__this, __arguments, generator) => {
+ return new Promise((resolve, reject) => {
+ var fulfilled = (value) => {
+ try {
+ step(generator.next(value));
+ } catch (e) {
+ reject(e);
+ }
+ };
+ var rejected = (value) => {
+ try {
+ step(generator.throw(value));
+ } catch (e) {
+ reject(e);
+ }
+ };
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
+ step((generator = generator.apply(__this, __arguments)).next());
+ });
+};
+
+// node_modules/object-assign/index.js
+var require_object_assign = __commonJS({
+ "node_modules/object-assign/index.js"(exports, module2) {
+ "use strict";
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+ function toObject(val) {
+ if (val === null || val === void 0) {
+ throw new TypeError("Object.assign cannot be called with null or undefined");
+ }
+ return Object(val);
+ }
+ function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+ var test1 = new String("abc");
+ test1[5] = "de";
+ if (Object.getOwnPropertyNames(test1)[0] === "5") {
+ return false;
+ }
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2["_" + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function(n) {
+ return test2[n];
+ });
+ if (order2.join("") !== "0123456789") {
+ return false;
+ }
+ var test3 = {};
+ "abcdefghijklmnopqrst".split("").forEach(function(letter) {
+ test3[letter] = letter;
+ });
+ if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") {
+ return false;
+ }
+ return true;
+ } catch (err) {
+ return false;
+ }
+ }
+ module2.exports = shouldUseNative() ? Object.assign : function(target, source) {
+ var from;
+ var to = toObject(target);
+ var symbols;
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+ for (var key in from) {
+ if (hasOwnProperty.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+ return to;
+ };
+ }
+});
+
+// node_modules/react/cjs/react.development.js
+var require_react_development = __commonJS({
+ "node_modules/react/cjs/react.development.js"(exports) {
+ "use strict";
+ if (true) {
+ (function() {
+ "use strict";
+ var _assign = require_object_assign();
+ var ReactVersion = "17.0.2";
+ var REACT_ELEMENT_TYPE = 60103;
+ var REACT_PORTAL_TYPE = 60106;
+ exports.Fragment = 60107;
+ exports.StrictMode = 60108;
+ exports.Profiler = 60114;
+ var REACT_PROVIDER_TYPE = 60109;
+ var REACT_CONTEXT_TYPE = 60110;
+ var REACT_FORWARD_REF_TYPE = 60112;
+ exports.Suspense = 60113;
+ var REACT_SUSPENSE_LIST_TYPE = 60120;
+ var REACT_MEMO_TYPE = 60115;
+ var REACT_LAZY_TYPE = 60116;
+ var REACT_BLOCK_TYPE = 60121;
+ var REACT_SERVER_BLOCK_TYPE = 60122;
+ var REACT_FUNDAMENTAL_TYPE = 60117;
+ var REACT_SCOPE_TYPE = 60119;
+ var REACT_OPAQUE_ID_TYPE = 60128;
+ var REACT_DEBUG_TRACING_MODE_TYPE = 60129;
+ var REACT_OFFSCREEN_TYPE = 60130;
+ var REACT_LEGACY_HIDDEN_TYPE = 60131;
+ if (typeof Symbol === "function" && Symbol.for) {
+ var symbolFor = Symbol.for;
+ REACT_ELEMENT_TYPE = symbolFor("react.element");
+ REACT_PORTAL_TYPE = symbolFor("react.portal");
+ exports.Fragment = symbolFor("react.fragment");
+ exports.StrictMode = symbolFor("react.strict_mode");
+ exports.Profiler = symbolFor("react.profiler");
+ REACT_PROVIDER_TYPE = symbolFor("react.provider");
+ REACT_CONTEXT_TYPE = symbolFor("react.context");
+ REACT_FORWARD_REF_TYPE = symbolFor("react.forward_ref");
+ exports.Suspense = symbolFor("react.suspense");
+ REACT_SUSPENSE_LIST_TYPE = symbolFor("react.suspense_list");
+ REACT_MEMO_TYPE = symbolFor("react.memo");
+ REACT_LAZY_TYPE = symbolFor("react.lazy");
+ REACT_BLOCK_TYPE = symbolFor("react.block");
+ REACT_SERVER_BLOCK_TYPE = symbolFor("react.server.block");
+ REACT_FUNDAMENTAL_TYPE = symbolFor("react.fundamental");
+ REACT_SCOPE_TYPE = symbolFor("react.scope");
+ REACT_OPAQUE_ID_TYPE = symbolFor("react.opaque.id");
+ REACT_DEBUG_TRACING_MODE_TYPE = symbolFor("react.debug_trace_mode");
+ REACT_OFFSCREEN_TYPE = symbolFor("react.offscreen");
+ REACT_LEGACY_HIDDEN_TYPE = symbolFor("react.legacy_hidden");
+ }
+ var MAYBE_ITERATOR_SYMBOL = typeof Symbol === "function" && Symbol.iterator;
+ var FAUX_ITERATOR_SYMBOL = "@@iterator";
+ function getIteratorFn(maybeIterable) {
+ if (maybeIterable === null || typeof maybeIterable !== "object") {
+ return null;
+ }
+ var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
+ if (typeof maybeIterator === "function") {
+ return maybeIterator;
+ }
+ return null;
+ }
+ var ReactCurrentDispatcher = {
+ current: null
+ };
+ var ReactCurrentBatchConfig = {
+ transition: 0
+ };
+ var ReactCurrentOwner = {
+ current: null
+ };
+ var ReactDebugCurrentFrame = {};
+ var currentExtraStackFrame = null;
+ function setExtraStackFrame(stack) {
+ {
+ currentExtraStackFrame = stack;
+ }
+ }
+ {
+ ReactDebugCurrentFrame.setExtraStackFrame = function(stack) {
+ {
+ currentExtraStackFrame = stack;
+ }
+ };
+ ReactDebugCurrentFrame.getCurrentStack = null;
+ ReactDebugCurrentFrame.getStackAddendum = function() {
+ var stack = "";
+ if (currentExtraStackFrame) {
+ stack += currentExtraStackFrame;
+ }
+ var impl = ReactDebugCurrentFrame.getCurrentStack;
+ if (impl) {
+ stack += impl() || "";
+ }
+ return stack;
+ };
+ }
+ var IsSomeRendererActing = {
+ current: false
+ };
+ var ReactSharedInternals = {
+ ReactCurrentDispatcher,
+ ReactCurrentBatchConfig,
+ ReactCurrentOwner,
+ IsSomeRendererActing,
+ assign: _assign
+ };
+ {
+ ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame;
+ }
+ function warn(format) {
+ {
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+ printWarning("warn", format, args);
+ }
+ }
+ function error(format) {
+ {
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+ printWarning("error", format, args);
+ }
+ }
+ function printWarning(level, format, args) {
+ {
+ var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame;
+ var stack = ReactDebugCurrentFrame2.getStackAddendum();
+ if (stack !== "") {
+ format += "%s";
+ args = args.concat([stack]);
+ }
+ var argsWithFormat = args.map(function(item) {
+ return "" + item;
+ });
+ argsWithFormat.unshift("Warning: " + format);
+ Function.prototype.apply.call(console[level], console, argsWithFormat);
+ }
+ }
+ var didWarnStateUpdateForUnmountedComponent = {};
+ function warnNoop(publicInstance, callerName) {
+ {
+ var _constructor = publicInstance.constructor;
+ var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass";
+ var warningKey = componentName + "." + callerName;
+ if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
+ return;
+ }
+ error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName);
+ didWarnStateUpdateForUnmountedComponent[warningKey] = true;
+ }
+ }
+ var ReactNoopUpdateQueue = {
+ isMounted: function(publicInstance) {
+ return false;
+ },
+ enqueueForceUpdate: function(publicInstance, callback, callerName) {
+ warnNoop(publicInstance, "forceUpdate");
+ },
+ enqueueReplaceState: function(publicInstance, completeState, callback, callerName) {
+ warnNoop(publicInstance, "replaceState");
+ },
+ enqueueSetState: function(publicInstance, partialState, callback, callerName) {
+ warnNoop(publicInstance, "setState");
+ }
+ };
+ var emptyObject = {};
+ {
+ Object.freeze(emptyObject);
+ }
+ function Component(props, context, updater) {
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ this.updater = updater || ReactNoopUpdateQueue;
+ }
+ Component.prototype.isReactComponent = {};
+ Component.prototype.setState = function(partialState, callback) {
+ if (!(typeof partialState === "object" || typeof partialState === "function" || partialState == null)) {
+ {
+ throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");
+ }
+ }
+ this.updater.enqueueSetState(this, partialState, callback, "setState");
+ };
+ Component.prototype.forceUpdate = function(callback) {
+ this.updater.enqueueForceUpdate(this, callback, "forceUpdate");
+ };
+ {
+ var deprecatedAPIs = {
+ isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],
+ replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]
+ };
+ var defineDeprecationWarning = function(methodName, info) {
+ Object.defineProperty(Component.prototype, methodName, {
+ get: function() {
+ warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]);
+ return void 0;
+ }
+ });
+ };
+ for (var fnName in deprecatedAPIs) {
+ if (deprecatedAPIs.hasOwnProperty(fnName)) {
+ defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
+ }
+ }
+ }
+ function ComponentDummy() {
+ }
+ ComponentDummy.prototype = Component.prototype;
+ function PureComponent(props, context, updater) {
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ this.updater = updater || ReactNoopUpdateQueue;
+ }
+ var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
+ pureComponentPrototype.constructor = PureComponent;
+ _assign(pureComponentPrototype, Component.prototype);
+ pureComponentPrototype.isPureReactComponent = true;
+ function createRef() {
+ var refObject = {
+ current: null
+ };
+ {
+ Object.seal(refObject);
+ }
+ return refObject;
+ }
+ function getWrappedName(outerType, innerType, wrapperName) {
+ var functionName = innerType.displayName || innerType.name || "";
+ return outerType.displayName || (functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName);
+ }
+ function getContextName(type) {
+ return type.displayName || "Context";
+ }
+ function getComponentName(type) {
+ if (type == null) {
+ return null;
+ }
+ {
+ if (typeof type.tag === "number") {
+ error("Received an unexpected object in getComponentName(). This is likely a bug in React. Please file an issue.");
+ }
+ }
+ if (typeof type === "function") {
+ return type.displayName || type.name || null;
+ }
+ if (typeof type === "string") {
+ return type;
+ }
+ switch (type) {
+ case exports.Fragment:
+ return "Fragment";
+ case REACT_PORTAL_TYPE:
+ return "Portal";
+ case exports.Profiler:
+ return "Profiler";
+ case exports.StrictMode:
+ return "StrictMode";
+ case exports.Suspense:
+ return "Suspense";
+ case REACT_SUSPENSE_LIST_TYPE:
+ return "SuspenseList";
+ }
+ if (typeof type === "object") {
+ switch (type.$$typeof) {
+ case REACT_CONTEXT_TYPE:
+ var context = type;
+ return getContextName(context) + ".Consumer";
+ case REACT_PROVIDER_TYPE:
+ var provider = type;
+ return getContextName(provider._context) + ".Provider";
+ case REACT_FORWARD_REF_TYPE:
+ return getWrappedName(type, type.render, "ForwardRef");
+ case REACT_MEMO_TYPE:
+ return getComponentName(type.type);
+ case REACT_BLOCK_TYPE:
+ return getComponentName(type._render);
+ case REACT_LAZY_TYPE: {
+ var lazyComponent = type;
+ var payload = lazyComponent._payload;
+ var init = lazyComponent._init;
+ try {
+ return getComponentName(init(payload));
+ } catch (x) {
+ return null;
+ }
+ }
+ }
+ }
+ return null;
+ }
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var RESERVED_PROPS = {
+ key: true,
+ ref: true,
+ __self: true,
+ __source: true
+ };
+ var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;
+ {
+ didWarnAboutStringRefs = {};
+ }
+ function hasValidRef(config) {
+ {
+ if (hasOwnProperty.call(config, "ref")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "ref").get;
+ if (getter && getter.isReactWarning) {
+ return false;
+ }
+ }
+ }
+ return config.ref !== void 0;
+ }
+ function hasValidKey(config) {
+ {
+ if (hasOwnProperty.call(config, "key")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "key").get;
+ if (getter && getter.isReactWarning) {
+ return false;
+ }
+ }
+ }
+ return config.key !== void 0;
+ }
+ function defineKeyPropWarningGetter(props, displayName) {
+ var warnAboutAccessingKey = function() {
+ {
+ if (!specialPropKeyWarningShown) {
+ specialPropKeyWarningShown = true;
+ error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName);
+ }
+ }
+ };
+ warnAboutAccessingKey.isReactWarning = true;
+ Object.defineProperty(props, "key", {
+ get: warnAboutAccessingKey,
+ configurable: true
+ });
+ }
+ function defineRefPropWarningGetter(props, displayName) {
+ var warnAboutAccessingRef = function() {
+ {
+ if (!specialPropRefWarningShown) {
+ specialPropRefWarningShown = true;
+ error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName);
+ }
+ }
+ };
+ warnAboutAccessingRef.isReactWarning = true;
+ Object.defineProperty(props, "ref", {
+ get: warnAboutAccessingRef,
+ configurable: true
+ });
+ }
+ function warnIfStringRefCannotBeAutoConverted(config) {
+ {
+ if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {
+ var componentName = getComponentName(ReactCurrentOwner.current.type);
+ if (!didWarnAboutStringRefs[componentName]) {
+ error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref);
+ didWarnAboutStringRefs[componentName] = true;
+ }
+ }
+ }
+ }
+ var ReactElement = function(type, key, ref, self2, source, owner, props) {
+ var element = {
+ $$typeof: REACT_ELEMENT_TYPE,
+ type,
+ key,
+ ref,
+ props,
+ _owner: owner
+ };
+ {
+ element._store = {};
+ Object.defineProperty(element._store, "validated", {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: false
+ });
+ Object.defineProperty(element, "_self", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: self2
+ });
+ Object.defineProperty(element, "_source", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: source
+ });
+ if (Object.freeze) {
+ Object.freeze(element.props);
+ Object.freeze(element);
+ }
+ }
+ return element;
+ };
+ function createElement(type, config, children) {
+ var propName;
+ var props = {};
+ var key = null;
+ var ref = null;
+ var self2 = null;
+ var source = null;
+ if (config != null) {
+ if (hasValidRef(config)) {
+ ref = config.ref;
+ {
+ warnIfStringRefCannotBeAutoConverted(config);
+ }
+ }
+ if (hasValidKey(config)) {
+ key = "" + config.key;
+ }
+ self2 = config.__self === void 0 ? null : config.__self;
+ source = config.__source === void 0 ? null : config.__source;
+ for (propName in config) {
+ if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
+ props[propName] = config[propName];
+ }
+ }
+ }
+ var childrenLength = arguments.length - 2;
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = Array(childrenLength);
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 2];
+ }
+ {
+ if (Object.freeze) {
+ Object.freeze(childArray);
+ }
+ }
+ props.children = childArray;
+ }
+ if (type && type.defaultProps) {
+ var defaultProps = type.defaultProps;
+ for (propName in defaultProps) {
+ if (props[propName] === void 0) {
+ props[propName] = defaultProps[propName];
+ }
+ }
+ }
+ {
+ if (key || ref) {
+ var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type;
+ if (key) {
+ defineKeyPropWarningGetter(props, displayName);
+ }
+ if (ref) {
+ defineRefPropWarningGetter(props, displayName);
+ }
+ }
+ }
+ return ReactElement(type, key, ref, self2, source, ReactCurrentOwner.current, props);
+ }
+ function cloneAndReplaceKey(oldElement, newKey) {
+ var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
+ return newElement;
+ }
+ function cloneElement(element, config, children) {
+ if (!!(element === null || element === void 0)) {
+ {
+ throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + ".");
+ }
+ }
+ var propName;
+ var props = _assign({}, element.props);
+ var key = element.key;
+ var ref = element.ref;
+ var self2 = element._self;
+ var source = element._source;
+ var owner = element._owner;
+ if (config != null) {
+ if (hasValidRef(config)) {
+ ref = config.ref;
+ owner = ReactCurrentOwner.current;
+ }
+ if (hasValidKey(config)) {
+ key = "" + config.key;
+ }
+ var defaultProps;
+ if (element.type && element.type.defaultProps) {
+ defaultProps = element.type.defaultProps;
+ }
+ for (propName in config) {
+ if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
+ if (config[propName] === void 0 && defaultProps !== void 0) {
+ props[propName] = defaultProps[propName];
+ } else {
+ props[propName] = config[propName];
+ }
+ }
+ }
+ }
+ var childrenLength = arguments.length - 2;
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = Array(childrenLength);
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 2];
+ }
+ props.children = childArray;
+ }
+ return ReactElement(element.type, key, ref, self2, source, owner, props);
+ }
+ function isValidElement(object) {
+ return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
+ }
+ var SEPARATOR = ".";
+ var SUBSEPARATOR = ":";
+ function escape(key) {
+ var escapeRegex = /[=:]/g;
+ var escaperLookup = {
+ "=": "=0",
+ ":": "=2"
+ };
+ var escapedString = key.replace(escapeRegex, function(match) {
+ return escaperLookup[match];
+ });
+ return "$" + escapedString;
+ }
+ var didWarnAboutMaps = false;
+ var userProvidedKeyEscapeRegex = /\/+/g;
+ function escapeUserProvidedKey(text) {
+ return text.replace(userProvidedKeyEscapeRegex, "$&/");
+ }
+ function getElementKey(element, index) {
+ if (typeof element === "object" && element !== null && element.key != null) {
+ return escape("" + element.key);
+ }
+ return index.toString(36);
+ }
+ function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {
+ var type = typeof children;
+ if (type === "undefined" || type === "boolean") {
+ children = null;
+ }
+ var invokeCallback = false;
+ if (children === null) {
+ invokeCallback = true;
+ } else {
+ switch (type) {
+ case "string":
+ case "number":
+ invokeCallback = true;
+ break;
+ case "object":
+ switch (children.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ case REACT_PORTAL_TYPE:
+ invokeCallback = true;
+ }
+ }
+ }
+ if (invokeCallback) {
+ var _child = children;
+ var mappedChild = callback(_child);
+ var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar;
+ if (Array.isArray(mappedChild)) {
+ var escapedChildKey = "";
+ if (childKey != null) {
+ escapedChildKey = escapeUserProvidedKey(childKey) + "/";
+ }
+ mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) {
+ return c;
+ });
+ } else if (mappedChild != null) {
+ if (isValidElement(mappedChild)) {
+ mappedChild = cloneAndReplaceKey(mappedChild, escapedPrefix + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? escapeUserProvidedKey("" + mappedChild.key) + "/" : "") + childKey);
+ }
+ array.push(mappedChild);
+ }
+ return 1;
+ }
+ var child;
+ var nextName;
+ var subtreeCount = 0;
+ var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR;
+ if (Array.isArray(children)) {
+ for (var i = 0; i < children.length; i++) {
+ child = children[i];
+ nextName = nextNamePrefix + getElementKey(child, i);
+ subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
+ }
+ } else {
+ var iteratorFn = getIteratorFn(children);
+ if (typeof iteratorFn === "function") {
+ var iterableChildren = children;
+ {
+ if (iteratorFn === iterableChildren.entries) {
+ if (!didWarnAboutMaps) {
+ warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead.");
+ }
+ didWarnAboutMaps = true;
+ }
+ }
+ var iterator = iteratorFn.call(iterableChildren);
+ var step;
+ var ii = 0;
+ while (!(step = iterator.next()).done) {
+ child = step.value;
+ nextName = nextNamePrefix + getElementKey(child, ii++);
+ subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
+ }
+ } else if (type === "object") {
+ var childrenString = "" + children;
+ {
+ {
+ throw Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead.");
+ }
+ }
+ }
+ }
+ return subtreeCount;
+ }
+ function mapChildren(children, func, context) {
+ if (children == null) {
+ return children;
+ }
+ var result = [];
+ var count = 0;
+ mapIntoArray(children, result, "", "", function(child) {
+ return func.call(context, child, count++);
+ });
+ return result;
+ }
+ function countChildren(children) {
+ var n = 0;
+ mapChildren(children, function() {
+ n++;
+ });
+ return n;
+ }
+ function forEachChildren(children, forEachFunc, forEachContext) {
+ mapChildren(children, function() {
+ forEachFunc.apply(this, arguments);
+ }, forEachContext);
+ }
+ function toArray(children) {
+ return mapChildren(children, function(child) {
+ return child;
+ }) || [];
+ }
+ function onlyChild(children) {
+ if (!isValidElement(children)) {
+ {
+ throw Error("React.Children.only expected to receive a single React element child.");
+ }
+ }
+ return children;
+ }
+ function createContext(defaultValue, calculateChangedBits) {
+ if (calculateChangedBits === void 0) {
+ calculateChangedBits = null;
+ } else {
+ {
+ if (calculateChangedBits !== null && typeof calculateChangedBits !== "function") {
+ error("createContext: Expected the optional second argument to be a function. Instead received: %s", calculateChangedBits);
+ }
+ }
+ }
+ var context = {
+ $$typeof: REACT_CONTEXT_TYPE,
+ _calculateChangedBits: calculateChangedBits,
+ _currentValue: defaultValue,
+ _currentValue2: defaultValue,
+ _threadCount: 0,
+ Provider: null,
+ Consumer: null
+ };
+ context.Provider = {
+ $$typeof: REACT_PROVIDER_TYPE,
+ _context: context
+ };
+ var hasWarnedAboutUsingNestedContextConsumers = false;
+ var hasWarnedAboutUsingConsumerProvider = false;
+ var hasWarnedAboutDisplayNameOnConsumer = false;
+ {
+ var Consumer = {
+ $$typeof: REACT_CONTEXT_TYPE,
+ _context: context,
+ _calculateChangedBits: context._calculateChangedBits
+ };
+ Object.defineProperties(Consumer, {
+ Provider: {
+ get: function() {
+ if (!hasWarnedAboutUsingConsumerProvider) {
+ hasWarnedAboutUsingConsumerProvider = true;
+ error("Rendering