From 041df7fe1e294c5dd7d9f6446c50a2a018d0dae9 Mon Sep 17 00:00:00 2001 From: juan Date: Fri, 15 Jul 2022 09:26:10 +0800 Subject: [PATCH] vault backup: 2022-07-15 09:26:10 --- .obsidian/appearance.json | 4 +- .obsidian/plugins/mrj-text-expand/main.js | 1056 ++++++++--------- .../plugins/mrj-text-expand/manifest.json | 2 +- OJ notes/pages/Leetcode Flood-Fill.md | 107 +- Untitled.md | 0 5 files changed, 596 insertions(+), 573 deletions(-) delete mode 100644 Untitled.md diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index 09ff637..d87f1f1 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -6,7 +6,5 @@ "textFontFamily": "IBM Plex Mono,monospace", "monospaceFontFamily": "IBM Plex Mono", "baseFontSize": 19, - "enabledCssSnippets": [ - "expander" - ] + "enabledCssSnippets": [] } \ 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 9f30ef3..bae38a3 100644 --- a/.obsidian/plugins/mrj-text-expand/main.js +++ b/.obsidian/plugins/mrj-text-expand/main.js @@ -16,33 +16,6 @@ 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. ***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -54,83 +27,13 @@ function __awaiter(thisArg, _arguments, P, generator) { }); } -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -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; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); -} - -function formatContent(content) { - return content.split('\n'); -} function getAllExpandersQuery(content) { - var accum = []; + let accum = []; for (var i = 0; i < content.length; i++) { - var line = content[i]; + const line = content[i]; if (line === '```expander') { for (var e = 0; e < content.length - i; e++) { - var nextline = content[i + e]; + const nextline = content[i + e]; if (nextline === '```') { accum.push({ start: i, @@ -149,12 +52,12 @@ function getClosestQuery(queries, lineNumber) { if (queries.length === 0) { return undefined; } - return queries.reduce(function (a, b) { + return queries.reduce((a, b) => { return Math.abs(b.start - lineNumber) < Math.abs(a.start - lineNumber) ? b : a; }); } function getLastLineToReplace(content, query, endline) { - var lineFrom = query.end; + const lineFrom = query.end; for (var i = lineFrom + 1; i < content.length; i++) { if (content[i] === endline) { return i; @@ -162,69 +65,107 @@ function getLastLineToReplace(content, query, endline) { } return lineFrom + 1; } -function trimContent(s) { - var removeEmptyLines = function (s) { - var lines = s.split('\n').map(function (e) { return e.trim(); }); - if (lines.length < 2) { - return s; - } - if (lines.indexOf('') === 0) { - return removeEmptyLines(lines.slice(1).join('\n')); - } +const pick = (obj, arr) => arr.reduce((acc, curr) => { + return (curr in obj) + ? Object.assign({}, acc, { [curr]: obj[curr] }) + : acc; +}, {}); + +// Functions for string processing +function splitByLines(content) { + return content.split('\n'); +} +function removeEmptyLines(s) { + const lines = s.split('\n').map(e => e.trim()); + if (lines.length < 2) { return s; - }; - var removeFrontMatter = function (s, lookEnding) { - if (lookEnding === void 0) { lookEnding = false; } - var lines = s.split('\n'); - if (lookEnding && lines.indexOf('---') === 0) { - return lines.slice(1).join('\n'); - } - if (lookEnding) { - return removeFrontMatter(lines.slice(1).join('\n'), true); - } - if (lines.indexOf('---') === 0) { - return removeFrontMatter(lines.slice(1).join('\n'), true); - } - return s; - }; - return removeFrontMatter(removeEmptyLines(s)); + } + else if (lines.indexOf('') === 0) { + return removeEmptyLines(lines.slice(1).join('\n')); + } + return s; +} +function removeFrontMatter(s, lookEnding = false) { + const lines = s.split('\n'); + if (lookEnding && lines.indexOf('---') === 0) { + return lines.slice(1).join('\n'); + } + else if (lookEnding) { + return removeFrontMatter(lines.slice(1).join('\n'), true); + } + else if (lines.indexOf('---') === 0) { + return removeFrontMatter(lines.slice(1).join('\n'), true); + } + return s; +} +function trimContent(content) { + return removeFrontMatter(removeEmptyLines(content)); +} + +function getFrontMatter(file, plugin, s) { + const { frontmatter = null } = plugin.app.metadataCache.getCache(file.path); + if (frontmatter) { + return frontmatter[s.split(':')[1]] || ''; + } + return ''; +} +function getFileInfo(plugin, file) { + return __awaiter(this, void 0, void 0, function* () { + const info = Object.assign({}, file, { + content: file.extension === 'md' ? yield plugin.app.vault.cachedRead(file) : '', + link: plugin.app.fileManager.generateMarkdownLink(file, file.name).replace(/^!/, '') + }, plugin.app.metadataCache.getFileCache(file)); + return pick(info, [ + 'basename', + 'content', + 'extension', + 'headings', + 'link', 'name', + 'path', 'sections', 'stat', + 'frontmatter', + 'links', + 'listItems' + ]); + }); } 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(''); + return [ + ...lineContent.slice(0, matchStart - lineStart), + '==', + ...lineContent.slice(matchStart - lineStart, (matchStart - lineStart) + (matchEnd - matchStart)), + '==', + ...lineContent.slice((matchStart - lineStart) + (matchEnd - matchStart)), + ].join(''); } -var sequences = [ +const sequences = [ { name: '\\$count', loop: true, - format: function (_p, _s, _content, _file, _d, index) { return index ? String(index + 1) : String(1); }, + format: (_p, _s, _content, _file, _d, index) => 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; }, + format: (_p, _s, _content, file) => 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); }, + format: (p, _s, _content, file) => p.app.fileManager.generateMarkdownLink(file, file.path).replace('![[', '[['), 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]); + format: (p, s, content, _file) => { + const digits = Number(s.split(':')[1]); return trimContent(content) .split('\n') - .filter(function (_, i) { return i < digits; }) + .filter((_, i) => i < digits) .join('\n') .replace(new RegExp(p.config.lineEnding, 'g'), ''); }, @@ -234,11 +175,11 @@ var sequences = [ name: '\\$characters:\\d+', loop: true, readContent: true, - format: function (p, s, content, _file) { - var digits = Number(s.split(':')[1]); + format: (p, s, content, _file) => { + const digits = Number(s.split(':')[1]); return trimContent(content) .split('') - .filter(function (_, i) { return i < digits; }) + .filter((_, i) => i < digits) .join('') .replace(new RegExp(p.config.lineEnding, 'g'), ''); }, @@ -247,84 +188,84 @@ var sequences = [ { name: '\\$frontmatter:[\\p\{L\}_-]+', loop: true, - format: function (p, s, _content, file) { return p.getFrontMatter(s, file); }, + format: (p, s, _content, file) => getFrontMatter(file, p, s), 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'), ''); }, + format: (p, s, content, _file) => 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; }, + format: (_p, s, content, file) => 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]; }, + format: (_p, s, content, file) => 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]; }, + format: (_p, s, content, file) => 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()); }, + format: (_p, s, content, file) => 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); }, + format: (_p, s, content, file) => String(file.stat.ctime), desc: 'created time' }, { name: '\\$size', loop: true, - format: function (_p, s, content, file) { return String(file.stat.size); }, + format: (_p, s, content, file) => String(file.stat.size), desc: 'size of the file' }, { name: '\\$path', loop: true, - format: function (_p, s, content, file) { return file.path; }, + format: (_p, s, content, file) => file.path, desc: 'path to the found file' }, { name: '\\$parent', loop: true, - format: function (_p, s, content, file) { return file.parent.name; }, + format: (_p, s, content, file) => file.parent.name, desc: 'parent folder name' }, { name: '^(.+|)\\$header:.+', loop: true, - format: function (p, s, content, file) { + format: (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 = [ + const prefix = s.slice(0, s.indexOf('$')); + const header = s.slice(s.indexOf('$')).replace('$header:', '').replace(/"/g, ''); + const neededLevel = header.split("#").length - 1; + const neededTitle = header.replace(/^#+/g, '').trim(); + const metadata = p.app.metadataCache.getFileCache(file); + return ((_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(e => { + const tests = [ [neededTitle, e.heading.includes(neededTitle)], [neededLevel, e.level === neededLevel] - ].filter(function (e) { return e[0]; }); + ].filter(e => e[0]); if (tests.length) { - return tests.map(function (e) { return e[1]; }).every(function (e) { return e === true; }); + return tests.map(e => e[1]).every(e => 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')) || ''; + }).map(h => p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + h.heading)).map(link => 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.' }, @@ -332,115 +273,95 @@ var sequences = [ name: '^(.+|)\\$blocks', readContent: true, loop: true, - format: function (p, s, content, file) { - var prefix = s.slice(0, s.indexOf('$')); + format: (p, s, content, file) => { + const 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')); - }) + .filter(e => /\^\w+$/.test(e)) + .map(e => 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) { + name: '^(.+|)\\$match:header', loop: true, format: (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); + const prefix = s.slice(0, s.indexOf('$')); + const metadata = p.app.metadataCache.getFileCache(file); + const headings = (_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(h => results.result.content.filter(c => h.position.end.offset < c[0]).some(e => e)).slice(-1); return headings - .map(function (h) { return p.app.fileManager.generateMarkdownLink(file, file.path, '#' + h.heading); }) - .map(function (link) { return prefix + link; }) + .map(h => p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + h.heading)) + .map(link => prefix + link) .join('\n') || ''; }, desc: 'extract found selections' }, { name: '^(.+|)\\$matchline(:(\\+|-|)\\d+:\\d+|:(\\+|-|)\\d+|)', loop: true, - format: function (_p, s, content, file, results) { - var prefix = s.slice(0, s.indexOf('$matchline')); - var _a = __read(s.slice(s.indexOf('$matchline')).split(':'), 3); _a[0]; var context = _a[1], limit = _a[2]; - var value = context || ''; - var limitValue = Number(limit); - var isPlus = value.contains('+'); - var isMinus = value.contains('-'); - var isContext = !isPlus && !isMinus; - var offset = Number(value.replace(/[+-]/, '')); - var lines = results.content.split('\n'); + format: (_p, s, content, file, results) => { + const prefix = s.slice(0, s.indexOf('$matchline')); + const [keyword, context, limit] = s.slice(s.indexOf('$matchline')).split(':'); + const value = context || ''; + const limitValue = Number(limit); + const isPlus = value.contains('+'); + const isMinus = value.contains('-'); + const isContext = !isPlus && !isMinus; + const offset = Number(value.replace(/[+-]/, '')); + const 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]; + const lineInfos = []; + for (let i = 0; i < lines.length; i++) { + const text = lines[i]; if (i === 0) { lineInfos.push({ num: 0, start: 0, end: text.length, - text: text + text }); continue; } - var start = lineInfos[i - 1].end + 1; + const start = lineInfos[i - 1].end + 1; lineInfos.push({ num: i, - start: start, - text: text, + start, + 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) }); + return results.result.content.map(([from, to]) => { + const matchedLines = lineInfos + .filter(({ start, end }) => start <= from && end >= to) + .map((line) => { + return Object.assign(Object.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; }) + const resultLines = []; + for (const matchedLine of matchedLines) { + const prevLines = isMinus || isContext + ? lineInfos.filter(l => 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; }) + const nextLines = isPlus || isContext + ? lineInfos.filter(l => 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); - } + resultLines.push(...prevLines, matchedLine, ...nextLines); } - 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 prefix + resultLines.map(function (e) { return e.text; }).join('\n'); - }).map(function (line) { return limitValue ? line.slice(0, limitValue) : line; }).join('\n'); + return prefix + resultLines.map(e => e.text).join('\n'); + }).map(line => limitValue ? line.slice(0, limitValue) : line).join('\n'); }, desc: 'extract line with matches' }, { name: '^(.+|)\\$searchresult', loop: true, desc: '', - format: function (_p, s, content, file, results) { - var prefix = s.slice(0, s.indexOf('$searchresult')); - return results.children.map(function (matchedFile) { + format: (_p, s, content, file, results) => { + const prefix = s.slice(0, s.indexOf('$searchresult')); + return results.children.map(matchedFile => { return prefix + matchedFile.el.innerText; }).join('\n'); } }, { - name: '^(.+|)\\$match', loop: true, format: function (_p, s, content, file, results) { + name: '^(.+|)\\$match', loop: true, format: (_p, s, content, file, results) => { if (!results.result.content) { console.warn('There is no content in results'); return ''; @@ -448,23 +369,47 @@ var sequences = [ function appendPrefix(prefix, line) { return prefix + line; } - var prefixContent = s.slice(0, s.indexOf('$')); + const 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); }) + .map(([from, to]) => results.content.slice(from, to)) + .map(line => appendPrefix(prefixContent, line)) .join('\n'); }, desc: 'extract found selections' }, ]; -var TextExpander = /** @class */ (function (_super) { - __extends(TextExpander, _super); - function TextExpander(app, plugin) { - var _this = _super.call(this, app, plugin) || this; - _this.config = { +function extractFilesFromSearchResults(searchResults, currentFileName, excludeCurrent = true) { + const files = Array.from(searchResults.keys()); + return excludeCurrent + ? files.filter(file => file.basename !== currentFileName) + : files; +} + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; +} + +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); +} + +var eta_min = createCommonjsModule(function (module, exports) { +!function(e,n){n(exports);}(commonjsGlobal,(function(e){function n(e){var t,r,i=new Error(e);return t=i,r=n.prototype,Object.setPrototypeOf?Object.setPrototypeOf(t,r):t.__proto__=r,i}function t(e,t,r){var i=t.slice(0,r).split(/\n/),a=i.length,o=i[a-1].length+1;throw n(e+=" at line "+a+" col "+o+":\n\n "+t.split(/\n/)[a-1]+"\n "+Array(o).join(" ")+"^")}n.prototype=Object.create(Error.prototype,{name:{value:"Eta Error",enumerable:!1}});var r=new Function("return this")().Promise;function i(e,n){for(var t in n)r=n,i=t,Object.prototype.hasOwnProperty.call(r,i)&&(e[t]=n[t]);var r,i;return e}function a(e,n,t,r){var i,a;return Array.isArray(n.autoTrim)?(i=n.autoTrim[1],a=n.autoTrim[0]):i=a=n.autoTrim,(t||!1===t)&&(i=t),(r||!1===r)&&(a=r),a||i?"slurp"===i&&"slurp"===a?e.trim():("_"===i||"slurp"===i?e=function(e){return String.prototype.trimLeft?e.trimLeft():e.replace(/^\s+/,"")}(e):"-"!==i&&"nl"!==i||(e=e.replace(/^(?:\r\n|\n|\r)/,"")),"_"===a||"slurp"===a?e=function(e){return String.prototype.trimRight?e.trimRight():e.replace(/\s+$/,"")}(e):"-"!==a&&"nl"!==a||(e=e.replace(/(?:\r\n|\n|\r)$/,"")),e):e}var o={"&":"&","<":"<",">":">",'"':""","'":"'"};function c(e){return o[e]}var s=/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g,l=/'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g,u=/"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g;function p(e){return e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")}function f(e,n){var r=[],i=!1,o=0,c=n.parse;if(n.plugins)for(var f=0;f"']/.test(n)?n.replace(/[&<>"']/g,c):n},include:function(e,t){var r=this.templates.get(e);if(!r)throw n('Could not fetch template "'+e+'"');return r(t,this)},parse:{exec:"",interpolate:"=",raw:"~"},plugins:[],rmWhitespace:!1,tags:["<%","%>"],templates:g,useWith:!1,varName:"it"};function m(e,n){var t={};return i(t,h),n&&i(t,n),e&&i(t,e),t}function v(e,t){var r=m(t||{}),i=r.async?function(){try{return new Function("return (async function(){}).constructor")()}catch(e){throw e instanceof SyntaxError?n("This environment doesn't support async/await"):e}}():Function;try{return new i(r.varName,"E","cb",d(e,r))}catch(t){throw t instanceof SyntaxError?n("Bad template syntax\n\n"+t.message+"\n"+Array(t.message.length+1).join("=")+"\n"+d(e,r)+"\n"):t}}function y(e,n){if(n.cache&&n.name&&n.templates.get(n.name))return n.templates.get(n.name);var t="function"==typeof e?e:v(e,n);return n.cache&&n.name&&n.templates.define(n.name,t),t}function x(e,t,i,a){var o=m(i||{});if(!o.async)return y(e,o)(t,o);if(!a){if("function"==typeof r)return new r((function(n,r){try{n(y(e,o)(t,o));}catch(e){r(e);}}));throw n("Please provide a callback function, this env doesn't support Promises")}try{y(e,o)(t,o,a);}catch(e){return a(e)}}e.compile=v,e.compileToString=d,e.config=h,e.configure=function(e){return i(h,e)},e.defaultConfig=h,e.getConfig=m,e.parse=f,e.render=x,e.renderAsync=function(e,n,t,r){return x(e,n,Object.assign({},t,{async:!0}),r)},e.templates=g,Object.defineProperty(e,"__esModule",{value:!0});})); + +}); + +class TextExpander extends obsidian.Plugin { + constructor(app, plugin) { + super(app, plugin); + this.config = { autoExpand: false, defaultTemplate: '- $link', delay: 300, @@ -475,350 +420,332 @@ var TextExpander = /** @class */ (function (_super) { footer: '>' } }; - _this.seqs = sequences; - _this.search = _this.search.bind(_this); - _this.initExpander = _this.initExpander.bind(_this); - _this.reformatLinks = _this.reformatLinks.bind(_this); - return _this; - } - TextExpander.prototype.getFrontMatter = function (s, r) { - var _a = this.app.metadataCache.getCache(r.path).frontmatter, frontmatter = _a === void 0 ? null : _a; - if (frontmatter) { - return frontmatter[s.split(':')[1]] || ''; - } - return ''; - }; - TextExpander.prototype.reformatLinks = function (links, mapFunc) { - 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 (_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 - var globalSearchFn = this.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(this); - var search = function (query) { return globalSearchFn(query); }; - var leftSplitState = { - // @ts-ignore - collapsed: this.app.workspace.leftSplit.collapsed, - // @ts-ignore - tab: this.getSearchTabIndex() + this.seqs = sequences; + this.leftPanelInfo = { + collapsed: false, + tab: 0, + text: '' }; - search(s); - if (leftSplitState.collapsed) { - // @ts-ignore + this.search = this.search.bind(this); + this.init = this.init.bind(this); + this.autoExpand = this.autoExpand.bind(this); + } + autoExpand() { + return __awaiter(this, void 0, void 0, function* () { + if (!this.config.autoExpand) { + return; + } + const activeLeaf = this.app.workspace.activeLeaf; + if (!activeLeaf) { + return; + } + const activeView = activeLeaf.view; + const isAllowedView = activeView instanceof obsidian.MarkdownView; + if (!isAllowedView) { + return; + } + yield this.init(true); + }); + } + onload() { + return __awaiter(this, void 0, void 0, function* () { + this.addSettingTab(new SettingTab(this.app, this)); + this.registerMarkdownCodeBlockProcessor('expander', (source, el, ctx) => { + el + .createDiv() + .createEl('button', { text: 'Run expand query' }) + .addEventListener('click', this.init.bind(this, false, ctx.getSectionInfo(el).lineStart)); + }); + this.addCommand({ + id: 'editor-expand', + name: 'expand', + callback: this.init, + hotkeys: [] + }); + this.addCommand({ + id: 'editor-expand-all', + name: 'expand all', + callback: () => this.init(true), + hotkeys: [] + }); + this.app.workspace.on('file-open', this.autoExpand); + const data = yield this.loadData(); + if (data) { + this.config = Object.assign(Object.assign({}, this.config), data); + } + }); + } + onunload() { + console.log('unloading plugin'); + this.app.workspace.off('file-open', this.autoExpand); + } + saveSettings() { + return __awaiter(this, void 0, void 0, function* () { + yield this.saveData(this.config); + }); + } + init(proceedAllQueriesOnPage = false, lineToStart) { + return __awaiter(this, void 0, void 0, function* () { + const currentView = this.app.workspace.activeLeaf.view; + // Is on editable view + if (!(currentView instanceof obsidian.MarkdownView)) { + return; + } + const cmDoc = this.cm = currentView.editor; + const curNum = lineToStart || cmDoc.getCursor().line; + const content = cmDoc.getValue(); + if (lineToStart) { + cmDoc.setCursor(lineToStart ? lineToStart - 1 : 0); + } + const formatted = splitByLines(content); + const findQueries = getAllExpandersQuery(formatted); + const closestQuery = getClosestQuery(findQueries, curNum); + if (proceedAllQueriesOnPage) { + yield findQueries.reduce((promise, query, i) => promise.then(() => { + const newContent = splitByLines(cmDoc.getValue()); + const updatedQueries = getAllExpandersQuery(newContent); + return this.runExpanderCodeBlock(updatedQueries[i], newContent, currentView); + }), Promise.resolve()); + } + else { + yield this.runExpanderCodeBlock(closestQuery, formatted, currentView); + } + }); + } + runExpanderCodeBlock(query, content, view) { + return __awaiter(this, void 0, void 0, function* () { + const { lineEnding, prefixes } = this.config; + if (!query) { + new Notification('Expand query not found'); + return Promise.resolve(); + } + this.clearOldResultsInFile(content, query, lineEnding); + const newContent = splitByLines(this.cm.getValue()); + if (query.query !== '') { + this.search(query.query); + } + return yield this.runTemplateProcessing(query, getLastLineToReplace(newContent, query, this.config.lineEnding), prefixes, view); + }); + } + runTemplateProcessing(query, lastLine, prefixes, currentView) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + let currentFileName = ''; + const templateContent = query.template.split('\n'); + const { heading, footer, repeatableContent } = this.parseTemplate(prefixes, templateContent); + if (currentView instanceof obsidian.FileView) { + currentFileName = currentView.file.basename; + } + this.saveLeftPanelState(); + const searchResults = yield this.getFoundAfterDelay(query.query === ''); + const files = extractFilesFromSearchResults(searchResults, currentFileName, this.config.excludeCurrent); + this.restoreLeftPanelState(); + currentView.editor.focus(); + const currentFileInfo = (currentView instanceof obsidian.FileView) + ? yield getFileInfo(this, currentView.file) + : {}; + const filesInfo = yield Promise.all(files.map(file => getFileInfo(this, file))); + let changed; + if (query.template.contains("<%")) { + const templateToRender = repeatableContent.join('\n'); + const dataToRender = { + current: currentFileInfo, + files: filesInfo + }; + changed = yield eta_min.render(templateToRender, dataToRender, { autoEscape: false }); + // changed = doT.template(templateToRender, {strip: false})(dataToRender) + } + else { + changed = yield this.generateTemplateFromSequences(files, repeatableContent, searchResults); + } + let result = [ + heading, + changed, + footer, + this.config.lineEnding + ].filter(e => e).join('\n'); + // Do not paste generated content if used changed activeLeaf + const viewBeforeReplace = this.app.workspace.activeLeaf.view; + if (!(viewBeforeReplace instanceof obsidian.MarkdownView) || viewBeforeReplace.file.basename !== currentFileName) { + return; + } + currentView.editor.replaceRange(result, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 }); + return Promise.resolve(); + }); + } + generateTemplateFromSequences(files, repeatableContent, searchResults) { + return __awaiter(this, void 0, void 0, function* () { + if (!searchResults) { + return ''; + } + const changed = yield Promise.all(files + .map((file, i) => __awaiter(this, void 0, void 0, function* () { + const result = yield Promise.all(repeatableContent.map((s) => __awaiter(this, void 0, void 0, function* () { return yield this.applyTemplateToSearchResults(searchResults, file, s, i); }))); + return result.join('\n'); + }))); + return changed.join('\n'); + }); + } + parseTemplate(prefixes, templateContent) { + const isHeader = (line) => line.startsWith(prefixes.header); + const isFooter = (line) => line.startsWith(prefixes.footer); + const isRepeat = (line) => !isHeader(line) && !isFooter(line); + const heading = templateContent.filter(isHeader).map((s) => s.slice(1)).join('\n'); + const footer = templateContent.filter(isFooter).map((s) => s.slice(1)).join('\n'); + const repeatableContent = templateContent.filter(isRepeat).filter(e => e).length === 0 + ? [this.config.defaultTemplate] + : templateContent.filter(isRepeat).filter(e => e); + return { heading, footer, repeatableContent }; + } + saveLeftPanelState() { + this.leftPanelInfo = { + collapsed: this.app.workspace.leftSplit.collapsed, + tab: this.getSearchTabIndex(), + text: this.getSearchValue(), + }; + } + restoreLeftPanelState() { + const { collapsed, tab, text } = this.leftPanelInfo; + const splitChildren = this.getLeftSplitElement(); + this.getSearchView().searchComponent.setValue(text); + if (tab !== splitChildren.currentTab) { + splitChildren.selectTabIndex(tab); + } + if (collapsed) { this.app.workspace.leftSplit.collapse(); } + } + search(s) { // @ts-ignore - if (leftSplitState.tab !== this.app.workspace.leftSplit.children[0].currentTab) { - // @ts-ignore - this.app.workspace.leftSplit.children[0].selectTabIndex(leftSplitState.tab); + const globalSearchFn = this.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(this); + const search = (query) => globalSearchFn(query); + search(s); + } + getLeftSplitElement() { + // @ts-ignore + return this.app.workspace.leftSplit.children[0]; + } + getSearchView() { + const view = this.getLeftSplitElement().children.filter(e => e.getViewState().type === 'search')[0].view; + if ('searchComponent' in view) { + return view; } - }; - TextExpander.prototype.getSearchTabIndex = function () { - var leftTabs = this.app.workspace.leftSplit.children[0].children; - var searchTabId; - this.app.workspace.iterateAllLeaves(function (leaf) { + return undefined; + } + getSearchValue() { + const view = this.getSearchView(); + if (view) { + return view.searchComponent.getValue(); + } + return ''; + } + getSearchTabIndex() { + const leftTabs = this.getLeftSplitElement().children; + let searchTabId; + this.app.workspace.iterateAllLeaves((leaf) => { if (leaf.getViewState().type == "search") { searchTabId = leaf.id; } }); - return leftTabs.findIndex(function (item, index, array) { + return leftTabs.findIndex((item, _index, _array) => { if (item.id == searchTabId) { return true; } }); - }; - TextExpander.prototype.getFoundAfterDelay = function () { - return __awaiter(this, void 0, void 0, function () { - var searchLeaf, view; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - searchLeaf = this.app.workspace.getLeavesOfType('search')[0]; - return [4 /*yield*/, searchLeaf.open(searchLeaf.view)]; - case 1: - view = _a.sent(); - return [2 /*return*/, new Promise(function (resolve) { - setTimeout(function () { - // @ts-ignore - var results = view.dom.resultDomLookup; - return resolve(results); - }, _this.config.delay); - })]; - } - }); - }); - }; - TextExpander.prototype.startTemplateMode = function (query, lastLine, prefixes) { - var _a; - return __awaiter(this, void 0, void 0, function () { - var currentView, currentFileName, templateContent, isHeader, isFooter, isRepeat, heading, footer, repeatableContent, searchResults, files, filterFiles, format, changed, result, viewBeforeReplace; - var _this = this; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - currentView = this.app.workspace.activeLeaf.view; - currentFileName = ''; - templateContent = query.template.split('\n'); - isHeader = function (line) { return line.startsWith(prefixes.header); }; - isFooter = function (line) { return line.startsWith(prefixes.footer); }; - isRepeat = function (line) { return !isHeader(line) && !isFooter(line); }; - heading = templateContent.filter(isHeader).map(function (s) { return s.slice(1); }); - footer = templateContent.filter(isFooter).map(function (s) { return s.slice(1); }); - repeatableContent = templateContent.filter(isRepeat).filter(function (e) { return e; }).length === 0 - ? [this.config.defaultTemplate] - : templateContent.filter(isRepeat).filter(function (e) { return e; }); - if (currentView instanceof obsidian.FileView) { - currentFileName = currentView.file.basename; - } - return [4 /*yield*/, this.getFoundAfterDelay()]; - case 1: - searchResults = _b.sent(); - files = Array.from(searchResults.keys()); - filterFiles = this.config.excludeCurrent - ? files.filter(function (file) { return file.basename !== currentFileName; }) - : 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: - if (!(new RegExp(this.seqs.filter(function (e) { return e.readContent; }).map(function (e) { return e.name; }).join('|')).test(template))) return [3 /*break*/, 2]; - return [4 /*yield*/, this.app.vault.cachedRead(r)]; - case 1: - _a = _b.sent(); - return [3 /*break*/, 3]; - case 2: - _a = ''; - _b.label = 3; - 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(_this, replace, fileContent, r, searchResults.get(r), index); }); - }, template)]; - } - }); - }); }; - return [4 /*yield*/, Promise.all(filterFiles - .map(function (file, i) { return __awaiter(_this, void 0, void 0, function () { - var result; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, Promise.all(repeatableContent.map(function (s) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, format(file, s, i)]; - case 1: return [2 /*return*/, _a.sent()]; - } - }); }); }))]; - case 1: - result = _a.sent(); - return [2 /*return*/, result.join('\n')]; - } - }); - }); }))]; - case 2: - changed = _b.sent(); - result = [ - ' ', - heading.join('\n'), - changed.join('\n'), - footer.join('\n'), - ' ', - this.config.lineEnding - ].filter(function (e) { return e; }).join('\n'); - viewBeforeReplace = this.app.workspace.activeLeaf.view; - if (viewBeforeReplace instanceof obsidian.MarkdownView) { - if (viewBeforeReplace.file.basename !== currentFileName) { - return [2 /*return*/]; - } - } - else { - return [2 /*return*/]; - } - this.cm.replaceRange(result, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 }); - return [2 /*return*/, Promise.resolve()]; - } - }); - }); - }; - TextExpander.prototype.runQuery = function (query, content) { - var _a; - return __awaiter(this, void 0, void 0, function () { - var _b, lineEnding, prefixes, lastLine, newContent; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - _b = this.config, lineEnding = _b.lineEnding, prefixes = _b.prefixes; - if (!query) { - new Notification('Expand query not found'); - return [2 /*return*/, Promise.resolve()]; - } - lastLine = getLastLineToReplace(content, query, this.config.lineEnding); - 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), prefixes)]; - case 1: return [2 /*return*/, _c.sent()]; - } - }); - }); - }; - TextExpander.prototype.initExpander = function (all) { - var _this = this; - if (all === void 0) { all = false; } - var currentView = this.app.workspace.activeLeaf.view; - if (!(currentView instanceof obsidian.MarkdownView)) { - return; - } - var cmDoc = this.cm = currentView.sourceMode.cmEditor; - var curNum = cmDoc.getCursor().line; - var content = cmDoc.getValue(); - var formatted = formatContent(content); - var findQueries = getAllExpandersQuery(formatted); - var closestQuery = getClosestQuery(findQueries, curNum); - if (all) { - findQueries.reduce(function (promise, query, i) { - return promise.then(function () { - var newContent = formatContent(cmDoc.getValue()); - var updatedQueries = getAllExpandersQuery(newContent); - return _this.runQuery(updatedQueries[i], newContent); - }); - }, Promise.resolve()); - } - else { - this.runQuery(closestQuery, formatted); - } - }; - TextExpander.prototype.onload = function () { - return __awaiter(this, void 0, void 0, function () { - var data; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - this.addSettingTab(new SettingTab(this.app, this)); - this.addCommand({ - id: 'editor-expand', - name: 'expand', - callback: this.initExpander, - hotkeys: [] - }); - this.addCommand({ - id: 'editor-expand-all', - name: 'expand all', - callback: function () { return _this.initExpander(true); }, - hotkeys: [] - }); - this.app.workspace.on('file-open', function () { return __awaiter(_this, void 0, void 0, function () { - var activeLeaf, activeView, isAllowedView; - return __generator(this, function (_a) { - if (!this.config.autoExpand) { - return [2 /*return*/]; - } - activeLeaf = this.app.workspace.activeLeaf; - if (!activeLeaf) { - return [2 /*return*/]; - } - activeView = activeLeaf.view; - isAllowedView = activeView instanceof obsidian.MarkdownView; - if (!isAllowedView) { - return [2 /*return*/]; - } - this.initExpander(true); - return [2 /*return*/]; - }); - }); }); - return [4 /*yield*/, this.loadData()]; - case 1: - data = _a.sent(); - if (data) { - this.config = __assign(__assign({}, this.config), data); - } - return [2 /*return*/]; - } - }); - }); - }; - TextExpander.prototype.onunload = function () { - console.log('unloading plugin'); - }; - TextExpander.prototype.saveSettings = function () { - this.saveData(this.config); - }; - return TextExpander; -}(obsidian.Plugin)); -var SettingTab = /** @class */ (function (_super) { - __extends(SettingTab, _super); - function SettingTab(app, plugin) { - var _this = _super.call(this, app, plugin) || this; - _this.app = app; - _this.plugin = plugin; - return _this; } - SettingTab.prototype.display = function () { - var _this = this; - var containerEl = this.containerEl; + ; + getFoundAfterDelay(immediate) { + return __awaiter(this, void 0, void 0, function* () { + const searchLeaf = this.app.workspace.getLeavesOfType('search')[0]; + const view = yield searchLeaf.open(searchLeaf.view); + if (immediate) { + // @ts-ignore + return Promise.resolve(view.dom.resultDomLookup); + } + return new Promise(resolve => { + setTimeout(() => { + // @ts-ignore + return resolve(view.dom.resultDomLookup); + }, this.config.delay); + }); + }); + } + applyTemplateToSearchResults(searchResults, file, template, index) { + return __awaiter(this, void 0, void 0, function* () { + const fileContent = (new RegExp(this.seqs.filter(e => e.readContent).map(e => e.name).join('|')).test(template)) + ? yield this.app.vault.cachedRead(file) + : ''; + return this.seqs.reduce((acc, seq) => acc.replace(new RegExp(seq.name, 'gu'), replace => seq.format(this, replace, fileContent, file, searchResults.get(file), index)), template); + }); + } + clearOldResultsInFile(content, query, lineEnding) { + var _a; + const lastLine = getLastLineToReplace(content, query, this.config.lineEnding); + 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 }); + } +} +class SettingTab extends obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.app = app; + this.plugin = plugin; + } + display() { + let { containerEl } = this; containerEl.empty(); containerEl.createEl('h2', { text: 'Settings for Text Expander' }); new obsidian.Setting(containerEl) .setName('Auto Expand') .setDesc('Expand all queries in a file once you open it') - .addToggle(function (toggle) { + .addToggle(toggle => { toggle - .setValue(_this.plugin.config.autoExpand) - .onChange(function (value) { - _this.plugin.config.autoExpand = value; - _this.plugin.saveSettings(); + .setValue(this.plugin.config.autoExpand) + .onChange(value => { + this.plugin.config.autoExpand = value; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Delay') .setDesc('Text expander don\' wait until search completed. It waits for a delay and paste result after that.') - .addSlider(function (slider) { + .addSlider(slider => { slider.setLimits(100, 10000, 100); - slider.setValue(_this.plugin.config.delay); - slider.onChange(function (value) { - _this.plugin.config.delay = value; - _this.plugin.saveSettings(); + slider.setValue(this.plugin.config.delay); + slider.onChange(value => { + this.plugin.config.delay = value; + this.plugin.saveSettings(); }); slider.setDynamicTooltip(); }); new obsidian.Setting(containerEl) .setName('Line ending') .setDesc('You can specify the text which will appear at the bottom of the generated text.') - .addText(function (text) { - text.setValue(_this.plugin.config.lineEnding) - .onChange(function (val) { - _this.plugin.config.lineEnding = val; - _this.plugin.saveSettings(); + .addText(text => { + text.setValue(this.plugin.config.lineEnding) + .onChange(val => { + this.plugin.config.lineEnding = val; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Default template') .setDesc('You can specify default template') - .addText(function (text) { - text.setValue(_this.plugin.config.defaultTemplate) - .onChange(function (val) { - _this.plugin.config.defaultTemplate = val; - _this.plugin.saveSettings(); + .addTextArea(text => { + text.setValue(this.plugin.config.defaultTemplate) + .onChange(val => { + this.plugin.config.defaultTemplate = val; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Exclude current file') .setDesc('You can specify should text expander exclude results from current file or not') - .addToggle(function (toggle) { + .addToggle(toggle => { toggle - .setValue(_this.plugin.config.excludeCurrent) - .onChange(function (value) { - _this.plugin.config.excludeCurrent = value; - _this.plugin.saveSettings(); + .setValue(this.plugin.config.excludeCurrent) + .onChange(value => { + this.plugin.config.excludeCurrent = value; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) @@ -827,45 +754,48 @@ var SettingTab = /** @class */ (function (_super) { new obsidian.Setting(containerEl) .setName('Header') .setDesc('Line prefixed by this symbol will be recognized as header') - .addText(function (text) { - text.setValue(_this.plugin.config.prefixes.header) - .onChange(function (val) { - _this.plugin.config.prefixes.header = val; - _this.plugin.saveSettings(); + .addText(text => { + text.setValue(this.plugin.config.prefixes.header) + .onChange(val => { + this.plugin.config.prefixes.header = val; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Footer') .setDesc('Line prefixed by this symbol will be recognized as footer') - .addText(function (text) { - text.setValue(_this.plugin.config.prefixes.footer) - .onChange(function (val) { - _this.plugin.config.prefixes.footer = val; - _this.plugin.saveSettings(); + .addText(text => { + text.setValue(this.plugin.config.prefixes.footer) + .onChange(val => { + this.plugin.config.prefixes.footer = val; + this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Sequences') .setDesc('REGEXP - DESCRIPTION') - .setDesc((function () { - var fragment = new DocumentFragment(); - var div = fragment.createEl('div'); - _this.plugin.seqs - .map(function (e) { return e.name + ' - ' + (e.desc || ''); }) - .map(function (e) { - var el = fragment.createEl('div'); + .setDesc((() => { + const fragment = new DocumentFragment(); + const div = fragment.createEl('div'); + this.plugin.seqs + .map(e => e.name + ' - ' + (e.desc || '')) + .map(e => { + const el = fragment.createEl('div'); el.setText(e); - el.setAttribute('style', "\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n margin-bottom: 0.5rem;\n padding-bottom: 0.5rem;\n "); + el.setAttribute('style', ` + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + margin-bottom: 0.5rem; + padding-bottom: 0.5rem; + `); return el; - }).forEach(function (el) { + }).forEach(el => { div.appendChild(el); }); fragment.appendChild(div); return fragment; })()); - }; - return SettingTab; -}(obsidian.PluginSettingTab)); + } +} module.exports = TextExpander; -//# 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+IHAuYXBwLmZpbGVNYW5hZ2VyLmdlbmVyYXRlTWFya2Rvd25MaW5rKGZpbGUsIGZpbGUucGF0aCwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJydcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2hsaW5lKDooXFxcXCt8LXwpXFxcXGQrOlxcXFxkK3w6KFxcXFwrfC18KVxcXFxkK3wpJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSk7XG4gICAgICAgICAgICBjb25zdCBba2V5d29yZCwgY29udGV4dCwgbGltaXRdID0gcy5zbGljZShzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSkuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0IHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IE51bWJlcihsaW1pdClcbiAgICAgICAgICAgIGNvbnN0IGlzUGx1cyA9IHZhbHVlLmNvbnRhaW5zKCcrJyk7XG4gICAgICAgICAgICBjb25zdCBpc01pbnVzID0gdmFsdWUuY29udGFpbnMoJy0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGV4dCA9ICFpc1BsdXMgJiYgIWlzTWludXM7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgvWystXS8sICcnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0cy5jb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgLy8gR3JhYiBpbmZvIGFib3V0IGxpbmUgY29udGVudCwgaW5kZXgsIHRleHQgbGVuZ3RoIGFuZCBzdGFydC9lbmQgY2hhcmFjdGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mb3M6IEFycmF5PExpbmVJbmZvPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGxpbmVzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW06IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpbmVJbmZvc1tpLTFdLmVuZCArIDFcbiAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG51bTogaSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGggKyBzdGFydFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lm1hcCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMaW5lcyA9IGxpbmVJbmZvc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc3RhcnQgPD0gZnJvbSAmJiBlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBoaWdobGlnaHQobGluZS5zdGFydCwgbGluZS5lbmQsIGZyb20sIHRvLCBsaW5lLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRMaW5lczogTGluZUluZm9bXSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTGluZSBvZiBtYXRjaGVkTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkxpbmVzID0gaXNNaW51cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbWF0Y2hlZExpbmUubnVtIC0gbC5udW0gPiAwICYmIG1hdGNoZWRMaW5lLm51bSAtIGwubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lcyA9IGlzUGx1cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbC5udW0gLSBtYXRjaGVkTGluZS5udW0gPiAwICYmIGwubnVtIC0gbWF0Y2hlZExpbmUubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZXMucHVzaCggLi4ucHJldkxpbmVzLCBtYXRjaGVkTGluZSwgLi4ubmV4dExpbmVzIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgcmVzdWx0TGluZXMubWFwKGUgPT4gZS50ZXh0KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSkubWFwKGxpbmUgPT4gbGltaXRWYWx1ZSA/IGxpbmUuc2xpY2UoMCwgbGltaXRWYWx1ZSkgOiBsaW5lKS5qb2luKCdcXG4nKVxuICAgICAgICB9LCBkZXNjOiAnZXh0cmFjdCBsaW5lIHdpdGggbWF0Y2hlcydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkc2VhcmNocmVzdWx0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZGVzYzogJycsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckc2VhcmNocmVzdWx0JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuY2hpbGRyZW4ubWFwKG1hdGNoZWRGaWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgbWF0Y2hlZEZpbGUuZWwuaW5uZXJUZXh0XG4gICAgICAgICAgICB9KS5qb2luKCdcXG4nKVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNoJywgbG9vcDogdHJ1ZSwgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdHMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZXJlIGlzIG5vIGNvbnRlbnQgaW4gcmVzdWx0cycpXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFByZWZpeChwcmVmaXg6IHN0cmluZywgbGluZTogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGxpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWZpeENvbnRlbnQgPSBzLnNsaWNlKDAsIHMuaW5kZXhPZignJCcpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgICAubWFwKChbZnJvbSwgdG9dKSA9PiByZXN1bHRzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKVxuICAgICAgICAgICAgICAgIC5tYXAobGluZSA9PiBhcHBlbmRQcmVmaXgocHJlZml4Q29udGVudCwgbGluZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIH0sIGRlc2M6ICdleHRyYWN0IGZvdW5kIHNlbGVjdGlvbnMnXG4gICAgfSxcbl1cblxuZXhwb3J0IGRlZmF1bHQgc2VxdWVuY2VzIiwiaW1wb3J0IHtcbiAgICBFeHBhbmRlclF1ZXJ5LFxuICAgIGZvcm1hdENvbnRlbnQsXG4gICAgZ2V0QWxsRXhwYW5kZXJzUXVlcnksXG4gICAgZ2V0Q2xvc2VzdFF1ZXJ5LFxuICAgIGdldExhc3RMaW5lVG9SZXBsYWNlXG59IGZyb20gJ2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgICBBcHAsXG4gICAgUGx1Z2luLFxuICAgIFBsdWdpblNldHRpbmdUYWIsXG4gICAgU2V0dGluZyxcbiAgICBURmlsZSxcbiAgICBGaWxlVmlldyxcbiAgICBNYXJrZG93blZpZXcsXG4gICAgUGx1Z2luTWFuaWZlc3Rcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IENvZGVNaXJyb3IgZnJvbSAnY29kZW1pcnJvcidcbmltcG9ydCBzZXF1ZW5jZXMsIHtTZXF1ZW5jZXN9IGZyb20gXCIuL3NlcXVlbmNlcy9zZXF1ZW5jZXNcIjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzIHtcbiAgICBkZWxheTogbnVtYmVyXG4gICAgbGluZUVuZGluZzogc3RyaW5nXG4gICAgZGVmYXVsdFRlbXBsYXRlOiBzdHJpbmdcbiAgICBleGNsdWRlQ3VycmVudDogYm9vbGVhblxuICAgIGF1dG9FeHBhbmQ6IGJvb2xlYW5cbiAgICBwcmVmaXhlczoge1xuICAgICAgICBoZWFkZXI6IHN0cmluZ1xuICAgICAgICBmb290ZXI6IHN0cmluZ1xuICAgIH1cbn1cblxudHlwZSBOdW1iZXJUdXBsZSA9IFtudW1iZXIsIG51bWJlcl1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hEZXRhaWxzIHtcbiAgICBhcHA6IEFwcFxuICAgIGNoaWxkcmVuOiBhbnlbXVxuICAgIGNoaWxkcmVuRWw6IEhUTUxFbGVtZW50XG4gICAgY29sbGFwc2VFbDogSFRNTEVsZW1lbnRcbiAgICBjb2xsYXBzZWQ6IGJvb2xlYW5cbiAgICBjb2xsYXBzaWJsZTogYm9vbGVhblxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudFxuICAgIGNvbnRlbnQ6IHN0cmluZ1xuICAgIGRvbTogYW55XG4gICAgZWw6IEhUTUxFbGVtZW50XG4gICAgZXh0cmFDb250ZXh0OiAoKSA9PiBib29sZWFuXG4gICAgZmlsZTogVEZpbGVcbiAgICBpbmZvOiBhbnlcbiAgICBvbk1hdGNoUmVuZGVyOiBhbnlcbiAgICBwdXNoZXJFbDogSFRNTEVsZW1lbnRcbiAgICByZXN1bHQ6IHtcbiAgICAgICAgZmlsZW5hbWU/OiBOdW1iZXJUdXBsZVtdXG4gICAgICAgIGNvbnRlbnQ/OiBOdW1iZXJUdXBsZVtdXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0RXhwYW5kZXIgZXh0ZW5kcyBQbHVnaW4ge1xuICAgIGNtOiBDb2RlTWlycm9yLkVkaXRvclxuXG4gICAgY29uZmlnOiBQbHVnaW5TZXR0aW5ncyA9IHtcbiAgICAgICAgYXV0b0V4cGFuZDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRUZW1wbGF0ZTogJy0gJGxpbmsnLFxuICAgICAgICBkZWxheTogMzAwLFxuICAgICAgICBleGNsdWRlQ3VycmVudDogdHJ1ZSxcbiAgICAgICAgbGluZUVuZGluZzogJzwtLT4nLFxuICAgICAgICBwcmVmaXhlczoge1xuICAgICAgICAgICAgaGVhZGVyOiAnXicsXG4gICAgICAgICAgICBmb290ZXI6ICc+J1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VxczogU2VxdWVuY2VzW10gPSBzZXF1ZW5jZXNcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBsdWdpbk1hbmlmZXN0KSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5pbml0RXhwYW5kZXIgPSB0aGlzLmluaXRFeHBhbmRlci5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMucmVmb3JtYXRMaW5rcyA9IHRoaXMucmVmb3JtYXRMaW5rcy5iaW5kKHRoaXMpXG4gICAgfVxuXG4gICAgZ2V0RnJvbnRNYXR0ZXIoczogc3RyaW5nLCByOiBURmlsZSkge1xuICAgICAgICBjb25zdCB7ZnJvbnRtYXR0ZXIgPSBudWxsfSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUoci5wYXRoKVxuXG4gICAgICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZyb250bWF0dGVyW3Muc3BsaXQoJzonKVsxXV0gfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICByZWZvcm1hdExpbmtzKGxpbmtzOiBURmlsZVtdLCBtYXBGdW5jID0gKHM6IHN0cmluZykgPT4gJ1tbJyArIHMgKyAnXV0nKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlld1xuXG4gICAgICAgIGlmIChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gbGlua3M/Lm1hcChlID0+IGUuYmFzZW5hbWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihlID0+IGN1cnJlbnRWaWV3LmZpbGUuYmFzZW5hbWUgIT09IGUpXG4gICAgICAgICAgICAgICAgPy5tYXAobWFwRnVuYyk/LmpvaW4oJ1xcbicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlua3M/Lm1hcChlID0+IGUuYmFzZW5hbWUpPy5tYXAobWFwRnVuYyk/LmpvaW4oJ1xcbicpXG4gICAgfVxuXG4gICAgc2VhcmNoKHM6IHN0cmluZykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGdsb2JhbFNlYXJjaEZuID0gdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldFBsdWdpbkJ5SWQoJ2dsb2JhbC1zZWFyY2gnKS5pbnN0YW5jZS5vcGVuR2xvYmFsU2VhcmNoLmJpbmQodGhpcylcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcpID0+IGdsb2JhbFNlYXJjaEZuKHF1ZXJ5KVxuXG4gICAgICAgIGNvbnN0IGxlZnRTcGxpdFN0YXRlID0ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29sbGFwc2VkOiB0aGlzLmFwcC53b3Jrc3BhY2UubGVmdFNwbGl0LmNvbGxhcHNlZCxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRhYjogdGhpcy5nZXRTZWFyY2hUYWJJbmRleCgpXG4gICAgICAgIH1cblxuICAgICAgICBzZWFyY2gocylcbiAgICAgICAgaWYgKGxlZnRTcGxpdFN0YXRlLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jb2xsYXBzZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChsZWZ0U3BsaXRTdGF0ZS50YWIgIT09IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY2hpbGRyZW5bMF0uY3VycmVudFRhYikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jaGlsZHJlblswXS5zZWxlY3RUYWJJbmRleChsZWZ0U3BsaXRTdGF0ZS50YWIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWFyY2hUYWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgbGVmdFRhYnMgPSB0aGlzLmFwcC53b3Jrc3BhY2UubGVmdFNwbGl0LmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuICAgICAgICBsZXQgc2VhcmNoVGFiSWQ6IHN0cmluZztcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWY6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxlYWYuZ2V0Vmlld1N0YXRlKCkudHlwZSA9PSBcInNlYXJjaFwiKSB7IHNlYXJjaFRhYklkID0gbGVhZi5pZDsgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxlZnRUYWJzLmZpbmRJbmRleCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmlkID09IHNlYXJjaFRhYklkKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3luYyBnZXRGb3VuZEFmdGVyRGVsYXkoKTogUHJvbWlzZTxNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKCdzZWFyY2gnKVswXVxuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgc2VhcmNoTGVhZi5vcGVuKHNlYXJjaExlYWYudmlldylcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSB2aWV3LmRvbS5yZXN1bHREb21Mb29rdXAgYXMgTWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPlxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0cylcbiAgICAgICAgICAgIH0sIHRoaXMuY29uZmlnLmRlbGF5KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0VGVtcGxhdGVNb2RlKHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBsYXN0TGluZTogbnVtYmVyLCBwcmVmaXhlczogUGx1Z2luU2V0dGluZ3NbXCJwcmVmaXhlc1wiXSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcbiAgICAgICAgbGV0IGN1cnJlbnRGaWxlTmFtZSA9ICcnXG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50ID0gcXVlcnkudGVtcGxhdGUuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgY29uc3QgaXNIZWFkZXIgPSAobGluZTogc3RyaW5nKSA9PiBsaW5lLnN0YXJ0c1dpdGgocHJlZml4ZXMuaGVhZGVyKVxuICAgICAgICBjb25zdCBpc0Zvb3RlciA9IChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChwcmVmaXhlcy5mb290ZXIpXG4gICAgICAgIGNvbnN0IGlzUmVwZWF0ID0gKGxpbmU6IHN0cmluZykgPT4gIWlzSGVhZGVyKGxpbmUpICYmICFpc0Zvb3RlcihsaW5lKVxuXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGlzSGVhZGVyKS5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoaXNGb290ZXIpLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgY29uc3QgcmVwZWF0YWJsZUNvbnRlbnQgPVxuICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50LmZpbHRlcihpc1JlcGVhdCkuZmlsdGVyKGUgPT4gZSkubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBbdGhpcy5jb25maWcuZGVmYXVsdFRlbXBsYXRlXVxuICAgICAgICAgICAgICAgIDogdGVtcGxhdGVDb250ZW50LmZpbHRlcihpc1JlcGVhdCkuZmlsdGVyKGUgPT4gZSlcblxuICAgICAgICBpZiAoY3VycmVudFZpZXcgaW5zdGFuY2VvZiBGaWxlVmlldykge1xuICAgICAgICAgICAgY3VycmVudEZpbGVOYW1lID0gY3VycmVudFZpZXcuZmlsZS5iYXNlbmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0Rm91bmRBZnRlckRlbGF5KClcbiAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHNlYXJjaFJlc3VsdHMua2V5cygpKVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckZpbGVzID0gdGhpcy5jb25maWcuZXhjbHVkZUN1cnJlbnRcbiAgICAgICAgICAgID8gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5iYXNlbmFtZSAhPT0gY3VycmVudEZpbGVOYW1lKVxuICAgICAgICAgICAgOiBmaWxlc1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGFzeW5jIChyOiBURmlsZSwgdGVtcGxhdGU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSAobmV3IFJlZ0V4cCh0aGlzLnNlcXMuZmlsdGVyKGUgPT4gZS5yZWFkQ29udGVudCkubWFwKGUgPT4gZS5uYW1lKS5qb2luKCd8JykpLnRlc3QodGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgID8gYXdhaXQgdGhpcy5hcHAudmF1bHQuY2FjaGVkUmVhZChyKVxuICAgICAgICAgICAgICAgIDogJydcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vxcy5yZWR1Y2UoKGFjYywgc2VxKSA9PlxuICAgICAgICAgICAgICAgIGFjYy5yZXBsYWNlKG5ldyBSZWdFeHAoc2VxLm5hbWUsICdndScpLCByZXBsYWNlID0+IHNlcS5mb3JtYXQodGhpcywgcmVwbGFjZSwgZmlsZUNvbnRlbnQsIHIsIHNlYXJjaFJlc3VsdHMuZ2V0KHIpLCBpbmRleCkpLCB0ZW1wbGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGZpbHRlckZpbGVzXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAoZmlsZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChyZXBlYXRhYmxlQ29udGVudC5tYXAoYXN5bmMgKHMpID0+IGF3YWl0IGZvcm1hdChmaWxlLCBzLCBpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJylcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW1xuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgaGVhZGluZy5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGNoYW5nZWQuam9pbignXFxuJyksXG4gICAgICAgICAgICBmb290ZXIuam9pbignXFxuJyksXG4gICAgICAgICAgICAnICcsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5saW5lRW5kaW5nXG4gICAgICAgIF0uZmlsdGVyKGUgPT4gZSkuam9pbignXFxuJylcblxuICAgICAgICBjb25zdCB2aWV3QmVmb3JlUmVwbGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcbiAgICAgICAgaWYgKHZpZXdCZWZvcmVSZXBsYWNlIGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSB7XG4gICAgICAgICAgICBpZiAodmlld0JlZm9yZVJlcGxhY2UuZmlsZS5iYXNlbmFtZSAhPT0gY3VycmVudEZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY20ucmVwbGFjZVJhbmdlKHJlc3VsdCxcbiAgICAgICAgICAgIHtsaW5lOiBxdWVyeS5lbmQgKyAxLCBjaDogMH0sXG4gICAgICAgICAgICB7bGluZTogbGFzdExpbmUsIGNoOiB0aGlzLmNtLmdldExpbmUobGFzdExpbmUpPy5sZW5ndGggfHwgMH0pXG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUXVlcnkocXVlcnk6IEV4cGFuZGVyUXVlcnksIGNvbnRlbnQ6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHsgbGluZUVuZGluZywgcHJlZml4ZXMgfSA9IHRoaXMuY29uZmlnXG5cbiAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbignRXhwYW5kIHF1ZXJ5IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RMaW5lID0gZ2V0TGFzdExpbmVUb1JlcGxhY2UoY29udGVudCwgcXVlcnksIHRoaXMuY29uZmlnLmxpbmVFbmRpbmcpXG4gICAgICAgIHRoaXMuY20ucmVwbGFjZVJhbmdlKCdcXG4nICsgbGluZUVuZGluZyxcbiAgICAgICAgICAgIHtsaW5lOiBxdWVyeS5lbmQgKyAxLCBjaDogMH0sXG4gICAgICAgICAgICB7bGluZTogbGFzdExpbmUsIGNoOiB0aGlzLmNtLmdldExpbmUobGFzdExpbmUpPy5sZW5ndGggfHwgMH0pXG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGZvcm1hdENvbnRlbnQodGhpcy5jbS5nZXRWYWx1ZSgpKVxuXG4gICAgICAgIHRoaXMuc2VhcmNoKHF1ZXJ5LnF1ZXJ5KVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFRlbXBsYXRlTW9kZShxdWVyeSwgZ2V0TGFzdExpbmVUb1JlcGxhY2UobmV3Q29udGVudCwgcXVlcnksIHRoaXMuY29uZmlnLmxpbmVFbmRpbmcpLCBwcmVmaXhlcylcbiAgICB9XG5cbiAgICBpbml0RXhwYW5kZXIoYWxsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgaWYgKCEoY3VycmVudFZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNtRG9jID0gdGhpcy5jbSA9IGN1cnJlbnRWaWV3LnNvdXJjZU1vZGUuY21FZGl0b3JcbiAgICAgICAgY29uc3QgY3VyTnVtID0gY21Eb2MuZ2V0Q3Vyc29yKCkubGluZVxuICAgICAgICBjb25zdCBjb250ZW50ID0gY21Eb2MuZ2V0VmFsdWUoKVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvbnRlbnQoY29udGVudClcbiAgICAgICAgbGV0IGZpbmRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkoZm9ybWF0dGVkKVxuICAgICAgICBjb25zdCBjbG9zZXN0UXVlcnkgPSBnZXRDbG9zZXN0UXVlcnkoZmluZFF1ZXJpZXMsIGN1ck51bSlcblxuICAgICAgICBpZiAoYWxsKSB7XG4gICAgICAgICAgICBmaW5kUXVlcmllcy5yZWR1Y2UoKHByb21pc2UsIHF1ZXJ5LCBpKSA9PlxuICAgICAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmb3JtYXRDb250ZW50KGNtRG9jLmdldFZhbHVlKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkobmV3Q29udGVudClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5RdWVyeSh1cGRhdGVkUXVlcmllc1tpXSwgbmV3Q29udGVudClcbiAgICAgICAgICAgICAgICB9KSwgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuUXVlcnkoY2xvc2VzdFF1ZXJ5LCBmb3JtYXR0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQnLFxuICAgICAgICAgICAgbmFtZTogJ2V4cGFuZCcsXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5pbml0RXhwYW5kZXIsXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2VkaXRvci1leHBhbmQtYWxsJyxcbiAgICAgICAgICAgIG5hbWU6ICdleHBhbmQgYWxsJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLmluaXRFeHBhbmRlcih0cnVlKSxcbiAgICAgICAgICAgIGhvdGtleXM6IFtdXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9FeHBhbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUxlYWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IGFjdGl2ZUxlYWYudmlld1xuICAgICAgICAgICAgY29uc3QgaXNBbGxvd2VkVmlldyA9IGFjdGl2ZVZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXdcbiAgICAgICAgICAgIGlmICghaXNBbGxvd2VkVmlldykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXRFeHBhbmRlcih0cnVlKVxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKSBhcyBQbHVnaW5TZXR0aW5nc1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmxvYWRpbmcgcGx1Z2luJyk7XG4gICAgfVxuXG4gICAgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNhdmVEYXRhKHRoaXMuY29uZmlnKVxuICAgIH1cbn1cblxuY2xhc3MgU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogVGV4dEV4cGFuZGVyXG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUZXh0RXhwYW5kZXIpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuXG4gICAgICAgIHRoaXMuYXBwID0gYXBwXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luXG4gICAgfVxuXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IHtjb250YWluZXJFbH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyBmb3IgVGV4dCBFeHBhbmRlcid9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdBdXRvIEV4cGFuZCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnRXhwYW5kIGFsbCBxdWVyaWVzIGluIGEgZmlsZSBvbmNlIHlvdSBvcGVuIGl0JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5hdXRvRXhwYW5kKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmF1dG9FeHBhbmQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVsYXknKVxuICAgICAgICAgICAgLnNldERlc2MoJ1RleHQgZXhwYW5kZXIgZG9uXFwnIHdhaXQgdW50aWwgc2VhcmNoIGNvbXBsZXRlZC4gSXQgd2FpdHMgZm9yIGEgZGVsYXkgYW5kIHBhc3RlIHJlc3VsdCBhZnRlciB0aGF0LicpXG4gICAgICAgICAgICAuYWRkU2xpZGVyKHNsaWRlciA9PiB7XG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldExpbWl0cygxMDAsIDEwMDAwLCAxMDApXG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5kZWxheSlcbiAgICAgICAgICAgICAgICBzbGlkZXIub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcuZGVsYXkgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgc2xpZGVyLnNldER5bmFtaWNUb29sdGlwKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnTGluZSBlbmRpbmcnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSB0aGUgdGV4dCB3aGljaCB3aWxsIGFwcGVhciBhdCB0aGUgYm90dG9tIG9mIHRoZSBnZW5lcmF0ZWQgdGV4dC4nKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcubGluZUVuZGluZylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcubGluZUVuZGluZyA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVmYXVsdCB0ZW1wbGF0ZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnWW91IGNhbiBzcGVjaWZ5IGRlZmF1bHQgdGVtcGxhdGUnKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZGVmYXVsdFRlbXBsYXRlKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGUgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0V4Y2x1ZGUgY3VycmVudCBmaWxlJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdZb3UgY2FuIHNwZWNpZnkgc2hvdWxkIHRleHQgZXhwYW5kZXIgZXhjbHVkZSByZXN1bHRzIGZyb20gY3VycmVudCBmaWxlIG9yIG5vdCcpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZXhjbHVkZUN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcuZXhjbHVkZUN1cnJlbnQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0SGVhZGluZygpXG4gICAgICAgICAgICAuc2V0TmFtZSgnUHJlZml4ZXMnKVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0hlYWRlcicpXG4gICAgICAgICAgICAuc2V0RGVzYygnTGluZSBwcmVmaXhlZCBieSB0aGlzIHN5bWJvbCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgaGVhZGVyJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLnByZWZpeGVzLmhlYWRlcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcucHJlZml4ZXMuaGVhZGVyID0gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdGb290ZXInKVxuICAgICAgICAgICAgLnNldERlc2MoJ0xpbmUgcHJlZml4ZWQgYnkgdGhpcyBzeW1ib2wgd2lsbCBiZSByZWNvZ25pemVkIGFzIGZvb3RlcicpXG4gICAgICAgICAgICAuYWRkVGV4dCh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5wcmVmaXhlcy5mb290ZXIpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLnByZWZpeGVzLmZvb3RlciA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnU2VxdWVuY2VzJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdSRUdFWFAgLSBERVNDUklQVElPTicpXG4gICAgICAgICAgICAuc2V0RGVzYyhcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gZnJhZ21lbnQuY3JlYXRlRWwoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNlcXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZSA9PiBlLm5hbWUgKyAnIC0gJyArIChlLmRlc2MgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGZyYWdtZW50LmNyZWF0ZUVsKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFRleHQoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVsKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkaXYpXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgKVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJGaWxlVmlldyIsIk1hcmtkb3duVmlldyIs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QUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ3pGLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDdkYsb0JBQW9CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxF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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9oZWxwZXJzL2hlbHBlcnMudHMiLCJzcmMvaGVscGVycy9zdHJpbmcudHMiLCJzcmMvaGVscGVycy90ZmlsZS50cyIsInNyYy9zZXF1ZW5jZXMvc2VxdWVuY2VzLnRzIiwic3JjL2hlbHBlcnMvc2VhcmNoLXJlc3VsdHMudHMiLCJub2RlX21vZHVsZXMvZXRhL2Rpc3QvYnJvd3Nlci9ldGEubWluLmpzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcbiIsImV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZXJRdWVyeSB7XG4gICAgc3RhcnQ6IG51bWJlclxuICAgIGVuZDogbnVtYmVyXG4gICAgdGVtcGxhdGU6IHN0cmluZ1xuICAgIHF1ZXJ5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEV4cGFuZGVyc1F1ZXJ5KGNvbnRlbnQ6IHN0cmluZ1tdKTogRXhwYW5kZXJRdWVyeVtdIHtcbiAgICBsZXQgYWNjdW06IEV4cGFuZGVyUXVlcnlbXSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W2ldXG5cbiAgICAgICAgaWYgKGxpbmUgPT09ICdgYGBleHBhbmRlcicpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgY29udGVudC5sZW5ndGggLSBpOyBlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0bGluZSA9IGNvbnRlbnRbaSArIGVdXG4gICAgICAgICAgICAgICAgaWYgKG5leHRsaW5lID09PSAnYGBgJykge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogaSArIGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRlbnRbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBlID4gMiA/IGNvbnRlbnQuc2xpY2UoaSArIDIsIGkgKyBlKS5qb2luKCdcXG4nKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3Nlc3RRdWVyeShxdWVyaWVzOiBFeHBhbmRlclF1ZXJ5W10sIGxpbmVOdW1iZXI6IG51bWJlcik6IEV4cGFuZGVyUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJpZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhiLnN0YXJ0IC0gbGluZU51bWJlcikgPCBNYXRoLmFicyhhLnN0YXJ0IC0gbGluZU51bWJlcikgPyBiIDogYTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3RMaW5lVG9SZXBsYWNlKGNvbnRlbnQ6IHN0cmluZ1tdLCBxdWVyeTogRXhwYW5kZXJRdWVyeSwgZW5kbGluZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbGluZUZyb20gPSBxdWVyeS5lbmRcblxuICAgIGZvciAodmFyIGkgPSBsaW5lRnJvbSArIDE7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjb250ZW50W2ldID09PSBlbmRsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gaVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVGcm9tICsgMVxufVxuXG50eXBlIExvb3NlT2JqZWN0PFQgPSBhbnk+ID0geyBba2V5OiBzdHJpbmddOiBUIH1cblxuZXhwb3J0IGNvbnN0IHBpY2sgPSAob2JqOiB7W2s6IHN0cmluZ106IGFueX0sIGFycjogc3RyaW5nW10pID0+XG4gICAgYXJyLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIHJldHVybiAoY3VyciBpbiBvYmopXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGFjYywgeyBbY3Vycl06IG9ialtjdXJyXSB9KVxuICAgICAgICAgICAgOiBhY2NcbiAgICB9LCA8TG9vc2VPYmplY3Q+e30pO1xuXG5cbiIsIi8vIEZ1bmN0aW9ucyBmb3Igc3RyaW5nIHByb2Nlc3NpbmdcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5TGluZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjb250ZW50LnNwbGl0KCdcXG4nKVxufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eUxpbmVzKHM6IHN0cmluZyk6IHN0cmluZyAge1xuICAgICAgICBjb25zdCBsaW5lcyA9IHMuc3BsaXQoJ1xcbicpLm1hcChlID0+IGUudHJpbSgpKVxuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gc1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzLmluZGV4T2YoJycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlRW1wdHlMaW5lcyhsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUZyb250TWF0dGVyIChzOiBzdHJpbmcsIGxvb2tFbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBzLnNwbGl0KCdcXG4nKVxuXG4gICAgaWYgKGxvb2tFbmRpbmcgJiYgbGluZXMuaW5kZXhPZignLS0tJykgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIGlmIChsb29rRW5kaW5nKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICB9IGVsc2UgaWYgKGxpbmVzLmluZGV4T2YoJy0tLScpID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbUNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVtb3ZlRnJvbnRNYXR0ZXIocmVtb3ZlRW1wdHlMaW5lcyhjb250ZW50KSlcbn1cbiIsImltcG9ydCB7UGx1Z2luLCBURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge3BpY2t9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7RmlsZVBhcmFtZXRlcnN9IGZyb20gXCIuLi9tYWluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcm9udE1hdHRlcihmaWxlOiBURmlsZSwgcGx1Z2luOiBQbHVnaW4sIHM6IHN0cmluZykge1xuICAgIGNvbnN0IHtmcm9udG1hdHRlciA9IG51bGx9ID0gcGx1Z2luLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGUucGF0aClcblxuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICByZXR1cm4gZnJvbnRtYXR0ZXJbcy5zcGxpdCgnOicpWzFdXSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVJbmZvKHRoaXM6IHZvaWQsIHBsdWdpbjogUGx1Z2luLCBmaWxlOiBURmlsZSk6IFByb21pc2U8RmlsZVBhcmFtZXRlcnM+IHtcbiAgICBjb25zdCBpbmZvID0gT2JqZWN0LmFzc2lnbih7fSwgZmlsZSwge1xuICAgICAgICAgICAgY29udGVudDogZmlsZS5leHRlbnNpb24gPT09ICdtZCcgPyBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJyxcbiAgICAgICAgICAgIGxpbms6IHBsdWdpbi5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5uYW1lKS5yZXBsYWNlKC9eIS8sICcnKVxuICAgICAgICB9LFxuICAgICAgICBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpXG4gICAgKVxuICAgIHJldHVybiBwaWNrKGluZm8sIFtcbiAgICAgICAgJ2Jhc2VuYW1lJyxcbiAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAnZXh0ZW5zaW9uJyxcbiAgICAgICAgJ2hlYWRpbmdzJyxcbiAgICAgICAgJ2xpbmsnLCAnbmFtZScsXG4gICAgICAgICdwYXRoJywgJ3NlY3Rpb25zJywgJ3N0YXQnLFxuICAgICAgICAnZnJvbnRtYXR0ZXInLFxuICAgICAgICAnbGlua3MnLFxuICAgICAgICAnbGlzdEl0ZW1zJ1xuICAgIF0pXG59IiwiaW1wb3J0IHtURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgVGV4dEV4cGFuZGVyLCB7U2VhcmNoRGV0YWlsc30gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7dHJpbUNvbnRlbnR9IGZyb20gXCIuLi9oZWxwZXJzL3N0cmluZ1wiO1xuaW1wb3J0IHtnZXRGcm9udE1hdHRlcn0gZnJvbSBcIi4uL2hlbHBlcnMvdGZpbGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZXMge1xuICAgIGxvb3A6IGJvb2xlYW5cbiAgICBuYW1lOiBzdHJpbmdcbiAgICBmb3JtYXQ6IChwbHVnaW46IFRleHRFeHBhbmRlciwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzPzogU2VhcmNoRGV0YWlscywgaW5kZXg/OiBudW1iZXIpID0+IHN0cmluZ1xuICAgIGRlc2M6IHN0cmluZ1xuICAgIHJlYWRDb250ZW50PzogYm9vbGVhblxuICAgIHVzaW5nU2VhcmNoPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgTGluZUluZm8ge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG51bTogbnVtYmVyXG4gICAgc3RhcnQ6IG51bWJlclxuICAgIGVuZDogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIGhpZ2hsaWdodChsaW5lU3RhcnQ6IG51bWJlciwgbGluZUVuZDogbnVtYmVyLCBtYXRjaFN0YXJ0OiBudW1iZXIsIG1hdGNoRW5kOiBudW1iZXIsIGxpbmVDb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5saW5lQ29udGVudC5zbGljZSgwLCBtYXRjaFN0YXJ0IC0gbGluZVN0YXJ0KSxcbiAgICAgICAgJz09JyxcbiAgICAgICAgLi4ubGluZUNvbnRlbnQuc2xpY2UobWF0Y2hTdGFydCAtIGxpbmVTdGFydCwgKG1hdGNoU3RhcnQgLSBsaW5lU3RhcnQpICsgKG1hdGNoRW5kIC0gbWF0Y2hTdGFydCkpLFxuICAgICAgICAnPT0nLFxuICAgICAgICAuLi5saW5lQ29udGVudC5zbGljZSgobWF0Y2hTdGFydCAtIGxpbmVTdGFydCkgKyAobWF0Y2hFbmQgLSBtYXRjaFN0YXJ0KSksXG4gICAgXS5qb2luKCcnKVxufVxuXG5jb25zdCBzZXF1ZW5jZXM6IFNlcXVlbmNlc1tdID0gW1xuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkY291bnQnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgX3M6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlLCBfZCwgaW5kZXgpID0+IGluZGV4ID8gU3RyaW5nKGluZGV4ICsgMSkgOiBTdHJpbmcoMSksXG4gICAgICAgIGRlc2M6ICdhZGQgaW5kZXggbnVtYmVyIHRvIGVhY2ggcHJvZHVjZWQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkZmlsZW5hbWUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgX3M6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUuYmFzZW5hbWUsXG4gICAgICAgIGRlc2M6ICduYW1lIG9mIHRoZSBmb3VuZGVkIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGxpbmsnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBfczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5wYXRoKS5yZXBsYWNlKCchW1snLCAnW1snKSxcbiAgICAgICAgZGVzYzogJ2xpbmsgYmFzZWQgb24gT2JzaWRpYW4gc2V0dGluZ3MnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGxpbmVzOlxcXFxkKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBOdW1iZXIocy5zcGxpdCgnOicpWzFdKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJpbUNvbnRlbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoXzogc3RyaW5nLCBpOiBudW1iZXIpID0+IGkgPCBkaWdpdHMpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChwLmNvbmZpZy5saW5lRW5kaW5nLCAnZycpLCAnJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ3NwZWNpZmllZCBjb3VudCBvZiBsaW5lcyBmcm9tIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjaGFyYWN0ZXJzOlxcXFxkKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBOdW1iZXIocy5zcGxpdCgnOicpWzFdKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJpbUNvbnRlbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoXzogc3RyaW5nLCBpOiBudW1iZXIpID0+IGkgPCBkaWdpdHMpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChwLmNvbmZpZy5saW5lRW5kaW5nLCAnZycpLCAnJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ3NwZWNpZmllZCBjb3VudCBvZiBsaW5lcyBmcm9tIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRmcm9udG1hdHRlcjpbXFxcXHBcXHtMXFx9Xy1dKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGdldEZyb250TWF0dGVyKGZpbGUsIHAsIHMpLFxuICAgICAgICBkZXNjOiAndmFsdWUgZnJvbSB0aGUgZnJvbnRtYXR0ZXIga2V5IGluIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRsaW5lcysnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICByZWFkQ29udGVudDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAocCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIF9maWxlOiBURmlsZSkgPT4gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocC5jb25maWcubGluZUVuZGluZywgJ2cnKSwgJycpLFxuICAgICAgICBkZXNjOiAnYWxsIGNvbnRlbnQgZnJvbSB0aGUgZm91bmQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkZXh0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gZmlsZS5leHRlbnNpb24sXG4gICAgICAgIGRlc2M6ICdyZXR1cm4gZmlsZSBleHRlbnNpb24nXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0OmRhdGUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKS50b0lTT1N0cmluZygpKS5zcGxpdCgnVCcpWzBdLFxuICAgICAgICBkZXNjOiAnY3JlYXRlZCB0aW1lIGZvcm1hdHRlZCdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkY3JlYXRlZDpmb3JtYXQ6dGltZScsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhuZXcgRGF0ZShmaWxlLnN0YXQuY3RpbWUpLnRvSVNPU3RyaW5nKCkpLnNwbGl0KC8oWy5UXSkvKVsyXSxcbiAgICAgICAgZGVzYzogJ2NyZWF0ZWQgdGltZSBmb3JtYXR0ZWQnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKG5ldyBEYXRlKGZpbGUuc3RhdC5jdGltZSkudG9JU09TdHJpbmcoKSksXG4gICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKGZpbGUuc3RhdC5jdGltZSksXG4gICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJHNpemUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcoZmlsZS5zdGF0LnNpemUpLFxuICAgICAgICBkZXNjOiAnc2l6ZSBvZiB0aGUgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkcGF0aCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUucGF0aCxcbiAgICAgICAgZGVzYzogJ3BhdGggdG8gdGhlIGZvdW5kIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJHBhcmVudCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUucGFyZW50Lm5hbWUsXG4gICAgICAgIGRlc2M6ICdwYXJlbnQgZm9sZGVyIG5hbWUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJGhlYWRlcjouKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHMuc2xpY2Uocy5pbmRleE9mKCckJykpLnJlcGxhY2UoJyRoZWFkZXI6JywgJycpLnJlcGxhY2UoL1wiL2csICcnKVxuICAgICAgICAgICAgY29uc3QgbmVlZGVkTGV2ZWwgPSBoZWFkZXIuc3BsaXQoXCIjXCIpLmxlbmd0aCAtIDFcbiAgICAgICAgICAgIGNvbnN0IG5lZWRlZFRpdGxlID0gaGVhZGVyLnJlcGxhY2UoL14jKy9nLCAnJykudHJpbSgpXG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcC5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSlcblxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmhlYWRpbmdzPy5maWx0ZXIoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtuZWVkZWRUaXRsZSwgZS5oZWFkaW5nLmluY2x1ZGVzKG5lZWRlZFRpdGxlKV0sXG4gICAgICAgICAgICAgICAgICAgIFtuZWVkZWRMZXZlbCwgZS5sZXZlbCA9PT0gbmVlZGVkTGV2ZWxdXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoZSA9PiBlWzBdKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMubWFwKGUgPT4gZVsxXSkuZXZlcnkoZSA9PiBlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoaCA9PiBwLmFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhmaWxlLCBmaWxlLmJhc2VuYW1lLCAnIycgKyBoLmhlYWRpbmcpKVxuICAgICAgICAgICAgICAgIC5tYXAobGluayA9PiBwcmVmaXggKyBsaW5rKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnJ1xuXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2M6ICdoZWFkaW5ncyBmcm9tIGZvdW5kZWQgZmlsZXMuICRoZWFkZXI6IyMgLSByZXR1cm4gYWxsIGxldmVsIDIgaGVhZGluZ3MuICRoZWFkZXI6VGl0bGUgLSByZXR1cm4gYWxsIGhlYWRpbmcgd2hpY2ggbWF0Y2ggdGhlIHN0cmluZy4gQ2FuIGJlIHByZXBlbmRlZCBsaWtlOiAtICEkaGVhZGVyOiMjIHRvIHRyYW5zY2x1ZGUgdGhlIGhlYWRpbmdzLidcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkYmxvY2tzJyxcbiAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihlID0+IC9cXF5cXHcrJC8udGVzdChlKSlcbiAgICAgICAgICAgICAgICAubWFwKGUgPT5cbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5iYXNlbmFtZSwgJyMnICsgZS5yZXBsYWNlKC9eLis/KFxcXlxcdyskKS8sICckMScpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ2Jsb2NrIGlkcyBmcm9tIHRoZSBmb3VuZCBmaWxlcy4gQ2FuIGJlIHByZXBlbmRlZC4nXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNoOmhlYWRlcicsIGxvb3A6IHRydWUsIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcC5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSlcblxuICAgICAgICAgICAgY29uc3QgaGVhZGluZ3MgPSBtZXRhZGF0YS5oZWFkaW5nc1xuICAgICAgICAgICAgICAgID8uZmlsdGVyKGggPT4gcmVzdWx0cy5yZXN1bHQuY29udGVudC5maWx0ZXIoYyA9PiBoLnBvc2l0aW9uLmVuZC5vZmZzZXQgPCBjWzBdKS5zb21lKGUgPT4gZSkpXG4gICAgICAgICAgICAgICAgLnNsaWNlKC0xKVxuXG4gICAgICAgICAgICByZXR1cm4gaGVhZGluZ3NcbiAgICAgICAgICAgICAgICAubWFwKGggPT4gcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5iYXNlbmFtZSwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJydcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2hsaW5lKDooXFxcXCt8LXwpXFxcXGQrOlxcXFxkK3w6KFxcXFwrfC18KVxcXFxkK3wpJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSk7XG4gICAgICAgICAgICBjb25zdCBba2V5d29yZCwgY29udGV4dCwgbGltaXRdID0gcy5zbGljZShzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSkuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0IHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IE51bWJlcihsaW1pdClcbiAgICAgICAgICAgIGNvbnN0IGlzUGx1cyA9IHZhbHVlLmNvbnRhaW5zKCcrJyk7XG4gICAgICAgICAgICBjb25zdCBpc01pbnVzID0gdmFsdWUuY29udGFpbnMoJy0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGV4dCA9ICFpc1BsdXMgJiYgIWlzTWludXM7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgvWystXS8sICcnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0cy5jb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgLy8gR3JhYiBpbmZvIGFib3V0IGxpbmUgY29udGVudCwgaW5kZXgsIHRleHQgbGVuZ3RoIGFuZCBzdGFydC9lbmQgY2hhcmFjdGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mb3M6IEFycmF5PExpbmVJbmZvPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGxpbmVzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW06IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpbmVJbmZvc1tpLTFdLmVuZCArIDFcbiAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG51bTogaSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGggKyBzdGFydFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lm1hcCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMaW5lcyA9IGxpbmVJbmZvc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc3RhcnQgPD0gZnJvbSAmJiBlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBoaWdobGlnaHQobGluZS5zdGFydCwgbGluZS5lbmQsIGZyb20sIHRvLCBsaW5lLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRMaW5lczogTGluZUluZm9bXSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTGluZSBvZiBtYXRjaGVkTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkxpbmVzID0gaXNNaW51cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbWF0Y2hlZExpbmUubnVtIC0gbC5udW0gPiAwICYmIG1hdGNoZWRMaW5lLm51bSAtIGwubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lcyA9IGlzUGx1cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbC5udW0gLSBtYXRjaGVkTGluZS5udW0gPiAwICYmIGwubnVtIC0gbWF0Y2hlZExpbmUubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZXMucHVzaCggLi4ucHJldkxpbmVzLCBtYXRjaGVkTGluZSwgLi4ubmV4dExpbmVzIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgcmVzdWx0TGluZXMubWFwKGUgPT4gZS50ZXh0KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSkubWFwKGxpbmUgPT4gbGltaXRWYWx1ZSA/IGxpbmUuc2xpY2UoMCwgbGltaXRWYWx1ZSkgOiBsaW5lKS5qb2luKCdcXG4nKVxuICAgICAgICB9LCBkZXNjOiAnZXh0cmFjdCBsaW5lIHdpdGggbWF0Y2hlcydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkc2VhcmNocmVzdWx0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZGVzYzogJycsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckc2VhcmNocmVzdWx0JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuY2hpbGRyZW4ubWFwKG1hdGNoZWRGaWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgbWF0Y2hlZEZpbGUuZWwuaW5uZXJUZXh0XG4gICAgICAgICAgICB9KS5qb2luKCdcXG4nKVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNoJywgbG9vcDogdHJ1ZSwgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdHMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZXJlIGlzIG5vIGNvbnRlbnQgaW4gcmVzdWx0cycpXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFByZWZpeChwcmVmaXg6IHN0cmluZywgbGluZTogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGxpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWZpeENvbnRlbnQgPSBzLnNsaWNlKDAsIHMuaW5kZXhPZignJCcpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgICAubWFwKChbZnJvbSwgdG9dKSA9PiByZXN1bHRzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKVxuICAgICAgICAgICAgICAgIC5tYXAobGluZSA9PiBhcHBlbmRQcmVmaXgocHJlZml4Q29udGVudCwgbGluZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIH0sIGRlc2M6ICdleHRyYWN0IGZvdW5kIHNlbGVjdGlvbnMnXG4gICAgfSxcbl1cblxuZXhwb3J0IGRlZmF1bHQgc2VxdWVuY2VzIiwiaW1wb3J0IHtURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1NlYXJjaERldGFpbHN9IGZyb20gXCIuLi9tYWluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RmlsZXNGcm9tU2VhcmNoUmVzdWx0cyhzZWFyY2hSZXN1bHRzOiBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+LCBjdXJyZW50RmlsZU5hbWU6IHN0cmluZywgZXhjbHVkZUN1cnJlbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHNlYXJjaFJlc3VsdHMua2V5cygpKVxuXG4gICAgcmV0dXJuIGV4Y2x1ZGVDdXJyZW50XG4gICAgICAgID8gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5iYXNlbmFtZSAhPT0gY3VycmVudEZpbGVOYW1lKVxuICAgICAgICA6IGZpbGVzO1xufSIsIiFmdW5jdGlvbihlLG4pe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJleHBvcnRzXCJdLG4pOm4oKGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5FdGE9e30pfSh0aGlzLChmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUpe3ZhciB0LHIsaT1uZXcgRXJyb3IoZSk7cmV0dXJuIHQ9aSxyPW4ucHJvdG90eXBlLE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxyKTp0Ll9fcHJvdG9fXz1yLGl9ZnVuY3Rpb24gdChlLHQscil7dmFyIGk9dC5zbGljZSgwLHIpLnNwbGl0KC9cXG4vKSxhPWkubGVuZ3RoLG89aVthLTFdLmxlbmd0aCsxO3Rocm93IG4oZSs9XCIgYXQgbGluZSBcIithK1wiIGNvbCBcIitvK1wiOlxcblxcbiAgXCIrdC5zcGxpdCgvXFxuLylbYS0xXStcIlxcbiAgXCIrQXJyYXkobykuam9pbihcIiBcIikrXCJeXCIpfW4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtuYW1lOnt2YWx1ZTpcIkV0YSBFcnJvclwiLGVudW1lcmFibGU6ITF9fSk7dmFyIHI9bmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKS5Qcm9taXNlO2Z1bmN0aW9uIGkoZSxuKXtmb3IodmFyIHQgaW4gbilyPW4saT10LE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGkpJiYoZVt0XT1uW3RdKTt2YXIgcixpO3JldHVybiBlfWZ1bmN0aW9uIGEoZSxuLHQscil7dmFyIGksYTtyZXR1cm4gQXJyYXkuaXNBcnJheShuLmF1dG9UcmltKT8oaT1uLmF1dG9UcmltWzFdLGE9bi5hdXRvVHJpbVswXSk6aT1hPW4uYXV0b1RyaW0sKHR8fCExPT09dCkmJihpPXQpLChyfHwhMT09PXIpJiYoYT1yKSxhfHxpP1wic2x1cnBcIj09PWkmJlwic2x1cnBcIj09PWE/ZS50cmltKCk6KFwiX1wiPT09aXx8XCJzbHVycFwiPT09aT9lPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2UudHJpbUxlZnQoKTplLnJlcGxhY2UoL15cXHMrLyxcIlwiKX0oZSk6XCItXCIhPT1pJiZcIm5sXCIhPT1pfHwoZT1lLnJlcGxhY2UoL14oPzpcXHJcXG58XFxufFxccikvLFwiXCIpKSxcIl9cIj09PWF8fFwic2x1cnBcIj09PWE/ZT1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQ/ZS50cmltUmlnaHQoKTplLnJlcGxhY2UoL1xccyskLyxcIlwiKX0oZSk6XCItXCIhPT1hJiZcIm5sXCIhPT1hfHwoZT1lLnJlcGxhY2UoLyg/OlxcclxcbnxcXG58XFxyKSQvLFwiXCIpKSxlKTplfXZhciBvPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiMzOTtcIn07ZnVuY3Rpb24gYyhlKXtyZXR1cm4gb1tlXX12YXIgcz0vYCg/OlxcXFxbXFxzXFxTXXxcXCR7KD86W157fV18eyg/Oltee31dfHtbXn1dKn0pKn0pKn18KD8hXFwkeylbXlxcXFxgXSkqYC9nLGw9LycoPzpcXFxcW1xcc1xcd1wiJ1xcXFxgXXxbXlxcblxccidcXFxcXSkqPycvZyx1PS9cIig/OlxcXFxbXFxzXFx3XCInXFxcXGBdfFteXFxuXFxyXCJcXFxcXSkqP1wiL2c7ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bLiorXFwtP14ke30oKXxbXFxdXFxcXF0vZyxcIlxcXFwkJlwiKX1mdW5jdGlvbiBmKGUsbil7dmFyIHI9W10saT0hMSxvPTAsYz1uLnBhcnNlO2lmKG4ucGx1Z2lucylmb3IodmFyIGY9MDtmPG4ucGx1Z2lucy5sZW5ndGg7ZisrKXsoVD1uLnBsdWdpbnNbZl0pLnByb2Nlc3NUZW1wbGF0ZSYmKGU9VC5wcm9jZXNzVGVtcGxhdGUoZSxuKSl9ZnVuY3Rpb24gZChlLHQpe2UmJihlPWEoZSxuLGksdCkpJiYoZT1lLnJlcGxhY2UoL1xcXFx8Jy9nLFwiXFxcXCQmXCIpLnJlcGxhY2UoL1xcclxcbnxcXG58XFxyL2csXCJcXFxcblwiKSxyLnB1c2goZSkpfW4ucm1XaGl0ZXNwYWNlJiYoZT1lLnJlcGxhY2UoL1tcXHJcXG5dKy9nLFwiXFxuXCIpLnJlcGxhY2UoL15cXHMrfFxccyskL2dtLFwiXCIpKSxzLmxhc3RJbmRleD0wLGwubGFzdEluZGV4PTAsdS5sYXN0SW5kZXg9MDtmb3IodmFyIGcsaD1bYy5leGVjLGMuaW50ZXJwb2xhdGUsYy5yYXddLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSYmbj9lK1wifFwiK3Aobik6bj9wKG4pOmV9KSxcIlwiKSxtPW5ldyBSZWdFeHAoXCIoW15dKj8pXCIrcChuLnRhZ3NbMF0pK1wiKC18Xyk/XFxcXHMqKFwiK2grXCIpP1xcXFxzKlwiLFwiZ1wiKSx2PW5ldyBSZWdFeHAoXCInfFxcXCJ8YHxcXFxcL1xcXFwqfChcXFxccyooLXxfKT9cIitwKG4udGFnc1sxXSkrXCIpXCIsXCJnXCIpO2c9bS5leGVjKGUpOyl7bz1nWzBdLmxlbmd0aCtnLmluZGV4O3ZhciB5PWdbMV0seD1nWzJdLF89Z1szXXx8XCJcIjtkKHkseCksdi5sYXN0SW5kZXg9bztmb3IodmFyIHc9dm9pZCAwLGI9ITE7dz12LmV4ZWMoZSk7KXtpZih3WzFdKXt2YXIgRT1lLnNsaWNlKG8sdy5pbmRleCk7bS5sYXN0SW5kZXg9bz12Lmxhc3RJbmRleCxpPXdbMl0sYj17dDpfPT09Yy5leGVjP1wiZVwiOl89PT1jLnJhdz9cInJcIjpfPT09Yy5pbnRlcnBvbGF0ZT9cImlcIjpcIlwiLHZhbDpFfTticmVha312YXIgST13WzBdO2lmKFwiLypcIj09PUkpe3ZhciBSPWUuaW5kZXhPZihcIiovXCIsdi5sYXN0SW5kZXgpOy0xPT09UiYmdChcInVuY2xvc2VkIGNvbW1lbnRcIixlLHcuaW5kZXgpLHYubGFzdEluZGV4PVJ9ZWxzZSBpZihcIidcIj09PUkpe2wubGFzdEluZGV4PXcuaW5kZXgsbC5leGVjKGUpP3YubGFzdEluZGV4PWwubGFzdEluZGV4OnQoXCJ1bmNsb3NlZCBzdHJpbmdcIixlLHcuaW5kZXgpfWVsc2UgaWYoJ1wiJz09PUkpe3UubGFzdEluZGV4PXcuaW5kZXgsdS5leGVjKGUpP3YubGFzdEluZGV4PXUubGFzdEluZGV4OnQoXCJ1bmNsb3NlZCBzdHJpbmdcIixlLHcuaW5kZXgpfWVsc2UgaWYoXCJgXCI9PT1JKXtzLmxhc3RJbmRleD13LmluZGV4LHMuZXhlYyhlKT92Lmxhc3RJbmRleD1zLmxhc3RJbmRleDp0KFwidW5jbG9zZWQgc3RyaW5nXCIsZSx3LmluZGV4KX19Yj9yLnB1c2goYik6dChcInVuY2xvc2VkIHRhZ1wiLGUsZy5pbmRleCt5Lmxlbmd0aCl9aWYoZChlLnNsaWNlKG8sZS5sZW5ndGgpLCExKSxuLnBsdWdpbnMpZm9yKGY9MDtmPG4ucGx1Z2lucy5sZW5ndGg7ZisrKXt2YXIgVDsoVD1uLnBsdWdpbnNbZl0pLnByb2Nlc3NBU1QmJihyPVQucHJvY2Vzc0FTVChyLG4pKX1yZXR1cm4gcn1mdW5jdGlvbiBkKGUsbil7dmFyIHQ9ZihlLG4pLHI9XCJ2YXIgdFI9JycsX19sLF9fbFBcIisobi5pbmNsdWRlP1wiLGluY2x1ZGU9RS5pbmNsdWRlLmJpbmQoRSlcIjpcIlwiKSsobi5pbmNsdWRlRmlsZT9cIixpbmNsdWRlRmlsZT1FLmluY2x1ZGVGaWxlLmJpbmQoRSlcIjpcIlwiKStcIlxcbmZ1bmN0aW9uIGxheW91dChwLGQpe19fbD1wO19fbFA9ZH1cXG5cIisobi51c2VXaXRoP1wid2l0aChcIituLnZhck5hbWUrXCJ8fHt9KXtcIjpcIlwiKStmdW5jdGlvbihlLG4pe3ZhciB0PTAscj1lLmxlbmd0aCxpPVwiXCI7Zm9yKDt0PHI7dCsrKXt2YXIgYT1lW3RdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXtpKz1cInRSKz0nXCIrYStcIidcXG5cIn1lbHNle3ZhciBvPWEudCxjPWEudmFsfHxcIlwiO1wiclwiPT09bz8obi5maWx0ZXImJihjPVwiRS5maWx0ZXIoXCIrYytcIilcIiksaSs9XCJ0Uis9XCIrYytcIlxcblwiKTpcImlcIj09PW8/KG4uZmlsdGVyJiYoYz1cIkUuZmlsdGVyKFwiK2MrXCIpXCIpLG4uYXV0b0VzY2FwZSYmKGM9XCJFLmUoXCIrYytcIilcIiksaSs9XCJ0Uis9XCIrYytcIlxcblwiKTpcImVcIj09PW8mJihpKz1jK1wiXFxuXCIpfX1yZXR1cm4gaX0odCxuKSsobi5pbmNsdWRlRmlsZT9cImlmKF9fbCl0Uj1cIisobi5hc3luYz9cImF3YWl0IFwiOlwiXCIpK1wiaW5jbHVkZUZpbGUoX19sLE9iamVjdC5hc3NpZ24oXCIrbi52YXJOYW1lK1wiLHtib2R5OnRSfSxfX2xQKSlcXG5cIjpuLmluY2x1ZGU/XCJpZihfX2wpdFI9XCIrKG4uYXN5bmM/XCJhd2FpdCBcIjpcIlwiKStcImluY2x1ZGUoX19sLE9iamVjdC5hc3NpZ24oXCIrbi52YXJOYW1lK1wiLHtib2R5OnRSfSxfX2xQKSlcXG5cIjpcIlwiKStcImlmKGNiKXtjYihudWxsLHRSKX0gcmV0dXJuIHRSXCIrKG4udXNlV2l0aD9cIn1cIjpcIlwiKTtpZihuLnBsdWdpbnMpZm9yKHZhciBpPTA7aTxuLnBsdWdpbnMubGVuZ3RoO2krKyl7dmFyIGE9bi5wbHVnaW5zW2ldO2EucHJvY2Vzc0ZuU3RyaW5nJiYocj1hLnByb2Nlc3NGblN0cmluZyhyLG4pKX1yZXR1cm4gcn12YXIgZz1uZXcoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuY2FjaGU9ZX1yZXR1cm4gZS5wcm90b3R5cGUuZGVmaW5lPWZ1bmN0aW9uKGUsbil7dGhpcy5jYWNoZVtlXT1ufSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FjaGVbZV19LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5jYWNoZVtlXX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPXt9fSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGUpe2kodGhpcy5jYWNoZSxlKX0sZX0oKSkoe30pO3ZhciBoPXthc3luYzohMSxhdXRvRXNjYXBlOiEwLGF1dG9UcmltOlshMSxcIm5sXCJdLGNhY2hlOiExLGU6ZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKGUpO3JldHVybi9bJjw+XCInXS8udGVzdChuKT9uLnJlcGxhY2UoL1smPD5cIiddL2csYyk6bn0saW5jbHVkZTpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMudGVtcGxhdGVzLmdldChlKTtpZighcil0aHJvdyBuKCdDb3VsZCBub3QgZmV0Y2ggdGVtcGxhdGUgXCInK2UrJ1wiJyk7cmV0dXJuIHIodCx0aGlzKX0scGFyc2U6e2V4ZWM6XCJcIixpbnRlcnBvbGF0ZTpcIj1cIixyYXc6XCJ+XCJ9LHBsdWdpbnM6W10scm1XaGl0ZXNwYWNlOiExLHRhZ3M6W1wiPCVcIixcIiU+XCJdLHRlbXBsYXRlczpnLHVzZVdpdGg6ITEsdmFyTmFtZTpcIml0XCJ9O2Z1bmN0aW9uIG0oZSxuKXt2YXIgdD17fTtyZXR1cm4gaSh0LGgpLG4mJmkodCxuKSxlJiZpKHQsZSksdH1mdW5jdGlvbiB2KGUsdCl7dmFyIHI9bSh0fHx7fSksaT1yLmFzeW5jP2Z1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gKGFzeW5jIGZ1bmN0aW9uKCl7fSkuY29uc3RydWN0b3JcIikoKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgU3ludGF4RXJyb3I/bihcIlRoaXMgZW52aXJvbm1lbnQgZG9lc24ndCBzdXBwb3J0IGFzeW5jL2F3YWl0XCIpOmV9fSgpOkZ1bmN0aW9uO3RyeXtyZXR1cm4gbmV3IGkoci52YXJOYW1lLFwiRVwiLFwiY2JcIixkKGUscikpfWNhdGNoKHQpe3Rocm93IHQgaW5zdGFuY2VvZiBTeW50YXhFcnJvcj9uKFwiQmFkIHRlbXBsYXRlIHN5bnRheFxcblxcblwiK3QubWVzc2FnZStcIlxcblwiK0FycmF5KHQubWVzc2FnZS5sZW5ndGgrMSkuam9pbihcIj1cIikrXCJcXG5cIitkKGUscikrXCJcXG5cIik6dH19ZnVuY3Rpb24geShlLG4pe2lmKG4uY2FjaGUmJm4ubmFtZSYmbi50ZW1wbGF0ZXMuZ2V0KG4ubmFtZSkpcmV0dXJuIG4udGVtcGxhdGVzLmdldChuLm5hbWUpO3ZhciB0PVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTp2KGUsbik7cmV0dXJuIG4uY2FjaGUmJm4ubmFtZSYmbi50ZW1wbGF0ZXMuZGVmaW5lKG4ubmFtZSx0KSx0fWZ1bmN0aW9uIHgoZSx0LGksYSl7dmFyIG89bShpfHx7fSk7aWYoIW8uYXN5bmMpcmV0dXJuIHkoZSxvKSh0LG8pO2lmKCFhKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXJldHVybiBuZXcgcigoZnVuY3Rpb24obixyKXt0cnl7bih5KGUsbykodCxvKSl9Y2F0Y2goZSl7cihlKX19KSk7dGhyb3cgbihcIlBsZWFzZSBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHRoaXMgZW52IGRvZXNuJ3Qgc3VwcG9ydCBQcm9taXNlc1wiKX10cnl7eShlLG8pKHQsbyxhKX1jYXRjaChlKXtyZXR1cm4gYShlKX19ZS5jb21waWxlPXYsZS5jb21waWxlVG9TdHJpbmc9ZCxlLmNvbmZpZz1oLGUuY29uZmlndXJlPWZ1bmN0aW9uKGUpe3JldHVybiBpKGgsZSl9LGUuZGVmYXVsdENvbmZpZz1oLGUuZ2V0Q29uZmlnPW0sZS5wYXJzZT1mLGUucmVuZGVyPXgsZS5yZW5kZXJBc3luYz1mdW5jdGlvbihlLG4sdCxyKXtyZXR1cm4geChlLG4sT2JqZWN0LmFzc2lnbih7fSx0LHthc3luYzohMH0pLHIpfSxlLnRlbXBsYXRlcz1nLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXRhLm1pbi5qcy5tYXBcbiIsImltcG9ydCB7XG4gICAgRXhwYW5kZXJRdWVyeSxcbiAgICBnZXRBbGxFeHBhbmRlcnNRdWVyeSxcbiAgICBnZXRDbG9zZXN0UXVlcnksXG4gICAgZ2V0TGFzdExpbmVUb1JlcGxhY2Vcbn0gZnJvbSAnc3JjL2hlbHBlcnMvaGVscGVycyc7XG5pbXBvcnQge1xuICAgIEFwcCwgRWRpdG9yLFxuICAgIEZpbGVWaWV3LFxuICAgIE1hcmtkb3duVmlldyxcbiAgICBQbHVnaW4sXG4gICAgUGx1Z2luTWFuaWZlc3QsXG4gICAgUGx1Z2luU2V0dGluZ1RhYixcbiAgICBTZXR0aW5nLFxuICAgIFRGaWxlLCBWaWV3LCBXb3Jrc3BhY2VMZWFmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBzZXF1ZW5jZXMsIHtTZXF1ZW5jZXN9IGZyb20gXCIuL3NlcXVlbmNlcy9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7c3BsaXRCeUxpbmVzfSBmcm9tIFwiLi9oZWxwZXJzL3N0cmluZ1wiO1xuaW1wb3J0IHtleHRyYWN0RmlsZXNGcm9tU2VhcmNoUmVzdWx0c30gZnJvbSBcIi4vaGVscGVycy9zZWFyY2gtcmVzdWx0c1wiO1xuaW1wb3J0IHtyZW5kZXJ9IGZyb20gXCJldGFcIjtcbmltcG9ydCB7Z2V0RmlsZUluZm99IGZyb20gXCIuL2hlbHBlcnMvdGZpbGVcIjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzIHtcbiAgICBkZWxheTogbnVtYmVyXG4gICAgbGluZUVuZGluZzogc3RyaW5nXG4gICAgZGVmYXVsdFRlbXBsYXRlOiBzdHJpbmdcbiAgICBleGNsdWRlQ3VycmVudDogYm9vbGVhblxuICAgIGF1dG9FeHBhbmQ6IGJvb2xlYW5cbiAgICBwcmVmaXhlczoge1xuICAgICAgICBoZWFkZXI6IHN0cmluZ1xuICAgICAgICBmb290ZXI6IHN0cmluZ1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFNlYXJjaExlYWYgZXh0ZW5kcyBXb3Jrc3BhY2VMZWFmIHtcbiAgICB2aWV3OiBWaWV3ICYge1xuICAgICAgICBzZWFyY2hDb21wb25lbnQ6IHtcbiAgICAgICAgICAgIGdldFZhbHVlOiAoKSA9PiBzdHJpbmdcbiAgICAgICAgICAgIHNldFZhbHVlOiAoczogc3RyaW5nKSA9PiB2b2lkXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhcmFtZXRlcnMge1xuICAgIGJhc2VuYW1lOiBzdHJpbmdcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgICBleHRlbnNpb246IHN0cmluZ1xuICAgIGhlYWRpbmdzOiBBcnJheTxhbnk+XG4gICAgbGluazogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgcGF0aDogc3RyaW5nXG4gICAgc2VjdGlvbnM6IEFycmF5PGFueT5cbiAgICBzdGF0OiB7fVxuICAgIGZyb250bWF0dGVyOiB7IFtrOiBzdHJpbmddOiBhbnkgfVxuICAgIGxpbmtzOiBBcnJheTxhbnk+XG4gICAgbGlzdEl0ZW1zOiBBcnJheTxhbnk+XG59XG5cbnR5cGUgTnVtYmVyVHVwbGUgPSBbbnVtYmVyLCBudW1iZXJdXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoRGV0YWlscyB7XG4gICAgYXBwOiBBcHBcbiAgICBjaGlsZHJlbjogYW55W11cbiAgICBjaGlsZHJlbkVsOiBIVE1MRWxlbWVudFxuICAgIGNvbGxhcHNlRWw6IEhUTUxFbGVtZW50XG4gICAgY29sbGFwc2VkOiBib29sZWFuXG4gICAgY29sbGFwc2libGU6IGJvb2xlYW5cbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgICBkb206IGFueVxuICAgIGVsOiBIVE1MRWxlbWVudFxuICAgIGV4dHJhQ29udGV4dDogKCkgPT4gYm9vbGVhblxuICAgIGZpbGU6IFRGaWxlXG4gICAgaW5mbzogYW55XG4gICAgb25NYXRjaFJlbmRlcjogYW55XG4gICAgcHVzaGVyRWw6IEhUTUxFbGVtZW50XG4gICAgcmVzdWx0OiB7XG4gICAgICAgIGZpbGVuYW1lPzogTnVtYmVyVHVwbGVbXVxuICAgICAgICBjb250ZW50PzogTnVtYmVyVHVwbGVbXVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dEV4cGFuZGVyIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBjbTogRWRpdG9yXG5cbiAgICBjb25maWc6IFBsdWdpblNldHRpbmdzID0ge1xuICAgICAgICBhdXRvRXhwYW5kOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFRlbXBsYXRlOiAnLSAkbGluaycsXG4gICAgICAgIGRlbGF5OiAzMDAsXG4gICAgICAgIGV4Y2x1ZGVDdXJyZW50OiB0cnVlLFxuICAgICAgICBsaW5lRW5kaW5nOiAnPC0tPicsXG4gICAgICAgIHByZWZpeGVzOiB7XG4gICAgICAgICAgICBoZWFkZXI6ICdeJyxcbiAgICAgICAgICAgIGZvb3RlcjogJz4nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXFzOiBTZXF1ZW5jZXNbXSA9IHNlcXVlbmNlc1xuXG4gICAgbGVmdFBhbmVsSW5mbzoge1xuICAgICAgICBjb2xsYXBzZWQ6IGJvb2xlYW5cbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICAgICAgdGV4dDogc3RyaW5nXG4gICAgfSA9IHtcbiAgICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgICAgdGFiOiAwLFxuICAgICAgICB0ZXh0OiAnJ1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBsdWdpbk1hbmlmZXN0KSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmF1dG9FeHBhbmQgPSB0aGlzLmF1dG9FeHBhbmQuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBhc3luYyBhdXRvRXhwYW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9FeHBhbmQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG4gICAgICAgIGlmICghYWN0aXZlTGVhZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVWaWV3ID0gYWN0aXZlTGVhZi52aWV3XG4gICAgICAgIGNvbnN0IGlzQWxsb3dlZFZpZXcgPSBhY3RpdmVWaWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3XG4gICAgICAgIGlmICghaXNBbGxvd2VkVmlldykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSlcbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3NvcignZXhwYW5kZXInLCAoc291cmNlLCBlbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBlbFxuICAgICAgICAgICAgICAgIC5jcmVhdGVEaXYoKVxuICAgICAgICAgICAgICAgIC5jcmVhdGVFbCgnYnV0dG9uJywge3RleHQ6ICdSdW4gZXhwYW5kIHF1ZXJ5J30pXG4gICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5pbml0LmJpbmQodGhpcywgZmFsc2UsIGN0eC5nZXRTZWN0aW9uSW5mbyhlbCkubGluZVN0YXJ0KSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnZWRpdG9yLWV4cGFuZCcsXG4gICAgICAgICAgICBuYW1lOiAnZXhwYW5kJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmluaXQsXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6ICdlZGl0b3ItZXhwYW5kLWFsbCcsXG4gICAgICAgICAgICBuYW1lOiAnZXhwYW5kIGFsbCcsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5pbml0KHRydWUpLFxuICAgICAgICAgICAgaG90a2V5czogW11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLmF1dG9FeHBhbmQpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCkgYXMgUGx1Z2luU2V0dGluZ3NcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygndW5sb2FkaW5nIHBsdWdpbicpO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub2ZmKCdmaWxlLW9wZW4nLCB0aGlzLmF1dG9FeHBhbmQpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLmNvbmZpZylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXQocHJvY2VlZEFsbFF1ZXJpZXNPblBhZ2UgPSBmYWxzZSwgbGluZVRvU3RhcnQ/OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgLy8gSXMgb24gZWRpdGFibGUgdmlld1xuICAgICAgICBpZiAoIShjdXJyZW50VmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY21Eb2M6IEVkaXRvciA9IHRoaXMuY20gPSBjdXJyZW50Vmlldy5lZGl0b3JcblxuICAgICAgICBjb25zdCBjdXJOdW0gPSBsaW5lVG9TdGFydCB8fCBjbURvYy5nZXRDdXJzb3IoKS5saW5lXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjbURvYy5nZXRWYWx1ZSgpXG5cbiAgICAgICAgaWYgKGxpbmVUb1N0YXJ0KSB7XG4gICAgICAgICAgICBjbURvYy5zZXRDdXJzb3IobGluZVRvU3RhcnQgPyBsaW5lVG9TdGFydCAtIDEgOiAwKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc3BsaXRCeUxpbmVzKGNvbnRlbnQpXG4gICAgICAgIGNvbnN0IGZpbmRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkoZm9ybWF0dGVkKVxuICAgICAgICBjb25zdCBjbG9zZXN0UXVlcnkgPSBnZXRDbG9zZXN0UXVlcnkoZmluZFF1ZXJpZXMsIGN1ck51bSlcblxuICAgICAgICBpZiAocHJvY2VlZEFsbFF1ZXJpZXNPblBhZ2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmRRdWVyaWVzLnJlZHVjZSgocHJvbWlzZSwgcXVlcnksIGkpID0+XG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IHNwbGl0QnlMaW5lcyhjbURvYy5nZXRWYWx1ZSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkUXVlcmllcyA9IGdldEFsbEV4cGFuZGVyc1F1ZXJ5KG5ld0NvbnRlbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuRXhwYW5kZXJDb2RlQmxvY2sodXBkYXRlZFF1ZXJpZXNbaV0sIG5ld0NvbnRlbnQsIGN1cnJlbnRWaWV3KVxuICAgICAgICAgICAgICAgIH0pLCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5FeHBhbmRlckNvZGVCbG9jayhjbG9zZXN0UXVlcnksIGZvcm1hdHRlZCwgY3VycmVudFZpZXcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkV4cGFuZGVyQ29kZUJsb2NrKHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBjb250ZW50OiBzdHJpbmdbXSwgdmlldzogTWFya2Rvd25WaWV3KSB7XG4gICAgICAgIGNvbnN0IHtsaW5lRW5kaW5nLCBwcmVmaXhlc30gPSB0aGlzLmNvbmZpZ1xuXG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oJ0V4cGFuZCBxdWVyeSBub3QgZm91bmQnKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyT2xkUmVzdWx0c0luRmlsZShjb250ZW50LCBxdWVyeSwgbGluZUVuZGluZyk7XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IHNwbGl0QnlMaW5lcyh0aGlzLmNtLmdldFZhbHVlKCkpO1xuXG4gICAgICAgIGlmIChxdWVyeS5xdWVyeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoKHF1ZXJ5LnF1ZXJ5KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blRlbXBsYXRlUHJvY2Vzc2luZyhxdWVyeSwgZ2V0TGFzdExpbmVUb1JlcGxhY2UobmV3Q29udGVudCwgcXVlcnksIHRoaXMuY29uZmlnLmxpbmVFbmRpbmcpLCBwcmVmaXhlcywgdmlldylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blRlbXBsYXRlUHJvY2Vzc2luZyhxdWVyeTogRXhwYW5kZXJRdWVyeSwgbGFzdExpbmU6IG51bWJlciwgcHJlZml4ZXM6IFBsdWdpblNldHRpbmdzW1wicHJlZml4ZXNcIl0sIGN1cnJlbnRWaWV3OiBNYXJrZG93blZpZXcpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRGaWxlTmFtZSA9ICcnXG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50ID0gcXVlcnkudGVtcGxhdGUuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgY29uc3Qge2hlYWRpbmcsIGZvb3RlciwgcmVwZWF0YWJsZUNvbnRlbnR9ID0gdGhpcy5wYXJzZVRlbXBsYXRlKHByZWZpeGVzLCB0ZW1wbGF0ZUNvbnRlbnQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KSB7XG4gICAgICAgICAgICBjdXJyZW50RmlsZU5hbWUgPSBjdXJyZW50Vmlldy5maWxlLmJhc2VuYW1lXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVMZWZ0UGFuZWxTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEZvdW5kQWZ0ZXJEZWxheShxdWVyeS5xdWVyeSA9PT0gJycpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGV4dHJhY3RGaWxlc0Zyb21TZWFyY2hSZXN1bHRzKHNlYXJjaFJlc3VsdHMsIGN1cnJlbnRGaWxlTmFtZSwgdGhpcy5jb25maWcuZXhjbHVkZUN1cnJlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzdG9yZUxlZnRQYW5lbFN0YXRlKCk7XG5cbiAgICAgICAgY3VycmVudFZpZXcuZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudEZpbGVJbmZvOiB7fSA9IChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KVxuICAgICAgICAgICAgPyBhd2FpdCBnZXRGaWxlSW5mbyh0aGlzLCBjdXJyZW50Vmlldy5maWxlKVxuICAgICAgICAgICAgOiB7fVxuICAgICAgICBjb25zdCBmaWxlc0luZm8gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGZpbGVzLm1hcChmaWxlID0+IGdldEZpbGVJbmZvKHRoaXMsIGZpbGUpKVxuICAgICAgICApXG5cbiAgICAgICAgbGV0IGNoYW5nZWQ7XG5cbiAgICAgICAgaWYgKHF1ZXJ5LnRlbXBsYXRlLmNvbnRhaW5zKFwiPCVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVG9SZW5kZXIgPSByZXBlYXRhYmxlQ29udGVudC5qb2luKCdcXG4nKVxuICAgICAgICAgICAgY29uc3QgZGF0YVRvUmVuZGVyID0ge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnRGaWxlSW5mbyxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXNJbmZvXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoYW5nZWQgPSBhd2FpdCByZW5kZXIodGVtcGxhdGVUb1JlbmRlciwgZGF0YVRvUmVuZGVyLCB7YXV0b0VzY2FwZTogZmFsc2V9KVxuICAgICAgICAgICAgLy8gY2hhbmdlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZVRvUmVuZGVyLCB7c3RyaXA6IGZhbHNlfSkoZGF0YVRvUmVuZGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlZCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVUZW1wbGF0ZUZyb21TZXF1ZW5jZXMoZmlsZXMsIHJlcGVhdGFibGVDb250ZW50LCBzZWFyY2hSZXN1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSBbXG4gICAgICAgICAgICBoZWFkaW5nLFxuICAgICAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgICAgIGZvb3RlcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmxpbmVFbmRpbmdcbiAgICAgICAgXS5maWx0ZXIoZSA9PiBlKS5qb2luKCdcXG4nKVxuXG4gICAgICAgIC8vIERvIG5vdCBwYXN0ZSBnZW5lcmF0ZWQgY29udGVudCBpZiB1c2VkIGNoYW5nZWQgYWN0aXZlTGVhZlxuICAgICAgICBjb25zdCB2aWV3QmVmb3JlUmVwbGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcbiAgICAgICAgaWYgKCEodmlld0JlZm9yZVJlcGxhY2UgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpIHx8IHZpZXdCZWZvcmVSZXBsYWNlLmZpbGUuYmFzZW5hbWUgIT09IGN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50Vmlldy5lZGl0b3IucmVwbGFjZVJhbmdlKHJlc3VsdCxcbiAgICAgICAgICAgIHtsaW5lOiBxdWVyeS5lbmQgKyAxLCBjaDogMH0sXG4gICAgICAgICAgICB7bGluZTogbGFzdExpbmUsIGNoOiB0aGlzLmNtLmdldExpbmUobGFzdExpbmUpPy5sZW5ndGggfHwgMH0pXG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlRnJvbVNlcXVlbmNlcyhmaWxlczogVEZpbGVbXSwgcmVwZWF0YWJsZUNvbnRlbnQ6IHN0cmluZ1tdLCBzZWFyY2hSZXN1bHRzPzogTWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghc2VhcmNoUmVzdWx0cykge1xuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocmVwZWF0YWJsZUNvbnRlbnQubWFwKGFzeW5jIChzKSA9PiBhd2FpdCB0aGlzLmFwcGx5VGVtcGxhdGVUb1NlYXJjaFJlc3VsdHMoc2VhcmNoUmVzdWx0cywgZmlsZSwgcywgaSkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VUZW1wbGF0ZShwcmVmaXhlczogeyBoZWFkZXI6IHN0cmluZzsgZm9vdGVyOiBzdHJpbmcgfSwgdGVtcGxhdGVDb250ZW50OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpc0hlYWRlciA9IChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChwcmVmaXhlcy5oZWFkZXIpXG4gICAgICAgIGNvbnN0IGlzRm9vdGVyID0gKGxpbmU6IHN0cmluZykgPT4gbGluZS5zdGFydHNXaXRoKHByZWZpeGVzLmZvb3RlcilcbiAgICAgICAgY29uc3QgaXNSZXBlYXQgPSAobGluZTogc3RyaW5nKSA9PiAhaXNIZWFkZXIobGluZSkgJiYgIWlzRm9vdGVyKGxpbmUpXG5cbiAgICAgICAgY29uc3QgaGVhZGluZyA9IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoaXNIZWFkZXIpLm1hcCgocykgPT4gcy5zbGljZSgxKSkuam9pbignXFxuJylcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGVtcGxhdGVDb250ZW50LmZpbHRlcihpc0Zvb3RlcikubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKCdcXG4nKVxuICAgICAgICBjb25zdCByZXBlYXRhYmxlQ29udGVudCA9XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGlzUmVwZWF0KS5maWx0ZXIoZSA9PiBlKS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IFt0aGlzLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGVdXG4gICAgICAgICAgICAgICAgOiB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGlzUmVwZWF0KS5maWx0ZXIoZSA9PiBlKVxuICAgICAgICByZXR1cm4ge2hlYWRpbmcsIGZvb3RlciwgcmVwZWF0YWJsZUNvbnRlbnR9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUxlZnRQYW5lbFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxlZnRQYW5lbEluZm8gPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2VkLFxuICAgICAgICAgICAgdGFiOiB0aGlzLmdldFNlYXJjaFRhYkluZGV4KCksXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLmdldFNlYXJjaFZhbHVlKCksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVMZWZ0UGFuZWxTdGF0ZSgpIHtcbiAgICAgICAgY29uc3Qge2NvbGxhcHNlZCwgdGFiLCB0ZXh0fSA9IHRoaXMubGVmdFBhbmVsSW5mbztcbiAgICAgICAgY29uc3Qgc3BsaXRDaGlsZHJlbiA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpXG5cbiAgICAgICAgdGhpcy5nZXRTZWFyY2hWaWV3KCkuc2VhcmNoQ29tcG9uZW50LnNldFZhbHVlKHRleHQpXG5cbiAgICAgICAgaWYgKHRhYiAhPT0gc3BsaXRDaGlsZHJlbi5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICBzcGxpdENoaWxkcmVuLnNlbGVjdFRhYkluZGV4KHRhYilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWFyY2goczogc3RyaW5nKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoRm4gPSB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0UGx1Z2luQnlJZCgnZ2xvYmFsLXNlYXJjaCcpLmluc3RhbmNlLm9wZW5HbG9iYWxTZWFyY2guYmluZCh0aGlzKVxuICAgICAgICBjb25zdCBzZWFyY2ggPSAocXVlcnk6IHN0cmluZykgPT4gZ2xvYmFsU2VhcmNoRm4ocXVlcnkpXG5cbiAgICAgICAgc2VhcmNoKHMpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMZWZ0U3BsaXRFbGVtZW50KCk6IHtcbiAgICAgICAgY3VycmVudFRhYjogbnVtYmVyXG4gICAgICAgIHNlbGVjdFRhYkluZGV4OiAobjogbnVtYmVyKSA9PiB2b2lkXG4gICAgICAgIGNoaWxkcmVuOiBBcnJheTxXb3Jrc3BhY2VMZWFmIHwgU2VhcmNoTGVhZj5cbiAgICB9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jaGlsZHJlblswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlYXJjaFZpZXcoKTogU2VhcmNoTGVhZlsndmlldyddIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpLmNoaWxkcmVuLmZpbHRlcihlID0+IGUuZ2V0Vmlld1N0YXRlKCkudHlwZSA9PT0gJ3NlYXJjaCcpWzBdLnZpZXdcblxuICAgICAgICBpZiAoJ3NlYXJjaENvbXBvbmVudCcgaW4gdmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0U2VhcmNoVmlldygpO1xuXG4gICAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5zZWFyY2hDb21wb25lbnQuZ2V0VmFsdWUoKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWFyY2hUYWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBsZWZ0VGFicyA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpLmNoaWxkcmVuO1xuICAgICAgICBsZXQgc2VhcmNoVGFiSWQ6IHN0cmluZztcblxuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZjogV29ya3NwYWNlTGVhZiAmIHsgaWQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBpZiAobGVhZi5nZXRWaWV3U3RhdGUoKS50eXBlID09IFwic2VhcmNoXCIpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUYWJJZCA9IGxlYWYuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGVmdFRhYnMuZmluZEluZGV4KChpdGVtOiBhbnksIF9pbmRleDogbnVtYmVyLCBfYXJyYXk6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSBzZWFyY2hUYWJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRGb3VuZEFmdGVyRGVsYXkoaW1tZWRpYXRlOiBib29sZWFuKTogUHJvbWlzZTxNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKCdzZWFyY2gnKVswXVxuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgc2VhcmNoTGVhZi5vcGVuKHNlYXJjaExlYWYudmlldylcblxuICAgICAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZpZXcuZG9tLnJlc3VsdERvbUxvb2t1cCBhcyBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh2aWV3LmRvbS5yZXN1bHREb21Mb29rdXAgYXMgTWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPilcbiAgICAgICAgICAgIH0sIHRoaXMuY29uZmlnLmRlbGF5KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXBwbHlUZW1wbGF0ZVRvU2VhcmNoUmVzdWx0cyhzZWFyY2hSZXN1bHRzOiBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+LCBmaWxlOiBURmlsZSwgdGVtcGxhdGU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IChuZXcgUmVnRXhwKHRoaXMuc2Vxcy5maWx0ZXIoZSA9PiBlLnJlYWRDb250ZW50KS5tYXAoZSA9PiBlLm5hbWUpLmpvaW4oJ3wnKSkudGVzdCh0ZW1wbGF0ZSkpXG4gICAgICAgICAgICA/IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSlcbiAgICAgICAgICAgIDogJydcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXFzLnJlZHVjZSgoYWNjLCBzZXEpID0+XG4gICAgICAgICAgICBhY2MucmVwbGFjZShuZXcgUmVnRXhwKHNlcS5uYW1lLCAnZ3UnKSwgcmVwbGFjZSA9PiBzZXEuZm9ybWF0KHRoaXMsIHJlcGxhY2UsIGZpbGVDb250ZW50LCBmaWxlLCBzZWFyY2hSZXN1bHRzLmdldChmaWxlKSwgaW5kZXgpKSwgdGVtcGxhdGUpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhck9sZFJlc3VsdHNJbkZpbGUoY29udGVudDogc3RyaW5nW10sIHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBsaW5lRW5kaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdExpbmUgPSBnZXRMYXN0TGluZVRvUmVwbGFjZShjb250ZW50LCBxdWVyeSwgdGhpcy5jb25maWcubGluZUVuZGluZylcbiAgICAgICAgdGhpcy5jbS5yZXBsYWNlUmFuZ2UoJ1xcbicgKyBsaW5lRW5kaW5nLFxuICAgICAgICAgICAge2xpbmU6IHF1ZXJ5LmVuZCArIDEsIGNoOiAwfSxcbiAgICAgICAgICAgIHtsaW5lOiBsYXN0TGluZSwgY2g6IHRoaXMuY20uZ2V0TGluZShsYXN0TGluZSk/Lmxlbmd0aCB8fCAwfSlcbiAgICB9XG59XG5cbmNsYXNzIFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBwbHVnaW46IFRleHRFeHBhbmRlclxuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogVGV4dEV4cGFuZGVyKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLmFwcCA9IGFwcFxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpblxuICAgIH1cblxuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGxldCB7Y29udGFpbmVyRWx9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHt0ZXh0OiAnU2V0dGluZ3MgZm9yIFRleHQgRXhwYW5kZXInfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQXV0byBFeHBhbmQnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0V4cGFuZCBhbGwgcXVlcmllcyBpbiBhIGZpbGUgb25jZSB5b3Ugb3BlbiBpdCcpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuYXV0b0V4cGFuZClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5hdXRvRXhwYW5kID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0RlbGF5JylcbiAgICAgICAgICAgIC5zZXREZXNjKCdUZXh0IGV4cGFuZGVyIGRvblxcJyB3YWl0IHVudGlsIHNlYXJjaCBjb21wbGV0ZWQuIEl0IHdhaXRzIGZvciBhIGRlbGF5IGFuZCBwYXN0ZSByZXN1bHQgYWZ0ZXIgdGhhdC4nKVxuICAgICAgICAgICAgLmFkZFNsaWRlcihzbGlkZXIgPT4ge1xuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRMaW1pdHMoMTAwLCAxMDAwMCwgMTAwKVxuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZGVsYXkpXG4gICAgICAgICAgICAgICAgc2xpZGVyLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmRlbGF5ID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNsaWRlci5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0xpbmUgZW5kaW5nJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdZb3UgY2FuIHNwZWNpZnkgdGhlIHRleHQgd2hpY2ggd2lsbCBhcHBlYXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZ2VuZXJhdGVkIHRleHQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLmxpbmVFbmRpbmcpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmxpbmVFbmRpbmcgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0RlZmF1bHQgdGVtcGxhdGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSBkZWZhdWx0IHRlbXBsYXRlJylcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmRlZmF1bHRUZW1wbGF0ZSA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZSBjdXJyZW50IGZpbGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSBzaG91bGQgdGV4dCBleHBhbmRlciBleGNsdWRlIHJlc3VsdHMgZnJvbSBjdXJyZW50IGZpbGUgb3Igbm90JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXRIZWFkaW5nKClcbiAgICAgICAgICAgIC5zZXROYW1lKCdQcmVmaXhlcycpXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnSGVhZGVyJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdMaW5lIHByZWZpeGVkIGJ5IHRoaXMgc3ltYm9sIHdpbGwgYmUgcmVjb2duaXplZCBhcyBoZWFkZXInKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcucHJlZml4ZXMuaGVhZGVyKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5wcmVmaXhlcy5oZWFkZXIgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0Zvb3RlcicpXG4gICAgICAgICAgICAuc2V0RGVzYygnTGluZSBwcmVmaXhlZCBieSB0aGlzIHN5bWJvbCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgZm9vdGVyJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLnByZWZpeGVzLmZvb3RlcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcucHJlZml4ZXMuZm9vdGVyID0gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdTZXF1ZW5jZXMnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1JFR0VYUCAtIERFU0NSSVBUSU9OJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBmcmFnbWVudC5jcmVhdGVFbCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2Vxc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlID0+IGUubmFtZSArICcgLSAnICsgKGUuZGVzYyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnJhZ21lbnQuY3JlYXRlRWwoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0VGV4dChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRpdilcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICApXG4gICAgfVxufVxuIl0sIm5hbWVzIjpbInRoaXMiLCJQbHVnaW4iLCJNYXJrZG93blZpZXciLCJGaWxlVmlldyIsInJlbmRlciIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVB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LE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsb0VBQW9FLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFLLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLDhDQUE4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksV0FBVyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsdUVBQXVFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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 diff --git a/.obsidian/plugins/mrj-text-expand/manifest.json b/.obsidian/plugins/mrj-text-expand/manifest.json index fcdbe44..3d53702 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.10.8", + "version": "0.11.2", "description": "Search and paste/transclude links to located files.", "isDesktopOnly": false, "author": "MrJackphil", diff --git a/OJ notes/pages/Leetcode Flood-Fill.md b/OJ notes/pages/Leetcode Flood-Fill.md index dd17e37..b4b18a2 100644 --- a/OJ notes/pages/Leetcode Flood-Fill.md +++ b/OJ notes/pages/Leetcode Flood-Fill.md @@ -5,7 +5,7 @@ > ##### Algorithms: > #algorithm #BFS > ##### Data structures: -> #DS # +> #DS > ##### Difficulty: > #coding_problem #difficulty-easy > ##### Additional tags: @@ -15,23 +15,118 @@ ##### Related topics: ```expander -tag:# +tag:#BFS OR tag:#DFS ``` - - + ##### Links: -- [Link to problem]() +- [Link to problem](https://leetcode.com/problems/flood-fill/) ___ ### Problem +An image is represented by an `m x n` integer grid `image` where `image[i][j]` represents the pixel value of the image. + +You are also given three integers `sr`, `sc`, and `color`. You should perform a **flood fill** on the image starting from the pixel `image[sr][sc]`. + +To perform a **flood fill**, consider the starting pixel, plus any pixels connected **4-directionally** to the starting pixel of the same color as the starting pixel, plus any pixels connected **4-directionally** to those pixels (also with the same color), and so on. Replace the color of all of the aforementioned pixels with `color`. + +Return _the modified image after performing the flood fill_. + #### Examples +**Example 1:** + +![](https://assets.leetcode.com/uploads/2021/06/01/flood1-grid.jpg) + +``` +**Input:** image = [[1,1,1],[1,1,0],[1,0,1]], sr = 1, sc = 1, color = 2 +**Output:** [[2,2,2],[2,2,0],[2,0,1]] +**Explanation:** From the center of the image with position (sr, sc) = (1, 1) (i.e., the red pixel), all pixels connected by a path of the same color as the starting pixel (i.e., the blue pixels) are colored with the new color. +Note the bottom corner is not colored 2, because it is not 4-directionally connected to the starting pixel. +``` + +**Example 2:** + +``` +**Input:** image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, color = 0 +**Output:** [[0,0,0],[0,0,0]] +**Explanation:** The starting pixel is already colored 0, so no changes are made to the image. +``` + #### Constraints +- `m == image.length` +- `n == image[i].length` +- `1 <= m, n <= 50` +- `0 <= image[i][j], color < 216` +- `0 <= sr < m` +- `0 <= sc < n` + ### Thoughts > [!summary] -> This is a #template_remove_me +> This is a search problem, can be solved using DFS or BFS + +This one can be optimized. + +Initially, I wanted to use a hash map to record cells that are visited, +but the this takes up extra space. + +Then I found out that I can use colors: +- if image[r][c] == color, this means + - the cell is no need to correct(color == origcolor), + - or this has been corrected + so I don't have to go over again. + +There are checks in the loop: +- check the color is not visited, as shown above +- check the coord is not OOB +- check the cell is equal to origColor, to only fill same origColor. + +#TODO: Write in DFS ### Solution + +```cpp +class Solution { +public: + vector> floodFill(vector> &image, int sr, int sc, + int color) { + int origColor = image[sr][sc]; + queue> todo; + int m = image.size(); + int n = image[0].size(); + + todo.push({sr, sc}); + int r, c; + + while (!todo.empty()) { + r = todo.front().first; + c = todo.front().second; + todo.pop(); + + if (image[r][c] != origColor || image[r][c] == color) { + // already colored + continue; + } + + image[r][c] = color; + + if (r > 0) { + todo.push({r - 1, c}); + } + if (r < m - 1) { + todo.push({r + 1, c}); + } + if (c > 0) { + todo.push({r, c - 1}); + } + if (c < n - 1) { + todo.push({r, c + 1}); + } + } + + return image; + } +}; +``` \ No newline at end of file diff --git a/Untitled.md b/Untitled.md deleted file mode 100644 index e69de29..0000000